[
  {
    "path": "Amendments.md",
    "content": "#Blynk Amendments\n###Tell every maker about Blynk\nNo pressure. Just do it. Now.\n###Make your idea work without Blynk\nBlynk can be easily integrated in almost any project. But before that - make it work **without** it. After you are sure that you can get all the sensor data or can control things from the code – integrate Blynk and make it even more awesome.\n###Use search\nWe are always happy to chat and help, but remember - every time you ask the question that was answered many many times before that, Blynk Team is not building a new widget or new cool feature. So:\n- google before asking\n- use search on our forum, it works really well\n- check Instructables\n###Always wrap your code\nThough shalt not post code without ```wrapping it``` "
  },
  {
    "path": "AppExport.md",
    "content": "# App Export\n\n## Firmware for ESP8266, NodeMCU, BlynkBoard, etc.\n\n#### Prepare development environment\n1. Install [Arduino IDE](https://www.arduino.cc/en/Main/Software)\n2. Install [Blynk Library](https://github.com/blynkkk/blynk-library/releases/latest) and restart Arduino IDE\n3. Install [ESP8266 core for Arduino](https://github.com/esp8266/Arduino#installing-with-boards-manager)\n4. For Windows / OS X, you may need to install USB-Serial drivers according to your converter:\n - СP2102: https://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx \n - FTDI (FT232, etc): http://www.ftdichip.com/Drivers/VCP.htm\n - *TODO: Link to drivers for CH340 and PL2303.*\n5. If your board has a NeoPixel RGB LED, install [Adafruit NeoPixel](https://github.com/adafruit/Adafruit_NeoPixel) library from Library Manager\n\n#### Build your Firmware\n1. Open our example in Arduino IDE: ```File -> Examples -> Blynk -> Provisioning -> Blynk_ESP8266```\n2. Open ```Settings.h``` tab.\n3. Configure your firmware:\n  * ```BOARD_NAME``` - ...\n  * ```BOARD_VENDOR``` - ...\n  * ```PRODUCT_WIFI_SSID``` - ...\n  \n#### Upload firmare\n1. Select your board type: ```Tools -> Board -> [Your Board]```\n2. Select your port: ```Tools -> Port -> [...]```\n3. Verify and Upload!\n\nNote that for Blynk Board, you can select board type ```NodeMCU 1.0```.\n"
  },
  {
    "path": "BlynkFirmware.md",
    "content": "#Blynk Firmware\n## Configuration\n\n### Blynk.begin()\n\nThe easiest way to configure Blynk is to use ```Blynk.begin()```:\n\n```cpp\nBlynk.begin(auth, ...);\n```\nIt has multiple parameters for different hardware models and it also depends on the type of connection. Follow the example sketches for your specific hardware model.\n\nWhat happens inside of ```Blynk.begin()``` function:\n\n1. Connection to the network (WiFi, Ethernet, ...)\n2. Call of ```Blynk.config(...)``` to set Auth Token, Server Address, etc.\n3. Attempts to connect to the server once (can block for more than 30s)\n\nIf your shield/connection type is not supported yet - you can implement it by yourself. [Here are some examples](https://github.com/blynkkk/blynk-library/tree/master/examples/More/ArduinoClient).\n\n### Blynk.config()\n\n```config()``` allows you to manage network connection. You can set up your connection type (WiFi, Ethernet, ...) by yourself, and then call:\n\n```cpp\nBlynk.config(auth, server, port);\n```\nor just\n```cpp\nBlynk.config(auth);\n```\n\n**NOTE: After ``` Blynk.config(...) ``` is called, your hardware is not yet connected to the server.** \nIt will try to connect while until it hits first instance of ``` Blynk.run() ``` or ``` Blynk.connect() ```routine.  \nTo skip connecting to the server or to disconnect manually, call ``` Blynk.disconnect() ``` after configuration.\n\nUse ```connectWiFi``` to conveniently set up WiFi connection:\n\n```cpp\nBlynk.connectWiFi(ssid, pass);\n```\nTo connect to open WiFi networks, set pass to an empty string (```\"\"```).\n\n## Connection management\n\nThere are several functions to help with connection management:\n\n### Blynk.connect()\n\nThis functions will continue trying to connect to Blynk server. \nReturns `true` when connected, `false` if timeout have been reached.\nDefault timeout is 30 seconds.\n\n```cpp\nbool result = Blynk.connect();\nbool result = Blynk.connect(timeout);\n```\n\n### Blynk.disconnect()\n\nDisconnects hardware from Blynk server:\n\n```cpp\nBlynk.disconnect();\n```\n\n### Blynk.connected()\nReturns `true` when hardware is connected to Blynk Server, `false` if there is no active connection to Blynk server.\n\n```cpp\nbool result = Blynk.connected();\n```\n\n### Blynk.run()\nThis function should be called frequently to process incoming commands and perform housekeeping of Blynk connection.\nIt is usually called in ``` void loop() {} ```.\n\nThis command can be initiated it in other places of your code unless you run out of heap memory (in the cascaded functions with local memory).\n\nFor example, it is not recommended to call ``` Blynk.run() ``` inside of the  ```BLYNK_READ ``` and ``` BLYNK_WRITE ``` functions on low-RAM devices.\n\n## Digital & Analog pins control\nBlynk library can perform basic pin IO (input-output) operations out-of-the-box:\n\n    digitalRead\n    digitalWrite\n    analogRead\n    analogWrite (PWM or Analog signal depending on the platform)\n\nNo need to write code for simple things like LED, Relay control and analog sensors. Just choose a corresponding Pin in Blynk app and control it directly with no additional code\n\n## Virtual pins control\nVirtual Pins is a way to exchange any data between your hardware and Blynk app. \nThink about Virtual Pins as channels for sending any data. Make sure you differentiate Virtual Pins from physical GPIO\npins on your hardware. Virtual Pins have no physical representation.\n\nVirtual Pins are commonly used to interface with other libraries (Servo, LCD and others) and implement custom logic. \nThe device can send data to the App using  ```Blynk.virtualWrite(pin, value)``` and receive data from the App using ```BLYNK_WRITE(vPIN)```. Read below\n\n#### Virtual Pin data types\nAll Virtual Pin values are always sent as Strings and there are no practical limits on the data that can be sent.  \nHowever, there are certian limitations on the hardware side when dealing with numbers. For example, the integer on Arduino \nis 16-bit, allowing range -32768 to 32767.\n\nTo interpret incoming data as Integers, Floats, Doubles and Strings use:\n\n```cpp\nparam.asInt();\nparam.asFloat();\nparam.asDouble();\nparam.asStr();\n```\n\nYou can also get the RAW data from the param buffer:\n\n```cpp\nparam.getBuffer()\nparam.getLength()\n```\n\n### Blynk.virtualWrite(vPin, value)\n\n**NOTE: Use BlynkTimer when you use this command to send data. Otherwise your hardware will be disconnected from the server**\n\nSend data in various formats to Virtual Pins.\n\n```cpp\n// Send string\nBlynk.virtualWrite(pin, \"abc\");\n\n// Send integer\nBlynk.virtualWrite(pin, 123);\n\n// Send float\nBlynk.virtualWrite(pin, 12.34);\n\n// Send multiple values as an array\nBlynk.virtualWrite(pin, \"hello\", 123, 12.34);\n\n// Send RAW data\nBlynk.virtualWriteBinary(pin, buffer, length);\n```\n\nCalling ```virtualWrite``` attempts to send the value to the network immediately.\n\n**Note:** For virtual pins with numbers > 127, the `V128` syntax is not available.  \nPlease use plain virtual pin number, for example:\n```cpp\nBlynk.virtualWrite(128, \"abc\");\n```\n\n## BlynkTimer\nIt's important to send data in intervals and keep the void loop() as clean as possible. \n\n`BlynkTimer` allows you to send data periodically with given intervals not interfering with Blynk library routines \n`Blynk Timer` inherits [SimpleTimer Library](http://playground.arduino.cc/Code/SimpleTimer), a well known and widely used library to time multiple events on hardware.\n`BlynkTimer` is included in Blynk library by default and there is no need to install SimpleTimer separately or include `SimpleTimer.h`   \n\n- A single `BlynkTimer` object allows to schedule up to 16 timers\n- Improved compatibility with boards like `Arduino 101`, `Intel Galileo`, etc.\n- When a timer struggles to run multiple times (due to a blocked `loop`), it just skips all the missed intervals, and calls your function only once. This differs from `SimpleTimer`, which could call your function multiple times in this scenario.\n\nFor more information on timer usage, please see: http://playground.arduino.cc/Code/SimpleTimer  \nAnd here is a BlynkTimer [example sketch](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushData/PushData.ino#L30).\n\nPlease also remember that a single ```BlynkTimer``` can schedule many timers, so most probably you need only one instance of BlynkTimer in your sketch.\n\n\n### BLYNK_WRITE(vPIN)\n\n```BLYNK_WRITE``` is a function called every time device gets an update of Virtual Pin value from the server (or app):\n\nTo read the received data use:\n\n```cpp\nBLYNK_WRITE(V0)\n{   \n  int value = param.asInt(); // Get value as integer\n  \n  // The param can contain multiple values, in such case:\n  int x = param[0].asInt();\n  int y = param[1].asInt();\n}\n```\n\n**`BLYNK_WRITE` can't be used inside of any loop or function. It's a standalone function.**\n\n**Note:** For virtual pins with numbers > 127, please use `BLYNK_WRITE_DEFAULT()` API\n\n\n### BLYNK_READ(vPIN)\n\n```BLYNK_READ``` is function called when device is requested to send it's current value of Virtual Pin to the server. Normally, this function should contain ```Blynk.virtualWrite``` call(s).\n\n```cpp\nBLYNK_READ(V0)\n{\n  Blynk.virtualWrite(V0, newValue);\n}\n```\n\n**Note:** For virtual pins with numbers > 127, please use `BLYNK_READ_DEFAULT()` API\n\n### BLYNK_WRITE_DEFAULT()\n\nRedefines the handler for all pins that are not covered by custom ```BLYNK_WRITE``` functions.\n\n```cpp\nBLYNK_WRITE_DEFAULT()\n{\n  int pin = request.pin;      // Which exactly pin is handled?\n  int value = param.asInt();  // Use param as usual.\n}\n```\n\n### BLYNK_READ_DEFAULT()\n\nRedefines the handler for all pins that are not covered by custom ```BLYNK_READ``` functions.\n\n```cpp\nBLYNK_READ_DEFAULT()\n{\n  int pin = request.pin;      // Which exactly pin is handled?\n  Blynk.virtualWrite(pin, newValue);\n}\n```\n\n### BLYNK_CONNECTED()\n\nUse this function when you need to run certain routine when hardware connects to Blynk Cloud or private server. It's common to call sync functions inside of this function.\n\n```cpp\nBLYNK_CONNECTED() {\n// Your code here\n}\n```\n\n### BLYNK_APP_CONNECTED()\n\nThis function is called every time Blynk app client connects to Blynk server.\n\n```cpp\nBLYNK_APP_CONNECTED() {\n// Your code goes here\n}\n```\n\n**Note: Ennable this feature in Project Settings first:**\n\n<img src=\"images/app_connected_setting.png\" style=\"width: 200px; height:360px\"/>\n\n[Example](https://github.com/blynkkk/blynk-library/blob/master/examples/More/AppConnectedEvents/AppConnectedEvents.ino)\n\n### BLYNK_APP_DISCONNECTED()\n\nThis function is called every time the Blynk app disconnects from Blynk Cloud or private server.\n\n```cpp\nBLYNK_APP_DISCONNECTED() {\n// Your code here\n}\n```\n\n**Note: Enable this feature in Project Settings first:**\n\n<img src=\"images/app_connected_setting.png\" style=\"width: 200px; height:360px\"/>\n\n[Example](https://github.com/blynkkk/blynk-library/blob/master/examples/More/AppConnectedEvents/AppConnectedEvents.ino)\n\n### Blynk.syncAll()\n\nRequests all stored on the server latest values for all widgets. All analog/digital/virtual pin values and states will be set to the latest stored value. Every virtual pin will generate BLYNK_WRITE() event.\n\n```cpp\nBLYNK_CONNECTED() {\n    Blynk.syncAll();\n}\n```\n\n### Blynk.syncVirtual(vPin)\n\nThis command updates individual Virtual Pin to the latest stored value on the server. When it's used, a corresponding ```BLYNK_WRITE``` handler is called.\n\n```cpp\nBlynk.syncVirtual(V0);\n```\n\nTo update multiple pins, use:\n\n```\nBlynk.syncVirtual(V0, V1, V6, V9, V16);\n```\n\n### Blynk.setProperty(vPin, \"property\", value)\n\nThis command allows [changing widget properties](#blynk-main-operations-change-widget-properties)\n\n\n## Debugging\n\n### #define BLYNK_PRINT\n### #define BLYNK_DEBUG\n\nTo enable debug prints on the default Serial port add on the top of your sketch \n**IMPORTANT: This should be the first line in your code**:\n\n```cpp\n#define BLYNK_PRINT Serial // Defines the object that is used for printing\n#define BLYNK_DEBUG        // Optional, this enables more detailed prints\n```\n\nThen enable Serial Output in setup():\n\n```cpp\nSerial.begin(9600);\n```\nOpen Serial Monitor and you'll see the debug prints.\n\nYou can also use spare Hardware serial ports or SoftwareSerial for debug output (you will need an adapter to connect to it with your PC).\n\n<span style=\"color:#D3435C;\">**WARNING:** Enabling ```BLYNK_DEBUG``` will slowdown your hardware processing speed up to 10 times!</span>\n\n### BLYNK_LOG()\n\nWhen ```BLYNK_PRINT``` is defined, you can use ```BLYNK_LOG``` to print your logs. The usage is similar to ```printf```:\n\n```cpp\nBLYNK_LOG(\"This is my value: %d\", 10);\n```\n\nOn some platforms (like Arduino 101) the ```BLYNK_LOG``` may be unavailable, or may just use too much resources.  \nIn this case you can use a set of simpler log functions:\n\n```cpp\nBLYNK_LOG1(\"Hello World\"); // Print a string\nBLYNK_LOG1(10);      // Print a number\nBLYNK_LOG2(\"This is my value: \", 10); // Print 2 values\nBLYNK_LOG4(\"Temperature: \", 24, \" Humidity: \", 55); // Print 4 values\n...\n```\n\n## Minimizing footprint\n\nTo minimize the program Flash/RAM, you can disable some of the built-in functionality:\n\n1. Comment-out ```#define BLYNK_PRINT``` to remove prints\n2. Put on the top of your sketch:\n```\n#define BLYNK_NO_BUILTIN   // Disable built-in analog & digital pin operations\n#define BLYNK_NO_FLOAT     // Disable float operations\n```\n\n## Porting, hacking\n\nIf you want to dive into crafting/hacking/porting Blynk library implementation, please also check [this documentation](https://github.com/blynkkk/blynk-library/tree/master/extras/docs).\n"
  },
  {
    "path": "BlynkMainOperations.md",
    "content": "# Blynk main operations\n\n## Virtual Pins\nBlynk can control Digital and Analog I/O Pins on you hardware directly. You don't even need to write code for it. \nIt's great for blinking LEDs, but often it's just not enough...\n\nWe designed Virtual Pins to send **any** data from your microcontroller to the Blynk App and back. \n\nAnything you connect to your hardware will be able to talk to Blynk.\nWith Virtual Pins you can send something from the App, process it on microcontroller and then send it back to the smartphone. You can trigger functions, read I2C devices, convert values, control servo and DC motors etc.\n\nVirtual Pins can be used to interface with external libraries (Servo, LCD and others) and implement custom functionality. \n\nHardware may send data to the Widgets over the Virtual Pin like this:\n\n```cpp\nBlynk.virtualWrite(pin, \"abc\");\nBlynk.virtualWrite(pin, 123);\nBlynk.virtualWrite(pin, 12.34);\nBlynk.virtualWrite(pin, \"hello\", 123, 12.34);\n```\n\nFor more information about virtual pins, [read this](/#blynk-firmware-virtual-pins-control)\n\n## Send data from app to hardware\nYou can send any data from Widgets in the app to your hardware.\n\nAll [Controller Widgets](/#widgets-controllers) can send data to Virtual Pins on your hardware.\nFor example, code below shows how to get values from the Button Widget in the App\n\n```cpp\nBLYNK_WRITE(V1) //Button Widget is writing to pin V1\n{\n  int pinData = param.asInt(); \n}\n```\nWhen you press a Button, Blynk App sends ```1``` On the second click - it sends ```0``` \n\nThis is how Button Widget is set up:\n\n<img src=\"images/button_virtual_1.png\" style=\"width: 200px; height:360px\"/>\n\n\nFull example sketch: [Get Data](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/GetData/GetData.ino#L24)\n\n### Sending array from Widget \nSome Widgets (e.g Joystick, zeRGBa) have more than one output. \n\n<img src=\"images/joystick_merge_mode.png\" style=\"width: 200px; height:360px\"/>\n\nThis output can be written to Virtual Pin as an array of values. \nOn the hardware side - you can get any element of the array [0,1,2...] by using: \n\n```cpp\nBLYNK_WRITE(V1) // Widget WRITEs to Virtual Pin V1\n{   \n  int x = param[0].asInt(); // getting first value\n  int y = param[1].asInt(); // getting second value\n  int z = param[N].asInt(); // getting N value\n}\n```\n\n **Sketch:** [JoystickTwoAxis](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/JoystickTwoAxis/JoystickTwoAxis.ino#L24)\n\n## Get data from hardware\nThere are two ways of pushing data from your hardware to the Widgets in the app over Virtual Pins.\n\n### Perform requests by Widget\n- Using Blynk built-in reading frequency while App is active by setting 'Reading Frequency' parameter to some interval:\n\n<img src=\"images/frequency_reading_pull.png\" style=\"width: 200px; height:360px\"/>\n\n```cpp\nBLYNK_READ(V5) // Widget in the app READs Virtal Pin V5 with the certain frequency\n{\n  // This command writes Arduino's uptime in seconds to Virtual Pin V5\n  Blynk.virtualWrite(5, millis() / 1000);\n}\n```\n\n**Sketch:** [PushDataOnRequest](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushDataOnRequest/PushDataOnRequest.ino#L26)\n\n\n### Pushing data from hardware\nIf you need to PUSH sensor or other data from your hardware to Widget, you can write any logic you want. \nJust set the frequency to PUSH mode. Any command that hardware sends to Blynk Cloud is automatically stored on server\nand you get this info either with [History Graph](/#widgets-displays-superchart) widget\nor with [HTTP API](http://docs.blynkapi.apiary.io/#reference/0/pin-history-data/get-all-history-data-for-specific-pin).\n\n<img src=\"images/frequency_reading_push.png\" style=\"width: 200px; height:360px\"/>\n\nWe recommend sending data in intervals and avoiding [Flood Error](https://docs.blynk.cc/#troubleshooting-flood-error).\nYou can use timers like [BlynkTimer](/#blynk-firmware-blynktimer).\nPlease read instructions inside this [example sketch](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushData/PushData.ino) for more details.\n\nHere is how it can work:\n\n```cpp\n#include <SPI.h>\n#include <Ethernet.h>\n#include <BlynkSimpleEthernet.h>\n\nchar auth[] = \"YourAuthToken\"; // Put your token here\n\nBlynkTimer timer; // Create a Timer object called \"timer\"! \n\nvoid setup()\n{\n  Serial.begin(9600);\n  Blynk.begin(auth);\n  \n  timer.setInterval(1000L, sendUptime); //  Here you set interval (1sec) and which function to call \n}\n\nvoid sendUptime()\n{\n  // This function sends Arduino up time every 1 second to Virtual Pin (V5)\n  // In the app, Widget's reading frequency should be set to PUSH\n  // You can send anything with any interval using this construction\n  // Don't send more that 10 values per second\n  \n  Blynk.virtualWrite(V5, millis() / 1000);\n}\n\nvoid loop()\n{\n  Blynk.run(); // all the Blynk magic happens here\n  timer.run(); // BlynkTimer is working...\n}\n```\n\n**Sketch:** [PushData](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushData/PushData.ino#L30)\n\n## State syncing\n\n### For hardware\nIf your hardware looses Internet connection or resets, you can restore all the values from Widgets in the Blynk app.\n\n```cpp\nBLYNK_CONNECTED() {\n    Blynk.syncAll();\n}\n\n//here handlers for sync command\nBLYNK_WRITE(V0) {\n   ....\n}\n\n```\n\nThe ```Blynk.syncAll()``` command restores all the Widget's values based on the last saved values on the server. \nAll analog and digital pin states will be restored. Every Virtual Pin will perform ```BLYNK_WRITE``` event.\n\n**WARNING**: if pin is empty and wasn't initialized - hardware will not get any response for those pin during sync.\n\n[Sync Hardware with App state](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/HardwareSyncStateFromApp/HardwareSyncStateFromApp.ino)\n\nYou can also update a single Virtual Pin value by calling ```Blynk.syncVirtual(V0)``` or you can update several pins with ```Blynk.syncVirtual(V0, V1, V2, ...)```.\n\nYou can also use server to store any value without widget. Just call ```Blynk.virtualWrite(V0, value)```.\n\n[Storing single value on server](https://github.com/blynkkk/blynk-library/blob/master/examples/More/ServerAsDataStorage/ServerAsDataStorage_SingleValue/ServerAsDataStorage_SingleValue.ino)\n\n[Storing multiple values on server](https://github.com/blynkkk/blynk-library/blob/master/examples/More/ServerAsDataStorage/ServerAsDataStorage_MultiValue/ServerAsDataStorage_MultiValue.ino)\n\n### For app\nIf you need to keep your hardware in sync with Widgets' state even if app is offline use ```Blynk.virtualWrite```.\n\nImagine you have a LED Widget connected to the Virtual Pin V1 in the app, and a physical button attached to your hardware. \nWhen you press a physical button, you would expect to see updated state of the LED Widget in the app. \nTo achieve that you need to send ```Blynk.virtualWrite(V1, 255)``` when a physical button gets pressed.\n\n[Represent physical button state via LED widget with interrupts](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonInterrupt/ButtonInterrupt.ino)\n\n[Represent physical button state via LED widget with polling](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonPoll/ButtonPoll.ino)\n\n[Represent physical button state via Button widget with polling](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/SyncPhysicalButton/SyncPhysicalButton.ino)\n\n## Control of multiple devices\nBlynk app has support of multiple devices. That means you can assign any widget to specific device with own auth token. \nFor example - you may have button on V1 that controls wi-fi bulb A and another button on V1 that controls wi-fi bulb B. In order \nto do this you need more than 1 device within your project. To achieve this please go to project settings and click on \"Devices\" section : \n\n<img src=\"images/new_project_settings.png\" style=\"width: 200px; height:360px\"/>\n\nYou'll see list of devices :\n \n<img src=\"images/list_of_devices.png\" style=\"width: 200px; height:360px\"/>\n\nSo you can add new device : \n\n<img src=\"images/new_device.png\" style=\"width: 200px; height:360px\"/>\n\nAfter above steps, every widget will have one more field \"Target\" : \n\n<img src=\"images/widget_settings_devices.png\" style=\"width: 200px; height:360px\"/>\n\nNow you need to assign widget to device and after that widget will control only this specific device.\n\nThat's it! Now you need to upload sketches with correct Auth Tokens to your hardware.\n\n### Tags\n\nTags feature allows you to group multiple devices. Tags are very useful in case you want to control few devices with \n1 widget. For example, imagine a case when you have 3 smart bulbs and you want to turn on all those bulbs with one \nsingle click. You need to assign 3 devices to 1 tag and assign tag to button. That's it.\n\nTag widgets also support state syncing. So you can get state of widget from your hardware. However you can't update \nstate of such widgets from hardware.\n\n## Devices online status\nBlynk app has support for online statuses for multiple devices.\n \n<img src=\"images/online_status.png\" style=\"width: 200px; height:360px\"/>\n\nIn ideal world when device closes tcp connection with some ```connection.close()``` - connected server will get notification \nregarding closed connection. So you can get instant status update on UI. However in real world this mostly exceptional situation. \nIn majority of cases there is no easy and instant way to find out that connection is not active anymore. \n\nThat's why Blynk uses ```HEARTBEAT``` mechanism. With this approach hardware periodically sends ```ping``` command with predefined \ninterval (10 seconds by default, ```BLYNK_HEARTBEAT``` [property](https://github.com/blynkkk/blynk-library/blob/master/src/Blynk/BlynkConfig.h)). \nIn case hardware don't send anything within 10 seconds server waits additional 5 seconds and after that connection \nassumed to be broken and closed by server. So on UI you'll see connection status update only after 15 seconds when it is \nactually happened.\n\nYou can also change ```HEARTBEAT``` interval from hardware side via ```Blynk.config```. In that case ```newHeartbeatInterval * 2.3``` formula will be applied. So in case you you decided to set ```HEARTBEAT``` interval to \n5 seconds. You'll get notification regarding connection with 11 sec delay in worst case.\n\n## Project Settings\n\nEvery project has it's own settings:\n\n- **Theme** - switch between the Light and Black Blynk Theme (Business accounts have wider choice);\n- **Keep screen always on** - allows you to use the Blynk app without going to the sleep mode (usually all mobile devices do that);\n- **Send app connected command** - with this option enabled the server will send \"App Connected\" and \"App Disconnected\" commands \nto your hardware when your Blynk app goes online/offline. [Usage example](https://github.com/blynkkk/blynk-library/blob/master/examples/More/AppConnectedEvents/AppConnectedEvents.ino);\n- **Do not show offline notifications** - right now, for debugging purposes, every time your hardware goes offline - the Blynk \nServer will notify you with popup in the app about that. However, when debugging is not needed or the Blynk app is used only \nvia HTTP/S this notifications are meaningless. So this switch allows you to turn off this popups. Also this switch turns off \nthe Push notification \"Notify when offline\" option.\n\n\n## Change Widget properties\nChanging some of the widget properties from hardware side is also supported.  \nFor example, you can change the color of LED widget based on a condition:\n\n```\n//change LED color\nBlynk.setProperty(V0, \"color\", \"#D3435C\");\n\n//change LED label\nBlynk.setProperty(V0, \"label\", \"My New Widget Label\");\n\n//change MENU labels\nBlynk.setProperty(V0, \"labels\", \"Menu Item 1\", \"Menu Item 2\", \"Menu Item 3\");\n\n```\n\n[Set Property for single value field](https://github.com/blynkkk/blynk-library/blob/master/examples/More/SetProperty/SetProperty_SingleValue/SetProperty_SingleValue.ino)\n\n[Set Property for multi value field](https://github.com/blynkkk/blynk-library/blob/master/examples/More/SetProperty/SetProperty_MultiValue/SetProperty_MultiValue.ino)\n\n**NOTE : ** Changing these parameters work **only** for widgets attached to Virtual pins (analog/digital pins won't work).\n\nFour widget properties are supported - ```color```, ```label```, ```min```, ```max``` for all widgets : \n\n```label``` is string for label of all widgets.\n\n```color``` is string in [HEX](http://www.w3schools.com/html/html_colors.asp) format (in the form: #RRGGBB, \nwhere RR (red), GG (green) and BB (blue) are hexadecimal values between 00 and FF). For example :\n``` \n#define BLYNK_GREEN     \"#23C48E\"\n#define BLYNK_BLUE      \"#04C0F8\"\n#define BLYNK_YELLOW    \"#ED9D00\"\n#define BLYNK_RED       \"#D3435C\"\n#define BLYNK_DARK_BLUE \"#5F7CD8\"\n``` \n\n```min```, ```max``` - minimum and maximum values for the widget (for example range for the Slider).\nThis numbers may be float.\n\nOn firmware side, widget objects also support ```setLabel()``` and ```setColor()``` functions.\n\nWidget specific properties: \n\n**Button**\n\n```onLabel``` / ```offLabel``` is string for ON/OFF label of button;\n\n**Styled Button**\n\n```onLabel``` / ```offLabel``` is string for ON/OFF label of button;\n\n```onColor``` / ```offColor``` is string in HEX format for ON/OFF colors of the button;\n\n```onBackColor``` / ```offBackColor``` is string in HEX format for ON/OFF colors of the button background.\n\n**Music Player**\n\n```isOnPlay``` is boolean accepts true/false.\n``` \nBlynk.setProperty(V0, \"isOnPlay\", \"true\");\n``` \n\n**Menu**\n\n```labels``` is list of strings for Menu widget selections;\n``` \nBlynk.setProperty(V0, \"labels\", \"label 1\", \"label 2\", \"label 3\");\n``` \n\n**Video Streaming**\n\n```cpp\nBlynk.setProperty(V1, \"url\", \"http://my_new_video_url\");\n```\n\n**Step**\n\n```cpp\nBlynk.setProperty(V1, \"step\", 10);\n```\n\n**Image**\n\n```cpp\nBlynk.setProperty(V1, \"opacity\", 50); // 0-100%\n```\n\n```cpp\nBlynk.setProperty(V1, \"scale\", 30); // 0-100%\n```\n\n```cpp\nBlynk.setProperty(V1, \"rotation\", 10); //0-360 degrees\n```\n\nalso, you can fully replace the list of images from the hardware:\n\n```cpp\nBlynk.setProperty(V1, \"urls\", \"https://image1.jpg\", \"https://image2.jpg\");\n```\n\nor you can change individual image by it index:\n\n```cpp\nBlynk.setProperty(V1, \"url\", 1, \"https://image1.jpg\");\n```\n\nYou can also change widget properties via [HTTP API](http://docs.blynkapi.apiary.io/#).\n\n## Limitations and Recommendations\n- Don't put ```Blynk.virtualWrite``` and any other ```Blynk.*``` command inside ```void loop()```- it will cause \nlot's of outgoing messages to our server and your connection will be terminated; \n\n- We recommend calling functions with intervals. For example, use [BlynkTimer](/#blynk-firmware-blynktimer)\n\n- Avoid using long delays with ```delay()``` – it may cause connection breaks;\n\n- If you send more than 100 values per second - you may cause \n[Flood Error](/#troubleshooting-flood-error) and your hardware will be automatically disconnected from the server;\n\n- Be careful sending a lot of ```Blynk.virtualWrite``` commands as most hardware is not very powerful (like ESP8266) \nso it may not handle many requests. \n"
  },
  {
    "path": "BlynkProtocol.md",
    "content": "# Blynk protocol\n\nBlynk transfers binary messages with the following structure:\n\n| Command       | Message Id    | Length/Status   | Body     |\n|:-------------:|:-------------:|:---------------:|:--------:|\n| 1 byte        | 2 bytes       | 2 bytes         | Variable |\n\nMessage Id and Length are [big endian](http://en.wikipedia.org/wiki/Endianness#Big-endian).\nBody has a command-specific format.\n\nCommand and Status definitions: [BlynkProtocolDefs.h](https://github.com/blynkkk/blynk-library/blob/master/Blynk/BlynkProtocolDefs.h)\n\nAnother protocol description can be found [here](https://github.com/blynkkk/blynk-server/blob/master/README_FOR_APP_DEVS.md#protocol-messages).\n\nTypical Blynk library knows how to send(S)/process(P):\n\n    S   BLYNK_CMD_LOGIN + auth token\n    SP  BLYNK_CMD_PING\n    SP  BLYNK_CMD_RESPONSE\n    SP  BLYNK_CMD_BRIDGE\n    SP  BLYNK_CMD_HARDWARE\n    S   BLYNK_CMD_TWEET\n    S   BLYNK_CMD_EMAIL\n    S   BLYNK_CMD_PUSH_NOTIFICATION\n\n## HARDWARE/BRIDGE command body\n\nThe body of these commands are encoded as a sequence of strings, separated by ```'\\0'``` ([Null character](http://en.wikipedia.org/wiki/Null_character)).\nPlease note that the last value may be not Null-terminated.\nIn the following command examples ```\\0``` chars are replaced with spaces.\n\n### Pin mode\n\nPinMode command is received by library after connection, or when a mobile application starts.\n\n    pm <pin> <mode>\n    pm <pin> <mode> <pin> <mode> <pin> <mode> ...\n\nMode:\n\n* in - INPUT\n* out - OUTPUT\n* pu - INPUT_PULLUP\n* pd - INPUT_PULLDOWN\n\n### Digital pin operations\n\nDigital write:\n\n    dw <pin> <val>\n\nDigital read:\n\n    dr <pin>\n\n### Analog pin operations\n\n    aw <pin> <val>\n\n    ar <pin>\n\n### Virtual pin operations\n\n    vw <pin> <param0> <param1> <param2> <param3> ...\n\n    vr <pin>\n\n### Other operations\n\n    info\n\nTODO\n\n## Developer notes\n\n* Values in HW commands are plain text.\n* In response to ```dr/ar``` command, library should send ```dw/aw``` command on the same pin and with the same message id.\n* These situations should cause a connection drop, or reconnection attempt:\n * Message with ```ID=0``` is received\n * Message with unknown type is received\n \n## Adding network interface \n4 entities should be created to add a new network interface to Blynk:\n \n1. Select connection interface that will be used for Blynk operation.  \n   This should be something like http://www.arduino.cc/en/Tutorial/WebClient  \n   Based on the API of the connection, create the **Transport**.  \n   Some examples may be found in the Adapters folder:\n   * BlynkTransportSerial\n   * BlynkTransportCC3000\n   * BlynkArduinoClient - *can be reused, if possible*\n   \n2. Create **Blynk representative class**, which contains connection-specific helper functions (like begin).\n   Examples:\n   * BlynkEthernet\n   * BlynkSerial\n   * BlynkCC3000\n   * BlynkWildFire\n   * BlynkYun\n   \n3. Create **BlynkSimple*** header for your connection.  \n   This constructs main **Blynk instance**, so the user (mostly) doesn't need to get into such details.  \n   Examples:\n   * BlynkSimpleEthernet.h\n   * BlynkSimpleCC3000.h\n   * BlynkSimpleWifi.h\n   * BlynkSimpleUIPEthernet.h\n   \n4. Create a **simple example** for your platform ;)\n\n### Example implementations\nUse these to play with the protocol and understand the basics:\n\n* [Pseudo-library in Python](https://github.com/blynkkk/blynk-library/blob/master/tests/pseudo-library.py)\n* [Node.js + Espruino](https://github.com/vshymanskyy/blynk-library-js)\n* [Arduino](https://github.com/blynkkk/blynk-library)\n* [Particle Core](https://github.com/vshymanskyy/blynk-library-spark)\n"
  },
  {
    "path": "BlynkServer.md",
    "content": "# Blynk server\nNo longer supported"
  },
  {
    "path": "CNAME",
    "content": "docs.blynk.cc"
  },
  {
    "path": "FAQ.md",
    "content": "#FAQ\n\n- I backed Blynk on Kickstarter. Where are my widgets and why the app is free?\n> App is free because otherwise you would have to pay to download it. This is how AppStore and Google Play works.\n> Current Blynk release has a limited amount of widgets. We decided to make them free for everyone until we implement store. After that, every widget will be paid. However every backer will get them for free (according to their pledge).\n  \n- What is Blynk Cloud?\n> Blynk Cloud is a open-source software written on Java using plain TCP/IP and secured TCP/IP (for hardware that supports it) sockets and running on our server. Blynk iOS and Android apps connect to Blynk Cloud by default. Access is free for every Blynk user. We also provide a Private Server distribution for those who want to [install it locally](/#blynk-server).\n\n- How much access to Cloud Blynk Server cost?\n> It is free for every Blynk user.\n\n- Can I run Blynk server locally?\n> Yes. Those of you, who want extra security or don’t have internet connection, can install Local Blynk Server and run it in your own local network. Blynk Server is Open-Source and it takes less than few seconds to deploy. All the instructions and files are [here](/#blynk-server).\n\n- What are the requirements to run Private Blynk Server?\n> To run Private Blynk Server, all you need is Java Runtime Environment.\n\n- Can I run Blynk server on Raspberry Pi?\n> Yes, surely! [Here is instruction](/#blynk-server-how-to-run-local-blynk-server-launch-blynk-server-on-raspberry-pi).\n\n- Does Blynk app work over Bluetooth?\n> Yes. It is in beta right now.\n\n- Does Blynk support Ethernet / Wi-FI / UART?\n> Yes, all of them. See full list of [supported hardware](/#supported-hardware) and shields.\n\n- I don't have any shield. Can I use Blynk with my computer?\n> Yes, you can use Blynk just with a USB cable. There is a step-by-step [instruction](/#other-hardware-connect-over-usb) on how to do it.\n\n- Can Blynk handle multiple Arduinos?\n> Yes. There 3 ways right now :\n> - add multiple devices to your project.\n> - you may use same [Auth Token](/#getting-started-getting-started-with-application-auth-token) for different hardware. In that case you can control few hardwares from 1 dashboard.\n> - you can do it using [Bridge functionality](/#widgets-other-bridge) which allows you to send messages from one hardware to another.\n\n- Does Blynk server store sensor data when app goes offline?\n> Yes, every command that hardware sends to server is stored. You could use [History Graph](/#widgets-displays-superchart) widget in order to view it.\n\n- How many Virtual Pins I can use?\n> It depends mostly on your hardware. Low-end hardware may use up to 32 Virtual Pins. More powerful (like ESP8266) can \n> use up to 128 but it requires also BLYNK_USE_128_VPINS property in your sketch. [Example](https://github.com/blynkkk/blynk-library/blob/master/src/Blynk/BlynkConfig.h#L64).\n\n- Why app requires all this permissions?\n> http://help.blynk.cc/faq/blynk-android-permissions-explained"
  },
  {
    "path": "GettingStarted.md",
    "content": "#Getting Started  \nLet's get you started in 5 minutes (reading doesn't count!). \nWe will switch on an LED connected to your Arduino using the Blynk App on your smartphone.\n\nConnect an LED as shown here:\n\n<img src=\"images/Arduino_LED.jpg\" style=\"width: 250px; height:350px\"/>\n\n##Getting Started With The Blynk App\n###1. Create a Blynk Account\nAfter you download the Blynk App, you'll need to create a New Blynk account. This account is separate from the accounts used for the Blynk Forums, in case you already have one.\n\nWe recommend using a **real** email address because it will simplify things later.\n\n<img src=\"images/register_account.png\" style=\"width: 200px; height:360px\"/>\n\n####Why do I need to create an account?\n\nAn account is needed to save your projects and have access to them from multiple devices from anywhere. It's also a security measure. \n\nYou can always set up your own [Private Blynk Server](/#blynk-server) and have full control.\n\n###2. Create a New Project\nAfter you've successfully logged into your account, start by creating a new project.\n\n<img src=\"images/getting_started/create_project_button.png\" style=\"width: 200px; height:360px\"/>\n \n###3. Choose Your Hardware\nSelect the hardware model you will use. Check out the [list of supported hardware](/#supported-hardware)!\n\n<img src=\"images/getting_started/select_hardware.png\" style=\"width: 200px; height:360px\"/>\n\n###4. Auth Token\n\n**Auth Token** is a unique identifier which is needed to connect your hardware to your smartphone. \nEvery new project you create will have its own Auth Token. You'll get Auth Token automatically on your email after \nproject creation. You can also copy it manually. Click on devices section and selected required device : \n\n<img src=\"images/getting_started/token_1.png\" style=\"width: 200px; height:360px\"/>\n\nAnd you'll see token : \n\n<img src=\"images/getting_started/new_device.png\" style=\"width: 200px; height:360px\"/>\n\n<span style=\"color:#D3435C;\">**NOTE:** Don't share your Auth Token with anyone, unless you want someone to have access to your hardware. </span>\n\nIt's very convenient to send it over e-mail. Press the e-mail button and the token will be sent to the e-mail address you used for registration. \nYou can also tap on the Token line and it will be copied to the clipboard.\n\nNow press the **\"Create\"** button.  \n\n<img src=\"images/new_project.png\" style=\"width: 200px; height:360px\"/>\n\n###5. Add a Widget\n\nYour project canvas is empty, let's add a button to control our LED.\n\nTap anywhere on the canvas to open the widget box. All the available widgets are located here. Now pick a button.\n\n**Widget Box**\n\n<img src=\"images/widgets_box.png\" style=\"width: 200px; height:360px\"/>\n\n**Drag-n-Drop** - Tap and hold the Widget to drag it to the new position.\n\n**Widget Settings** - Each Widget has it's own settings. Tap on the widget to get to them.\n\n<img src=\"images/button_settings.png\" style=\"width: 200px; height:360px\"/>\n\nThe most important parameter to set is **PIN** . The list of pins reflects physical pins defined by your hardware. If your LED is connected to Digital Pin 8 - then select **D8** (**D** - stands for **D**igital).    \n\n<img src=\"images/pin_selection.png\" style=\"width: 200px; height:360px\"/>\n\n###6. Run The Project\nWhen you are done with the Settings - press the **PLAY** button. This will switch you from EDIT mode to PLAY mode where you can interact with the hardware. While in PLAY mode, you won't be able to drag or set up new widgets, press **STOP** and get back to EDIT mode.\n\nYou will get a message saying \"Arduino UNO is offline\". We'll deal with that in the next section.\n\n<img src=\"images/play_button.png\" style=\"width: 200px; height:360px\"/>\n\n##Getting Started With Hardware\n###How To Use an Example Sketch\nYou should by now have the Blynk Library installed on your computer. If not - [click here](/#downloads-blynk-library).\n\nExample sketches will help you get your hardware online quickly and major Blynk features. \n\nOpen the example sketch according to the hardware model or shield you are using.\n\n<img src=\"images/connection_type_sketch.png\" style=\"width: 500px; height:217px\"/>\n\n\nLet's take a look at the example sketch for an [Arduino UNO + Ethernet shield](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n```cpp\n#define BLYNK_PRINT Serial\n#include <SPI.h>\n#include <Ethernet.h>\n#include <BlynkSimpleEthernet.h>\n\nchar auth[] = \"YourAuthToken\";\n\nvoid setup()\n{\n  Serial.begin(9600); // See the connection status in Serial Monitor\n  Blynk.begin(auth);  // Here your Arduino connects to the Blynk Cloud.\n}\n\nvoid loop()\n{\n  Blynk.run(); // All the Blynk Magic happens here...\n}\n```\n\n###Auth Token\nIn this example sketch, find this line:\n\n```cpp\nchar auth[] = \"YourAuthToken\";\n```\nThis is the [Auth Token](/#getting-started-getting-started-with-application-4-auth-token) that you emailed yourself.\nPlease check your email and copy it, then paste it inside the quotation marks.\n\nIt should look similar to this:\n\n``` \nchar auth[] = \"f45626c103a94983b469637978b0c78a\";\n``` \n\nUpload the sketch to the board and open Serial Terminal.  Wait until you see something like this: \n\n``` \nBlynk v.X.X.X\nYour IP is 192.168.0.11\nConnecting...\nBlynk connected!\n```\n\n<span style=\"color:#24C48C\" >**Congrats! You are all set! Now your hardware is connected to the Blynk Cloud!**</span>\n\n##Blynking\nGo back to the Blynk App, push the button and turn the LED on and off! It should be Blynking.\n\n<img src=\"images/button_pressed.png\" style=\"width: 200px; height:360px\"/>\n\nCheck out [other example sketches](https://github.com/blynkkk/blynk-library/tree/master/examples). \n\nFeel free to experiment and combine different examples together to create your own amazing projects. \n\nFor example, to attach an LED to a [PWM](http://www.arduino.cc/en/Tutorial/Fading)-enabled Pin on your Arduino, set the slider widget to control the brightness of an LED. Just use the same steps described above.\n"
  },
  {
    "path": "HardwareSetUps.md",
    "content": "# Hardware set-ups\n## Arduino over USB (no shield)\nIf you don't have any shield and your hardware doesn't have any connectivity, you can still use Blynk – directly over USB :\n\n1. Open [Arduino Serial USB example](https://github.com/blynkkk/blynk-library/blob/master/examples/Boards_USB_Serial/Arduino_Serial_USB/Arduino_Serial_USB.ino) \nand change [Auth Token](/#getting-started-getting-started-with-application-4-auth-token)\n\n\t```cpp\n\t// You could use a spare Hardware Serial on boards that have it (like Mega)\n\t#include <SoftwareSerial.h>\n\tSoftwareSerial DebugSerial(2, 3); // RX, TX\n\t\n\t#define BLYNK_PRINT DebugSerial\n\t#include <BlynkSimpleStream.h>\n\t\n\t// You should get Auth Token in the Blynk App.\n\t// Go to the Project Settings (nut icon).\n\tchar auth[] = \"YourAuthToken\";\n\t\n\tvoid setup()\n\t{\n\t  // Debug console\n\t  DebugSerial.begin(9600);\n\t\n\t  // Blynk will work through Serial\n\t  Serial.begin(9600);\n\t  Blynk.begin(auth, Serial);\n\t}\n\t\n\tvoid loop()\n\t{\n\t  Blynk.run();\n\t}\n\t```\n2. Run the script which is usually located in ```/scripts``` folder:\n\n - Windows:```My Documents\\Arduino\\libraries\\Blynk\\scripts```\n - Mac\t```User$/Documents/Arduino/libraries/Blynk/scripts```\n\n  \n  **On Windows:**\n  \n  Open cmd.exe\n  \n  Write your path to blynk-ser.bat folder. For example:\n   \n```\ncd C:\\blynk-library-0.3.1\\blynk-library-0.3.1\\scripts\n```\n  \n  Run ```blynk-ser.bat``` file. For example : ```blynk-ser.bat -c COM4``` (where COM4 is port with your Arduino)\n  \n  And press \"Enter\", press \"Enter\" and press \"Enter\"\n  \n  **On Linux and Mac**:\n  \n  Navigate to /scripts folder. For example:\n  \n```\ncd User$/Documents/Arduino/libraries/Blynk/scripts\n``` \n\n  When inside this folder, run:\n  \n```\nuser:scripts User$ ./blynk-ser.sh\n```\n\n  **Warning:** Do no close terminal window with running script.\n  \n  In some cases you may also need to perform : \n\n```\nuser:scripts User$ chmod +x blynk-ser.sh\n```\n  \n  You may need also to run it with ```sudo```\n  \n```\nuser:scripts User$ sudo ./blynk-ser.sh\n``` \n\n  This is what you'll see in Terminal app on Mac (usbmodem address can be different):\n  \n```\n[ Press Ctrl+C to exit ]\n/dev/tty.usbmodem not found.\nSelect serial port [ /dev/tty.usbmodem1451 ]: \n```\n\t\n  Copy the serial port address: ```/dev/tty.usbmodem1451``` and paste it back:\n\n```\nSelect serial port [ /dev/tty.usbmodem1451 ]: /dev/tty.usbmodem1451\n```\n\t\n  After you press Enter, you should see an output similar to this:\n\n```\nResetting device /dev/tty.usbmodem1451...\nConnecting: GOPEN:/dev/tty.usbmodem1451,raw,echo=0,clocal=1,cs8,nonblock=1,ixoff=0,ixon=0,ispeed=9600,ospeed=9600,crtscts=0 <-> openssl-connect:blynk-cloud.com:9443,cafile=/Users/.../server.crt,nodelay\n2015/10/03 00:29:45 socat[30438.2046857984] N opening character device \"/dev/tty.usbmodem1451\" for reading and writing\n2015/10/03 00:29:45 socat[30438.2046857984] N opening connection to LEN=16 AF=2 45.55.195.102:9443\n2015/10/03 00:29:45 socat[30438.2046857984] N successfully connected from local address LEN=16 AF=2 192.168.0.2:56821\n2015/10/03 00:29:45 socat[30438.2046857984] N SSL connection using AES128-SHA\n2015/10/03 00:29:45 socat[30438.2046857984] N starting data transfer loop with FDs [3,3] and [4,4]\n```\n\n<span style=\"color:#D3435C;\">**NOTE:** Arduino IDE may complain with \"programmer is not responding\". You need to terminate script before uploading new sketch. </span>\n\nAdditional materials:\n\n- [Tutorial: Control Arduino over USB with Blynk app. No shield required. Mac OS)](https://www.youtube.com/watch?v=fgzvoan_3_w)\n- [How to control arduino (Wirelessly) with blynk via USB. Windows](https://www.youtube.com/watch?v=I_hgIj2FdPI)\n- [Instructables: Control Arduino with Blynk over USB](http://www.instructables.com/id/Control-arduino-using-Blynk-over-usb/)\n\n\n## Raspberry Pi\n1. Connect your Raspberry Pi to the Internet and open it's console.\n2. Run this command (it updates your OS package repository to include the required packages):\n\n\t```\n\tcurl -sL \"https://deb.nodesource.com/setup_6.x\" | sudo -E bash -\n\t```\n\n3. Download and build Blynk JS library using npm:\n\n\t```\n\tsudo apt-get update && sudo apt-get upgrade\n\tsudo apt-get install build-essential\n\tsudo apt-get install -g npm \n\tsudo npm install -g onoff\n\tsudo npm install -g blynk-library\n\t```\n\n4. Run Blynk test script (put your auth token):\n\n\t```\n\tblynk-client 715f8cafe95f4a91bae319d0376caa8c\n\t```\n\n5. You can write our own script based on [examples](https://github.com/vshymanskyy/blynk-library-js/tree/master/examples)\n\n6. To enable Blynk auto restart for Pi, find ```/etc/rc.local``` file and add there:\n\n\t```\n\tnode full_path_to_your_script.js <Auth Token> \n\t```\n\nAdditional materials:\n\n- [Instructables: Blynk on Javascript for Raspberry Pi, Intel Edison and others](http://www.instructables.com/id/Blynk-JavaScript-in-20-minutes-Raspberry-Pi-Edison)\n- [Instructables: Use DHT11/DHT12 sensors with Raspberry Pi and Blynk](http://www.instructables.com/id/Raspberry-Pi-Nodejs-Blynk-App-DHT11DHT22AM2302/?ALLSTEPS)\n\n**Note:** Instead of using Node.js, you can also build a C++ libarry version (same as Arduino, WiringPi-based) installation:\n- [Library README for Linux](https://github.com/blynkkk/blynk-library/blob/master/linux/README.md)\n- [Blynk Community Topic: How-To Raspberry Pi](https://community.blynk.cc/t/howto-for-raspberry-pi/332)\n- [Video tutorial - Setting up Blynk and Raspberry Pi:](https://www.youtube.com/watch?v=iSG_8g6KyGE)\n\n## ESP8266 Standalone\n\nYou can run Blynk directly on the ESP8266!\n\nInstall the latest ESP8266 library for Arduino using [this guide](https://github.com/esp8266/Arduino#installing-with-boards-manager). \n\n**Example Sketch:** [ESP8266_Standalone](https://github.com/blynkkk/blynk-library/blob/master/examples/Boards_WiFi/ESP8266_Standalone/ESP8266_Standalone.ino)\n\nAdditional materials:\n\n- [Instructables: ESP8266 ESP-12(Standalone)+ Blynk](http://www.instructables.com/id/ESP8266-ESP-12Standalone-Blynk-101)\n- [Instructables: ESP8266-12 standalone Blynk lm35 temperature sensor](http://www.instructables.com/id/ESP8266-12-blynk-wireless-temperature-LM35-sensor/?ALLSTEPS)\n \n[Step-by-Step Tutorial in Russian language](http://esp8266.ru/esp8266-blynk)\n\n## NodeMCU\n\nPlease follow [this detailed instruction](https://github.com/blynkkk/blynk-library/tree/master/examples/Boards_WiFi/NodeMCU#instruction-for-nodemcu-setup).\nOr watch [this Video tutorial](https://www.youtube.com/watch?v=FhS44hGk1Lc).\n\n## Arduino + ESP8266 WiFi with AT commands\n\nThis connection type is not recommended for beginners.  \nIf you would like to try it, please carefully read [this help topic](http://help.blynk.cc/hardware-and-libraries/arduino/esp8266-with-at-firmware)\n**Note:** Some boards like Arduino UNO WiFi from Arduino.org, do not use AT commands (and do not provide relevant libraries), so this renders them unusable with Blynk.\n\n## Particle\nBlynk works with the whole family of Particle products: Core, Photon and Electron\n\n1. Open [Particle Web IDE](https://build.particle.io/build).\n2. Go to the libraries.\n3. Search for **Blynk** in the Community Libraries and click on it\n4. Open ```01_PARTICLE.INO``` example\n5. Click \"use this example\"\n6. Put your Auth Token here: ``` char auth[] = \"YourAuthToken\";``` and flash the Particle!\n\nYou can scan this QR code from the Blynk App and you'll get a ready-to-test project for **Particle Photon**. Just put your Auth Token into the ```01_PARTICLE.INO``` example.\n<img src=\"images/Particle Demo1530733075.png\" style=\"width: 300px; height:300px\"/>\n\nAdditional materials:\n\n- [Particle core + DHT22](https://www.hackster.io/gusgonnet/temperature-humidity-monitor-with-blynk-7faa51)\n"
  },
  {
    "path": "Implementing.md",
    "content": "# Implementing a Blynk HW client (library)\nCurrently we provide Arduino/C++ implementation of the library.\nIt is very extensible and modular, look at [the list of supported hardware](/#supported-hardware).\nAdding new connection types and Arduino-compatible boards is easy.\n\nTODO: Porting guide.\n\nBut some devices are programmed in other languages, like:\n\n* Espruino, JavaScript, Node.JS\n* MicroPython, Python\n* NodeMCU, eLua\n\nThis document hints how to write a custom library.\n\n## Blynk library main functions\n\n* Provide easy-to use API\n * Virtual pin handlers registration\n * Provide comfortable wrappers for some widgets\n* Manage connection\n * Should support different connection type/hardware, if applicable\n* Serialize/deserialize Blynk protocol\n* Handle direct pin operations\n* Should be portable across similar devices (or same technology/programming language), if possible\n* Should detect and notify the user about [troubles](/#troubleshooting) where possible (especially Flood)\n\n### Adding new HW board\n\nDifferent boards can be added by creating JSON board description file.\n\n```json\n{\n    \"name\": \"Arduino UNO\",\n    \"map\": {\n        \"digital\": {\n            \"pins\": {\n                \"D0\":  0,  \"D1\":  1,  \"D2\":  2,  \"D3\":  3, \"D4\": 4,\n                \"D5\":  5,  \"D6\":  6,  \"D7\":  7,  \"D8\":  8, \"D9\": 9,\n                \"D10\": 10, \"D11\": 11, \"D12\": 12, \"D13\": 13\n            },\n            \"ops\": [ \"dr\", \"dw\" ]\n        },\n        \"analog\": {\n            \"pins\": {\n                \"A0\": 14, \"A1\": 15, \"A2\": 16, \"A3\": 17, \"A4\": 18, \"A5\": 19\n            },\n            \"ops\": [ \"dr\", \"dw\", \"ar\" ],\n            \"arRange\":[0, 1023]\n        },\n        \"pwm\": {\n            \"pins\": [\n                \"D3\", \"D5\", \"D6\", \"D9\", \"D10\", \"D11\"\n            ],\n            \"ops\": [ \"aw\" ],\n            \"awRange\":[0, 255]\n        },\n        \"virtual\":  {\n            \"pinsRange\": [ 0, 31 ],\n            \"ops\": [ \"vr\", \"vw\" ]\n        }\n    }\n}\n```\n\nLook at the [full boards list](https://github.com/blynkkk/blynk-library/tree/master/boards_json).\nYou can send us your own board description file for review and App integration.\n\nThere may be a problem that you want to start testing your implementation, but your board is not listed int the Blynk App.\nOn Android, we now have a \"Generic Board\" specially for such purposes.\nUnfortunately iOS does not have it yet.\n\nBasically you can select UNO board and check how it works using just virtual pins.\nMost digital pins will also work.\nAnalog IO/PWM will not work in general, until we add your board to the App."
  },
  {
    "path": "IntroAndDownloads.md",
    "content": "# Intro\n\n<h2 class=\"banner-header\">🚨🚨🚨 IMPORTANT:</h2> \n\n<p class=\"banner\">\n  This documentation is for the LEGACY version of Blynk platform which is no longer supported and will be shut down.<br/>\n  You can sign up for the current version of Blynk platform <a href=\"http://blynk.cloud/dashboard/register\">here</a>.<br/>\n  The new mobile apps can be downloaded from <a href=\"https://apps.apple.com/us/app/blynk-iot/id1559317868\">App Store</a> and <a href=\"https://play.google.com/store/apps/details?id=cloud.blynk&hl=en&gl=US\">Google Play</a>.<br/>\n  The actual Blynk documentation is <a href=\"https://docs.blynk.io/\">here</a>.\n</p>\n \nIf you want to continue with using unsupported verion of Blynk, check out Getting Started.\n<br>\n\n[Getting Started >](/#getting-started)\n\n##How Blynk Works\nBlynk was designed for the Internet of Things. It can control hardware remotely, it can display sensor data, \nit can store data, vizualize it and do many other cool things. \n\nThere are three major components in the platform: \n\n- **Blynk App** - allows to you create amazing interfaces for your projects using various widgets we provide.\n\n- **Blynk Server** - responsible for all the communications between the smartphone and hardware. \nYou can use our Blynk Cloud or run your [private Blynk server](/#blynk-server) locally.\nIt's open-source, could easily handle thousands of devices and can even be launched on a Raspberry Pi.\n\n- **Blynk Libraries** - for all the popular hardware platforms - enable communication with the server and \nprocess all the incoming and outcoming commands.\n\nNow imagine: every time you press a Button in the Blynk app, the message travels to ~~space~~ the Blynk Cloud, \nwhere it magically finds its way to your hardware. It works the same in the opposite direction and \neverything happens in a blynk of an eye.\n\n<img src=\"images/architecture.png\" style=\"width: 640px; height:478px\"/>\n\n##Features\n* Similar API & UI for all supported hardware & devices\n* Connection to the cloud using:\n  * WiFi\n  * Bluetooth and BLE\n  * Ethernet\n  * USB (Serial)\n  * GSM\n  * ...\n* Set of easy-to-use Widgets\n* Direct pin manipulation with no code writing\n* Easy to integrate and add new functionality using virtual pins\n* History data monitoring via SuperChart widget\n* Device-to-Device communication using Bridge Widget\n* Sending emails, tweets, push notifications, etc.\n* ... new features are constantly added!\n\nYou can find [example sketches](https://github.com/blynkkk/blynk-library/tree/master/examples) covering basic Blynk Features. \nThey are included in the library. All the sketches are designed to be easily combined with each other.\n\n##What do I need to Blynk?\nAt this point you might be thinking: **\"Ok, I want it. What do I need to get started?\"** – Just a couple of things, really:\n\n####**1. Hardware**. \nAn Arduino, Raspberry Pi, or a similar development kit.\n\n**Blynk works over the Internet.** \nThis means that the hardware you choose should be able to connect to the internet. Some of the boards, like Arduino Uno \nwill need an Ethernet or Wi-Fi Shield to communicate, others are already Internet-enabled: like the ESP8266, Raspberri Pi with WiFi dongle, Particle Photon or SparkFun Blynk Board. But even if you don't have a shield, you can connect it over USB to your \nlaptop or desktop (it's a bit more complicated for newbies, but we got you covered). \nWhat's cool, is that the [list of hardware](/#supported-hardware) that works with Blynk is huge and will keep on growing.\n  \n####**2. A Smartphone**. \nThe Blynk App is a well designed interface builder. It works on both iOS and Android, so no holywars here, ok? \n\n#Downloads\n##**Blynk Apps for iOS or Android** <br> \n[<img src=\"images/appstore-lrg.svg\" alt=\"Drawing\" style=\" width: 158px; height:42\"/>](https://itunes.apple.com/us/app/blynk-control-arduino-raspberry/id808760481?ls=1&mt=8)  &nbsp; &nbsp; &nbsp; &nbsp;[<img src=\"https://play.google.com/intl/en_us/badges/images/apps/en-play-badge.png\" alt=\"Drawing\" style=\" width: 158px; height:42px\"/>](https://play.google.com/store/apps/details?id=cc.blynk)\n\n##**Blynk Library** <br>\n[Download The Blynk Library >](https://github.com/blynkkk/blynk-library/releases/latest)\n\nIn case you forgot, or don't know how to install Arduino libraries [click here](http://www.arduino.cc/en/guide/libraries).\n"
  },
  {
    "path": "License.md",
    "content": "# License\nThis project is released under The MIT License (MIT)\n"
  },
  {
    "path": "Links.md",
    "content": "#Links\n\n* [Blynk site](https://www.blynk.cc)\n* [Blynk community](https://community.blynk.cc)\n* [Facebook](https://www.fb.com/blynkapp)\n* [Twitter](https://twitter.com/blynk_app)\n* [Blynk Library](https://github.com/blynkkk/blynk-library)\n* [Blynk Examples](https://github.com/blynkkk/blynk-library/tree/master/examples)\n* [Blynk Server](https://github.com/blynkkk/blynk-server)\n* [Kickstarter campaign](https://www.kickstarter.com/projects/167134865/blynk-build-an-app-for-your-arduino-project-in-5-m/description)"
  },
  {
    "path": "OTA.md",
    "content": "#OTA\n\nBlynk also supports over the air updates for - ESP8266, NodeMCU and SparkFun Blynk boards. OTA supported only \nfor the private servers and for the paid customers for now.\n\n## How does it work?\n\n - You need to use [regular sketch for exported apps](https://github.com/blynkkk/blynk-library/tree/master/examples/Blynk.Inject/Template_ESP8266);\n - After you launched your hardware you are ready for OTA;\n - You can trigger the firmware update for the specific hardware via it's token or for all hardware.\n \n### Flow \n  \n 1. User triggers OTA with one of below HTTPS request;\n 2. User provides within HTTPS request admin credentials and firmware binary file to update hardware with;\n 3. When hardware connects to server - server checks it firmware. In case, hardware firmware build date differs from \n uploaded firmware, than server sends special command to hardware with url for the new firmware;\n 4. Hardware processes url with below [handler](https://github.com/blynkkk/blynk-library/blob/master/examples/Blynk.Inject/Template_ESP8266/OTA.h#L31): \n    ```\n      BLYNK_WRITE(InternalPinOTA) {\n        //url to get firmware from. This is HTTP url\n        //http://localhost:8080/static/ota/FUp_2441873656843727242_upload.bin\n        overTheAirURL = param.asString();\n        ...\n      }\n    ```\n    \n  5. Hardware downloads new firmware and starts flashing firmware;  \n\n## Trigger update for the specific hardware\n\n```\ncurl -v -F file=@Template_ESP8266.ino.nodemcu.bin --insecure -u admin@blynk.cc:admin https://localhost:9443/admin/ota/start?token=123\n```\n\n - ```Template_ESP8266.ino.nodemcu.bin``` - is relative (or full) path to your firmware;\n - ```--insecure``` flag for servers with self-generated certificates. You don't need this flag if you used Let's Encrypt or other trusted certificates;\n - ```admin@blynk.cc:admin``` admin credentials to your server. This is default ones. Format is ```username:password```. You can change it in ```server.properties``` file;\n - ```token``` is token of your hardware you want apply the firmware update to. The firmware update will be initiated only in case device is online;\n\n## Trigger OTA for all devices\n \nUpdate for all devices will be triggered only when they are connected to the cloud. You need to remove the token part for that.\n\n```\ncurl -v -F file=@Template_ESP8266.ino.nodemcu.bin --insecure -u admin@blynk.cc:admin https://localhost:9443/admin/ota/start\n```\n\nIn that case, OTA will be triggered right after device connected to the server. In case device is online firmware update \nwill be initiated only when device will be connected again.\n\n## Trigger OTA for the specific user\n\nIn that case firmware update will be triggered for all devices of specified user. \n\n```\ncurl -v -F file=@Template_ESP8266.ino.nodemcu.bin --insecure -u admin@blynk.cc:admin https://localhost:9443/admin/ota/start?user=pupkin@gmail.com\n```\n\n## Trigger OTA for specific user and project\n\nIn that case firmware update will be triggered for all devices of specified user within specified project. \n\n```\ncurl -v -F file=@Template_ESP8266.ino.nodemcu.bin --insecure -u admin@blynk.cc:admin https://localhost:9443/admin/ota/start?user=pupkin@gmail.com&project=123\n```\n\n## Stop OTA\n\n```\ncurl -v --insecure -u admin@blynk.cc:admin https://localhost:9443/admin/ota/stop\n```\n\n## How to make firmware\n\nIn order to make firmware in Arduino IDE - go to menu: Sketch -> Export compiled Binary.\n\n\n*NOTE:* ESP8266 right now takes firmware only via HTTP. And not HTTPS."
  },
  {
    "path": "README.md",
    "content": "# This documentation is no longer maintained and supported. Latest documentation is available here: https://docs.blynk.io\n\n\nBlynk IoT Platform is a white-label, multi-tenant software solution that allows you to build personal and commercial IoT projects connected products.\n\nWith Blynk you can start with building a prototype or personal project and then scale it up to millions of commercial connected devices.\n\nBlynk platform allows you to connect almost any electronics hardware to the Internet, start collectind data from devices, monitor and control them remotely from anywhere in the world\n\nData from devices can be stored, aggregated, and visualized in easy-to-build mobile and web applications.\n\nBlynk is a real-time system where you can create outstanding experience for your end-customers and perform complex analytics\n\nThe four major components of the Blynk IoT Platform are:\n\n* **Blynk.Cloud**\n* **Blynk.Edgent**\n* **Blynk.app**\n* **Blynk.Console**\n\n"
  },
  {
    "path": "Roadmap.md",
    "content": "#Roadmap\n\nWe build Blynk based on Blynkers feedback but with limited resources we have to prioritize our features. At the moment list look like that:\n\n- App Sharing (project sharing when other people can control your hardware, but can't modify your project); Free Beta\n- App Sharing (project sharing when other people can control your hardware, but can't modify your project); Subscription based\n- Bluetooth Low Energy support;\n- Hardware state handling (changing physical button state changes Blynk application state);\n- Hardware online/offlane state improvements (better indication for \"is hardware online?\", \"is hardware offline?\");\n- Project space increase\n- Direct Connect support (for WiFi);\n- RTC widget;\n- Design options for widgets (size, button with icons, etc);\n- Phone sensors widgets (GPS, accelerometer);\n- IP camera support;\n- Customizable look and feel of the project\n\nUnder consideration:\n- Home screen widget (to avoid opening App when you need only 1 button click);\n- Haptic feedback (vibration) when touching widgets\n"
  },
  {
    "path": "SUMMARY.md",
    "content": "# Table of contents\n\n* [What is Blynk](README.md)\n\n## overview\n\n* [Blynk Components](overview/blynk-components.md)\n\n## Product <a id=\"en-product\"></a>\n\n* [What is a Product](en-product/create-new-product.md)\n* [General Settings](en-product/general-settings/README.md)\n  * [Manufacturer](en-product/general-settings/manufacturer.md)\n  * [Offline Ignore Period](en-product/general-settings/offline-ignore-period.md)\n* [Metadata](en-product/metadata.md)\n* [Datastreams](en-product/datastreams/README.md)\n  * [Datastream Name](en-product/datastreams/datastream-name.md)\n  * [Decimals Formatting](en-product/datastreams/decimals-formatting.md)\n  * [Wait for confirmation from the device](en-product/datastreams/wait-for-confirmation-from-the-device.md)\n  * [Default Value](en-product/datastreams/default-value.md)\n  * [Expose to Automation](en-product/datastreams/expose-to-automation.md)\n  * [Sync with the latest server value](en-product/datastreams/sync-with-the-latest-server-value.md)\n  * [Datastream: Alias](en-product/datastreams/datastream-alias.md)\n  * [Datastream: Invalidate Value](en-product/datastreams/datastream-invalidate-value.md)\n  * [Datastream: Min/Max values](en-product/datastreams/datastream-min-max-values.md)\n  * [Datastream: Data Type](en-product/datastreams/datastream-data-type.md)\n  * [Datastream: Virtual Pin](en-product/datastreams/datastream-virtual-pin.md)\n  * [Datastream: Save Raw Data](en-product/datastreams/datastream-save-raw-data.md)\n* [Events](en-product/events/README.md)\n  * [Events: Notification](en-product/events/events-notification.md)\n  * [Events: Code](en-product/events/events-code.md)\n  * [Events: Name](en-product/events/events-name.md)\n  * [System Events](en-product/events/events-online-offline.md)\n  * [Events: Notifications Limit](en-product/events/events-notification-period.md)\n* [Web Dashboard](en-product/web-dashboard.md)\n* [Mobile app UI](en-product/mobile-app-ui.md)\n\n## Firmware API <a id=\"firmware-api-1\"></a>\n\n* [Disable Widgets in the App](firmware-api-1/disable-widgets-in-the-app.md)\n\n## REST API <a id=\"https-api\"></a>\n\n* [Devices](https-api/external_api.md)\n* [Events](https-api/events-api.md)\n\n## Mobile App\n\n* [Untitled](mobile-app/untitled.md)\n\n"
  },
  {
    "path": "Security.md",
    "content": "#Security\n\nBlynk server has 5 ports open for different security levels.\n\n* **80** - plain TCP connection for the hardware (no security)\n* **8080** - plain TCP connection for hardware (no security)\n* **443** - SSL/TLS connection for the Mobile Apps and hardware with SSL\n* **9443** - SSL/TLS connection for the Mobile Apps and hardware with SSL\n\nHardware may select to connect to 443 (9443) or 80 (8080), depending on it's capabilities.\nConnection between the app and the server is always is done through SSL/TLS, so it is always secured.\nConnection between the hardware and server depends on your hardware capabilities.\n\n## Use Local Blynk Server\n\nLocal Blynk Server is no longer supported.\n\n## Use SSL gateway\n\nMost platforms are not capable to handle SSL, so they connect to 80.\nHowever, our [gateway script](https://github.com/blynkkk/blynk-library/blob/master/scripts/blynk-ser.sh) can be used to add SSL security layer to communication.\n\n```bash\n./blynk-ser.sh -f SSL\n```\nThis will forward all hardware connections from 9443 port to the server via SSL gateway.\nYou can run this script on your Raspberry Pi, desktop computer, or even directly on your router!\n\n**Note:** when using your own server, you should overwrite the bundled server.crt certificate, or specify it to the script using ```--cert``` switch:\n\n```bash\n./blynk-ser.sh -f SSL -s <server ip> -p 9443 --cert=<certificate>.crt\n```\n\nFlag ```-f SSL``` is enabled by default for USB communication so you don't have to explicit declare it.\n\n**Note:** SSL is supported by the gateway only on Linux/OSX for now\n\nIf you want to skip SSL, and connect to TCP, you can also do that:\n\n```bash\n./blynk-ser.sh -t TCP\n```\n"
  },
  {
    "path": "Sharing.md",
    "content": "#Sharing\nBlynk offers two types of sharing your projects with other people:\n\n- **Share access to your hardware.** Think about giving someone an App for your Project. They can't modify, but can control and see what's there.\n\n- **Share your Project configuration.** Others will get a clone of your project by scanning a given QR link, but they won't be able to control your hardware. It's great for tutorials, instructables, etc.\n\n## Shared access to your hardware\nImagine giving someone an App to control your Project.\n\n- people you’ve shared your project with can’t modify anything. They can only use it\n- you can update your app, change the layout, add widgets and it’s immediately synced to everyone\n- you can revoke access at any moment\n\nHow it works:\n- you send the QR code to your users (you can email, print, post to social media, do whatever you want)\n- others download Blynk app, scan the QR code and your app opens for them ready to use. They don’t even need to login or create an account.\n\nGo to your Project's Settings:\n\n<img src=\"images/dash_settings_sharing.png\" style=\"width: 200px; height:360px\"/>\n\nClick on \"Generate Link\" button :\n\n<img src=\"images/dash_settings_sharing_generate.png\" style=\"width: 200px; height:360px\"/>\n\nIt will generate QR code you can share with others:\n\n<img src=\"images/dash_public_sharing.png\" style=\"width: 200px; height:360px\"/>\n\nThat's it! Now **Exit the settings and press PLAY button.**\n\nAnother person would need to install Blynk app and scan QR code from the login screen (scanning from existing profile is not yet supported) ;\n\n<img src=\"images/scan_qr.png\" style=\"width: 200px; height:360px\"/>\n\n**NOTE:** Your Project should be active, don't forget to press Play button.\n\n**WARNING:** Sharing costs 1000 energy and this energy is not recoverable even you didn't use sharing at all.\n\n\n## Share your Project configuration\nIn case you want to share your Project's set up without giving access to your hardware (for example to make a tutorial or instructable)- follow the steps: \n\nIn Project's Settings go to **Clone** button.\n\n<img src=\"images/clone.png\" style=\"width: 200px; height:360px\"/>\n\nIt will generate QR code you can share with anyone.\n\n<img src=\"images/QR.png\" style=\"width: 200px; height:360px\"/>\n\nAnother person **should Log In to Blynk app** and press QR button in Projects gallery\n\n<img src=\"images/QR_button_edit.png\" style=\"width: 200px; height:360px\"/>\n\nAfter the scan, a new Project will be created, all the widgets, settings, layout will be cloned. Another person would need enough Energy Balance to clone your Project.\n\n**Auth Token will be different!**. Nobody will get access to your hardware. They just get a copy of the layout and settings.\n"
  },
  {
    "path": "SupportedHardware.md",
    "content": "# Supported Hardware\n\n**Attention!** This documentation is for the LEGACY version of Blynk platform which is no longer supported.  \nPlease check out the [**new documentation**](https://docs.blynk.io)\n\n\nBlynk supports more than 400 boards already, including support for Arduino, Particle, ARM mbed, TI Energia, MicroPython, Node.js, OpenWRT and many Single Board Computers. You can add your own connection types easily (see [these](https://github.com/blynkkk/blynk-library/tree/master/examples/More/ArduinoClient) examples for Arduino)!\n\n## Platforms\n\n- **Arduino** (https://github.com/blynkkk/blynk-library)\n  - Arduino MKR WiFi 1010\n  - Arduino MKR GSM 1400\n  - Arduino MKR NB 1500\n  - Arduino Uno, Duemilanove\n  - Arduino Nano, Mini, Pro Mini, Pro Micro, Due, Mega\n  - Arduino 101 (Intel Curie, with BLE)\n  - Arduino MKR1000\n  - Arduino Zero\n  - Arduino Yún (onboard WiFi and Ethernet, via Bridge)\n  - Arduino.org UNO WiFi\n  - Arduino MKR VIDOR 4000 (use the example for MKR WiFi 1010)\n  - Arduino UNO WiFi Rev.2 (use the example for MKR WiFi 1010)\n  \n- **Arduino-like**\n  - Blynk Board\n  - ESP8266 (Generic, NodeMCU, Witty Cloud, Huzzah, WeMos D1, Seeed Wio Link, etc.)\n  - ESP32 (WiFi, BLE)\n  - Nordic nRF51/nRF52 - based boards\n  - Teensy 3.2/3.1\n  - Blue Pill (STM32F103C)\n  - Realtek RTL8710 / Ameba via [RTLduino](https://github.com/pvvx/RtlDuino)\n  - BBC micro:bit\n  - LightBlue Bean *, soon*\n  - DFRobot Bluno\n  - RedBear Duo (WiFi, BLE)\n  - RedBearLab Blend Micro\n  - RedBearLab BLE Nano (v1 and v2)\n  - Seeed Tiny BLE\n  - Simblee BLE\n  - RFduino BLE\n  - The AirBoard (BLE-Link, RN-XV)\n  - Feather M0 WiFi\n  - Feather 32u4 BLE\n  - Intel Edison\n  - Intel Galileo\n  - Fishino Guppy, Uno, Mega\n  - TinyCircuits TinyDuino (CC3000)\n  - Microduino/mCookie Core, Core+, CoreUSB\n  - Wicked WildFire V2, V3, V4\n  - Digistump Oak\n  - chipKIT Uno32\n  - Alorium XLR8 (FPGA)\n  - LinkIt ONE (WiFi only)\n- **Energia**\n  - Texas Instruments\n    - CC3220SF-LaunchXL\n    - CC3200-LaunchXL\n    - Tiva C Connected LaunchPad\n    - Stellaris LM4F120 LaunchPad\n    - MSP430F5529 + CC3100\n    - LaunchPad MSP432\n  - RedBearLab (CC3200, WiFi Mini)\n\n- **Particle** https://github.com/vshymanskyy/blynk-library-spark)\n  - Core\n  - Photon\n  - Electron\n  - RPi\n  - SparkFun RedBoard\n  - RedBear Duo (WiFi & BLE)\n\n- **ARM mbed** (https://developer.mbed.org/users/vshymanskyy/code/Blynk/)\n  - Seeed Tiny BLE\n  - RedBearLab BLE Nano\n  - BBC micro:bit\n  - STM32 Nucleo + Wiznet 5100 *, soon*\n\n- **JavaScript** (Node.js, Espruino, Browsers) (https://www.npmjs.com/package/blynk-library)\n  - Regular PC with Linux / Windows / OS X\n  - Raspberry Pi (Banana Pi, Orange Pi, ...)\n  - BeagleBone Black\n  - Onion Omega\n  - Onion Omega 2\n  - Intel Galileo\n  - Intel Edison\n  - Intel Joule\n  - LeMaker Guitar\n  - LeMaker Banana Pro\n  - Samsung ARTIK 5\n  - PandaBoard, CubieBoard, pcDuino, Tessel 2\n  - VoCore, VoCore2 (OpenWRT + [Espruino package](https://github.com/vshymanskyy/OpenWRT-Espruino-packages))\n  - Espruino Pico\n  - ...\n\n- **Python** (https://github.com/vshymanskyy/blynk-library-python)\n  - MicroPython\n  - Python 2\n  - Python 3\n\n- **Lua** (https://github.com/blezek/blynk-esp)\n  - NodeMCU\n\n## Arduino connection types\n\n- USB (Serial), connected to your laptop or desktop\n\n- **Ethernet**\n  - Arduino MKR ETH\n  - Arduino Ethernet Shield (W5100)\n  - Arduino Ethernet Shield 2 (W5500)\n  - SeeedStudio Ethernet Shield V2.0 (W5200)\n  - ENC28J60-based modules\n \n- **WiFi**\n  - ESP8266 as WiFi modem (running original firmware)\n  - Arduino WiFi 101 Shield\n  - Arduino WiFi Shield\n  - WIZnet WizFi310\n  - Adafruit CC3000 WiFi Breakout / Shield\n  - RN-XV WiFly\n \n- **Bluetooth Smart (BLE 4.0)**\n  - HM-10, HC-08\n  - DFRobot BLE-Link module\n  - Microduino/mCookie BLE\n  - RedBearLab BLE Mini\n  - nRF8001-based boards (Adafruit Bluefruit LE, etc.)\n \n- **Bluetooth 2.0 Serial Port Profile (SPP)**\n  - HC-05, HC-06, ...\n \n- **Cellular (GSM/3G/LTE)**\n  - SIMCom SIM800 series (SIM800A, SIM800C, SIM800L, SIM800H, SIM808, SIM868)\n  - SIMCom SIM900 series (SIM900A, SIM900D, SIM908, SIM968)\n  - A6/A7\n  - M590\n  - BG96\n  - GPRSbee\n  - Microduino GSM\n  - Adafruit FONA (Mini Cellular GSM Breakout)\n  - Adafruit FONA 800/808 Shield\n\n## Made by Community\n\n- [Marvell® EZ-Connect™ MW300/MW302](https://github.com/vshymanskyy/blynk-library-ez-connect)\n- [WIZnet-W5500-EVB](http://instructables.com/id/WIZnet-W5500-EVB-and-Blynk-App-communication)\n- [LabVIEW](https://github.com/juncaofish/NI-LabVIEWInterfaceforBlynk)\n- [Node-RED](https://github.com/gablau/node-red-contrib-blynk-ws) (can be used as bridge to HTTP, TCP, UDP, MQTT, XMPP, IRC, OSC...)\n\n## Problematic Boards\n\nThese boards are not supported and do not work out of the box:\n- [Arduino Tian](http://www.arduino.org/products/boards/arduino-tian)\n\nHere is a list of [**known library issues**](https://github.com/blynkkk/blynk-library/issues?q=is%3Aissue+label%3A\"for+reference\"+)\n"
  },
  {
    "path": "Troubleshooting.md",
    "content": "# Troubleshooting\n\n## Connection\n\nIf you experience connection problems, follow these steps:\n\n1. Check that your hardware, wires, cables and power supply are good quality, not harmed or damaged, etc.  \n   Use high power USB cables and USB ports.\n2. Check your wiring using the examples (TCP/HTTP Client or similar) **provided with your shield and hardware**.\n   * Once you understand how to manage connection, it's much easier to use Blynk.\n3. Try running command ```telnet blynk-cloud.com 80``` from your PC, connected to the same network as your hardware.\n   You should see something like: ```Connected to blynk-cloud.com.```.\n4. Try running Blynk default examples for your platform **without modifications** to see if it is working.\n   * Double-check that you have selected **the right example** for your connection type and hardware model.\n   * Our examples come with **comments and explanations**. **Read them carefully.**\n   * Check that your Auth Token is valid (copied from the App and **doesn't contain spaces, etc.**)\n   * If it doesn't work, try looking into [serial debug prints](/#enable-debug).\n5. Done! Add your modifications and functionality. Enjoy Blynk!\n\n***Note:*** when you have multiple devices connected to your network, they should all have different MAC and IP addresses. For example, when using 2 Arduino UNO with Ethernet shields, flashing default example to both of them will cause connection problems. You should use [manual ethernet configuration](https://github.com/blynkkk/blynk-library/blob/master/examples/Boards_Ethernet/Arduino_Ethernet_Manual/Arduino_Ethernet_Manual.ino) example.\n\n## WiFi network connection\nIf you encounter WiFi connection problems, please check these pitfalls:\n\n* You're trying to connect to \"WPA & WPA2 Enterprise\" network (often used in offices), and your shield does not support this security method\n* Your WiFi network has a login page that requests entering an access token (often used in restaurants)\n* Your WiFi network security disallows connecting alien devices completely (MAC filtering, etc)\n* There is a firewall running. Default port for hardware connections is 80 (8080 on the Local Server).\nMake sure it's open.\n\n## Delay\n\nIf you use long ```delay()``` or send your hardware to sleep inside of the ```loop()``` expect connection drops and downgraded performance.\n\n***DON'T DO THAT:***\n```cpp\nvoid loop()\n{\n  ...\n  delay(1000); // this is long delay, that should be avoided\n  other_long_operation();\n  ...\n  Blynk.run();\n}\n```\n\n***Note:*** This also applies to the BLYNK_READ & BLYNK_WRITE handlers!\n\n***SOLUTION:***\nIf you need to perform actions in time intervals - use timers, for example [BlynkTimer](/#blynk-firmware-blynktimer).\n\n## Flood Error\n\nIf your code frequently sends a lot of requests to our server, your hardware will be disconnected. Blynk App may show \"Your hardware is offline\"\n\nWhen ```Blynk.virtualWrite``` is in the ```void loop```, it generates hundreds of \"writes\" per second \n\nHere is an example of what may cause flood. ***DON'T DO THAT:***\n```cpp\nvoid loop()\n{\n  Blynk.virtualWrite(1, value); // This line sends hundreds of messages to Blynk server\n  Blynk.run();\n}\n```\n\n***SOLUTION:***\nIf you need to perform actions in time intervals - use timers, for example [BlynkTimer](/#blynk-firmware-blynktimer).\n\nUsing ```delay()``` will not solve the problem either. It may cause [another issue](/#delay). Use timers!\n\nIf sending hundreds of requests is what you need for your product you may increase flood limit on local server \nand within Blynk library.\nFor local server you need to change ```user.message.quota.limit``` property within ```server.properties``` file :\n\n        #100 Req/sec rate limit per user.\n        user.message.quota.limit=100\n        \nFor library you need to change ```BLYNK_MSG_LIMIT``` property within ```BlynkConfig.h``` file :\n \n        //Limit the amount of outgoing commands.\n        #define BLYNK_MSG_LIMIT 20\n\n## Enable debug\n\nTo enable debug prints on the default Serial, add this on the top of your sketch **(it should be the first line\nin your sketch)**:\n\n```cpp\n#define BLYNK_DEBUG // Optional, this enables lots of prints\n#define BLYNK_PRINT Serial\n```\nAnd enable serial in ```void setup()```:\n\n```cpp\nSerial.begin(9600);\n```\n\nYou can also use spare Hardware serial ports or SoftwareSerial for debug output (you will need an adapter to connect to it with your PC).\n\n***Note:*** enabling debug mode will slow down your hardware processing speed up to 10 times.\n\n## Geo DNS problem\n\nGeo DNS issue is no longer a problem. It was solved in 2017.\n\n## Reset password\n\nOn login screen click on \"Forgot password?\" label and than type your email and ```Send``` button.\nYou'll get instruction on your email.\n\n### Android reset password flow\n\n1. Open instruction email **from your smartphone or tablet**;\n2. Click on \"Reset now\" button in your email;\n3. Click on Blynk icon in below popup and reset the pass:\n\n<img src=\"images/reset.png\"/>\n"
  },
  {
    "path": "Widgets-RU.md",
    "content": "<h2 class=\"banner-header\"> 🚨🚨🚨 ВАЖНО:</h2> \n\n<p class=\"banner\">\n  Эта документация предназначена для УСТАРЕВШЕЙ версии платформы Blynk, которая больше не поддерживается и будет закрыта.<br/>\n  Вы можете зарегистрироваться в текущей версии платформы Blynk <a href=\"http://blynk.cloud/dashboard/register\">здесь</a>.<br/>\n  Новые мобильные приложения можно скачать с <a href=\"https://apps.apple.com/us/app/blynk-iot/id1559317868\">App Store</a> и <a href=\"https://play.google.com/store/apps/details?id=cloud.blynk&hl=en&gl=US\">Google Play</a>.<br/>\n  Текущая документация Blynk <a href=\"https://docs.blynk.io/\">здесь</a>.\n</p>\n\n#Widgets\nWidgets are interface modules. Each of them performs a specific input/ output function when communicating with the hardware.\n\nThere are 4 types of Widgets: \n\n- **Controllers** - used to send commands that control your hardware\n- **Displays** - used for data visualization from sensors and other sources;\n- **Notifications** - send messages and notifications;\n- **Interface** - widgets to perform certain GUI functions;\n- **Other** - widgets that don't belong to any category;\n\nEach Widget has it's own settings. Some of the Widgets (e.g. Bridge) just enable functionality and they don't have any settings.\n \n## Common Widget Settings\n### Pin Selector\nThis is one of the main parameters you need to set. It defines which pin to control or to read from. \n\n<img src=\"images/pin_selection.png\" style=\"width: 200px; height:360px\"/>\n\n**Digital Pins** - represent physical Digital IO pins on your hardware. PWM-enabled pins are marked with the ```~``` symbol\n\n**Analog Pins** - represent physical Analog IO pins on your hardware\n\n**Virtual Pins** - have no physical representation. They are used to transfer any data between Blynk App and your hardware.\nRead more about Virtual Pins [here](/#blynk-main-operations-virtual-pins).\n\n### Data Mapping\n\nIn case you want to map incoming values to specific range you may use mapping button: \n\n<img src=\"images/display_edit_mapping.png\" style=\"width: 200px; height:360px\"/>\n\nLet's say your sensor sends values from 0 to 1023. But you want to display values in a range 0 to 100 in the app. \nWhen Data Mapping enabled, incoming value 1023 will be mapped to 100.\n\n### SPLIT/MERGE\nSome of the Widgets can send more than one value. And with this switch you can control how to send them.\n\n- **SPLIT**:\nEach of the parameters is sent directly to the Pin on your hardware (e.g D7). You don't need to write any code.\n\n\t**NOTE:** In this mode you send multiple commands from one widget, which can reduce performance of your hardware.\n\n\tExample: If you have a Joystick Widget and it's set to D3 and D4, it will send 2 commands over the Internet:\n\n\t```cpp\n\tdigitalWrite(3, value);\n\tdigitalWrite(4, value);\n```\n\n- **MERGE:**\nWhen MERGE mode is selected, you are sending just 1 message, consisting of array of values. But you'll need to parse it on the hardware. \n\n\tThis mode can be used with Virtual Pins only.\n\t\n\tExample: Add a zeRGBa Widget and set it to MERGE mode. Choose Virtual Pin V1\n\t\n\t```cpp\n\tBLYNK_WRITE(V1) // There is a Widget that WRITEs data to V1 \n\t{\n\t  int r = param[0].asInt(); // get a RED channel value\n\t  int g = param[1].asInt(); // get a GREEN channel value\n\t  int b = param[2].asInt(); // get a BLUE channel value\n\t}\n```\n\n### Decimals\nDefines how many decimals you would like to see when moving a Slider.\nWhen \"No Fraction\" is chosen, slider will only send integer values with no decimals.\n\"1 digit\" means that values will look like 1.1, 1.2, ..., 2.0, etc.\n\n### Send On Release \nThis option allows you to optimize data traffic on your hardware. \n\nFor example, when you move joystick widget, commands are streamed to the hardware, during a single joystick move \nyou can send dozens of commands. There are use-cases where it's needed, however creating such a load may lead to hardware overload and reset. \n**Send On Release** is a recommended setting for majority of applications. This is also a default setting.\n\n### Write interval\nSimilar to \"Send on Release\" option. However, it allows you to stream values to your hardware within certain interval. For example, setting **write interval** to 100 ms means that while you move the slider, only 1 value will be sent to hardware within 100 ms period.\nThis option is also used to optimize data traffic flow to your hardware.\n\n### Color gradient\n\nWhen you choose gradient, it affects the color of widget elements based on invoming values. \nFor example: You set Gauge Widget with Min and Max parameters of 0-100, and choose green-yellow-red gradient. When hardware sends: \n- `10`, Gauge will change it's color to green color\n- `50` will change Gauge to yellow color\n- `80` will change Gauge to red color\n\nThere are 2 types of gradients you can choose from:\n- Warm: Green - Orange - Red;\n- Cold: Green - Blue - Violet;\n\n\n\n##Controllers\n### Кнопка (Button)\n\nКнопка может работать в двух режимах - в режиме переключателя (нажатие и отжатие посылает 1 сообщение) и в пуш режиме \n(нажатие посылает команду и отжатие посылает команду). Кнопка позволяет послать любое число. По умолчанию кнопка шлет \n0/1 (LOW/HIGH). В пуш режиме кнопка шлет 1 (HIGH) на нажатие и 0 (LOW) при отжатии.\n\nВы так же можете менять состояние кнопки с микроконтроллера. Например, включить кнопку на пине V1 можно так : \n\n```cpp\nBlynk.virtualWrite(V1, HIGH);\n```\n\nТак же можно поменять тексты в кнопке : \n\n```cpp\nBlynk.setProperty(V1, \"onLabel\", \"Вкл\");\n```\n\n```cpp\nBlynk.setProperty(V1, \"offLabel\", \"Выкл\");\n```\n\nНазвание самой кнопки : \n\n```cpp\nBlynk.setProperty(V1, \"label\", \"Моя кнопочка\");\n```\n\nИли изменить ее цвет : \n\n```cpp\n//#D3435C - Blynk RED \nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\nВ случае если микроконтроллер был перегружен, Вы всегда можете получить последнее состояние кнопки с сервера с помощью \nфичи синхронизации состояния: \n\n```cpp\n//как только подключились\nBLYNK_CONNECTED() {\n  //запросить информацию у сервера о состоянии пина V1\n  Blynk.syncVirtual(V1);\n}\n\n//этот метод будет вызыван после ответа сервера \nBLYNK_WRITE(V1) {\n  int buttonState = param.asInt();\n}\n```\n\n#### Кнопка на рабочем столе\n\nЕсли Вы используете Android, то Вы можете добавить Blynk кнопку на рабочий стол. В этом случае кнопка будет работать по \nпротоколу HTTPS. Такого рода кнопки имеют определенные ограничения по функционалу в связи с ограничениями платформы Android. \nНапример, Вы не можете получить мгновенную синхронизацию состояния кнопки на рабочем столе с состоянием на микроконтроллере. Так как состояние кнопки на рабочем столе обновляется раз в 15 мин.\n\n**Замечание:** Добавление виджета кнопки на рабочий стол стоит 100 энергии. Эта энергия не возвращается после удаления виджета. \nТакже такая кнопка будет работать на локальном сервере только если открыть порт 8080.\n\n\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n**Пример кода:** [Синхронизация состояния с физической кнопкой через прерывания](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonInterrupt/ButtonInterrupt.ino)\n\n**Пример кода:** [Синхронизация состояния с физической кнопкой через поллинг](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonPoll/ButtonPoll.ino)\n\n**Пример кода:** [Синхронизация состояния с физической кнопкой](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/SyncPhysicalButton/SyncPhysicalButton.ino)\n\n\n### Слайдер (Slider)\n\nСлайдер очень похож на потенциометр. Он позволяет посылать значения в диапазоне от минимального значения к максимальному. \nДиапазон допустимых максимального и минимального значений определяется в приложении.\n\nВы так же можете менять состояние слайдера с микроконтроллера. Например, Вы можете изменить положение ползунка в слайдере : \n\n```cpp\nBlynk.virtualWrite(V1, 55);\n```\n\nТак же можно поменять текст в слайдере : \n\n```cpp\nBlynk.setProperty(V1, \"label\", \"Мой слайдерок\");\n```\n\nили изменить цвет : \n\n```cpp\n//#D3435C - Карсный цвет в кодирвке RGB\nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\n### Таймер (Timer)\n\nТаймер запускает действия в определенное время. Даже если смартфон не в сети. По умолчанию время начала отправляет 1 (HIGH), время остановки отправляет 0 (LOW). Вы можете изменить это поведение на любые другие значения.\nВы можете изменить настройки Таймера в режиме «Запуска».\nВ последней версии Android также есть улучшенный таймер в виджете [Обработчик событий](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/eventor.md).\n\nC [Обработчиком](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/eventor.md) событий вы можете назначить несколько таймеров на один и тот же пин, отправить любую строку/число, выбирать дни и часовой пояс.\nРекомендуется использовать виджет [Обработчик событий](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/eventor.md) поверх виджета Таймер.\nОднако виджет Таймер по-прежнему подходит и для простых событий таймера.\n\n**ПРИМЕЧАНИЕ:** Виджет таймера зависит от времени сервера, а не вашего телефона. Иногда время телефона может не соответствовать времени сервера.\n\n**Пример кода:** [Таймер](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Timer/Timer.ino)\n\n### Джойстик (Joystick)\n\nУправление сервоприводом в 4 направлениях.\n\n#### Параметры:\n\n- **Раздельный** (SPLIT):\nКаждый из параметров отправляется непосредственно на пин вашего оборудования (например, D7 и D8). Вам не нужно писать код.\n\n**ПРИМЕЧАНИЕ:** В этом режиме вы отправляете несколько команд из одного виджета, что может снизить производительность вашего оборудования.\n\n**Пример:** Если у вас есть виджет Джойстика и он настроен на D3 и D4, он отправит две команды через Интернет:\n\n```cpp\ndigitalWrite(3, x);\ndigitalWrite(4, y);\n```\n\n- **Совмещенный** (MERGE):\nКогда выбран режим MERGE, вы отправляете только 1 сообщение, состоящее из массива значений. Но вам нужно разобрать его на оборудовании устройства.\n\nЭтот режим можно использовать только с виртуальными пин-ами.\n\t\n**Пример:** добавьте виджет Джойстика и установите его в режим \"MERGE\". Выберите виртуальный пин V1\n\t\n```cpp\nBLYNK_WRITE(V1) // Joystick assigned to V1 \n{\n  // получить x \n  int x = param[0].asInt(); \n  // получить y\n  int y = param[1].asInt();\n}\n```\n\n- **Поворт/Наклон** (Rotate on Tilt)\nКогда это параметр включен, Джойстик будет автоматически вращаться, если вы будете использовать смартфон в горизонтальной положении.\n\n- **Автовозврат** (Auto-Return)\nКогда это парамтер выключен, ручка джойстика не вернется в центральное положение. Она останется там, где вы ее оставили.\n \n### Отправка при Отжатии (Send On Release)\n**Send On Release** доступно для большинства виджетов контроллеров и позволяет уменьшить трафик данных на ваше оборудование. Например, когда вы перемещаете виджет джойстика, команды непрерывно передаются на аппаратное устройство, во время одного движения джойстика вы можете отправлять десятки команд. Есть случаи, когда это необходимо, однако создание такой нагрузки может привести к зависанию или сбросу оборудования. Мы рекомендуем включить функцию **Send On Release** для большинства случаев, если вам не требуется мгновенная обратная связь. Эта опция включена по умолчанию.\n\n### Интервал записи (Write interval)\nПохоже на вышеуказанный вариант. Однако, позволяет вам передавать значения на ваше оборудование в через определенные интервалы времени. Например, установка интервала записи на 100 мс означает, что при перемещении ползунка на аппаратное обеспечение будет отправлено только 1 значение в течение 100 мс. Эта опция также используется для уменьшения трафика данных на ваше оборудовании.\n\n**Пример кода:** [Джойстик две оси](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/JoystickTwoAxis/JoystickTwoAxis.ino)\n\n### Шаговое управление (Step Control)\n\nШаговое управление похоже на две кнопки, назначенные одному пин-у. Одна кнопка увеличивает ваше значение на установленный шаг, а другая уменьшает его. Это очень полезно для случаев использования, когда вам нужно точно изменять ваши значения, но вы не можете достичь такой точности с помощью виджета [Cлайдера](https://github.com/blynkkk/blynkkk.github.io/tree/master/mobile/ru/slider.md).\n\n**Отправить шаг (Send Step)** опция позволяет вам отправлять на оборудование каждый шаг нвместо фактического значения виджета.\n\n**Зациклить значения (Loop value)**  опция позволяет сбросить Шаговый виджет на начальное значение при достижении максимального.\n\nВы можете изменить значение Шагового виджета со стороны оборудования. Например:\n\n```cpp\nBlynk.virtualWrite(V1, val);\n```\n\nВы можете изменить описание виджета со стороны оборудования с помощью кода:\n\n```cpp\nBlynk.setProperty(V1, \"label\", \"Мой счетчик.\");\n```\n\nВы можете изменить шаг виджета со стороны оборудования:\n\n```cpp\nBlynk.setProperty(V1, \"step\", 10);\n```\n\nили изменить цвет: \n\n```cpp\n//#D3435C - Красный цвет в RGB кодировке\nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\nВы также можете получить состояние виджета Шагового управления с сервера в случае, если ваше оборудование отключилось, с помощью функции Blynk.Sync:\n\n```cpp\nBLYNK_CONNECTED() {\n  Blynk.syncVirtual(V1);\n}\n\nBLYNK_WRITE(V1) {\n  int stepperValue = param.asInt();\n}\n```\n\n##Displays\n### Отображение значений (Value Display)\n\nОтображает входящие данные с ваших датчиков или виртуальных пин-ов.\nМожет работать в двух режимах:\n\n- режим PUSH (выберается в списке выбора частоты считывания);\n- режим частоты считываний;\n\nВ режиме PUSH вы обновляете значения виджета со стороны оборудования с помощью кода:\n \n```cpp\nBlynk.virtualWrite(V1, val); \n```\n\nВ этом режиме каждое сообщение, которое отправляет аппаратное устройство автоматически сохраняется на сервере. Режим PUSH не требует, чтобы приложение было онлайн или открыто.\n\nВ режиме частоты считывния вам необходимо выбрать интервал обновления данных, и приложение будет запускать события считывния с требуемой периодичностью.\nВаше приложение должно быть открыто и запущено для отправки запросов на оборудование. Вам не нужен код для аналоговых и цифровых выводов в даном случае. Однако для виртуальных выводов вам необходимо использовать следующий код:\n\n```cpp\n//вызывать из приложения\nBLYNK_READ(V1)\n{\n  //отправить в приложение\n  Blynk.virtualWrite(V1, val);\n}\n```\n\n#### Отображение значений на рабочем столе\n\nВы также можете добавить виджет отображение значения на рабочий стол Android. В этом случае отображение значений работает по протоколу HTTPS.\nИмейте в виду, что в режиме «Рабочий стол» отображение значений имеет несколько ограничений. Виджет будет обновлять свое состояние только один раз в 15 минут. Вы можете изменить это органичение через настройки виджета. Однако интервал обновления менее 15 минут не гарантируется.\nВы также можете изменить размер отображаемого значения на рабочем столе - просто сделайте длинный тап на виджете и измените его размер на необходимый.\n\n**Примечание:** Добавление виджета на главный экран стоит 100 энергии. Эта энергия не возвращяется при удалении виджета.\n\n**Примечание:** Виджеты рабочего стола для локальных серверов Blynk требуют открытия порта 8080.\n\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n### Интервал записи (Write interval)\nОпция позволяет вам передавать значения на ваше оборудование в через определенные интервалы времени. Например, установка интервала записи на 100 мс означает, что при перемещении ползунка на аппаратное обеспечение будет отправлено только 1 значение в течение 100 мс. Эта опция также используется для уменьшения трафика данных на ваше оборудовании.\n\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n\n### Светодиод (LED)\n\nПростой светодиод для индикации. Вам нужно отправить 0, чтобы выключить светодиод. И 255 для того, чтобы включить светодиод.\nИли просто используйте Blynk API, как описано ниже:\n\n```cpp\n//регистрируемся на виртуальном пине 1\nWidgetLED led1(V1);\nled1.off();\nled1.on();\n```\n    \nВсе значения от 0 до 255 изменяют яркость светодиода:\n\n```cpp\nWidgetLED led2(V2);\n//установить яркость светодиода на 50%.\nled2.setValue(127); \n```\n\n Вы также можете изменить цвет светодиода с помощью кода:\n\n```cpp\n//#D3435C - Красный в RGB формате\nBlynk.setProperty(V1, \"color\", \"#D3435C\"); \n```\n\n#### Светодиод на рабочем столе\n\nВы можете добавить виджет светодиод на рабочий стол Android. В этом случае светодиод работает через протокол HTTPS. Имейте в виду, что в режиме «Рабочий стол» виджет светодиода имеет некоторые ограничения. Светодиод будет обновлять свое состояние только один раз в 15 минут. Вы можете изменить этот интервал через настройки виджета. Однако интервал обновления менее 15 минут не гарантируется.\n\n**Примечание:** Добавление виджета на рабочий стол стоит 100 энергии. Эта энергия не возвращается при удалении виджета.\n\n**Примечание:** Виджеты рабочего стола для локальных серверов Blynk требуют открыть порт 8080.\n\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LED/LED_Blink/LED_Blink.ino)\n\n### Указатель (Gauge)\n\nОтличный визуальный способ отображения входящих числовых значений.\n\nМожет работать в 2 режимах:\n\n- режим PUSH (выберается в списке выбора частоты считывания);\n- режим частоты считываний;\n\nВ режиме PUSH вы обновляете значения указателя со стороны оборудования с помощью кода:\n \n```cpp\nBlynk.virtualWrite(V1, val); \n```\n\nВ этом режиме каждое сообщение, которое отправляет аппаратное устройство автоматически сохраняется на сервере. Режим PUSH не требует, чтобы приложение было онлайн или открыто.\n\nВ режиме частоты считывния вам необходимо выбрать интервал обновления данных, и приложение будет запускать события считывния с требуемым периодичностью.\nВаше приложение должно быть открыто и запущено для отправки запросов на оборудование. Вам не нужен код для аналоговых и цифровых выводов в даном случае. Однако для виртуальных выводов вам необходимо использовать следующий код:\n\n```cpp\n//вызывать из приложения\nBLYNK_READ(V1)\n{\n  //отправить в приложение\n  Blynk.virtualWrite(V1, val);\n}\n```\n\n#### Параметры форматирования\n\nУказатель также имеет поле «Label» (Метка), которое позволяет использовать форматирование.\nПредположим, ваш датчик отправляет число 12.6789 в приложение Blynk.\nПоддерживаются следующие параметры форматирования:\n\n```/pin/``` - отображает значение без форматирования (12.6789)\n\n```/pin./``` - отображает значение без десятичной части (13)\n\n```/pin.#/``` - отображает значение с одним десятичным знаком (12.7)\n\n```/pin.##/``` - отображает значение с двумя десятичными знаками (12.68)\n\n#### Другие опции\n\nВы также можете изменить метку прибора с помощью:\n\n```cpp\nBlynk.setProperty(V1, \"label\", \"Мое значение метки\");\n```\n\nили изменить цвет (кодировка RGB): \n\n```cpp\n//#D3435C - Красный цвет\nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\n**Пример кода:** [Светодиод](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n### ЖК дисплей (LCD)\n\nЭто обычный ЖК-дисплей 16x2, \"сделанный\" на нашем секретном предприятии в Китае.\nВиджет может работать в двух режимах:\n\n- Простой (Simple)\n- Расширенный (Advanced)\n\n#### Простой режим (Simple)\n\nВ простом режиме ваш ЖК-виджет работает как обычный виджет с частотой чтения.\n\nВ режиме частоты считывания вам нужно выбрать интервал обновления данных, и приложение будет запускать события с требуемым интервалом. Ваше приложение должно быть открыто и запущено для отправки запросов на оборудование. В данном случае вам не нужен код для аналоговых и цифровых пин-ов. Однако для виртуальных пин-ов вам необходимо использовать следующий код:\n\n```cpp\n//вызываем из приложения\nBLYNK_READ(V1)\n{\n  //отправляем в приложение\n  Blynk.virtualWrite(V1, val);\n}\n```\n\nВ простом режиме ЖК-дисплей также поддерживает параметры форматирования.\n\n#### Параметры форматирования\n\nПредположим, ваш датчик отправляет число 12.6789 в приложение Blynk.\nПоддерживаются следующие параметры форматирования:\n\n```/pin/``` -  отображает значение без форматирования (12.6789)\n\n```/pin./``` -  отображает значение без десятичной части (13)\n\n```/pin.#/``` -  отображает значение с одним десятичным знаком (12.7)\n\n```/pin.##/``` - отображает значение с двумя десятичными знаками (12.68)\n\n**Пример кода:** [ЖК дисплей простой режим - PUSH](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_SimpleModePushing/LCD_SimpleModePushing.ino)\n\n**Пример кода:** [ЖК дисплей простой режим - 1 сек](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_SimpleModeReading/LCD_SimpleModeReading.ino)\n\n#### Расширенный режим (Advanced)\n\nРасширенный режим предназначен для опытных пользователей. Позволяет использовать специальные команды для управления ЖК-дисплеем.\n\n#### Команды\n\nИнициируем переменную ЖК-дисплея: \n\n```cpp\nWidgetLCD lcd(V1);\n```\n\nОтправим сообщение: \n\n```cpp\nlcd.print(x, y, \"Ваше сообщение\");\n```\n\nГде ```x``` - позиция символа (0-15), ``` y``` - номер строки (0 или 1),\n\nОчистка ЖК-дисплея:\n\n```cpp\nlcd.clear();\n```\n\n**Пример кода:** [ЖК-дисплей расширенный режим](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_AdvancedMode/LCD_AdvancedMode.ino)\n\n### Диаграмма (SuperChart)\n\nДиаграмма используется для живой визуализации и хранения данных. Вы можете использовать виджет для логирования данных датчиков,  бинарных событий и многого другого.\n\nЧтобы использовать виджет Диаграмма, вам нужно будет передать данные с оборудования с желаемым интервалом, используя таймеры.\n[Здесь приведен](https://examples.blynk.cc/?board=ESP8266&shield=ESP8266%20WiFi&example=GettingStarted%2FPushData) базовый пример передачи данных.\n\n#### Взаимодействие:\n- **Переключение между режимами текущий и временной** Нажмите диапазоны времени в нижней части виджета, чтобы изменить масштаб Диаграммы по времени.\n\n- **Тап по легенде графиков**  показать или скрыть поток данных.\n\n- **Долги тап на графике** покажет метку времени и соответствующие значения.\n\n- **Быстро проведите пальцем влево или вправо, чтобы увидеть предыдущие данные** впоследствии вы можете прокручивать данные назад и вперед в пределах заданного временного диапазона.\n\n- **Полноэкранный режим** нажмите эту кнопку, чтобы открыть полноэкранный режим в альбомной ориентации.\n\nЧтобы выйти из режима полного экрана, просто поверните телефон обратно в портретный режим. График должен вращаться автоматически. В полноэкранном режиме вы увидите X (время) и несколько шкал Y.\nПолноэкранный режим можно отключить в настройках виджета.\n\n- **Кнопка меню**\n Кнопка меню откроет дополнительные функции:\n  - Экспорт в CSV\n  - Стереть данные на сервере\n\n#### Настройки диаграммы:\n\n- **Заголовок диаграммы (Chart Title)** общее наименование диаграммы.\n\n- **Размер шрифта заголовка (Title Font Size)** выберите из 3 размеров шрифта.\n\n- **Выравнивание заголовка (Title Alignment)** выберите выравнивание заголовка диаграммы. Этот параметр влияет на положение заголовка и легенды в виджете.\n\n- **Показать ось X (время) (Show x-axis (time))** выберите настройку, если хотите показать шкалу времени внизу графика.\n\n- **Автоматическое масштабирование для всех потоков данных (Override Auto Scaling for All Datastreams)** отключение этой опции позволит выполнить ручную настройку для оси Y (см. ниже).\n\n- **Выбор масштаба времени (Time ranges picker)** Позволяет выбрать необходимые периоды (`15m`,` 30m`, `1h`,` 3h`, ...) и разрешение для вашего графика. Разрешение определяет, насколько подробные ваши данные. Прямо сейчас график поддерживает два типа разрешения: `standard` и `high`. Разрешение также зависит от выбранного периода. Например, `standard` разрешение для `1d` означает, что вы будете получать 24 значения в день (одно в час), а при `high` разрешении вы будете получать за` 1d` 1440 значений в день (одно в минуту).\n\n- **Потоки данных (Datastreams)** добавить потоки данных (см. ниже, как настроить потоки данных).\n\n#### Настройки потоков данных\n\nВиджет поддерживает до 4 потоков данных.\nНажмите значок настроек потоков данных, чтобы открыть настройки.\n\n**Дизайн (Design)** выберите доступные типы диаграмм:\n - Линейная (Line)\n - С областями (Area)\n - Гистограмма (Bar)\n - Бинарная (Binary) (приведение данных к двоичному виду)\n\n**Цвет (Color)** выберите сплошные цвета или градиенты.\n\n**Источник и ввод (Source and input)** - Вы можете использовать три типа источника данных:\n\n**1. Виртуальный пин (Virtual Pin)** - выберите желаемое устройство и виртуальный пин для получения данных.\n\n**2. Теги (Tags)** - диаграмма может агрегировать данные с нескольких устройств, используя встроенные функции агрегирования.\nНапример, если у вас есть 10 датчиков температуры, посылающих температуру с заданным интервалом, Вы можете отобразить среднее значение от 10 датчиков в виджете.\n\nИспользование тегов:\n\n- **[Добавить Тэг](http://docs.blynk.cc/#blynk-main-operations-control-of-multiple-devices-tags)** на каждое устройство, с которого вы хотите агрегировать данные. Это можно сделать в настройках проекта Blynk.\n- **Отправить данные в виртуальный пин (Push data to the same Virtual Pin)** на каждое устройство. (т.е. ```Blynk.virtualWrite (V0, temperature);```)\n- **Выберите тег в качестве источника (Choose Tag as a source)** в виджете Диаграмма и используйте пин, куда поступают данные (т.е. V0)\n\n**Добступные функции:** \n- `SUM` будет суммировать все входящие значения в указанный виртуальный пин со всех устройств, помеченные выбранным тегом\n- `AVG` будет вычислять среднее значение\n- `MED` найдет среднее значение\n- `MIN` будет вычислять минимальное значение\n- `MAX` будет вычислять максимальное значение\n\n**ВАЖНО: Теги не работают в режиме реального времени.**\n\n**3. [Выбор устройства (Device Selector)](https://github.com/blynkkk/blynkkk.github.io/tree/master/mobile/ru/ \tdevice_selector.md)**\nЕсли вы добавите виджет Выбор устройства в свой проект, вы можете использовать его в качестве источника данных для Диаграммы.\nВ том случае, когда вы меняете устройство, диаграмма будет автоматически обновляться.\n\n#### Настройки оси Y (Y-Axis Settings)\nCуществует 4 режима масштабирования данных вдоль оси Y, активируется после отключения общей настройки виджета \"Автоматическое масштабирование для всех потоков данных (Override Auto Scaling for All Datastreams)\".\n\n**1. Авто (Auto)**\nДанные будут автоматически масштабироваться на основе минимальных и максимальных значений заданного периода времени. Это лучший вариант для начинающих.\n\n**2. Минимальный/Максимальный (Min/Max)**\nКогда выбран этот режим, шкала Y будет установлена на выбранные вами границы значений.\nНапример, если ваше оборудование отправляет данные со значениями от -100 до 100, вы можете установить эти границы и данные графика будут отображены полностью.\n\nВы также можете визуализировать данные в другом диапазоне. Допустим, входящие данные имеют значения в диапазоне 0-55, но вы хотели бы видеть только значения в диапазоне 30-50. Вы можете настроить  диапазон, но если значения не соответствуют заданному масштабу оси Y, диаграмма будет обрезана.\n\n**3. Процент от высоты (% of Height)**\nЭта опция позволяет автоматически масштабировать входящие данные на виджете и размещать их так, как вы хотите. \nВ этом режиме вы устанавливаете процент высоты виджета на экране от 0% до 100%.\n\nЕсли вы установите диапазон 0-100%, это будет полная автоматическая шкала. Независимо от того, в каком диапазоне поступают данные, он всегда будет масштабирован по всей высоте виджета.\n\nЕсли вы установите его на 0-25%, то график будет отображаться только на 1/4 высоты виджета.\n\nЭтот параметр очень полезен для **Бинарной диаграммы** или для визуализации нескольких потоков данных на одной и той же диаграмме разными способами.\n\n**4. Дельта (Delta)**\nПока данные остаются в пределах заданного значения дельты, график будет автоматически масштабироваться в этом диапазоне.\nЕсли дельта превышает диапазон, график автоматически масштабируется до минимальных/максимальных значений указанного периода.\n\n**Суффикс (Suffix)**\nЗдесь вы можете указать суффикс, который будет отображаться со значениями во время длительного тап на графике.\n\n**Разрядность (Decimals)**\nОпределяет формат числовых значений, когда вы нажимаете и удерживаете палец на графике. Возможные варианты: #, #.#, #.##, и т.д.\n\n**Соединиить отсуствующие точки графика (Connect Missing Data Points)**\nЕсли этот переключатель включен, то Диаграмма соединит все точки, даже если данные частично отсуствуют.\nЕсли для него установлено значение «ВЫКЛ», то вы увидите пропуски в случае отсутствия данных.\n\n**Настройки Бинарной диаграммы (Binary Chart Settings)**\nЭтот тип диаграммы полезен для построения двоичных данных, например, когда устройство было включено или выключено, или когда было обнаружено движение или когда был достигнут определенный порог значений.\n\nВам необходимо указать точку **Перехода (FLIP)**, которая будет точкой, в которой входящие данные будут принимать состояние `ИСТИНА (TRUE)` или `ЛОЖЬ (FALSE)`.\n\nНапример, вы отправляете данные в диапазоне от 0 до 1023. Если вы установите `512` в качестве точки **Перехода (FLIP)**, то все, что выше `512` (исключая 512), будет записано как `ИСТИНА (TRUE)`, любое значение ниже `512` (включая 512) будет `ЛОЖЬ (FALSE)`.\n\nДругой пример: если вы отправляете `0 и 1` и устанавливаете `0` в качестве точки **Перехода FLIP**, то `1` будет `ИСТИНА`, а `0` будет `ЛОЖЬ`.\n\n**Маркеры состояния (State Labels):**\nЗдесь вы можете указать, как `ИСТИНА/ЛОЖЬ` должны отображаться на графике когда вы нажимаете и удерживаете палец.\nНапример, вы можете установить значение `ИСТИНА` как `Оборудование ВКЛ`, `ЛОЖЬ` как `Оборудование ВЫКЛ`.\n\n\n### Видео трансляция (Video Streaming)\n\nПростой виджет, который позволяет отображать прямой эфир и потокове видео. Виджет поддерживает протоколы RTSP (RP, SDP), HTTP/S прогрессивной потоковой передачи, HTTP/S прямого эфира. Для получения дополнительной информации, пожалуйста ознакомтесь с [официальной документацией Android](https://developer.android.com/guide/appendix/media-formats.html).\n\nНа данный момент команда Blynk не предоставляет потоковые серверы. Таким образом, вы можете осуществлять потоковую передачу непосредственно с ваше камеры или использовать сторонние сервисы, а также запустить собственны потоковый сервер (например, на оборудовании Raspberry).\n\nВы можете остановить/запустить видео поток, нажав на сам виджет.\n\nВы можете изменить URL-адрес видео потока с аппаратного устройства при помощи кода:\n\n```cpp\nBlynk.setProperty(V1, \"url\", \"http://my_new_video_url\");\n```\n\n### Индикатор уровня (Level Display)\n\nОтображает входящие данные с ваших датчиков или виртуальных пин-ов. Отображение уровня очень похоже на индикатор выполнения процесса, это очень красивый и причудливый вид для индикации «выполненных» событий, например «уровня заряда батареи».\nВы можете обновить отображение значения с аппаратной стороны с помощью кода:\n \n```cpp\nBlynk.virtualWrite(V1, val); \n```\n\nКаждое сообщение, которое аппаратное устройство отправляет на сервер, автоматически сохраняется на сервере.\nРежим PUSH не требует, чтобы приложение было онлайн или запущено.\n\n**Пример кода:** [Пример PUSH](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushData/PushData.ino)\n\n## Interface\n\n### Вкладки (Tabs)\n\nЕдинственная цель виджета Вкладки - расширить пространство вашего проекта.\nЧтобы редактировать виджет Вкладок - просто нажмите на выбранную вкладку.\nВы можете перетаскивать виджеты между вкладками. \nИз списка можно удалить только последнюю вкладку: чтобы удалить ее, проведите пальцем влево по ее названию в экране настроек виджета.\n \nМаксимальное количество вкладок на iOS составляет 4. \n\nМаксимальное количество вкладок на Android - 10. \n \nОставайтесь с нами для предстоящего редизайна виджета вкладок!\n\n### Меню (Menu)\n\nВиджет Меню позволяет отправлять команды на ваше оборудование на основе выборного списка, сделанного вами в пользовательском интерфейсе. Меню отправляет индекс выбранного элемента спика, а не саму строку. Отправляемый индекс начинается с 1. Он работает так же, как типовой элемент \"Комбинированный список\" ([ComboBox](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA)).\n\nПример кода:\n\n```cpp\nBLYNK_WRITE {\n  switch (param.asInt()) {\n    case 1: { // Пункт 1\n      Serial.println(\"Выбран Пункт 1\");\n      break;\n    }\n    case 2: { // Пункт 2\n      Serial.println(\"Выбран Пункт 2\");\n      break;\n    }    \n  }\n}\n```\n\nВы также можете назначить пункты меню со стороны оборудования с помощью кода:\n \n```cpp\nBlynk.setProperty(V1, \"labels\", \"label 1\", \"label 2\", \"label 3\");\n```\n\n**Пример кода:** [Меню](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Menu/Menu.ino)\n\n### Ввод времени (Time Input)\n\nВиджет Ввода времени позволяет вам выбрать время начала/окончания, день недели, часовой пояс, значения в формате до полудня/после полудня и отправить их на ваше оборудование. В настоящее время поддерживаются следующие форматы: ```ЧЧ:ММ``` и ```ЧЧ:ММ AM/PM```.\n\nАппаратное устройстов будет отсчитывать время пользовательского интерфейса в виде секунд дня (```3600 * часов + 60 * минут```) для запуска/остановки времения. Время, которое виджет отправляет оборудованию, является локальным временем пользователя.\nИндексы по выбранных дней:\n\n```\nПонедельник - 1\nВторник - 2\n...\nСуббота - 6\nВоскресенье - 7\n```\nВы также можете изменить состояние виджета в интерфейсе пользователя. Смотрите ниже примеры кода.\n\n**Пример кода:** [Простой Ввод времени для времени начала](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/SimpleTimeInput/SimpleTimeInput.ino)\n\n**Пример кода:** [Расширенный Ввод времени](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/AdvancedTimeInput/AdvancedTimeInput.ino)\n\n**Пример кода:** [Обновление Ввода времени в пользовательском интерфейсе](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/UpdateTimeInputState/UpdateTimeInputState.ino)\n\n### Карта (Map)\n\nВиджет Карты позволяет устанавливать точки/флажки на карте со стороны оборудования. Это очень полезный виджет, если у вас есть несколько устройств, и вы хотите отслеживать их позиции на карте.\n\nВы можете отправить точку на карту с помощью обычной команды виртуальной записи:\n\n```cpp\nBlynk.virtualWrite(V1, pointIndex, lat, lon, \"Название\");\n```\n\nМы также создали оболочку, чтобы вы могли упростить использование виджета Карты.\nВы можете изменить метки флажков на оборудовании с помощью кода:\n\n```cpp\nWidgetMap myMap(V1);\n...\nint index = 1;\nfloat lat = 51.5074;\nfloat lon = 0.1278;\nmyMap.location(index, lat, lon, \"Название\");\n```\n\nИспользование уникальных ```index``` позволяет вам переопределить существующее значение точки.\n\n**Пример кода:** [Базовый пример Карты](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Map/Map.ino)\n\n### Таблица (Table)\n\nТабличный виджет удобен, когда вам нужно структурировать аналогичные данные в пределах одного графического элемента. Работает как обычная таблица.\n\nВы можете добавить строку в таблицу с помощью кода:\n\n```\nBlynk.virtualWrite(V1, \"add\", id, \"Имя\", \"Значение\");\n```\n\nВы можете обновить строку в таблице с помощью кода:\n\n```\nBlynk.virtualWrite(V1, \"update\", id, \"Новое имя\", \"Новое значение\");\n```\n\nЧтобы выделить любой элемент в таблице, используйте его идентификатор:\n\n```\nBlynk.virtualWrite(V1, \"pick\", 0);\n```\n\nЧтобы выбрать/отменить выбор (сделать значок зеленым/серым) элемент в таблице, используйте его идентификатор:\n\n```\nBlynk.virtualWrite(V1, \"select\", 0);\nBlynk.virtualWrite(V1, \"deselect\", 0);\n```\n\n Чтобы очистить таблицу используйте код:\n\n```\nBlynk.virtualWrite(V1, \"clr\");\n```\n\nВы также можете обрабатывать другие действия из таблицы. Например, использовать строку таблицы в качестве кнопки переключения.\n\n```\nBLYNK_WRITE(V1) {\n   String cmd = param[0].asStr();\n   if (cmd == \"select\") {\n       // строка в таблице была выбрана.\n       int rowId = param[1].asInt();\n   }\n   if (cmd == \"deselect\") {\n       // строка в таблице была отменена.\n       int rowId = param[1].asInt();\n   }\n   if (cmd == \"order\") {\n       // когда строки в таблице переупорядочиваются\n       int oldRowIndex = param[1].asInt();\n       int newRowIndex = param[2].asInt();\n   }\n}\n```\n\n**Примечание:** Максимальное количество строк в таблице равно 100. Когда вы достигнете предела, таблица будет работать как список FIFO (Первый пришел - первый ушел).\nЭто ограничение можно изменить, настроив свойство ```table.rows.pool.size``` в параметрах локального сервера.\n\n**Пример кода:** [Простое использование таблицы](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Table/Table_Simple/Table_Simple.ino)\n\n**Пример кода:** [Расширенное использование таблицы](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Table/Table_Advanced/Table_Advanced.ino)\n\n### Селектор устройств (Device Selector)\n\nСелектор устройств - это мощный виджет, который позволяет обновлять виджеты на основе одного активного устройства. \nЭтот виджет особенно полезен, когда у вас есть несколько устройств с аналогичной функциональностью.\n\nПредставьте, что у вас есть 4 устройства, и к каждому устройству подключен датчик температуры и влажности. Для отображения данных по всем 4 устройствам вам необходимо добавить 8 виджетов.\n\nС помощью Селектора устройств вы можете использовать только 2 виджета, которые будут отображать температуру и влажность в зависимости от активного устройства, выбранного в Селекторе.  \n\nВсе, что вам нужно сделать, это:\n\n1. Добавить виджет Селектора устройств в проект\n2. Добавить 2 виджета (например виджет отображения значений (Value Display Widget)), чтобы отобразить температуру и влажность\n3. В настройках виджетов вы сможете назначить их на Селектор устройств (в разделе источника или цели)\n4. Выйти из настроек, запустить проект \n\nТеперь вы можете изменить активное устройство в Селекторе устройств и увидите, что значения температуры и влажности отражают обновленные данные для только что выбранного вами устройства.\n\n**ПРИМЕЧАНИЕ:** Виджет вебхук ([Webhook](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/WebHook/WebHook_GET/WebHook_GET.ino)) пока не работает с Селектором устройств.\n\n### Плитка устройств (Device Tiles)\n\nПлитка устройств - это мощный виджет, очень похожий на виджет Селектора устройств (Device Selector), но с пользовательским интерфейсом. Позволяет отображать один пин с устройства на одну плитку.\nЭтот виджет особенно полезен, когда у вас есть несколько устройств с аналогичной функциональностью. Теперь вы можете группировать похожие устройства на одном макете (шаблоне).\n\n## Sensors\n\n### Акселерометр (Accelerometer)\n\nАкселерометр один из [сенсоров движения](https://developer.android.com/guide/topics/sensors/sensors_motion.html), \nкоторый позволяет определить движение Вашего телефона в пространстве.\nОн может пригодится для отслеживания таких событий как тряска, удар, поворот или наклон телефона. Концептуально, акселерометр определяет силу ускорения приложенную к вашему телефону. \nЕдиница измерения - м/c^2 приложенная к каждой из осей ```x```, ```y```, ```z```.\n\nЧтобы получить данные с сенсора нужно использовать следующий код :\n\n```cpp\nBLYNK_WRITE(V1) {\n  //сила ускорения, приложенная к оси x\n  int x = param[0].asFloat(); \n  //сила ускорения, приложенная к оси y\n  int y = param[1].asFloat();\n  //сила ускорения, приложенная к оси z\n  int z = param[2].asFloat();\n}\n```\n\nАкселерометр не работает при свернутом приложении.\n\n### Барометр/Давление (Barometer/pressure)\n\nБарометр один из сенсоров [окружающей среды](https://developer.android.com/guide/topics/sensors/sensors_environment.html) \nи позволяет измерять атмосферное давление.\n\nИзмеряется в ```hPa``` (гПа) или ```mbar``` (мБар).\n\nЧтобы получить данные с сенсора нужно использовать следующий код :\n\n```cpp\nBLYNK_WRITE(V1) {\n  //Давление в мБар\n  int pressure = param[0].asInt(); \n}\n```\n\nБарометр не работает при свернутом приложении.\n\n### Гравитация (Gravity)\n\nГравитация - это своего рода [датчики движения](https://developer.android.com/guide/topics/sensors/sensors_motion.html), который позволяет обнаруживать движение вашего смартфона.\nПолезно для мониторинга движения устройства, таких как наклон, встряхивание, вращение или качание.\n\nДатчик силы притяжения выдает трехмерный вектор, указывающий направление и величину силы притяжения. \nИзмеряется в ```m/s^2``` силы притяжения, приложенной к оси ```x```, ```y```, ```z```.\nДля того, чтобы принять данные от него, вам необходимо:\n\n```cpp\nBLYNK_WRITE(V1) {\n  //сила притяжения, приложенная к оси x\n  int x = param[0].asFloat(); \n  //сила притяжения, приложенная к оси y\n  int y = param[1].asFloat();\n  //сила притяжения, приложенная к оси y\n  int z = param[2].asFloat();\n}\n```\n\n**ВНИМАНИЕ:** Виджет гравитации не работает в фоновом режиме.\n\n### Влажность (Humidity)\n\nВлажность является своего рода [датчиком среды](https://developer.android.com/guide/topics/sensors/sensors_environment.html),\nкоторый позволяет измерять относительную влажность окружающей среды.\n\nИзмеряется в ```%``` - фактически это относительная влажность в процентах.\n\nДля того, чтобы принять данные от датчика, вам необходимо:\n\n```cpp\nBLYNK_WRITE(V1) {\n  //Влажность в %\n  int humidity = param.asInt();\n}\n```\n\n**ВНИМАНИЕ:** Влажность не работает в фоновом режиме.\n\n### Свет (Light)\n\nСвет - это своего рода [датчики окружающей среды](https://developer.android.com/guide/topics/sensors/sensors_environment.html), который позволяет измерять уровень освещенности (уровень внешней освещенности измеряется в люксах). В телефонах чаще всего используется для управления яркостью экрана.\n\nДля того, чтобы принять данные этого виджета, вам необходимо:\n\n```cpp\nBLYNK_WRITE(V1) {\n  //уровень освещенности\n  int lx = param.asInt(); \n}\n```\n\nВиджет Свет не работает в фоновом режиме.\n\n### Близость (Proximity)\n\nБлизость - это своего рода [датчики положения](https://developer.android.com/guide/topics/sensors/sensors_position.html)\nэто позволяет определить, насколько близко смартфон к лицу. Измеряется в ```cm``` (см) - расстояние от телефона до лица. Однако большинство этих датчиков возвращает только информацию FAR / NEAR.\nПоэтому, возвращаемое значение будет ```0 / 1```. Где 0 / LOW = ```FAR``` (далеко), а 1 / HIGH = ``` NEAR``` (рядом).\n \nДля того, чтобы принять данные из виджета, вам необходимо:\n\n```cpp\nBLYNK_WRITE(V1) {\n  //  расстояние до объекта\n  int proximity = param.asInt();\n  if (proximity) {\n     // РЯДОМ\n  } else {\n     // ДАЛЕКО\n  }\n}\n```\n\nВиджет близость не работает в фоновом режиме.\n\n### Температура (Temperature)\n\nТемпература является своего рода [датчиком окружающей среды](https://developer.android.com/guide/topics/sensors/sensors_environment.html) который позволяет измерять температуру окружающего воздуха. Измеряется в ```°C``` - градусах Цельсия.\n\nДля приема данных из виджета, необходимо использовать код:\n\n```cpp\nBLYNK_WRITE(V1) {\n  // температура в градусах цельсия\n  int celcius = param.asInt();\n}\n```\n\nВиджет Температуры не работает в фоновом режиме.\n\n### Триггер GPS (GPS Trigger)\n\nВиджет Триггер GPS позволяет легко инициировать события, когда вы входите или выходите из географической зоны. Этот виджет будет работать в фоновом режиме и периодически будет проверять ваши координаты. Если ваше местоположение находится в пределах или вне указанной зоны (географическая зона выбирается на карте виджета), виджет отправит команду ```HIGH```/``` LOW``` на аппаратное устройство. Например, Триггер GPS назначен для пина ```V1```, и включена опция ```Trigger When Enter```. В этом случае, когда вы окажитесь в указанной географической зоне виджет вызовет событие ```HIGH```.\n\n```cpp\nBLYNK_WRITE(V1) {\n  int state = param.asInt();\n  if (state) {\n      //Вы вошли в зону\n  } else {\n      //Вы вышли из зоны\n  }\n}\n```\n\nПодробнее о том, как работает GPS-виджет, вы можете прочитать [здесь](https://developer.android.com/guide/topics/location/strategies.html).\n\n**ВНИМАНИЕ:** Виджет Триггер GPS работает в фоновом режиме.\n\n### Поток GPS (GPS Streaming)\n\nПолезно для мониторинга местонахождения смартфона получать данные о широте, долготе, высоте и скорости (скорость часто может быть 0, если смартфон не поддерживает ее измерение).\n\nЧтобы принимать данные из этого виджета, вам необходимо:\n\n```cpp\nBLYNK_WRITE(V1) {\n  float latitude = param[0].asFloat(); \n  float longitude = param[1].asFloat();\n  float altitude = param[2].asFloat();\n  float speed = param[3].asFloat();\n}\n```\n\nили вы можете использовать подготовленную оболочку ```GpsParam``` :\n\n```cpp\nBLYNK_WRITE(V1) {\n  GpsParam gps(param);\n  //Печать лат/лон с 6 десятичными знаками\n  Serial.println(gps.getLat(), 7);\n  Serial.println(gps.getLon(), 7);\n  \n  Serial.println(gps.getAltitude(), 2);\n  Serial.println(gps.getSpeed(), 2);\n}\n```\n\nПоток GPS работает в фоновом режиме.\n\n**Пример кода:** [Поток GPS](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/GPS_Stream/GPS_Stream.ino)\n\n## Other\n\n### Мост (Bridge)\n\nМост может быть использован для связи между устройствами (без участия приложения). Вы можете отправлять цифровые / аналоговые / виртуальные команды записи с одного устройства на другое, зная только токен авторизации. На данный момент виджет Мост не обязательно использовать в приложении (здесь он используется для указания того, что у нас есть такая функция). \n**Вы можете использовать несколько мостов для управления несколькими устройствами.**\n\nВиджет Мост использует виртуальный пин и превращает его в канал для управления другим устройством. Это означает, что вы можете контролировать любые виртуальные, цифровые или аналоговые пины целевого устройства. Будьте осторожны, не используйте пины типа ```A0, A1, A2 ...``` при обмене данными между различными типами устройств, так как в таких случаях Arduino Core может ссылаться на неверные пины.\n\nПример кода для устройства A, которое будет отправлять значения на устройство B:\n```cpp\n//Инициирует виджет Моста на V1 устройства A\nWidgetBridge bridge1(V1);\n...\nvoid setup() {\n    Blynk.begin(...);\n    while (Blynk.connect() == false) {\n        // Ждем пока Blynk подключится\n    }\n    bridge1.digitalWrite(9, HIGH); // выставим триггер HIGH на D9 устройства B. Код на устройстве B не требуется\n    bridge1.analogWrite(10, 123);\n    bridge1.virtualWrite(V1, \"hello\"); // вам нужно написать код на устройстве B, чтобы получить это значение. См. ниже\n    bridge1.virtualWrite(V2, \"value1\", \"value2\", \"value3\");\n}\n\nBLYNK_CONNECTED() {\n  bridge1.setAuthToken(\"OtherAuthToken\"); // токен с устройства B\n}\n```\n\n**ВАЖНО:** при выполнении ```virtualWrite()``` с виджета Мост, устройство B должно обрабатывать входящие данные с устройства A. \nНапример, если вы отправляете значение с устройства A на устройство B, используя ```bridge.virtualWrite (V5)```, вам необходимо использовать свой обработчик на устройстве B:\n\n```cpp\nBLYNK_WRITE(V5){\n    int pinData = param.asInt(); //pinData variable will store value that came via Bridge\n}\n```\n\nИмейте в виду, что ```bridge.virtualWrite``` не отправляет никаких значений в мобильное приложение. Для этого вам нужно вызвать ```Blynk.virtualWrite```. \n\n**Пример кода:** [Мост](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Bridge/Bridge.ino)\n\n### Обработчик событий (Eventor)\n\nВиджет Обработчик событий позволяет создавать простые правила поведения или **события**. \nДавайте рассмотрим типичный вариант использования: считывание температуры с датчика DHT и отправка push-уведомления, когда температура превышает определенный предел:\n\n```cpp\n  float t = dht.readTemperature();\n  if (isnan(t)) {\n    return;\n  }\n  if (t > 40) {\n    Blynk.notify(String(\"Температура слишком высокая: \") + t);\n  }\n```\n\nС Обработчиком событий вам не нужно писать этот код. Все, что вам нужно, это отправить значение с датчика на сервер Blynk:\n\n```cpp\n  float t = dht.readTemperature();\n  Blynk.virtualWrite(V0, t);\n```\n\nНе забывайте, что команды ```virtualWrite``` должны быть заключены в таймер и не должны использоваться в основном цикле ```loop```.\n\n**ПРИМЕЧАНИЕ:** Не забудьте добавить виджет уведомлений в приложении.\n\nОбработчик событий пригодится вам, когда нужно изменить условия на лету без повторной загрузки нового скетча на аппаратное обеспечение. Вы можете создать столько **событий**, сколько вам нужно. Обработчик событий также может быть запущен со стороны приложения. Вам просто нужно назначить виджет на тот же контакт, что и ваше событие в Обработчике событий. \nОбработчик событий не постоянно отправляет события. Давайте рассмотрим простой пример, как показано выше ```if (temperature > 40) send notification```. Когда температура превышает 40 пороговых значений - отправляется уведомление. Если температура продолжает оставаться выше 40 никакие повторные действия не будут инициированы. Но если ```temperature``` опускается ниже порогового значения, а затем проходит его снова уведомление будет отправлено повторно (для уведомлений Обработчика событий нет ограничения отправки в течение 5 секунд).\n\n\nОбработчик событий также поддерживает события таймера (Timer). Например, вы можете установить пин ```V1``` ON/HIGH в 21:00:00 каждую пятницу.\nВ Обработчике событий вы можете назначить несколько таймеров на один и тот же пин, отправить любую строку/число, выбрать день и часовой пояс.\n \nЧтобы удалить созданное **событие**, пожалуйста, используйте сдвиг пальцем по экрану. Вы также можете перенести последний элемент самого события.\n\n**Пример кода:** [Обработчик событий](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Eventor/Eventor.ino)\n\n**ПРИМЕЧАНИЕ:** Виджет таймера зависит от времени сервера, а не вашего телефона. Иногда время телефона может не соответствовать времени сервера.\n\n**ПРИМЕЧАНИЕ:** события запускаются только один раз при выполнении условия. Это означитает что [цепочка событий] (https://community.blynk.cc/t/eventor-behavior-bug-feature/20962) невозможна (однако она может быть включена в коммерческой версии).\n\n### Часы реального времени (RTC)\n\nЧасы реального времени позволяют получать время с сервера. Вы можете предварительно выбрать любой часовой пояс в пользовательском интерфейсе, чтобы получить время на оборудование из нужной локали.\n\n**Пример кода:** [Часы реального времени](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/RTC/RTC.ino)\n\n### Bluetooth с низким энергопотреблением\n\nЭтот виджет позволяет включить блутзуз с низким энергопотреблением на вашем телефоне. На текущий момент виджет также \nтребует наличия интернет соединения (постараемся пофиксить в ближайшем будущем). Некоторые типы виджетов нельзя \nиспользовать вместе с блутузом, например исторический граф, так как он требует чтобы данные отправлялись на сервер, чего \nблутуз виджет не делает.\n \n**Список поддерживаемых чипов и контроллеров:** [BLE](https://github.com/blynkkk/blynk-library/tree/master/examples/Boards_Bluetooth)\n\n### Блютуз (Bluetooth)\n\nЭтот виджет позволяет включить блютуз на вашем телефоне. На текущий момент виджет также требует наличия интернет соединения (постараемся пофиксить в ближайшем будущем) и поддерживается только на Android. \nНекоторые типы виджетов нельзя использовать вместе с блютузом, например исторический граф, так как он требует чтобы \nданные отправлялись на сервер, чего блютуз виджет не делает.\n \n**Список поддерживаемых чипов и контроллеров:** [BLE](https://github.com/blynkkk/blynk-library/tree/master/examples/Boards_Bluetooth)\n\n### Музыкальный проигрыватель (Music Player)\n\nПростой элемент интерфейса с 3 кнопками - имитирует интерфейс музыкального проигрывателя. Каждая кнопка отправляет свою команду на аппаратное устройство: ```play``` (воспроизвести), ```stop``` (стоп), ```prev``` (предыдущий), ```next``` (следующий).\n\nВы можете изменить состояние виджета в приложении с аппаратной стороны с помощью следующих команд:\n\n```\nBlynk.virtualWrite(Vx, \"play\");\nBlynk.virtualWrite(Vx, \"stop\");\n```\n\nВы также можете изменить состояние воспроизведение/остановка виджета с помощью следующего кода (эквивалент вышеупомянутых команд):\n\n```Blynk.setProperty(V1, \"isOnPlay\", \"false\");```\n\n**Пример кода:** [Музыкальный проигрыватель](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Player/Player.ino)\n \n### Вебхук (Webhook)\n\nВебхук очень мощный виджет, который позволяет Вам легко интегрироватся с любыми сторонними сервисами. С его помощью \nВы можете слать любые HTTP/S запросы на любой сервер или устройство, которое имеет HTTP/S API (например, лампы Philips Hue).\n\nВебхук вешается на вирутальный пин и любая команда, которая приходит на этот пин будет вызывать срабатывание HTTP/S \nзапроса. Команды на такой виртуальный пин могут приходить как со стороны железа, так и со стороны приложения. То есть, \nВы можете слать любой HTTP запрос при нажатии кнопки в приложении, если эта кнопка на том же пине что и вебхук.\n\nВот простой пример, представьте, что Вы хотите слать данные с микроконтроллера не только в Blynk, но и в какой-то другой сервис, \nнапример - Google Docs или в thingspeak.com. Раньше Вам для этого пришлось бы писать что-то вроде :\n\n```cpp\nWiFiClient client;\nif (client.connect(\"api.thingspeak.com\", 80)) {\n    client.print(\"POST /update HTTP/1.1\\n\");\n    client.print(\"Host: api.thingspeak.com\\n\");\n    client.print(\"Connection: close\\n\");\n    client.print(\"X-THINGSPEAKAPIKEY: \" + apiKeyThingspeak1 + \"\\n\");\n    client.print(\"Content-Type: application/x-www-form-urlencoded\\n\");\n    client.print(\"Content-Length: \");\n    client.print(postStr.length());\n    client.print(\"\\n\\n\");\n    client.print(postStr);\n}\n```\n \nС вебхуком этого больше делать не нужно. Достаточно лишь заполнить поля виджета в приложении и выполнить привычное:\n\n```cpp\nBlynk.virtualWrite(V0, value);\n```\n\nГде V0 - пин вебхук виджета.\n\nВ дополнение, Вы можете подставлять значение пина в URL:\n\n```cpp\nhttps://api.thingspeak.com/update?api_key=xxxxxx&field1=/pin/\n```\n\nили тело запроса :\n\n```cpp\n[\"/pin/\"]\n```\n\nТак же можно отправлять несколько значений внутри одного пина (до 5) :\n\n```/pin[0]/```,```/pin[1]/```, ```/pin[2]/```\n\nЕще одна крутая штука - это возможность делать HTTP GET запросы на сервере и слать их результат на микроконтроллер. \nПрелесть тут в том, что Вам не нужно для этого писать сложный код на микроконтроллере. Представьте, что Вам нужно  \nполучить информацию о погоде от какого-то метио сервиса. Например, по такому запросу :\n\n```http://api.sunrise-sunset.org/json?lat=33.3823&lng=35.1856&date=2016-10-01```\n \nВы можете вставить этот запрос в вебхук виджет, выбрать пин ```V0``` и написать :\n \n```cpp\nBLYNK_WRITE(V0){\n  String webhookdata = param.asStr();\n  Serial.println(webhookdata);\n}\n```\n\nТеперь, каждый раз когда вы дергаете ```V0``` с помощью ```Blynk.virtualWrite(V0, 1)``` будет вызвана функция ```BLYNK_WRITE(V0)```.\n\n**Замечание:** обычно HTTP запросы довольно большие, поэтому Вам, вероятно, нужно будет увеличить лимит на максимальную \n длину сообщения на микроконтроллере ```#define BLYNK_MAX_READBYTES 1024```. \n\n**Замечание:** наше облако так же имеет определенные лимиты для вебхука. Мы разрешаем слать только 1 запрос в секунду. \nЭто поведение можно изменить на локальном сервер через свойство ```webhooks.frequency.user.quota.limit```. Пожалуйста, \nиспользуйте вебхуки с умом. Многие веб ресурсы не способны обрабатывать даже 1 запрос в секунду. \n \n**Замечание :** в случае если Ваш вебхук не выполнился 10 раз подряд - вебхук виджет будет остановлен. Чтобы восстановить \nего работу - нужно открыть и закрыть виджет в режиме редактирования. Не выполненными считаются запросы у которых код ответа \nне равен 200 или 302.\n\n### Отчеты (Reports)\n\nФункция виджета Отчеты заключается в настройке и разметке отчетов данных в формате CSV. Вы можете выбрать разовые или переодически запланированные отчеты.\n\nКроме того, в отчетах вы можете очистить все пользовательсике данные, собранные с ваших устройств.\n\nВам необходимо настроить начальные параметры в режиме редактирования, а затем уже в режиме воспроизведения вы сможете настроить сами отчеты.\n\n#### Режим редактирования. Конфигурация ввода данных\n\nВ режиме редактирования (когда ваш проект остановлен) вы определяете потоки данных, которые вы хотели бы позже включить в отчет.\nВиджет Отчеты предназначен для работы с виджетом [Плитка устройств (Device Tiles)](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/device_tiles.md). Если вы не используете плитки устройств, вы все равно можете выбрать одно устройство или группу устройств в качестве источника данных для отчетов.\n\nВы должны выбрать либо [Плитку устройств](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/device_tiles.md), либо одино устройство, либо группу устройств для отчета. Вы не можете объединить эти оба варианта.\n\n#### Режим воспроизведения \n\nПосле добавления исходных устройств и их потоков данных нажмите кнопку «Воспроизвести» и нажмите кнопку «Отчеты».\n\n### Настройка отчетов\n\nКаждый параметр отчета предполагает свои собственные настройки:\n\n```Report name``` (Имя отчета) -  дайте вашему отчету осмысленное имя.\n\n```Data source``` (Источники данных) - выберите потоки данных, которые вы хотели бы включить в отчеты.\n\n```Report Frequency``` (периодичность отчетов) -  Определяет, как часто будут отправляться отчеты. Они могут быть разовыми и запланированными.\n\n```one-time``` (Сейчас) -  мгновенно сформирует отчет и отправит его на указанные адреса электронной почты. Нажмите на значок справа, чтобы отправить отчет.\n\nЗапланированные отчеты могут быть отправлены ```daily```/```weekly```/```monthly``` (ежедневно/еженедельно/ежемесячно).\n\n ```At Time``` (Время)  установите время дня, когда отчет будет отправлен.\n ```Start```/```End``` (Качало/Конец) указывает дату начала и окончания оправки отчетов.\n\nДля еженедельного отчета вы можете выбрать день недели, когда отчет должен быть отправлен.\nДля ежемесячного отчета вы можете выбрать, отправку отчета в первый или последний день месяца.\n\n```Recipients``` (Получатели) -  укажите до 5 адресов электронной почты..\n\n```Data resolution``` (Разрешение данных) определяет детализацию ваших отчетов.  Поддерживаемые детализации: ```minute``` (ежеминутно), ```hourly``` (ежечасно) и ```daily``` (ежедневно).\nНапример, когда вы генерируете ежедневный отчет с детализацией в 1 минуту, вы получаете ```24 * 60 * 60``` единиц данных в вашем ежедневном отчете за каждый выбранный поток.\n\n```Group data in reports by``` (Группировка данных в отчетах) -  укажите выходной формат файла-(ов) CSV:\n\n```Datastream``` (Поток) - вы получите один CSV файл для каждого потока данных.\n\n```Device``` (Устройство) - вы получите один CSV-файл на каждое устройство. Каждый файл будет содержать все включенные потоки данных.\n\n```Report``` (Отчет) - вы получите один CSV-файл для всех ваших устройств и всех ваших потоков данных.\n\n```Timezone correction``` (Времненная зона) -  укажите корректировку часового пояса, если вам нужно настроить дату и время отчета на определенный часовой пояс.\n\n```Date and time format``` (Формат даты и времени) -  определяет формат поля временной метки ваших данных.\nВы можете выбрать ```2018-06-21 20:16:48```, ```2018-06-21T20:16:48+03:00``` или другой поддерживаемый формат.\n\nСуществует особый формат ```Timestamp``` (Временная метка), которая отражает разницу между текущим временем и полуночью 1 января 1970 года UTC, измеряемую в миллисекундах.\n\nПосле настройки отчета нажмите кнопку «ОК» в правом верхнем углу. Ваш отчет готов.\n\nПосле настройки отчета вы увидите, когда запланирован следущий отчет ```Next```, а также увидите расписание для этого отчета.\n\nПосле отправки отчета хотя бы один раз, вы можете увидеть дату его последней отправки ```Last```.\n\n```Last``` (Последний) метка также содержит статус отправки отчета:\n\n  - ```OK``` (Успешно):  отчет был сгенерирован и успешно отправлен Получателям;\n  - ```No Data``` (Нет данных): отчет не содержит данных за указанный период;\n  - ```Error``` (Ошибка):  что-то пошло не так. Пожалуйста, свяжитесь со службой поддержки Blynk.\n\nОтчеты будут генерироваться, даже если ваш проект не находится в активном (Play) режиме. Однако помните, неактивные проекты небудут генерировать данные.\n\n**ПРИМЕЧАНИЕ:** все отчеты формируются в кодировке UTF-16. Пожалуйста, убедитесь, что при открытии файла отчета вы выбрали кодировку UTF-16 в вашем CSV-редакторе.\n\n\n### Отчеты (Reports)\n\nФункция виджета Отчеты заключается в настройке и разметке отчетов данных в формате CSV. Вы можете выбрать разовые или переодически запланированные отчеты.\n\nКроме того, в отчетах вы можете очистить все пользовательсике данные, собранные с ваших устройств.\n\nВам необходимо настроить начальные параметры в режиме редактирования, а затем уже в режиме воспроизведения вы сможете настроить сами отчеты.\n\n#### Режим редактирования. Конфигурация ввода данных\n\nВ режиме редактирования (когда ваш проект остановлен) вы определяете потоки данных, которые вы хотели бы позже включить в отчет.\nВиджет Отчеты предназначен для работы с виджетом [Плитка устройств (Device Tiles)](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/device_tiles.md). Если вы не используете плитки устройств, вы все равно можете выбрать одно устройство или группу устройств в качестве источника данных для отчетов.\n\nВы должны выбрать либо [Плитку устройств](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/device_tiles.md), либо одино устройство, либо группу устройств для отчета. Вы не можете объединить эти оба варианта.\n\n#### Режим воспроизведения \n\nПосле добавления исходных устройств и их потоков данных нажмите кнопку «Воспроизвести» и нажмите кнопку «Отчеты».\n\n### Настройка отчетов\n\nКаждый параметр отчета предполагает свои собственные настройки:\n\n```Report name``` (Имя отчета) -  дайте вашему отчету осмысленное имя.\n\n```Data source``` (Источники данных) - выберите потоки данных, которые вы хотели бы включить в отчеты.\n\n```Report Frequency``` (периодичность отчетов) -  Определяет, как часто будут отправляться отчеты. Они могут быть разовыми и запланированными.\n\n```one-time``` (Сейчас) -  мгновенно сформирует отчет и отправит его на указанные адреса электронной почты. Нажмите на значок справа, чтобы отправить отчет.\n\nЗапланированные отчеты могут быть отправлены ```daily```/```weekly```/```monthly``` (ежедневно/еженедельно/ежемесячно).\n\n ```At Time``` (Время)  установите время дня, когда отчет будет отправлен.\n ```Start```/```End``` (Качало/Конец) указывает дату начала и окончания оправки отчетов.\n\nДля еженедельного отчета вы можете выбрать день недели, когда отчет должен быть отправлен.\nДля ежемесячного отчета вы можете выбрать, отправку отчета в первый или последний день месяца.\n\n```Recipients``` (Получатели) -  укажите до 5 адресов электронной почты..\n\n```Data resolution``` (Разрешение данных) определяет детализацию ваших отчетов.  Поддерживаемые детализации: ```minute``` (ежеминутно), ```hourly``` (ежечасно) и ```daily``` (ежедневно).\nНапример, когда вы генерируете ежедневный отчет с детализацией в 1 минуту, вы получаете ```24 * 60 * 60``` единиц данных в вашем ежедневном отчете за каждый выбранный поток.\n\n```Group data in reports by``` (Группировка данных в отчетах) -  укажите выходной формат файла-(ов) CSV:\n\n```Datastream``` (Поток) - вы получите один CSV файл для каждого потока данных.\n\n```Device``` (Устройство) - вы получите один CSV-файл на каждое устройство. Каждый файл будет содержать все включенные потоки данных.\n\n```Report``` (Отчет) - вы получите один CSV-файл для всех ваших устройств и всех ваших потоков данных.\n\n```Timezone correction``` (Времненная зона) -  укажите корректировку часового пояса, если вам нужно настроить дату и время отчета на определенный часовой пояс.\n\n```Date and time format``` (Формат даты и времени) -  определяет формат поля временной метки ваших данных.\nВы можете выбрать ```2018-06-21 20:16:48```, ```2018-06-21T20:16:48+03:00``` или другой поддерживаемый формат.\n\nСуществует особый формат ```Timestamp``` (Временная метка), которая отражает разницу между текущим временем и полуночью 1 января 1970 года UTC, измеряемую в миллисекундах.\n\nПосле настройки отчета нажмите кнопку «ОК» в правом верхнем углу. Ваш отчет готов.\n\nПосле настройки отчета вы увидите, когда запланирован следущий отчет ```Next```, а также увидите расписание для этого отчета.\n\nПосле отправки отчета хотя бы один раз, вы можете увидеть дату его последней отправки ```Last```.\n\n```Last``` (Последний) метка также содержит статус отправки отчета:\n\n  - ```OK``` (Успешно):  отчет был сгенерирован и успешно отправлен Получателям;\n  - ```No Data``` (Нет данных): отчет не содержит данных за указанный период;\n  - ```Error``` (Ошибка):  что-то пошло не так. Пожалуйста, свяжитесь со службой поддержки Blynk.\n\nОтчеты будут генерироваться, даже если ваш проект не находится в активном (Play) режиме. Однако помните, неактивные проекты небудут генерировать данные.\n\n**ПРИМЕЧАНИЕ:** все отчеты формируются в кодировке UTF-16. Пожалуйста, убедитесь, что при открытии файла отчета вы выбрали кодировку UTF-16 в вашем CSV-редакторе.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "Widgets.md",
    "content": "#Widgets\nWidgets are interface modules. Each of them performs a specific input/ output function when communicating with the hardware.\n\nThere are 4 types of Widgets: \n\n- **Controllers** - used to send commands that control your hardware\n- **Displays** - used for data visualization from sensors and other sources;\n- **Notifications** - send messages and notifications;\n- **Interface** - widgets to perform certain GUI functions;\n- **Other** - widgets that don't belong to any category;\n\nEach Widget has it's own settings. Some of the Widgets (e.g. Bridge) just enable functionality and they don't have any settings.\n \n## Common Widget Settings\n### Pin Selector\nThis is one of the main parameters you need to set. It defines which pin to control or to read from. \n\n<img src=\"images/pin_selection.png\" style=\"width: 200px; height:360px\"/>\n\n**Digital Pins** - represent physical Digital IO pins on your hardware. PWM-enabled pins are marked with the ```~``` symbol\n\n**Analog Pins** - represent physical Analog IO pins on your hardware\n\n**Virtual Pins** - have no physical representation. They are used to transfer any data between Blynk App and your hardware.\nRead more about Virtual Pins [here](/#blynk-main-operations-virtual-pins).\n\n### Data Mapping\n\nIn case you want to map incoming values to specific range you may use mapping button: \n\n<img src=\"images/display_edit_mapping.png\" style=\"width: 200px; height:360px\"/>\n\nLet's say your sensor sends values from 0 to 1023. But you want to display values in a range 0 to 100 in the app. \nWhen Data Mapping enabled, incoming value 1023 will be mapped to 100.\n\n### SPLIT/MERGE\nSome of the Widgets can send more than one value. And with this switch you can control how to send them.\n\n- **SPLIT**:\nEach of the parameters is sent directly to the Pin on your hardware (e.g D7). You don't need to write any code.\n\n\t**NOTE:** In this mode you send multiple commands from one widget, which can reduce performance of your hardware.\n\n\tExample: If you have a Joystick Widget and it's set to D3 and D4, it will send 2 commands over the Internet:\n\n\t```cpp\n\tdigitalWrite(3, value);\n\tdigitalWrite(4, value);\n```\n\n- **MERGE:**\nWhen MERGE mode is selected, you are sending just 1 message, consisting of array of values. But you'll need to parse it on the hardware. \n\n\tThis mode can be used with Virtual Pins only.\n\t\n\tExample: Add a zeRGBa Widget and set it to MERGE mode. Choose Virtual Pin V1\n\t\n\t```cpp\n\tBLYNK_WRITE(V1) // There is a Widget that WRITEs data to V1 \n\t{\n\t  int r = param[0].asInt(); // get a RED channel value\n\t  int g = param[1].asInt(); // get a GREEN channel value\n\t  int b = param[2].asInt(); // get a BLUE channel value\n\t}\n```\n\n### Decimals\nDefines how many decimals you would like to see when moving a Slider.\nWhen \"No Fraction\" is chosen, slider will only send integer values with no decimals.\n\"1 digit\" means that values will look like 1.1, 1.2, ..., 2.0, etc.\n\n### Send On Release \nThis option allows you to optimize data traffic on your hardware. \n\nFor example, when you move joystick widget, commands are streamed to the hardware, during a single joystick move \nyou can send dozens of commands. There are use-cases where it's needed, however creating such a load may lead to hardware overload and reset. \n**Send On Release** is a recommended setting for majority of applications. This is also a default setting.\n\n### Write interval\nSimilar to \"Send on Release\" option. However, it allows you to stream values to your hardware within certain interval. For example, setting **write interval** to 100 ms means that while you move the slider, only 1 value will be sent to hardware within 100 ms period.\nThis option is also used to optimize data traffic flow to your hardware.\n\n### Color gradient\n\nWhen you choose gradient, it affects the color of widget elements based on invoming values. \nFor example: You set Gauge Widget with Min and Max parameters of 0-100, and choose green-yellow-red gradient. When hardware sends: \n- `10`, Gauge will change it's color to green color\n- `50` will change Gauge to yellow color\n- `80` will change Gauge to red color\n\nThere are 2 types of gradients you can choose from:\n- Warm: Green - Orange - Red;\n- Cold: Green - Blue - Violet;\n\n\n\n##Controllers\n### Button\nWorks in push or switch modes. Allows to send ON and OFF (LOW/HIGH) values. Button sends 1 (HIGH) on press and sends 0 (LOW) on release.\n\n<img src=\"images/button.png\" style=\"width: 77px; height:80px\"/>\n\n<img src=\"images/button_edit.png\" style=\"width: 200px; height:360px\"/>\n\n**Sketch:** [BlynkBlink](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n### Slider\nSimilar to potentiometer. Allows to send values between in a given MIN/MAX range.\n\n<img src=\"images/slider.png\" style=\"width: 77px; height:80px\"/>\n\n<img src=\"images/slider_edit.png\" style=\"width: 200px; height:360px\"/>\n\n**Sketch:** [BlynkBlink](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n### Timer\nTimer triggers actions at a specified time. Even if smartphone and app is offline. Start time sends 1 (HIGH). Stop time sends 0 (LOW).\n\nRecent Android version also has improved Timer within Eventor widget.\nWith Eventor Time Event you can assign multiple timers on same pin, send any string/value, select days and timezone. \nIt is recommended to use Eventor over Timer widget.\nHowever Timer widget is still suitable for simple timer events.\n\n<img src=\"images/timer.png\" style=\"width: 77px; height:80px\"/>\n\n<img src=\"images/timer_edit.png\" style=\"width: 200px; height:360px\"/>\n\n**NOTE:** The timer widget rely on the server time and not your phone time. Sometimes the phone time may not match the server time. \n\n**Sketch:** [Timer](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Timer/Timer.ino)\n\n### Joystick\nControl servo movements in 4 directions\n\n####Settings:\n- SPLIT/MERGE modes - read [here](/#widgets-common-widget-settings-splitmerge)\n\n- **Rotate on Tilt**\n\nWhen it's ON, Joystck will automatically rotate if you use your smartphone in landscape orientation  \n- **Auto-Return**\n- \nWhen it's OFF, Joystick handle will not return back to center position. It will stay where you left it. \n\n<img src=\"images/joystick.png\" style=\"width: 77px; height:80px\"/>\n\n<img src=\"images/joystick_edit.png\" style=\"width: 200px; height:360px\"/>\n\n**Sketch:** [JoystickTwoAxis](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/JoystickTwoAxis/JoystickTwoAxis.ino)\n\n### zeRGBa\n\nzeRGBa is a usual RGB color picker + brightness picker\n\n#### Settings:\n\n- **SPLIT**:\nEach of the parameters is sent directly to the Pin on your hardware (e.g D7). You don't need to write any code.\n\n**NOTE:** In this mode you send multiple commands from one widget, which can reduce performance of your hardware.\n\nExample: If you have a zeRGBa Widget and it's set to D1, D2, D3 it will send 3 commands over the Internet:\n\n```cpp\ndigitalWrite(1, r);\ndigitalWrite(2, g);\ndigitalWrite(3, b);\n```\n\n- **MERGE**:\nWhen MERGE mode is selected, you send 1 message with an array of values inside. You would need to parse the message on the hardware. \n\nThis mode can be used with Virtual Pins only.\n\t\nExample: Add a zeRGBa Widget and set it to MERGE mode. Choose Virtual Pin V1.\n\t\n```cpp\nBLYNK_WRITE(V1) // zeRGBa assigned to V1 \n{\n    // get a RED channel value\n    int r = param[0].asInt();\n    // get a GREEN channel value\n\tint g = param[1].asInt();\n\t// get a BLUE channel value\n\tint b = param[2].asInt();\n}\n```\n\n### Step Control\nStep Control is used to set granular values with a given step\n\n2 buttons are assigned to 1 pin. One button increments the value, another one decrements it. \n\n**Send Step** option allows you to send step value to hardware instead of actual value of step widget.\n**Loop value** option allows you to reset step widget to start value when maximum value is reached.\n\n**Sketch:** [Basic Sketch](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n##Displays\n### Value Display\nDisplays incoming data.\n\n<img src=\"images/display.png\" style=\"width: 77px; height:80px\"/> \n\n<img src=\"images/display_edit.png\" style=\"width: 200px; height:360px\"/>\n\n**Sketch:** [BlynkBlink](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n### Labeled Value\nDisplays incoming data in a formatted wayt. It is a better version of 'Value Display' where you can add suffixes and prefixes on the app side, with no coding on the hardware.\n\n<img src=\"images/display.png\" style=\"width: 77px; height:80px\"/> \n\n<img src=\"images/labeled_value_edit.png\" style=\"width: 200px; height:360px\"/>\n\n**Sketch:** [BlynkBlink](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n#### Formatting options\n\nFor example: your sensor sends vaule of 12.6789 to Blynk application.\nNext formatting options are supported:\n\n```/pin/``` - displays the value without formatting (12.6789)\n\n```/pin./``` - displays the rounded value without decimal part (13)\n\n```/pin.#/``` - displays the value with 1 decimal digit (12.7)\n\n```/pin.##/``` - displays the value with two decimal places (12.68)\n\n<img src=\"images/labeled_value_format_edit.png\" style=\"width: 200px; height:360px\"/>\n\n### LED\nA simple LED for indication. You need to send 0 in order to turn LED off. And 255 in order to turn LED on. Or just use\nBlynk API as described below:\n\n```cpp\nWidgetLED led1(V1); //register to virtual pin 1\nled1.off();\nled1.on();\n```\n    \nAll values between 0 and 255 will change LED brightness:\n\n```cpp\nWidgetLED led2(V2);\nled2.setValue(127); //set brightness of LED to 50%.\n```\n\n<img src=\"images/led.png\" style=\"width: 77px; height:80px\"/>\n\n**Sketch:** [LED](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LED/LED_Blink/LED_Blink.ino)\n\n### Gauge\nVisual display of numeric values.\n\n<img src=\"images/gauge.png\" style=\"width: 77px; height:80px\"/>\n\n<img src=\"images/gauge_edit.png\" style=\"width: 200px; height:360px\"/>\n\n**Sketch:** [BlynkBlink](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n#### Formatting options\n\nFor example: your sensor sends vaule of 12.6789 to Blynk application.\nNext formatting options are supported:\n\n```/pin/``` - displays the value without formatting (12.6789)\n\n```/pin./``` - displays the rounded value without decimal part (13)\n\n```/pin.#/``` - displays the value with 1 decimal digit (12.7)\n\n```/pin.##/``` - displays the value with two decimal places (12.68)\n\n### LCD\nThis is a regular 16x2 LCD display made in our secret facility in China.\n#### SIMPLE / ADVANCED MODE\n\n#### Commands\nYou need to use special commands with this widget:\n\n```\nlcd.print(x, y, \"Your Message\");\n```\nWhere x is a symbol position (0-15), y is a line id (0 or 1), \n\n```\nlcd.clear();\n```\n\n<img src=\"images/lcd.png\" style=\"width: 77px; height:80px\"/>\n\n<img src=\"images/lcd_edit.png\" style=\"width: 200px; height:360px\"/>\n\n**Sketch:** [LCD Advanced Mode](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_AdvancedMode/LCD_AdvancedMode.ino)\n**Sketch:** [LCD Simple Mode Pushing](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_SimpleModePushing/LCD_SimpleModePushing.ino)\n**Sketch:** [LCD Simple Mode Reading](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_SimpleModeReading/LCD_SimpleModeReading.ino)\n\n#### Formatting options\n\nFor example: your sensor sends vaule of 12.6789 to Blynk application.\nNext formatting options are supported:\n\n```/pin/``` - displays the value without formatting (12.6789)\n\n```/pin./``` - displays the rounded value without decimal part (13)\n\n```/pin.#/``` - displays the value with 1 decimal digit (12.7)\n\n```/pin.##/``` - displays the value with two decimal places (12.68)\n\n<img src=\"images/lcd_format_edit.png\" style=\"width: 200px; height:360px\"/>\n\n### SuperChart\nSuperChart is used to visualise live and historical data. You can use it for sensor data, for binary event logging and more.\n\nTo use SuperChart widget you would need to push the data from the hardware with the desired interval by using timers.  \n[Here is](https://examples.blynk.cc/?board=ESP8266&shield=ESP8266%20WiFi&example=GettingStarted%2FPushData) a basic example for data pushing.\n\n#### Interactions:\n- **Switch between time ranges and Live mode**\n</br>Tap time ranges at the bottom of the widget to change time ranges\n\n- **Tap Legend Elements** to show or hide datastreams\n</br>\n\n- **Tap'n'hold to view timestamp and corresponding values**\n\n<img src=\"images/chart/tapnhold_charts.png\" style=\"width: 300px; height:280px\"/>\n\n- **Quick swipe from left to right to reveal previous data** \n\n<img src=\"images/chart/swipe_charts.png\" style=\"width: 300px; height:280px\"/>\n\nThen you can then scroll data back and forward within the given time range.\n\n- **Full Screen Mode**</br>\nPress this button to open Full Screen view in landscape orientation:\n\n<img src=\"images/chart/fullscreen_charts.png\" style=\"width: 300px; height:280px\"/>\n\nSimply rotate the phone back to portrait mode. Chart should rotate automagically. \nIn full screen view you will see X (time) and multiple Y scales. \nFull Screen Mode can be disabled from widget Settings.\n\n- **Menu Button**</br>\nMenu button will open additional functions:\n\t- Export to CSV\n\t- Erase Data on the server \n\n<img src=\"images/chart/menu_charts.png\" style=\"width: 300px; height:280px\"/>\n\n#### SuperChart Settings:\n- Chart Title\n- Title Font Size\nYou have a choice of 3 font sizes\n- Title Alignment\nChoose chart title alignment. This setting also affects Title and Legend position on the Widget.\n- Show x-axis (time)\nSelect it if you want to show the time label at the bottom of your chart.\n- Time ranges picker\nAllows you to select required periods (`15m`, `30m`, `1h`, `3h`, ...) and resolution for your chart. Resolution\ndefines how precise your data is. Right now chart supports 2 types of resolution `standard` and `high`. Resolution also\ndepends on the selected period. For example, `standard` resolution for `1d` means you'll get 24 points per day (1 per hour),\nwith `high` resolution you'll get for `1d` 1440 points per day (1 per minute).\n\n- Datastreams - add datastreams (read below how to configure datastreams)\n\n#### Datastream Settings\n\nWidget supports up to 4 Datastreams. \nPress Datastream Settings Icon to open Datastream Settings.\n\n<img src=\"images/chart/datastream_charts.png\"/>\n\n\n**Design:**\nChoose available types of Chart:\n\n- Line\n- Area\n- Bar\n- Binary (anchor LINK to binary)\n\n**Color:**\nChoose solid colors or gradients\n\n**Source and input:**\nYou can use 3 types of Data source: \n\n**1. Virtual Pin**\nChoose the desired Device and Virtual Pin to read the data from. \n\n**2. Tags**\nSuperChart can aggregate data from multiple devices using built-in aggregation functions. \nFor example, if you have 10 Temperature sensors sending temperature with the given period, \nyou can plot average value from 10 sensors on the widget.\n\nTo use Tags:\n\n- **[Add Tag](/#blynk-main-operations-control-of-multiple-devices-tags)** to every device you want to aggregate data from.\n- **Push data to the same Virtual Pin** on every device. (e.g. ```Blynk.virtualWrite (V0, temperature);```)\n- **Choose Tag as a source** in SuperChart Widget and use the pin where the data is coming to (e.g V0)<br>\n\n**Functions available:** \n\t\n- **SUM**, will summarize all incoming values to the specified Virtual Pin across all devices tagged with the chosen tag\n- **AVG**, will plot average value \n- **MED**, will find a median value\n- **MIN**, will plot minimum value \n- **MAX** will plot maximum value \n\t\n\n**☝️ IMPORTANT: Tags are not working in Live Mode.**\n\n3. **[Device Selector](/#widgets-time-input-device-selector)**\nIf you add Device Selector Widget to your project, you can use it as a source for SuperChart. \nIn this case, when you change the device in Device Selector, chart will be updated accordingly\n\n**Y-Axis Settings**\n<br>There are 4 modes of how to scale data along the Y axis\n\n1. *Auto*<br>\nData will be auto-scaled based on min and max values of the given time period. This is nice option to start with.\n\n2. **Values**<br>\nWhen this mode is selected, Y scale will be set to the values you choose. \nFor example, if your hardware sends data with values varying from -100 to 100, you can set the chart \nto this values and data will be rendered correctly.\n\n<img src=\"images/chart/yScale_manual_charts.png\" style=\"width: 300px; height:212\"/>\n\nYou may also want to visualize the data within some specific range. \nLet's say incoming data has values in the range of 0-55, but you would like to see only values in the range 30-50. \nYou can set it up and if values are out of Y scale you configured, chart will be cropped\n\n3. **% of Height**<br>\nThis option allows you to auto-scale incoming data on the widget and position it the way you want. \nIn this mode, you set up the percentage of widget height on the screen, from 0% to 100%. \n\n<img src=\"images/chart/yheight2_charts.png\" style=\"width: 300px; height:212px\"/>\n\nIf you set 0-100%, in fact it's a full auto-scale. No matter in which range the data is coming,  \nit will be always scaled to the whole height of the widget.\n\nIf you set it to 0-25%, then this chart will only be rendered on 1/4 of the widget height:\n<img src=\"images/chart/yheight2_manual_charts.png\" style=\"width: 300px; height:212px\"/>\n\nThis setting is very valuable for **Binary Chart** or for visualizing a few datastreams on the same chart in a different way.\n\n<img src=\"images/chart/binary_charts.png\" style=\"width: 300px; height:280px\"/>\n\n4. *Delta*<br>\nWhile data stays within the given Delta value, chart will be auto-scaled within this range.\nIf delta exceeds the range, chart will be auto-scaled to min/max values of the given period.\n\n**Suffix:**<br>\nHere you can specify a suffix that will be shown during the Tap'n'hold\n\n**Decimals**<br>\nDefines the formatting of the graph value when you Tap'n'hold the graph. Possible options are: #, #.#, #.##, etc.\n\n**Connect Missing Data Points**<br>\nIf this switch is ON, then SuperChart will connect all the dots even if there was no data\n\n<img src=\"images/chart/datapoints1_charts.png\" style=\"width: 300px; height:280px\"/>\n\nIf it's set to OFF, then you will see gaps in case there was no data.\n\n<img src=\"images/chart/datapoints2_charts.png\" style=\"width: 300px; height:280px\"/>\n\n**Binary Chart Settings**<br>\nThis type of chart is useful to plot binary data, for example when unit was ON or OFF, or when motion was detected or when certain threshold was reached.\n\nYou need to specify a **FLIP** point, which is the point where incoming data will be turned into TRUE or FALSE state.\n\nFor example, you send the data in the range of `0 to 1023`. If you set `512` as a **FLIP** point, then everything above `512` (excluding 512) will be recorded as `TRUE`, any value below `512` (including 512) will be `FALSE`.\n\nAnother example, if you send `0 and 1` and set `0` as a **FLIP** point, then `1` will be `TRUE`, `0` will be `FALSE`\n\n**State Labels:**<br>\nHere you can specify how `TRUE/FALSE` should be shown in Tap'n'Hold mode. \n\nFor example, you can set to `TRUE` to \"Equipment ON\" label, `FALSE` to \"Equipment OFF\".\n\n<img src=\"images/chart/binarylabel_charts.png\" style=\"width: 300px; height:280px\"/>\n\nSuperchart supports currently 2 types of granularity:\n\n- Minute granularity - ```1h```, ```6h```, ```1d```;\n- Hour granularity - ```1w```, ```1m```, ```3m```;\n\nThis means that minimum chart update interval is 1 minute for ```1h```, ```6h```, ```1d``` periods. \n1 hour for ```1w```, ```1m``` and ```3m``` periods.\nAs Blynk Cloud is free to use we have a limit on how many data you can store. At the moment Blynk Cloud accepts \n1 message per minute per pin. In case you send your data more frequently your values will be averaged. For example, \nin case you send value ```10``` at 12:12:05 and than again ```12``` at  12:12:45 as result in chart you'll see\nvalue ```11``` for 12:12.\n\nIn order to see data in chart you need to use either widgets with \"Frequency reading\" interval (in \nthat case your app should be open and running) or you can use ```Blynk.virtualWrite``` on hardware side. Every \n```Blynk.virtualWrite``` command is stored on server automatically. In that case you don't need application to be up and running.\n\n### Terminal\nDisplays data from your hardware. Allows to send any string to your hardware. Terminal always stores last 25 messages\nyour hardware had send to Blynk Cloud. This limit may be increased on Local Server with ```terminal.strings.pool.size``` \nproperty.\n\nYou need to use special commands with this widget:\n\n```cpp\nterminal.print();   // Print values, like Serial.print\nterminal.println(); // Print values, like Serial.println()\nterminal.write();   // Write a raw data buffer\nterminal.flush();   // Ensure that data was sent out of device\nterminal.clear();   // Erase all values in the terminal\n```\n\n<img src=\"images/terminal.png\" style=\"width: 77px; height:80px\"/>\n\n<img src=\"images/terminal_edit.png\" style=\"width: 200px; height:360px\"/>\n\n**Sketch:** [Terminal](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Terminal/Terminal.ino)\n\n### Video Streaming\nSimple widget that allows you to display any live stream. Widget supports RTSP (RP, SDP), HTTP/S progressive streaming, \nHTTP/S live streaming. For more info please follow [official Android documentation](https://developer.android.com/guide/appendix/media-formats.html). \n\nAt the moment Blynk doesn't provide streaming servers. So you can either stream directly from camera, use 3-d party \nservices or host streaming server on own server (on raspberry for example).\n\nYou can also change video url from hardware with: \n\n```cpp\nBlynk.setProperty(V1, \"url\", \"http://my_new_video_url\");\n```\n\n### Level Display\nLevel Display is very similar to progress bar, when you need to visualize a level betwen min/max value\nTo update Level Display from hardware side with code: \n \n```cpp\nBlynk.virtualWrite(V1, val); \n```\n\nEvery message that hardware sends to server is stored automatically on server. PUSH mode doesn't require \napplication to be online or opened.\n\n**Sketch:** [Push Example](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushData/PushData.ino)\n\n##Notifications\n###Twitter\n\nTwitter widget connects your Twitter account to Blynk and allows you to send Tweets from your hardware.\n\n<img src=\"images/TwitterON.png\" style=\"width: 77px; height:80px\"/>\n\nExample code:\n```cpp\nBlynk.tweet(\"Hey, Blynkers! My Arduino can tweet now!\");\n```\n\nLimitations:\n\n- you cant' send 2 tweets with same message (it's Twitter policy)\n- only 1 tweet per 5 seconds is allowed\n\n**Sketch:** [Twitter](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Twitter/Twitter.ino)\n\n###Email\n\nEmail widget allows you to send email from your hardware to any address.\n\nExample code:\n```cpp\nBlynk.email(\"my_email@example.com\", \"Subject\", \"Your message goes here\");\n```\n  \nIt also contains ```to``` field. With this field you may define receiver of email in the app. \nYou may skip ```to``` field when you want to send email to your Blynk app login email:\n\n ```cpp\n Blynk.email(\"Subject\", \"Your message goes here\");\n ```\n\nYou can send either ```text/html``` or ```text/plain``` (some clients don't support ```text/html```) email.\nYou can change this content type of email in the Mail widget settings.\n\nAdditionally you may use ```{DEVICE_NAME}```, ```{DEVICE_OWNER_EMAIL}``` and ```{VENDOR_EMAIL}``` (for the local server)\nplaceholders in the mail for the ```to```, ```subject``` and ```body``` fields:\n\n```cpp\nBlynk.email(\"{DEVICE_OWNER_EMAIL}\", \"{DEVICE_NAME} : Alarm\", \"Your {DEVICE_NAME} has critical error!\");\n```\n\n<img src=\"images/mail.png\" style=\"width: 77px; height:80px\"/>\n\nLimitations:\n\n- Maximum allowed email + subject + message length is 120 symbols. However you can increase this limit if necessary \nby adding ```#define BLYNK_MAX_SENDBYTES XXX``` to you sketch. Where ```XXX``` is desired max length of your email. \nFor example for ESP you can set this to 1200 max length ```#define BLYNK_MAX_SENDBYTES 1200```. The \n```#define BLYNK_MAX_SENDBYTES 1200``` must be included before any of the Blynk includes.\n- Only 1 email per 5 seconds is allowed\n- In case you are using gmail on the Local Server you are limited with 500 mails per day (by google). Other providers may have similar\nlimitations, so please be careful.\n- User is limited with 100 messages per day in the Blynk Cloud;\n\n**Sketch:** [Email](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Email/Email.ino)\n\n###Push Notifications\n\nPush Notification widget allows you to send push notification from your hardware to your device. Currently it also \ncontains 2 additional options:\n\n- **Notify when hardware offline** - you will get push notification in case your hardware went offline.\n- **Offline Ignore Period** - defines how long hardware could be offline (after it went offline) before sending notification. \nIn case period is exceeded - \"hardware offline\" notification will be send. You will get no notification in case hardware \nwas reconnected within specified period.\n- **Priority** high priority gives more chances that your message will be delivered without any delays. \nSee detailed explanation [here](https://developers.google.com/cloud-messaging/concept-options#setting-the-priority-of-a-message). \n\n**WARNING**: high priority contributes more to battery drain compared to normal priority messages.\n\n<img src=\"images/push.png\" style=\"width: 77px; height:80px\"/>\n\nExample code:\n```cpp\nBlynk.notify(\"Hey, Blynkers! My hardware can push now!\");\n```\n\nYou can also use placeholder for device name, that will be replaced on the server with your device name:\n```cpp\nBlynk.notify(\"Hey, Blynkers! My {DEVICE_NAME} can push now!\");\n```\n\nLimitations:\n\n- Maximum allowed body length is 120 symbols;\n- Every device can send only 1 notification every 5 seconds;\n\n**Sketch:** [PushNotification](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/PushNotification/PushNotification_Button/PushNotification_Button.ino)\n\n###Unicode in notify, email, push, ...\n\nThe library handles all strings as UTF8 Unicode. If you're facing problems, try to print your message to the Serial and see if it works (the terminal should be set to UTF-8 encoding). If it doesn't work, probably you should read about unicode support of your compiler.  \nIf it works, but your message is truncated - you need to increase message length limit (all Unicode symbols consume at least twice the size of Latin symbols).\n\n###Increasing message length limit\n\nYou can increase maximum message length by putting on the top of your sketch (before Blynk includes):\n```cpp\n#define BLYNK_MAX_SENDBYTES 256 // Default is 128\n```\n\n## Interface\n\n### Tabs\nThe only purpose of Tabs widget is to extend your project space. You can have up to 4 tabs. \nAlso you can drag widgets between tabs. Just drag widget on the label of required tab of tabs widget.\n\n<img src=\"images/tabs_settings.png\" style=\"width: 200px; height:360px\"/>\n\n\n### Menu\nMenu widget allows you to send command to your hardware based on selection you made on UI. Menu\nsends index of element you selected and not label string. Sending index is starts from 1.\nIt works same way as usual ComboBox element. You can also set Menu items \n[from hardware side](/#blynk-main-operations-change-widget-properties).\n\n<img src=\"images/menu_edit.png\" style=\"width: 200px; height:360px\"/>\n\nExample code:\n```\nswitch (param.asInt())\n  {\n    case 1: { // Item 1\n      Serial.println(\"Item 1 selected\");\n      break;\n    }\n    case 2: { // Item 2\n      Serial.println(\"Item 2 selected\");\n      break;\n    }    \n  }\n```\n\n**Sketch:** [Menu](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Menu/Menu.ino)\n\n\n### Time Input\n\nTime input widget allows you to select start/stop time, day of week, timezone, sunrise/sunset formatted values\nand send them to your hardware. Supported formats for time now are ```HH:MM``` and ```HH:MM AM/PM```.\n\nHardware will get selected on UI time as seconds of day (```3600 * hours + 60 * minutes```) for start/stop time.\nTime that widget sends to hardware is user local time.\nSelected days indexes: \n\n```\nMonday - 1\nTuesday - 2\n...\nSaturday - 6\nSundays - 7\n```\n\nYou can also change state of widget on UI. See below sketches.\n\n**Sketch:** [Simple Time Input for start time](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/SimpleTimeInput/SimpleTimeInput.ino)\n\n**Sketch:** [Advanced Time Input](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/AdvancedTimeInput/AdvancedTimeInput.ino)\n\n**Sketch:** [Update Time Input State on UI](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/UpdateTimeInputState/UpdateTimeInputState.ino)\n\n### Map\n\nMap widget allows you set points/pins on map from hardware side. This is very useful widget in case you have \nmultiple devices and you want track their values on map.\n\nYou can send a point to map with regular virtual wrtei command:  \n\n```cpp\nBlynk.virtualWrite(V1, pointIndex, lat, lon, \"value\");\n```\n\nWe also created wrapper for you to make suage of map simpler: \n\nYou can change button labels from hardware with: \n\n```cpp\nWidgetMap myMap(V1);\n...\nint index = 1;\nfloat lat = 51.5074;\nfloat lon = 0.1278;\nmyMap.location(index, lat, lon, \"value\");\n```\n\nUsing save ```index``` allows you to override existing point value.\n\n**Sketch:** [Basic Sketch](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Map/Map.ino)\n\n\n### Table\n\nTable widget comes handy when you need to structure similar data within 1 graphical element. It works as a usual table.\n\nYou can add a row to the table with: \n\n```\nBlynk.virtualWrite(V1, \"add\", id, \"Name\", \"Value\");\n```\n\nYou can update a row in the table with:\n\n```\nBlynk.virtualWrite(V1, \"update\", id, \"UpdatedName\", \"UpdatedValue\");\n```\n\nTo highlight any item in a table by using it's id in a table: \n\n```\nBlynk.virtualWrite(V1, \"pick\", 0);\n```\n\nTo select/deselect (make icon green/grey) item in a table by using it's row id in a table: \n\n```\nBlynk.virtualWrite(V1, \"select\", 0);\nBlynk.virtualWrite(V1, \"deselect\", 0);\n```\n\n\nTo clear the table at any time with: \n\n```\nBlynk.virtualWrite(V1, \"clr\");\n```\n\nYou can also handle other actions coming from table. For example, use row as a switch button. \n\n```\nBLYNK_WRITE(V1) {\n   String cmd = param[0].asStr();\n   if (cmd == \"select\") {\n       //row in table was selected. \n       int rowId = param[1].asInt();\n   }\n   if (cmd == \"deselect\") {\n       //row in table was deselected. \n       int rowId = param[1].asInt();\n   }\n   if (cmd == \"order\") {\n       //rows in table where reodered\n       int oldRowIndex = param[1].asInt();\n       int newRowIndex = param[2].asInt();\n   }\n}\n```\n\n**Note:** Max number of rows in the table is 100. When you reach the limit, table will work as FIFO (First In First Out) list.\nThis limit can be changed by configuring ```table.rows.pool.size``` property for Local Server.\n\n**Sketch:** [Simple Table usage](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Table/Table_Simple/Table_Simple.ino)\n\n**Sketch:** [Advanced Table usage](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Table/Table_Advanced/Table_Advanced.ino)\n\n### Device Selector\n\nDevice selector is a powerful widget which allows you to update widgets based on one active device. This widget is particlularly helpful when you have a fleet of devices with similar functionality.\n\nImagine you have 4 devices and every device has a Temperature & Humidity sensor connected to it. To display the data for all 4 devices you would need to add 8 widgets.\n\nWith Device Selector, you can use only 2 Widgets which will display Temperature and Humidity based on the active device chosen in Device Selector.  \n\nAll you have to do is:\n\n1. Add Device Selector Widget to the project\n2. Add 2 widgets (for example Value Display Widget) to show Temperature and Humidity\n3. In Widgets Settings you will be able assign them to Device Selector (Source or Target section)\n4. Exit settings, Run the project. \n\nNow you can change the active device in Device Selector and you will see that Temperature and Humidity values are reflecting the data updates for the device you just picked.\n\n**NOTE:** Webhook Widget will not work with Device Selector (yet).\n\n### Device Tiles\n\nDevice tiles is a powerful widget and very similar to the device selector widget, but with UI.\nIt allows you to display 1 pin per device per tile. \nThis widget is particularly helpful when you have a fleet of devices with similar functionality. So you can \ngroup similar devices within one layout (template).\n\n## Sensors \n\n### Accelerometer\n\nAccelerometer is kind of [motion sensors](https://developer.android.com/guide/topics/sensors/sensors_motion.html) \nthat allows you to detect motion of your smartphone. \nUseful for monitoring device movement, such as tilt, shake, rotation, or swing. \nConceptually, an acceleration sensor determines the acceleration that is applied to a device by measuring the forces \nthat are applied to the sensor. Measured in ```m/s^2``` applied to ```x```, ```y```, ```z``` axis.\n\nIn order to accept data from it you need to: \n\n```cpp\nBLYNK_WRITE(V1) {\n  //acceleration force applied to axis x\n  int x = param[0].asFloat(); \n  //acceleration force applied to axis y\n  int y = param[1].asFloat();\n  //acceleration force applied to axis y\n  int z = param[2].asFloat();\n}\n```\n\nAccelerometer doesn't work in background.\n\n### Barometer/pressure\n\nBarometer/pressure is kind of [environment sensors](https://developer.android.com/guide/topics/sensors/sensors_environment.html) \nthat allows you to measure the ambient air pressure.\n\nMeasured in in ```hPa``` or ```mbar```.\n\nIn oder to accept data from it you need to: \n\n```cpp\nBLYNK_WRITE(V1) {\n  //pressure in mbar\n  int pressure = param[0].asInt(); \n}\n```\n\nBarometer doesn't work in background.\n\n### Gravity\n\nGravity is kind of [motion sensors](https://developer.android.com/guide/topics/sensors/sensors_motion.html) \nthat allows you to detect motion of your smartphone. \nUseful for monitoring device movement, such as tilt, shake, rotation, or swing. \n\nThe gravity sensor provides a three dimensional vector indicating the direction and magnitude of gravity. \nMeasured in ```m/s^2``` of gravity force applied to ```x```, ```y```, ```z``` axis.\n\nIn oder to accept data from it you need to: \n\n```cpp\nBLYNK_WRITE(V1) {\n  //force of gravity applied to axis x\n  int x = param[0].asFloat(); \n  //force of gravity applied to axis y\n  int y = param[1].asFloat();\n  //force of gravity applied to axis y\n  int z = param[2].asFloat();\n}\n```\n\nGravity doesn't work in background.\n\n### Humidity\n\nHumidity is kind of [environment sensors](https://developer.android.com/guide/topics/sensors/sensors_environment.html) \nthat allows you to measure ambient relative humidity.\n\nMeasured in ```%``` - actual relative humidity in percent.\n\nIn oder to accept data from it you need to: \n\n```cpp\nBLYNK_WRITE(V1) {\n  // humidity in %\n  int humidity = param.asInt();\n}\n```\n\nHumidity doesn't work in background.\n\n### Light\n\nLight is kind of [environment sensors](https://developer.android.com/guide/topics/sensors/sensors_environment.html) \nthat allows you to measure level of light (measures the ambient light level (illumination) in lx).\nIn phones it is used to control screen brightness.\n\nIn order to accept data from it you need to: \n\n```cpp\nBLYNK_WRITE(V1) {\n  //light value\n  int lx = param.asInt(); \n}\n```\n\nLight doesn't work in background.\n\n### Proximity\n\nProximity is kind of [position sensors](https://developer.android.com/guide/topics/sensors/sensors_position.html) \nthat allows you to determine how close the face of a smartphone is to an object.\nMeasured in ```cm``` - distance from phone face to object. However most of this sensors returns only FAR / NEAR information.\nSo return value will be ```0/1```. Where 0/LOW  is ```FAR``` and 1/HIGH is ```NEAR```.\n\nIn order to accept data from it you need to: \n\n```cpp\nBLYNK_WRITE(V1) {\n  // distance to object\n  int proximity = param.asInt();\n  if (proximity) {\n     //NEAR\n  } else {\n     //FAR\n  }\n}\n```\n\nProximity doesn't work in background.\n\n### Temperature\n\nTemperature is kind of [environment sensors](https://developer.android.com/guide/topics/sensors/sensors_environment.html) \nthat allows you to measure ambient air temperature.\nMeasured in ```°C``` - celcius.\n\nIn order to accept data from it you need to: \n\n```cpp\nBLYNK_WRITE(V1) {\n  // temperature in celcius\n  int celcius = param.asInt();\n}\n```\n\nTemperature doesn't work in background.\n\n### GPS Trigger\n\nGPS trigger widget allows easily trigger events when you arrive to or leave from some destination. This widget \nwill work in background and periodically will check your coordinates. In case your location is within/out required \nradius (selected on widget map) widget will send ```HIGH```/```LOW``` command to hardware. For example, let's assume you have \nGPS Trigger widget assigned to pin ```V1``` and option ```Trigger When Enter```. In that case when you'll arrive to destination \npoint widget will trigger ```HIGH``` event.\n\n```cpp\nBLYNK_WRITE(V1) {\n  int state = param.asInt();\n  if (state) {\n      //You enter destination\n  } else {\n      //You leave destination\n  }\n}\n```\n\nMore details on how GPS widget works you can read [here](https://developer.android.com/guide/topics/location/strategies.html).\n\nGPS trigger widget works in background.\n\n### GPS Streaming\n\nUseful for monitoring smartphone location data such as latitude, longitude, altitude and speed (speed could be often 0  \nin case smartphone doesn't support it).\n\nIn order to accept data from this widget you need to: \n\n```cpp\nBLYNK_WRITE(V1) {\n  float latitude = param[0].asFloat(); \n  float longitude = param[1].asFloat();\n  float altitude = param[2].asFloat();\n  float speed = param[3].asFloat();\n}\n```\n\nor you can use prepared wrapper ```GpsParam```:\n\n```cpp\nBLYNK_WRITE(V1) {\n  GpsParam gps(param);\n  // Print 6 decimal places for Lat\n  Serial.println(gps.getLat(), 7);\n  Serial.println(gps.getLon(), 7);\n  \n  Serial.println(gps.getAltitude(), 2);\n  Serial.println(gps.getSpeed(), 2);\n}\n```\n\nGPS Streaming works in background.\n\n**Sketch:** [GPS Stream](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/GPS_Stream/GPS_Stream.ino)\n\n## Other\n\n### Bridge\n\nBridge can be used for Device-to-Device communication (no app. involved). You can send digital/analog/virtual write commands from one device to another, knowing it's auth token.\nAt the moment Bridge widget is not required on application side (it is mostly used for indication that we have such feature).  \n**You can use multiple bridges to control multiple devices.**\n\n<img src=\"images/bridge.png\" style=\"width: 77px; height:80px\"/>\n\nBridge widget takes a virtual pin, and turns it into a channel to control another device. It means you can control any virtual, digital or analog pins of the target device.\nBe careful not to use pins like ```A0, A1, A2 ...``` when communicating between different device types, as Arduino Core may refer to wrong pins in such cases.\n\n\nExample code for device A which will send values to device B:\n```cpp\nWidgetBridge bridge1(V1); //Initiating Bridge Widget on V1 of Device A\n...\nvoid setup() {\n    Blynk.begin(...);\n    while (Blynk.connect() == false) {\n        // Wait until Blynk is connected\n    }\n    bridge1.digitalWrite(9, HIGH); // will trigger D9 HIGH on Device B. No code on Device B required\n    bridge1.analogWrite(10, 123);\n    bridge1.virtualWrite(V1, \"hello\"); // you need to write code on Device B in order to receive this value. See below\n    bridge1.virtualWrite(V2, \"value1\", \"value2\", \"value3\");\n}\n\nBLYNK_CONNECTED() {\n  bridge1.setAuthToken(\"OtherAuthToken\"); // Token of the hardware B\n}\n```\n\n**IMPORTANT:** when performing ```virtualWrite()``` with Bridge Widget, Device B would need to process the incoming data from Device A. \nFor example, if you are sending value from Device A to Device B using ```bridge.virtualWrite(V5)``` you would need to use this handler on Device B:\n\n```cpp\nBLYNK_WRITE(V5){\n    int pinData = param.asInt(); //pinData variable will store value that came via Bridge\n}\n```\n\nKeep in mind that ```bridge.virtualWrite``` doesn't send any value to mobile app. You need to call ```Blynk.virtualWrite``` for that.\n\n**Sketch:** [Bridge](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Bridge/Bridge.ino)\n\n### Eventor\nEventor widget allows you to create simple behaviour rules or **events**. \nLet's look at a typical use case: read temperature from DHT sensor and send push notification when the temperature is over a certain limit:  \n \n```cpp\n  float t = dht.readTemperature();\n  if (isnan(t)) {\n    return;\n  }\n  if (t > 40) {\n    Blynk.notify(String(\"Temperature is too high: \") + t);\n  }\n```\n\nWith Eventor you don't need to write this code. All you need is to send the value from the sensor to the server:\n\n```cpp\n  float t = dht.readTemperature();\n  Blynk.virtualWrite(V0, t);\n```\nDon't forget that ```virtualWrite``` commands should be wrapped in the timer and can't be used in the main loop.\n\nNow configure new **Event** in Eventor widget: \n\n<img src=\"images/eventor/eventor_for_temp_example.png\" style=\"width: 200px; height:360px\"/>\n\n**NOTE** Don't forget to add notification widget.\n\nEventor comes handy when you need to change conditions on the fly without re-uploading new sketch on \nthe hardware. You can create as many **events** as you need.\nEventor also could be triggered from the application side.\nYou just need to assign the widget to the same pin as your Event within Eventor.\nEventor doesn't constantly sends events. Let's consider simple event as above ```if (temperature > 40) send notification ```.\nWhen temperature goes beyond 40 threshold - notification action is triggered. If temperature continues to stay above the \n40 threshold no actions will be triggered. But if ```temperature``` goes below threshold and then passes it again -\nnotification will be sent again (there is no 5 sec limit on Eventor notifications).\n \nEventor also supports Timer events. For example, you can set a pin ```V1``` ON/HIGH at 21:00:00 every Friday.\nWith Eventor Time Event you can assign multiple timers on same pin, send any string/number, select days and timezone. \n\nIn order to remove created **event** please use swipe. You can also swipe out last element in the Event itself. \n\n**NOTE:** The timer widget rely on the server time and not your phone time. Sometimes the phone time may not match the server time. \n**NOTE:** Events are triggered only once when the condition is met. That's mean \n[chaining of events](https://community.blynk.cc/t/eventor-behavior-bug-feature/20962) is not possible (however, could be enabled for commercials).\n\n<img src=\"images/eventor/eventor_edit.png\" style=\"width: 200px; height:360px\"/>\n\n**Sketch:** [Eventor](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Eventor/Eventor.ino)\n\n\n**NOTE:**: Events are triggered only once when the condition is met. \nException:\nLet's consider simple event as above ```if (temperature > 40) send notification ```.\nWhen temperature goes beyond 40 threshold - notification action is triggered. If temperature continues to stay above the 40 threshold no actions will be triggered. But if ```temperature``` goes below threshold and then passes it again -\nnotification will be sent again (there is no 5 sec limit on Eventor notifications).\n\n### RTC\n\nReal-time clock allows you to get time from server. You can preselect any timezone on UI to get time on hardware in required locale. \nNo pin required for RTC widget.\n\n<img src=\"images/rtc_edit.png\" style=\"width: 200px; height:360px\"/>\n\n**Sketch:** [RTC](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/RTC/RTC.ino)\n\n### BLE\n\nWidget to enable Bluetooth Low Energy support. At the moment BLE widget requires \ninternet connection in order to login and load your profile. However this will be fixed soon. Also some Blynk \nwidgets are not supported within the BLE connection.\n\nBlynk currently supports a handful of different BLE modules. Please check sketches below.\n \n**Sketches:** [BLE](https://github.com/blynkkk/blynk-library/tree/master/examples/Boards_Bluetooth)\n\n### Bluetooth\n\nWidget to enable Bluetooth support. At the moment Bluetooth widget is supported only on Android and requires \ninternet connection to login and to load your profile. This will be fixed soon. Alsom some Blynk \nwidgets do not work within the Bluetooth connection.\n                                                                                              \nBlynk currently supports bunch of different modules. Please check sketches below.\n \n**Sketches:** [Bluetooth](https://github.com/blynkkk/blynk-library/tree/master/examples/Boards_Bluetooth)\n\n### Music Player\n\nSimple UI element with 3 buttons with common music player controls. Every button sends it's own command to hardware: \n```play```, ```stop```, ```prev```, ```next```.\n\nYou can change widget state within the app from hardware side with next commands:\n\n```\nBlynk.virtualWrite(Vx, “play”);\nBlynk.virtualWrite(Vx, “stop”);\n```\n\nYou can also change widget play/stop state with next code (equivalent to above commands): \n\n```Blynk.setProperty(V1, \"isOnPlay\", \"false\");```\n\n**Sketch:** [Music Player](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Player/Player.ino)\n\n### Webhook\n\nWebhook is a widget designed to communicate with 3rd party services. With Webhook widget you can send HTTP(S) requests to any 3rd party service or device that has HTTP(S) API (e.g. Philips Hue bulb). You can trigger 3-d party service with a single click of a button.\n\nAny `write` operation from hardware side will trigger Webhook Widget. You can also trigger webhook from Blynk app when a app widget is assigned to the same pin as Webhook. \n\nFor example, when you need to send data from your hardware not only to Blynk, but also to Thingspeak, you would need to write a long http request code like this (this is just an example, not a full sketch): \n\n```\nWiFiClient client;\nif (client.connect(\"api.thingspeak.com\", 80)) {\n    client.print(\"POST /update HTTP/1.1\\n\");\n    client.print(\"Host: api.thingspeak.com\\n\");\n    client.print(\"Connection: close\\n\");\n    client.print(\"X-THINGSPEAKAPIKEY: \" + apiKeyThingspeak1 + \"\\n\");\n    client.print(\"Content-Type: application/x-www-form-urlencoded\\n\");\n    client.print(\"Content-Length: \");\n    client.print(postStr.length());\n    client.print(\"\\n\\n\");\n    client.print(postStr);\n}\n```\n \nInstead, with Webhook widget you would only need to fill in these fields: \n\n<img src=\"images/webhook_settings.png\" style=\"width: 200px; height:360px\"/>\n\nAnd add this code on hardware side:  \n\n```\nBlynk.virtualWrite(V0, value);\n```\n\nwhere `V0` is pin assigned to the Webhook widget.\n\nUse standard Blynk placeholders for Pin Value in the body or URL, for example: \n\n```\nhttps://api.thingspeak.com/update?api_key=xxxxxx&field1=/pin/\n```\n\nor for the body\n\n```\n[\"/pin/\"]\n```\n\nWhen you need to send an array of values, you can refer to a specific index of the array value. Blynk Pin can hold an array of max 10 values: \n\n```/pin[0]/```,```/pin[1]/```, ```/pin[2]/```\n\nYou can also make GET requests from Blynk Server and get responses directly to your hardware.\n\nFor example, to get current weather from a 3rd party Weather service that uses an URL similar to this: \n```http://api.sunrise-sunset.org/json?lat=33.3823&lng=35.1856&date=2016-10-01```, you would need to put this URL in Webhook widget and assign it to ```V0``` pin.\n\nTo parse the response on the hardware side:  \n\n```\nBLYNK_WRITE(V0){\n  String webhookdata = param.asStr();\n  Serial.println(webhookdata);\n}\n```\n\nNow, every time there is a \"write\" command to ```V0``` pin (e.g. with ```Blynk.virtualWrite(V0, 1)``` from hardware or from app widget assigned to ```V0```),  ```BLYNK_WRITE(V0)``` construction will be triggered and processed.\n\n**NOTE:** Usually, 3rd party servers return long responses. You have to increase the maximum allowed message size your hardware can process. Modify this line in your firmware code:\n\n```#define BLYNK_MAX_READBYTES 1024```. Where ```1024``` - is maximum allowed message size.\n\n**NOTE:** Blynk Cloud has limitation for Webhook Widget - you can only send 1 request per second. This can be \n changed on a Local Server by changing ```webhooks.frequency.user.quota.limit```. Be careful with Webhooks, \n as many 3rd party services can't handle 1 req/sec, and you can be banned on some of them. \n For example, Thingspeak allows only 1 request per 15 seconds.\n \n **NOTE:** To avoid spamming,  Blynk Webhook feature has another limitation - if your Webhook requests fail 10 times in a row, Webhook Widget will be stopped. To resume it, you would need to open Widget Settings and re-save it. Failed request is a request that  doesn't return `200` or `302`.\n \n **NOTE:** Webhook widget may affect ```Blynk.syncAll()``` function when a returned response is large.  \n\n\n### Reports Widget\n\nFunction of Reports is to configure and customize data reports in CSV format. You can choose between one-time or continuous scheduled reports.\n\nAlso, within the Reports you can clear all the data collected by your devices.\n\nYou need to configure initial inputs in Edit mode, and then, in Play mode you will be able to customize reports.\n\n#### Edit mode. Data inputs configuration\n\nIn edit mode (when your project is stopped) you define the Datastreams you would like to later be included in reports.\nReports widget is  designed to work with the Device Tiles widget. If you don't use Device Tiles you can still select a single device or a group of devices as a source of data for reports.\n\nYou have to choose either Device Tiles or single / group of the devices for the report. You can't combine these 2 options.\n\n#### Play mode.\n\nAfter you added source devices and their Datastreams click Play button and click on the Reports button.\n\n### Customizing Reports.\n\nEvery Report option supposes it's own settings:\n\n```Report name``` - give your report a meaningful name.\n\n```Data source``` - select the Datastreams you would like to be included in reports.\n\n```Report Frequency``` - Defines how often reports will be sent. They can be one-time and scheduled.\n```one-time``` - will instantly generate report and send it to the email addresses specified. Click on the right icon to send it.\n\nScheduled reports can be sent ```daily```/```weekly```/```monthly```.\n\n ```At Time``` will set up a time of the day the report will be sent.\n ```Start```/```End``` specifies start and end date the reports will continue to be sent.\n\nFor Weekly Report you can select a day of the week when report should be sent.\nFor Monthly report you can choose whether to send report on the first or last day of the month.\n\n```Recipients``` - specify up to 5 email addresses.\n\n```Data resolution``` defines granularity of your reports. Supported granularities are: ```minute```, ```hourly``` and ```daily```.\nFor example, when you generate daily report with 1 minute granularity you'll get ```24 * 60 * 60```\npoints in your daily report for every selected Datastream.\n\n```Group data in reports by``` -  specify the output format of the CSV file(s).\n\n```Datastream``` you will get 1 CSV file for each Datastream.\n\n```Device``` you will get 1 CSV file per each device. Each file will contain all of the included Datastreams.\n\n```Report``` you will get 1 CSV file for all your devices and all your Datastreams.\n\n```Timezone correction``` - specify the time zone adjustment if you need to get report date and time adjusted to a specific time zone\n\n```Date and time format``` - defines the format of the timestamp field of your data. You can select ```2018-06-21 20:16:48```,\n```2018-06-21T20:16:48+03:00``` or other supported formats.\n\nThere is one specific ```Timestamp``` format - which reflects the difference between the current time and midnight, January 1, 1970 UTC measured in milliseconds.\n\nAfter the report is set up - click on \"OK\" button at the right upper corner. Your report is ready.\n\n\nOnce you configured the report you will see when is the ```Next``` report scheduled and also a schedule for this report.\n\nAfter the report was sent at least once, you can see when the ```Last``` report was sent.\n\n```Last``` label also contains the status regarding the report:\n\n- ```OK```: the report was generated and sent to the Recipients successfully;\n- ```No Data```: the report doesn't contain any data for the configured period;\n- ```Error```: something went wrong. Please contact the Blynk Team support;\n\nReports will be generated even if your project is not in active (Play) mode. However, inactive projects don't generate any data.\n\n**NOTE:** all reports are encoded in UTF-16. Please, make sure you selected UTF-16 as required \"Character set\" for your csv reader."
  },
  {
    "path": "amendments.md",
    "content": "# Blynk Amendments\n\n## Tell every maker about Blynk\n\nNo pressure. Just do it. Now.\n\n## Make your idea work without Blynk\n\nBlynk can be easily integrated in almost any project. But before that - make it work **without** it. After you are sure that you can get all the sensor data or can control things from the code – integrate Blynk and make it even more awesome.\n\n## Use search\n\nWe are always happy to chat and help, but remember - every time you ask the question that was answered many many times before that, Blynk Team is not building a new widget or new cool feature. So:\n\n* google before asking\n* use search on our forum, it works really well\n* check Instructables\n\n  **Always wrap your code**\n\n  Though shalt not post code without `wrapping it` \n\n"
  },
  {
    "path": "api/README.md",
    "content": "# HTTPs API\n\n"
  },
  {
    "path": "api/api_getlastweekdata.md",
    "content": "# Download Datastream Data\n\nTo get the device data for last week, use this API call:\n\n**API call:**\n\n```text\napi/external/getRawData?token=123&days=7, (from: now - 7 days, to: now)\n```\n\n**Response example:**\n\n```text\nresponse example\n```\n\n"
  },
  {
    "path": "api/events-api.md",
    "content": "# Events API\n\nTo trigger [Events](../product/events/) creation from hardware \\(or other sources\\) and render them on Timeline in Device profile pages on the web and in the mobile apps, use this API call:\n\n```text\n/external/api/logEvent?token={token}&code={event_name}\n```\n\n`event_name` should be taken from [Product Template Settings](../product/product-template-settings.md) &gt; [Events](../product/events/)\n\n\\*\\*\\*\\*\n\n**Options:** \n\nTo render custom description of the event on the Timeline, use `event_description` parameter\n\n`/external/api/logEvent?token={token}&code={event_name}&description={event_desciption}`\n\n\n\n&gt;&gt;IMAGE OF TIMELINE WITH EVENT DESCRIPTION \\(MOBILE AND WEB\\)\n\n"
  },
  {
    "path": "api/external_api.md",
    "content": "# Datastreams API\n\n## Hardware\n\nGet datastream value \\(via HTTP GET\\):\n\n* `/external/api/get?token={token}&pin={pin}`\n* `/external/api/get?token={token}&dataStreamId={id}`\n\nUpdate datastream value \\(via HTTP GET\\):\n\n* `/external/api/update?token={token}&pin={pin}&value={value}`\n* `/external/api/update?token={token}&dataStreamId={id}&value={value}`\n* `/external/api/update/property?token={token}&pin={pin}&{property}={value}`\n\n## Log event\n\n* `/external/api/logEvent?token={token}&code={event_name}`\n* `/external/api/logEvent?token={token}&code={event_name}&description={event_desciption}`\n\n"
  },
  {
    "path": "appexport.md",
    "content": "# App Export\n\n## Firmware for ESP8266, NodeMCU, BlynkBoard, etc.\n\n### Prepare development environment\n\n1. Install [Arduino IDE](https://www.arduino.cc/en/Main/Software)\n2. Install [Blynk Library](https://github.com/blynkkk/blynk-library/releases/latest) and restart Arduino IDE\n3. Install [ESP8266 core for Arduino](https://github.com/esp8266/Arduino#installing-with-boards-manager)\n4. For Windows / OS X, you may need to install USB-Serial drivers according to your converter:\n   * СP2102: [https://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx](https://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx) \n   * FTDI \\(FT232, etc\\): [http://www.ftdichip.com/Drivers/VCP.htm](http://www.ftdichip.com/Drivers/VCP.htm)\n   * _TODO: Link to drivers for CH340 and PL2303._\n5. If your board has a NeoPixel RGB LED, install [Adafruit NeoPixel](https://github.com/adafruit/Adafruit_NeoPixel) library from Library Manager\n\n### Build your Firmware\n\n1. Open our example in Arduino IDE: `File -> Examples -> Blynk -> Provisioning -> Blynk_ESP8266`\n2. Open `Settings.h` tab.\n3. Configure your firmware:\n   * `BOARD_NAME` - ...\n   * `BOARD_VENDOR` - ...\n   * `PRODUCT_WIFI_SSID` - ...\n\n### Upload firmare\n\n1. Select your board type: `Tools -> Board -> [Your Board]`\n2. Select your port: `Tools -> Port -> [...]`\n3. Verify and Upload!\n\nNote that for Blynk Board, you can select board type `NodeMCU 1.0`.\n\n"
  },
  {
    "path": "blynkfirmware.md",
    "content": "# Blynk Firmware\n\n## Configuration\n\n### Blynk.begin\\(\\)\n\nThe easiest way to configure Blynk is to use `Blynk.begin()`:\n\n```cpp\nBlynk.begin(auth, ...);\n```\n\nIt has multiple parameters for different hardware models and it also depends on the type of connection. Follow the example sketches for your specific hardware model.\n\nWhat happens inside of `Blynk.begin()` function:\n\n1. Connection to the network \\(WiFi, Ethernet, ...\\)\n2. Call of `Blynk.config(...)` to set Auth Token, Server Address, etc.\n3. Attempts to connect to the server once \\(can block for more than 30s\\)\n\nIf your shield/connection type is not supported yet - you can implement it by yourself. [Here are some examples](https://github.com/blynkkk/blynk-library/tree/master/examples/More/ArduinoClient).\n\n### Blynk.config\\(\\)\n\n`config()` allows you to manage network connection. You can set up your connection type \\(WiFi, Ethernet, ...\\) by yourself, and then call:\n\n```cpp\nBlynk.config(auth, server, port);\n```\n\nor just\n\n```cpp\nBlynk.config(auth);\n```\n\n**NOTE: After `Blynk.config(...)` is called, your hardware is not yet connected to the server.** It will try to connect while until it hits first instance of `Blynk.run()` or `Blynk.connect()`routine.  \nTo skip connecting to the server or to disconnect manually, call `Blynk.disconnect()` after configuration.\n\nUse `connectWiFi` to conveniently set up WiFi connection:\n\n```cpp\nBlynk.connectWiFi(ssid, pass);\n```\n\nTo connect to open WiFi networks, set pass to an empty string \\(`\"\"`\\).\n\n## Connection management\n\nThere are several functions to help with connection management:\n\n### Blynk.connect\\(\\)\n\nThis functions will continue trying to connect to Blynk server. Returns `true` when connected, `false` if timeout have been reached. Default timeout is 30 seconds.\n\n```cpp\nbool result = Blynk.connect();\nbool result = Blynk.connect(timeout);\n```\n\n### Blynk.disconnect\\(\\)\n\nDisconnects hardware from Blynk server:\n\n```cpp\nBlynk.disconnect();\n```\n\n### Blynk.connected\\(\\)\n\nReturns `true` when hardware is connected to Blynk Server, `false` if there is no active connection to Blynk server.\n\n```cpp\nbool result = Blynk.connected();\n```\n\n### Blynk.run\\(\\)\n\nThis function should be called frequently to process incoming commands and perform housekeeping of Blynk connection. It is usually called in `void loop() {}`.\n\nThis command can be initiated it in other places of your code unless you run out of heap memory \\(in the cascaded functions with local memory\\).\n\nFor example, it is not recommended to call `Blynk.run()` inside of the `BLYNK_READ` and `BLYNK_WRITE` functions on low-RAM devices.\n\n## Digital & Analog pins control\n\nBlynk library can perform basic pin IO \\(input-output\\) operations out-of-the-box:\n\n```text\ndigitalRead\ndigitalWrite\nanalogRead\nanalogWrite (PWM or Analog signal depending on the platform)\n```\n\nNo need to write code for simple things like LED, Relay control and analog sensors. Just choose a corresponding Pin in Blynk app and control it directly with no additional code\n\n## Virtual pins control\n\nVirtual Pins is a way to exchange any data between your hardware and Blynk app. Think about Virtual Pins as channels for sending any data. Make sure you differentiate Virtual Pins from physical GPIO pins on your hardware. Virtual Pins have no physical representation.\n\nVirtual Pins are commonly used to interface with other libraries \\(Servo, LCD and others\\) and implement custom logic. The device can send data to the App using `Blynk.virtualWrite(pin, value)` and receive data from the App using `BLYNK_WRITE(vPIN)`. Read below\n\n#### Virtual Pin data types\n\nAll Virtual Pin values are always sent as Strings and there are no practical limits on the data that can be sent.  \nHowever, there are certian limitations on the hardware side when dealing with numbers. For example, the integer on Arduino is 16-bit, allowing range -32768 to 32767.\n\nTo interpret incoming data as Integers, Floats, Doubles and Strings use:\n\n```cpp\nparam.asInt();\nparam.asFloat();\nparam.asDouble();\nparam.asStr();\n```\n\nYou can also get the RAW data from the param buffer:\n\n```cpp\nparam.getBuffer()\nparam.getLength()\n```\n\n### Blynk.virtualWrite\\(vPin, value\\)\n\n**NOTE: Use BlynkTimer when you use this command to send data. Otherwise your hardware will be disconnected from the server**\n\nSend data in various formats to Virtual Pins.\n\n```cpp\n// Send string\nBlynk.virtualWrite(pin, \"abc\");\n\n// Send integer\nBlynk.virtualWrite(pin, 123);\n\n// Send float\nBlynk.virtualWrite(pin, 12.34);\n\n// Send multiple values as an array\nBlynk.virtualWrite(pin, \"hello\", 123, 12.34);\n\n// Send RAW data\nBlynk.virtualWriteBinary(pin, buffer, length);\n```\n\nCalling `virtualWrite` attempts to send the value to the network immediately.\n\n**Note:** For virtual pins with numbers &gt; 127, the `V128` syntax is not available.  \nPlease use plain virtual pin number, for example:\n\n```cpp\nBlynk.virtualWrite(128, \"abc\");\n```\n\n## BlynkTimer\n\nIt's important to send data in intervals and keep the void loop\\(\\) as clean as possible.\n\n`BlynkTimer` allows you to send data periodically with given intervals not interfering with Blynk library routines `Blynk Timer` inherits [SimpleTimer Library](http://playground.arduino.cc/Code/SimpleTimer), a well known and widely used library to time multiple events on hardware. `BlynkTimer` is included in Blynk library by default and there is no need to install SimpleTimer separately or include `SimpleTimer.h`\n\n* A single `BlynkTimer` object allows to schedule up to 16 timers\n* Improved compatibility with boards like `Arduino 101`, `Intel Galileo`, etc.\n* When a timer struggles to run multiple times \\(due to a blocked `loop`\\), it just skips all the missed intervals, and calls your function only once. This differs from `SimpleTimer`, which could call your function multiple times in this scenario.\n\nFor more information on timer usage, please see: [http://playground.arduino.cc/Code/SimpleTimer](http://playground.arduino.cc/Code/SimpleTimer)  \nAnd here is a BlynkTimer [example sketch](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushData/PushData.ino#L30).\n\nPlease also remember that a single `BlynkTimer` can schedule many timers, so most probably you need only one instance of BlynkTimer in your sketch.\n\n### BLYNK\\_WRITE\\(vPIN\\)\n\n`BLYNK_WRITE` is a function called every time device gets an update of Virtual Pin value from the server \\(or app\\):\n\nTo read the received data use:\n\n```cpp\nBLYNK_WRITE(V0)\n{   \n  int value = param.asInt(); // Get value as integer\n\n  // The param can contain multiple values, in such case:\n  int x = param[0].asInt();\n  int y = param[1].asInt();\n}\n```\n\n**`BLYNK_WRITE` can't be used inside of any loop or function. It's a standalone function.**\n\n**Note:** For virtual pins with numbers &gt; 127, please use `BLYNK_WRITE_DEFAULT()` API\n\n### BLYNK\\_READ\\(vPIN\\)\n\n`BLYNK_READ` is function called when device is requested to send it's current value of Virtual Pin to the server. Normally, this function should contain `Blynk.virtualWrite` call\\(s\\).\n\n```cpp\nBLYNK_READ(V0)\n{\n  Blynk.virtualWrite(V0, newValue);\n}\n```\n\n**Note:** For virtual pins with numbers &gt; 127, please use `BLYNK_READ_DEFAULT()` API\n\n### BLYNK\\_WRITE\\_DEFAULT\\(\\)\n\nRedefines the handler for all pins that are not covered by custom `BLYNK_WRITE` functions.\n\n```cpp\nBLYNK_WRITE_DEFAULT()\n{\n  int pin = request.pin;      // Which exactly pin is handled?\n  int value = param.asInt();  // Use param as usual.\n}\n```\n\n### BLYNK\\_READ\\_DEFAULT\\(\\)\n\nRedefines the handler for all pins that are not covered by custom `BLYNK_READ` functions.\n\n```cpp\nBLYNK_READ_DEFAULT()\n{\n  int pin = request.pin;      // Which exactly pin is handled?\n  Blynk.virtualWrite(pin, newValue);\n}\n```\n\n### BLYNK\\_CONNECTED\\(\\)\n\nUse this function when you need to run certain routine when hardware connects to Blynk Cloud or private server. It's common to call sync functions inside of this function.\n\n```cpp\nBLYNK_CONNECTED() {\n// Your code here\n}\n```\n\n### BLYNK\\_APP\\_CONNECTED\\(\\)\n\nThis function is called every time Blynk app client connects to Blynk server.\n\n```cpp\nBLYNK_APP_CONNECTED() {\n// Your code goes here\n}\n```\n\n**Note: Ennable this feature in Project Settings first:**\n\n![](.gitbook/assets/app_connected_setting.png)\n\n[Example](https://github.com/blynkkk/blynk-library/blob/master/examples/More/AppConnectedEvents/AppConnectedEvents.ino)\n\n### BLYNK\\_APP\\_DISCONNECTED\\(\\)\n\nThis function is called every time the Blynk app disconnects from Blynk Cloud or private server.\n\n```cpp\nBLYNK_APP_DISCONNECTED() {\n// Your code here\n}\n```\n\n**Note: Enable this feature in Project Settings first:**\n\n![](.gitbook/assets/app_connected_setting.png)\n\n[Example](https://github.com/blynkkk/blynk-library/blob/master/examples/More/AppConnectedEvents/AppConnectedEvents.ino)\n\n### Blynk.syncAll\\(\\)\n\nRequests all stored on the server latest values for all widgets. All analog/digital/virtual pin values and states will be set to the latest stored value. Every virtual pin will generate BLYNK\\_WRITE\\(\\) event.\n\n```cpp\nBLYNK_CONNECTED() {\n    Blynk.syncAll();\n}\n```\n\n### Blynk.syncVirtual\\(vPin\\)\n\nThis command updates individual Virtual Pin to the latest stored value on the server. When it's used, a corresponding `BLYNK_WRITE` handler is called.\n\n```cpp\nBlynk.syncVirtual(V0);\n```\n\nTo update multiple pins, use:\n\n```text\nBlynk.syncVirtual(V0, V1, V6, V9, V16);\n```\n\n### Blynk.setProperty\\(vPin, \"property\", value\\)\n\nThis command allows [changing widget properties](blynkfirmware.md#blynk-main-operations-change-widget-properties)\n\n## Debugging\n\n### \\#define BLYNK\\_PRINT\n\n### \\#define BLYNK\\_DEBUG\n\nTo enable debug prints on the default Serial port add on the top of your sketch **IMPORTANT: This should be the first line in your code**:\n\n```cpp\n#define BLYNK_PRINT Serial // Defines the object that is used for printing\n#define BLYNK_DEBUG        // Optional, this enables more detailed prints\n```\n\nThen enable Serial Output in setup\\(\\):\n\n```cpp\nSerial.begin(9600);\n```\n\nOpen Serial Monitor and you'll see the debug prints.\n\nYou can also use spare Hardware serial ports or SoftwareSerial for debug output \\(you will need an adapter to connect to it with your PC\\).\n\n**WARNING:** Enabling `BLYNK_DEBUG` will slowdown your hardware processing speed up to 10 times!\n\n### BLYNK\\_LOG\\(\\)\n\nWhen `BLYNK_PRINT` is defined, you can use `BLYNK_LOG` to print your logs. The usage is similar to `printf`:\n\n```cpp\nBLYNK_LOG(\"This is my value: %d\", 10);\n```\n\nOn some platforms \\(like Arduino 101\\) the `BLYNK_LOG` may be unavailable, or may just use too much resources.  \nIn this case you can use a set of simpler log functions:\n\n```cpp\nBLYNK_LOG1(\"Hello World\"); // Print a string\nBLYNK_LOG1(10);      // Print a number\nBLYNK_LOG2(\"This is my value: \", 10); // Print 2 values\nBLYNK_LOG4(\"Temperature: \", 24, \" Humidity: \", 55); // Print 4 values\n...\n```\n\n## Minimizing footprint\n\nTo minimize the program Flash/RAM, you can disable some of the built-in functionality:\n\n1. Comment-out `#define BLYNK_PRINT` to remove prints\n2. Put on the top of your sketch:\n\n   ```text\n   #define BLYNK_NO_BUILTIN   // Disable built-in analog & digital pin operations\n   #define BLYNK_NO_FLOAT     // Disable float operations\n   ```\n\n## Porting, hacking\n\nIf you want to dive into crafting/hacking/porting Blynk library implementation, please also check [this documentation](https://github.com/blynkkk/blynk-library/tree/master/extras/docs).\n\n"
  },
  {
    "path": "blynkmainoperations.md",
    "content": "# Blynk main operations\n\n## Virtual Pins\n\nBlynk can control Digital and Analog I/O Pins on you hardware directly. You don't even need to write code for it. It's great for blinking LEDs, but often it's just not enough...\n\nWe designed Virtual Pins to send **any** data from your microcontroller to the Blynk App and back.\n\nAnything you connect to your hardware will be able to talk to Blynk. With Virtual Pins you can send something from the App, process it on microcontroller and then send it back to the smartphone. You can trigger functions, read I2C devices, convert values, control servo and DC motors etc.\n\nVirtual Pins can be used to interface with external libraries \\(Servo, LCD and others\\) and implement custom functionality.\n\nHardware may send data to the Widgets over the Virtual Pin like this:\n\n```cpp\nBlynk.virtualWrite(pin, \"abc\");\nBlynk.virtualWrite(pin, 123);\nBlynk.virtualWrite(pin, 12.34);\nBlynk.virtualWrite(pin, \"hello\", 123, 12.34);\n```\n\nFor more information about virtual pins, [read this](./#blynk-firmware-virtual-pins-control)\n\n## Send data from app to hardware\n\nYou can send any data from Widgets in the app to your hardware.\n\nAll [Controller Widgets](./#widgets-controllers) can send data to Virtual Pins on your hardware. For example, code below shows how to get values from the Button Widget in the App\n\n```cpp\nBLYNK_WRITE(V1) //Button Widget is writing to pin V1\n{\n  int pinData = param.asInt(); \n}\n```\n\nWhen you press a Button, Blynk App sends `1` On the second click - it sends `0`\n\nThis is how Button Widget is set up:\n\n![](.gitbook/assets/button_virtual_1.png)\n\nFull example sketch: [Get Data](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/GetData/GetData.ino#L24)\n\n### Sending array from Widget\n\nSome Widgets \\(e.g Joystick, zeRGBa\\) have more than one output.\n\n![](.gitbook/assets/joystick_merge_mode.png)\n\nThis output can be written to Virtual Pin as an array of values. On the hardware side - you can get any element of the array \\[0,1,2...\\] by using:\n\n```cpp\nBLYNK_WRITE(V1) // Widget WRITEs to Virtual Pin V1\n{   \n  int x = param[0].asInt(); // getting first value\n  int y = param[1].asInt(); // getting second value\n  int z = param[N].asInt(); // getting N value\n}\n```\n\n**Sketch:** [JoystickTwoAxis](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/JoystickTwoAxis/JoystickTwoAxis.ino#L24)\n\n## Get data from hardware\n\nThere are two ways of pushing data from your hardware to the Widgets in the app over Virtual Pins.\n\n### Perform requests by Widget\n\n* Using Blynk built-in reading frequency while App is active by setting 'Reading Frequency' parameter to some interval:\n\n![](.gitbook/assets/frequency_reading_pull.png)\n\n```cpp\nBLYNK_READ(V5) // Widget in the app READs Virtal Pin V5 with the certain frequency\n{\n  // This command writes Arduino's uptime in seconds to Virtual Pin V5\n  Blynk.virtualWrite(5, millis() / 1000);\n}\n```\n\n**Sketch:** [PushDataOnRequest](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushDataOnRequest/PushDataOnRequest.ino#L26)\n\n### Pushing data from hardware\n\nIf you need to PUSH sensor or other data from your hardware to Widget, you can write any logic you want. Just set the frequency to PUSH mode. Any command that hardware sends to Blynk Cloud is automatically stored on server and you get this info either with [History Graph](./#widgets-displays-superchart) widget or with [HTTP API](http://docs.blynkapi.apiary.io/#reference/0/pin-history-data/get-all-history-data-for-specific-pin).\n\n![](.gitbook/assets/frequency_reading_push.png)\n\nWe recommend sending data in intervals and avoiding [Flood Error](https://docs.blynk.cc/#troubleshooting-flood-error). You can use timers like [BlynkTimer](./#blynk-firmware-blynktimer). Please read instructions inside this [example sketch](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushData/PushData.ino) for more details.\n\nHere is how it can work:\n\n```cpp\n#include <SPI.h>\n#include <Ethernet.h>\n#include <BlynkSimpleEthernet.h>\n\nchar auth[] = \"YourAuthToken\"; // Put your token here\n\nBlynkTimer timer; // Create a Timer object called \"timer\"! \n\nvoid setup()\n{\n  Serial.begin(9600);\n  Blynk.begin(auth);\n\n  timer.setInterval(1000L, sendUptime); //  Here you set interval (1sec) and which function to call \n}\n\nvoid sendUptime()\n{\n  // This function sends Arduino up time every 1 second to Virtual Pin (V5)\n  // In the app, Widget's reading frequency should be set to PUSH\n  // You can send anything with any interval using this construction\n  // Don't send more that 10 values per second\n\n  Blynk.virtualWrite(V5, millis() / 1000);\n}\n\nvoid loop()\n{\n  Blynk.run(); // all the Blynk magic happens here\n  timer.run(); // BlynkTimer is working...\n}\n```\n\n**Sketch:** [PushData](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushData/PushData.ino#L30)\n\n## State syncing\n\n### For hardware\n\nIf your hardware looses Internet connection or resets, you can restore all the values from Widgets in the Blynk app.\n\n```cpp\nBLYNK_CONNECTED() {\n    Blynk.syncAll();\n}\n\n//here handlers for sync command\nBLYNK_WRITE(V0) {\n   ....\n}\n```\n\nThe `Blynk.syncAll()` command restores all the Widget's values based on the last saved values on the server. All analog and digital pin states will be restored. Every Virtual Pin will perform `BLYNK_WRITE` event.\n\n**WARNING**: if pin is empty and wasn't initialized - hardware will not get any response for those pin during sync.\n\n[Sync Hardware with App state](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/HardwareSyncStateFromApp/HardwareSyncStateFromApp.ino)\n\nYou can also update a single Virtual Pin value by calling `Blynk.syncVirtual(V0)` or you can update several pins with `Blynk.syncVirtual(V0, V1, V2, ...)`.\n\nYou can also use server to store any value without widget. Just call `Blynk.virtualWrite(V0, value)`.\n\n[Storing single value on server](https://github.com/blynkkk/blynk-library/blob/master/examples/More/ServerAsDataStorage/ServerAsDataStorage_SingleValue/ServerAsDataStorage_SingleValue.ino)\n\n[Storing multiple values on server](https://github.com/blynkkk/blynk-library/blob/master/examples/More/ServerAsDataStorage/ServerAsDataStorage_MultiValue/ServerAsDataStorage_MultiValue.ino)\n\n### For app\n\nIf you need to keep your hardware in sync with Widgets' state even if app is offline use `Blynk.virtualWrite`.\n\nImagine you have a LED Widget connected to the Virtual Pin V1 in the app, and a physical button attached to your hardware. When you press a physical button, you would expect to see updated state of the LED Widget in the app. To achieve that you need to send `Blynk.virtualWrite(V1, 255)` when a physical button gets pressed.\n\n[Represent physical button state via LED widget with interrupts](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonInterrupt/ButtonInterrupt.ino)\n\n[Represent physical button state via LED widget with polling](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonPoll/ButtonPoll.ino)\n\n[Represent physical button state via Button widget with polling](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/SyncPhysicalButton/SyncPhysicalButton.ino)\n\n## Control of multiple devices\n\nBlynk app has support of multiple devices. That means you can assign any widget to specific device with own auth token. For example - you may have button on V1 that controls wi-fi bulb A and another button on V1 that controls wi-fi bulb B. In order to do this you need more than 1 device within your project. To achieve this please go to project settings and click on \"Devices\" section :\n\n![](.gitbook/assets/new_project_settings.png)\n\nYou'll see list of devices :\n\n![](.gitbook/assets/list_of_devices.png)\n\nSo you can add new device :\n\n![](.gitbook/assets/new_device%20%281%29.png)\n\nAfter above steps, every widget will have one more field \"Target\" :\n\n![](.gitbook/assets/widget_settings_devices.png)\n\nNow you need to assign widget to device and after that widget will control only this specific device.\n\nThat's it! Now you need to upload sketches with correct Auth Tokens to your hardware.\n\n### Tags\n\nTags feature allows you to group multiple devices. Tags are very useful in case you want to control few devices with 1 widget. For example, imagine a case when you have 3 smart bulbs and you want to turn on all those bulbs with one single click. You need to assign 3 devices to 1 tag and assign tag to button. That's it.\n\nTag widgets also support state syncing. So you can get state of widget from your hardware. However you can't update state of such widgets from hardware.\n\n## Devices online status\n\nBlynk app has support for online statuses for multiple devices.\n\n![](.gitbook/assets/online_status.png)\n\nIn ideal world when device closes tcp connection with some `connection.close()` - connected server will get notification regarding closed connection. So you can get instant status update on UI. However in real world this mostly exceptional situation. In majority of cases there is no easy and instant way to find out that connection is not active anymore.\n\nThat's why Blynk uses `HEARTBEAT` mechanism. With this approach hardware periodically sends `ping` command with predefined interval \\(10 seconds by default, `BLYNK_HEARTBEAT` [property](https://github.com/blynkkk/blynk-library/blob/master/src/Blynk/BlynkConfig.h)\\). In case hardware don't send anything within 10 seconds server waits additional 5 seconds and after that connection assumed to be broken and closed by server. So on UI you'll see connection status update only after 15 seconds when it is actually happened.\n\nYou can also change `HEARTBEAT` interval from hardware side via `Blynk.config`. In that case `newHeartbeatInterval * 2.3` formula will be applied. So in case you you decided to set `HEARTBEAT` interval to 5 seconds. You'll get notification regarding connection with 11 sec delay in worst case.\n\n## Project Settings\n\nEvery project has it's own settings:\n\n* **Theme** - switch between the Light and Black Blynk Theme \\(Business accounts have wider choice\\);\n* **Keep screen always on** - allows you to use the Blynk app without going to the sleep mode \\(usually all mobile devices do that\\);\n* **Send app connected command** - with this option enabled the server will send \"App Connected\" and \"App Disconnected\" commands \n\n  to your hardware when your Blynk app goes online/offline. [Usage example](https://github.com/blynkkk/blynk-library/blob/master/examples/More/AppConnectedEvents/AppConnectedEvents.ino);\n\n* **Do not show offline notifications** - right now, for debugging purposes, every time your hardware goes offline - the Blynk \n\n  Server will notify you with popup in the app about that. However, when debugging is not needed or the Blynk app is used only \n\n  via HTTP/S this notifications are meaningless. So this switch allows you to turn off this popups. Also this switch turns off \n\n  the Push notification \"Notify when offline\" option.\n\n## Change Widget properties\n\nChanging some of the widget properties from hardware side is also supported.  \nFor example, you can change the color of LED widget based on a condition:\n\n```text\n//change LED color\nBlynk.setProperty(V0, \"color\", \"#D3435C\");\n\n//change LED label\nBlynk.setProperty(V0, \"label\", \"My New Widget Label\");\n\n//change MENU labels\nBlynk.setProperty(V0, \"labels\", \"Menu Item 1\", \"Menu Item 2\", \"Menu Item 3\");\n```\n\n[Set Property for single value field](https://github.com/blynkkk/blynk-library/blob/master/examples/More/SetProperty/SetProperty_SingleValue/SetProperty_SingleValue.ino)\n\n[Set Property for multi value field](https://github.com/blynkkk/blynk-library/blob/master/examples/More/SetProperty/SetProperty_MultiValue/SetProperty_MultiValue.ino)\n\n**NOTE :**  Changing these parameters work **only** for widgets attached to Virtual pins \\(analog/digital pins won't work\\).\n\nFour widget properties are supported - `color`, `label`, `min`, `max` for all widgets :\n\n`label` is string for label of all widgets.\n\n`color` is string in [HEX](http://www.w3schools.com/html/html_colors.asp) format \\(in the form: \\#RRGGBB, where RR \\(red\\), GG \\(green\\) and BB \\(blue\\) are hexadecimal values between 00 and FF\\). For example :\n\n```text\n#define BLYNK_GREEN     \"#23C48E\"\n#define BLYNK_BLUE      \"#04C0F8\"\n#define BLYNK_YELLOW    \"#ED9D00\"\n#define BLYNK_RED       \"#D3435C\"\n#define BLYNK_DARK_BLUE \"#5F7CD8\"\n```\n\n`min`, `max` - minimum and maximum values for the widget \\(for example range for the Slider\\). This numbers may be float.\n\nOn firmware side, widget objects also support `setLabel()` and `setColor()` functions.\n\nWidget specific properties:\n\n**Button**\n\n`onLabel` / `offLabel` is string for ON/OFF label of button;\n\n**Styled Button**\n\n`onLabel` / `offLabel` is string for ON/OFF label of button;\n\n`onColor` / `offColor` is string in HEX format for ON/OFF colors of the button;\n\n`onBackColor` / `offBackColor` is string in HEX format for ON/OFF colors of the button background.\n\n**Music Player**\n\n`isOnPlay` is boolean accepts true/false.\n\n```text\nBlynk.setProperty(V0, \"isOnPlay\", \"true\");\n```\n\n**Menu**\n\n`labels` is list of strings for Menu widget selections;\n\n```text\nBlynk.setProperty(V0, \"labels\", \"label 1\", \"label 2\", \"label 3\");\n```\n\n**Video Streaming**\n\n```cpp\nBlynk.setProperty(V1, \"url\", \"http://my_new_video_url\");\n```\n\n**Step**\n\n```cpp\nBlynk.setProperty(V1, \"step\", 10);\n```\n\n**Image**\n\n```cpp\nBlynk.setProperty(V1, \"opacity\", 50); // 0-100%\n```\n\n```cpp\nBlynk.setProperty(V1, \"scale\", 30); // 0-100%\n```\n\n```cpp\nBlynk.setProperty(V1, \"rotation\", 10); //0-360 degrees\n```\n\nalso, you can fully replace the list of images from the hardware:\n\n```cpp\nBlynk.setProperty(V1, \"urls\", \"https://image1.jpg\", \"https://image2.jpg\");\n```\n\nor you can change individual image by it index:\n\n```cpp\nBlynk.setProperty(V1, \"url\", 1, \"https://image1.jpg\");\n```\n\nYou can also change widget properties via [HTTP API](http://docs.blynkapi.apiary.io/#).\n\n## Limitations and Recommendations\n\n* Don't put `Blynk.virtualWrite` and any other `Blynk.*` command inside `void loop()`- it will cause lot's of outgoing messages to our server and your connection will be terminated;\n* We recommend calling functions with intervals. For example, use [BlynkTimer](./#blynk-firmware-blynktimer)\n* Avoid using long delays with `delay()` – it may cause connection breaks;\n* If you send more than 100 values per second - you may cause [Flood Error](./#troubleshooting-flood-error) and your hardware will be automatically disconnected from the server;\n* Be careful sending a lot of `Blynk.virtualWrite` commands as most hardware is not very powerful \\(like ESP8266\\) so it may not handle many requests.\n\n"
  },
  {
    "path": "blynkprotocol.md",
    "content": "# Blynk protocol\n\nBlynk transfers binary messages with the following structure:\n\n| Command | Message Id | Length/Status | Body |\n| :---: | :---: | :---: | :---: |\n| 1 byte | 2 bytes | 2 bytes | Variable |\n\nMessage Id and Length are [big endian](http://en.wikipedia.org/wiki/Endianness#Big-endian). Body has a command-specific format.\n\nCommand and Status definitions: [BlynkProtocolDefs.h](https://github.com/blynkkk/blynk-library/blob/master/Blynk/BlynkProtocolDefs.h)\n\nAnother protocol description can be found [here](https://github.com/blynkkk/blynk-server/blob/master/README_FOR_APP_DEVS.md#protocol-messages).\n\nTypical Blynk library knows how to send\\(S\\)/process\\(P\\):\n\n```text\nS   BLYNK_CMD_LOGIN + auth token\nSP  BLYNK_CMD_PING\nSP  BLYNK_CMD_RESPONSE\nSP  BLYNK_CMD_BRIDGE\nSP  BLYNK_CMD_HARDWARE\nS   BLYNK_CMD_TWEET\nS   BLYNK_CMD_EMAIL\nS   BLYNK_CMD_PUSH_NOTIFICATION\n```\n\n## HARDWARE/BRIDGE command body\n\nThe body of these commands are encoded as a sequence of strings, separated by `'\\0'` \\([Null character](http://en.wikipedia.org/wiki/Null_character)\\). Please note that the last value may be not Null-terminated. In the following command examples `\\0` chars are replaced with spaces.\n\n### Pin mode\n\nPinMode command is received by library after connection, or when a mobile application starts.\n\n```text\npm <pin> <mode>\npm <pin> <mode> <pin> <mode> <pin> <mode> ...\n```\n\nMode:\n\n* in - INPUT\n* out - OUTPUT\n* pu - INPUT\\_PULLUP\n* pd - INPUT\\_PULLDOWN\n\n### Digital pin operations\n\nDigital write:\n\n```text\ndw <pin> <val>\n```\n\nDigital read:\n\n```text\ndr <pin>\n```\n\n### Analog pin operations\n\n```text\naw <pin> <val>\n\nar <pin>\n```\n\n### Virtual pin operations\n\n```text\nvw <pin> <param0> <param1> <param2> <param3> ...\n\nvr <pin>\n```\n\n### Other operations\n\n```text\ninfo\n```\n\nTODO\n\n## Developer notes\n\n* Values in HW commands are plain text.\n* In response to `dr/ar` command, library should send `dw/aw` command on the same pin and with the same message id.\n* These situations should cause a connection drop, or reconnection attempt:\n  * Message with `ID=0` is received\n  * Message with unknown type is received\n\n## Adding network interface\n\n4 entities should be created to add a new network interface to Blynk:\n\n1. Select connection interface that will be used for Blynk operation. This should be something like [http://www.arduino.cc/en/Tutorial/WebClient](http://www.arduino.cc/en/Tutorial/WebClient) Based on the API of the connection, create the **Transport**. Some examples may be found in the Adapters folder:\n   * BlynkTransportSerial\n   * BlynkTransportCC3000\n   * BlynkArduinoClient - _can be reused, if possible_\n2. Create **Blynk representative class**, which contains connection-specific helper functions \\(like begin\\). Examples:\n   * BlynkEthernet\n   * BlynkSerial\n   * BlynkCC3000\n   * BlynkWildFire\n   * BlynkYun\n3. Create **BlynkSimple\\*** header for your connection. This constructs main **Blynk instance**, so the user \\(mostly\\) doesn't need to get into such details. Examples:\n   * BlynkSimpleEthernet.h\n   * BlynkSimpleCC3000.h\n   * BlynkSimpleWifi.h\n   * BlynkSimpleUIPEthernet.h\n4. Create a **simple example** for your platform ;\\)\n\n### Example implementations\n\nUse these to play with the protocol and understand the basics:\n\n* [Pseudo-library in Python](https://github.com/blynkkk/blynk-library/blob/master/tests/pseudo-library.py)\n* [Node.js + Espruino](https://github.com/vshymanskyy/blynk-library-js)\n* [Arduino](https://github.com/blynkkk/blynk-library)\n* [Particle Core](https://github.com/vshymanskyy/blynk-library-spark)\n\n"
  },
  {
    "path": "blynkserver.md",
    "content": "# Blynk server\n\nNo longer supported.\n\n"
  },
  {
    "path": "css/style.css",
    "content": "/*\n\nPlease don't edit this file directly.\nInstead, edit the stylus (.styl) files and compile it to CSS on your machine.\n\n*/\n/* ----------------------------------------------------------------------------\n * Fonts\n */\n\n@import url(\"//fonts.googleapis.com/css?family=Montserrat:700|Open+Sans:400\");\n@import url(https://fonts.googleapis.com/css?family=Oxygen);\n\n/*@import url(https://fonts.googleapis.com/css?family=Montserrat:400,700); */\n\n/* ----------------------------------------------------------------------------\n * Base\n */\nhtml,\nbody,\ndiv,\nspan,\napplet,\nobject,\niframe,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\np,\nblockquote,\npre,\na,\nabbr,\nacronym,\naddress,\nbig,\ncite,\ncode,\ndel,\ndfn,\nem,\nimg,\nins,\nkbd,\nq,\ns,\nsamp,\nsmall,\nstrike,\nstrong,\nsub,\nsup,\ntt,\nvar,\ndl,\ndt,\ndd,\nol,\nul,\nli,\nfieldset,\nform,\nlabel,\nlegend,\ntable,\ncaption,\ntbody,\ntfoot,\nthead,\ntr,\nth,\ntd {\n  margin: 0;\n  padding: 0;\n  border: 0;\n  outline: 0;\n  font-weight: inherit;\n  font-style: inherit;\n  font-family: inherit;\n  font-size: 100%;\n  vertical-align: baseline;\n}\nbody {\n  line-height: 1;\n  color: #000;\n  background: #fff;\n}\nol,\nul {\n  list-style: none;\n}\ntable {\n  border-collapse: separate;\n  border-spacing: 0;\n  vertical-align: middle;\n}\ncaption,\nth,\ntd {\n  text-align: left;\n  font-weight: normal;\n  vertical-align: middle;\n}\na img {\n  border: none;\n}\nhtml,\nbody {\n  height: 100%;\n}\nhtml {\n  overflow-x: hidden;\n}\nbody,\ntd,\ntextarea,\ninput {\n  font-family: Helvetica Neue, Open Sans, sans-serif;\n  line-height: 1.6;\n  font-size: 13px;\n  color: #505050;\n}\n@media (max-width: 480px) {\n  body,\n  td,\n  textarea,\n  input {\n    font-size: 12px;\n  }\n}\na {\n  color: #24C48E;\n  text-decoration: underline;\n}\na:hover {\n  color: #228a8a;\n}\n/* ----------------------------------------------------------------------------\n * Content styling\n */\n.content p,\n.content ul,\n.content ol,\n.content h1,\n.content h2,\n.content h3,\n.content h4,\n.content h5,\n.content h6,\n.content pre,\n.content blockquote {\n  padding: 10px 0;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n.content h1,\n.content h2,\n.content h3,\n.content h4,\n.content h5,\n.content h6 {\n  font-weight: bold;\n  -webkit-font-smoothing: antialiased;\n  text-rendering: optimizeLegibility;\n}\n.content p {\n  font-family: oxygen;\n}\n\n.content pre {\n  font-family: Menlo, monospace;\n}\n.content ul > li {\n  list-style-type: disc;\n}\n.content ol > li {\n  list-style-type: decimal;\n}\n.content ul,\n.content ol {\n  margin-left: 20px;\n}\n.content ul > li {\n  list-style-type: none;\n  position: relative;\n}\n.content ul > li:before {\n  content: '';\n  display: block;\n  position: absolute;\n  left: -10px;\n  top: 7px;\n  width: 5px;\n  height: 5px;\n  -webkit-border-radius: 4px;\n  border-radius: 4px;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background: #fff;\n  border: solid 1px #9090aa;\n}\n.content li > :first-child {\n  padding-top: 0;\n  font-family: oxygen;\n}\n.content strong,\n.content b {\n  font-weight: bold;\n}\n.content i,\n.content em {\n  font-style: italic;\n  color: #9090aa;\n}\n.content code {\n  font-family: Menlo, monospace; color: #1D1E22;\n  word-wrap: break-word;\n  border-radius: 2px;\n  background: #D8D8D8;\n  padding: 3px 10px;\n  color: #1D1E22;\n  font-size: 0.9em;\n}\n.content pre > code {\n  display: block;\n  width: 500;\n  padding: 20px 20px;\n  background: #1D1E22;\n  color: #B2B2B2;\n  border-radius: 4px;\n  font-size: 0.85em;\n  letter-spacing: 0px;\n}\n.content blockquote :first-child {\n  padding-top: 0;\n}\n.content blockquote :last-child {\n  padding-bottom: 0;\n  color: 535353;\n}\n.content table {\n  margin-top: 10px;\n  font-family: oxygen;\n  margin-bottom: 10px;\n  padding: 0;\n  border-collapse: collapse;\n  clear: both;\n}\n.content table tr {\n  border-top: 1px solid #ccc;\n  background-color: #fff;\n  margin: 0;\n  padding: 0;\n}\n.content table tr :nth-child(2n) {\n  background-color: #f8f8f8;\n}\n.content table tr th {\n  text-align: auto;\n  font-weight: bold;\n  border: 1px solid #ccc;\n  margin: 0;\n  padding: 6px 13px;\n}\n.content table tr td {\n  text-align: auto;\n  border: 1px solid #ccc;\n  margin: 0;\n  padding: 6px 13px;\n}\n.content table tr th :first-child,\n.content table tr td :first-child {\n  margin-top: 0;\n}\n.content table tr th :last-child,\n.content table tr td :last-child {\n  margin-bottom: 0;\n}\n/* ----------------------------------------------------------------------------\n * Content\n */\n.content-root {\n  min-height: 90%;\n  position: relative;\n}\n.content {\n  padding-top: 0px;\n  padding-bottom: 40px;\n  padding-left: 150px;\n  padding-right: 40px;\n  zoom: 1;\n  max-width: 640px;\n}\n.content:before,\n.content:after {\n  content: \"\";\n  display: table;\n}\n.content:after {\n  clear: both;\n}\n.content blockquote {\n  color: #9090aa;\n  text-shadow: 0 1px 0 rgba(255,255,255,0.5);\n}\n.content h1{\n  font-family: oxygen;\n  font-size: 1.9em;\n  letter-spacing: 1px;\n}\n\n.content h2\n{\n  padding-top: 40px;\n  font-family: oxygen;\n  font-size: 1.4em;\n  letter-spacing: 1px;\n}\n.content h3 \n{ font-family: oxygen;\n  font-size: 1.3em;\n  letter-spacing: 1px;\n}\n  /*-webkit-font-smoothing: antialiased;\n  text-rendering: optimizeLegibility;\n  font-family: montserrat;\n  color: #505050;\n  padding-bottom: 0;\n  */\n}\n.content h1 + p,\n.content h2 + p,\n.content h3 + p,\n.content h1 ul,\n.content h2 ul,\n.content h3 ul,\n.content h1 ol,\n.content h2 ol,\n.content h3 ol {\n  padding-top: 10px;\n}\n\n\n.content h1,\n.content h2,\n.content h3,\n/*.content .big-heading,*/\nbody.big-h3 .content h3 {\n  padding-top: 80px;\n}\n\n.content h4{\n  font-family: oxygen;\n  font-size: 1.2em;\n\n}\n\n.content h1:before,\n.content h2:before,\n.content .big-heading:before,\nbody.big-h3 .content h3:before {\n/*  display: block;\n  content: '';\n  background: -webkit-gradient(linear, left top, right top, color-stop(0.8, #dfe2e7), color-stop(1, rgba(223,226,231,0)));\n  background: -webkit-linear-gradient(left, #dfe2e7 80%, rgba(223,226,231,0) 100%);\n  background: -moz-linear-gradient(left, #dfe2e7 80%, rgba(223,226,231,0) 100%);\n  background: -o-linear-gradient(left, #dfe2e7 80%, rgba(223,226,231,0) 100%);\n  background: -ms-linear-gradient(left, #dfe2e7 80%, rgba(223,226,231,0) 100%);\n  background: linear-gradient(left, #dfe2e7 80%, rgba(223,226,231,0) 100%);\n  -webkit-box-shadow: 0 1px 0 rgba(255,255,255,0.4);\n  box-shadow: 0 1px 0 rgba(255,255,255,0.4);\n  height: 1px;\n  position: relative;\n  top: -40px;\n  left: -40px;\n  width: 100%;\n  */\n}\n@media (max-width: 768px) {\n  .content h1,\n  .content h2,\n  .content .big-heading,\nbody.big-h3 .content h3 {\n    padding-top: 40px;\n  }\n  .content h1:before,\n  .content h2:before,\n  .content .big-heading:before,\nbody.big-h3 .content h3:before {\n    background: #dfe2e7;\n    left: -40px;\n    top: -20px;\n    width: 120%;\n  }\n}\n\n.content h1,\n.content .small-heading,\nbody:not(.big-h3) .content h3 {\n  border-bottom: solid 5px rgba(0,0,0,0.07);\n  color: #1E1F23;\n  padding-top: 80px;\n  padding-bottom: 0px;\n}\n\n.content h2,\n.content .small-heading,\nbody:not(.big-h3) .content h3 {\n  border-bottom: solid 1px rgba(0,0,0,0.07);\n  color: #1E1F23;\n  padding-top: 80px;\n  margin-top: -40px;\n  \n}\n\n\n.content h1:first-child {\n  padding-top: 80;\n}\n.content h1:first-child,\n.content h1:first-child a,\n.content h1:first-child a:visited {\n  color: #505050;\n}\n.content h1:first-child:before {\n  display: none;\n}\n@media (max-width: 768px) {\n  .content h4,\n  .content h5,\n  .content .small-heading,\n  body:not(.big-h3) .content h3 {\n    padding-top: 20px;\n  }\n}\n@media (max-width: 480px) {\n  .content {\n    padding: 20px;\n    padding-top: 40px;\n  }\n  .content h4,\n  .content h5,\n  .content .small-heading,\n  body:not(.big-h3) .content h3 {\n    padding-top: 10px;\n  }\n}\nbody.no-literate .content pre > code {\n  background: #f3f6fb;\n  border: solid 1px #e7eaee;\n  border-top: solid 1px #dbdde2;\n  border-left: solid 1px #e2e5e9;\n  display: block;\n  padding: 10px;\n  -webkit-border-radius: 2px;\n  border-radius: 2px;\n  overflow: auto;\n}\nbody.no-literate .content pre > code {\n  -webkit-overflow-scrolling: touch;\n}\nbody.no-literate .content pre > code::-webkit-scrollbar {\n  width: 15px;\n  height: 15px;\n}\nbody.no-literate .content pre > code::-webkit-scrollbar-thumb {\n  background: #ddd;\n  -webkit-border-radius: 8px;\n  border-radius: 8px;\n  border: solid 4px #f3f6fb;\n}\nbody.no-literate .content pre > code:hover::-webkit-scrollbar-thumb {\n  background: #999;\n  -webkit-box-shadow: inset 2px 2px 3px rgba(0,0,0,0.2);\n  box-shadow: inset 2px 2px 3px rgba(0,0,0,0.2);\n}\n@media (max-width: 1180px) {\n  .content pre > code {\n    background: #f3f6fb;\n    border: solid 1px #e7eaee;\n    border-top: solid 1px #dbdde2;\n    border-left: solid 1px #e2e5e9;\n    display: block;\n    padding: 10px;\n    -webkit-border-radius: 2px;\n    border-radius: 2px;\n    overflow: auto;\n  }\n  .content pre > code {\n    -webkit-overflow-scrolling: touch;\n  }\n  .content pre > code::-webkit-scrollbar {\n    width: 15px;\n    height: 15px;\n  }\n  .content pre > code::-webkit-scrollbar-thumb {\n    background: #ddd;\n    -webkit-border-radius: 8px;\n    border-radius: 8px;\n    border: solid 4px #f3f6fb;\n  }\n  .content pre > code:hover::-webkit-scrollbar-thumb {\n    background: #999;\n    -webkit-box-shadow: inset 2px 2px 3px rgba(0,0,0,0.2);\n    box-shadow: inset 2px 2px 3px rgba(0,0,0,0.2);\n  }\n}\n.button {\n  -webkit-font-smoothing: antialiased;\n  text-rendering: optimizeLegibility;\n  font-family: montserrat, sans-serif;\n  letter-spacing: 0px;\n  font-weight: bold;\n  text-transform: uppercase;\n  display: inline-block;\n  padding: 15px 30px;\n  margin-top: 20px;\n  border-radius: 4px;\n  margin-right: 15px;\n  letter-spacing: 1px; \n  text-decoration: none;\n}\n.button,\n.button:visited {\n  background: #24C48E;\n  color: #fff;\n  text-shadow: none;\n}\n.button:hover {\n  background: #07D698;\n  color: #fff;\n}\n.button.light,\n.button.light:visited {\n  background: transparent;\n  color: #9090aa;\n  border-color: #9090aa;\n  text-shadow: none;\n}\n.button.light:hover {\n  border-color: #9090aa;\n  background: #9090aa;\n  color: #fff;\n}\n.content .button + em {\n  color: #9090aa;\n}\n\n/*@media (min-width: 1180px) {\n  body:not(.no-literate) .content-root {\n    background-color: #f3f6fb;\n    -webkit-box-shadow: inset 780px 0 #fff, inset 781px 0 #dfe2e7, inset 790px 0 5px -10px rgba(0,0,0,0.1);\n    box-shadow: inset 780px 0 #fff, inset 781px 0 #dfe2e7, inset 790px 0 5px -10px rgba(0,0,0,0.1);\n  }\n}\n@media (min-width: 1180px) {\n  body:not(.no-literate) .content {\n    padding-left: 0;\n    padding-right: 0;\n    width: 930px;\n    max-width: none;\n  }\n  body:not(.no-literate) .content > p,\n  body:not(.no-literate) .content > ul,\n  body:not(.no-literate) .content > ol,\n  body:not(.no-literate) .content > h1,\n  body:not(.no-literate) .content > h2,\n  body:not(.no-literate) .content > h3,\n  body:not(.no-literate) .content > h4,\n  body:not(.no-literate) .content > h5,\n  body:not(.no-literate) .content > h6,\n  body:not(.no-literate) .content > pre,\n  body:not(.no-literate) .content > blockquote {\n    width: 550px;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n    padding-right: 40px;\n    padding-left: 40px;\n  }\n  body:not(.no-literate) .content > h1,\n  body:not(.no-literate) .content > h2,\n  body:not(.no-literate) .content > h3 {\n    clear: both;\n    width: 100%;\n  }\n  body:not(.no-literate) .content > pre,\n  body:not(.no-literate) .content > blockquote {\n    width: 380px;\n    padding-left: 20px;\n    padding-right: 20px;\n    float: right;\n    clear: right;\n  }\n  body:not(.no-literate) .content > pre + p,\n  body:not(.no-literate) .content > blockquote + p,\n  body:not(.no-literate) .content > pre + ul,\n  body:not(.no-literate) .content > blockquote + ul,\n  body:not(.no-literate) .content > pre + ol,\n  body:not(.no-literate) .content > blockquote + ol,\n  body:not(.no-literate) .content > pre + h4,\n  body:not(.no-literate) .content > blockquote + h4,\n  body:not(.no-literate) .content > pre + h5,\n  body:not(.no-literate) .content > blockquote + h5,\n  body:not(.no-literate) .content > pre + h6,\n  body:not(.no-literate) .content > blockquote + h6 {\n    clear: both;\n  }\n  body:not(.no-literate) .content > p,\n  body:not(.no-literate) .content > ul,\n  body:not(.no-literate) .content > ol,\n  body:not(.no-literate) .content > h4,\n  body:not(.no-literate) .content > h5,\n  body:not(.no-literate) .content > h6 {\n    float: left;\n    clear: left;\n  }\n  body:not(.no-literate) .content > h4,\n  body:not(.no-literate) .content > h5,\n  body:not(.no-literate) .content > .small-heading,\n  body:not(.big-h3) body:not(.no-literate) .content > h3 {\n    margin-left: 40px;\n    width: 470px;\n    margin-bottom: 3px;\n    padding-left: 0;\n    padding-right: 0;\n  }\n  body:not(.no-literate) .content > table {\n    margin-left: 40px;\n    margin-right: 40px;\n    max-width: 470px;\n  }\n  body:not(.no-literate):not(.big-h3) .content > h3 {\n    margin-left: 40px;\n    width: 470px;\n    margin-bottom: 3px;\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n*/\n\n.header {\n  background-color: rgba(41,41,45,.9);\n  /*border-bottom: solid 1px #dfe2e7;*/\n  position: fixed;\n  padding: 17px 20px 15px 20px;\n  zoom: 1;\n  width: 99%;\n  z-index: 3;\n  /*line-height: 20px;*/\n}\n.header:before,\n.header:after {\n  content: \"\";\n  display: table;\n}\n.header:after {\n  clear: both;\n}\n.header .left {\n  float: left;\n}\n.header .right {\n  text-align: right;\n  position: absolute;\n  right: 15px;\n  top: 26px;\n}\n.header .right iframe {\n  display: inline-block;\n  vertical-align: middle;\n}\n.header h1 {\n  -webkit-font-smoothing: antialiased;\n  text-rendering: optimizeLegibility;\n  font-style: normal;\n  font-weight: 100;\n  font-family: montserrat, sans-serif;\n  font-size: 13px;\n}\n\n.header h1 a{\n  text-decoration: none;\n}\n\n.header h1,\n.header h1 a:visited {\n  color: #9090aa;\n  font-family: \"Montserrat\";\n    font-size: 27px;\n    text-transform: none;\n    letter-spacing: 0px;\n    font-weight: 300;\n    font-style: normal;\n    color: #1fd699;\n}\n.header h1 a:hover {\n  color: #fff;\n}\n.header li a {\n  font-family: \"Montserrat\";\n  letter-spacing: 2px;\n  font-weight: 300;\n  padding-left: 14px;\n  padding-right: 14px;\n  font-size: 13px;\n  text-transform: uppercase;\n  margin-right: 14px;\n  margin-left: -14px;\n  color: #fff;\n  display: block;\n  text-decoration: none;\n}\n.header li a:hover {\n  color: #1fd699;\n}\n@media (min-width: 480px) {\n  .header h1 {\n    float: left;\n  }\n  .header ul,\n  .header li {\n    display: block;\n    float: left;\n  }\n  .header ul {\n    margin-left: -15px;\n  }\n  .header h1 + ul {\n    /*border-left: solid 1px #dfe2e7;*/\n    margin-left: 25px;\n    padding-top: 10px;\n  }\n  .header li {\n    /*border-left: solid 1px rgba(255,255,255,0.5);*/\n    /*border-right: solid 1px #dfe2e7;*/\n  }\n  .header li:last-child {\n    border-right: 0;\n  }\n  .header li a {\n    padding: 0 15px;\n  }\n}\n@media (max-width: 480px) {\n  .right {\n    display: none;\n  }\n}\n.menubar {\n  -webkit-font-smoothing: antialiased;\n  text-rendering: optimizeLegibility;\n}\n.menubar .section {\n  padding: 100px 20px 80px;\n  background: #1D1E22;\n  -webkit-box-sizing: content-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n\n.menubar .section + .section {\n  border-top: solid 1px #dfe2e7;\n}\n.menubar .section.no-line {\n  border-top: 100;\n  padding-top: 0;\n}\na.big.button {\n  display: block;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  width: 100%;\n  padding: 10px 20px;\n  text-align: center;\n  font-weight: bold;\n  font-size: 1.1em;\n  background: transparent;\n  border: solid 3px #2badad;\n  -webkit-border-radius: 30px;\n  border-radius: 30px;\n  font-family: montserrat, sans-serif;\n}\na.big.button,\na.big.button:visited {\n  color: #2badad;\n  text-decoration: none;\n}\na.big.button:hover {\n  background: #2badad;\n}\na.big.button:hover,\na.big.button:hover:visited {\n  color: #fff;\n}\n@media (max-width: 480px) {\n  .menubar {\n    padding: 20px;\n    border-bottom: solid 1px #dfe2e7;\n  }\n}\n@media (max-width: 768px) {\n  .menubar {\n    display: none;\n  }\n}\n@media (min-width: 768px) {\n  .content-root {\n    padding-left: 230px;\n    padding-top: 100px;\n  }\n  .menubar {\n    position: absolute;\n    /*margin-top: 100px;*/\n    left: 0;\n    top: 0;\n    bottom: 0;\n    width: 280px; /* Menu bar width*/\n    border-right: solid 1px #dfe2e7;\n  }\n  .menubar.fixed {\n\n    position: fixed;\n    overflow-y: auto;\n  }\n  .menubar.fixed {\n    color: #FF9999;\n    -webkit-overflow-scrolling: touch;\n  }\n  .menubar.fixed::-webkit-scrollbar {\n    width: 5px;\n    height: 5px;\n    background: #1D1E22;\n  }\n  .menubar.fixed::-webkit-scrollbar-thumb {\n    background: #ddd;\n    -webkit-border-radius: 8px;\n    border-radius: 8px #1D1E22;\n    border: solid 0px #1D1E22;\n  }\n  .menubar.fixed:hover::-webkit-scrollbar-thumb {\n    background: #999;\n    -webkit-box-shadow: inset 2px 2px 3px rgba(0,0,0,0.2);\n    box-shadow: inset 2px 2px 3px rgba(0,0,0,0.2);\n  }\n}\n.menubar {\n  font-size: 1em;\n  background-color: #1D1E22;\n\n}\n.menu ul.level-1 > li + li {\n  margin-top: 20px;\n  /*color: #D3435C; */\n}\n.menu a {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  position: relative;\n  display: block;\n  padding-top: 1px;\n  padding-bottom: 1px;\n  margin-right: -30px;\n\n}\n.menu a,\n.menu a:visited {\n  color: #fff;\n  text-decoration: none;\n}\n.menu a:hover {\n  color: #23C890;\n}\n.menu a.level-1 {\n  font-family: oxygen, sans-serif;\n  text-transform: uppercase;\n  font-weight: bold;\n  font-size: 0.95em;\n  color: #B2B2B2;\n}\n\n.menu a.level-1:visited {\n  color: #B2B2B2;\n}\n.menu a.level-1:hover {\n  color: #23C890;\n}\n.menu a.level-2 {\n  font-weight: normal;\n  font-family: oxygen;\n  color: #7F7F7F;\n\n} \n\n.menu a.level-2:hover {\n  color: #23C890;\n}\n\n.menu a.level-3 {\n  font-weight: normal;\n  font-family: oxygen;\n  font-size: 0.9em;\n  color: #7F7F7F;\n  padding-left: 15px;\n  \n}\n.menu a.level-3:hover {\n  color: #23C890;\n}\n\n.menu a.active {\n  font-weight: bold !important;\n  color: #23C890;\n}\n.menu a.active,\n.menu a.active:visited,\n.menu a.active:hover {\n  color: #23C890 !important;\n}\n.menu a.active:after {\n  content: '';\n  display: block;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  position: absolute;\n  top: 10px;\n  right: 30px;\n  width: 3px;\n  height: 3px;\n  -webkit-border-radius: 2px;\n  border-radius: 2px;\n  background: #24C48C;\n}\ncode .string,\n\ncode .number {\n  color: #24C48C;\n}\ncode .init {\n  color: #383;\n}\ncode .keyword {\n  font-weight: bold;\n}\ncode .comment {\n  color: #686666;\n}\n.large-brief .content > h1:first-child + p,\n.content > p.brief {\n  font-size: 1.3em;\n  font-family: Open Sans, sans-serif;\n  font-weight: 300;\n}\n.title-area {\n  min-height: 100px;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  -webkit-font-smoothing: antialiased;\n  text-rendering: optimizeLegibility;\n  text-align: center;\n  border-bottom: solid 1px #dfe2e7;\n  overflow: hidden;\n}\n.title-area > img.bg {\n  z-index: 0;\n  position: absolute;\n  left: -9999px;\n}\n.title-area > div {\n  position: relative;\n  z-index: 1;\n}\n.lang{\n  color: white;\n  margin: 0 5px;\n  cursor: pointer;\n}\n.content h2.banner-header,\n.content p.banner {\n  position: sticky;\n  background-color: white;\n  border-left: 1px solid #ED9D00;\n  border-right: 1px solid #ED9D00;\n  padding: 10px;\n}\n.content h2.banner-header {\n  top: 80px;\n  z-index: 2;\n  margin-top: 20px;\n  border-top: 1px solid #ED9D00;\n  border-top-left-radius: 8px;\n  border-top-right-radius: 8px;\n  padding: 10px;\n}\n.content p.banner {\n  top: 130px;\n  z-index: 1;\n  margin-top: 0;\n  font-weight: bold;\n  border-bottom: 1px solid #ED9D00;\n  border-bottom-right-radius: 8px;\n  border-bottom-left-radius: 8px;\n}\n"
  },
  {
    "path": "en/README.md",
    "content": "# EN\n\n"
  },
  {
    "path": "en/api/README.md",
    "content": "# API\n\n"
  },
  {
    "path": "en/infra/backup_policy_FAQ.md",
    "content": "**- What is backed up?**\n   \nEverything. Users, devices, their data, etc.\n\n**- Where are backups stored?**\n\nThey are stored on the separate servers within our cloud provider data center.\n\n**- Frequency of backups?**\n\nFull backup is done once a week. All non reporting data (users, devices, widgets setup, last values) also is backup in real-time with separate mechanism.\n\n**- Backup software in use**\n\nWe use a snapshot-based backup system that creates a point-in-time image based on the current state of the server.\n\n**- Monitoring: How backups are monitored?**\n\nThis is the automated feature delivered by the provider. So we don't perform any monitoring here.\n\n**- Data retention policies**\n\nSnapshots are stored for the 1 month. So at the every point of the time there are 4 snapshots (1 snapshot per week).\n \n**- Is it practically possible to restore data and use restored data?**\n\nSure. In fact, we restoring the backups once in few months for the random client. Also, partial restore is possible - restore of the user profiles, devices without reporting data for graphs.\n\n**- Is there something that is not backed up?**\n\nNo. All data is backuped.\n\n**- Do I have to pay for the backup?**\n\nNo, this price is included to your subscription plan.\n\n\n"
  },
  {
    "path": "en/product/README.md",
    "content": "---\ndescription: How Product templates work on Blynk IoT platform\n---\n\n# Product\n\n"
  },
  {
    "path": "en/product/product-template-settings/README.md",
    "content": "# Product Template Settings\n\n"
  },
  {
    "path": "en/product/product-template-settings/dashboard.md",
    "content": "# Dashboard\n\n"
  },
  {
    "path": "en/product/product-template-settings/datastreams/README.md",
    "content": "# Datastreams\n\n"
  },
  {
    "path": "en/product/product-template-settings/datastreams/datastream_alias.md",
    "content": "# Datastream: Alias\n\nAlias is an alternative Datastream name which can be changed by the end-user. For example, it can be used by voice assistants like Amazon Echo \\(Alexa\\) and Google Home Assistant .\n\nYou can only use letters, digits and spaces. No other characters are allowed\n\n**IMPORTANT:** Duplicate aliases are not allowed.\n\n"
  },
  {
    "path": "en/product/product-template-settings/datastreams/datastream_automation.md",
    "content": "# datastream\\_automation\n\n## Datastream: Expose to Automation\n\nThis setting makes current Datastream available for Automation. Once enabled, end-users will be able to choose this Datastream when creating Automation scenarios.\n\n## 1. Turn on the switch to expose this Datastream for Automation\n\n## 2. Choose the Type of Automation\n\nThe type defines what kind of Action or Trigger is it and how it will be presented for the user when using Automation\n\n| Type | Description | GUI | Condition | Action | Settings |\n| :--- | :--- | :---: | :---: | :---: | :---: |\n| **Main Power Switch** | Control that turn device ON/OFF. You can have **only one** Main Power Switch per Product | Switch | • | • | – |\n| **Switch** | Controls property that has on/off state. **Don't use this property for Main Power Switch** | Switch | • | • | – |\n| **Range Control** | Controls a property within a set range. Min/Max values are taken from Datastream settings. This parameter also requires a `step` value. Step defines increments between min and max value of the datastream | Slider | • | • | Step |\n| **Color** | Controls properties where color can be set. Include Brightness if needed. | Color picker | • | • | – |\n| **Sensor** | Read-only property to use sensor data as a Condition | Value | • |  | – |\n\n## 3. Configure if this Datastream is as a trigger, an action, or both.\n\n**Condition:** makes this Datastream available as a Condition.\n\n**Action:** makes this Datastream available as an Action. Some of the Automation Types can be only a condition.\n\n"
  },
  {
    "path": "en/product/product-template-settings/datastreams/datastream_datatype.md",
    "content": "# Datastream: Data Type\n\nEvery Datastream has a Data Type setting. Data Type is used to specify the type and format of the data and optimize data storage and further calculations.\n\nMake sure you choose a correct Data Type for your data. Currently, these Data Types are supported:\n\n| Type | Min | Max |\n| :---: | :---: | :---: |\n| `Integer` | -2,147,483,648 | 2,147,483,647 |\n| `Double` | -1.8 x 10^300 | 4.9 x 10^-324 |\n| `String` | any value is accepted |  |\n\n**IMPORTANT:**\n\nBlynk server will ignore values that don't match the Data Type\n\nExample: if Datastream has Data Type set to `Integer`, but Hardware sends `123.45`, this value will be skipped because it is `Double`, not `Integer`.\n\nIf the incoming value goes out of range of Min or Max setting, this value will be \"cropped\" to match this setting.\n\n"
  },
  {
    "path": "en/product/product-template-settings/datastreams/datastream_default_value.md",
    "content": "# Datastream: Default Value\n\nDefault Value is a setting that allows you to set the initial value for the Datastream. This value later can be used in hardware API, HTTPS API, or within Rule Engine. Usually, this setting is used to set the initial value when hardware boots up for the first time.\n\nExample: You are working on a smart light bulb and would like to turn it on when it first connects to the server after provisioning.\n\nSet the default value for the Datastream `V1` to `1`. Then use this code on the hardware:\n\n```cpp\nBLYNK_CONNECTED() {\n  // request the V1 value on connect\n  // for initial connect it will be default value 1\n  Blynk.sync(V1);\n}\n\nBLYNK_WRITE(V1)\n{\n    // here you get default value 1\n    int bulbValue = param.asInt();\n    handle(bulbValue);\n}\n```\n\nYou can change the default value of the product at any time. There is no need to update firmware over-the-air even when the product was already shipped to your clients.\n\n"
  },
  {
    "path": "en/product/product-template-settings/datastreams/datastream_deicmals.md",
    "content": "# Datastream: Decimals\n\nThis setting defines the formatting of the incoming value.\n\nDecimals formatting is available for `float` Data Type only.\n\nSupported formatting:\n\n| Format | Example Value | Value after formatting |\n| :--- | :--- | :--- |\n| \\# | 3.14159265359 | 3 |\n| \\#.\\# | 3.14159265359 | 3.1 |\n| \\#.\\#\\# | 3.14159265359 | 3.14 |\n| \\#.\\#\\#\\# | 3.14159265359 | 3.141 |\n| \\#.\\#\\#\\#\\# | 3.14159265359 | 3.1415 |\n| \\#.\\#\\#\\#\\#\\# | 3.14159265359 | 3.14159 |\n| \\#.0 | 3 | 3.0 |\n| \\#.00 | 3.1 | 3.10 |\n| \\#.000 | 3.1 | 3.100 |\n| \\#.0000 | 3.1 | 3.1000 |\n| \\#.00000 | 3.1 | 3.10000 |\n\n"
  },
  {
    "path": "en/product/product-template-settings/datastreams/datastream_feedback.md",
    "content": "# Datastream: Wait for confirmation from the device\n\nIn some cases, it's crucial to get a confirmation that hardware has received the command or value.\n\n**Wait for confirmation from device** property allows you to set the interval for how long the mobile or web app will wait for the confirmation from the hardware.\n\nExample: 1. You set Datastream for garage door status to wait for confirmation for 5 sec. 2. The user pressed the switch in the mobile app that should close the garage door. 3. If hardware confirms that command was processed and applied - the switch in the app will remain in ON state. 4. If there is no confirmation from the device that the door was closed within 5 seconds, the switch will go back to the initial OFF state.\n\nHere is a code example that shows how you can make it work:\n\n```cpp\nBLYNK_WRITE(V1)\n{   \n  int value = param.asInt();\n  if (value == 1) {\n     if (openDoor()) {\n       // confirm the value, UI will enable the button\n       Blynk.virtualWrite(V1, \"1\");\n     } else {\n       // you can send back any other value, \n       // saying that change was unsuccessful\n       // UI will enable the button\n       Blynk.virtualWrite(V1, \"0\");\n     }\n  }\n}\n```\n\n"
  },
  {
    "path": "en/product/product-template-settings/datastreams/datastream_invalidate.md",
    "content": "# Datastream: Invalidate Value\n\nUse this setting to manage the _freshness_ of the data. When enabled, the server will automatically check the timestamp of the latest value and act accordingly to settings.\n\n**Invalidate in:** Specifies the period in seconds, minutes, or hours when data is considered fresh.\n\n**then set:** Specifies what to do when data is no longer fresh. You have such options:\n\n| Option | How it works |\n| :--- | :--- |\n| Nothing | Erases the previous value and shows nothing |\n| Default | Will show `Default` datastream value is exists |\n| No Data | Will show \"No Data\" placeholder |\n| Empty | Will show \"Empty\" placeholder |\n| -- | Will show dashes \"--\" placeholder |\n\nExample: 1. A temperature Datastream is set to `Invalidate in 1 hour, then set to \"--\"` 2. It's 4:00 PM now, and the latest value of `3.14ºC` was received at 3:30 PM. Data is considered to be fresh, and any widget will display it. 3. It's 5:00 PM, and there was no new data since 3:30 PM \\(maybe the device is no longer working\\). A temperature widget in the app will show `--` because data is no longer fresh.\n\n"
  },
  {
    "path": "en/product/product-template-settings/datastreams/datastream_min_max.md",
    "content": "# Datastream: Min/Max values\n\n**Min / Max** fields are used to specify the range of incoming values. This setting is applied everywhere, where this Datastream is used.\n\nFor example, if you use a Chart widget, it will use min/max values by default. Some visualization widgets allow overriding min/max values.\n\n**IMPORTANT:** If the incoming value falls out of the specified min/max range, the value will be _cropped_.\n\nExample: Datastream `Min-Max` fields are set to `0-100`\n\n| Datastream | Min | Max |\n| :--- | :--- | :--- |\n| Humidity | `0` | `100` |\n\nHere is how incoming values will be processed:\n\n| Incoming value | Result |\n| :--- | :--- |\n| `50` | `50` |\n| `314` | `100` |\n| `-2` | `0` |\n\nMin /Max setting is applied if the value matches the Data Type. Otherwise, the value will be ignored. Check Data Type Settings reference.\n\n"
  },
  {
    "path": "en/product/product-template-settings/datastreams/datastream_name.md",
    "content": "# Datastream: Name\n\nAlways try to give a meaningful name to the Datastream as it's extensively used across the platform.\n\n**IMPORTANT:** Duplicate names are not allowed.\n\n"
  },
  {
    "path": "en/product/product-template-settings/datastreams/datastream_save_raw.md",
    "content": "# Datastream: Save Raw Data\n\nThis setting allows storing raw data \\(uncompressed, non-aggregated\\).\n\nBy default, data on the platform is averaged to 1 value per minute. It means that if hardware sent 60 values for 1 minute, only one average of these 60 values would be stored in the database.\n\n"
  },
  {
    "path": "en/product/product-template-settings/datastreams/datastream_sync.md",
    "content": "# Datastream: Sync with the latest server value\n\nThis setting enables the device to sync with the latest known value on the server.\n\nFor example, a user owns a wi-fi connected dimmer light 1. The device goes offline 2. User sets the brightness of the light to 100% in the mobile app or on the web 3. When the device comes back online, it can request the latest value from the server and set brightness to 100\n\nTo sync the device to the latest state, use the firmware API commands: `Blynk.sync()` or `Blynk.syncAll()`.\n\n```cpp\nBLYNK_CONNECTED() { // when device is conneceted to Blynk Cloud...\n  Blynk.syncAll(); // request the values for all datastreams that has \"sync\" setting enabled\n}\n```\n\n`Blynk.syncAll()` will do syncs only for DataStreams that are enabled for syncing. `Blynk.sync()` will do sync for any requested DataStream, even if syncing not enabled for that DataStream.\n\n"
  },
  {
    "path": "en/product/product-template-settings/datastreams/datastream_virtual_pin.md",
    "content": "# Datastream: Virtual Pin\n\nVirtual Pin is a way to exchange data between hardware, web, and mobile apps. Think about Virtual Pins as a variable where you can store and retrieve data from sensors, actuators, etc.\n\nFor example, you can read a value in Celsius from a temperature sensor like DHT11 \\(using a physical pin on your hardware\\), then convert this temperature to Fahrenheit and save the processed value to a Virtual Pin 01.\n\n```cpp\nvoid temperatureSend()                          // a function that is called by some timer\n{\n   temperatureCelsius = analogRead(A0);         // Reading sensor data in Celsius\n   toFarenheit = temperatureCelsius*1.8 + 32;   // Converting Celsius to Farenheit\n\n   Blynk.virtualWrite(V0, toFarenheit);         // Writing temperature in Farenheit to Virtual Pin V0\n                                                // Now it can be used by widgets in the apps\n}\n```\n\nOr you can send a command from the app to a Virtual Pin, and run a function inside a Virtual Pin handler.\n\n```cpp\nBLYNK_WRITE(V1)                                 // Device is waiting for incoming value on Virtual Pin V1. \n{\n   pinValue = param.asInt();                    // creating a variable that will store incoming value\n\n   if (pinValue == 1)                           // checking if incoming value is 1\n   {\n      doThis();                                 // trigger some function in your code\n      doThat();                                 // trigger another function in your code\n   }\n}\n```\n\nCheck examples in different languages on how to read and write data to Virtual Pins.\n\n"
  },
  {
    "path": "en/product/product-template-settings/events/README.md",
    "content": "# Events\n\n"
  },
  {
    "path": "en/product/product-template-settings/events/event_code.md",
    "content": "# Events: Code\n\nEvent code is used in firmware API to trigger and render events from the device.\n\n**IMPORTANT:** Event code should be unique within the product.\n\n## How to trigger events:\n\nIf you need to create a warning when the sensor detects temperature over a certain threshold. 1. Create a new Warning event named `High temperature` with code `high_temp` 2. Use the `Blynk.logEvent(event_code)` to trigger new event occurrence 3. When the device triggers the event, it will be rendered on the Timeline\n\nA simple example could look like:\n\n```cpp\nif (temperatureSensor > 35)\n{\n   Blynk.logEvent(\"high_temp\");\n}\n```\n\nYou can also use HTTPS API in order to trigger the device event:\n\n```text\n/external/api/logEvent?token={device_token}&code={event_code}&description={event_desciption}\n```\n\n`description` is an optional parameter where you can attach additional information to be rendered on the Timeline along with the event.\n\nFor example:\n\n```text\nhttps://my.server.com/external/api/logEvent?token=Q9qdlGahPuFuCfncrT35QutT7s3HjYFy&code=high_temp\n```\n\n"
  },
  {
    "path": "en/product/product-template-settings/events/event_name.md",
    "content": "# Events: Name\n\nGive your event a meaningful name because it will be shown to end-users.\n\n**IMPORTANT:** Event name should be unique within the product.\n\n"
  },
  {
    "path": "en/product/product-template-settings/events/event_notification.md",
    "content": "# Events: Notification\n\nEvery event can additionally trigger notifications.\n\nYou can:\n\n* Send Emails\n* Send Push Notification on a smartphone/tablet\n* Send SMS \\(additional charges apply\\)\n\n## Recipients\n\nYou can assign different recipients to each event.\n\nFor example, some notifications should be sent to the end-customers, while others should be sent to the technical support team \\(for internal review only\\).\n\nYou need to define the recipient of notifications in Product Metadata before they become available as a selection.\n\nWhen you add any of the following Metadata fields, they will be available as a recipient in notifications:\n\n* `Device owner` is available as a recipient by default \\(no need to add such field\\)\n* Contact metadata\n* Email metadata\n\nExample: You would like your technical support team to be notified every time the vibration sensor is over the defined threshold.\n\n1. In Products -&gt; Your Product -&gt; Metadata: \n\n   Create a new Metadata field of type `Email` or `Contact`. \n\n   Name it \"Technical Support\" and specify a default value \\(for example `support@yourcompany.com`\\)\n\n2. In Products -&gt; Your Product -&gt; Events:\n\n   Create a new Event and set a recipient of email notification as `Technical Support`\n\n"
  },
  {
    "path": "en/product/product-template-settings/events/event_notification_period.md",
    "content": "# Events: Notification Period\n\nNotification Period defines how often notifications are sent for this particular event.\n\nFor example, a 1 minute period means end-users won't get more than one notification per 1 minute, even if hardware or API sends more. After 1 minute since the last posted notification expires, new notifications will get in.\n\nNotification Period is applied per event per device. If you have two events with different notification periods set up within the same device, they will be processed independently and end-users will get both notifications with different periods.\n\n"
  },
  {
    "path": "en/product/product-template-settings/events/event_online_offline.md",
    "content": "# Events: Online, Offline\n\nOnline and Offline events are system events handled by the server.\n\nThese events tell the current status of the device on the list of devices, device page itself, and also shows the history of states change in the timeline section.\n\nYou can set up your devices to ignore offline state period in `Product` -&gt; `General` - &gt; `Offline Ignore Period`.\n\nUser should be logged in to account to get these notifications.\n\n"
  },
  {
    "path": "en/product/product-template-settings/general-settings/README.md",
    "content": "# General Settings\n\n"
  },
  {
    "path": "en/product/product-template-settings/general-settings/product_manufacturer.md",
    "content": "# Manufacturer\n\nIs the name of a Manufacturer that makes your product. This field used in multiple places on the UI and is required to work with Voice Assistance \\(Alexa, Google Home\\).\n\nThis field is mandatory. Max length - 128 characters. Only letters, digits and space are allowed.\n\n"
  },
  {
    "path": "en/product/product-template-settings/general-settings/product_offline_ignore_period.md",
    "content": "# Offline Ignore Period\n\nOffline ignore period is an option that allows you to hide \"offline\" event on the device timeline. For example, let's say you set the offline ignore period to 1 minute and we have the next device log:\n\n17:44:33 - device connects 17:44:40 - device disconnects 17:44:50 - device connects again\n\nWith offline ignore period set to 1 minute your device timeline will show only 1 event:\n\n17:44:33 device connects\n\nThis is because device reconnected within the 1 minute interval. Without offline ignore period set your timeline will show all the above events.\n\n"
  },
  {
    "path": "en/product/product-template-settings/metadata.md",
    "content": "# Metadata\n\n"
  },
  {
    "path": "en-product/create-new-product.md",
    "content": "---\ndescription: How to create new Product on Blynk IoT platform\n---\n\n# What is a Product\n\n"
  },
  {
    "path": "en-product/dashboard/chart.md",
    "content": "   \n      Chart is used to visualise live and historical data. You can use it for sensor data, for binary event logging and more. \n  \n SETUP:\n- **Add source** – it's possible to set several Datastream **Sources** under one Chart. Click and set up as much as you need.\n  \n- **Chart Title** – name a chart so you or your client understand what it's about  \n- **Source Label** – The easiest way to name it/them is giving used Datastreams names.  \n- **Source** – there are two fields:  \n     - the  right one contains ***Datastreams used in the Product***. Select one;  \n     - the left is ***Source aggregation type menu*** it's used to select an option to be used in chart data plotting:  \n       **AVG of** will plot average value per minute;  \n       **Raw of** data will plot using all the data available;  \n       **SUM of** will summarize all incoming values to the specified Virtual Pin;  \n       **MIN of** will plot minimum value per minute;  \n       **MAX of** will plot maximum value per minute;  \n       **COUNT of** will plot the number of times data was sent by device per minute;  \n- **Chart type** - 4 types are available: Line, Area, Column, Stepline. Pick a color to make it different from other sources may use under this chart.  \n    - **Show Y-axis** – enable if it's needed to view Datastream values on the axis (X-axis displays the time);  \n    - **Autoscale** – enable if there's no specific limitations of the data values needed to be viewed. Otherwise specify them by setting the values in **MIN** and **MAX** fields.\n- **Enable zoom** – enable if chart zoom may be useful. Otherwise leave it disabled.\n"
  },
  {
    "path": "en-product/datastreams/README.md",
    "content": "# Datastreams\n\n"
  },
  {
    "path": "en-product/datastreams/datastream-alias.md",
    "content": "# Datastream: Alias\n\n"
  },
  {
    "path": "en-product/datastreams/datastream-data-type.md",
    "content": "# Datastream: Data Type\n\n"
  },
  {
    "path": "en-product/datastreams/datastream-invalidate-value.md",
    "content": "# Datastream: Invalidate Value\n\n"
  },
  {
    "path": "en-product/datastreams/datastream-min-max-values.md",
    "content": "# Datastream: Min/Max values\n\n"
  },
  {
    "path": "en-product/datastreams/datastream-name.md",
    "content": "# Datastream Name\n\n"
  },
  {
    "path": "en-product/datastreams/datastream-save-raw-data.md",
    "content": "# Datastream: Save Raw Data\n\n"
  },
  {
    "path": "en-product/datastreams/datastream-virtual-pin.md",
    "content": "# Datastream: Virtual Pin\n\n"
  },
  {
    "path": "en-product/datastreams/decimals-formatting.md",
    "content": "# Decimals Formatting\n\n"
  },
  {
    "path": "en-product/datastreams/default-value.md",
    "content": "# Default Value\n\n"
  },
  {
    "path": "en-product/datastreams/expose-to-automation.md",
    "content": "# Expose to Automation\n\n"
  },
  {
    "path": "en-product/datastreams/sync-with-the-latest-server-value.md",
    "content": "# Sync with the latest server value\n\n"
  },
  {
    "path": "en-product/datastreams/wait-for-confirmation-from-the-device.md",
    "content": "# Wait for confirmation from the device\n\n"
  },
  {
    "path": "en-product/events/README.md",
    "content": "# Events\n\n"
  },
  {
    "path": "en-product/events/events-code.md",
    "content": "# Events: Code\n\n"
  },
  {
    "path": "en-product/events/events-name.md",
    "content": "# Events: Name\n\n"
  },
  {
    "path": "en-product/events/events-notification-period.md",
    "content": "# Events: Notifications Limit\n\nThis setting limits the number of notifications for a specified time period. \n\nExample: 1 minute period means end-users will only get one notification per 1 minute, even if hardware or API sends more. \n\nNotifications Limit can be defined per each Event individually. \n\nExample: If you set two Events to different Notification Limits, they will be processed independently, and end-users will get both notifications accordingly to the specified limits.\n\n"
  },
  {
    "path": "en-product/events/events-notification.md",
    "content": "# Events: Notification\n\n"
  },
  {
    "path": "en-product/events/events-online-offline.md",
    "content": "# System Events\n\n"
  },
  {
    "path": "en-product/general-settings/README.md",
    "content": "# General Settings\n\n"
  },
  {
    "path": "en-product/general-settings/manufacturer.md",
    "content": "# Manufacturer\n\n"
  },
  {
    "path": "en-product/general-settings/offline-ignore-period.md",
    "content": "# Offline Ignore Period\n\n"
  },
  {
    "path": "en-product/metadata.md",
    "content": "# Metadata\n\n"
  },
  {
    "path": "en-product/mobile-app-ui.md",
    "content": "# Mobile app UI\n\n"
  },
  {
    "path": "en-product/web-dashboard.md",
    "content": "# Web Dashboard\n\n"
  },
  {
    "path": "faq.md",
    "content": "# FAQ\n\n* I backed Blynk on Kickstarter. Where are my widgets and why the app is free?\n\n  > App is free because otherwise you would have to pay to download it. This is how AppStore and Google Play works. Current Blynk release has a limited amount of widgets. We decided to make them free for everyone until we implement store. After that, every widget will be paid. However every backer will get them for free \\(according to their pledge\\).\n\n* What is Blynk Cloud?\n\n  > Blynk Cloud is a open-source software written on Java using plain TCP/IP and secured TCP/IP \\(for hardware that supports it\\) sockets and running on our server. Blynk iOS and Android apps connect to Blynk Cloud by default. Access is free for every Blynk user. We also provide a Private Server distribution for those who want to [install it locally](./#blynk-server).\n\n* How much access to Cloud Blynk Server cost?\n\n  > It is free for every Blynk user.\n\n* Can I run Blynk server locally?\n\n  > Yes. Those of you, who want extra security or don’t have internet connection, can install Local Blynk Server and run it in your own local network. Blynk Server is Open-Source and it takes less than few seconds to deploy. All the instructions and files are [here](./#blynk-server).\n\n* What are the requirements to run Private Blynk Server?\n\n  > To run Private Blynk Server, all you need is Java Runtime Environment.\n\n* Can I run Blynk server on Raspberry Pi?\n\n  > Yes, surely! [Here are the instructions](./#blynk-server-how-to-run-local-blynk-server-launch-blynk-server-on-raspberry-pi).\n\n* Does Blynk app work over Bluetooth?\n\n  > Yes. It is in beta right now.\n\n* Does Blynk support Ethernet / Wi-FI / UART?\n\n  > Yes, all of them. See full list of [supported hardware](./#supported-hardware) and shields.\n\n* I don't have any shield. Can I use Blynk with my computer?\n\n  > Yes, you can use Blynk just with a USB cable. There is a step-by-step [instruction](./#other-hardware-connect-over-usb) on how to do it.\n\n* Can Blynk handle multiple Arduinos?\n\n  > Yes. There are 3 ways right now:\n  >\n  > * add multiple devices to your project.\n  > * you may use same [Auth Token](./#getting-started-getting-started-with-application-auth-token) for different hardware. In that case you can control few hardwares from 1 dashboard.\n  > * you can do it using [Bridge functionality](./#widgets-other-bridge) which allows you to send messages from one hardware to another.\n\n* Does Blynk server store sensor data when app goes offline?\n\n  > Yes, every command that hardware sends to server is stored. You could use [History Graph](./#widgets-displays-superchart) widget in order to view it.\n\n* How many Virtual Pins I can use?\n\n  > It depends mostly on your hardware. Low-end hardware may use up to 32 Virtual Pins. More powerful \\(like ESP8266\\) can use up to 128 but it requires also BLYNK\\_USE\\_128\\_VPINS property in your sketch. [Example](https://github.com/blynkkk/blynk-library/blob/master/src/Blynk/BlynkConfig.h#L64).\n\n* Why does the app require all these permissions?\n\n  > [http://help.blynk.cc/faq/blynk-android-permissions-explained](http://help.blynk.cc/faq/blynk-android-permissions-explained)\n\n"
  },
  {
    "path": "firmware-api/README.md",
    "content": "# Firmware API \\(C++\\)\n\n"
  },
  {
    "path": "firmware-api/disable-widgets-in-the-app.md",
    "content": "# Disable Widgets in the App\n\nThis command disables and enables widget in the app\n\n```cpp\nBlynk.setProperty(V0,\"isDisabled\", true);\n```\n\n\n\n"
  },
  {
    "path": "firmware-api-1/disable-widgets-in-the-app.md",
    "content": "# Disable Widgets in the App\n\nThis command disables and enables widget in the app\n\n```cpp\nBlynk.setProperty(V0,\"isDisabled\", true);\n```\n\n"
  },
  {
    "path": "gettingstarted.md",
    "content": "# Getting Started\n\nLet's get you started in 5 minutes \\(reading doesn't count!\\). We will switch on an LED connected to your Arduino using the Blynk App on your smartphone.\n\nConnect an LED as shown here:\n\n![](.gitbook/assets/Arduino_LED.jpg)\n\n## Getting Started With The Blynk App\n\n### 1. Create a Blynk Account\n\nAfter you download the Blynk App, you'll need to create a New Blynk account. This account is separate from the accounts used for the Blynk Forums, in case you already have one.\n\nWe recommend using a **real** email address because it will simplify things later.\n\n![](.gitbook/assets/register_account.png)\n\n#### Why do I need to create an account?\n\nAn account is needed to save your projects and have access to them from multiple devices from anywhere. It's also a security measure.\n\nYou can always set up your own [Private Blynk Server](./#blynk-server) and have full control.\n\n### 2. Create a New Project\n\nAfter you've successfully logged into your account, start by creating a new project.\n\n![](.gitbook/assets/create_project_button.png)\n\n### 3. Choose Your Hardware\n\nSelect the hardware model you will use. Check out the [list of supported hardware](./#supported-hardware)!\n\n![](.gitbook/assets/select_hardware.png)\n\n### 4. Auth Token\n\n**Auth Token** is a unique identifier which is needed to connect your hardware to your smartphone. Every new project you create will have its own Auth Token. You'll get Auth Token automatically on your email after project creation. You can also copy it manually. Click on devices section and selected required device :\n\n![](.gitbook/assets/token_1.png)\n\nAnd you'll see token :\n\n![](.gitbook/assets/new_device.png)\n\n**NOTE:** Don't share your Auth Token with anyone, unless you want someone to have access to your hardware.\n\nIt's very convenient to send it over e-mail. Press the e-mail button and the token will be sent to the e-mail address you used for registration. You can also tap on the Token line and it will be copied to the clipboard.\n\nNow press the **\"Create\"** button.\n\n![](.gitbook/assets/new_project.png)\n\n### 5. Add a Widget\n\nYour project canvas is empty, let's add a button to control our LED.\n\nTap anywhere on the canvas to open the widget box. All the available widgets are located here. Now pick a button.\n\n**Widget Box**\n\n![](.gitbook/assets/widgets_box.png)\n\n**Drag-n-Drop** - Tap and hold the Widget to drag it to the new position.\n\n**Widget Settings** - Each Widget has it's own settings. Tap on the widget to get to them.\n\n![](.gitbook/assets/button_settings.png)\n\nThe most important parameter to set is **PIN** . The list of pins reflects physical pins defined by your hardware. If your LED is connected to Digital Pin 8 - then select **D8** \\(**D** - stands for **D**igital\\).\n\n![](.gitbook/assets/pin_selection.png)\n\n### 6. Run The Project\n\nWhen you are done with the Settings - press the **PLAY** button. This will switch you from EDIT mode to PLAY mode where you can interact with the hardware. While in PLAY mode, you won't be able to drag or set up new widgets, press **STOP** and get back to EDIT mode.\n\nYou will get a message saying \"Arduino UNO is offline\". We'll deal with that in the next section.\n\n![](.gitbook/assets/play_button.png)\n\n## Getting Started With Hardware\n\n### How To Use an Example Sketch\n\nYou should by now have the Blynk Library installed on your computer. If not - [click here](./#downloads-blynk-library).\n\nExample sketches will help you get your hardware online quickly and major Blynk features.\n\nOpen the example sketch according to the hardware model or shield you are using.\n\n![](.gitbook/assets/connection_type_sketch.png)\n\nLet's take a look at the example sketch for an [Arduino UNO + Ethernet shield](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n```cpp\n#define BLYNK_PRINT Serial\n#include <SPI.h>\n#include <Ethernet.h>\n#include <BlynkSimpleEthernet.h>\n\nchar auth[] = \"YourAuthToken\";\n\nvoid setup()\n{\n  Serial.begin(9600); // See the connection status in Serial Monitor\n  Blynk.begin(auth);  // Here your Arduino connects to the Blynk Cloud.\n}\n\nvoid loop()\n{\n  Blynk.run(); // All the Blynk Magic happens here...\n}\n```\n\n### Auth Token\n\nIn this example sketch, find this line:\n\n```cpp\nchar auth[] = \"YourAuthToken\";\n```\n\nThis is the [Auth Token](./#getting-started-getting-started-with-application-4-auth-token) that you emailed yourself. Please check your email and copy it, then paste it inside the quotation marks.\n\nIt should look similar to this:\n\n```text\nchar auth[] = \"f45626c103a94983b469637978b0c78a\";\n```\n\nUpload the sketch to the board and open Serial Terminal. Wait until you see something like this:\n\n```text\nBlynk v.X.X.X\nYour IP is 192.168.0.11\nConnecting...\nBlynk connected!\n```\n\n**Congrats! You are all set! Now your hardware is connected to the Blynk Cloud!**\n\n## Blynking\n\nGo back to the Blynk App, push the button and turn the LED on and off! It should be Blynking.\n\n![](.gitbook/assets/button_pressed.png)\n\nCheck out [other example sketches](https://github.com/blynkkk/blynk-library/tree/master/examples).\n\nFeel free to experiment and combine different examples together to create your own amazing projects.\n\nFor example, to attach an LED to a [PWM](http://www.arduino.cc/en/Tutorial/Fading)-enabled Pin on your Arduino, set the slider widget to control the brightness of an LED. Just use the same steps described above.\n\n"
  },
  {
    "path": "google-code-prettify/CHANGES.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <title>Change Log</title>\n  </head>\n  <body bgcolor=\"white\">\n    <a style=\"float:right\" href=\"README.html\">README</a>\n\n    <h1>Known Issues</h1>\n    <ul>\n      <li>Perl formatting is really crappy.  Partly because the author is lazy and\n      partly because Perl is\n      <a href=\"http://www.perlmonks.org/?node_id=663393\">hard</a> to parse.\n      <li>On some browsers, <code>&lt;code&gt;</code> elements with newlines in the text\n      which use CSS to specify <code>white-space:pre</code> will have the newlines\n      improperly stripped if the element is not attached to the document at the time\n      the stripping is done.  Also, on IE 6, all newlines will be stripped from\n      <code>&lt;code&gt;</code> elements because of the way IE6 produces\n      <code>innerHTML</code>.  Workaround: use <code>&lt;pre&gt;</code> for code with\n      newlines.\n    </ul>\n\n    <h1>Change Log</h1>\n    <h2>29 March 2007</h2>\n    <ul>\n      <li>Added <a href=\"tests/prettify_test.html#PHP\">tests</a> for PHP support\n        to address\n      <a href=\"http://code.google.com/p/google-code-prettify/issues/detail?id=3\"\n       >issue 3</a>.\n      <li>Fixed\n      <a href=\"http://code.google.com/p/google-code-prettify/issues/detail?id=6\"\n       >bug</a>: <code>prettyPrintOne</code> was not halting.  This was not\n        reachable through the normal entry point.\n      <li>Fixed\n      <a href=\"http://code.google.com/p/google-code-prettify/issues/detail?id=4\"\n       >bug</a>: recursing into a script block or PHP tag that was not properly\n        closed would not silently drop the content.\n        (<a href=\"tests/prettify_test.html#issue4\">test</a>)\n      <li>Fixed\n      <a href=\"http://code.google.com/p/google-code-prettify/issues/detail?id=8\"\n       >bug</a>: was eating tabs\n        (<a href=\"tests/prettify_test.html#issue8\">test</a>)\n      <li>Fixed entity handling so that the caveat\n        <blockquote>\n          <p>Caveats: please properly escape less-thans.  <tt>x&amp;lt;y</tt>\n          instead of <tt>x&lt;y</tt>, and use <tt>&quot;</tt> instead of\n          <tt>&amp;quot;</tt> for string delimiters.</p>\n        </blockquote>\n        is no longer applicable.\n      <li>Added noisefree's C#\n      <a href=\"http://code.google.com/p/google-code-prettify/issues/detail?id=4\"\n       >patch</a>\n      <li>Added a <a href=\"http://google-code-prettify.googlecode.com/files/prettify-small.zip\">distribution</a> that has comments and\n        whitespace removed to reduce download size from 45.5kB to 12.8kB.\n    </ul>\n    <h2>4 Jul 2008</h2>\n    <ul>\n      <li>Added <a href=\"http://code.google.com/p/google-code-prettify/issues/detail?id=17\">language specific formatters</a> that are triggered by the presence\n      of a <code>lang-&lt;language-file-extension&gt;</code></li>\n      <li>Fixed <a href=\"http://code.google.com/p/google-code-prettify/issues/detail?id=29\">bug</a>: python handling of <code>'''string'''</code>\n      <li>Fixed bug: <code>/</code> in regex <code>[charsets] should not end regex</code>\n    </ul>\n    <h2>5 Jul 2008</h2>\n    <ul>\n      <li>Defined language extensions for Lisp and Lua</code>\n    </ul>\n    <h2>14 Jul 2008</h2>\n    <ul>\n      <li>Language handlers for F#, OCAML, SQL</code>\n      <li>Support for <code>nocode</code> spans to allow embedding of line\n      numbers and code annotations which should not be styled or otherwise\n      affect the tokenization of prettified code.\n      See the issue 22\n      <a href=\"tests/prettify_test.html#issue22\">testcase</a>.</code>\n    </ul>\n    <h2>6 Jan 2009</h2>\n    <ul>\n      <li>Language handlers for Visual Basic, Haskell, CSS, and WikiText</li>\n      <li>Added <tt>.mxml</tt> extension to the markup style handler for\n        Flex <a href=\"http://en.wikipedia.org/wiki/MXML\">MXML files</a>.  See\n        <a\n        href=\"http://code.google.com/p/google-code-prettify/issues/detail?id=37\"\n        >issue 37</a>.\n      <li>Added <tt>.m</tt> extension to the C style handler so that Objective\n        C source files properly highlight.  See\n        <a\n        href=\"http://code.google.com/p/google-code-prettify/issues/detail?id=58\"\n       >issue 58</a>.\n      <li>Changed HTML lexer to use the same embedded source mechanism as the\n        wiki language handler, and changed to use the registered\n        CSS handler for STYLE element content.\n    </ul>\n    <h2>21 May 2009</h2>\n    <ul>\n      <li>Rewrote to improve performance on large files.\n        See <a href=\"http://mikesamuel.blogspot.com/2009/05/efficient-parsing-in-javascript.html\">benchmarks</a>.</li>\n      <li>Fixed bugs with highlighting of Haskell line comments, Lisp\n        number literals, Lua strings, C preprocessor directives,\n        newlines in Wiki code on Windows, and newlines in IE6.</li>\n    </ul>\n    <h2>14 August 2009</h2>\n    <ul>\n      <li>Fixed prettifying of <code>&lt;code&gt;</code> blocks with embedded newlines.\n    </ul>\n    <h2>3 October 2009</h2>\n    <ul>\n      <li>Fixed prettifying of XML/HTML tags that contain uppercase letters.\n    </ul>\n    <h2>19 July 2010</h2>\n    <ul>\n      <li>Added support for line numbers.  Bug\n        <a href=\"http://code.google.com/p/google-code-prettify/issues/detail?id=22\"\n         >22</a></li>\n      <li>Added YAML support.  Bug\n        <a href=\"http://code.google.com/p/google-code-prettify/issues/detail?id=123\"\n         >123</a></li>\n      <li>Added VHDL support courtesy Le Poussin.</li>\n      <li>IE performance improvements.  Bug\n        <a href=\"http://code.google.com/p/google-code-prettify/issues/detail?id=102\"\n         >102</a> courtesy jacobly.</li>\n      <li>A variety of markup formatting fixes courtesy smain and thezbyg.</li>\n      <li>Fixed copy and paste in IE[678].\n      <li>Changed output to use <code>&amp;#160;</code> instead of\n        <code>&amp;nbsp;</code> so that the output works when embedded in XML.\n        Bug\n        <a href=\"http://code.google.com/p/google-code-prettify/issues/detail?id=108\"\n         >108</a>.</li>\n    </ul>\n    <h2>7 September 2010</h2>\n    <ul>\n      <li>Added support for coffeescript courtesy Cezary Bartoszuk.</li>\n    </ul>\n    <h2>4 March 2011</h2>\n    <ul>\n      <li>Added a <a href=\"http://google-code-prettify.googlecode.com/svn/trunk/styles/index.html\">themes\n      gallery</a> to showcase contributed styles.</li>\n      <li>Added support for XQuery courtesy Patrick Wied, Nemerle\n      courtesy Zimin A.V., and Latex support courtesy Martin S.</li>\n    </ul>\n    <h2>29 March 2011</h2>\n    <ul>\n      <li>Fixed IE newline issues, and copying/pasting of prettified\n      source code from IE.  This required significant internal changes\n      but involves no API changes.\n      <b>Caveat:</b> <code>prettyPrintOne</code> injects the HTML\n      passed to it into a <code>&lt;pre&gt;</code> element.\n      If the HTML comes from a trusted source, this may allow XSS.\n      Do not do this.  This should not be a problem for existing apps\n      since the standard usage is to rewrite the HTML and then inject\n      it, so anyone doing that with untrusted HTML already has an XSS\n      vulnerability.  If you sanitize and prettify HTML from an\n      untrusted source, sanitize first.\n    </ul>\n    <h2>4 February 2013</h2>\n    <ul>\n      <li>Language handlers for Dart, Erlang, Mumps, TCL, R, S., and others</li>\n      <li>Bug fix: VB REM style comments.</li>\n      <li>Bug fix: CSS color literals / ID selector confusion.</li>\n      <li>Bug fix: IE8 line breaks.</li>\n    </ul>\n    <h2>24 February 2013</h2>\n    <ul>\n      <li>Added a one script autoload&amp;run mechanism and a way to\n          embed hints in processing instructions/comments.\n          See <a href=\"examples/quine.html\">example</a>.\n    </ul>\n    <h2>4 March 2013</h2>\n    <ul>\n      <li>Matlab language handler courtesy Amro&#xb3;</li>\n    </ul>\n  </body>\n</html>\n"
  },
  {
    "path": "google-code-prettify/COPYING",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   Copyright 2011 Mike Samuel et al\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "google-code-prettify/Makefile",
    "content": "SHELL := /bin/bash\n\nCLOSURE_COMPILER=java -jar tools/closure-compiler/compiler.jar \\\n\t      --warning_level VERBOSE \\\n\t      --language_in ECMASCRIPT5 \\\n\t      --compilation_level ADVANCED_OPTIMIZATIONS \\\n\t      --charset US-ASCII\n# Don't specify --charset=UTF-8.  If we do, then non-ascii codepoints\n# that do not correspond to line terminators are converted\n# to UTF-8 sequences instead of being emitted as ASCII.\n# This makes the resulting JavaScript less portable.\n\nYUI_COMPRESSOR=java -jar tools/yui-compressor/yuicompressor-2.4.4.jar \\\n\t      --charset UTF-8\n\nTAR_ROOT=distrib/google-code-prettify\n\nall: distrib\n\nclean:\n\trm -rf distrib.tstamp distrib src/prettify.js src/run_prettify.js\n\nsrc/prettify.js: js-modules/*.js js-modules/*.pl\n\t@if [ -e \"$@\" ]; then chmod +w \"$@\"; fi\n\t@perl js-modules/js_include.pl \"$$(basename $@)\" > \"$@\"\n\t@if [ -e \"$@\" ]; then chmod -w \"$@\"; fi\n\nsrc/run_prettify.js: js-modules/*.js js-modules/*.pl\n\t@if [ -e \"$@\" ]; then chmod +w \"$@\"; fi\n\t@perl js-modules/js_include.pl \"$$(basename $@)\" > \"$@\"\n\t@if [ -e \"$@\" ]; then chmod -w \"$@\"; fi\n\ndistrib: distrib.tstamp distrib/prettify-small.tgz distrib/prettify-small.zip distrib/prettify-small.tar.bz2\n\t@wc -c distrib/prettify-small.{tar.bz2,tgz,zip} \\\n\t    | grep -v total\n\ndistrib.tstamp: src/prettify.js src/run_prettify.js src/*.js src/*.css\n\t@echo Compiling\n\t@mkdir -p $(TAR_ROOT)\n\t@for f in src/*.css; do \\\n\t  $(YUI_COMPRESSOR) --type css $$f \\\n\t      > $(TAR_ROOT)/$$(basename $$f); \\\n\t  wc -c $$f $(TAR_ROOT)/$$(basename $$f) \\\n\t      | grep -v total; \\\n\tdone\n\t@$(CLOSURE_COMPILER) --js src/prettify.js \\\n\t    --externs tools/closure-compiler/console-externs.js \\\n\t    --externs tools/closure-compiler/amd-externs.js \\\n\t    --define IN_GLOBAL_SCOPE=true \\\n\t    --output_wrapper='!function(){%output%}()' \\\n\t    > $(TAR_ROOT)/prettify.js\n\t@wc -c src/prettify.js $(TAR_ROOT)/prettify.js \\\n\t    | grep -v total\n\t@$(CLOSURE_COMPILER) --js src/run_prettify.js \\\n\t    --externs tools/closure-compiler/console-externs.js \\\n\t    --externs tools/closure-compiler/amd-externs.js \\\n\t    --define IN_GLOBAL_SCOPE=false \\\n\t    --output_wrapper='!function(){%output%}()' \\\n\t    > $(TAR_ROOT)/run_prettify.js\n\t@wc -c src/run_prettify.js $(TAR_ROOT)/run_prettify.js \\\n\t    | grep -v total\n\t@for f in src/lang*.js; do \\\n\t  if [ $$f -nt $(TAR_ROOT)/$$(basename $$f) ]; then \\\n\t    $(CLOSURE_COMPILER) --js $$f --externs js-modules/externs.js \\\n\t        | perl -pe 's/\\bPR\\.PR_ATTRIB_NAME\\b/\"atn\"/g; \\\n\t\t\t    s/\\bPR\\.PR_ATTRIB_VALUE\\b/\"atv\"/g; \\\n\t\t\t    s/\\bPR\\.PR_COMMENT\\b/\"com\"/g; \\\n\t\t\t    s/\\bPR\\.PR_DECLARATION\\b/\"dec\"/g; \\\n\t\t\t    s/\\bPR\\.PR_KEYWORD\\b/\"kwd\"/g; \\\n\t\t\t    s/\\bPR\\.PR_LITERAL\\b/\"lit\"/g; \\\n\t\t\t    s/\\bPR\\.PR_PLAIN\\b/\"pln\"/g; \\\n\t\t\t    s/\\bPR\\.PR_PUNCTUATION\\b/\"pun\"/g; \\\n\t\t\t    s/\\bPR\\.PR_STRING\\b/\"str\"/g; \\\n\t\t\t    s/\\bPR\\.PR_TAG\\b/\"tag\"/g; \\\n\t\t\t    s/\\bPR\\.PR_TYPE\\b/\"typ\"/g;' \\\n\t        > $(TAR_ROOT)/$$(basename $$f); \\\n\t    wc -c $$f $(TAR_ROOT)/$$(basename $$f) \\\n\t        | grep -v total; \\\n\t  fi \\\n\tdone\n\t@touch distrib.tstamp\n\nlang-aliases : lang-aliases.tstamp\nlang-aliases.tstamp : distrib.tstamp\n\t@tools/lang-handler-aliases.sh \\\n            distrib/sources/google-code-prettify/src \\\n\t  | perl -ne 'system(\"cp $$1 $$2\") if m/^(\\S+) (\\S+)$$/ && ! -e $$2' \\\n\t  && touch lang-aliases.tstamp\n\n%.tgz: %.tar\n\t@gzip -c -9 $^ > $@\n\n%.tar.bz2: %.tar\n\t@bzip2 -k -9f $^\n\ndistrib/prettify-small.tar: distrib.tstamp\n\ttar cf $@ -C distrib google-code-prettify\n\ndistrib/prettify-small.zip: distrib.tstamp\n\t@pushd distrib >& /dev/null; \\\n\trm -f ../$@; \\\n\tzip -q -9 -r ../$@ google-code-prettify; \\\n\tpopd >& /dev/null\n\ndistrib/prettify.tar: distrib.tstamp\n\tmkdir -p distrib/sources/google-code-prettify\n\tcp -fr CHANGES.html COPYING README.html Makefile \\\n\t  examples js-modules src styles tests tools \\\n\t  distrib/sources/google-code-prettify\n\ttar cf distrib/prettify.tar -C distrib/sources google-code-prettify\n\n"
  },
  {
    "path": "google-code-prettify/README.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n\n<html>\n  <head>\n    <title>Javascript code prettifier</title>\n\n    <link href=\"src/prettify.css\" type=\"text/css\" rel=\"stylesheet\" />\n\n    <script src=\"src/prettify.js\" type=\"text/javascript\"></script>\n\n    <style type=\"text/css\">\n      body { margin-left: .5in }\n      h1, h2, h3, h4, .footer { margin-left: -.4in; }\n      a.Extension { display: inline-block; width: 5em; height:2.5em; border: 1px solid black; vertical-align: top; text-align: center }\n    </style>\n  </head>\n\n  <body onload=\"prettyPrint()\" bgcolor=\"white\">\n    <small style=\"float: right\">Languages : <a href=\"README-zh-Hans.html\">CH</a></small>\n    <h1>Javascript code prettifier</h1>\n\n    <h2>Setup</h2>\n    <ol>\n      <li><a href=\"http://code.google.com/p/google-code-prettify/downloads/list\">Download</a> a distribution\n      <li>Include the script tag below in your document\n        <pre class=\"prettyprint\">\n&gt;script src=\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js&gt;&lt;/script&gt;</pre>\n      <li>See <a href=\"http://code.google.com/p/google-code-prettify/wiki/GettingStarted\">Getting Started</a> to configure that URL with options you need.</a>\n      <li>Look at the <a href=\"http://google-code-prettify.googlecode.com/svn/trunk/styles/index.html\">skin gallery</a> and pick styles that suit you.</li>\n    </ol>\n\n    <h2>Usage</h2>\n    <p>Put code snippets in\n    <tt>&lt;pre class=\"prettyprint\"&gt;...&lt;/pre&gt;</tt>\n    or <tt>&lt;code class=\"prettyprint\"&gt;...&lt;/code&gt;</tt>\n    and it will automatically be pretty printed.\n\n    <table summary=\"code examples\">\n      <tr>\n        <th>The original\n        <th>Prettier\n      <tr>\n        <td><pre style=\"border: 1px solid #888;padding: 2px\"\n             ><a name=\"voila1\"></a>class Voila {\npublic:\n  // Voila\n  static const string VOILA = \"Voila\";\n\n  // will not interfere with embedded <a href=\"#voila1\">tags</a>.\n}</pre>\n\n        <td><pre class=\"prettyprint\"><a name=\"voila2\"></a>class Voila {\npublic:\n  // Voila\n  static const string VOILA = \"Voila\";\n\n  // will not interfere with embedded <a href=\"#voila2\">tags</a>.\n}</pre>\n    </table>\n\n    <h2>FAQ</h2>\n    <h3 id=\"langs\">For which languages does it work?</h3>\n    <p>The comments in <tt>prettify.js</tt> are authoritative but the lexer\n    should work on a number of languages including C and friends,\n    Java, Python, Bash, SQL, HTML, XML, CSS, Javascript, Makefiles,\n    and Rust.\n    It works passably on Ruby, PHP, VB, and Awk and a decent subset of Perl\n    and Ruby, but, because of commenting conventions, but doesn't work on\n    Smalltalk.</p>\n\n    <p>Other languages are supported via extensions:\n    <div>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-apollo.js\">Apollo</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-basic.js\">Basic</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-clj.js\">Clojure</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-css.js\">CSS</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-dart.js\">Dart</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-erlang.js\">Erlang</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-go.js\">Go</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-hs.js\">Haskell</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-lisp.js\">Lisp, Scheme</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-llvm.js\">Llvm</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-lua.js\">Lua</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-matlab.js\">Matlab</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-ml.js\">MLs:F#, Ocaml,SML</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-mumps.js\">Mumps</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-n.js\">Nemerle</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-pascal.js\">Pascal</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-proto.js\">Protocol buffers</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-r.js\">R, S</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-rd.js\">RD</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-scala.js\">Scala</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-sql.js\">SQL</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-tcl.js\">TCL</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-tex.js\">Latek</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-vb.js\">Visual Basic</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-vhdl.js\">CHDL</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-wiki.js\">Wiki</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-xq.js\">XQ</a>\n      <a class=\"Extension\" href=\"http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-yaml.js\">YAML</a>\n    </div>\n\n    <p>If you'd like to add an extension for your favorite language, please\n    look at <tt>src/lang-lisp.js</tt> and file an\n    <a href=\"http://code.google.com/p/google-code-prettify/issues/list\"\n     >issue</a> including your language extension, and a testcase.</p>\n\n    <h3>How do I specify the language of my code?</h3>\n    <p>You don't need to specify the language since <code>prettyprint()</code>\n    will guess.  You can specify a language by specifying the language extension\n    along with the <code>prettyprint</code> class like so:</p>\n    <pre class=\"prettyprint lang-html\"\n>&lt;pre class=&quot;prettyprint <b>lang-html</b>&quot;&gt;\n  The lang-* class specifies the language file extensions.\n  File extensions supported by default include\n    \"bsh\", \"c\", \"cc\", \"cpp\", \"cs\", \"csh\", \"cyc\", \"cv\", \"htm\", \"html\",\n    \"java\", \"js\", \"m\", \"mxml\", \"perl\", \"pl\", \"pm\", \"py\", \"rb\", \"sh\",\n    \"xhtml\", \"xml\", \"xsl\".\n&lt;/pre&gt;</pre>\n\n    <p>You may also use the\n    <a href=\"http://dev.w3.org/html5/spec-author-view/the-code-element.html#the-code-element\"\n     >HTML 5</a> convention of embedding a <tt>code</tt> element inside the\n    <code>PRE</code> and using <code>language-java</code> style classes.\n    E.g. <xmp class=\"prettyprint\"><pre class=\"prettyprint\"><code class=\"language-java\">...</code></pre></xmp>\n\n    <h3>It doesn't work on <tt>&lt;obfuscated code sample&gt;</tt>?</h3>\n    <p>Yes.  Prettifying obfuscated code is like putting lipstick on a pig\n    &mdash; i.e. outside the scope of this tool.</p>\n\n    <h3>Which browsers does it work with?</h3>\n    <p>It's been tested with IE 6, Firefox 1.5 &amp; 2, and Safari 2.0.4.\n    Look at <a href=\"tests/prettify_test.html\">the test page</a> to see if it\n    works in your browser.</p>\n\n    <h3>What's changed?</h3>\n    <p>See the <a href=\"CHANGES.html\">change log</a></p>\n\n    <h3>Why doesn't Prettyprinting of strings work on WordPress?</h3>\n    <p>Apparently wordpress does \"smart quoting\" which changes close quotes.\n    This causes end quotes to not match up with open quotes.\n    <p>This breaks prettifying as well as copying and pasting of code samples.\n    See\n    <a href=\"http://wordpress.org/support/topic/125038\"\n    >WordPress's help center</a> for info on how to stop smart quoting of code\n    snippets.</p>\n\n    <h3 id=\"linenums\">How do I put line numbers in my code?</h3>\n    <p>You can use the <code>linenums</code> class to turn on line\n    numbering.  If your code doesn't start at line number 1, you can\n    add a colon and a line number to the end of that class as in\n    <code>linenums:52</code>.\n\n    <p>For example\n<pre class=\"prettyprint\">&lt;pre class=\"prettyprint linenums:<b>4</b>\"\n&gt;// This is line 4.\nfoo();\nbar();\nbaz();\nboo();\nfar();\nfaz();\n&lt;pre&gt;</pre>\n    produces\n<pre class=\"prettyprint linenums:4\"\n>// This is line 4.\nfoo();\nbar();\nbaz();\nboo();\nfar();\nfaz();\n</pre>\n\n    <h3>How do I prevent a portion of markup from being marked as code?</h3>\n    <p>You can use the <code>nocode</code> class to identify a span of markup\n    that is not code.\n<pre class=\"prettyprint\">&lt;pre class=prettyprint&gt;\nint x = foo();  /* This is a comment  &lt;span class=\"nocode\"&gt;This is not code&lt;/span&gt;\n  Continuation of comment */\nint y = bar();\n&lt;/pre&gt;</pre>\nproduces\n<pre class=\"prettyprint\">\nint x = foo();  /* This is a comment  <span class=\"nocode\">This is not code</span>\n  Continuation of comment */\nint y = bar();\n</pre>\n\n    <p>For a more complete example see the issue22\n    <a href=\"tests/prettify_test.html#issue22\">testcase</a>.</p>\n\n    <h3>I get an error message \"a is not a function\" or \"opt_whenDone is not a function\"</h3>\n    <p>If you are calling <code>prettyPrint</code> via an event handler, wrap it in a function.\n    Instead of doing\n    <blockquote>\n      <code class=\"prettyprint lang-js\"\n       >addEventListener('load', prettyPrint, false);</code>\n    </blockquote>\n    wrap it in a closure like\n    <blockquote>\n      <code class=\"prettyprint lang-js\"\n       >addEventListener('load', function (event) { prettyPrint() }, false);</code>\n    </blockquote>\n    so that the browser does not pass an event object to <code>prettyPrint</code> which\n    will confuse it.\n\n    <h3>How can I customize the colors and styles of my code?</h3>\n    <p>\n    Prettify adds <code>&lt;span&gt;</code> with <code>class</code>es describing\n    the kind of code.  You can create CSS styles to matches these\n    classes.\n    See the\n    <a href=\"http://google-code-prettify.googlecode.com/svn/trunk/styles/index.html\">\n    theme gallery</a> for examples.\n    </p>\n\n    <h3>I can't add classes to my code (because it comes from Markdown, etc.)</h3>\n    <p>\n    Instead of <code class=\"prettyprint\">&lt;pre class=\"prettyprint ...\"&gt;</code> you can use a\n    comment or processing instructions that survives processing instructions :\n    <code>&lt;?prettify ...?&gt;</code> works as explained in \n    <a href=\"http://code.google.com/p/google-code-prettify/wiki/GettingStarted\">Getting Started</a></p>\n\n    <br><br><br>\n\n    <div class=\"footer\">\n<!-- Created: Tue Oct  3 17:51:56 PDT 2006 -->\n<!-- hhmts start -->Last modified: Mon Mar  4 14:16:04 EST 2013 <!-- hhmts end -->\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "google-code-prettify/examples/quine.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\" />\n<title>Making Quines Prettier</title>\n<!-- The defer is not necessary for autoloading, but is necessary for the\n     script at the bottom to work as a Quine. -->\n<script src=\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js?autoload=true&amp;skin=sunburst&amp;lang=css\" defer=\"defer\"></script>\n<style>.operative { font-weight: bold; border:1px solid yellow }</style>\n</head>\n\n<body>\n<h1>Making Quines Prettier</h1>\n\n<p>\nBelow is the content of this page prettified.  The <code>&lt;pre&gt;</code>\nelement is prettified because it has <code>class=\"prettyprint\"</code> and\nbecause the sourced script loads a JavaScript library that styles source\ncode.\n</p>\n\n<p>\nThe line numbers to the left appear because the preceding comment\n<code>&lt;?prettify lang=html linenums=true?&gt;</code> turns on\nline-numbering and the\n<a href=\"http://google-code-prettify.googlecode.com/svn/trunk/styles/index.html\">stylesheet</a>\n(see <code>skin=sunburst</code> in the <code>&lt;script src&gt;</code>)\nspecifies that every fifth line should be numbered.\n</p>\n\n<!-- Language hints can be put in XML application directive style comments. -->\n<?prettify lang=html linenums=true?>\n<pre class=\"prettyprint\" id=\"quine\" style=\"border:4px solid #88c\"></pre>\n\n<script>//<![CDATA[\n(function () {\n  function html(s) {\n    return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n  }\n\n  var quineHtml = html(\n        '<!DOCTYPE html>\\n<html>\\n'\n      + document.documentElement.innerHTML \n      + '\\n<\\/html>\\n');\n\n  // Highlight the operative parts:\n  quineHtml = quineHtml.replace(\n    /&lt;script src[\\s\\S]*?&gt;&lt;\\/script&gt;|&lt;!--\\?[\\s\\S]*?--&gt;|&lt;pre\\b[\\s\\S]*?&lt;\\/pre&gt;/g,\n    '<span class=\"operative\">$&</span>');\n\n  document.getElementById(\"quine\").innerHTML = quineHtml;\n})();\n//]]>\n</script></body>\n</html>\n"
  },
  {
    "path": "google-code-prettify/js-modules/combinePrefixPatterns.js",
    "content": "/**\n * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally\n * matches the union of the sets of strings matched by the input RegExp.\n * Since it matches globally, if the input strings have a start-of-input\n * anchor (/^.../), it is ignored for the purposes of unioning.\n * @param {Array.<RegExp>} regexs non multiline, non-global regexs.\n * @return {RegExp} a global regex.\n */\nfunction combinePrefixPatterns(regexs) {\n  var capturedGroupIndex = 0;\n\n  var needToFoldCase = false;\n  var ignoreCase = false;\n  for (var i = 0, n = regexs.length; i < n; ++i) {\n    var regex = regexs[i];\n    if (regex.ignoreCase) {\n      ignoreCase = true;\n    } else if (/[a-z]/i.test(regex.source.replace(\n                   /\\\\u[0-9a-f]{4}|\\\\x[0-9a-f]{2}|\\\\[^ux]/gi, ''))) {\n      needToFoldCase = true;\n      ignoreCase = false;\n      break;\n    }\n  }\n\n  var escapeCharToCodeUnit = {\n    'b': 8,\n    't': 9,\n    'n': 0xa,\n    'v': 0xb,\n    'f': 0xc,\n    'r': 0xd\n  };\n\n  function decodeEscape(charsetPart) {\n    var cc0 = charsetPart.charCodeAt(0);\n    if (cc0 !== 92 /* \\\\ */) {\n      return cc0;\n    }\n    var c1 = charsetPart.charAt(1);\n    cc0 = escapeCharToCodeUnit[c1];\n    if (cc0) {\n      return cc0;\n    } else if ('0' <= c1 && c1 <= '7') {\n      return parseInt(charsetPart.substring(1), 8);\n    } else if (c1 === 'u' || c1 === 'x') {\n      return parseInt(charsetPart.substring(2), 16);\n    } else {\n      return charsetPart.charCodeAt(1);\n    }\n  }\n\n  function encodeEscape(charCode) {\n    if (charCode < 0x20) {\n      return (charCode < 0x10 ? '\\\\x0' : '\\\\x') + charCode.toString(16);\n    }\n    var ch = String.fromCharCode(charCode);\n    return (ch === '\\\\' || ch === '-' || ch === ']' || ch === '^')\n        ? \"\\\\\" + ch : ch;\n  }\n\n  function caseFoldCharset(charSet) {\n    var charsetParts = charSet.substring(1, charSet.length - 1).match(\n        new RegExp(\n            '\\\\\\\\u[0-9A-Fa-f]{4}'\n            + '|\\\\\\\\x[0-9A-Fa-f]{2}'\n            + '|\\\\\\\\[0-3][0-7]{0,2}'\n            + '|\\\\\\\\[0-7]{1,2}'\n            + '|\\\\\\\\[\\\\s\\\\S]'\n            + '|-'\n            + '|[^-\\\\\\\\]',\n            'g'));\n    var ranges = [];\n    var inverse = charsetParts[0] === '^';\n\n    var out = ['['];\n    if (inverse) { out.push('^'); }\n\n    for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {\n      var p = charsetParts[i];\n      if (/\\\\[bdsw]/i.test(p)) {  // Don't muck with named groups.\n        out.push(p);\n      } else {\n        var start = decodeEscape(p);\n        var end;\n        if (i + 2 < n && '-' === charsetParts[i + 1]) {\n          end = decodeEscape(charsetParts[i + 2]);\n          i += 2;\n        } else {\n          end = start;\n        }\n        ranges.push([start, end]);\n        // If the range might intersect letters, then expand it.\n        // This case handling is too simplistic.\n        // It does not deal with non-latin case folding.\n        // It works for latin source code identifiers though.\n        if (!(end < 65 || start > 122)) {\n          if (!(end < 65 || start > 90)) {\n            ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);\n          }\n          if (!(end < 97 || start > 122)) {\n            ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);\n          }\n        }\n      }\n    }\n\n    // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]\n    // -> [[1, 12], [14, 14], [16, 17]]\n    ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });\n    var consolidatedRanges = [];\n    var lastRange = [];\n    for (var i = 0; i < ranges.length; ++i) {\n      var range = ranges[i];\n      if (range[0] <= lastRange[1] + 1) {\n        lastRange[1] = Math.max(lastRange[1], range[1]);\n      } else {\n        consolidatedRanges.push(lastRange = range);\n      }\n    }\n\n    for (var i = 0; i < consolidatedRanges.length; ++i) {\n      var range = consolidatedRanges[i];\n      out.push(encodeEscape(range[0]));\n      if (range[1] > range[0]) {\n        if (range[1] + 1 > range[0]) { out.push('-'); }\n        out.push(encodeEscape(range[1]));\n      }\n    }\n    out.push(']');\n    return out.join('');\n  }\n\n  function allowAnywhereFoldCaseAndRenumberGroups(regex) {\n    // Split into character sets, escape sequences, punctuation strings\n    // like ('(', '(?:', ')', '^'), and runs of characters that do not\n    // include any of the above.\n    var parts = regex.source.match(\n        new RegExp(\n            '(?:'\n            + '\\\\[(?:[^\\\\x5C\\\\x5D]|\\\\\\\\[\\\\s\\\\S])*\\\\]'  // a character set\n            + '|\\\\\\\\u[A-Fa-f0-9]{4}'  // a unicode escape\n            + '|\\\\\\\\x[A-Fa-f0-9]{2}'  // a hex escape\n            + '|\\\\\\\\[0-9]+'  // a back-reference or octal escape\n            + '|\\\\\\\\[^ux0-9]'  // other escape sequence\n            + '|\\\\(\\\\?[:!=]'  // start of a non-capturing group\n            + '|[\\\\(\\\\)\\\\^]'  // start/end of a group, or line start\n            + '|[^\\\\x5B\\\\x5C\\\\(\\\\)\\\\^]+'  // run of other characters\n            + ')',\n            'g'));\n    var n = parts.length;\n\n    // Maps captured group numbers to the number they will occupy in\n    // the output or to -1 if that has not been determined, or to\n    // undefined if they need not be capturing in the output.\n    var capturedGroups = [];\n\n    // Walk over and identify back references to build the capturedGroups\n    // mapping.\n    for (var i = 0, groupIndex = 0; i < n; ++i) {\n      var p = parts[i];\n      if (p === '(') {\n        // groups are 1-indexed, so max group index is count of '('\n        ++groupIndex;\n      } else if ('\\\\' === p.charAt(0)) {\n        var decimalValue = +p.substring(1);\n        if (decimalValue) {\n          if (decimalValue <= groupIndex) {\n            capturedGroups[decimalValue] = -1;\n          } else {\n            // Replace with an unambiguous escape sequence so that\n            // an octal escape sequence does not turn into a backreference\n            // to a capturing group from an earlier regex.\n            parts[i] = encodeEscape(decimalValue);\n          }\n        }\n      }\n    }\n\n    // Renumber groups and reduce capturing groups to non-capturing groups\n    // where possible.\n    for (var i = 1; i < capturedGroups.length; ++i) {\n      if (-1 === capturedGroups[i]) {\n        capturedGroups[i] = ++capturedGroupIndex;\n      }\n    }\n    for (var i = 0, groupIndex = 0; i < n; ++i) {\n      var p = parts[i];\n      if (p === '(') {\n        ++groupIndex;\n        if (!capturedGroups[groupIndex]) {\n          parts[i] = '(?:';\n        }\n      } else if ('\\\\' === p.charAt(0)) {\n        var decimalValue = +p.substring(1);\n        if (decimalValue && decimalValue <= groupIndex) {\n          parts[i] = '\\\\' + capturedGroups[decimalValue];\n        }\n      }\n    }\n\n    // Remove any prefix anchors so that the output will match anywhere.\n    // ^^ really does mean an anchored match though.\n    for (var i = 0; i < n; ++i) {\n      if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }\n    }\n\n    // Expand letters to groups to handle mixing of case-sensitive and\n    // case-insensitive patterns if necessary.\n    if (regex.ignoreCase && needToFoldCase) {\n      for (var i = 0; i < n; ++i) {\n        var p = parts[i];\n        var ch0 = p.charAt(0);\n        if (p.length >= 2 && ch0 === '[') {\n          parts[i] = caseFoldCharset(p);\n        } else if (ch0 !== '\\\\') {\n          // TODO: handle letters in numeric escapes.\n          parts[i] = p.replace(\n              /[a-zA-Z]/g,\n              function (ch) {\n                var cc = ch.charCodeAt(0);\n                return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';\n              });\n        }\n      }\n    }\n\n    return parts.join('');\n  }\n\n  var rewritten = [];\n  for (var i = 0, n = regexs.length; i < n; ++i) {\n    var regex = regexs[i];\n    if (regex.global || regex.multiline) { throw new Error('' + regex); }\n    rewritten.push(\n        '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');\n  }\n\n  return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');\n}\n"
  },
  {
    "path": "google-code-prettify/js-modules/externs.js",
    "content": "var PR = {};\n\n/**\n * @param {function (Object)} handler\n * @param {Array.<string>} fileExtensions\n */\nPR.registerLangHandler = function registerLangHandler(handler, fileExtensions) {};\n\n/**\n * @param {Array} shortcutStylePatterns\n * @param {Array} fallthroughStylePatterns\n * @return {function (Object)}\n */\nPR.createSimpleLexer = function createSimpleLexer(\n  shortcutStylePatterns, fallthroughStylePatterns) {};\n\n/**\n * @param {Object} options a set of optional parameters.\n * @return {function (Object)} a function that examines the source code\n *     in the input job and builds the decoration list.\n */\nPR.sourceDecorator = function sourceDecorator(options) {};\n\n\nPR.PR_ATTRIB_NAME = 'atn';\nPR.PR_ATTRIB_VALUE = 'atv';\nPR.PR_COMMENT = 'com';\nPR.PR_DECLARATION = 'dec';\nPR.PR_KEYWORD = 'kwd';\nPR.PR_LITERAL = 'lit';\nPR.PR_NOCODE = 'nocode';\nPR.PR_PLAIN = 'pln';\nPR.PR_PUNCTUATION = 'pun';\nPR.PR_SOURCE = 'src';\nPR.PR_STRING = 'str';\nPR.PR_TAG = 'tag';\nPR.PR_TYPE = 'typ';\n"
  },
  {
    "path": "google-code-prettify/js-modules/extractSourceSpans.js",
    "content": "/**\n * Split markup into a string of source code and an array mapping ranges in\n * that string to the text nodes in which they appear.\n *\n * <p>\n * The HTML DOM structure:</p>\n * <pre>\n * (Element   \"p\"\n *   (Element \"b\"\n *     (Text  \"print \"))       ; #1\n *   (Text    \"'Hello '\")      ; #2\n *   (Element \"br\")            ; #3\n *   (Text    \"  + 'World';\")) ; #4\n * </pre>\n * <p>\n * corresponds to the HTML\n * {@code <p><b>print </b>'Hello '<br>  + 'World';</p>}.</p>\n *\n * <p>\n * It will produce the output:</p>\n * <pre>\n * {\n *   sourceCode: \"print 'Hello '\\n  + 'World';\",\n *   //                     1          2\n *   //           012345678901234 5678901234567\n *   spans: [0, #1, 6, #2, 14, #3, 15, #4]\n * }\n * </pre>\n * <p>\n * where #1 is a reference to the {@code \"print \"} text node above, and so\n * on for the other text nodes.\n * </p>\n *\n * <p>\n * The {@code} spans array is an array of pairs.  Even elements are the start\n * indices of substrings, and odd elements are the text nodes (or BR elements)\n * that contain the text for those substrings.\n * Substrings continue until the next index or the end of the source.\n * </p>\n *\n * @param {Node} node an HTML DOM subtree containing source-code.\n * @param {boolean} isPreformatted true if white-space in text nodes should\n *    be considered significant.\n * @return {Object} source code and the text nodes in which they occur.\n */\nfunction extractSourceSpans(node, isPreformatted) {\n  var nocode = /(?:^|\\s)nocode(?:\\s|$)/;\n\n  var chunks = [];\n  var length = 0;\n  var spans = [];\n  var k = 0;\n\n  function walk(node) {\n    var type = node.nodeType;\n    if (type == 1) {  // Element\n      if (nocode.test(node.className)) { return; }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        walk(child);\n      }\n      var nodeName = node.nodeName.toLowerCase();\n      if ('br' === nodeName || 'li' === nodeName) {\n        chunks[k] = '\\n';\n        spans[k << 1] = length++;\n        spans[(k++ << 1) | 1] = node;\n      }\n    } else if (type == 3 || type == 4) {  // Text\n      var text = node.nodeValue;\n      if (text.length) {\n        if (!isPreformatted) {\n          text = text.replace(/[ \\t\\r\\n]+/g, ' ');\n        } else {\n          text = text.replace(/\\r\\n?/g, '\\n');  // Normalize newlines.\n        }\n        // TODO: handle tabs here?\n        chunks[k] = text;\n        spans[k << 1] = length;\n        length += text.length;\n        spans[(k++ << 1) | 1] = node;\n      }\n    }\n  }\n\n  walk(node);\n\n  return {\n    sourceCode: chunks.join('').replace(/\\n$/, ''),\n    spans: spans\n  };\n}\n"
  },
  {
    "path": "google-code-prettify/js-modules/extractSourceSpans_test.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n<html> <head>\n<title>Extract Source Spans Test</title>\n<script src=\"extractSourceSpans.js\"></script>\n<script src=\"http://github.com/douglascrockford/JSON-js/raw/master/json2.js\"></script>\n<style>\n.ok { background: #dfd }\n.error, .failure { background: #fdd }\ntd { font-family: monospace }\n.actual { white-space: pre }\ntr { vertical-align: top }\n.break { padding-left: 2px; border-right-style: dotted !important }\n.odd, .even { border-style: solid; border-width: 1px }\n.even { background: #fff; border-color: #888 }\n.odd { background: #ddd; border-color: #000 }\n</style>\n</head>\n\n<body>\n<h1>Extract Source Spans Test</h1>\n\n<table border=1 cellpadding=2 cellspacing=0>\n  <tr><th colspan=3>Test space preserved in PRE</th></tr>\n  <tr>\n    <td><pre class=\"testinput\"><b>print </b>'Hello '<br>  + '&lt;World&gt;';</pre></td>\n    <td class=\"golden\"><pre>^print ^'Hello '^\\n^  + '&lt;World&gt;';^</pre></td>\n  </tr>\n  <tr><th colspan=3>Test class=\"nocode\"</th></tr>\n  <tr>\n    <td><pre class=\"testinput\"><span class=nocode>1. </span><b>print </b>'Hello '<br><span class=nocode>2. </span>  + '&lt;World&gt;';</pre></td>\n    <td class=\"golden\"><pre>^print ^'Hello '^\\n^  + '&lt;World&gt;';^</pre></td>\n  </tr>\n  <tr><th colspan=3>Test whitespace normalized in code</th></tr>\n  <tr>\n    <td><code class=\"testinput\"><b>print </b>'Hello '\n  + '&lt;World&gt;';</pre></td>\n    <td class=\"golden\"><pre>^print ^'Hello ' + '&lt;World&gt;';^</pre></td>\n  </tr>\n  <tr><th colspan=3>Test XMP</th></tr>\n  <tr>\n    <td><xmp class=\"testinput\">print 'Hello '\n  + '<World>';</xmp></td>\n    <td class=\"golden\"><pre>^print 'Hello '\\n  + '&lt;World&gt;';^</pre></td>\n  </tr>\n  <tr><th colspan=3>Test tabs</th></tr>\n  <tr>\n    <td><pre class=\"testinput\">print 'Hello '\n&#9;+ '&lt;World&gt;';</pre></td>\n    <td class=\"golden\"><pre>^print 'Hello '\\n\\t+ '&lt;World&gt;';^</pre></td>\n  </tr>\n  <tr><th colspan=3>Test number lines output</th></tr>\n  <tr>\n    <td><pre class=\"testinput\"><ul><li><b>print </b>'Hello '</li><li>  + '&lt;World&gt;';</pre></li></ul></td>\n    <td class=\"golden\"><pre>^print ^'Hello '^\\n^  + '&lt;World&gt;';^^</pre></td>\n  </tr>\n</table>\n\n<script>\nif (!document.body.getElementsByClassName) {\n  document.body.getElementsByClassName = function (className) {\n    className = className.replace(/\\s+/g, ' ').replace(/^\\s*|\\s*$/g, ' ');\n    var results = [];\n    function walk(node) {\n      if (node.nodeType !== 1) { return; }\n      // This test should be order-insensitive.\n      if ((' ' + node.className + ' ').indexOf(className) >= 0) {\n        results[results.length] = node;\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        walk(child);\n      }\n    }\n    walk(document.body);\n    return results;\n  };\n}\n\nsetTimeout(function () {\n  function stringify(s) {\n    return JSON.stringify(s).replace(/\\r/g, '\\\\r').replace(/\\n/g, '\\\\n')\n        .replace(/\\t/g, '\\\\t');\n  }\n\n  var testInputs = Array.prototype.slice.call(\n     document.body.getElementsByClassName('testinput'), 0);\n  for (var i = 0, n = testInputs.length; i < n; ++i) {\n    var testInput = testInputs[i];\n    var testResult = testInput.parentNode.nextSibling;\n    while (testResult.nodeType !== 1) { testResult = testResult.nextSibling; }\n    var actual = document.createElement('TD');\n    actual.className = 'actual';\n    testResult.parentNode.appendChild(actual);\n    try {\n      var sourceAndSpans = extractSourceSpans(testInput);\n      var source = sourceAndSpans.source;\n      var actualText = '^';\n      var actualHtml = '';\n      var spans = sourceAndSpans.spans;\n      for (var j = 0, m = spans.length; j < m; j += 2) {\n        var start = spans[j], end = spans[j + 2] || source.length;\n        var span = source.substring(start, end);\n        actualText += span + '^';\n        var spanClass = ((j & 2) ? 'odd' : 'even');\n        if (spans[j + 1].nodeName === 'BR') {\n          spanClass += ' break';\n        }\n        actualHtml += '<span class=\"' + spanClass+ '\">'\n            + span.replace(/&/g, '&amp;').replace(/</g, '&lt;') + '<\\/span>';\n      }\n      actual.innerHTML = '<pre>' + actualHtml + '<\\/pre>';\n      var goldenText = testResult.innerText || testResult.textContent;\n      var goldenNormalized = '\"' + goldenText.replace(/(?:\\r\\n?|\\n)$/, '') + '\"';\n      var actualNormalized = stringify(actualText);\n      var passed = actualNormalized === goldenNormalized;\n      if (!passed) {\n        console.log(goldenNormalized + ' !==\\n' + actualNormalized);\n      }\n      actual.className += passed ? ' ok' : ' failure';\n    } catch (ex) {\n      actual.className += ' error';\n      actual.appendChild(document.createTextNode('Error: ' + (ex.message || ex)));\n    }\n  }\n}, 0)</script>\n\n<hr>\n<address></address>\n<!-- hhmts start --> Last modified: Tue Mar 29 16:38:23 PDT 2011 <!-- hhmts end -->\n</body> </html>\n"
  },
  {
    "path": "google-code-prettify/js-modules/js_include.pl",
    "content": "#!/usr/bin/perl\n\n# Given a JS file looks for lines like\n#    include(\"path/to/file/to/include\");\n# and replaces them with the quoted file relative to the js-modules directory.\n# If the included file ends with \".pl\" then it is treated as a perl file to\n# execute and the stdout is used as the JS to include.\n\nuse strict;\n\n# Closure Compiler @define annotations that need to be pulled out of included\n# files because @defines need to be top-level vars.\nmy $global_defs = \"\";\n\n# Find @defines at the top of a JS file by pulling off comments and looking for\n# comments containing @define followed by a var declaration.\nsub extractGlobalDefs($) {\n  my @headerComments;\n  my $s = shift;\n  while ($s) {\n    last unless $s =~ m#^\\s*(?://[^\\r\\n]*|/\\*.*?\\*/[ \\t]*)[\\r\\n]*#s;\n    my $comment = $&;\n    $s = $';\n    if ($comment =~ /[\\@]define/ && $s =~ /^\\s*var\\s+[^;]+;[ \\t]*[\\r\\n]*/) {\n      my $global = $&;\n      $s = $';\n      $global =~ s/(var\\s*IN_GLOBAL_SCOPE\\s*=\\s*)true\\b/$1false/;\n      $global_defs .= \"$comment$global\";\n    } else {\n      push(@headerComments, $comment);\n    }\n  }\n  return (join \"\", @headerComments) . $s;\n}\n\n# readInclude(whiteSpacePrefix, path) returns the JS content at path\n# (with the \".pl\" adjustment above) and prepends each line with the\n# whitespace in whiteSpacePrefix to produce a chunk of JS that matches the\n# indentation of the including file.\n# @defines are extracted so that they can all appear globally at the top of\n# the file.\nsub readInclude($$) {\n  my $prefix = shift;\n  my $name = \"js-modules/\" . (shift);\n  my $in;\n  if ($name =~ /\\.pl$/) {\n    open($in, \"perl $name|\") or die \"$name: $!\";\n  } else {\n    open($in, \"<$name\")      or die \"$name: $!\";\n  }\n  my $buf = \"\";\n  while (<$in>) {\n    if (m/(\\s*)include\\(\"([^\"]+)\"\\);\\s*$/) {\n      my $inc = extractGlobalDefs(readInclude(\"$prefix$1\", $2));\n      $buf .= $inc;\n    } else {\n      $buf .= \"$prefix$_\";\n    }\n  }\n  close($in);\n  return $buf;\n}\n\nmy $target = shift;\nmy $inc = readInclude(\"\", $target);\nmy $header = \"\";\n# Put descriptive top level comments above the grouped @defines.\nif ($inc =~ s#^(?://[^\\r\\n]*|/\\*.*?\\*/|\\s)+##s) {\n  $header = $&;\n}\nmy $globals = $global_defs;\n# Un-indent @defines.\n$globals =~ s#^[ \\t]*##gm;\n$globals .= \"\\n\" unless $globals eq \"\";\n\nprint \"$header$globals$inc\";\n"
  },
  {
    "path": "google-code-prettify/js-modules/numberLines.js",
    "content": "/**\n * Given a DOM subtree, wraps it in a list, and puts each line into its own\n * list item.\n *\n * @param {Node} node modified in place.  Its content is pulled into an\n *     HTMLOListElement, and each line is moved into a separate list item.\n *     This requires cloning elements, so the input might not have unique\n *     IDs after numbering.\n * @param {boolean} isPreformatted true iff white-space in text nodes should\n *     be treated as significant.\n */\nfunction numberLines(node, opt_startLineNum, isPreformatted) {\n  var nocode = /(?:^|\\s)nocode(?:\\s|$)/;\n  var lineBreak = /\\r\\n?|\\n/;\n\n  var document = node.ownerDocument;\n\n  var li = document.createElement('li');\n  while (node.firstChild) {\n    li.appendChild(node.firstChild);\n  }\n  // An array of lines.  We split below, so this is initialized to one\n  // un-split line.\n  var listItems = [li];\n\n  function walk(node) {\n    var type = node.nodeType;\n    if (type == 1 && !nocode.test(node.className)) {  // Element\n      if ('br' === node.nodeName) {\n        breakAfter(node);\n        // Discard the <BR> since it is now flush against a </LI>.\n        if (node.parentNode) {\n          node.parentNode.removeChild(node);\n        }\n      } else {\n        for (var child = node.firstChild; child; child = child.nextSibling) {\n          walk(child);\n        }\n      }\n    } else if ((type == 3 || type == 4) && isPreformatted) {  // Text\n      var text = node.nodeValue;\n      var match = text.match(lineBreak);\n      if (match) {\n        var firstLine = text.substring(0, match.index);\n        node.nodeValue = firstLine;\n        var tail = text.substring(match.index + match[0].length);\n        if (tail) {\n          var parent = node.parentNode;\n          parent.insertBefore(\n            document.createTextNode(tail), node.nextSibling);\n        }\n        breakAfter(node);\n        if (!firstLine) {\n          // Don't leave blank text nodes in the DOM.\n          node.parentNode.removeChild(node);\n        }\n      }\n    }\n  }\n\n  // Split a line after the given node.\n  function breakAfter(lineEndNode) {\n    // If there's nothing to the right, then we can skip ending the line\n    // here, and move root-wards since splitting just before an end-tag\n    // would require us to create a bunch of empty copies.\n    while (!lineEndNode.nextSibling) {\n      lineEndNode = lineEndNode.parentNode;\n      if (!lineEndNode) { return; }\n    }\n\n    function breakLeftOf(limit, copy) {\n      // Clone shallowly if this node needs to be on both sides of the break.\n      var rightSide = copy ? limit.cloneNode(false) : limit;\n      var parent = limit.parentNode;\n      if (parent) {\n        // We clone the parent chain.\n        // This helps us resurrect important styling elements that cross lines.\n        // E.g. in <i>Foo<br>Bar</i>\n        // should be rewritten to <li><i>Foo</i></li><li><i>Bar</i></li>.\n        var parentClone = breakLeftOf(parent, 1);\n        // Move the clone and everything to the right of the original\n        // onto the cloned parent.\n        var next = limit.nextSibling;\n        parentClone.appendChild(rightSide);\n        for (var sibling = next; sibling; sibling = next) {\n          next = sibling.nextSibling;\n          parentClone.appendChild(sibling);\n        }\n      }\n      return rightSide;\n    }\n\n    var copiedListItem = breakLeftOf(lineEndNode.nextSibling, 0);\n\n    // Walk the parent chain until we reach an unattached LI.\n    for (var parent;\n         // Check nodeType since IE invents document fragments.\n         (parent = copiedListItem.parentNode) && parent.nodeType === 1;) {\n      copiedListItem = parent;\n    }\n    // Put it on the list of lines for later processing.\n    listItems.push(copiedListItem);\n  }\n\n  // Split lines while there are lines left to split.\n  for (var i = 0;  // Number of lines that have been split so far.\n       i < listItems.length;  // length updated by breakAfter calls.\n       ++i) {\n    walk(listItems[i]);\n  }\n\n  // Make sure numeric indices show correctly.\n  if (opt_startLineNum === (opt_startLineNum|0)) {\n    listItems[0].setAttribute('value', opt_startLineNum);\n  }\n\n  var ol = document.createElement('ol');\n  ol.className = 'linenums';\n  var offset = Math.max(0, ((opt_startLineNum - 1 /* zero index */)) | 0) || 0;\n  for (var i = 0, n = listItems.length; i < n; ++i) {\n    li = listItems[i];\n    // Stick a class on the LIs so that stylesheets can\n    // color odd/even rows, or any other row pattern that\n    // is co-prime with 10.\n    li.className = 'L' + ((i + offset) % 10);\n    if (!li.firstChild) {\n      li.appendChild(document.createTextNode('\\xA0'));\n    }\n    ol.appendChild(li);\n  }\n\n  node.appendChild(ol);\n}"
  },
  {
    "path": "google-code-prettify/js-modules/numberLines_test.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n<html> <head>\n<title>Number Lines Test</title>\n<script src=\"numberLines.js\"></script>\n<script src=\"http://github.com/douglascrockford/JSON-js/raw/master/json2.js\"></script>\n<style>\n.ok { background: #dfd }\n.error, .failure { background: #fdd }\ntd { font-family: monospace }\ntr { vertical-align: top }\n</style>\n</head>\n\n<body>\n<h1>Number Lines Test</h1>\n\n<table>\n  <tr><th colspan=3>Test Nothing to Split</th></tr>\n  <tr>\n    <td><code class=\"testinput\">Hello, World!</code></td>\n    <td><code><ol class=\"linenums\"><li class=\"L0\">Hello, World!</li></ol></code></td>\n  </tr>\n  <tr><th colspan=3>Test Normalized Spaces</th></tr>\n  <tr>\n    <td><code class=\"testinput\">Hello,&#10;World!</code></td>\n    <td><code><ol class=\"linenums\"><li class=\"L0\">Hello,&#10;World!</li></ol></code></td>\n  </tr>\n  <tr><th colspan=3>Test BR</th></tr>\n  <tr>\n    <td><pre class=\"testinput\">Hello,<br>World!</pre></td>\n    <td><pre><ol class=\"linenums\"><li class=\"L0\">Hello,</li><li class=\"L1\">World!</li></ol></pre></td>\n  </tr>\n  <tr><th colspan=3>Test line breaks</th></tr>\n  <tr>\n    <td><pre class=\"testinput\">Hello,&#10;there&#10;World!</pre></td>\n    <td><pre><ol class=\"linenums\"><li class=\"L0\">Hello,</li><li class=\"L1\">there</li><li class=\"L2\">World!</li></ol></pre></td>\n  </tr>\n  <tr><th colspan=3>Test line breaks with followers</th></tr>\n  <tr>\n    <td><pre class=\"testinput\"><b>Hello,&#10;there&#10;World!&#10;</b><button>OK</button></pre></td>\n    <td><pre><ol class=\"linenums\"><li class=\"L0\"><b>Hello,</b></li><li class=\"L1\"><b>there</b></li><li class=\"L2\"><b>World!</b></li><li class=\"L3\"><button>OK</button></ol></pre></td>\n  </tr>\n  <tr><th colspan=3>Test nocode</th></tr>\n  <tr>\n    <td><pre class=\"testinput\">Hello,&#10;the<span class=\"nocode\">re&#10;World!</span></pre></td>\n    <td><pre><ol class=\"linenums\"><li class=\"L0\">Hello,</li><li class=\"L1\">the<span class=\"nocode\">re&#10;World!</span></li></ol></pre></td>\n  </tr>\n  <tr><th colspan=3>Test link</th></tr>\n  <tr>\n    <td><pre class=\"testinput\">Hello,&#10;the<a href=\"#\" style=\"font-weight: bold\">re&#10;Wor</a>ld!</pre></td>\n    <td><pre><ol class=\"linenums\"><li class=\"L0\">Hello,</li><li class=\"L1\">the<a href=\"#\" style=\"font-weight: bold\">re</a></li><li class=\"L2\"><a href=\"#\" style=\"font-weight: bold\">Wor</a>ld!</li></ol></pre></td>\n  </tr>\n  <tr><th colspan=3>Test blank lines</th></tr>\n  <tr>\n    <td><pre class=\"testinput\">One&#10;&#10;Three</pre></td>\n    <td><pre><ol class=\"linenums\"><li class=\"L0\">One</li><li class=\"L1\">&nbsp;</li><li class=\"L2\">Three</li></ol></pre></td>\n  </tr>\n</table>\n\n<script>\nif (!document.body.getElementsByClassName) {\n  document.body.getElementsByClassName = function (className) {\n    className = className.replace(/\\s+/g, ' ').replace(/^\\s*|\\s*$/g, ' ');\n    var results = [];\n    function walk(node) {\n      if (node.nodeType !== 1) { return; }\n      // This test should be order-insensitive.\n      if ((' ' + node.className + ' ').indexOf(className) >= 0) {\n        results[results.length] = node;\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        walk(child);\n      }\n    }\n    walk(document.body);\n    return results;\n  };\n}\n\nsetTimeout(function () {\n  function normListItems(html) {\n    // IE likes to leave out </li>s before <li>s.\n    return html.replace(/<\\/li>(<li\\b)/gi, '$1');\n  }\n\n  var testInputs = Array.prototype.slice.call(\n     document.body.getElementsByClassName('testinput'), 0);\n  for (var i = 0, n = testInputs.length; i < n; ++i) {\n    var testInput = testInputs[i];\n    var testResult = testInput.parentNode.nextSibling;\n    while (testResult.nodeType !== 1) { testResult = testResult.nextSibling; }\n    var actual = document.createElement('TD');\n    testResult.parentNode.appendChild(actual);\n    try {\n      var testInputClone = testInput.cloneNode(true);\n      testInputClone.className = '';  // IE\n      testInputClone.removeAttribute('class');  // Not IE.\n      actual.appendChild(testInputClone);\n      numberLines(testInputClone);\n      var goldenNorm = normListItems(testResult.innerHTML);\n      var actualNorm = normListItems(actual.innerHTML);\n      var passed = goldenNorm === actualNorm;\n      if (!passed) {\n        console.log(JSON.stringify(goldenNorm)\n                    + ' !==\\n' + JSON.stringify(actualNorm));\n      }\n      actual.className = passed ? 'ok' : 'failure';\n    } catch (ex) {\n      actual.className = 'error';\n      actual.appendChild(document.createTextNode('Error: ' + (ex.message || ex)));\n    }\n    actual.className += ' actual';\n  }\n}, 0)</script>\n\n<hr>\n<address></address>\n<!-- hhmts start --> Last modified: Tue Mar 29 16:44:05 PDT 2011 <!-- hhmts end -->\n</body> </html>\n"
  },
  {
    "path": "google-code-prettify/js-modules/prettify.js",
    "content": "// Copyright (C) 2006 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview\n * some functions for browser-side pretty printing of code contained in html.\n *\n * <p>\n * For a fairly comprehensive set of languages see the\n * <a href=\"http://google-code-prettify.googlecode.com/svn/trunk/README.html#langs\">README</a>\n * file that came with this source.  At a minimum, the lexer should work on a\n * number of languages including C and friends, Java, Python, Bash, SQL, HTML,\n * XML, CSS, Javascript, and Makefiles.  It works passably on Ruby, PHP and Awk\n * and a subset of Perl, but, because of commenting conventions, doesn't work on\n * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class.\n * <p>\n * Usage: <ol>\n * <li> include this source file in an html page via\n *   {@code <script type=\"text/javascript\" src=\"/path/to/prettify.js\"></script>}\n * <li> define style rules.  See the example page for examples.\n * <li> mark the {@code <pre>} and {@code <code>} tags in your source with\n *    {@code class=prettyprint.}\n *    You can also use the (html deprecated) {@code <xmp>} tag, but the pretty\n *    printer needs to do more substantial DOM manipulations to support that, so\n *    some css styles may not be preserved.\n * </ol>\n * That's it.  I wanted to keep the API as simple as possible, so there's no\n * need to specify which language the code is in, but if you wish, you can add\n * another class to the {@code <pre>} or {@code <code>} element to specify the\n * language, as in {@code <pre class=\"prettyprint lang-java\">}.  Any class that\n * starts with \"lang-\" followed by a file extension, specifies the file type.\n * See the \"lang-*.js\" files in this directory for code that implements\n * per-language file handlers.\n * <p>\n * Change log:<br>\n * cbeust, 2006/08/22\n * <blockquote>\n *   Java annotations (start with \"@\") are now captured as literals (\"lit\")\n * </blockquote>\n * @requires console\n */\n\n// JSLint declarations\n/*global console, document, navigator, setTimeout, window, define */\n\n/** @define {boolean} */\nvar IN_GLOBAL_SCOPE = true;\n\n/**\n * Split {@code prettyPrint} into multiple timeouts so as not to interfere with\n * UI events.\n * If set to {@code false}, {@code prettyPrint()} is synchronous.\n */\nwindow['PR_SHOULD_USE_CONTINUATION'] = true;\n\n/**\n * Pretty print a chunk of code.\n * @param {string} sourceCodeHtml The HTML to pretty print.\n * @param {string} opt_langExtension The language name to use.\n *     Typically, a filename extension like 'cpp' or 'java'.\n * @param {number|boolean} opt_numberLines True to number lines,\n *     or the 1-indexed number of the first line in sourceCodeHtml.\n * @return {string} code as html, but prettier\n */\nvar prettyPrintOne;\n/**\n * Find all the {@code <pre>} and {@code <code>} tags in the DOM with\n * {@code class=prettyprint} and prettify them.\n *\n * @param {Function} opt_whenDone called when prettifying is done.\n * @param {HTMLElement|HTMLDocument} opt_root an element or document\n *   containing all the elements to pretty print.\n *   Defaults to {@code document.body}.\n */\nvar prettyPrint;\n\n\n(function () {\n  var win = window;\n  // Keyword lists for various languages.\n  // We use things that coerce to strings to make them compact when minified\n  // and to defeat aggressive optimizers that fold large string constants.\n  var FLOW_CONTROL_KEYWORDS = [\"break,continue,do,else,for,if,return,while\"];\n  var C_KEYWORDS = [FLOW_CONTROL_KEYWORDS,\"auto,case,char,const,default,\" + \n      \"double,enum,extern,float,goto,inline,int,long,register,short,signed,\" +\n      \"sizeof,static,struct,switch,typedef,union,unsigned,void,volatile\"];\n  var COMMON_KEYWORDS = [C_KEYWORDS,\"catch,class,delete,false,import,\" +\n      \"new,operator,private,protected,public,this,throw,true,try,typeof\"];\n  var CPP_KEYWORDS = [COMMON_KEYWORDS,\"alignof,align_union,asm,axiom,bool,\" +\n      \"concept,concept_map,const_cast,constexpr,decltype,delegate,\" +\n      \"dynamic_cast,explicit,export,friend,generic,late_check,\" +\n      \"mutable,namespace,nullptr,property,reinterpret_cast,static_assert,\" +\n      \"static_cast,template,typeid,typename,using,virtual,where\"];\n  var JAVA_KEYWORDS = [COMMON_KEYWORDS,\n      \"abstract,assert,boolean,byte,extends,final,finally,implements,import,\" +\n      \"instanceof,interface,null,native,package,strictfp,super,synchronized,\" +\n      \"throws,transient\"];\n  var CSHARP_KEYWORDS = [JAVA_KEYWORDS,\n      \"as,base,by,checked,decimal,delegate,descending,dynamic,event,\" +\n      \"fixed,foreach,from,group,implicit,in,internal,into,is,let,\" +\n      \"lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,\" +\n      \"sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,\" +\n      \"var,virtual,where\"];\n  var COFFEE_KEYWORDS = \"all,and,by,catch,class,else,extends,false,finally,\" +\n      \"for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,\" +\n      \"throw,true,try,unless,until,when,while,yes\";\n  var JSCRIPT_KEYWORDS = [COMMON_KEYWORDS,\n      \"debugger,eval,export,function,get,null,set,undefined,var,with,\" +\n      \"Infinity,NaN\"];\n  var PERL_KEYWORDS = \"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,\" +\n      \"goto,if,import,last,local,my,next,no,our,print,package,redo,require,\" +\n      \"sub,undef,unless,until,use,wantarray,while,BEGIN,END\";\n  var PYTHON_KEYWORDS = [FLOW_CONTROL_KEYWORDS, \"and,as,assert,class,def,del,\" +\n      \"elif,except,exec,finally,from,global,import,in,is,lambda,\" +\n      \"nonlocal,not,or,pass,print,raise,try,with,yield,\" +\n      \"False,True,None\"];\n  var RUBY_KEYWORDS = [FLOW_CONTROL_KEYWORDS, \"alias,and,begin,case,class,\" +\n      \"def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,\" +\n      \"rescue,retry,self,super,then,true,undef,unless,until,when,yield,\" +\n      \"BEGIN,END\"];\n   var RUST_KEYWORDS = [FLOW_CONTROL_KEYWORDS, \"as,assert,const,copy,drop,\" +\n      \"enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,\" +\n      \"pub,pure,ref,self,static,struct,true,trait,type,unsafe,use\"];\n  var SH_KEYWORDS = [FLOW_CONTROL_KEYWORDS, \"case,done,elif,esac,eval,fi,\" +\n      \"function,in,local,set,then,until\"];\n  var ALL_KEYWORDS = [\n      CPP_KEYWORDS, CSHARP_KEYWORDS, JSCRIPT_KEYWORDS, PERL_KEYWORDS,\n      PYTHON_KEYWORDS, RUBY_KEYWORDS, SH_KEYWORDS];\n  var C_TYPES = /^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\\d*)\\b/;\n\n  // token style names.  correspond to css classes\n  /**\n   * token style for a string literal\n   * @const\n   */\n  var PR_STRING = 'str';\n  /**\n   * token style for a keyword\n   * @const\n   */\n  var PR_KEYWORD = 'kwd';\n  /**\n   * token style for a comment\n   * @const\n   */\n  var PR_COMMENT = 'com';\n  /**\n   * token style for a type\n   * @const\n   */\n  var PR_TYPE = 'typ';\n  /**\n   * token style for a literal value.  e.g. 1, null, true.\n   * @const\n   */\n  var PR_LITERAL = 'lit';\n  /**\n   * token style for a punctuation string.\n   * @const\n   */\n  var PR_PUNCTUATION = 'pun';\n  /**\n   * token style for plain text.\n   * @const\n   */\n  var PR_PLAIN = 'pln';\n\n  /**\n   * token style for an sgml tag.\n   * @const\n   */\n  var PR_TAG = 'tag';\n  /**\n   * token style for a markup declaration such as a DOCTYPE.\n   * @const\n   */\n  var PR_DECLARATION = 'dec';\n  /**\n   * token style for embedded source.\n   * @const\n   */\n  var PR_SOURCE = 'src';\n  /**\n   * token style for an sgml attribute name.\n   * @const\n   */\n  var PR_ATTRIB_NAME = 'atn';\n  /**\n   * token style for an sgml attribute value.\n   * @const\n   */\n  var PR_ATTRIB_VALUE = 'atv';\n\n  /**\n   * A class that indicates a section of markup that is not code, e.g. to allow\n   * embedding of line numbers within code listings.\n   * @const\n   */\n  var PR_NOCODE = 'nocode';\n\n  include(\"regexpPrecederPatterns.pl\");\n\n  include(\"combinePrefixPatterns.js\");\n\n  include(\"extractSourceSpans.js\");\n\n  /**\n   * Apply the given language handler to sourceCode and add the resulting\n   * decorations to out.\n   * @param {number} basePos the index of sourceCode within the chunk of source\n   *    whose decorations are already present on out.\n   */\n  function appendDecorations(basePos, sourceCode, langHandler, out) {\n    if (!sourceCode) { return; }\n    var job = {\n      sourceCode: sourceCode,\n      basePos: basePos\n    };\n    langHandler(job);\n    out.push.apply(out, job.decorations);\n  }\n\n  var notWs = /\\S/;\n\n  /**\n   * Given an element, if it contains only one child element and any text nodes\n   * it contains contain only space characters, return the sole child element.\n   * Otherwise returns undefined.\n   * <p>\n   * This is meant to return the CODE element in {@code <pre><code ...>} when\n   * there is a single child element that contains all the non-space textual\n   * content, but not to return anything where there are multiple child elements\n   * as in {@code <pre><code>...</code><code>...</code></pre>} or when there\n   * is textual content.\n   */\n  function childContentWrapper(element) {\n    var wrapper = undefined;\n    for (var c = element.firstChild; c; c = c.nextSibling) {\n      var type = c.nodeType;\n      wrapper = (type === 1)  // Element Node\n          ? (wrapper ? element : c)\n          : (type === 3)  // Text Node\n          ? (notWs.test(c.nodeValue) ? element : wrapper)\n          : wrapper;\n    }\n    return wrapper === element ? undefined : wrapper;\n  }\n\n  /** Given triples of [style, pattern, context] returns a lexing function,\n    * The lexing function interprets the patterns to find token boundaries and\n    * returns a decoration list of the form\n    * [index_0, style_0, index_1, style_1, ..., index_n, style_n]\n    * where index_n is an index into the sourceCode, and style_n is a style\n    * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to\n    * all characters in sourceCode[index_n-1:index_n].\n    *\n    * The stylePatterns is a list whose elements have the form\n    * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].\n    *\n    * Style is a style constant like PR_PLAIN, or can be a string of the\n    * form 'lang-FOO', where FOO is a language extension describing the\n    * language of the portion of the token in $1 after pattern executes.\n    * E.g., if style is 'lang-lisp', and group 1 contains the text\n    * '(hello (world))', then that portion of the token will be passed to the\n    * registered lisp handler for formatting.\n    * The text before and after group 1 will be restyled using this decorator\n    * so decorators should take care that this doesn't result in infinite\n    * recursion.  For example, the HTML lexer rule for SCRIPT elements looks\n    * something like ['lang-js', /<[s]cript>(.+?)<\\/script>/].  This may match\n    * '<script>foo()<\\/script>', which would cause the current decorator to\n    * be called with '<script>' which would not match the same rule since\n    * group 1 must not be empty, so it would be instead styled as PR_TAG by\n    * the generic tag rule.  The handler registered for the 'js' extension would\n    * then be called with 'foo()', and finally, the current decorator would\n    * be called with '<\\/script>' which would not match the original rule and\n    * so the generic tag rule would identify it as a tag.\n    *\n    * Pattern must only match prefixes, and if it matches a prefix, then that\n    * match is considered a token with the same style.\n    *\n    * Context is applied to the last non-whitespace, non-comment token\n    * recognized.\n    *\n    * Shortcut is an optional string of characters, any of which, if the first\n    * character, gurantee that this pattern and only this pattern matches.\n    *\n    * @param {Array} shortcutStylePatterns patterns that always start with\n    *   a known character.  Must have a shortcut string.\n    * @param {Array} fallthroughStylePatterns patterns that will be tried in\n    *   order if the shortcut ones fail.  May have shortcuts.\n    *\n    * @return {function (Object)} a\n    *   function that takes source code and returns a list of decorations.\n    */\n  function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {\n    var shortcuts = {};\n    var tokenizer;\n    (function () {\n      var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);\n      var allRegexs = [];\n      var regexKeys = {};\n      for (var i = 0, n = allPatterns.length; i < n; ++i) {\n        var patternParts = allPatterns[i];\n        var shortcutChars = patternParts[3];\n        if (shortcutChars) {\n          for (var c = shortcutChars.length; --c >= 0;) {\n            shortcuts[shortcutChars.charAt(c)] = patternParts;\n          }\n        }\n        var regex = patternParts[1];\n        var k = '' + regex;\n        if (!regexKeys.hasOwnProperty(k)) {\n          allRegexs.push(regex);\n          regexKeys[k] = null;\n        }\n      }\n      allRegexs.push(/[\\0-\\uffff]/);\n      tokenizer = combinePrefixPatterns(allRegexs);\n    })();\n\n    var nPatterns = fallthroughStylePatterns.length;\n\n    /**\n     * Lexes job.sourceCode and produces an output array job.decorations of\n     * style classes preceded by the position at which they start in\n     * job.sourceCode in order.\n     *\n     * @param {Object} job an object like <pre>{\n     *    sourceCode: {string} sourceText plain text,\n     *    basePos: {int} position of job.sourceCode in the larger chunk of\n     *        sourceCode.\n     * }</pre>\n     */\n    var decorate = function (job) {\n      var sourceCode = job.sourceCode, basePos = job.basePos;\n      /** Even entries are positions in source in ascending order.  Odd enties\n        * are style markers (e.g., PR_COMMENT) that run from that position until\n        * the end.\n        * @type {Array.<number|string>}\n        */\n      var decorations = [basePos, PR_PLAIN];\n      var pos = 0;  // index into sourceCode\n      var tokens = sourceCode.match(tokenizer) || [];\n      var styleCache = {};\n\n      for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {\n        var token = tokens[ti];\n        var style = styleCache[token];\n        var match = void 0;\n\n        var isEmbedded;\n        if (typeof style === 'string') {\n          isEmbedded = false;\n        } else {\n          var patternParts = shortcuts[token.charAt(0)];\n          if (patternParts) {\n            match = token.match(patternParts[1]);\n            style = patternParts[0];\n          } else {\n            for (var i = 0; i < nPatterns; ++i) {\n              patternParts = fallthroughStylePatterns[i];\n              match = token.match(patternParts[1]);\n              if (match) {\n                style = patternParts[0];\n                break;\n              }\n            }\n\n            if (!match) {  // make sure that we make progress\n              style = PR_PLAIN;\n            }\n          }\n\n          isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);\n          if (isEmbedded && !(match && typeof match[1] === 'string')) {\n            isEmbedded = false;\n            style = PR_SOURCE;\n          }\n\n          if (!isEmbedded) { styleCache[token] = style; }\n        }\n\n        var tokenStart = pos;\n        pos += token.length;\n\n        if (!isEmbedded) {\n          decorations.push(basePos + tokenStart, style);\n        } else {  // Treat group 1 as an embedded block of source code.\n          var embeddedSource = match[1];\n          var embeddedSourceStart = token.indexOf(embeddedSource);\n          var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;\n          if (match[2]) {\n            // If embeddedSource can be blank, then it would match at the\n            // beginning which would cause us to infinitely recurse on the\n            // entire token, so we catch the right context in match[2].\n            embeddedSourceEnd = token.length - match[2].length;\n            embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;\n          }\n          var lang = style.substring(5);\n          // Decorate the left of the embedded source\n          appendDecorations(\n              basePos + tokenStart,\n              token.substring(0, embeddedSourceStart),\n              decorate, decorations);\n          // Decorate the embedded source\n          appendDecorations(\n              basePos + tokenStart + embeddedSourceStart,\n              embeddedSource,\n              langHandlerForExtension(lang, embeddedSource),\n              decorations);\n          // Decorate the right of the embedded section\n          appendDecorations(\n              basePos + tokenStart + embeddedSourceEnd,\n              token.substring(embeddedSourceEnd),\n              decorate, decorations);\n        }\n      }\n      job.decorations = decorations;\n    };\n    return decorate;\n  }\n\n  /** returns a function that produces a list of decorations from source text.\n    *\n    * This code treats \", ', and ` as string delimiters, and \\ as a string\n    * escape.  It does not recognize perl's qq() style strings.\n    * It has no special handling for double delimiter escapes as in basic, or\n    * the tripled delimiters used in python, but should work on those regardless\n    * although in those cases a single string literal may be broken up into\n    * multiple adjacent string literals.\n    *\n    * It recognizes C, C++, and shell style comments.\n    *\n    * @param {Object} options a set of optional parameters.\n    * @return {function (Object)} a function that examines the source code\n    *     in the input job and builds the decoration list.\n    */\n  function sourceDecorator(options) {\n    var shortcutStylePatterns = [], fallthroughStylePatterns = [];\n    if (options['tripleQuotedStrings']) {\n      // '''multi-line-string''', 'single-line-string', and double-quoted\n      shortcutStylePatterns.push(\n          [PR_STRING,  /^(?:\\'\\'\\'(?:[^\\'\\\\]|\\\\[\\s\\S]|\\'{1,2}(?=[^\\']))*(?:\\'\\'\\'|$)|\\\"\\\"\\\"(?:[^\\\"\\\\]|\\\\[\\s\\S]|\\\"{1,2}(?=[^\\\"]))*(?:\\\"\\\"\\\"|$)|\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$))/,\n           null, '\\'\"']);\n    } else if (options['multiLineStrings']) {\n      // 'multi-line-string', \"multi-line-string\"\n      shortcutStylePatterns.push(\n          [PR_STRING,  /^(?:\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$)|\\`(?:[^\\\\\\`]|\\\\[\\s\\S])*(?:\\`|$))/,\n           null, '\\'\"`']);\n    } else {\n      // 'single-line-string', \"single-line-string\"\n      shortcutStylePatterns.push(\n          [PR_STRING,\n           /^(?:\\'(?:[^\\\\\\'\\r\\n]|\\\\.)*(?:\\'|$)|\\\"(?:[^\\\\\\\"\\r\\n]|\\\\.)*(?:\\\"|$))/,\n           null, '\"\\'']);\n    }\n    if (options['verbatimStrings']) {\n      // verbatim-string-literal production from the C# grammar.  See issue 93.\n      fallthroughStylePatterns.push(\n          [PR_STRING, /^@\\\"(?:[^\\\"]|\\\"\\\")*(?:\\\"|$)/, null]);\n    }\n    var hc = options['hashComments'];\n    if (hc) {\n      if (options['cStyleComments']) {\n        if (hc > 1) {  // multiline hash comments\n          shortcutStylePatterns.push(\n              [PR_COMMENT, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#']);\n        } else {\n          // Stop C preprocessor declarations at an unclosed open comment\n          shortcutStylePatterns.push(\n              [PR_COMMENT, /^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\\b|[^\\r\\n]*)/,\n               null, '#']);\n        }\n        // #include <stdio.h>\n        fallthroughStylePatterns.push(\n            [PR_STRING,\n             /^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h(?:h|pp|\\+\\+)?|[a-z]\\w*)>/,\n             null]);\n      } else {\n        shortcutStylePatterns.push([PR_COMMENT, /^#[^\\r\\n]*/, null, '#']);\n      }\n    }\n    if (options['cStyleComments']) {\n      fallthroughStylePatterns.push([PR_COMMENT, /^\\/\\/[^\\r\\n]*/, null]);\n      fallthroughStylePatterns.push(\n          [PR_COMMENT, /^\\/\\*[\\s\\S]*?(?:\\*\\/|$)/, null]);\n    }\n    var regexLiterals = options['regexLiterals'];\n    if (regexLiterals) {\n      /**\n       * @const\n       */\n      var regexExcls = regexLiterals > 1\n        ? ''  // Multiline regex literals\n        : '\\n\\r';\n      /**\n       * @const\n       */\n      var regexAny = regexExcls ? '.' : '[\\\\S\\\\s]';\n      /**\n       * @const\n       */\n      var REGEX_LITERAL = (\n          // A regular expression literal starts with a slash that is\n          // not followed by * or / so that it is not confused with\n          // comments.\n          '/(?=[^/*' + regexExcls + '])'\n          // and then contains any number of raw characters,\n          + '(?:[^/\\\\x5B\\\\x5C' + regexExcls + ']'\n          // escape sequences (\\x5C),\n          +    '|\\\\x5C' + regexAny\n          // or non-nesting character sets (\\x5B\\x5D);\n          +    '|\\\\x5B(?:[^\\\\x5C\\\\x5D' + regexExcls + ']'\n          +             '|\\\\x5C' + regexAny + ')*(?:\\\\x5D|$))+'\n          // finally closed by a /.\n          + '/');\n      fallthroughStylePatterns.push(\n          ['lang-regex',\n           RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')\n           ]);\n    }\n\n    var types = options['types'];\n    if (types) {\n      fallthroughStylePatterns.push([PR_TYPE, types]);\n    }\n\n    var keywords = (\"\" + options['keywords']).replace(/^ | $/g, '');\n    if (keywords.length) {\n      fallthroughStylePatterns.push(\n          [PR_KEYWORD,\n           new RegExp('^(?:' + keywords.replace(/[\\s,]+/g, '|') + ')\\\\b'),\n           null]);\n    }\n\n    shortcutStylePatterns.push([PR_PLAIN,       /^\\s+/, null, ' \\r\\n\\t\\xA0']);\n\n    var punctuation =\n      // The Bash man page says\n\n      // A word is a sequence of characters considered as a single\n      // unit by GRUB. Words are separated by metacharacters,\n      // which are the following plus space, tab, and newline: { }\n      // | & $ ; < >\n      // ...\n      \n      // A word beginning with # causes that word and all remaining\n      // characters on that line to be ignored.\n\n      // which means that only a '#' after /(?:^|[{}|&$;<>\\s])/ starts a\n      // comment but empirically\n      // $ echo {#}\n      // {#}\n      // $ echo \\$#\n      // $#\n      // $ echo }#\n      // }#\n\n      // so /(?:^|[|&;<>\\s])/ is more appropriate.\n\n      // http://gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html#SEC3\n      // suggests that this definition is compatible with a\n      // default mode that tries to use a single token definition\n      // to recognize both bash/python style comments and C\n      // preprocessor directives.\n\n      // This definition of punctuation does not include # in the list of\n      // follow-on exclusions, so # will not be broken before if preceeded\n      // by a punctuation character.  We could try to exclude # after\n      // [|&;<>] but that doesn't seem to cause many major problems.\n      // If that does turn out to be a problem, we should change the below\n      // when hc is truthy to include # in the run of punctuation characters\n      // only when not followint [|&;<>].\n      '^.[^\\\\s\\\\w.$@\\'\"`/\\\\\\\\]*';\n    if (options['regexLiterals']) {\n      punctuation += '(?!\\s*\\/)';\n    }\n\n    fallthroughStylePatterns.push(\n        // TODO(mikesamuel): recognize non-latin letters and numerals in idents\n        [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],\n        [PR_TYPE,        /^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\\w+_t\\b)/, null],\n        [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],\n        [PR_LITERAL,\n         new RegExp(\n             '^(?:'\n             // A hex number\n             + '0x[a-f0-9]+'\n             // or an octal or decimal number,\n             + '|(?:\\\\d(?:_\\\\d+)*\\\\d*(?:\\\\.\\\\d*)?|\\\\.\\\\d\\\\+)'\n             // possibly in scientific notation\n             + '(?:e[+\\\\-]?\\\\d+)?'\n             + ')'\n             // with an optional modifier like UL for unsigned long\n             + '[a-z]*', 'i'),\n         null, '0123456789'],\n        // Don't treat escaped quotes in bash as starting strings.\n        // See issue 144.\n        [PR_PLAIN,       /^\\\\[\\s\\S]?/, null],\n        [PR_PUNCTUATION, new RegExp(punctuation), null]);\n\n    return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);\n  }\n\n  var decorateSource = sourceDecorator({\n        'keywords': ALL_KEYWORDS,\n        'hashComments': true,\n        'cStyleComments': true,\n        'multiLineStrings': true,\n        'regexLiterals': true\n      });\n\n  include(\"numberLines.js\");\n\n  include(\"recombineTagsAndDecorations.js\");\n\n  /** Maps language-specific file extensions to handlers. */\n  var langHandlerRegistry = {};\n  /** Register a language handler for the given file extensions.\n    * @param {function (Object)} handler a function from source code to a list\n    *      of decorations.  Takes a single argument job which describes the\n    *      state of the computation.   The single parameter has the form\n    *      {@code {\n    *        sourceCode: {string} as plain text.\n    *        decorations: {Array.<number|string>} an array of style classes\n    *                     preceded by the position at which they start in\n    *                     job.sourceCode in order.\n    *                     The language handler should assigned this field.\n    *        basePos: {int} the position of source in the larger source chunk.\n    *                 All positions in the output decorations array are relative\n    *                 to the larger source chunk.\n    *      } }\n    * @param {Array.<string>} fileExtensions\n    */\n  function registerLangHandler(handler, fileExtensions) {\n    for (var i = fileExtensions.length; --i >= 0;) {\n      var ext = fileExtensions[i];\n      if (!langHandlerRegistry.hasOwnProperty(ext)) {\n        langHandlerRegistry[ext] = handler;\n      } else if (win['console']) {\n        console['warn']('cannot override language handler %s', ext);\n      }\n    }\n  }\n  function langHandlerForExtension(extension, source) {\n    if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {\n      // Treat it as markup if the first non whitespace character is a < and\n      // the last non-whitespace character is a >.\n      extension = /^\\s*</.test(source)\n          ? 'default-markup'\n          : 'default-code';\n    }\n    return langHandlerRegistry[extension];\n  }\n  registerLangHandler(decorateSource, ['default-code']);\n  registerLangHandler(\n      createSimpleLexer(\n          [],\n          [\n           [PR_PLAIN,       /^[^<?]+/],\n           [PR_DECLARATION, /^<!\\w[^>]*(?:>|$)/],\n           [PR_COMMENT,     /^<\\!--[\\s\\S]*?(?:-\\->|$)/],\n           // Unescaped content in an unknown language\n           ['lang-',        /^<\\?([\\s\\S]+?)(?:\\?>|$)/],\n           ['lang-',        /^<%([\\s\\S]+?)(?:%>|$)/],\n           [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],\n           ['lang-',        /^<xmp\\b[^>]*>([\\s\\S]+?)<\\/xmp\\b[^>]*>/i],\n           // Unescaped content in javascript.  (Or possibly vbscript).\n           ['lang-js',      /^<script\\b[^>]*>([\\s\\S]*?)(<\\/script\\b[^>]*>)/i],\n           // Contains unescaped stylesheet content\n           ['lang-css',     /^<style\\b[^>]*>([\\s\\S]*?)(<\\/style\\b[^>]*>)/i],\n           ['lang-in.tag',  /^(<\\/?[a-z][^<>]*>)/i]\n          ]),\n      ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);\n  registerLangHandler(\n      createSimpleLexer(\n          [\n           [PR_PLAIN,        /^[\\s]+/, null, ' \\t\\r\\n'],\n           [PR_ATTRIB_VALUE, /^(?:\\\"[^\\\"]*\\\"?|\\'[^\\']*\\'?)/, null, '\\\"\\'']\n           ],\n          [\n           [PR_TAG,          /^^<\\/?[a-z](?:[\\w.:-]*\\w)?|\\/?>$/i],\n           [PR_ATTRIB_NAME,  /^(?!style[\\s=]|on)[a-z](?:[\\w:-]*\\w)?/i],\n           ['lang-uq.val',   /^=\\s*([^>\\'\\\"\\s]*(?:[^>\\'\\\"\\s\\/]|\\/(?=\\s)))/],\n           [PR_PUNCTUATION,  /^[=<>\\/]+/],\n           ['lang-js',       /^on\\w+\\s*=\\s*\\\"([^\\\"]+)\\\"/i],\n           ['lang-js',       /^on\\w+\\s*=\\s*\\'([^\\']+)\\'/i],\n           ['lang-js',       /^on\\w+\\s*=\\s*([^\\\"\\'>\\s]+)/i],\n           ['lang-css',      /^style\\s*=\\s*\\\"([^\\\"]+)\\\"/i],\n           ['lang-css',      /^style\\s*=\\s*\\'([^\\']+)\\'/i],\n           ['lang-css',      /^style\\s*=\\s*([^\\\"\\'>\\s]+)/i]\n           ]),\n      ['in.tag']);\n  registerLangHandler(\n      createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\\s\\S]+/]]), ['uq.val']);\n  registerLangHandler(sourceDecorator({\n          'keywords': CPP_KEYWORDS,\n          'hashComments': true,\n          'cStyleComments': true,\n          'types': C_TYPES\n        }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);\n  registerLangHandler(sourceDecorator({\n          'keywords': 'null,true,false'\n        }), ['json']);\n  registerLangHandler(sourceDecorator({\n          'keywords': CSHARP_KEYWORDS,\n          'hashComments': true,\n          'cStyleComments': true,\n          'verbatimStrings': true,\n          'types': C_TYPES\n        }), ['cs']);\n  registerLangHandler(sourceDecorator({\n          'keywords': JAVA_KEYWORDS,\n          'cStyleComments': true\n        }), ['java']);\n  registerLangHandler(sourceDecorator({\n          'keywords': SH_KEYWORDS,\n          'hashComments': true,\n          'multiLineStrings': true\n        }), ['bash', 'bsh', 'csh', 'sh']);\n  registerLangHandler(sourceDecorator({\n          'keywords': PYTHON_KEYWORDS,\n          'hashComments': true,\n          'multiLineStrings': true,\n          'tripleQuotedStrings': true\n        }), ['cv', 'py', 'python']);\n  registerLangHandler(sourceDecorator({\n          'keywords': PERL_KEYWORDS,\n          'hashComments': true,\n          'multiLineStrings': true,\n          'regexLiterals': 2  // multiline regex literals\n        }), ['perl', 'pl', 'pm']);\n  registerLangHandler(sourceDecorator({\n          'keywords': RUBY_KEYWORDS,\n          'hashComments': true,\n          'multiLineStrings': true,\n          'regexLiterals': true\n        }), ['rb', 'ruby']);\n  registerLangHandler(sourceDecorator({\n          'keywords': JSCRIPT_KEYWORDS,\n          'cStyleComments': true,\n          'regexLiterals': true\n        }), ['javascript', 'js']);\n  registerLangHandler(sourceDecorator({\n          'keywords': COFFEE_KEYWORDS,\n          'hashComments': 3,  // ### style block comments\n          'cStyleComments': true,\n          'multilineStrings': true,\n          'tripleQuotedStrings': true,\n          'regexLiterals': true\n        }), ['coffee']);\n  registerLangHandler(sourceDecorator({\n          'keywords': RUST_KEYWORDS,\n          'cStyleComments': true,\n          'multilineStrings': true\n        }), ['rc', 'rs', 'rust']);\n  registerLangHandler(\n      createSimpleLexer([], [[PR_STRING, /^[\\s\\S]+/]]), ['regex']);\n\n  function applyDecorator(job) {\n    var opt_langExtension = job.langExtension;\n\n    try {\n      // Extract tags, and convert the source code to plain text.\n      var sourceAndSpans = extractSourceSpans(job.sourceNode, job.pre);\n      /** Plain text. @type {string} */\n      var source = sourceAndSpans.sourceCode;\n      job.sourceCode = source;\n      job.spans = sourceAndSpans.spans;\n      job.basePos = 0;\n\n      // Apply the appropriate language handler\n      langHandlerForExtension(opt_langExtension, source)(job);\n\n      // Integrate the decorations and tags back into the source code,\n      // modifying the sourceNode in place.\n      recombineTagsAndDecorations(job);\n    } catch (e) {\n      if (win['console']) {\n        console['log'](e && e['stack'] || e);\n      }\n    }\n  }\n\n  /**\n   * Pretty print a chunk of code.\n   * @param sourceCodeHtml {string} The HTML to pretty print.\n   * @param opt_langExtension {string} The language name to use.\n   *     Typically, a filename extension like 'cpp' or 'java'.\n   * @param opt_numberLines {number|boolean} True to number lines,\n   *     or the 1-indexed number of the first line in sourceCodeHtml.\n   */\n  function $prettyPrintOne(sourceCodeHtml, opt_langExtension, opt_numberLines) {\n    var container = document.createElement('div');\n    // This could cause images to load and onload listeners to fire.\n    // E.g. <img onerror=\"alert(1337)\" src=\"nosuchimage.png\">.\n    // We assume that the inner HTML is from a trusted source.\n    // The pre-tag is required for IE8 which strips newlines from innerHTML\n    // when it is injected into a <pre> tag.\n    // http://stackoverflow.com/questions/451486/pre-tag-loses-line-breaks-when-setting-innerhtml-in-ie\n    // http://stackoverflow.com/questions/195363/inserting-a-newline-into-a-pre-tag-ie-javascript\n    container.innerHTML = '<pre>' + sourceCodeHtml + '</pre>';\n    container = container.firstChild;\n    if (opt_numberLines) {\n      numberLines(container, opt_numberLines, true);\n    }\n\n    var job = {\n      langExtension: opt_langExtension,\n      numberLines: opt_numberLines,\n      sourceNode: container,\n      pre: 1\n    };\n    applyDecorator(job);\n    return container.innerHTML;\n  }\n\n   /**\n    * Find all the {@code <pre>} and {@code <code>} tags in the DOM with\n    * {@code class=prettyprint} and prettify them.\n    *\n    * @param {Function} opt_whenDone called when prettifying is done.\n    * @param {HTMLElement|HTMLDocument} opt_root an element or document\n    *   containing all the elements to pretty print.\n    *   Defaults to {@code document.body}.\n    */\n  function $prettyPrint(opt_whenDone, opt_root) {\n    var root = opt_root || document.body;\n    var doc = root.ownerDocument || document;\n    function byTagName(tn) { return root.getElementsByTagName(tn); }\n    // fetch a list of nodes to rewrite\n    var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')];\n    var elements = [];\n    for (var i = 0; i < codeSegments.length; ++i) {\n      for (var j = 0, n = codeSegments[i].length; j < n; ++j) {\n        elements.push(codeSegments[i][j]);\n      }\n    }\n    codeSegments = null;\n\n    var clock = Date;\n    if (!clock['now']) {\n      clock = { 'now': function () { return +(new Date); } };\n    }\n\n    // The loop is broken into a series of continuations to make sure that we\n    // don't make the browser unresponsive when rewriting a large page.\n    var k = 0;\n    var prettyPrintingJob;\n\n    var langExtensionRe = /\\blang(?:uage)?-([\\w.]+)(?!\\S)/;\n    var prettyPrintRe = /\\bprettyprint\\b/;\n    var prettyPrintedRe = /\\bprettyprinted\\b/;\n    var preformattedTagNameRe = /pre|xmp/i;\n    var codeRe = /^code$/i;\n    var preCodeXmpRe = /^(?:pre|code|xmp)$/i;\n    var EMPTY = {};\n\n    function doWork() {\n      var endTime = (win['PR_SHOULD_USE_CONTINUATION'] ?\n                     clock['now']() + 250 /* ms */ :\n                     Infinity);\n      for (; k < elements.length && clock['now']() < endTime; k++) {\n        var cs = elements[k];\n\n        // Look for a preceding comment like\n        // <?prettify lang=\"...\" linenums=\"...\"?>\n        var attrs = EMPTY;\n        {\n          for (var preceder = cs; (preceder = preceder.previousSibling);) {\n            var nt = preceder.nodeType;\n            // <?foo?> is parsed by HTML 5 to a comment node (8)\n            // like <!--?foo?-->, but in XML is a processing instruction\n            var value = (nt === 7 || nt === 8) && preceder.nodeValue;\n            if (value\n                ? !/^\\??prettify\\b/.test(value)\n                : (nt !== 3 || /\\S/.test(preceder.nodeValue))) {\n              // Skip over white-space text nodes but not others.\n              break;\n            }\n            if (value) {\n              attrs = {};\n              value.replace(\n                  /\\b(\\w+)=([\\w:.%+-]+)/g,\n                function (_, name, value) { attrs[name] = value; });\n              break;\n            }\n          }\n        }\n\n        var className = cs.className;\n        if ((attrs !== EMPTY || prettyPrintRe.test(className))\n            // Don't redo this if we've already done it.\n            // This allows recalling pretty print to just prettyprint elements\n            // that have been added to the page since last call.\n            && !prettyPrintedRe.test(className)) {\n\n          // make sure this is not nested in an already prettified element\n          var nested = false;\n          for (var p = cs.parentNode; p; p = p.parentNode) {\n            var tn = p.tagName;\n            if (preCodeXmpRe.test(tn)\n                && p.className && prettyPrintRe.test(p.className)) {\n              nested = true;\n              break;\n            }\n          }\n          if (!nested) {\n            // Mark done.  If we fail to prettyprint for whatever reason,\n            // we shouldn't try again.\n            cs.className += ' prettyprinted';\n\n            // If the classes includes a language extensions, use it.\n            // Language extensions can be specified like\n            //     <pre class=\"prettyprint lang-cpp\">\n            // the language extension \"cpp\" is used to find a language handler\n            // as passed to PR.registerLangHandler.\n            // HTML5 recommends that a language be specified using \"language-\"\n            // as the prefix instead.  Google Code Prettify supports both.\n            // http://dev.w3.org/html5/spec-author-view/the-code-element.html\n            var langExtension = attrs['lang'];\n            if (!langExtension) {\n              langExtension = className.match(langExtensionRe);\n              // Support <pre class=\"prettyprint\"><code class=\"language-c\">\n              var wrapper;\n              if (!langExtension && (wrapper = childContentWrapper(cs))\n                  && codeRe.test(wrapper.tagName)) {\n                langExtension = wrapper.className.match(langExtensionRe);\n              }\n\n              if (langExtension) { langExtension = langExtension[1]; }\n            }\n\n            var preformatted;\n            if (preformattedTagNameRe.test(cs.tagName)) {\n              preformatted = 1;\n            } else {\n              var currentStyle = cs['currentStyle'];\n              var defaultView = doc.defaultView;\n              var whitespace = (\n                  currentStyle\n                  ? currentStyle['whiteSpace']\n                  : (defaultView\n                     && defaultView.getComputedStyle)\n                  ? defaultView.getComputedStyle(cs, null)\n                  .getPropertyValue('white-space')\n                  : 0);\n              preformatted = whitespace\n                  && 'pre' === whitespace.substring(0, 3);\n            }\n\n            // Look for a class like linenums or linenums:<n> where <n> is the\n            // 1-indexed number of the first line.\n            var lineNums = attrs['linenums'];\n            if (!(lineNums = lineNums === 'true' || +lineNums)) {\n              lineNums = className.match(/\\blinenums\\b(?::(\\d+))?/);\n              lineNums =\n                lineNums\n                ? lineNums[1] && lineNums[1].length\n                  ? +lineNums[1] : true\n                : false;\n            }\n            if (lineNums) { numberLines(cs, lineNums, preformatted); }\n\n            // do the pretty printing\n            prettyPrintingJob = {\n              langExtension: langExtension,\n              sourceNode: cs,\n              numberLines: lineNums,\n              pre: preformatted\n            };\n            applyDecorator(prettyPrintingJob);\n          }\n        }\n      }\n      if (k < elements.length) {\n        // finish up in a continuation\n        setTimeout(doWork, 250);\n      } else if ('function' === typeof opt_whenDone) {\n        opt_whenDone();\n      }\n    }\n\n    doWork();\n  }\n\n  /**\n   * Contains functions for creating and registering new language handlers.\n   * @type {Object}\n   */\n  var PR = win['PR'] = {\n        'createSimpleLexer': createSimpleLexer,\n        'registerLangHandler': registerLangHandler,\n        'sourceDecorator': sourceDecorator,\n        'PR_ATTRIB_NAME': PR_ATTRIB_NAME,\n        'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,\n        'PR_COMMENT': PR_COMMENT,\n        'PR_DECLARATION': PR_DECLARATION,\n        'PR_KEYWORD': PR_KEYWORD,\n        'PR_LITERAL': PR_LITERAL,\n        'PR_NOCODE': PR_NOCODE,\n        'PR_PLAIN': PR_PLAIN,\n        'PR_PUNCTUATION': PR_PUNCTUATION,\n        'PR_SOURCE': PR_SOURCE,\n        'PR_STRING': PR_STRING,\n        'PR_TAG': PR_TAG,\n        'PR_TYPE': PR_TYPE,\n        'prettyPrintOne':\n           IN_GLOBAL_SCOPE\n             ? (win['prettyPrintOne'] = $prettyPrintOne)\n             : (prettyPrintOne = $prettyPrintOne),\n        'prettyPrint': prettyPrint =\n           IN_GLOBAL_SCOPE\n             ? (win['prettyPrint'] = $prettyPrint)\n             : (prettyPrint = $prettyPrint)\n      };\n\n  // Make PR available via the Asynchronous Module Definition (AMD) API.\n  // Per https://github.com/amdjs/amdjs-api/wiki/AMD:\n  // The Asynchronous Module Definition (AMD) API specifies a\n  // mechanism for defining modules such that the module and its\n  // dependencies can be asynchronously loaded.\n  // ...\n  // To allow a clear indicator that a global define function (as\n  // needed for script src browser loading) conforms to the AMD API,\n  // any global define function SHOULD have a property called \"amd\"\n  // whose value is an object. This helps avoid conflict with any\n  // other existing JavaScript code that could have defined a define()\n  // function that does not conform to the AMD API.\n  if (typeof define === \"function\" && define['amd']) {\n    define(\"google-code-prettify\", [], function () {\n      return PR; \n    });\n  }\n})();\n"
  },
  {
    "path": "google-code-prettify/js-modules/recombineTagsAndDecorations.js",
    "content": "/**\n * Breaks {@code job.sourceCode} around style boundaries in\n * {@code job.decorations} and modifies {@code job.sourceNode} in place.\n * @param {Object} job like <pre>{\n *    sourceCode: {string} source as plain text,\n *    sourceNode: {HTMLElement} the element containing the source,\n *    spans: {Array.<number|Node>} alternating span start indices into source\n *       and the text node or element (e.g. {@code <BR>}) corresponding to that\n *       span.\n *    decorations: {Array.<number|string} an array of style classes preceded\n *       by the position at which they start in job.sourceCode in order\n * }</pre>\n * @private\n */\nfunction recombineTagsAndDecorations(job) {\n  var isIE8OrEarlier = /\\bMSIE\\s(\\d+)/.exec(navigator.userAgent);\n  isIE8OrEarlier = isIE8OrEarlier && +isIE8OrEarlier[1] <= 8;\n  var newlineRe = /\\n/g;\n\n  var source = job.sourceCode;\n  var sourceLength = source.length;\n  // Index into source after the last code-unit recombined.\n  var sourceIndex = 0;\n\n  var spans = job.spans;\n  var nSpans = spans.length;\n  // Index into spans after the last span which ends at or before sourceIndex.\n  var spanIndex = 0;\n\n  var decorations = job.decorations;\n  var nDecorations = decorations.length;\n  // Index into decorations after the last decoration which ends at or before\n  // sourceIndex.\n  var decorationIndex = 0;\n\n  // Remove all zero-length decorations.\n  decorations[nDecorations] = sourceLength;\n  var decPos, i;\n  for (i = decPos = 0; i < nDecorations;) {\n    if (decorations[i] !== decorations[i + 2]) {\n      decorations[decPos++] = decorations[i++];\n      decorations[decPos++] = decorations[i++];\n    } else {\n      i += 2;\n    }\n  }\n  nDecorations = decPos;\n\n  // Simplify decorations.\n  for (i = decPos = 0; i < nDecorations;) {\n    var startPos = decorations[i];\n    // Conflate all adjacent decorations that use the same style.\n    var startDec = decorations[i + 1];\n    var end = i + 2;\n    while (end + 2 <= nDecorations && decorations[end + 1] === startDec) {\n      end += 2;\n    }\n    decorations[decPos++] = startPos;\n    decorations[decPos++] = startDec;\n    i = end;\n  }\n\n  nDecorations = decorations.length = decPos;\n\n  var sourceNode = job.sourceNode;\n  var oldDisplay;\n  if (sourceNode) {\n    oldDisplay = sourceNode.style.display;\n    sourceNode.style.display = 'none';\n  }\n  try {\n    var decoration = null;\n    while (spanIndex < nSpans) {\n      var spanStart = spans[spanIndex];\n      var spanEnd = spans[spanIndex + 2] || sourceLength;\n\n      var decEnd = decorations[decorationIndex + 2] || sourceLength;\n\n      var end = Math.min(spanEnd, decEnd);\n\n      var textNode = spans[spanIndex + 1];\n      var styledText;\n      if (textNode.nodeType !== 1  // Don't muck with <BR>s or <LI>s\n          // Don't introduce spans around empty text nodes.\n          && (styledText = source.substring(sourceIndex, end))) {\n        // This may seem bizarre, and it is.  Emitting LF on IE causes the\n        // code to display with spaces instead of line breaks.\n        // Emitting Windows standard issue linebreaks (CRLF) causes a blank\n        // space to appear at the beginning of every line but the first.\n        // Emitting an old Mac OS 9 line separator makes everything spiffy.\n        if (isIE8OrEarlier) {\n          styledText = styledText.replace(newlineRe, '\\r');\n        }\n        textNode.nodeValue = styledText;\n        var document = textNode.ownerDocument;\n        var span = document.createElement('span');\n        span.className = decorations[decorationIndex + 1];\n        var parentNode = textNode.parentNode;\n        parentNode.replaceChild(span, textNode);\n        span.appendChild(textNode);\n        if (sourceIndex < spanEnd) {  // Split off a text node.\n          spans[spanIndex + 1] = textNode\n              // TODO: Possibly optimize by using '' if there's no flicker.\n              = document.createTextNode(source.substring(end, spanEnd));\n          parentNode.insertBefore(textNode, span.nextSibling);\n        }\n      }\n\n      sourceIndex = end;\n\n      if (sourceIndex >= spanEnd) {\n        spanIndex += 2;\n      }\n      if (sourceIndex >= decEnd) {\n        decorationIndex += 2;\n      }\n    }\n  } finally {\n    if (sourceNode) {\n      sourceNode.style.display = oldDisplay;\n    }\n  }\n}\n"
  },
  {
    "path": "google-code-prettify/js-modules/recombineTagsAndDecorations_test.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n<html> <head>\n<title>Recombine Tags And Decorations</title>\n<script src=\"extractSourceSpans.js\"></script>\n<script src=\"numberLines.js\"></script>\n<script src=\"recombineTagsAndDecorations.js\"></script>\n<script src=\"http://github.com/douglascrockford/JSON-js/raw/master/json2.js\"></script>\n<link rel=\"stylesheet\" href=\"../src/prettify.css\" type=\"text/css\" />\n<style>\n.ok { background: #dfd }\n.error, .failure { background: #fdd }\n.error { white-space: pre }\ntd { font-family: monospace }\ntr { vertical-align: top }\n</style>\n</head>\n\n<body>\n<h1>Recombine Tags And Decorations</h1>\n\n<table border=\"1\" cellpadding=\"2\" cellspacing=\"0\">\n  <tr><th colspan=\"4\">Test Single Decoration</th></tr>\n  <tr>\n    <td><code class=\"testinput\">\"Hello, World!\"</code></td>\n    <td class=\"decorations\">[0, 'str']</td>\n    <td><code><span class=\"str\">\"Hello, World!\"</span></code></td>\n  </tr>\n  <tr><th colspan=\"4\">Test Single Span</th></tr>\n  <tr>\n    <td><code class=\"testinput\">print \"Hello, &lt;World&gt;!\";</code></td>\n    <td class=\"decorations\">[0, 'kwd', 5, 'pln', 6, 'str', 14, 'tag', 21, 'str', 23, 'pun']</td>\n    <td><code><span class=\"kwd\">print</span><span class=\"pln\"> </span><span class=\"str\">\"Hello, </span><span class=\"tag\">&lt;World&gt;</span><span class=\"str\">!\"</span><span class=\"pun\">;</span></code></td>\n  </tr>\n  <tr><th colspan=\"4\">Test Interleaved</th></tr>\n  <tr>\n    <td><code class=\"testinput\">print \"Hello, &lt;<b>World</b>&gt;!\";</code></td>\n    <td class=\"decorations\">[0, 'kwd', 5, 'pln', 6, 'str', 14, 'tag', 21, 'str', 23, 'pun']</td>\n    <td><code><span class=\"kwd\">print</span><span class=\"pln\"> </span><span class=\"str\">\"Hello, </span><span class=\"tag\">&lt;</span><b><span class=\"tag\">World</span></b><span class=\"tag\">&gt;</span><span class=\"str\">!\"</span><span class=\"pun\">;</span></code></td>\n  </tr>\n</table>\n\n<script>\nif (!document.body.getElementsByClassName) {\n  document.body.getElementsByClassName = function (className) {\n    className = className.replace(/\\s+/g, ' ').replace(/^\\s*|\\s*$/g, ' ');\n    var results = [];\n    function walk(node) {\n      if (node.nodeType !== 1) { return; }\n      // This test should be order-insensitive.\n      if ((' ' + node.className + ' ').indexOf(className) >= 0) {\n        results[results.length] = node;\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        walk(child);\n      }\n    }\n    walk(document.body);\n    return results;\n  };\n}\n\nsetTimeout(function () {\n  var testInputs = Array.prototype.slice.call(\n     document.body.getElementsByClassName('testinput'), 0);\n  for (var i = 0, n = testInputs.length; i < n; ++i) {\n    var testInput = testInputs[i];\n    var decorationsNode = testInput.parentNode.nextSibling;\n    while (decorationsNode.nodeType !== 1) { decorationsNode = decorationsNode.nextSibling; }\n    var testResult = decorationsNode.nextSibling;\n    while (testResult.nodeType !== 1) { testResult = testResult.nextSibling; }\n    var actual = document.createElement('TD');\n    testResult.parentNode.appendChild(actual);\n    var clone = testInput.cloneNode(true);\n    clone.className = '';  // IE\n    clone.removeAttribute('class');  // Not IE.\n    actual.appendChild(clone);\n    var job = extractSourceSpans(clone);\n    job.decorations = eval(decorationsNode.innerText || decorationsNode.textContent);\n    try {\n      recombineTagsAndDecorations(job);\n      var passed = testResult.innerHTML === actual.innerHTML;\n      if (!passed) {\n        console.log(JSON.stringify(testResult.innerHTML) + ' !==\\n' + JSON.stringify(actual.innerHTML));\n      }\n      actual.className = passed ? 'ok' : 'failure';\n    } catch (ex) {\n      actual.className = 'error';\n      actual.appendChild(document.createTextNode(\n          'Error: ' + (ex.message || ex)  + '\\n' + ex.stack));\n    }\n    actual.className += ' actual';\n  }\n}, 0)</script>\n\n<hr>\n<address></address>\n<!-- hhmts start --> Last modified: Tue Mar 29 10:41:34 PDT 2011 <!-- hhmts end -->\n</body> </html>\n"
  },
  {
    "path": "google-code-prettify/js-modules/regexpPrecederPatterns.pl",
    "content": "use strict;\n\nprint \"\n\n/**\n * A set of tokens that can precede a regular expression literal in\n * javascript\n * http://web.archive.org/web/20070717142515/http://www.mozilla.org/js/language/js20/rationale/syntax.html\n * has the full list, but I've removed ones that might be problematic when\n * seen in languages that don't support regular expression literals.\n *\n * <p>Specifically, I've removed any keywords that can't precede a regexp\n * literal in a syntactically legal javascript program, and I've removed the\n * \\\"in\\\" keyword since it's not a keyword in many languages, and might be used\n * as a count of inches.\n *\n * <p>The link above does not accurately describe EcmaScript rules since\n * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works\n * very well in practice.\n *\n * \\@private\n * \\@const\n */\nvar REGEXP_PRECEDER_PATTERN = \";\n\nmy @preceders = (\n                 \"[!=]=?=?\",   # \"!\", \"!=\", \"!==\", \"=\", \"==\", \"===\",\n                 \"\\\\#\",\n                 \"%=?\",        # \"%\", \"%=\",\n                 \"&&?=?\",      # \"&\", \"&&\", \"&&=\", \"&=\",\n                 \"\\\\(\",\n                 \"\\\\*=?\",      # \"*\", \"*=\",\n                 \"[+\\\\-]=\",    # +=, -=.  + and - handled below.\n                 \"->\",\n                 \"\\\\/=?\",      # \"/\", \"/=\",\n                 \"::?\",        # \":\", \"::\",\n                 \"<<?=?\",      # \"<\", \"<<\", \"<<=\", \"<=\", \n                 \">>?>?=?\",    # \">\", \">=\", \">>\", \">>=\", \">>>\", \">>>=\",\n                 \",\",\n                 \";\",          # \";\"\n                 \"\\\\?\",\n                 \"@\",\n                 \"\\\\[\",\n                 \"~\",          # handles =~ and !~\n                 \"{\",\n                 \"\\\\^\\\\^?=?\",  # \"^\", \"^=\", \"^^\", \"^^=\",\n                 \"\\\\|\\\\|?=?\",  # \"|\", \"|=\", \"||\", \"||=\",\n                 \"break\", \"case\", \"continue\", \"delete\",\n                 \"do\", \"else\", \"finally\", \"instanceof\",\n                 \"return\", \"throw\", \"try\", \"typeof\"\n                );\n# match at beginning, a dot that is not part of a number, or sign.\nmy $pattern = \"'(?:^^\\\\\\\\.?|[+-]\";\nforeach my $preceder (@preceders) {\n  $preceder =~ s/\\\\/\\\\\\\\/g;\n  $pattern .= \"|$preceder\";\n}\n$pattern .= \")\\\\\\\\s*'\";  # matches at end, and matches empty string\n\nprint \"$pattern;\\n\";\n\nprint \"\n// CAVEAT: this does not properly handle the case where a regular\n// expression immediately follows another since a regular expression may\n// have flags for case-sensitivity and the like.  Having regexp tokens\n// adjacent is not valid in any language I'm aware of, so I'm punting.\n// TODO: maybe style special characters inside a regexp as punctuation.\n\";\n"
  },
  {
    "path": "google-code-prettify/js-modules/run_prettify.js",
    "content": "// Copyright (C) 2013 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n// Looks at query parameters to decide which language handlers and style-sheets\n// to load.\n\n// Query Parameter     Format           Effect                        Default\n// +------------------+---------------+------------------------------+--------+\n// | autorun=         | true | false  | If true then prettyPrint()   | \"true\" |\n// |                  |               | is called on page load.      |        |\n// +------------------+---------------+------------------------------+--------+\n// | lang=            | language name | Loads the language handler   | Can    |\n// |                  |               | named \"lang-<NAME>.js\".      | appear |\n// |                  |               | See available handlers at    | many   |\n// |                  |               | http://code.google.com/p/    | times. |\n// |                  |               | google-code-prettify/source/ |        |\n// |                  |               | browse/trunk/src             |        |\n// +------------------+---------------+------------------------------+--------+\n// | skin=            | skin name     | Loads the skin stylesheet    | none.  |\n// |                  |               | named \"<NAME>.css\".          |        |\n// |                  |               | http://code.google.com/p/    |        |\n// |                  |               | google-code-prettify/source/ |        |\n// |                  |               | browse/trunk/styles          |        |\n// +------------------+---------------+------------------------------+--------+\n// | callback=        | JS identifier | When \"prettyPrint\" finishes  | none   |\n// |                  |               | window.exports[js_ident] is  |        |\n// |                  |               | called.                      |        |\n// |                  |               | The callback must be under   |        |\n// |                  |               | exports to reduce the risk   |        |\n// |                  |               | of XSS via query parameter   |        |\n// |                  |               | injection.                   |        |\n// +------------------+---------------+------------------------------+--------+\n\n// Exmaples\n// .../prettify.js?lang=css&skin=sunburst\n//   1. Loads the CSS language handler which can be used to prettify CSS\n//      stylesheets, HTML <style> element bodies and style=\"...\" attributes\n//      values.\n//   2. Loads the sunburst.css stylesheet instead of the default prettify.css\n//      stylesheet.\n//      A gallery of stylesheets is available at\n//      https://google-code-prettify.googlecode.com/svn/trunk/styles/index.html\n//   3. Since autorun=false is not specified, calls prettyPrint() on page load.\n\n(function () {\n  \"use strict\";\n\n  var win = window;\n  var setTimeout = win.setTimeout;\n  var doc = document;\n  var root = doc.documentElement;\n  var head = doc['head'] || doc.getElementsByTagName(\"head\")[0] || root;\n\n  // From http://javascript.nwbox.com/ContentLoaded/contentloaded.js\n  // Author: Diego Perini (diego.perini at gmail.com)\n  // Summary: cross-browser wrapper for DOMContentLoaded\n  // Updated: 20101020\n  // License: MIT\n  // Version: 1.2\n  function contentLoaded(callback) {\n    var addEventListener = doc['addEventListener'];\n    var done = false, top = true,\n        add = addEventListener ? 'addEventListener' : 'attachEvent',\n        rem = addEventListener ? 'removeEventListener' : 'detachEvent',\n        pre = addEventListener ? '' : 'on',\n\n        init = function(e) {\n          if (e.type == 'readystatechange' && doc.readyState != 'complete') {\n            return;\n          }\n          (e.type == 'load' ? win : doc)[rem](pre + e.type, init, false);\n          if (!done && (done = true)) { callback.call(win, e.type || e); }\n        },\n\n        poll = function() {\n          try {\n            root.doScroll('left');\n          } catch(e) {\n            setTimeout(poll, 50);\n            return;\n          }\n          init('poll');\n        };\n\n    if (doc.readyState == 'complete') {\n      callback.call(win, 'lazy');\n    } else {\n      if (doc.createEventObject && root.doScroll) {\n        try { top = !win.frameElement; } catch(e) { }\n        if (top) { poll(); }\n      }\n      doc[add](pre + 'DOMContentLoaded', init, false);\n      doc[add](pre + 'readystatechange', init, false);\n      win[add](pre + 'load', init, false);\n    }\n  }\n\n  // Given a list of URLs to stylesheets, loads the first that loads without\n  // triggering an error event.\n  function loadStylesheetsFallingBack(stylesheets) {\n    var n = stylesheets.length;\n    function load(i) {\n      if (i === n) { return; }\n      var link = doc.createElement('link');\n      link.rel = 'stylesheet';\n      link.type = 'text/css';\n      if (i + 1 < n) {\n        // http://pieisgood.org/test/script-link-events/ indicates that many\n        // versions of IE do not support onerror on <link>s, though\n        // http://msdn.microsoft.com/en-us/library/ie/ms535848(v=vs.85).aspx\n        // indicates that recent IEs do support error.\n        link.error = link.onerror = function () { load(i + 1); };\n      }\n      link.href = stylesheets[i];\n      head.appendChild(link);\n    }\n    load(0);\n  }\n\n  var scriptQuery = '';\n  // Look for the <script> node that loads this script to get its parameters.\n  // This starts looking at the end instead of just considering the last\n  // because deferred and async scripts run out of order.\n  // If the script is loaded twice, then this will run in reverse order.\n  for (var scripts = doc.scripts, i = scripts.length; --i >= 0;) {\n    var script = scripts[i];\n    var match = script.src.match(\n        /^[^?#]*\\/run_prettify\\.js(\\?[^#]*)?(?:#.*)?$/);\n    if (match) {\n      scriptQuery = match[1] || '';\n      // Remove the script from the DOM so that multiple runs at least run\n      // multiple times even if parameter sets are interpreted in reverse\n      // order.\n      script.parentNode.removeChild(script);\n      break;\n    }\n  }\n\n  // Pull parameters into local variables.\n  var autorun = true;\n  var langs = [];\n  var skins = [];\n  var callbacks = [];\n  scriptQuery.replace(\n      /[?&]([^&=]+)=([^&]+)/g,\n      function (_, name, value) {\n        value = decodeURIComponent(value);\n        name = decodeURIComponent(name);\n        if (name == 'autorun')   { autorun = !/^[0fn]/i.test(value); } else\n        if (name == 'lang')      { langs.push(value);                } else\n        if (name == 'skin')      { skins.push(value);                } else\n        if (name == 'callback')  { callbacks.push(value);            }\n      });\n\n  // Use https to avoid mixed content warnings in client pages and to\n  // prevent a MITM from rewrite prettify mid-flight.\n  // This only works if this script is loaded via https : something\n  // over which we exercise no control.\n  var LOADER_BASE_URL =\n     'https://google-code-prettify.googlecode.com/svn/loader';\n\n  for (var i = 0, n = langs.length; i < n; ++i) (function (lang) {\n    var script = doc.createElement(\"script\");\n\n    // Excerpted from jQuery.ajaxTransport(\"script\") to fire events when\n    // a script is finished loading.\n    // Attach handlers for each script\n    script.onload = script.onerror = script.onreadystatechange = function () {\n      if (script && (\n            !script.readyState || /loaded|complete/.test(script.readyState))) {\n        // Handle memory leak in IE\n        script.onerror = script.onload = script.onreadystatechange = null;\n\n        --pendingLanguages;\n        checkPendingLanguages();\n\n        // Remove the script\n        if (script.parentNode) {\n          script.parentNode.removeChild(script);\n        }\n\n        script = null;\n      }\n    };\n\n    script.type = 'text/javascript';\n    script.src = LOADER_BASE_URL\n      + '/lang-' + encodeURIComponent(langs[i]) + '.js';\n\n    // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending\n    head.insertBefore(script, head.firstChild);\n  })(langs[i]);\n\n  var pendingLanguages = langs.length;\n  function checkPendingLanguages() {\n    if (!pendingLanguages) {\n      setTimeout(onLangsLoaded, 0);\n    }\n  }\n\n  var skinUrls = [];\n  for (var i = 0, n = skins.length; i < n; ++i) {\n    skinUrls.push(LOADER_BASE_URL\n        + '/skins/' + encodeURIComponent(skins[i]) + '.css');\n  }\n  skinUrls.push(LOADER_BASE_URL + '/prettify.css');\n  loadStylesheetsFallingBack(skinUrls);\n\n  var prettyPrint = (function () {\n    include(\"prettify.js\");\n    return prettyPrint;\n  })();\n\n  // If this script is deferred or async and the document is already\n  // loaded we need to wait for language handlers to load before performing\n  // any autorun.\n  function onLangsLoaded() {\n    if (autorun) {\n      contentLoaded(\n        function () {\n          var n = callbacks.length;\n          var callback = n ? function () {\n            for (var i = 0; i < n; ++i) {\n              (function (i) {\n                 setTimeout(\n                   function () {\n                     win['exports'][callbacks[i]].apply(win, arguments);\n                   }, 0);\n               })(i);\n            }\n          } : void 0;\n          prettyPrint(callback);\n        });\n    }\n  }\n  checkPendingLanguages();\n\n}());\n"
  },
  {
    "path": "google-code-prettify/src/lang-apollo.js",
    "content": "// Copyright (C) 2009 Onno Hommes.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview\n * Registers a language handler for the AGC/AEA Assembly Language as described\n * at http://virtualagc.googlecode.com\n * <p>\n * This file could be used by goodle code to allow syntax highlight for\n * Virtual AGC SVN repository or if you don't want to commonize\n * the header for the agc/aea html assembly listing.\n *\n * @author ohommes@alumni.cmu.edu\n */\n\nPR['registerLangHandler'](\n    PR['createSimpleLexer'](\n        [\n         // A line comment that starts with ;\n         [PR['PR_COMMENT'],     /^#[^\\r\\n]*/, null, '#'],\n         // Whitespace\n         [PR['PR_PLAIN'],       /^[\\t\\n\\r \\xA0]+/, null, '\\t\\n\\r \\xA0'],\n         // A double quoted, possibly multi-line, string.\n         [PR['PR_STRING'],      /^\\\"(?:[^\\\"\\\\]|\\\\[\\s\\S])*(?:\\\"|$)/, null, '\"']\n        ],\n        [\n         [PR['PR_KEYWORD'], /^(?:ADS|AD|AUG|BZF|BZMF|CAE|CAF|CA|CCS|COM|CS|DAS|DCA|DCOM|DCS|DDOUBL|DIM|DOUBLE|DTCB|DTCF|DV|DXCH|EDRUPT|EXTEND|INCR|INDEX|NDX|INHINT|LXCH|MASK|MSK|MP|MSU|NOOP|OVSK|QXCH|RAND|READ|RELINT|RESUME|RETURN|ROR|RXOR|SQUARE|SU|TCR|TCAA|OVSK|TCF|TC|TS|WAND|WOR|WRITE|XCH|XLQ|XXALQ|ZL|ZQ|ADD|ADZ|SUB|SUZ|MPY|MPR|MPZ|DVP|COM|ABS|CLA|CLZ|LDQ|STO|STQ|ALS|LLS|LRS|TRA|TSQ|TMI|TOV|AXT|TIX|DLY|INP|OUT)\\s/,null],\n         [PR['PR_TYPE'], /^(?:-?GENADR|=MINUS|2BCADR|VN|BOF|MM|-?2CADR|-?[1-6]DNADR|ADRES|BBCON|[SE]?BANK\\=?|BLOCK|BNKSUM|E?CADR|COUNT\\*?|2?DEC\\*?|-?DNCHAN|-?DNPTR|EQUALS|ERASE|MEMORY|2?OCT|REMADR|SETLOC|SUBRO|ORG|BSS|BES|SYN|EQU|DEFINE|END)\\s/,null],\n         // A single quote possibly followed by a word that optionally ends with\n         // = ! or ?.\n         [PR['PR_LITERAL'],\n          /^\\'(?:-*(?:\\w|\\\\[\\x21-\\x7e])(?:[\\w-]*|\\\\[\\x21-\\x7e])[=!?]?)?/],\n         // Any word including labels that optionally ends with = ! or ?.\n         [PR['PR_PLAIN'],\n          /^-*(?:[!-z_]|\\\\[\\x21-\\x7e])(?:[\\w-]*|\\\\[\\x21-\\x7e])[=!?]?/i],\n         // A printable non-space non-special character\n         [PR['PR_PUNCTUATION'], /^[^\\w\\t\\n\\r \\xA0()\\\"\\\\\\';]+/]\n        ]),\n    ['apollo', 'agc', 'aea']);\n"
  },
  {
    "path": "google-code-prettify/src/lang-basic.js",
    "content": "// Contributed by peter dot kofler at code minus cop dot org\n\n/**\n * @fileoverview\n * Registers a language handler for Basic.\n *\n * To use, include prettify.js and this file in your HTML page.\n * Then put your code in an HTML tag like\n *      <pre class=\"prettyprint lang-basic\">(my BASIC code)</pre>\n *\n * @author peter dot kofler at code minus cop dot org\n */\n\nPR.registerLangHandler(\n    PR.createSimpleLexer(\n        [ // shortcutStylePatterns\n          // \"single-line-string\"\n          [PR.PR_STRING,        /^(?:\"(?:[^\\\\\"\\r\\n]|\\\\.)*(?:\"|$))/, null, '\"'],\n          // Whitespace\n          [PR.PR_PLAIN,         /^\\s+/, null, ' \\r\\n\\t\\xA0']\n        ],\n        [ // fallthroughStylePatterns\n          // A line comment that starts with REM\n          [PR.PR_COMMENT,       /^REM[^\\r\\n]*/, null],\n          [PR.PR_KEYWORD,       /^\\b(?:AND|CLOSE|CLR|CMD|CONT|DATA|DEF ?FN|DIM|END|FOR|GET|GOSUB|GOTO|IF|INPUT|LET|LIST|LOAD|NEW|NEXT|NOT|ON|OPEN|OR|POKE|PRINT|READ|RESTORE|RETURN|RUN|SAVE|STEP|STOP|SYS|THEN|TO|VERIFY|WAIT)\\b/, null],\n          [PR.PR_PLAIN,         /^[A-Z][A-Z0-9]?(?:\\$|%)?/i, null],\n          // Literals .0, 0, 0.0 0E13\n          [PR.PR_LITERAL,       /^(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+\\-]?\\d+)?/i,  null, '0123456789'],\n          [PR.PR_PUNCTUATION,   /^.[^\\s\\w\\.$%\"]*/, null]\n          // [PR.PR_PUNCTUATION,   /^[-,:;!<>=\\+^\\/\\*]+/]\n        ]),\n    ['basic','cbm']);\n"
  },
  {
    "path": "google-code-prettify/src/lang-clj.js",
    "content": "/**\n * @license Copyright (C) 2011 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview\n * Registers a language handler for Clojure.\n *\n *\n * To use, include prettify.js and this file in your HTML page.\n * Then put your code in an HTML tag like\n *      <pre class=\"prettyprint lang-lisp\">(my lisp code)</pre>\n * The lang-cl class identifies the language as common lisp.\n * This file supports the following language extensions:\n *     lang-clj - Clojure\n *\n *\n * I used lang-lisp.js as the basis for this adding the clojure specific\n * keywords and syntax.\n *\n * \"Name\"    = 'Clojure'\n * \"Author\"  = 'Rich Hickey'\n * \"Version\" = '1.2'\n * \"About\"   = 'Clojure is a lisp for the jvm with concurrency primitives and a richer set of types.'\n *\n *\n * I used <a href=\"http://clojure.org/Reference\">Clojure.org Reference</a> as\n * the basis for the reserved word list.\n *\n *\n * @author jwall@google.com\n */\n\nPR['registerLangHandler'](\n    PR['createSimpleLexer'](\n        [\n         // clojure has more paren types than minimal lisp.\n         ['opn',             /^[\\(\\{\\[]+/, null, '([{'],\n         ['clo',             /^[\\)\\}\\]]+/, null, ')]}'],\n         // A line comment that starts with ;\n         [PR['PR_COMMENT'],     /^;[^\\r\\n]*/, null, ';'],\n         // Whitespace\n         [PR['PR_PLAIN'],       /^[\\t\\n\\r \\xA0]+/, null, '\\t\\n\\r \\xA0'],\n         // A double quoted, possibly multi-line, string.\n         [PR['PR_STRING'],      /^\\\"(?:[^\\\"\\\\]|\\\\[\\s\\S])*(?:\\\"|$)/, null, '\"']\n        ],\n        [\n         // clojure has a much larger set of keywords\n         [PR['PR_KEYWORD'],     /^(?:def|if|do|let|quote|var|fn|loop|recur|throw|try|monitor-enter|monitor-exit|defmacro|defn|defn-|macroexpand|macroexpand-1|for|doseq|dosync|dotimes|and|or|when|not|assert|doto|proxy|defstruct|first|rest|cons|defprotocol|deftype|defrecord|reify|defmulti|defmethod|meta|with-meta|ns|in-ns|create-ns|import|intern|refer|alias|namespace|resolve|ref|deref|refset|new|set!|memfn|to-array|into-array|aset|gen-class|reduce|map|filter|find|nil?|empty?|hash-map|hash-set|vec|vector|seq|flatten|reverse|assoc|dissoc|list|list?|disj|get|union|difference|intersection|extend|extend-type|extend-protocol|prn)\\b/, null],\n         [PR['PR_TYPE'], /^:[0-9a-zA-Z\\-]+/]\n        ]),\n    ['clj']);\n"
  },
  {
    "path": "google-code-prettify/src/lang-css.js",
    "content": "// Copyright (C) 2009 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n\n/**\n * @fileoverview\n * Registers a language handler for CSS.\n *\n *\n * To use, include prettify.js and this file in your HTML page.\n * Then put your code in an HTML tag like\n *      <pre class=\"prettyprint lang-css\"></pre>\n *\n *\n * http://www.w3.org/TR/CSS21/grammar.html Section G2 defines the lexical\n * grammar.  This scheme does not recognize keywords containing escapes.\n *\n * @author mikesamuel@gmail.com\n */\n\n// This file is a call to a function defined in prettify.js which defines a\n// lexical scanner for CSS and maps tokens to styles.\n\n// The call to PR['registerLangHandler'] is quoted so that Closure Compiler\n// will not rename the call so that this language extensions can be\n// compiled/minified separately from one another.  Other symbols defined in\n// prettify.js are similarly quoted.\n\n// The call is structured thus:\n// PR['registerLangHandler'](\n//    PR['createSimpleLexer'](\n//        shortcutPatterns,\n//        fallThroughPatterns),\n//    [languageId0, ..., languageIdN])\n\n// Langugage IDs\n// =============\n// The language IDs are typically the file extensions of source files for\n// that language so that users can syntax highlight arbitrary files based\n// on just the extension.  This is heuristic, but works pretty well in\n// practice.\n\n// Patterns\n// ========\n// Lexers are typically implemented as a set of regular expressions.\n// The SimpleLexer function takes regular expressions, styles, and some\n// pragma-info and produces a lexer.  A token description looks like\n//   [STYLE_NAME, /regular-expression/, pragmas]\n\n// Initially, simple lexer's inner loop looked like:\n\n//    while sourceCode is not empty:\n//      try each regular expression in order until one matches\n//      remove the matched portion from sourceCode\n\n// This was really slow for large files because some JS interpreters\n// do a buffer copy on the matched portion which is O(n*n)\n\n// The current loop now looks like\n\n//    1. use js-modules/combinePrefixPatterns.js to \n//       combine all regular expressions into one \n//    2. use a single global regular expresion match to extract all tokens\n//    3. for each token try regular expressions in order until one matches it\n//       and classify it using the associated style\n\n// This is a lot more efficient but it does mean that lookahead and lookbehind\n// can't be used across boundaries to classify tokens.\n\n// Sometimes we need lookahead and lookbehind and sometimes we want to handle\n// embedded language -- JavaScript or CSS embedded in HTML, or inline assembly\n// in C.\n\n// If a particular pattern has a numbered group, and its style pattern starts\n// with \"lang-\" as in\n//    ['lang-js', /<script>(.*?)<\\/script>/]\n// then the token classification step breaks the token into pieces.\n// Group 1 is re-parsed using the language handler for \"lang-js\", and the\n// surrounding portions are reclassified using the current language handler.\n// This mechanism gives us both lookahead, lookbehind, and language embedding.\n\n// Shortcut Patterns\n// =================\n// A shortcut pattern is one that is tried before other patterns if the first\n// character in the token is in the string of characters.\n// This very effectively lets us make quick correct decisions for common token\n// types.\n\n// All other patterns are fall-through patterns.\n\n\n\n// The comments inline below refer to productions in the CSS specification's\n// lexical grammar.  See link above.\nPR['registerLangHandler'](\n    PR['createSimpleLexer'](\n        // Shortcut patterns.\n        [\n         // The space production <s>\n         [PR['PR_PLAIN'],       /^[ \\t\\r\\n\\f]+/, null, ' \\t\\r\\n\\f']\n        ],\n        // Fall-through patterns.\n        [\n         // Quoted strings.  <string1> and <string2>\n         [PR['PR_STRING'],\n          /^\\\"(?:[^\\n\\r\\f\\\\\\\"]|\\\\(?:\\r\\n?|\\n|\\f)|\\\\[\\s\\S])*\\\"/, null],\n         [PR['PR_STRING'],\n          /^\\'(?:[^\\n\\r\\f\\\\\\']|\\\\(?:\\r\\n?|\\n|\\f)|\\\\[\\s\\S])*\\'/, null],\n         ['lang-css-str', /^url\\(([^\\)\\\"\\']+)\\)/i],\n         [PR['PR_KEYWORD'],\n          /^(?:url|rgb|\\!important|@import|@page|@media|@charset|inherit)(?=[^\\-\\w]|$)/i,\n          null],\n         // A property name -- an identifier followed by a colon.\n         ['lang-css-kw', /^(-?(?:[_a-z]|(?:\\\\[0-9a-f]+ ?))(?:[_a-z0-9\\-]|\\\\(?:\\\\[0-9a-f]+ ?))*)\\s*:/i],\n         // A C style block comment.  The <comment> production.\n         [PR['PR_COMMENT'], /^\\/\\*[^*]*\\*+(?:[^\\/*][^*]*\\*+)*\\//],\n         // Escaping text spans\n         [PR['PR_COMMENT'], /^(?:<!--|-->)/],\n         // A number possibly containing a suffix.\n         [PR['PR_LITERAL'], /^(?:\\d+|\\d*\\.\\d+)(?:%|[a-z]+)?/i],\n         // A hex color\n         [PR['PR_LITERAL'], /^#(?:[0-9a-f]{3}){1,2}\\b/i],\n         // An identifier\n         [PR['PR_PLAIN'],\n          /^-?(?:[_a-z]|(?:\\\\[\\da-f]+ ?))(?:[_a-z\\d\\-]|\\\\(?:\\\\[\\da-f]+ ?))*/i],\n         // A run of punctuation\n         [PR['PR_PUNCTUATION'], /^[^\\s\\w\\'\\\"]+/]\n        ]),\n    ['css']);\n// Above we use embedded languages to highlight property names (identifiers\n// followed by a colon) differently from identifiers in values.\nPR['registerLangHandler'](\n    PR['createSimpleLexer']([],\n        [\n         [PR['PR_KEYWORD'],\n          /^-?(?:[_a-z]|(?:\\\\[\\da-f]+ ?))(?:[_a-z\\d\\-]|\\\\(?:\\\\[\\da-f]+ ?))*/i]\n        ]),\n    ['css-kw']);\n// The content of an unquoted URL literal like url(http://foo/img.png) should\n// be colored as string content.  This language handler is used above in the\n// URL production to do so.\nPR['registerLangHandler'](\n    PR['createSimpleLexer']([],\n        [\n         [PR['PR_STRING'], /^[^\\)\\\"\\']+/]\n        ]),\n    ['css-str']);\n"
  },
  {
    "path": "google-code-prettify/src/lang-dart.js",
    "content": "// Copyright (C) 2013 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n\n/**\n * @fileoverview\n * Registers a language handler Dart.\n * Loosely structured based on the DartLexer in Pygments: http://pygments.org/.\n *\n * To use, include prettify.js and this file in your HTML page.\n * Then put your code in an HTML tag like\n *      <pre class=\"prettyprint lang-dart\">(Dart code)</pre>\n *\n * @author armstrong.timothy@gmail.com\n */\n\nPR['registerLangHandler'](\n  PR['createSimpleLexer'](\n    [\n      // Whitespace.\n      [PR['PR_PLAIN'], /^[\\t\\n\\r \\xA0]+/, null, '\\t\\n\\r \\xA0']\n    ],\n    [\n      // Script tag.\n      [PR['PR_COMMENT'], /^#!(?:.*)/],\n\n      // `import`, `library`, `part of`, `part`, `as`, `show`, and `hide`\n      // keywords.\n      [PR['PR_KEYWORD'], /^\\b(?:import|library|part of|part|as|show|hide)\\b/i],\n\n      // Single-line comments.\n      [PR['PR_COMMENT'], /^\\/\\/(?:.*)/],\n\n      // Multiline comments.\n      [PR['PR_COMMENT'], /^\\/\\*[^*]*\\*+(?:[^\\/*][^*]*\\*+)*\\//], // */\n\n      // `class` and `interface` keywords.\n      [PR['PR_KEYWORD'], /^\\b(?:class|interface)\\b/i],\n\n      // General keywords.\n      [PR['PR_KEYWORD'], /^\\b(?:assert|break|case|catch|continue|default|do|else|finally|for|if|in|is|new|return|super|switch|this|throw|try|while)\\b/i],\n\n      // Declaration keywords.\n      [PR['PR_KEYWORD'], /^\\b(?:abstract|const|extends|factory|final|get|implements|native|operator|set|static|typedef|var)\\b/i],\n\n      // Keywords for types.\n      [PR['PR_TYPE'], /^\\b(?:bool|double|Dynamic|int|num|Object|String|void)\\b/i],\n\n      // Keywords for constants.\n      [PR['PR_KEYWORD'], /^\\b(?:false|null|true)\\b/i],\n\n      // Multiline strings, single- and double-quoted.\n      [PR['PR_STRING'], /^r?[\\']{3}[\\s|\\S]*?[^\\\\][\\']{3}/],\n      [PR['PR_STRING'], /^r?[\\\"]{3}[\\s|\\S]*?[^\\\\][\\\"]{3}/],\n\n      // Normal and raw strings, single- and double-quoted.\n      [PR['PR_STRING'], /^r?\\'(\\'|(?:[^\\n\\r\\f])*?[^\\\\]\\')/],\n      [PR['PR_STRING'], /^r?\\\"(\\\"|(?:[^\\n\\r\\f])*?[^\\\\]\\\")/],\n\n      // Identifiers.\n      [PR['PR_PLAIN'], /^[a-z_$][a-z0-9_]*/i],\n      \n      // Operators.\n      [PR['PR_PUNCTUATION'], /^[~!%^&*+=|?:<>/-]/],\n\n      // Hex numbers.\n      [PR['PR_LITERAL'], /^\\b0x[0-9a-f]+/i],\n\n      // Decimal numbers.\n      [PR['PR_LITERAL'], /^\\b\\d+(?:\\.\\d*)?(?:e[+-]?\\d+)?/i],\n      [PR['PR_LITERAL'], /^\\b\\.\\d+(?:e[+-]?\\d+)?/i],\n\n      // Punctuation.\n      [PR['PR_PUNCTUATION'], /^[(){}\\[\\],.;]/]\n    ]),\n  ['dart']);\n"
  },
  {
    "path": "google-code-prettify/src/lang-erlang.js",
    "content": "// Copyright (C) 2013 Andrew Allen\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview\n * Registers a language handler for Erlang.\n *\n * Derived from https://raw.github.com/erlang/otp/dev/lib/compiler/src/core_parse.yrl\n * Modified from Mike Samuel's Haskell plugin for google-code-prettify\n *\n * @author achew22@gmail.com\n */\n\nPR['registerLangHandler'](\n    PR['createSimpleLexer'](\n        [\n         // Whitespace\n         // whitechar    ->    newline | vertab | space | tab | uniWhite\n         // newline      ->    return linefeed | return | linefeed | formfeed\n         [PR['PR_PLAIN'],       /^[\\t\\n\\x0B\\x0C\\r ]+/, null, '\\t\\n\\x0B\\x0C\\r '],\n         // Single line double-quoted strings.\n         [PR['PR_STRING'],      /^\\\"(?:[^\\\"\\\\\\n\\x0C\\r]|\\\\[\\s\\S])*(?:\\\"|$)/,\n          null, '\"'],\n         \n         // Handle atoms\n         [PR['PR_LITERAL'],      /^[a-z][a-zA-Z0-9_]*/],\n         // Handle single quoted atoms\n         [PR['PR_LITERAL'],      /^\\'(?:[^\\'\\\\\\n\\x0C\\r]|\\\\[^&])+\\'?/,\n          null, \"'\"],\n         \n         // Handle macros. Just to be extra clear on this one, it detects the ?\n         // then uses the regexp to end it so be very careful about matching\n         // all the terminal elements\n         [PR['PR_LITERAL'],      /^\\?[^ \\t\\n({]+/, null, \"?\"],\n\n          \n         \n         // decimal      ->    digit{digit}\n         // octal        ->    octit{octit}\n         // hexadecimal  ->    hexit{hexit}\n         // integer      ->    decimal\n         //               |    0o octal | 0O octal\n         //               |    0x hexadecimal | 0X hexadecimal\n         // float        ->    decimal . decimal [exponent]\n         //               |    decimal exponent\n         // exponent     ->    (e | E) [+ | -] decimal\n         [PR['PR_LITERAL'],\n          /^(?:0o[0-7]+|0x[\\da-f]+|\\d+(?:\\.\\d+)?(?:e[+\\-]?\\d+)?)/i,\n          null, '0123456789']\n        ],\n        [\n         // TODO: catch @declarations inside comments\n\n         // Comments in erlang are started with % and go till a newline\n         [PR['PR_COMMENT'], /^%[^\\n]*/],\n\n         // Catch macros\n         //[PR['PR_TAG'], /?[^( \\n)]+/],\n\n         /**\n          * %% Keywords (atoms are assumed to always be single-quoted).\n          * 'module' 'attributes' 'do' 'let' 'in' 'letrec'\n          * 'apply' 'call' 'primop'\n          * 'case' 'of' 'end' 'when' 'fun' 'try' 'catch' 'receive' 'after'\n          */\n         [PR['PR_KEYWORD'], /^(?:module|attributes|do|let|in|letrec|apply|call|primop|case|of|end|when|fun|try|catch|receive|after|char|integer|float,atom,string,var)\\b/],\n         \n         /**\n          * Catch definitions (usually defined at the top of the file)\n          * Anything that starts -something\n          */\n         [PR['PR_KEYWORD'], /^-[a-z_]+/],\n\n         // Catch variables\n         [PR['PR_TYPE'], /^[A-Z_][a-zA-Z0-9_]*/],\n\n         // matches the symbol production\n         [PR['PR_PUNCTUATION'], /^[.,;]/]\n        ]),\n    ['erlang', 'erl']);\n"
  },
  {
    "path": "google-code-prettify/src/lang-go.js",
    "content": "// Copyright (C) 2010 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n\n/**\n * @fileoverview\n * Registers a language handler for the Go language..\n * <p>\n * Based on the lexical grammar at \n * http://golang.org/doc/go_spec.html#Lexical_elements\n * <p>\n * Go uses a minimal style for highlighting so the below does not distinguish\n * strings, keywords, literals, etc. by design.\n * From a discussion with the Go designers:\n * <pre>\n * On Thursday, July 22, 2010, Mike Samuel <...> wrote:\n * > On Thu, Jul 22, 2010, Rob 'Commander' Pike <...> wrote:\n * >> Personally, I would vote for the subdued style godoc presents at http://golang.org\n * >>\n * >> Not as fancy as some like, but a case can be made it's the official style.\n * >> If people want more colors, I wouldn't fight too hard, in the interest of\n * >> encouragement through familiarity, but even then I would ask to shy away\n * >> from technicolor starbursts.\n * >\n * > Like http://golang.org/pkg/go/scanner/ where comments are blue and all\n * > other content is black?  I can do that.\n * </pre>\n *\n * @author mikesamuel@gmail.com\n */\n\nPR['registerLangHandler'](\n    PR['createSimpleLexer'](\n        [\n         // Whitespace is made up of spaces, tabs and newline characters.\n         [PR['PR_PLAIN'],       /^[\\t\\n\\r \\xA0]+/, null, '\\t\\n\\r \\xA0'],\n         // Not escaped as a string.  See note on minimalism above.\n         [PR['PR_PLAIN'],       /^(?:\\\"(?:[^\\\"\\\\]|\\\\[\\s\\S])*(?:\\\"|$)|\\'(?:[^\\'\\\\]|\\\\[\\s\\S])+(?:\\'|$)|`[^`]*(?:`|$))/, null, '\"\\'']\n        ],\n        [\n         // Block comments are delimited by /* and */.\n         // Single-line comments begin with // and extend to the end of a line.\n         [PR['PR_COMMENT'],     /^(?:\\/\\/[^\\r\\n]*|\\/\\*[\\s\\S]*?\\*\\/)/],\n         [PR['PR_PLAIN'],       /^(?:[^\\/\\\"\\'`]|\\/(?![\\/\\*]))+/i]\n        ]),\n    ['go']);\n"
  },
  {
    "path": "google-code-prettify/src/lang-hs.js",
    "content": "// Copyright (C) 2009 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n\n/**\n * @fileoverview\n * Registers a language handler for Haskell.\n *\n *\n * To use, include prettify.js and this file in your HTML page.\n * Then put your code in an HTML tag like\n *      <pre class=\"prettyprint lang-hs\">(my lisp code)</pre>\n * The lang-cl class identifies the language as common lisp.\n * This file supports the following language extensions:\n *     lang-cl - Common Lisp\n *     lang-el - Emacs Lisp\n *     lang-lisp - Lisp\n *     lang-scm - Scheme\n *\n *\n * I used http://www.informatik.uni-freiburg.de/~thiemann/haskell/haskell98-report-html/syntax-iso.html\n * as the basis, but ignore the way the ncomment production nests since this\n * makes the lexical grammar irregular.  It might be possible to support\n * ncomments using the lookbehind filter.\n *\n *\n * @author mikesamuel@gmail.com\n */\n\nPR['registerLangHandler'](\n    PR['createSimpleLexer'](\n        [\n         // Whitespace\n         // whitechar    ->    newline | vertab | space | tab | uniWhite\n         // newline      ->    return linefeed | return | linefeed | formfeed\n         [PR['PR_PLAIN'],       /^[\\t\\n\\x0B\\x0C\\r ]+/, null, '\\t\\n\\x0B\\x0C\\r '],\n         // Single line double and single-quoted strings.\n         // char         ->    ' (graphic<' | \\> | space | escape<\\&>) '\n         // string       ->    \" {graphic<\" | \\> | space | escape | gap}\"\n         // escape       ->    \\ ( charesc | ascii | decimal | o octal\n         //                        | x hexadecimal )\n         // charesc      ->    a | b | f | n | r | t | v | \\ | \" | ' | &\n         [PR['PR_STRING'],      /^\\\"(?:[^\\\"\\\\\\n\\x0C\\r]|\\\\[\\s\\S])*(?:\\\"|$)/,\n          null, '\"'],\n         [PR['PR_STRING'],      /^\\'(?:[^\\'\\\\\\n\\x0C\\r]|\\\\[^&])\\'?/,\n          null, \"'\"],\n         // decimal      ->    digit{digit}\n         // octal        ->    octit{octit}\n         // hexadecimal  ->    hexit{hexit}\n         // integer      ->    decimal\n         //               |    0o octal | 0O octal\n         //               |    0x hexadecimal | 0X hexadecimal\n         // float        ->    decimal . decimal [exponent]\n         //               |    decimal exponent\n         // exponent     ->    (e | E) [+ | -] decimal\n         [PR['PR_LITERAL'],\n          /^(?:0o[0-7]+|0x[\\da-f]+|\\d+(?:\\.\\d+)?(?:e[+\\-]?\\d+)?)/i,\n          null, '0123456789']\n        ],\n        [\n         // Haskell does not have a regular lexical grammar due to the nested\n         // ncomment.\n         // comment      ->    dashes [ any<symbol> {any}] newline\n         // ncomment     ->    opencom ANYseq {ncomment ANYseq}closecom\n         // dashes       ->    '--' {'-'}\n         // opencom      ->    '{-'\n         // closecom     ->    '-}'\n         [PR['PR_COMMENT'],     /^(?:(?:--+(?:[^\\r\\n\\x0C]*)?)|(?:\\{-(?:[^-]|-+[^-\\}])*-\\}))/],\n         // reservedid   ->    case | class | data | default | deriving | do\n         //               |    else | if | import | in | infix | infixl | infixr\n         //               |    instance | let | module | newtype | of | then\n         //               |    type | where | _\n         [PR['PR_KEYWORD'],     /^(?:case|class|data|default|deriving|do|else|if|import|in|infix|infixl|infixr|instance|let|module|newtype|of|then|type|where|_)(?=[^a-zA-Z0-9\\']|$)/, null],\n         // qvarid       ->    [ modid . ] varid\n         // qconid       ->    [ modid . ] conid\n         // varid        ->    (small {small | large | digit | ' })<reservedid>\n         // conid        ->    large {small | large | digit | ' }\n         // modid        ->    conid\n         // small        ->    ascSmall | uniSmall | _\n         // ascSmall     ->    a | b | ... | z\n         // uniSmall     ->    any Unicode lowercase letter\n         // large        ->    ascLarge | uniLarge\n         // ascLarge     ->    A | B | ... | Z\n         // uniLarge     ->    any uppercase or titlecase Unicode letter\n         [PR['PR_PLAIN'],  /^(?:[A-Z][\\w\\']*\\.)*[a-zA-Z][\\w\\']*/],\n         // matches the symbol production\n         [PR['PR_PUNCTUATION'], /^[^\\t\\n\\x0B\\x0C\\r a-zA-Z0-9\\'\\\"]+/]\n        ]),\n    ['hs']);\n"
  },
  {
    "path": "google-code-prettify/src/lang-lisp.js",
    "content": "// Copyright (C) 2008 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n\n/**\n * @fileoverview\n * Registers a language handler for Common Lisp and related languages.\n *\n *\n * To use, include prettify.js and this file in your HTML page.\n * Then put your code in an HTML tag like\n *      <pre class=\"prettyprint lang-lisp\">(my lisp code)</pre>\n * The lang-cl class identifies the language as common lisp.\n * This file supports the following language extensions:\n *     lang-cl - Common Lisp\n *     lang-el - Emacs Lisp\n *     lang-lisp - Lisp\n *     lang-scm - Scheme\n *     lang-lsp - FAT 8.3 filename version of lang-lisp.\n *\n *\n * I used http://www.devincook.com/goldparser/doc/meta-language/grammar-LISP.htm\n * as the basis, but added line comments that start with ; and changed the atom\n * production to disallow unquoted semicolons.\n *\n * \"Name\"    = 'LISP'\n * \"Author\"  = 'John McCarthy'\n * \"Version\" = 'Minimal'\n * \"About\"   = 'LISP is an abstract language that organizes ALL'\n *           | 'data around \"lists\".'\n *\n * \"Start Symbol\" = [s-Expression]\n *\n * {Atom Char}   = {Printable} - {Whitespace} - [()\"\\'']\n *\n * Atom = ( {Atom Char} | '\\'{Printable} )+\n *\n * [s-Expression] ::= [Quote] Atom\n *                  | [Quote] '(' [Series] ')'\n *                  | [Quote] '(' [s-Expression] '.' [s-Expression] ')'\n *\n * [Series] ::= [s-Expression] [Series]\n *            |\n *\n * [Quote]  ::= ''      !Quote = do not evaluate\n *            |\n *\n *\n * I used <a href=\"http://gigamonkeys.com/book/\">Practical Common Lisp</a> as\n * the basis for the reserved word list.\n *\n *\n * @author mikesamuel@gmail.com\n */\n\nPR['registerLangHandler'](\n    PR['createSimpleLexer'](\n        [\n         ['opn',             /^\\(+/, null, '('],\n         ['clo',             /^\\)+/, null, ')'],\n         // A line comment that starts with ;\n         [PR['PR_COMMENT'],     /^;[^\\r\\n]*/, null, ';'],\n         // Whitespace\n         [PR['PR_PLAIN'],       /^[\\t\\n\\r \\xA0]+/, null, '\\t\\n\\r \\xA0'],\n         // A double quoted, possibly multi-line, string.\n         [PR['PR_STRING'],      /^\\\"(?:[^\\\"\\\\]|\\\\[\\s\\S])*(?:\\\"|$)/, null, '\"']\n        ],\n        [\n         [PR['PR_KEYWORD'],     /^(?:block|c[ad]+r|catch|con[ds]|def(?:ine|un)|do|eq|eql|equal|equalp|eval-when|flet|format|go|if|labels|lambda|let|load-time-value|locally|macrolet|multiple-value-call|nil|progn|progv|quote|require|return-from|setq|symbol-macrolet|t|tagbody|the|throw|unwind)\\b/, null],\n         [PR['PR_LITERAL'],\n          /^[+\\-]?(?:[0#]x[0-9a-f]+|\\d+\\/\\d+|(?:\\.\\d+|\\d+(?:\\.\\d*)?)(?:[ed][+\\-]?\\d+)?)/i],\n         // A single quote possibly followed by a word that optionally ends with\n         // = ! or ?.\n         [PR['PR_LITERAL'],\n          /^\\'(?:-*(?:\\w|\\\\[\\x21-\\x7e])(?:[\\w-]*|\\\\[\\x21-\\x7e])[=!?]?)?/],\n         // A word that optionally ends with = ! or ?.\n         [PR['PR_PLAIN'],\n          /^-*(?:[a-z_]|\\\\[\\x21-\\x7e])(?:[\\w-]*|\\\\[\\x21-\\x7e])[=!?]?/i],\n         // A printable non-space non-special character\n         [PR['PR_PUNCTUATION'], /^[^\\w\\t\\n\\r \\xA0()\\\"\\\\\\';]+/]\n        ]),\n    ['cl', 'el', 'lisp', 'lsp', 'scm', 'ss', 'rkt']);\n"
  },
  {
    "path": "google-code-prettify/src/lang-llvm.js",
    "content": "// Copyright (C) 2013 Nikhil Dabas\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview\n * Registers a language handler for LLVM.\n * From https://gist.github.com/ndabas/2850418\n *\n *\n * To use, include prettify.js and this file in your HTML page.\n * Then put your code in an HTML tag like\n *      <pre class=\"prettyprint lang-llvm\">(my LLVM code)</pre>\n *\n *\n * The regular expressions were adapted from:\n * https://github.com/hansstimer/llvm.tmbundle/blob/76fedd8f50fd6108b1780c51d79fbe3223de5f34/Syntaxes/LLVM.tmLanguage\n * \n * http://llvm.org/docs/LangRef.html#constants describes the language grammar.\n * \n * @author Nikhil Dabas\n */\nPR['registerLangHandler'](\n    PR['createSimpleLexer'](\n        [\n         // Whitespace\n         [PR['PR_PLAIN'],       /^[\\t\\n\\r \\xA0]+/, null, '\\t\\n\\r \\xA0'],\n         // A double quoted, possibly multi-line, string.\n         [PR['PR_STRING'],      /^!?\\\"(?:[^\\\"\\\\]|\\\\[\\s\\S])*(?:\\\"|$)/, null, '\"'],\n         // comment.llvm\n         [PR['PR_COMMENT'],     /^;[^\\r\\n]*/, null, ';']\n        ],\n        [\n         // variable.llvm\n         [PR['PR_PLAIN'],       /^[%@!](?:[-a-zA-Z$._][-a-zA-Z$._0-9]*|\\d+)/],\n\n         // According to http://llvm.org/docs/LangRef.html#well-formedness\n         // These reserved words cannot conflict with variable names, because none of them start with a prefix character ('%' or '@').\n         [PR['PR_KEYWORD'],     /^[A-Za-z_][0-9A-Za-z_]*/, null],\n\n         // constant.numeric.float.llvm\n         [PR['PR_LITERAL'],     /^\\d+\\.\\d+/],\n         \n         // constant.numeric.integer.llvm\n         [PR['PR_LITERAL'],     /^(?:\\d+|0[xX][a-fA-F0-9]+)/],\n\n         // punctuation\n         [PR['PR_PUNCTUATION'], /^[()\\[\\]{},=*<>:]|\\.\\.\\.$/]\n        ]),\n    ['llvm', 'll']);\n"
  },
  {
    "path": "google-code-prettify/src/lang-lua.js",
    "content": "// Copyright (C) 2008 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n\n/**\n * @fileoverview\n * Registers a language handler for Lua.\n *\n *\n * To use, include prettify.js and this file in your HTML page.\n * Then put your code in an HTML tag like\n *      <pre class=\"prettyprint lang-lua\">(my Lua code)</pre>\n *\n *\n * I used http://www.lua.org/manual/5.1/manual.html#2.1\n * Because of the long-bracket concept used in strings and comments, Lua does\n * not have a regular lexical grammar, but luckily it fits within the space\n * of irregular grammars supported by javascript regular expressions.\n *\n * @author mikesamuel@gmail.com\n */\n\nPR['registerLangHandler'](\n    PR['createSimpleLexer'](\n        [\n         // Whitespace\n         [PR['PR_PLAIN'],       /^[\\t\\n\\r \\xA0]+/, null, '\\t\\n\\r \\xA0'],\n         // A double or single quoted, possibly multi-line, string.\n         [PR['PR_STRING'],      /^(?:\\\"(?:[^\\\"\\\\]|\\\\[\\s\\S])*(?:\\\"|$)|\\'(?:[^\\'\\\\]|\\\\[\\s\\S])*(?:\\'|$))/, null, '\"\\'']\n        ],\n        [\n         // A comment is either a line comment that starts with two dashes, or\n         // two dashes preceding a long bracketed block.\n         [PR['PR_COMMENT'], /^--(?:\\[(=*)\\[[\\s\\S]*?(?:\\]\\1\\]|$)|[^\\r\\n]*)/],\n         // A long bracketed block not preceded by -- is a string.\n         [PR['PR_STRING'],  /^\\[(=*)\\[[\\s\\S]*?(?:\\]\\1\\]|$)/],\n         [PR['PR_KEYWORD'], /^(?:and|break|do|else|elseif|end|false|for|function|if|in|local|nil|not|or|repeat|return|then|true|until|while)\\b/, null],\n         // A number is a hex integer literal, a decimal real literal, or in\n         // scientific notation.\n         [PR['PR_LITERAL'],\n          /^[+-]?(?:0x[\\da-f]+|(?:(?:\\.\\d+|\\d+(?:\\.\\d*)?)(?:e[+\\-]?\\d+)?))/i],\n         // An identifier\n         [PR['PR_PLAIN'], /^[a-z_]\\w*/i],\n         // A run of punctuation\n         [PR['PR_PUNCTUATION'], /^[^\\w\\t\\n\\r \\xA0][^\\w\\t\\n\\r \\xA0\\\"\\'\\-\\+=]*/]\n        ]),\n    ['lua']);\n"
  },
  {
    "path": "google-code-prettify/src/lang-matlab.js",
    "content": "// Copyright (c) 2013 by Amro <amroamroamro@gmail.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n/**\n * @fileoverview\n * Registers a language handler for MATLAB.\n *\n * To use, include prettify.js and this file in your HTML page.\n * Then put your code inside an HTML tag like\n *     <pre class=\"prettyprint lang-matlab\">\n *     </pre>\n *\n * @see https://github.com/amroamroamro/prettify-matlab\n */\n(function (PR) {\n  /*\n    PR_PLAIN: plain text\n    PR_STRING: string literals\n    PR_KEYWORD: keywords\n    PR_COMMENT: comments\n    PR_TYPE: types\n    PR_LITERAL: literal values (1, null, true, ..)\n    PR_PUNCTUATION: punctuation string\n    PR_SOURCE: embedded source\n    PR_DECLARATION: markup declaration such as a DOCTYPE\n    PR_TAG: sgml tag\n    PR_ATTRIB_NAME: sgml attribute name\n    PR_ATTRIB_VALUE: sgml attribute value\n  */\n  var PR_IDENTIFIER = \"ident\",\n    PR_CONSTANT = \"const\",\n    PR_FUNCTION = \"fun\",\n    PR_FUNCTION_TOOLBOX = \"fun_tbx\",\n    PR_SYSCMD = \"syscmd\",\n    PR_CODE_OUTPUT = \"codeoutput\",\n    PR_ERROR = \"err\",\n    PR_WARNING = \"wrn\",\n    PR_TRANSPOSE = \"transpose\",\n    PR_LINE_CONTINUATION = \"linecont\";\n\n  // Refer to: http://www.mathworks.com/help/matlab/functionlist-alpha.html\n  var coreFunctions = [\n    'abs|accumarray|acos(?:d|h)?|acot(?:d|h)?|acsc(?:d|h)?|actxcontrol(?:list|select)?|actxGetRunningServer|actxserver|addlistener|addpath|addpref|addtodate|airy|align|alim|all|allchild|alpha|alphamap|amd|ancestor|and|angle|annotation|any|area|arrayfun|asec(?:d|h)?|asin(?:d|h)?|assert|assignin|atan(?:2|d|h)?|audiodevinfo|audioplayer|audiorecorder|aufinfo|auread|autumn|auwrite|avifile|aviinfo|aviread|axes|axis|balance|bar(?:3|3h|h)?|base2dec|beep|BeginInvoke|bench|bessel(?:h|i|j|k|y)|beta|betainc|betaincinv|betaln|bicg|bicgstab|bicgstabl|bin2dec|bitand|bitcmp|bitget|bitmax|bitnot|bitor|bitset|bitshift|bitxor|blanks|blkdiag|bone|box|brighten|brush|bsxfun|builddocsearchdb|builtin|bvp4c|bvp5c|bvpget|bvpinit|bvpset|bvpxtend|calendar|calllib|callSoapService|camdolly|cameratoolbar|camlight|camlookat|camorbit|campan|campos|camproj|camroll|camtarget|camup|camva|camzoom|cart2pol|cart2sph|cast|cat|caxis|cd|cdf2rdf|cdfepoch|cdfinfo|cdflib(?:\\.(?:close|closeVar|computeEpoch|computeEpoch16|create|createAttr|createVar|delete|deleteAttr|deleteAttrEntry|deleteAttrgEntry|deleteVar|deleteVarRecords|epoch16Breakdown|epochBreakdown|getAttrEntry|getAttrgEntry|getAttrMaxEntry|getAttrMaxgEntry|getAttrName|getAttrNum|getAttrScope|getCacheSize|getChecksum|getCompression|getCompressionCacheSize|getConstantNames|getConstantValue|getCopyright|getFileBackward|getFormat|getLibraryCopyright|getLibraryVersion|getMajority|getName|getNumAttrEntries|getNumAttrgEntries|getNumAttributes|getNumgAttributes|getReadOnlyMode|getStageCacheSize|getValidate|getVarAllocRecords|getVarBlockingFactor|getVarCacheSize|getVarCompression|getVarData|getVarMaxAllocRecNum|getVarMaxWrittenRecNum|getVarName|getVarNum|getVarNumRecsWritten|getVarPadValue|getVarRecordData|getVarReservePercent|getVarsMaxWrittenRecNum|getVarSparseRecords|getVersion|hyperGetVarData|hyperPutVarData|inquire|inquireAttr|inquireAttrEntry|inquireAttrgEntry|inquireVar|open|putAttrEntry|putAttrgEntry|putVarData|putVarRecordData|renameAttr|renameVar|setCacheSize|setChecksum|setCompression|setCompressionCacheSize|setFileBackward|setFormat|setMajority|setReadOnlyMode|setStageCacheSize|setValidate|setVarAllocBlockRecords|setVarBlockingFactor|setVarCacheSize|setVarCompression|setVarInitialRecs|setVarPadValue|SetVarReservePercent|setVarsCacheSize|setVarSparseRecords))?|cdfread|cdfwrite|ceil|cell2mat|cell2struct|celldisp|cellfun|cellplot|cellstr|cgs|checkcode|checkin|checkout|chol|cholinc|cholupdate|circshift|cla|clabel|class|clc|clear|clearvars|clf|clipboard|clock|close|closereq|cmopts|cmpermute|cmunique|colamd|colon|colorbar|colordef|colormap|colormapeditor|colperm|Combine|comet|comet3|commandhistory|commandwindow|compan|compass|complex|computer|cond|condeig|condest|coneplot|conj|containers\\.Map|contour(?:3|c|f|slice)?|contrast|conv|conv2|convhull|convhulln|convn|cool|copper|copyfile|copyobj|corrcoef|cos(?:d|h)?|cot(?:d|h)?|cov|cplxpair|cputime|createClassFromWsdl|createSoapMessage|cross|csc(?:d|h)?|csvread|csvwrite|ctranspose|cumprod|cumsum|cumtrapz|curl|customverctrl|cylinder|daqread|daspect|datacursormode|datatipinfo|date|datenum|datestr|datetick|datevec|dbclear|dbcont|dbdown|dblquad|dbmex|dbquit|dbstack|dbstatus|dbstep|dbstop|dbtype|dbup|dde23|ddeget|ddesd|ddeset|deal|deblank|dec2base|dec2bin|dec2hex|decic|deconv|del2|delaunay|delaunay3|delaunayn|DelaunayTri|delete|demo|depdir|depfun|det|detrend|deval|diag|dialog|diary|diff|diffuse|dir|disp|display|dither|divergence|dlmread|dlmwrite|dmperm|doc|docsearch|dos|dot|dragrect|drawnow|dsearch|dsearchn|dynamicprops|echo|echodemo|edit|eig|eigs|ellipj|ellipke|ellipsoid|empty|enableNETfromNetworkDrive|enableservice|EndInvoke|enumeration|eomday|eq|erf|erfc|erfcinv|erfcx|erfinv|error|errorbar|errordlg|etime|etree|etreeplot|eval|evalc|evalin|event\\.(?:EventData|listener|PropertyEvent|proplistener)|exifread|exist|exit|exp|expint|expm|expm1|export2wsdlg|eye|ezcontour|ezcontourf|ezmesh|ezmeshc|ezplot|ezplot3|ezpolar|ezsurf|ezsurfc|factor|factorial|fclose|feather|feature|feof|ferror|feval|fft|fft2|fftn|fftshift|fftw|fgetl|fgets|fieldnames|figure|figurepalette|fileattrib|filebrowser|filemarker|fileparts|fileread|filesep|fill|fill3|filter|filter2|find|findall|findfigs|findobj|findstr|finish|fitsdisp|fitsinfo|fitsread|fitswrite|fix|flag|flipdim|fliplr|flipud|floor|flow|fminbnd|fminsearch|fopen|format|fplot|fprintf|frame2im|fread|freqspace|frewind|fscanf|fseek|ftell|FTP|full|fullfile|func2str|functions|funm|fwrite|fzero|gallery|gamma|gammainc|gammaincinv|gammaln|gca|gcbf|gcbo|gcd|gcf|gco|ge|genpath|genvarname|get|getappdata|getenv|getfield|getframe|getpixelposition|getpref|ginput|gmres|gplot|grabcode|gradient|gray|graymon|grid|griddata(?:3|n)?|griddedInterpolant|gsvd|gt|gtext|guidata|guide|guihandles|gunzip|gzip|h5create|h5disp|h5info|h5read|h5readatt|h5write|h5writeatt|hadamard|handle|hankel|hdf|hdf5|hdf5info|hdf5read|hdf5write|hdfinfo|hdfread|hdftool|help|helpbrowser|helpdesk|helpdlg|helpwin|hess|hex2dec|hex2num|hgexport|hggroup|hgload|hgsave|hgsetget|hgtransform|hidden|hilb|hist|histc|hold|home|horzcat|hostid|hot|hsv|hsv2rgb|hypot|ichol|idivide|ifft|ifft2|ifftn|ifftshift|ilu|im2frame|im2java|imag|image|imagesc|imapprox|imfinfo|imformats|import|importdata|imread|imwrite|ind2rgb|ind2sub|inferiorto|info|inline|inmem|inpolygon|input|inputdlg|inputname|inputParser|inspect|instrcallback|instrfind|instrfindall|int2str|integral(?:2|3)?|interp(?:1|1q|2|3|ft|n)|interpstreamspeed|intersect|intmax|intmin|inv|invhilb|ipermute|isa|isappdata|iscell|iscellstr|ischar|iscolumn|isdir|isempty|isequal|isequaln|isequalwithequalnans|isfield|isfinite|isfloat|isglobal|ishandle|ishghandle|ishold|isinf|isinteger|isjava|iskeyword|isletter|islogical|ismac|ismatrix|ismember|ismethod|isnan|isnumeric|isobject|isocaps|isocolors|isonormals|isosurface|ispc|ispref|isprime|isprop|isreal|isrow|isscalar|issorted|isspace|issparse|isstr|isstrprop|isstruct|isstudent|isunix|isvarname|isvector|javaaddpath|javaArray|javachk|javaclasspath|javacomponent|javaMethod|javaMethodEDT|javaObject|javaObjectEDT|javarmpath|jet|keyboard|kron|lasterr|lasterror|lastwarn|lcm|ldivide|ldl|le|legend|legendre|length|libfunctions|libfunctionsview|libisloaded|libpointer|libstruct|license|light|lightangle|lighting|lin2mu|line|lines|linkaxes|linkdata|linkprop|linsolve|linspace|listdlg|listfonts|load|loadlibrary|loadobj|log|log10|log1p|log2|loglog|logm|logspace|lookfor|lower|ls|lscov|lsqnonneg|lsqr|lt|lu|luinc|magic|makehgtform|mat2cell|mat2str|material|matfile|matlab\\.io\\.MatFile|matlab\\.mixin\\.(?:Copyable|Heterogeneous(?:\\.getDefaultScalarElement)?)|matlabrc|matlabroot|max|maxNumCompThreads|mean|median|membrane|memmapfile|memory|menu|mesh|meshc|meshgrid|meshz|meta\\.(?:class(?:\\.fromName)?|DynamicProperty|EnumeratedValue|event|MetaData|method|package(?:\\.(?:fromName|getAllPackages))?|property)|metaclass|methods|methodsview|mex(?:\\.getCompilerConfigurations)?|MException|mexext|mfilename|min|minres|minus|mislocked|mkdir|mkpp|mldivide|mlint|mlintrpt|mlock|mmfileinfo|mmreader|mod|mode|more|move|movefile|movegui|movie|movie2avi|mpower|mrdivide|msgbox|mtimes|mu2lin|multibandread|multibandwrite|munlock|namelengthmax|nargchk|narginchk|nargoutchk|native2unicode|nccreate|ncdisp|nchoosek|ncinfo|ncread|ncreadatt|ncwrite|ncwriteatt|ncwriteschema|ndgrid|ndims|ne|NET(?:\\.(?:addAssembly|Assembly|convertArray|createArray|createGeneric|disableAutoRelease|enableAutoRelease|GenericClass|invokeGenericMethod|NetException|setStaticProperty))?|netcdf\\.(?:abort|close|copyAtt|create|defDim|defGrp|defVar|defVarChunking|defVarDeflate|defVarFill|defVarFletcher32|delAtt|endDef|getAtt|getChunkCache|getConstant|getConstantNames|getVar|inq|inqAtt|inqAttID|inqAttName|inqDim|inqDimID|inqDimIDs|inqFormat|inqGrpName|inqGrpNameFull|inqGrpParent|inqGrps|inqLibVers|inqNcid|inqUnlimDims|inqVar|inqVarChunking|inqVarDeflate|inqVarFill|inqVarFletcher32|inqVarID|inqVarIDs|open|putAtt|putVar|reDef|renameAtt|renameDim|renameVar|setChunkCache|setDefaultFormat|setFill|sync)|newplot|nextpow2|nnz|noanimate|nonzeros|norm|normest|not|notebook|now|nthroot|null|num2cell|num2hex|num2str|numel|nzmax|ode(?:113|15i|15s|23|23s|23t|23tb|45)|odeget|odeset|odextend|onCleanup|ones|open|openfig|opengl|openvar|optimget|optimset|or|ordeig|orderfields|ordqz|ordschur|orient|orth|pack|padecoef|pagesetupdlg|pan|pareto|parseSoapResponse|pascal|patch|path|path2rc|pathsep|pathtool|pause|pbaspect|pcg|pchip|pcode|pcolor|pdepe|pdeval|peaks|perl|perms|permute|pie|pink|pinv|planerot|playshow|plot|plot3|plotbrowser|plotedit|plotmatrix|plottools|plotyy|plus|pol2cart|polar|poly|polyarea|polyder|polyeig|polyfit|polyint|polyval|polyvalm|pow2|power|ppval|prefdir|preferences|primes|print|printdlg|printopt|printpreview|prod|profile|profsave|propedit|propertyeditor|psi|publish|PutCharArray|PutFullMatrix|PutWorkspaceData|pwd|qhull|qmr|qr|qrdelete|qrinsert|qrupdate|quad|quad2d|quadgk|quadl|quadv|questdlg|quit|quiver|quiver3|qz|rand|randi|randn|randperm|RandStream(?:\\.(?:create|getDefaultStream|getGlobalStream|list|setDefaultStream|setGlobalStream))?|rank|rat|rats|rbbox|rcond|rdivide|readasync|real|reallog|realmax|realmin|realpow|realsqrt|record|rectangle|rectint|recycle|reducepatch|reducevolume|refresh|refreshdata|regexp|regexpi|regexprep|regexptranslate|rehash|rem|Remove|RemoveAll|repmat|reset|reshape|residue|restoredefaultpath|rethrow|rgb2hsv|rgb2ind|rgbplot|ribbon|rmappdata|rmdir|rmfield|rmpath|rmpref|rng|roots|rose|rosser|rot90|rotate|rotate3d|round|rref|rsf2csf|run|save|saveas|saveobj|savepath|scatter|scatter3|schur|sec|secd|sech|selectmoveresize|semilogx|semilogy|sendmail|serial|set|setappdata|setdiff|setenv|setfield|setpixelposition|setpref|setstr|setxor|shading|shg|shiftdim|showplottool|shrinkfaces|sign|sin(?:d|h)?|size|slice|smooth3|snapnow|sort|sortrows|sound|soundsc|spalloc|spaugment|spconvert|spdiags|specular|speye|spfun|sph2cart|sphere|spinmap|spline|spones|spparms|sprand|sprandn|sprandsym|sprank|spring|sprintf|spy|sqrt|sqrtm|squeeze|ss2tf|sscanf|stairs|startup|std|stem|stem3|stopasync|str2double|str2func|str2mat|str2num|strcat|strcmp|strcmpi|stream2|stream3|streamline|streamparticles|streamribbon|streamslice|streamtube|strfind|strjust|strmatch|strncmp|strncmpi|strread|strrep|strtok|strtrim|struct2cell|structfun|strvcat|sub2ind|subplot|subsasgn|subsindex|subspace|subsref|substruct|subvolume|sum|summer|superclasses|superiorto|support|surf|surf2patch|surface|surfc|surfl|surfnorm|svd|svds|swapbytes|symamd|symbfact|symmlq|symrcm|symvar|system|tan(?:d|h)?|tar|tempdir|tempname|tetramesh|texlabel|text|textread|textscan|textwrap|tfqmr|throw|tic|Tiff(?:\\.(?:getTagNames|getVersion))?|timer|timerfind|timerfindall|times|timeseries|title|toc|todatenum|toeplitz|toolboxdir|trace|transpose|trapz|treelayout|treeplot|tril|trimesh|triplequad|triplot|TriRep|TriScatteredInterp|trisurf|triu|tscollection|tsearch|tsearchn|tstool|type|typecast|uibuttongroup|uicontextmenu|uicontrol|uigetdir|uigetfile|uigetpref|uiimport|uimenu|uiopen|uipanel|uipushtool|uiputfile|uiresume|uisave|uisetcolor|uisetfont|uisetpref|uistack|uitable|uitoggletool|uitoolbar|uiwait|uminus|undocheckout|unicode2native|union|unique|unix|unloadlibrary|unmesh|unmkpp|untar|unwrap|unzip|uplus|upper|urlread|urlwrite|usejava|userpath|validateattributes|validatestring|vander|var|vectorize|ver|verctrl|verLessThan|version|vertcat|VideoReader(?:\\.isPlatformSupported)?|VideoWriter(?:\\.getProfiles)?|view|viewmtx|visdiff|volumebounds|voronoi|voronoin|wait|waitbar|waitfor|waitforbuttonpress|warndlg|warning|waterfall|wavfinfo|wavplay|wavread|wavrecord|wavwrite|web|weekday|what|whatsnew|which|whitebg|who|whos|wilkinson|winopen|winqueryreg|winter|wk1finfo|wk1read|wk1write|workspace|xlabel|xlim|xlsfinfo|xlsread|xlswrite|xmlread|xmlwrite|xor|xslt|ylabel|ylim|zeros|zip|zlabel|zlim|zoom'\n  ].join(\"|\");\n  var statsFunctions = [\n    'addedvarplot|andrewsplot|anova(?:1|2|n)|ansaribradley|aoctool|barttest|bbdesign|beta(?:cdf|fit|inv|like|pdf|rnd|stat)|bino(?:cdf|fit|inv|pdf|rnd|stat)|biplot|bootci|bootstrp|boxplot|candexch|candgen|canoncorr|capability|capaplot|caseread|casewrite|categorical|ccdesign|cdfplot|chi2(?:cdf|gof|inv|pdf|rnd|stat)|cholcov|Classification(?:BaggedEnsemble|Discriminant(?:\\.(?:fit|make|template))?|Ensemble|KNN(?:\\.(?:fit|template))?|PartitionedEnsemble|PartitionedModel|Tree(?:\\.(?:fit|template))?)|classify|classregtree|cluster|clusterdata|cmdscale|combnk|Compact(?:Classification(?:Discriminant|Ensemble|Tree)|Regression(?:Ensemble|Tree)|TreeBagger)|confusionmat|controlchart|controlrules|cophenet|copula(?:cdf|fit|param|pdf|rnd|stat)|cordexch|corr|corrcov|coxphfit|createns|crosstab|crossval|cvpartition|datasample|dataset|daugment|dcovary|dendrogram|dfittool|disttool|dummyvar|dwtest|ecdf|ecdfhist|ev(?:cdf|fit|inv|like|pdf|rnd|stat)|ExhaustiveSearcher|exp(?:cdf|fit|inv|like|pdf|rnd|stat)|factoran|fcdf|ff2n|finv|fitdist|fitensemble|fpdf|fracfact|fracfactgen|friedman|frnd|fstat|fsurfht|fullfact|gagerr|gam(?:cdf|fit|inv|like|pdf|rnd|stat)|GeneralizedLinearModel(?:\\.fit)?|geo(?:cdf|inv|mean|pdf|rnd|stat)|gev(?:cdf|fit|inv|like|pdf|rnd|stat)|gline|glmfit|glmval|glyphplot|gmdistribution(?:\\.fit)?|gname|gp(?:cdf|fit|inv|like|pdf|rnd|stat)|gplotmatrix|grp2idx|grpstats|gscatter|haltonset|harmmean|hist3|histfit|hmm(?:decode|estimate|generate|train|viterbi)|hougen|hyge(?:cdf|inv|pdf|rnd|stat)|icdf|inconsistent|interactionplot|invpred|iqr|iwishrnd|jackknife|jbtest|johnsrnd|KDTreeSearcher|kmeans|knnsearch|kruskalwallis|ksdensity|kstest|kstest2|kurtosis|lasso|lassoglm|lassoPlot|leverage|lhsdesign|lhsnorm|lillietest|LinearModel(?:\\.fit)?|linhyptest|linkage|logn(?:cdf|fit|inv|like|pdf|rnd|stat)|lsline|mad|mahal|maineffectsplot|manova1|manovacluster|mdscale|mhsample|mle|mlecov|mnpdf|mnrfit|mnrnd|mnrval|moment|multcompare|multivarichart|mvn(?:cdf|pdf|rnd)|mvregress|mvregresslike|mvt(?:cdf|pdf|rnd)|NaiveBayes(?:\\.fit)?|nan(?:cov|max|mean|median|min|std|sum|var)|nbin(?:cdf|fit|inv|pdf|rnd|stat)|ncf(?:cdf|inv|pdf|rnd|stat)|nct(?:cdf|inv|pdf|rnd|stat)|ncx2(?:cdf|inv|pdf|rnd|stat)|NeighborSearcher|nlinfit|nlintool|nlmefit|nlmefitsa|nlparci|nlpredci|nnmf|nominal|NonLinearModel(?:\\.fit)?|norm(?:cdf|fit|inv|like|pdf|rnd|stat)|normplot|normspec|ordinal|outlierMeasure|parallelcoords|paretotails|partialcorr|pcacov|pcares|pdf|pdist|pdist2|pearsrnd|perfcurve|perms|piecewisedistribution|plsregress|poiss(?:cdf|fit|inv|pdf|rnd|tat)|polyconf|polytool|prctile|princomp|ProbDist(?:Kernel|Parametric|UnivKernel|UnivParam)?|probplot|procrustes|qqplot|qrandset|qrandstream|quantile|randg|random|randsample|randtool|range|rangesearch|ranksum|rayl(?:cdf|fit|inv|pdf|rnd|stat)|rcoplot|refcurve|refline|regress|Regression(?:BaggedEnsemble|Ensemble|PartitionedEnsemble|PartitionedModel|Tree(?:\\.(?:fit|template))?)|regstats|relieff|ridge|robustdemo|robustfit|rotatefactors|rowexch|rsmdemo|rstool|runstest|sampsizepwr|scatterhist|sequentialfs|signrank|signtest|silhouette|skewness|slicesample|sobolset|squareform|statget|statset|stepwise|stepwisefit|surfht|tabulate|tblread|tblwrite|tcdf|tdfread|tiedrank|tinv|tpdf|TreeBagger|treedisp|treefit|treeprune|treetest|treeval|trimmean|trnd|tstat|ttest|ttest2|unid(?:cdf|inv|pdf|rnd|stat)|unif(?:cdf|inv|it|pdf|rnd|stat)|vartest(?:2|n)?|wbl(?:cdf|fit|inv|like|pdf|rnd|stat)|wblplot|wishrnd|x2fx|xptread|zscore|ztest'\n  ].join(\"|\");\n  var imageFunctions = [\n    'adapthisteq|analyze75info|analyze75read|applycform|applylut|axes2pix|bestblk|blockproc|bwarea|bwareaopen|bwboundaries|bwconncomp|bwconvhull|bwdist|bwdistgeodesic|bweuler|bwhitmiss|bwlabel|bwlabeln|bwmorph|bwpack|bwperim|bwselect|bwtraceboundary|bwulterode|bwunpack|checkerboard|col2im|colfilt|conndef|convmtx2|corner|cornermetric|corr2|cp2tform|cpcorr|cpselect|cpstruct2pairs|dct2|dctmtx|deconvblind|deconvlucy|deconvreg|deconvwnr|decorrstretch|demosaic|dicom(?:anon|dict|info|lookup|read|uid|write)|edge|edgetaper|entropy|entropyfilt|fan2para|fanbeam|findbounds|fliptform|freqz2|fsamp2|fspecial|ftrans2|fwind1|fwind2|getheight|getimage|getimagemodel|getline|getneighbors|getnhood|getpts|getrangefromclass|getrect|getsequence|gray2ind|graycomatrix|graycoprops|graydist|grayslice|graythresh|hdrread|hdrwrite|histeq|hough|houghlines|houghpeaks|iccfind|iccread|iccroot|iccwrite|idct2|ifanbeam|im2bw|im2col|im2double|im2int16|im2java2d|im2single|im2uint16|im2uint8|imabsdiff|imadd|imadjust|ImageAdapter|imageinfo|imagemodel|imapplymatrix|imattributes|imbothat|imclearborder|imclose|imcolormaptool|imcomplement|imcontour|imcontrast|imcrop|imdilate|imdisplayrange|imdistline|imdivide|imellipse|imerode|imextendedmax|imextendedmin|imfill|imfilter|imfindcircles|imfreehand|imfuse|imgca|imgcf|imgetfile|imhandles|imhist|imhmax|imhmin|imimposemin|imlincomb|imline|immagbox|immovie|immultiply|imnoise|imopen|imoverview|imoverviewpanel|impixel|impixelinfo|impixelinfoval|impixelregion|impixelregionpanel|implay|impoint|impoly|impositionrect|improfile|imputfile|impyramid|imreconstruct|imrect|imregconfig|imregionalmax|imregionalmin|imregister|imresize|imroi|imrotate|imsave|imscrollpanel|imshow|imshowpair|imsubtract|imtool|imtophat|imtransform|imview|ind2gray|ind2rgb|interfileinfo|interfileread|intlut|ippl|iptaddcallback|iptcheckconn|iptcheckhandle|iptcheckinput|iptcheckmap|iptchecknargin|iptcheckstrs|iptdemos|iptgetapi|iptGetPointerBehavior|iptgetpref|ipticondir|iptnum2ordinal|iptPointerManager|iptprefs|iptremovecallback|iptSetPointerBehavior|iptsetpref|iptwindowalign|iradon|isbw|isflat|isgray|isicc|isind|isnitf|isrgb|isrset|lab2double|lab2uint16|lab2uint8|label2rgb|labelmatrix|makecform|makeConstrainToRectFcn|makehdr|makelut|makeresampler|maketform|mat2gray|mean2|medfilt2|montage|nitfinfo|nitfread|nlfilter|normxcorr2|ntsc2rgb|openrset|ordfilt2|otf2psf|padarray|para2fan|phantom|poly2mask|psf2otf|qtdecomp|qtgetblk|qtsetblk|radon|rangefilt|reflect|regionprops|registration\\.metric\\.(?:MattesMutualInformation|MeanSquares)|registration\\.optimizer\\.(?:OnePlusOneEvolutionary|RegularStepGradientDescent)|rgb2gray|rgb2ntsc|rgb2ycbcr|roicolor|roifill|roifilt2|roipoly|rsetwrite|std2|stdfilt|strel|stretchlim|subimage|tformarray|tformfwd|tforminv|tonemap|translate|truesize|uintlut|viscircles|warp|watershed|whitepoint|wiener2|xyz2double|xyz2uint16|ycbcr2rgb'\n  ].join(\"|\");\n  var optimFunctions = [\n    'bintprog|color|fgoalattain|fminbnd|fmincon|fminimax|fminsearch|fminunc|fseminf|fsolve|fzero|fzmult|gangstr|ktrlink|linprog|lsqcurvefit|lsqlin|lsqnonlin|lsqnonneg|optimget|optimset|optimtool|quadprog'\n  ].join(\"|\");\n\n  // identifiers: variable/function name, or a chain of variable names joined by dots (obj.method, struct.field1.field2, etc..)\n  // valid variable names (start with letter, and contains letters, digits, and underscores).\n  // we match \"xx.yy\" as a whole so that if \"xx\" is plain and \"yy\" is not, we dont get a false positive for \"yy\"\n  //var reIdent = '(?:[a-zA-Z][a-zA-Z0-9_]*)';\n  //var reIdentChain = '(?:' + reIdent + '(?:\\.' + reIdent + ')*' + ')';\n\n  // patterns that always start with a known character. Must have a shortcut string.\n  var shortcutStylePatterns = [\n    // whitespaces: space, tab, carriage return, line feed, line tab, form-feed, non-break space\n    [PR.PR_PLAIN, /^[ \\t\\r\\n\\v\\f\\xA0]+/, null, \" \\t\\r\\n\\u000b\\u000c\\u00a0\"],\n\n    // block comments\n    //TODO: chokes on nested block comments\n    //TODO: false positives when the lines with %{ and %} contain non-spaces\n    //[PR.PR_COMMENT, /^%(?:[^\\{].*|\\{(?:%|%*[^\\}%])*(?:\\}+%?)?)/, null],\n    [PR.PR_COMMENT, /^%\\{[^%]*%+(?:[^\\}%][^%]*%+)*\\}/, null],\n\n    // single-line comments\n    [PR.PR_COMMENT, /^%[^\\r\\n]*/, null, \"%\"],\n\n    // system commands\n    [PR_SYSCMD, /^![^\\r\\n]*/, null, \"!\"]\n  ];\n\n  // patterns that will be tried in order if the shortcut ones fail. May have shortcuts.\n  var fallthroughStylePatterns = [\n    // line continuation\n    [PR_LINE_CONTINUATION, /^\\.\\.\\.\\s*[\\r\\n]/, null],\n\n    // error message\n    [PR_ERROR, /^\\?\\?\\? [^\\r\\n]*/, null],\n\n    // warning message\n    [PR_WARNING, /^Warning: [^\\r\\n]*/, null],\n\n    // command prompt/output\n    //[PR_CODE_OUTPUT, /^>>\\s+[^\\r\\n]*[\\r\\n]{1,2}[^=]*=[^\\r\\n]*[\\r\\n]{1,2}[^\\r\\n]*/, null],    // full command output (both loose/compact format): `>> EXP\\nVAR =\\n VAL`\n    [PR_CODE_OUTPUT, /^>>\\s+/, null],      // only the command prompt `>> `\n    [PR_CODE_OUTPUT, /^octave:\\d+>\\s+/, null],  // Octave command prompt `octave:1> `\n\n    // identifier (chain) or closing-parenthesis/brace/bracket, and IS followed by transpose operator\n    // this way we dont misdetect the transpose operator ' as the start of a string\n    [\"lang-matlab-operators\", /^((?:[a-zA-Z][a-zA-Z0-9_]*(?:\\.[a-zA-Z][a-zA-Z0-9_]*)*|\\)|\\]|\\}|\\.)')/, null],\n\n    // identifier (chain), and NOT followed by transpose operator\n    // this must come AFTER the \"is followed by transpose\" step (otherwise it chops the last char of identifier)\n    [\"lang-matlab-identifiers\", /^([a-zA-Z][a-zA-Z0-9_]*(?:\\.[a-zA-Z][a-zA-Z0-9_]*)*)(?!')/, null],\n\n    // single-quoted strings: allow for escaping with '', no multilines\n    //[PR.PR_STRING, /(?:(?<=(?:\\(|\\[|\\{|\\s|=|;|,|:))|^)'(?:[^']|'')*'(?=(?:\\)|\\]|\\}|\\s|=|;|,|:|~|<|>|&|-|\\+|\\*|\\.|\\^|\\|))/, null],  // string vs. transpose (check before/after context using negative/positive lookbehind/lookahead)\n    [PR.PR_STRING, /^'(?:[^']|'')*'/, null],  // \"'\"\n\n    // floating point numbers: 1, 1.0, 1i, -1.1E-1\n    [PR.PR_LITERAL, /^[+\\-]?\\.?\\d+(?:\\.\\d*)?(?:[Ee][+\\-]?\\d+)?[ij]?/, null],\n\n    // parentheses, braces, brackets\n    [PR.PR_TAG, /^(?:\\{|\\}|\\(|\\)|\\[|\\])/, null],  // \"{}()[]\"\n\n    // other operators\n    [PR.PR_PUNCTUATION, /^(?:<|>|=|~|@|&|;|,|:|!|\\-|\\+|\\*|\\^|\\.|\\||\\\\|\\/)/, null]\n  ];\n\n  var identifiersPatterns = [\n    // list of keywords (`iskeyword`)\n    [PR.PR_KEYWORD, /^\\b(?:break|case|catch|classdef|continue|else|elseif|end|for|function|global|if|otherwise|parfor|persistent|return|spmd|switch|try|while)\\b/, null],\n\n    // some specials variables/constants\n    [PR_CONSTANT, /^\\b(?:true|false|inf|Inf|nan|NaN|eps|pi|ans|nargin|nargout|varargin|varargout)\\b/, null],\n\n    // some data types\n    [PR.PR_TYPE, /^\\b(?:cell|struct|char|double|single|logical|u?int(?:8|16|32|64)|sparse)\\b/, null],\n\n    // commonly used builtin functions from core MATLAB and a few popular toolboxes\n    [PR_FUNCTION, new RegExp('^\\\\b(?:' + coreFunctions + ')\\\\b'), null],\n    [PR_FUNCTION_TOOLBOX, new RegExp('^\\\\b(?:' + statsFunctions + ')\\\\b'), null],\n    [PR_FUNCTION_TOOLBOX, new RegExp('^\\\\b(?:' + imageFunctions + ')\\\\b'), null],\n    [PR_FUNCTION_TOOLBOX, new RegExp('^\\\\b(?:' + optimFunctions + ')\\\\b'), null],\n\n    // plain identifier (user-defined variable/function name)\n    [PR_IDENTIFIER, /^[a-zA-Z][a-zA-Z0-9_]*(?:\\.[a-zA-Z][a-zA-Z0-9_]*)*/, null]\n  ];\n\n  var operatorsPatterns = [\n    // forward to identifiers to match\n    [\"lang-matlab-identifiers\", /^([a-zA-Z][a-zA-Z0-9_]*(?:\\.[a-zA-Z][a-zA-Z0-9_]*)*)/, null],\n\n    // parentheses, braces, brackets\n    [PR.PR_TAG, /^(?:\\{|\\}|\\(|\\)|\\[|\\])/, null],  // \"{}()[]\"\n\n    // other operators\n    [PR.PR_PUNCTUATION, /^(?:<|>|=|~|@|&|;|,|:|!|\\-|\\+|\\*|\\^|\\.|\\||\\\\|\\/)/, null],\n\n    // transpose operators\n    [PR_TRANSPOSE, /^'/, null]\n  ];\n\n  PR.registerLangHandler(\n    PR.createSimpleLexer([], identifiersPatterns),\n    [\"matlab-identifiers\"]\n  );\n  PR.registerLangHandler(\n    PR.createSimpleLexer([], operatorsPatterns),\n    [\"matlab-operators\"]\n  );\n  PR.registerLangHandler(\n    PR.createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns),\n    [\"matlab\"]\n  );\n})(window['PR']);\n"
  },
  {
    "path": "google-code-prettify/src/lang-ml.js",
    "content": "// Copyright (C) 2008 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n\n/**\n * @fileoverview\n * Registers a language handler for OCaml, SML, F# and similar languages.\n *\n * Based on the lexical grammar at\n * http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html#_Toc270597388\n *\n * @author mikesamuel@gmail.com\n */\n\nPR['registerLangHandler'](\n    PR['createSimpleLexer'](\n        [\n         // Whitespace is made up of spaces, tabs and newline characters.\n         [PR['PR_PLAIN'],       /^[\\t\\n\\r \\xA0]+/, null, '\\t\\n\\r \\xA0'],\n         // #if ident/#else/#endif directives delimit conditional compilation\n         // sections\n         [PR['PR_COMMENT'],\n          /^#(?:if[\\t\\n\\r \\xA0]+(?:[a-z_$][\\w\\']*|``[^\\r\\n\\t`]*(?:``|$))|else|endif|light)/i,\n          null, '#'],\n         // A double or single quoted, possibly multi-line, string.\n         // F# allows escaped newlines in strings.\n         [PR['PR_STRING'],      /^(?:\\\"(?:[^\\\"\\\\]|\\\\[\\s\\S])*(?:\\\"|$)|\\'(?:[^\\'\\\\]|\\\\[\\s\\S])(?:\\'|$))/, null, '\"\\'']\n        ],\n        [\n         // Block comments are delimited by (* and *) and may be\n         // nested. Single-line comments begin with // and extend to\n         // the end of a line.\n         // TODO: (*...*) comments can be nested.  This does not handle that.\n         [PR['PR_COMMENT'],     /^(?:\\/\\/[^\\r\\n]*|\\(\\*[\\s\\S]*?\\*\\))/],\n         [PR['PR_KEYWORD'],     /^(?:abstract|and|as|assert|begin|class|default|delegate|do|done|downcast|downto|elif|else|end|exception|extern|false|finally|for|fun|function|if|in|inherit|inline|interface|internal|lazy|let|match|member|module|mutable|namespace|new|null|of|open|or|override|private|public|rec|return|static|struct|then|to|true|try|type|upcast|use|val|void|when|while|with|yield|asr|land|lor|lsl|lsr|lxor|mod|sig|atomic|break|checked|component|const|constraint|constructor|continue|eager|event|external|fixed|functor|global|include|method|mixin|object|parallel|process|protected|pure|sealed|trait|virtual|volatile)\\b/],\n         // A number is a hex integer literal, a decimal real literal, or in\n         // scientific notation.\n         [PR['PR_LITERAL'],\n          /^[+\\-]?(?:0x[\\da-f]+|(?:(?:\\.\\d+|\\d+(?:\\.\\d*)?)(?:e[+\\-]?\\d+)?))/i],\n         [PR['PR_PLAIN'],       /^(?:[a-z_][\\w']*[!?#]?|``[^\\r\\n\\t`]*(?:``|$))/i],\n         // A printable non-space non-special character\n         [PR['PR_PUNCTUATION'], /^[^\\t\\n\\r \\xA0\\\"\\'\\w]+/]\n        ]),\n    ['fs', 'ml']);\n"
  },
  {
    "path": "google-code-prettify/src/lang-mumps.js",
    "content": "// Copyright (C) 2011 Kitware Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n\n/**\n * @fileoverview\n * Registers a language handler for MUMPS.\n *\n *\n * To use, include prettify.js and this file in your HTML page.\n * Then put your code in an HTML tag like\n *      <pre class=\"prettyprint lang-mumps\">(my SQL code)</pre>\n * \n * Commands, intrinsic functions and variables taken from ISO/IEC 11756:1999(E)\n *\n * @author chris.harris@kitware.com\n *\n * Known issues:\n * \n * - Currently can't distinguish between keywords and local or global variables having the same name\n *   for exampe SET IF=\"IF?\"\n * - m file are already used for MatLab hence using mumps.\n */\n\n(function () {\n\n\nvar commands = 'B|BREAK|'       + \n               'C|CLOSE|'       +\n               'D|DO|'          +\n               'E|ELSE|'        +\n               'F|FOR|'         +\n               'G|GOTO|'        +\n               'H|HALT|'        +\n               'H|HANG|'        +\n               'I|IF|'          +\n               'J|JOB|'         +\n               'K|KILL|'        +\n               'L|LOCK|'        +\n               'M|MERGE|'       +\n               'N|NEW|'         +\n               'O|OPEN|'        +     \n               'Q|QUIT|'        +\n               'R|READ|'        +\n               'S|SET|'         +\n               'TC|TCOMMIT|'    +\n               'TRE|TRESTART|'  +\n               'TRO|TROLLBACK|' +\n               'TS|TSTART|'     +\n               'U|USE|'         +\n               'V|VIEW|'        +  \n               'W|WRITE|'       +\n               'X|XECUTE';\n\nvar intrinsicVariables = 'D|DEVICE|'       +\n                         'EC|ECODE|'       +  \n                         'ES|ESTACK|'      +\n                         'ET|ETRAP|'       +\n                         'H|HOROLOG|'      +\n                         'I|IO|'           +\n                         'J|JOB|'          +\n                         'K|KEY|'          +\n                         'P|PRINCIPAL|'    +\n                         'Q|QUIT|'         +\n                         'ST|STACK|'       +\n                         'S|STORAGE|'      +\n                         'SY|SYSTEM|'      +\n                         'T|TEST|'         +\n                         'TL|TLEVEL|'      +\n                         'TR|TRESTART|'    +\n                         'X|'              +\n                         'Y|'              +\n                         'Z[A-Z]*|';    \n\nvar intrinsicFunctions = 'A|ASCII|'        +\n                         'C|CHAR|'         +\n                         'D|DATA|'         +\n                         'E|EXTRACT|'      +\n                         'F|FIND|'         +\n                         'FN|FNUMBER|'     +\n                         'G|GET|'          +\n                         'J|JUSTIFY|'      +\n                         'L|LENGTH|'       +\n                         'NA|NAME|'        +\n                         'O|ORDER|'        +\n                         'P|PIECE|'        +\n                         'QL|QLENGTH|'     +\n                         'QS|QSUBSCRIPT|'  +\n                         'Q|QUERY|'        +\n                         'R|RANDOM|'       +\n                         'RE|REVERSE|'     +\n                         'S|SELECT|'       +\n                         'ST|STACK|'       +\n                         'T|TEXT|'         +\n                         'TR|TRANSLATE|'   +\n                         'V|VIEW|'         * \n                         'Z[A-Z]*|';   \n\nvar intrinsic = intrinsicVariables + intrinsicFunctions;                  \n\n\nvar shortcutStylePatterns = [\n         // Whitespace\n         [PR['PR_PLAIN'],       /^[\\t\\n\\r \\xA0]+/, null, '\\t\\n\\r \\xA0'],\n         // A double or single quoted, possibly multi-line, string.\n         [PR['PR_STRING'],      /^(?:\"(?:[^\"]|\\\\.)*\")/, null, '\"']\n  ];\n\nvar fallthroughStylePatterns = [\n         // A line comment that starts with ;\n         [PR['PR_COMMENT'],     /^;[^\\r\\n]*/, null, ';'],\n         // Add intrinsic variables and functions as declarations, there not really but it mean\n         // they will hilighted differently from commands.\n         [PR['PR_DECLARATION'], new RegExp('^(?:\\\\$(?:' + intrinsic + '))\\\\b', 'i'), null],\n         // Add commands as keywords\n         [PR['PR_KEYWORD'], new RegExp('^(?:[^\\\\$]' + commands + ')\\\\b', 'i'), null],\n         // A number is a decimal real literal or in scientific notation. \n         [PR['PR_LITERAL'],\n          /^[+-]?(?:(?:\\.\\d+|\\d+(?:\\.\\d*)?)(?:E[+\\-]?\\d+)?)/i], \n         // An identifier\n         [PR['PR_PLAIN'], /^[a-z][a-zA-Z0-9]*/i],\n         // Exclude $ % and ^\n         [PR['PR_PUNCTUATION'], /^[^\\w\\t\\n\\r\\xA0\\\"\\$;%\\^]|_/]\n  ];\n// Can't use m as its already used for MatLab\nPR.registerLangHandler(PR.createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns), ['mumps']);\n})();\n"
  },
  {
    "path": "google-code-prettify/src/lang-n.js",
    "content": "// Copyright (C) 2011 Zimin A.V.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview\n * Registers a language handler for the Nemerle language.\n * http://nemerle.org\n * @author Zimin A.V.\n */\n(function () {\n  // http://nemerle.org/wiki/index.php?title=Base_keywords\n  var keywords = 'abstract|and|as|base|catch|class|def|delegate|enum|event|extern|false|finally|'\n         + 'fun|implements|interface|internal|is|macro|match|matches|module|mutable|namespace|new|'\n         + 'null|out|override|params|partial|private|protected|public|ref|sealed|static|struct|'\n         + 'syntax|this|throw|true|try|type|typeof|using|variant|virtual|volatile|when|where|with|'\n         + 'assert|assert2|async|break|checked|continue|do|else|ensures|for|foreach|if|late|lock|new|nolate|'\n         + 'otherwise|regexp|repeat|requires|return|surroundwith|unchecked|unless|using|while|yield';\n\n  PR['registerLangHandler'](PR['createSimpleLexer'](\n      // shortcutStylePatterns\n      [\n        [PR['PR_STRING'], /^(?:\\'(?:[^\\\\\\'\\r\\n]|\\\\.)*\\'|\\\"(?:[^\\\\\\\"\\r\\n]|\\\\.)*(?:\\\"|$))/, null, '\"'],\n        [PR['PR_COMMENT'], /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\\b|[^\\r\\n]*)/, null, '#'],\n        [PR['PR_PLAIN'], /^\\s+/, null, ' \\r\\n\\t\\xA0']\n      ],\n      // fallthroughStylePatterns\n      [\n        [PR['PR_STRING'], /^@\\\"(?:[^\\\"]|\\\"\\\")*(?:\\\"|$)/, null],\n        [PR['PR_STRING'], /^<#(?:[^#>])*(?:#>|$)/, null],\n        [PR['PR_STRING'], /^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h|[a-z]\\w*)>/, null],\n        [PR['PR_COMMENT'], /^\\/\\/[^\\r\\n]*/, null],\n        [PR['PR_COMMENT'], /^\\/\\*[\\s\\S]*?(?:\\*\\/|$)/, null],\n        [PR['PR_KEYWORD'], new RegExp('^(?:' + keywords + ')\\\\b'), null],\n        [PR['PR_TYPE'], /^(?:array|bool|byte|char|decimal|double|float|int|list|long|object|sbyte|short|string|ulong|uint|ufloat|ulong|ushort|void)\\b/, null],\n        [PR['PR_LITERAL'], /^@[a-z_$][a-z_$@0-9]*/i, null],\n        [PR['PR_TYPE'], /^@[A-Z]+[a-z][A-Za-z_$@0-9]*/, null],\n        [PR['PR_PLAIN'], /^'?[A-Za-z_$][a-z_$@0-9]*/i, null],\n        [PR['PR_LITERAL'], new RegExp(\n             '^(?:'\n  // A hex number\n             + '0x[a-f0-9]+'\n  // or an octal or decimal number,\n             + '|(?:\\\\d(?:_\\\\d+)*\\\\d*(?:\\\\.\\\\d*)?|\\\\.\\\\d\\\\+)'\n  // possibly in scientific notation\n             + '(?:e[+\\\\-]?\\\\d+)?'\n             + ')'\n  // with an optional modifier like UL for unsigned long\n             + '[a-z]*', 'i'), null, '0123456789'],\n\n        [PR['PR_PUNCTUATION'], /^.[^\\s\\w\\.$@\\'\\\"\\`\\/\\#]*/, null]\n      ]),\n      ['n', 'nemerle']);\n})();\n"
  },
  {
    "path": "google-code-prettify/src/lang-pascal.js",
    "content": "// Contributed by peter dot kofler at code minus cop dot org\n\n/**\n * @fileoverview\n * Registers a language handler for (Turbo) Pascal.\n *\n * To use, include prettify.js and this file in your HTML page.\n * Then put your code in an HTML tag like\n *      <pre class=\"prettyprint lang-pascal\">(my Pascal code)</pre>\n *\n * @author peter dot kofler at code minus cop dot org\n */\n\nPR.registerLangHandler(\n    PR.createSimpleLexer(\n        [ // shortcutStylePatterns\n          // 'single-line-string'\n          [PR.PR_STRING,        /^(?:\\'(?:[^\\\\\\'\\r\\n]|\\\\.)*(?:\\'|$))/, null, '\\''],\n          // Whitespace\n          [PR.PR_PLAIN,         /^\\s+/, null, ' \\r\\n\\t\\xA0']\n        ],\n        [ // fallthroughStylePatterns\n          // A cStyleComments comment (* *) or {}\n          [PR.PR_COMMENT,       /^\\(\\*[\\s\\S]*?(?:\\*\\)|$)|^\\{[\\s\\S]*?(?:\\}|$)/, null],\n          [PR.PR_KEYWORD,       /^(?:ABSOLUTE|AND|ARRAY|ASM|ASSEMBLER|BEGIN|CASE|CONST|CONSTRUCTOR|DESTRUCTOR|DIV|DO|DOWNTO|ELSE|END|EXTERNAL|FOR|FORWARD|FUNCTION|GOTO|IF|IMPLEMENTATION|IN|INLINE|INTERFACE|INTERRUPT|LABEL|MOD|NOT|OBJECT|OF|OR|PACKED|PROCEDURE|PROGRAM|RECORD|REPEAT|SET|SHL|SHR|THEN|TO|TYPE|UNIT|UNTIL|USES|VAR|VIRTUAL|WHILE|WITH|XOR)\\b/i, null],\n          [PR.PR_LITERAL,       /^(?:true|false|self|nil)/i, null],\n          [PR.PR_PLAIN,         /^[a-z][a-z0-9]*/i, null],\n          // Literals .0, 0, 0.0 0E13\n          [PR.PR_LITERAL,       /^(?:\\$[a-f0-9]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+\\-]?\\d+)?)/i,  null, '0123456789'],\n          [PR.PR_PUNCTUATION,   /^.[^\\s\\w\\.$@\\'\\/]*/, null]\n        ]),\n    ['pascal']);\n"
  },
  {
    "path": "google-code-prettify/src/lang-proto.js",
    "content": "// Copyright (C) 2006 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview\n * Registers a language handler for Protocol Buffers as described at\n * http://code.google.com/p/protobuf/.\n *\n * Based on the lexical grammar at\n * http://research.microsoft.com/fsharp/manual/spec2.aspx#_Toc202383715\n *\n * @author mikesamuel@gmail.com\n */\n\nPR['registerLangHandler'](PR['sourceDecorator']({\n        'keywords': (\n            'bytes,default,double,enum,extend,extensions,false,'\n            + 'group,import,max,message,option,'\n            + 'optional,package,repeated,required,returns,rpc,service,'\n            + 'syntax,to,true'),\n        'types': /^(bool|(double|s?fixed|[su]?int)(32|64)|float|string)\\b/,\n        'cStyleComments': true\n      }), ['proto']);\n"
  },
  {
    "path": "google-code-prettify/src/lang-r.js",
    "content": "// Copyright (C) 2012 Jeffrey B. Arnold\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview\n * Registers a language handler for S, S-plus, and R source code.\n *\n *\n * To use, include prettify.js and this file in your HTML page.\n * Then put your code in an HTML tag like\n *      <pre class=\"prettyprint lang-r\"> code </pre>\n *\n * Language definition from\n * http://cran.r-project.org/doc/manuals/R-lang.html.\n * Many of the regexes are shared  with the pygments SLexer,\n * http://pygments.org/.\n *\n * Original: https://raw.github.com/jrnold/prettify-lang-r-bugs/master/lang-r.js\n *\n * @author jeffrey.arnold@gmail.com\n */\nPR['registerLangHandler'](\n    PR['createSimpleLexer'](\n        [\n            [PR['PR_PLAIN'],       /^[\\t\\n\\r \\xA0]+/, null, '\\t\\n\\r \\xA0'],\n\t    [PR['PR_STRING'],      /^\\\"(?:[^\\\"\\\\]|\\\\[\\s\\S])*(?:\\\"|$)/, null, '\"'],\n\t    [PR['PR_STRING'],      /^\\'(?:[^\\'\\\\]|\\\\[\\s\\S])*(?:\\'|$)/, null, \"'\"]\n        ],\n        [\n            [PR['PR_COMMENT'],     /^#.*/],\n\t    [PR['PR_KEYWORD'],     /^(?:if|else|for|while|repeat|in|next|break|return|switch|function)(?![A-Za-z0-9_.])/],\n\t    // hex numbes\n\t    [PR['PR_LITERAL'], /^0[xX][a-fA-F0-9]+([pP][0-9]+)?[Li]?/],\n\t    // Decimal numbers\n            [PR['PR_LITERAL'], /^[+-]?([0-9]+(\\.[0-9]+)?|\\.[0-9]+)([eE][+-]?[0-9]+)?[Li]?/],\n\t    // builtin symbols\n\t    [PR['PR_LITERAL'], /^(?:NULL|NA(?:_(?:integer|real|complex|character)_)?|Inf|TRUE|FALSE|NaN|\\.\\.(?:\\.|[0-9]+))(?![A-Za-z0-9_.])/],\n\t    // assignment, operators, and parens, etc.\n\t    [PR['PR_PUNCTUATION'], /^(?:<<?-|->>?|-|==|<=|>=|<|>|&&?|!=|\\|\\|?|\\*|\\+|\\^|\\/|!|%.*?%|=|~|\\$|@|:{1,3}|[\\[\\](){};,?])/],\n\t    // valid variable names\n\t    [PR['PR_PLAIN'], /^(?:[A-Za-z]+[A-Za-z0-9_.]*|\\.[a-zA-Z_][0-9a-zA-Z\\._]*)(?![A-Za-z0-9_.])/],\n\t    // string backtick\n\t    [PR['PR_STRING'], /^`.+`/]\n        ]),\n    ['r', 's', 'R', 'S', 'Splus']);\n"
  },
  {
    "path": "google-code-prettify/src/lang-rd.js",
    "content": "// Copyright (C) 2012 Jeffrey Arnold\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview\n * Support for R documentation (Rd) files\n *\n * Minimal highlighting or Rd files, basically just highlighting\n * macros. It does not try to identify verbatim or R-like regions of\n * macros as that is too complicated for a lexer.  Descriptions of the\n * Rd format can be found\n * http://cran.r-project.org/doc/manuals/R-exts.html and\n * http://developer.r-project.org/parseRd.pdf.\n *\n * @author Jeffrey Arnold\n */\nPR['registerLangHandler'](\n    PR['createSimpleLexer'](\n        [\n            // whitespace\n            [PR['PR_PLAIN'],   /^[\\t\\n\\r \\xA0]+/, null, '\\t\\n\\r \\xA0'],\n            // all comments begin with '%'\n            [PR['PR_COMMENT'], /^%[^\\r\\n]*/, null, '%']\n        ],\n        [// special macros with no args\n            [PR['PR_LITERAL'], /^\\\\(?:cr|l?dots|R|tab)\\b/],\n\t    // macros\n            [PR['PR_KEYWORD'], /^\\\\[a-zA-Z@]+/],\n\t    // highlighted as macros, since technically they are\n            [PR['PR_KEYWORD'],  /^#(?:ifn?def|endif)/ ],\n\t    // catch escaped brackets\n\t    [PR['PR_PLAIN'], /^\\\\[{}]/],\n            // punctuation\n            [PR['PR_PUNCTUATION'], /^[{}()\\[\\]]+/]\n        ]),\n    ['Rd', 'rd']);\n"
  },
  {
    "path": "google-code-prettify/src/lang-scala.js",
    "content": "// Copyright (C) 2010 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview\n * Registers a language handler for Scala.\n *\n * Derived from http://lampsvn.epfl.ch/svn-repos/scala/scala-documentation/trunk/src/reference/SyntaxSummary.tex\n *\n * @author mikesamuel@gmail.com\n */\n\nPR['registerLangHandler'](\n    PR['createSimpleLexer'](\n        [\n         // Whitespace\n         [PR['PR_PLAIN'],       /^[\\t\\n\\r \\xA0]+/, null, '\\t\\n\\r \\xA0'],\n         // A double or single quoted string \n          // or a triple double-quoted multi-line string.\n         [PR['PR_STRING'],\n          /^(?:\"(?:(?:\"\"(?:\"\"?(?!\")|[^\\\\\"]|\\\\.)*\"{0,3})|(?:[^\"\\r\\n\\\\]|\\\\.)*\"?))/,\n          null, '\"'],\n         [PR['PR_LITERAL'],     /^`(?:[^\\r\\n\\\\`]|\\\\.)*`?/, null, '`'],\n         [PR['PR_PUNCTUATION'], /^[!#%&()*+,\\-:;<=>?@\\[\\\\\\]^{|}~]+/, null,\n          '!#%&()*+,-:;<=>?@[\\\\]^{|}~']\n        ],\n        [\n         // A symbol literal is a single quote followed by an identifier with no\n         // single quote following\n         // A character literal has single quotes on either side\n         [PR['PR_STRING'],      /^'(?:[^\\r\\n\\\\']|\\\\(?:'|[^\\r\\n']+))'/],\n         [PR['PR_LITERAL'],     /^'[a-zA-Z_$][\\w$]*(?!['$\\w])/],\n         [PR['PR_KEYWORD'],     /^(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|object|override|package|private|protected|requires|return|sealed|super|throw|trait|try|type|val|var|while|with|yield)\\b/],\n         [PR['PR_LITERAL'],     /^(?:true|false|null|this)\\b/],\n         [PR['PR_LITERAL'],     /^(?:(?:0(?:[0-7]+|X[0-9A-F]+))L?|(?:(?:0|[1-9][0-9]*)(?:(?:\\.[0-9]+)?(?:E[+\\-]?[0-9]+)?F?|L?))|\\\\.[0-9]+(?:E[+\\-]?[0-9]+)?F?)/i],\n         // Treat upper camel case identifiers as types.\n         [PR['PR_TYPE'],        /^[$_]*[A-Z][_$A-Z0-9]*[a-z][\\w$]*/],\n         [PR['PR_PLAIN'],       /^[$a-zA-Z_][\\w$]*/],\n         [PR['PR_COMMENT'],     /^\\/(?:\\/.*|\\*(?:\\/|\\**[^*/])*(?:\\*+\\/?)?)/],\n         [PR['PR_PUNCTUATION'], /^(?:\\.+|\\/)/]\n        ]),\n    ['scala']);\n"
  },
  {
    "path": "google-code-prettify/src/lang-sql.js",
    "content": "// Copyright (C) 2008 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n\n/**\n * @fileoverview\n * Registers a language handler for SQL.\n *\n *\n * To use, include prettify.js and this file in your HTML page.\n * Then put your code in an HTML tag like\n *      <pre class=\"prettyprint lang-sql\">(my SQL code)</pre>\n *\n *\n * http://savage.net.au/SQL/sql-99.bnf.html is the basis for the grammar, and\n * http://msdn.microsoft.com/en-us/library/aa238507(SQL.80).aspx and\n * http://meta.stackoverflow.com/q/92352/137403 as the bases for the keyword\n * list.\n *\n * @author mikesamuel@gmail.com\n */\n\nPR['registerLangHandler'](\n    PR['createSimpleLexer'](\n        [\n         // Whitespace\n         [PR['PR_PLAIN'],       /^[\\t\\n\\r \\xA0]+/, null, '\\t\\n\\r \\xA0'],\n         // A double or single quoted, possibly multi-line, string.\n         [PR['PR_STRING'],      /^(?:\"(?:[^\\\"\\\\]|\\\\.)*\"|'(?:[^\\'\\\\]|\\\\.)*')/, null,\n          '\"\\'']\n        ],\n        [\n         // A comment is either a line comment that starts with two dashes, or\n         // two dashes preceding a long bracketed block.\n         [PR['PR_COMMENT'], /^(?:--[^\\r\\n]*|\\/\\*[\\s\\S]*?(?:\\*\\/|$))/],\n         [PR['PR_KEYWORD'], /^(?:ADD|ALL|ALTER|AND|ANY|APPLY|AS|ASC|AUTHORIZATION|BACKUP|BEGIN|BETWEEN|BREAK|BROWSE|BULK|BY|CASCADE|CASE|CHECK|CHECKPOINT|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMN|COMMIT|COMPUTE|CONNECT|CONSTRAINT|CONTAINS|CONTAINSTABLE|CONTINUE|CONVERT|CREATE|CROSS|CURRENT|CURRENT_DATE|CURRENT_TIME|CURRENT_TIMESTAMP|CURRENT_USER|CURSOR|DATABASE|DBCC|DEALLOCATE|DECLARE|DEFAULT|DELETE|DENY|DESC|DISK|DISTINCT|DISTRIBUTED|DOUBLE|DROP|DUMMY|DUMP|ELSE|END|ERRLVL|ESCAPE|EXCEPT|EXEC|EXECUTE|EXISTS|EXIT|FETCH|FILE|FILLFACTOR|FOLLOWING|FOR|FOREIGN|FREETEXT|FREETEXTTABLE|FROM|FULL|FUNCTION|GOTO|GRANT|GROUP|HAVING|HOLDLOCK|IDENTITY|IDENTITYCOL|IDENTITY_INSERT|IF|IN|INDEX|INNER|INSERT|INTERSECT|INTO|IS|JOIN|KEY|KILL|LEFT|LIKE|LINENO|LOAD|MATCH|MATCHED|MERGE|NATURAL|NATIONAL|NOCHECK|NONCLUSTERED|NOCYCLE|NOT|NULL|NULLIF|OF|OFF|OFFSETS|ON|OPEN|OPENDATASOURCE|OPENQUERY|OPENROWSET|OPENXML|OPTION|OR|ORDER|OUTER|OVER|PARTITION|PERCENT|PIVOT|PLAN|PRECEDING|PRECISION|PRIMARY|PRINT|PROC|PROCEDURE|PUBLIC|RAISERROR|READ|READTEXT|RECONFIGURE|REFERENCES|REPLICATION|RESTORE|RESTRICT|RETURN|REVOKE|RIGHT|ROLLBACK|ROWCOUNT|ROWGUIDCOL|ROWS?|RULE|SAVE|SCHEMA|SELECT|SESSION_USER|SET|SETUSER|SHUTDOWN|SOME|START|STATISTICS|SYSTEM_USER|TABLE|TEXTSIZE|THEN|TO|TOP|TRAN|TRANSACTION|TRIGGER|TRUNCATE|TSEQUAL|UNBOUNDED|UNION|UNIQUE|UNPIVOT|UPDATE|UPDATETEXT|USE|USER|USING|VALUES|VARYING|VIEW|WAITFOR|WHEN|WHERE|WHILE|WITH|WITHIN|WRITETEXT|XML)(?=[^\\w-]|$)/i, null],\n         // A number is a hex integer literal, a decimal real literal, or in\n         // scientific notation.\n         [PR['PR_LITERAL'],\n          /^[+-]?(?:0x[\\da-f]+|(?:(?:\\.\\d+|\\d+(?:\\.\\d*)?)(?:e[+\\-]?\\d+)?))/i],\n         // An identifier\n         [PR['PR_PLAIN'], /^[a-z_][\\w-]*/i],\n         // A run of punctuation\n         [PR['PR_PUNCTUATION'], /^[^\\w\\t\\n\\r \\xA0\\\"\\'][^\\w\\t\\n\\r \\xA0+\\-\\\"\\']*/]\n        ]),\n    ['sql']);\n"
  },
  {
    "path": "google-code-prettify/src/lang-tcl.js",
    "content": "// Copyright (C) 2012 Pyrios.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n\n/**\n * @fileoverview\n * Registers a language handler for TCL\n *\n *\n * To use, include prettify.js and this file in your HTML page.\n * Then put your code in an HTML tag like\n *      <pre class=\"prettyprint lang-tcl\">proc foo {} {puts bar}</pre>\n *\n * I copy-pasted lang-lisp.js, so this is probably not 100% accurate.\n * I used http://wiki.tcl.tk/1019 for the keywords, but tried to only\n * include as keywords that had more impact on the program flow\n * rather than providing convenience. For example, I included 'if'\n * since that provides branching, but left off 'open' since that is more\n * like a proc. Add more if it makes sense.\n *\n * @author pyrios@gmail.com\n */\n\nPR['registerLangHandler'](\n    PR['createSimpleLexer'](\n        [\n         ['opn',             /^\\{+/, null, '{'],\n         ['clo',             /^\\}+/, null, '}'],\n         // A line comment that starts with ;\n         [PR['PR_COMMENT'],     /^#[^\\r\\n]*/, null, '#'],\n         // Whitespace\n         [PR['PR_PLAIN'],       /^[\\t\\n\\r \\xA0]+/, null, '\\t\\n\\r \\xA0'],\n         // A double quoted, possibly multi-line, string.\n         [PR['PR_STRING'],      /^\\\"(?:[^\\\"\\\\]|\\\\[\\s\\S])*(?:\\\"|$)/, null, '\"']\n        ],\n        [\n         [PR['PR_KEYWORD'],     /^(?:after|append|apply|array|break|case|catch|continue|error|eval|exec|exit|expr|for|foreach|if|incr|info|proc|return|set|switch|trace|uplevel|upvar|while)\\b/, null],\n         [PR['PR_LITERAL'],\n          /^[+\\-]?(?:[0#]x[0-9a-f]+|\\d+\\/\\d+|(?:\\.\\d+|\\d+(?:\\.\\d*)?)(?:[ed][+\\-]?\\d+)?)/i],\n         // A single quote possibly followed by a word that optionally ends with\n         // = ! or ?.\n         [PR['PR_LITERAL'],\n          /^\\'(?:-*(?:\\w|\\\\[\\x21-\\x7e])(?:[\\w-]*|\\\\[\\x21-\\x7e])[=!?]?)?/],\n         // A word that optionally ends with = ! or ?.\n         [PR['PR_PLAIN'],\n          /^-*(?:[a-z_]|\\\\[\\x21-\\x7e])(?:[\\w-]*|\\\\[\\x21-\\x7e])[=!?]?/i],\n         // A printable non-space non-special character\n         [PR['PR_PUNCTUATION'], /^[^\\w\\t\\n\\r \\xA0()\\\"\\\\\\';]+/]\n        ]),\n    ['tcl']);\n"
  },
  {
    "path": "google-code-prettify/src/lang-tex.js",
    "content": "// Copyright (C) 2011 Martin S.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview\n * Support for tex highlighting as discussed on\n * <a href=\"http://meta.tex.stackexchange.com/questions/872/text-immediate-following-double-backslashes-is-highlighted-as-macro-inside-a-code/876#876\">meta.tex.stackexchange.com</a>.\n *\n * @author Martin S.\n */\n\nPR['registerLangHandler'](\n    PR['createSimpleLexer'](\n        [\n         // whitespace\n         [PR['PR_PLAIN'],   /^[\\t\\n\\r \\xA0]+/, null, '\\t\\n\\r \\xA0'],\n         // all comments begin with '%'\n         [PR['PR_COMMENT'], /^%[^\\r\\n]*/, null, '%']\n        ],\n        [\n         //[PR['PR_DECLARATION'], /^\\\\([egx]?def|(new|renew|provide)(command|environment))\\b/],\n         // any command starting with a \\ and contains\n         // either only letters (a-z,A-Z), '@' (internal macros)\n         [PR['PR_KEYWORD'], /^\\\\[a-zA-Z@]+/],\n         // or contains only one character\n         [PR['PR_KEYWORD'], /^\\\\./],\n         // Highlight dollar for math mode and ampersam for tabular\n         [PR['PR_TYPE'],    /^[$&]/],\n         // numeric measurement values with attached units\n         [PR['PR_LITERAL'],\n          /[+-]?(?:\\.\\d+|\\d+(?:\\.\\d*)?)(cm|em|ex|in|pc|pt|bp|mm)/i],\n         // punctuation usually occurring within commands\n         [PR['PR_PUNCTUATION'], /^[{}()\\[\\]=]+/]\n        ]),\n    ['latex', 'tex']);\n"
  },
  {
    "path": "google-code-prettify/src/lang-vb.js",
    "content": "// Copyright (C) 2009 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n\n/**\n * @fileoverview\n * Registers a language handler for various flavors of basic.\n *\n *\n * To use, include prettify.js and this file in your HTML page.\n * Then put your code in an HTML tag like\n *      <pre class=\"prettyprint lang-vb\"></pre>\n *\n *\n * http://msdn.microsoft.com/en-us/library/aa711638(VS.71).aspx defines the\n * visual basic grammar lexical grammar.\n *\n * @author mikesamuel@gmail.com\n */\n\nPR['registerLangHandler'](\n    PR['createSimpleLexer'](\n        [\n         // Whitespace\n         [PR['PR_PLAIN'],       /^[\\t\\n\\r \\xA0\\u2028\\u2029]+/, null, '\\t\\n\\r \\xA0\\u2028\\u2029'],\n         // A double quoted string with quotes escaped by doubling them.\n         // A single character can be suffixed with C.\n         [PR['PR_STRING'],      /^(?:[\\\"\\u201C\\u201D](?:[^\\\"\\u201C\\u201D]|[\\\"\\u201C\\u201D]{2})(?:[\\\"\\u201C\\u201D]c|$)|[\\\"\\u201C\\u201D](?:[^\\\"\\u201C\\u201D]|[\\\"\\u201C\\u201D]{2})*(?:[\\\"\\u201C\\u201D]|$))/i, null,\n          '\"\\u201C\\u201D'],\n         // A comment starts with a single quote and runs until the end of the\n         // line.\n         // VB6 apparently allows _ as an escape sequence for newlines though\n         // this is not a documented feature of VB.net.\n         // http://meta.stackoverflow.com/q/121497/137403\n         [PR['PR_COMMENT'],     /^[\\'\\u2018\\u2019](?:_(?:\\r\\n?|[^\\r]?)|[^\\r\\n_\\u2028\\u2029])*/, null, '\\'\\u2018\\u2019']\n        ],\n        [\n         [PR['PR_KEYWORD'], /^(?:AddHandler|AddressOf|Alias|And|AndAlso|Ansi|As|Assembly|Auto|Boolean|ByRef|Byte|ByVal|Call|Case|Catch|CBool|CByte|CChar|CDate|CDbl|CDec|Char|CInt|Class|CLng|CObj|Const|CShort|CSng|CStr|CType|Date|Decimal|Declare|Default|Delegate|Dim|DirectCast|Do|Double|Each|Else|ElseIf|End|EndIf|Enum|Erase|Error|Event|Exit|Finally|For|Friend|Function|Get|GetType|GoSub|GoTo|Handles|If|Implements|Imports|In|Inherits|Integer|Interface|Is|Let|Lib|Like|Long|Loop|Me|Mod|Module|MustInherit|MustOverride|MyBase|MyClass|Namespace|New|Next|Not|NotInheritable|NotOverridable|Object|On|Option|Optional|Or|OrElse|Overloads|Overridable|Overrides|ParamArray|Preserve|Private|Property|Protected|Public|RaiseEvent|ReadOnly|ReDim|RemoveHandler|Resume|Return|Select|Set|Shadows|Shared|Short|Single|Static|Step|Stop|String|Structure|Sub|SyncLock|Then|Throw|To|Try|TypeOf|Unicode|Until|Variant|Wend|When|While|With|WithEvents|WriteOnly|Xor|EndIf|GoSub|Let|Variant|Wend)\\b/i, null],\n         // A second comment form\n         [PR['PR_COMMENT'], /^REM\\b[^\\r\\n\\u2028\\u2029]*/i],\n         // A boolean, numeric, or date literal.\n         [PR['PR_LITERAL'],\n          /^(?:True\\b|False\\b|Nothing\\b|\\d+(?:E[+\\-]?\\d+[FRD]?|[FRDSIL])?|(?:&H[0-9A-F]+|&O[0-7]+)[SIL]?|\\d*\\.\\d+(?:E[+\\-]?\\d+)?[FRD]?|#\\s+(?:\\d+[\\-\\/]\\d+[\\-\\/]\\d+(?:\\s+\\d+:\\d+(?::\\d+)?(\\s*(?:AM|PM))?)?|\\d+:\\d+(?::\\d+)?(\\s*(?:AM|PM))?)\\s+#)/i],\n         // An identifier.  Keywords can be turned into identifers\n         // with square brackets, and there may be optional type\n         // characters after a normal identifier in square brackets.\n         [PR['PR_PLAIN'], /^(?:(?:[a-z]|_\\w)\\w*(?:\\[[%&@!#]+\\])?|\\[(?:[a-z]|_\\w)\\w*\\])/i],\n         // A run of punctuation\n         [PR['PR_PUNCTUATION'],\n          /^[^\\w\\t\\n\\r \\\"\\'\\[\\]\\xA0\\u2018\\u2019\\u201C\\u201D\\u2028\\u2029]+/],\n         // Square brackets\n         [PR['PR_PUNCTUATION'], /^(?:\\[|\\])/]\n        ]),\n    ['vb', 'vbs']);\n"
  },
  {
    "path": "google-code-prettify/src/lang-vhdl.js",
    "content": "/**\n * @fileoverview\n * Registers a language handler for VHDL '93.\n *\n * Based on the lexical grammar and keywords at\n * http://www.iis.ee.ethz.ch/~zimmi/download/vhdl93_syntax.html\n *\n * @author benoit@ryder.fr\n */\n\nPR['registerLangHandler'](\n    PR['createSimpleLexer'](\n        [\n         // Whitespace\n         [PR['PR_PLAIN'], /^[\\t\\n\\r \\xA0]+/, null, '\\t\\n\\r \\xA0']\n        ],\n        [\n         // String, character or bit string\n         [PR['PR_STRING'], /^(?:[BOX]?\"(?:[^\\\"]|\"\")*\"|'.')/i],\n         // Comment, from two dashes until end of line.\n         [PR['PR_COMMENT'], /^--[^\\r\\n]*/],\n         [PR['PR_KEYWORD'], /^(?:abs|access|after|alias|all|and|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|mod|nand|new|next|nor|not|null|of|on|open|or|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|rem|report|return|rol|ror|select|severity|shared|signal|sla|sll|sra|srl|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with|xnor|xor)(?=[^\\w-]|$)/i, null],\n         // Type, predefined or standard\n         [PR['PR_TYPE'], /^(?:bit|bit_vector|character|boolean|integer|real|time|string|severity_level|positive|natural|signed|unsigned|line|text|std_u?logic(?:_vector)?)(?=[^\\w-]|$)/i, null],\n         // Predefined attributes\n         [PR['PR_TYPE'], /^\\'(?:ACTIVE|ASCENDING|BASE|DELAYED|DRIVING|DRIVING_VALUE|EVENT|HIGH|IMAGE|INSTANCE_NAME|LAST_ACTIVE|LAST_EVENT|LAST_VALUE|LEFT|LEFTOF|LENGTH|LOW|PATH_NAME|POS|PRED|QUIET|RANGE|REVERSE_RANGE|RIGHT|RIGHTOF|SIMPLE_NAME|STABLE|SUCC|TRANSACTION|VAL|VALUE)(?=[^\\w-]|$)/i, null],\n         // Number, decimal or based literal\n         [PR['PR_LITERAL'], /^\\d+(?:_\\d+)*(?:#[\\w\\\\.]+#(?:[+\\-]?\\d+(?:_\\d+)*)?|(?:\\.\\d+(?:_\\d+)*)?(?:E[+\\-]?\\d+(?:_\\d+)*)?)/i],\n         // Identifier, basic or extended\n         [PR['PR_PLAIN'], /^(?:[a-z]\\w*|\\\\[^\\\\]*\\\\)/i],\n         // Punctuation\n         [PR['PR_PUNCTUATION'], /^[^\\w\\t\\n\\r \\xA0\\\"\\'][^\\w\\t\\n\\r \\xA0\\-\\\"\\']*/]\n        ]),\n    ['vhdl', 'vhd']);\n"
  },
  {
    "path": "google-code-prettify/src/lang-wiki.js",
    "content": "// Copyright (C) 2009 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview\n * Registers a language handler for Wiki pages.\n *\n * Based on WikiSyntax at http://code.google.com/p/support/wiki/WikiSyntax\n *\n * @author mikesamuel@gmail.com\n */\n\nPR['registerLangHandler'](\n    PR['createSimpleLexer'](\n        [\n         // Whitespace\n         [PR['PR_PLAIN'],       /^[\\t \\xA0a-gi-z0-9]+/, null,\n          '\\t \\xA0abcdefgijklmnopqrstuvwxyz0123456789'],\n         // Wiki formatting\n         [PR['PR_PUNCTUATION'], /^[=*~\\^\\[\\]]+/, null, '=*~^[]']\n        ],\n        [\n         // Meta-info like #summary, #labels, etc.\n         ['lang-wiki.meta',  /(?:^^|\\r\\n?|\\n)(#[a-z]+)\\b/],\n         // A WikiWord\n         [PR['PR_LITERAL'],     /^(?:[A-Z][a-z][a-z0-9]+[A-Z][a-z][a-zA-Z0-9]+)\\b/\n          ],\n         // A preformatted block in an unknown language\n         ['lang-',           /^\\{\\{\\{([\\s\\S]+?)\\}\\}\\}/],\n         // A block of source code in an unknown language\n         ['lang-',           /^`([^\\r\\n`]+)`/],\n         // An inline URL.\n         [PR['PR_STRING'],\n          /^https?:\\/\\/[^\\/?#\\s]*(?:\\/[^?#\\s]*)?(?:\\?[^#\\s]*)?(?:#\\S*)?/i],\n         [PR['PR_PLAIN'],       /^(?:\\r\\n|[\\s\\S])[^#=*~^A-Zh\\{`\\[\\r\\n]*/]\n        ]),\n    ['wiki']);\n\nPR['registerLangHandler'](\n    PR['createSimpleLexer']([[PR['PR_KEYWORD'], /^#[a-z]+/i, null, '#']], []),\n    ['wiki.meta']);\n"
  },
  {
    "path": "google-code-prettify/src/lang-xq.js",
    "content": "// Copyright (C) 2011 Patrick Wied\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n\n/**\n * @fileoverview\n * Registers a language handler for XQuery.\n *\n * To use, include prettify.js and this file in your HTML page.\n * Then put your code in an HTML tag like\n *      <pre class=\"prettyprint lang-xq\"></pre>\n *\n *\n * @author Patrick Wied ( patpa7p@live.de )\n * @version 2010-09-28\n */\n\n// Falls back to plain for stylesheets that don't style fun.\nvar PR_FUNCTION = 'fun pln';\n// Falls back to plaiin for stylesheets that don't style var.\nvar PR_VARIABLE = 'var pln';\n\nPR['registerLangHandler'](\n    PR['createSimpleLexer'](\n        [\n         // Matching $var-ia_bles\n         [PR_VARIABLE, /^\\$[A-Za-z0-9_\\-]+/, null, \"$\"]\n        ],\n        [\n         // Matching lt and gt operators\n         // Not the best matching solution but you have to differentiate between the gt operator and the tag closing char\n         [PR['PR_PLAIN'], /^[\\s=][<>][\\s=]/],\n         // Matching @Attributes\n         [PR['PR_LITERAL'], /^\\@[\\w-]+/],\n         // Matching xml tags\n         [PR['PR_TAG'], /^<\\/?[a-z](?:[\\w.:-]*\\w)?|\\/?>$/i],\n         // Matching single or multiline xquery comments -> (: <text> :)\n         [PR['PR_COMMENT'], /^\\(:[\\s\\S]*?:\\)/],\n         // Tokenizing /{}:=;*,[]() as plain\n         [PR['PR_PLAIN'], /^[\\/\\{\\};,\\[\\]\\(\\)]$/],\n         // Matching a double or single quoted, possibly multi-line, string.\n         // with the special condition that a { in a string changes to xquery context \n         [PR['PR_STRING'], /^(?:\\\"(?:[^\\\"\\\\\\{]|\\\\[\\s\\S])*(?:\\\"|$)|\\'(?:[^\\'\\\\\\{]|\\\\[\\s\\S])*(?:\\'|$))/, null, '\"\\''],\n         // Matching standard xquery keywords\n         [PR['PR_KEYWORD'], /^(?:xquery|where|version|variable|union|typeswitch|treat|to|then|text|stable|sortby|some|self|schema|satisfies|returns|return|ref|processing-instruction|preceding-sibling|preceding|precedes|parent|only|of|node|namespace|module|let|item|intersect|instance|in|import|if|function|for|follows|following-sibling|following|external|except|every|else|element|descending|descendant-or-self|descendant|define|default|declare|comment|child|cast|case|before|attribute|assert|ascending|as|ancestor-or-self|ancestor|after|eq|order|by|or|and|schema-element|document-node|node|at)\\b/],\n         // Matching standard xquery types\n         [PR['PR_TYPE'], /^(?:xs:yearMonthDuration|xs:unsignedLong|xs:time|xs:string|xs:short|xs:QName|xs:Name|xs:long|xs:integer|xs:int|xs:gYearMonth|xs:gYear|xs:gMonthDay|xs:gDay|xs:float|xs:duration|xs:double|xs:decimal|xs:dayTimeDuration|xs:dateTime|xs:date|xs:byte|xs:boolean|xs:anyURI|xf:yearMonthDuration)\\b/, null],\n         // Matching standard xquery functions\n         [PR_FUNCTION, /^(?:xp:dereference|xinc:node-expand|xinc:link-references|xinc:link-expand|xhtml:restructure|xhtml:clean|xhtml:add-lists|xdmp:zip-manifest|xdmp:zip-get|xdmp:zip-create|xdmp:xquery-version|xdmp:word-convert|xdmp:with-namespaces|xdmp:version|xdmp:value|xdmp:user-roles|xdmp:user-last-login|xdmp:user|xdmp:url-encode|xdmp:url-decode|xdmp:uri-is-file|xdmp:uri-format|xdmp:uri-content-type|xdmp:unquote|xdmp:unpath|xdmp:triggers-database|xdmp:trace|xdmp:to-json|xdmp:tidy|xdmp:subbinary|xdmp:strftime|xdmp:spawn-in|xdmp:spawn|xdmp:sleep|xdmp:shutdown|xdmp:set-session-field|xdmp:set-response-encoding|xdmp:set-response-content-type|xdmp:set-response-code|xdmp:set-request-time-limit|xdmp:set|xdmp:servers|xdmp:server-status|xdmp:server-name|xdmp:server|xdmp:security-database|xdmp:security-assert|xdmp:schema-database|xdmp:save|xdmp:role-roles|xdmp:role|xdmp:rethrow|xdmp:restart|xdmp:request-timestamp|xdmp:request-status|xdmp:request-cancel|xdmp:request|xdmp:redirect-response|xdmp:random|xdmp:quote|xdmp:query-trace|xdmp:query-meters|xdmp:product-edition|xdmp:privilege-roles|xdmp:privilege|xdmp:pretty-print|xdmp:powerpoint-convert|xdmp:platform|xdmp:permission|xdmp:pdf-convert|xdmp:path|xdmp:octal-to-integer|xdmp:node-uri|xdmp:node-replace|xdmp:node-kind|xdmp:node-insert-child|xdmp:node-insert-before|xdmp:node-insert-after|xdmp:node-delete|xdmp:node-database|xdmp:mul64|xdmp:modules-root|xdmp:modules-database|xdmp:merging|xdmp:merge-cancel|xdmp:merge|xdmp:md5|xdmp:logout|xdmp:login|xdmp:log-level|xdmp:log|xdmp:lock-release|xdmp:lock-acquire|xdmp:load|xdmp:invoke-in|xdmp:invoke|xdmp:integer-to-octal|xdmp:integer-to-hex|xdmp:http-put|xdmp:http-post|xdmp:http-options|xdmp:http-head|xdmp:http-get|xdmp:http-delete|xdmp:hosts|xdmp:host-status|xdmp:host-name|xdmp:host|xdmp:hex-to-integer|xdmp:hash64|xdmp:hash32|xdmp:has-privilege|xdmp:groups|xdmp:group-serves|xdmp:group-servers|xdmp:group-name|xdmp:group-hosts|xdmp:group|xdmp:get-session-field-names|xdmp:get-session-field|xdmp:get-response-encoding|xdmp:get-response-code|xdmp:get-request-username|xdmp:get-request-user|xdmp:get-request-url|xdmp:get-request-protocol|xdmp:get-request-path|xdmp:get-request-method|xdmp:get-request-header-names|xdmp:get-request-header|xdmp:get-request-field-names|xdmp:get-request-field-filename|xdmp:get-request-field-content-type|xdmp:get-request-field|xdmp:get-request-client-certificate|xdmp:get-request-client-address|xdmp:get-request-body|xdmp:get-current-user|xdmp:get-current-roles|xdmp:get|xdmp:function-name|xdmp:function-module|xdmp:function|xdmp:from-json|xdmp:forests|xdmp:forest-status|xdmp:forest-restore|xdmp:forest-restart|xdmp:forest-name|xdmp:forest-delete|xdmp:forest-databases|xdmp:forest-counts|xdmp:forest-clear|xdmp:forest-backup|xdmp:forest|xdmp:filesystem-file|xdmp:filesystem-directory|xdmp:exists|xdmp:excel-convert|xdmp:eval-in|xdmp:eval|xdmp:estimate|xdmp:email|xdmp:element-content-type|xdmp:elapsed-time|xdmp:document-set-quality|xdmp:document-set-property|xdmp:document-set-properties|xdmp:document-set-permissions|xdmp:document-set-collections|xdmp:document-remove-properties|xdmp:document-remove-permissions|xdmp:document-remove-collections|xdmp:document-properties|xdmp:document-locks|xdmp:document-load|xdmp:document-insert|xdmp:document-get-quality|xdmp:document-get-properties|xdmp:document-get-permissions|xdmp:document-get-collections|xdmp:document-get|xdmp:document-forest|xdmp:document-delete|xdmp:document-add-properties|xdmp:document-add-permissions|xdmp:document-add-collections|xdmp:directory-properties|xdmp:directory-locks|xdmp:directory-delete|xdmp:directory-create|xdmp:directory|xdmp:diacritic-less|xdmp:describe|xdmp:default-permissions|xdmp:default-collections|xdmp:databases|xdmp:database-restore-validate|xdmp:database-restore-status|xdmp:database-restore-cancel|xdmp:database-restore|xdmp:database-name|xdmp:database-forests|xdmp:database-backup-validate|xdmp:database-backup-status|xdmp:database-backup-purge|xdmp:database-backup-cancel|xdmp:database-backup|xdmp:database|xdmp:collection-properties|xdmp:collection-locks|xdmp:collection-delete|xdmp:collation-canonical-uri|xdmp:castable-as|xdmp:can-grant-roles|xdmp:base64-encode|xdmp:base64-decode|xdmp:architecture|xdmp:apply|xdmp:amp-roles|xdmp:amp|xdmp:add64|xdmp:add-response-header|xdmp:access|trgr:trigger-set-recursive|trgr:trigger-set-permissions|trgr:trigger-set-name|trgr:trigger-set-module|trgr:trigger-set-event|trgr:trigger-set-description|trgr:trigger-remove-permissions|trgr:trigger-module|trgr:trigger-get-permissions|trgr:trigger-enable|trgr:trigger-disable|trgr:trigger-database-online-event|trgr:trigger-data-event|trgr:trigger-add-permissions|trgr:remove-trigger|trgr:property-content|trgr:pre-commit|trgr:post-commit|trgr:get-trigger-by-id|trgr:get-trigger|trgr:document-scope|trgr:document-content|trgr:directory-scope|trgr:create-trigger|trgr:collection-scope|trgr:any-property-content|thsr:set-entry|thsr:remove-term|thsr:remove-synonym|thsr:remove-entry|thsr:query-lookup|thsr:lookup|thsr:load|thsr:insert|thsr:expand|thsr:add-synonym|spell:suggest-detailed|spell:suggest|spell:remove-word|spell:make-dictionary|spell:load|spell:levenshtein-distance|spell:is-correct|spell:insert|spell:double-metaphone|spell:add-word|sec:users-collection|sec:user-set-roles|sec:user-set-password|sec:user-set-name|sec:user-set-description|sec:user-set-default-permissions|sec:user-set-default-collections|sec:user-remove-roles|sec:user-privileges|sec:user-get-roles|sec:user-get-description|sec:user-get-default-permissions|sec:user-get-default-collections|sec:user-doc-permissions|sec:user-doc-collections|sec:user-add-roles|sec:unprotect-collection|sec:uid-for-name|sec:set-realm|sec:security-version|sec:security-namespace|sec:security-installed|sec:security-collection|sec:roles-collection|sec:role-set-roles|sec:role-set-name|sec:role-set-description|sec:role-set-default-permissions|sec:role-set-default-collections|sec:role-remove-roles|sec:role-privileges|sec:role-get-roles|sec:role-get-description|sec:role-get-default-permissions|sec:role-get-default-collections|sec:role-doc-permissions|sec:role-doc-collections|sec:role-add-roles|sec:remove-user|sec:remove-role-from-users|sec:remove-role-from-role|sec:remove-role-from-privileges|sec:remove-role-from-amps|sec:remove-role|sec:remove-privilege|sec:remove-amp|sec:protect-collection|sec:privileges-collection|sec:privilege-set-roles|sec:privilege-set-name|sec:privilege-remove-roles|sec:privilege-get-roles|sec:privilege-add-roles|sec:priv-doc-permissions|sec:priv-doc-collections|sec:get-user-names|sec:get-unique-elem-id|sec:get-role-names|sec:get-role-ids|sec:get-privilege|sec:get-distinct-permissions|sec:get-collection|sec:get-amp|sec:create-user-with-role|sec:create-user|sec:create-role|sec:create-privilege|sec:create-amp|sec:collections-collection|sec:collection-set-permissions|sec:collection-remove-permissions|sec:collection-get-permissions|sec:collection-add-permissions|sec:check-admin|sec:amps-collection|sec:amp-set-roles|sec:amp-remove-roles|sec:amp-get-roles|sec:amp-doc-permissions|sec:amp-doc-collections|sec:amp-add-roles|search:unparse|search:suggest|search:snippet|search:search|search:resolve-nodes|search:resolve|search:remove-constraint|search:parse|search:get-default-options|search:estimate|search:check-options|prof:value|prof:reset|prof:report|prof:invoke|prof:eval|prof:enable|prof:disable|prof:allowed|ppt:clean|pki:template-set-request|pki:template-set-name|pki:template-set-key-type|pki:template-set-key-options|pki:template-set-description|pki:template-in-use|pki:template-get-version|pki:template-get-request|pki:template-get-name|pki:template-get-key-type|pki:template-get-key-options|pki:template-get-id|pki:template-get-description|pki:need-certificate|pki:is-temporary|pki:insert-trusted-certificates|pki:insert-template|pki:insert-signed-certificates|pki:insert-certificate-revocation-list|pki:get-trusted-certificate-ids|pki:get-template-ids|pki:get-template-certificate-authority|pki:get-template-by-name|pki:get-template|pki:get-pending-certificate-requests-xml|pki:get-pending-certificate-requests-pem|pki:get-pending-certificate-request|pki:get-certificates-for-template-xml|pki:get-certificates-for-template|pki:get-certificates|pki:get-certificate-xml|pki:get-certificate-pem|pki:get-certificate|pki:generate-temporary-certificate-if-necessary|pki:generate-temporary-certificate|pki:generate-template-certificate-authority|pki:generate-certificate-request|pki:delete-template|pki:delete-certificate|pki:create-template|pdf:make-toc|pdf:insert-toc-headers|pdf:get-toc|pdf:clean|p:status-transition|p:state-transition|p:remove|p:pipelines|p:insert|p:get-by-id|p:get|p:execute|p:create|p:condition|p:collection|p:action|ooxml:runs-merge|ooxml:package-uris|ooxml:package-parts-insert|ooxml:package-parts|msword:clean|mcgm:polygon|mcgm:point|mcgm:geospatial-query-from-elements|mcgm:geospatial-query|mcgm:circle|math:tanh|math:tan|math:sqrt|math:sinh|math:sin|math:pow|math:modf|math:log10|math:log|math:ldexp|math:frexp|math:fmod|math:floor|math:fabs|math:exp|math:cosh|math:cos|math:ceil|math:atan2|math:atan|math:asin|math:acos|map:put|map:map|map:keys|map:get|map:delete|map:count|map:clear|lnk:to|lnk:remove|lnk:insert|lnk:get|lnk:from|lnk:create|kml:polygon|kml:point|kml:interior-polygon|kml:geospatial-query-from-elements|kml:geospatial-query|kml:circle|kml:box|gml:polygon|gml:point|gml:interior-polygon|gml:geospatial-query-from-elements|gml:geospatial-query|gml:circle|gml:box|georss:point|georss:geospatial-query|georss:circle|geo:polygon|geo:point|geo:interior-polygon|geo:geospatial-query-from-elements|geo:geospatial-query|geo:circle|geo:box|fn:zero-or-one|fn:years-from-duration|fn:year-from-dateTime|fn:year-from-date|fn:upper-case|fn:unordered|fn:true|fn:translate|fn:trace|fn:tokenize|fn:timezone-from-time|fn:timezone-from-dateTime|fn:timezone-from-date|fn:sum|fn:subtract-dateTimes-yielding-yearMonthDuration|fn:subtract-dateTimes-yielding-dayTimeDuration|fn:substring-before|fn:substring-after|fn:substring|fn:subsequence|fn:string-to-codepoints|fn:string-pad|fn:string-length|fn:string-join|fn:string|fn:static-base-uri|fn:starts-with|fn:seconds-from-time|fn:seconds-from-duration|fn:seconds-from-dateTime|fn:round-half-to-even|fn:round|fn:root|fn:reverse|fn:resolve-uri|fn:resolve-QName|fn:replace|fn:remove|fn:QName|fn:prefix-from-QName|fn:position|fn:one-or-more|fn:number|fn:not|fn:normalize-unicode|fn:normalize-space|fn:node-name|fn:node-kind|fn:nilled|fn:namespace-uri-from-QName|fn:namespace-uri-for-prefix|fn:namespace-uri|fn:name|fn:months-from-duration|fn:month-from-dateTime|fn:month-from-date|fn:minutes-from-time|fn:minutes-from-duration|fn:minutes-from-dateTime|fn:min|fn:max|fn:matches|fn:lower-case|fn:local-name-from-QName|fn:local-name|fn:last|fn:lang|fn:iri-to-uri|fn:insert-before|fn:index-of|fn:in-scope-prefixes|fn:implicit-timezone|fn:idref|fn:id|fn:hours-from-time|fn:hours-from-duration|fn:hours-from-dateTime|fn:floor|fn:false|fn:expanded-QName|fn:exists|fn:exactly-one|fn:escape-uri|fn:escape-html-uri|fn:error|fn:ends-with|fn:encode-for-uri|fn:empty|fn:document-uri|fn:doc-available|fn:doc|fn:distinct-values|fn:distinct-nodes|fn:default-collation|fn:deep-equal|fn:days-from-duration|fn:day-from-dateTime|fn:day-from-date|fn:data|fn:current-time|fn:current-dateTime|fn:current-date|fn:count|fn:contains|fn:concat|fn:compare|fn:collection|fn:codepoints-to-string|fn:codepoint-equal|fn:ceiling|fn:boolean|fn:base-uri|fn:avg|fn:adjust-time-to-timezone|fn:adjust-dateTime-to-timezone|fn:adjust-date-to-timezone|fn:abs|feed:unsubscribe|feed:subscription|feed:subscribe|feed:request|feed:item|feed:description|excel:clean|entity:enrich|dom:set-pipelines|dom:set-permissions|dom:set-name|dom:set-evaluation-context|dom:set-domain-scope|dom:set-description|dom:remove-pipeline|dom:remove-permissions|dom:remove|dom:get|dom:evaluation-context|dom:domains|dom:domain-scope|dom:create|dom:configuration-set-restart-user|dom:configuration-set-permissions|dom:configuration-set-evaluation-context|dom:configuration-set-default-domain|dom:configuration-get|dom:configuration-create|dom:collection|dom:add-pipeline|dom:add-permissions|dls:retention-rules|dls:retention-rule-remove|dls:retention-rule-insert|dls:retention-rule|dls:purge|dls:node-expand|dls:link-references|dls:link-expand|dls:documents-query|dls:document-versions-query|dls:document-version-uri|dls:document-version-query|dls:document-version-delete|dls:document-version-as-of|dls:document-version|dls:document-update|dls:document-unmanage|dls:document-set-quality|dls:document-set-property|dls:document-set-properties|dls:document-set-permissions|dls:document-set-collections|dls:document-retention-rules|dls:document-remove-properties|dls:document-remove-permissions|dls:document-remove-collections|dls:document-purge|dls:document-manage|dls:document-is-managed|dls:document-insert-and-manage|dls:document-include-query|dls:document-history|dls:document-get-permissions|dls:document-extract-part|dls:document-delete|dls:document-checkout-status|dls:document-checkout|dls:document-checkin|dls:document-add-properties|dls:document-add-permissions|dls:document-add-collections|dls:break-checkout|dls:author-query|dls:as-of-query|dbk:convert|dbg:wait|dbg:value|dbg:stopped|dbg:stop|dbg:step|dbg:status|dbg:stack|dbg:out|dbg:next|dbg:line|dbg:invoke|dbg:function|dbg:finish|dbg:expr|dbg:eval|dbg:disconnect|dbg:detach|dbg:continue|dbg:connect|dbg:clear|dbg:breakpoints|dbg:break|dbg:attached|dbg:attach|cvt:save-converted-documents|cvt:part-uri|cvt:destination-uri|cvt:basepath|cvt:basename|cts:words|cts:word-query-weight|cts:word-query-text|cts:word-query-options|cts:word-query|cts:word-match|cts:walk|cts:uris|cts:uri-match|cts:train|cts:tokenize|cts:thresholds|cts:stem|cts:similar-query-weight|cts:similar-query-nodes|cts:similar-query|cts:shortest-distance|cts:search|cts:score|cts:reverse-query-weight|cts:reverse-query-nodes|cts:reverse-query|cts:remainder|cts:registered-query-weight|cts:registered-query-options|cts:registered-query-ids|cts:registered-query|cts:register|cts:query|cts:quality|cts:properties-query-query|cts:properties-query|cts:polygon-vertices|cts:polygon|cts:point-longitude|cts:point-latitude|cts:point|cts:or-query-queries|cts:or-query|cts:not-query-weight|cts:not-query-query|cts:not-query|cts:near-query-weight|cts:near-query-queries|cts:near-query-options|cts:near-query-distance|cts:near-query|cts:highlight|cts:geospatial-co-occurrences|cts:frequency|cts:fitness|cts:field-words|cts:field-word-query-weight|cts:field-word-query-text|cts:field-word-query-options|cts:field-word-query-field-name|cts:field-word-query|cts:field-word-match|cts:entity-highlight|cts:element-words|cts:element-word-query-weight|cts:element-word-query-text|cts:element-word-query-options|cts:element-word-query-element-name|cts:element-word-query|cts:element-word-match|cts:element-values|cts:element-value-ranges|cts:element-value-query-weight|cts:element-value-query-text|cts:element-value-query-options|cts:element-value-query-element-name|cts:element-value-query|cts:element-value-match|cts:element-value-geospatial-co-occurrences|cts:element-value-co-occurrences|cts:element-range-query-weight|cts:element-range-query-value|cts:element-range-query-options|cts:element-range-query-operator|cts:element-range-query-element-name|cts:element-range-query|cts:element-query-query|cts:element-query-element-name|cts:element-query|cts:element-pair-geospatial-values|cts:element-pair-geospatial-value-match|cts:element-pair-geospatial-query-weight|cts:element-pair-geospatial-query-region|cts:element-pair-geospatial-query-options|cts:element-pair-geospatial-query-longitude-name|cts:element-pair-geospatial-query-latitude-name|cts:element-pair-geospatial-query-element-name|cts:element-pair-geospatial-query|cts:element-pair-geospatial-boxes|cts:element-geospatial-values|cts:element-geospatial-value-match|cts:element-geospatial-query-weight|cts:element-geospatial-query-region|cts:element-geospatial-query-options|cts:element-geospatial-query-element-name|cts:element-geospatial-query|cts:element-geospatial-boxes|cts:element-child-geospatial-values|cts:element-child-geospatial-value-match|cts:element-child-geospatial-query-weight|cts:element-child-geospatial-query-region|cts:element-child-geospatial-query-options|cts:element-child-geospatial-query-element-name|cts:element-child-geospatial-query-child-name|cts:element-child-geospatial-query|cts:element-child-geospatial-boxes|cts:element-attribute-words|cts:element-attribute-word-query-weight|cts:element-attribute-word-query-text|cts:element-attribute-word-query-options|cts:element-attribute-word-query-element-name|cts:element-attribute-word-query-attribute-name|cts:element-attribute-word-query|cts:element-attribute-word-match|cts:element-attribute-values|cts:element-attribute-value-ranges|cts:element-attribute-value-query-weight|cts:element-attribute-value-query-text|cts:element-attribute-value-query-options|cts:element-attribute-value-query-element-name|cts:element-attribute-value-query-attribute-name|cts:element-attribute-value-query|cts:element-attribute-value-match|cts:element-attribute-value-geospatial-co-occurrences|cts:element-attribute-value-co-occurrences|cts:element-attribute-range-query-weight|cts:element-attribute-range-query-value|cts:element-attribute-range-query-options|cts:element-attribute-range-query-operator|cts:element-attribute-range-query-element-name|cts:element-attribute-range-query-attribute-name|cts:element-attribute-range-query|cts:element-attribute-pair-geospatial-values|cts:element-attribute-pair-geospatial-value-match|cts:element-attribute-pair-geospatial-query-weight|cts:element-attribute-pair-geospatial-query-region|cts:element-attribute-pair-geospatial-query-options|cts:element-attribute-pair-geospatial-query-longitude-name|cts:element-attribute-pair-geospatial-query-latitude-name|cts:element-attribute-pair-geospatial-query-element-name|cts:element-attribute-pair-geospatial-query|cts:element-attribute-pair-geospatial-boxes|cts:document-query-uris|cts:document-query|cts:distance|cts:directory-query-uris|cts:directory-query-depth|cts:directory-query|cts:destination|cts:deregister|cts:contains|cts:confidence|cts:collections|cts:collection-query-uris|cts:collection-query|cts:collection-match|cts:classify|cts:circle-radius|cts:circle-center|cts:circle|cts:box-west|cts:box-south|cts:box-north|cts:box-east|cts:box|cts:bearing|cts:arc-intersection|cts:and-query-queries|cts:and-query-options|cts:and-query|cts:and-not-query-positive-query|cts:and-not-query-negative-query|cts:and-not-query|css:get|css:convert|cpf:success|cpf:failure|cpf:document-set-state|cpf:document-set-processing-status|cpf:document-set-last-updated|cpf:document-set-error|cpf:document-get-state|cpf:document-get-processing-status|cpf:document-get-last-updated|cpf:document-get-error|cpf:check-transition|alert:spawn-matching-actions|alert:rule-user-id-query|alert:rule-set-user-id|alert:rule-set-query|alert:rule-set-options|alert:rule-set-name|alert:rule-set-description|alert:rule-set-action|alert:rule-remove|alert:rule-name-query|alert:rule-insert|alert:rule-id-query|alert:rule-get-user-id|alert:rule-get-query|alert:rule-get-options|alert:rule-get-name|alert:rule-get-id|alert:rule-get-description|alert:rule-get-action|alert:rule-action-query|alert:remove-triggers|alert:make-rule|alert:make-log-action|alert:make-config|alert:make-action|alert:invoke-matching-actions|alert:get-my-rules|alert:get-all-rules|alert:get-actions|alert:find-matching-rules|alert:create-triggers|alert:config-set-uri|alert:config-set-trigger-ids|alert:config-set-options|alert:config-set-name|alert:config-set-description|alert:config-set-cpf-domain-names|alert:config-set-cpf-domain-ids|alert:config-insert|alert:config-get-uri|alert:config-get-trigger-ids|alert:config-get-options|alert:config-get-name|alert:config-get-id|alert:config-get-description|alert:config-get-cpf-domain-names|alert:config-get-cpf-domain-ids|alert:config-get|alert:config-delete|alert:action-set-options|alert:action-set-name|alert:action-set-module-root|alert:action-set-module-db|alert:action-set-module|alert:action-set-description|alert:action-remove|alert:action-insert|alert:action-get-options|alert:action-get-name|alert:action-get-module-root|alert:action-get-module-db|alert:action-get-module|alert:action-get-description|zero-or-one|years-from-duration|year-from-dateTime|year-from-date|upper-case|unordered|true|translate|trace|tokenize|timezone-from-time|timezone-from-dateTime|timezone-from-date|sum|subtract-dateTimes-yielding-yearMonthDuration|subtract-dateTimes-yielding-dayTimeDuration|substring-before|substring-after|substring|subsequence|string-to-codepoints|string-pad|string-length|string-join|string|static-base-uri|starts-with|seconds-from-time|seconds-from-duration|seconds-from-dateTime|round-half-to-even|round|root|reverse|resolve-uri|resolve-QName|replace|remove|QName|prefix-from-QName|position|one-or-more|number|not|normalize-unicode|normalize-space|node-name|node-kind|nilled|namespace-uri-from-QName|namespace-uri-for-prefix|namespace-uri|name|months-from-duration|month-from-dateTime|month-from-date|minutes-from-time|minutes-from-duration|minutes-from-dateTime|min|max|matches|lower-case|local-name-from-QName|local-name|last|lang|iri-to-uri|insert-before|index-of|in-scope-prefixes|implicit-timezone|idref|id|hours-from-time|hours-from-duration|hours-from-dateTime|floor|false|expanded-QName|exists|exactly-one|escape-uri|escape-html-uri|error|ends-with|encode-for-uri|empty|document-uri|doc-available|doc|distinct-values|distinct-nodes|default-collation|deep-equal|days-from-duration|day-from-dateTime|day-from-date|data|current-time|current-dateTime|current-date|count|contains|concat|compare|collection|codepoints-to-string|codepoint-equal|ceiling|boolean|base-uri|avg|adjust-time-to-timezone|adjust-dateTime-to-timezone|adjust-date-to-timezone|abs)\\b/],\n         // Matching normal words if none of the previous regular expressions matched\n         [PR['PR_PLAIN'], /^[A-Za-z0-9_\\-\\:]+/],\n         // Matching whitespaces\n         [PR['PR_PLAIN'], /^[\\t\\n\\r \\xA0]+/]\n         ]),\n    ['xq', 'xquery']);\n"
  },
  {
    "path": "google-code-prettify/src/lang-yaml.js",
    "content": "// Contributed by ribrdb @ code.google.com\n\n/**\n * @fileoverview\n * Registers a language handler for YAML.\n *\n * @author ribrdb\n */\n\nPR['registerLangHandler'](\n  PR['createSimpleLexer'](\n    [\n      [PR['PR_PUNCTUATION'], /^[:|>?]+/, null, ':|>?'],\n      [PR['PR_DECLARATION'],  /^%(?:YAML|TAG)[^#\\r\\n]+/, null, '%'],\n      [PR['PR_TYPE'], /^[&]\\S+/, null, '&'],\n      [PR['PR_TYPE'], /^!\\S*/, null, '!'],\n      [PR['PR_STRING'], /^\"(?:[^\\\\\"]|\\\\.)*(?:\"|$)/, null, '\"'],\n      [PR['PR_STRING'], /^'(?:[^']|'')*(?:'|$)/, null, \"'\"],\n      [PR['PR_COMMENT'], /^#[^\\r\\n]*/, null, '#'],\n      [PR['PR_PLAIN'], /^\\s+/, null, ' \\t\\r\\n']\n    ],\n    [\n      [PR['PR_DECLARATION'], /^(?:---|\\.\\.\\.)(?:[\\r\\n]|$)/],\n      [PR['PR_PUNCTUATION'], /^-/],\n      [PR['PR_KEYWORD'], /^\\w+:[ \\r\\n]/],\n      [PR['PR_PLAIN'], /^\\w+/]\n    ]), ['yaml', 'yml']);\n"
  },
  {
    "path": "google-code-prettify/src/prettify.css",
    "content": "/* Pretty printing styles. Used with prettify.js. */\n\n/* SPAN elements with the classes below are added by prettyprint. */\n.pln { color: #000 }  /* plain text */\n\n@media screen {\n  .str { color: #080 }  /* string content */\n  .kwd { color: #008 }  /* a keyword */\n  .com { color: #800 }  /* a comment */\n  .typ { color: #606 }  /* a type name */\n  .lit { color: #066 }  /* a literal value */\n  /* punctuation, lisp open bracket, lisp close bracket */\n  .pun, .opn, .clo { color: #660 }\n  .tag { color: #008 }  /* a markup tag name */\n  .atn { color: #606 }  /* a markup attribute name */\n  .atv { color: #080 }  /* a markup attribute value */\n  .dec, .var { color: #606 }  /* a declaration; a variable name */\n  .fun { color: red }  /* a function name */\n}\n\n/* Use higher contrast and text-weight for printable form. */\n@media print, projection {\n  .str { color: #060 }\n  .kwd { color: #006; font-weight: bold }\n  .com { color: #600; font-style: italic }\n  .typ { color: #404; font-weight: bold }\n  .lit { color: #044 }\n  .pun, .opn, .clo { color: #440 }\n  .tag { color: #006; font-weight: bold }\n  .atn { color: #404 }\n  .atv { color: #060 }\n}\n\n/* Put a border around prettyprinted code snippets. */\npre.prettyprint { padding: 2px; border: 1px solid #888 }\n\n/* Specify class=linenums on a pre to get line numbering */\nol.linenums { margin-top: 0; margin-bottom: 0 } /* IE indents via margin-left */\nli.L0,\nli.L1,\nli.L2,\nli.L3,\nli.L5,\nli.L6,\nli.L7,\nli.L8 { list-style-type: none }\n/* Alternate shading for lines */\nli.L1,\nli.L3,\nli.L5,\nli.L7,\nli.L9 { background: #eee }\n"
  },
  {
    "path": "google-code-prettify/src/prettify.js",
    "content": "// Copyright (C) 2006 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview\n * some functions for browser-side pretty printing of code contained in html.\n *\n * <p>\n * For a fairly comprehensive set of languages see the\n * <a href=\"http://google-code-prettify.googlecode.com/svn/trunk/README.html#langs\">README</a>\n * file that came with this source.  At a minimum, the lexer should work on a\n * number of languages including C and friends, Java, Python, Bash, SQL, HTML,\n * XML, CSS, Javascript, and Makefiles.  It works passably on Ruby, PHP and Awk\n * and a subset of Perl, but, because of commenting conventions, doesn't work on\n * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class.\n * <p>\n * Usage: <ol>\n * <li> include this source file in an html page via\n *   {@code <script type=\"text/javascript\" src=\"/path/to/prettify.js\"></script>}\n * <li> define style rules.  See the example page for examples.\n * <li> mark the {@code <pre>} and {@code <code>} tags in your source with\n *    {@code class=prettyprint.}\n *    You can also use the (html deprecated) {@code <xmp>} tag, but the pretty\n *    printer needs to do more substantial DOM manipulations to support that, so\n *    some css styles may not be preserved.\n * </ol>\n * That's it.  I wanted to keep the API as simple as possible, so there's no\n * need to specify which language the code is in, but if you wish, you can add\n * another class to the {@code <pre>} or {@code <code>} element to specify the\n * language, as in {@code <pre class=\"prettyprint lang-java\">}.  Any class that\n * starts with \"lang-\" followed by a file extension, specifies the file type.\n * See the \"lang-*.js\" files in this directory for code that implements\n * per-language file handlers.\n * <p>\n * Change log:<br>\n * cbeust, 2006/08/22\n * <blockquote>\n *   Java annotations (start with \"@\") are now captured as literals (\"lit\")\n * </blockquote>\n * @requires console\n */\n\n// JSLint declarations\n/*global console, document, navigator, setTimeout, window, define */\n\n/** @define {boolean} */\nvar IN_GLOBAL_SCOPE = true;\n\n/**\n * Split {@code prettyPrint} into multiple timeouts so as not to interfere with\n * UI events.\n * If set to {@code false}, {@code prettyPrint()} is synchronous.\n */\nwindow['PR_SHOULD_USE_CONTINUATION'] = true;\n\n/**\n * Pretty print a chunk of code.\n * @param {string} sourceCodeHtml The HTML to pretty print.\n * @param {string} opt_langExtension The language name to use.\n *     Typically, a filename extension like 'cpp' or 'java'.\n * @param {number|boolean} opt_numberLines True to number lines,\n *     or the 1-indexed number of the first line in sourceCodeHtml.\n * @return {string} code as html, but prettier\n */\nvar prettyPrintOne;\n/**\n * Find all the {@code <pre>} and {@code <code>} tags in the DOM with\n * {@code class=prettyprint} and prettify them.\n *\n * @param {Function} opt_whenDone called when prettifying is done.\n * @param {HTMLElement|HTMLDocument} opt_root an element or document\n *   containing all the elements to pretty print.\n *   Defaults to {@code document.body}.\n */\nvar prettyPrint;\n\n\n(function () {\n  var win = window;\n  // Keyword lists for various languages.\n  // We use things that coerce to strings to make them compact when minified\n  // and to defeat aggressive optimizers that fold large string constants.\n  var FLOW_CONTROL_KEYWORDS = [\"break,continue,do,else,for,if,return,while\"];\n  var C_KEYWORDS = [FLOW_CONTROL_KEYWORDS,\"auto,case,char,const,default,\" + \n      \"double,enum,extern,float,goto,inline,int,long,register,short,signed,\" +\n      \"sizeof,static,struct,switch,typedef,union,unsigned,void,volatile\"];\n  var COMMON_KEYWORDS = [C_KEYWORDS,\"catch,class,delete,false,import,\" +\n      \"new,operator,private,protected,public,this,throw,true,try,typeof\"];\n  var CPP_KEYWORDS = [COMMON_KEYWORDS,\"alignof,align_union,asm,axiom,bool,\" +\n      \"concept,concept_map,const_cast,constexpr,decltype,delegate,\" +\n      \"dynamic_cast,explicit,export,friend,generic,late_check,\" +\n      \"mutable,namespace,nullptr,property,reinterpret_cast,static_assert,\" +\n      \"static_cast,template,typeid,typename,using,virtual,where\"];\n  var JAVA_KEYWORDS = [COMMON_KEYWORDS,\n      \"abstract,assert,boolean,byte,extends,final,finally,implements,import,\" +\n      \"instanceof,interface,null,native,package,strictfp,super,synchronized,\" +\n      \"throws,transient\"];\n  var CSHARP_KEYWORDS = [JAVA_KEYWORDS,\n      \"as,base,by,checked,decimal,delegate,descending,dynamic,event,\" +\n      \"fixed,foreach,from,group,implicit,in,internal,into,is,let,\" +\n      \"lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,\" +\n      \"sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,\" +\n      \"var,virtual,where\"];\n  var COFFEE_KEYWORDS = \"all,and,by,catch,class,else,extends,false,finally,\" +\n      \"for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,\" +\n      \"throw,true,try,unless,until,when,while,yes\";\n  var JSCRIPT_KEYWORDS = [COMMON_KEYWORDS,\n      \"debugger,eval,export,function,get,null,set,undefined,var,with,\" +\n      \"Infinity,NaN\"];\n  var PERL_KEYWORDS = \"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,\" +\n      \"goto,if,import,last,local,my,next,no,our,print,package,redo,require,\" +\n      \"sub,undef,unless,until,use,wantarray,while,BEGIN,END\";\n  var PYTHON_KEYWORDS = [FLOW_CONTROL_KEYWORDS, \"and,as,assert,class,def,del,\" +\n      \"elif,except,exec,finally,from,global,import,in,is,lambda,\" +\n      \"nonlocal,not,or,pass,print,raise,try,with,yield,\" +\n      \"False,True,None\"];\n  var RUBY_KEYWORDS = [FLOW_CONTROL_KEYWORDS, \"alias,and,begin,case,class,\" +\n      \"def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,\" +\n      \"rescue,retry,self,super,then,true,undef,unless,until,when,yield,\" +\n      \"BEGIN,END\"];\n   var RUST_KEYWORDS = [FLOW_CONTROL_KEYWORDS, \"as,assert,const,copy,drop,\" +\n      \"enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,\" +\n      \"pub,pure,ref,self,static,struct,true,trait,type,unsafe,use\"];\n  var SH_KEYWORDS = [FLOW_CONTROL_KEYWORDS, \"case,done,elif,esac,eval,fi,\" +\n      \"function,in,local,set,then,until\"];\n  var ALL_KEYWORDS = [\n      CPP_KEYWORDS, CSHARP_KEYWORDS, JSCRIPT_KEYWORDS, PERL_KEYWORDS,\n      PYTHON_KEYWORDS, RUBY_KEYWORDS, SH_KEYWORDS];\n  var C_TYPES = /^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\\d*)\\b/;\n\n  // token style names.  correspond to css classes\n  /**\n   * token style for a string literal\n   * @const\n   */\n  var PR_STRING = 'str';\n  /**\n   * token style for a keyword\n   * @const\n   */\n  var PR_KEYWORD = 'kwd';\n  /**\n   * token style for a comment\n   * @const\n   */\n  var PR_COMMENT = 'com';\n  /**\n   * token style for a type\n   * @const\n   */\n  var PR_TYPE = 'typ';\n  /**\n   * token style for a literal value.  e.g. 1, null, true.\n   * @const\n   */\n  var PR_LITERAL = 'lit';\n  /**\n   * token style for a punctuation string.\n   * @const\n   */\n  var PR_PUNCTUATION = 'pun';\n  /**\n   * token style for plain text.\n   * @const\n   */\n  var PR_PLAIN = 'pln';\n\n  /**\n   * token style for an sgml tag.\n   * @const\n   */\n  var PR_TAG = 'tag';\n  /**\n   * token style for a markup declaration such as a DOCTYPE.\n   * @const\n   */\n  var PR_DECLARATION = 'dec';\n  /**\n   * token style for embedded source.\n   * @const\n   */\n  var PR_SOURCE = 'src';\n  /**\n   * token style for an sgml attribute name.\n   * @const\n   */\n  var PR_ATTRIB_NAME = 'atn';\n  /**\n   * token style for an sgml attribute value.\n   * @const\n   */\n  var PR_ATTRIB_VALUE = 'atv';\n\n  /**\n   * A class that indicates a section of markup that is not code, e.g. to allow\n   * embedding of line numbers within code listings.\n   * @const\n   */\n  var PR_NOCODE = 'nocode';\n\n  \n  \n  /**\n   * A set of tokens that can precede a regular expression literal in\n   * javascript\n   * http://web.archive.org/web/20070717142515/http://www.mozilla.org/js/language/js20/rationale/syntax.html\n   * has the full list, but I've removed ones that might be problematic when\n   * seen in languages that don't support regular expression literals.\n   *\n   * <p>Specifically, I've removed any keywords that can't precede a regexp\n   * literal in a syntactically legal javascript program, and I've removed the\n   * \"in\" keyword since it's not a keyword in many languages, and might be used\n   * as a count of inches.\n   *\n   * <p>The link above does not accurately describe EcmaScript rules since\n   * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works\n   * very well in practice.\n   *\n   * @private\n   * @const\n   */\n  var REGEXP_PRECEDER_PATTERN = '(?:^^\\\\.?|[+-]|[!=]=?=?|\\\\#|%=?|&&?=?|\\\\(|\\\\*=?|[+\\\\-]=|->|\\\\/=?|::?|<<?=?|>>?>?=?|,|;|\\\\?|@|\\\\[|~|{|\\\\^\\\\^?=?|\\\\|\\\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\\\s*';\n  \n  // CAVEAT: this does not properly handle the case where a regular\n  // expression immediately follows another since a regular expression may\n  // have flags for case-sensitivity and the like.  Having regexp tokens\n  // adjacent is not valid in any language I'm aware of, so I'm punting.\n  // TODO: maybe style special characters inside a regexp as punctuation.\n\n  /**\n   * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally\n   * matches the union of the sets of strings matched by the input RegExp.\n   * Since it matches globally, if the input strings have a start-of-input\n   * anchor (/^.../), it is ignored for the purposes of unioning.\n   * @param {Array.<RegExp>} regexs non multiline, non-global regexs.\n   * @return {RegExp} a global regex.\n   */\n  function combinePrefixPatterns(regexs) {\n    var capturedGroupIndex = 0;\n  \n    var needToFoldCase = false;\n    var ignoreCase = false;\n    for (var i = 0, n = regexs.length; i < n; ++i) {\n      var regex = regexs[i];\n      if (regex.ignoreCase) {\n        ignoreCase = true;\n      } else if (/[a-z]/i.test(regex.source.replace(\n                     /\\\\u[0-9a-f]{4}|\\\\x[0-9a-f]{2}|\\\\[^ux]/gi, ''))) {\n        needToFoldCase = true;\n        ignoreCase = false;\n        break;\n      }\n    }\n  \n    var escapeCharToCodeUnit = {\n      'b': 8,\n      't': 9,\n      'n': 0xa,\n      'v': 0xb,\n      'f': 0xc,\n      'r': 0xd\n    };\n  \n    function decodeEscape(charsetPart) {\n      var cc0 = charsetPart.charCodeAt(0);\n      if (cc0 !== 92 /* \\\\ */) {\n        return cc0;\n      }\n      var c1 = charsetPart.charAt(1);\n      cc0 = escapeCharToCodeUnit[c1];\n      if (cc0) {\n        return cc0;\n      } else if ('0' <= c1 && c1 <= '7') {\n        return parseInt(charsetPart.substring(1), 8);\n      } else if (c1 === 'u' || c1 === 'x') {\n        return parseInt(charsetPart.substring(2), 16);\n      } else {\n        return charsetPart.charCodeAt(1);\n      }\n    }\n  \n    function encodeEscape(charCode) {\n      if (charCode < 0x20) {\n        return (charCode < 0x10 ? '\\\\x0' : '\\\\x') + charCode.toString(16);\n      }\n      var ch = String.fromCharCode(charCode);\n      return (ch === '\\\\' || ch === '-' || ch === ']' || ch === '^')\n          ? \"\\\\\" + ch : ch;\n    }\n  \n    function caseFoldCharset(charSet) {\n      var charsetParts = charSet.substring(1, charSet.length - 1).match(\n          new RegExp(\n              '\\\\\\\\u[0-9A-Fa-f]{4}'\n              + '|\\\\\\\\x[0-9A-Fa-f]{2}'\n              + '|\\\\\\\\[0-3][0-7]{0,2}'\n              + '|\\\\\\\\[0-7]{1,2}'\n              + '|\\\\\\\\[\\\\s\\\\S]'\n              + '|-'\n              + '|[^-\\\\\\\\]',\n              'g'));\n      var ranges = [];\n      var inverse = charsetParts[0] === '^';\n  \n      var out = ['['];\n      if (inverse) { out.push('^'); }\n  \n      for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {\n        var p = charsetParts[i];\n        if (/\\\\[bdsw]/i.test(p)) {  // Don't muck with named groups.\n          out.push(p);\n        } else {\n          var start = decodeEscape(p);\n          var end;\n          if (i + 2 < n && '-' === charsetParts[i + 1]) {\n            end = decodeEscape(charsetParts[i + 2]);\n            i += 2;\n          } else {\n            end = start;\n          }\n          ranges.push([start, end]);\n          // If the range might intersect letters, then expand it.\n          // This case handling is too simplistic.\n          // It does not deal with non-latin case folding.\n          // It works for latin source code identifiers though.\n          if (!(end < 65 || start > 122)) {\n            if (!(end < 65 || start > 90)) {\n              ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);\n            }\n            if (!(end < 97 || start > 122)) {\n              ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);\n            }\n          }\n        }\n      }\n  \n      // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]\n      // -> [[1, 12], [14, 14], [16, 17]]\n      ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });\n      var consolidatedRanges = [];\n      var lastRange = [];\n      for (var i = 0; i < ranges.length; ++i) {\n        var range = ranges[i];\n        if (range[0] <= lastRange[1] + 1) {\n          lastRange[1] = Math.max(lastRange[1], range[1]);\n        } else {\n          consolidatedRanges.push(lastRange = range);\n        }\n      }\n  \n      for (var i = 0; i < consolidatedRanges.length; ++i) {\n        var range = consolidatedRanges[i];\n        out.push(encodeEscape(range[0]));\n        if (range[1] > range[0]) {\n          if (range[1] + 1 > range[0]) { out.push('-'); }\n          out.push(encodeEscape(range[1]));\n        }\n      }\n      out.push(']');\n      return out.join('');\n    }\n  \n    function allowAnywhereFoldCaseAndRenumberGroups(regex) {\n      // Split into character sets, escape sequences, punctuation strings\n      // like ('(', '(?:', ')', '^'), and runs of characters that do not\n      // include any of the above.\n      var parts = regex.source.match(\n          new RegExp(\n              '(?:'\n              + '\\\\[(?:[^\\\\x5C\\\\x5D]|\\\\\\\\[\\\\s\\\\S])*\\\\]'  // a character set\n              + '|\\\\\\\\u[A-Fa-f0-9]{4}'  // a unicode escape\n              + '|\\\\\\\\x[A-Fa-f0-9]{2}'  // a hex escape\n              + '|\\\\\\\\[0-9]+'  // a back-reference or octal escape\n              + '|\\\\\\\\[^ux0-9]'  // other escape sequence\n              + '|\\\\(\\\\?[:!=]'  // start of a non-capturing group\n              + '|[\\\\(\\\\)\\\\^]'  // start/end of a group, or line start\n              + '|[^\\\\x5B\\\\x5C\\\\(\\\\)\\\\^]+'  // run of other characters\n              + ')',\n              'g'));\n      var n = parts.length;\n  \n      // Maps captured group numbers to the number they will occupy in\n      // the output or to -1 if that has not been determined, or to\n      // undefined if they need not be capturing in the output.\n      var capturedGroups = [];\n  \n      // Walk over and identify back references to build the capturedGroups\n      // mapping.\n      for (var i = 0, groupIndex = 0; i < n; ++i) {\n        var p = parts[i];\n        if (p === '(') {\n          // groups are 1-indexed, so max group index is count of '('\n          ++groupIndex;\n        } else if ('\\\\' === p.charAt(0)) {\n          var decimalValue = +p.substring(1);\n          if (decimalValue) {\n            if (decimalValue <= groupIndex) {\n              capturedGroups[decimalValue] = -1;\n            } else {\n              // Replace with an unambiguous escape sequence so that\n              // an octal escape sequence does not turn into a backreference\n              // to a capturing group from an earlier regex.\n              parts[i] = encodeEscape(decimalValue);\n            }\n          }\n        }\n      }\n  \n      // Renumber groups and reduce capturing groups to non-capturing groups\n      // where possible.\n      for (var i = 1; i < capturedGroups.length; ++i) {\n        if (-1 === capturedGroups[i]) {\n          capturedGroups[i] = ++capturedGroupIndex;\n        }\n      }\n      for (var i = 0, groupIndex = 0; i < n; ++i) {\n        var p = parts[i];\n        if (p === '(') {\n          ++groupIndex;\n          if (!capturedGroups[groupIndex]) {\n            parts[i] = '(?:';\n          }\n        } else if ('\\\\' === p.charAt(0)) {\n          var decimalValue = +p.substring(1);\n          if (decimalValue && decimalValue <= groupIndex) {\n            parts[i] = '\\\\' + capturedGroups[decimalValue];\n          }\n        }\n      }\n  \n      // Remove any prefix anchors so that the output will match anywhere.\n      // ^^ really does mean an anchored match though.\n      for (var i = 0; i < n; ++i) {\n        if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }\n      }\n  \n      // Expand letters to groups to handle mixing of case-sensitive and\n      // case-insensitive patterns if necessary.\n      if (regex.ignoreCase && needToFoldCase) {\n        for (var i = 0; i < n; ++i) {\n          var p = parts[i];\n          var ch0 = p.charAt(0);\n          if (p.length >= 2 && ch0 === '[') {\n            parts[i] = caseFoldCharset(p);\n          } else if (ch0 !== '\\\\') {\n            // TODO: handle letters in numeric escapes.\n            parts[i] = p.replace(\n                /[a-zA-Z]/g,\n                function (ch) {\n                  var cc = ch.charCodeAt(0);\n                  return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';\n                });\n          }\n        }\n      }\n  \n      return parts.join('');\n    }\n  \n    var rewritten = [];\n    for (var i = 0, n = regexs.length; i < n; ++i) {\n      var regex = regexs[i];\n      if (regex.global || regex.multiline) { throw new Error('' + regex); }\n      rewritten.push(\n          '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');\n    }\n  \n    return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');\n  }\n\n  /**\n   * Split markup into a string of source code and an array mapping ranges in\n   * that string to the text nodes in which they appear.\n   *\n   * <p>\n   * The HTML DOM structure:</p>\n   * <pre>\n   * (Element   \"p\"\n   *   (Element \"b\"\n   *     (Text  \"print \"))       ; #1\n   *   (Text    \"'Hello '\")      ; #2\n   *   (Element \"br\")            ; #3\n   *   (Text    \"  + 'World';\")) ; #4\n   * </pre>\n   * <p>\n   * corresponds to the HTML\n   * {@code <p><b>print </b>'Hello '<br>  + 'World';</p>}.</p>\n   *\n   * <p>\n   * It will produce the output:</p>\n   * <pre>\n   * {\n   *   sourceCode: \"print 'Hello '\\n  + 'World';\",\n   *   //                     1          2\n   *   //           012345678901234 5678901234567\n   *   spans: [0, #1, 6, #2, 14, #3, 15, #4]\n   * }\n   * </pre>\n   * <p>\n   * where #1 is a reference to the {@code \"print \"} text node above, and so\n   * on for the other text nodes.\n   * </p>\n   *\n   * <p>\n   * The {@code} spans array is an array of pairs.  Even elements are the start\n   * indices of substrings, and odd elements are the text nodes (or BR elements)\n   * that contain the text for those substrings.\n   * Substrings continue until the next index or the end of the source.\n   * </p>\n   *\n   * @param {Node} node an HTML DOM subtree containing source-code.\n   * @param {boolean} isPreformatted true if white-space in text nodes should\n   *    be considered significant.\n   * @return {Object} source code and the text nodes in which they occur.\n   */\n  function extractSourceSpans(node, isPreformatted) {\n    var nocode = /(?:^|\\s)nocode(?:\\s|$)/;\n  \n    var chunks = [];\n    var length = 0;\n    var spans = [];\n    var k = 0;\n  \n    function walk(node) {\n      var type = node.nodeType;\n      if (type == 1) {  // Element\n        if (nocode.test(node.className)) { return; }\n        for (var child = node.firstChild; child; child = child.nextSibling) {\n          walk(child);\n        }\n        var nodeName = node.nodeName.toLowerCase();\n        if ('br' === nodeName || 'li' === nodeName) {\n          chunks[k] = '\\n';\n          spans[k << 1] = length++;\n          spans[(k++ << 1) | 1] = node;\n        }\n      } else if (type == 3 || type == 4) {  // Text\n        var text = node.nodeValue;\n        if (text.length) {\n          if (!isPreformatted) {\n            text = text.replace(/[ \\t\\r\\n]+/g, ' ');\n          } else {\n            text = text.replace(/\\r\\n?/g, '\\n');  // Normalize newlines.\n          }\n          // TODO: handle tabs here?\n          chunks[k] = text;\n          spans[k << 1] = length;\n          length += text.length;\n          spans[(k++ << 1) | 1] = node;\n        }\n      }\n    }\n  \n    walk(node);\n  \n    return {\n      sourceCode: chunks.join('').replace(/\\n$/, ''),\n      spans: spans\n    };\n  }\n\n  /**\n   * Apply the given language handler to sourceCode and add the resulting\n   * decorations to out.\n   * @param {number} basePos the index of sourceCode within the chunk of source\n   *    whose decorations are already present on out.\n   */\n  function appendDecorations(basePos, sourceCode, langHandler, out) {\n    if (!sourceCode) { return; }\n    var job = {\n      sourceCode: sourceCode,\n      basePos: basePos\n    };\n    langHandler(job);\n    out.push.apply(out, job.decorations);\n  }\n\n  var notWs = /\\S/;\n\n  /**\n   * Given an element, if it contains only one child element and any text nodes\n   * it contains contain only space characters, return the sole child element.\n   * Otherwise returns undefined.\n   * <p>\n   * This is meant to return the CODE element in {@code <pre><code ...>} when\n   * there is a single child element that contains all the non-space textual\n   * content, but not to return anything where there are multiple child elements\n   * as in {@code <pre><code>...</code><code>...</code></pre>} or when there\n   * is textual content.\n   */\n  function childContentWrapper(element) {\n    var wrapper = undefined;\n    for (var c = element.firstChild; c; c = c.nextSibling) {\n      var type = c.nodeType;\n      wrapper = (type === 1)  // Element Node\n          ? (wrapper ? element : c)\n          : (type === 3)  // Text Node\n          ? (notWs.test(c.nodeValue) ? element : wrapper)\n          : wrapper;\n    }\n    return wrapper === element ? undefined : wrapper;\n  }\n\n  /** Given triples of [style, pattern, context] returns a lexing function,\n    * The lexing function interprets the patterns to find token boundaries and\n    * returns a decoration list of the form\n    * [index_0, style_0, index_1, style_1, ..., index_n, style_n]\n    * where index_n is an index into the sourceCode, and style_n is a style\n    * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to\n    * all characters in sourceCode[index_n-1:index_n].\n    *\n    * The stylePatterns is a list whose elements have the form\n    * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].\n    *\n    * Style is a style constant like PR_PLAIN, or can be a string of the\n    * form 'lang-FOO', where FOO is a language extension describing the\n    * language of the portion of the token in $1 after pattern executes.\n    * E.g., if style is 'lang-lisp', and group 1 contains the text\n    * '(hello (world))', then that portion of the token will be passed to the\n    * registered lisp handler for formatting.\n    * The text before and after group 1 will be restyled using this decorator\n    * so decorators should take care that this doesn't result in infinite\n    * recursion.  For example, the HTML lexer rule for SCRIPT elements looks\n    * something like ['lang-js', /<[s]cript>(.+?)<\\/script>/].  This may match\n    * '<script>foo()<\\/script>', which would cause the current decorator to\n    * be called with '<script>' which would not match the same rule since\n    * group 1 must not be empty, so it would be instead styled as PR_TAG by\n    * the generic tag rule.  The handler registered for the 'js' extension would\n    * then be called with 'foo()', and finally, the current decorator would\n    * be called with '<\\/script>' which would not match the original rule and\n    * so the generic tag rule would identify it as a tag.\n    *\n    * Pattern must only match prefixes, and if it matches a prefix, then that\n    * match is considered a token with the same style.\n    *\n    * Context is applied to the last non-whitespace, non-comment token\n    * recognized.\n    *\n    * Shortcut is an optional string of characters, any of which, if the first\n    * character, gurantee that this pattern and only this pattern matches.\n    *\n    * @param {Array} shortcutStylePatterns patterns that always start with\n    *   a known character.  Must have a shortcut string.\n    * @param {Array} fallthroughStylePatterns patterns that will be tried in\n    *   order if the shortcut ones fail.  May have shortcuts.\n    *\n    * @return {function (Object)} a\n    *   function that takes source code and returns a list of decorations.\n    */\n  function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {\n    var shortcuts = {};\n    var tokenizer;\n    (function () {\n      var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);\n      var allRegexs = [];\n      var regexKeys = {};\n      for (var i = 0, n = allPatterns.length; i < n; ++i) {\n        var patternParts = allPatterns[i];\n        var shortcutChars = patternParts[3];\n        if (shortcutChars) {\n          for (var c = shortcutChars.length; --c >= 0;) {\n            shortcuts[shortcutChars.charAt(c)] = patternParts;\n          }\n        }\n        var regex = patternParts[1];\n        var k = '' + regex;\n        if (!regexKeys.hasOwnProperty(k)) {\n          allRegexs.push(regex);\n          regexKeys[k] = null;\n        }\n      }\n      allRegexs.push(/[\\0-\\uffff]/);\n      tokenizer = combinePrefixPatterns(allRegexs);\n    })();\n\n    var nPatterns = fallthroughStylePatterns.length;\n\n    /**\n     * Lexes job.sourceCode and produces an output array job.decorations of\n     * style classes preceded by the position at which they start in\n     * job.sourceCode in order.\n     *\n     * @param {Object} job an object like <pre>{\n     *    sourceCode: {string} sourceText plain text,\n     *    basePos: {int} position of job.sourceCode in the larger chunk of\n     *        sourceCode.\n     * }</pre>\n     */\n    var decorate = function (job) {\n      var sourceCode = job.sourceCode, basePos = job.basePos;\n      /** Even entries are positions in source in ascending order.  Odd enties\n        * are style markers (e.g., PR_COMMENT) that run from that position until\n        * the end.\n        * @type {Array.<number|string>}\n        */\n      var decorations = [basePos, PR_PLAIN];\n      var pos = 0;  // index into sourceCode\n      var tokens = sourceCode.match(tokenizer) || [];\n      var styleCache = {};\n\n      for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {\n        var token = tokens[ti];\n        var style = styleCache[token];\n        var match = void 0;\n\n        var isEmbedded;\n        if (typeof style === 'string') {\n          isEmbedded = false;\n        } else {\n          var patternParts = shortcuts[token.charAt(0)];\n          if (patternParts) {\n            match = token.match(patternParts[1]);\n            style = patternParts[0];\n          } else {\n            for (var i = 0; i < nPatterns; ++i) {\n              patternParts = fallthroughStylePatterns[i];\n              match = token.match(patternParts[1]);\n              if (match) {\n                style = patternParts[0];\n                break;\n              }\n            }\n\n            if (!match) {  // make sure that we make progress\n              style = PR_PLAIN;\n            }\n          }\n\n          isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);\n          if (isEmbedded && !(match && typeof match[1] === 'string')) {\n            isEmbedded = false;\n            style = PR_SOURCE;\n          }\n\n          if (!isEmbedded) { styleCache[token] = style; }\n        }\n\n        var tokenStart = pos;\n        pos += token.length;\n\n        if (!isEmbedded) {\n          decorations.push(basePos + tokenStart, style);\n        } else {  // Treat group 1 as an embedded block of source code.\n          var embeddedSource = match[1];\n          var embeddedSourceStart = token.indexOf(embeddedSource);\n          var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;\n          if (match[2]) {\n            // If embeddedSource can be blank, then it would match at the\n            // beginning which would cause us to infinitely recurse on the\n            // entire token, so we catch the right context in match[2].\n            embeddedSourceEnd = token.length - match[2].length;\n            embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;\n          }\n          var lang = style.substring(5);\n          // Decorate the left of the embedded source\n          appendDecorations(\n              basePos + tokenStart,\n              token.substring(0, embeddedSourceStart),\n              decorate, decorations);\n          // Decorate the embedded source\n          appendDecorations(\n              basePos + tokenStart + embeddedSourceStart,\n              embeddedSource,\n              langHandlerForExtension(lang, embeddedSource),\n              decorations);\n          // Decorate the right of the embedded section\n          appendDecorations(\n              basePos + tokenStart + embeddedSourceEnd,\n              token.substring(embeddedSourceEnd),\n              decorate, decorations);\n        }\n      }\n      job.decorations = decorations;\n    };\n    return decorate;\n  }\n\n  /** returns a function that produces a list of decorations from source text.\n    *\n    * This code treats \", ', and ` as string delimiters, and \\ as a string\n    * escape.  It does not recognize perl's qq() style strings.\n    * It has no special handling for double delimiter escapes as in basic, or\n    * the tripled delimiters used in python, but should work on those regardless\n    * although in those cases a single string literal may be broken up into\n    * multiple adjacent string literals.\n    *\n    * It recognizes C, C++, and shell style comments.\n    *\n    * @param {Object} options a set of optional parameters.\n    * @return {function (Object)} a function that examines the source code\n    *     in the input job and builds the decoration list.\n    */\n  function sourceDecorator(options) {\n    var shortcutStylePatterns = [], fallthroughStylePatterns = [];\n    if (options['tripleQuotedStrings']) {\n      // '''multi-line-string''', 'single-line-string', and double-quoted\n      shortcutStylePatterns.push(\n          [PR_STRING,  /^(?:\\'\\'\\'(?:[^\\'\\\\]|\\\\[\\s\\S]|\\'{1,2}(?=[^\\']))*(?:\\'\\'\\'|$)|\\\"\\\"\\\"(?:[^\\\"\\\\]|\\\\[\\s\\S]|\\\"{1,2}(?=[^\\\"]))*(?:\\\"\\\"\\\"|$)|\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$))/,\n           null, '\\'\"']);\n    } else if (options['multiLineStrings']) {\n      // 'multi-line-string', \"multi-line-string\"\n      shortcutStylePatterns.push(\n          [PR_STRING,  /^(?:\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$)|\\`(?:[^\\\\\\`]|\\\\[\\s\\S])*(?:\\`|$))/,\n           null, '\\'\"`']);\n    } else {\n      // 'single-line-string', \"single-line-string\"\n      shortcutStylePatterns.push(\n          [PR_STRING,\n           /^(?:\\'(?:[^\\\\\\'\\r\\n]|\\\\.)*(?:\\'|$)|\\\"(?:[^\\\\\\\"\\r\\n]|\\\\.)*(?:\\\"|$))/,\n           null, '\"\\'']);\n    }\n    if (options['verbatimStrings']) {\n      // verbatim-string-literal production from the C# grammar.  See issue 93.\n      fallthroughStylePatterns.push(\n          [PR_STRING, /^@\\\"(?:[^\\\"]|\\\"\\\")*(?:\\\"|$)/, null]);\n    }\n    var hc = options['hashComments'];\n    if (hc) {\n      if (options['cStyleComments']) {\n        if (hc > 1) {  // multiline hash comments\n          shortcutStylePatterns.push(\n              [PR_COMMENT, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#']);\n        } else {\n          // Stop C preprocessor declarations at an unclosed open comment\n          shortcutStylePatterns.push(\n              [PR_COMMENT, /^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\\b|[^\\r\\n]*)/,\n               null, '#']);\n        }\n        // #include <stdio.h>\n        fallthroughStylePatterns.push(\n            [PR_STRING,\n             /^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h(?:h|pp|\\+\\+)?|[a-z]\\w*)>/,\n             null]);\n      } else {\n        shortcutStylePatterns.push([PR_COMMENT, /^#[^\\r\\n]*/, null, '#']);\n      }\n    }\n    if (options['cStyleComments']) {\n      fallthroughStylePatterns.push([PR_COMMENT, /^\\/\\/[^\\r\\n]*/, null]);\n      fallthroughStylePatterns.push(\n          [PR_COMMENT, /^\\/\\*[\\s\\S]*?(?:\\*\\/|$)/, null]);\n    }\n    var regexLiterals = options['regexLiterals'];\n    if (regexLiterals) {\n      /**\n       * @const\n       */\n      var regexExcls = regexLiterals > 1\n        ? ''  // Multiline regex literals\n        : '\\n\\r';\n      /**\n       * @const\n       */\n      var regexAny = regexExcls ? '.' : '[\\\\S\\\\s]';\n      /**\n       * @const\n       */\n      var REGEX_LITERAL = (\n          // A regular expression literal starts with a slash that is\n          // not followed by * or / so that it is not confused with\n          // comments.\n          '/(?=[^/*' + regexExcls + '])'\n          // and then contains any number of raw characters,\n          + '(?:[^/\\\\x5B\\\\x5C' + regexExcls + ']'\n          // escape sequences (\\x5C),\n          +    '|\\\\x5C' + regexAny\n          // or non-nesting character sets (\\x5B\\x5D);\n          +    '|\\\\x5B(?:[^\\\\x5C\\\\x5D' + regexExcls + ']'\n          +             '|\\\\x5C' + regexAny + ')*(?:\\\\x5D|$))+'\n          // finally closed by a /.\n          + '/');\n      fallthroughStylePatterns.push(\n          ['lang-regex',\n           RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')\n           ]);\n    }\n\n    var types = options['types'];\n    if (types) {\n      fallthroughStylePatterns.push([PR_TYPE, types]);\n    }\n\n    var keywords = (\"\" + options['keywords']).replace(/^ | $/g, '');\n    if (keywords.length) {\n      fallthroughStylePatterns.push(\n          [PR_KEYWORD,\n           new RegExp('^(?:' + keywords.replace(/[\\s,]+/g, '|') + ')\\\\b'),\n           null]);\n    }\n\n    shortcutStylePatterns.push([PR_PLAIN,       /^\\s+/, null, ' \\r\\n\\t\\xA0']);\n\n    var punctuation =\n      // The Bash man page says\n\n      // A word is a sequence of characters considered as a single\n      // unit by GRUB. Words are separated by metacharacters,\n      // which are the following plus space, tab, and newline: { }\n      // | & $ ; < >\n      // ...\n      \n      // A word beginning with # causes that word and all remaining\n      // characters on that line to be ignored.\n\n      // which means that only a '#' after /(?:^|[{}|&$;<>\\s])/ starts a\n      // comment but empirically\n      // $ echo {#}\n      // {#}\n      // $ echo \\$#\n      // $#\n      // $ echo }#\n      // }#\n\n      // so /(?:^|[|&;<>\\s])/ is more appropriate.\n\n      // http://gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html#SEC3\n      // suggests that this definition is compatible with a\n      // default mode that tries to use a single token definition\n      // to recognize both bash/python style comments and C\n      // preprocessor directives.\n\n      // This definition of punctuation does not include # in the list of\n      // follow-on exclusions, so # will not be broken before if preceeded\n      // by a punctuation character.  We could try to exclude # after\n      // [|&;<>] but that doesn't seem to cause many major problems.\n      // If that does turn out to be a problem, we should change the below\n      // when hc is truthy to include # in the run of punctuation characters\n      // only when not followint [|&;<>].\n      '^.[^\\\\s\\\\w.$@\\'\"`/\\\\\\\\]*';\n    if (options['regexLiterals']) {\n      punctuation += '(?!\\s*\\/)';\n    }\n\n    fallthroughStylePatterns.push(\n        // TODO(mikesamuel): recognize non-latin letters and numerals in idents\n        [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],\n        [PR_TYPE,        /^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\\w+_t\\b)/, null],\n        [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],\n        [PR_LITERAL,\n         new RegExp(\n             '^(?:'\n             // A hex number\n             + '0x[a-f0-9]+'\n             // or an octal or decimal number,\n             + '|(?:\\\\d(?:_\\\\d+)*\\\\d*(?:\\\\.\\\\d*)?|\\\\.\\\\d\\\\+)'\n             // possibly in scientific notation\n             + '(?:e[+\\\\-]?\\\\d+)?'\n             + ')'\n             // with an optional modifier like UL for unsigned long\n             + '[a-z]*', 'i'),\n         null, '0123456789'],\n        // Don't treat escaped quotes in bash as starting strings.\n        // See issue 144.\n        [PR_PLAIN,       /^\\\\[\\s\\S]?/, null],\n        [PR_PUNCTUATION, new RegExp(punctuation), null]);\n\n    return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);\n  }\n\n  var decorateSource = sourceDecorator({\n        'keywords': ALL_KEYWORDS,\n        'hashComments': true,\n        'cStyleComments': true,\n        'multiLineStrings': true,\n        'regexLiterals': true\n      });\n\n  /**\n   * Given a DOM subtree, wraps it in a list, and puts each line into its own\n   * list item.\n   *\n   * @param {Node} node modified in place.  Its content is pulled into an\n   *     HTMLOListElement, and each line is moved into a separate list item.\n   *     This requires cloning elements, so the input might not have unique\n   *     IDs after numbering.\n   * @param {boolean} isPreformatted true iff white-space in text nodes should\n   *     be treated as significant.\n   */\n  function numberLines(node, opt_startLineNum, isPreformatted) {\n    var nocode = /(?:^|\\s)nocode(?:\\s|$)/;\n    var lineBreak = /\\r\\n?|\\n/;\n  \n    var document = node.ownerDocument;\n  \n    var li = document.createElement('li');\n    while (node.firstChild) {\n      li.appendChild(node.firstChild);\n    }\n    // An array of lines.  We split below, so this is initialized to one\n    // un-split line.\n    var listItems = [li];\n  \n    function walk(node) {\n      var type = node.nodeType;\n      if (type == 1 && !nocode.test(node.className)) {  // Element\n        if ('br' === node.nodeName) {\n          breakAfter(node);\n          // Discard the <BR> since it is now flush against a </LI>.\n          if (node.parentNode) {\n            node.parentNode.removeChild(node);\n          }\n        } else {\n          for (var child = node.firstChild; child; child = child.nextSibling) {\n            walk(child);\n          }\n        }\n      } else if ((type == 3 || type == 4) && isPreformatted) {  // Text\n        var text = node.nodeValue;\n        var match = text.match(lineBreak);\n        if (match) {\n          var firstLine = text.substring(0, match.index);\n          node.nodeValue = firstLine;\n          var tail = text.substring(match.index + match[0].length);\n          if (tail) {\n            var parent = node.parentNode;\n            parent.insertBefore(\n              document.createTextNode(tail), node.nextSibling);\n          }\n          breakAfter(node);\n          if (!firstLine) {\n            // Don't leave blank text nodes in the DOM.\n            node.parentNode.removeChild(node);\n          }\n        }\n      }\n    }\n  \n    // Split a line after the given node.\n    function breakAfter(lineEndNode) {\n      // If there's nothing to the right, then we can skip ending the line\n      // here, and move root-wards since splitting just before an end-tag\n      // would require us to create a bunch of empty copies.\n      while (!lineEndNode.nextSibling) {\n        lineEndNode = lineEndNode.parentNode;\n        if (!lineEndNode) { return; }\n      }\n  \n      function breakLeftOf(limit, copy) {\n        // Clone shallowly if this node needs to be on both sides of the break.\n        var rightSide = copy ? limit.cloneNode(false) : limit;\n        var parent = limit.parentNode;\n        if (parent) {\n          // We clone the parent chain.\n          // This helps us resurrect important styling elements that cross lines.\n          // E.g. in <i>Foo<br>Bar</i>\n          // should be rewritten to <li><i>Foo</i></li><li><i>Bar</i></li>.\n          var parentClone = breakLeftOf(parent, 1);\n          // Move the clone and everything to the right of the original\n          // onto the cloned parent.\n          var next = limit.nextSibling;\n          parentClone.appendChild(rightSide);\n          for (var sibling = next; sibling; sibling = next) {\n            next = sibling.nextSibling;\n            parentClone.appendChild(sibling);\n          }\n        }\n        return rightSide;\n      }\n  \n      var copiedListItem = breakLeftOf(lineEndNode.nextSibling, 0);\n  \n      // Walk the parent chain until we reach an unattached LI.\n      for (var parent;\n           // Check nodeType since IE invents document fragments.\n           (parent = copiedListItem.parentNode) && parent.nodeType === 1;) {\n        copiedListItem = parent;\n      }\n      // Put it on the list of lines for later processing.\n      listItems.push(copiedListItem);\n    }\n  \n    // Split lines while there are lines left to split.\n    for (var i = 0;  // Number of lines that have been split so far.\n         i < listItems.length;  // length updated by breakAfter calls.\n         ++i) {\n      walk(listItems[i]);\n    }\n  \n    // Make sure numeric indices show correctly.\n    if (opt_startLineNum === (opt_startLineNum|0)) {\n      listItems[0].setAttribute('value', opt_startLineNum);\n    }\n  \n    var ol = document.createElement('ol');\n    ol.className = 'linenums';\n    var offset = Math.max(0, ((opt_startLineNum - 1 /* zero index */)) | 0) || 0;\n    for (var i = 0, n = listItems.length; i < n; ++i) {\n      li = listItems[i];\n      // Stick a class on the LIs so that stylesheets can\n      // color odd/even rows, or any other row pattern that\n      // is co-prime with 10.\n      li.className = 'L' + ((i + offset) % 10);\n      if (!li.firstChild) {\n        li.appendChild(document.createTextNode('\\xA0'));\n      }\n      ol.appendChild(li);\n    }\n  \n    node.appendChild(ol);\n  }\n  /**\n   * Breaks {@code job.sourceCode} around style boundaries in\n   * {@code job.decorations} and modifies {@code job.sourceNode} in place.\n   * @param {Object} job like <pre>{\n   *    sourceCode: {string} source as plain text,\n   *    sourceNode: {HTMLElement} the element containing the source,\n   *    spans: {Array.<number|Node>} alternating span start indices into source\n   *       and the text node or element (e.g. {@code <BR>}) corresponding to that\n   *       span.\n   *    decorations: {Array.<number|string} an array of style classes preceded\n   *       by the position at which they start in job.sourceCode in order\n   * }</pre>\n   * @private\n   */\n  function recombineTagsAndDecorations(job) {\n    var isIE8OrEarlier = /\\bMSIE\\s(\\d+)/.exec(navigator.userAgent);\n    isIE8OrEarlier = isIE8OrEarlier && +isIE8OrEarlier[1] <= 8;\n    var newlineRe = /\\n/g;\n  \n    var source = job.sourceCode;\n    var sourceLength = source.length;\n    // Index into source after the last code-unit recombined.\n    var sourceIndex = 0;\n  \n    var spans = job.spans;\n    var nSpans = spans.length;\n    // Index into spans after the last span which ends at or before sourceIndex.\n    var spanIndex = 0;\n  \n    var decorations = job.decorations;\n    var nDecorations = decorations.length;\n    // Index into decorations after the last decoration which ends at or before\n    // sourceIndex.\n    var decorationIndex = 0;\n  \n    // Remove all zero-length decorations.\n    decorations[nDecorations] = sourceLength;\n    var decPos, i;\n    for (i = decPos = 0; i < nDecorations;) {\n      if (decorations[i] !== decorations[i + 2]) {\n        decorations[decPos++] = decorations[i++];\n        decorations[decPos++] = decorations[i++];\n      } else {\n        i += 2;\n      }\n    }\n    nDecorations = decPos;\n  \n    // Simplify decorations.\n    for (i = decPos = 0; i < nDecorations;) {\n      var startPos = decorations[i];\n      // Conflate all adjacent decorations that use the same style.\n      var startDec = decorations[i + 1];\n      var end = i + 2;\n      while (end + 2 <= nDecorations && decorations[end + 1] === startDec) {\n        end += 2;\n      }\n      decorations[decPos++] = startPos;\n      decorations[decPos++] = startDec;\n      i = end;\n    }\n  \n    nDecorations = decorations.length = decPos;\n  \n    var sourceNode = job.sourceNode;\n    var oldDisplay;\n    if (sourceNode) {\n      oldDisplay = sourceNode.style.display;\n      sourceNode.style.display = 'none';\n    }\n    try {\n      var decoration = null;\n      while (spanIndex < nSpans) {\n        var spanStart = spans[spanIndex];\n        var spanEnd = spans[spanIndex + 2] || sourceLength;\n  \n        var decEnd = decorations[decorationIndex + 2] || sourceLength;\n  \n        var end = Math.min(spanEnd, decEnd);\n  \n        var textNode = spans[spanIndex + 1];\n        var styledText;\n        if (textNode.nodeType !== 1  // Don't muck with <BR>s or <LI>s\n            // Don't introduce spans around empty text nodes.\n            && (styledText = source.substring(sourceIndex, end))) {\n          // This may seem bizarre, and it is.  Emitting LF on IE causes the\n          // code to display with spaces instead of line breaks.\n          // Emitting Windows standard issue linebreaks (CRLF) causes a blank\n          // space to appear at the beginning of every line but the first.\n          // Emitting an old Mac OS 9 line separator makes everything spiffy.\n          if (isIE8OrEarlier) {\n            styledText = styledText.replace(newlineRe, '\\r');\n          }\n          textNode.nodeValue = styledText;\n          var document = textNode.ownerDocument;\n          var span = document.createElement('span');\n          span.className = decorations[decorationIndex + 1];\n          var parentNode = textNode.parentNode;\n          parentNode.replaceChild(span, textNode);\n          span.appendChild(textNode);\n          if (sourceIndex < spanEnd) {  // Split off a text node.\n            spans[spanIndex + 1] = textNode\n                // TODO: Possibly optimize by using '' if there's no flicker.\n                = document.createTextNode(source.substring(end, spanEnd));\n            parentNode.insertBefore(textNode, span.nextSibling);\n          }\n        }\n  \n        sourceIndex = end;\n  \n        if (sourceIndex >= spanEnd) {\n          spanIndex += 2;\n        }\n        if (sourceIndex >= decEnd) {\n          decorationIndex += 2;\n        }\n      }\n    } finally {\n      if (sourceNode) {\n        sourceNode.style.display = oldDisplay;\n      }\n    }\n  }\n\n  /** Maps language-specific file extensions to handlers. */\n  var langHandlerRegistry = {};\n  /** Register a language handler for the given file extensions.\n    * @param {function (Object)} handler a function from source code to a list\n    *      of decorations.  Takes a single argument job which describes the\n    *      state of the computation.   The single parameter has the form\n    *      {@code {\n    *        sourceCode: {string} as plain text.\n    *        decorations: {Array.<number|string>} an array of style classes\n    *                     preceded by the position at which they start in\n    *                     job.sourceCode in order.\n    *                     The language handler should assigned this field.\n    *        basePos: {int} the position of source in the larger source chunk.\n    *                 All positions in the output decorations array are relative\n    *                 to the larger source chunk.\n    *      } }\n    * @param {Array.<string>} fileExtensions\n    */\n  function registerLangHandler(handler, fileExtensions) {\n    for (var i = fileExtensions.length; --i >= 0;) {\n      var ext = fileExtensions[i];\n      if (!langHandlerRegistry.hasOwnProperty(ext)) {\n        langHandlerRegistry[ext] = handler;\n      } else if (win['console']) {\n        console['warn']('cannot override language handler %s', ext);\n      }\n    }\n  }\n  function langHandlerForExtension(extension, source) {\n    if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {\n      // Treat it as markup if the first non whitespace character is a < and\n      // the last non-whitespace character is a >.\n      extension = /^\\s*</.test(source)\n          ? 'default-markup'\n          : 'default-code';\n    }\n    return langHandlerRegistry[extension];\n  }\n  registerLangHandler(decorateSource, ['default-code']);\n  registerLangHandler(\n      createSimpleLexer(\n          [],\n          [\n           [PR_PLAIN,       /^[^<?]+/],\n           [PR_DECLARATION, /^<!\\w[^>]*(?:>|$)/],\n           [PR_COMMENT,     /^<\\!--[\\s\\S]*?(?:-\\->|$)/],\n           // Unescaped content in an unknown language\n           ['lang-',        /^<\\?([\\s\\S]+?)(?:\\?>|$)/],\n           ['lang-',        /^<%([\\s\\S]+?)(?:%>|$)/],\n           [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],\n           ['lang-',        /^<xmp\\b[^>]*>([\\s\\S]+?)<\\/xmp\\b[^>]*>/i],\n           // Unescaped content in javascript.  (Or possibly vbscript).\n           ['lang-js',      /^<script\\b[^>]*>([\\s\\S]*?)(<\\/script\\b[^>]*>)/i],\n           // Contains unescaped stylesheet content\n           ['lang-css',     /^<style\\b[^>]*>([\\s\\S]*?)(<\\/style\\b[^>]*>)/i],\n           ['lang-in.tag',  /^(<\\/?[a-z][^<>]*>)/i]\n          ]),\n      ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);\n  registerLangHandler(\n      createSimpleLexer(\n          [\n           [PR_PLAIN,        /^[\\s]+/, null, ' \\t\\r\\n'],\n           [PR_ATTRIB_VALUE, /^(?:\\\"[^\\\"]*\\\"?|\\'[^\\']*\\'?)/, null, '\\\"\\'']\n           ],\n          [\n           [PR_TAG,          /^^<\\/?[a-z](?:[\\w.:-]*\\w)?|\\/?>$/i],\n           [PR_ATTRIB_NAME,  /^(?!style[\\s=]|on)[a-z](?:[\\w:-]*\\w)?/i],\n           ['lang-uq.val',   /^=\\s*([^>\\'\\\"\\s]*(?:[^>\\'\\\"\\s\\/]|\\/(?=\\s)))/],\n           [PR_PUNCTUATION,  /^[=<>\\/]+/],\n           ['lang-js',       /^on\\w+\\s*=\\s*\\\"([^\\\"]+)\\\"/i],\n           ['lang-js',       /^on\\w+\\s*=\\s*\\'([^\\']+)\\'/i],\n           ['lang-js',       /^on\\w+\\s*=\\s*([^\\\"\\'>\\s]+)/i],\n           ['lang-css',      /^style\\s*=\\s*\\\"([^\\\"]+)\\\"/i],\n           ['lang-css',      /^style\\s*=\\s*\\'([^\\']+)\\'/i],\n           ['lang-css',      /^style\\s*=\\s*([^\\\"\\'>\\s]+)/i]\n           ]),\n      ['in.tag']);\n  registerLangHandler(\n      createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\\s\\S]+/]]), ['uq.val']);\n  registerLangHandler(sourceDecorator({\n          'keywords': CPP_KEYWORDS,\n          'hashComments': true,\n          'cStyleComments': true,\n          'types': C_TYPES\n        }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);\n  registerLangHandler(sourceDecorator({\n          'keywords': 'null,true,false'\n        }), ['json']);\n  registerLangHandler(sourceDecorator({\n          'keywords': CSHARP_KEYWORDS,\n          'hashComments': true,\n          'cStyleComments': true,\n          'verbatimStrings': true,\n          'types': C_TYPES\n        }), ['cs']);\n  registerLangHandler(sourceDecorator({\n          'keywords': JAVA_KEYWORDS,\n          'cStyleComments': true\n        }), ['java']);\n  registerLangHandler(sourceDecorator({\n          'keywords': SH_KEYWORDS,\n          'hashComments': true,\n          'multiLineStrings': true\n        }), ['bash', 'bsh', 'csh', 'sh']);\n  registerLangHandler(sourceDecorator({\n          'keywords': PYTHON_KEYWORDS,\n          'hashComments': true,\n          'multiLineStrings': true,\n          'tripleQuotedStrings': true\n        }), ['cv', 'py', 'python']);\n  registerLangHandler(sourceDecorator({\n          'keywords': PERL_KEYWORDS,\n          'hashComments': true,\n          'multiLineStrings': true,\n          'regexLiterals': 2  // multiline regex literals\n        }), ['perl', 'pl', 'pm']);\n  registerLangHandler(sourceDecorator({\n          'keywords': RUBY_KEYWORDS,\n          'hashComments': true,\n          'multiLineStrings': true,\n          'regexLiterals': true\n        }), ['rb', 'ruby']);\n  registerLangHandler(sourceDecorator({\n          'keywords': JSCRIPT_KEYWORDS,\n          'cStyleComments': true,\n          'regexLiterals': true\n        }), ['javascript', 'js']);\n  registerLangHandler(sourceDecorator({\n          'keywords': COFFEE_KEYWORDS,\n          'hashComments': 3,  // ### style block comments\n          'cStyleComments': true,\n          'multilineStrings': true,\n          'tripleQuotedStrings': true,\n          'regexLiterals': true\n        }), ['coffee']);\n  registerLangHandler(sourceDecorator({\n          'keywords': RUST_KEYWORDS,\n          'cStyleComments': true,\n          'multilineStrings': true\n        }), ['rc', 'rs', 'rust']);\n  registerLangHandler(\n      createSimpleLexer([], [[PR_STRING, /^[\\s\\S]+/]]), ['regex']);\n\n  function applyDecorator(job) {\n    var opt_langExtension = job.langExtension;\n\n    try {\n      // Extract tags, and convert the source code to plain text.\n      var sourceAndSpans = extractSourceSpans(job.sourceNode, job.pre);\n      /** Plain text. @type {string} */\n      var source = sourceAndSpans.sourceCode;\n      job.sourceCode = source;\n      job.spans = sourceAndSpans.spans;\n      job.basePos = 0;\n\n      // Apply the appropriate language handler\n      langHandlerForExtension(opt_langExtension, source)(job);\n\n      // Integrate the decorations and tags back into the source code,\n      // modifying the sourceNode in place.\n      recombineTagsAndDecorations(job);\n    } catch (e) {\n      if (win['console']) {\n        console['log'](e && e['stack'] || e);\n      }\n    }\n  }\n\n  /**\n   * Pretty print a chunk of code.\n   * @param sourceCodeHtml {string} The HTML to pretty print.\n   * @param opt_langExtension {string} The language name to use.\n   *     Typically, a filename extension like 'cpp' or 'java'.\n   * @param opt_numberLines {number|boolean} True to number lines,\n   *     or the 1-indexed number of the first line in sourceCodeHtml.\n   */\n  function $prettyPrintOne(sourceCodeHtml, opt_langExtension, opt_numberLines) {\n    var container = document.createElement('div');\n    // This could cause images to load and onload listeners to fire.\n    // E.g. <img onerror=\"alert(1337)\" src=\"nosuchimage.png\">.\n    // We assume that the inner HTML is from a trusted source.\n    // The pre-tag is required for IE8 which strips newlines from innerHTML\n    // when it is injected into a <pre> tag.\n    // http://stackoverflow.com/questions/451486/pre-tag-loses-line-breaks-when-setting-innerhtml-in-ie\n    // http://stackoverflow.com/questions/195363/inserting-a-newline-into-a-pre-tag-ie-javascript\n    container.innerHTML = '<pre>' + sourceCodeHtml + '</pre>';\n    container = container.firstChild;\n    if (opt_numberLines) {\n      numberLines(container, opt_numberLines, true);\n    }\n\n    var job = {\n      langExtension: opt_langExtension,\n      numberLines: opt_numberLines,\n      sourceNode: container,\n      pre: 1\n    };\n    applyDecorator(job);\n    return container.innerHTML;\n  }\n\n   /**\n    * Find all the {@code <pre>} and {@code <code>} tags in the DOM with\n    * {@code class=prettyprint} and prettify them.\n    *\n    * @param {Function} opt_whenDone called when prettifying is done.\n    * @param {HTMLElement|HTMLDocument} opt_root an element or document\n    *   containing all the elements to pretty print.\n    *   Defaults to {@code document.body}.\n    */\n  function $prettyPrint(opt_whenDone, opt_root) {\n    var root = opt_root || document.body;\n    var doc = root.ownerDocument || document;\n    function byTagName(tn) { return root.getElementsByTagName(tn); }\n    // fetch a list of nodes to rewrite\n    var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')];\n    var elements = [];\n    for (var i = 0; i < codeSegments.length; ++i) {\n      for (var j = 0, n = codeSegments[i].length; j < n; ++j) {\n        elements.push(codeSegments[i][j]);\n      }\n    }\n    codeSegments = null;\n\n    var clock = Date;\n    if (!clock['now']) {\n      clock = { 'now': function () { return +(new Date); } };\n    }\n\n    // The loop is broken into a series of continuations to make sure that we\n    // don't make the browser unresponsive when rewriting a large page.\n    var k = 0;\n    var prettyPrintingJob;\n\n    var langExtensionRe = /\\blang(?:uage)?-([\\w.]+)(?!\\S)/;\n    var prettyPrintRe = /\\bprettyprint\\b/;\n    var prettyPrintedRe = /\\bprettyprinted\\b/;\n    var preformattedTagNameRe = /pre|xmp/i;\n    var codeRe = /^code$/i;\n    var preCodeXmpRe = /^(?:pre|code|xmp)$/i;\n    var EMPTY = {};\n\n    function doWork() {\n      var endTime = (win['PR_SHOULD_USE_CONTINUATION'] ?\n                     clock['now']() + 250 /* ms */ :\n                     Infinity);\n      for (; k < elements.length && clock['now']() < endTime; k++) {\n        var cs = elements[k];\n\n        // Look for a preceding comment like\n        // <?prettify lang=\"...\" linenums=\"...\"?>\n        var attrs = EMPTY;\n        {\n          for (var preceder = cs; (preceder = preceder.previousSibling);) {\n            var nt = preceder.nodeType;\n            // <?foo?> is parsed by HTML 5 to a comment node (8)\n            // like <!--?foo?-->, but in XML is a processing instruction\n            var value = (nt === 7 || nt === 8) && preceder.nodeValue;\n            if (value\n                ? !/^\\??prettify\\b/.test(value)\n                : (nt !== 3 || /\\S/.test(preceder.nodeValue))) {\n              // Skip over white-space text nodes but not others.\n              break;\n            }\n            if (value) {\n              attrs = {};\n              value.replace(\n                  /\\b(\\w+)=([\\w:.%+-]+)/g,\n                function (_, name, value) { attrs[name] = value; });\n              break;\n            }\n          }\n        }\n\n        var className = cs.className;\n        if ((attrs !== EMPTY || prettyPrintRe.test(className))\n            // Don't redo this if we've already done it.\n            // This allows recalling pretty print to just prettyprint elements\n            // that have been added to the page since last call.\n            && !prettyPrintedRe.test(className)) {\n\n          // make sure this is not nested in an already prettified element\n          var nested = false;\n          for (var p = cs.parentNode; p; p = p.parentNode) {\n            var tn = p.tagName;\n            if (preCodeXmpRe.test(tn)\n                && p.className && prettyPrintRe.test(p.className)) {\n              nested = true;\n              break;\n            }\n          }\n          if (!nested) {\n            // Mark done.  If we fail to prettyprint for whatever reason,\n            // we shouldn't try again.\n            cs.className += ' prettyprinted';\n\n            // If the classes includes a language extensions, use it.\n            // Language extensions can be specified like\n            //     <pre class=\"prettyprint lang-cpp\">\n            // the language extension \"cpp\" is used to find a language handler\n            // as passed to PR.registerLangHandler.\n            // HTML5 recommends that a language be specified using \"language-\"\n            // as the prefix instead.  Google Code Prettify supports both.\n            // http://dev.w3.org/html5/spec-author-view/the-code-element.html\n            var langExtension = attrs['lang'];\n            if (!langExtension) {\n              langExtension = className.match(langExtensionRe);\n              // Support <pre class=\"prettyprint\"><code class=\"language-c\">\n              var wrapper;\n              if (!langExtension && (wrapper = childContentWrapper(cs))\n                  && codeRe.test(wrapper.tagName)) {\n                langExtension = wrapper.className.match(langExtensionRe);\n              }\n\n              if (langExtension) { langExtension = langExtension[1]; }\n            }\n\n            var preformatted;\n            if (preformattedTagNameRe.test(cs.tagName)) {\n              preformatted = 1;\n            } else {\n              var currentStyle = cs['currentStyle'];\n              var defaultView = doc.defaultView;\n              var whitespace = (\n                  currentStyle\n                  ? currentStyle['whiteSpace']\n                  : (defaultView\n                     && defaultView.getComputedStyle)\n                  ? defaultView.getComputedStyle(cs, null)\n                  .getPropertyValue('white-space')\n                  : 0);\n              preformatted = whitespace\n                  && 'pre' === whitespace.substring(0, 3);\n            }\n\n            // Look for a class like linenums or linenums:<n> where <n> is the\n            // 1-indexed number of the first line.\n            var lineNums = attrs['linenums'];\n            if (!(lineNums = lineNums === 'true' || +lineNums)) {\n              lineNums = className.match(/\\blinenums\\b(?::(\\d+))?/);\n              lineNums =\n                lineNums\n                ? lineNums[1] && lineNums[1].length\n                  ? +lineNums[1] : true\n                : false;\n            }\n            if (lineNums) { numberLines(cs, lineNums, preformatted); }\n\n            // do the pretty printing\n            prettyPrintingJob = {\n              langExtension: langExtension,\n              sourceNode: cs,\n              numberLines: lineNums,\n              pre: preformatted\n            };\n            applyDecorator(prettyPrintingJob);\n          }\n        }\n      }\n      if (k < elements.length) {\n        // finish up in a continuation\n        setTimeout(doWork, 250);\n      } else if ('function' === typeof opt_whenDone) {\n        opt_whenDone();\n      }\n    }\n\n    doWork();\n  }\n\n  /**\n   * Contains functions for creating and registering new language handlers.\n   * @type {Object}\n   */\n  var PR = win['PR'] = {\n        'createSimpleLexer': createSimpleLexer,\n        'registerLangHandler': registerLangHandler,\n        'sourceDecorator': sourceDecorator,\n        'PR_ATTRIB_NAME': PR_ATTRIB_NAME,\n        'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,\n        'PR_COMMENT': PR_COMMENT,\n        'PR_DECLARATION': PR_DECLARATION,\n        'PR_KEYWORD': PR_KEYWORD,\n        'PR_LITERAL': PR_LITERAL,\n        'PR_NOCODE': PR_NOCODE,\n        'PR_PLAIN': PR_PLAIN,\n        'PR_PUNCTUATION': PR_PUNCTUATION,\n        'PR_SOURCE': PR_SOURCE,\n        'PR_STRING': PR_STRING,\n        'PR_TAG': PR_TAG,\n        'PR_TYPE': PR_TYPE,\n        'prettyPrintOne':\n           IN_GLOBAL_SCOPE\n             ? (win['prettyPrintOne'] = $prettyPrintOne)\n             : (prettyPrintOne = $prettyPrintOne),\n        'prettyPrint': prettyPrint =\n           IN_GLOBAL_SCOPE\n             ? (win['prettyPrint'] = $prettyPrint)\n             : (prettyPrint = $prettyPrint)\n      };\n\n  // Make PR available via the Asynchronous Module Definition (AMD) API.\n  // Per https://github.com/amdjs/amdjs-api/wiki/AMD:\n  // The Asynchronous Module Definition (AMD) API specifies a\n  // mechanism for defining modules such that the module and its\n  // dependencies can be asynchronously loaded.\n  // ...\n  // To allow a clear indicator that a global define function (as\n  // needed for script src browser loading) conforms to the AMD API,\n  // any global define function SHOULD have a property called \"amd\"\n  // whose value is an object. This helps avoid conflict with any\n  // other existing JavaScript code that could have defined a define()\n  // function that does not conform to the AMD API.\n  if (typeof define === \"function\" && define['amd']) {\n    define(\"google-code-prettify\", [], function () {\n      return PR; \n    });\n  }\n})();\n"
  },
  {
    "path": "google-code-prettify/src/run_prettify.js",
    "content": "// Copyright (C) 2013 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n// Looks at query parameters to decide which language handlers and style-sheets\n// to load.\n\n// Query Parameter     Format           Effect                        Default\n// +------------------+---------------+------------------------------+--------+\n// | autorun=         | true | false  | If true then prettyPrint()   | \"true\" |\n// |                  |               | is called on page load.      |        |\n// +------------------+---------------+------------------------------+--------+\n// | lang=            | language name | Loads the language handler   | Can    |\n// |                  |               | named \"lang-<NAME>.js\".      | appear |\n// |                  |               | See available handlers at    | many   |\n// |                  |               | http://code.google.com/p/    | times. |\n// |                  |               | google-code-prettify/source/ |        |\n// |                  |               | browse/trunk/src             |        |\n// +------------------+---------------+------------------------------+--------+\n// | skin=            | skin name     | Loads the skin stylesheet    | none.  |\n// |                  |               | named \"<NAME>.css\".          |        |\n// |                  |               | http://code.google.com/p/    |        |\n// |                  |               | google-code-prettify/source/ |        |\n// |                  |               | browse/trunk/styles          |        |\n// +------------------+---------------+------------------------------+--------+\n// | callback=        | JS identifier | When \"prettyPrint\" finishes  | none   |\n// |                  |               | window.exports[js_ident] is  |        |\n// |                  |               | called.                      |        |\n// |                  |               | The callback must be under   |        |\n// |                  |               | exports to reduce the risk   |        |\n// |                  |               | of XSS via query parameter   |        |\n// |                  |               | injection.                   |        |\n// +------------------+---------------+------------------------------+--------+\n\n// Exmaples\n// .../prettify.js?lang=css&skin=sunburst\n//   1. Loads the CSS language handler which can be used to prettify CSS\n//      stylesheets, HTML <style> element bodies and style=\"...\" attributes\n//      values.\n//   2. Loads the sunburst.css stylesheet instead of the default prettify.css\n//      stylesheet.\n//      A gallery of stylesheets is available at\n//      https://google-code-prettify.googlecode.com/svn/trunk/styles/index.html\n//   3. Since autorun=false is not specified, calls prettyPrint() on page load.\n\n\n/** @define {boolean} */\nvar IN_GLOBAL_SCOPE = false;\n\n(function () {\n  \"use strict\";\n\n  var win = window;\n  var setTimeout = win.setTimeout;\n  var doc = document;\n  var root = doc.documentElement;\n  var head = doc['head'] || doc.getElementsByTagName(\"head\")[0] || root;\n\n  // From http://javascript.nwbox.com/ContentLoaded/contentloaded.js\n  // Author: Diego Perini (diego.perini at gmail.com)\n  // Summary: cross-browser wrapper for DOMContentLoaded\n  // Updated: 20101020\n  // License: MIT\n  // Version: 1.2\n  function contentLoaded(callback) {\n    var addEventListener = doc['addEventListener'];\n    var done = false, top = true,\n        add = addEventListener ? 'addEventListener' : 'attachEvent',\n        rem = addEventListener ? 'removeEventListener' : 'detachEvent',\n        pre = addEventListener ? '' : 'on',\n\n        init = function(e) {\n          if (e.type == 'readystatechange' && doc.readyState != 'complete') {\n            return;\n          }\n          (e.type == 'load' ? win : doc)[rem](pre + e.type, init, false);\n          if (!done && (done = true)) { callback.call(win, e.type || e); }\n        },\n\n        poll = function() {\n          try {\n            root.doScroll('left');\n          } catch(e) {\n            setTimeout(poll, 50);\n            return;\n          }\n          init('poll');\n        };\n\n    if (doc.readyState == 'complete') {\n      callback.call(win, 'lazy');\n    } else {\n      if (doc.createEventObject && root.doScroll) {\n        try { top = !win.frameElement; } catch(e) { }\n        if (top) { poll(); }\n      }\n      doc[add](pre + 'DOMContentLoaded', init, false);\n      doc[add](pre + 'readystatechange', init, false);\n      win[add](pre + 'load', init, false);\n    }\n  }\n\n  // Given a list of URLs to stylesheets, loads the first that loads without\n  // triggering an error event.\n  function loadStylesheetsFallingBack(stylesheets) {\n    var n = stylesheets.length;\n    function load(i) {\n      if (i === n) { return; }\n      var link = doc.createElement('link');\n      link.rel = 'stylesheet';\n      link.type = 'text/css';\n      if (i + 1 < n) {\n        // http://pieisgood.org/test/script-link-events/ indicates that many\n        // versions of IE do not support onerror on <link>s, though\n        // http://msdn.microsoft.com/en-us/library/ie/ms535848(v=vs.85).aspx\n        // indicates that recent IEs do support error.\n        link.error = link.onerror = function () { load(i + 1); };\n      }\n      link.href = stylesheets[i];\n      head.appendChild(link);\n    }\n    load(0);\n  }\n\n  var scriptQuery = '';\n  // Look for the <script> node that loads this script to get its parameters.\n  // This starts looking at the end instead of just considering the last\n  // because deferred and async scripts run out of order.\n  // If the script is loaded twice, then this will run in reverse order.\n  for (var scripts = doc.scripts, i = scripts.length; --i >= 0;) {\n    var script = scripts[i];\n    var match = script.src.match(\n        /^[^?#]*\\/run_prettify\\.js(\\?[^#]*)?(?:#.*)?$/);\n    if (match) {\n      scriptQuery = match[1] || '';\n      // Remove the script from the DOM so that multiple runs at least run\n      // multiple times even if parameter sets are interpreted in reverse\n      // order.\n      script.parentNode.removeChild(script);\n      break;\n    }\n  }\n\n  // Pull parameters into local variables.\n  var autorun = true;\n  var langs = [];\n  var skins = [];\n  var callbacks = [];\n  scriptQuery.replace(\n      /[?&]([^&=]+)=([^&]+)/g,\n      function (_, name, value) {\n        value = decodeURIComponent(value);\n        name = decodeURIComponent(name);\n        if (name == 'autorun')   { autorun = !/^[0fn]/i.test(value); } else\n        if (name == 'lang')      { langs.push(value);                } else\n        if (name == 'skin')      { skins.push(value);                } else\n        if (name == 'callback')  { callbacks.push(value);            }\n      });\n\n  // Use https to avoid mixed content warnings in client pages and to\n  // prevent a MITM from rewrite prettify mid-flight.\n  // This only works if this script is loaded via https : something\n  // over which we exercise no control.\n  var LOADER_BASE_URL =\n     'https://google-code-prettify.googlecode.com/svn/loader';\n\n  for (var i = 0, n = langs.length; i < n; ++i) (function (lang) {\n    var script = doc.createElement(\"script\");\n\n    // Excerpted from jQuery.ajaxTransport(\"script\") to fire events when\n    // a script is finished loading.\n    // Attach handlers for each script\n    script.onload = script.onerror = script.onreadystatechange = function () {\n      if (script && (\n            !script.readyState || /loaded|complete/.test(script.readyState))) {\n        // Handle memory leak in IE\n        script.onerror = script.onload = script.onreadystatechange = null;\n\n        --pendingLanguages;\n        checkPendingLanguages();\n\n        // Remove the script\n        if (script.parentNode) {\n          script.parentNode.removeChild(script);\n        }\n\n        script = null;\n      }\n    };\n\n    script.type = 'text/javascript';\n    script.src = LOADER_BASE_URL\n      + '/lang-' + encodeURIComponent(langs[i]) + '.js';\n\n    // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending\n    head.insertBefore(script, head.firstChild);\n  })(langs[i]);\n\n  var pendingLanguages = langs.length;\n  function checkPendingLanguages() {\n    if (!pendingLanguages) {\n      setTimeout(onLangsLoaded, 0);\n    }\n  }\n\n  var skinUrls = [];\n  for (var i = 0, n = skins.length; i < n; ++i) {\n    skinUrls.push(LOADER_BASE_URL\n        + '/skins/' + encodeURIComponent(skins[i]) + '.css');\n  }\n  skinUrls.push(LOADER_BASE_URL + '/prettify.css');\n  loadStylesheetsFallingBack(skinUrls);\n\n  var prettyPrint = (function () {\n    // Copyright (C) 2006 Google Inc.\n    //\n    // Licensed under the Apache License, Version 2.0 (the \"License\");\n    // you may not use this file except in compliance with the License.\n    // You may obtain a copy of the License at\n    //\n    //      http://www.apache.org/licenses/LICENSE-2.0\n    //\n    // Unless required by applicable law or agreed to in writing, software\n    // distributed under the License is distributed on an \"AS IS\" BASIS,\n    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    // See the License for the specific language governing permissions and\n    // limitations under the License.\n    \n    \n    /**\n     * @fileoverview\n     * some functions for browser-side pretty printing of code contained in html.\n     *\n     * <p>\n     * For a fairly comprehensive set of languages see the\n     * <a href=\"http://google-code-prettify.googlecode.com/svn/trunk/README.html#langs\">README</a>\n     * file that came with this source.  At a minimum, the lexer should work on a\n     * number of languages including C and friends, Java, Python, Bash, SQL, HTML,\n     * XML, CSS, Javascript, and Makefiles.  It works passably on Ruby, PHP and Awk\n     * and a subset of Perl, but, because of commenting conventions, doesn't work on\n     * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class.\n     * <p>\n     * Usage: <ol>\n     * <li> include this source file in an html page via\n     *   {@code <script type=\"text/javascript\" src=\"/path/to/prettify.js\"></script>}\n     * <li> define style rules.  See the example page for examples.\n     * <li> mark the {@code <pre>} and {@code <code>} tags in your source with\n     *    {@code class=prettyprint.}\n     *    You can also use the (html deprecated) {@code <xmp>} tag, but the pretty\n     *    printer needs to do more substantial DOM manipulations to support that, so\n     *    some css styles may not be preserved.\n     * </ol>\n     * That's it.  I wanted to keep the API as simple as possible, so there's no\n     * need to specify which language the code is in, but if you wish, you can add\n     * another class to the {@code <pre>} or {@code <code>} element to specify the\n     * language, as in {@code <pre class=\"prettyprint lang-java\">}.  Any class that\n     * starts with \"lang-\" followed by a file extension, specifies the file type.\n     * See the \"lang-*.js\" files in this directory for code that implements\n     * per-language file handlers.\n     * <p>\n     * Change log:<br>\n     * cbeust, 2006/08/22\n     * <blockquote>\n     *   Java annotations (start with \"@\") are now captured as literals (\"lit\")\n     * </blockquote>\n     * @requires console\n     */\n    \n    // JSLint declarations\n    /*global console, document, navigator, setTimeout, window, define */\n    \n    /**\n     * Split {@code prettyPrint} into multiple timeouts so as not to interfere with\n     * UI events.\n     * If set to {@code false}, {@code prettyPrint()} is synchronous.\n     */\n    window['PR_SHOULD_USE_CONTINUATION'] = true;\n    \n    /**\n     * Pretty print a chunk of code.\n     * @param {string} sourceCodeHtml The HTML to pretty print.\n     * @param {string} opt_langExtension The language name to use.\n     *     Typically, a filename extension like 'cpp' or 'java'.\n     * @param {number|boolean} opt_numberLines True to number lines,\n     *     or the 1-indexed number of the first line in sourceCodeHtml.\n     * @return {string} code as html, but prettier\n     */\n    var prettyPrintOne;\n    /**\n     * Find all the {@code <pre>} and {@code <code>} tags in the DOM with\n     * {@code class=prettyprint} and prettify them.\n     *\n     * @param {Function} opt_whenDone called when prettifying is done.\n     * @param {HTMLElement|HTMLDocument} opt_root an element or document\n     *   containing all the elements to pretty print.\n     *   Defaults to {@code document.body}.\n     */\n    var prettyPrint;\n    \n    \n    (function () {\n      var win = window;\n      // Keyword lists for various languages.\n      // We use things that coerce to strings to make them compact when minified\n      // and to defeat aggressive optimizers that fold large string constants.\n      var FLOW_CONTROL_KEYWORDS = [\"break,continue,do,else,for,if,return,while\"];\n      var C_KEYWORDS = [FLOW_CONTROL_KEYWORDS,\"auto,case,char,const,default,\" + \n          \"double,enum,extern,float,goto,inline,int,long,register,short,signed,\" +\n          \"sizeof,static,struct,switch,typedef,union,unsigned,void,volatile\"];\n      var COMMON_KEYWORDS = [C_KEYWORDS,\"catch,class,delete,false,import,\" +\n          \"new,operator,private,protected,public,this,throw,true,try,typeof\"];\n      var CPP_KEYWORDS = [COMMON_KEYWORDS,\"alignof,align_union,asm,axiom,bool,\" +\n          \"concept,concept_map,const_cast,constexpr,decltype,delegate,\" +\n          \"dynamic_cast,explicit,export,friend,generic,late_check,\" +\n          \"mutable,namespace,nullptr,property,reinterpret_cast,static_assert,\" +\n          \"static_cast,template,typeid,typename,using,virtual,where\"];\n      var JAVA_KEYWORDS = [COMMON_KEYWORDS,\n          \"abstract,assert,boolean,byte,extends,final,finally,implements,import,\" +\n          \"instanceof,interface,null,native,package,strictfp,super,synchronized,\" +\n          \"throws,transient\"];\n      var CSHARP_KEYWORDS = [JAVA_KEYWORDS,\n          \"as,base,by,checked,decimal,delegate,descending,dynamic,event,\" +\n          \"fixed,foreach,from,group,implicit,in,internal,into,is,let,\" +\n          \"lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,\" +\n          \"sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,\" +\n          \"var,virtual,where\"];\n      var COFFEE_KEYWORDS = \"all,and,by,catch,class,else,extends,false,finally,\" +\n          \"for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,\" +\n          \"throw,true,try,unless,until,when,while,yes\";\n      var JSCRIPT_KEYWORDS = [COMMON_KEYWORDS,\n          \"debugger,eval,export,function,get,null,set,undefined,var,with,\" +\n          \"Infinity,NaN\"];\n      var PERL_KEYWORDS = \"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,\" +\n          \"goto,if,import,last,local,my,next,no,our,print,package,redo,require,\" +\n          \"sub,undef,unless,until,use,wantarray,while,BEGIN,END\";\n      var PYTHON_KEYWORDS = [FLOW_CONTROL_KEYWORDS, \"and,as,assert,class,def,del,\" +\n          \"elif,except,exec,finally,from,global,import,in,is,lambda,\" +\n          \"nonlocal,not,or,pass,print,raise,try,with,yield,\" +\n          \"False,True,None\"];\n      var RUBY_KEYWORDS = [FLOW_CONTROL_KEYWORDS, \"alias,and,begin,case,class,\" +\n          \"def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,\" +\n          \"rescue,retry,self,super,then,true,undef,unless,until,when,yield,\" +\n          \"BEGIN,END\"];\n       var RUST_KEYWORDS = [FLOW_CONTROL_KEYWORDS, \"as,assert,const,copy,drop,\" +\n          \"enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,\" +\n          \"pub,pure,ref,self,static,struct,true,trait,type,unsafe,use\"];\n      var SH_KEYWORDS = [FLOW_CONTROL_KEYWORDS, \"case,done,elif,esac,eval,fi,\" +\n          \"function,in,local,set,then,until\"];\n      var ALL_KEYWORDS = [\n          CPP_KEYWORDS, CSHARP_KEYWORDS, JSCRIPT_KEYWORDS, PERL_KEYWORDS,\n          PYTHON_KEYWORDS, RUBY_KEYWORDS, SH_KEYWORDS];\n      var C_TYPES = /^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\\d*)\\b/;\n    \n      // token style names.  correspond to css classes\n      /**\n       * token style for a string literal\n       * @const\n       */\n      var PR_STRING = 'str';\n      /**\n       * token style for a keyword\n       * @const\n       */\n      var PR_KEYWORD = 'kwd';\n      /**\n       * token style for a comment\n       * @const\n       */\n      var PR_COMMENT = 'com';\n      /**\n       * token style for a type\n       * @const\n       */\n      var PR_TYPE = 'typ';\n      /**\n       * token style for a literal value.  e.g. 1, null, true.\n       * @const\n       */\n      var PR_LITERAL = 'lit';\n      /**\n       * token style for a punctuation string.\n       * @const\n       */\n      var PR_PUNCTUATION = 'pun';\n      /**\n       * token style for plain text.\n       * @const\n       */\n      var PR_PLAIN = 'pln';\n    \n      /**\n       * token style for an sgml tag.\n       * @const\n       */\n      var PR_TAG = 'tag';\n      /**\n       * token style for a markup declaration such as a DOCTYPE.\n       * @const\n       */\n      var PR_DECLARATION = 'dec';\n      /**\n       * token style for embedded source.\n       * @const\n       */\n      var PR_SOURCE = 'src';\n      /**\n       * token style for an sgml attribute name.\n       * @const\n       */\n      var PR_ATTRIB_NAME = 'atn';\n      /**\n       * token style for an sgml attribute value.\n       * @const\n       */\n      var PR_ATTRIB_VALUE = 'atv';\n    \n      /**\n       * A class that indicates a section of markup that is not code, e.g. to allow\n       * embedding of line numbers within code listings.\n       * @const\n       */\n      var PR_NOCODE = 'nocode';\n    \n      \n      \n      /**\n       * A set of tokens that can precede a regular expression literal in\n       * javascript\n       * http://web.archive.org/web/20070717142515/http://www.mozilla.org/js/language/js20/rationale/syntax.html\n       * has the full list, but I've removed ones that might be problematic when\n       * seen in languages that don't support regular expression literals.\n       *\n       * <p>Specifically, I've removed any keywords that can't precede a regexp\n       * literal in a syntactically legal javascript program, and I've removed the\n       * \"in\" keyword since it's not a keyword in many languages, and might be used\n       * as a count of inches.\n       *\n       * <p>The link above does not accurately describe EcmaScript rules since\n       * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works\n       * very well in practice.\n       *\n       * @private\n       * @const\n       */\n      var REGEXP_PRECEDER_PATTERN = '(?:^^\\\\.?|[+-]|[!=]=?=?|\\\\#|%=?|&&?=?|\\\\(|\\\\*=?|[+\\\\-]=|->|\\\\/=?|::?|<<?=?|>>?>?=?|,|;|\\\\?|@|\\\\[|~|{|\\\\^\\\\^?=?|\\\\|\\\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\\\s*';\n      \n      // CAVEAT: this does not properly handle the case where a regular\n      // expression immediately follows another since a regular expression may\n      // have flags for case-sensitivity and the like.  Having regexp tokens\n      // adjacent is not valid in any language I'm aware of, so I'm punting.\n      // TODO: maybe style special characters inside a regexp as punctuation.\n    \n      /**\n       * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally\n       * matches the union of the sets of strings matched by the input RegExp.\n       * Since it matches globally, if the input strings have a start-of-input\n       * anchor (/^.../), it is ignored for the purposes of unioning.\n       * @param {Array.<RegExp>} regexs non multiline, non-global regexs.\n       * @return {RegExp} a global regex.\n       */\n      function combinePrefixPatterns(regexs) {\n        var capturedGroupIndex = 0;\n      \n        var needToFoldCase = false;\n        var ignoreCase = false;\n        for (var i = 0, n = regexs.length; i < n; ++i) {\n          var regex = regexs[i];\n          if (regex.ignoreCase) {\n            ignoreCase = true;\n          } else if (/[a-z]/i.test(regex.source.replace(\n                         /\\\\u[0-9a-f]{4}|\\\\x[0-9a-f]{2}|\\\\[^ux]/gi, ''))) {\n            needToFoldCase = true;\n            ignoreCase = false;\n            break;\n          }\n        }\n      \n        var escapeCharToCodeUnit = {\n          'b': 8,\n          't': 9,\n          'n': 0xa,\n          'v': 0xb,\n          'f': 0xc,\n          'r': 0xd\n        };\n      \n        function decodeEscape(charsetPart) {\n          var cc0 = charsetPart.charCodeAt(0);\n          if (cc0 !== 92 /* \\\\ */) {\n            return cc0;\n          }\n          var c1 = charsetPart.charAt(1);\n          cc0 = escapeCharToCodeUnit[c1];\n          if (cc0) {\n            return cc0;\n          } else if ('0' <= c1 && c1 <= '7') {\n            return parseInt(charsetPart.substring(1), 8);\n          } else if (c1 === 'u' || c1 === 'x') {\n            return parseInt(charsetPart.substring(2), 16);\n          } else {\n            return charsetPart.charCodeAt(1);\n          }\n        }\n      \n        function encodeEscape(charCode) {\n          if (charCode < 0x20) {\n            return (charCode < 0x10 ? '\\\\x0' : '\\\\x') + charCode.toString(16);\n          }\n          var ch = String.fromCharCode(charCode);\n          return (ch === '\\\\' || ch === '-' || ch === ']' || ch === '^')\n              ? \"\\\\\" + ch : ch;\n        }\n      \n        function caseFoldCharset(charSet) {\n          var charsetParts = charSet.substring(1, charSet.length - 1).match(\n              new RegExp(\n                  '\\\\\\\\u[0-9A-Fa-f]{4}'\n                  + '|\\\\\\\\x[0-9A-Fa-f]{2}'\n                  + '|\\\\\\\\[0-3][0-7]{0,2}'\n                  + '|\\\\\\\\[0-7]{1,2}'\n                  + '|\\\\\\\\[\\\\s\\\\S]'\n                  + '|-'\n                  + '|[^-\\\\\\\\]',\n                  'g'));\n          var ranges = [];\n          var inverse = charsetParts[0] === '^';\n      \n          var out = ['['];\n          if (inverse) { out.push('^'); }\n      \n          for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {\n            var p = charsetParts[i];\n            if (/\\\\[bdsw]/i.test(p)) {  // Don't muck with named groups.\n              out.push(p);\n            } else {\n              var start = decodeEscape(p);\n              var end;\n              if (i + 2 < n && '-' === charsetParts[i + 1]) {\n                end = decodeEscape(charsetParts[i + 2]);\n                i += 2;\n              } else {\n                end = start;\n              }\n              ranges.push([start, end]);\n              // If the range might intersect letters, then expand it.\n              // This case handling is too simplistic.\n              // It does not deal with non-latin case folding.\n              // It works for latin source code identifiers though.\n              if (!(end < 65 || start > 122)) {\n                if (!(end < 65 || start > 90)) {\n                  ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);\n                }\n                if (!(end < 97 || start > 122)) {\n                  ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);\n                }\n              }\n            }\n          }\n      \n          // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]\n          // -> [[1, 12], [14, 14], [16, 17]]\n          ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });\n          var consolidatedRanges = [];\n          var lastRange = [];\n          for (var i = 0; i < ranges.length; ++i) {\n            var range = ranges[i];\n            if (range[0] <= lastRange[1] + 1) {\n              lastRange[1] = Math.max(lastRange[1], range[1]);\n            } else {\n              consolidatedRanges.push(lastRange = range);\n            }\n          }\n      \n          for (var i = 0; i < consolidatedRanges.length; ++i) {\n            var range = consolidatedRanges[i];\n            out.push(encodeEscape(range[0]));\n            if (range[1] > range[0]) {\n              if (range[1] + 1 > range[0]) { out.push('-'); }\n              out.push(encodeEscape(range[1]));\n            }\n          }\n          out.push(']');\n          return out.join('');\n        }\n      \n        function allowAnywhereFoldCaseAndRenumberGroups(regex) {\n          // Split into character sets, escape sequences, punctuation strings\n          // like ('(', '(?:', ')', '^'), and runs of characters that do not\n          // include any of the above.\n          var parts = regex.source.match(\n              new RegExp(\n                  '(?:'\n                  + '\\\\[(?:[^\\\\x5C\\\\x5D]|\\\\\\\\[\\\\s\\\\S])*\\\\]'  // a character set\n                  + '|\\\\\\\\u[A-Fa-f0-9]{4}'  // a unicode escape\n                  + '|\\\\\\\\x[A-Fa-f0-9]{2}'  // a hex escape\n                  + '|\\\\\\\\[0-9]+'  // a back-reference or octal escape\n                  + '|\\\\\\\\[^ux0-9]'  // other escape sequence\n                  + '|\\\\(\\\\?[:!=]'  // start of a non-capturing group\n                  + '|[\\\\(\\\\)\\\\^]'  // start/end of a group, or line start\n                  + '|[^\\\\x5B\\\\x5C\\\\(\\\\)\\\\^]+'  // run of other characters\n                  + ')',\n                  'g'));\n          var n = parts.length;\n      \n          // Maps captured group numbers to the number they will occupy in\n          // the output or to -1 if that has not been determined, or to\n          // undefined if they need not be capturing in the output.\n          var capturedGroups = [];\n      \n          // Walk over and identify back references to build the capturedGroups\n          // mapping.\n          for (var i = 0, groupIndex = 0; i < n; ++i) {\n            var p = parts[i];\n            if (p === '(') {\n              // groups are 1-indexed, so max group index is count of '('\n              ++groupIndex;\n            } else if ('\\\\' === p.charAt(0)) {\n              var decimalValue = +p.substring(1);\n              if (decimalValue) {\n                if (decimalValue <= groupIndex) {\n                  capturedGroups[decimalValue] = -1;\n                } else {\n                  // Replace with an unambiguous escape sequence so that\n                  // an octal escape sequence does not turn into a backreference\n                  // to a capturing group from an earlier regex.\n                  parts[i] = encodeEscape(decimalValue);\n                }\n              }\n            }\n          }\n      \n          // Renumber groups and reduce capturing groups to non-capturing groups\n          // where possible.\n          for (var i = 1; i < capturedGroups.length; ++i) {\n            if (-1 === capturedGroups[i]) {\n              capturedGroups[i] = ++capturedGroupIndex;\n            }\n          }\n          for (var i = 0, groupIndex = 0; i < n; ++i) {\n            var p = parts[i];\n            if (p === '(') {\n              ++groupIndex;\n              if (!capturedGroups[groupIndex]) {\n                parts[i] = '(?:';\n              }\n            } else if ('\\\\' === p.charAt(0)) {\n              var decimalValue = +p.substring(1);\n              if (decimalValue && decimalValue <= groupIndex) {\n                parts[i] = '\\\\' + capturedGroups[decimalValue];\n              }\n            }\n          }\n      \n          // Remove any prefix anchors so that the output will match anywhere.\n          // ^^ really does mean an anchored match though.\n          for (var i = 0; i < n; ++i) {\n            if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }\n          }\n      \n          // Expand letters to groups to handle mixing of case-sensitive and\n          // case-insensitive patterns if necessary.\n          if (regex.ignoreCase && needToFoldCase) {\n            for (var i = 0; i < n; ++i) {\n              var p = parts[i];\n              var ch0 = p.charAt(0);\n              if (p.length >= 2 && ch0 === '[') {\n                parts[i] = caseFoldCharset(p);\n              } else if (ch0 !== '\\\\') {\n                // TODO: handle letters in numeric escapes.\n                parts[i] = p.replace(\n                    /[a-zA-Z]/g,\n                    function (ch) {\n                      var cc = ch.charCodeAt(0);\n                      return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';\n                    });\n              }\n            }\n          }\n      \n          return parts.join('');\n        }\n      \n        var rewritten = [];\n        for (var i = 0, n = regexs.length; i < n; ++i) {\n          var regex = regexs[i];\n          if (regex.global || regex.multiline) { throw new Error('' + regex); }\n          rewritten.push(\n              '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');\n        }\n      \n        return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');\n      }\n    \n      /**\n       * Split markup into a string of source code and an array mapping ranges in\n       * that string to the text nodes in which they appear.\n       *\n       * <p>\n       * The HTML DOM structure:</p>\n       * <pre>\n       * (Element   \"p\"\n       *   (Element \"b\"\n       *     (Text  \"print \"))       ; #1\n       *   (Text    \"'Hello '\")      ; #2\n       *   (Element \"br\")            ; #3\n       *   (Text    \"  + 'World';\")) ; #4\n       * </pre>\n       * <p>\n       * corresponds to the HTML\n       * {@code <p><b>print </b>'Hello '<br>  + 'World';</p>}.</p>\n       *\n       * <p>\n       * It will produce the output:</p>\n       * <pre>\n       * {\n       *   sourceCode: \"print 'Hello '\\n  + 'World';\",\n       *   //                     1          2\n       *   //           012345678901234 5678901234567\n       *   spans: [0, #1, 6, #2, 14, #3, 15, #4]\n       * }\n       * </pre>\n       * <p>\n       * where #1 is a reference to the {@code \"print \"} text node above, and so\n       * on for the other text nodes.\n       * </p>\n       *\n       * <p>\n       * The {@code} spans array is an array of pairs.  Even elements are the start\n       * indices of substrings, and odd elements are the text nodes (or BR elements)\n       * that contain the text for those substrings.\n       * Substrings continue until the next index or the end of the source.\n       * </p>\n       *\n       * @param {Node} node an HTML DOM subtree containing source-code.\n       * @param {boolean} isPreformatted true if white-space in text nodes should\n       *    be considered significant.\n       * @return {Object} source code and the text nodes in which they occur.\n       */\n      function extractSourceSpans(node, isPreformatted) {\n        var nocode = /(?:^|\\s)nocode(?:\\s|$)/;\n      \n        var chunks = [];\n        var length = 0;\n        var spans = [];\n        var k = 0;\n      \n        function walk(node) {\n          var type = node.nodeType;\n          if (type == 1) {  // Element\n            if (nocode.test(node.className)) { return; }\n            for (var child = node.firstChild; child; child = child.nextSibling) {\n              walk(child);\n            }\n            var nodeName = node.nodeName.toLowerCase();\n            if ('br' === nodeName || 'li' === nodeName) {\n              chunks[k] = '\\n';\n              spans[k << 1] = length++;\n              spans[(k++ << 1) | 1] = node;\n            }\n          } else if (type == 3 || type == 4) {  // Text\n            var text = node.nodeValue;\n            if (text.length) {\n              if (!isPreformatted) {\n                text = text.replace(/[ \\t\\r\\n]+/g, ' ');\n              } else {\n                text = text.replace(/\\r\\n?/g, '\\n');  // Normalize newlines.\n              }\n              // TODO: handle tabs here?\n              chunks[k] = text;\n              spans[k << 1] = length;\n              length += text.length;\n              spans[(k++ << 1) | 1] = node;\n            }\n          }\n        }\n      \n        walk(node);\n      \n        return {\n          sourceCode: chunks.join('').replace(/\\n$/, ''),\n          spans: spans\n        };\n      }\n    \n      /**\n       * Apply the given language handler to sourceCode and add the resulting\n       * decorations to out.\n       * @param {number} basePos the index of sourceCode within the chunk of source\n       *    whose decorations are already present on out.\n       */\n      function appendDecorations(basePos, sourceCode, langHandler, out) {\n        if (!sourceCode) { return; }\n        var job = {\n          sourceCode: sourceCode,\n          basePos: basePos\n        };\n        langHandler(job);\n        out.push.apply(out, job.decorations);\n      }\n    \n      var notWs = /\\S/;\n    \n      /**\n       * Given an element, if it contains only one child element and any text nodes\n       * it contains contain only space characters, return the sole child element.\n       * Otherwise returns undefined.\n       * <p>\n       * This is meant to return the CODE element in {@code <pre><code ...>} when\n       * there is a single child element that contains all the non-space textual\n       * content, but not to return anything where there are multiple child elements\n       * as in {@code <pre><code>...</code><code>...</code></pre>} or when there\n       * is textual content.\n       */\n      function childContentWrapper(element) {\n        var wrapper = undefined;\n        for (var c = element.firstChild; c; c = c.nextSibling) {\n          var type = c.nodeType;\n          wrapper = (type === 1)  // Element Node\n              ? (wrapper ? element : c)\n              : (type === 3)  // Text Node\n              ? (notWs.test(c.nodeValue) ? element : wrapper)\n              : wrapper;\n        }\n        return wrapper === element ? undefined : wrapper;\n      }\n    \n      /** Given triples of [style, pattern, context] returns a lexing function,\n        * The lexing function interprets the patterns to find token boundaries and\n        * returns a decoration list of the form\n        * [index_0, style_0, index_1, style_1, ..., index_n, style_n]\n        * where index_n is an index into the sourceCode, and style_n is a style\n        * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to\n        * all characters in sourceCode[index_n-1:index_n].\n        *\n        * The stylePatterns is a list whose elements have the form\n        * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].\n        *\n        * Style is a style constant like PR_PLAIN, or can be a string of the\n        * form 'lang-FOO', where FOO is a language extension describing the\n        * language of the portion of the token in $1 after pattern executes.\n        * E.g., if style is 'lang-lisp', and group 1 contains the text\n        * '(hello (world))', then that portion of the token will be passed to the\n        * registered lisp handler for formatting.\n        * The text before and after group 1 will be restyled using this decorator\n        * so decorators should take care that this doesn't result in infinite\n        * recursion.  For example, the HTML lexer rule for SCRIPT elements looks\n        * something like ['lang-js', /<[s]cript>(.+?)<\\/script>/].  This may match\n        * '<script>foo()<\\/script>', which would cause the current decorator to\n        * be called with '<script>' which would not match the same rule since\n        * group 1 must not be empty, so it would be instead styled as PR_TAG by\n        * the generic tag rule.  The handler registered for the 'js' extension would\n        * then be called with 'foo()', and finally, the current decorator would\n        * be called with '<\\/script>' which would not match the original rule and\n        * so the generic tag rule would identify it as a tag.\n        *\n        * Pattern must only match prefixes, and if it matches a prefix, then that\n        * match is considered a token with the same style.\n        *\n        * Context is applied to the last non-whitespace, non-comment token\n        * recognized.\n        *\n        * Shortcut is an optional string of characters, any of which, if the first\n        * character, gurantee that this pattern and only this pattern matches.\n        *\n        * @param {Array} shortcutStylePatterns patterns that always start with\n        *   a known character.  Must have a shortcut string.\n        * @param {Array} fallthroughStylePatterns patterns that will be tried in\n        *   order if the shortcut ones fail.  May have shortcuts.\n        *\n        * @return {function (Object)} a\n        *   function that takes source code and returns a list of decorations.\n        */\n      function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {\n        var shortcuts = {};\n        var tokenizer;\n        (function () {\n          var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);\n          var allRegexs = [];\n          var regexKeys = {};\n          for (var i = 0, n = allPatterns.length; i < n; ++i) {\n            var patternParts = allPatterns[i];\n            var shortcutChars = patternParts[3];\n            if (shortcutChars) {\n              for (var c = shortcutChars.length; --c >= 0;) {\n                shortcuts[shortcutChars.charAt(c)] = patternParts;\n              }\n            }\n            var regex = patternParts[1];\n            var k = '' + regex;\n            if (!regexKeys.hasOwnProperty(k)) {\n              allRegexs.push(regex);\n              regexKeys[k] = null;\n            }\n          }\n          allRegexs.push(/[\\0-\\uffff]/);\n          tokenizer = combinePrefixPatterns(allRegexs);\n        })();\n    \n        var nPatterns = fallthroughStylePatterns.length;\n    \n        /**\n         * Lexes job.sourceCode and produces an output array job.decorations of\n         * style classes preceded by the position at which they start in\n         * job.sourceCode in order.\n         *\n         * @param {Object} job an object like <pre>{\n         *    sourceCode: {string} sourceText plain text,\n         *    basePos: {int} position of job.sourceCode in the larger chunk of\n         *        sourceCode.\n         * }</pre>\n         */\n        var decorate = function (job) {\n          var sourceCode = job.sourceCode, basePos = job.basePos;\n          /** Even entries are positions in source in ascending order.  Odd enties\n            * are style markers (e.g., PR_COMMENT) that run from that position until\n            * the end.\n            * @type {Array.<number|string>}\n            */\n          var decorations = [basePos, PR_PLAIN];\n          var pos = 0;  // index into sourceCode\n          var tokens = sourceCode.match(tokenizer) || [];\n          var styleCache = {};\n    \n          for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {\n            var token = tokens[ti];\n            var style = styleCache[token];\n            var match = void 0;\n    \n            var isEmbedded;\n            if (typeof style === 'string') {\n              isEmbedded = false;\n            } else {\n              var patternParts = shortcuts[token.charAt(0)];\n              if (patternParts) {\n                match = token.match(patternParts[1]);\n                style = patternParts[0];\n              } else {\n                for (var i = 0; i < nPatterns; ++i) {\n                  patternParts = fallthroughStylePatterns[i];\n                  match = token.match(patternParts[1]);\n                  if (match) {\n                    style = patternParts[0];\n                    break;\n                  }\n                }\n    \n                if (!match) {  // make sure that we make progress\n                  style = PR_PLAIN;\n                }\n              }\n    \n              isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);\n              if (isEmbedded && !(match && typeof match[1] === 'string')) {\n                isEmbedded = false;\n                style = PR_SOURCE;\n              }\n    \n              if (!isEmbedded) { styleCache[token] = style; }\n            }\n    \n            var tokenStart = pos;\n            pos += token.length;\n    \n            if (!isEmbedded) {\n              decorations.push(basePos + tokenStart, style);\n            } else {  // Treat group 1 as an embedded block of source code.\n              var embeddedSource = match[1];\n              var embeddedSourceStart = token.indexOf(embeddedSource);\n              var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;\n              if (match[2]) {\n                // If embeddedSource can be blank, then it would match at the\n                // beginning which would cause us to infinitely recurse on the\n                // entire token, so we catch the right context in match[2].\n                embeddedSourceEnd = token.length - match[2].length;\n                embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;\n              }\n              var lang = style.substring(5);\n              // Decorate the left of the embedded source\n              appendDecorations(\n                  basePos + tokenStart,\n                  token.substring(0, embeddedSourceStart),\n                  decorate, decorations);\n              // Decorate the embedded source\n              appendDecorations(\n                  basePos + tokenStart + embeddedSourceStart,\n                  embeddedSource,\n                  langHandlerForExtension(lang, embeddedSource),\n                  decorations);\n              // Decorate the right of the embedded section\n              appendDecorations(\n                  basePos + tokenStart + embeddedSourceEnd,\n                  token.substring(embeddedSourceEnd),\n                  decorate, decorations);\n            }\n          }\n          job.decorations = decorations;\n        };\n        return decorate;\n      }\n    \n      /** returns a function that produces a list of decorations from source text.\n        *\n        * This code treats \", ', and ` as string delimiters, and \\ as a string\n        * escape.  It does not recognize perl's qq() style strings.\n        * It has no special handling for double delimiter escapes as in basic, or\n        * the tripled delimiters used in python, but should work on those regardless\n        * although in those cases a single string literal may be broken up into\n        * multiple adjacent string literals.\n        *\n        * It recognizes C, C++, and shell style comments.\n        *\n        * @param {Object} options a set of optional parameters.\n        * @return {function (Object)} a function that examines the source code\n        *     in the input job and builds the decoration list.\n        */\n      function sourceDecorator(options) {\n        var shortcutStylePatterns = [], fallthroughStylePatterns = [];\n        if (options['tripleQuotedStrings']) {\n          // '''multi-line-string''', 'single-line-string', and double-quoted\n          shortcutStylePatterns.push(\n              [PR_STRING,  /^(?:\\'\\'\\'(?:[^\\'\\\\]|\\\\[\\s\\S]|\\'{1,2}(?=[^\\']))*(?:\\'\\'\\'|$)|\\\"\\\"\\\"(?:[^\\\"\\\\]|\\\\[\\s\\S]|\\\"{1,2}(?=[^\\\"]))*(?:\\\"\\\"\\\"|$)|\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$))/,\n               null, '\\'\"']);\n        } else if (options['multiLineStrings']) {\n          // 'multi-line-string', \"multi-line-string\"\n          shortcutStylePatterns.push(\n              [PR_STRING,  /^(?:\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$)|\\`(?:[^\\\\\\`]|\\\\[\\s\\S])*(?:\\`|$))/,\n               null, '\\'\"`']);\n        } else {\n          // 'single-line-string', \"single-line-string\"\n          shortcutStylePatterns.push(\n              [PR_STRING,\n               /^(?:\\'(?:[^\\\\\\'\\r\\n]|\\\\.)*(?:\\'|$)|\\\"(?:[^\\\\\\\"\\r\\n]|\\\\.)*(?:\\\"|$))/,\n               null, '\"\\'']);\n        }\n        if (options['verbatimStrings']) {\n          // verbatim-string-literal production from the C# grammar.  See issue 93.\n          fallthroughStylePatterns.push(\n              [PR_STRING, /^@\\\"(?:[^\\\"]|\\\"\\\")*(?:\\\"|$)/, null]);\n        }\n        var hc = options['hashComments'];\n        if (hc) {\n          if (options['cStyleComments']) {\n            if (hc > 1) {  // multiline hash comments\n              shortcutStylePatterns.push(\n                  [PR_COMMENT, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#']);\n            } else {\n              // Stop C preprocessor declarations at an unclosed open comment\n              shortcutStylePatterns.push(\n                  [PR_COMMENT, /^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\\b|[^\\r\\n]*)/,\n                   null, '#']);\n            }\n            // #include <stdio.h>\n            fallthroughStylePatterns.push(\n                [PR_STRING,\n                 /^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h(?:h|pp|\\+\\+)?|[a-z]\\w*)>/,\n                 null]);\n          } else {\n            shortcutStylePatterns.push([PR_COMMENT, /^#[^\\r\\n]*/, null, '#']);\n          }\n        }\n        if (options['cStyleComments']) {\n          fallthroughStylePatterns.push([PR_COMMENT, /^\\/\\/[^\\r\\n]*/, null]);\n          fallthroughStylePatterns.push(\n              [PR_COMMENT, /^\\/\\*[\\s\\S]*?(?:\\*\\/|$)/, null]);\n        }\n        var regexLiterals = options['regexLiterals'];\n        if (regexLiterals) {\n          /**\n           * @const\n           */\n          var regexExcls = regexLiterals > 1\n            ? ''  // Multiline regex literals\n            : '\\n\\r';\n          /**\n           * @const\n           */\n          var regexAny = regexExcls ? '.' : '[\\\\S\\\\s]';\n          /**\n           * @const\n           */\n          var REGEX_LITERAL = (\n              // A regular expression literal starts with a slash that is\n              // not followed by * or / so that it is not confused with\n              // comments.\n              '/(?=[^/*' + regexExcls + '])'\n              // and then contains any number of raw characters,\n              + '(?:[^/\\\\x5B\\\\x5C' + regexExcls + ']'\n              // escape sequences (\\x5C),\n              +    '|\\\\x5C' + regexAny\n              // or non-nesting character sets (\\x5B\\x5D);\n              +    '|\\\\x5B(?:[^\\\\x5C\\\\x5D' + regexExcls + ']'\n              +             '|\\\\x5C' + regexAny + ')*(?:\\\\x5D|$))+'\n              // finally closed by a /.\n              + '/');\n          fallthroughStylePatterns.push(\n              ['lang-regex',\n               RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')\n               ]);\n        }\n    \n        var types = options['types'];\n        if (types) {\n          fallthroughStylePatterns.push([PR_TYPE, types]);\n        }\n    \n        var keywords = (\"\" + options['keywords']).replace(/^ | $/g, '');\n        if (keywords.length) {\n          fallthroughStylePatterns.push(\n              [PR_KEYWORD,\n               new RegExp('^(?:' + keywords.replace(/[\\s,]+/g, '|') + ')\\\\b'),\n               null]);\n        }\n    \n        shortcutStylePatterns.push([PR_PLAIN,       /^\\s+/, null, ' \\r\\n\\t\\xA0']);\n    \n        var punctuation =\n          // The Bash man page says\n    \n          // A word is a sequence of characters considered as a single\n          // unit by GRUB. Words are separated by metacharacters,\n          // which are the following plus space, tab, and newline: { }\n          // | & $ ; < >\n          // ...\n          \n          // A word beginning with # causes that word and all remaining\n          // characters on that line to be ignored.\n    \n          // which means that only a '#' after /(?:^|[{}|&$;<>\\s])/ starts a\n          // comment but empirically\n          // $ echo {#}\n          // {#}\n          // $ echo \\$#\n          // $#\n          // $ echo }#\n          // }#\n    \n          // so /(?:^|[|&;<>\\s])/ is more appropriate.\n    \n          // http://gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html#SEC3\n          // suggests that this definition is compatible with a\n          // default mode that tries to use a single token definition\n          // to recognize both bash/python style comments and C\n          // preprocessor directives.\n    \n          // This definition of punctuation does not include # in the list of\n          // follow-on exclusions, so # will not be broken before if preceeded\n          // by a punctuation character.  We could try to exclude # after\n          // [|&;<>] but that doesn't seem to cause many major problems.\n          // If that does turn out to be a problem, we should change the below\n          // when hc is truthy to include # in the run of punctuation characters\n          // only when not followint [|&;<>].\n          '^.[^\\\\s\\\\w.$@\\'\"`/\\\\\\\\]*';\n        if (options['regexLiterals']) {\n          punctuation += '(?!\\s*\\/)';\n        }\n    \n        fallthroughStylePatterns.push(\n            // TODO(mikesamuel): recognize non-latin letters and numerals in idents\n            [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],\n            [PR_TYPE,        /^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\\w+_t\\b)/, null],\n            [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],\n            [PR_LITERAL,\n             new RegExp(\n                 '^(?:'\n                 // A hex number\n                 + '0x[a-f0-9]+'\n                 // or an octal or decimal number,\n                 + '|(?:\\\\d(?:_\\\\d+)*\\\\d*(?:\\\\.\\\\d*)?|\\\\.\\\\d\\\\+)'\n                 // possibly in scientific notation\n                 + '(?:e[+\\\\-]?\\\\d+)?'\n                 + ')'\n                 // with an optional modifier like UL for unsigned long\n                 + '[a-z]*', 'i'),\n             null, '0123456789'],\n            // Don't treat escaped quotes in bash as starting strings.\n            // See issue 144.\n            [PR_PLAIN,       /^\\\\[\\s\\S]?/, null],\n            [PR_PUNCTUATION, new RegExp(punctuation), null]);\n    \n        return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);\n      }\n    \n      var decorateSource = sourceDecorator({\n            'keywords': ALL_KEYWORDS,\n            'hashComments': true,\n            'cStyleComments': true,\n            'multiLineStrings': true,\n            'regexLiterals': true\n          });\n    \n      /**\n       * Given a DOM subtree, wraps it in a list, and puts each line into its own\n       * list item.\n       *\n       * @param {Node} node modified in place.  Its content is pulled into an\n       *     HTMLOListElement, and each line is moved into a separate list item.\n       *     This requires cloning elements, so the input might not have unique\n       *     IDs after numbering.\n       * @param {boolean} isPreformatted true iff white-space in text nodes should\n       *     be treated as significant.\n       */\n      function numberLines(node, opt_startLineNum, isPreformatted) {\n        var nocode = /(?:^|\\s)nocode(?:\\s|$)/;\n        var lineBreak = /\\r\\n?|\\n/;\n      \n        var document = node.ownerDocument;\n      \n        var li = document.createElement('li');\n        while (node.firstChild) {\n          li.appendChild(node.firstChild);\n        }\n        // An array of lines.  We split below, so this is initialized to one\n        // un-split line.\n        var listItems = [li];\n      \n        function walk(node) {\n          var type = node.nodeType;\n          if (type == 1 && !nocode.test(node.className)) {  // Element\n            if ('br' === node.nodeName) {\n              breakAfter(node);\n              // Discard the <BR> since it is now flush against a </LI>.\n              if (node.parentNode) {\n                node.parentNode.removeChild(node);\n              }\n            } else {\n              for (var child = node.firstChild; child; child = child.nextSibling) {\n                walk(child);\n              }\n            }\n          } else if ((type == 3 || type == 4) && isPreformatted) {  // Text\n            var text = node.nodeValue;\n            var match = text.match(lineBreak);\n            if (match) {\n              var firstLine = text.substring(0, match.index);\n              node.nodeValue = firstLine;\n              var tail = text.substring(match.index + match[0].length);\n              if (tail) {\n                var parent = node.parentNode;\n                parent.insertBefore(\n                  document.createTextNode(tail), node.nextSibling);\n              }\n              breakAfter(node);\n              if (!firstLine) {\n                // Don't leave blank text nodes in the DOM.\n                node.parentNode.removeChild(node);\n              }\n            }\n          }\n        }\n      \n        // Split a line after the given node.\n        function breakAfter(lineEndNode) {\n          // If there's nothing to the right, then we can skip ending the line\n          // here, and move root-wards since splitting just before an end-tag\n          // would require us to create a bunch of empty copies.\n          while (!lineEndNode.nextSibling) {\n            lineEndNode = lineEndNode.parentNode;\n            if (!lineEndNode) { return; }\n          }\n      \n          function breakLeftOf(limit, copy) {\n            // Clone shallowly if this node needs to be on both sides of the break.\n            var rightSide = copy ? limit.cloneNode(false) : limit;\n            var parent = limit.parentNode;\n            if (parent) {\n              // We clone the parent chain.\n              // This helps us resurrect important styling elements that cross lines.\n              // E.g. in <i>Foo<br>Bar</i>\n              // should be rewritten to <li><i>Foo</i></li><li><i>Bar</i></li>.\n              var parentClone = breakLeftOf(parent, 1);\n              // Move the clone and everything to the right of the original\n              // onto the cloned parent.\n              var next = limit.nextSibling;\n              parentClone.appendChild(rightSide);\n              for (var sibling = next; sibling; sibling = next) {\n                next = sibling.nextSibling;\n                parentClone.appendChild(sibling);\n              }\n            }\n            return rightSide;\n          }\n      \n          var copiedListItem = breakLeftOf(lineEndNode.nextSibling, 0);\n      \n          // Walk the parent chain until we reach an unattached LI.\n          for (var parent;\n               // Check nodeType since IE invents document fragments.\n               (parent = copiedListItem.parentNode) && parent.nodeType === 1;) {\n            copiedListItem = parent;\n          }\n          // Put it on the list of lines for later processing.\n          listItems.push(copiedListItem);\n        }\n      \n        // Split lines while there are lines left to split.\n        for (var i = 0;  // Number of lines that have been split so far.\n             i < listItems.length;  // length updated by breakAfter calls.\n             ++i) {\n          walk(listItems[i]);\n        }\n      \n        // Make sure numeric indices show correctly.\n        if (opt_startLineNum === (opt_startLineNum|0)) {\n          listItems[0].setAttribute('value', opt_startLineNum);\n        }\n      \n        var ol = document.createElement('ol');\n        ol.className = 'linenums';\n        var offset = Math.max(0, ((opt_startLineNum - 1 /* zero index */)) | 0) || 0;\n        for (var i = 0, n = listItems.length; i < n; ++i) {\n          li = listItems[i];\n          // Stick a class on the LIs so that stylesheets can\n          // color odd/even rows, or any other row pattern that\n          // is co-prime with 10.\n          li.className = 'L' + ((i + offset) % 10);\n          if (!li.firstChild) {\n            li.appendChild(document.createTextNode('\\xA0'));\n          }\n          ol.appendChild(li);\n        }\n      \n        node.appendChild(ol);\n      }    \n      /**\n       * Breaks {@code job.sourceCode} around style boundaries in\n       * {@code job.decorations} and modifies {@code job.sourceNode} in place.\n       * @param {Object} job like <pre>{\n       *    sourceCode: {string} source as plain text,\n       *    sourceNode: {HTMLElement} the element containing the source,\n       *    spans: {Array.<number|Node>} alternating span start indices into source\n       *       and the text node or element (e.g. {@code <BR>}) corresponding to that\n       *       span.\n       *    decorations: {Array.<number|string} an array of style classes preceded\n       *       by the position at which they start in job.sourceCode in order\n       * }</pre>\n       * @private\n       */\n      function recombineTagsAndDecorations(job) {\n        var isIE8OrEarlier = /\\bMSIE\\s(\\d+)/.exec(navigator.userAgent);\n        isIE8OrEarlier = isIE8OrEarlier && +isIE8OrEarlier[1] <= 8;\n        var newlineRe = /\\n/g;\n      \n        var source = job.sourceCode;\n        var sourceLength = source.length;\n        // Index into source after the last code-unit recombined.\n        var sourceIndex = 0;\n      \n        var spans = job.spans;\n        var nSpans = spans.length;\n        // Index into spans after the last span which ends at or before sourceIndex.\n        var spanIndex = 0;\n      \n        var decorations = job.decorations;\n        var nDecorations = decorations.length;\n        // Index into decorations after the last decoration which ends at or before\n        // sourceIndex.\n        var decorationIndex = 0;\n      \n        // Remove all zero-length decorations.\n        decorations[nDecorations] = sourceLength;\n        var decPos, i;\n        for (i = decPos = 0; i < nDecorations;) {\n          if (decorations[i] !== decorations[i + 2]) {\n            decorations[decPos++] = decorations[i++];\n            decorations[decPos++] = decorations[i++];\n          } else {\n            i += 2;\n          }\n        }\n        nDecorations = decPos;\n      \n        // Simplify decorations.\n        for (i = decPos = 0; i < nDecorations;) {\n          var startPos = decorations[i];\n          // Conflate all adjacent decorations that use the same style.\n          var startDec = decorations[i + 1];\n          var end = i + 2;\n          while (end + 2 <= nDecorations && decorations[end + 1] === startDec) {\n            end += 2;\n          }\n          decorations[decPos++] = startPos;\n          decorations[decPos++] = startDec;\n          i = end;\n        }\n      \n        nDecorations = decorations.length = decPos;\n      \n        var sourceNode = job.sourceNode;\n        var oldDisplay;\n        if (sourceNode) {\n          oldDisplay = sourceNode.style.display;\n          sourceNode.style.display = 'none';\n        }\n        try {\n          var decoration = null;\n          while (spanIndex < nSpans) {\n            var spanStart = spans[spanIndex];\n            var spanEnd = spans[spanIndex + 2] || sourceLength;\n      \n            var decEnd = decorations[decorationIndex + 2] || sourceLength;\n      \n            var end = Math.min(spanEnd, decEnd);\n      \n            var textNode = spans[spanIndex + 1];\n            var styledText;\n            if (textNode.nodeType !== 1  // Don't muck with <BR>s or <LI>s\n                // Don't introduce spans around empty text nodes.\n                && (styledText = source.substring(sourceIndex, end))) {\n              // This may seem bizarre, and it is.  Emitting LF on IE causes the\n              // code to display with spaces instead of line breaks.\n              // Emitting Windows standard issue linebreaks (CRLF) causes a blank\n              // space to appear at the beginning of every line but the first.\n              // Emitting an old Mac OS 9 line separator makes everything spiffy.\n              if (isIE8OrEarlier) {\n                styledText = styledText.replace(newlineRe, '\\r');\n              }\n              textNode.nodeValue = styledText;\n              var document = textNode.ownerDocument;\n              var span = document.createElement('span');\n              span.className = decorations[decorationIndex + 1];\n              var parentNode = textNode.parentNode;\n              parentNode.replaceChild(span, textNode);\n              span.appendChild(textNode);\n              if (sourceIndex < spanEnd) {  // Split off a text node.\n                spans[spanIndex + 1] = textNode\n                    // TODO: Possibly optimize by using '' if there's no flicker.\n                    = document.createTextNode(source.substring(end, spanEnd));\n                parentNode.insertBefore(textNode, span.nextSibling);\n              }\n            }\n      \n            sourceIndex = end;\n      \n            if (sourceIndex >= spanEnd) {\n              spanIndex += 2;\n            }\n            if (sourceIndex >= decEnd) {\n              decorationIndex += 2;\n            }\n          }\n        } finally {\n          if (sourceNode) {\n            sourceNode.style.display = oldDisplay;\n          }\n        }\n      }\n    \n      /** Maps language-specific file extensions to handlers. */\n      var langHandlerRegistry = {};\n      /** Register a language handler for the given file extensions.\n        * @param {function (Object)} handler a function from source code to a list\n        *      of decorations.  Takes a single argument job which describes the\n        *      state of the computation.   The single parameter has the form\n        *      {@code {\n        *        sourceCode: {string} as plain text.\n        *        decorations: {Array.<number|string>} an array of style classes\n        *                     preceded by the position at which they start in\n        *                     job.sourceCode in order.\n        *                     The language handler should assigned this field.\n        *        basePos: {int} the position of source in the larger source chunk.\n        *                 All positions in the output decorations array are relative\n        *                 to the larger source chunk.\n        *      } }\n        * @param {Array.<string>} fileExtensions\n        */\n      function registerLangHandler(handler, fileExtensions) {\n        for (var i = fileExtensions.length; --i >= 0;) {\n          var ext = fileExtensions[i];\n          if (!langHandlerRegistry.hasOwnProperty(ext)) {\n            langHandlerRegistry[ext] = handler;\n          } else if (win['console']) {\n            console['warn']('cannot override language handler %s', ext);\n          }\n        }\n      }\n      function langHandlerForExtension(extension, source) {\n        if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {\n          // Treat it as markup if the first non whitespace character is a < and\n          // the last non-whitespace character is a >.\n          extension = /^\\s*</.test(source)\n              ? 'default-markup'\n              : 'default-code';\n        }\n        return langHandlerRegistry[extension];\n      }\n      registerLangHandler(decorateSource, ['default-code']);\n      registerLangHandler(\n          createSimpleLexer(\n              [],\n              [\n               [PR_PLAIN,       /^[^<?]+/],\n               [PR_DECLARATION, /^<!\\w[^>]*(?:>|$)/],\n               [PR_COMMENT,     /^<\\!--[\\s\\S]*?(?:-\\->|$)/],\n               // Unescaped content in an unknown language\n               ['lang-',        /^<\\?([\\s\\S]+?)(?:\\?>|$)/],\n               ['lang-',        /^<%([\\s\\S]+?)(?:%>|$)/],\n               [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],\n               ['lang-',        /^<xmp\\b[^>]*>([\\s\\S]+?)<\\/xmp\\b[^>]*>/i],\n               // Unescaped content in javascript.  (Or possibly vbscript).\n               ['lang-js',      /^<script\\b[^>]*>([\\s\\S]*?)(<\\/script\\b[^>]*>)/i],\n               // Contains unescaped stylesheet content\n               ['lang-css',     /^<style\\b[^>]*>([\\s\\S]*?)(<\\/style\\b[^>]*>)/i],\n               ['lang-in.tag',  /^(<\\/?[a-z][^<>]*>)/i]\n              ]),\n          ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);\n      registerLangHandler(\n          createSimpleLexer(\n              [\n               [PR_PLAIN,        /^[\\s]+/, null, ' \\t\\r\\n'],\n               [PR_ATTRIB_VALUE, /^(?:\\\"[^\\\"]*\\\"?|\\'[^\\']*\\'?)/, null, '\\\"\\'']\n               ],\n              [\n               [PR_TAG,          /^^<\\/?[a-z](?:[\\w.:-]*\\w)?|\\/?>$/i],\n               [PR_ATTRIB_NAME,  /^(?!style[\\s=]|on)[a-z](?:[\\w:-]*\\w)?/i],\n               ['lang-uq.val',   /^=\\s*([^>\\'\\\"\\s]*(?:[^>\\'\\\"\\s\\/]|\\/(?=\\s)))/],\n               [PR_PUNCTUATION,  /^[=<>\\/]+/],\n               ['lang-js',       /^on\\w+\\s*=\\s*\\\"([^\\\"]+)\\\"/i],\n               ['lang-js',       /^on\\w+\\s*=\\s*\\'([^\\']+)\\'/i],\n               ['lang-js',       /^on\\w+\\s*=\\s*([^\\\"\\'>\\s]+)/i],\n               ['lang-css',      /^style\\s*=\\s*\\\"([^\\\"]+)\\\"/i],\n               ['lang-css',      /^style\\s*=\\s*\\'([^\\']+)\\'/i],\n               ['lang-css',      /^style\\s*=\\s*([^\\\"\\'>\\s]+)/i]\n               ]),\n          ['in.tag']);\n      registerLangHandler(\n          createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\\s\\S]+/]]), ['uq.val']);\n      registerLangHandler(sourceDecorator({\n              'keywords': CPP_KEYWORDS,\n              'hashComments': true,\n              'cStyleComments': true,\n              'types': C_TYPES\n            }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);\n      registerLangHandler(sourceDecorator({\n              'keywords': 'null,true,false'\n            }), ['json']);\n      registerLangHandler(sourceDecorator({\n              'keywords': CSHARP_KEYWORDS,\n              'hashComments': true,\n              'cStyleComments': true,\n              'verbatimStrings': true,\n              'types': C_TYPES\n            }), ['cs']);\n      registerLangHandler(sourceDecorator({\n              'keywords': JAVA_KEYWORDS,\n              'cStyleComments': true\n            }), ['java']);\n      registerLangHandler(sourceDecorator({\n              'keywords': SH_KEYWORDS,\n              'hashComments': true,\n              'multiLineStrings': true\n            }), ['bash', 'bsh', 'csh', 'sh']);\n      registerLangHandler(sourceDecorator({\n              'keywords': PYTHON_KEYWORDS,\n              'hashComments': true,\n              'multiLineStrings': true,\n              'tripleQuotedStrings': true\n            }), ['cv', 'py', 'python']);\n      registerLangHandler(sourceDecorator({\n              'keywords': PERL_KEYWORDS,\n              'hashComments': true,\n              'multiLineStrings': true,\n              'regexLiterals': 2  // multiline regex literals\n            }), ['perl', 'pl', 'pm']);\n      registerLangHandler(sourceDecorator({\n              'keywords': RUBY_KEYWORDS,\n              'hashComments': true,\n              'multiLineStrings': true,\n              'regexLiterals': true\n            }), ['rb', 'ruby']);\n      registerLangHandler(sourceDecorator({\n              'keywords': JSCRIPT_KEYWORDS,\n              'cStyleComments': true,\n              'regexLiterals': true\n            }), ['javascript', 'js']);\n      registerLangHandler(sourceDecorator({\n              'keywords': COFFEE_KEYWORDS,\n              'hashComments': 3,  // ### style block comments\n              'cStyleComments': true,\n              'multilineStrings': true,\n              'tripleQuotedStrings': true,\n              'regexLiterals': true\n            }), ['coffee']);\n      registerLangHandler(sourceDecorator({\n              'keywords': RUST_KEYWORDS,\n              'cStyleComments': true,\n              'multilineStrings': true\n            }), ['rc', 'rs', 'rust']);\n      registerLangHandler(\n          createSimpleLexer([], [[PR_STRING, /^[\\s\\S]+/]]), ['regex']);\n    \n      function applyDecorator(job) {\n        var opt_langExtension = job.langExtension;\n    \n        try {\n          // Extract tags, and convert the source code to plain text.\n          var sourceAndSpans = extractSourceSpans(job.sourceNode, job.pre);\n          /** Plain text. @type {string} */\n          var source = sourceAndSpans.sourceCode;\n          job.sourceCode = source;\n          job.spans = sourceAndSpans.spans;\n          job.basePos = 0;\n    \n          // Apply the appropriate language handler\n          langHandlerForExtension(opt_langExtension, source)(job);\n    \n          // Integrate the decorations and tags back into the source code,\n          // modifying the sourceNode in place.\n          recombineTagsAndDecorations(job);\n        } catch (e) {\n          if (win['console']) {\n            console['log'](e && e['stack'] || e);\n          }\n        }\n      }\n    \n      /**\n       * Pretty print a chunk of code.\n       * @param sourceCodeHtml {string} The HTML to pretty print.\n       * @param opt_langExtension {string} The language name to use.\n       *     Typically, a filename extension like 'cpp' or 'java'.\n       * @param opt_numberLines {number|boolean} True to number lines,\n       *     or the 1-indexed number of the first line in sourceCodeHtml.\n       */\n      function $prettyPrintOne(sourceCodeHtml, opt_langExtension, opt_numberLines) {\n        var container = document.createElement('div');\n        // This could cause images to load and onload listeners to fire.\n        // E.g. <img onerror=\"alert(1337)\" src=\"nosuchimage.png\">.\n        // We assume that the inner HTML is from a trusted source.\n        // The pre-tag is required for IE8 which strips newlines from innerHTML\n        // when it is injected into a <pre> tag.\n        // http://stackoverflow.com/questions/451486/pre-tag-loses-line-breaks-when-setting-innerhtml-in-ie\n        // http://stackoverflow.com/questions/195363/inserting-a-newline-into-a-pre-tag-ie-javascript\n        container.innerHTML = '<pre>' + sourceCodeHtml + '</pre>';\n        container = container.firstChild;\n        if (opt_numberLines) {\n          numberLines(container, opt_numberLines, true);\n        }\n    \n        var job = {\n          langExtension: opt_langExtension,\n          numberLines: opt_numberLines,\n          sourceNode: container,\n          pre: 1\n        };\n        applyDecorator(job);\n        return container.innerHTML;\n      }\n    \n       /**\n        * Find all the {@code <pre>} and {@code <code>} tags in the DOM with\n        * {@code class=prettyprint} and prettify them.\n        *\n        * @param {Function} opt_whenDone called when prettifying is done.\n        * @param {HTMLElement|HTMLDocument} opt_root an element or document\n        *   containing all the elements to pretty print.\n        *   Defaults to {@code document.body}.\n        */\n      function $prettyPrint(opt_whenDone, opt_root) {\n        var root = opt_root || document.body;\n        var doc = root.ownerDocument || document;\n        function byTagName(tn) { return root.getElementsByTagName(tn); }\n        // fetch a list of nodes to rewrite\n        var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')];\n        var elements = [];\n        for (var i = 0; i < codeSegments.length; ++i) {\n          for (var j = 0, n = codeSegments[i].length; j < n; ++j) {\n            elements.push(codeSegments[i][j]);\n          }\n        }\n        codeSegments = null;\n    \n        var clock = Date;\n        if (!clock['now']) {\n          clock = { 'now': function () { return +(new Date); } };\n        }\n    \n        // The loop is broken into a series of continuations to make sure that we\n        // don't make the browser unresponsive when rewriting a large page.\n        var k = 0;\n        var prettyPrintingJob;\n    \n        var langExtensionRe = /\\blang(?:uage)?-([\\w.]+)(?!\\S)/;\n        var prettyPrintRe = /\\bprettyprint\\b/;\n        var prettyPrintedRe = /\\bprettyprinted\\b/;\n        var preformattedTagNameRe = /pre|xmp/i;\n        var codeRe = /^code$/i;\n        var preCodeXmpRe = /^(?:pre|code|xmp)$/i;\n        var EMPTY = {};\n    \n        function doWork() {\n          var endTime = (win['PR_SHOULD_USE_CONTINUATION'] ?\n                         clock['now']() + 250 /* ms */ :\n                         Infinity);\n          for (; k < elements.length && clock['now']() < endTime; k++) {\n            var cs = elements[k];\n    \n            // Look for a preceding comment like\n            // <?prettify lang=\"...\" linenums=\"...\"?>\n            var attrs = EMPTY;\n            {\n              for (var preceder = cs; (preceder = preceder.previousSibling);) {\n                var nt = preceder.nodeType;\n                // <?foo?> is parsed by HTML 5 to a comment node (8)\n                // like <!--?foo?-->, but in XML is a processing instruction\n                var value = (nt === 7 || nt === 8) && preceder.nodeValue;\n                if (value\n                    ? !/^\\??prettify\\b/.test(value)\n                    : (nt !== 3 || /\\S/.test(preceder.nodeValue))) {\n                  // Skip over white-space text nodes but not others.\n                  break;\n                }\n                if (value) {\n                  attrs = {};\n                  value.replace(\n                      /\\b(\\w+)=([\\w:.%+-]+)/g,\n                    function (_, name, value) { attrs[name] = value; });\n                  break;\n                }\n              }\n            }\n    \n            var className = cs.className;\n            if ((attrs !== EMPTY || prettyPrintRe.test(className))\n                // Don't redo this if we've already done it.\n                // This allows recalling pretty print to just prettyprint elements\n                // that have been added to the page since last call.\n                && !prettyPrintedRe.test(className)) {\n    \n              // make sure this is not nested in an already prettified element\n              var nested = false;\n              for (var p = cs.parentNode; p; p = p.parentNode) {\n                var tn = p.tagName;\n                if (preCodeXmpRe.test(tn)\n                    && p.className && prettyPrintRe.test(p.className)) {\n                  nested = true;\n                  break;\n                }\n              }\n              if (!nested) {\n                // Mark done.  If we fail to prettyprint for whatever reason,\n                // we shouldn't try again.\n                cs.className += ' prettyprinted';\n    \n                // If the classes includes a language extensions, use it.\n                // Language extensions can be specified like\n                //     <pre class=\"prettyprint lang-cpp\">\n                // the language extension \"cpp\" is used to find a language handler\n                // as passed to PR.registerLangHandler.\n                // HTML5 recommends that a language be specified using \"language-\"\n                // as the prefix instead.  Google Code Prettify supports both.\n                // http://dev.w3.org/html5/spec-author-view/the-code-element.html\n                var langExtension = attrs['lang'];\n                if (!langExtension) {\n                  langExtension = className.match(langExtensionRe);\n                  // Support <pre class=\"prettyprint\"><code class=\"language-c\">\n                  var wrapper;\n                  if (!langExtension && (wrapper = childContentWrapper(cs))\n                      && codeRe.test(wrapper.tagName)) {\n                    langExtension = wrapper.className.match(langExtensionRe);\n                  }\n    \n                  if (langExtension) { langExtension = langExtension[1]; }\n                }\n    \n                var preformatted;\n                if (preformattedTagNameRe.test(cs.tagName)) {\n                  preformatted = 1;\n                } else {\n                  var currentStyle = cs['currentStyle'];\n                  var defaultView = doc.defaultView;\n                  var whitespace = (\n                      currentStyle\n                      ? currentStyle['whiteSpace']\n                      : (defaultView\n                         && defaultView.getComputedStyle)\n                      ? defaultView.getComputedStyle(cs, null)\n                      .getPropertyValue('white-space')\n                      : 0);\n                  preformatted = whitespace\n                      && 'pre' === whitespace.substring(0, 3);\n                }\n    \n                // Look for a class like linenums or linenums:<n> where <n> is the\n                // 1-indexed number of the first line.\n                var lineNums = attrs['linenums'];\n                if (!(lineNums = lineNums === 'true' || +lineNums)) {\n                  lineNums = className.match(/\\blinenums\\b(?::(\\d+))?/);\n                  lineNums =\n                    lineNums\n                    ? lineNums[1] && lineNums[1].length\n                      ? +lineNums[1] : true\n                    : false;\n                }\n                if (lineNums) { numberLines(cs, lineNums, preformatted); }\n    \n                // do the pretty printing\n                prettyPrintingJob = {\n                  langExtension: langExtension,\n                  sourceNode: cs,\n                  numberLines: lineNums,\n                  pre: preformatted\n                };\n                applyDecorator(prettyPrintingJob);\n              }\n            }\n          }\n          if (k < elements.length) {\n            // finish up in a continuation\n            setTimeout(doWork, 250);\n          } else if ('function' === typeof opt_whenDone) {\n            opt_whenDone();\n          }\n        }\n    \n        doWork();\n      }\n    \n      /**\n       * Contains functions for creating and registering new language handlers.\n       * @type {Object}\n       */\n      var PR = win['PR'] = {\n            'createSimpleLexer': createSimpleLexer,\n            'registerLangHandler': registerLangHandler,\n            'sourceDecorator': sourceDecorator,\n            'PR_ATTRIB_NAME': PR_ATTRIB_NAME,\n            'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,\n            'PR_COMMENT': PR_COMMENT,\n            'PR_DECLARATION': PR_DECLARATION,\n            'PR_KEYWORD': PR_KEYWORD,\n            'PR_LITERAL': PR_LITERAL,\n            'PR_NOCODE': PR_NOCODE,\n            'PR_PLAIN': PR_PLAIN,\n            'PR_PUNCTUATION': PR_PUNCTUATION,\n            'PR_SOURCE': PR_SOURCE,\n            'PR_STRING': PR_STRING,\n            'PR_TAG': PR_TAG,\n            'PR_TYPE': PR_TYPE,\n            'prettyPrintOne':\n               IN_GLOBAL_SCOPE\n                 ? (win['prettyPrintOne'] = $prettyPrintOne)\n                 : (prettyPrintOne = $prettyPrintOne),\n            'prettyPrint': prettyPrint =\n               IN_GLOBAL_SCOPE\n                 ? (win['prettyPrint'] = $prettyPrint)\n                 : (prettyPrint = $prettyPrint)\n          };\n    \n      // Make PR available via the Asynchronous Module Definition (AMD) API.\n      // Per https://github.com/amdjs/amdjs-api/wiki/AMD:\n      // The Asynchronous Module Definition (AMD) API specifies a\n      // mechanism for defining modules such that the module and its\n      // dependencies can be asynchronously loaded.\n      // ...\n      // To allow a clear indicator that a global define function (as\n      // needed for script src browser loading) conforms to the AMD API,\n      // any global define function SHOULD have a property called \"amd\"\n      // whose value is an object. This helps avoid conflict with any\n      // other existing JavaScript code that could have defined a define()\n      // function that does not conform to the AMD API.\n      if (typeof define === \"function\" && define['amd']) {\n        define(\"google-code-prettify\", [], function () {\n          return PR; \n        });\n      }\n    })();\n    return prettyPrint;\n  })();\n\n  // If this script is deferred or async and the document is already\n  // loaded we need to wait for language handlers to load before performing\n  // any autorun.\n  function onLangsLoaded() {\n    if (autorun) {\n      contentLoaded(\n        function () {\n          var n = callbacks.length;\n          var callback = n ? function () {\n            for (var i = 0; i < n; ++i) {\n              (function (i) {\n                 setTimeout(\n                   function () {\n                     win['exports'][callbacks[i]].apply(win, arguments);\n                   }, 0);\n               })(i);\n            }\n          } : void 0;\n          prettyPrint(callback);\n        });\n    }\n  }\n  checkPendingLanguages();\n\n}());\n"
  },
  {
    "path": "google-code-prettify/styles/demo.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n<html><head>\n<script src=\"../src/prettify.js\"></script>\n<script src=\"../src/lang-css.js\"></script>\n<style>\nbody { margin: 0; padding: 0 }\npre { margin: 0 }\n</style>\n</head>\n<script>\n// This page displays some code styled using a theme named in the\n// query part of the URL.\nvar themeName = decodeURIComponent(document.location.search.replace(/^\\?/, ''));\n\n// Call out to the parent so that it can resize the iframe once this\n// document's body is loaded.\nfunction adjustHeightInParent() {\n  if (parent !== window) {\n    try {\n      var div = document.body.getElementsByTagName('div')[0];\n      parent.adjustChildIframeSize(\n          themeName, div.offsetWidth, div.offsetHeight);\n    } catch (ex) {\n      // Can happen when this page is opened in its own tab.\n    }\n  }\n}\n\n// Load the necessary CSS\n(function () {\n  document.title = 'Theme ' + themeName;\n  // Load the stylesheet that we're demoing.\n  var link = document.createElement('link');\n  link.rel = 'stylesheet';\n  link.type = 'text/css';\n  link.href = themeName === 'default'\n      ? '../src/prettify.css' : themeName + '.css';\n  document.getElementsByTagName('head')[0].appendChild(link);\n})();\n</script>\n\n<body onload=\"prettyPrint(); adjustHeightInParent()\">\n<div style=\"width: 40em; display: inline-block\">\n<pre class=\"prettyprint lang-html linenums\">\n&lt;script type=\"text/javascript\"&gt;\n// Say hello world until the user starts questioning\n// the meaningfulness of their existence.\nfunction helloWorld(world) {\n  for (var i = 42; --i &gt;= 0;) {\n    alert('Hello ' + String(world));\n  }\n}\n&lt;/script&gt;\n&lt;style&gt;\np { color: pink }\nb { color: blue }\nu { color: \"umber\" }\n&lt;/style&gt;\n</pre>\n</div>\n</body></html>\n"
  },
  {
    "path": "google-code-prettify/styles/desert.css",
    "content": "/* desert scheme ported from vim to google prettify */\r\npre.prettyprint { display: block; background-color: #333 }\r\npre .nocode { background-color: none; color: #000 }\r\npre .str { color: #ffa0a0 } /* string  - pink */\r\npre .kwd { color: #f0e68c; font-weight: bold }\r\npre .com { color: #87ceeb } /* comment - skyblue */\r\npre .typ { color: #98fb98 } /* type    - lightgreen */\r\npre .lit { color: #cd5c5c } /* literal - darkred */\r\npre .pun { color: #fff }    /* punctuation */\r\npre .pln { color: #fff }    /* plaintext */\r\npre .tag { color: #f0e68c; font-weight: bold } /* html/xml tag    - lightyellow */\r\npre .atn { color: #bdb76b; font-weight: bold } /* attribute name  - khaki */\r\npre .atv { color: #ffa0a0 } /* attribute value - pink */\r\npre .dec { color: #98fb98 } /* decimal         - lightgreen */\r\n\r\n/* Specify class=linenums on a pre to get line numbering */\r\nol.linenums { margin-top: 0; margin-bottom: 0; color: #AEAEAE } /* IE indents via margin-left */\r\nli.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8 { list-style-type: none }\r\n/* Alternate shading for lines */\r\nli.L1,li.L3,li.L5,li.L7,li.L9 { }\r\n\r\n@media print {\r\n  pre.prettyprint { background-color: none }\r\n  pre .str, code .str { color: #060 }\r\n  pre .kwd, code .kwd { color: #006; font-weight: bold }\r\n  pre .com, code .com { color: #600; font-style: italic }\r\n  pre .typ, code .typ { color: #404; font-weight: bold }\r\n  pre .lit, code .lit { color: #044 }\r\n  pre .pun, code .pun { color: #440 }\r\n  pre .pln, code .pln { color: #000 }\r\n  pre .tag, code .tag { color: #006; font-weight: bold }\r\n  pre .atn, code .atn { color: #404 }\r\n  pre .atv, code .atv { color: #060 }\r\n}\r\n"
  },
  {
    "path": "google-code-prettify/styles/doxy.css",
    "content": "/* Doxy pretty-printing styles. Used with prettify.js.  */\n\npre .str, code .str { color: #fec243; } /* string  - eggyolk gold */\npre .kwd, code .kwd { color: #8470FF; } /* keyword - light slate blue */\npre .com, code .com { color: #32cd32; font-style: italic; } /* comment - green */\npre .typ, code .typ { color: #6ecbcc; } /* type - turq green */\npre .lit, code .lit { color: #d06; } /* literal - cherry red */\npre .pun, code .pun { color: #8B8970;  } /* punctuation - lemon chiffon4  */\npre .pln, code .pln { color: #f0f0f0; } /* plaintext - white */\npre .tag, code .tag { color: #9c9cff; } /* html/xml tag  (bluey)  */\npre .htm, code .htm { color: #dda0dd; } /* html tag  light purply*/\npre .xsl, code .xsl { color: #d0a0d0; } /* xslt tag  light purply*/\npre .atn, code .atn { color: #46eeee; font-weight: normal;} /* html/xml attribute name  - lt turquoise */\npre .atv, code .atv { color: #EEB4B4; } /* html/xml attribute value - rosy brown2 */\npre .dec, code .dec { color: #3387CC; } /* decimal - blue */\n\na {\n  text-decoration: none;\n}\npre.prettyprint, code.prettyprint {\n  font-family:'Droid Sans Mono','CPMono_v07 Bold','Droid Sans';\n  font-weight: bold;\n  font-size: 9pt;\n  background-color: #0f0f0f;\n  -moz-border-radius: 8px;\n  -webkit-border-radius: 8px;\n  -o-border-radius: 8px;\n  -ms-border-radius: 8px;\n  -khtml-border-radius: 8px;\n  border-radius: 8px;\n}  /*  background is black (well, just a tad less dark )  */\n\npre.prettyprint {\n  width: 95%;\n  margin: 1em auto;\n  padding: 1em;\n  white-space: pre-wrap;\n}\n\npre.prettyprint a, code.prettyprint a {\n   text-decoration:none;\n}\n/* Specify class=linenums on a pre to get line numbering; line numbers themselves are the same color as punctuation */\nol.linenums { margin-top: 0; margin-bottom: 0; color: #8B8970; } /* IE indents via margin-left */\nli.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8 { list-style-type: none }\n/* Alternate shading for lines */\nli.L1,li.L3,li.L5,li.L7,li.L9 { }\n\n/* print is mostly unchanged from default at present  */\n@media print {\n  pre.prettyprint, code.prettyprint { background-color: #fff;  }\n  pre .str, code .str { color: #088; }\n  pre .kwd, code .kwd { color: #006; font-weight: bold; }\n  pre .com, code .com { color: #oc3; font-style: italic; }\n  pre .typ, code .typ { color: #404; font-weight: bold; }\n  pre .lit, code .lit { color: #044; }\n  pre .pun, code .pun { color: #440; }\n  pre .pln, code .pln { color: #000; }\n  pre .tag, code .tag { color: #b66ff7; font-weight: bold; }\n  pre .htm, code .htm { color: #606; font-weight: bold; }\n  pre .xsl, code .xsl { color: #606; font-weight: bold; }\n  pre .atn, code .atn { color: #c71585;  font-weight: normal; }\n  pre .atv, code .atv { color: #088;  font-weight: normal; }\n}\n"
  },
  {
    "path": "google-code-prettify/styles/index.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n<html><head>\n<title>Prettify Themes Gallery</title>\n<style type=\"text/css\">\niframe { width: 100%; border-style: none; margin: 0; padding: 0 }\n</style>\n<script>\nvar allThemes = [\n  { name: 'default' },\n  { name: 'desert',\n    authorHtml: '<a href=\"http://code.google.com/u/@VhJeSlJYBhVMWgF7/\">'\n        + 'techto&hellip;@<\\/a>' },\n  { name: 'sunburst', authorHtml: 'David Leibovic' },\n  { name: 'sons-of-obsidian',\n    authorHtml: '<a href=\"http://CodeTunnel.com/blog/post/71'\n        + '/google-code-prettify-obsidian-theme\">Alex Ford<\\/a>' },\n  { name: 'doxy', authorHtml: 'Robert Sperberg' },\n];\n\n// Called by the demo.html frames loaded per theme to\n// size the iframes properly and to allow them to tile\n// the page nicely.\nfunction adjustChildIframeSize(themeName, width, height) {\n  if (typeof console != 'undefined') {\n    try {\n      console.log('adjusting ' + themeName + ' to ' + width + 'x' + height);\n    } catch (ex) {\n      // Don't bother logging log failure.\n    }\n  }\n\n  var container = document.getElementById(themeName).parentNode;\n  container.style.width = (+width + 16) + 'px';\n  container.style.display = 'inline-block';\n  var iframe = container.getElementsByTagName('iframe')[0];\n  iframe.style.height = (+height + 16) + 'px';\n}\n</script>\n</head>\n\n<body>\n<noscript>This page requires JavaScript</noscript>\n\n<h1>Gallery of themes for\n<a href=\"http://code.google.com/p/google-code-prettify/\">code prettify</a></h1>\n<p>\nClick on a theme name for a link to the file in revision control.\nPrint preview this page to see how the themes work on the printed page.\n</p>\n<script>(function () {\n  // Produce an iframe per theme.\n  // We pass the threme name to the iframe via its URI query, and\n  // it loads prettify and the theme CSS, and calls back to this page\n  // to resize the iframe.\n  for (var i = 0, n = allThemes.length; i < n; ++i) {\n    var theme = allThemes[i];\n    if (!theme) { continue; }\n    var iframe = document.createElement('iframe');\n    iframe.name = theme.name;\n    iframe.src = 'demo.html?' + encodeURIComponent(theme.name);\n    var header = document.createElement('h2');\n    header.id = theme.name;\n    var linkToThemeSrc = document.createElement('a');\n    linkToThemeSrc.href = (\n        'http://code.google.com/p/google-code-prettify/source/browse/trunk/' +\n        (theme.name === 'default'\n         ? 'src/prettify.css'\n         : 'styles/' + encodeURIComponent(theme.name) + '.css'));\n    linkToThemeSrc.appendChild(document.createTextNode(\n       theme.name.replace(/\\b[a-z]/g,  // Capitalize first letter of each word\n       function (letter) { return letter.toUpperCase(); })));\n    header.appendChild(linkToThemeSrc);\n\n    var attribution;\n    if (theme.authorHtml) {\n      attribution = document.createElement('span');\n      attribution.className = 'attribution';\n      attribution.innerHTML = 'by ' + theme.authorHtml;\n    }\n\n    var div = document.createElement('div');\n    div.appendChild(header);\n    if (attribution) { div.appendChild(attribution); }\n    div.appendChild(iframe);\n    document.body.appendChild(div);\n  }\n})()</script>\n\n</body></html>\n"
  },
  {
    "path": "google-code-prettify/styles/sons-of-obsidian.css",
    "content": "/*\r\n * Derived from einaros's Sons of Obsidian theme at\r\n * http://studiostyl.es/schemes/son-of-obsidian by\r\n * Alex Ford of CodeTunnel:\r\n * http://CodeTunnel.com/blog/post/71/google-code-prettify-obsidian-theme\r\n */\r\n\r\n.str\r\n{\r\n    color: #EC7600;\r\n}\r\n.kwd\r\n{\r\n    color: #93C763;\r\n}\r\n.com\r\n{\r\n    color: #66747B;\r\n}\r\n.typ\r\n{\r\n    color: #678CB1;\r\n}\r\n.lit\r\n{\r\n    color: #FACD22;\r\n}\r\n.pun\r\n{\r\n    color: #F1F2F3;\r\n}\r\n.pln\r\n{\r\n    color: #F1F2F3;\r\n}\r\n.tag\r\n{\r\n    color: #8AC763;\r\n}\r\n.atn\r\n{\r\n    color: #E0E2E4;\r\n}\r\n.atv\r\n{\r\n    color: #EC7600;\r\n}\r\n.dec\r\n{\r\n    color: purple;\r\n}\r\npre.prettyprint\r\n{\r\n    border: 0px solid #888;\r\n}\r\nol.linenums\r\n{\r\n    margin-top: 0;\r\n    margin-bottom: 0;\r\n}\r\n.prettyprint {\r\n    background: #000;\r\n}\r\nli.L0, li.L1, li.L2, li.L3, li.L4, li.L5, li.L6, li.L7, li.L8, li.L9\r\n{\r\n    color: #555;\r\n    list-style-type: decimal;\r\n}\r\nli.L1, li.L3, li.L5, li.L7, li.L9 {\r\n    background: #111;\r\n}\r\n@media print\r\n{\r\n    .str\r\n    {\r\n        color: #060;\r\n    }\r\n    .kwd\r\n    {\r\n        color: #006;\r\n        font-weight: bold;\r\n    }\r\n    .com\r\n    {\r\n        color: #600;\r\n        font-style: italic;\r\n    }\r\n    .typ\r\n    {\r\n        color: #404;\r\n        font-weight: bold;\r\n    }\r\n    .lit\r\n    {\r\n        color: #044;\r\n    }\r\n    .pun\r\n    {\r\n        color: #440;\r\n    }\r\n    .pln\r\n    {\r\n        color: #000;\r\n    }\r\n    .tag\r\n    {\r\n        color: #006;\r\n        font-weight: bold;\r\n    }\r\n    .atn\r\n    {\r\n        color: #404;\r\n    }\r\n    .atv\r\n    {\r\n        color: #060;\r\n    }\r\n}\r\n"
  },
  {
    "path": "google-code-prettify/styles/sunburst.css",
    "content": "/* Pretty printing styles. Used with prettify.js. */\n/* Vim sunburst theme by David Leibovic */\n\npre .str, code .str { color: #65B042; } /* string  - green */\npre .kwd, code .kwd { color: #E28964; } /* keyword - dark pink */\npre .com, code .com { color: #AEAEAE; font-style: italic; } /* comment - gray */\npre .typ, code .typ { color: #89bdff; } /* type - light blue */\npre .lit, code .lit { color: #3387CC; } /* literal - blue */\npre .pun, code .pun { color: #fff; } /* punctuation - white */\npre .pln, code .pln { color: #fff; } /* plaintext - white */\npre .tag, code .tag { color: #89bdff; } /* html/xml tag    - light blue */\npre .atn, code .atn { color: #bdb76b; } /* html/xml attribute name  - khaki */\npre .atv, code .atv { color: #65B042; } /* html/xml attribute value - green */\npre .dec, code .dec { color: #3387CC; } /* decimal - blue */\n\npre.prettyprint, code.prettyprint {\n\tbackground-color: #000;\n\t-moz-border-radius: 8px;\n\t-webkit-border-radius: 8px;\n\t-o-border-radius: 8px;\n\t-ms-border-radius: 8px;\n\t-khtml-border-radius: 8px;\n\tborder-radius: 8px;\n}\n\npre.prettyprint {\n\twidth: 95%;\n\tmargin: 1em auto;\n\tpadding: 1em;\n\twhite-space: pre-wrap;\n}\n\n\n/* Specify class=linenums on a pre to get line numbering */\nol.linenums { margin-top: 0; margin-bottom: 0; color: #AEAEAE; } /* IE indents via margin-left */\nli.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8 { list-style-type: none }\n/* Alternate shading for lines */\nli.L1,li.L3,li.L5,li.L7,li.L9 { }\n\n@media print {\n  pre .str, code .str { color: #060; }\n  pre .kwd, code .kwd { color: #006; font-weight: bold; }\n  pre .com, code .com { color: #600; font-style: italic; }\n  pre .typ, code .typ { color: #404; font-weight: bold; }\n  pre .lit, code .lit { color: #044; }\n  pre .pun, code .pun { color: #440; }\n  pre .pln, code .pln { color: #000; }\n  pre .tag, code .tag { color: #006; font-weight: bold; }\n  pre .atn, code .atn { color: #404; }\n  pre .atv, code .atv { color: #060; }\n}\n"
  },
  {
    "path": "google-code-prettify/tests/debug-ie-compat-matrix.html",
    "content": "<style>\ncode {\n  white-space: pre; padding: 0; margin: 0; display: block\n}\n</style>\n\n<code id=\"one-line\"\n>one short line,</code>\n\n<hr>\n\n<code id=\"two-lines\"\n>one giant leap for\ncross-browser compatibility</code>\n\n<hr>\n\n<code id=\"two-lines-mutated\"\n>two turtledoves\na partridge in a pear tree\nzero fencepost errors</code>\n\n<hr>\n\n<p id=\"error\" style=\"white-space: pre\"></p>\n\n<script>\n// Function under test\nvar matrix;\n\n(function () {\n  var table = {\n    quirks: { \"6\": \"\\r\", \"7\": \"\\r\", \"8\": \"\\r\", \"9\": \"\\r\", \"10\": \"\\n\" },\n    standards: { \"6\": \"\\r\", \"7\": \"\\r\", \"8\": \"\\r\", \"9\": \"\\n\", \"10\": \"\\n\" }\n  };\n\n  matrix = function (quirksMode, ieMajorVersionNumber) {\n    if (\"boolean\" !== typeof quirksMode) {\n      throw new Error(quirksMode);\n    } else if (\"number\" !== typeof ieMajorVersionNumber\n        || !table.quirks.hasOwnProperty(+ieMajorVersionNumber)) {\n      throw new Error(ieMajorVersionNumber);\n    }\n    return table[quirksMode ? \"quirks\" : \"standards\"][ieMajorVersionNumber];\n  };\n})();\n</script>\n\n<script>\n// Configuration we're testing.\nvar quirksMode;\nvar ieMajorVersionNumber;\n\nquirksMode = document.compatMode == \"BackCompat\";\nieMajorVersionNumber = navigator.userAgent.match(/MSIE\\s(\\d+)/) || NaN;\nif (ieMajorVersionNumber) {\n  ieMajorVersionNumber = +ieMajorVersionNumber[1];\n}\n</script>\n\n<script>\n(function () {\n  // DOM elements.\n  var oneLine = document.getElementById(\"one-line\");\n  var twoLines = document.getElementById(\"two-lines\");\n  var twoLinesMutated = document.getElementById(\"two-lines-mutated\");\n\n  var originalHeight = twoLinesMutated.offsetHeight;\n\n  // If the matrix cell being tested is correct, the following should\n  // end up true.\n  var pass = false;\n  var reason = \"unknown\";\n\n  // The DOM subtree to modify.\n  var textNode = twoLinesMutated.firstChild;\n\n  if (textNode.nodeType !== 3 /* TEXT */ || textNode.nextSibling) {\n    reason = \"unexpected DOM structure\";  // Maybe not normalized.\n  } else {\n    // Perform the action we are testing.\n    try {\n      textNode.nodeValue = twoLines.firstChild.nodeValue.replace\n          /\\r\\n?|\\n/g, matrix(quirksMode, ieMajorVersionNumber);\n    } catch (ex) {\n      reason = String(ex);\n    }\n\n    // Check it against known good DOM subtrees.\n    if (Math.abs(twoLinesMutated.offsetHeight - twoLines.offsetHeight) <= 1) {\n      pass = true;\n    } else if (Math.abs(twoLinesMutated.offsetHeight - oneLine.offsetHeight) <= 1) {\n      reason = \"newlines not preserved\";\n    } else {\n      // offsetHeight should trigger layout, but might not have???\n    }\n  }\n\n  document.title += \" : \" + pass ? \"PASS\" : \"FAIL\";\n  if (!pass) {\n    document.getElementById(\"error\").appendChild(document.createTextNode(\n       \"quirksMode is \" + quirksMode +\n       \"\\nieMajorVersionNumber is \" + ieMajorVersionNumber +\n       \"\\nheight was \" + originalHeight +\n       \"\\nheight is \" + twoLinesMutated.offsetHeight +\n       \"\\nexpected \" + twoLines.offsetHeight +\n       \"\\nreason=\" + reason));\n  }\n})();\n</script>\n"
  },
  {
    "path": "google-code-prettify/tests/ie-newline-copy-paste.html",
    "content": "<title>IE Newline Copy/Paste Info Gathering</title>\n\n<body>\n<p>\nI'm trying to squash, <a href=\"http://code.google.com/p/google-code-prettify/issues/detail?id=20\">once</a> and <a href=\"http://code.google.com/p/google-code-prettify/issues/detail?id=104\">for</a> <a href=\"http://code.google.com/p/google-code-prettify/issues/detail?id=128\">all</a>, the problems with newlines in\n<tt>&lt;PRE&gt;</tt>s in IE.  I can't run 3 versions of IE, so I'd\nreally appreciate any help from people who have IE open and running.\n</p>\n\n<p>\nPlease copy from START through END below and paste it into the\ntextarea below.\nThen hit Ctrl-A, Ctrl-C to copy the textarea contents, and paste that\ninto an email.\nPlease also copy and paste the RESULTS section below and include it in\nthe email response as well and send it\nto <a href=\"mailto:mikesamuel@gmail.com\">me</a> or respond to the\ndiscussion list.\n</p>\n\n<p>\nIn case you're interested, there are two problems: choosing a way to\nsplit lines that doesn't introduce too few or extra newlines, and a\nway to make sure that the resulting code can be copy-pasted into a\nplain text editors such as the textarea below.  This is my attempt to\ngather information on both issues by IE version.\n</p>\n\ncheers.\n</body>\n\n<script>\nfunction makeCodeJoiningOn(text, htmlNewline, start, end) {\n  start = start || '';\n  end = end || '';\n  var code = document.createElement('PRE');\n  code.innerHTML = start + ['before', '[' + text + ']', 'after'].join(htmlNewline) + end;\n  code.id = text.replace('+', 'plus').replace(/[^\\w\\-_]/g, '_');\n  document.body.appendChild(code);\n}\n</script>\n\n<h2>START</h2>\n\n<script>makeCodeJoiningOn('CR', '&#160;\\r');</script>\n\n<script>makeCodeJoiningOn('CRLF', '&#160;\\r\\n');</script>\n\n<script>makeCodeJoiningOn('LFCR', '&#160;\\n \\r');</script>\n\n<script>makeCodeJoiningOn('LF', '&#160;\\n');</script>\n\n<script>makeCodeJoiningOn('VTAB', '&#160;\\u000b');</script>\n\n<script>makeCodeJoiningOn('x2028', '&#160;\\u2028');</script>\n\n<script>makeCodeJoiningOn('x2029', '&#160;\\u2029');</script>\n\n<script>makeCodeJoiningOn('BR', '&#160;<br>');</script>\n\n<script>makeCodeJoiningOn('CR+BR', '&#160;\\r<br>');</script>\n\n<script>makeCodeJoiningOn('CRLF+BR', '&#160;\\r\\n<br>');</script>\n\n<script>makeCodeJoiningOn('LFCR+BR', '&#160;\\n\\r<br>');</script>\n\n<script>makeCodeJoiningOn('LF+BR', '&#160;\\n<br>');</script>\n\n<script>makeCodeJoiningOn('VTAB+BR', '&#160;\\u000b<br>');</script>\n\n<script>makeCodeJoiningOn('x2028+BR', '&#160;\\u2028<br>');</script>\n\n<script>makeCodeJoiningOn('x2029+BR', '&#160;\\u2029<br>');</script>\n\n<script>makeCodeJoiningOn('BR+CR', '&#160;<br>\\r');</script>\n\n<script>makeCodeJoiningOn('BR+CRLF', '&#160;<br>\\r\\n');</script>\n\n<script>makeCodeJoiningOn('BR+LFCR', '&#160;<br>\\n\\r');</script>\n\n<script>makeCodeJoiningOn('BR+LF', '&#160;<br>\\n');</script>\n\n<script>makeCodeJoiningOn('BR+LF', '&#160;<br>\\n');</script>\n\n<script>makeCodeJoiningOn('BR+VTAB', '&#160;<br>\\u000b');</script>\n\n<script>makeCodeJoiningOn('BR+x2028', '&#160;<br>\\u2028');</script>\n\n<script>makeCodeJoiningOn('BR+x2029', '&#160;<br>\\u2029');</script>\n\n<script>makeCodeJoiningOn('divs', '</div><div>', '<div>', '<\\/div>');</script>\n\n<script>makeCodeJoiningOn('ul', '<li>', '<ul style=list-style:none;padding:0;margin:0><li>', '<\\/ul>');</script>\n\n<pre id=notgen-cr>before\n[Not generated via innerHTML CR]\nafter</pre>\n\n<pre id=notgen-br>before<br>[Not generated via innerHTML BR]<br>after</pre>\n\n<pre id=notgen-brcr>before<br>\n[Not generated via innerHTML CR + BR]<br>\nafter</pre>\n\n<pre id=notgen-crbr>before\n<br>[Not generated via innerHTML BR + CR]\n<br>after</pre>\n\n<h2>END</h2>\n\n<pre id=threelines>one\ntwo\nthree</pre>\n\n<h2>RESULTS</h2>\n<script>(function () {\n  var threelines = document.getElementById('threelines');\n  var codeElements = document.getElementsByTagName('PRE');\n  var threelinesHeight = threelines.offsetHeight;\n\n  var ok = [];\n  var bad = [];\n  for (var i = 0, n = codeElements.length; i < n; ++i) {\n    var codeElement = codeElements[i];\n    if (codeElement !== threelines) {\n      var codeElementHeight = codeElement.offsetHeight;\n      (Math.abs(threelinesHeight - codeElementHeight) < 3\n       ? ok : bad).push(codeElement.id + ':' + codeElementHeight);\n    }\n  }\n\n  function emit(text) {\n    var p = document.createElement('P');\n    p.appendChild(document.createTextNode(text));\n    document.body.appendChild(p);\n  }\n\n  emit(navigator.userAgent);\n  emit('Ok: ' + ok);\n  emit('Bad: ' + bad);\n})();</script>\n\n<h2>TEXTAREA</h2>\n<textarea style=\"font-size: 50%\" cols=40 rows=50></textarea>\n"
  },
  {
    "path": "google-code-prettify/tests/large_input_test.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>Tests of Prettifier w/ large data files</title>\n<script src=\"../src/prettify.js\" type=\"text/javascript\"\n onerror=\"alert('Error: failed to load ' + this.src)\"></script>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../src/prettify.css\" />\n<link rel=\"stylesheet\" type=\"text/css\" href=\"test_styles.css\" />\n</head>\n\n<body bgcolor=\"white\">\n<div id=\"timing\"></div>\n<div id=\"errorReport\" style=\"white-space: pre\"></div>\n\n<!--\n  - Generate inputs of various sizes so that we can try fitting a\n  - curve to the run times.\n -->\n<script type=\"text/javascript\">\nif (!Date.now) {\n  Date.now = function () { return (new Date).getTime(); };\n}\n\nif (typeof console === 'undefined') {\n  console = {\n    log: (function () {\n      var messages = [];\n      var pending = false;\n      function showMessages() {\n        pending = false;\n        if (messages.length) {\n         var text = messages.join('\\n');\n          var pre = document.createElement('PRE');\n          pre.appendChild(document.createTextNode(text));\n          document.body.appendChild(pre);\n          messages = [];\n        }\n      }\n\n      return function (msg) {\n        if (!pending) {\n          setTimeout(showMessages, 0);\n          pending = true;\n        }\n        messages.push(msg);\n      };\n    })()\n  };\n}\n\n(function () {\n  var tasks = [];\n  var jsonTimes = [];\n  var xmlTimes = [];\n\n  var listItem = (\n      '&lt;li class=\"friendly\" style=\"blink: like-its-going-out-of-style\"&gt;'\n      + '&lt;b&gt;Howdy&lt;/b&gt; Neighbor&lt;/li&gt;');\n  var jsonItem = (\n      '{ \"friendly\": true, \"blinking\": \"hell-yes\", \"greeting\": \"Howdy!\" }');\n  function makeTargets(lang, item, sep, preText, postText, timesList) {\n   var buffer = [];\n    for (var i = 512; --i >= 0;) { buffer.push(item); }\n    var count = 512;\n    for (var i = 6; --i >= 0;) {\n     var src = buffer.join(sep);\n\n      tasks.push((function (n, toPrettify) {\n        return function () {\n          console.log('starting ' + lang + ' ' + n);\n          var t0 = Date.now();\n          var result = prettyPrintOne(toPrettify, lang);\n          var t1 = Date.now();\n          console.log('finishing ' + lang + ' ' + n);\n          if (result === toPrettify) {\n            console.error('Failed to prettify ' + lang + ' ' + n);\n          } else {\n            timesList.push([n, t1 - t0, toPrettify.length]);\n          }\n        };\n      })(count, preText + src + postText));\n\n      buffer = [src, src];\n      count *= 2;\n    }\n  }\n\n  makeTargets('xml', listItem, '\\n', '<ul>', '<\\/ul>', xmlTimes);\n  makeTargets('json', jsonItem, ', ', '[', ']', jsonTimes);\n\n  function emitBenchmarkTable(title, times) {\n    var html = [\n        '<h2>', title, '<h2>',\n        '<table class==\"benchmark\"><tr><th>Count<th>Length<th>Time<th>Items Per Second'];\n    for (var i = 0; i < times.length; ++i) {\n      var time = times[i];\n      var count = time[0], deltaMs = time[1], length = time[2];\n      html.push('<tr><td>', count, '<td>', length, '<td>', deltaMs,\n                '<td>', (count * 1000 / deltaMs).toFixed(1));\n    }\n    html.push('</table>');\n\n    var div = document.createElement('DIV');\n    div.innerHTML = html.join('');\n    document.body.appendChild(div);\n  }\n\n  tasks.push(\n      function () { emitBenchmarkTable('XML', xmlTimes); },\n      function () { emitBenchmarkTable('JSON', jsonTimes); });\n\n  function doOne() {\n    var task = tasks.shift();\n    task();\n    if (tasks.length) { setTimeout(doOne, 250); }\n  }\n  setTimeout(doOne, 250);\n})();\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "google-code-prettify/tests/prettify_test.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>Code Prettifier</title>\n<script>(function () {\n  var sourceBaseUrl = /[&?]distrib/.test(location.search)\n      ? \"../distrib/google-code-prettify/\" : \"../src/\";\n  var sources = [\n      \"prettify.js\",\n      \"lang-css.js\",\n      \"lang-erlang.js\",\n      \"lang-go.js\",\n      \"lang-hs.js\",\n      \"lang-lisp.js\",\n      \"lang-lua.js\",\n      \"lang-ml.js\",\n      \"lang-proto.js\",\n      \"lang-scala.js\",\n      \"lang-sql.js\",\n      \"lang-wiki.js\",\n      \"lang-vhdl.js\",\n      \"lang-vb.js\",\n      \"lang-yaml.js\",\n  ];\n  var styles = [\n      \"prettify.css\"\n  ];\n  if (window.console) {\n    console.log(\"sourceBaseUrl=\" + sourceBaseUrl);\n  }\n  for (var i = 0; i < sources.length; ++i) {\n    document.write(\n        \"<script src=\\\"\" + sourceBaseUrl + sources[i] + \"\\\"><\\/script>\");\n  }\n  for (var i = 0; i < styles.length; ++i) {\n    document.write(\n        \"<link rel=\\\"stylesheet\\\" href=\\\"\" + sourceBaseUrl + styles[i] + \"\\\">\");\n  }\n})();\n</script>\n\n<script src=\"test_base.js\" type=\"text/javascript\"\n onerror=\"alert('Error: failed to load ' + this.src)\"></script>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"test_styles.css\" />\n</head>\n\n<body onload=\"go(goldens)\" bgcolor=\"white\">\n<div id=\"timing\"></div>\n<div id=\"errorReport\" style=\"white-space: pre\"></div>\n\n<h1>Bash</h1>\n<pre class=\"prettyprint\" id=\"bash\">#!/bin/bash\n\n# Fibonacci numbers\n# Writes an infinite series to stdout, one entry per line\nfunction fib() {\n  local a=1\n  local b=1\n  while true ; do\n    echo $a\n    local tmp=$a\n    a=$(( $a + $b ))\n    b=$tmp\n  done\n}\n\n# output the 10th element of the series and halt\nfib | head -10 | tail -1\n</pre>\n\n<h1>Bash w/ language specified</h1>\n<pre class=\"prettyprint lang-sh linenums\" id=\"bash_lang\">#!/bin/bash\n\n# Fibonacci numbers\n# Writes an infinite series to stdout, one entry per line\nfunction fib() {\n  local a=1\n  local b=1\n  while true ; do\n    echo $a\n    local tmp=$a\n    a=$(( $a + $b ))\n    b=$tmp\n  done\n}\n\n# output the 10th element of the series and halt\nfib | /usr/bin/*head -10 | tail -1\n</pre>\n\n<h1>Issue 165</h1>\n<pre class=\"prettyprint lang-sh\" id=\"issue_165\"># Comment\nlocal $x = ${#x[@]}  # Previous is not a comment\n# A comment</pre>\n\n<h1>C</h1>\n\n<pre class=\"prettyprint\" id=\"C\">\n#include &lt;stdio.h&gt;\n\n/* the n-th fibonacci number.\n */\nunsigned int fib(unsigned int n) {\n  unsigned int a = 1, b = 1;\n  unsigned int tmp;\n  while (--n >= 0) {\n    tmp = a;\n    a += b;\n    b = tmp;\n  }\n  return a;\n}\n\nmain() {\n  printf(\"%u\", fib(10));\n}\n</pre>\n\n<h1>C w/ language specified</h1>\n\n<pre class=\"prettyprint lang-c\" id=\"C_lang\">\n#include &lt;stdio.h&gt;\n\n/* the n<sup>th</sup> fibonacci number. */\nuint32 fib(unsigned int n) {\n  uint32 a = 1, b = 1;\n  uint32 tmp;\n  while (--n >= 0) {\n    tmp = a;\n    a += b;\n    b = tmp;\n  }\n  return a;\n}\n\nvoid main() {\n  size_t size = sizeof(wchar_t);\n  ASSERT_EQ(size, 1);\n  printf(\"%u\", fib(10));\n}\n\n#define ZERO 0 /* a\n  multiline comment */\n</pre>\n<h1>C++</h1>\n<pre class=\"prettyprint\" id=\"Cpp\">\n#include &lt;iostream&gt;\n\nusing namespace std;\n\n//! fibonacci numbers with gratuitous use of templates.\n//! \\param n an index into the fibonacci series\n//! \\param fib0 element 0 of the series\n//! \\return the nth element of the fibonacci series\ntemplate &lt;class T>\nT fib(unsigned int n, const T&amp; fib0) {\n  T a(fib0), b(fib0);\n  for (; n; --n) {\n    T tmp(a);\n    a += b;\n    b = tmp;\n  }\n  return a;\n}\n\nint main(int argc, char **argv) {\n  cout &lt;&lt; fib(10, 1U);\n}\n</pre>\n\n<h1>C++ w/ language specified</h1>\n<pre class=\"prettyprint lang-cc\" id=\"Cpp_lang\">\n#include &lt;iostream&gt;\n\nusing namespace std;\n\n//! fibonacci numbers with gratuitous use of templates.\n//! \\param n an index into the fibonacci series\n//! \\param fib0 element 0 of the series\n//! \\return the nth element of the fibonacci series\ntemplate &lt;class T>\nT fib(int n, const T&amp; fib0) {\n  T a(fib0), b(fib0);\n  while (--n >= 0) {\n    T tmp(a);\n    a += b;\n    b = tmp;\n  }\n  return a;\n}\n\nint main(int argc, char **argv) {\n  cout &lt;&lt; fib(10, 1U);\n}\n</pre>\n\n<h1>Java</h1>\n<pre class=\"prettyprint\" id=\"java\">\npackage foo;\n\nimport java.util.Iterator;\n\n/**\n * the fibonacci series implemented as an Iterable.\n */\npublic final class Fibonacci implements Iterable&lt;Integer> {\n  /** the next and previous members of the series. */\n  private int a = 1, b = 1;\n\n  @Override\n  public Iterator&lt;Integer> iterator() {\n    return new Iterator&lt;Integer>() {\n      /** the series is infinite. */\n      public boolean hasNext() { return true; }\n      public Integer next() {\n        int tmp = a;\n        a += b;\n        b = tmp;\n        return a;\n      }\n      public void remove() { throw new UnsupportedOperationException(); }\n    };\n  }\n\n  /**\n   * the n&lt;sup>th&lt;/sup> element of the given series.\n   * @throws NoSuchElementException if there are less than n elements in the\n   *   given Iterable's {@link Iterable#iterator iterator}.\n   */\n  public static &lt;T>\n  T nth(int n, Iterable&lt;T> iterable) {\n    Iterator&lt;? extends T> it = iterable.iterator();\n    while (--n > 0) {\n      it.next();\n    }\n    return it.next();\n  }\n\n  public static void main(String[] args) {\n    System.out.print(nth(10, new Fibonacci()));\n  }\n}\n</pre>\n\n<h1>Java w/ language specified<small>(first line shown is line 12)</small></h1>\n<pre class=\"prettyprint lang-java linenums:12\" id=\"java_lang\">\npackage foo;\n\nimport java.util.Iterator;\n\n/**\n * the fibonacci series implemented as an Iterable.\n */\npublic final class Fibonacci implements Iterable&lt;Integer> {\n  /** the next and previous members of the series. */\n  private int a = 1, b = 1;\n\n  @Override\n  public Iterator&lt;Integer> iterator() {\n    return new Iterator&lt;Integer>() {\n      /** the series is infinite. */\n      public boolean hasNext() { return true; }\n      public Integer next() {\n        int tmp = a;\n        a += b;\n        b = tmp;\n        return a;\n      }\n      public void remove() { throw new UnsupportedOperationException(); }\n    };\n  }\n\n  /**\n   * the n&lt;sup>th&lt;/sup> element of the given series.\n   * @throws NoSuchElementException if there are less than n elements in the\n   *   given Iterable's {@link Iterable#iterator iterator}.\n   */\n  public static &lt;T>\n  T nth(int n, Iterable&lt;T> iterable) {\n    Iterator&lt;? extends T> in = iterable.iterator();\n    while (--n > 0) {\n      in.next();\n    }\n    return in.next();\n  }\n\n  public static void main(String[] args) {\n    System.out.print(nth(10, new Fibonacci()));\n  }\n}\n\n# not a java comment\n# not keywords: static_cast and namespace\n</pre>\n\n<h1>Javascript</h1>\n<pre class=\"prettyprint\" id=\"javascript\">\n/**\n * nth element in the fibonacci series.\n * @param n >= 0\n * @return the nth element, >= 0.\n */\nfunction fib(n) {\n  var a = 1, b = 1;\n  var tmp;\n  while (--n >= 0) {\n    tmp = a;\n    a += b;\n    b = tmp;\n  }\n  return a;\n}\n\ndocument.write(fib(10));\n</pre>\n\n<h1>Issue 12 - Javascript Regular Expressions</h1>\n<pre class=\"prettyprint\" id=\"issue12\">\n/foo/;  // a slash starting a line treated as a regexp beginning\n\"foo\".match(/fo+$/);\n// this line comment not treated as a regular expressions\n\"foo /bar/\".test(/\"baz\"/);  // test string and regexp boundaries\nvar division = /\\b\\d+\\/\\d+/g;  // test char sets and escaping of specials\nvar allSpecials = /([^\\(\\)\\[\\]\\{\\}\\-\\?\\+\\*\\.\\^\\$\\/]+)\\\\/;\nvar slashInCharset = /[^/]/g, notCloseSq = /[^\\]]/;\n\n// test that slash used in numeric context treated as an operator\n1 / 2;\n1. / x;\nx / y;\n(x) / y;\n1 /* foo */ / 2;\n1 /* foo *// 2;\n1/2;\n1./x;\nx/y;\n(x)/y;\n\n// test split over two lines.  line comment should not fool it\n1//\n/2;\n\nx++/y;\nx--/y;\nx[y] / z;\nf() / n;\n\n// test that slash after non postfix operator is start of regexp\nlog('matches = ' + /foo/.test(foo));\n\n// test keyword preceders\nreturn /a regexp/;\ndivision = notreturn / not_a_regexp / 2;  // keyword suffix does not match\n\n// & not used as prefix operator in javascript but this should still work\n&/foo/;\n\nextends = /extends/;\n</pre>\n\n<h1>Issue 12 - Javascript Regular Expressions w/ language specified</h1>\n<pre class=\"prettyprint lang-js\" id=\"issue12_lang\">\n/foo/;  // a slash starting a line treated as a regexp beginning\n\"foo\".match(/fo+$/);\n// this line comment not treated as a regular expressions\n\"foo /bar/\".test(/\"baz\"/);  // test string and regexp boundaries\nvar division = /\\b\\d+\\/\\d+/g;  // test char sets and escaping of specials\nvar allSpecials = /([^\\(\\)\\[\\]\\{\\}\\-\\?\\+\\*\\.\\^\\$\\/]+)\\\\/;\nvar slashInCharset = /[^/]/g, notCloseSq = /[^\\]]/;\n\n// test that slash used in numeric context treated as an operator\n1 / 2;\n1. / x;\nx / y;\n(x) / y;\n1 /* foo */ / 2;\n1 /* foo *// 2;\n1/2;\n1./x;\nx/y;\n(x)/y;\n\n// test split over two lines.  line comment should not fool it\n1//\n/2;\n\nx++/y;\nx--/y;\nx[y] / z;\nf() / n;\n\n// test that slash after non postfix operator is start of regexp\nlog('matches = ' + /foo/.test(foo));\n\n// test keyword preceders\nreturn /a regexp/;\ndivision = notreturn / not_a_regexp / 2;  // keyword suffix does not match\n\n// & not used as prefix operator in javascript but this should still work\n&/foo/;\n\nextends = /extends/;\n</pre>\n\n<h1>Coffee</h1>\n<pre class=\"prettyprint lang-coffee\" id=\"coffee\">\nclass Animal\n  constructor: (@name) ->\n  move: (meters, loc) ->\n    alert @name + \" moved \" + meters + \"m.\"\n  travel: (path...) ->\n    for place in path\n      @move place.distance, place.location\n\nclass Horse extends Animal\n  ###\n  @param name Horse name\n  @param jumper Jumping ability\n  ###\n  constructor: (name, jumper) ->\n    super name\n    @capable = jumper\n  step: ->\n    alert '''\n          Step,\n          step...\n          '''\n  jump: ->\n    @capable\n  move: (meters, where) ->\n    switch where\n      when \"ground\"\n        @step()\n        super meters\n      when \"hurdle\"\n        super meters if @jump()\n\n# Create horse\ntom = new Horse \"Tommy\", yes\n\nstreet =\n  location: \"ground\"\n  distance: 12\ncar =\n  location: \"hurdle\"\n  distance: 2\n\n###\nTell him to travel:\n1. through the street\n2. over the car\n###\ntom.travel street, car\n</pre>\n\n<h1>Perl</h1>\n<pre class=\"prettyprint\" id=\"perl\">\n#!/usr/bin/perl\n\nuse strict;\nuse integer;\n\n# the nth element of the fibonacci series\n# param n - an int >= 0\n# return an int >= 0\nsub fib($) {\n  my $n = shift, $a = 1, $b = 1;\n  ($a, $b) = ($a + $b, $a) until (--$n < 0);\n  return $a;\n}\n\nprint fib(10);\n</pre>\n\n<h1>Python</h1>\n<pre class=\"prettyprint\" id=\"python\">\n#!/usr/bin/python2.4\n\ndef fib():\n  '''\n  a generator that produces the elements of the fibonacci series\n  '''\n\n  a = 1\n  b = 1\n  while True:\n    a, b = a + b, a\n    yield a\n\ndef nth(series, n):\n  '''\n  returns the nth element of a series,\n  consuming the earlier elements of the series\n  '''\n\n  for x in series:\n    n = n - 1\n    if n <= 0: return x\n\nprint nth(fib(), 10)\n</pre>\n\n<h1>Python w/ language specified</h1>\n<pre class=\"prettyprint lang-py\" id=\"python_lang\">\n#!/usr/bin/python2.4\n\ndef fib():\n  '''\n  a generator that produces the fibonacci series's elements\n  '''\n\n  a = 1\n  b = 1\n  while True:\n    a, b = a + b, a\n    yield a\n\ndef nth(series, n):\n  '''\n  returns the nth element of a series,\n  consuming the series' earlier elements.\n  '''\n\n  for x in series:\n    n -= 1\n    if n <= 0: return x\n\nprint nth(fib(), 10)\n\n/* not a comment and not keywords: null char true */\n</pre>\n\n<h1>SQL w/ language specified</h1>\n<pre class=\"prettyprint lang-sql\" id=\"sql_lang\">\n/* A multi-line\n * comment */\n'Another string /* Isn\\'t a comment',\n\"A string */\"\n-- A line comment\nSELECT * FROM users WHERE id IN (1, 2.0, +30e-1);\n-- keywords are case-insensitive.\n-- Note: user-table is a single identifier, not a pair of keywords\nselect * from user-table where id in (x, y, z);\n</pre>\n\n<h1>XML</h1>\n<pre class=\"prettyprint\" id=\"xml\">\n&lt;!DOCTYPE series PUBLIC \"fibonacci numbers\"&gt;\n\n&lt;series.root base=\"1\" step=\"s(n-2) + s(n-1)\">\n  &lt;element i=\"0\"&gt;1&lt;/element&gt;\n  &lt;element i=\"1\"&gt;1&lt;/element&gt;\n  &lt;element i=\"2\"&gt;2&lt;/element&gt;\n  &lt;element i=\"3\"&gt;3&lt;/element&gt;\n  &lt;element i=\"4\"&gt;5&lt;/element&gt;\n  &lt;element i=\"5\"&gt;8&lt;/element&gt;\n  ...\n&lt;/series.root&gt;\n</pre>\n\n<h1>HTML</h1>\n<pre class=\"prettyprint\" id=\"html\">\n&lt;html&gt;\n  &lt;head>\n    &lt;title&gt;Fibonacci number&lt;/title&gt;\n    &lt;style&gt;&lt;!-- BODY { text-decoration: blink } --&gt;&lt;/style&gt;\n    &lt;script src=\"foo.js\"&gt;&lt;/script&gt;\n    &lt;script src=\"bar.js\"&gt;&lt;/script&gt;\n  &lt;/head&gt;\n  &lt;body>\n    &lt;noscript&gt;\n      &lt;dl&gt;\n        &lt;dt&gt;Fibonacci numbers&lt;/dt&gt;\n        &lt;dd&gt;1&lt;/dd&gt;\n        &lt;dd&gt;1&lt;/dd&gt;\n        &lt;dd&gt;2&lt;/dd&gt;\n        &lt;dd&gt;3&lt;/dd&gt;\n        &lt;dd&gt;5&lt;/dd&gt;\n        &lt;dd&gt;8&lt;/dd&gt;\n        &amp;hellip;\n      &lt;/dl&gt;\n    &lt;/noscript&gt;\n\n    &lt;script type=\"text/javascript\">&lt;!--\nfunction fib(n) {\n  var a = 1, b = 1;\n  var tmp;\n  while (--n >= 0) {\n    tmp = a;\n    a += b;\n    b = tmp;\n  }\n  return a;\n}\n\ndocument.writeln(fib(10));\n// --&gt;\n    &lt;/script>\n  &lt;/body&gt;\n&lt;/html&gt;\n</pre>\n\n<h1>HTML w/ language specified</h1>\n<pre class=\"prettyprint lang-html\" id=\"html_lang\">\nFibonacci Numbers\n\n&lt;noscript&gt;\n  &lt;dl style=\"list-style: disc\"&gt;\n    &lt;dt&gt;Fibonacci numbers&lt;/dt&gt;\n    &lt;dd&gt;1&lt;/dd&gt;\n    &lt;dd&gt;1&lt;/dd&gt;\n    &lt;dd&gt;2&lt;/dd&gt;\n    &lt;dd&gt;3&lt;/dd&gt;\n    &lt;dd&gt;5&lt;/dd&gt;\n    &lt;dd&gt;8&lt;/dd&gt;\n    &amp;hellip;\n  &lt;/dl&gt;\n&lt;/noscript&gt;\n\n&lt;script type=\"text/javascript\">&lt;!--\nfunction fib(n) {\n  var a = 1, b = 1;\n  var tmp;\n  while (--n >= 0) {\n    tmp = a;\n    a += b;\n    b = tmp;\n  }\n  return a;\n}\n\ndocument.writeln(fib(10));\n// --&gt;\n&lt;/script>\n</pre>\n\n\n<h1>HTML using XMP</h1>\n<xmp class=\"prettyprint\" id=\"htmlXmp\"\n><html>\n  <head>\n    <title>Fibonacci number</title>\n  </head>\n  <body>\n    <noscript>\n      <dl>\n        <dt>Fibonacci numbers</dt>\n        <dd>1</dd>\n        <dd>1</dd>\n        <dd>2</dd>\n        <dd>3</dd>\n        <dd>5</dd>\n        <dd>8</dd>\n        &hellip;\n      </dl>\n    </noscript>\n\n    <script type=\"text/javascript\"><!--\nfunction fib(n) {\n  var a = 1, b = 1;\n  var tmp;\n  while (--n >= 0) {\n    tmp = a;\n    a += b;\n    b = tmp;\n  }\n  return a;\n}\n\ndocument.writeln(fib(10));\n// -->\n    </script>\n  </body>\n</html>\n</xmp>\n\n<h1>XHTML</h1>\n<pre class=\"prettyprint\" id=\"xhtml\"\n>&lt;xhtml&gt;\n  &lt;head&gt;\n    &lt;title&gt;Fibonacci number&lt;/title&gt;\n  &lt;/head&gt;\n  &lt;body onload=\"alert(fib(10))\">\n    &lt;script type=\"text/javascript\"&gt;&lt;![CDATA[\nfunction fib(n) {\n  var a = 1, b = 1;\n  var tmp;\n  while (--n &gt;= 0) {\n    tmp = a;\n    a += b;\n    b = tmp;\n  }\n  return a;\n}\n]]&gt;\n    &lt;/script&gt;\n  &lt;/body&gt;\n&lt;/xhtml&gt;\n</pre>\n\n<h1>PHP</h1>\n<pre class=\"prettyprint\" id=\"PHP\">\n&lt;html>\n  &lt;head>\n    &lt;title>&lt;?= 'Fibonacci numbers' ?>&lt;/title>\n\n    &lt;?php\n      // PHP has a plethora of comment types\n      /* What is a\n         \"plethora\"? */\n      function fib($n) {\n        # I don't know.\n        $a = 1;\n        $b = 1;\n        while (--$n >= 0) {\n          echo \"$a\\n\";\n          $tmp = $a;\n          $a += $b;\n          $b = $tmp;\n        }\n      }\n    ?>\n  &lt;/head>\n  &lt;body>\n    &lt;?= fib(10) ?>\n  &lt;/body>\n&lt;/html>\n</pre>\n\n<h1>XSL (Issue 19)</h1>\n<pre class=\"prettyprint\" id=\"xsl\">\n&lt;!-- Test elements and attributes with namespaces --&gt;\n\n&lt;xsl:stylesheet xml:lang=\"en\"&gt;\n  &lt;xsl:template match=\".\"&gt;\n    &lt;xsl:text&gt;Hello World&lt;/xsl:text&gt;\n  &lt;/xsl:template&gt;\n&lt;/xsl:stylesheet&gt;\n</pre>\n\n<h1>Whitespace</h1>\n<pre class=prettyprint id=\"whitespace\"></pre>\n\n<h1>Misc</h1>\n<pre class=prettyprint id=\"misc1\">// ends with line comment token\n//</pre>\n\n<h1>User submitted testcase for Bug 4</h1>\n<p>\nJavascript Snippets wrapped in HTML SCRIPT tags hides/destroys inner content\n</p>\n<pre class=prettyprint id=\"issue4\">\n&lt;script type=\"text/javascript\"&gt;\n   var savedTarget=null;                           // The target layer (effectively vidPane)\n   var orgCursor=null;                             // The original mouse style so we can restore it\n   var dragOK=false;                               // True if we're allowed to move the element under mouse\n   var dragXoffset=0;                              // How much we've moved the element on the horozontal\n   var dragYoffset=0;                              // How much we've moved the element on the verticle\n   vidPaneID = document.getElementById('vidPane'); // Our movable layer\n   vidPaneID.style.top='75px';                     // Starting location horozontal\n   vidPaneID.style.left='75px';                    // Starting location verticle\n&lt;script&gt;\n</pre>\n<p>The fact that the script tag was not closed properly was causing\nPR_splitSourceNodes to end without emitting the script contents.</p>\n\n<h1>Bug 8 - tabs mangled</h1>\n<p>If tabs are used to indent code inside &lt;pre> IE6 and 7 won't honor them\nafter the script runs.\n\nCode indented with tabs will be shown aligned to the left margin instead of\nthe proper indenting shown in Firefox.\n\nI'm using Revision 20 of prettify.js, IE 6.0.29.00 in English and IE\n7.0.5730.11 in Spanish.\n</p>\n<pre class=prettyprint id=\"issue8\">\n<b>one</b>&#9;<b>Two</b>&#9;<b>three</b>&#9;Four&#9;<b>five</b>&#9;|\nSix&#9;<b>seven</b>&#9;Eight&#9;nine&#9;Ten&#9;|\n<b>eleven</b>&#9;Twelve&#9;<b>thirteen</b>&#9;Fourteen&#9;fifteen&#9;|\n</pre>\n\n<h1>Bug 14a - does not recognize <code>&lt;br&gt;</code> as newline</h1>\n<pre class=\"prettyprint\" id=\"issue14a\"\n>//comment<br />int main(int argc, char **argv)\n{}</pre>\n\n<h1>Bug 14b - comments not ignored</h1>\n<pre class=\"prettyprint\" id=\"issue14b\"\n>&lt;!-- There's an <!-- BOO!! --><acronym title=\"tag soup\">HTML</acronym> comment in my comment --&gt;\n&lt;p&gt;And another one inside the end tag&lt;/p<!-- GOTCHA!! -->&gt;\n</pre>\n\n<h1>Bug 20 - missing blank lines</h1>\n<pre class=\"prettyprint\" id=\"issue20\"\n>&lt;html&gt;\n\n&lt;head&gt;</pre>\n\n<h1>Bug 21 - code doesn't copy and paste well in IE</h1>\n<pre class=\"prettyprint\" id=\"issue21\"\n>&lt;html&gt;\n  &lt;head&gt;\n    &lt;title&gt;Test&lt;/title&gt;\n  &lt;/head&gt;\n&lt;/html&gt;</pre>\n<p>To test this bug, disable overriding of _pr_isIE6 in test_base.js\nby putting #testcopypaste on the end of the URL and reloading the\npage, then copy and paste the above into Notepad.</p>\n\n<h1>Bug 22 - Line numbers and other non-code spans in code</h1>\n<pre class=\"prettyprint\" id=\"issue22\"\n><span class=nocode>01: </span>// This is a line of code\n<span class=nocode>02: </span>/* Multiline comments can\n<span class=nocode>03: </span> * span over and around\n<span class=nocode>04: </span> * line markers\n<span class=\"nocode annot\">And can even be interrupted</span>\n<span class=\"nocode annot\">by inline code annotations</span>\n<span class=nocode>05: </span> */\n<span class=nocode>06: </span>class MyClass extends Foo {\n<span class=nocode>07: </span>  public static void main(String... argv) {\n<span class=nocode>08: </span>    System.out.print(\"Hello World\");\n<span class=nocode>09: </span>  }\n<span class=nocode>10: </span>}</pre>\n\n<h1>Bug 24 - Lua Syntax Highlighting</h1>\n<pre class=\"prettyprint lang-lua\" id=\"issue24\">\nos=require(\"os\")\nmath=require(\"math\")\n\n-- Examples from the language reference\n     a = 'alo\\n123\"'\n     a = \"alo\\n123\\&quot;\"\n     a = '\\97lo\\10\\04923\"'\n     a = [[alo\n     123&quot;]]\n     a = [==[\n     alo\n     123&quot;]==]\n\n3   3.0   3.1416   314.16e-2   0.31416E1   0xff   0x56\n\n-- Some comments that demonstrate long brackets\ndouble_quoted = \"Not a long bracket [=[\"\n--[=[ quoting out\n [[ foo ]]\n [==[does not end comment either]==]\n]=]\npast_end_of_comment\n--]=]\n\n-- Example code courtesy Joseph Harmbruster\n#\ndo\n  local function ssgeneral(t, n, before)\n    for _, h in ipairs(incs) do\n      for i = h + 1, n do\n        local v = t[i]\n        for j = i - h, 1, -h do\n          local testval = t[j]\n          if not before(v, testval) then break end\n          t[i] = testval; i = j\n        end\n        t[i] = v\n      end \n    end\n    return t\n  end\n\n  function shellsort(t, before, n)\n    n = n or #t\n    if not before or before == \"<\" then return ssup(t, n)\n    elseif before == \">\" then return ssdown(t, n)\n    else return ssgeneral(t, n, before)\n    end\n  end\n  return shellsort\nend</pre>\n\n<h1>Bug 27 - VBScript w/ language specified</h1>\n<pre class=\"prettyprint lang-vb\" id=\"issue27\">\nImports System\n\nClass [class]\n    Shared Sub [shared](ByVal [boolean] As Boolean)\n        If [boolean] Then\n            Console.WriteLine(\"true\")\n        Else\n            Console.WriteLine(\"false\")\n        End If\n    End Sub\nEnd Class\n\n' Comment\n&#x2018; Second Line comment with a smart quote _\n  continued line using VB6 syntax.\nModule [module]\n    Sub Main()\n        [class].[shared](True)\n\n        ' This prints out: &quot;.\n        Console.WriteLine(\"\"\"\")\n\n        ' This prints out: a&quot;b.\n        Console.WriteLine(\"a\"\"b\")\n\n        ' This prints out: a.\n        Console.WriteLine(\"a\"c)\n\n        ' This prints out: &quot;.\n        Console.WriteLine(\"\"\"\"c)\n\n        REM an old-style comment\n        REMOVE(not_a_comment)\n    End Sub\nEnd Module\n\nDim d As Date\nd = # 8/23/1970 3:45:39AM #\nd = # 8/23/1970 #\nd = # 3:45:39AM #\nd = # 3:45:39 #\nd = # 13:45:39 #\nd = # 13:45:39PM #\n\nDim n As Float\nn = (0.0, .99F, 1.0E-2D, 1.0E+3D, .5E4, 1E3R, 4D)\n\nDim i As Integer\ni = (0, 123, 45L, &amp;HA0I, &amp;O177S)\n</pre>\n\n<h1>Bug 30 - Haskell w/ language specified</h1>\n<pre class=\"prettyprint lang-hs\" id=\"issue30\">\n-- A comment\nNot(--\"a comment&quot;)\nAlso.not(--(A.comment))\n\nmodule Foo(bar) where\nimport Blah\nimport BlahBlah(blah)\nimport Monads(Exception(..), FIO(..),unFIO,handle,runFIO,fixFIO,fio,\n              write,writeln,HasNext(..),HasOutput(..))\n\n{- nested comments\n - don't work {-yet-} -}\ninstance Thingy Foo where\n  a = b\n\ndata Foo :: (* -> * -> *) -&gt; * > * -> * where\n  Nil :: Foo a b c\n  Cons :: a b c -> Foo abc -> Foo a b c\n\nstr = &quot;Foo\\\\Bar\"\nchar = 'x'\nNot.A.Char = 'too long'  -- Don't barf.  Show that 't is a lexical error.\n\n(ident, ident', Fo''o.b'ar)\n\n(0, 12, 0x45, 0xA7, 0o177, 0O377, 0.1, 1.0, 1e3, 0.5E-3, 1.0E+45)\n</pre>\n\n<h1>Bug 33 - OCaml and F#</h1>\n<pre class=\"prettyprint lang-ml\" id=\"issue33\">\n(*\n * Print the 10th fibonacci number\n *)\n\n//// A line comment\n\"A string\";;\n(0, 125, 0xa0, -1.0, 1e6, 1.2e-3);;  // number literals\n\n#if fibby\n  let\n    rec fib = function (0, a, _) -> a\n                     | (n, a, b) -> fib(n - 1, a + b, a)\n  in\n    print_int(fib(10, 1, 1));;\n#endif\n\nlet zed = 'z'\n\nlet f' x' = x' + 1\n</pre>\n<p>Still TODO: handle nested <code>(* (* comments *) *)</code> properly.</p>\n\n<h1>Bug 42 - Lisp Syntax Highlighting</h1>\n<pre class=\"prettyprint lang-el\" id=\"issue42\"\n>; -*- mode: lisp -*-\n\n(defun back-six-lines () (interactive) (forward-line -6))\n(defun forward-six-lines () (interactive) (forward-line 6))\n\n(global-set-key \"\\M-l\" 'goto-line)\n(global-set-key \"\\C-z\" 'advertised-undo)\n(global-set-key [C-insert] 'clipboard-kill-ring-save)\n(global-set-key [S-insert] 'clipboard-yank)\n(global-set-key [C-up] 'back-six-lines)\n(global-set-key [C-down] 'forward-six-lines)\n\n(setq visible-bell t)\n(setq user-mail-address \"foo@bar.com\")\n(setq default-major-mode 'text-mode)\n\n(setenv \"TERM\" \"emacs\")\n(c-set-offset 'case-label 2)\n(setq c-basic-offset 2)\n(setq perl-indent-level 0x2)\n(setq delete-key-deletes-forward t)\n(setq indent-tabs-mode nil)\n\n;; Text mode\n(add-hook 'text-mode-hook \n  '(lambda ()\n     (turn-on-auto-fill)\n   )\n)\n\n;; Fundamental mode\n(add-hook 'fundamental-mode-hook \n  '(lambda ()\n     (turn-on-auto-fill)\n   )\n)\n\n;; Define and cond are keywords in scheme\n(define (sqt x) (sqrt-iter 1.0 2.0 x))\n</pre>\n\n<h1>Bug 45 - Square brackets in strings</h1>\n<pre class=\"prettyprint\" id=\"issue45\">\nthrow new RuntimeException(\"Element [\" + element.getName() + \n  \"] missing attribute.\");\nvariable++;\n</pre>\n\n<h1>Protocol Buffers</h1>\n<pre class=\"prettyprint lang-proto\" id=\"proto\"\n>message SearchRequest {\n  required string query = 1;\n  optional int32 page_number = 2;\n  optional int32 result_per_page = 3 [default = 10];\n  enum Corpus {\n    UNIVERSAL = 0;\n    WEB = 1;\n    IMAGES = 2;\n    LOCAL = 3;\n    NEWS = 4;\n    PRODUCTS = 5;\n    VIDEO = 6;\n  }\n  optional Corpus corpus = 4 [default = UNIVERSAL];\n}</pre>\n\n<h1>Wiki syntax w/ language specified</h1>\n<pre class=\"prettyprint lang-wiki\" id=\"wiki\">\n#summary hello world\n#labels HelloWorld WikiWord Hiya\n\n[http://www.google.com/?q=WikiSyntax+site:code.google.com WikiSyntax]\n\nLorem Ipsum `while (1) print(\"blah blah\");`\n\n   * Bullet\n   * Points\n      * NestedBullet\n\n==DroningOnAndOn==\n{{{\n  // Some EmbeddedSourceCode\n  void main() {\n    Print('hello world');\n  }\n}}}\n\n{{{\n  &lt;!-- Embedded XML --&gt;\n  &lt;foo bar=\"baz\"&gt;&lt;boo /&gt;&lt;foo&gt;\n}}}\n</pre>\n\n<h1>CSS w/ language specified</h1>\n<pre class=\"prettyprint lang-css\" id=\"css\">\n&lt;!--\n@charset('UTF-8');\n\n/** A url that is not quoted. */\n@import(url(/more-styles.css));\n\nHTML { content-before: 'hello\\20'; content-after: 'w\\6f rld';\n       -moz-spiff: inherit !important }\n\n/* Test units on numbers. */\nBODY { margin-bottom: 4px; margin-left: 3in; margin-bottom: 0; margin-top: 5% }\n\n/** Test number literals and quoted values. */\nTABLE.foo TR.bar A#visited { color: #001123; font-family: \"monospace\" }\n/** bolder is not a name, so should be plain.  !IMPORTANT is a keyword\n  * regardless of case.\n  */\nblink { text-decoration: BLINK !IMPORTANT; font-weight: bolder }\n/* Empty url() was causing infinite recursion */\na { background-image: url(); }\np#featured{background:#fea}\n--&gt;\n</pre>\n\n<h1>Issue 79 CSS highlighting</h1>\n<pre class=\"prettyprint\" id=\"issue79\">\n&lt;style type='text/css'>\n/* desert scheme ported from vim to google prettify */\ncode.prettyprint { display: block; padding: 2px; border: 1px solid #888;\nbackground-color: #333; }\n.str { color: #ffa0a0; } /* string  - pink */\n.kwd { color: #f0e68c; font-weight: bold; }\n.com { color: #87ceeb; } /* comment - skyblue */\n.typ { color: #98fb98; } /* type    - lightgreen */\n.lit { color: #cd5c5c; } /* literal - darkred */\n.pun { color: #fff; }    /* punctuation */\n.pln { color: #fff; }    /* plaintext */\n.tag { color: #f0e68c; font-weight: bold; } /* html/xml tag    - lightyellow*/\n.atn { color: #bdb76b; font-weight: bold; } /* attribute name  - khaki*/\n.atv { color: #ffa0a0; } /* attribute value - pink */\n.dec { color: #98fb98; } /* decimal         - lightgreen */\n&lt;/style>\n</pre>\n\n<h1>Issue 84 NBSPs</h1>\n<pre class=\"prettyprint lang-java\" id=\"issue84\">super(\"&amp;nbsp;\");</pre>\n\n<h1>Issue 86</h1>\n<p><code class=\"prettyprint\" id=\"issue86_0\">#One\nTwo words</code></p>\n<p><code class=\"prettyprint known_ie6_failure\" id=\"issue86_1\" style=\"white-space: pre\">#One\nTwo lines</code></p>\n<pre class=\"prettyprint\" id=\"issue86_2\">#One\nTwo lines</pre>\n<pre><code class=\"prettyprint known_ie6_failure\" id=\"issue86_3\">#One\nTwo lines</code></pre>\n<xmp class=\"prettyprint\" id=\"issue86_4\">#One\nTwo lines</xmp>\n<p><code class=\"prettyprint\" id=\"issue86_5\">#One<br>\nTwo lines</code></p>\n\n<h1>Issue 92 -- capital letters in tag names</h1>\n<pre class=\"prettyprint\" id=\"issue92\">\n&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;kml xmlns=\"http://www.opengis.net/kml/2.2\"&gt;\n  &lt;Placemark&gt;\n    &lt;name&gt;Simple placemark&lt;/name&gt;\n    &lt;description Lang=\"en\"&gt;Attached to the ground. Intelligently places itself \n       at the height of the underlying terrain.&lt;/description&gt;\n    &lt;Point&gt;\n      &lt;coordinates&gt;-122.0822035425683,37.42228990140251,0&lt;/coordinates&gt;\n    &lt;/Point&gt;\n  &lt;/Placemark&gt;\n&lt;/kml&gt;\n</pre>\n\n<h1>Issue 93 -- C# verbatim strings</h1>\n<pre class=\"prettyprint lang-cs\" id=\"issue93\">\n// The normal string syntax\nstring a = \"C:\\\\\";\n// is equivalent to a verbatim string\nstring b = @\"C:\\\";\n</pre>\n\n<h1>VHDL mode</h1>\n<pre class=\"prettyprint lang-vhdl\" id=\"vhdl\">\nlibrary ieee;\nuse ieee.std_logic_1164.all;\nuse ieee.numeric_std.all;\n\n-- A line comment\nentity foo_entity is\n\n  generic (-- comment after punc\n    a : natural := 42;\n    x : real := 16#ab.cd#-3\n  );\n  port (\n    clk_i : in  std_logic;\n    b_i   : in  natural range 0 to 100;\n    c_o   : out std_logic_vector(5 downto 0);\n    \\a \"name\"\\ : out integer  -- extended identifier\n  );\n\nend entity foo_entity;\n\narchitecture foo_architecture of foo_entity is\n  signal bar_s : std_logic_vector(2 downto 0);\nbegin\n  \n  bar_s &lt;= b\"101\";\n\n  dummy_p : process (clk_i)\n  begin\n    if b_i = 1 then\n      c_o &lt;= (others => '0');\n    elsif rising_edge(clk_i) then\n      c_o &lt;= \"1011\" &amp; bar_s(1 downto 0);\n    end if;\n  end process dummy_p;\n\nend architecture foo_architecture;\n</pre>\n\n<h1>YAML mode</h1>\n<pre class=\"prettyprint lang-yaml\" id=\"yaml1\">\napplication: mirah-lang\nversion: 1\n\n# Here's a comment\nhandlers:\n  - url: /red/*\n     servlet: mysite.server.TeamServlet\n     init_params:\n       teamColor: red\n       bgColor: \"#CC0000\"\n     name: redteam\n  - url: /blue/*\n     servlet: mysite.server.TeamServlet\n     init_params:\n       teamColor: blue\n       bgColor: \"#0000CC\"\n     name: blueteam\n  - url: /register/*\n     jsp: /register/start.jsp\n  - url: *.special\n     filter: mysite.server.LogFilterImpl\n     init_params:\n       logType: special\n  </pre>\n<pre class=\"prettyprint lang-yaml\" id=\"yaml2\">\n%YAML 1.1\n---\n!!map {\n  ? !!str \"\"\n  : !!str \"value\",\n  ? !!str \"explicit key\"\n  : !!str \"value\",\n  ? !!str \"simple key\"\n  : !!str \"value\",\n  ? !!seq [\n    !!str \"collection\",\n    !!str \"simple\",\n    !!str \"key\"\n  ]\n  : !!str \"value\"\n}</pre>\n\n<h1>Scala mode</h1>\n<pre class=\"prettyprint lang-scala\" id=\"scala\">\n/* comment 1 */\n/*\ncomment 2\n*/\n/* comment / * comment 3 **/\n// strings\n\"Hello, World!\", \"\\n\",\n`an-identifier`, `\\n`,\n'A', '\\n',\n'aSymbol,\n\"\"\"Hello,\nWorld\"\"\", \"\"\"Hello,\\nWorld\"\"\",\n\"\"\"Hello, \"World\"!\"\"\",\n\"\"\"Hello, \\\"World\\\"\"\"\"\n\n// Numbers\n0\n0123\n0xa0\n0XA0L\n123\n123.45\n1.50F\n0.50\n.50\n123e-1\n123.45e+1\n1.50e2\n0.50e-6\n.50e+42f\n\n// Values\nfalse, true, null, this;\n\n// Keywords\nclass MyClass;\nimport foo.bar;\npackage baz;\n\n// From scala-lang.org/node/242\ndef act() {\n  var pongCount = 0\n  loop {\n    react {\n      case Ping =>\n        if (pongCount % 1000 == 0)\n          Console.println(\"Pong: ping \"+pongCount)\n        sender ! Pong\n        pongCount = pongCount + 1\n      case Stop =>\n        Console.println(\"Pong: stop\")\n        exit()\n    }\n  }\n}\n</pre>\n\n<h1>Go mode</h1>\n<pre class=\"prettyprint lang-go\" id=\"go\">\npackage main  /* Package of which this program is part. */\n\nimport fmt \"fmt\"  // Package implementing formatted I/O.\n\n\nfunc main() {\n    fmt.Printf(\"Hello, world; or &#x039a;&#x03b1;&#x03bb;&#x03b7;&#x03bc;&#x03ad;&#x03c1;&#x03b1; &#x03ba;&#x03cc;&#x03c3;&#x03bc;&#x03b5;; or &#x3053;&#x3093;&#x306b;&#x3061;&#x306f; &#x4e16;&#x754c;\\n\")  // Semicolon inserted here\n}\n\n/* \" */  &quot;foo /* \"  /*/  */\n/* ` */  `foo /* `  /*/  */\n</pre>\n\n<h1>Erlang mode</h1>\n<pre class=\"prettyprint lang-erlang\" id=\"erlang\">\n% Sample comment\n\n-module(my_test).\n-include_lib(\"my_sample_lib.hrl\").\n-export([\n    test/2\n]).\n\n%% @doc Define a macro\n-define(my_macro, Variable).\n\n%% @doc My function\ntest(Variables, MoreVariables) ->\n    % Inline comment\n    {ok,Scanned,_} = my_lib:do_stuff(),\n\n    Variable = fun(V) -> {ok, V} end,\n\n    try ?my_macro({value, test}) of\n        {value, Result, _} ->\n            {ok, Result}\n    catch\n        Type:Error ->\n            {'error', Type, Error}\n    end.\n</pre>\n\nTest IE by copy/pasting content here.\n<textarea cols=\"80\" rows=\"40\"></textarea>\n</body>\n\n<script type=\"text/javascript\">\n/**\n * maps ids of rewritten code to the expected output.\n * For brevity, <span class=\"foo\"> has been changed to `FOO and </span>\n * has been changed to `END.\n */\nvar goldens = {\n  bash: (\n      '`COM#!/bin/bash`END`PLN\\n' +\n      '\\n' +\n      '`END`COM# Fibonacci numbers`END`PLN\\n' +\n      '`END`COM# Writes an infinite series to stdout, one entry per line`END' +\n          '`PLN\\n' +\n      '`END`KWDfunction`END`PLN fib`END`PUN()`END`PLN `END`PUN{`END`PLN\\n' +\n      '  `END`KWDlocal`END`PLN a`END`PUN=`END`LIT1`END`PLN\\n' +\n      '  `END`KWDlocal`END`PLN b`END`PUN=`END`LIT1`END`PLN\\n' +\n      '  `END`KWDwhile`END`PLN `END`KWDtrue`END`PLN `END`PUN;`END' +\n          '`PLN `END`KWDdo`END`PLN\\n' +\n      '    echo $a\\n' +\n      '    `END`KWDlocal`END`PLN tmp`END`PUN=`END`PLN$a\\n' +\n      '    a`END`PUN=`END`PLN$`END`PUN((`END`PLN $a `END`PUN+`END' +\n          '`PLN $b `END`PUN))`END`PLN\\n' +\n      '    b`END`PUN=`END`PLN$tmp\\n' +\n      '  `END`KWDdone`END`PLN\\n' +\n      '`END`PUN}`END`PLN\\n' +\n      '\\n' +\n      '`END`COM# output the 10th element of the series and halt`END`PLN\\n' +\n      'fib `END`PUN|`END`PLN head `END`PUN-`END`LIT10`END`PLN `END`PUN|`END' +\n          '`PLN tail `END`PUN-`END`LIT1`END'),\n  bash_lang: (\n      '<ol class=\"linenums\">`#`COM#!/bin/bash`END' +\n      '`#1`PLN&nbsp;`END' +\n      '`#2`COM# Fibonacci numbers`END' +\n      '`#3`COM# Writes an infinite series to stdout, one entry per line`END' +\n      '`#4`KWDfunction`END`PLN fib`END`PUN()`END`PLN `END`PUN{`END' +\n      '`#5`PLN  `END`KWDlocal`END`PLN a`END`PUN=`END`LIT1`END' +\n      '`#6`PLN  `END`KWDlocal`END`PLN b`END`PUN=`END`LIT1`END' +\n      '`#7`PLN  `END`KWDwhile`END`PLN true `END`PUN;`END' +\n          '`PLN `END`KWDdo`END' +\n      '`#8`PLN    echo $a`END' +\n      '`#9`PLN    `END`KWDlocal`END`PLN tmp`END`PUN=`END`PLN$a`END' +\n      '`#0`PLN    a`END`PUN=`END`PLN$`END`PUN((`END`PLN $a `END`PUN+`END' +\n          '`PLN $b `END`PUN))`END' +\n      '`#1`PLN    b`END`PUN=`END`PLN$tmp`END' +\n      '`#2`PLN  `END`KWDdone`END' +\n      '`#3`PUN}`END' +\n      '`#4`PLN&nbsp;`END' +\n      '`#5`COM# output the 10th element of the series and halt`END' +\n      '`#6`PLNfib `END`PUN|`END`PLN `END`PUN/`END`PLNusr`END`PUN/`END`PLNbin`END' +\n          '`PUN/*`END`PLNhead `END`PUN-`END`LIT10`END`PLN `END`PUN|`END' +\n          '`PLN tail `END`PUN-`END`LIT1`END</li></ol>'),\n  issue_165: (\n      '`COM# Comment`END`PLN\\n' +\n      '`END`KWDlocal`END`PLN $x `END`PUN=`END`PLN $`END`PUN{#`END`PLNx`END`PUN[@]}`END`PLN  `END'\n          + '`COM# Previous is not a comment`END`PLN\\n' +\n      '`END`COM# A comment`END'),\n C: (\n      '`COM#include`END`PLN `END`STR&lt;stdio.h&gt;`END`PLN\\n' +\n      '\\n' +\n      '`END`COM/* the n-th fibonacci number.\\n' +\n      ' *\\/`END`PLN\\n' +\n      '`END`KWDunsigned`END`PLN `END`KWDint`END`PLN fib`END`PUN(`END' +\n          '`KWDunsigned`END`PLN `END`KWDint`END`PLN n`END`PUN)`END`PLN `END' +\n          '`PUN{`END`PLN\\n' +\n      '  `END`KWDunsigned`END`PLN `END`KWDint`END`PLN a `END`PUN=`END' +\n          '`PLN `END`LIT1`END`PUN,`END`PLN b `END`PUN=`END`PLN `END`LIT1`END' +\n          '`PUN;`END`PLN\\n' +\n      '  `END`KWDunsigned`END`PLN `END`KWDint`END`PLN tmp`END`PUN;`END' +\n          '`PLN\\n' +\n      '  `END`KWDwhile`END`PLN `END`PUN(--`END`PLNn `END`PUN&gt;=`END' +\n          '`PLN `END`LIT0`END`PUN)`END`PLN `END`PUN{`END`PLN\\n' +\n      '    tmp `END`PUN=`END`PLN a`END`PUN;`END`PLN\\n' +\n      '    a `END`PUN+=`END`PLN b`END`PUN;`END`PLN\\n' +\n      '    b `END`PUN=`END`PLN tmp`END`PUN;`END`PLN\\n' +\n      '  `END`PUN}`END`PLN\\n' +\n      '  `END`KWDreturn`END`PLN a`END`PUN;`END`PLN\\n' +\n      '`END`PUN}`END`PLN\\n' +\n      '\\n' +\n      'main`END`PUN()`END`PLN `END`PUN{`END`PLN\\n' +\n      '  printf`END`PUN(`END`STR\"%u\"`END`PUN,`END`PLN fib`END`PUN(`END' +\n          '`LIT10`END`PUN));`END`PLN\\n' +\n      '`END`PUN}`END'),\n  C_lang: (\n      '`COM#include`END`PLN `END`STR&lt;stdio.h&gt;`END`PLN\\n' +\n      '\\n' +\n      '`END`COM/* the n`END<sup>`COMth`END<\\/sup>`COM fibonacci number. *\\/`END`PLN\\n' +\n      '`END`TYPuint32`END`PLN fib`END`PUN(`END' +\n          '`KWDunsigned`END`PLN `END`TYPint`END`PLN n`END`PUN)`END`PLN `END' +\n          '`PUN{`END`PLN\\n' +\n      '  `END`TYPuint32`END`PLN a `END`PUN=`END`PLN `END`LIT1`END`PUN,`END' +\n          '`PLN b `END`PUN=`END`PLN `END`LIT1`END`PUN;`END`PLN\\n' +\n      '  `END`TYPuint32`END`PLN tmp`END`PUN;`END`PLN\\n' +\n      '  `END`KWDwhile`END`PLN `END`PUN(--`END`PLNn `END`PUN&gt;=`END' +\n          '`PLN `END`LIT0`END`PUN)`END`PLN `END`PUN{`END`PLN\\n' +\n      '    tmp `END`PUN=`END`PLN a`END`PUN;`END`PLN\\n' +\n      '    a `END`PUN+=`END`PLN b`END`PUN;`END`PLN\\n' +\n      '    b `END`PUN=`END`PLN tmp`END`PUN;`END`PLN\\n' +\n      '  `END`PUN}`END`PLN\\n' +\n      '  `END`KWDreturn`END`PLN a`END`PUN;`END`PLN\\n' +\n      '`END`PUN}`END`PLN\\n' +\n      '\\n' +\n      '`END`KWDvoid`END`PLN main`END`PUN()`END`PLN `END`PUN{`END`PLN\\n' +\n      '  `END`TYPsize_t`END`PLN size `END`PUN=`END`PLN `END`KWDsizeof`END' +\n          '`PUN(`END`TYPwchar_t`END`PUN);`END`PLN\\n' +\n      '  ASSERT_EQ`END`PUN(`END`PLNsize`END`PUN,`END`PLN `END`LIT1`END' +\n          '`PUN);`END`PLN\\n' +\n      '  printf`END`PUN(`END`STR\"%u\"`END`PUN,`END`PLN fib`END`PUN(`END' +\n          '`LIT10`END`PUN));`END`PLN\\n' +\n      '`END`PUN}`END`PLN\\n' +\n      '\\n' +\n      '`END`COM#define`END`PLN ZERO `END`LIT0`END`PLN `END`COM/* a\\n' +\n      '  multiline comment *\\/`END'),\n  Cpp: (\n      '`COM#include`END`PLN `END`STR&lt;iostream&gt;`END`PLN\\n' +\n      '\\n' +\n      '`END`KWDusing`END`PLN `END`KWDnamespace`END`PLN std`END`PUN;`END' +\n          '`PLN\\n' +\n      '\\n' +\n      '`END`COM//! fibonacci numbers with gratuitous use of templates.`END' +\n          '`PLN\\n' +\n      '`END`COM//! \\\\param n an index into the fibonacci series`END`PLN\\n' +\n      '`END`COM//! \\\\param fib0 element 0 of the series`END`PLN\\n' +\n      '`END`COM//! \\\\return the nth element of the fibonacci series`END' +\n          '`PLN\\n' +\n      '`END`KWDtemplate`END`PLN `END`PUN&lt;`END`KWDclass`END`PLN T`END' +\n          '`PUN&gt;`END`PLN\\n' +\n      'T fib`END`PUN(`END`KWDunsigned`END`PLN `END`KWDint`END`PLN n`END' +\n          '`PUN,`END`PLN `END`KWDconst`END`PLN T`END`PUN&amp;`END`PLN fib0' +\n          '`END`PUN)`END`PLN `END`PUN{`END`PLN\\n' +\n      '  T a`END`PUN(`END`PLNfib0`END`PUN),`END`PLN b`END`PUN(`END' +\n          '`PLNfib0`END`PUN);`END`PLN\\n' +\n      '  `END`KWDfor`END`PLN `END`PUN(;`END`PLN n`END`PUN;`END' +\n          '`PLN `END`PUN--`END`PLNn`END`PUN)`END`PLN `END`PUN{`END`PLN\\n' +\n      '    T tmp`END`PUN(`END`PLNa`END`PUN);`END`PLN\\n' +\n      '    a `END`PUN+=`END`PLN b`END`PUN;`END`PLN\\n' +\n      '    b `END`PUN=`END`PLN tmp`END`PUN;`END`PLN\\n' +\n      '  `END`PUN}`END`PLN\\n' +\n      '  `END`KWDreturn`END`PLN a`END`PUN;`END`PLN\\n' +\n      '`END`PUN}`END`PLN\\n' +\n      '\\n' +\n      '`END`KWDint`END`PLN main`END`PUN(`END`KWDint`END`PLN argc`END' +\n          '`PUN,`END`PLN `END`KWDchar`END`PLN `END`PUN**`END`PLNargv`END' +\n          '`PUN)`END`PLN `END`PUN{`END`PLN\\n' +\n      '  cout `END`PUN&lt;&lt;`END`PLN fib`END`PUN(`END`LIT10`END' +\n          '`PUN,`END`PLN `END`LIT1U`END`PUN);`END`PLN\\n' +\n      '`END`PUN}`END'),\n\n  Cpp_lang: (\n      '`COM#include`END`PLN `END`STR&lt;iostream&gt;`END`PLN\\n' +\n      '\\n' +\n      '`END`KWDusing`END`PLN `END`KWDnamespace`END`PLN std`END`PUN;`END' +\n          '`PLN\\n' +\n      '\\n' +\n      '`END`COM//! fibonacci numbers with gratuitous use of templates.`END' +\n          '`PLN\\n' +\n      '`END`COM//! \\\\param n an index into the fibonacci series`END`PLN\\n' +\n      '`END`COM//! \\\\param fib0 element 0 of the series`END`PLN\\n' +\n      '`END`COM//! \\\\return the nth element of the fibonacci series`END' +\n          '`PLN\\n' +\n      '`END`KWDtemplate`END`PLN `END`PUN&lt;`END`KWDclass`END`PLN T`END' +\n          '`PUN&gt;`END`PLN\\n' +\n      'T fib`END`PUN(`END`TYPint`END`PLN n`END' +\n          '`PUN,`END`PLN `END`KWDconst`END`PLN T`END`PUN&amp;`END`PLN fib0' +\n          '`END`PUN)`END`PLN `END`PUN{`END`PLN\\n' +\n      '  T a`END`PUN(`END`PLNfib0`END`PUN),`END`PLN b`END`PUN(`END' +\n          '`PLNfib0`END`PUN);`END`PLN\\n' +\n      '  `END`KWDwhile`END`PLN `END`PUN(--`END`PLNn `END`PUN&gt;=`END' +\n          '`PLN `END`LIT0`END`PUN)`END`PLN `END`PUN{`END`PLN\\n' +\n      '    T tmp`END`PUN(`END`PLNa`END`PUN);`END`PLN\\n' +\n      '    a `END`PUN+=`END`PLN b`END`PUN;`END`PLN\\n' +\n      '    b `END`PUN=`END`PLN tmp`END`PUN;`END`PLN\\n' +\n      '  `END`PUN}`END`PLN\\n' +\n      '  `END`KWDreturn`END`PLN a`END`PUN;`END`PLN\\n' +\n      '`END`PUN}`END`PLN\\n' +\n      '\\n' +\n      '`END`TYPint`END`PLN main`END`PUN(`END`TYPint`END`PLN argc`END' +\n          '`PUN,`END`PLN `END`KWDchar`END`PLN `END`PUN**`END`PLNargv`END' +\n          '`PUN)`END`PLN `END`PUN{`END`PLN\\n' +\n      '  cout `END`PUN&lt;&lt;`END`PLN fib`END`PUN(`END`LIT10`END' +\n          '`PUN,`END`PLN `END`LIT1U`END`PUN);`END`PLN\\n' +\n      '`END`PUN}`END'),\n\n  java: (\n      '`KWDpackage`END`PLN foo`END`PUN;`END`PLN\\n' +\n      '\\n' +\n      '`END`KWDimport`END`PLN java`END`PUN.`END`PLNutil`END`PUN.`END' +\n          '`TYPIterator`END`PUN;`END`PLN\\n' +\n      '\\n' +\n      '`END`COM/**\\n' +\n      ' * the fibonacci series implemented as an Iterable.\\n' +\n      ' *\\/`END`PLN\\n' +\n      '`END`KWDpublic`END`PLN `END`KWDfinal`END`PLN `END`KWDclass`END' +\n          '`PLN `END`TYPFibonacci`END`PLN `END`KWDimplements`END`PLN `END' +\n          '`TYPIterable`END`PUN&lt;`END`TYPInteger`END`PUN&gt;`END`PLN `END`' +\n          'PUN{`END`PLN\\n' +\n      '  `END' +\n          '`COM/** the next and previous members of the series. *\\/`END' +\n          '`PLN\\n' +\n      '  `END`KWDprivate`END`PLN `END`KWDint`END`PLN a `END`PUN=`END' +\n          '`PLN `END`LIT1`END`PUN,`END`PLN b `END`PUN=`END`PLN `END`LIT1`END' +\n          '`PUN;`END`PLN\\n' +\n      '\\n' +\n      '  `END`LIT@Override`END`PLN\\n' +\n      '  `END`KWDpublic`END`PLN `END`TYPIterator`END`PUN&lt;`END' +\n          '`TYPInteger`END`PUN&gt;`END`PLN iterator`END`PUN()`END`PLN `END' +\n          '`PUN{`END`PLN\\n' +\n      '    `END`KWDreturn`END`PLN `END`KWDnew`END`PLN `END' +\n          '`TYPIterator`END`PUN&lt;`END`TYPInteger`END`PUN&gt;()`END`PLN `END' +\n          '`PUN{`END`PLN\\n' +\n      '      `END`COM/** the series is infinite. *\\/`END' +\n          '`PLN\\n' +\n      '      `END`KWDpublic`END`PLN `END`KWDboolean`END' +\n          '`PLN hasNext`END`PUN()`END`PLN `END`PUN{`END`PLN `END' +\n          '`KWDreturn`END`PLN `END`KWDtrue`END`PUN;`END`PLN `END`PUN}`END' +\n          '`PLN\\n' +\n      '      `END`KWDpublic`END`PLN `END`TYPInteger`END' +\n          '`PLN `END`KWDnext`END`PUN()`END`PLN `END`PUN{`END`PLN\\n' +\n      '        `END`KWDint`END`PLN tmp `END`PUN=`END' +\n          '`PLN a`END`PUN;`END`PLN\\n' +\n      '        a `END`PUN+=`END`PLN b`END`PUN;`END' +\n          '`PLN\\n' +\n      '        b `END`PUN=`END`PLN tmp`END`PUN;`END' +\n          '`PLN\\n' +\n      '        `END`KWDreturn`END`PLN a`END`PUN;`END' +\n          '`PLN\\n' +\n      '      `END`PUN}`END`PLN\\n' +\n      '      `END`KWDpublic`END`PLN `END`KWDvoid`END' +\n          '`PLN remove`END`PUN()`END`PLN `END`PUN{`END`PLN `END`KWDthrow`END' +\n          '`PLN `END`KWDnew`END`PLN `END' +\n          '`TYPUnsupportedOperationException`END`PUN();`END`PLN `END' +\n          '`PUN}`END`PLN\\n' +\n      '    `END`PUN};`END`PLN\\n' +\n      '  `END`PUN}`END`PLN\\n' +\n      '\\n' +\n      '  `END`COM/**\\n' +\n      '   * the n&lt;sup&gt;th&lt;/sup&gt; element of the given ' +\n          'series.\\n' +\n      '   * @throws NoSuchElementException if there are less than ' +\n          'n elements in the\\n' +\n      '   *   given Iterable\\'s {@link Iterable#iterator ' +\n          'iterator}.\\n' +\n      '   *\\/`END`PLN\\n' +\n      '  `END`KWDpublic`END`PLN `END`KWDstatic`END`PLN `END' +\n          '`PUN&lt;`END`PLNT`END`PUN&gt;`END`PLN\\n' +\n      '  T nth`END`PUN(`END`KWDint`END`PLN n`END`PUN,`END`PLN `END' +\n          '`TYPIterable`END`PUN&lt;`END`PLNT`END`PUN&gt;`END' +\n          '`PLN iterable`END`PUN)`END`PLN `END`PUN{`END`PLN\\n' +\n      '    `END`TYPIterator`END`PUN&lt;?`END`PLN `END' +\n          '`KWDextends`END`PLN T`END`PUN&gt;`END`PLN it `END`PUN=`END' +\n          '`PLN iterable`END`PUN.`END`PLNiterator`END`PUN();`END`PLN\\n' +\n      '    `END`KWDwhile`END`PLN `END`PUN(--`END`PLNn `END' +\n          '`PUN&gt;`END`PLN `END`LIT0`END`PUN)`END`PLN `END`PUN{`END`PLN\\n' +\n      '      it`END`PUN.`END`KWDnext`END`PUN();`END`PLN\\n' +\n      '    `END`PUN}`END`PLN\\n' +\n      '    `END`KWDreturn`END`PLN it`END`PUN.`END`KWDnext`END' +\n          '`PUN();`END`PLN\\n' +\n      '  `END`PUN}`END`PLN\\n' +\n      '\\n' +\n      '  `END`KWDpublic`END`PLN `END`KWDstatic`END`PLN `END`KWDvoid`END' +\n          '`PLN main`END`PUN(`END`TYPString`END`PUN[]`END`PLN args`END' +\n          '`PUN)`END`PLN `END`PUN{`END`PLN\\n' +\n      '    `END`TYPSystem`END`PUN.`END`KWDout`END`PUN.`END' +\n          '`KWDprint`END`PUN(`END`PLNnth`END`PUN(`END`LIT10`END`PUN,`END' +\n          '`PLN `END`KWDnew`END`PLN `END`TYPFibonacci`END`PUN()));`END' +\n          '`PLN\\n' +\n      '  `END`PUN}`END`PLN\\n' +\n      '`END`PUN}`END'),\n  java_lang: (\n      '<ol class=\"linenums\"><li class=\"L1\" value=\"12\">' +\n        '`KWDpackage`END`PLN foo`END`PUN;`END' +\n      '`#2`PLN&nbsp;`END' +\n      '`#3`KWDimport`END`PLN java`END`PUN.`END`PLNutil`END`PUN.`END' +\n          '`TYPIterator`END`PUN;`END' +\n      '`#4`PLN&nbsp;`END' +\n      '`#5`COM/**`END' +\n      '`#6`COM * the fibonacci series implemented as an Iterable.`END' +\n      '`#7`COM *\\/`END' +\n      '`#8`KWDpublic`END`PLN `END`KWDfinal`END`PLN `END`KWDclass`END' +\n          '`PLN `END`TYPFibonacci`END`PLN `END`KWDimplements`END`PLN `END' +\n          '`TYPIterable`END`PUN&lt;`END`TYPInteger`END`PUN&gt;`END`PLN `END`' +\n          'PUN{`END' +\n      '`#9`PLN  `END' +\n          '`COM/** the next and previous members of the series. *\\/`END' +\n          '' +\n      '`#0`PLN  `END`KWDprivate`END`PLN `END`KWDint`END`PLN a `END`PUN=`END' +\n          '`PLN `END`LIT1`END`PUN,`END`PLN b `END`PUN=`END`PLN `END`LIT1`END' +\n          '`PUN;`END' +\n      '`#1`PLN&nbsp;`END' +\n      '`#2`PLN  `END`LIT@Override`END' +\n      '`#3`PLN  `END`KWDpublic`END`PLN `END`TYPIterator`END`PUN&lt;`END' +\n          '`TYPInteger`END`PUN&gt;`END`PLN iterator`END`PUN()`END`PLN `END' +\n          '`PUN{`END' +\n      '`#4`PLN    `END`KWDreturn`END`PLN `END`KWDnew`END`PLN `END' +\n          '`TYPIterator`END`PUN&lt;`END`TYPInteger`END`PUN&gt;()`END`PLN `END' +\n          '`PUN{`END' +\n      '`#5`PLN      `END`COM/** the series is infinite. *\\/`END' +\n          '' +\n      '`#6`PLN      `END`KWDpublic`END`PLN `END`KWDboolean`END' +\n          '`PLN hasNext`END`PUN()`END`PLN `END`PUN{`END`PLN `END' +\n          '`KWDreturn`END`PLN `END`KWDtrue`END`PUN;`END`PLN `END`PUN}`END' +\n          '' +\n      '`#7`PLN      `END`KWDpublic`END`PLN `END`TYPInteger`END' +\n          '`PLN next`END`PUN()`END`PLN `END`PUN{`END' +\n      '`#8`PLN        `END`KWDint`END`PLN tmp `END`PUN=`END' +\n          '`PLN a`END`PUN;`END' +\n      '`#9`PLN        a `END`PUN+=`END`PLN b`END`PUN;`END' +\n          '' +\n      '`#0`PLN        b `END`PUN=`END`PLN tmp`END`PUN;`END' +\n          '' +\n      '`#1`PLN        `END`KWDreturn`END`PLN a`END`PUN;`END' +\n          '' +\n      '`#2`PLN      `END`PUN}`END' +\n      '`#3`PLN      `END`KWDpublic`END`PLN `END`KWDvoid`END' +\n          '`PLN remove`END`PUN()`END`PLN `END`PUN{`END`PLN `END`KWDthrow`END' +\n          '`PLN `END`KWDnew`END`PLN `END' +\n          '`TYPUnsupportedOperationException`END`PUN();`END`PLN `END' +\n          '`PUN}`END' +\n      '`#4`PLN    `END`PUN};`END' +\n      '`#5`PLN  `END`PUN}`END' +\n      '`#6`PLN&nbsp;`END' +\n      '`#7`PLN  `END`COM/**`END' +\n      '`#8`COM   * the n&lt;sup&gt;th&lt;/sup&gt; element of the given ' +\n          'series.`END' +\n      '`#9`COM   * @throws NoSuchElementException if there are less than ' +\n          'n elements in the`END' +\n      '`#0`COM   *   given Iterable\\'s {@link Iterable#iterator ' +\n          'iterator}.`END' +\n      '`#1`COM   *\\/`END' +\n      '`#2`PLN  `END`KWDpublic`END`PLN `END`KWDstatic`END`PLN `END' +\n          '`PUN&lt;`END`PLNT`END`PUN&gt;`END' +\n      '`#3`PLN  T nth`END`PUN(`END`KWDint`END`PLN n`END`PUN,`END`PLN `END' +\n          '`TYPIterable`END`PUN&lt;`END`PLNT`END`PUN&gt;`END' +\n          '`PLN iterable`END`PUN)`END`PLN `END`PUN{`END' +\n      '`#4`PLN    `END`TYPIterator`END`PUN&lt;?`END`PLN `END' +\n          '`KWDextends`END`PLN T`END`PUN&gt;`END`PLN in `END`PUN=`END' +\n          '`PLN iterable`END`PUN.`END`PLNiterator`END`PUN();`END' +\n      '`#5`PLN    `END`KWDwhile`END`PLN `END`PUN(--`END`PLNn `END' +\n          '`PUN&gt;`END`PLN `END`LIT0`END`PUN)`END`PLN `END`PUN{`END' +\n      '`#6`PLN      in`END`PUN.`END`PLNnext`END`PUN();`END' +\n      '`#7`PLN    `END`PUN}`END' +\n      '`#8`PLN    `END`KWDreturn`END`PLN in`END`PUN.`END`PLNnext`END' +\n          '`PUN();`END' +\n      '`#9`PLN  `END`PUN}`END' +\n      '`#0`PLN&nbsp;`END' +\n      '`#1`PLN  `END`KWDpublic`END`PLN `END`KWDstatic`END`PLN `END`KWDvoid`END' +\n          '`PLN main`END`PUN(`END`TYPString`END`PUN[]`END`PLN args`END' +\n          '`PUN)`END`PLN `END`PUN{`END' +\n      '`#2`PLN    `END`TYPSystem`END`PUN.`END`PLNout`END`PUN.`END' +\n          '`PLNprint`END`PUN(`END`PLNnth`END`PUN(`END`LIT10`END`PUN,`END' +\n          '`PLN `END`KWDnew`END`PLN `END`TYPFibonacci`END`PUN()));`END' +\n          '' +\n      '`#3`PLN  `END`PUN}`END' +\n      '`#4`PUN}`END' +\n      '`#5`PLN&nbsp;`END' +\n      '`#6`PUN#`END`PLN not a java comment`END' +\n      '`#7`PUN#`END`PLN not keywords`END`PUN:`END' +\n          '`PLN static_cast and namespace`END</li></ol>'),\n  javascript: (\n      '`COM/**\\n' +\n      ' * nth element in the fibonacci series.\\n' +\n      ' * @param n &gt;= 0\\n' +\n      ' * @return the nth element, &gt;= 0.\\n' +\n      ' *\\/`END`PLN\\n' +\n      '`END`KWDfunction`END`PLN fib`END`PUN(`END`PLNn`END`PUN)`END`PLN `END' +\n          '`PUN{`END`PLN\\n' +\n      '  `END`KWDvar`END`PLN a `END`PUN=`END`PLN `END`LIT1`END`PUN,`END' +\n          '`PLN b `END`PUN=`END`PLN `END`LIT1`END`PUN;`END`PLN\\n' +\n      '  `END`KWDvar`END`PLN tmp`END`PUN;`END`PLN\\n' +\n      '  `END`KWDwhile`END`PLN `END`PUN(--`END`PLNn `END`PUN&gt;=`END' +\n          '`PLN `END`LIT0`END`PUN)`END`PLN `END`PUN{`END`PLN\\n' +\n      '    tmp `END`PUN=`END`PLN a`END`PUN;`END`PLN\\n' +\n      '    a `END`PUN+=`END`PLN b`END`PUN;`END`PLN\\n' +\n      '    b `END`PUN=`END`PLN tmp`END`PUN;`END`PLN\\n' +\n      '  `END`PUN}`END`PLN\\n' +\n      '  `END`KWDreturn`END`PLN a`END`PUN;`END`PLN\\n' +\n      '`END`PUN}`END`PLN\\n' +\n      '\\n' +\n      'document`END`PUN.`END`PLNwrite`END`PUN(`END`PLNfib`END`PUN(`END' +\n          '`LIT10`END`PUN));`END'),\n  perl: (\n      '`COM#!/usr/bin/perl`END`PLN\\n' +\n      '\\n' +\n      '`END`KWDuse`END`PLN strict`END`PUN;`END`PLN\\n' +\n      '`END`KWDuse`END`PLN integer`END`PUN;`END`PLN\\n' +\n      '\\n' +\n      '`END`COM# the nth element of the fibonacci series`END`PLN\\n' +\n      '`END`COM# param n - an int &gt;= 0`END`PLN\\n' +\n      '`END`COM# return an int &gt;= 0`END`PLN\\n' +\n      '`END`KWDsub`END`PLN fib`END`PUN(`END`PLN$`END`PUN)`END`PLN `END' +\n          '`PUN{`END`PLN\\n' +\n      '  `END`KWDmy`END`PLN $n `END`PUN=`END`PLN shift`END`PUN,`END`PLN ' +\n      '$a `END`PUN=`END`PLN `END`LIT1`END`PUN,`END`PLN $b `END' +\n          '`PUN=`END`PLN `END`LIT1`END`PUN;`END`PLN\\n' +\n      '  `END`PUN(`END`PLN$a`END`PUN,`END`PLN $b`END`PUN)`END' +\n          '`PLN `END`PUN=`END`PLN `END`PUN(`END`PLN$a `END`PUN+`END' +\n          '`PLN $b`END`PUN,`END`PLN $a`END`PUN)`END`PLN `END`KWDuntil`END' +\n          '`PLN `END`PUN(--`END`PLN$n `END`PUN&lt;`END`PLN `END`LIT0`END' +\n          '`PUN);`END`PLN\\n' +\n      '  `END`KWDreturn`END`PLN $a`END`PUN;`END`PLN\\n' +\n      '`END`PUN}`END`PLN\\n' +\n      '\\n' +\n      '`END`KWDprint`END`PLN fib`END`PUN(`END`LIT10`END`PUN);`END'),\n  python: (\n      '`COM#!/usr/bin/python2.4`END`PLN\\n' +\n      '\\n' +\n      '`END`KWDdef`END`PLN fib`END`PUN():`END`PLN\\n' +\n      '  `END`STR\\'\\'\\'\\n' +\n      '  a generator that produces the elements of the fibonacci series' +\n          '\\n' +\n      '  \\'\\'\\'`END`PLN\\n' +\n      '\\n' +\n      '  a `END`PUN=`END`PLN `END`LIT1`END`PLN\\n' +\n      '  b `END`PUN=`END`PLN `END`LIT1`END`PLN\\n' +\n      '  `END`KWDwhile`END`PLN `END`KWDTrue`END`PUN:`END`PLN\\n' +\n      '    a`END`PUN,`END`PLN b `END`PUN=`END`PLN a `END`PUN+`END' +\n          '`PLN b`END`PUN,`END`PLN a\\n' +\n      '    `END`KWDyield`END`PLN a\\n' +\n      '\\n' +\n      '`END`KWDdef`END`PLN nth`END`PUN(`END`PLNseries`END`PUN,`END`PLN n`END' +\n          '`PUN):`END`PLN\\n' +\n      '  `END`STR\\'\\'\\'\\n' +\n      '  returns the nth element of a series,\\n' +\n      '  consuming the earlier elements of the series\\n' +\n      '  \\'\\'\\'`END`PLN\\n' +\n      '\\n' +\n      '  `END`KWDfor`END`PLN x `END`KWDin`END`PLN series`END`PUN:`END' +\n          '`PLN\\n' +\n      '    n `END`PUN=`END`PLN n `END`PUN-`END`PLN `END`LIT1`END' +\n          '`PLN\\n' +\n      '    `END`KWDif`END`PLN n `END`PUN&lt;=`END`PLN `END' +\n          '`LIT0`END`PUN:`END`PLN `END`KWDreturn`END`PLN x\\n' +\n      '\\n' +\n      '`END`KWDprint`END`PLN nth`END`PUN(`END`PLNfib`END`PUN(),`END`PLN `END' +\n          '`LIT10`END`PUN)`END'),\n  python_lang: (\n      '`COM#!/usr/bin/python2.4`END`PLN\\n' +\n      '\\n' +\n      '`END`KWDdef`END`PLN fib`END`PUN():`END`PLN\\n' +\n      '  `END`STR\\'\\'\\'\\n' +\n      '  a generator that produces the fibonacci series\\'s elements' +\n          '\\n' +\n      '  \\'\\'\\'`END`PLN\\n' +\n      '\\n' +\n      '  a `END`PUN=`END`PLN `END`LIT1`END`PLN\\n' +\n      '  b `END`PUN=`END`PLN `END`LIT1`END`PLN\\n' +\n      '  `END`KWDwhile`END`PLN `END`KWDTrue`END`PUN:`END`PLN\\n' +\n      '    a`END`PUN,`END`PLN b `END`PUN=`END`PLN a `END`PUN+`END' +\n          '`PLN b`END`PUN,`END`PLN a\\n' +\n      '    `END`KWDyield`END`PLN a\\n' +\n      '\\n' +\n      '`END`KWDdef`END`PLN nth`END`PUN(`END`PLNseries`END`PUN,`END`PLN n`END' +\n          '`PUN):`END`PLN\\n' +\n      '  `END`STR\\'\\'\\'\\n' +\n      '  returns the nth element of a series,\\n' +\n      '  consuming the series\\' earlier elements.\\n' +\n      '  \\'\\'\\'`END`PLN\\n' +\n      '\\n' +\n      '  `END`KWDfor`END`PLN x `END`KWDin`END`PLN series`END`PUN:`END' +\n          '`PLN\\n' +\n      '    n `END`PUN-=`END`PLN `END`LIT1`END' +\n          '`PLN\\n' +\n      '    `END`KWDif`END`PLN n `END`PUN&lt;=`END`PLN `END' +\n          '`LIT0`END`PUN:`END`PLN `END`KWDreturn`END`PLN x\\n' +\n      '\\n' +\n      '`END`KWDprint`END`PLN nth`END`PUN(`END`PLNfib`END`PUN(),`END`PLN `END' +\n          '`LIT10`END`PUN)`END`PLN\\n' +\n      '\\n' +\n      '`END`PUN/*`END`PLN `END`KWDnot`END`PLN a comment `END`KWDand`END' +\n          '`PLN `END`KWDnot`END`PLN keywords`END`PUN:`END' +\n          '`PLN null char true `END`PUN*\\/`END'),\n  sql_lang: (\n      '`COM/* A multi-line\\n' +\n      ' * comment *\\/`END`PLN\\n' +\n      '`END`STR\\'Another string /* Isn\\\\\\'t a comment\\'`END`PUN,`END`PLN\\n' +\n      '`END`STR\"A string *\\/\"`END`PLN\\n' +\n      '`END`COM-- A line comment`END`PLN\\n' +\n      '`END`KWDSELECT`END`PLN `END`PUN*`END`PLN `END`KWDFROM`END' +\n          '`PLN users `END`KWDWHERE`END`PLN id `END`KWDIN`END`PLN `END' +\n          '`PUN(`END`LIT1`END`PUN,`END`PLN `END`LIT2.0`END`PUN,`END`PLN `END' +\n          '`LIT+30e-1`END`PUN);`END`PLN\\n' +\n      '`END`COM-- keywords are case-insensitive.`END`PLN\\n' +\n      '`END`COM-- Note: user-table is a single identifier, not a pair of' +\n          ' keywords`END`PLN\\n' +\n      '`END`KWDselect`END`PLN `END`PUN*`END`PLN `END`KWDfrom`END' +\n          '`PLN user-table `END`KWDwhere`END`PLN id `END`KWDin`END`PLN `END' +\n          '`PUN(`END`PLNx`END`PUN,`END`PLN y`END`PUN,`END`PLN z`END`PUN);`END'\n      ),\n  xml: (\n      '`DEC&lt;!DOCTYPE series PUBLIC \"fibonacci numbers\"&gt;`END`PLN\\n' +\n      '\\n' +\n      '`END`TAG&lt;series.root`END`PLN `END`ATNbase`END`PUN=`END' +\n          '`ATV\"1\"`END`PLN `END' +\n          '`ATNstep`END`PUN=`END`ATV\"s(n-2) + s(n-1)\"`END`TAG&gt;`END' +\n          '`PLN\\n' +\n      '  `END`TAG&lt;element`END`PLN `END`ATNi`END`PUN=`END' +\n          '`ATV\"0\"`END' +\n          '`TAG&gt;`END`PLN1`END`TAG&lt;/element&gt;`END' +\n          '`PLN\\n' +\n      '  `END`TAG&lt;element`END`PLN `END`ATNi`END`PUN=`END' +\n          '`ATV\"1\"`END' +\n          '`TAG&gt;`END`PLN1`END`TAG&lt;/element&gt;`END' +\n          '`PLN\\n' +\n      '  `END`TAG&lt;element`END`PLN `END`ATNi`END`PUN=`END' +\n          '`ATV\"2\"`END' +\n          '`TAG&gt;`END`PLN2`END`TAG&lt;/element&gt;`END' +\n          '`PLN\\n' +\n      '  `END`TAG&lt;element`END`PLN `END`ATNi`END`PUN=`END' +\n          '`ATV\"3\"`END' +\n          '`TAG&gt;`END`PLN3`END`TAG&lt;/element&gt;`END' +\n          '`PLN\\n' +\n      '  `END`TAG&lt;element`END`PLN `END`ATNi`END`PUN=`END' +\n          '`ATV\"4\"`END' +\n          '`TAG&gt;`END`PLN5`END`TAG&lt;/element&gt;`END' +\n          '`PLN\\n' +\n      '  `END`TAG&lt;element`END`PLN `END`ATNi`END`PUN=`END' +\n          '`ATV\"5\"`END' +\n          '`TAG&gt;`END`PLN8`END`TAG&lt;/element&gt;`END' +\n          '`PLN\\n' +\n      '  ...\\n' +\n      '`END`TAG&lt;/series.root&gt;`END'),\n  html: (\n      '`TAG&lt;html&gt;`END`PLN\\n' +\n      '  `END`TAG&lt;head&gt;`END`PLN\\n' +\n      '    `END`TAG&lt;title&gt;`END`PLNFibonacci number`END' +\n          '`TAG&lt;/title&gt;`END`PLN\\n' +\n      '    `END`TAG&lt;style&gt;`END`COM&lt;!--`END' +\n          '`PLN BODY `END`PUN{`END`PLN `END`KWDtext-decoration`END`PUN:`END' +\n          '`PLN blink `END`PUN}`END`PLN `END`COM--&gt;`END`TAG&lt;/' +\n          'style&gt;`END`PLN\\n' +\n      '    `END`TAG&lt;script`END`PLN `END`ATNsrc`END`PUN=`END' +\n          '`ATV\"foo.js\"`END`TAG&gt;&lt;/script&gt;`END`PLN\\n' +\n      '    `END`TAG&lt;script`END`PLN `END`ATNsrc`END`PUN=`END' +\n          '`ATV\"bar.js\"`END`TAG&gt;&lt;/script&gt;`END`PLN\\n' +\n      '  `END`TAG&lt;/head&gt;`END`PLN\\n' +\n      '  `END`TAG&lt;body&gt;`END`PLN\\n' +\n      '    `END`TAG&lt;noscript&gt;`END`PLN\\n' +\n      '      `END`TAG&lt;dl&gt;`END`PLN\\n' +\n      '        `END`TAG&lt;dt&gt;`END' +\n          '`PLNFibonacci numbers`END`TAG&lt;/dt&gt;`END' +\n          '`PLN\\n' +\n      '        `END`TAG&lt;dd&gt;`END`PLN1`END' +\n          '`TAG&lt;/dd&gt;`END`PLN\\n' +\n      '        `END`TAG&lt;dd&gt;`END`PLN1`END' +\n          '`TAG&lt;/dd&gt;`END`PLN\\n' +\n      '        `END`TAG&lt;dd&gt;`END`PLN2`END' +\n          '`TAG&lt;/dd&gt;`END`PLN\\n' +\n      '        `END`TAG&lt;dd&gt;`END`PLN3`END' +\n          '`TAG&lt;/dd&gt;`END`PLN\\n' +\n      '        `END`TAG&lt;dd&gt;`END`PLN5`END' +\n          '`TAG&lt;/dd&gt;`END`PLN\\n' +\n      '        `END`TAG&lt;dd&gt;`END`PLN8`END' +\n          '`TAG&lt;/dd&gt;`END`PLN\\n' +\n      '        &amp;hellip;\\n' +\n      '      `END`TAG&lt;/dl&gt;`END`PLN\\n' +\n      '    `END`TAG&lt;/noscript&gt;`END`PLN\\n' +\n      '\\n' +\n      '    `END`TAG&lt;script`END`PLN `END`ATNtype`END`PUN=`END' +\n          '`ATV\"text/javascript\"`END`TAG&gt;`END`PUN&lt;!--`END`PLN\\n' +\n      '`END`KWDfunction`END`PLN fib`END`PUN(`END`PLNn`END`PUN)`END`PLN `END' +\n          '`PUN{`END`PLN\\n' +\n      '  `END`KWDvar`END`PLN a `END`PUN=`END`PLN `END`LIT1`END`PUN,`END' +\n          '`PLN b `END`PUN=`END`PLN `END`LIT1`END`PUN;`END`PLN\\n' +\n      '  `END`KWDvar`END`PLN tmp`END`PUN;`END`PLN\\n' +\n      '  `END`KWDwhile`END`PLN `END`PUN(--`END`PLNn `END`PUN&gt;=`END' +\n          '`PLN `END`LIT0`END`PUN)`END`PLN `END`PUN{`END`PLN\\n' +\n      '    tmp `END`PUN=`END`PLN a`END`PUN;`END`PLN\\n' +\n      '    a `END`PUN+=`END`PLN b`END`PUN;`END`PLN\\n' +\n      '    b `END`PUN=`END`PLN tmp`END`PUN;`END`PLN\\n' +\n      '  `END`PUN}`END`PLN\\n' +\n      '  `END`KWDreturn`END`PLN a`END`PUN;`END`PLN\\n' +\n      '`END`PUN}`END`PLN\\n' +\n      '\\n' +\n      'document`END`PUN.`END`PLNwriteln`END`PUN(`END`PLNfib`END`PUN(`END' +\n          '`LIT10`END`PUN));`END`PLN\\n' +\n      '`END`COM// --&gt;`END`PLN\\n' +\n      '    `END`TAG&lt;/script&gt;`END`PLN\\n' +\n      '  `END`TAG&lt;/body&gt;`END`PLN\\n' +\n      '`END`TAG&lt;/html&gt;`END'),\n  html_lang: (\n      '`PLNFibonacci Numbers\\n' +\n      '\\n' +\n      '`END`TAG&lt;noscript&gt;`END`PLN\\n' +\n      '  `END`TAG&lt;dl`END`PLN `END`ATNstyle`END`PUN=`END' +\n          '`ATV\"`END`KWDlist-style`END`PUN:`END`PLN disc`END`ATV\"`END' +\n          '`TAG&gt;`END`PLN\\n' +\n      '    `END`TAG&lt;dt&gt;`END' +\n          '`PLNFibonacci numbers`END`TAG&lt;/dt&gt;`END`PLN\\n' +\n      '    `END`TAG&lt;dd&gt;`END`PLN1`END`TAG&lt;/dd&gt;`END' +\n          '`PLN\\n' +\n      '    `END`TAG&lt;dd&gt;`END`PLN1`END`TAG&lt;/dd&gt;`END' +\n          '`PLN\\n' +\n      '    `END`TAG&lt;dd&gt;`END`PLN2`END`TAG&lt;/dd&gt;`END' +\n          '`PLN\\n' +\n      '    `END`TAG&lt;dd&gt;`END`PLN3`END`TAG&lt;/dd&gt;`END' +\n          '`PLN\\n' +\n      '    `END`TAG&lt;dd&gt;`END`PLN5`END`TAG&lt;/dd&gt;`END' +\n          '`PLN\\n' +\n      '    `END`TAG&lt;dd&gt;`END`PLN8`END`TAG&lt;/dd&gt;`END' +\n          '`PLN\\n' +\n      '    &amp;hellip;\\n' +\n      '  `END`TAG&lt;/dl&gt;`END`PLN\\n' +\n      '`END`TAG&lt;/noscript&gt;`END`PLN\\n' +\n      '\\n' +\n      '`END`TAG&lt;script`END`PLN `END`ATNtype`END`PUN=`END' +\n          '`ATV\"text/javascript\"`END`TAG&gt;`END`PUN&lt;!--`END`PLN\\n' +\n      '`END`KWDfunction`END`PLN fib`END`PUN(`END`PLNn`END`PUN)`END`PLN `END' +\n          '`PUN{`END`PLN\\n' +\n      '  `END`KWDvar`END`PLN a `END`PUN=`END`PLN `END`LIT1`END`PUN,`END' +\n          '`PLN b `END`PUN=`END`PLN `END`LIT1`END`PUN;`END`PLN\\n' +\n      '  `END`KWDvar`END`PLN tmp`END`PUN;`END`PLN\\n' +\n      '  `END`KWDwhile`END`PLN `END`PUN(--`END`PLNn `END`PUN&gt;=`END' +\n          '`PLN `END`LIT0`END`PUN)`END`PLN `END`PUN{`END`PLN\\n' +\n      '    tmp `END`PUN=`END`PLN a`END`PUN;`END`PLN\\n' +\n      '    a `END`PUN+=`END`PLN b`END`PUN;`END`PLN\\n' +\n      '    b `END`PUN=`END`PLN tmp`END`PUN;`END`PLN\\n' +\n      '  `END`PUN}`END`PLN\\n' +\n      '  `END`KWDreturn`END`PLN a`END`PUN;`END`PLN\\n' +\n      '`END`PUN}`END`PLN\\n' +\n      '\\n' +\n      'document`END`PUN.`END`PLNwriteln`END`PUN(`END`PLNfib`END`PUN(`END' +\n          '`LIT10`END`PUN));`END`PLN\\n' +\n      '`END`COM// --&gt;`END`PLN\\n' +\n      '`END`TAG&lt;/script&gt;`END'),\n  htmlXmp: (\n      '`TAG&lt;html&gt;`END`PLN\\n' +\n      '  `END`TAG&lt;head&gt;`END`PLN\\n' +\n      '    `END`TAG&lt;title&gt;`END`PLNFibonacci number`END' +\n          '`TAG&lt;/title&gt;`END`PLN\\n' +\n      '  `END`TAG&lt;/head&gt;`END`PLN\\n' +\n      '  `END`TAG&lt;body&gt;`END`PLN\\n' +\n      '    `END`TAG&lt;noscript&gt;`END`PLN\\n' +\n      '      `END`TAG&lt;dl&gt;`END`PLN\\n' +\n      '        `END`TAG&lt;dt&gt;`END' +\n          '`PLNFibonacci numbers`END`TAG&lt;/dt&gt;`END`PLN\\n' +\n      '        `END`TAG&lt;dd&gt;`END`PLN1`END' +\n          '`TAG&lt;/dd&gt;`END`PLN\\n' +\n      '        `END`TAG&lt;dd&gt;`END`PLN1`END' +\n          '`TAG&lt;/dd&gt;`END`PLN\\n' +\n      '        `END`TAG&lt;dd&gt;`END`PLN2`END' +\n          '`TAG&lt;/dd&gt;`END`PLN\\n' +\n      '        `END`TAG&lt;dd&gt;`END`PLN3`END' +\n          '`TAG&lt;/dd&gt;`END`PLN\\n' +\n      '        `END`TAG&lt;dd&gt;`END`PLN5`END' +\n          '`TAG&lt;/dd&gt;`END`PLN\\n' +\n      '        `END`TAG&lt;dd&gt;`END`PLN8`END' +\n          '`TAG&lt;/dd&gt;`END`PLN\\n' +\n      '        &amp;hellip;\\n' +\n      '      `END`TAG&lt;/dl&gt;`END`PLN\\n' +\n      '    `END`TAG&lt;/noscript&gt;`END`PLN\\n' +\n      '\\n' +\n      '    `END`TAG&lt;script`END`PLN `END`ATNtype`END`PUN=`END' +\n          '`ATV\"text/javascript\"`END`TAG&gt;`END`PUN&lt;!--`END`PLN\\n' +\n      '`END`KWDfunction`END`PLN fib`END`PUN(`END`PLNn`END`PUN)`END`PLN `END' +\n          '`PUN{`END`PLN\\n' +\n      '  `END`KWDvar`END`PLN a `END`PUN=`END`PLN `END`LIT1`END`PUN,`END' +\n          '`PLN b `END`PUN=`END`PLN `END`LIT1`END`PUN;`END`PLN\\n' +\n      '  `END`KWDvar`END`PLN tmp`END`PUN;`END`PLN\\n' +\n      '  `END`KWDwhile`END`PLN `END`PUN(--`END`PLNn `END`PUN&gt;=`END' +\n          '`PLN `END`LIT0`END`PUN)`END`PLN `END`PUN{`END`PLN\\n' +\n      '    tmp `END`PUN=`END`PLN a`END`PUN;`END`PLN\\n' +\n      '    a `END`PUN+=`END`PLN b`END`PUN;`END`PLN\\n' +\n      '    b `END`PUN=`END`PLN tmp`END`PUN;`END`PLN\\n' +\n      '  `END`PUN}`END`PLN\\n' +\n      '  `END`KWDreturn`END`PLN a`END`PUN;`END`PLN\\n' +\n      '`END`PUN}`END`PLN\\n' +\n      '\\n' +\n      'document`END`PUN.`END`PLNwriteln`END`PUN(`END`PLNfib`END`PUN(`END' +\n          '`LIT10`END`PUN));`END`PLN\\n' +\n      '`END`COM// --&gt;`END`PLN\\n' +\n      '    `END`TAG&lt;/script&gt;`END`PLN\\n' +\n      '  `END`TAG&lt;/body&gt;`END`PLN\\n' +\n      '`END`TAG&lt;/html&gt;`END'),\n  xhtml: (\n      '`TAG&lt;xhtml&gt;`END`PLN\\n' +\n      '  `END`TAG&lt;head&gt;`END`PLN\\n' +\n      '    `END`TAG&lt;title&gt;`END' +\n          '`PLNFibonacci number`END`TAG&lt;/title&gt;`END' +\n          '`PLN\\n' +\n      '  `END`TAG&lt;/head&gt;`END`PLN\\n' +\n      '  `END`TAG&lt;body`END`PLN `END`ATNonload`END`PUN=`END' +\n          '`ATV\"`END`PLNalert`END`PUN(`END`PLNfib`END`PUN(`END`LIT10`END' +\n          '`PUN))`END`ATV\"`END`TAG&gt;`END`PLN\\n' +\n      '    `END`TAG&lt;script`END`PLN `END`ATNtype`END' +\n          '`PUN=`END`ATV\"text/javascript\"`END`TAG&gt;`END' +\n          '`PUN&lt;![`END`PLNCDATA`END`PUN[`END`PLN\\n' +\n      '`END`KWDfunction`END`PLN fib`END`PUN(`END`PLNn`END`PUN)`END`PLN `END' +\n          '`PUN{`END`PLN\\n' +\n      '  `END`KWDvar`END`PLN a `END`PUN=`END`PLN `END`LIT1`END`PUN,`END' +\n          '`PLN b `END`PUN=`END`PLN `END`LIT1`END`PUN;`END`PLN\\n' +\n      '  `END`KWDvar`END`PLN tmp`END`PUN;`END`PLN\\n' +\n      '  `END`KWDwhile`END`PLN `END`PUN(--`END`PLNn `END`PUN&gt;=`END' +\n          '`PLN `END`LIT0`END`PUN)`END`PLN `END`PUN{`END`PLN\\n' +\n      '    tmp `END`PUN=`END`PLN a`END`PUN;`END`PLN\\n' +\n      '    a `END`PUN+=`END`PLN b`END`PUN;`END`PLN\\n' +\n      '    b `END`PUN=`END`PLN tmp`END`PUN;`END`PLN\\n' +\n      '  `END`PUN}`END`PLN\\n' +\n      '  `END`KWDreturn`END`PLN a`END`PUN;`END`PLN\\n' +\n      '`END`PUN}`END`PLN\\n' +\n      '`END`PUN]]&gt;`END`PLN\\n' +\n      '    `END`TAG&lt;/script&gt;`END`PLN\\n' +\n      '  `END`TAG&lt;/body&gt;`END`PLN\\n' +\n      '`END`TAG&lt;/xhtml&gt;`END'),\n  PHP: (\n      '`TAG&lt;html&gt;`END`PLN\\n' +\n      '  `END`TAG&lt;head&gt;`END`PLN\\n' +\n      '    `END`TAG&lt;title&gt;`END`PUN&lt;?=`END' +\n          '`PLN `END' +\n          '`STR\\'Fibonacci numbers\\'`END`PLN `END' +\n          '`PUN?&gt;`END`TAG&lt;/title&gt;`END`PLN\\n' +\n      '\\n' +\n      '    `END`PUN&lt;?`END`PLNphp\\n' +\n      '      `END`COM// PHP has a plethora of comment types' +\n          '`END`PLN\\n' +\n      '      `END`COM\\/* What is a\\n' +\n      '         \"plethora\"? *\\/`END`PLN\\n' +\n      '      `END`KWDfunction`END`PLN fib`END`PUN(`END' +\n          '`PLN$n`END`PUN)`END`PLN `END`PUN{`END`PLN\\n' +\n      '        `END`COM# I don\\'t know.`END`PLN\\n' +\n      '        $a `END`PUN=`END`PLN `END`LIT1`END' +\n          '`PUN;`END`PLN\\n' +\n      '        $b `END`PUN=`END`PLN `END`LIT1`END' +\n          '`PUN;`END`PLN\\n' +\n      '        `END`KWDwhile`END`PLN `END`PUN(--`END' +\n          '`PLN$n `END`PUN&gt;=`END`PLN `END`LIT0`END`PUN)`END`PLN `END' +\n          '`PUN{`END`PLN\\n' +\n      '          echo `END`STR\"$a\\\\n\"`END`PUN;`END' +\n          '`PLN\\n' +\n      '          $tmp `END`PUN=`END`PLN $a`END' +\n          '`PUN;`END`PLN\\n' +\n      '          $a `END`PUN+=`END`PLN $b`END' +\n          '`PUN;`END`PLN\\n' +\n      '          $b `END`PUN=`END`PLN $tmp`END' +\n          '`PUN;`END`PLN\\n' +\n      '        `END`PUN}`END`PLN\\n' +\n      '      `END`PUN}`END`PLN\\n' +\n      '    `END`PUN?&gt;`END`PLN\\n' +\n      '  `END`TAG&lt;/head&gt;`END`PLN\\n' +\n      '  `END`TAG&lt;body&gt;`END`PLN\\n' +\n      '    `END`PUN&lt;?=`END`PLN fib`END' +\n          '`PUN(`END`LIT10`END`PUN)`END`PLN `END`PUN?&gt;`END`PLN\\n' +\n      '  `END`TAG&lt;/body&gt;`END`PLN\\n' +\n      '`END`TAG&lt;/html&gt;`END'),\n  xsl: (\n      '`COM&lt;!-- Test elements and attributes with namespaces --&gt;' +\n          '`END`PLN\\n' +\n      '\\n' +\n      '`END`TAG&lt;xsl:stylesheet`END`PLN `END`ATNxml:lang`END' +\n          '`PUN=`END`ATV\"en\"`END`TAG&gt;`END`PLN\\n' +\n      '  `END`TAG&lt;xsl:template`END' +\n          '`PLN `END`ATNmatch`END`PUN=`END`ATV\".\"`END' +\n          '`TAG&gt;`END`PLN\\n' +\n      '    `END`TAG&lt;xsl:text&gt;`END' +\n          '`PLNHello World`END' +\n          '`TAG&lt;/xsl:text&gt;`END`PLN\\n' +\n      '  `END`TAG&lt;/xsl:template&gt;`END`PLN\\n' +\n      '`END`TAG&lt;/xsl:stylesheet&gt;`END'\n      ),\n  whitespace: '',\n  misc1: '`COM// ends with line comment token`END`PLN\\n' +\n      '`END`COM//`END',\n  issue4: (\n      '`TAG&lt;script`END`PLN `END' +\n          '`ATNtype`END`PUN=`END`ATV\"text/javascript\"`END' +\n          '`TAG&gt;`END`PLN\\n' +\n      '   var savedTarget=null' +\n          ';               ' +\n          '            // The target ' +\n          'layer (effectively vidPane)\\n' +\n      '   var orgCursor=null' +\n          ';               ' +\n          '              // The ' +\n          'original mouse style so we can restore it\\n' +\n      '   var dragOK=false' +\n          ';               ' +\n          '                ' +\n          '// True if we\\'re allowed to move the element under mouse' +\n          '\\n' +\n      '   var dragXoffset=0' +\n          ';               ' +\n          '               ' +\n          '// How much we\\'ve moved the element on the horozontal' +\n          '\\n' +\n      '   var dragYoffset=0' +\n          ';               ' +\n          '               ' +\n          '// How much we\\'ve moved the element on the verticle' +\n          '\\n' +\n      '   vidPaneID = document.' +\n          'getElementById(\\'vidPane\\');' +\n          ' // Our movable layer\\n' +\n      '   vidPaneID.style.top' +\n          '=\\'75px\\';       ' +\n          '              // ' +\n          'Starting location horozontal\\n' +\n      '   vidPaneID.style.left' +\n          '=\\'75px\\';       ' +\n          '             // ' +\n          'Starting location verticle\\n' +\n      '`END`TAG&lt;script&gt;`END'),\n  issue8:\n      (\n      '<b>`PLNone`END</b>`PLN\\t`END<b>`TYPTwo`END</b>`PLN' +\n          '\\t`END<b>`PLNthree`END</b>`PLN\\t`END`TYPFour' +\n          '`END`PLN\\t`END<b>`PLNfive`END</b>`PLN\\t' +\n          '`END`PUN|`END`PLN\\n' +\n      '`END`TYPSix`END`PLN\\t`END<b>`PLNseven`END</b>`PLN\\t' +\n          '`END`TYPEight`END`PLN\\tnine\\t`END`TYPTen`END' +\n          '`PLN\\t`END`PUN|`END`PLN\\n' +\n      '`END<b>`PLNeleven`END</b>`PLN\\t`END`TYPTwelve`END`PLN\\t`END' +\n          '<b>`PLNthirteen`END</b>`PLN\\t`END' +\n          '`TYPFourteen`END`PLN\\tfifteen\\t`END`' +\n          'PUN|`END'),\n  issue12: (\n      '`STR/foo/`END`PUN;`END`PLN  `END`COM// a slash starting a line ' +\n          'treated as a regexp beginning`END`PLN\\n' +\n      '`END`STR\"foo\"`END`PUN.`END`PLNmatch`END`PUN(`END`STR/fo+$/`END' +\n          '`PUN);`END`PLN\\n' +\n      '`END`COM// this line comment not treated as a regular expressions`END' +\n          '`PLN\\n' +\n      '`END`STR\"foo /bar/\"`END`PUN.`END`PLNtest`END`PUN(`END`STR/\"baz\"/`END' +\n          '`PUN);`END`PLN  `END`COM// test string and regexp boundaries' +\n          '`END`PLN\\n' +\n      '`END`KWDvar`END`PLN division `END`PUN=`END`PLN `END' +\n          '`STR/\\\\b\\\\d+\\\\/\\\\d+/`END`PLNg`END`PUN;`END`PLN  `END' +\n          '`COM// test char sets and escaping of specials`END`PLN\\n' +\n      '`END`KWDvar`END`PLN allSpecials `END`PUN=`END`PLN `END' +\n          '`STR/([^\\\\(\\\\)\\\\[\\\\]\\\\{\\\\}\\\\-\\\\?\\\\+\\\\*\\\\.\\\\^\\\\$\\\\/]+)\\\\\\\\/`END' +\n          '`PUN;`END`PLN\\n' +\n      '`END`KWDvar`END`PLN slashInCharset `END`PUN=`END`PLN `END' +\n          '`STR/[^/]/`END`PLNg`END`PUN,`END`PLN notCloseSq `END`PUN=`END' +\n          '`PLN `END`STR/[^\\\\]]/`END`PUN;`END`PLN\\n' +\n      '\\n' +\n      '`END`COM// test that slash used in numeric context treated as an ' +\n          'operator`END`PLN\\n' +\n      '`END`LIT1`END`PLN `END`PUN/`END`PLN `END`LIT2`END`PUN;`END`PLN\\n' +\n      '`END`LIT1.`END`PLN `END`PUN/`END`PLN x`END`PUN;`END`PLN\\n' +\n      'x `END`PUN/`END`PLN y`END`PUN;`END`PLN\\n' +\n      '`END`PUN(`END`PLNx`END`PUN)`END`PLN `END`PUN/`END`PLN y`END`PUN;`END' +\n          '`PLN\\n' +\n      '`END`LIT1`END`PLN `END`COM/* foo *\\/`END`PLN `END`PUN/`END`PLN `END' +\n          '`LIT2`END`PUN;`END`PLN\\n' +\n      '`END`LIT1`END`PLN `END`COM/* foo *\\/`END`PUN/`END`PLN `END`LIT2`END' +\n          '`PUN;`END`PLN\\n' +\n      '`END`LIT1`END`PUN/`END`LIT2`END`PUN;`END`PLN\\n' +\n      '`END`LIT1.`END`PUN/`END`PLNx`END`PUN;`END`PLN\\n' +\n      'x`END`PUN/`END`PLNy`END`PUN;`END`PLN\\n' +\n      '`END`PUN(`END`PLNx`END`PUN)/`END`PLNy`END`PUN;`END`PLN\\n' +\n      '\\n' +\n      '`END`COM// test split over two lines.  line comment should not ' +\n          'fool it`END`PLN\\n' +\n      '`END`LIT1`END`COM//`END`PLN\\n' +\n      '`END`PUN/`END`LIT2`END`PUN;`END`PLN\\n' +\n      '\\n' +\n      'x`END`PUN++/`END`PLNy`END`PUN;`END`PLN\\n' +\n      'x`END`PUN--/`END`PLNy`END`PUN;`END`PLN\\n' +\n      'x`END`PUN[`END`PLNy`END`PUN]`END`PLN `END`PUN/`END`PLN z`END`PUN;`END' +\n          '`PLN\\n' +\n      'f`END`PUN()`END`PLN `END`PUN/`END`PLN n`END`PUN;`END`PLN\\n' +\n      '\\n' +\n      '`END`COM// test that slash after non postfix operator is start of ' +\n          'regexp`END`PLN\\n' +\n      'log`END`PUN(`END`STR\\'matches = \\'`END`PLN `END`PUN+`END`PLN `END' +\n          '`STR/foo/`END`PUN.`END`PLNtest`END`PUN(`END`PLNfoo`END`PUN));`END' +\n          '`PLN\\n' +\n      '\\n' +\n      '`END`COM// test keyword preceders`END`PLN\\n' +\n      '`END`KWDreturn`END`PLN `END`STR/a regexp/`END`PUN;`END`PLN\\n' +\n      'division `END`PUN=`END`PLN notreturn `END`PUN/`END`PLN not_a_regexp ' +\n          '`END`PUN/`END`PLN `END`LIT2`END`PUN;`END`PLN  `END`COM// ' +\n          'keyword suffix does not match`END`PLN\\n' +\n      '\\n' +\n      '`END`COM// &amp; not used as prefix operator in javascript but this ' +\n          'should still work`END`PLN\\n' +\n      '`END`PUN&amp;`END`STR/foo/`END`PUN;`END`PLN\\n' +\n      '\\n' +\n      '`END`KWDextends`END`PLN `END`PUN=`END`PLN `END`STR/extends/`END' +\n          '`PUN;`END'),\n  issue12_lang: (\n      '`STR/foo/`END`PUN;`END`PLN  `END`COM// a slash starting a line ' +\n          'treated as a regexp beginning`END`PLN\\n' +\n      '`END`STR\"foo\"`END`PUN.`END`PLNmatch`END`PUN(`END`STR/fo+$/`END' +\n          '`PUN);`END`PLN\\n' +\n      '`END`COM// this line comment not treated as a regular expressions`END' +\n          '`PLN\\n' +\n      '`END`STR\"foo /bar/\"`END`PUN.`END`PLNtest`END`PUN(`END`STR/\"baz\"/`END' +\n          '`PUN);`END`PLN  `END`COM// test string and regexp boundaries' +\n          '`END`PLN\\n' +\n      '`END`KWDvar`END`PLN division `END`PUN=`END`PLN `END' +\n          '`STR/\\\\b\\\\d+\\\\/\\\\d+/`END`PLNg`END`PUN;`END`PLN  `END' +\n          '`COM// test char sets and escaping of specials`END`PLN\\n' +\n      '`END`KWDvar`END`PLN allSpecials `END`PUN=`END`PLN `END' +\n          '`STR/([^\\\\(\\\\)\\\\[\\\\]\\\\{\\\\}\\\\-\\\\?\\\\+\\\\*\\\\.\\\\^\\\\$\\\\/]+)\\\\\\\\/`END' +\n          '`PUN;`END`PLN\\n' +\n      '`END`KWDvar`END`PLN slashInCharset `END`PUN=`END`PLN `END' +\n          '`STR/[^/]/`END`PLNg`END`PUN,`END`PLN notCloseSq `END`PUN=`END' +\n          '`PLN `END`STR/[^\\\\]]/`END`PUN;`END`PLN\\n' +\n      '\\n' +\n      '`END`COM// test that slash used in numeric context treated as an ' +\n          'operator`END`PLN\\n' +\n      '`END`LIT1`END`PLN `END`PUN/`END`PLN `END`LIT2`END`PUN;`END`PLN\\n' +\n      '`END`LIT1.`END`PLN `END`PUN/`END`PLN x`END`PUN;`END`PLN\\n' +\n      'x `END`PUN/`END`PLN y`END`PUN;`END`PLN\\n' +\n      '`END`PUN(`END`PLNx`END`PUN)`END`PLN `END`PUN/`END`PLN y`END`PUN;`END' +\n          '`PLN\\n' +\n      '`END`LIT1`END`PLN `END`COM/* foo *\\/`END`PLN `END`PUN/`END`PLN `END' +\n          '`LIT2`END`PUN;`END`PLN\\n' +\n      '`END`LIT1`END`PLN `END`COM/* foo *\\/`END`PUN/`END`PLN `END`LIT2`END' +\n          '`PUN;`END`PLN\\n' +\n      '`END`LIT1`END`PUN/`END`LIT2`END`PUN;`END`PLN\\n' +\n      '`END`LIT1.`END`PUN/`END`PLNx`END`PUN;`END`PLN\\n' +\n      'x`END`PUN/`END`PLNy`END`PUN;`END`PLN\\n' +\n      '`END`PUN(`END`PLNx`END`PUN)/`END`PLNy`END`PUN;`END`PLN\\n' +\n      '\\n' +\n      '`END`COM// test split over two lines.  line comment should not ' +\n          'fool it`END`PLN\\n' +\n      '`END`LIT1`END`COM//`END`PLN\\n' +\n      '`END`PUN/`END`LIT2`END`PUN;`END`PLN\\n' +\n      '\\n' +\n      'x`END`PUN++/`END`PLNy`END`PUN;`END`PLN\\n' +\n      'x`END`PUN--/`END`PLNy`END`PUN;`END`PLN\\n' +\n      'x`END`PUN[`END`PLNy`END`PUN]`END`PLN `END`PUN/`END`PLN z`END`PUN;`END' +\n          '`PLN\\n' +\n      'f`END`PUN()`END`PLN `END`PUN/`END`PLN n`END`PUN;`END`PLN\\n' +\n      '\\n' +\n      '`END`COM// test that slash after non postfix operator is start of ' +\n          'regexp`END`PLN\\n' +\n      'log`END`PUN(`END`STR\\'matches = \\'`END`PLN `END`PUN+`END`PLN `END' +\n          '`STR/foo/`END`PUN.`END`PLNtest`END`PUN(`END`PLNfoo`END`PUN));`END' +\n          '`PLN\\n' +\n      '\\n' +\n      '`END`COM// test keyword preceders`END`PLN\\n' +\n      '`END`KWDreturn`END`PLN `END`STR/a regexp/`END`PUN;`END`PLN\\n' +\n      'division `END`PUN=`END`PLN notreturn `END`PUN/`END`PLN not_a_regexp ' +\n          '`END`PUN/`END`PLN `END`LIT2`END`PUN;`END`PLN  `END`COM// ' +\n          'keyword suffix does not match`END`PLN\\n' +\n      '\\n' +\n      '`END`COM// &amp; not used as prefix operator in javascript but this ' +\n          'should still work`END`PLN\\n' +\n      '`END`PUN&amp;`END`STR/foo/`END`PUN;`END`PLN\\n' +\n      '\\n' +\n      'extends `END`PUN=`END`PLN `END`STR/extends/`END`PUN;`END'),\n  coffee: (\n      '`KWDclass`END`PLN `END`TYPAnimal`END`PLN\\n' +\n      '  constructor`END`PUN:`END`PLN `END`PUN(`END`LIT@name`END`PUN)`END`PLN `END`PUN-&gt;`END`PLN\\n' +\n      '  move`END`PUN:`END`PLN `END`PUN(`END`PLNmeters`END`PUN,`END`PLN loc`END`PUN)`END`PLN `END`PUN-&gt;`END`PLN\\n' +\n      '    alert `END`LIT@name`END`PLN `END`PUN+`END`PLN `END`STR\" moved \"`END`PLN `END`PUN+`END`PLN meters `END`PUN+`END`PLN `END`STR\"m.\"`END`PLN\\n' +\n      '  travel`END`PUN:`END`PLN `END`PUN(`END`PLNpath`END`PUN...)`END`PLN `END`PUN-&gt;`END`PLN\\n' +\n      '    `END`KWDfor`END`PLN place `END`KWDin`END`PLN path\\n' +\n      '      `END`LIT@move`END`PLN place`END`PUN.`END`PLNdistance`END`PUN,`END`PLN place`END`PUN.`END`PLNlocation\\n' +\n      '\\n' +\n      '`END`KWDclass`END`PLN `END`TYPHorse`END`PLN `END`KWDextends`END`PLN `END`TYPAnimal`END`PLN\\n' +\n      '  `END`COM###\\n' +\n      '  @param name Horse name\\n' +\n      '  @param jumper Jumping ability\\n' +\n      '  ###`END`PLN\\n' +\n      '  constructor`END`PUN:`END`PLN `END`PUN(`END`PLNname`END`PUN,`END`PLN jumper`END`PUN)`END`PLN `END`PUN-&gt;`END`PLN\\n' +\n      '    `END`KWDsuper`END`PLN name\\n' +\n      '    `END`LIT@capable`END`PLN `END`PUN=`END`PLN jumper\\n' +\n      '  step`END`PUN:`END`PLN `END`PUN-&gt;`END`PLN\\n' +\n      '    alert `END`STR\\'\\'\\'\\n' +\n      '          Step,\\n' +\n      '          step...\\n' +\n      '          \\'\\'\\'`END`PLN\\n' +\n      '  jump`END`PUN:`END`PLN `END`PUN-&gt;`END`PLN\\n' +\n      '    `END`LIT@capable`END`PLN\\n' +\n      '  move`END`PUN:`END`PLN `END`PUN(`END`PLNmeters`END`PUN,`END`PLN where`END`PUN)`END`PLN `END`PUN-&gt;`END`PLN\\n' +\n      '    switch where\\n' +\n      '      `END`KWDwhen`END`PLN `END`STR\"ground\"`END`PLN\\n' +\n      '        `END`LIT@step`END`PUN()`END`PLN\\n' +\n      '        `END`KWDsuper`END`PLN meters\\n' +\n      '      `END`KWDwhen`END`PLN `END`STR\"hurdle\"`END`PLN\\n' +\n      '        `END`KWDsuper`END`PLN meters `END`KWDif`END`PLN `END`LIT@jump`END`PUN()`END`PLN\\n' +\n      '\\n' +\n      '`END`COM# Create horse`END`PLN\\n' +\n      'tom `END`PUN=`END`PLN `END`KWDnew`END`PLN `END`TYPHorse`END`PLN `END`STR\"Tommy\"`END`PUN,`END`PLN `END`KWDyes`END`PLN\\n' +\n      '\\n' +\n      'street `END`PUN=`END`PLN\\n' +\n      '  location`END`PUN:`END`PLN `END`STR\"ground\"`END`PLN\\n' +\n      '  distance`END`PUN:`END`PLN `END`LIT12`END`PLN\\n' +\n      'car `END`PUN=`END`PLN\\n' +\n      '  location`END`PUN:`END`PLN `END`STR\"hurdle\"`END`PLN\\n' +\n      '  distance`END`PUN:`END`PLN `END`LIT2`END`PLN\\n' +\n      '\\n' +\n      '`END`COM###\\n' +\n      'Tell him to travel:\\n' +\n      '1. through the street\\n' +\n      '2. over the car\\n' +\n      '###`END`PLN\\n' +\n      'tom`END`PUN.`END`PLNtravel street`END`PUN,`END`PLN car`END'\n       ),\n  issue14a: (\n      '`COM//comment`END<br>' +\n      '`KWDint`END`PLN main`END`PUN(`END`KWDint`END`PLN argc`END`PUN,`END' +\n          '`PLN `END`KWDchar`END`PLN `END`PUN**`END`PLNargv`END`PUN)`END' +\n          '`PLN\\n' +\n      '`END`PUN{}`END'),\n  issue14b: (\n      '`COM&lt;!-- There\\'s an `END<acronym title=\"tag soup\">`COMHTML`END' +\n          '</acronym>`COM comment in my comment --&gt;`END`PLN\\n' +\n      '`END`TAG&lt;p&gt;`END' +\n          '`PLNAnd another one inside the end tag`END' +\n      '`TAG&lt;/p`END`TAG&gt;`END'),\n  issue20: (\n      '`TAG&lt;html&gt;`END`PLN\\n' +\n      '\\n' +\n      '`END`TAG&lt;head&gt;`END'),\n  issue21: (\n      '`TAG&lt;html&gt;`END`PLN\\n' +\n      '  `END`TAG&lt;head&gt;`END`PLN\\n' +\n      '    `END`TAG&lt;title&gt;`END`PLNTest`END' +\n          '`TAG&lt;/title&gt;`END`PLN\\n' +\n      '  `END`TAG&lt;/head&gt;`END`PLN\\n' +\n      '`END`TAG&lt;/html&gt;`END'),\n  issue22: (\n      '<span class=\"nocode\">01: `END`COM// This is a line of code`END`PLN\\n' +\n      '`END<span class=\"nocode\">02: `END`COM/* Multiline comments can\\n' +\n      '`END<span class=\"nocode\">03: `END`COM * span over and around\\n' +\n      '`END<span class=\"nocode\">04: `END`COM * line markers\\n' +\n      '`END<span class=\"nocode annot\">And can even be interrupted`END`COM\\n' +\n      '`END<span class=\"nocode annot\">by inline code annotations`END`COM\\n' +\n      '`END<span class=\"nocode\">05: `END`COM *\\/`END`PLN\\n' +\n      '`END<span class=\"nocode\">06: `END`KWDclass`END`PLN `END`TYPMyClass`END' +\n          '`PLN `END`KWDextends`END`PLN `END`TYPFoo`END`PLN `END`PUN{`END' +\n          '`PLN\\n' +\n      '`END<span class=\"nocode\">07: `END`PLN  `END`KWDpublic`END' +\n          '`PLN `END`KWDstatic`END`PLN `END`KWDvoid`END`PLN main`END`PUN(`END' +\n          '`TYPString`END`PUN...`END`PLN argv`END`PUN)`END`PLN `END`PUN{`END' +\n          '`PLN\\n' +\n      '`END<span class=\"nocode\">08: `END`PLN    `END`TYPSystem`END' +\n          '`PUN.`END`KWDout`END`PUN.`END`KWDprint`END`PUN(`END' +\n          '`STR\"Hello World\"`END`PUN);`END`PLN\\n' +\n      '`END<span class=\"nocode\">09: `END`PLN  `END`PUN}`END`PLN\\n' +\n      '`END<span class=\"nocode\">10: `END`PUN}`END'\n      ),\n  issue24: (\n      '`PLNos`END`PUN=`END`PLNrequire`END`PUN(`END`STR\"os\"`END`PUN)`END`PLN\\n' +\n      'math`END`PUN=`END`PLNrequire`END`PUN(`END`STR\"math\"`END`PUN)`END`PLN\\n' +\n      '\\n' +\n      '`END`COM-- Examples from the language reference`END`PLN\\n' +\n      '     a `END`PUN=`END`PLN `END`STR\\'alo\\\\n123\"\\'`END' +\n          '`PLN\\n' +\n      '     a `END`PUN=`END`PLN `END`STR\"alo\\\\n123\\\\\"\"`END' +\n          '`PLN\\n' +\n      '     a `END`PUN=`END`PLN `END' +\n          '`STR\\'\\\\97lo\\\\10\\\\04923\"\\'`END`PLN\\n' +\n      '     a `END`PUN=`END`PLN `END`STR[[alo\\n' +\n      '     123\"]]`END`PLN\\n' +\n      '     a `END`PUN=`END`PLN `END`STR[==[\\n' +\n      '     alo\\n' +\n      '     123\"]==]`END`PLN\\n' +\n      '\\n' +\n      '`END`LIT3`END`PLN   `END`LIT3.0`END`PLN   `END`LIT3.1416`END' +\n          '`PLN   `END`LIT314.16e-2`END`PLN   `END`LIT0.31416E1`END' +\n          '`PLN   `END`LIT0xff`END`PLN   `END`LIT0x56`END`PLN\\n' +\n      '\\n' +\n      '`END`COM-- Some comments that demonstrate long brackets`END`PLN\\n' +\n      'double_quoted `END`PUN=`END`PLN `END`STR\"Not a long bracket [=[\"`END' +\n          '`PLN\\n' +\n      '`END`COM--[=[ quoting out\\n' +\n      ' [[ foo ]]\\n' +\n      ' [==[does not end comment either]==]\\n' +\n      ']=]`END`PLN\\n' +\n      'past_end_of_comment\\n' +\n      '`END`COM--]=]`END`PLN\\n' +\n      '\\n' +\n      '`END`COM-- Example code courtesy Joseph Harmbruster`END`PLN\\n' +\n      '`END`PUN#`END`PLN\\n' +\n      '`END`KWDdo`END`PLN\\n' +\n      '  `END`KWDlocal`END`PLN `END`KWDfunction`END`PLN ssgeneral`END' +\n          '`PUN(`END`PLNt`END`PUN,`END`PLN n`END`PUN,`END`PLN before`END' +\n          '`PUN)`END`PLN\\n' +\n      '    `END`KWDfor`END`PLN _`END`PUN,`END`PLN h `END`KWDin`END' +\n          '`PLN ipairs`END`PUN(`END`PLNincs`END`PUN)`END`PLN `END`KWDdo`END' +\n          '`PLN\\n' +\n      '      `END`KWDfor`END`PLN i `END`PUN=`END`PLN h `END' +\n          '`PUN+`END`PLN `END`LIT1`END`PUN,`END`PLN n `END`KWDdo`END`PLN\\n' +\n      '        `END`KWDlocal`END`PLN v `END`PUN=`END' +\n          '`PLN t`END`PUN[`END`PLNi`END`PUN]`END`PLN\\n' +\n      '        `END`KWDfor`END`PLN j `END`PUN=`END' +\n          '`PLN i `END`PUN-`END`PLN h`END`PUN,`END`PLN `END`LIT1`END`PUN,`END' +\n          '`PLN `END`PUN-`END`PLNh `END`KWDdo`END`PLN\\n' +\n      '          `END`KWDlocal`END`PLN testval `END' +\n          '`PUN=`END`PLN t`END`PUN[`END`PLNj`END`PUN]`END`PLN\\n' +\n      '          `END`KWDif`END`PLN `END`KWDnot`END' +\n          '`PLN before`END`PUN(`END`PLNv`END`PUN,`END`PLN testval`END' +\n          '`PUN)`END`PLN `END`KWDthen`END`PLN `END`KWDbreak`END`PLN `END' +\n          '`KWDend`END`PLN\\n' +\n      '          t`END`PUN[`END`PLNi`END`PUN]`END' +\n          '`PLN `END`PUN=`END`PLN testval`END`PUN;`END`PLN i `END`PUN=`END' +\n          '`PLN j\\n' +\n      '        `END`KWDend`END`PLN\\n' +\n      '        t`END`PUN[`END`PLNi`END`PUN]`END`PLN `END' +\n          '`PUN=`END`PLN v\\n' +\n      '      `END`KWDend`END`PLN \\n' +\n      '    `END`KWDend`END`PLN\\n' +\n      '    `END`KWDreturn`END`PLN t\\n' +\n      '  `END`KWDend`END`PLN\\n' +\n      '\\n' +\n      '  `END`KWDfunction`END`PLN shellsort`END`PUN(`END`PLNt`END' +\n          '`PUN,`END`PLN before`END`PUN,`END`PLN n`END`PUN)`END`PLN\\n' +\n      '    n `END`PUN=`END`PLN n `END`KWDor`END`PLN `END`PUN#`END' +\n          '`PLNt\\n' +\n      '    `END`KWDif`END`PLN `END`KWDnot`END`PLN before `END' +\n          '`KWDor`END`PLN before `END`PUN==`END`PLN `END`STR\"&lt;\"`END' +\n          '`PLN `END`KWDthen`END`PLN `END`KWDreturn`END`PLN ssup`END`PUN(`END' +\n          '`PLNt`END`PUN,`END`PLN n`END`PUN)`END`PLN\\n' +\n      '    `END`KWDelseif`END`PLN before `END`PUN==`END`PLN `END' +\n          '`STR\"&gt;\"`END`PLN `END`KWDthen`END`PLN `END`KWDreturn`END' +\n          '`PLN ssdown`END`PUN(`END`PLNt`END`PUN,`END`PLN n`END`PUN)`END' +\n          '`PLN\\n' +\n      '    `END`KWDelse`END`PLN `END`KWDreturn`END' +\n          '`PLN ssgeneral`END`PUN(`END`PLNt`END`PUN,`END`PLN n`END`PUN,`END' +\n          '`PLN before`END`PUN)`END`PLN\\n' +\n      '    `END`KWDend`END`PLN\\n' +\n      '  `END`KWDend`END`PLN\\n' +\n      '  `END`KWDreturn`END`PLN shellsort\\n' +\n      '`END`KWDend`END'),\n  issue27: (\n      '`KWDImports`END`PLN System\\n' +\n      '\\n' +\n      '`END`KWDClass`END`PLN [class]\\n' +\n      '    `END`KWDShared`END`PLN `END`KWDSub`END`PLN [shared]`END' +\n          '`PUN(`END`KWDByVal`END`PLN [boolean] `END`KWDAs`END`PLN `END' +\n          '`KWDBoolean`END`PUN)`END`PLN\\n' +\n      '        `END`KWDIf`END`PLN [boolean] `END' +\n          '`KWDThen`END`PLN\\n' +\n      '            Console`END`PUN.`END' +\n          '`PLNWriteLine`END`PUN(`END`STR\"true\"`END`PUN)`END`PLN\\n' +\n      '        `END`KWDElse`END`PLN\\n' +\n      '            Console`END`PUN.`END' +\n          '`PLNWriteLine`END`PUN(`END`STR\"false\"`END`PUN)`END`PLN\\n' +\n      '        `END`KWDEnd`END`PLN `END`KWDIf`END' +\n          '`PLN\\n' +\n      '    `END`KWDEnd`END`PLN `END`KWDSub`END`PLN\\n' +\n      '`END`KWDEnd`END`PLN `END`KWDClass`END`PLN\\n' +\n      '\\n' +\n      '`END`COM\\' Comment`END`PLN\\n' +\n      '`END`COM\\u2018 Second Line comment with a smart quote _\\n' +\n      '  continued line using VB6 syntax.`END`PLN\\n' +\n      '`END`KWDModule`END`PLN [module]\\n' +\n      '    `END`KWDSub`END`PLN Main`END`PUN()`END`PLN\\n' +\n      '        [class]`END`PUN.`END`PLN[shared]`END' +\n          '`PUN(`END`LITTrue`END`PUN)`END`PLN\\n' +\n      '\\n' +\n      '        `END`COM\\' This prints out: \\\".`END' +\n          '`PLN\\n' +\n      '        Console`END`PUN.`END`PLNWriteLine`END' +\n          '`PUN(`END`STR\"\"\"\"`END`PUN)`END`PLN\\n' +\n      '\\n' +\n      '        `END`COM\\' This prints out: a\"b.`END' +\n          '`PLN\\n' +\n      '        Console`END`PUN.`END`PLNWriteLine`END' +\n          '`PUN(`END`STR\"a\"\"b\"`END`PUN)`END`PLN\\n' +\n      '\\n' +\n      '        `END`COM\\' This prints out: a.`END' +\n          '`PLN\\n' +\n      '        Console`END`PUN.`END`PLNWriteLine`END' +\n          '`PUN(`END`STR\"a\"c`END`PUN)`END`PLN\\n' +\n      '\\n' +\n      '        `END`COM\\' This prints out: \".`END' +\n          '`PLN\\n' +\n      '        Console`END`PUN.`END`PLNWriteLine`END' +\n          '`PUN(`END`STR\"\"\"\"c`END`PUN)`END`PLN\\n' +\n      '\\n' +\n      '        `END`COMREM an old-style comment`END`PLN\\n' +\n      '        REMOVE`END`PUN(`END`PLNnot_a_comment`END`PUN)`END`PLN\\n' +\n      '    `END`KWDEnd`END`PLN `END`KWDSub`END`PLN\\n' +\n      '`END`KWDEnd`END`PLN `END`KWDModule`END`PLN\\n' +\n      '\\n' +\n      '`END`KWDDim`END`PLN d `END`KWDAs`END`PLN `END`KWDDate`END`PLN\\n' +\n      'd `END`PUN=`END`PLN `END`LIT# 8/23/1970 3:45:39AM #`END`PLN\\n' +\n      'd `END`PUN=`END`PLN `END`LIT# 8/23/1970 #`END`PLN\\n' +\n      'd `END`PUN=`END`PLN `END`LIT# 3:45:39AM #`END`PLN\\n' +\n      'd `END`PUN=`END`PLN `END`LIT# 3:45:39 #`END`PLN\\n' +\n      'd `END`PUN=`END`PLN `END`LIT# 13:45:39 #`END`PLN\\n' +\n      'd `END`PUN=`END`PLN `END`LIT# 13:45:39PM #`END`PLN\\n' +\n      '\\n' +\n      '`END`KWDDim`END`PLN n `END`KWDAs`END`PLN Float\\n' +\n      'n `END`PUN=`END`PLN `END`PUN(`END`LIT0.0`END`PUN,`END`PLN `END' +\n          '`LIT.99F`END`PUN,`END`PLN `END`LIT1.0E-2D`END`PUN,`END`PLN `END' +\n          '`LIT1.0E+3D`END`PUN,`END`PLN `END`LIT.5E4`END`PUN,`END`PLN `END' +\n          '`LIT1E3R`END`PUN,`END`PLN `END`LIT4D`END`PUN)`END`PLN\\n' +\n      '\\n' +\n      '`END`KWDDim`END`PLN i `END`KWDAs`END`PLN `END`KWDInteger`END`PLN\\n' +\n      'i `END`PUN=`END`PLN `END`PUN(`END`LIT0`END`PUN,`END`PLN `END' +\n          '`LIT123`END`PUN,`END`PLN `END`LIT45L`END`PUN,`END`PLN `END' +\n          '`LIT&amp;HA0I`END`PUN,`END`PLN `END`LIT&amp;O177S`END`PUN)`END'),\n  issue30: (\n      '`COM-- A comment`END`PLN\\n' +\n      'Not`END`PUN(--`END`STR\"a comment\"`END`PUN)`END`PLN\\n' +\n      'Also.not`END`PUN(--(`END`PLNA.comment`END`PUN))`END`PLN\\n' +\n      '\\n' +\n      '`END`KWDmodule`END`PLN Foo`END`PUN(`END`PLNbar`END`PUN)`END`PLN `END' +\n          '`KWDwhere`END`PLN\\n' +\n      '`END`KWDimport`END`PLN Blah\\n' +\n      '`END`KWDimport`END`PLN BlahBlah`END`PUN(`END`PLNblah`END`PUN)`END' +\n          '`PLN\\n' +\n      '`END`KWDimport`END`PLN Monads`END`PUN(`END`PLNException`END' +\n          '`PUN(..),`END`PLN FIO`END`PUN(..),`END`PLNunFIO`END`PUN,`END' +\n          '`PLNhandle`END`PUN,`END`PLNrunFIO`END`PUN,`END`PLNfixFIO`END' +\n          '`PUN,`END`PLNfio`END`PUN,`END`PLN\\n' +\n      '              write`END`PUN,`END' +\n          '`PLNwriteln`END`PUN,`END`PLNHasNext`END`PUN(..),`END' +\n          '`PLNHasOutput`END`PUN(..))`END`PLN\\n' +\n      '\\n' +\n      '`END`COM{- nested comments\\n' +\n      ' - don\\'t work {-yet-}`END`PLN `END`PUN-}`END`PLN\\n' +\n      '`END`KWDinstance`END`PLN Thingy Foo `END`KWDwhere`END`PLN\\n' +\n      '  a `END`PUN=`END`PLN b\\n' +\n      '\\n' +\n      '`END`KWDdata`END`PLN Foo `END`PUN::`END`PLN `END`PUN(*`END`PLN `END' +\n          '`PUN-&gt;`END`PLN `END`PUN*`END`PLN `END`PUN-&gt;`END`PLN `END' +\n          '`PUN*)`END`PLN `END`PUN-&gt;`END`PLN `END`PUN*`END`PLN `END' +\n          '`PUN&gt;`END`PLN `END`PUN*`END`PLN `END`PUN-&gt;`END`PLN `END' +\n          '`PUN*`END`PLN `END`KWDwhere`END`PLN\\n' +\n      '  Nil `END`PUN::`END`PLN Foo a b c\\n' +\n      '  Cons `END`PUN::`END`PLN a b c `END`PUN-&gt;`END' +\n          '`PLN Foo abc `END`PUN-&gt;`END`PLN Foo a b c\\n' +\n      '\\n' +\n      'str `END`PUN=`END`PLN `END`STR\"Foo\\\\\\\\Bar\"`END`PLN\\n' +\n      'char `END`PUN=`END`PLN `END`STR\\'x\\'`END`PLN\\n' +\n      'Not.A.Char `END`PUN=`END`PLN `END`STR\\'t`END`PLNoo long\\'  `END' +\n          '`COM-- Don\\'t barf.  Show that \\'t is a lexical error.`END' +\n          '`PLN\\n' +\n      '\\n' +\n      '`END`PUN(`END`PLNident`END`PUN,`END`PLN ident\\'`END`PUN,`END' +\n          '`PLN Fo\\'\\'o.b\\'ar`END`PUN)`END`PLN\\n' +\n      '\\n' +\n      '`END`PUN(`END`LIT0`END`PUN,`END`PLN `END`LIT12`END`PUN,`END`PLN `END' +\n          '`LIT0x45`END`PUN,`END`PLN `END`LIT0xA7`END`PUN,`END`PLN `END' +\n          '`LIT0o177`END`PUN,`END`PLN `END`LIT0O377`END`PUN,`END`PLN `END' +\n          '`LIT0.1`END`PUN,`END`PLN `END`LIT1.0`END`PUN,`END`PLN `END' +\n          '`LIT1e3`END`PUN,`END`PLN `END`LIT0.5E-3`END`PUN,`END`PLN `END' +\n          '`LIT1.0E+45`END`PUN)`END'\n       ),\n  issue33: (\n      '`COM(*\\n' +\n      ' * Print the 10th fibonacci number\\n' +\n      ' *)`END`PLN\\n' +\n      '\\n' +\n      '`END`COM//// A line comment`END`PLN\\n' +\n      '`END`STR\"A string\"`END`PUN;;`END`PLN\\n' +\n      '`END`PUN(`END`LIT0`END`PUN,`END`PLN `END`LIT125`END`PUN,`END' +\n           '`PLN `END`LIT0xa0`END`PUN,`END`PLN `END`LIT-1.0`END`PUN,`END' +\n           '`PLN `END`LIT1e6`END`PUN,`END`PLN `END`LIT1.2e-3`END`PUN);;`END' +\n           '`PLN  `END`COM// number literals`END`PLN\\n' +\n      '\\n' +\n      '`END`COM#if fibby`END`PLN\\n' +\n      '  `END`KWDlet`END`PLN\\n' +\n      '    `END`KWDrec`END`PLN fib `END`PUN=`END`PLN `END' +\n           '`KWDfunction`END`PLN `END`PUN(`END`LIT0`END`PUN,`END`PLN a`END' +\n           '`PUN,`END`PLN _`END`PUN)`END`PLN `END`PUN-&gt;`END`PLN a\\n' +\n      '                    ' +\n           ' `END`PUN|`END`PLN `END`PUN(`END`PLNn`END`PUN,`END`PLN a`END' +\n           '`PUN,`END`PLN b`END`PUN)`END`PLN `END`PUN-&gt;`END`PLN fib`END' +\n           '`PUN(`END`PLNn `END`PUN-`END`PLN `END`LIT1`END`PUN,`END' +\n           '`PLN a `END`PUN+`END`PLN b`END`PUN,`END`PLN a`END`PUN)`END' +\n           '`PLN\\n' +\n      '  `END`KWDin`END`PLN\\n' +\n      '    print_int`END`PUN(`END`PLNfib`END`PUN(`END`LIT10`END' +\n           '`PUN,`END`PLN `END`LIT1`END`PUN,`END`PLN `END`LIT1`END' +\n           '`PUN));;`END`PLN\\n' +\n      '`END`COM#endif`END`PLN\\n' +\n      '\\n' +\n      '`END`KWDlet`END`PLN zed `END`PUN=`END`PLN `END`STR\\'z\\'`END`PLN\\n' +\n      '\\n' +\n      '`END`KWDlet`END`PLN f\\' x\\' `END`PUN=`END`PLN x\\' `END`PUN+`END`PLN `END`LIT1`END'),\n  issue42: (\n      '`COM; -*- mode: lisp -*-`END`PLN\\n' +\n      '\\n' +\n      '`END`OPN(`END`KWDdefun`END`PLN back-six-lines `END`OPN(`END`CLO)`END' +\n           '`PLN `END`OPN(`END`PLNinteractive`END`CLO)`END`PLN `END`OPN(`END' +\n           '`PLNforward-line `END`LIT-6`END`CLO))`END`PLN\\n' +\n      '`END`OPN(`END`KWDdefun`END`PLN forward-six-lines `END`OPN(`END' +\n           '`CLO)`END`PLN `END`OPN(`END`PLNinteractive`END`CLO)`END`PLN `END' +\n           '`OPN(`END`PLNforward-line `END`LIT6`END`CLO))`END`PLN\\n' +\n      '\\n' +\n      '`END`OPN(`END`PLNglobal-set-key `END`STR\"\\\\M-l\"`END`PLN `END' +\n           '`LIT\\'goto-line`END`CLO)`END`PLN\\n' +\n      '`END`OPN(`END`PLNglobal-set-key `END`STR\"\\\\C-z\"`END`PLN `END' +\n           '`LIT\\'advertised-undo`END`CLO)`END`PLN\\n' +\n      '`END`OPN(`END`PLNglobal-set-key `END`PUN[`END`PLNC-insert`END' +\n           '`PUN]`END`PLN `END`LIT\\'clipboard-kill-ring-save`END`CLO)`END' +\n           '`PLN\\n' +\n      '`END`OPN(`END`PLNglobal-set-key `END`PUN[`END`PLNS-insert`END`PUN]`END' +\n           '`PLN `END`LIT\\'clipboard-yank`END`CLO)`END`PLN\\n' +\n      '`END`OPN(`END`PLNglobal-set-key `END`PUN[`END`PLNC-up`END`PUN]`END' +\n           '`PLN `END`LIT\\'back-six-lines`END`CLO)`END`PLN\\n' +\n      '`END`OPN(`END`PLNglobal-set-key `END`PUN[`END`PLNC-down`END`PUN]`END' +\n           '`PLN `END`LIT\\'forward-six-lines`END`CLO)`END`PLN\\n' +\n      '\\n' +\n      '`END`OPN(`END`KWDsetq`END`PLN visible-bell `END`KWDt`END`CLO)`END' +\n           '`PLN\\n' +\n      '`END`OPN(`END`KWDsetq`END`PLN user-mail-address `END' +\n           '`STR\"foo@bar.com\"`END`CLO)`END`PLN\\n' +\n      '`END`OPN(`END`KWDsetq`END`PLN default-major-mode `END' +\n           '`LIT\\'text-mode`END`CLO)`END`PLN\\n' +\n      '\\n' +\n      '`END`OPN(`END`PLNsetenv `END`STR\"TERM\"`END`PLN `END' +\n           '`STR\"emacs\"`END`CLO)`END`PLN\\n' +\n      '`END`OPN(`END`PLNc-set-offset `END`LIT\\'case-label`END`PLN `END' +\n           '`LIT2`END`CLO)`END`PLN\\n' +\n      '`END`OPN(`END`KWDsetq`END`PLN c-basic-offset `END`LIT2`END`CLO)`END' +\n           '`PLN\\n' +\n      '`END`OPN(`END`KWDsetq`END`PLN perl-indent-level `END`LIT0x2`END`CLO)`END' +\n           '`PLN\\n' +\n      '`END`OPN(`END`KWDsetq`END`PLN delete-key-deletes-forward `END`KWDt`END' +\n           '`CLO)`END`PLN\\n' +\n      '`END`OPN(`END`KWDsetq`END`PLN indent-tabs-mode `END`KWDnil`END' +\n           '`CLO)`END`PLN\\n' +\n      '\\n' +\n      '`END`COM;; Text mode`END`PLN\\n' +\n      '`END`OPN(`END`PLNadd-hook `END`LIT\\'text-mode-hook`END`PLN \\n' +\n      '  `END`LIT\\'`END`OPN(`END`KWDlambda`END`PLN `END`OPN(`END' +\n           '`CLO)`END`PLN\\n' +\n      '     `END`OPN(`END`PLNturn-on-auto-fill`END`CLO)`END' +\n           '`PLN\\n' +\n      '   `END`CLO)`END`PLN\\n' +\n      '`END`CLO)`END`PLN\\n' +\n      '\\n' +\n      '`END`COM;; Fundamental mode`END`PLN\\n' +\n      '`END`OPN(`END`PLNadd-hook `END`LIT\\'fundamental-mode-hook`END' +\n           '`PLN \\n' +\n      '  `END`LIT\\'`END`OPN(`END`KWDlambda`END`PLN `END`OPN(`END' +\n           '`CLO)`END`PLN\\n' +\n      '     `END`OPN(`END`PLNturn-on-auto-fill`END' +\n           '`CLO)`END`PLN\\n' +\n      '   `END`CLO)`END`PLN\\n' +\n      '`END`CLO)`END`PLN\\n' +\n      '\\n' +\n      '`END`COM;; Define and cond are keywords in scheme`END`PLN\\n' +\n      '`END`OPN(`END`KWDdefine`END`PLN `END`OPN(`END`PLNsqt x`END`CLO)`END' +\n           '`PLN `END`OPN(`END`PLNsqrt-iter `END`LIT1.0`END`PLN `END' +\n           '`LIT2.0`END`PLN x`END`CLO))`END'),\n  issue45: (\n      '`KWDthrow`END`PLN `END`KWDnew`END`PLN `END`TYPRuntimeException`END' +\n           '`PUN(`END`STR\"Element [\"`END`PLN `END`PUN+`END`PLN element`END' +\n           '`PUN.`END`PLNgetName`END`PUN()`END`PLN `END`PUN+`END`PLN \\n' +\n      '  `END`STR\"] missing attribute.\"`END`PUN);`END`PLN\\n' +\n      'variable`END`PUN++;`END'),\n  proto: (\n      '`KWDmessage`END`PLN `END`TYPSearchRequest`END`PLN `END`PUN{`END' +\n           '`PLN\\n' +\n      '  `END`KWDrequired`END`PLN `END`TYPstring`END`PLN query `END' +\n           '`PUN=`END`PLN `END`LIT1`END`PUN;`END`PLN\\n' +\n      '  `END`KWDoptional`END`PLN `END`TYPint32`END`PLN page_number `END' +\n           '`PUN=`END`PLN `END`LIT2`END`PUN;`END`PLN\\n' +\n      '  `END`KWDoptional`END`PLN `END`TYPint32`END' +\n           '`PLN result_per_page `END`PUN=`END`PLN `END`LIT3`END`PLN `END' +\n           '`PUN[`END`KWDdefault`END`PLN `END`PUN=`END`PLN `END`LIT10`END' +\n           '`PUN];`END`PLN\\n' +\n      '  `END`KWDenum`END`PLN `END`TYPCorpus`END`PLN `END`PUN{`END' +\n           '`PLN\\n' +\n      '    UNIVERSAL `END`PUN=`END`PLN `END`LIT0`END`PUN;`END' +\n           '`PLN\\n' +\n      '    WEB `END`PUN=`END`PLN `END`LIT1`END`PUN;`END`PLN\\n' +\n      '    IMAGES `END`PUN=`END`PLN `END`LIT2`END`PUN;`END`PLN\\n' +\n      '    LOCAL `END`PUN=`END`PLN `END`LIT3`END`PUN;`END`PLN\\n' +\n      '    NEWS `END`PUN=`END`PLN `END`LIT4`END`PUN;`END`PLN\\n' +\n      '    PRODUCTS `END`PUN=`END`PLN `END`LIT5`END`PUN;`END' +\n           '`PLN\\n' +\n      '    VIDEO `END`PUN=`END`PLN `END`LIT6`END`PUN;`END`PLN\\n' +\n      '  `END`PUN}`END`PLN\\n' +\n      '  `END`KWDoptional`END`PLN `END`TYPCorpus`END`PLN corpus `END' +\n           '`PUN=`END`PLN `END`LIT4`END`PLN `END`PUN[`END`KWDdefault`END' +\n           '`PLN `END`PUN=`END`PLN UNIVERSAL`END`PUN];`END`PLN\\n' +\n      '`END`PUN}`END'),\n  wiki: (\n      '`KWD#summary`END`PLN hello world\\n' +\n      '`END`KWD#labels`END`PLN `END`LITHelloWorld`END`PLN `END' +\n           '`LITWikiWord`END`PLN Hiya\\n' +\n      '\\n' +\n      '`END`PUN[`END' +\n           '`STRhttp://www.google.com/?q=WikiSyntax+site:code.google.com`END' +\n           '`PLN `END`LITWikiSyntax`END`PUN]`END`PLN\\n' +\n      '\\n' +\n      'Lorem Ipsum ``END`KWDwhile`END`PLN `END`PUN(`END`LIT1`END' +\n           '`PUN)`END`PLN `END`KWDprint`END`PUN(`END`STR\"blah blah\"`END' +\n           '`PUN);`END`PLN`\\n' +\n      '\\n' +\n      '   `END`PUN*`END`PLN Bullet\\n' +\n      '   `END`PUN*`END`PLN Points\\n' +\n      '      `END`PUN*`END`PLN `END`LITNestedBullet`END' +\n           '`PLN\\n' +\n      '\\n' +\n      '`END`PUN==`END`LITDroningOnAndOn`END`PUN==`END`PLN\\n' +\n      '{{{\\n' +\n      '  `END`COM// Some EmbeddedSourceCode`END`PLN\\n' +\n      '  `END`KWDvoid`END`PLN main`END`PUN()`END`PLN `END`PUN{`END' +\n           '`PLN\\n' +\n      '    `END`TYPPrint`END`PUN(`END`STR\\'hello world\\'`END' +\n           '`PUN);`END`PLN\\n' +\n      '  `END`PUN}`END`PLN\\n' +\n      '}}}\\n' +\n      '\\n' +\n      '{{{\\n' +\n      '  `END`COM&lt;!-- Embedded XML --&gt;`END`PLN\\n' +\n      '  `END`TAG&lt;foo`END`PLN `END`ATNbar`END`PUN=`END' +\n           '`ATV\"baz\"`END`TAG&gt;&lt;boo`END`PLN `END' +\n           '`TAG/&gt;&lt;foo&gt;`END`PLN\\n' +\n      '}}}`END'\n      ),\n  css: (\n      '`COM&lt;!--`END`PLN\\n' +\n      '`END`KWD@charset`END`PUN(`END`STR\\'UTF-8\\'`END`PUN);`END`PLN\\n' +\n      '\\n' +\n      '`END`COM/** A url that is not quoted. *\\/`END`PLN\\n' +\n      '`END`KWD@import`END`PUN(`END`KWDurl`END`PUN(`END`STR/more-styles.css`END' +\n          '`PUN));`END`PLN\\n' +\n      '\\n' +\n      'HTML `END`PUN{`END`PLN `END`KWDcontent-before`END`PUN:`END`PLN `END' +\n          '`STR\\'hello\\\\20\\'`END`PUN;`END`PLN `END`KWDcontent-after`END' +\n          '`PUN:`END`PLN `END`STR\\'w\\\\6f rld\\'`END`PUN;`END`PLN\\n' +\n      '       `END`KWD-moz-spiff`END`PUN:`END`PLN `END' +\n          '`KWDinherit`END`PLN `END`KWD!important`END`PLN `END`PUN}`END' +\n          '`PLN\\n' +\n      '\\n' +\n      '`END`COM/* Test units on numbers. *\\/`END`PLN\\n' +\n      'BODY `END`PUN{`END`PLN `END`KWDmargin-bottom`END`PUN:`END`PLN `END' +\n          '`LIT4px`END`PUN;`END`PLN `END`KWDmargin-left`END`PUN:`END' +\n          '`PLN `END`LIT3in`END`PUN;`END`PLN `END`KWDmargin-bottom`END' +\n          '`PUN:`END`PLN `END`LIT0`END`PUN;`END`PLN `END`KWDmargin-top`END' +\n          '`PUN:`END`PLN `END`LIT5%`END`PLN `END`PUN}`END`PLN\\n' +\n      '\\n' +\n      '`END`COM/** Test number literals and quoted values. *\\/`END`PLN\\n' +\n      'TABLE`END`PUN.`END`PLNfoo TR`END`PUN.`END`PLNbar A`END`PUN#`END' +\n          '`PLNvisited `END`PUN{`END`PLN `END`KWDcolor`END`PUN:`END`PLN `END' +\n          '`LIT#001123`END`PUN;`END`PLN `END`KWDfont-family`END`PUN:`END' +\n          '`PLN `END`STR\"monospace\"`END`PLN `END`PUN}`END`PLN\\n' +\n      '`END`COM/** bolder is not a name, so should be plain. ' +\n          ' !IMPORTANT is a keyword\\n' +\n      '  * regardless of case.\\n' +\n      '  *\\/`END`PLN\\n' +\n      'blink `END`PUN{`END`PLN `END`KWDtext-decoration`END`PUN:`END' +\n          '`PLN BLINK `END`KWD!IMPORTANT`END`PUN;`END`PLN `END' +\n          '`KWDfont-weight`END`PUN:`END`PLN bolder `END`PUN}`END`PLN\\n' +\n      '`END`COM/* Empty url() was causing infinite recursion */`END`PLN\\n' +\n      'a `END`PUN{`END`PLN `END`KWDbackground-image`END`PUN:`END`PLN ' +\n          '`END`KWDurl`END`PUN();`END`PLN `END`PUN}`END`PLN\\n' +\n      'p`END`PUN#`END`PLNfeatured`END`PUN{`END`KWDbackground`END`PUN:`END`LIT#fea`END`PUN}`END`PLN\\n' +\n      '`END`COM--&gt;`END'\n      ),\n  issue79: (\n      '`TAG&lt;style`END`PLN `END`ATNtype`END`PUN=`END`ATV\\'text/css\\'`END' +\n          '`TAG&gt;`END`PLN\\n' +\n      '`END`COM/* desert scheme ported from vim to google prettify */`END' +\n          '`PLN\\n' +\n      'code`END`PUN.`END`PLNprettyprint `END`PUN{`END`PLN `END' +\n          '`KWDdisplay`END`PUN:`END`PLN block`END`PUN;`END`PLN `END' +\n          '`KWDpadding`END`PUN:`END`PLN `END`LIT2px`END`PUN;`END`PLN `END' +\n          '`KWDborder`END`PUN:`END`PLN `END`LIT1px`END`PLN solid `END' +\n          '`LIT#888`END`PUN;`END`PLN\\n' +\n      '`END`KWDbackground-color`END`PUN:`END`PLN `END`LIT#333`END`PUN;`END' +\n          '`PLN `END`PUN}`END`PLN\\n' +\n      '`END`PUN.`END`PLNstr `END`PUN{`END`PLN `END`KWDcolor`END`PUN:`END' +\n          '`PLN `END`LIT#ffa0a0`END`PUN;`END`PLN `END`PUN}`END`PLN `END' +\n          '`COM/* string  - pink */`END`PLN\\n' +\n      '`END`PUN.`END`PLNkwd `END`PUN{`END`PLN `END`KWDcolor`END`PUN:`END' +\n          '`PLN `END`LIT#f0e68c`END`PUN;`END`PLN `END`KWDfont-weight`END' +\n          '`PUN:`END`PLN bold`END`PUN;`END`PLN `END`PUN}`END`PLN\\n' +\n      '`END`PUN.`END`PLNcom `END`PUN{`END`PLN `END`KWDcolor`END`PUN:`END' +\n          '`PLN `END`LIT#87ceeb`END`PUN;`END`PLN `END`PUN}`END`PLN `END' +\n          '`COM/* comment - skyblue */`END`PLN\\n' +\n      '`END`PUN.`END`PLNtyp `END`PUN{`END`PLN `END`KWDcolor`END`PUN:`END' +\n          '`PLN `END`LIT#98fb98`END`PUN;`END`PLN `END`PUN}`END`PLN `END' +\n          '`COM/* type    - lightgreen */`END`PLN\\n' +\n      '`END`PUN.`END`PLNlit `END`PUN{`END`PLN `END`KWDcolor`END`PUN:`END' +\n          '`PLN `END`LIT#cd5c5c`END`PUN;`END`PLN `END`PUN}`END`PLN `END' +\n          '`COM/* literal - darkred */`END`PLN\\n' +\n      '`END`PUN.`END`PLNpun `END`PUN{`END`PLN `END`KWDcolor`END`PUN:`END' +\n          '`PLN `END`LIT#fff`END`PUN;`END`PLN `END`PUN}`END`PLN    `END' +\n          '`COM/* punctuation */`END`PLN\\n' +\n      '`END`PUN.`END`PLNpln `END`PUN{`END`PLN `END`KWDcolor`END`PUN:`END' +\n          '`PLN `END`LIT#fff`END`PUN;`END`PLN `END`PUN}`END`PLN    `END' +\n          '`COM/* plaintext */`END`PLN\\n' +\n      '`END`PUN.`END`PLNtag `END`PUN{`END`PLN `END`KWDcolor`END`PUN:`END' +\n          '`PLN `END`LIT#f0e68c`END`PUN;`END`PLN `END`KWDfont-weight`END' +\n          '`PUN:`END`PLN bold`END`PUN;`END`PLN `END`PUN}`END`PLN `END' +\n          '`COM/* html/xml tag    - lightyellow*/`END`PLN\\n' +\n      '`END`PUN.`END`PLNatn `END`PUN{`END`PLN `END`KWDcolor`END`PUN:`END' +\n          '`PLN `END`LIT#bdb76b`END`PUN;`END`PLN `END`KWDfont-weight`END' +\n          '`PUN:`END`PLN bold`END`PUN;`END`PLN `END`PUN}`END`PLN `END' +\n          '`COM/* attribute name  - khaki*/`END`PLN\\n' +\n      '`END`PUN.`END`PLNatv `END`PUN{`END`PLN `END`KWDcolor`END`PUN:`END' +\n          '`PLN `END`LIT#ffa0a0`END`PUN;`END`PLN `END`PUN}`END`PLN `END' +\n          '`COM/* attribute value - pink */`END`PLN\\n' +\n      '`END`PUN.`END`PLNdec `END`PUN{`END`PLN `END`KWDcolor`END`PUN:`END' +\n          '`PLN `END`LIT#98fb98`END`PUN;`END`PLN `END`PUN}`END`PLN `END' +\n          '`COM/* decimal         - lightgreen */`END`PLN\\n' +\n      '`END`TAG&lt;/style&gt;`END'\n      ),\n  issue84: '`KWDsuper`END`PUN(`END`STR\"&amp;nbsp;\"`END`PUN);`END',\n  issue86_0: '`COM#One Two words`END',\n  issue86_1: '`COM#One`END`PLN\\n' +\n      '`END`TYPTwo`END`PLN lines`END',\n  issue86_2: '`COM#One`END`PLN\\n' +\n      '`END`TYPTwo`END`PLN lines`END',\n  issue86_3: '`COM#One`END`PLN\\n' +\n      '`END`TYPTwo`END`PLN lines`END',\n  issue86_4: '`COM#One`END`PLN\\n' +\n      '`END`TYPTwo`END`PLN lines`END',\n  issue92: '`PUN&lt;?`END`PLNxml version`END`PUN=`END`STR\"1.0\"`END`PLN encoding`END`PUN=`END' +\n          '`STR\"UTF-8\"`END`PUN?&gt;`END`PLN\\n' +\n      '`END`TAG&lt;kml`END`PLN `END`ATNxmlns`END`PUN=`END`ATV\"http://www.opengis.net/kml/2.2\"`END' +\n          '`TAG&gt;`END`PLN\\n' +\n      '  `END`TAG&lt;Placemark&gt;`END`PLN\\n' +\n      '    `END`TAG&lt;name&gt;`END`PLNSimple placemark`END`TAG&lt;/name&gt;`END`PLN\\n' +\n      '    `END`TAG&lt;description`END' +\n          '`PLN `END`ATNLang`END`PUN=`END`ATV\"en\"`END`TAG&gt;`END' +\n          '`PLNAttached to the ground.' +\n          ' Intelligently places itself \\n' +\n      '       at the height of the underlying terrain.`END' +\n          '`TAG&lt;/description&gt;`END`PLN\\n' +\n      '    `END`TAG&lt;Point&gt;`END`PLN\\n' +\n      '      `END`TAG&lt;coordinates&gt;`END' +\n          '`PLN-122.0822035425683,37.42228990140251,0`END`TAG&lt;/coordinates&gt;`END`PLN\\n' +\n      '    `END`TAG&lt;/Point&gt;`END`PLN\\n' +\n      '  `END`TAG&lt;/Placemark&gt;`END`PLN\\n' +\n      '`END`TAG&lt;/kml&gt;`END',\n  issue93: '`COM// The normal string syntax`END`PLN\\n' +\n      '`END`KWDstring`END`PLN a `END`PUN=`END`PLN `END`STR\"C:\\\\\\\\\"`END`PUN;`END`PLN\\n' +\n      '`END`COM// is equivalent to a verbatim string`END`PLN\\n' +\n      '`END`KWDstring`END`PLN b `END`PUN=`END`PLN `END`STR@\"C:\\\\\"`END`PUN;`END',\n  vhdl: '`KWDlibrary`END`PLN ieee`END`PUN;`END`PLN\\n' +\n      '`END`KWDuse`END`PLN ieee`END`PUN.`END`PLNstd_logic_1164`END`PUN.`END`KWDall`END`PUN;`END`PLN\\n' +\n      '`END`KWDuse`END`PLN ieee`END`PUN.`END`PLNnumeric_std`END`PUN.`END`KWDall`END`PUN;`END`PLN\\n' +\n      '\\n' +\n      '`END`COM-- A line comment`END`PLN\\n' +\n      '`END`KWDentity`END`PLN foo_entity `END`KWDis`END`PLN\\n' +\n      '\\n' +\n      '  `END`KWDgeneric`END`PLN `END`PUN(`END`COM-- comment after punc`END`PLN\\n' +\n      '    a `END`PUN:`END`PLN `END`TYPnatural`END`PLN `END`PUN:=`END' +\n          '`PLN `END`LIT42`END`PUN;`END`PLN\\n' +\n      '    x `END`PUN:`END`PLN `END`TYPreal`END`PLN `END' +\n          '`PUN:=`END`PLN `END`LIT16#ab.cd#-3`END`PLN\\n' +\n      '  `END`PUN);`END`PLN\\n' +\n      '  `END`KWDport`END`PLN `END`PUN(`END`PLN\\n' +\n      '    clk_i `END`PUN:`END`PLN `END`KWDin`END`PLN  `END`TYPstd_logic`END`PUN;`END`PLN\\n' +\n      '    b_i   `END`PUN:`END`PLN `END`KWDin`END`PLN  `END`TYPnatural`END`PLN `END`KWDrange`END`PLN `END`LIT0`END`PLN `END`KWDto`END`PLN `END`LIT100`END`PUN;`END`PLN\\n' +\n      '    c_o   `END`PUN:`END`PLN `END`KWDout`END`PLN `END`TYPstd_logic_vector`END`PUN(`END`LIT5`END`PLN `END`KWDdownto`END`PLN `END`LIT0`END`PUN);`END`PLN\\n' +\n      '    \\\\a \"name\"\\\\ `END`PUN:`END`PLN `END`KWDout`END`PLN `END`TYPinteger`END`PLN  `END`COM-- extended identifier`END`PLN\\n' +\n      '  `END`PUN);`END`PLN\\n' +\n      '\\n' +\n      '`END`KWDend`END`PLN `END`KWDentity`END`PLN foo_entity`END`PUN;`END`PLN\\n' +\n      '\\n' +\n      '`END`KWDarchitecture`END`PLN foo_architecture `END`KWDof`END`PLN foo_entity `END`KWDis`END`PLN\\n' +\n      '  `END`KWDsignal`END`PLN bar_s `END`PUN:`END`PLN `END`TYPstd_logic_vector`END`PUN(`END`LIT2`END`PLN `END`KWDdownto`END`PLN `END`LIT0`END`PUN);`END`PLN\\n' +\n      '`END`KWDbegin`END`PLN\\n' +\n      '  \\n' +\n      '  bar_s `END`PUN&lt;=`END`PLN `END`STRb\"101\"`END`PUN;`END`PLN\\n' +\n      '\\n' +\n      '  dummy_p `END`PUN:`END`PLN `END`KWDprocess`END`PLN `END`PUN(`END`PLNclk_i`END`PUN)`END`PLN\\n' +\n      '  `END`KWDbegin`END`PLN\\n' +\n      '    `END`KWDif`END`PLN b_i `END`PUN=`END`PLN `END`LIT1`END`PLN `END`KWDthen`END`PLN\\n' +\n      '      c_o `END`PUN&lt;=`END`PLN `END`PUN(`END`KWDothers`END`PLN `END`PUN=&gt;`END`PLN `END`STR\\'0\\'`END`PUN);`END`PLN\\n' +\n      '    `END`KWDelsif`END`PLN rising_edge`END`PUN(`END`PLNclk_i`END`PUN)`END`PLN `END`KWDthen`END`PLN\\n' +\n      '      c_o `END`PUN&lt;=`END`PLN `END`STR\"1011\"`END`PLN `END`PUN&amp;`END`PLN bar_s`END`PUN(`END`LIT1`END`PLN `END`KWDdownto`END`PLN `END`LIT0`END`PUN);`END`PLN\\n' +\n      '    `END`KWDend`END`PLN `END`KWDif`END`PUN;`END`PLN\\n' +\n      '  `END`KWDend`END`PLN `END`KWDprocess`END`PLN dummy_p`END`PUN;`END`PLN\\n' +\n      '\\n' +\n      '`END`KWDend`END`PLN `END`KWDarchitecture`END`PLN foo_architecture`END`PUN;`END',\n  yaml1: '`KWDapplication: `END`PLNmirah`END`PUN-`END`PLNlang\\n' +\n      '`END`KWDversion: `END`PLN1\\n' +\n      '\\n' +\n      '`END`COM# Here\\'s a comment`END`PLN\\n' +\n      '`END`KWDhandlers:\\n' +\n      '`END`PLN  `END`PUN-`END`PLN `END`KWDurl: `END`PLN/red/*\\n' +\n      '     `END`KWDservlet: `END`PLNmysite.server.TeamServlet\\n' +\n      '     `END`KWDinit_params:\\n' +\n      '`END`PLN       `END`KWDteamColor: `END`PLNred\\n' +\n      '       `END`KWDbgColor: `END`STR\"#CC0000\"`END`PLN\\n' +\n      '     `END`KWDname: `END`PLNredteam\\n' +\n      '  `END`PUN-`END`PLN `END`KWDurl: `END`PLN/blue/*\\n' +\n      '     `END`KWDservlet: `END`PLNmysite.server.TeamServlet\\n' +\n      '     `END`KWDinit_params:\\n' +\n      '`END`PLN       `END`KWDteamColor: `END`PLNblue\\n' +\n      '       `END`KWDbgColor: `END`STR\"#0000CC\"`END`PLN\\n' +\n      '     `END`KWDname: `END`PLNblueteam\\n' +\n      '  `END`PUN-`END`PLN `END`KWDurl: `END`PLN/register/*\\n' +\n      '     `END`KWDjsp: `END`PLN/register/start.jsp\\n' +\n      '  `END`PUN-`END`PLN `END`KWDurl: `END`PLN*.special\\n' +\n      '     `END`KWDfilter: `END`PLNmysite.server.LogFilterImpl\\n' +\n      '     `END`KWDinit_params:\\n' +\n      '`END`PLN       `END`KWDlogType: `END`PLNspecial\\n' +\n      '  `END',\n  yaml2: '`DEC%YAML 1.1`END`PLN\\n' +\n      '`END`DEC---\\n' +\n      '`END`TYP!!map`END`PLN {\\n' +\n      '  `END`PUN?`END`PLN `END`TYP!!str`END`PLN `END`STR\"\"`END`PLN\\n' +\n      '  `END`PUN:`END`PLN `END`TYP!!str`END`PLN `END`STR\"value\"`END`PLN,\\n' +\n      '  `END`PUN?`END`PLN `END`TYP!!str`END`PLN `END`STR\"explicit key\"`END`PLN\\n' +\n      '  `END`PUN:`END`PLN `END`TYP!!str`END`PLN `END`STR\"value\"`END`PLN,\\n' +\n      '  `END`PUN?`END`PLN `END`TYP!!str`END`PLN `END`STR\"simple key\"`END`PLN\\n' +\n      '  `END`PUN:`END`PLN `END`TYP!!str`END`PLN `END`STR\"value\"`END`PLN,\\n' +\n      '  `END`PUN?`END`PLN `END`TYP!!seq`END`PLN [\\n' +\n      '    `END`TYP!!str`END`PLN `END`STR\"collection\"`END`PLN,\\n' +\n      '    `END`TYP!!str`END`PLN `END`STR\"simple\"`END`PLN,\\n' +\n      '    `END`TYP!!str`END`PLN `END`STR\"key\"`END`PLN\\n' +\n      '  ]\\n' +\n      '  `END`PUN:`END`PLN `END`TYP!!str`END`PLN `END`STR\"value\"`END`PLN\\n' +\n      '}`END',\n  scala: '`COM/* comment 1 *\\/`END`PLN\\n' +\n      '`END`COM/*\\n' +\n      'comment 2\\n' +\n      '*\\/`END`PLN\\n' +\n      '`END`COM/* comment / * comment 3 **\\/`END`PLN\\n' +\n      '`END`COM// strings`END`PLN\\n' +\n      '`END`STR\"Hello, World!\"`END`PUN,`END`PLN `END`STR\"\\\\n\"`END`PUN,`END`PLN\\n' +\n      '`END`LIT`an-identifier``END`PUN,`END`PLN `END`LIT`\\\\n``END`PUN,`END`PLN\\n' +\n      '`END`STR\\'A\\'`END`PUN,`END`PLN `END`STR\\'\\\\n\\'`END`PUN,`END`PLN\\n' +\n      '`END`LIT\\'aSymbol`END`PUN,`END`PLN\\n' +\n      '`END`STR\"\"\"Hello,\\n' +\n      'World\"\"\"`END`PUN,`END`PLN `END`STR\"\"\"Hello,\\\\nWorld\"\"\"`END`PUN,`END`PLN\\n' +\n      '`END`STR\"\"\"Hello, \"World\"!\"\"\"`END`PUN,`END`PLN\\n' +\n      '`END`STR\"\"\"Hello, \\\\\"World\\\\\"\"\"\"`END`PLN\\n' +\n      '\\n' +\n      '`END`COM// Numbers`END`PLN\\n' +\n      '`END`LIT0`END`PLN\\n' +\n      '`END`LIT0123`END`PLN\\n' +\n      '`END`LIT0xa0`END`PLN\\n' +\n      '`END`LIT0XA0L`END`PLN\\n' +\n      '`END`LIT123`END`PLN\\n' +\n      '`END`LIT123.45`END`PLN\\n' +\n      '`END`LIT1.50F`END`PLN\\n' +\n      '`END`LIT0.50`END`PLN\\n' +\n      '`END`PUN.`END`LIT50`END`PLN\\n' +\n      '`END`LIT123e-1`END`PLN\\n' +\n      '`END`LIT123.45e+1`END`PLN\\n' +\n      '`END`LIT1.50e2`END`PLN\\n' +\n      '`END`LIT0.50e-6`END`PLN\\n' +\n      '`END`PUN.`END`LIT50e+42f`END`PLN\\n' +\n      '\\n' +\n      '`END`COM// Values`END`PLN\\n' +\n      '`END`LITfalse`END`PUN,`END`PLN `END`LITtrue`END`PUN,`END`PLN `END`LITnull`END`PUN,`END`PLN `END`LITthis`END`PUN;`END`PLN\\n' +\n      '\\n' +\n      '`END`COM// Keywords`END`PLN\\n' +\n      '`END`KWDclass`END`PLN `END`TYPMyClass`END`PUN;`END`PLN\\n' +\n      '`END`KWDimport`END`PLN foo`END`PUN.`END`PLNbar`END`PUN;`END`PLN\\n' +\n      '`END`KWDpackage`END`PLN baz`END`PUN;`END`PLN\\n' +\n      '\\n' +\n      '`END`COM// From scala-lang.org/node/242`END`PLN\\n' +\n      '`END`KWDdef`END`PLN act`END`PUN()`END`PLN `END`PUN{`END`PLN\\n' +\n      '  `END`KWDvar`END`PLN pongCount `END`PUN=`END`PLN `END`LIT0`END`PLN\\n' +\n      '  loop `END`PUN{`END`PLN\\n' +\n      '    react `END`PUN{`END`PLN\\n' +\n      '      `END`KWDcase`END`PLN `END`TYPPing`END`PLN `END`PUN=&gt;`END`PLN\\n' +\n      '        `END`KWDif`END`PLN `END`PUN(`END`PLNpongCount `END`PUN%`END`PLN `END`LIT1000`END`PLN `END`PUN==`END`PLN `END`LIT0`END`PUN)`END`PLN\\n' +\n      '          `END`TYPConsole`END`PUN.`END`PLNprintln`END`PUN(`END`STR\"Pong: ping \"`END`PUN+`END`PLNpongCount`END`PUN)`END`PLN\\n' +\n      '        sender `END`PUN!`END`PLN `END`TYPPong`END`PLN\\n' +\n      '        pongCount `END`PUN=`END`PLN pongCount `END`PUN+`END`PLN `END`LIT1`END`PLN\\n' +\n      '      `END`KWDcase`END`PLN `END`TYPStop`END`PLN `END`PUN=&gt;`END`PLN\\n' +\n      '        `END`TYPConsole`END`PUN.`END`PLNprintln`END`PUN(`END`STR\"Pong: stop\"`END`PUN)`END`PLN\\n' +\n      '        exit`END`PUN()`END`PLN\\n' +\n      '    `END`PUN}`END`PLN\\n' +\n      '  `END`PUN}`END`PLN\\n' +\n      '`END`PUN}`END',\n  go: '`PLNpackage main  `END`COM/* Package of which this program is part. *\\/`END`PLN\\n' +\n      '\\n' +\n      'import fmt \"fmt\"  `END`COM// Package implementing formatted I/O.`END`PLN\\n' +\n      '\\n' +\n      '\\n' +\n      'func main() {\\n' +\n      '    fmt.Printf(\"Hello, world; or \\u039a\\u03b1\\u03bb\\u03b7\\u03bc\\u03ad\\u03c1\\u03b1 \\u03ba\\u03cc\\u03c3\\u03bc\\u03b5; or \\u3053\\u3093\\u306b\\u3061\\u306f \\u4e16\\u754c\\\\n\")  `END`COM// Semicolon inserted here`END`PLN\\n' +\n      '}\\n' +\n      '\\n' +\n      '`END`COM/* \" *\\/`END`PLN  \"foo /* \"  `END`COM/*\\/  *\\/`END`PLN\\n' +\n      '`END`COM/* ` *\\/`END`PLN  `foo /* `  `END`COM/*\\/  *\\/`END',\n  erlang: '`COM% Sample comment`END`PLN\\n' + \n      '\\n' + \n      '`END`KWD-module`END`PLN(my_test)`END`PUN.`END`PLN\\n' + \n      '`END`KWD-include_lib`END`PLN(`END`STR\"my_sample_lib.hrl\"`END`PLN)`END`PUN.`END`PLN\\n' + \n      '`END`KWD-export`END`PLN([\\n' + \n      '    test/`END`LIT2`END`PLN\\n' + \n      '])`END`PUN.`END`PLN\\n' + \n      '\\n' + \n      '`END`COM%% @doc Define a macro`END`PLN\\n' + \n      '`END`KWD-define`END`PLN(my_macro`END`PUN,`END`PLN `END`TYPVariable`END`PLN)`END`PUN.`END`PLN\\n' + \n      '\\n' + \n      '`END`COM%% @doc My function`END`PLN\\n' + \n      'test(`END`TYPVariables`END`PUN,`END`PLN `END`TYPMoreVariables`END`PLN) -&gt;\\n' + \n      '    `END`COM% Inline comment`END`PLN\\n' + \n      '    {ok`END`PUN,`END`TYPScanned`END`PUN,`END`TYP_`END`PLN} = my_lib:do_stuff()`END`PUN,`END`PLN\\n' + \n      '\\n' + \n      '    `END`TYPVariable`END`PLN = `END`KWDfun`END`PLN(`END`TYPV`END`PLN) -&gt; {ok`END`PUN,`END`PLN `END`TYPV`END`PLN} `END`KWDend`END`PUN,`END`PLN\\n' + \n      '\\n' + \n      '    `END`KWDtry`END`PLN `END`LIT?my_macro`END`PLN({value`END`PUN,`END`PLN test}) `END`KWDof`END`PLN\\n' + \n      '        {value`END`PUN,`END`PLN `END`TYPResult`END`PUN,`END`PLN `END`TYP_`END`PLN} -&gt;\\n' + \n      '            {ok`END`PUN,`END`PLN `END`TYPResult`END`PLN}\\n' + \n      '    `END`KWDcatch`END`PLN\\n' + \n      '        `END`TYPType`END`PLN:`END`TYPError`END`PLN -&gt;\\n' + \n      '            {`END`LIT\\'error\\'`END`PUN,`END`PLN `END`TYPType`END`PUN,`END`PLN `END`TYPError`END`PLN}\\n' + \n      '    `END`KWDend`END`PUN.`END'\n};\n</script>\n\n</html>\n"
  },
  {
    "path": "google-code-prettify/tests/prettify_test_2.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W5C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>Code Prettifier</title>\n<script>(function () {\n  var sourceBaseUrl = /[&?]distrib/.test(location.search)\n      ? \"../distrib/google-code-prettify/\" : \"../src/\";\n  var sources = [\n      \"prettify.js\",\n      \"lang-basic.js\",\n      \"lang-css.js\",\n      // Language extensions tested.\n      \"lang-clj.js\",\n      \"lang-lisp.js\",\n      \"lang-llvm.js\",\n      \"lang-matlab.js\",\n      \"lang-mumps.js\",\n      \"lang-n.js\",\n      \"lang-pascal.js\",\n      \"lang-r.js\",\n      \"lang-tcl.js\",\n\"lang-tex.js\",\n      \"lang-xq.js\"\n  ];\n  var styles = [\n      \"prettify.css\"\n  ];\n  if (window.console) {\n    console.log(\"sourceBaseUrl=\" + sourceBaseUrl);\n  }\n  for (var i = 0; i < sources.length; ++i) {\n    document.write(\n        \"<script src=\\\"\" + sourceBaseUrl + sources[i] + \"\\\"><\\/script>\");\n  }\n  for (var i = 0; i < styles.length; ++i) {\n    document.write(\n        \"<link rel=\\\"stylesheet\\\" href=\\\"\" + sourceBaseUrl + styles[i] + \"\\\">\");\n  }\n})();\n</script>\n\n<script src=\"test_base.js\" type=\"text/javascript\"\n onerror=\"alert('Error: failed to load ' + this.src)\"></script>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"test_styles.css\" />\n</head>\n\n<body onload=\"go(goldens)\" bgcolor=\"white\">\n<div id=\"timing\"></div>\n<div id=\"errorReport\" style=\"white-space: pre\"></div>\n\n<h1>XQuery mode</h1>\nFrom <code>http://www.patrick-wied.at/static/xquery/prettify/</code>\n<pre class=\"prettyprint lang-xq\" id=\"xquery\">\n(: \n\tTook some of Mike Brevoort's xquery code samples because they are nice and show common xquery syntax \n:)\n \n  (:~\n   : Given a sequence of version URIs, publish all of these versions of each document\n   : If there is a version of the same document already published, unpublish it 1st\n   :\n   : When \"publish\" is referred to, we mean that it is put into the PUBLISHED collection\n   : unpublish removes content from this collection\n   : @param $version_uris - sequence of uris of versions of managed documents to publish\n   :)\n  declare function comoms-dls:publish($version_uris as item()*) {\n      for $uri in $version_uris\n      let $doc := fn:doc($uri)\n      let $managed_base_uri := $doc/node()/property::dls:version/dls:document-uri/text()\n      let $existing :=  comoms-dls:publishedDoc($managed_base_uri)\n      let $unpublishExisting := if($existing) then comoms-dls:unpublishVersion((xdmp:node-uri($existing)))  else ()\n      let $addPermissions := dls:document-add-permissions($uri, (xdmp:permission('mkp-anon', 'read')))\n      return\n          dls:document-add-collections($uri, (\"PUBLISHED\"))    \n  };\n \n  declare function comoms-dls:publishLatest($uri) {\n      (: TODO check if it's in the draft collection probably :)\n \n      let $latest_version_uri := comoms-dls:latestVersionUri($uri)\n      let $log:= xdmp:log(fn:concat(\"latest: \", $latest_version_uri))    \n      let $log:= xdmp:log(fn:concat(\"uri: \", $uri))            \n      return comoms-dls:publish($latest_version_uri)    \n \n  };\n \n  declare function comoms-dls:latestVersionUri($uri) {\n      let $latest_version_num :=\n          (\n          for $version in dls:document-history($uri)/dls:version\n          order by fn:number($version//dls:version-id/text()) descending\n          return $version//dls:version-id/text()\n          )[1]\n \n \n      return dls:document-version-uri($uri, $latest_version_num)\n  };\n \n  declare function comoms-dls:unpublish($uris as item()*) {\n      for $uri in $uris\n      return\n          let $published_doc := comoms-dls:publishedDoc($uri)\n          return\n              if($published_doc) then\n                  let $published_version_uri := xdmp:node-uri($published_doc)\n                  return comoms-dls:unpublishVersion($published_version_uri)        \n              else\n                  ()\n  };\n \n  declare function comoms-dls:latestPublishedDocAuthor($uri) {\n      let $author_id := doc($uri)/property::dls:version/dls:author/text()\n      return\n          if($author_id) then\n              comoms-user:getUsername($author_id)\n          else\n              ()\n \n  };\n \n  (:~\n   : Given a sequence of version URIs, unpublish all of these versions of each document\n   :)\n  declare function comoms-dls:unpublishVersion($version_uris as item()*) {\n      for $uri in $version_uris\n      return\n          let $removePermissions := dls:document-remove-permissions($uri, (xdmp:permission('mkp-anon', 'read')))\n          return dls:document-remove-collections($uri, (\"PUBLISHED\"))        \n  };\n \n  (:~\n   : Given the base URI of a managed piece of content, return the document of the node\n   : of the version that is published\n   :)\n  declare function comoms-dls:publishedDoc($uri) {\n      fn:collection(\"PUBLISHED\")[property::dls:version/dls:document-uri = $uri]\n  };\n \n \n  (:~\n   : Test if any version of the managed document is published\n   :)\n  declare function comoms-dls:isPublished($uri) {\n      if( comoms-dls:publishedDoc($uri)) then\n          fn:true()\n      else\n          fn:false()\n  };\n \n \n  declare function comoms-dls:publishedState($uri) {\n      let $doc := comoms-dls:publishedDoc($uri)\n      let $published_uri := if($doc) then xdmp:node-uri($doc) else ()\n      let $latest := comoms-dls:latestVersionUri($uri)\n      return\n          if($doc) then\n              if($latest ne $published_uri) then\n                  \"stale\"\n              else\n                  \"published\"\n          else\n              \"unpublished\"\n  };\n \n \n  declare function comoms-dls:getManagedDocUri($uri) {\n      let $doc := fn:doc($uri)\n      let $managed_uri := $doc/property::dls:version/dls:document-uri/text()\n      let $managed_uri := if($managed_uri) then $managed_uri else $uri\n      return $managed_uri\n  };\n \n  (:~\n   : Given a manage content url (e.g. /content/123456.xml) return the appropriate\n   : version of the document based on what stage collection is being viewed and\n   : what's published\n   :\n   : @param $uri a manage content url (e.g. /content/123456.xml) - NOT A VERSIONED URI\n   :)\n  declare function comoms-dls:doc($uri) {\n      let $doc := fn:root(comoms-dls:collection()[property::dls:version/dls:document-uri = $uri][1])\n      return\n          if($doc) then\n              $doc\n          else\n              let $managedDocInCollection := comoms-dls:collection-name() = xdmp:document-get-collections($uri)\n              return\n                  if($managedDocInCollection) then\n                      fn:doc($uri)\n                  else\n                      ()\n  };\n \n  (:~\n   : Get the collection to be used when querying for content\n   : THIS or comoms-dls:collection-name() SHOULD BE USED WHEN BUILDING ANY QUERY FOR MANAGED CONTENT\n   :)\n  declare function comoms-dls:collection()  {\n      fn:collection( comoms-dls:collection-name() )\n  };\n \n  (:~\n   : Get the collection nameto be used when querying for content\n   : THIS or comoms-dls:collection() SHOULD BE USED WHEN BUILDING ANY QUERY FOR MANAGED CONTENT\n   :)\n  declare function comoms-dls:collection-name() as xs:string {\n      let $default_collection := \"PUBLISHED\"\n      return\n          if(comoms-user:isAdmin()) then\n              let $pub_stage_collection_cookie := comoms-util:getCookie(\"COMOMS_COLLECTION\")\n              return\n                  if($pub_stage_collection_cookie) then\n                      $pub_stage_collection_cookie\n                  else\n                      $default_collection\n          else\n              $default_collection\n  };\n \n  (:~\n   : Check if the published collection is being viewed\n   :)\n  declare function comoms-dls:isViewingPublished() {\n      if(comoms-dls:collection-name() = \"PUBLISHED\") then\n          fn:true()\n      else\n          fn:false()\n  };\n \n  (:~\n   : Get the best URL for the content URI.\n   : This is either the default URI based on detail type or should also take\n   : into account friendly urls and navigation structures to figure out the\n   : best choice\n   :)\n  declare function comoms-dls:contentUrl($uri) {\n \n      (: TODO: add friendly URL and nav structure logic 1st :)\n \n      let $doc := fn:doc($uri)\n      let $managedDocUri := $doc/property::dls:version/dls:document-uri\n      let $uri := if($managedDocUri) then $managedDocUri else $uri\n      let $type := $doc/node()/fn:name()\n      let $content_id := fn:tokenize( fn:tokenize($uri, \"/\")[3], \"\\.\")[1]\n      return\n          fn:concat(\"/\", $type, \"/\", $content_id)\n  };\n \n  (:\n   :\n   :  gets list of doc versions and uri.\n   :\n   :)\n  declare function comoms-dls:versionHistory($uri) {\n      let $published_doc := comoms-dls:publishedDoc($uri)\n      let $published_uri := if($published_doc) then xdmp:node-uri($published_doc) else ()\n      return\n      &lt;versions&gt;\n          {\n          for $version in dls:document-history($uri)/dls:version\n            let $version_num := $version/dls:version-id/text()\n            let $created := $version/dls:created/text()\n            let $author_id := $version/dls:author/text()\n            let $author := comoms-user:getUsername($author_id)\n \n \n            let $note := $version/dls:annotation/text()\n            let $version_uri := xdmp:node-uri(dls:document-version($uri, $version_num))\n            let $published := $published_uri eq $version_uri\n            return\n              &lt;version&gt;\n                  &lt;version-number&gt;{$version_num}&lt;/version-number&gt;\n                  &lt;created&gt;{$created}&lt;/created&gt;                \n                  &lt;author&gt;{$author}&lt;/author&gt;\n                  &lt;published&gt;{$published}&lt;/published&gt;\n                  &lt;version-uri&gt;{$version_uri}&lt;/version-uri&gt;\n              &lt;/version&gt;  \n          }        \n      &lt;/versions&gt;\n  };\n \n \n \n \n \n \n  (: ########################################################################### :)\n  (: PRIVATE FUNCTIONS :)\n  (: ########################################################################### :)\n \n  declare function comoms-dls:_import() {\n      \"xquery version '1.0-ml';\n       import module namespace dls = 'http://marklogic.com/xdmp/dls' at '/MarkLogic/dls.xqy'; \"\n  };  \n \n(: ----\n---- :)\nxquery version '1.0-ml';\ndeclare variable $URI as xs:string external;\n \ndeclare function local:document-move-forest($uri as xs:string, $forest-ids as xs:unsignedLong*)\n{\n  xdmp:document-insert(\n    $uri,\n    fn:doc($uri),\n    xdmp:document-get-permissions($uri),\n    xdmp:document-get-collections($uri),\n    xdmp:document-get-quality($uri),\n    $forest-ids\n  )\n};\n \nlet $xml :=\n  &lt;xml att=\"blah\" att2=\"blah\"&gt;\n    sdasd&lt;b&gt;asdasd&lt;/b&gt;\n  &lt;/xml&gt;\n(: -------- :)\nfor $d in fn:doc(\"depts.xml\")/depts/deptno\nlet $e := fn:doc(\"emps.xml\")/emps/emp[deptno = $d]\nwhere fn:count($e) &gt;= 10\norder by fn:avg($e/salary) descending\nreturn\n   &lt;big-dept&gt;\n      {\n      $d,\n      &lt;headcount&gt;{fn:count($e)}&lt;/headcount&gt;,\n      &lt;avgsal&gt;{fn:avg($e/salary)}&lt;/avgsal&gt;\n      }\n   &lt;/big-dept&gt;\n(: -------- :)\ndeclare function local:depth($e as node()) as xs:integer\n{\n   (: A node with no children has depth 1 :)\n   (: Otherwise, add 1 to max depth of children :)\n   if (fn:empty($e/*)) then 1\n   else fn:max(for $c in $e/* return local:depth($c)) + 1\n};\n \nlocal:depth(fn:doc(\"partlist.xml\"))\n \n(: -------- :)\n&lt;html&gt;&lt;head/&gt;&lt;body&gt;\n{\n  for $act in doc(\"hamlet.xml\")//ACT\n  let $speakers := distinct-values($act//SPEAKER)\n  return\n    &lt;div&gt;{ string($act/TITLE) }&lt;/h1&gt;\n      &lt;ul&gt;\n      {\n        for $speaker in $speakers\n        return &lt;li&gt;{ $speaker }&lt;/li&gt;\n      }\n      &lt;/ul&gt;\n    &lt;/div&gt;\n}\n&lt;/body&gt;&lt;/html&gt;\n(: -------- :)\n{\n\tfor $book in doc(\"books.xml\")//book\n        return\n\tif (contains($book/author/text(),\"Herbert\") or contains($book/author/text(),\"Asimov\"))\n\t\tthen $book\n\telse $book/text()\n\t\n\tlet $let := &lt;x&gt;\"test\"&lt;/x&gt;\n\treturn element element {\n\tattribute attribute { 1 },\n\telement test { 'a' },\n\tattribute foo { \"bar\" },\n\tfn:doc()[ foo/@bar eq $let ],\n\t//x }\n}\n(: -------- :)\n&lt;bib&gt;\n {\n  for $b in doc(\"http://bstore1.example.com/bib.xml\")/bib/book\n  where $b/publisher = \"Addison-Wesley\" and $b/@year &gt; 1991\n  return\n    &lt;book year=\"{ $b/@year }\"&gt;\n     { $b/title }\n    &lt;/book&gt;\n }\n&lt;/bib&gt;\n(: -------- :)\n</pre>\n\n<h1>Nemerle code</h1>\n<pre id=\"nemerle\" class=\"prettyprint lang-nemerle\">\nclass Set ['a]\n{\n  mutable storage : list ['a] = [];\n  public Add (e : 'a) : void\n  {\n    when (! Contains (e))\n      storage ::= e;\n  }\n  public Contains (e : 'a) : bool\n  {\n    storage.Contains (e)\n  }\n}\n \ndef s1 = Set ();\ns1.Add (3);\ns1.Add (42);\nassert (s1.Contains (3));\n// s1.Add (\"foo\"); // error here!\ndef s2 = Set ();\ns2.Add (\"foo\");\nassert (s2.Contains (\"foo\"));\n</pre>\n\n<h1>Tex support</h1>\n<pre id=\"latex\" class=\"prettyprint lang-tex\">% resume.tex\n% vim:set ft=tex spell:\n\\documentclass[10pt,letterpaper]{article}\n\\usepackage[letterpaper,margin=0.8in]{geometry}\n\\usepackage{mdwlist}\n\\usepackage[T1]{fontenc}\n\\usepackage{textcomp}\n\\pagestyle{empty}\n\\setlength{\\tabcolsep}{0em}\n</pre>\n\n<h1>Issue 144</h1>\nEscaped quotes in bash.\n<pre id=\"issue144\" class=\"prettyprint\">\n#! /bin/bash\n# toascii.sh\nfor i in $(echo $* | fold -w 1);do\n  printf \"%x \" \\'$i;\ndone;\necho\n</pre>\n\n<h1>Issue 145</h1>\n<pre id=\"issue145\" class=\"prettyprint\">\n&lt;script type=\"text/javascript\"&gt;\n&lt;!--\n        var target = $$.css('backgroundImage').replace(/^url[\\(\\)'\"]/g, '');\n\n        // nice long chain: wrap img element in span\n        $$.wrap('&lt;span style=\"position: relative;\"&gt;&lt;/span&gt;')\n--&gt;\n&lt;/script&gt;\n</pre>\n\n<h1>Clojure Syntax Highlighting</h1>\n<pre class=\"prettyprint lang-clj\" id=\"clojure\">\n; Clojure test comment\n(ns test\n (:gen-class))\n\n(def foo \"bar\")\n(defn bar [arg1 arg2 & args]\n  \"sample function\"\n  (for [arg args]\n    (prn arg)))\n\n(bar \"foo\" \"bar\" \"blah\" :baz)\n</pre>\n\n<h1>HTML 5 language on code</h1>\n<p>\nThe text is specified to be lisp by the class attribute.\nSemicolon is normally a valid punctuation character but\nin lisp it is a comment so should be colored as a comment\nif the className is being properly parsed.</p>\n<code class=\"prettyprint language-lisp\" id=\"html5conv1\">; foo</code>\n\n<h1>HTML 5 language on nested code element</h1>\n<p>The language is attached to a CODE element inside a PRE.</p>\n<pre class=\"prettyprint\" id=\"html5conv2\"\n><code class=\"language-lisp\">; foo</code></pre>\n\n<h1>HTML 5 language on nested code element not foiled by space</h1>\n<p>The language is attached to a CODE element inside a PRE and there\nis space between the PRE element's tags and CODE element's tags.</p>\n<pre class=\"prettyprint\" id=\"html5conv3\">\n<code class=\"language-lisp\">\n; foo\n</code>\n</pre>\n\n<h1>HTML 5 nested code element language ignored if not only content</h1>\n<p>The below is not treated as lisp despite there being a lisp\nlanguage specifier on the contained CODE element, the CODE element\ndoes not wrap all non-space content.</p>\n<pre class=\"prettyprint\" id=\"html5conv4\">\nbefore CODE\n<code class=\"language-lisp\">; foo</code>\n</pre>\n\n<p>The language is attached to an HTML5 comment that looks like an XML\nprocessing instruction.</p>\n<?prettify lang=lisp?>\n<pre class=\"prettyprint\" id=\"procinstr1\">; foo</pre>\n\n<p>The language is attached to a regular HTML5 comment that looks like an XML\nprocessing instruction.</p>\n<!--prettify linenums=4 lang=lisp-->\n<pre class=\"prettyprint\" id=\"procinstr2\">; foo</pre>\n\n<p>The language is attached to a regular HTML5 comment that looks like an XML\nprocessing instruction.</p>\n<!--prettify linenums=true lang=lisp-->\n<pre class=\"prettyprint\" id=\"procinstr3\">; foo</pre>\n\n<p>The language is attached to a regular HTML5 comment that looks like an XML\nprocessing instruction.</p>\n<!--prettify linenums=false lang=lisp-->\n<pre id=\"procinstr4\">; foo</pre>\n\n<h1>Issues 185 and 261: Don't reprettify prettified content</h1>\n<code class=\"prettyprint prettyprinted\" id=\"issue185\"\n><span class=\"str\">\"No tag backs.\"</span></code>\n\n<pre class=\"prettyprint prettyprinted linenums\" id=\"issue261\"\n><ol class=\"linenums\"><li class=\"L0\"><span class=\"str\">\"No tag backs.\"</span></li></ol></pre>\n\n<h1>Issue 201: C type not full word</h1>\n<code class=\"prettyprint lang-c\" id=\"issue201\"\n>static Persistent&lt;String&gt; listeners_symbol;</code>\n\n<h1>Pascal w/ language specified</h1>\n<pre class=\"prettyprint lang-pascal\" id=\"pascal_lang\">\n(* some comment here *)\nPROCEDURE TestCase.AssertEquals(msg:String; expect, act:Longint);\nVAR ex, ac:String;\nBEGIN\n  IF expect &lt;&gt; act THEN\n  BEGIN\n    Str(expect, ex);\n    Fail(Concat(msg,' expected ',ex,' but was ',ac));\n  END;\n\n  factors := new(ArrayListPtr, Init);\n\n  FOR candidate := 2 TO i DO\n  BEGIN\n    WHILE i MOD candidate = 0 DO\n    BEGIN\n      factors^.Add(candidate);\n      i := i DIV candidate;\n    END;\n  END;\nEND;\n</pre>\n\n<h1>BASIC w/ language specified</h1>\n<pre class=\"prettyprint lang-basic\" id=\"basic_lang\">\n200 REM ----- method teardown\n210 PRINT \"green\"\n220 RETURN\n470 IF af=0 THEN GOTO 520\n480 FOR j=1 TO af\n500 ac=pf(j) : me$=STR$(j)+\". factor\" : GOSUB 100\n510 NEXT\n530 RETURN\n1000 DATA \"one\", 1, 0\n</pre>\n\n<h1>Dart language handler</h1>\n<pre class=\"prettyprint lang-dart\" id=\"dart\">\npart of myLib;\n\npart 'something.dart';\n\nimport 'dart:math' as test show foo, bar;\n\nclass Point {\n  final num x, y;\n\n  Point(this.x, this.y);\n  Point.zero() : x = 0, y = 0;  // Named constructor\n                                // with an initializer list.\n\n  num distanceTo(Point other) {\n    var dx = x - other.x;\n    var dy = y - other.y;\n    return sqrt(dx * dx + dy * dy);\n  }\n}\n\n// This is a single-line comment.\n\n/*\nThis is a\nmultiline comment.\n*/\n\nmain() {\n  Point p = new Point(7, 12);\n  String thing = 'It\\'s awesome!';\n  String thing2 = '''\nThis is a test! \\'''\nThis is the end of the test''';\n  String thing3 = r\"\"\"\nThis is a raw\nmultiline string!\"\"\";\n  num x = 0x123ABC;\n  num y = 1.8e-12;\n  bool flag = false;\n  String raw = r\"This is a raw string, where \\n doesn't matter\";\n}\n</pre>\n\n<h1>TCL_lang</h1>\n<pre class=\"prettyprint lang-tcl\" id=\"tcl_lang\">#!/bin/tclsh\nproc fib {n} {\n    set a 0\n    set b 1\n    while {$n > 0} {\n        set tmp $a\n        set a [expr $a + $b]\n        set b $tmp\n        incr n -1\n    }\n    return $a\n}\n</pre>\n\n<h1>R, S language support</h1>\n<pre class=\"prettyprint lang-r\" id=\"r_lang\">\n### Example R script for syntax highlighting\n\n# This is a comment\n\n## Valid names\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV0123456789._a <- NULL\n.foo_ <- NULL\n._foo <- NULL\n\n## Invalid names\n0abc <- NULL\n.0abc <- NULL\nabc+cde <- NULL\n\n## Reserved Words\nNA\nNA_integer_\nNA_real_\nNA_character_\nNA_complex_\nNULL\nNaN\nInf\n## Not reserved\nNULLa <- NULL\nNULL1 <- NULL\nNULL. <- NULL\nNA_foo_ <- NULL\n\n## Numbers\n12345678901\n123456.78901\n123e3\n123E3\n1.23e-3\n1.23e3\n1.23e-3\n## integer constants\n123L\n1.23L\n## imaginary numbers\n123i\n-123i\n123e4i\n123e-4i\n## Hex numbers\n0xabcdefABCDEF01234\n0xabcp123\n0xabcP123\n## Not hex\n0xg\n\n## Special operators %xyz%\n## %xyz%\n1 %% 2\ndiag(2) %*% diag(2)\n1 %/% 2\n1 %in% 1:10\ndiag(2) %o% diag(2)\ndiag(2) %x% diag(2)\n`%foo bar%` <- function(x, y) x + y\n1 %foo bar% 2\n\n## Control Structures (3.2) and Function\n## if, else\nif (TRUE) print(\"foo\") else print(\"bar\")\n## For, in\nfor(i in 1:5) {\n    print(i)\n}\n## While, break\ni <- 1\nwhile (TRUE) {\n    i <- i + 1\n    if (i > 3) break\n}\n## Repeat\nrepeat {1+1}\n## Switch\nx <- 3\nswitch(x, 2+2, mean(1:10), rnorm(5))\n## Function, dot-dot-dot, return\nfoo <- function(...) {\n    return(sum(...))\n}\n# Not keywords\nfunctiona <- 2 + 2\nfunction. <- 2 + 2\nfunction1 <- 2 + 2\n\n\n## Grouping Tokens 10.3.7\n## Parentheses\n1 + (2 + 3)\n## brackets\nfoo <- function(a) {\n    a + 1\n}\n\n## Indexing 10.3.8\n## []\nbar <- 1:10\nbar[3]\n## [[]]\nfoo <- list(a=1, b=2, c=3)\nfoo[[\"a\"]]\n## $\nfoo$a\nfoo$\"a\"\n\n## Operators\n2 - 2\n2 + 2\n2 ~ 2\n! TRUE\n?\"help\"\n1:2\n2 * 2\n2 / 2\n2^2\n2 < 2\n2 > 2\n2 == 2\n2 >= 2\n2 <= 2\n2 != 2\nTRUE & FALSE\nTRUE && FALSE\nTRUE | FALSE\nTRUE || FALSE\nfoo <- 2 + 2\nfoo = 2 + 2\n2 + 2 -> foo\nfoo <<- 2 + 2\n2 + 2 ->> foo\nbase:::sum\nbase::sum\n\n## Strings\nfoo <- \"hello, world!\"\nfoo <- 'hello, world!'\nfoo <- \"Hello, 'world!\"\nfoo <- 'Hello, \"world!'\nfoo <- 'Hello, \\'world!\\''\nfoo <- \"Hello, \\\"world!\\\"\"\nfoo <- \"Hello,\nworld!\"\nfoo <- 'Hello,\nworld!'\n\n## Backtick strings\n`foo123 +!\"bar'baz` <- 2 + 2\n</pre>\n\n<h1>MUMPS</h1>\n<pre class=\"prettyprint lang-mumps\" id=\"mumps\">\nHDR ; -- prt/display header\n N X,I\n I '$D(VALMHDR) X:$G(VALM(\"HDR\"))]\"\" VALM(\"HDR\")\n ; -- prt hdr line\n W:'$D(VALMPG1) @IOF K VALMPG1\n W:VALMCC $C(13)_IOUON_$C(13)_IOINHI_$C(13)       ; -- turn on undln/hi\n I $E(IOST,1,2)=\"C-\" D IOXY^VALM4(0,0)            ; -- position cursor\n W $E(VALM(\"TITLE\"),1,30)                         ; -- prt title\n W:VALMCC IOINORM,IOUON                           ; -- turn off hi\n W $J(\"\",30-$L(VALM(\"TITLE\")))                    ; -- fill in w/blanks\n I $E(IOST,1,2)=\"C-\" W $C(13) D IOXY^VALM4(30,0)  ; -- position cursor\n W $J(\"\",((VALMWD-80)/2)),$$HTE^XLFDT($H,1),$J(\"\",10+((VALMWD-80)/2)),\"Page: \",$J(VALMPGE,4),\" of \",$J($$PAGE^VALM4(VALMCNT,VALM(\"LINES\")),4)_$S($D(VALMORE):\"+\",1:\" \") ; -- prt rest of hdr\n W:VALMCC IOUOFF I $E(IOST,1,2)=\"C-\" D IOXY^VALM4(0,0) ; -- turn off undln\n F I=1:1:VALM(\"TM\")-3 W !,$S('$D(VALMHDR(I)):\"\",$L(VALMHDR(I))>(VALMWD-1):$$EXTRACT^VALM4($G(VALMHDR(I))),1:VALMHDR(I)) ; -- prt hdr\n Q\n</pre>\n\n<h1>LLVM</h1>\n<a href=\"http://llvm.org/docs/LangRef.html\">Hello world module</a>\n<pre class=\"prettyprint lang-llvm\" id=\"llvm\">\n; Declare the string constant as a global constant.\n@.str = private unnamed_addr constant [13 x i8] c\"hello world\\0A\\00\"\n\n; External declaration of the puts function\ndeclare i32 @puts(i8* nocapture) nounwind\n\n; Definition of main function\ndefine i32 @main() {   ; i32()*\n  ; Convert [13 x i8]* to i8  *...\n  %cast210 = getelementptr [13 x i8]* @.str, i64 0, i64 0\n\n  ; Call puts function to write out the string to stdout.\n  call i32 @puts(i8* %cast210)\n  ret i32 0\n}\n\n; Named metadata\n!1 = metadata !{i32 42}\n!foo = !{!1, null}\n</pre>\n\n<h1>Issue 217 : Regex following '!'</h1>\n<pre id=\"issue217\" class=\"prettyprint lang-js\">\nif(!/^https?:\\/\\//i.test(val) &amp;&amp; foo == 'bar') {\n    val = 'http://' + val;\n}\n</pre>\n\n<h1>Issue 32 : Matlab</h1>\n<pre id=\"matlab\" class=\"prettyprint lang-matlab\">\n%%%%%%%%%%%%%%%%%% DATA TYPES %%%%%%%%%%%%%%%%%%\n\nv = [1,2,3;4,5,6];\nv(v&gt;4) = 0;\n\ns = struct('key',1, 'key2','string');\ns.key = 2;\n\nC = cell(1,2);\nC{1,1} = 0:9;\n\ndouble(1)\nsingle(1)\nuint8(1)\nint8(1)\n\n%%%%%%%%%%%%%%%%%% STRINGS &amp; TRANSPOSE %%%%%%%%%%%%%%%%%%\n\nplot(data');\nlegend(labels)\n\nstr = 'asdasd';     % this is a string\nstr = 'asdas';\nstr = 'sdasd''sdasd';\n\nstr = ['one' 'two' 'three'];\nstr = strcat('one', 'two', 'three');\n\n% matrix transpose\nM = rand(3,3)';\nx = M.';\nx = [10 20; 30, 40]';\ndisp(x')\nfprintf('%d\\n', x(:)')      % with comment\n{1,2}'                      % another comment\n\n%%%%%%%%%%%%%%%%%% LINE CONTINUATION %%%%%%%%%%%%%%%%%%\n\n[1 20; ...\n30 4]\n\n['gdgsd'...\n'sdfs']\n\n{...\n'sdasd' ;\n'asdsad'}\n\n%%%%%%%%%%%%%%%%%% SYSTEM COMMANDS %%%%%%%%%%%%%%%%%%\n\n!touch file.txt\n\n%%%%%%%%%%%%%%%%%% COMMAND OUTPUT %%%%%%%%%%%%%%%%%%\n\n&gt;&gt; 1+1\nans =\n     2\n\n&gt;&gt; 1+1\n\nans =\n\n     2\n\n%%%%%%%%%%%%%%%%%% KEYWORDS %%%%%%%%%%%%%%%%%%\n\nfunction ret = fcn(in)\n\tret = sum(in.^2);\nend\n\nclassdef CC &lt; handle\n\tproperties (SetAccess = public)\n\t\tx = 0;\n\tend\n\tmethods\n\t\tfunction this = CC(varargin)\n\t\t\tthis.x = 9;\n\t\tend\n\tend\nend\n\nx = [];\nparfor i=1:10\n\tx[i] = i;\nend\n\ntrue ~= false\n\nif x==1\n\ttrue\nelseif\n\tfalse\nelse\n\treturn\nend\n\nwhile true\n\tcontinue\n\tbreak\nend\n\ntry\n\terror('aa:aa', 'asdasd')\ncatch ME\n\twarning(ME)\nend\n\nswitch x\n\tcase 1\n\t\tdisp(1)\n\totherwise\n\t\t0\nend\n\n%%%%%%%%%%%%%%%%%% NUM LITERALS %%%%%%%%%%%%%%%%%%\n\n1\n1.\n.1\n1.0\n-1\n-1.\n-.1\n-1.0\n+10\n+01.\n+.1\n+1.0\n1e1\n1e-1\n1.e1\n1.e-1\n1.0e1\n1.0e-1\n.1e1\n.1e-1\n-.1e+1\n+1.e-1\n\n1i\n.10j\n-1.001i\n+1e-100j\n-.10e-01i\n\n% unary vs binary operators\n1+1\n1+ 1\n1 +1\n1 + 1\n+1+1\n+1+ 1\n+1 +1\n+1 + 1\n\n%%%%%%%%%%%%%%%%%% COMMENTS %%%%%%%%%%%%%%%%%%\n\n% % comment % %\n   % comment\n% comment\n%# comment\n%% comment\n%#x = sum(x);\n\n%{\nblock comment\n%}\n\n%{\n%}\n\n%{\n\n%}\n\n%{\n1\n2\n%}\n\n%{\n% sdf {}\nsdf\n%asda{}\nsfds\n%}\n\n    %{\ndsf\n        %}\n\n%{%}\n\n%{ zzz=10; %}\n\n%{%x=10;%}\n\n%{  x\na=10;\n%}\n\n%{\n%a=10;\n%}   x\n\n% nested block comments fail\n%{\ndfsdf\n%{\nxxx\n%}\ndfsdf\n%}\n\n% fails here!\n%{\nx=10;\n%%{\n%%}\ny=20;\n%}\n</pre>\n\n</body>\n\n<script type=\"text/javascript\">\n/**\n * maps ids of rewritten code to the expected output.\n * For brevity, <span class=\"foo\"> has been changed to `FOO and close span tags\n * have been changed to `END.\n */\nvar goldens = {\n  xquery: (\n        '`COM(: \\n' +\n        '\\tTook some of Mike Brevoort\\'s xquery code samples because they are nice and show common xquery syntax \\n' +\n        ':)`END`PLN\\n' +\n        ' \\n' +\n        '  `END`COM(:~\\n' +\n        '   : Given a sequence of version URIs, publish all of these versions of each document\\n' +\n        '   : If there is a version of the same document already published, unpublish it 1st\\n' +\n        '   :\\n' +\n        '   : When \"publish\" is referred to, we mean that it is put into the PUBLISHED collection\\n' +\n        '   : unpublish removes content from this collection\\n' +\n        '   : @param $version_uris - sequence of uris of versions of managed documents to publish\\n' +\n        '   :)`END`PLN\\n' +\n        '  `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:publish(`END<span class=\"var pln\">$version_uris`END`PLN `END`KWDas`END`PLN `END`KWDitem`END`PLN()*) {\\n' +\n        '      `END`KWDfor`END`PLN `END<span class=\"var pln\">$uri`END`PLN `END`KWDin`END`PLN `END<span class=\"var pln\">$version_uris`END`PLN\\n' +\n        '      `END`KWDlet`END`PLN `END<span class=\"var pln\">$doc`END`PLN := `END<span class=\"fun pln\">fn:doc`END`PLN(`END<span class=\"var pln\">$uri`END`PLN)\\n' +\n        '      `END`KWDlet`END`PLN `END<span class=\"var pln\">$managed_base_uri`END`PLN := `END<span class=\"var pln\">$doc`END`PLN/`END`KWDnode`END`PLN()/property::dls:version/dls:document-uri/`END`KWDtext`END`PLN()\\n' +\n        '      `END`KWDlet`END`PLN `END<span class=\"var pln\">$existing`END`PLN :=  comoms-dls:publishedDoc(`END<span class=\"var pln\">$managed_base_uri`END`PLN)\\n' +\n        '      `END`KWDlet`END`PLN `END<span class=\"var pln\">$unpublishExisting`END`PLN := `END`KWDif`END`PLN(`END<span class=\"var pln\">$existing`END`PLN) `END`KWDthen`END`PLN comoms-dls:unpublishVersion((`END<span class=\"fun pln\">xdmp:node-uri`END`PLN(`END<span class=\"var pln\">$existing`END`PLN)))  `END`KWDelse`END`PLN ()\\n' +\n        '      `END`KWDlet`END`PLN `END<span class=\"var pln\">$addPermissions`END`PLN := `END<span class=\"fun pln\">dls:document-add-permissions`END`PLN(`END<span class=\"var pln\">$uri`END`PLN, (`END<span class=\"fun pln\">xdmp:permission`END`PLN(`END`STR\\'mkp-anon\\'`END`PLN, `END`STR\\'read\\'`END`PLN)))\\n' +\n        '      `END`KWDreturn`END`PLN\\n' +\n        '          `END<span class=\"fun pln\">dls:document-add-collections`END`PLN(`END<span class=\"var pln\">$uri`END`PLN, (`END`STR\"PUBLISHED\"`END`PLN))    \\n' +\n        '  };\\n' +\n        ' \\n' +\n        '  `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:publishLatest(`END<span class=\"var pln\">$uri`END`PLN) {\\n' +\n        '      `END`COM(: TODO check if it\\'s in the draft collection probably :)`END`PLN\\n' +\n        ' \\n' +\n        '      `END`KWDlet`END`PLN `END<span class=\"var pln\">$latest_version_uri`END`PLN := comoms-dls:latestVersionUri(`END<span class=\"var pln\">$uri`END`PLN)\\n' +\n        '      `END`KWDlet`END`PLN `END<span class=\"var pln\">$log`END`PLN:= `END<span class=\"fun pln\">xdmp:log`END`PLN(`END<span class=\"fun pln\">fn:concat`END`PLN(`END`STR\"latest: \"`END`PLN, `END<span class=\"var pln\">$latest_version_uri`END`PLN))    \\n' +\n        '      `END`KWDlet`END`PLN `END<span class=\"var pln\">$log`END`PLN:= `END<span class=\"fun pln\">xdmp:log`END`PLN(`END<span class=\"fun pln\">fn:concat`END`PLN(`END`STR\"uri: \"`END`PLN, `END<span class=\"var pln\">$uri`END`PLN))            \\n' +\n        '      `END`KWDreturn`END`PLN comoms-dls:publish(`END<span class=\"var pln\">$latest_version_uri`END`PLN)    \\n' +\n        ' \\n' +\n        '  };\\n' +\n        ' \\n' +\n        '  `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:latestVersionUri(`END<span class=\"var pln\">$uri`END`PLN) {\\n' +\n        '      `END`KWDlet`END`PLN `END<span class=\"var pln\">$latest_version_num`END`PLN :=\\n' +\n        '          (\\n' +\n        '          `END`KWDfor`END`PLN `END<span class=\"var pln\">$version`END`PLN `END`KWDin`END`PLN `END<span class=\"fun pln\">dls:document-history`END`PLN(`END<span class=\"var pln\">$uri`END`PLN)/dls:version\\n' +\n        '          `END`KWDorder`END`PLN `END`KWDby`END`PLN `END<span class=\"fun pln\">fn:number`END`PLN(`END<span class=\"var pln\">$version`END`PLN//dls:version-id/`END`KWDtext`END`PLN()) `END`KWDdescending`END`PLN\\n' +\n        '          `END`KWDreturn`END`PLN `END<span class=\"var pln\">$version`END`PLN//dls:version-id/`END`KWDtext`END`PLN()\\n' +\n        '          )[1]\\n' +\n        ' \\n' +\n        ' \\n' +\n        '      `END`KWDreturn`END`PLN `END<span class=\"fun pln\">dls:document-version-uri`END`PLN(`END<span class=\"var pln\">$uri`END`PLN, `END<span class=\"var pln\">$latest_version_num`END`PLN)\\n' +\n        '  };\\n' +\n        ' \\n' +\n        '  `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:unpublish(`END<span class=\"var pln\">$uris`END`PLN `END`KWDas`END`PLN `END`KWDitem`END`PLN()*) {\\n' +\n        '      `END`KWDfor`END`PLN `END<span class=\"var pln\">$uri`END`PLN `END`KWDin`END`PLN `END<span class=\"var pln\">$uris`END`PLN\\n' +\n        '      `END`KWDreturn`END`PLN\\n' +\n        '          `END`KWDlet`END`PLN `END<span class=\"var pln\">$published_doc`END`PLN := comoms-dls:publishedDoc(`END<span class=\"var pln\">$uri`END`PLN)\\n' +\n        '          `END`KWDreturn`END`PLN\\n' +\n        '              `END`KWDif`END`PLN(`END<span class=\"var pln\">$published_doc`END`PLN) `END`KWDthen`END`PLN\\n' +\n        '                  `END`KWDlet`END`PLN `END<span class=\"var pln\">$published_version_uri`END`PLN := `END<span class=\"fun pln\">xdmp:node-uri`END`PLN(`END<span class=\"var pln\">$published_doc`END`PLN)\\n' +\n        '                  `END`KWDreturn`END`PLN comoms-dls:unpublishVersion(`END<span class=\"var pln\">$published_version_uri`END`PLN)        \\n' +\n        '              `END`KWDelse`END`PLN\\n' +\n        '                  ()\\n' +\n        '  };\\n' +\n        ' \\n' +\n        '  `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:latestPublishedDocAuthor(`END<span class=\"var pln\">$uri`END`PLN) {\\n' +\n        '      `END`KWDlet`END`PLN `END<span class=\"var pln\">$author_id`END`PLN := `END<span class=\"fun pln\">doc`END`PLN(`END<span class=\"var pln\">$uri`END`PLN)/property::dls:version/dls:author/`END`KWDtext`END`PLN()\\n' +\n        '      `END`KWDreturn`END`PLN\\n' +\n        '          `END`KWDif`END`PLN(`END<span class=\"var pln\">$author_id`END`PLN) `END`KWDthen`END`PLN\\n' +\n        '              comoms-user:getUsername(`END<span class=\"var pln\">$author_id`END`PLN)\\n' +\n        '          `END`KWDelse`END`PLN\\n' +\n        '              ()\\n' +\n        ' \\n' +\n        '  };\\n' +\n        ' \\n' +\n        '  `END`COM(:~\\n' +\n        '   : Given a sequence of version URIs, unpublish all of these versions of each document\\n' +\n        '   :)`END`PLN\\n' +\n        '  `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:unpublishVersion(`END<span class=\"var pln\">$version_uris`END`PLN `END`KWDas`END`PLN `END`KWDitem`END`PLN()*) {\\n' +\n        '      `END`KWDfor`END`PLN `END<span class=\"var pln\">$uri`END`PLN `END`KWDin`END`PLN `END<span class=\"var pln\">$version_uris`END`PLN\\n' +\n        '      `END`KWDreturn`END`PLN\\n' +\n        '          `END`KWDlet`END`PLN `END<span class=\"var pln\">$removePermissions`END`PLN := `END<span class=\"fun pln\">dls:document-remove-permissions`END`PLN(`END<span class=\"var pln\">$uri`END`PLN, (`END<span class=\"fun pln\">xdmp:permission`END`PLN(`END`STR\\'mkp-anon\\'`END`PLN, `END`STR\\'read\\'`END`PLN)))\\n' +\n        '          `END`KWDreturn`END`PLN `END<span class=\"fun pln\">dls:document-remove-collections`END`PLN(`END<span class=\"var pln\">$uri`END`PLN, (`END`STR\"PUBLISHED\"`END`PLN))        \\n' +\n        '  };\\n' +\n        ' \\n' +\n        '  `END`COM(:~\\n' +\n        '   : Given the base URI of a managed piece of content, return the document of the node\\n' +\n        '   : of the version that is published\\n' +\n        '   :)`END`PLN\\n' +\n        '  `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:publishedDoc(`END<span class=\"var pln\">$uri`END`PLN) {\\n' +\n        '      `END<span class=\"fun pln\">fn:collection`END`PLN(`END`STR\"PUBLISHED\"`END`PLN)[property::dls:version/dls:document-uri = `END<span class=\"var pln\">$uri`END`PLN]\\n' +\n        '  };\\n' +\n        ' \\n' +\n        ' \\n' +\n        '  `END`COM(:~\\n' +\n        '   : Test if any version of the managed document is published\\n' +\n        '   :)`END`PLN\\n' +\n        '  `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:isPublished(`END<span class=\"var pln\">$uri`END`PLN) {\\n' +\n        '      `END`KWDif`END`PLN( comoms-dls:publishedDoc(`END<span class=\"var pln\">$uri`END`PLN)) `END`KWDthen`END`PLN\\n' +\n        '          `END<span class=\"fun pln\">fn:true`END`PLN()\\n' +\n        '      `END`KWDelse`END`PLN\\n' +\n        '          `END<span class=\"fun pln\">fn:false`END`PLN()\\n' +\n        '  };\\n' +\n        ' \\n' +\n        ' \\n' +\n        '  `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:publishedState(`END<span class=\"var pln\">$uri`END`PLN) {\\n' +\n        '      `END`KWDlet`END`PLN `END<span class=\"var pln\">$doc`END`PLN := comoms-dls:publishedDoc(`END<span class=\"var pln\">$uri`END`PLN)\\n' +\n        '      `END`KWDlet`END`PLN `END<span class=\"var pln\">$published_uri`END`PLN := `END`KWDif`END`PLN(`END<span class=\"var pln\">$doc`END`PLN) `END`KWDthen`END`PLN `END<span class=\"fun pln\">xdmp:node-uri`END`PLN(`END<span class=\"var pln\">$doc`END`PLN) `END`KWDelse`END`PLN ()\\n' +\n        '      `END`KWDlet`END`PLN `END<span class=\"var pln\">$latest`END`PLN := comoms-dls:latestVersionUri(`END<span class=\"var pln\">$uri`END`PLN)\\n' +\n        '      `END`KWDreturn`END`PLN\\n' +\n        '          `END`KWDif`END`PLN(`END<span class=\"var pln\">$doc`END`PLN) `END`KWDthen`END`PLN\\n' +\n        '              `END`KWDif`END`PLN(`END<span class=\"var pln\">$latest`END`PLN ne `END<span class=\"var pln\">$published_uri`END`PLN) `END`KWDthen`END`PLN\\n' +\n        '                  `END`STR\"stale\"`END`PLN\\n' +\n        '              `END`KWDelse`END`PLN\\n' +\n        '                  `END`STR\"published\"`END`PLN\\n' +\n        '          `END`KWDelse`END`PLN\\n' +\n        '              `END`STR\"unpublished\"`END`PLN\\n' +\n        '  };\\n' +\n        ' \\n' +\n        ' \\n' +\n        '  `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:getManagedDocUri(`END<span class=\"var pln\">$uri`END`PLN) {\\n' +\n        '      `END`KWDlet`END`PLN `END<span class=\"var pln\">$doc`END`PLN := `END<span class=\"fun pln\">fn:doc`END`PLN(`END<span class=\"var pln\">$uri`END`PLN)\\n' +\n        '      `END`KWDlet`END`PLN `END<span class=\"var pln\">$managed_uri`END`PLN := `END<span class=\"var pln\">$doc`END`PLN/property::dls:version/dls:document-uri/`END`KWDtext`END`PLN()\\n' +\n        '      `END`KWDlet`END`PLN `END<span class=\"var pln\">$managed_uri`END`PLN := `END`KWDif`END`PLN(`END<span class=\"var pln\">$managed_uri`END`PLN) `END`KWDthen`END`PLN `END<span class=\"var pln\">$managed_uri`END`PLN `END`KWDelse`END`PLN `END<span class=\"var pln\">$uri`END`PLN\\n' +\n        '      `END`KWDreturn`END`PLN `END<span class=\"var pln\">$managed_uri`END`PLN\\n' +\n        '  };\\n' +\n        ' \\n' +\n        '  `END`COM(:~\\n' +\n        '   : Given a manage content url (e.g. /content/123456.xml) return the appropriate\\n' +\n        '   : version of the document based on what stage collection is being viewed and\\n' +\n        '   : what\\'s published\\n' +\n        '   :\\n' +\n        '   : @param $uri a manage content url (e.g. /content/123456.xml) - NOT A VERSIONED URI\\n' +\n        '   :)`END`PLN\\n' +\n        '  `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:doc(`END<span class=\"var pln\">$uri`END`PLN) {\\n' +\n        '      `END`KWDlet`END`PLN `END<span class=\"var pln\">$doc`END`PLN := `END<span class=\"fun pln\">fn:root`END`PLN(comoms-dls:collection()[property::dls:version/dls:document-uri = `END<span class=\"var pln\">$uri`END`PLN][1])\\n' +\n        '      `END`KWDreturn`END`PLN\\n' +\n        '          `END`KWDif`END`PLN(`END<span class=\"var pln\">$doc`END`PLN) `END`KWDthen`END`PLN\\n' +\n        '              `END<span class=\"var pln\">$doc`END`PLN\\n' +\n        '          `END`KWDelse`END`PLN\\n' +\n        '              `END`KWDlet`END`PLN `END<span class=\"var pln\">$managedDocInCollection`END`PLN := comoms-dls:collection-name() = `END<span class=\"fun pln\">xdmp:document-get-collections`END`PLN(`END<span class=\"var pln\">$uri`END`PLN)\\n' +\n        '              `END`KWDreturn`END`PLN\\n' +\n        '                  `END`KWDif`END`PLN(`END<span class=\"var pln\">$managedDocInCollection`END`PLN) `END`KWDthen`END`PLN\\n' +\n        '                      `END<span class=\"fun pln\">fn:doc`END`PLN(`END<span class=\"var pln\">$uri`END`PLN)\\n' +\n        '                  `END`KWDelse`END`PLN\\n' +\n        '                      ()\\n' +\n        '  };\\n' +\n        ' \\n' +\n        '  `END`COM(:~\\n' +\n        '   : Get the collection to be used when querying for content\\n' +\n        '   : THIS or comoms-dls:collection-name() SHOULD BE USED WHEN BUILDING ANY QUERY FOR MANAGED CONTENT\\n' +\n        '   :)`END`PLN\\n' +\n        '  `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:collection()  {\\n' +\n        '      `END<span class=\"fun pln\">fn:collection`END`PLN( comoms-dls:collection-name() )\\n' +\n        '  };\\n' +\n        ' \\n' +\n        '  `END`COM(:~\\n' +\n        '   : Get the collection nameto be used when querying for content\\n' +\n        '   : THIS or comoms-dls:collection() SHOULD BE USED WHEN BUILDING ANY QUERY FOR MANAGED CONTENT\\n' +\n        '   :)`END`PLN\\n' +\n        '  `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:collection-name() `END`KWDas`END`PLN `END`TYPxs:string`END`PLN {\\n' +\n        '      `END`KWDlet`END`PLN `END<span class=\"var pln\">$default_collection`END`PLN := `END`STR\"PUBLISHED\"`END`PLN\\n' +\n        '      `END`KWDreturn`END`PLN\\n' +\n        '          `END`KWDif`END`PLN(comoms-user:isAdmin()) `END`KWDthen`END`PLN\\n' +\n        '              `END`KWDlet`END`PLN `END<span class=\"var pln\">$pub_stage_collection_cookie`END`PLN := comoms-util:getCookie(`END`STR\"COMOMS_COLLECTION\"`END`PLN)\\n' +\n        '              `END`KWDreturn`END`PLN\\n' +\n        '                  `END`KWDif`END`PLN(`END<span class=\"var pln\">$pub_stage_collection_cookie`END`PLN) `END`KWDthen`END`PLN\\n' +\n        '                      `END<span class=\"var pln\">$pub_stage_collection_cookie`END`PLN\\n' +\n        '                  `END`KWDelse`END`PLN\\n' +\n        '                      `END<span class=\"var pln\">$default_collection`END`PLN\\n' +\n        '          `END`KWDelse`END`PLN\\n' +\n        '              `END<span class=\"var pln\">$default_collection`END`PLN\\n' +\n        '  };\\n' +\n        ' \\n' +\n        '  `END`COM(:~\\n' +\n        '   : Check if the published collection is being viewed\\n' +\n        '   :)`END`PLN\\n' +\n        '  `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:isViewingPublished() {\\n' +\n        '      `END`KWDif`END`PLN(comoms-dls:collection-name() = `END`STR\"PUBLISHED\"`END`PLN) `END`KWDthen`END`PLN\\n' +\n        '          `END<span class=\"fun pln\">fn:true`END`PLN()\\n' +\n        '      `END`KWDelse`END`PLN\\n' +\n        '          `END<span class=\"fun pln\">fn:false`END`PLN()\\n' +\n        '  };\\n' +\n        ' \\n' +\n        '  `END`COM(:~\\n' +\n        '   : Get the best URL for the content URI.\\n' +\n        '   : This is either the default URI based on detail type or should also take\\n' +\n        '   : into account friendly urls and navigation structures to figure out the\\n' +\n        '   : best choice\\n' +\n        '   :)`END`PLN\\n' +\n        '  `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:contentUrl(`END<span class=\"var pln\">$uri`END`PLN) {\\n' +\n        ' \\n' +\n        '      `END`COM(: TODO: add friendly URL and nav structure logic 1st :)`END`PLN\\n' +\n        ' \\n' +\n        '      `END`KWDlet`END`PLN `END<span class=\"var pln\">$doc`END`PLN := `END<span class=\"fun pln\">fn:doc`END`PLN(`END<span class=\"var pln\">$uri`END`PLN)\\n' +\n        '      `END`KWDlet`END`PLN `END<span class=\"var pln\">$managedDocUri`END`PLN := `END<span class=\"var pln\">$doc`END`PLN/property::dls:version/dls:document-uri\\n' +\n        '      `END`KWDlet`END`PLN `END<span class=\"var pln\">$uri`END`PLN := `END`KWDif`END`PLN(`END<span class=\"var pln\">$managedDocUri`END`PLN) `END`KWDthen`END`PLN `END<span class=\"var pln\">$managedDocUri`END`PLN `END`KWDelse`END`PLN `END<span class=\"var pln\">$uri`END`PLN\\n' +\n        '      `END`KWDlet`END`PLN `END<span class=\"var pln\">$type`END`PLN := `END<span class=\"var pln\">$doc`END`PLN/`END`KWDnode`END`PLN()/`END<span class=\"fun pln\">fn:name`END`PLN()\\n' +\n        '      `END`KWDlet`END`PLN `END<span class=\"var pln\">$content_id`END`PLN := `END<span class=\"fun pln\">fn:tokenize`END`PLN( `END<span class=\"fun pln\">fn:tokenize`END`PLN(`END<span class=\"var pln\">$uri`END`PLN, `END`STR\"/\"`END`PLN)[3], `END`STR\"\\\\.\"`END`PLN)[1]\\n' +\n        '      `END`KWDreturn`END`PLN\\n' +\n        '          `END<span class=\"fun pln\">fn:concat`END`PLN(`END`STR\"/\"`END`PLN, `END<span class=\"var pln\">$type`END`PLN, `END`STR\"/\"`END`PLN, `END<span class=\"var pln\">$content_id`END`PLN)\\n' +\n        '  };\\n' +\n        ' \\n' +\n        '  `END`COM(:\\n' +\n        '   :\\n' +\n        '   :  gets list of doc versions and uri.\\n' +\n        '   :\\n' +\n        '   :)`END`PLN\\n' +\n        '  `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:versionHistory(`END<span class=\"var pln\">$uri`END`PLN) {\\n' +\n        '      `END`KWDlet`END`PLN `END<span class=\"var pln\">$published_doc`END`PLN := comoms-dls:publishedDoc(`END<span class=\"var pln\">$uri`END`PLN)\\n' +\n        '      `END`KWDlet`END`PLN `END<span class=\"var pln\">$published_uri`END`PLN := `END`KWDif`END`PLN(`END<span class=\"var pln\">$published_doc`END`PLN) `END`KWDthen`END`PLN `END<span class=\"fun pln\">xdmp:node-uri`END`PLN(`END<span class=\"var pln\">$published_doc`END`PLN) `END`KWDelse`END`PLN ()\\n' +\n        '      `END`KWDreturn`END`PLN\\n' +\n        '      `END`TAG&lt;versions&gt;`END`PLN\\n' +\n        '          {\\n' +\n        '          `END`KWDfor`END`PLN `END<span class=\"var pln\">$version`END`PLN `END`KWDin`END`PLN `END<span class=\"fun pln\">dls:document-history`END`PLN(`END<span class=\"var pln\">$uri`END`PLN)/dls:version\\n' +\n        '            `END`KWDlet`END`PLN `END<span class=\"var pln\">$version_num`END`PLN := `END<span class=\"var pln\">$version`END`PLN/dls:version-id/`END`KWDtext`END`PLN()\\n' +\n        '            `END`KWDlet`END`PLN `END<span class=\"var pln\">$created`END`PLN := `END<span class=\"var pln\">$version`END`PLN/dls:created/`END`KWDtext`END`PLN()\\n' +\n        '            `END`KWDlet`END`PLN `END<span class=\"var pln\">$author_id`END`PLN := `END<span class=\"var pln\">$version`END`PLN/dls:author/`END`KWDtext`END`PLN()\\n' +\n        '            `END`KWDlet`END`PLN `END<span class=\"var pln\">$author`END`PLN := comoms-user:getUsername(`END<span class=\"var pln\">$author_id`END`PLN)\\n' +\n        ' \\n' +\n        ' \\n' +\n        '            `END`KWDlet`END`PLN `END<span class=\"var pln\">$note`END`PLN := `END<span class=\"var pln\">$version`END`PLN/dls:annotation/`END`KWDtext`END`PLN()\\n' +\n        '            `END`KWDlet`END`PLN `END<span class=\"var pln\">$version_uri`END`PLN := `END<span class=\"fun pln\">xdmp:node-uri`END`PLN(`END<span class=\"fun pln\">dls:document-version`END`PLN(`END<span class=\"var pln\">$uri`END`PLN, `END<span class=\"var pln\">$version_num`END`PLN))\\n' +\n        '            `END`KWDlet`END`PLN `END<span class=\"var pln\">$published`END`PLN := `END<span class=\"var pln\">$published_uri`END`PLN `END`KWDeq`END`PLN `END<span class=\"var pln\">$version_uri`END`PLN\\n' +\n        '            `END`KWDreturn`END`PLN\\n' +\n        '              `END`TAG&lt;version&gt;`END`PLN\\n' +\n        '                  `END`TAG&lt;version-number&gt;`END`PLN{`END<span class=\"var pln\">$version_num`END`PLN}`END`TAG&lt;/version-number&gt;`END`PLN\\n' +\n        '                  `END`TAG&lt;created&gt;`END`PLN{`END<span class=\"var pln\">$created`END`PLN}`END`TAG&lt;/created&gt;`END`PLN                \\n' +\n        '                  `END`TAG&lt;author&gt;`END`PLN{`END<span class=\"var pln\">$author`END`PLN}`END`TAG&lt;/author&gt;`END`PLN\\n' +\n        '                  `END`TAG&lt;published&gt;`END`PLN{`END<span class=\"var pln\">$published`END`PLN}`END`TAG&lt;/published&gt;`END`PLN\\n' +\n        '                  `END`TAG&lt;version-uri&gt;`END`PLN{`END<span class=\"var pln\">$version_uri`END`PLN}`END`TAG&lt;/version-uri&gt;`END`PLN\\n' +\n        '              `END`TAG&lt;/version&gt;`END`PLN  \\n' +\n        '          }        \\n' +\n        '      `END`TAG&lt;/versions&gt;`END`PLN\\n' +\n        '  };\\n' +\n        ' \\n' +\n        ' \\n' +\n        ' \\n' +\n        ' \\n' +\n        ' \\n' +\n        ' \\n' +\n        '  `END`COM(: ########################################################################### :)`END`PLN\\n' +\n        '  `END`COM(: PRIVATE FUNCTIONS :)`END`PLN\\n' +\n        '  `END`COM(: ########################################################################### :)`END`PLN\\n' +\n        ' \\n' +\n        '  `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:_import() {\\n' +\n        '      `END`STR\"xquery version \\'1.0-ml\\';\\n' +\n        '       import module namespace dls = \\'http://marklogic.com/xdmp/dls\\' at \\'/MarkLogic/dls.xqy\\'; \"`END`PLN\\n' +\n        '  };  \\n' +\n        ' \\n' +\n        '`END`COM(: ----\\n' +\n        '---- :)`END`PLN\\n' +\n        '`END`KWDxquery`END`PLN `END`KWDversion`END`PLN `END`STR\\'1.0-ml\\'`END`PLN;\\n' +\n        '`END`KWDdeclare`END`PLN `END`KWDvariable`END`PLN `END<span class=\"var pln\">$URI`END`PLN `END`KWDas`END`PLN `END`TYPxs:string`END`PLN `END`KWDexternal`END`PLN;\\n' +\n        ' \\n' +\n        '`END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN local:document-move-forest(`END<span class=\"var pln\">$uri`END`PLN `END`KWDas`END`PLN `END`TYPxs:string`END`PLN, `END<span class=\"var pln\">$forest-ids`END`PLN `END`KWDas`END`PLN `END`TYPxs:unsignedLong`END`PLN*)\\n' +\n        '{\\n' +\n        '  `END<span class=\"fun pln\">xdmp:document-insert`END`PLN(\\n' +\n        '    `END<span class=\"var pln\">$uri`END`PLN,\\n' +\n        '    `END<span class=\"fun pln\">fn:doc`END`PLN(`END<span class=\"var pln\">$uri`END`PLN),\\n' +\n        '    `END<span class=\"fun pln\">xdmp:document-get-permissions`END`PLN(`END<span class=\"var pln\">$uri`END`PLN),\\n' +\n        '    `END<span class=\"fun pln\">xdmp:document-get-collections`END`PLN(`END<span class=\"var pln\">$uri`END`PLN),\\n' +\n        '    `END<span class=\"fun pln\">xdmp:document-get-quality`END`PLN(`END<span class=\"var pln\">$uri`END`PLN),\\n' +\n        '    `END<span class=\"var pln\">$forest-ids`END`PLN\\n' +\n        '  )\\n' +\n        '};\\n' +\n        ' \\n' +\n        '`END`KWDlet`END`PLN `END<span class=\"var pln\">$xml`END`PLN :=\\n' +\n        '  `END`TAG&lt;xml`END`PLN att=`END`STR\"blah\"`END`PLN att2=`END`STR\"blah\"`END`TAG&gt;`END`PLN\\n' +\n        '    sdasd`END`TAG&lt;b&gt;`END`PLNasdasd`END`TAG&lt;/b&gt;`END`PLN\\n' +\n        '  `END`TAG&lt;/xml&gt;`END`PLN\\n' +\n        '`END`COM(: -------- :)`END`PLN\\n' +\n        '`END`KWDfor`END`PLN `END<span class=\"var pln\">$d`END`PLN `END`KWDin`END`PLN `END<span class=\"fun pln\">fn:doc`END`PLN(`END`STR\"depts.xml\"`END`PLN)/depts/deptno\\n' +\n        '`END`KWDlet`END`PLN `END<span class=\"var pln\">$e`END`PLN := `END<span class=\"fun pln\">fn:doc`END`PLN(`END`STR\"emps.xml\"`END`PLN)/emps/emp[deptno = `END<span class=\"var pln\">$d`END`PLN]\\n' +\n        '`END`KWDwhere`END`PLN `END<span class=\"fun pln\">fn:count`END`PLN(`END<span class=\"var pln\">$e`END`PLN) &gt;= 10\\n' +\n        '`END`KWDorder`END`PLN `END`KWDby`END`PLN `END<span class=\"fun pln\">fn:avg`END`PLN(`END<span class=\"var pln\">$e`END`PLN/salary) `END`KWDdescending`END`PLN\\n' +\n        '`END`KWDreturn`END`PLN\\n' +\n        '   `END`TAG&lt;big-dept&gt;`END`PLN\\n' +\n        '      {\\n' +\n        '      `END<span class=\"var pln\">$d`END`PLN,\\n' +\n        '      `END`TAG&lt;headcount&gt;`END`PLN{`END<span class=\"fun pln\">fn:count`END`PLN(`END<span class=\"var pln\">$e`END`PLN)}`END`TAG&lt;/headcount&gt;`END`PLN,\\n' +\n        '      `END`TAG&lt;avgsal&gt;`END`PLN{`END<span class=\"fun pln\">fn:avg`END`PLN(`END<span class=\"var pln\">$e`END`PLN/salary)}`END`TAG&lt;/avgsal&gt;`END`PLN\\n' +\n        '      }\\n' +\n        '   `END`TAG&lt;/big-dept&gt;`END`PLN\\n' +\n        '`END`COM(: -------- :)`END`PLN\\n' +\n        '`END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN local:depth(`END<span class=\"var pln\">$e`END`PLN `END`KWDas`END`PLN `END`KWDnode`END`PLN()) `END`KWDas`END`PLN `END`TYPxs:integer`END`PLN\\n' +\n        '{\\n' +\n        '   `END`COM(: A node with no children has depth 1 :)`END`PLN\\n' +\n        '   `END`COM(: Otherwise, add 1 to max depth of children :)`END`PLN\\n' +\n        '   `END`KWDif`END`PLN (`END<span class=\"fun pln\">fn:empty`END`PLN(`END<span class=\"var pln\">$e`END`PLN/*)) `END`KWDthen`END`PLN 1\\n' +\n        '   `END`KWDelse`END`PLN `END<span class=\"fun pln\">fn:max`END`PLN(`END`KWDfor`END`PLN `END<span class=\"var pln\">$c`END`PLN `END`KWDin`END`PLN `END<span class=\"var pln\">$e`END`PLN/* `END`KWDreturn`END`PLN local:depth(`END<span class=\"var pln\">$c`END`PLN)) + 1\\n' +\n        '};\\n' +\n        ' \\n' +\n        'local:depth(`END<span class=\"fun pln\">fn:doc`END`PLN(`END`STR\"partlist.xml\"`END`PLN))\\n' +\n        ' \\n' +\n        '`END`COM(: -------- :)`END`PLN\\n' +\n        '`END`TAG&lt;html&gt;&lt;head`END`PLN/`END`TAG&gt;&lt;body&gt;`END`PLN\\n' +\n        '{\\n' +\n        '  `END`KWDfor`END`PLN `END<span class=\"var pln\">$act`END`PLN `END`KWDin`END`PLN `END<span class=\"fun pln\">doc`END`PLN(`END`STR\"hamlet.xml\"`END`PLN)//ACT\\n' +\n        '  `END`KWDlet`END`PLN `END<span class=\"var pln\">$speakers`END`PLN := `END<span class=\"fun pln\">distinct-values`END`PLN(`END<span class=\"var pln\">$act`END`PLN//SPEAKER)\\n' +\n        '  `END`KWDreturn`END`PLN\\n' +\n        '    `END`TAG&lt;div&gt;`END`PLN{ `END<span class=\"fun pln\">string`END`PLN(`END<span class=\"var pln\">$act`END`PLN/TITLE) }`END`TAG&lt;/h1&gt;`END`PLN\\n' +\n        '      `END`TAG&lt;ul&gt;`END`PLN\\n' +\n        '      {\\n' +\n        '        `END`KWDfor`END`PLN `END<span class=\"var pln\">$speaker`END`PLN `END`KWDin`END`PLN `END<span class=\"var pln\">$speakers`END`PLN\\n' +\n        '        `END`KWDreturn`END`PLN `END`TAG&lt;li&gt;`END`PLN{ `END<span class=\"var pln\">$speaker`END`PLN }`END`TAG&lt;/li&gt;`END`PLN\\n' +\n        '      }\\n' +\n        '      `END`TAG&lt;/ul&gt;`END`PLN\\n' +\n        '    `END`TAG&lt;/div&gt;`END`PLN\\n' +\n        '}\\n' +\n        '`END`TAG&lt;/body&gt;&lt;/html&gt;`END`PLN\\n' +\n        '`END`COM(: -------- :)`END`PLN\\n' +\n        '{\\n' +\n        '\\t`END`KWDfor`END`PLN `END<span class=\"var pln\">$book`END`PLN `END`KWDin`END`PLN `END<span class=\"fun pln\">doc`END`PLN(`END`STR\"books.xml\"`END`PLN)//book\\n' +\n        '        `END`KWDreturn`END`PLN\\n' +\n        '\\t`END`KWDif`END`PLN (`END<span class=\"fun pln\">contains`END`PLN(`END<span class=\"var pln\">$book`END`PLN/author/`END`KWDtext`END`PLN(),`END`STR\"Herbert\"`END`PLN) `END`KWDor`END`PLN `END<span class=\"fun pln\">contains`END`PLN(`END<span class=\"var pln\">$book`END`PLN/author/`END`KWDtext`END`PLN(),`END`STR\"Asimov\"`END`PLN))\\n' +\n        '\\t\\t`END`KWDthen`END`PLN `END<span class=\"var pln\">$book`END`PLN\\n' +\n        '\\t`END`KWDelse`END`PLN `END<span class=\"var pln\">$book`END`PLN/`END`KWDtext`END`PLN()\\n' +\n        '\\t\\n' +\n        '\\t`END`KWDlet`END`PLN `END<span class=\"var pln\">$let`END`PLN := `END`TAG&lt;x&gt;`END`STR\"test\"`END`TAG&lt;/x&gt;`END`PLN\\n' +\n        '\\t`END`KWDreturn`END`PLN `END`KWDelement`END`PLN `END`KWDelement`END`PLN {\\n' +\n        '\\t`END`KWDattribute`END`PLN `END`KWDattribute`END`PLN { 1 },\\n' +\n        '\\t`END`KWDelement`END`PLN test { `END`STR\\'a\\'`END`PLN },\\n' +\n        '\\t`END`KWDattribute`END`PLN foo { `END`STR\"bar\"`END`PLN },\\n' +\n        '\\t`END<span class=\"fun pln\">fn:doc`END`PLN()[ foo/`END`LIT@bar`END`PLN `END`KWDeq`END`PLN `END<span class=\"var pln\">$let`END`PLN ],\\n' +\n        '\\t//x }\\n' +\n        '}\\n' +\n        '`END`COM(: -------- :)`END`PLN\\n' +\n        '`END`TAG&lt;bib&gt;`END`PLN\\n' +\n        ' {\\n' +\n        '  `END`KWDfor`END`PLN `END<span class=\"var pln\">$b`END`PLN `END`KWDin`END`PLN `END<span class=\"fun pln\">doc`END`PLN(`END`STR\"http://bstore1.example.com/bib.xml\"`END`PLN)/bib/book\\n' +\n        '  `END`KWDwhere`END`PLN `END<span class=\"var pln\">$b`END`PLN/publisher = `END`STR\"Addison-Wesley\"`END`PLN `END`KWDand`END`PLN `END<span class=\"var pln\">$b`END`PLN/`END`LIT@year`END`PLN &gt; 1991\\n' +\n        '  `END`KWDreturn`END`PLN\\n' +\n        '    `END`TAG&lt;book`END`PLN year=`END`STR\"`END`PLN{ `END<span class=\"var pln\">$b`END`PLN/`END`LIT@year`END`PLN }`END`STR\"`END`TAG&gt;`END`PLN\\n' +\n        '     { `END<span class=\"var pln\">$b`END`PLN/title }\\n' +\n        '    `END`TAG&lt;/book&gt;`END`PLN\\n' +\n        ' }\\n' +\n        '`END`TAG&lt;/bib&gt;`END`PLN\\n' +\n        '`END`COM(: -------- :)`END'),\n  nemerle: (\n        '`KWDclass`END`PLN Set `END`PUN[`END`PLN\\'a`END`PUN]`END`PLN\\n' +\n        '`END`PUN{`END`PLN\\n' +\n        '  `END`KWDmutable`END`PLN storage `END`PUN:`END`PLN `END`TYPlist`END`PLN `END`PUN[`END`PLN\\'a`END`PUN]`END`PLN `END`PUN=`END`PLN `END`PUN[];`END`PLN\\n' +\n        '  `END`KWDpublic`END`PLN Add `END`PUN(`END`PLNe `END`PUN:`END`PLN \\'a`END`PUN)`END`PLN `END`PUN:`END`PLN `END`TYPvoid`END`PLN\\n' +\n        '  `END`PUN{`END`PLN\\n' +\n        '    `END`KWDwhen`END`PLN `END`PUN(!`END`PLN Contains `END`PUN(`END`PLNe`END`PUN))`END`PLN\\n' +\n        '      storage `END`PUN::=`END`PLN e`END`PUN;`END`PLN\\n' +\n        '  `END`PUN}`END`PLN\\n' +\n        '  `END`KWDpublic`END`PLN Contains `END`PUN(`END`PLNe `END`PUN:`END`PLN \\'a`END`PUN)`END`PLN `END`PUN:`END`PLN `END`TYPbool`END`PLN\\n' +\n        '  `END`PUN{`END`PLN\\n' +\n        '    storage`END`PUN.`END`PLNContains `END`PUN(`END`PLNe`END`PUN)`END`PLN\\n' +\n        '  `END`PUN}`END`PLN\\n' +\n        '`END`PUN}`END`PLN\\n' +\n        ' \\n' +\n        '`END`KWDdef`END`PLN s1 `END`PUN=`END`PLN Set `END`PUN();`END`PLN\\n' +\n        's1`END`PUN.`END`PLNAdd `END`PUN(`END`LIT3`END`PUN);`END`PLN\\n' +\n        's1`END`PUN.`END`PLNAdd `END`PUN(`END`LIT42`END`PUN);`END`PLN\\n' +\n        '`END`KWDassert`END`PLN `END`PUN(`END`PLNs1`END`PUN.`END`PLNContains `END`PUN(`END`LIT3`END`PUN));`END`PLN\\n' +\n        '`END`COM// s1.Add (\"foo\"); // error here!`END`PLN\\n' +\n        '`END`KWDdef`END`PLN s2 `END`PUN=`END`PLN Set `END`PUN();`END`PLN\\n' +\n        's2`END`PUN.`END`PLNAdd `END`PUN(`END`STR\"foo\"`END`PUN);`END`PLN\\n' +\n        '`END`KWDassert`END`PLN `END`PUN(`END`PLNs2`END`PUN.`END`PLNContains `END`PUN(`END`STR\"foo\"`END`PUN));`END'),\n  latex: (\n        '`COM% resume.tex`END`PLN\\n' +\n        '`END`COM% vim:set ft=tex spell:`END`PLN\\n' +\n        '`END`KWD\\\\documentclass`END`PUN[`END`LIT10pt`END`PLN,letterpaper`END`PUN]{`END`PLNarticle`END`PUN}`END`PLN\\n' +\n        '`END`KWD\\\\usepackage`END`PUN[`END`PLNletterpaper,margin`END`PUN=`END`LIT0.8in`END`PUN]{`END`PLNgeometry`END`PUN}`END`PLN\\n' +\n        '`END`KWD\\\\usepackage`END`PUN{`END`PLNmdwlist`END`PUN}`END`PLN\\n' +\n        '`END`KWD\\\\usepackage`END`PUN[`END`PLNT1`END`PUN]{`END`PLNfontenc`END`PUN}`END`PLN\\n' +\n        '`END`KWD\\\\usepackage`END`PUN{`END`PLNtextcomp`END`PUN}`END`PLN\\n' +\n        '`END`KWD\\\\pagestyle`END`PUN{`END`PLNempty`END`PUN}`END`PLN\\n' +\n        '`END`KWD\\\\setlength`END`PUN{`END`KWD\\\\tabcolsep`END`PUN}{`END`LIT0em`END`PUN}`END'\n        ),\n  issue144: (\n        '`COM#! /bin/bash`END`PLN\\n' +\n        '`END`COM# toascii.sh`END`PLN\\n' +\n        '`END`KWDfor`END`PLN i `END`KWDin`END`PLN $`END`PUN(`END`PLNecho $`END`PUN*' +\n          '`END`PLN `END`PUN|`END`PLN fold `END`PUN-`END`PLNw `END`LIT1`END`PUN);`END' +\n          '`KWDdo`END`PLN\\n' +\n        '  printf `END`STR\"%x \"`END`PLN \\\\\\'$i`END`PUN;`END`PLN\\n' +\n        '`END`KWDdone`END`PUN;`END`PLN\\n' +\n        'echo`END'\n        ),\n  clojure: '`COM; Clojure test comment`END`PLN\\n' +\n        '`END`OPN(`END`KWDns`END`PLN test\\n' +\n        ' `END`OPN(`END`TYP:gen-class`END`CLO))`END`PLN\\n' +\n        '\\n' +\n        '`END`OPN(`END`KWDdef`END`PLN foo `END`STR\"bar\"`END`CLO)`END`PLN\\n' +\n        '`END`OPN(`END`KWDdefn`END`PLN bar `END`OPN[`END`PLNarg1 arg2 &amp; args`END`CLO]`END`PLN\\n' +\n        '  `END`STR\"sample function\"`END`PLN\\n' +\n        '  `END`OPN(`END`KWDfor`END`PLN `END`OPN[`END`PLNarg args`END`CLO]`END`PLN\\n' +\n        '    `END`OPN(`END`KWDprn`END`PLN arg`END`CLO)))`END`PLN\\n' +\n        '\\n' +\n        '`END`OPN(`END`PLNbar `END`STR\"foo\"`END`PLN `END`STR\"bar\"`END`PLN `END`STR\"blah\"`END`PLN `END`TYP:baz`END`CLO)`END',\n  html5conv1: '`COM; foo`END',\n  html5conv2: '<code class=\"language-lisp\">`COM; foo`END</code>',\n  html5conv3: ('<code class=\"language-lisp\">`PLN\\n' +\n      '`END`COM; foo`END`PLN\\n' +\n      '`END</code>\\n'),\n  html5conv4: ('`PLNbefore CODE\\n' +\n      '`END<code class=\"language-lisp\">`PUN;`END`PLN foo`END</code>\\n'),\n  procinstr1: '`COM; foo`END',\n  procinstr2:\n      '<ol class=\"linenums\"><li class=\"L3\" value=\"4\">`COM; foo`END</li></ol>',\n  procinstr3: '<ol class=\"linenums\"><li class=\"L0\">`COM; foo`END</li></ol>',\n  procinstr4: '`COM; foo`END',\n  issue185: '`STR\"No tag backs.\"`END',\n  issue261: '<ol class=\"linenums\"><li class=\"L0\">`STR\"No tag backs.\"`END</li></ol>',\n  issue201: '`KWDstatic`END`PLN `END`TYPPersistent`END' +\n      '`PUN&lt;`END`TYPString`END`PUN&gt;`END`PLN listeners_symbol`END`PUN;`END',\n  dart: '`PLNpart of myLib`END`PUN;`END`PLN\\n' +\n        '\\n' +\n        'part `END`STR\\'something.dart\\'`END`PUN;`END`PLN\\n' +\n        '\\n' +\n        '`END`KWDimport`END`PLN `END`STR\\'dart:math\\'`END`PLN `END' +\n          '`KWDas`END`PLN test show foo`END`PUN,`END`PLN bar`END`PUN;`END' +\n          '`PLN\\n' +\n        '\\n' +\n        '`END`KWDclass`END`PLN `END`TYPPoint`END`PLN `END`PUN{`END`PLN\\n' +\n        '  `END`KWDfinal`END`PLN num x`END`PUN,`END`PLN y`END`PUN;`END`PLN\\n' +\n        '\\n' +\n        '  `END`TYPPoint`END`PUN(`END`KWDthis`END`PUN.`END`PLNx`END' +\n          '`PUN,`END`PLN `END`KWDthis`END`PUN.`END`PLNy`END`PUN);`END`PLN\\n' +\n        '  `END`TYPPoint`END`PUN.`END`PLNzero`END`PUN()`END`PLN `END' +\n          '`PUN:`END`PLN x `END`PUN=`END`PLN `END`LIT0`END`PUN,`END' +\n          '`PLN y `END`PUN=`END`PLN `END`LIT0`END`PUN;`END`PLN  `END' +\n          '`COM// Named constructor`END`PLN\\n' +\n        '                                `END' +\n          '`COM// with an initializer list.`END`PLN\\n' +\n        '\\n' +\n        '  num distanceTo`END`PUN(`END`TYPPoint`END`PLN other`END' +\n          '`PUN)`END`PLN `END`PUN{`END`PLN\\n' +\n        '    `END`KWDvar`END`PLN dx `END`PUN=`END`PLN x `END`PUN-`END' +\n          '`PLN other`END`PUN.`END`PLNx`END`PUN;`END`PLN\\n' +\n        '    `END`KWDvar`END`PLN dy `END`PUN=`END`PLN y `END`PUN-`END' +\n          '`PLN other`END`PUN.`END`PLNy`END`PUN;`END`PLN\\n' +\n        '    `END`KWDreturn`END`PLN sqrt`END`PUN(`END`PLNdx `END`PUN*`END' +\n          '`PLN dx `END`PUN+`END`PLN dy `END`PUN*`END`PLN dy`END`PUN);`END' +\n          '`PLN\\n' +\n        '  `END`PUN}`END`PLN\\n' +\n        '`END`PUN}`END`PLN\\n' +\n        '\\n' +\n        '`END`COM// This is a single-line comment.`END`PLN\\n' +\n        '\\n' +\n        '`END`COM/*\\n' +\n        'This is a\\n' +\n        'multiline comment.\\n' +\n        '*/`END`PLN\\n' +\n        '\\n' +\n        'main`END`PUN()`END`PLN `END`PUN{`END`PLN\\n' +\n        '  `END`TYPPoint`END`PLN p `END`PUN=`END`PLN `END`KWDnew`END' +\n          '`PLN `END`TYPPoint`END`PUN(`END`LIT7`END`PUN,`END`PLN `END' +\n          '`LIT12`END`PUN);`END`PLN\\n' +\n        '  `END`TYPString`END`PLN thing `END`PUN=`END`PLN `END' +\n          '`STR\\'It\\\\\\'s awesome!\\'`END`PUN;`END`PLN\\n' +\n        '  `END`TYPString`END`PLN thing2 `END`PUN=`END`PLN `END' +\n          '`STR\\'\\'\\'\\n' +\n        'This is a test! \\\\\\'\\'\\'\\n' +\n        'This is the end of the test\\'\\'\\'`END`PUN;`END`PLN\\n' +\n        '  `END`TYPString`END`PLN thing3 `END`PUN=`END`PLN r`END' +\n          '`STR\\\"\\\"\\\"\\n' +\n        'This is a raw\\n' +\n        'multiline string!\\\"\\\"\\\"`END`PUN;`END`PLN\\n' +\n        '  num x `END`PUN=`END`PLN `END`LIT0x123ABC`END`PUN;`END`PLN\\n' +\n        '  num y `END`PUN=`END`PLN `END`LIT1.8e-12`END`PUN;`END`PLN\\n' +\n        '  `END`KWDbool`END`PLN flag `END`PUN=`END`PLN `END`KWDfalse`END' +\n          '`PUN;`END`PLN\\n' +\n        '  `END`TYPString`END`PLN raw `END`PUN=`END`PLN r`END' +\n          '`STR\\\"This is a raw string, where \\\\n doesn\\'t matter\\\"`END' +\n          '`PUN;`END`PLN\\n' +\n        '`END`PUN}`END',\n  tcl_lang: (\n      '`COM#!/bin/tclsh`END`PLN\\n' +\n      '`END`KWDproc`END`PLN fib `END`OPN{`END`PLNn`END`CLO}`END`PLN `END`OPN{`END`PLN\\n' +\n      '    `END`KWDset`END`PLN a `END`LIT0`END`PLN\\n' +\n      '    `END`KWDset`END`PLN b `END`LIT1`END`PLN\\n' +\n      '    `END`KWDwhile`END`PLN `END`OPN{`END`PUN$`END`PLNn `END`PUN&gt;`END`PLN `END`LIT0`END`CLO}`END`PLN `END`OPN{`END`PLN\\n' +\n      '        `END`KWDset`END`PLN tmp `END`PUN$`END`PLNa\\n' +\n      '        `END`KWDset`END`PLN a `END`PUN[`END`KWDexpr`END`PLN `END`PUN$`END`PLNa `END`PUN+`END`PLN `END`PUN$`END`PLNb`END`PUN]`END`PLN\\n' +\n      '        `END`KWDset`END`PLN b `END`PUN$`END`PLNtmp\\n' +\n      '        `END`KWDincr`END`PLN n `END`LIT-1`END`PLN\\n' +\n      '    `END`CLO}`END`PLN\\n' +\n      '    `END`KWDreturn`END`PLN `END`PUN$`END`PLNa\\n' +\n      '`END`CLO}`END'\n  ),\n  r_lang: (\n      '`COM### Example R script for syntax highlighting`END`PLN\\n' +\n      '\\n' +\n      '`END`COM# This is a comment`END`PLN\\n' +\n      '\\n' +\n      '`END`COM## Valid names`END`PLN\\n' +\n      'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV0123456789._a `END`PUN&lt;-`END`PLN `END`LITNULL`END`PLN\\n' +\n      '.foo_ `END`PUN&lt;-`END`PLN `END`LITNULL`END`PLN\\n' +\n      '._foo `END`PUN&lt;-`END`PLN `END`LITNULL`END`PLN\\n' +\n      '\\n' +\n      '`END`COM## Invalid names`END`PLN\\n' +\n      '`END`LIT0`END`PLNabc `END`PUN&lt;-`END`PLN `END`LITNULL`END`PLN\\n' +\n      '`END`LIT.0`END`PLNabc `END`PUN&lt;-`END`PLN `END`LITNULL`END`PLN\\n' +\n      'abc`END`PUN+`END`PLNcde `END`PUN&lt;-`END`PLN `END`LITNULL`END`PLN\\n' +\n      '\\n' +\n      '`END`COM## Reserved Words`END`PLN\\n' +\n      '`END`LITNA`END`PLN\\n' +\n      '`END`LITNA_integer_`END`PLN\\n' +\n      '`END`LITNA_real_`END`PLN\\n' +\n      '`END`LITNA_character_`END`PLN\\n' +\n      '`END`LITNA_complex_`END`PLN\\n' +\n      '`END`LITNULL`END`PLN\\n' +\n      '`END`LITNaN`END`PLN\\n' +\n      '`END`LITInf`END`PLN\\n' +\n      '`END`COM## Not reserved`END`PLN\\n' +\n      'NULLa `END`PUN&lt;-`END`PLN `END`LITNULL`END`PLN\\n' +\n      'NULL1 `END`PUN&lt;-`END`PLN `END`LITNULL`END`PLN\\n' +\n      'NULL. `END`PUN&lt;-`END`PLN `END`LITNULL`END`PLN\\n' +\n      'NA_foo_ `END`PUN&lt;-`END`PLN `END`LITNULL`END`PLN\\n' +\n      '\\n' +\n      '`END`COM## Numbers`END`PLN\\n' +\n      '`END`LIT12345678901`END`PLN\\n' +\n      '`END`LIT123456.78901`END`PLN\\n' +\n      '`END`LIT123e3`END`PLN\\n' +\n      '`END`LIT123E3`END`PLN\\n' +\n      '`END`LIT1.23e-3`END`PLN\\n' +\n      '`END`LIT1.23e3`END`PLN\\n' +\n      '`END`LIT1.23e-3`END`PLN\\n' +\n      '`END`COM## integer constants`END`PLN\\n' +\n      '`END`LIT123L`END`PLN\\n' +\n      '`END`LIT1.23L`END`PLN\\n' +\n      '`END`COM## imaginary numbers`END`PLN\\n' +\n      '`END`LIT123i`END`PLN\\n' +\n      '`END`LIT-123i`END`PLN\\n' +\n      '`END`LIT123e4i`END`PLN\\n' +\n      '`END`LIT123e-4i`END`PLN\\n' +\n      '`END`COM## Hex numbers`END`PLN\\n' +\n      '`END`LIT0xabcdefABCDEF01234`END`PLN\\n' +\n      '`END`LIT0xabcp123`END`PLN\\n' +\n      '`END`LIT0xabcP123`END`PLN\\n' +\n      '`END`COM## Not hex`END`PLN\\n' +\n      '`END`LIT0`END`PLNxg\\n' +\n      '\\n' +\n      '`END`COM## Special operators %xyz%`END`PLN\\n' +\n      '`END`COM## %xyz%`END`PLN\\n' +\n      '`END`LIT1`END`PLN `END`PUN%%`END`PLN `END`LIT2`END`PLN\\n' +\n      'diag`END`PUN(`END`LIT2`END`PUN)`END`PLN `END`PUN%*%`END`PLN diag`END`PUN(`END`LIT2`END`PUN)`END`PLN\\n' +\n      '`END`LIT1`END`PLN `END`PUN%/%`END`PLN `END`LIT2`END`PLN\\n' +\n      '`END`LIT1`END`PLN `END`PUN%in%`END`PLN `END`LIT1`END`PUN:`END`LIT10`END`PLN\\n' +\n      'diag`END`PUN(`END`LIT2`END`PUN)`END`PLN `END`PUN%o%`END`PLN diag`END`PUN(`END`LIT2`END`PUN)`END`PLN\\n' +\n      'diag`END`PUN(`END`LIT2`END`PUN)`END`PLN `END`PUN%x%`END`PLN diag`END`PUN(`END`LIT2`END`PUN)`END`PLN\\n' +\n      '`END`STR`%foo bar%``END`PLN `END`PUN&lt;-`END`PLN `END`KWDfunction`END`PUN(`END`PLNx`END`PUN,`END`PLN y`END`PUN)`END`PLN x `END`PUN+`END`PLN y\\n' +\n      '`END`LIT1`END`PLN `END`PUN%foo bar%`END`PLN `END`LIT2`END`PLN\\n' +\n      '\\n' +\n      '`END`COM## Control Structures (3.2) and Function`END`PLN\\n' +\n      '`END`COM## if, else`END`PLN\\n' +\n      '`END`KWDif`END`PLN `END`PUN(`END`LITTRUE`END`PUN)`END`PLN print`END`PUN(`END`STR\"foo\"`END`PUN)`END`PLN `END`KWDelse`END`PLN print`END`PUN(`END`STR\"bar\"`END`PUN)`END`PLN\\n' +\n      '`END`COM## For, in`END`PLN\\n' +\n      '`END`KWDfor`END`PUN(`END`PLNi `END`KWDin`END`PLN `END`LIT1`END`PUN:`END`LIT5`END`PUN)`END`PLN `END`PUN{`END`PLN\\n' +\n      '    print`END`PUN(`END`PLNi`END`PUN)`END`PLN\\n' +\n      '`END`PUN}`END`PLN\\n' +\n      '`END`COM## While, break`END`PLN\\n' +\n      'i `END`PUN&lt;-`END`PLN `END`LIT1`END`PLN\\n' +\n      '`END`KWDwhile`END`PLN `END`PUN(`END`LITTRUE`END`PUN)`END`PLN `END`PUN{`END`PLN\\n' +\n      '    i `END`PUN&lt;-`END`PLN i `END`PUN+`END`PLN `END`LIT1`END`PLN\\n' +\n      '    `END`KWDif`END`PLN `END`PUN(`END`PLNi `END`PUN&gt;`END`PLN `END`LIT3`END`PUN)`END`PLN `END`KWDbreak`END`PLN\\n' +\n      '`END`PUN}`END`PLN\\n' +\n      '`END`COM## Repeat`END`PLN\\n' +\n      '`END`KWDrepeat`END`PLN `END`PUN{`END`LIT1+1`END`PUN}`END`PLN\\n' +\n      '`END`COM## Switch`END`PLN\\n' +\n      'x `END`PUN&lt;-`END`PLN `END`LIT3`END`PLN\\n' +\n      '`END`KWDswitch`END`PUN(`END`PLNx`END`PUN,`END`PLN `END`LIT2+2`END`PUN,`END`PLN mean`END`PUN(`END`LIT1`END`PUN:`END`LIT10`END`PUN),`END`PLN rnorm`END`PUN(`END`LIT5`END`PUN))`END`PLN\\n' +\n      '`END`COM## Function, dot-dot-dot, return`END`PLN\\n' +\n      'foo `END`PUN&lt;-`END`PLN `END`KWDfunction`END`PUN(`END`LIT...`END`PUN)`END`PLN `END`PUN{`END`PLN\\n' +\n      '    `END`KWDreturn`END`PUN(`END`PLNsum`END`PUN(`END`LIT...`END`PUN))`END`PLN\\n' +\n      '`END`PUN}`END`PLN\\n' +\n      '`END`COM# Not keywords`END`PLN\\n' +\n      'functiona `END`PUN&lt;-`END`PLN `END`LIT2`END`PLN `END`PUN+`END`PLN `END`LIT2`END`PLN\\n' +\n      'function. `END`PUN&lt;-`END`PLN `END`LIT2`END`PLN `END`PUN+`END`PLN `END`LIT2`END`PLN\\n' +\n      'function1 `END`PUN&lt;-`END`PLN `END`LIT2`END`PLN `END`PUN+`END`PLN `END`LIT2`END`PLN\\n' +\n      '\\n' +\n      '\\n' +\n      '`END`COM## Grouping Tokens 10.3.7`END`PLN\\n' +\n      '`END`COM## Parentheses`END`PLN\\n' +\n      '`END`LIT1`END`PLN `END`PUN+`END`PLN `END`PUN(`END`LIT2`END`PLN `END`PUN+`END`PLN `END`LIT3`END`PUN)`END`PLN\\n' +\n      '`END`COM## brackets`END`PLN\\n' +\n      'foo `END`PUN&lt;-`END`PLN `END`KWDfunction`END`PUN(`END`PLNa`END`PUN)`END`PLN `END`PUN{`END`PLN\\n' +\n      '    a `END`PUN+`END`PLN `END`LIT1`END`PLN\\n' +\n      '`END`PUN}`END`PLN\\n' +\n      '\\n' +\n      '`END`COM## Indexing 10.3.8`END`PLN\\n' +\n      '`END`COM## []`END`PLN\\n' +\n      'bar `END`PUN&lt;-`END`PLN `END`LIT1`END`PUN:`END`LIT10`END`PLN\\n' +\n      'bar`END`PUN[`END`LIT3`END`PUN]`END`PLN\\n' +\n      '`END`COM## [[]]`END`PLN\\n' +\n      'foo `END`PUN&lt;-`END`PLN list`END`PUN(`END`PLNa`END`PUN=`END`LIT1`END`PUN,`END`PLN b`END`PUN=`END`LIT2`END`PUN,`END`PLN c`END`PUN=`END`LIT3`END`PUN)`END`PLN\\n' +\n      'foo`END`PUN[[`END`STR\"a\"`END`PUN]]`END`PLN\\n' +\n      '`END`COM## $`END`PLN\\n' +\n      'foo`END`PUN$`END`PLNa\\n' +\n      'foo`END`PUN$`END`STR\"a\"`END`PLN\\n' +\n      '\\n' +\n      '`END`COM## Operators`END`PLN\\n' +\n      '`END`LIT2`END`PLN `END`PUN-`END`PLN `END`LIT2`END`PLN\\n' +\n      '`END`LIT2`END`PLN `END`PUN+`END`PLN `END`LIT2`END`PLN\\n' +\n      '`END`LIT2`END`PLN `END`PUN~`END`PLN `END`LIT2`END`PLN\\n' +\n      '`END`PUN!`END`PLN `END`LITTRUE`END`PLN\\n' +\n      '`END`PUN?`END`STR\"help\"`END`PLN\\n' +\n      '`END`LIT1`END`PUN:`END`LIT2`END`PLN\\n' +\n      '`END`LIT2`END`PLN `END`PUN*`END`PLN `END`LIT2`END`PLN\\n' +\n      '`END`LIT2`END`PLN `END`PUN/`END`PLN `END`LIT2`END`PLN\\n' +\n      '`END`LIT2`END`PUN^`END`LIT2`END`PLN\\n' +\n      '`END`LIT2`END`PLN `END`PUN&lt;`END`PLN `END`LIT2`END`PLN\\n' +\n      '`END`LIT2`END`PLN `END`PUN&gt;`END`PLN `END`LIT2`END`PLN\\n' +\n      '`END`LIT2`END`PLN `END`PUN==`END`PLN `END`LIT2`END`PLN\\n' +\n      '`END`LIT2`END`PLN `END`PUN&gt;=`END`PLN `END`LIT2`END`PLN\\n' +\n      '`END`LIT2`END`PLN `END`PUN&lt;=`END`PLN `END`LIT2`END`PLN\\n' +\n      '`END`LIT2`END`PLN `END`PUN!=`END`PLN `END`LIT2`END`PLN\\n' +\n      '`END`LITTRUE`END`PLN `END`PUN&amp;`END`PLN `END`LITFALSE`END`PLN\\n' +\n      '`END`LITTRUE`END`PLN `END`PUN&amp;&amp;`END`PLN `END`LITFALSE`END`PLN\\n' +\n      '`END`LITTRUE`END`PLN `END`PUN|`END`PLN `END`LITFALSE`END`PLN\\n' +\n      '`END`LITTRUE`END`PLN `END`PUN||`END`PLN `END`LITFALSE`END`PLN\\n' +\n      'foo `END`PUN&lt;-`END`PLN `END`LIT2`END`PLN `END`PUN+`END`PLN `END`LIT2`END`PLN\\n' +\n      'foo `END`PUN=`END`PLN `END`LIT2`END`PLN `END`PUN+`END`PLN `END`LIT2`END`PLN\\n' +\n      '`END`LIT2`END`PLN `END`PUN+`END`PLN `END`LIT2`END`PLN `END`PUN-&gt;`END`PLN foo\\n' +\n      'foo `END`PUN&lt;&lt;-`END`PLN `END`LIT2`END`PLN `END`PUN+`END`PLN `END`LIT2`END`PLN\\n' +\n      '`END`LIT2`END`PLN `END`PUN+`END`PLN `END`LIT2`END`PLN `END`PUN-&gt;&gt;`END`PLN foo\\n' +\n      'base`END`PUN:::`END`PLNsum\\n' +\n      'base`END`PUN::`END`PLNsum\\n' +\n      '\\n' +\n      '`END`COM## Strings`END`PLN\\n' +\n      'foo `END`PUN&lt;-`END`PLN `END`STR\"hello, world!\"`END`PLN\\n' +\n      'foo `END`PUN&lt;-`END`PLN `END`STR\\'hello, world!\\'`END`PLN\\n' +\n      'foo `END`PUN&lt;-`END`PLN `END`STR\"Hello, \\'world!\"`END`PLN\\n' +\n      'foo `END`PUN&lt;-`END`PLN `END`STR\\'Hello, \"world!\\'`END`PLN\\n' +\n      'foo `END`PUN&lt;-`END`PLN `END`STR\\'Hello, \\\\\\'world!\\\\\\'\\'`END`PLN\\n' +\n      'foo `END`PUN&lt;-`END`PLN `END`STR\"Hello, \\\\\"world!\\\\\"\"`END`PLN\\n' +\n      'foo `END`PUN&lt;-`END`PLN `END`STR\"Hello,\\n' +\n      'world!\"`END`PLN\\n' +\n      'foo `END`PUN&lt;-`END`PLN `END`STR\\'Hello,\\n' +\n      'world!\\'`END`PLN\\n' +\n      '\\n' +\n      '`END`COM## Backtick strings`END`PLN\\n' +\n      '`END`STR`foo123 +!\"bar\\'baz``END`PLN `END`PUN&lt;-`END`PLN `END`LIT2`END`PLN `END`PUN+`END`PLN `END`LIT2`END'\n  ),\n  mumps: (\n    '`PLNHDR `END`COM; -- prt/display header`END`PLN\\n' +\n      ' `END`KWDN`END`PLN `END`KWDX`END`PUN,`END`KWDI`END`PLN\\n' +\n      ' `END`KWDI`END`PLN `END`PUN\\'`END`DEC$D`END`PUN(`END`PLNVALMHDR`END`PUN)`END`PLN `END`KWDX`END`PUN:`END`DEC$G`END`PUN(`END`PLNVALM`END`PUN(`END`STR\"HDR\"`END`PUN))]`END`STR\"\"`END`PLN VALM`END`PUN(`END`STR\"HDR\"`END`PUN)`END`PLN\\n' +\n      ' `END`COM; -- prt hdr line`END`PLN\\n' +\n      ' `END`KWDW`END`PUN:\\'`END`DEC$D`END`PUN(`END`PLNVALMPG1`END`PUN)`END`PLN `END`PUN@`END`PLNIOF `END`KWDK`END`PLN VALMPG1\\n' +\n      ' `END`KWDW`END`PUN:`END`PLNVALMCC `END`DEC$C`END`PUN(`END`LIT13`END`PUN)_`END`PLNIOUON`END`PUN_`END`DEC$C`END`PUN(`END`LIT13`END`PUN)_`END`PLNIOINHI`END`PUN_`END`DEC$C`END`PUN(`END`LIT13`END`PUN)`END`PLN       `END`COM; -- turn on undln/hi`END`PLN\\n' +\n      ' `END`KWDI`END`PLN `END`DEC$E`END`PUN(`END`PLNIOST`END`PUN,`END`LIT1`END`PUN,`END`LIT2`END`PUN)=`END`STR\"C-\"`END`PLN `END`KWDD`END`PLN IOXY^VALM4`END`PUN(`END`LIT0`END`PUN,`END`LIT0`END`PUN)`END`PLN            `END`COM; -- position cursor`END`PLN\\n' +\n      ' `END`KWDW`END`PLN `END`DEC$E`END`PUN(`END`PLNVALM`END`PUN(`END`STR\"TITLE\"`END`PUN),`END`LIT1`END`PUN,`END`LIT30`END`PUN)`END`PLN                         `END`COM; -- prt title`END`PLN\\n' +\n      ' `END`KWDW`END`PUN:`END`PLNVALMCC IOINORM`END`PUN,`END`PLNIOUON                           `END`COM; -- turn off hi`END`PLN\\n' +\n      ' `END`KWDW`END`PLN `END`DEC$J`END`PUN(`END`STR\"\"`END`PUN,`END`LIT30`END`PUN-`END`DEC$L`END`PUN(`END`PLNVALM`END`PUN(`END`STR\"TITLE\"`END`PUN)))`END`PLN                    `END`COM; -- fill in w/blanks`END`PLN\\n' +\n      ' `END`KWDI`END`PLN `END`DEC$E`END`PUN(`END`PLNIOST`END`PUN,`END`LIT1`END`PUN,`END`LIT2`END`PUN)=`END`STR\"C-\"`END`PLN `END`KWDW`END`PLN `END`DEC$C`END`PUN(`END`LIT13`END`PUN)`END`PLN `END`KWDD`END`PLN IOXY^VALM4`END`PUN(`END`LIT30`END`PUN,`END`LIT0`END`PUN)`END`PLN  `END`COM; -- position cursor`END`PLN\\n' +\n      ' `END`KWDW`END`PLN `END`DEC$J`END`PUN(`END`STR\"\"`END`PUN,((`END`PLNVALMWD`END`LIT-80`END`PUN)/`END`LIT2`END`PUN)),`END`PLN$$HTE^XLFDT`END`PUN(`END`DEC$H`END`PUN,`END`LIT1`END`PUN),`END`DEC$J`END`PUN(`END`STR\"\"`END`PUN,`END`LIT10`END`PUN+((`END`PLNVALMWD`END`LIT-80`END`PUN)/`END`LIT2`END`PUN)),`END`STR\"Page: \"`END`PUN,`END`DEC$J`END`PUN(`END`PLNVALMPGE`END`PUN,`END`LIT4`END`PUN),`END`STR\" of \"`END`PUN,`END`DEC$J`END`PUN(`END`PLN$$PAGE^VALM4`END`PUN(`END`PLNVALMCNT`END`PUN,`END`PLNVALM`END`PUN(`END`STR\"LINES\"`END`PUN)),`END`LIT4`END`PUN)_`END`DEC$S`END`PUN(`END`DEC$D`END`PUN(`END`PLNVALMORE`END`PUN):`END`STR\"+\"`END`PUN,`END`LIT1`END`PUN:`END`STR\" \"`END`PUN)`END`PLN `END`COM; -- prt rest of hdr`END`PLN\\n' +\n      ' `END`KWDW`END`PUN:`END`PLNVALMCC IOUOFF `END`KWDI`END`PLN `END`DEC$E`END`PUN(`END`PLNIOST`END`PUN,`END`LIT1`END`PUN,`END`LIT2`END`PUN)=`END`STR\"C-\"`END`PLN `END`KWDD`END`PLN IOXY^VALM4`END`PUN(`END`LIT0`END`PUN,`END`LIT0`END`PUN)`END`PLN `END`COM; -- turn off undln`END`PLN\\n' +\n      ' `END`KWDF`END`PLN `END`KWDI`END`PUN=`END`LIT1`END`PUN:`END`LIT1`END`PUN:`END`PLNVALM`END`PUN(`END`STR\"TM\"`END`PUN)`END`LIT-3`END`PLN `END`KWDW`END`PLN `END`PUN!,`END`DEC$S`END`PUN(\\'`END`DEC$D`END`PUN(`END`PLNVALMHDR`END`PUN(`END`KWDI`END`PUN)):`END`STR\"\"`END`PUN,`END`DEC$L`END`PUN(`END`PLNVALMHDR`END`PUN(`END`KWDI`END`PUN))&gt;(`END`PLNVALMWD`END`LIT-1`END`PUN):`END`PLN$`END`DEC$EXTRACT`END`PLN^VALM4`END`PUN(`END`DEC$G`END`PUN(`END`PLNVALMHDR`END`PUN(`END`KWDI`END`PUN))),`END`LIT1`END`PUN:`END`PLNVALMHDR`END`PUN(`END`KWDI`END`PUN))`END`PLN `END`COM; -- prt hdr`END`PLN\\n' +\n      ' `END`KWDQ`END'\n      ),\n  basic_lang: (\n      '`LIT200`END`PLN `END`COMREM ----- method teardown`END`PLN\\n' +\n      '`END`LIT210`END`PLN `END`KWDPRINT`END`PLN `END`STR\"green\"`END`PLN\\n' +\n      '`END`LIT220`END`PLN `END`KWDRETURN`END`PLN\\n' +\n      '`END`LIT470`END`PLN `END`KWDIF`END`PLN af`END`PUN=`END`LIT0`END`PLN `END`KWDTHEN`END`PLN `END`KWDGOTO`END`PLN `END`LIT520`END`PLN\\n' +\n      '`END`LIT480`END`PLN `END`KWDFOR`END`PLN j`END`PUN=`END`LIT1`END`PLN `END`KWDTO`END`PLN af\\n' +\n      '`END`LIT500`END`PLN ac`END`PUN=`END`PLNpf`END`PUN(`END`PLNj`END`PUN)`END`PLN `END`PUN:`END`PLN me$`END`PUN=`END`PLNSTR$`END`PUN(`END`PLNj`END`PUN)+`END`STR\". factor\"`END`PLN `END`PUN:`END`PLN `END`KWDGOSUB`END`PLN `END`LIT100`END`PLN\\n' +\n      '`END`LIT510`END`PLN `END`KWDNEXT`END`PLN\\n' +\n      '`END`LIT530`END`PLN `END`KWDRETURN`END`PLN\\n' +\n      '`END`LIT1000`END`PLN `END`KWDDATA`END`PLN `END`STR\"one\"`END`PUN,`END`PLN `END`LIT1`END`PUN,`END`PLN `END`LIT0`END'\n      ),\n  pascal_lang: (\n      '`COM(* some comment here *)`END`PLN\\n' +\n      '`END`KWDPROCEDURE`END`PLN TestCase`END`PUN.`END`PLNAssertEquals`END`PUN(`END`PLNmsg`END`PUN:`END`PLNString`END`PUN;`END`PLN expect`END`PUN,`END`PLN act`END`PUN:`END`PLNLongint`END`PUN);`END`PLN\\n' +\n      '`END`KWDVAR`END`PLN ex`END`PUN,`END`PLN ac`END`PUN:`END`PLNString`END`PUN;`END`PLN\\n' +\n      '`END`KWDBEGIN`END`PLN\\n' +\n      '  `END`KWDIF`END`PLN expect `END`PUN&lt;&gt;`END`PLN act `END`KWDTHEN`END`PLN\\n' +\n      '  `END`KWDBEGIN`END`PLN\\n' +\n      '    Str`END`PUN(`END`PLNexpect`END`PUN,`END`PLN ex`END`PUN);`END`PLN\\n' +\n      '    Fail`END`PUN(`END`PLNConcat`END`PUN(`END`PLNmsg`END`PUN,`END`STR\\' expected \\'`END`PUN,`END`PLNex`END`PUN,`END`STR\\' but was \\'`END`PUN,`END`PLNac`END`PUN));`END`PLN\\n' +\n      '  `END`KWDEND`END`PUN;`END`PLN\\n' +\n      '\\n' +\n      '  factors `END`PUN:=`END`PLN new`END`PUN(`END`PLNArrayListPtr`END`PUN,`END`PLN Init`END`PUN);`END`PLN\\n' +\n      '\\n' +\n      '  `END`KWDFOR`END`PLN candidate `END`PUN:=`END`PLN `END`LIT2`END`PLN `END`KWDTO`END`PLN i `END`KWDDO`END`PLN\\n' +\n      '  `END`KWDBEGIN`END`PLN\\n' +\n      '    `END`KWDWHILE`END`PLN i `END`KWDMOD`END`PLN candidate `END`PUN=`END`PLN `END`LIT0`END`PLN `END`KWDDO`END`PLN\\n' +\n      '    `END`KWDBEGIN`END`PLN\\n' +\n      '      factors`END`PUN^.`END`PLNAdd`END`PUN(`END`PLNcandidate`END`PUN);`END`PLN\\n' +\n      '      i `END`PUN:=`END`PLN i `END`KWDDIV`END`PLN candidate`END`PUN;`END`PLN\\n' +\n      '    `END`KWDEND`END`PUN;`END`PLN\\n' +\n      '  `END`KWDEND`END`PUN;`END`PLN\\n' +\n      '`END`KWDEND`END`PUN;`END'\n      ),\n  llvm: (\n        '`COM; Declare the string constant as a global constant.`END`PLN\\n' +\n        '@.str `END`PUN=`END`PLN `END`KWDprivate`END`PLN `END`KWDunnamed_addr`END`PLN `END`KWDconstant`END`PLN `END`PUN[`END`LIT13`END`PLN `END`KWDx`END`PLN `END`KWDi8`END`PUN]`END`PLN `END`KWDc`END`STR\"hello world\\\\0A\\\\00\"`END`PLN\\n' +\n        '\\n' +\n        '`END`COM; External declaration of the puts function`END`PLN\\n' +\n        '`END`KWDdeclare`END`PLN `END`KWDi32`END`PLN @puts`END`PUN(`END`KWDi8`END`PUN*`END`PLN `END`KWDnocapture`END`PUN)`END`PLN `END`KWDnounwind`END`PLN\\n' +\n        '\\n' +\n        '`END`COM; Definition of main function`END`PLN\\n' +\n        '`END`KWDdefine`END`PLN `END`KWDi32`END`PLN @main`END`PUN()`END`PLN `END`PUN{`END`PLN   `END`COM; i32()*`END`PLN\\n' +\n        '  `END`COM; Convert [13 x i8]* to i8  *...`END`PLN\\n' +\n        '  %cast210 `END`PUN=`END`PLN `END`KWDgetelementptr`END`PLN `END`PUN[`END`LIT13`END`PLN `END`KWDx`END`PLN `END`KWDi8`END`PUN]*`END`PLN @.str`END`PUN,`END`PLN `END`KWDi64`END`PLN `END`LIT0`END`PUN,`END`PLN `END`KWDi64`END`PLN `END`LIT0`END`PLN\\n' +\n        '\\n' +\n        '  `END`COM; Call puts function to write out the string to stdout.`END`PLN\\n' +\n        '  `END`KWDcall`END`PLN `END`KWDi32`END`PLN @puts`END`PUN(`END`KWDi8`END`PUN*`END`PLN %cast210`END`PUN)`END`PLN\\n' +\n        '  `END`KWDret`END`PLN `END`KWDi32`END`PLN `END`LIT0`END`PLN\\n' +\n        '`END`PUN}`END`PLN\\n' +\n        '\\n' +\n        '`END`COM; Named metadata`END`PLN\\n' +\n        '!1 `END`PUN=`END`PLN `END`KWDmetadata`END`PLN !`END`PUN{`END`KWDi32`END`PLN `END`LIT42`END`PUN}`END`PLN\\n' +\n        '!foo `END`PUN=`END`PLN !`END`PUN{`END`PLN!1`END`PUN,`END`PLN `END`KWDnull`END`PUN}`END'\n      ),\n  issue217: (\n      '`KWDif`END`PUN(!`END`STR/^https?:\\\\/\\\\//`END`PLNi`END`PUN.`END`PLNtest`END`PUN(`END`PLNval`END`PUN)`END`PLN `END`PUN&amp;&amp;`END`PLN foo `END`PUN==`END`PLN `END`STR\\'bar\\'`END`PUN)`END`PLN `END`PUN{`END`PLN\\n' +\n      '    val `END`PUN=`END`PLN `END`STR\\'http://\\'`END`PLN `END`PUN+`END`PLN val`END`PUN;`END`PLN\\n' +\n      '`END`PUN}`END'\n      ),\n  matlab: (\n      '`COM%%%%%%%%%%%%%%%%%% DATA TYPES %%%%%%%%%%%%%%%%%%`END`PLN\\n' +\n      '\\n' +\n      '`END<span class=\"ident\">v`END`PLN `END`PUN=`END`PLN `END`TAG[`END`LIT1`END`PUN,`END`LIT2`END`PUN,`END`LIT3`END`PUN;`END`LIT4`END`PUN,`END`LIT5`END`PUN,`END`LIT6`END`TAG]`END`PUN;`END`PLN\\n' +\n      '`END<span class=\"ident\">v`END`TAG(`END<span class=\"ident\">v`END`PUN&gt;`END`LIT4`END`TAG)`END`PLN `END`PUN=`END`PLN `END`LIT0`END`PUN;`END`PLN\\n' +\n      '\\n' +\n      '`END<span class=\"ident\">s`END`PLN `END`PUN=`END`PLN `END`TYPstruct`END`TAG(`END`STR\\'key\\'`END`PUN,`END`LIT1`END`PUN,`END`PLN `END`STR\\'key2\\'`END`PUN,`END`STR\\'string\\'`END`TAG)`END`PUN;`END`PLN\\n' +\n      '`END<span class=\"ident\">s.key`END`PLN `END`PUN=`END`PLN `END`LIT2`END`PUN;`END`PLN\\n' +\n      '\\n' +\n      '`END<span class=\"ident\">C`END`PLN `END`PUN=`END`PLN `END`TYPcell`END`TAG(`END`LIT1`END`PUN,`END`LIT2`END`TAG)`END`PUN;`END`PLN\\n' +\n      '`END<span class=\"ident\">C`END`TAG{`END`LIT1`END`PUN,`END`LIT1`END`TAG}`END`PLN `END`PUN=`END`PLN `END`LIT0`END`PUN:`END`LIT9`END`PUN;`END`PLN\\n' +\n      '\\n' +\n      '`END`TYPdouble`END`TAG(`END`LIT1`END`TAG)`END`PLN\\n' +\n      '`END`TYPsingle`END`TAG(`END`LIT1`END`TAG)`END`PLN\\n' +\n      '`END`TYPuint8`END`TAG(`END`LIT1`END`TAG)`END`PLN\\n' +\n      '`END`TYPint8`END`TAG(`END`LIT1`END`TAG)`END`PLN\\n' +\n      '\\n' +\n      '`END`COM%%%%%%%%%%%%%%%%%% STRINGS &amp; TRANSPOSE %%%%%%%%%%%%%%%%%%`END`PLN\\n' +\n      '\\n' +\n      '`END`FUNplot`END`TAG(`END<span class=\"ident\">data`END<span class=\"transpose\">\\'`END`TAG)`END`PUN;`END`PLN\\n' +\n      '`END`FUNlegend`END`TAG(`END<span class=\"ident\">labels`END`TAG)`END`PLN\\n' +\n      '\\n' +\n      '`END<span class=\"ident\">str`END`PLN `END`PUN=`END`PLN `END`STR\\'asdasd\\'`END`PUN;`END`PLN     `END`COM% this is a string`END`PLN\\n' +\n      '`END<span class=\"ident\">str`END`PLN `END`PUN=`END`PLN `END`STR\\'asdas\\'`END`PUN;`END`PLN\\n' +\n      '`END<span class=\"ident\">str`END`PLN `END`PUN=`END`PLN `END`STR\\'sdasd\\'\\'sdasd\\'`END`PUN;`END`PLN\\n' +\n      '\\n' +\n      '`END<span class=\"ident\">str`END`PLN `END`PUN=`END`PLN `END`TAG[`END`STR\\'one\\'`END`PLN `END`STR\\'two\\'`END`PLN `END`STR\\'three\\'`END`TAG]`END`PUN;`END`PLN\\n' +\n      '`END<span class=\"ident\">str`END`PLN `END`PUN=`END`PLN `END`FUNstrcat`END`TAG(`END`STR\\'one\\'`END`PUN,`END`PLN `END`STR\\'two\\'`END`PUN,`END`PLN `END`STR\\'three\\'`END`TAG)`END`PUN;`END`PLN\\n' +\n      '\\n' +\n      '`END`COM% matrix transpose`END`PLN\\n' +\n      '`END<span class=\"ident\">M`END`PLN `END`PUN=`END`PLN `END`FUNrand`END`TAG(`END`LIT3`END`PUN,`END`LIT3`END`TAG)`END<span class=\"transpose\">\\'`END`PUN;`END`PLN\\n' +\n      '`END<span class=\"ident\">x`END`PLN `END`PUN=`END`PLN `END<span class=\"ident\">M`END`PUN.`END<span class=\"transpose\">\\'`END`PUN;`END`PLN\\n' +\n      '`END<span class=\"ident\">x`END`PLN `END`PUN=`END`PLN `END`TAG[`END`LIT10`END`PLN `END`LIT20`END`PUN;`END`PLN `END`LIT30`END`PUN,`END`PLN `END`LIT40`END`TAG]`END<span class=\"transpose\">\\'`END`PUN;`END`PLN\\n' +\n      '`END`FUNdisp`END`TAG(`END<span class=\"ident\">x`END<span class=\"transpose\">\\'`END`TAG)`END`PLN\\n' +\n      '`END`FUNfprintf`END`TAG(`END`STR\\'%d\\\\n\\'`END`PUN,`END`PLN `END<span class=\"ident\">x`END`TAG(`END`PUN:`END`TAG)`END<span class=\"transpose\">\\'`END`TAG)`END`PLN      `END`COM% with comment`END`PLN\\n' +\n      '`END`TAG{`END`LIT1`END`PUN,`END`LIT2`END`TAG}`END<span class=\"transpose\">\\'`END`PLN                      `END`COM% another comment`END`PLN\\n' +\n      '\\n' +\n      '`END`COM%%%%%%%%%%%%%%%%%% LINE CONTINUATION %%%%%%%%%%%%%%%%%%`END`PLN\\n' +\n      '\\n' +\n      '`END`TAG[`END`LIT1`END`PLN `END`LIT20`END`PUN;`END`PLN `END<span class=\"linecont\">...\\n' +\n      '`END`LIT30`END`PLN `END`LIT4`END`TAG]`END`PLN\\n' +\n      '\\n' +\n      '`END`TAG[`END`STR\\'gdgsd\\'`END<span class=\"linecont\">...\\n' +\n      '`END`STR\\'sdfs\\'`END`TAG]`END`PLN\\n' +\n      '\\n' +\n      '`END`TAG{`END<span class=\"linecont\">...\\n' +\n      '`END`STR\\'sdasd\\'`END`PLN `END`PUN;`END`PLN\\n' +\n      '`END`STR\\'asdsad\\'`END`TAG}`END`PLN\\n' +\n      '\\n' +\n      '`END`COM%%%%%%%%%%%%%%%%%% SYSTEM COMMANDS %%%%%%%%%%%%%%%%%%`END`PLN\\n' +\n      '\\n' +\n      '`END<span class=\"syscmd\">!touch file.txt`END`PLN\\n' +\n      '\\n' +\n      '`END`COM%%%%%%%%%%%%%%%%%% COMMAND OUTPUT %%%%%%%%%%%%%%%%%%`END`PLN\\n' +\n      '\\n' +\n      '`END<span class=\"codeoutput\">&gt;&gt; `END`LIT1+1`END`PLN\\n' +\n      '`END<span class=\"const\">ans`END`PLN `END`PUN=`END`PLN\\n' +\n      '     `END`LIT2`END`PLN\\n' +\n      '\\n' +\n      '`END<span class=\"codeoutput\">&gt;&gt; `END`LIT1+1`END`PLN\\n' +\n      '\\n' +\n      '`END<span class=\"const\">ans`END`PLN `END`PUN=`END`PLN\\n' +\n      '\\n' +\n      '     `END`LIT2`END`PLN\\n' +\n      '\\n' +\n      '`END`COM%%%%%%%%%%%%%%%%%% KEYWORDS %%%%%%%%%%%%%%%%%%`END`PLN\\n' +\n      '\\n' +\n      '`END`KWDfunction`END`PLN `END<span class=\"ident\">ret`END`PLN `END`PUN=`END`PLN `END<span class=\"ident\">fcn`END`TAG(`END<span class=\"ident\">in`END`TAG)`END`PLN\\n' +\n      '\t`END<span class=\"ident\">ret`END`PLN `END`PUN=`END`PLN `END`FUNsum`END`TAG(`END<span class=\"ident\">in`END`PUN.^`END`LIT2`END`TAG)`END`PUN;`END`PLN\\n' +\n      '`END`KWDend`END`PLN\\n' +\n      '\\n' +\n      '`END`KWDclassdef`END`PLN `END<span class=\"ident\">CC`END`PLN `END`PUN&lt;`END`PLN `END`FUNhandle`END`PLN\\n' +\n      '\t`END<span class=\"ident\">properties`END`PLN `END`TAG(`END<span class=\"ident\">SetAccess`END`PLN `END`PUN=`END`PLN `END<span class=\"ident\">public`END`TAG)`END`PLN\\n' +\n      '\t\t`END<span class=\"ident\">x`END`PLN `END`PUN=`END`PLN `END`LIT0`END`PUN;`END`PLN\\n' +\n      '\t`END`KWDend`END`PLN\\n' +\n      '\t`END`FUNmethods`END`PLN\\n' +\n      '\t\t`END`KWDfunction`END`PLN `END<span class=\"ident\">this`END`PLN `END`PUN=`END`PLN `END<span class=\"ident\">CC`END`TAG(`END<span class=\"const\">varargin`END`TAG)`END`PLN\\n' +\n      '\t\t\t`END<span class=\"ident\">this.x`END`PLN `END`PUN=`END`PLN `END`LIT9`END`PUN;`END`PLN\\n' +\n      '\t\t`END`KWDend`END`PLN\\n' +\n      '\t`END`KWDend`END`PLN\\n' +\n      '`END`KWDend`END`PLN\\n' +\n      '\\n' +\n      '`END<span class=\"ident\">x`END`PLN `END`PUN=`END`PLN `END`TAG[]`END`PUN;`END`PLN\\n' +\n      '`END`KWDparfor`END`PLN `END<span class=\"ident\">i`END`PUN=`END`LIT1`END`PUN:`END`LIT10`END`PLN\\n' +\n      '\t`END<span class=\"ident\">x`END`TAG[`END<span class=\"ident\">i`END`TAG]`END`PLN `END`PUN=`END`PLN `END<span class=\"ident\">i`END`PUN;`END`PLN\\n' +\n      '`END`KWDend`END`PLN\\n' +\n      '\\n' +\n      '`END<span class=\"const\">true`END`PLN `END`PUN~=`END`PLN `END<span class=\"const\">false`END`PLN\\n' +\n      '\\n' +\n      '`END`KWDif`END`PLN `END<span class=\"ident\">x`END`PUN==`END`LIT1`END`PLN\\n' +\n      '\t`END<span class=\"const\">true`END`PLN\\n' +\n      '`END`KWDelseif`END`PLN\\n' +\n      '\t`END<span class=\"const\">false`END`PLN\\n' +\n      '`END`KWDelse`END`PLN\\n' +\n      '\t`END`KWDreturn`END`PLN\\n' +\n      '`END`KWDend`END`PLN\\n' +\n      '\\n' +\n      '`END`KWDwhile`END`PLN `END<span class=\"const\">true`END`PLN\\n' +\n      '\t`END`KWDcontinue`END`PLN\\n' +\n      '\t`END`KWDbreak`END`PLN\\n' +\n      '`END`KWDend`END`PLN\\n' +\n      '\\n' +\n      '`END`KWDtry`END`PLN\\n' +\n      '\t`END`FUNerror`END`TAG(`END`STR\\'aa:aa\\'`END`PUN,`END`PLN `END`STR\\'asdasd\\'`END`TAG)`END`PLN\\n' +\n      '`END`KWDcatch`END`PLN `END<span class=\"ident\">ME`END`PLN\\n' +\n      '\t`END`FUNwarning`END`TAG(`END<span class=\"ident\">ME`END`TAG)`END`PLN\\n' +\n      '`END`KWDend`END`PLN\\n' +\n      '\\n' +\n      '`END`KWDswitch`END`PLN `END<span class=\"ident\">x`END`PLN\\n' +\n      '\t`END`KWDcase`END`PLN `END`LIT1`END`PLN\\n' +\n      '\t\t`END`FUNdisp`END`TAG(`END`LIT1`END`TAG)`END`PLN\\n' +\n      '\t`END`KWDotherwise`END`PLN\\n' +\n      '\t\t`END`LIT0`END`PLN\\n' +\n      '`END`KWDend`END`PLN\\n' +\n      '\\n' +\n      '`END`COM%%%%%%%%%%%%%%%%%% NUM LITERALS %%%%%%%%%%%%%%%%%%`END`PLN\\n' +\n      '\\n' +\n      '`END`LIT1`END`PLN\\n' +\n      '`END`LIT1.`END`PLN\\n' +\n      '`END`LIT.1`END`PLN\\n' +\n      '`END`LIT1.0`END`PLN\\n' +\n      '`END`LIT-1`END`PLN\\n' +\n      '`END`LIT-1.`END`PLN\\n' +\n      '`END`LIT-.1`END`PLN\\n' +\n      '`END`LIT-1.0`END`PLN\\n' +\n      '`END`LIT+10`END`PLN\\n' +\n      '`END`LIT+01.`END`PLN\\n' +\n      '`END`LIT+.1`END`PLN\\n' +\n      '`END`LIT+1.0`END`PLN\\n' +\n      '`END`LIT1e1`END`PLN\\n' +\n      '`END`LIT1e-1`END`PLN\\n' +\n      '`END`LIT1.e1`END`PLN\\n' +\n      '`END`LIT1.e-1`END`PLN\\n' +\n      '`END`LIT1.0e1`END`PLN\\n' +\n      '`END`LIT1.0e-1`END`PLN\\n' +\n      '`END`LIT.1e1`END`PLN\\n' +\n      '`END`LIT.1e-1`END`PLN\\n' +\n      '`END`LIT-.1e+1`END`PLN\\n' +\n      '`END`LIT+1.e-1`END`PLN\\n' +\n      '\\n' +\n      '`END`LIT1i`END`PLN\\n' +\n      '`END`LIT.10j`END`PLN\\n' +\n      '`END`LIT-1.001i`END`PLN\\n' +\n      '`END`LIT+1e-100j`END`PLN\\n' +\n      '`END`LIT-.10e-01i`END`PLN\\n' +\n      '\\n' +\n      '`END`COM% unary vs binary operators`END`PLN\\n' +\n      '`END`LIT1+1`END`PLN\\n' +\n      '`END`LIT1`END`PUN+`END`PLN `END`LIT1`END`PLN\\n' +\n      '`END`LIT1`END`PLN `END`LIT+1`END`PLN\\n' +\n      '`END`LIT1`END`PLN `END`PUN+`END`PLN `END`LIT1`END`PLN\\n' +\n      '`END`LIT+1+1`END`PLN\\n' +\n      '`END`LIT+1`END`PUN+`END`PLN `END`LIT1`END`PLN\\n' +\n      '`END`LIT+1`END`PLN `END`LIT+1`END`PLN\\n' +\n      '`END`LIT+1`END`PLN `END`PUN+`END`PLN `END`LIT1`END`PLN\\n' +\n      '\\n' +\n      '`END`COM%%%%%%%%%%%%%%%%%% COMMENTS %%%%%%%%%%%%%%%%%%`END`PLN\\n' +\n      '\\n' +\n      '`END`COM% % comment % %`END`PLN\\n' +\n      '   `END`COM% comment`END`PLN\\n' +\n      '`END`COM% comment`END`PLN\\n' +\n      '`END`COM%# comment`END`PLN\\n' +\n      '`END`COM%% comment`END`PLN\\n' +\n      '`END`COM%#x = sum(x);`END`PLN\\n' +\n      '\\n' +\n      '`END`COM%{\\n' +\n      'block comment\\n' +\n      '%}`END`PLN\\n' +\n      '\\n' +\n      '`END`COM%{\\n' +\n      '%}`END`PLN\\n' +\n      '\\n' +\n      '`END`COM%{\\n' +\n      '\\n' +\n      '%}`END`PLN\\n' +\n      '\\n' +\n      '`END`COM%{\\n' +\n      '1\\n' +\n      '2\\n' +\n      '%}`END`PLN\\n' +\n      '\\n' +\n      '`END`COM%{\\n' +\n      '% sdf {}\\n' +\n      'sdf\\n' +\n      '%asda{}\\n' +\n      'sfds\\n' +\n      '%}`END`PLN\\n' +\n      '\\n' +\n      '    `END`COM%{\\n' +\n      'dsf\\n' +\n      '        %}`END`PLN\\n' +\n      '\\n' +\n      '`END`COM%{%}`END`PLN\\n' +\n      '\\n' +\n      '`END`COM%{ zzz=10; %}`END`PLN\\n' +\n      '\\n' +\n      '`END`COM%{%x=10;%}`END`PLN\\n' +\n      '\\n' +\n      '`END`COM%{  x\\n' +\n      'a=10;\\n' +\n      '%}`END`PLN\\n' +\n      '\\n' +\n      '`END`COM%{\\n' +\n      '%a=10;\\n' +\n      '%}`END`PLN   `END<span class=\"ident\">x`END`PLN\\n' +\n      '\\n' +\n      '`END`COM% nested block comments fail`END`PLN\\n' +\n      '`END`COM%{\\n' +\n      'dfsdf\\n' +\n      '%{\\n' +\n      'xxx\\n' +\n      '%}`END`PLN\\n' +\n      '`END<span class=\"ident\">dfsdf`END`PLN\\n' +\n      '`END`COM%}`END`PLN\\n' +\n      '\\n' +\n      '`END`COM% fails here!`END`PLN\\n' +\n      '`END`COM%{\\n' +\n      'x=10;\\n' +\n      '%%{\\n' +\n      '%%}`END`PLN\\n' +\n      '`END<span class=\"ident\">y`END`PUN=`END`LIT20`END`PUN;`END`PLN\\n' +\n      '`END`COM%}`END'\n      )\n};\n</script>\n\n</html>\n"
  },
  {
    "path": "google-code-prettify/tests/run_prettify_test.html",
    "content": "<!DOCTYPE HTML>\n<html>\n  <head>\n    <title>Run_Prettify Test</title>\n    <script>\n      (function () {\n        var knownGlobals = {};\n        for (var k in window) {\n          if (Object.hasOwnProperty.call(window, k)) {\n            knownGlobals[k] = knownGlobals;\n          }\n        }\n        function dump(s) {\n          var p = document.createElement('p');\n          p.appendChild(document.createTextNode(s));\n          document.body.appendChild(p);\n        }\n        function printDone() { dump('done'); }\n        function dumpGlobals() {\n          for (var k in window) {\n            if (knownGlobals[k] !== knownGlobals\n                && Object.hasOwnProperty.call(window, k)) {\n              dump('global ' + k);\n            } \n          }\n        }\n        window.exports = { print_done: printDone, dump_globals: dumpGlobals };\n      })();\n    </script>\n\n    <script>\n      (function () {\n        var srcDir = '../src';\n        if (/[&?]distrib\\b/.test(location.search)) {\n          srcDir = '../distrib/google-code-prettify';\n        }\n        document.write(\n            '<script src=\"' + srcDir + '/run_prettify.js'\n            + '?lang=css'\n            + '&callback=print_done'\n            + '&skin=sunburst'\n            + '&callback=bogus'\n            + '&callback=dump_globals\"><\\/script>');\n      })();\n    </script>\n\n\n    \n  </head>\n  <body>\n    <pre class=\"prettyprint linenums\">\n&lt;div style=\"color: #f00\"&gt;\n  Hello, <b>World!</b>\n&lt;/div&gt;\n</pre>\n  </body>\n</html>\n"
  },
  {
    "path": "google-code-prettify/tests/test_base.js",
    "content": "// get accurate timing.\n// This file must be loaded after prettify.js for this to work.\nPR_SHOULD_USE_CONTINUATION = false;\n\nvar attribToHtml, textToHtml;\n\nvar getInnerHtml;\n\n(function () {\n  /** is the given node's innerHTML normally unescaped? */\n  function isRawContent(node) {\n    return 'XMP' === node.tagName;\n  }\n\n  var newlineRe = /[\\r\\n]/g;\n  /**\n   * Are newlines and adjacent spaces significant in the given node's innerHTML?\n   */\n  function isPreformatted(node, content) {\n    // PRE means preformatted, and is a very common case, so don't create\n    // unnecessary computed style objects.\n    if ('PRE' === node.tagName) { return true; }\n    if (!newlineRe.test(content)) { return true; }  // Don't care\n    var whitespace = '';\n    // For disconnected nodes, IE has no currentStyle.\n    if (node.currentStyle) {\n      whitespace = node.currentStyle.whiteSpace;\n    } else if (window.getComputedStyle) {\n      // Firefox makes a best guess if node is disconnected whereas Safari\n      // returns the empty string.\n      whitespace = window.getComputedStyle(node, null).whiteSpace;\n    }\n    return !whitespace || whitespace === 'pre';\n  }\n\n  // Define regexps here so that the interpreter doesn't have to create an\n  // object each time the function containing them is called.\n  // The language spec requires a new object created even if you don't access\n  // the $1 members.\n  var pr_amp = /&/g;\n  var pr_lt = /</g;\n  var pr_gt = />/g;\n  var pr_quot = /\\\"/g;\n\n  /** escapest html special characters to html. */\n  textToHtml = function (str) {\n    return str.replace(pr_amp, '&amp;')\n        .replace(pr_lt, '&lt;')\n        .replace(pr_gt, '&gt;');\n  };\n\n  /** like textToHtml but escapes double quotes to be attribute safe. */\n  attribToHtml = function (str) {\n    return str.replace(pr_amp, '&amp;')\n        .replace(pr_lt, '&lt;')\n        .replace(pr_gt, '&gt;')\n        .replace(pr_quot, '&quot;');\n  };\n\n  var PR_innerHtmlWorks = null;\n  getInnerHtml = function (node) {\n    // inner html is hopelessly broken in Safari 2.0.4 when the content is\n    // an html description of well formed XML and the containing tag is a PRE\n    // tag, so we detect that case and emulate innerHTML.\n    if (null === PR_innerHtmlWorks) {\n      var testNode = document.createElement('PRE');\n      testNode.appendChild(\n          document.createTextNode('<!DOCTYPE foo PUBLIC \"foo bar\">\\n<foo />'));\n      PR_innerHtmlWorks = !/</.test(testNode.innerHTML);\n    }\n\n    if (PR_innerHtmlWorks) {\n      var content = node.innerHTML;\n      // XMP tags contain unescaped entities so require special handling.\n      if (isRawContent(node)) {\n        content = textToHtml(content);\n      } else if (!isPreformatted(node, content)) {\n        content = content.replace(/(<br\\s*\\/?>)[\\r\\n]+/g, '$1')\n            .replace(/(?:[\\r\\n]+[ \\t]*)+/g, ' ');\n      }\n      return content;\n    }\n\n    var out = [];\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      normalizedHtml(child, out);\n    }\n    return out.join('');\n  };\n})();\n\nfunction normalizedHtml(node, out, opt_sortAttrs) {\n  switch (node.nodeType) {\n    case 1:  // an element\n      var name = node.tagName.toLowerCase();\n\n      out.push('<', name);\n      var attrs = node.attributes;\n      var n = attrs.length;\n      if (n) {\n        if (opt_sortAttrs) {\n          var sortedAttrs = [];\n          for (var i = n; --i >= 0;) { sortedAttrs[i] = attrs[i]; }\n          sortedAttrs.sort(function (a, b) {\n              return (a.name < b.name) ? -1 : a.name === b.name ? 0 : 1;\n            });\n          attrs = sortedAttrs;\n        }\n        for (var i = 0; i < n; ++i) {\n          var attr = attrs[i];\n          if (!attr.specified) { continue; }\n          out.push(' ', attr.name.toLowerCase(),\n                   '=\"', attribToHtml(attr.value), '\"');\n        }\n      }\n      out.push('>');\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        normalizedHtml(child, out, opt_sortAttrs);\n      }\n      if (node.firstChild || !/^(?:br|link|img)$/.test(name)) {\n        out.push('<\\/', name, '>');\n      }\n      break;\n    case 3: case 4: // text\n      out.push(textToHtml(node.nodeValue));\n      break;\n  }\n}\n\n\n/**\n * @param golden a mapping from IDs of prettyprinted chunks to an abbreviated\n *     form of the expected output.  See \"var goldens\" in prettify_test.html\n *     for an example.\n */\nfunction go(goldens) {\n  startClock();\n  prettyPrint(function () { stopClock(); runTests(goldens); });\n}\n\nfunction runTests(goldens) {\n  /** number of characters in common at the end up to max. */\n  function commonPrefix(a, b) {\n    var n = Math.min(a.length, b.length);\n    var i;\n    for (i = 0; i < n; ++i) {\n      if (a.charAt(i) !== b.charAt(i)) { break; }\n    }\n    return i;\n  }\n\n  /** number of characters in common at the end up to max. */\n  function commonSuffix(a, b, max) {\n    var n = Math.min(a.length - max, b.length - max);\n    var i;\n    for (i = 0; i < n; ++i) {\n      if (a.charAt(a.length - i - 1) !== b.charAt(b.length - i - 1)) { break; }\n    }\n    return i;\n  }\n\n  /** convert a plain text string to html by escaping html special chars. */\n  function html(plainText) {\n    return attribToHtml(plainText).replace(/\\xa0/g, '&nbsp;');\n  }\n\n  /**\n   * get normalized markup.  innerHTML varies enough across browsers that we\n   * can't use it.\n   */\n  function normalizedInnerHtml(node) {\n    var out = [];\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      normalizedHtml(child, out, true);\n    }\n    out = out.join('');\n    // more normalization to work around problems with non-ascii chars in\n    // regexps in Safari\n    for (var i = 0; (i = out.indexOf('\\xa0')) >= 0;) {\n      out = out.substring(0, i) + '&nbsp;' + out.substring(i + 1);\n    }\n    return out.replace(/\\r\\n?/g, '\\n');\n  }\n\n  var htmlOut = [];\n  var failures = 0;\n  document.getElementById('errorReport').innerHTML =\n      '<h1>Running tests&hellip;<\\/h1>';\n  htmlOut.push('<h1>Test results<\\/h1>');\n  for (var lang in goldens) {\n    var container = document.getElementById(lang);\n    // Convert abbreviations that start with `.\n    var golden = goldens[lang].replace(/`([A-Z]{3})/g, function (_, lbl) {\n        return (lbl == 'END'\n            ? '<\\/span>'\n            : '<span class=\"' + lbl.toLowerCase() + '\">');\n      })\n      // Line numbers\n      .replace(/`#(?![0-9])/, '<li class=\"L0\">')\n      .replace(/`#([0-9])/g, '</li><li class=\"L$1\">');\n    var actual = normalizedInnerHtml(container);\n    if (golden !== actual) {  // test failed\n      // write out\n      var pre = commonPrefix(golden, actual);\n      var post = commonSuffix(golden, actual, pre);\n\n      ++failures;\n      htmlOut.push(\n          '<h2><a href=\"#' + html(lang) + '\">'\n          + html(lang) + '<\\/a> Failed<\\/h2>');\n      htmlOut.push(\n          '<tt>' + html(golden.substring(0, pre)) +\n          '&raquo;<span class=\"mismatch\">' +\n          html(golden.substring(pre, golden.length - post)) +\n          '<\\/span>&laquo;' +\n          html(golden.substring(golden.length - post)) +\n\n          '<br>!==<br>' +\n\n          html(actual.substring(0, pre)) +\n          '&raquo;<span class=\"mismatch\">' +\n          html(actual.substring(pre, actual.length - post)) +\n          '<\\/span>&laquo;' +\n          html(actual.substring(actual.length - post)) + '<\\/tt>');\n    } else {\n      htmlOut.push(\n          '<h2><a href=\"#' + html(lang) + '\">' + html(lang) + '<\\/a> OK<\\/h2>');\n    }\n  }\n  var summary = (\n      failures\n      ? (failures + ' test' + (failures === 1 ? '' : 's') + ' failed') \n      : 'Tests Passed');\n  var summaryStr = '<h2>' + summary + '<\\/h2>';\n  htmlOut.push(summaryStr);\n  htmlOut.splice(0, 0, summaryStr);\n  document.title += ' \\u2014 ' + summary;\n  document.getElementById('errorReport').innerHTML =\n      htmlOut.join('').replace(/&lt;br&gt;/g, '&lt;br&gt;\\n');\n}\n\nvar startTime = null;\nfunction startClock() {\n  startTime = (new Date).getTime();\n}\n\nfunction stopClock() {\n  var delta = (new Date).getTime() - startTime;\n  startTime = null;\n  document.getElementById('timing').innerHTML = 'Took ' + delta + ' ms';\n}\n"
  },
  {
    "path": "google-code-prettify/tests/test_styles.css",
    "content": "/* Used by error reporting code in test_base.js */\n.mismatch { background: #fee; font-weight: bold }\nspan.annot { margin:2px 2px 2px 3em; border:1px dotted #88f; background:#eef;\n             padding: 0 2px 0 2px }\n.nocode { background: #f8f8f8 }\n"
  },
  {
    "path": "google-code-prettify/tools/closure-compiler/COPYING",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "google-code-prettify/tools/closure-compiler/README",
    "content": "/*\n * Copyright 2009 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//\n// Contents\n//\n\nThe Closure Compiler performs checking, instrumentation, and\noptimizations on JavaScript code. The purpose of this README is to\nexplain how to build and run the Closure Compiler.\n\nThe Closure Compiler requires Java 6 or higher.\nhttp://www.java.com/\n\n\n//\n// Building The Closure Compiler\n//\n\nThere are three ways to get a Closure Compiler executable.\n\n1) Use one we built for you.\n\nPre-built Closure binaries can be found at\nhttp://code.google.com/p/closure-compiler/downloads/list\n\n\n2) Check out the source and build it with Apache Ant.\n\nFirst, check out the full source tree of the Closure Compiler. There\nare instructions on how to do this at the project site.\nhttp://code.google.com/p/closure-compiler/source/checkout\n\nApache Ant is a cross-platform build tool.\nhttp://ant.apache.org/\n\nAt the root of the source tree, there is an Ant file named\nbuild.xml. To use it, navigate to the same directory and type the\ncommand\n\nant jar\n\nThis will produce a jar file called \"build/compiler.jar\".\n\n\n3) Check out the source and build it with Eclipse.\n\nEclipse is a cross-platform IDE.\nhttp://www.eclipse.org/\n\nUnder Eclipse's File menu, click \"New > Project ...\" and create a\n\"Java Project.\"  You will see an options screen. Give the project a\nname, select \"Create project from existing source,\" and choose the\nroot of the checked-out source tree as the existing directory. Verify\nthat you are using JRE version 6 or higher.\n\nEclipse can use the build.xml file to discover rules. When you\nnavigate to the build.xml file, you will see all the build rules in\nthe \"Outline\" pane. Run the \"jar\" rule to build the compiler in\nbuild/compiler.jar.\n\n\n//\n// Running The Closure Compiler\n//\n\nOnce you have the jar binary, running the Closure Compiler is straightforward.\n\nOn the command line, type\n\njava -jar compiler.jar\n\nThis starts the compiler in interactive mode. Type\n\nvar x = 17 + 25;\n\nthen hit \"Enter\", then hit \"Ctrl-Z\" (on Windows) or \"Ctrl-D\" (on Mac or Linux)\nand \"Enter\" again. The Compiler will respond:\n\nvar x=42;\n\nThe Closure Compiler has many options for reading input from a file,\nwriting output to a file, checking your code, and running\noptimizations. To learn more, type\n\njava -jar compiler.jar --help\n\nYou can read more detailed documentation about the many flags at\nhttp://code.google.com/closure/compiler/docs/gettingstarted_app.html\n\n\n//\n// Compiling Multiple Scripts\n//\n\nIf you have multiple scripts, you should compile them all together with\none compile command.\n\njava -jar compiler.jar --js=in1.js --js=in2.js ... --js_output_file=out.js\n\nThe Closure Compiler will concatenate the files in the order they're\npassed at the command line.\n\nIf you need to compile many, many scripts together, you may start to\nrun into problems with managing dependencies between scripts. You\nshould check out the Closure Library. It contains functions for\nenforcing dependencies between scripts, and a tool called calcdeps.py\nthat knows how to give scripts to the Closure Compiler in the right\norder.\n\nhttp://code.google.com/p/closure-library/\n\n//\n// Licensing\n//\n\nUnless otherwise stated, all source files are licensed under\nthe Apache License, Version 2.0.\n\n\n-----\nCode under:\nsrc/com/google/javascript/rhino\ntest/com/google/javascript/rhino\n\nURL: http://www.mozilla.org/rhino\nVersion:  1.5R3, with heavy modifications\nLicense:  Netscape Public License and MPL / GPL dual license\n\nDescription: A partial copy of Mozilla Rhino. Mozilla Rhino is an\nimplementation of JavaScript for the JVM.  The JavaScript parser and\nthe parse tree data structures were extracted and modified\nsignificantly for use by Google's JavaScript compiler.\n\nLocal Modifications: The packages have been renamespaced. All code not\nrelavant to parsing has been removed. A JSDoc parser and static typing\nsystem have been added.\n\n\n-----\nCode in:\nlib/libtrunk_rhino_parser_jarjared.jar\n\nRhino\nURL: http://www.mozilla.org/rhino\nVersion:  Trunk\nLicense:  Netscape Public License and MPL / GPL dual license\n\nDescription: Mozilla Rhino is an implementation of JavaScript for the JVM.\n\nLocal Modifications: None. We've used JarJar to renamespace the code\npost-compilation. See:\nhttp://code.google.com/p/jarjar/\n\n\n-----\nCode in:\nlib/args4j.jar\n\nArgs4j\nURL: https://args4j.dev.java.net/\nVersion: 2.0.12\nLicense: MIT\n\nDescription:\nargs4j is a small Java class library that makes it easy to parse command line\noptions/arguments in your CUI application.\n\nLocal Modifications: None.\n\n\n-----\nCode in:\nlib/guava.jar\n\nGuava Libraries\nURL: http://code.google.com/p/guava-libraries/\nVersion:  R7\nLicense: Apache License 2.0\n\nDescription: Google's core Java libraries.\n\nLocal Modifications: None.\n\n\n-----\nCode in:\nlib/jsr305.jar\n\nAnnotations for software defect detection\nURL: http://code.google.com/p/jsr-305/\nVersion: svn revision 47\nLicense: BSD License\n\nDescription: Annotations for software defect detection.\n\nLocal Modifications: None.\n\n\n----\nCode in:\nlib/junit.jar\n\nJUnit\nURL:  http://sourceforge.net/projects/junit/\nVersion:  4.8.2\nLicense:  Common Public License 1.0\n\nDescription: A framework for writing and running automated tests in Java.\n\nLocal Modifications: None.\n\n\n---\nCode in:\nlib/protobuf-java.jar\n\nProtocol Buffers\nURL: http://code.google.com/p/protobuf/\nVersion: 2.3.0\nLicense: New BSD License\n\nDescription: Supporting libraries for protocol buffers,\nan encoding of structured data.\n\nLocal Modifications: None\n\n\n---\nCode in:\nlib/ant.jar\nlib/ant-launcher.jar\n\nURL: http://ant.apache.org/bindownload.cgi\nVersion: 1.8.1\nLicense: Apache License 2.0\nDescription:\n  Ant is a Java based build tool. In theory it is kind of like \"make\"\n  without make's wrinkles and with the full portability of pure java code.\n\nLocal Modifications: None\n\n\n---\nCode in:\nlib/json.jar\nURL: http://json.org/java/index.html\nVersion: JSON version 20090211\nLicense: MIT license\nDescription:\nJSON is a set of java files for use in transmitting data in JSON format.\n\nLocal Modifications: None\n\n---\nCode in:\ntools/maven-ant-tasks-2.1.1.jar\nURL: http://maven.apache.org\nVersion 2.1.1\nLicense: Apache License 2.0\nDescription:\n  Maven Ant tasks are used to manage dependencies and to install/deploy to\n  maven repositories.\n\nLocal Modifications: None\n"
  },
  {
    "path": "google-code-prettify/tools/closure-compiler/amd-externs.js",
    "content": "/**\n * @param {string} id\n * @param {Array.<string>} dependencies\n * @param {Function} factory\n */\nfunction define(id, dependencies, factory) {}\n/** @type {*} */\ndefine.amd;\n"
  },
  {
    "path": "google-code-prettify/tools/closure-compiler/console-externs.js",
    "content": "var console = {};\n/**\n * @param {string} message\n */\nconsole.warn = function (message, var_args) {};\n"
  },
  {
    "path": "google-code-prettify/tools/cut-release.sh",
    "content": "#!/bin/bash\n\nfunction help_and_exit() {\n    echo \"Usage: $0 [-go] [-verbose] [-force]\"\n    echo\n    echo \"Moves minified CSS and JS to distribution directories and\"\n    echo \"creates a branch in SVN.\"\n    echo\n    echo \"  -go:       Run commands instead of just echoing them.\"\n    echo \"  -verbose:  More verbose logging.\"\n    echo \"  -force:    Ignore sanity checks for testing.\"\n    echo \"             Incompatible with -go.\"\n    echo \"  -nobranch: Don't create a new release branch.\"\n    exit \"$1\"\n}\n\n# 1 for verbose logging\nexport VERBOSE=\"0\"\n# 1 if commands that have side-effects should actually be run instead of logged\nexport EFFECT=\"0\"\n# 1 to not exit on panic.\nexport NO_PANIC=\"0\"\n# 1 to create a new branch under branches/\nexport BRANCH=\"1\"\n\nfunction panic() {\n    echo \"PANIC: $*\"\n\n    if ! (( $NO_PANIC )); then\n        exit -1\n    fi\n}\n\nfunction command() {\n    if (( $VERBOSE )) || ! (( $EFFECT )); then\n        echo '$' \"$*\"\n    fi\n    if (( $EFFECT )); then\n        \"$@\" || panic \"command failed: $@\"\n    fi\n}\n\nfunction cp_if_different() {\n    if ! [ -e \"$2\" ] || diffq \"$1\" \"$2\"; then\n        command cp \"$1\" \"$2\"\n    fi\n}\n\nfunction mime_for_file() {\n    local path=\"$1\"\n    case \"${path##*.}\" in\n        js)   echo -n \"text/javascript;charset=UTF-8\";;\n        css)  echo -n \"text/css;charset=UTF-8\";;\n        html) echo -n \"text/html;charset=UTF-8\";;\n        *)    panic \"unrecognized extension for $path\";;\n    esac\n}\n\nfor var in \"$@\"; do\n  case \"$var\" in\n      -verbose)\n          VERBOSE=\"1\"\n          ;;\n      -go)\n          EFFECT=\"1\"\n          ;;\n      -force)\n          NO_PANIC=\"1\"\n          ;;\n      -nobranch)\n          BRANCH=\"0\"\n          ;;\n      -h)\n          help_and_exit 0\n          ;;\n      *)\n          echo \"Unrecognized argument $var\"\n          help_and_exit -1\n          ;;\n  esac\ndone\n\nif (( $NO_PANIC )) && (( $EFFECT )); then\n    NO_PANIC=\"0\"\n    panic \"-force is incompatible with -go\"\nfi\n\n# Find svn root\nexport VERSION_BASE=\"$(\n  pushd \"$(dirname \"$0\")/../..\" > /dev/null; pwd; popd > /dev/null)\"\n\nif [ -z \"$VERSION_BASE\" ] || ! [ -d \"$VERSION_BASE\" ]; then\n    panic \"unknown VERSION_BASE\"\nfi\nif ! [ -d \"$VERSION_BASE/trunk\" ]; then\n    panic \"missing trunk in $VERSION_BASE\"\nfi\nif ! [ -d \"$VERSION_BASE/loader\" ]; then\n    panic \"missing loader in $VERSION_BASE\"\nfi\nif (( $BRANCH )) && ! [ -d \"$VERSION_BASE/branches\" ]; then\n    panic \"missing branches in $VERSION_BASE\"\nfi\n\nif (( $VERBOSE )); then\n    echo \"VERSION_BASE=$VERSION_BASE\"\nfi\n\n# Choose a release label\n# %e has a leading 0.  get rid of that.\nexport TODAY=\"$(date -u +%e-%b-%Y | perl -pe 's/\\s+//g')\"\nexport RELEASE_LABEL=\"release-$TODAY\"\n\nif (( $VERBOSE )); then\n    echo \"RELEASE_LABEL=$RELEASE_LABEL\"\nfi\n\nif (( $BRANCH )) && [ -e \"$VERSION_BASE/branches/$RELEASE_LABEL\" ]; then\n    panic \"duplicate release $VERSION_BASE/branches/$RELEASE_LABEL\"\nfi\n\n\n# Make the distribution\nfunction build() {\n  pushd \"$VERSION_BASE/trunk\" > /dev/null\n  make clean \\\n    && make distrib distrib/prettify.tar.bz2 distrib/prettify-small.tar.bz2 \\\n    && make lang-aliases\n  local status=$?\n  popd > /dev/null\n  (($status))\n}\nif build; then\n  panic \"Make failed\"\nfi\n\nif [ -n \"$(svn stat \"$VERSION_BASE/trunk\")\" ]; then\n  svn stat \"$VERSION_BASE/trunk\"\n  panic \"Uncommitted changes\"\nfi\n\nfunction diffq() {\n    ! diff -q \"$@\" > /dev/null\n}\n\nfunction sync() {\n    local action=\"$1\"\n    local src_dir=\"$2\"\n    local dest_dir=\"$3\"\n    shift 3\n    local exts=$@\n    local ext\n    local src_file\n    local dest_file\n    (\n        shopt -s nullglob\n        for ext in $exts; do\n            for src_file in \"$src_dir\"/*.\"$ext\"; do\n                dest_file=\"$dest_dir\"/\"$(basename \"$src_file\")\"\n                if ! [ -e \"$dest_file\" ] || \\\n                    diffq \"$src_file\" \"$dest_file\"; then\n                    \"$action\" \"$src_file\" \"$dest_file\"\n                fi\n            done\n            for dest_file in \"$dest_dir\"/*.\"$ext\"; do\n                src_file=\"$src_dir\"/\"$(basename \"$dest_file\")\"\n                if ! [ -e \"$src_file\" ]; then\n                    \"$action\" \"$src_file\" \"$dest_file\"\n                fi\n            done\n        done\n    )\n}\n\nfunction svn_sync() {\n    local src_file=\"$1\"\n    local dest_file=\"$2\"\n    if ! [ -e \"$src_file\" ]; then\n        command svn delete \"$dest_file\"\n    else\n        # Require lower-7 octets only so that it can be served even without\n        # the UTF-8 charset header.\n        if ! perl -ne 'exit -1 if m/[^\\x00-\\x7f]/' \"$src_file\"; then\n            panic \"Non-ascii export $src_file\"\n        fi\n        if [ -e \"$dest_file\" ]; then\n            cp_if_different \"$src_file\" \"$dest_file\"\n        else\n            command cp \"$src_file\" \"$dest_file\"\n            command svn add \"$dest_file\"\n            command svn propset svn:mime-type \"$(mime_for_file \"$src_file\")\" \\\n                \"$dest_file\"\n        fi\n    fi\n}\n\n# Deploy the current compiled source to /loader\nsync svn_sync \"$VERSION_BASE/trunk/distrib/google-code-prettify\" \\\n    \"$VERSION_BASE/loader\" js css\nsync svn_sync \"$VERSION_BASE/trunk/styles\" \\\n    \"$VERSION_BASE/loader/skins\" css\n\n# Cut branch\nif (( $BRANCH )); then\n  command svn copy \"$VERSION_BASE/trunk\" \"$VERSION_BASE/branches/$RELEASE_LABEL\"\nfi\n\ncp_if_different \"$VERSION_BASE/trunk/distrib/prettify.tar.bz2\" \\\n          \"$VERSION_BASE/trunk/distrib/prettify-$TODAY.tar.bz2\"\ncp_if_different \"$VERSION_BASE/trunk/distrib/prettify-small.tar.bz2\" \\\n          \"$VERSION_BASE/trunk/distrib/prettify-small-$TODAY.tar.bz2\"\n\n# Dump final instructions for caller.\necho\nif (( $EFFECT )); then\n    echo \"Finally run\"\n    echo \"    $ svn commit -m 'Release $RELEASE_LABEL'\"\n    echo \"to commit the new release then run\"\n    echo \"$ $VERSION_BASE/trunk/tools/googlecode_upload.py \\\\\"\n    echo \"    --summary='Bundle of source files, tests, and documentation' \\\\\"\n    echo \"    -p google-code-prettify -u mikesamuel \\\\\"\n    echo \"    --labels='Type-Archive,OpSys-All,Featured' \\\\\"\n    echo \"    $VERSION_BASE/trunk/distrib/prettify-$TODAY.tar.bz2\"\n    echo \"$ $VERSION_BASE/trunk/tools/googlecode_upload.py \\\\\"\n    echo \"    --summary='Minimized JS and CSS sources' \\\\\"\n    echo \"    -p google-code-prettify -u mikesamuel \\\\\"\n    echo \"    --labels='Type-Archive,OpSys-All,Featured' \\\\\"\n    echo \"    $VERSION_BASE/trunk/distrib/prettify-small-$TODAY.tar.bz2\"\n    echo \"and finally check\"\n    echo \"    http://code.google.com/p/google-code-prettify/downloads/list\"\nelse\n   echo \"Rerun with -go flag to actually execute these commands.\"\nfi\n\nexit 0\n"
  },
  {
    "path": "google-code-prettify/tools/googlecode_upload.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2006, 2007 Google Inc. All Rights Reserved.\n# Author: danderson@google.com (David Anderson)\n#\n# Script for uploading files to a Google Code project.\n#\n# This is intended to be both a useful script for people who want to\n# streamline project uploads and a reference implementation for\n# uploading files to Google Code projects.\n#\n# To upload a file to Google Code, you need to provide a path to the\n# file on your local machine, a small summary of what the file is, a\n# project name, and a valid account that is a member or owner of that\n# project.  You can optionally provide a list of labels that apply to\n# the file.  The file will be uploaded under the same name that it has\n# in your local filesystem (that is, the \"basename\" or last path\n# component).  Run the script with '--help' to get the exact syntax\n# and available options.\n#\n# Note that the upload script requests that you enter your\n# googlecode.com password.  This is NOT your Gmail account password!\n# This is the password you use on googlecode.com for committing to\n# Subversion and uploading files.  You can find your password by going\n# to http://code.google.com/hosting/settings when logged in with your\n# Gmail account. If you have already committed to your project's\n# Subversion repository, the script will automatically retrieve your\n# credentials from there (unless disabled, see the output of '--help'\n# for details).\n#\n# If you are looking at this script as a reference for implementing\n# your own Google Code file uploader, then you should take a look at\n# the upload() function, which is the meat of the uploader.  You\n# basically need to build a multipart/form-data POST request with the\n# right fields and send it to https://PROJECT.googlecode.com/files .\n# Authenticate the request using HTTP Basic authentication, as is\n# shown below.\n#\n# Licensed under the terms of the Apache Software License 2.0:\n#  http://www.apache.org/licenses/LICENSE-2.0\n#\n# Questions, comments, feature requests and patches are most welcome.\n# Please direct all of these to the Google Code users group:\n#  http://groups.google.com/group/google-code-hosting\n\n\"\"\"Google Code file uploader script.\n\"\"\"\n\n__author__ = 'danderson@google.com (David Anderson)'\n\nimport httplib\nimport os.path\nimport optparse\nimport getpass\nimport base64\nimport sys\n\n\ndef upload(file, project_name, user_name, password, summary, labels=None):\n  \"\"\"Upload a file to a Google Code project's file server.\n\n  Args:\n    file: The local path to the file.\n    project_name: The name of your project on Google Code.\n    user_name: Your Google account name.\n    password: The googlecode.com password for your account.\n              Note that this is NOT your global Google Account password!\n    summary: A small description for the file.\n    labels: an optional list of label strings with which to tag the file.\n\n  Returns: a tuple:\n    http_status: 201 if the upload succeeded, something else if an\n                 error occured.\n    http_reason: The human-readable string associated with http_status\n    file_url: If the upload succeeded, the URL of the file on Google\n              Code, None otherwise.\n  \"\"\"\n  # The login is the user part of user@gmail.com. If the login provided\n  # is in the full user@domain form, strip it down.\n  if user_name.endswith('@gmail.com'):\n    user_name = user_name[:user_name.index('@gmail.com')]\n\n  form_fields = [('summary', summary)]\n  if labels is not None:\n    form_fields.extend([('label', l.strip()) for l in labels])\n\n  content_type, body = encode_upload_request(form_fields, file)\n\n  upload_host = '%s.googlecode.com' % project_name\n  upload_uri = '/files'\n  auth_token = base64.b64encode('%s:%s'% (user_name, password))\n  headers = {\n    'Authorization': 'Basic %s' % auth_token,\n    'User-Agent': 'Googlecode.com uploader v0.9.4',\n    'Content-Type': content_type,\n    }\n\n  server = httplib.HTTPSConnection(upload_host)\n  server.request('POST', upload_uri, body, headers)\n  resp = server.getresponse()\n  server.close()\n\n  if resp.status == 201:\n    location = resp.getheader('Location', None)\n  else:\n    location = None\n  return resp.status, resp.reason, location\n\n\ndef encode_upload_request(fields, file_path):\n  \"\"\"Encode the given fields and file into a multipart form body.\n\n  fields is a sequence of (name, value) pairs. file is the path of\n  the file to upload. The file will be uploaded to Google Code with\n  the same file name.\n\n  Returns: (content_type, body) ready for httplib.HTTP instance\n  \"\"\"\n  BOUNDARY = '----------Googlecode_boundary_reindeer_flotilla'\n  CRLF = '\\r\\n'\n\n  body = []\n\n  # Add the metadata about the upload first\n  for key, value in fields:\n    body.extend(\n      ['--' + BOUNDARY,\n       'Content-Disposition: form-data; name=\"%s\"' % key,\n       '',\n       value,\n       ])\n\n  # Now add the file itself\n  file_name = os.path.basename(file_path)\n  f = open(file_path, 'rb')\n  file_content = f.read()\n  f.close()\n\n  body.extend(\n    ['--' + BOUNDARY,\n     'Content-Disposition: form-data; name=\"filename\"; filename=\"%s\"'\n     % file_name,\n     # The upload server determines the mime-type, no need to set it.\n     'Content-Type: application/octet-stream',\n     '',\n     file_content,\n     ])\n\n  # Finalize the form body\n  body.extend(['--' + BOUNDARY + '--', ''])\n\n  return 'multipart/form-data; boundary=%s' % BOUNDARY, CRLF.join(body)\n\n\ndef upload_find_auth(file_path, project_name, summary, labels=None,\n                     user_name=None, password=None, tries=3):\n  \"\"\"Find credentials and upload a file to a Google Code project's file server.\n\n  file_path, project_name, summary, and labels are passed as-is to upload.\n\n  Args:\n    file_path: The local path to the file.\n    project_name: The name of your project on Google Code.\n    summary: A small description for the file.\n    labels: an optional list of label strings with which to tag the file.\n    config_dir: Path to Subversion configuration directory, 'none', or None.\n    user_name: Your Google account name.\n    tries: How many attempts to make.\n  \"\"\"\n  if user_name is None or password is None:\n    from netrc import netrc\n    authenticators = netrc().authenticators(\"code.google.com\")\n    if authenticators:\n      if user_name is None:\n        user_name = authenticators[0]\n      if password is None:\n        password = authenticators[2]\n\n  while tries > 0:\n    if user_name is None:\n      # Read username if not specified or loaded from svn config, or on\n      # subsequent tries.\n      sys.stdout.write('Please enter your googlecode.com username: ')\n      sys.stdout.flush()\n      user_name = sys.stdin.readline().rstrip()\n    if password is None:\n      # Read password if not loaded from svn config, or on subsequent tries.\n      print 'Please enter your googlecode.com password.'\n      print '** Note that this is NOT your Gmail account password! **'\n      print 'It is the password you use to access Subversion repositories,'\n      print 'and can be found here: http://code.google.com/hosting/settings'\n      password = getpass.getpass()\n\n    status, reason, url = upload(file_path, project_name, user_name, password,\n                                 summary, labels)\n    # Returns 403 Forbidden instead of 401 Unauthorized for bad\n    # credentials as of 2007-07-17.\n    if status in [httplib.FORBIDDEN, httplib.UNAUTHORIZED]:\n      # Rest for another try.\n      user_name = password = None\n      tries = tries - 1\n    else:\n      # We're done.\n      break\n\n  return status, reason, url\n\n\ndef main():\n  parser = optparse.OptionParser(usage='googlecode-upload.py -s SUMMARY '\n                                 '-p PROJECT [options] FILE')\n  parser.add_option('-s', '--summary', dest='summary',\n                    help='Short description of the file')\n  parser.add_option('-p', '--project', dest='project',\n                    help='Google Code project name')\n  parser.add_option('-u', '--user', dest='user',\n                    help='Your Google Code username')\n  parser.add_option('-w', '--password', dest='password',\n                    help='Your Google Code password')\n  parser.add_option('-l', '--labels', dest='labels',\n                    help='An optional list of comma-separated labels to attach '\n                    'to the file')\n\n  options, args = parser.parse_args()\n\n  if not options.summary:\n    parser.error('File summary is missing.')\n  elif not options.project:\n    parser.error('Project name is missing.')\n  elif len(args) < 1:\n    parser.error('File to upload not provided.')\n  elif len(args) > 1:\n    parser.error('Only one file may be specified.')\n\n  file_path = args[0]\n\n  if options.labels:\n    labels = options.labels.split(',')\n  else:\n    labels = None\n\n  status, reason, url = upload_find_auth(file_path, options.project,\n                                         options.summary, labels,\n                                         options.user, options.password)\n  if url:\n    print 'The file was uploaded successfully.'\n    print 'URL: %s' % url\n    return 0\n  else:\n    print 'An error occurred. Your file was not uploaded.'\n    print 'Google Code upload server said: %s (%s)' % (reason, status)\n    return 1\n\n\nif __name__ == '__main__':\n  sys.exit(main())\n"
  },
  {
    "path": "google-code-prettify/tools/lang-handler-aliases.sh",
    "content": "#!/bin/bash\n\nLANG_DIR=\"$1\"\nshift\n\nHAS_LANG_FILES=1\nif echo \"$LANG_DIR\"/lang-*.js | egrep -q \"[*]\" >& /dev/null; then\n  HAS_LANG_FILES=0\nfi\n\nif [ -n \"$*\" ] || [ -z \"$LANG_DIR\" ] || ! (( $HAS_LANG_FILES )); then\n  echo \"Usage: $0 <LANG_DIR>\"\n  echo\n  echo \"Dumps lines of the form\"\n  echo \"    $LANG_DIR/lang-foo.js $LANG_DIR/lang-<extension>.js\"\n  echo \"where the first element is a path name under LANG_DIR\"\n  echo \"and the second is the name of a language extension for which\"\n  echo \"it registers an extension.\"\n  exit -1\nfi\n\nif [ -z \"$JS_INTERPRETER\" ]; then\n  JS_INTERPRETER=\"jsc-1\"\nfi\n\nif ! which \"$JS_INTERPRETER\" >& /dev/null; then\n  echo \"\\$JS_INTERPRETER ( '$JS_INTERPRETER' ) is not on the \\$PATH.\"\n  echo \"It should be an executable that loads each argument as a JS file\"\n  echo \"and runs them in a context where the print function dumps a string\"\n  echo \"to stdout.\"\n  exit -1\nfi\n\nfor JS in \"$LANG_DIR\"/lang-*.js; do\n  # Run the language handler in a context where PR.registerLangHandler\n  # dumps out the handler names without doing anything else, and\n  # then use a perl script that prepends each handler with the basename\n  # of the JS file.\n  # The JS interpreter is run with STDIN of /dev/null so that it does not\n  # hand waiting for REPL input.\n  (\"$JS_INTERPRETER\" \\\n    <(echo '\n\n      var window = this;\n      var PR = {\n        registerLangHandler: function (_, exts) {\n          for (var i = 0, n = exts.length; i < n; ++i) {\n            var handler = String(exts[i]);\n            if (/^\\w+$/.test(handler)) {\n              print(handler);\n            }\n          }\n        },\n        createSimpleLexer: function () {},\n        sourceDecorator:   function () {}\n      };\n\n      ') \\\n    \\\n    \"$JS\" \\\n    < /dev/null \\\n   || echo \"Failed to execute $JS\" 1>&2 ) \\\n    | perl -e '$JS=shift;' \\\n      -e 'use File::Basename; $DIR=dirname($JS);' \\\n      -e 'while (<STDIN>) { s/^\\w+$/$JS $DIR\\/lang-$&.js/; print; }' \\\n      \"$JS\"\ndone\n"
  },
  {
    "path": "google-code-prettify/tools/yui-compressor/LICENSE.TXT",
    "content": "YUI Compressor Copyright License Agreement (BSD License)\n\nCopyright (c) 2009, Yahoo! Inc.\nAll rights reserved.\n\nRedistribution and use of this software in source and binary forms,\nwith or without modification, are permitted provided that the following\nconditions are met:\n\n* Redistributions of source code must retain the above\n  copyright notice, this list of conditions and the\n  following disclaimer.\n\n* Redistributions in binary form must reproduce the above\n  copyright notice, this list of conditions and the\n  following disclaimer in the documentation and/or other\n  materials provided with the distribution.\n\n* Neither the name of Yahoo! Inc. nor the names of its\n  contributors may be used to endorse or promote products\n  derived from this software without specific prior\n  written permission of Yahoo! Inc.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nThis software also requires access to software from the following sources:\n\nThe Jarg Library v 1.0 ( http://jargs.sourceforge.net/ ) is available\nunder a BSD License  Copyright (c) 2001-2003 Steve Purcell,\nCopyright (c) 2002 Vidar Holen, Copyright (c) 2002 Michal Ceresna and\nCopyright (c) 2005 Ewan Mellor.\n\nThe Rhino Library ( http://www.mozilla.org/rhino/ ) is dually available\nunder an MPL 1.1/GPL 2.0 license, with portions subject to a BSD license.\n\nAdditionally, this software contains modified versions of the following\ncomponent files from the Rhino Library:\n\n[org/mozilla/javascript/Decompiler.java]\n[org/mozilla/javascript/Parser.java]\n[org/mozilla/javascript/Token.java]\n[org/mozilla/javascript/TokenStream.java]\n\nThe modified versions of these files are distributed under the MPL v 1.1\n( http://www.mozilla.org/MPL/MPL-1.1.html )\n"
  },
  {
    "path": "google-code-prettify/tools/yui-compressor/README",
    "content": "==============================================================================\nYUI Compressor\n==============================================================================\n\nNAME\n\n  YUI Compressor - The Yahoo! JavaScript and CSS Compressor\n\nSYNOPSIS\n\n  Usage: java -jar yuicompressor-x.y.z.jar [options] [input file]\n\n  Global Options\n    -h, --help                Displays this information\n    --type <js|css>           Specifies the type of the input file\n    --charset <charset>       Read the input file using <charset>\n    --line-break <column>     Insert a line break after the specified column number\n    -v, --verbose             Display informational messages and warnings\n    -o <file>                 Place the output into <file> or a file pattern. \n                              Defaults to stdout.\n\n  JavaScript Options\n    --nomunge                 Minify only, do not obfuscate\n    --preserve-semi           Preserve all semicolons\n    --disable-optimizations   Disable all micro optimizations\n\nDESCRIPTION\n\n  The YUI Compressor is a JavaScript compressor which, in addition to removing\n  comments and white-spaces, obfuscates local variables using the smallest\n  possible variable name. This obfuscation is safe, even when using constructs\n  such as 'eval' or 'with' (although the compression is not optimal is those\n  cases) Compared to jsmin, the average savings is around 20%.\n\n  The YUI Compressor is also able to safely compress CSS files. The decision\n  on which compressor is being used is made on the file extension (js or css)\n\nGLOBAL OPTIONS\n\n  -h, --help\n      Prints help on how to use the YUI Compressor\n\n  --line-break\n      Some source control tools don't like files containing lines longer than,\n      say 8000 characters. The linebreak option is used in that case to split\n      long lines after a specific column. It can also be used to make the code\n      more readable, easier to debug (especially with the MS Script Debugger)\n      Specify 0 to get a line break after each semi-colon in JavaScript, and\n      after each rule in CSS.\n\n  --type js|css\n      The type of compressor (JavaScript or CSS) is chosen based on the\n      extension of the input file name (.js or .css) This option is required\n      if no input file has been specified. Otherwise, this option is only\n      required if the input file extension is neither 'js' nor 'css'.\n\n  --charset character-set\n      If a supported character set is specified, the YUI Compressor will use it\n      to read the input file. Otherwise, it will assume that the platform's\n      default character set is being used. The output file is encoded using\n      the same character set.\n\n  -o outfile\n\n      Place output in file outfile. If not specified, the YUI Compressor will\n      default to the standard output, which you can redirect to a file.\n      Supports a filter syntax for expressing the output pattern when there are\n      multiple input files.  ex: \n          java -jar yuicompressor.jar -o '.css$:-min.css' *.css \n      ... will minify all .css files and save them as -min.css\n\n  -v, --verbose\n      Display informational messages and warnings.\n\nJAVASCRIPT ONLY OPTIONS\n\n  --nomunge\n      Minify only. Do not obfuscate local symbols.\n\n  --preserve-semi\n      Preserve unnecessary semicolons (such as right before a '}') This option\n      is useful when compressed code has to be run through JSLint (which is the\n      case of YUI for example)\n\n  --disable-optimizations\n      Disable all the built-in micro optimizations.\n\nNOTES\n\n  + If no input file is specified, it defaults to stdin.\n\n  + Supports wildcards for specifying multiple input files.\n\n  + The YUI Compressor requires Java version >= 1.4.\n\n  + It is possible to prevent a local variable, nested function or function\n    argument from being obfuscated by using \"hints\". A hint is a string that\n    is located at the very beginning of a function body like so:\n\n    function fn (arg1, arg2, arg3) {\n        \"arg2:nomunge, localVar:nomunge, nestedFn:nomunge\";\n\n        ...\n        var localVar;\n        ...\n\n        function nestedFn () {\n            ....\n        }\n\n        ...\n    }\n\n    The hint itself disappears from the compressed file.\n\n  + C-style comments starting with /*! are preserved. This is useful with\n    comments containing copyright/license information. For example:\n\n    /*!\n     * TERMS OF USE - EASING EQUATIONS\n     * Open source under the BSD License.\n     * Copyright 2001 Robert Penner All rights reserved.\n     */\n\n    becomes:\n\n    /*\n     * TERMS OF USE - EASING EQUATIONS\n     * Open source under the BSD License.\n     * Copyright 2001 Robert Penner All rights reserved.\n     */\n\nMODIFIED RHINO FILES\n\n  YUI Compressor uses a modified version of the Rhino library\n  (http://www.mozilla.org/rhino/) The changes were made to support\n  JScript conditional comments, preserved comments, unescaped slash\n  characters in regular expressions, and to allow for the optimization\n  of escaped quotes in string literals.\n\nCOPYRIGHT AND LICENSE\n\n  Copyright (c) 2010 Yahoo! Inc.  All rights reserved.\n  The copyrights embodied in the content of this file are licensed\n  by Yahoo! Inc. under the BSD (revised) open source license.\n"
  },
  {
    "path": "hardwaresetups.md",
    "content": "# Hardware set-ups\n\n## Arduino over USB \\(no shield\\)\n\nIf you don't have any shield and your hardware doesn't have any connectivity, you can still use Blynk – directly over USB :\n\n1. Open [Arduino Serial USB example](https://github.com/blynkkk/blynk-library/blob/master/examples/Boards_USB_Serial/Arduino_Serial_USB/Arduino_Serial_USB.ino) and change [Auth Token](./#getting-started-getting-started-with-application-4-auth-token)\n\n   ```cpp\n    // You could use a spare Hardware Serial on boards that have it (like Mega)\n    #include <SoftwareSerial.h>\n    SoftwareSerial DebugSerial(2, 3); // RX, TX\n\n    #define BLYNK_PRINT DebugSerial\n    #include <BlynkSimpleStream.h>\n\n    // You should get Auth Token in the Blynk App.\n    // Go to the Project Settings (nut icon).\n    char auth[] = \"YourAuthToken\";\n\n    void setup()\n    {\n      // Debug console\n      DebugSerial.begin(9600);\n\n      // Blynk will work through Serial\n      Serial.begin(9600);\n      Blynk.begin(auth, Serial);\n    }\n\n    void loop()\n    {\n      Blynk.run();\n    }\n   ```\n\n2. Run the script which is usually located in `/scripts` folder:\n   * Windows:`My Documents\\Arduino\\libraries\\Blynk\\scripts`\n   * Mac    `User$/Documents/Arduino/libraries/Blynk/scripts`\n\n**On Windows:**\n\nOpen cmd.exe\n\nWrite your path to blynk-ser.bat folder. For example:\n\n```text\ncd C:\\blynk-library-0.3.1\\blynk-library-0.3.1\\scripts\n```\n\nRun `blynk-ser.bat` file. For example : `blynk-ser.bat -c COM4` \\(where COM4 is port with your Arduino\\)\n\nAnd press \"Enter\", press \"Enter\" and press \"Enter\"\n\n**On Linux and Mac**:\n\nNavigate to /scripts folder. For example:\n\n```text\ncd User$/Documents/Arduino/libraries/Blynk/scripts\n```\n\nWhen inside this folder, run:\n\n```text\nuser:scripts User$ ./blynk-ser.sh\n```\n\n**Warning:** Do no close terminal window with running script.\n\nIn some cases you may also need to perform :\n\n```text\nuser:scripts User$ chmod +x blynk-ser.sh\n```\n\nYou may need also to run it with `sudo`\n\n```text\nuser:scripts User$ sudo ./blynk-ser.sh\n```\n\nThis is what you'll see in Terminal app on Mac \\(usbmodem address can be different\\):\n\n```text\n[ Press Ctrl+C to exit ]\n/dev/tty.usbmodem not found.\nSelect serial port [ /dev/tty.usbmodem1451 ]:\n```\n\nCopy the serial port address: `/dev/tty.usbmodem1451` and paste it back:\n\n```text\nSelect serial port [ /dev/tty.usbmodem1451 ]: /dev/tty.usbmodem1451\n```\n\nAfter you press Enter, you should see an output similar to this:\n\n```text\nResetting device /dev/tty.usbmodem1451...\nConnecting: GOPEN:/dev/tty.usbmodem1451,raw,echo=0,clocal=1,cs8,nonblock=1,ixoff=0,ixon=0,ispeed=9600,ospeed=9600,crtscts=0 <-> openssl-connect:blynk-cloud.com:9443,cafile=/Users/.../server.crt,nodelay\n2015/10/03 00:29:45 socat[30438.2046857984] N opening character device \"/dev/tty.usbmodem1451\" for reading and writing\n2015/10/03 00:29:45 socat[30438.2046857984] N opening connection to LEN=16 AF=2 45.55.195.102:9443\n2015/10/03 00:29:45 socat[30438.2046857984] N successfully connected from local address LEN=16 AF=2 192.168.0.2:56821\n2015/10/03 00:29:45 socat[30438.2046857984] N SSL connection using AES128-SHA\n2015/10/03 00:29:45 socat[30438.2046857984] N starting data transfer loop with FDs [3,3] and [4,4]\n```\n\n**NOTE:** Arduino IDE may complain with \"programmer is not responding\". You need to terminate script before uploading new sketch.\n\nAdditional materials:\n\n* [Tutorial: Control Arduino over USB with Blynk app. No shield required. Mac OS\\)](https://www.youtube.com/watch?v=fgzvoan_3_w)\n* [How to control arduino \\(Wirelessly\\) with blynk via USB. Windows](https://www.youtube.com/watch?v=I_hgIj2FdPI)\n* [Instructables: Control Arduino with Blynk over USB](http://www.instructables.com/id/Control-arduino-using-Blynk-over-usb/)\n\n## Raspberry Pi\n\n1. Connect your Raspberry Pi to the Internet and open it's console.\n2. Run this command \\(it updates your OS package repository to include the required packages\\):\n\n   ```text\n    curl -sL \"https://deb.nodesource.com/setup_6.x\" | sudo -E bash -\n   ```\n\n3. Download and build Blynk JS library using npm:\n\n   ```text\n    sudo apt-get update && sudo apt-get upgrade\n    sudo apt-get install build-essential\n    sudo apt-get install -g npm \n    sudo npm install -g onoff\n    sudo npm install -g blynk-library\n   ```\n\n4. Run Blynk test script \\(put your auth token\\):\n\n   ```text\n    blynk-client 715f8cafe95f4a91bae319d0376caa8c\n   ```\n\n5. You can write our own script based on [examples](https://github.com/vshymanskyy/blynk-library-js/tree/master/examples)\n6. To enable Blynk auto restart for Pi, find `/etc/rc.local` file and add there:\n\n   ```text\n    node full_path_to_your_script.js <Auth Token>\n   ```\n\nAdditional materials:\n\n* [Instructables: Blynk on Javascript for Raspberry Pi, Intel Edison and others](http://www.instructables.com/id/Blynk-JavaScript-in-20-minutes-Raspberry-Pi-Edison)\n* [Instructables: Use DHT11/DHT12 sensors with Raspberry Pi and Blynk](http://www.instructables.com/id/Raspberry-Pi-Nodejs-Blynk-App-DHT11DHT22AM2302/?ALLSTEPS)\n\n**Note:** Instead of using Node.js, you can also build a C++ libarry version \\(same as Arduino, WiringPi-based\\) installation:\n\n* [Library README for Linux](https://github.com/blynkkk/blynk-library/blob/master/linux/README.md)\n* [Blynk Community Topic: How-To Raspberry Pi](https://community.blynk.cc/t/howto-for-raspberry-pi/332)\n* [Video tutorial - Setting up Blynk and Raspberry Pi:](https://www.youtube.com/watch?v=iSG_8g6KyGE)\n\n## ESP8266 Standalone\n\nYou can run Blynk directly on the ESP8266!\n\nInstall the latest ESP8266 library for Arduino using [this guide](https://github.com/esp8266/Arduino#installing-with-boards-manager).\n\n**Example Sketch:** [ESP8266\\_Standalone](https://github.com/blynkkk/blynk-library/blob/master/examples/Boards_WiFi/ESP8266_Standalone/ESP8266_Standalone.ino)\n\nAdditional materials:\n\n* [Instructables: ESP8266 ESP-12\\(Standalone\\)+ Blynk](http://www.instructables.com/id/ESP8266-ESP-12Standalone-Blynk-101)\n* [Instructables: ESP8266-12 standalone Blynk lm35 temperature sensor](http://www.instructables.com/id/ESP8266-12-blynk-wireless-temperature-LM35-sensor/?ALLSTEPS)\n\n[Step-by-Step Tutorial in Russian language](http://esp8266.ru/esp8266-blynk)\n\n## NodeMCU\n\nPlease follow [this detailed instruction](https://github.com/blynkkk/blynk-library/tree/master/examples/Boards_WiFi/NodeMCU#instruction-for-nodemcu-setup). Or watch [this Video tutorial](https://www.youtube.com/watch?v=FhS44hGk1Lc).\n\n## Arduino + ESP8266 WiFi with AT commands\n\nThis connection type is not recommended for beginners.  \nIf you would like to try it, please carefully read [this help topic](http://help.blynk.cc/hardware-and-libraries/arduino/esp8266-with-at-firmware) **Note:** Some boards like Arduino UNO WiFi from Arduino.org, do not use AT commands \\(and do not provide relevant libraries\\), so this renders them unusable with Blynk.\n\n## Particle\n\nBlynk works with the whole family of Particle products: Core, Photon and Electron\n\n1. Open [Particle Web IDE](https://build.particle.io/build).\n2. Go to the libraries.\n3. Search for **Blynk** in the Community Libraries and click on it\n4. Open `01_PARTICLE.INO` example\n5. Click \"use this example\"\n6. Put your Auth Token here: `char auth[] = \"YourAuthToken\";` and flash the Particle!\n\nYou can scan this QR code from the Blynk App and you'll get a ready-to-test project for **Particle Photon**. Just put your Auth Token into the `01_PARTICLE.INO` example. ![](.gitbook/assets/Particle%20Demo1530733075.png)\n\nAdditional materials:\n\n* [Particle core + DHT22](https://www.hackster.io/gusgonnet/temperature-humidity-monitor-with-blynk-7faa51)\n\n"
  },
  {
    "path": "http.md",
    "content": "# HTTP RESTful API\n\nBlynk HTTP RESTful API allows to easily read and write values of Pins in Blynk apps and Hardware.  \nAPI description can be found [here](http://docs.blynkapi.apiary.io). **Warning**: Blynk HTTP API still has GEO DNS issue. This means, for now you need to use direct server IP instead of hostname in order to make it work with 3-d party services like IFTTT.\n\n"
  },
  {
    "path": "https-api/api_getlastweekdata.md",
    "content": "# Download Datastream Data\n\nTo get the device data for last week, use this API call:\n\n**API call:**\n\n```text\napi/external/getRawData?token=123&days=7, (from: now - 7 days, to: now)\n```\n\n**Response example:**\n\n```text\nresponse example\n```\n\n"
  },
  {
    "path": "https-api/events-api.md",
    "content": "# Events\n\nTo trigger [Events](https://github.com/blynkkk/blynkkk.github.io/tree/1b828d2e6ad5add190596bc1bfad64e2d6aa0832/en/product/product-template-settings/events/README.md) creation from hardware \\(or other sources\\) and render them on Timeline in Device profile pages on the web and in the mobile apps, use this API call:\n\n```text\n/external/api/logEvent?token={token}&code={event_name}\n```\n\n`event_name` should be taken from [Product Template Settings](https://github.com/blynkkk/blynkkk.github.io/tree/1b828d2e6ad5add190596bc1bfad64e2d6aa0832/en/product/product-template-settings/README.md) &gt; [Events](https://github.com/blynkkk/blynkkk.github.io/tree/1b828d2e6ad5add190596bc1bfad64e2d6aa0832/en/product/product-template-settings/events/README.md)\n\n\\*\\*\\*\\*\n\n**Options:**\n\nTo render custom description of the event on the Timeline, use `event_description` parameter\n\n`/external/api/logEvent?token={token}&code={event_name}&description={event_desciption}`\n\n&gt;&gt;IMAGE OF TIMELINE WITH EVENT DESCRIPTION \\(MOBILE AND WEB\\)\n\n"
  },
  {
    "path": "https-api/external_api.md",
    "content": "# Devices\n\n## Datastreams API\n\n### Hardware\n\nGet datastream value \\(via HTTP GET\\):\n\n* `/external/api/get?token={token}&pin={pin}`\n* `/external/api/get?token={token}&dataStreamId={id}`\n\nUpdate datastream value \\(via HTTP GET\\):\n\n* `/external/api/update?token={token}&pin={pin}&value={value}`\n* `/external/api/update?token={token}&dataStreamId={id}&value={value}`\n* `/external/api/update/property?token={token}&pin={pin}&{property}={value}`\n\nGet device json \\(via HTTP GET\\):\n\n* `/external/api/device?token={token}`\n\n### Log event\n\n* `/external/api/logEvent?token={token}&code={event_name}`\n* `/external/api/logEvent?token={token}&code={event_name}&description={event_desciption}`\n\n## Devices\n\n### Devices\n\n#### Get datastream value\n\nUse HTTP **GET** method to get value of a Datastream or Virtual Pin\n\nUsing Datastream ID:\n\n```text\n/external/api/get?token={token}&dataStreamId={id}\n```\n\nUsing Virtual Pin:\n\n```text\n/external/api/get?token={token}&pin={pin}\n```\n\n**Parameters:**\n\n* `token`: AuthToken of the device\n* `pin`: Virtual Pin number. e.g. V0\n* `dataStreamId`: can be found in Product Settings &gt; Datastreams\n\nExample:\n\n```text\ncurl --get 'https://blynk.io/external/api/get?token=123&pin=V0'\n```\n\n#### Update Datastream value \\(using GET\\):\n\nYou can use HTTP **GET** method to update value of a Datastream or Virtual Pin\n\nUsing Datastream ID:\n\n```text\n/external/api/update?token={token}&dataStreamId={id}&value={value}\n```\n\nUsing Virtual Pin number:\n\n```text\n/external/api/update?token={token}&pin={pin}&value={value}\n```\n\n**Path parameters:**\n\n* `token`: AuthToken of the device\n* `dataStreamId`: can be found in Product Settings &gt; Datastreams\n* `pin`: Virtual Pin number. e.g. V0\n\nExample:\n\n```text\ncurl --get 'https://blynk.io/external/api/update?token=123&dataStreamId=1&value=100'\n```\n\n#### Update Widget parameters\n\nYou can update variuous properties of a widget \\(in the mobile app\\) which is using a specified Virtual Pin. Full list of properties here\\(LINK\\)\n\n```text\n/external/api/update/property?token={token}&pin={pin}&{property}={value}\n```\n\n**Path parameters:**\n\n* `token`: AuthToken of the device\n* `property`: property name. Full list of properties is here \\(LINK\\)\n* `pin`: Virtual Pin number. e.g. V0\n\nExample:\n\n```text\ncurl --get 'https://blynk.io/external/api/update/property?token=123&pin=V0&isDisabled=true'\n```\n\n### Events\n\n#### Create Event\n\nUse HTTP **GET** method to create a new Event on Device Timeline\n\n```text\n/external/api/logEvent?token={token}&code={event_name}&description={event_desciption}\n```\n\n**Parameters:**\n\n* `token`: AuthToken of the device\n* `code`: code of the event. Can be found in Product Template - [Events](https://github.com/blynkkk/blynkkk.github.io/tree/c0d7e83761c876050b97df1faa1120a59ba1f125/en/product-1/events/README.md)\n* `description`: optionally you can add custom description to the event and it will be rendered on Device Timeline in mobile apps and on the web\n\nExample:\n\n```text\ncurl --get 'https://blynk.io/external/api/logEvent?token=123&code=critical_error&description=\"custom description\"'\n```\n\nCreate Event on Device Timeline\n\n* `/external/api/logEvent?token={token}&code={event_name}`\n\n\\`\\`\n\n* `/external/api/logEvent?token={token}&code={event_name}&description={event_desciption}`\n\n"
  },
  {
    "path": "implementing.md",
    "content": "# Implementing a Blynk HW client \\(library\\)\n\nCurrently we provide Arduino/C++ implementation of the library. It is very extensible and modular, look at [the list of supported hardware](./#supported-hardware). Adding new connection types and Arduino-compatible boards is easy.\n\nTODO: Porting guide.\n\nBut some devices are programmed in other languages, like:\n\n* Espruino, JavaScript, Node.JS\n* MicroPython, Python\n* NodeMCU, eLua\n\nThis document hints how to write a custom library.\n\n## Blynk library main functions\n\n* Provide easy-to use API\n  * Virtual pin handlers registration\n  * Provide comfortable wrappers for some widgets\n* Manage connection\n  * Should support different connection type/hardware, if applicable\n* Serialize/deserialize Blynk protocol\n* Handle direct pin operations\n* Should be portable across similar devices \\(or same technology/programming language\\), if possible\n* Should detect and notify the user about [troubles](./#troubleshooting) where possible \\(especially Flood\\)\n\n### Adding new HW board\n\nDifferent boards can be added by creating JSON board description file.\n\n```javascript\n{\n    \"name\": \"Arduino UNO\",\n    \"map\": {\n        \"digital\": {\n            \"pins\": {\n                \"D0\":  0,  \"D1\":  1,  \"D2\":  2,  \"D3\":  3, \"D4\": 4,\n                \"D5\":  5,  \"D6\":  6,  \"D7\":  7,  \"D8\":  8, \"D9\": 9,\n                \"D10\": 10, \"D11\": 11, \"D12\": 12, \"D13\": 13\n            },\n            \"ops\": [ \"dr\", \"dw\" ]\n        },\n        \"analog\": {\n            \"pins\": {\n                \"A0\": 14, \"A1\": 15, \"A2\": 16, \"A3\": 17, \"A4\": 18, \"A5\": 19\n            },\n            \"ops\": [ \"dr\", \"dw\", \"ar\" ],\n            \"arRange\":[0, 1023]\n        },\n        \"pwm\": {\n            \"pins\": [\n                \"D3\", \"D5\", \"D6\", \"D9\", \"D10\", \"D11\"\n            ],\n            \"ops\": [ \"aw\" ],\n            \"awRange\":[0, 255]\n        },\n        \"virtual\":  {\n            \"pinsRange\": [ 0, 31 ],\n            \"ops\": [ \"vr\", \"vw\" ]\n        }\n    }\n}\n```\n\nLook at the [full boards list](https://github.com/blynkkk/blynk-library/tree/master/boards_json). You can send us your own board description file for review and App integration.\n\nThere may be a problem that you want to start testing your implementation, but your board is not listed int the Blynk App. On Android, we now have a \"Generic Board\" specially for such purposes. Unfortunately iOS does not have it yet.\n\nBasically you can select UNO board and check how it works using just virtual pins. Most digital pins will also work. Analog IO/PWM will not work in general, until we add your board to the App.\n\n"
  },
  {
    "path": "index.html",
    "content": "  <!-- Flatdoc -->\n  <script src=\"scripts/jquery-1.9.1.min.js\"></script>\n  <script src='scripts/legacy.js'></script>\n  <script src='scripts/flatdoc.js'></script>\n\n  <!-- Flatdoc theme -->\n  <link  href='css/style.css' rel='stylesheet'>\n  <script src='scripts/script.js'></script>\n\n  <!-- Meta -->\n  <meta content=\"Documentation for Blynk, the most popular IoT  platform for businesses.\" property=\"og:title\">\n  <meta content=\"Firmware API, supported hardware, connection management, Blynk Mobile apps, tutorials, and more\" name=\"description\">\n  <meta property=\"og:image\" content=\"https://static.tildacdn.com/tild3134-3266-4130-a530-623337623131/blynk-iot-badge2x_2.jpg\" />\n  <meta property=\"fb:app_id\" content=\"257953674358265\" />\n  <meta name=\"twitter:card\" content=\"summary\"/>\n  <meta name=\"twitter:site\" content=\"@blynk_app\"/>\n  <meta name=\"twitter:title\" content=\"Blynk\" />\n  <meta name=\"twitter:description\" content=\"Firmware API, supported hardware, connection management, Blynk Mobile apps, tutorials, and more\" />\n  <meta name=\"twitter:image\" content=\"https://static.tildacdn.com/tild3134-3266-4130-a530-623337623131/blynk-iot-badge2x_2.jpg\" />\n  <meta name=\"keywords\" content=\"iot, blynk, documentation, platform, app, mobile, hardware, connect, wifi, ios, android, sensor, relay, actuator, dht11,dht21, esp32, esp8266, raspberry pi, tutorial\" />\n  <link rel=\"shortcut icon\" href=\"https://static.tildacdn.com/tild3635-3036-4035-a165-303666303662/favicon-2.ico\" type=\"image/x-icon\" />\n  <link rel=\"apple-touch-icon\" href=\"https://static.tildacdn.com/tild6162-3338-4066-b133-336663656335/Blynk_Diamond_Shape2.png\">\n  <link rel=\"apple-touch-icon\" sizes=\"76x76\" href=\"https://static.tildacdn.com/tild6162-3338-4066-b133-336663656335/Blynk_Diamond_Shape2.png\">\n  <link rel=\"apple-touch-icon\" sizes=\"152x152\" href=\"https://static.tildacdn.com/tild6162-3338-4066-b133-336663656335/Blynk_Diamond_Shape2.png\">\n  <link rel=\"apple-touch-startup-image\" href=\"https://static.tildacdn.com/tild6162-3338-4066-b133-336663656335/Blynk_Diamond_Shape2.png\">\n \n\n  <!-- Initializer -->\n  <script>\n    var lang = 'en';\n    var setLang = function(newLang){\n      lang = newLang;\n      switch (lang) {\n        case('en'):\n          Flatdoc.run({\n            fetcher: Flatdoc.file([\n              'IntroAndDownloads.md',\n              'GettingStarted.md',\n              'HardwareSetUps.md',\n              'BlynkMainOperations.md',\n              'Widgets.md',\n              'Sharing.md',\n              'http.md',\n              'SupportedHardware.md',\n              'Troubleshooting.md',\n              'Security.md',\n              'OTA.md',\n              'BlynkServer.md',\n              'BlynkFirmware.md',\n              'FAQ.md',\n              'Links.md',\n              'License.md'\n            ])\n          });\n          break;\n        case('ru'):\n          Flatdoc.run({\n            fetcher: Flatdoc.file([\n              'Widgets-RU.md'\n            ])\n          });\n      }\n    };\n    setLang('en');\n\n  </script>\n\n</head>\n<body role='flatdoc'>\n\n  <div class='header'>\n    <div class='left'>\n      <h1><a href='https://blynk.io'>Blynk</a></h1>\n      <ul>\n        <li onclick={setLang('en')}><p class=\"lang active\">EN</p></li>\n        <li onclick={setLang('ru')}><p class=\"lang\">RU</p></li>\n      </ul>\n    </div>\n    <div class='right'>\n      <!-- GitHub buttons: see http://ghbtns.com -->\n\n            <ul>\n        <li><a href='https://blynk.io'>Home</a></li>\n        <li><a href='https://blynk.io/en/getting-started'>Getting Started</a></li>\n        <li><a href='https://docs.blynk.cc/'>docs </a></li>\n        <li><a href='https://community.blynk.cc/'>Community</a></li>\n</ul>\n    </div>\n  </div>\n\n  <div class='content-root'>\n\n    <div class='menubar'>\n      <div class='menu section' role='flatdoc-menu'></div>\n    </div>\n    <div role='flatdoc-content' class='content'></div>\n  </div>\n\n</body>\n</html>\n"
  },
  {
    "path": "introanddownloads.md",
    "content": "\n## Intro\n\n## 🚨🚨🚨 **IMPORTANT:** \n\n> ## :warning: This documentation is for the LEGACY version of Blynk platform which is no longer supported and will be shut down.\n> You can sign up for the current version of Blynk platform [here](http://blynk.cloud/dashboard/register).\n> The new mobile apps can be downloaded from [App Store](https://apps.apple.com/us/app/blynk-iot/id1559317868) and [Google Play](https://play.google.com/store/apps/details?id=cloud.blynk&hl=en&gl=US).\n> The actual Blynk documentation is [here](https://docs.blynk.io/).\n\nThis guide will help you understand how to get started using Blynk and give a comprehensive overview of all the features.\n\nIf you want to jump straight into playing with Blynk, check out Getting Started.   \n\n\n[Getting Started &gt;](./#getting-started)\n\n### How Blynk Works\n\nBlynk was designed for the Internet of Things. It can control hardware remotely, it can display sensor data, it can store data, vizualize it and do many other cool things.\n\nThere are three major components in the platform:\n\n* **Blynk App** - allows to you create amazing interfaces for your projects using various widgets we provide.\n* **Blynk Server** - responsible for all the communications between the smartphone and hardware. You can use our Blynk Cloud or run your [private Blynk server](./#blynk-server) locally. It's open-source, could easily handle thousands of devices and can even be launched on a Raspberry Pi.\n* **Blynk Libraries** - for all the popular hardware platforms - enable communication with the server and process all the incoming and outcoming commands.\n\nNow imagine: every time you press a Button in the Blynk app, the message travels to ~~space~~ the Blynk Cloud, where it magically finds its way to your hardware. It works the same in the opposite direction and everything happens in a blynk of an eye.\n\n![](.gitbook/assets/architecture.png)\n\n### Features\n\n* Similar API & UI for all supported hardware & devices\n* Connection to the cloud using:\n  * WiFi\n  * Bluetooth and BLE\n  * Ethernet\n  * USB \\(Serial\\)\n  * GSM\n  * ...\n* Set of easy-to-use Widgets\n* Direct pin manipulation with no code writing\n* Easy to integrate and add new functionality using virtual pins\n* History data monitoring via SuperChart widget\n* Device-to-Device communication using Bridge Widget\n* Sending emails, tweets, push notifications, etc.\n* ... new features are constantly added!\n\nYou can find [example sketches](https://github.com/blynkkk/blynk-library/tree/master/examples) covering basic Blynk Features. They are included in the library. All the sketches are designed to be easily combined with each other.\n\n### What do I need to Blynk?\n\nAt this point you might be thinking: **\"Ok, I want it. What do I need to get started?\"** – Just a couple of things, really:\n\n#### **1. Hardware**.\n\nAn Arduino, Raspberry Pi, or a similar development kit.\n\n**Blynk works over the Internet.** This means that the hardware you choose should be able to connect to the internet. Some of the boards, like Arduino Uno will need an Ethernet or Wi-Fi Shield to communicate, others are already Internet-enabled: like the ESP8266, Raspberri Pi with WiFi dongle, Particle Photon or SparkFun Blynk Board. But even if you don't have a shield, you can connect it over USB to your laptop or desktop \\(it's a bit more complicated for newbies, but we got you covered\\). What's cool, is that the [list of hardware](./#supported-hardware) that works with Blynk is huge and will keep on growing.\n\n#### **2. A Smartphone**.\n\nThe Blynk App is a well designed interface builder. It works on both iOS and Android, so no holywars here, ok?\n\n## Downloads\n\n### **Blynk Apps for iOS or Android** \n\n[![Drawing](.gitbook/assets/appstore-lrg.svg)](https://itunes.apple.com/us/app/blynk-control-arduino-raspberry/id808760481?ls=1&mt=8)        [![Drawing](https://play.google.com/intl/en_us/badges/images/apps/en-play-badge.png)](https://play.google.com/store/apps/details?id=cc.blynk)\n\n### **Blynk Library** \n\n[Download The Blynk Library &gt;](https://github.com/blynkkk/blynk-library/releases/latest)\n\nIn case you forgot, or don't know how to install Arduino libraries [click here](http://www.arduino.cc/en/guide/libraries).\n\n"
  },
  {
    "path": "license.md",
    "content": "# License\n\nThis project is released under The MIT License \\(MIT\\)\n\n"
  },
  {
    "path": "links.md",
    "content": "# Links\n\n* [Blynk site](https://www.blynk.cc)\n* [Blynk community](https://community.blynk.cc)\n* [Facebook](https://www.fb.com/blynkapp)\n* [Twitter](https://twitter.com/blynk_app)\n* [Blynk Library](https://github.com/blynkkk/blynk-library)\n* [Blynk Examples](https://github.com/blynkkk/blynk-library/tree/master/examples)\n* [Blynk Server](https://github.com/blynkkk/blynk-server)\n* [Kickstarter campaign](https://www.kickstarter.com/projects/167134865/blynk-build-an-app-for-your-arduino-project-in-5-m/description)\n\n"
  },
  {
    "path": "mobile/README.md",
    "content": "# mobile\n\n"
  },
  {
    "path": "mobile/accelerometer.md",
    "content": "\n### Accelerometer\n\nAccelerometer is kind of [motion sensors](https://developer.android.com/guide/topics/sensors/sensors_motion.html) \nthat allows you to detect motion of your smartphone. \nUseful for monitoring device movement, such as tilt, shake, rotation, or swing. \nConceptually, an acceleration sensor determines the acceleration that is applied to a device by measuring the forces \nthat are applied to the sensor. Measured in ```m/s^2``` applied to ```x```, ```y```, ```z``` axis.\n\nIn order to accept data from it you need to : \n\n```cpp\nBLYNK_WRITE(V1) {\n  //acceleration force applied to axis x\n  int x = param[0].asFloat(); \n  //acceleration force applied to axis y\n  int y = param[1].asFloat();\n  //acceleration force applied to axis z\n  int z = param[2].asFloat();\n}\n```\n\nAccelerometer doesn't work in background.\n"
  },
  {
    "path": "mobile/barometer.md",
    "content": "\n### Barometer/pressure\n\nBarometer/pressure is kind of [environment sensors](https://developer.android.com/guide/topics/sensors/sensors_environment.html) \nthat allows you to measure the ambient air pressure.\n\nMeasured in in ```hPa``` or ```mbar```.\n\nIn oder to accept data from it you need to : \n\n```cpp\nBLYNK_WRITE(V1) {\n  //pressure in mbar\n  int pressure = param[0].asInt(); \n}\n```\n\nBarometer doesn't work in background.\n"
  },
  {
    "path": "mobile/ble.md",
    "content": "\n### BLE\n\nWidget for enabling Bluetooth Low Energy support. At the moment BLE widget requires \ninternet connection in order to login and load your profile. However this will be fixed soon. Also some Blynk \nwidgets not allowed with BLE.\n\nBlynk currently support bunch of different modules. Please check sketches below.\n \n**Sketches:** [BLE](https://github.com/blynkkk/blynk-library/tree/master/examples/Boards_Bluetooth)"
  },
  {
    "path": "mobile/bluetooth.md",
    "content": "\n### Bluetooth\n\nWidget for enabling Bluetooth support. At the moment Bluetooth widget supported only for Android and requires \ninternet connection in order to login and load your profile. However this will be fixed soon. Also some Blynk \nwidgets not allowed with Bluetooth.\n                                                                                              \nBlynk currently support bunch of different modules. Please check sketches below.\n \n**Sketches:** [Bluetooth](https://github.com/blynkkk/blynk-library/tree/master/examples/Boards_Bluetooth)"
  },
  {
    "path": "mobile/bridge.md",
    "content": "\n### Bridge\n\nBridge can be used for Device-to-Device communication (no app. involved). You can send digital/analog/virtual write commands \nfrom one device to another, knowing it's auth token.\nAt the moment Bridge widget is not required on application side (it is mostly used for indication that we have such feature).  \n**You can use multiple bridges to control multiple devices.**\n\nBridge widget takes a virtual pin, and turns it into a channel to control another device. It means you can control any \nvirtual, digital or analog pins of the target device.\nBe careful not to use pins like ```A0, A1, A2 ...``` when communicating between different device types, as \nArduino Core may refer to wrong pins in such cases.\n\n\nExample code for device A which will send values to device B :\n```cpp\n//Initiating Bridge Widget on V1 of Device A\nWidgetBridge bridge1(V1);\n...\nvoid setup() {\n    Blynk.begin(...);\n    while (Blynk.connect() == false) {\n        // Wait until Blynk is connected\n    }\n    bridge1.digitalWrite(9, HIGH); // will trigger D9 HIGH on Device B. No code on Device B required\n    bridge1.analogWrite(10, 123);\n    bridge1.virtualWrite(V1, \"hello\"); // you need to write code on Device B in order to receive this value. See below\n    bridge1.virtualWrite(V2, \"value1\", \"value2\", \"value3\");\n}\n\nBLYNK_CONNECTED() {\n  bridge1.setAuthToken(\"OtherAuthToken\"); // Token of the hardware B\n}\n```\n\nIMPORTANT: when performing ```virtualWrite()``` with Bridge Widget, Device B will need to process the incoming data from Device A. \nFor example, if you are sending value from Device A to Device B using ```bridge.virtualWrite(V5)``` you would need to use this handler on Device B:\n\n```cpp\nBLYNK_WRITE(V5){\n    int pinData = param.asInt(); //pinData variable will store value that came via Bridge\n}\n```\n\nKeep in mind that ```bridge.virtualWrite``` doesn't send any value to mobile app. You need to call ```Blynk.virtualWrite``` for that.\n\n**Sketch:** [Bridge](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Bridge/Bridge.ino)"
  },
  {
    "path": "mobile/button.md",
    "content": "\n### Button\n\nWorks in push or switch modes. Allows to send any number value on button click and button release events. By default  \nbutton uses 0/1 (LOW/HIGH) values. Button sends 1 (HIGH) on press and sends 0 (LOW) on release.\n\nYou can change button state from hardware side. For example, turn on button assigned to virtual pin V1 : \n\n```cpp\nBlynk.virtualWrite(V1, HIGH);\n```\n\nYou can change button labels from hardware with : \n\n```cpp\nBlynk.setProperty(V1, \"onLabel\", \"ON\");\n```\n\n```cpp\nBlynk.setProperty(V1, \"offLabel\", \"OFF\");\n```\n\nor change color : \n\n```cpp\n//#D3435C - Blynk RED \nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\nYou can also get button state from server in case your hardware was disconnected with Blynk Sync feature : \n\n```cpp\nBLYNK_CONNECTED() {\n  Blynk.syncVirtual(V1);\n}\n\nBLYNK_WRITE(V1) {\n  int buttonState = param.asInt();\n}\n```\n\n#### Home Screen Button\n\nYou can also add button to your Android Home Screen. Button works via HTTPS in that case. Have in mind that in \"Home Screen\" \nmode button has few limitations. It may not work instantly due to Android Widget limitations. Button will update it's \nstate only once per 15 min. \n\n**Note :** Adding home screen widget costs 100 energy. This energy not rechargeable.\n**Note :** Home Screen Widgets for Local Blynk servers requires port 8080 to be opened.\n\n\n**Sketch:** [Basic Sketch](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n**Sketch:** [Physical Button Interrupt](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonInterrupt/ButtonInterrupt.ino)\n\n**Sketch:** [Physical Button Poll](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonPoll/ButtonPoll.ino)\n\n**Sketch:** [Physical Button State Sync](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/SyncPhysicalButton/SyncPhysicalButton.ino)"
  },
  {
    "path": "mobile/datastreams.md",
    "content": "# Datastreams\n\n"
  },
  {
    "path": "mobile/device_selector.md",
    "content": "\n### Device Selector\n\nDevice selector is a powerful widget which allows you to update widgets based on one active device. \nThis widget is particularly helpful when you have a fleet of devices with similar functionality.\n\nImagine you have 4 devices and every device has a Temperature & Humidity sensor connected to it. To display the data for all 4 devices you would need to add 8 widgets.\n\nWith Device Selector, you can use only 2 Widgets which will display Temperature and Humidity based on the active device chosen in Device Selector.  \n\nAll you have to do is:\n\n1. Add Device Selector Widget to the project\n2. Add 2 widgets (for example Value Display Widget) to show Temperature and Humidity\n3. In Widgets Settings you will be able assign them to Device Selector (Source or Target section)\n4. Exit settings, Run the project. \n\nNow you can change the active device in Device Selector and you will see that Temperature and Humidity values are reflecting the data updates for the device you just picked.\n\n**NOTE : ** Webhook Widget will not work with Device Selector (yet).\n"
  },
  {
    "path": "mobile/device_tiles.md",
    "content": "### Device Tiles\n\nDevice tiles is a powerful widget and very similar to the device selector widget, but with UI. It allows you to display 1 pin per device per tile. This widget is particularly helpful when you have a fleet of devices with similar functionality. So you can group similar devices within one layout (template).\n"
  },
  {
    "path": "mobile/email.md",
    "content": "\n### Email\n\nEmail widget allows you to send email from your hardware to any address.\n\nExample code:\n```cpp\nBlynk.email(\"my_email@example.com\", \"Subject\", \"Your message goes here\");\n```\n  \nIt also contains ```to``` field. With this field you may define receiver of email in the app. \nYou may skip ```to``` field when you want to send email to your Blynk app login email:\n \n ```cpp\n Blynk.email(\"Subject\", \"Your message goes here\");\n ```\n\nYou can send either ```text/html``` or ```text/plain``` (some clients don't support ```text/html```) email.\nYou can change this content type of email in the Mail widget settings.\n\nAdditionally you may use ```{DEVICE_NAME}```, ```{DEVICE_OWNER_EMAIL}``` and ```{VENDOR_EMAIL}``` (for the local server)\nplaceholders in the mail for the ```to```, ```subject``` and ```body``` fields:\n\n```cpp\nBlynk.email(\"{DEVICE_OWNER_EMAIL}\", \"{DEVICE_NAME} : Alarm\", \"Your {DEVICE_NAME} has critical error!\");\n```\n\nLimitations :\n\n- Maximum allowed email + subject + message length is 120 symbols. However you can increase this limit if necessary \nby adding ```#define BLYNK_MAX_SENDBYTES XXX``` to you sketch. Where ```XXX``` is desired max length of your email. \nFor example for ESP you can set this to 1200 max length ```#define BLYNK_MAX_SENDBYTES 1200```. The \n```#define BLYNK_MAX_SENDBYTES 1200``` must be included before any of the Blynk includes.\n- Only 1 email per 5 seconds is allowed;\n- In case you are using gmail you are limited with 500 mails per day (by google). Other providers may have similar\nlimitations, so please be careful;\n- User is limited with 100 messages per day;\n\n### Unicode in email\n\nThe library handles all strings as UTF8 Unicode. If you're facing problems, try to print your message to the Serial \nand see if it works (the terminal should be set to UTF-8 encoding). If it doesn't work, probably you should read \nabout unicode support of your compiler. \nIf it works, but your message is truncated - you need to increase message length limit \n(all Unicode symbols consume at least twice the size of Latin symbols).\n\n### Increasing message length limit\n\nYou can increase maximum message length by putting on the top of your sketch (before Blynk includes):\n```cpp\n#define BLYNK_MAX_SENDBYTES 256 // Default is 128\n```\n\n**Sketch:** [Email](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Email/Email.ino)"
  },
  {
    "path": "mobile/eventor.md",
    "content": "\n### Eventor\n\nEventor widget allows you to create simple behaviour rules or **events**. \nLet's look at a typical use case: read temperature from DHT sensor and send push notification when the temperature is over a certain limit :  \n \n```cpp\n  float t = dht.readTemperature();\n  if (isnan(t)) {\n    return;\n  }\n  if (t > 40) {\n    Blynk.notify(String(\"Temperature is too high : \") + t);\n  }\n```\n\nWith Eventor you don't need to write this code. All you need is to send the value from the sensor to the server :\n\n```cpp\n  float t = dht.readTemperature();\n  Blynk.virtualWrite(V0, t);\n```\nDon't forget that ```virtualWrite``` commands should be wrapped in the timer and can't be used in the main loop.\n\n**NOTE** Don't forget to add notification widget.\n\nEventor comes handy when you need to change conditions on the fly without re-uploading new sketch on \nthe hardware. You can create as many **events** as you need.\nEventor also could be triggered from the application side. You just need to assign the widget to the same pin as your Event within Eventor.\nEventor doesn't constantly sends events. Let's consider simple event as above ```if (temperature > 40) send notification ```.\nWhen temperature goes beyond 40 threshold - notification action is triggered. If temperature continues to stay above the \n40 threshold no actions will be triggered. But if ```temperature``` goes below threshold and then passes it again -\nnotification will be sent again (there is no 5 sec limit on Eventor notifications).\n \nEventor also supports Timer events. For example, you can set a pin ```V1``` ON/HIGH at 21:00:00 every Friday.\nWith Eventor Time Event you can assign multiple timers on same pin, send any string/number, select days and timezone.\n\nIn order to remove created **event** please use swipe. You can also swipe out last element in the Event itself. \n\n**Sketch:** [Eventor](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Eventor/Eventor.ino)\n\n\n**NOTE:** The timer widget rely on the server time and not your phone time. Sometimes the phone time may not match the server time. \n**NOTE** : Events are triggered only once when the condition is met. That's mean \n[chaining of events](https://community.blynk.cc/t/eventor-behavior-bug-feature/20962) is not possible (however, could be enabled for commercials).\n"
  },
  {
    "path": "mobile/gauge.md",
    "content": "\n### Gauge\n\nA great visual way to display incoming numeric values.\n\nCan work in 2 modes : \n\n- PUSH mode (select if from Frequency Reading picker);\n- Frequency Reading mode;\n\nIn PUSH mode you update gauge from hardware side with code : \n \n```cpp\nBlynk.virtualWrite(V1, val); \n```\n\nIn this mode every message that hardware sends to server is stored automatically on server. PUSH mode doesn't require \napplication to be online or opened.\n\nWith Frequency Reading mode you need to select update interval and application will trigger events with required timing. \nYour application should be open and running in order to make requests to hardware. You don't need any code for Analog and \nDigital pins in that case. However for virtual pins you need to use next code : \n\n```cpp\n//triggered from app\nBLYNK_READ(V1)\n{\n  //send to app\n  Blynk.virtualWrite(V1, val);\n}\n```\n\n#### Formatting options\n\nGauge also has \"Label\" field which allows use to use formatting.\nLet's assume, your sensor sends number 12.6789 to Blynk application.\nNext formatting options are supported:\n\n```/pin/``` - displays the value without formatting (12.6789)\n\n```/pin./``` - displays the value without decimal part (13)\n\n```/pin.#/``` - displays the value with 1 decimal digit (12.7)\n\n```/pin.##/``` - displays the value with two decimal places (12.68)\n\n#### Other options\n\nYou can also change gauge label from hardware with : \n\n```cpp\nBlynk.setProperty(V1, \"label\", \"My Gauge Label\");\n```\n\nor change color : \n\n```cpp\n//#D3435C - Blynk RED\nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\n**Sketch:** [BlynkBlink](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)"
  },
  {
    "path": "mobile/gps_streaming.md",
    "content": "\n### GPS Streaming\n\nUseful for monitoring smartphone location data such as latitude, longitude, altitude and speed (speed could be often 0  \nin case smartphone doesn't support it).\n\nIn order to accept data from this widget you need to : \n\n```cpp\nBLYNK_WRITE(V1) {\n  float latitude = param[0].asFloat(); \n  float longitude = param[1].asFloat();\n  float altitude = param[2].asFloat();\n  float speed = param[3].asFloat();\n}\n```\n\nor you can use prepared wrapper ```GpsParam``` :\n\n```cpp\nBLYNK_WRITE(V1) {\n  GpsParam gps(param);\n  // Print 6 decimal places for Lat\n  Serial.println(gps.getLat(), 7);\n  Serial.println(gps.getLon(), 7);\n  \n  Serial.println(gps.getAltitude(), 2);\n  Serial.println(gps.getSpeed(), 2);\n}\n```\n\nGPS Streaming works in background.\n\n**Sketch:** [GPS Stream](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/GPS_Stream/GPS_Stream.ino)"
  },
  {
    "path": "mobile/gps_trigger.md",
    "content": "\n### GPS Trigger\n\nGPS trigger widget allows easily trigger events when you arrive to or leave from some destination. This widget \nwill work in background and periodically will check your coordinates. In case your location is within/out required \nradius (selected on widget map) widget will send ```HIGH```/```LOW``` command to hardware. For example, let's assume you have \nGPS Trigger widget assigned to pin ```V1``` and option ```Trigger When Enter```. In that case when you'll arrive to destination \npoint widget will trigger ```HIGH``` event.\n\n```cpp\nBLYNK_WRITE(V1) {\n  int state = param.asInt();\n  if (state) {\n      //You enter destination\n  } else {\n      //You leave destination\n  }\n}\n```\n\nMore details on how GPS widget works you can read [here](https://developer.android.com/guide/topics/location/strategies.html).\n\nGPS trigger widget works in background."
  },
  {
    "path": "mobile/graph.md",
    "content": "\n### Graph\n\nEasily plot incoming data from your project in various designs. You can also scroll and zoom graph.\n\nCan work in 2 modes : \n\n- PUSH mode (select if from Frequency Reading picker);\n- Frequency Reading mode;\n\nIn PUSH mode you update gauge from hardware side with code : \n \n```cpp\nBlynk.virtualWrite(V1, val); \n```\n\nIn this mode every message that hardware sends to server is stored automatically on server. PUSH mode doesn't require \napplication to be online or opened.\n\nWith Frequency Reading mode you need to select update interval and application will trigger events with required timing. \nYour application should be open and running in order to make requests to hardware. You don't need any code for Analog and \nDigital pins in that case. However for virtual pins you need to use next code : \n\n```cpp\n//triggered from app\nBLYNK_READ(V1)\n{\n  //send to app\n  Blynk.virtualWrite(V1, val);\n}\n```\n\n**Sketch:** [BlynkBlink](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)"
  },
  {
    "path": "mobile/gravity.md",
    "content": "\n### Gravity\n\nGravity is kind of [motion sensors](https://developer.android.com/guide/topics/sensors/sensors_motion.html) \nthat allows you to detect motion of your smartphone. \nUseful for monitoring device movement, such as tilt, shake, rotation, or swing. \n\nThe gravity sensor provides a three dimensional vector indicating the direction and magnitude of gravity. \nMeasured in ```m/s^2``` of gravity force applied to ```x```, ```y```, ```z``` axis.\n\nIn oder to accept data from it you need to : \n\n```cpp\nBLYNK_WRITE(V1) {\n  //force of gravity applied to axis x\n  int x = param[0].asFloat(); \n  //force of gravity applied to axis y\n  int y = param[1].asFloat();\n  //force of gravity applied to axis y\n  int z = param[2].asFloat();\n}\n```\n\nGravity doesn't work in background.\n"
  },
  {
    "path": "mobile/humidity.md",
    "content": "\n### Humidity\n\nHumidity is kind of [environment sensors](https://developer.android.com/guide/topics/sensors/sensors_environment.html) \nthat allows you to measure ambient relative humidity.\n\nMeasured in ```%``` - actual relative humidity in percent.\n\nIn oder to accept data from it you need to : \n\n```cpp\nBLYNK_WRITE(V1) {\n  // humidity in %\n  int humidity = param.asInt();\n}\n```\n\nHumidity doesn't work in background.\n"
  },
  {
    "path": "mobile/image.md",
    "content": "\n### Image\n\nImage widget allows you to display any image within your project. You need to provide http/s url to it.\nUrl should be valid endpoint to the binary data of the image. Url shortener will not work.\n\nRight now image widget supports 2 display options:\n - **Fit**: Image will be scaled to fit height or width of the widget size;\n - **Fill**: Image will be scaled to fill widget area. Cropping may occur;\n\nYou can make image widget interactive by providing multiple links to different images\nwith different states and change displayed image index from your hardware or via Eventor widget.\n\nFor example, select the first icon from the list :\n\n```cpp\nBlynk.virtualWrite(V1, 1); //image indexing starts from 1\n```\n\nYou can also change opacity, scale or rotation of the displayed the image :\n\n```cpp\nBlynk.setProperty(V1, \"opacity\", 50); // 0-100%\n```\n\n```cpp\nBlynk.setProperty(V1, \"scale\", 30); // 0-100%\n```\n\n```cpp\nBlynk.setProperty(V1, \"rotation\", 10); //0-360 degrees\n```\n\nalso, you can fully replace the list of images from the hardware:\n\n```cpp\nBlynk.setProperty(V1, \"urls\", \"https://image1.jpg\", \"https://image2.jpg\");\n```\n\nor you can change individual image by it index:\n\n```cpp\nBlynk.setProperty(V1, \"url\", 1, \"https://image1.jpg\");\n```\n\n"
  },
  {
    "path": "mobile/joystick.md",
    "content": "\n### Joystick\n\nControl servo movements in 4 directions.\n\n#### Settings:\n\n- **SPLIT**:\nEach of the parameters is sent directly to the Pin on your hardware (e.g D7). You don't need to write any code.\n\n**NOTE:** In this mode you send multiple commands from one widget, which can reduce performance of your hardware.\n\nExample: If you have a Joystick Widget and it's set to D3 and D4, it will send 2 commands over the Internet:\n\n```cpp\ndigitalWrite(3, x);\ndigitalWrite(4, y);\n```\n\n- **MERGE**:\nWhen MERGE mode is selected, you are sending just 1 message, consisting of array of values. But you'll need to parse it on the hardware. \n\nThis mode can be used with Virtual Pins only.\n\t\nExample: Add a Joystick Widget and set it to MERGE mode. Choose Virtual Pin V1\n\t\n```cpp\nBLYNK_WRITE(V1) // Joystick assigned to V1 \n{\n  // get x \n  int x = param[0].asInt(); \n  // get y\n  int y = param[1].asInt();\n}\n```\n\n- **Rotate on Tilt**\nWhen it's ON, Joystick will automatically rotate if you use your smartphone in landscape orientation. \n\n- **Auto-Return**\nWhen it's OFF, Joystick handle will not return back to center position. It will stay where you left it.\n \n### Send On Release\n**Send On Release** is available for most controller widgets and allows you to decrease data traffic on your hardware. \nFor example, when you move joystick widget, commands are continuously streamed to the hardware, during a single joystick move \nyou can send dozens of commands. There are use-cases where it's needed, however creating such a load may cause hardware reset. \nWe recommend enabling **Send On Release** feature for most of the cases, unless you really need instant feedback.\nThis option is enabled by default.\n\n### Write interval\nSimilar to above option. However, allows you to stream values to your hardware within certain interval. For example, \nsetting write interval to 100 ms - means, that while you move slider only 1 value will be send to hardware within 100 ms.\nThis option also used to decrease data traffic on your hardware.\n\n**Sketch:** [JoystickTwoAxis](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/JoystickTwoAxis/JoystickTwoAxis.ino)\n"
  },
  {
    "path": "mobile/labeled_value.md",
    "content": "\n### Labeled Value\n\nDisplays incoming data from your sensors or Virtual Pins. It is a better version of 'Value Display' as it has a formatting \nstring, so you could format incoming value to any string you want.\n\nCan work in 2 modes : \n\n- PUSH mode (select if from Frequency Reading picker);\n- Frequency Reading mode;\n\nIn PUSH mode you update value display from hardware side with code : \n \n```cpp\nBlynk.virtualWrite(V1, val); \n```\n\nIn this mode every message that hardware sends to server is stored automatically on server. PUSH mode doesn't require \napplication to be online or opened.\n\nWith Frequency Reading mode you need to select update interval and application will trigger events with required timing. \nYour application should be open and running in order to make requests to hardware. You don't need any code for Analog and \ndigital pins in that case. However for virtual pins you need to use next code : \n\n```cpp\n//triggered from app\nBLYNK_READ(V1)\n{\n  //send to app\n  Blynk.virtualWrite(V1, val);\n}\n```\n\n#### Formatting options\n\nLet's assume, your sensor sends number 12.6789 to Blynk application.\nNext formatting options are supported:\n\n```/pin/``` - displays the value without formatting (12.6789)\n\n```/pin./``` - displays the value without decimal part (13)\n\n```/pin.#/``` - displays the value with 1 decimal digit (12.7)\n\n```/pin.##/``` - displays the value with two decimal places (12.68)\n\n#### Home Screen Labeled Value\n\nYou can also add Labeled Value to your Android Home Screen. Labeled Value works via HTTPS in that case. \nHave in mind that in \"Home Screen\" mode Labeled Value has few limitations. Labeled Value will update it's state only \nonce per 15 min. You can change this via Widget Settings. However update interval less than 15 minutes is not guaranteed. \nYou can also resize Labeled Value on Home Screen - just do long click on widget and resize it as you need.\n\n**Note :** Adding home screen widget costs 100 energy. This energy not rechargeable.\n**Note :** Home Screen Widgets for Local Blynk servers requires port 8080 to be opened.\n\n**Sketch:** [BlynkBlink](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)"
  },
  {
    "path": "mobile/labeled_value_display.md",
    "content": "\n### Labeled Value\n\nDisplays incoming data from your sensors or Virtual Pins. It is a better version of 'Value Display' as it has a formatting \nstring, so you could format incoming value to any string you want.\n\nCan work in 2 modes : \n\n- PUSH mode (select if from Frequency Reading picker);\n- Frequency Reading mode;\n\nIn PUSH mode you update value display from hardware side with code : \n \n```cpp\nBlynk.virtualWrite(V1, val); \n```\n\nIn this mode every message that hardware sends to server is stored automatically on server. PUSH mode doesn't require \napplication to be online or opened.\n\nWith Frequency Reading mode you need to select update interval and application will trigger events with required timing. \nYour application should be open and running in order to make requests to hardware. You don't need any code for Analog and \ndigital pins in that case. However for virtual pins you need to use next code : \n\n```cpp\n//triggered from app\nBLYNK_READ(V1)\n{\n  //send to app\n  Blynk.virtualWrite(V1, val);\n}\n```\n\n#### Formatting options\n\nLet's assume, your sensor sends number 12.6789 to Blynk application.\nNext formatting options are supported:\n\n```/pin/``` - displays the value without formatting (12.6789)\n\n```/pin./``` - displays the value without decimal part (13)\n\n```/pin.#/``` - displays the value with 1 decimal digit (12.7)\n\n```/pin.##/``` - displays the value with two decimal places (12.68)\n\n#### Home Screen Labeled Value\n\nYou can also add Labeled Value to your Android Home Screen. Labeled Value works via HTTPS in that case. \nHave in mind that in \"Home Screen\" mode Labeled Value has few limitations. Labeled Value will update it's state only \nonce per 15 min. You can change this via Widget Settings. However update interval less than 15 minutes is not guaranteed. \nYou can also resize Labeled Value on Home Screen - just do long click on widget and resize it as you need.\n\n**Note :** Adding home screen widget costs 100 energy. This energy not rechargeable.\n**Note :** Home Screen Widgets for Local Blynk servers requires port 8080 to be opened.\n\n**Sketch:** [BlynkBlink](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)"
  },
  {
    "path": "mobile/lcd.md",
    "content": "\n### LCD\n\nThis is a regular 16x2 LCD display made in our secret facility in China. It can work in 2 modes : \n\n- Simple\n- Advanced\n\n#### Simple mode\n\nIn simple mode your LCD widget performs as regular widget with Frequency reading.\n\nWith Frequency Reading mode you need to select update interval and application will trigger events with required timing. \nYour application should be open and running in order to make requests to hardware. You don't need any code for Analog and \nDigital pins in that case. However for virtual pins you need to use next code : \n\n```cpp\n//triggered from app\nBLYNK_READ(V1)\n{\n  //send to app\n  Blynk.virtualWrite(V1, val);\n}\n```\n\nIn Simple mode LCD also supports formatting options.\n\n##### Formatting options\n\nLet's assume, your sensor sends number 12.6789 to Blynk application.\nNext formatting options supported:\n\n```/pin/``` - displays the value without formatting (12.6789)\n\n```/pin./``` - displays the value without decimal part (13)\n\n```/pin.#/``` - displays the value with 1 decimal digit (12.7)\n\n```/pin.##/``` - displays the value with two decimal places (12.68)\n\n**Sketch:** [LCD Simple Mode Pushing](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_SimpleModePushing/LCD_SimpleModePushing.ino)\n\n**Sketch:** [LCD Simple Mode Reading](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_SimpleModeReading/LCD_SimpleModeReading.ino)\n\n#### Advanced mode\n\nAdvanced mode is for experienced users. Allows you to use special commands to control LCD.\n\n#### Commands\n\nInit LCD variable : \n\n```cpp\nWidgetLCD lcd(V1);\n```\n\nSend message : \n\n```cpp\nlcd.print(x, y, \"Your Message\");\n```\nWhere ```x``` is a symbol position (0-15), ```y``` is a line number (0 or 1), \n\nClear LCD : \n\n```cpp\nlcd.clear();\n```\n\n**Sketch:** [LCD Advanced Mode](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_AdvancedMode/LCD_AdvancedMode.ino)"
  },
  {
    "path": "mobile/led.md",
    "content": "\n### LED\n\nA simple LED for indication. You need to send 0 in order to turn LED off. And 255 in order to turn LED on. Or just use\nBlynk API as described below :\n\n```cpp\n//register to virtual pin 1\nWidgetLED led1(V1);\nled1.off();\nled1.on();\n```\n    \nAll values between 0 and 255 will change LED brightness :\n\n```cpp\nWidgetLED led2(V2);\n//set brightness of LED to 50%.\nled2.setValue(127); \n```\n\nYou can also change LED color with : \n\n```cpp\n//#D3435C - Blynk RED \nBlynk.setProperty(V1, \"color\", \"#D3435C\"); \n```\n\n#### Home Screen LED\n\nYou can also add LED to your Android Home Screen. LED works via HTTPS in that case. Have in mind that in \"Home Screen\" \nmode LED has few limitations. LED will update it's state only once per 15 min. You can change this via Widget \nSettings. However update interval less than 15 minutes is not guaranteed. \n\n**Note :** Adding home screen widget costs 100 energy. This energy not rechargeable.\n**Note :** Home Screen Widgets for Local Blynk servers requires port 8080 to be opened.\n\n**Sketch:** [LED](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LED/LED_Blink/LED_Blink.ino)"
  },
  {
    "path": "mobile/level_display.md",
    "content": "\n### Level Display\n\nDisplays incoming data from your sensors or Virtual Pins. Level Display is very similar to progress bar, it is very nice \nand fancy view for indication of \"filled\" events, like \"level of battery\". \nYou can update value display from hardware side with code : \n \n```cpp\nBlynk.virtualWrite(V1, val); \n```\n\nEvery message that hardware sends to server is stored automatically on server. PUSH mode doesn't require \napplication to be online or opened.\n\n**Sketch:** [Push Example](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushData/PushData.ino)"
  },
  {
    "path": "mobile/light.md",
    "content": "\n### Light\n\nLight is kind of [environment sensors](https://developer.android.com/guide/topics/sensors/sensors_environment.html) \nthat allows you to measure level of light (measures the ambient light level (illumination) in lx).\nIn phones it is used to control screen brightness.\n\nIn order to accept data from it you need to : \n\n```cpp\nBLYNK_WRITE(V1) {\n  //light value\n  int lx = param.asInt(); \n}\n```\n\nLight doesn't work in background.\n"
  },
  {
    "path": "mobile/map.md",
    "content": "\n### Map\n\nMap widget allows you set points/pins on map from hardware side. This is very useful widget in case you have \nmultiple devices and you want track their values on map.\n\nYou can send a point to map with regular virtual write command :  \n\n```cpp\nBlynk.virtualWrite(V1, pointIndex, lat, lon, \"value\");\n```\n\nWe also created a wrapper for you to make usage of map simpler : \n\nYou can change button labels from hardware with : \n\n```cpp\nWidgetMap myMap(V1);\n...\nint index = 1;\nfloat lat = 51.5074;\nfloat lon = 0.1278;\nmyMap.location(index, lat, lon, \"value\");\n```\n\nUsing save ```index``` allows you to override existing point value.\n\n**Sketch:** [Basic Sketch](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Map/Map.ino)"
  },
  {
    "path": "mobile/menu.md",
    "content": "\n### Menu\n\nMenu widget allows you to send command to your hardware based on selection you made on UI. Menu\nsends index of element you selected and not label string. Sending index is starts from 1.\nIt works same way as usual ComboBox element. \n\nExample code:\n```cpp\nBLYNK_WRITE {\n  switch (param.asInt()) {\n    case 1: { // Item 1\n      Serial.println(\"Item 1 selected\");\n      break;\n    }\n    case 2: { // Item 2\n      Serial.println(\"Item 2 selected\");\n      break;\n    }    \n  }\n}\n```\n\nYou can also set Menu items from hardware side with : \n```cpp\nBlynk.setProperty(V1, \"labels\", \"label 1\", \"label 2\", \"label 3\");\n```\n\n**Sketch:** [Menu](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Menu/Menu.ino)"
  },
  {
    "path": "mobile/music_player.md",
    "content": "\n### Music Player\n\nSimple UI element with 3 buttons - simulates music player interface. Every button sends it's own command to hardware : \n```play```, ```stop```, ```prev```, ```next```.\n\nYou can change widget state within the app from hardware side with next commands:\n\n```\nBlynk.virtualWrite(Vx, “play”);\nBlynk.virtualWrite(Vx, “stop”);\n```\n\nYou can also change widget play/stop state with next code (equivalent to above commands) : \n\n```Blynk.setProperty(V1, \"isOnPlay\", \"false\");```\n\n**Sketch:** [Music Player](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Player/Player.ino)"
  },
  {
    "path": "mobile/notification.md",
    "content": "\n### Push Notifications\n\nPush Notification widget allows you to send push notification from your hardware to your device. Currently it also \ncontains 2 additional options :\n\n- **Notify when hardware offline** - you will get push notification in case your hardware went offline.\n- **Offline Ignore Period** - defines how long hardware could be offline (after it went offline) before sending notification. \nIn case period is exceeded - \"hardware offline\" notification will be send. You will get no notification in case hardware \nwas reconnected within specified period.\n- **Priority** high priority gives more chances that your message will be delivered without any delays. \nSee detailed explanation [here](https://firebase.google.com/docs/cloud-messaging/concept-options#setting-the-priority-of-a-message). \n\n**WARNING** : high priority contributes more to battery drain compared to normal priority messages.\n\nExample code:\n```cpp\nBlynk.notify(\"Hey, Blynkers! My hardware can push now!\");\n```\n\nYou can also use placeholder for device name, that will be replaced on the server with your device name:\n```cpp\nBlynk.notify(\"Hey, Blynkers! My {DEVICE_NAME} can push now!\");\n```\n\n\nLimitations :\n\n- Maximum allowed body length is 120 symbols;\n- Every device can send only 1 notification every 5 seconds;\n\n### Unicode in push notifications\n\nThe library handles all strings as UTF8 Unicode. If you're facing problems, try to print your message to the Serial \nand see if it works (the terminal should be set to UTF-8 encoding). If it doesn't work, probably you should read \nabout unicode support of your compiler. \nIf it works, but your message is truncated - you need to increase message length limit \n(all Unicode symbols consume at least twice the size of Latin symbols).\n\n### Increasing message length limit\n\nYou can increase maximum message length by putting on the top of your sketch (before Blynk includes):\n```cpp\n#define BLYNK_MAX_SENDBYTES 256 // Default is 128\n```\n\n**Sketch:** [PushNotification](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/PushNotification/PushNotification_Button/PushNotification_Button.ino)\n"
  },
  {
    "path": "mobile/numberInput.md",
    "content": "\n### Numeric Input\n\nNumeric Input displays and let's you directly alter a number value.\nSimilar to the Step widget, it has incrementing and decrementing buttons for quicker values changes,\nwhich you can setup (step, looping) in widget settings."
  },
  {
    "path": "mobile/number_input.md",
    "content": "\n### Numeric Input\n\nNumeric Input displays and let's you directly alter a number value.\nSimilar to the Step widget, it has incrementing and decrementing buttons for quicker values changes,\nwhich you can setup (step, looping) in widget settings."
  },
  {
    "path": "mobile/proximity.md",
    "content": "\n### Proximity\n\nProximity is kind of [position sensors](https://developer.android.com/guide/topics/sensors/sensors_position.html) \nthat allows you to determine how close the face of a smartphone is to an object.\nMeasured in ```cm``` - distance from phone face to object. However most of this sensors returns only FAR / NEAR information.\nSo return value will be ```0/1```. Where 0/LOW  is ```FAR``` and 1/HIGH is ```NEAR```.\n\nIn order to accept data from it you need to : \n\n```cpp\nBLYNK_WRITE(V1) {\n  // distance to object\n  int proximity = param.asInt();\n  if (proximity) {\n     //NEAR\n  } else {\n     //FAR\n  }\n}\n```\n\nProximity doesn't work in background.\n"
  },
  {
    "path": "mobile/report.md",
    "content": "\n### Reports\n\nFunction of Reports widget is to configure and customize data reports in CSV format. You can choose between one-time or continuous scheduled reports.\n\nAlso, within the Reports you can clear all the data collected by your devices. \n\nYou need to configure initial inputs in Edit mode, and then, in Play mode you will be able to customize reports. \n\n#### Edit mode. Data inputs configuration\n\nIn edit mode (when your project is stopped) you define the Datastreams you would like to later be included in reports.\nReports widget is  designed to work with the Device Tiles widget. If you don't use Device Tiles you can still select a single device or a group of devices as a source of data for reports.\n\nYou have to choose either Device Tiles or single / group of the devices for the report. You can't combine these 2 options.\n\n#### Play mode. \n\nAfter you added source devices and their Datastreams click Play button and click on the Reports button. \n\n### Customizing Reports.\n\nEvery Report option supposes it's own settings:\n\n```Report name``` - give your report a meaningful name.\n\n```Data source``` - select the Datastreams you would like to be included in reports.\n\n```Report Frequency``` - Defines how often reports will be sent. They can be one-time and scheduled.\n```one-time``` - will instantly generate report and send it to the email addresses specified. Click on the right icon to send it.\n\nScheduled reports can be sent ```daily```/```weekly```/```monthly```.\n\n ```At Time``` will set up a time of the day the report will be sent. \n ```Start```/```End``` specifies start and end date the reports will continue to be sent. \n\nFor Weekly Report you can select a day of the week when report should be sent.\nFor Monthly report you can choose whether to send report on the first or last day of the month.\n\n```Recipients``` - specify up to 5 email addresses.\n\n```Data resolution``` defines granularity of your reports. Supported granularities are: ```minute```, ```hourly``` and ```daily```.\nFor example, when you generate daily report with 1 minute granularity you'll get ```24 * 60 * 60```\npoints in your daily report for every selected Datastream.\n\n```Group data in reports by``` -  specify the output format of the CSV file(s).\n\n```Datastream``` you will get 1 CSV file for each Datastream.\n\n```Device``` you will get 1 CSV file per each device. Each file will contain all of the included Datastreams.\n\n```Report``` you will get 1 CSV file for all your devices and all your Datastreams.\n\n```Timezone correction``` - specify the time zone adjustment if you need to get report date and time adjusted to a specific time zone\n\n```Date and time format``` - defines the format of the timestamp field of your data. You can select ```2018-06-21 20:16:48```,\n```2018-06-21T20:16:48+03:00``` or other supported formats.\n\nThere is one specific ```Timestamp``` format - which reflects the difference between the current time and midnight, January 1, 1970 UTC measured in milliseconds.\n\nAfter the report is set up - click on \"OK\" button at the right upper corner. Your report is ready.\n\n\nOnce you configured the report you will see when is the ```Next``` report scheduled and also a schedule for this report.\n\nAfter the report was sent at least once, you can see when the ```Last``` report was sent.\n\n```Last``` label also contains the status regarding the report:\n\n- ```OK```: the report was generated and sent to the Recipients successfully;\n- ```No Data```: the report doesn't contain any data for the configured period;\n- ```Error```: something went wrong. Please contact the Blynk Team support;\n\nReports will be generated even if your project is not in active (Play) mode. However, inactive projects don't generate any data.\n\n**NOTE:** all reports are encoded in UTF-16. Please, make sure you selected UTF-16 as required \"Character set\" for your csv reader.\n\n\n"
  },
  {
    "path": "mobile/rgb.md",
    "content": "\n### zeRGBa\n\nzeRGBa is usual RGB controller (color picker).\n\n#### Settings:\n\n- **SPLIT**:\nEach of the parameters is sent directly to the Pin on your hardware (e.g D7). You don't need to write any code.\n\n**NOTE:** In this mode you send multiple commands from one widget, which can reduce performance of your hardware.\n\nExample: If you have a zeRGBa Widget and it's set to D1, D2, D3 it will send 3 commands over the Internet:\n\n```cpp\ndigitalWrite(1, r);\ndigitalWrite(2, g);\ndigitalWrite(3, b);\n```\n\n- **MERGE**:\nWhen MERGE mode is selected, you are sending just 1 message, consisting of array of values. But you'll need to parse it on the hardware. \n\nThis mode can be used with Virtual Pins only.\n\t\nExample: Add a zeRGBa Widget and set it to MERGE mode. Choose Virtual Pin V1.\n\t\n```cpp\nBLYNK_WRITE(V1) // zeRGBa assigned to V1 \n{\n    // get a RED channel value\n    int r = param[0].asInt();\n    // get a GREEN channel value\n\tint g = param[1].asInt();\n\t// get a BLUE channel value\n\tint b = param[2].asInt();\n}\n```\n \n- **Send On Release** is available for most controller widgets and allows you to decrease data traffic on your hardware. \nFor example, when you move joystick widget, commands are continuously streamed to the hardware, during a single joystick move \nyou can send dozens of commands. There are use-cases where it's needed, however creating such a load may cause hardware reset. \nWe recommend enabling **Send On Release** feature for most of the cases, unless you really need instant feedback.\nThis option is enabled by default.\n\n### Write interval\nSimilar to above option. However, allows you to stream values to your hardware within certain interval. For example, \nsetting write interval to 100 ms - means, that while you move slider only 1 value will be send to hardware within 100 ms.\nThis option also used to decrease data traffic on your hardware.\n"
  },
  {
    "path": "mobile/rtc.md",
    "content": "\n### RTC\n\nReal-time clock allows you to get time from server. You can preselect any timezone on UI to get time on hardware in required locale.\n\n**Sketch:** [RTC](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/RTC/RTC.ino)"
  },
  {
    "path": "mobile/ru/accelerometer.md",
    "content": "\n### Акселерометр (Accelerometer)\n\nАкселерометр один из [сенсоров движения](https://developer.android.com/guide/topics/sensors/sensors_motion.html), \nкоторый позволяет определить движение Вашего телефона в пространстве.\nОн может пригодится для отслеживания таких событий как тряска, удар, поворот или наклон телефона. Концептуально, акселерометр определяет силу ускорения приложенную к вашему телефону. \nЕдиница измерения - м/c^2 приложенная к каждой из осей ```x```, ```y```, ```z```.\n\nЧтобы получить данные с сенсора нужно использовать следующий код :\n\n```cpp\nBLYNK_WRITE(V1) {\n  //сила ускорения, приложенная к оси x\n  int x = param[0].asFloat(); \n  //сила ускорения, приложенная к оси y\n  int y = param[1].asFloat();\n  //сила ускорения, приложенная к оси z\n  int z = param[2].asFloat();\n}\n```\n\nАкселерометр не работает при свернутом приложении.\n"
  },
  {
    "path": "mobile/ru/barometer.md",
    "content": "\n### Барометр/Давление (Barometer/pressure)\n\nБарометр один из сенсоров [окружающей среды](https://developer.android.com/guide/topics/sensors/sensors_environment.html) \nи позволяет измерять атмосферное давление.\n\nИзмеряется в ```hPa``` (гПа) или ```mbar``` (мБар).\n\nЧтобы получить данные с сенсора нужно использовать следующий код :\n\n```cpp\nBLYNK_WRITE(V1) {\n  //Давление в мБар\n  int pressure = param[0].asInt(); \n}\n```\n\nБарометр не работает при свернутом приложении.\n"
  },
  {
    "path": "mobile/ru/ble.md",
    "content": "\n### Bluetooth с низким энергопотреблением\n\nЭтот виджет позволяет включить блутзуз с низким энергопотреблением на вашем телефоне. На текущий момент виджет также \nтребует наличия интернет соединения (постараемся пофиксить в ближайшем будущем). Некоторые типы виджетов нельзя \nиспользовать вместе с блутузом, например исторический граф, так как он требует чтобы данные отправлялись на сервер, чего \nблутуз виджет не делает.\n \n**Список поддерживаемых чипов и контроллеров:** [BLE](https://github.com/blynkkk/blynk-library/tree/master/examples/Boards_Bluetooth)\n"
  },
  {
    "path": "mobile/ru/bluetooth.md",
    "content": "\n### Блютуз (Bluetooth)\n\nЭтот виджет позволяет включить блютуз на вашем телефоне. На текущий момент виджет также требует наличия интернет соединения (постараемся пофиксить в ближайшем будущем) и поддерживается только на Android. \nНекоторые типы виджетов нельзя использовать вместе с блютузом, например исторический граф, так как он требует чтобы \nданные отправлялись на сервер, чего блютуз виджет не делает.\n \n**Список поддерживаемых чипов и контроллеров:** [BLE](https://github.com/blynkkk/blynk-library/tree/master/examples/Boards_Bluetooth)\n"
  },
  {
    "path": "mobile/ru/bridge.md",
    "content": "\n### Мост (Bridge)\n\nМост может быть использован для связи между устройствами (без участия приложения). Вы можете отправлять цифровые / аналоговые / виртуальные команды записи с одного устройства на другое, зная только токен авторизации. На данный момент виджет Мост не обязательно использовать в приложении (здесь он используется для указания того, что у нас есть такая функция). \n**Вы можете использовать несколько мостов для управления несколькими устройствами.**\n\nВиджет Мост использует виртуальный пин и превращает его в канал для управления другим устройством. Это означает, что вы можете контролировать любые виртуальные, цифровые или аналоговые пины целевого устройства. Будьте осторожны, не используйте пины типа ```A0, A1, A2 ...``` при обмене данными между различными типами устройств, так как в таких случаях Arduino Core может ссылаться на неверные пины.\n\nПример кода для устройства A, которое будет отправлять значения на устройство B:\n```cpp\n//Инициирует виджет Моста на V1 устройства A\nWidgetBridge bridge1(V1);\n...\nvoid setup() {\n    Blynk.begin(...);\n    while (Blynk.connect() == false) {\n        // Ждем пока Blynk подключится\n    }\n\n    bridge1.digitalWrite(9, HIGH); // выставим триггер HIGH на D9 \n                                   // устройства B. Код на устройстве\n                                   // B не требуется\n    bridge1.analogWrite(10, 123);\n    bridge1.virtualWrite(V1, \"hello\"); // вам нужно написать код на \n                                       // устройстве B, чтобы получить\n                                       // это значение. См. ниже\n    bridge1.virtualWrite(V2, \"value1\", \"value2\", \"value3\");\n}\n\nBLYNK_CONNECTED() {\n  bridge1.setAuthToken(\"OtherAuthToken\"); // токен с устройства B\n}\n```\n\n**ВАЖНО:** при выполнении ```virtualWrite()``` с виджета Мост, устройство B должно обрабатывать входящие данные с устройства A. \nНапример, если вы отправляете значение с устройства A на устройство B, используя ```bridge.virtualWrite (V5)```, вам необходимо использовать свой обработчик на устройстве B:\n\n```cpp\nBLYNK_WRITE(V5){\n    int pinData = param.asInt(); // переменная pinData будет хранить значение,\n                                 // полученное через Bridge\n}\n```\n\nИмейте в виду, что ```bridge.virtualWrite``` не отправляет никаких значений в мобильное приложение. Для этого вам нужно вызвать ```Blynk.virtualWrite```. \n\n**Пример кода:** [Мост](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Bridge/Bridge.ino)\n"
  },
  {
    "path": "mobile/ru/button.md",
    "content": "\n### Кнопка (Button)\n\nКнопка может работать в двух режимах - в режиме переключателя (нажатие и отжатие посылает 1 сообщение) и в пуш режиме \n(нажатие посылает команду и отжатие посылает команду). Кнопка позволяет послать любое число. По умолчанию кнопка шлет \n0/1 (LOW/HIGH). В пуш режиме кнопка шлет 1 (HIGH) на нажатие и 0 (LOW) при отжатии.\n\nВы так же можете менять состояние кнопки с микроконтроллера. Например, включить кнопку на пине V1 можно так : \n\n```cpp\nBlynk.virtualWrite(V1, HIGH);\n```\n\nТак же можно поменять тексты в кнопке : \n\n```cpp\nBlynk.setProperty(V1, \"onLabel\", \"Вкл\");\n```\n\n```cpp\nBlynk.setProperty(V1, \"offLabel\", \"Выкл\");\n```\n\nНазвание самой кнопки : \n\n```cpp\nBlynk.setProperty(V1, \"label\", \"Моя кнопочка\");\n```\n\nИли изменить ее цвет : \n\n```cpp\n//#D3435C - Blynk RED \nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\nВ случае если микроконтроллер был перегружен, Вы всегда можете получить последнее состояние кнопки с сервера с помощью \nфичи синхронизации состояния: \n\n```cpp\n//как только подключились\nBLYNK_CONNECTED() {\n  //запросить информацию у сервера о состоянии пина V1\n  Blynk.syncVirtual(V1);\n}\n\n//этот метод будет вызыван после ответа сервера \nBLYNK_WRITE(V1) {\n  int buttonState = param.asInt();\n}\n```\n\n#### Кнопка на рабочем столе\n\nЕсли Вы используете Android, то Вы можете добавить Blynk кнопку на рабочий стол. В этом случае кнопка будет работать по \nпротоколу HTTPS. Такого рода кнопки имеют определенные ограничения по функционалу в связи с ограничениями платформы Android. \nНапример, Вы не можете получить мгновенную синхронизацию состояния кнопки на рабочем столе с состоянием на микроконтроллере. Так как состояние кнопки на рабочем столе обновляется раз в 15 мин.\n\n**Замечание:** Добавление виджета кнопки на рабочий стол стоит 100 энергии. Эта энергия не возвращается после удаления виджета. \nТакже такая кнопка будет работать на локальном сервере только если открыть порт 8080.\n\n\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n**Пример кода:** [Синхронизация состояния с физической кнопкой через прерывания](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonInterrupt/ButtonInterrupt.ino)\n\n**Пример кода:** [Синхронизация состояния с физической кнопкой через поллинг](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonPoll/ButtonPoll.ino)\n\n**Пример кода:** [Синхронизация состояния с физической кнопкой](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/SyncPhysicalButton/SyncPhysicalButton.ino)\n"
  },
  {
    "path": "mobile/ru/device_selector.md",
    "content": "\n### Селектор устройств (Device Selector)\n\nСелектор устройств - это мощный виджет, который позволяет обновлять виджеты на основе одного активного устройства. \nЭтот виджет особенно полезен, когда у вас есть несколько устройств с аналогичной функциональностью.\n\nПредставьте, что у вас есть 4 устройства, и к каждому устройству подключен датчик температуры и влажности. Для отображения данных по всем 4 устройствам вам необходимо добавить 8 виджетов.\n\nС помощью Селектора устройств вы можете использовать только 2 виджета, которые будут отображать температуру и влажность в зависимости от активного устройства, выбранного в Селекторе.  \n\nВсе, что вам нужно сделать, это:\n\n1. Добавить виджет Селектора устройств в проект\n2. Добавить 2 виджета (например виджет отображения значений (Value Display Widget)), чтобы отобразить температуру и влажность\n3. В настройках виджетов вы сможете назначить их на Селектор устройств (в разделе источника или цели)\n4. Выйти из настроек, запустить проект \n\nТеперь вы можете изменить активное устройство в Селекторе устройств и увидите, что значения температуры и влажности отражают обновленные данные для только что выбранного вами устройства.\n\n**ПРИМЕЧАНИЕ:** Виджет вебхук ([Webhook](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/WebHook/WebHook_GET/WebHook_GET.ino)) пока не работает с Селектором устройств.\n"
  },
  {
    "path": "mobile/ru/device_tiles.md",
    "content": "### Плитка устройств (Device Tiles)\n\nПлитка устройств - это мощный виджет, очень похожий на виджет Селектора устройств (Device Selector), но с пользовательским интерфейсом. Позволяет отображать один пин с устройства на одну плитку.\nЭтот виджет особенно полезен, когда у вас есть несколько устройств с аналогичной функциональностью. Теперь вы можете группировать похожие устройства на одном макете (шаблоне).\n"
  },
  {
    "path": "mobile/ru/email.md",
    "content": "\n### Электронная почта (Email)\n\nВиджет электронной почты позволяет отправлять электронные письма с вашего оборудования на любой адрес.\n\nПример кода:\n```cpp\nBlynk.email(\"my_email@example.com\", \"Тема\", \"Текст вашего сообщения\");\n```\n\nКод содержит первое поле ```to```. С помощью этого поля вы можете определить получателей электронной почты в приложении.\nВы можете пропустить поле ```to```, если хотите отправить электронное письмо на адрес электронной почты используемый для входа в приложение Blynk:\n\n ```cpp\n Blynk.email(\"Тема\", \"Текст вашего сообщения\");\n ```\n\nВы можете отправить электронное писбом в форматах либо ```text/html```, либо ```text/plain``` (помните что некоторые клиенты не поддерживают ```text/html```).\nВы можете изменить формат содержимого электронного письма в настройках виджета.\n\nДополнительно в письме вы можете использовать заполнители/переменные ```{DEVICE_NAME}```, ```{DEVICE_OWNER_EMAIL}``` и ```{VENDOR_EMAIL}``` (для локального сервера) в полях ```to``` (кому),``` subject``` (тема) и ```body``` (текст сообщения):\n\n```cpp\nBlynk.email(\"{DEVICE_OWNER_EMAIL}\", \"{DEVICE_NAME} : Тревога\", \"Ваше устройство {DEVICE_NAME} имеет критическую ошибку!\");\n```\n\n**Недостатки:**\n\n- Максимально допустимые ограничения (почта + тема + длина сообщения) = 120 символов. Однако вы можете увеличить этот лимит при необходимости добавив ```#define BLYNK_MAX_SENDBYTES XXX``` к вашему коду. Где ```XXX``` - это максимальная длина вашего письма в символах.\nНапример, для ESP вы можете установить максимальную длину 1200 символов ```#define BLYNK_MAX_SENDBYTES 1200```. Параметр  ```#define BLYNK_MAX_SENDBYTES 1200``` должен быть опредлен в коде до включения Blynk.\n- Разрешено отправлять 1 электронное письмо в течение 5 секунд;\n- Если вы используете Gmail сервис (Google), вы ограничены 500 письмами в день. Другие провайдеры могут иметь аналогичные ограничения, поэтому, пожалуйста, будьте внимательны;\n- Пользователи Blynk сервера ограничены 100 сообщениями в день;\n\n### Кодировка в электронной почте\n\nБиблиотека обрабатывает все строки в кодировке UTF-8. Если у вас возникли проблемы, попробуйте напечатать ваше сообщение в терминал COM порта и посмотрите на результат (терминал должен быть настроен на кодировку UTF-8). Если не работает, возможно, вам следует также прочитать о поддержке кодировок вашего компилятора. \nЕсли работает, но ваше сообщение обрезано - вам нужно увеличить ограничение длины сообщения (т.к. все символы кодировки UTF-8 потребляют как минимум вдвое больше байт информации если символы не Латинские).\n\n### Увеличение лимита длины сообщения\n\nВы можете увеличить максимальную длину сообщения, поместив в верхнюю часть своего кода строку (до опредления Blynk):\n```cpp\n#define BLYNK_MAX_SENDBYTES 256 // По умолчанию 128 байт\n```\n\n**Пример кода:** [Электронная почта](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Email/Email.ino) \n"
  },
  {
    "path": "mobile/ru/eventor.md",
    "content": "\n### Обработчик событий (Eventor)\n\nВиджет Обработчик событий позволяет создавать простые правила поведения или **события**. \nДавайте рассмотрим типичный вариант использования: считывание температуры с датчика DHT и отправка push-уведомления, когда температура превышает определенный предел:\n\n```cpp\n  float t = dht.readTemperature();\n  if (isnan(t)) {\n    return;\n  }\n  if (t > 40) {\n    Blynk.notify(String(\"Температура слишком высокая: \") + t);\n  }\n```\n\nС Обработчиком событий вам не нужно писать этот код. Все, что вам нужно, это отправить значение с датчика на сервер Blynk:\n\n```cpp\n  float t = dht.readTemperature();\n  Blynk.virtualWrite(V0, t);\n```\n\nНе забывайте, что команды ```virtualWrite``` должны быть заключены в таймер и не должны использоваться в основном цикле ```loop```.\n\n**ПРИМЕЧАНИЕ:** Не забудьте добавить виджет уведомлений в приложении.\n\nОбработчик событий пригодится вам, когда нужно изменить условия на лету без повторной загрузки нового скетча на аппаратное обеспечение. Вы можете создать столько **событий**, сколько вам нужно. Обработчик событий также может быть запущен со стороны приложения. Вам просто нужно назначить виджет на тот же контакт, что и ваше событие в Обработчике событий. \nОбработчик событий не постоянно отправляет события. Давайте рассмотрим простой пример, как показано выше ```if (temperature > 40) send notification```. Когда температура превышает 40 пороговых значений - отправляется уведомление. Если температура продолжает оставаться выше 40 никакие повторные действия не будут инициированы. Но если ```temperature``` опускается ниже порогового значения, а затем проходит его снова уведомление будет отправлено повторно (для уведомлений Обработчика событий нет ограничения отправки в течение 5 секунд).\n\n\nОбработчик событий также поддерживает события таймера (Timer). Например, вы можете установить пин ```V1``` ON/HIGH в 21:00:00 каждую пятницу.\nВ Обработчике событий вы можете назначить несколько таймеров на один и тот же пин, отправить любую строку/число, выбрать день и часовой пояс.\n \nЧтобы удалить созданное **событие**, пожалуйста, используйте сдвиг пальцем по экрану. Вы также можете перенести последний элемент самого события.\n\n**Пример кода:** [Обработчик событий](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Eventor/Eventor.ino)\n\n**ПРИМЕЧАНИЕ:** Виджет таймера зависит от времени сервера, а не вашего телефона. Иногда время телефона может не соответствовать времени сервера.\n\n**ПРИМЕЧАНИЕ:** события запускаются только один раз при выполнении условия. Это означитает что [цепочка событий] (https://community.blynk.cc/t/eventor-behavior-bug-feature/20962) невозможна (однако она может быть включена в коммерческой версии).\n"
  },
  {
    "path": "mobile/ru/gauge.md",
    "content": "\n### Указатель (Gauge)\n\nОтличный визуальный способ отображения входящих числовых значений.\n\nМожет работать в 2 режимах:\n\n- режим PUSH (выберается в списке выбора частоты считывания);\n- режим частоты считываний;\n\nВ режиме PUSH вы обновляете значения указателя со стороны оборудования с помощью кода:\n \n```cpp\nBlynk.virtualWrite(V1, val); \n```\n\nВ этом режиме каждое сообщение, которое отправляет аппаратное устройство автоматически сохраняется на сервере. Режим PUSH не требует, чтобы приложение было онлайн или открыто.\n\nВ режиме частоты считывния вам необходимо выбрать интервал обновления данных, и приложение будет запускать события считывния с требуемым периодичностью.\nВаше приложение должно быть открыто и запущено для отправки запросов на оборудование. Вам не нужен код для аналоговых и цифровых выводов в даном случае. Однако для виртуальных выводов вам необходимо использовать следующий код:\n\n```cpp\n//вызывать из приложения\nBLYNK_READ(V1)\n{\n  //отправить в приложение\n  Blynk.virtualWrite(V1, val);\n}\n```\n\n#### Параметры форматирования\n\nУказатель также имеет поле «Label» (Метка), которое позволяет использовать форматирование.\nПредположим, ваш датчик отправляет число 12.6789 в приложение Blynk.\nПоддерживаются следующие параметры форматирования:\n\n```/pin/``` - отображает значение без форматирования (12.6789)\n\n```/pin./``` - отображает значение без десятичной части (13)\n\n```/pin.#/``` - отображает значение с одним десятичным знаком (12.7)\n\n```/pin.##/``` - отображает значение с двумя десятичными знаками (12.68)\n\n#### Другие опции\n\nВы также можете изменить метку прибора с помощью:\n\n```cpp\nBlynk.setProperty(V1, \"label\", \"Мое значение метки\");\n```\n\nили изменить цвет (кодировка RGB): \n\n```cpp\n//#D3435C - Красный цвет\nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\n**Пример кода:** [Светодиод](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n"
  },
  {
    "path": "mobile/ru/gps_streaming.md",
    "content": "\r\n### Поток GPS (GPS Streaming)\r\n\r\nПолезно для мониторинга местонахождения смартфона получать данные о широте, долготе, высоте и скорости (скорость часто может быть 0, если смартфон не поддерживает ее измерение).\r\n\r\nЧтобы принимать данные из этого виджета, вам необходимо:\r\n\r\n```cpp\r\nBLYNK_WRITE(V1) {\r\n  float latitude = param[0].asFloat(); \r\n  float longitude = param[1].asFloat();\r\n  float altitude = param[2].asFloat();\r\n  float speed = param[3].asFloat();\r\n}\r\n```\r\n\r\nили вы можете использовать подготовленную оболочку ```GpsParam``` :\r\n\r\n```cpp\r\nBLYNK_WRITE(V1) {\r\n  GpsParam gps(param);\r\n  //Печать лат/лон с 6 десятичными знаками\r\n  Serial.println(gps.getLat(), 7);\r\n  Serial.println(gps.getLon(), 7);\r\n  \r\n  Serial.println(gps.getAltitude(), 2);\r\n  Serial.println(gps.getSpeed(), 2);\r\n}\r\n```\r\n\r\nПоток GPS работает в фоновом режиме.\r\n\r\n**Пример кода:** [Поток GPS](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/GPS_Stream/GPS_Stream.ino)\r\n"
  },
  {
    "path": "mobile/ru/gps_trigger.md",
    "content": "\r\n### Триггер GPS (GPS Trigger)\r\n\r\nВиджет Триггер GPS позволяет легко инициировать события, когда вы входите или выходите из географической зоны. Этот виджет будет работать в фоновом режиме и периодически будет проверять ваши координаты. Если ваше местоположение находится в пределах или вне указанной зоны (географическая зона выбирается на карте виджета), виджет отправит команду ```HIGH```/``` LOW``` на аппаратное устройство. Например, Триггер GPS назначен для пина ```V1```, и включена опция ```Trigger When Enter```. В этом случае, когда вы окажитесь в указанной географической зоне виджет вызовет событие ```HIGH```.\r\n\r\n```cpp\r\nBLYNK_WRITE(V1) {\r\n  int state = param.asInt();\r\n  if (state) {\r\n      //Вы вошли в зону\r\n  } else {\r\n      //Вы вышли из зоны\r\n  }\r\n}\r\n```\r\n\r\nПодробнее о том, как работает GPS-виджет, вы можете прочитать [здесь](https://developer.android.com/guide/topics/location/strategies.html).\r\n\r\n**ВНИМАНИЕ:** Виджет Триггер GPS работает в фоновом режиме.\r\n"
  },
  {
    "path": "mobile/ru/graph.md",
    "content": "\n### График (Graph)\n\nЛегко отображать входящие данные из вашего проекта в графическом варинате. Вы также можете прокручивать и масштабировать график.\n\nВиджет может работать в двух режимах: \n\n- режим PUSH (выбирается из списка режимов частоты считывания);\n- режим частоты считывания;\n\nВ режиме PUSH вы обновляете датчик со стороны оборудования с помощью кода:\n\n```cpp\nBlynk.virtualWrite(V1, val); \n```\n\nВ этом режиме каждое сообщение, которое аппаратное устройство отправляет на сервер, автоматически сохраняется на сервере. Режим PUSH не требует, чтобы приложение было онлайн или запущенно.\n\nВ режиме частоты считывания вам нужно выбрать интервал обновления, и приложение будет запускать события с требуемым интервалом.\nВаше приложение должно быть открыто и запущено для отправки запросов на оборудование. В данном случае вам не нужен код для аналоговых и цифровых пинов. Однако для виртуальных пинов вам необходимо использовать следующий код:\n\n```cpp\n//вызываем из приложения\nBLYNK_READ(V1)\n{\n  //отправляем в приложение\n  Blynk.virtualWrite(V1, val);\n}\n```\n\n**Пример кода:** [Светодиод](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n"
  },
  {
    "path": "mobile/ru/gravity.md",
    "content": "\n### Гравитация (Gravity)\n\nГравитация - это своего рода [датчики движения](https://developer.android.com/guide/topics/sensors/sensors_motion.html), который позволяет обнаруживать движение вашего смартфона.\nПолезно для мониторинга движения устройства, таких как наклон, встряхивание, вращение или качание.\n\nДатчик силы притяжения выдает трехмерный вектор, указывающий направление и величину силы притяжения. \nИзмеряется в ```m/s^2``` силы притяжения, приложенной к оси ```x```, ```y```, ```z```.\nДля того, чтобы принять данные от него, вам необходимо:\n\n```cpp\nBLYNK_WRITE(V1) {\n  //сила притяжения, приложенная к оси x\n  int x = param[0].asFloat(); \n  //сила притяжения, приложенная к оси y\n  int y = param[1].asFloat();\n  //сила притяжения, приложенная к оси y\n  int z = param[2].asFloat();\n}\n```\n\n**ВНИМАНИЕ:** Виджет гравитации не работает в фоновом режиме.\n"
  },
  {
    "path": "mobile/ru/humidity.md",
    "content": "### Влажность (Humidity)\r\n\r\nВлажность является своего рода [датчиком среды](https://developer.android.com/guide/topics/sensors/sensors_environment.html),\r\nкоторый позволяет измерять относительную влажность окружающей среды.\r\n\r\nИзмеряется в ```%``` - фактически это относительная влажность в процентах.\r\n\r\nДля того, чтобы принять данные от датчика, вам необходимо:\r\n\r\n```cpp\r\nBLYNK_WRITE(V1) {\r\n  //Влажность в %\r\n  int humidity = param.asInt();\r\n}\r\n```\r\n\r\n**ВНИМАНИЕ:** Влажность не работает в фоновом режиме.\r\n"
  },
  {
    "path": "mobile/ru/image.md",
    "content": "\r\n### Изображение (Image)\r\n\r\nВиджет изображений позволяет отображать любое изображение в вашем проекте. Вы должны предоставить http/s URL адрес. \r\nURL должен быть действительной конечной точкой для бинарных данных изображения. Укороченный URL робать не будет.\r\n\r\nСейчас виджет изображения поддерживает два варианта отображения:\r\n- **Fit** (Вписать): изображение будет масштабировано, в соответствовии с высотой или шириной виджета;\r\n- **Fill** (Заполнить): изображение будет масштабировано для заполнения области виджета. Может произойти обрезка изображения;\r\n\r\nВы можете сделать виджет Изображения интерактивным, предоставив несколько ссылок на разные изображения с разными состояниями и менять индекс отображаемого изображения с вашего оборудования или с помощью виджета [Обработчкий событий (Eventor)](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/eventor.md).\r\n\r\nНапример, выберите первый значок из списка:\r\n\r\n```cpp\r\nBlynk.virtualWrite(V1, 1); //индексация изображения начинается с 1\r\n```\r\n\r\nВы также можете изменить прозрачность, масштаб или поворот изображения:\r\n\r\n```cpp\r\nBlynk.setProperty(V1, \"opacity\", 50); // прозраочность 0-100%\r\n```\r\n\r\n```cpp\r\nBlynk.setProperty(V1, \"scale\", 30); // масштаб 0-100%\r\n```\r\n\r\n```cpp\r\nBlynk.setProperty(V1, \"rotation\", 10); // 0-360 градусы\r\n```\r\n\r\nтакже вы можете полностью заменить список изображений с аппаратного устройства:\r\n\r\n```cpp\r\nBlynk.setProperty(V1, \"urls\", \"https://image1.jpg\", \"https://image2.jpg\");\r\n```\r\n\r\nили вы можете изменить индивидуальное изображение по его индексу:\r\n\r\n```cpp\r\nBlynk.setProperty(V1, \"url\", 1, \"https://image1.jpg\");\r\n```\r\n\r\n"
  },
  {
    "path": "mobile/ru/joystick.md",
    "content": "\n### Джойстик (Joystick)\n\nУправление сервоприводом в 4 направлениях.\n\n#### Параметры:\n\n- **Раздельный** (SPLIT):\nКаждый из параметров отправляется непосредственно на пин вашего оборудования (например, D7 и D8). Вам не нужно писать код.\n\n**ПРИМЕЧАНИЕ:** В этом режиме вы отправляете несколько команд из одного виджета, что может снизить производительность вашего оборудования.\n\n**Пример:** Если у вас есть виджет Джойстика и он настроен на D3 и D4, он отправит две команды через Интернет:\n\n```cpp\ndigitalWrite(3, x);\ndigitalWrite(4, y);\n```\n\n- **Совмещенный** (MERGE):\nКогда выбран режим MERGE, вы отправляете только 1 сообщение, состоящее из массива значений. Но вам нужно разобрать его на оборудовании устройства.\n\nЭтот режим можно использовать только с виртуальными пин-ами.\n\t\n**Пример:** добавьте виджет Джойстика и установите его в режим \"MERGE\". Выберите виртуальный пин V1\n\t\n```cpp\nBLYNK_WRITE(V1) // Joystick assigned to V1 \n{\n  // получить x \n  int x = param[0].asInt(); \n  // получить y\n  int y = param[1].asInt();\n}\n```\n\n- **Вращать при Наклоне** (Rotate on Tilt)\nКогда это параметр включен, Джойстик будет автоматически вращаться, если вы будете использовать смартфон в горизонтальной положении.\n\n- **Автовозврат** (Auto-Return)\nКогда это парамтер выключен, ручка джойстика не вернется в центральное положение. Она останется там, где вы ее оставили.\n \n### Отправка при Отжатии (Send On Release)\n**Send On Release** доступно для большинства виджетов контроллеров и позволяет уменьшить трафик данных на ваше оборудование. Например, когда вы перемещаете виджет джойстика, команды непрерывно передаются на аппаратное устройство, во время одного движения джойстика вы можете отправлять десятки команд. Есть случаи, когда это необходимо, однако создание такой нагрузки может привести к зависанию или сбросу оборудования. Мы рекомендуем включить функцию **Send On Release** для большинства случаев, если вам не требуется мгновенная обратная связь. Эта опция включена по умолчанию.\n\n### Интервал записи (Write interval)\nПохоже на вышеуказанный вариант. Однако, позволяет вам передавать значения на ваше оборудование в через определенные интервалы времени. Например, установка интервала записи на 100 мс означает, что при перемещении ползунка на аппаратное обеспечение будет отправлено только 1 значение в течение 100 мс. Эта опция также используется для уменьшения трафика данных на ваше оборудовании.\n\n**Пример кода:** [Джойстик две оси](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/JoystickTwoAxis/JoystickTwoAxis.ino)\n"
  },
  {
    "path": "mobile/ru/labeled_value.md",
    "content": "\r\n### Значение переменной (Labeled Value)\r\n\r\nОтображает входящие данные с ваших датчиков или виртуальных пин-ов. Это лучшая версия «Отображения значений», так как в ней есть строка форматирования, где вы можете форматировать входящее значение в любую нужную вам строку.\r\n\r\n Может работать в 2 режимах:\r\n\r\n- режим PUSH (выбирается из списка частоты считывания);\r\n- режим частоты считывания.\r\n\r\n В режиме PUSH вы обновляете значения виджета со стороны аппаратного устройства с помощью кода:\r\n \r\n```cpp\r\nBlynk.virtualWrite(V1, val); \r\n```\r\n\r\nВ этом режиме каждое сообщение, которое аппаратное обеспечение отправляет на сервер, автоматически сохраняется на сервере. Режим PUSH не требует, чтобы приложение было онлайн или запущено.\r\n\r\nВ режиме частоты считывания вам нужно выбрать интервал обновления, и приложение будет запускать события с требуемым интервалом. Ваше приложение должно быть открыто и запущено для отправки запросов на оборудование.  В данном случае вам не нужен код для аналоговых и цифровых пин-ов. Однако для виртуальных пин-ов вам необходимо использовать следующий код:\r\n\r\n```cpp\r\n//взызов из приложения\r\nBLYNK_READ(V1)\r\n{\r\n  //отправка в приложение\r\n  Blynk.virtualWrite(V1, val);\r\n}\r\n```\r\n\r\n#### Параметры форматирования\r\n\r\nПредположим, ваш датчик отправляет число 12.6789 в приложение Blynk.\r\nПоддерживаются следующие параметры форматирования:\r\n\r\n```/pin/``` -  отображает значение без форматирования (12.6789)\r\n\r\n```/pin./``` -  отображает значение без десятичной части (13)\r\n\r\n```/pin.#/``` -  отображает значение с одним десятичным знаком (12.7)\r\n\r\n```/pin.##/``` - отображает значение с двумя десятичными знаками (12.68)\r\n\r\n#### Значение переменной на рабочем столе\r\n\r\nВы также можете добавить значение переменной на рабочий стол Android. В этом случае значение переменной работает через HTTPS протокол. Имейте в виду, что в режиме «Рабочий стол» обновление значений переменной имеет некоторые ограничения. Значение переменной будет обновлять свое состояние только один раз в 15 минут. Вы можете изменить этот параметр в настройках виджета. Однако интервал обновления менее 15 минут не гарантируется. Вы также можете изменить размер виджета Значение переменной на главном экране - просто сделайте долгий тап на виджете и измените его размер на необходимый.\r\n\r\n**Примечание:** Добавление виджета на домашний экран стоит 100 энергии. Энергия при удалении виджета не восстанавливается. \r\n\r\n**Примечание:** Виджеты рабочего стола для локальных серверов Blynk требуют открыть порт 8080. \r\n\r\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\r\n"
  },
  {
    "path": "mobile/ru/labeled_value_display.md",
    "content": "\r\n### Значение переменной (Labeled Value)\r\n\r\nОтображает входящие данные с ваших датчиков или виртуальных пин-ов. Это лучшая версия «Отображения значений», так как в этом виджете есть строка форматирования, поэтому вы можете форматировать входящее значение в любую нужную вам строку.\r\n\r\nМожет работать в 2 режимах:\r\n\r\n- режим PUSH ( выберитается из списка частоты считывания);\r\n- режим частоты считывания;\r\n\r\nВ режиме PUSH вы должны обновлять отображение значений на аппаратной устройстве с помощью кода:\r\n \r\n```cpp\r\nBlynk.virtualWrite(V1, val); \r\n```\r\n\r\nВ этом режиме каждое сообщение, которое аппаратное устройств отправляет на сервер, автоматически сохраняется на сервере. Режим PUSH не требует, чтобы приложение было онлайн или запущено.\r\n\r\nВ режиме частоты считывания вам нужно выбрать интервал обновления, и приложение будет запускать события с требуемым интервалом. Ваше приложение должно быть открыто и запущено для отправки запросов на оборудование. В данном случае вам не нужен код для аналоговых и цифровых пин-ов. Однако для виртуальных пин-ов вам необходимо использовать следующий код:\r\n\r\n```cpp\r\n//вызываем из приложения\r\nBLYNK_READ(V1)\r\n{\r\n  //отправляем в приложение\r\n  Blynk.virtualWrite(V1, val);\r\n}\r\n```\r\n\r\n#### Параметры форматирования\r\n\r\nПредположим, ваш датчик отправляет число 12.6789 в приложение Blynk.\r\nПоддерживаются следующие параметры форматирования:\r\n\r\n```/pin/``` -  отображает значение без форматирования (12.6789)\r\n\r\n```/pin./``` -  отображает значение без десятичной части (13)\r\n\r\n```/pin.#/``` -  отображает значение с одним десятичным знаком (12.7)\r\n\r\n```/pin.##/``` - отображает значение с двумя десятичными знаками (12.68)\r\n\r\n#### Значение переменной на главном экране\r\n\r\nВы также можете добавить значение переменной на рабочий стол Android. В этом случае значение переменной работает через HTTPS протокол. Имейте в виду, что в режиме «Рабочий стол» значение переменной имеет некторые ограничения. Значение переменной будет обновлять свое состояние только один раз в 15 минут. Вы можете изменить этот параметр через настройки виджета. Однако интервал обновления менее 15 минут не гарантируется. Вы также можете изменить размер виджета Значение переменной на рабочем столе - просто сделайте длинный тап на виджете и измените его размер на необходимый.\r\n\r\n**Примечание:** Добавление виджета на домашний экран стоит 100 энергии. Эта энергия не восстанавливается.\r\n\r\n**Примечание:** Виджеты главного экрана для локальных серверов Blynk требуют открытия порта 8080.\r\n\r\n**Пример кода:** [Светодиод](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\r\n"
  },
  {
    "path": "mobile/ru/lcd.md",
    "content": "\r\n### ЖК дисплей (LCD)\r\n\r\nЭто обычный ЖК-дисплей 16x2, \"сделанный\" на нашем секретном предприятии в Китае.\r\nВиджет может работать в двух режимах:\r\n\r\n- Простой (Simple)\r\n- Расширенный (Advanced)\r\n\r\n#### Простой режим (Simple)\r\n\r\nВ простом режиме ваш ЖК-виджет работает как обычный виджет с частотой чтения.\r\n\r\nВ режиме частоты считывания вам нужно выбрать интервал обновления данных, и приложение будет запускать события с требуемым интервалом. Ваше приложение должно быть открыто и запущено для отправки запросов на оборудование. В данном случае вам не нужен код для аналоговых и цифровых пин-ов. Однако для виртуальных пин-ов вам необходимо использовать следующий код:\r\n\r\n```cpp\r\n//вызываем из приложения\r\nBLYNK_READ(V1)\r\n{\r\n  //отправляем в приложение\r\n  Blynk.virtualWrite(V1, val);\r\n}\r\n```\r\n\r\nВ простом режиме ЖК-дисплей также поддерживает параметры форматирования.\r\n\r\n#### Параметры форматирования\r\n\r\nПредположим, ваш датчик отправляет число 12.6789 в приложение Blynk.\r\nПоддерживаются следующие параметры форматирования:\r\n\r\n```/pin/``` -  отображает значение без форматирования (12.6789)\r\n\r\n```/pin./``` -  отображает значение без десятичной части (13)\r\n\r\n```/pin.#/``` -  отображает значение с одним десятичным знаком (12.7)\r\n\r\n```/pin.##/``` - отображает значение с двумя десятичными знаками (12.68)\r\n\r\n**Пример кода:** [ЖК дисплей простой режим - PUSH](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_SimpleModePushing/LCD_SimpleModePushing.ino)\r\n\r\n**Пример кода:** [ЖК дисплей простой режим - 1 сек](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_SimpleModeReading/LCD_SimpleModeReading.ino)\r\n\r\n#### Расширенный режим (Advanced)\r\n\r\nРасширенный режим предназначен для опытных пользователей. Позволяет использовать специальные команды для управления ЖК-дисплеем.\r\n\r\n#### Команды\r\n\r\nИнициируем переменную ЖК-дисплея: \r\n\r\n```cpp\r\nWidgetLCD lcd(V1);\r\n```\r\n\r\nОтправим сообщение: \r\n\r\n```cpp\r\nlcd.print(x, y, \"Ваше сообщение\");\r\n```\r\n\r\nГде ```x``` - позиция символа (0-15), ``` y``` - номер строки (0 или 1),\r\n\r\nОчистка ЖК-дисплея:\r\n\r\n```cpp\r\nlcd.clear();\r\n```\r\n\r\n**Пример кода:** [ЖК-дисплей расширенный режим](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_AdvancedMode/LCD_AdvancedMode.ino)\r\n"
  },
  {
    "path": "mobile/ru/led.md",
    "content": "\n### Светодиод (LED)\n\nПростой светодиод для индикации. Вам нужно отправить 0, чтобы выключить светодиод. И 255 для того, чтобы включить светодиод.\nИли просто используйте Blynk API, как описано ниже:\n\n```cpp\n//регистрируемся на виртуальном пине 1\nWidgetLED led1(V1);\nled1.off();\nled1.on();\n```\n    \nВсе значения от 0 до 255 изменяют яркость светодиода:\n\n```cpp\nWidgetLED led2(V2);\n//установить яркость светодиода на 50%.\nled2.setValue(127); \n```\n\n Вы также можете изменить цвет светодиода с помощью кода:\n\n```cpp\n//#D3435C - Красный в RGB формате\nBlynk.setProperty(V1, \"color\", \"#D3435C\"); \n```\n\n#### Светодиод на рабочем столе\n\nВы можете добавить виджет светодиод на рабочий стол Android. В этом случае светодиод работает через протокол HTTPS. Имейте в виду, что в режиме «Рабочий стол» виджет светодиода имеет некоторые ограничения. Светодиод будет обновлять свое состояние только один раз в 15 минут. Вы можете изменить этот интервал через настройки виджета. Однако интервал обновления менее 15 минут не гарантируется.\n\n**Примечание:** Добавление виджета на рабочий стол стоит 100 энергии. Эта энергия не возвращается при удалении виджета.\n\n**Примечание:** Виджеты рабочего стола для локальных серверов Blynk требуют открыть порт 8080.\n\n**Пример кода:** [Диод](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LED/LED_Blink/LED_Blink.ino)"
  },
  {
    "path": "mobile/ru/level_display.md",
    "content": "\r\n### Индикатор уровня (Level Display)\r\n\r\nОтображает входящие данные с ваших датчиков или виртуальных пин-ов. Отображение уровня очень похоже на индикатор выполнения процесса, это очень красивый и причудливый вид для индикации «выполненных» событий, например «уровня заряда батареи».\r\nВы можете обновить отображение значения с аппаратной стороны с помощью кода:\r\n \r\n```cpp\r\nBlynk.virtualWrite(V1, val); \r\n```\r\n\r\nКаждое сообщение, которое аппаратное устройство отправляет на сервер, автоматически сохраняется на сервере.\r\nРежим PUSH не требует, чтобы приложение было онлайн или запущено.\r\n\r\n**Пример кода:** [Пример PUSH](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushData/PushData.ino)\r\n"
  },
  {
    "path": "mobile/ru/light.md",
    "content": "\r\n### Свет (Light)\r\n\r\nСвет - это своего рода [датчики окружающей среды](https://developer.android.com/guide/topics/sensors/sensors_environment.html), который позволяет измерять уровень освещенности (уровень внешней освещенности измеряется в люксах). В телефонах чаще всего используется для управления яркостью экрана.\r\n\r\nДля того, чтобы принять данные этого виджета, вам необходимо:\r\n\r\n```cpp\r\nBLYNK_WRITE(V1) {\r\n  //уровень освещенности\r\n  int lx = param.asInt(); \r\n}\r\n```\r\n\r\nВиджет Свет не работает в фоновом режиме.\r\n"
  },
  {
    "path": "mobile/ru/map.md",
    "content": "\r\n### Карта (Map)\r\n\r\nВиджет Карты позволяет устанавливать точки/флажки на карте со стороны оборудования. Это очень полезный виджет, если у вас есть несколько устройств, и вы хотите отслеживать их позиции на карте.\r\n\r\nВы можете отправить точку на карту с помощью обычной команды виртуальной записи:\r\n\r\n```cpp\r\nBlynk.virtualWrite(V1, pointIndex, lat, lon, \"Название\");\r\n```\r\n\r\nМы также создали оболочку, чтобы вы могли упростить использование виджета Карты.\r\nВы можете изменить метки флажков на оборудовании с помощью кода:\r\n\r\n```cpp\r\nWidgetMap myMap(V1);\r\n...\r\nint index = 1;\r\nfloat lat = 51.5074;\r\nfloat lon = 0.1278;\r\nmyMap.location(index, lat, lon, \"Название\");\r\n```\r\n\r\nИспользование уникальных ```index``` позволяет вам переопределить существующее значение точки.\r\n\r\n**Пример кода:** [Базовый пример Карты](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Map/Map.ino)\r\n"
  },
  {
    "path": "mobile/ru/menu.md",
    "content": "\r\n### Меню (Menu)\r\n\r\nВиджет Меню позволяет отправлять команды на ваше оборудование на основе выборного списка, сделанного вами в пользовательском интерфейсе. Меню отправляет индекс выбранного элемента спика, а не саму строку. Отправляемый индекс начинается с 1. Он работает так же, как типовой элемент \"Комбинированный список\" ([ComboBox](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA)).\r\n\r\nПример кода:\r\n\r\n```cpp\r\nBLYNK_WRITE {\r\n  switch (param.asInt()) {\r\n    case 1: { // Пункт 1\r\n      Serial.println(\"Выбран Пункт 1\");\r\n      break;\r\n    }\r\n    case 2: { // Пункт 2\r\n      Serial.println(\"Выбран Пункт 2\");\r\n      break;\r\n    }    \r\n  }\r\n}\r\n```\r\n\r\nВы также можете назначить пункты меню со стороны оборудования с помощью кода:\r\n \r\n```cpp\r\nBlynk.setProperty(V1, \"labels\", \"label 1\", \"label 2\", \"label 3\");\r\n```\r\n\r\n**Пример кода:** [Меню](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Menu/Menu.ino)\r\n"
  },
  {
    "path": "mobile/ru/music_player.md",
    "content": "\r\n### Музыкальный проигрыватель (Music Player)\r\n\r\nПростой элемент интерфейса с 3 кнопками - имитирует интерфейс музыкального проигрывателя. Каждая кнопка отправляет свою команду на аппаратное устройство: ```play``` (воспроизвести), ```stop``` (стоп), ```prev``` (предыдущий), ```next``` (следующий).\r\n\r\nВы можете изменить состояние виджета в приложении с аппаратной стороны с помощью следующих команд:\r\n\r\n```\r\nBlynk.virtualWrite(Vx, \"play\");\r\nBlynk.virtualWrite(Vx, \"stop\");\r\n```\r\n\r\nВы также можете изменить состояние воспроизведение/остановка виджета с помощью следующего кода (эквивалент вышеупомянутых команд):\r\n\r\n```Blynk.setProperty(V1, \"isOnPlay\", \"false\");```\r\n\r\n**Пример кода:** [Музыкальный проигрыватель](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Player/Player.ino)\r\n"
  },
  {
    "path": "mobile/ru/notification.md",
    "content": "\n### Всплывающие уведомления (Push Notifications)\n\nВиджет Push-уведомлений позволяет отправлять уведомления с вашего оборудования на ваше Android/iOS устройство. В настоящее время он также содержит три дополнительные опции:\n\n- **Уведомлять, когда оборудование отключено** (Notify when hardware offline) - вы получите push-уведомление, если ваше оборудование отключилось.\n- **Автономный период игнорирования** (Offline Ignore Period) - определяет, как долго оборудование может находиться в режиме ожидания (после того, как оно отключилось) перед отправкой уведомления.\n\nВ случае превышения периода ожидания будет отправлено уведомление «Аппаратное отключение». Вы не получите уведомление, если оборудование переподключится в течение указанного периода.\n\n- **Приоритет** (Priority) - высокий (high) приоритет дает больше шансов, что ваше сообщение будет доставлено без задержек. См. более подробное объяснение [здесь](https://firebase.google.com/docs/cloud-messaging/concept-options#setting-the-priority-of-a-message).\n\n**ПРЕДУПРЕЖДЕНИЕ**: высокий приоритет способствует большей разрядке батареи, по сравнению с обычными приоритетом уведомлений.\n\nПример кода:\n\n```cpp\nBlynk.notify(\"Привет, Blynk-еры! Мое оборудование может отправлять уведомления!\");\n```\n\nВы также можете использовать переменные/заполнители для имени устройства, который будет заменен с сервера именем вашего устройства:\n\n```cpp\nBlynk.notify(\"Привет, Blynk-еры! Мой {DEVICE_NAME} может отправлять уведомления!\");\n```\n\nОграничения:\n\n- Максимально допустимая длина уведомления составляет 120 символов;\n- Каждое устройство может отправлять только 1 уведомление каждые 5 секунд;\n\n### Кодировка всплывающих уведомлений\n\nБиблиотека обрабатывает все строки как в кодировке UTF-8. Если вы столкнулись с проблемами, попробуйте отправить ваше сообщение на последовательный порт и посмотреть, работает ли оно (терминал должен быть настроен на кодировку UTF-8). Если так не работает, возможно, вам следует прочитать о поддержке кодировки UTF-8 вашего компилятора.\nЕсли работает, но ваше сообщение урезано - вам необходимо увеличить ограничение длины сообщения (все символы UTF-8 потребляют как минимум вдвое больше байт информации).\n\n### Увеличение лимита длины уведомления\n\nВы можете увеличить максимальную длину сообщения, поместив строку (до включения Blynk) в верхнюю часть своего кода:\n\n```cpp\n#define BLYNK_MAX_SENDBYTES 256 // По умолчанию 128 байт\n```\n\n**Пример кода:** [Всплывающие уведомления](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/PushNotification/PushNotification_Button/PushNotification_Button.ino)\n"
  },
  {
    "path": "mobile/ru/numberInput.md",
    "content": "\r\n### Числовой ввод (Numeric Input)\r\n\r\nЧисловой ввод отображается и позволяет вам непосредственно ввести числовое значение.\r\nКак и в виджете [Шаг (Step)](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/step.md), он также имеет кнопки увеличения и уменьшения для более быстрого изменения значений, вы можете установить (шаг, цикл) (step, looping) в настройках виджета.\r\n"
  },
  {
    "path": "mobile/ru/number_input.md",
    "content": "\r\n### Числовой ввод (Numeric Input)\r\n\r\nЧисловой ввод отображается и позволяет вам непосредственно изменить числовое значение.\r\nКак и в виджете [Шаг (Step)](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/step.md), он также имеет кнопки увеличения и уменьшения для более быстрого изменения значений, вы можете установить (шаг, цикл) (step, looping) в настройках виджета.\r\n"
  },
  {
    "path": "mobile/ru/proximity.md",
    "content": "\r\n### Близость (Proximity)\r\n\r\nБлизость - это своего рода [датчики положения](https://developer.android.com/guide/topics/sensors/sensors_position.html)\r\nэто позволяет определить, насколько близко смартфон к лицу. Измеряется в ```cm``` (см) - расстояние от телефона до лица. Однако большинство этих датчиков возвращает только информацию FAR / NEAR.\r\nПоэтому, возвращаемое значение будет ```0 / 1```. Где 0 / LOW = ```FAR``` (далеко), а 1 / HIGH = ``` NEAR``` (рядом).\r\n \r\nДля того, чтобы принять данные из виджета, вам необходимо:\r\n\r\n```cpp\r\nBLYNK_WRITE(V1) {\r\n  //  расстояние до объекта\r\n  int proximity = param.asInt();\r\n  if (proximity) {\r\n     // РЯДОМ\r\n  } else {\r\n     // ДАЛЕКО\r\n  }\r\n}\r\n```\r\n\r\nВиджет близость не работает в фоновом режиме.\r\n"
  },
  {
    "path": "mobile/ru/report.md",
    "content": "\r\n### Отчеты (Reports)\r\n\r\nФункция виджета Отчеты заключается в настройке и разметке отчетов данных в формате CSV. Вы можете выбрать разовые или переодически запланированные отчеты.\r\n\r\nКроме того, в отчетах вы можете очистить все пользовательсике данные, собранные с ваших устройств.\r\n\r\nВам необходимо настроить начальные параметры в режиме редактирования, а затем уже в режиме воспроизведения вы сможете настроить сами отчеты.\r\n\r\n#### Режим редактирования. Конфигурация ввода данных\r\n\r\nВ режиме редактирования (когда ваш проект остановлен) вы определяете потоки данных, которые вы хотели бы позже включить в отчет.\r\nВиджет Отчеты предназначен для работы с виджетом [Плитка устройств (Device Tiles)](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/device_tiles.md). Если вы не используете плитки устройств, вы все равно можете выбрать одно устройство или группу устройств в качестве источника данных для отчетов.\r\n\r\nВы должны выбрать либо [Плитку устройств](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/device_tiles.md), либо одино устройство, либо группу устройств для отчета. Вы не можете объединить эти оба варианта.\r\n\r\n#### Режим воспроизведения \r\n\r\nПосле добавления исходных устройств и их потоков данных нажмите кнопку «Воспроизвести» и нажмите кнопку «Отчеты».\r\n\r\n### Настройка отчетов\r\n\r\nКаждый параметр отчета предполагает свои собственные настройки:\r\n\r\n```Report name``` (Имя отчета) -  дайте вашему отчету осмысленное имя.\r\n\r\n```Data source``` (Источники данных) - выберите потоки данных, которые вы хотели бы включить в отчеты.\r\n\r\n```Report Frequency``` (периодичность отчетов) -  Определяет, как часто будут отправляться отчеты. Они могут быть разовыми и запланированными.\r\n\r\n```one-time``` (Сейчас) -  мгновенно сформирует отчет и отправит его на указанные адреса электронной почты. Нажмите на значок справа, чтобы отправить отчет.\r\n\r\nЗапланированные отчеты могут быть отправлены ```daily```/```weekly```/```monthly``` (ежедневно/еженедельно/ежемесячно).\r\n\r\n ```At Time``` (Время)  установите время дня, когда отчет будет отправлен.\r\n ```Start```/```End``` (Качало/Конец) указывает дату начала и окончания оправки отчетов.\r\n\r\nДля еженедельного отчета вы можете выбрать день недели, когда отчет должен быть отправлен.\r\nДля ежемесячного отчета вы можете выбрать, отправку отчета в первый или последний день месяца.\r\n\r\n```Recipients``` (Получатели) -  укажите до 5 адресов электронной почты..\r\n\r\n```Data resolution``` (Разрешение данных) определяет детализацию ваших отчетов.  Поддерживаемые детализации: ```minute``` (ежеминутно), ```hourly``` (ежечасно) и ```daily``` (ежедневно).\r\nНапример, когда вы генерируете ежедневный отчет с детализацией в 1 минуту, вы получаете ```24 * 60 * 60``` единиц данных в вашем ежедневном отчете за каждый выбранный поток.\r\n\r\n```Group data in reports by``` (Группировка данных в отчетах) -  укажите выходной формат файла-(ов) CSV:\r\n\r\n```Datastream``` (Поток) - вы получите один CSV файл для каждого потока данных.\r\n\r\n```Device``` (Устройство) - вы получите один CSV-файл на каждое устройство. Каждый файл будет содержать все включенные потоки данных.\r\n\r\n```Report``` (Отчет) - вы получите один CSV-файл для всех ваших устройств и всех ваших потоков данных.\r\n\r\n```Timezone correction``` (Времненная зона) -  укажите корректировку часового пояса, если вам нужно настроить дату и время отчета на определенный часовой пояс.\r\n\r\n```Date and time format``` (Формат даты и времени) -  определяет формат поля временной метки ваших данных.\r\nВы можете выбрать ```2018-06-21 20:16:48```, ```2018-06-21T20:16:48+03:00``` или другой поддерживаемый формат.\r\n\r\nСуществует особый формат ```Timestamp``` (Временная метка), которая отражает разницу между текущим временем и полуночью 1 января 1970 года UTC, измеряемую в миллисекундах.\r\n\r\nПосле настройки отчета нажмите кнопку «ОК» в правом верхнем углу. Ваш отчет готов.\r\n\r\nПосле настройки отчета вы увидите, когда запланирован следущий отчет ```Next```, а также увидите расписание для этого отчета.\r\n\r\nПосле отправки отчета хотя бы один раз, вы можете увидеть дату его последней отправки ```Last```.\r\n\r\n```Last``` (Последний) метка также содержит статус отправки отчета:\r\n\r\n  - ```OK``` (Успешно):  отчет был сгенерирован и успешно отправлен Получателям;\r\n  - ```No Data``` (Нет данных): отчет не содержит данных за указанный период;\r\n  - ```Error``` (Ошибка):  что-то пошло не так. Пожалуйста, свяжитесь со службой поддержки Blynk.\r\n\r\nОтчеты будут генерироваться, даже если ваш проект не находится в активном (Play) режиме. Однако помните, неактивные проекты небудут генерировать данные.\r\n\r\n**ПРИМЕЧАНИЕ:** все отчеты формируются в кодировке UTF-16. Пожалуйста, убедитесь, что при открытии файла отчета вы выбрали кодировку UTF-16 в вашем CSV-редакторе.\r\n"
  },
  {
    "path": "mobile/ru/rgb.md",
    "content": "### ЗеБРа (zeRGBa)\r\n\r\nЗеБРа - это обычный RGB контроллер (палитры цветов).\r\n\r\n#### Настройки:\r\n\r\n- **SPLIT** (Раздельный): Каждый из параметров отправляется непосредственно на пин вашего оборудования (например, D7). Вам не нужно писать код.\r\n\r\n**ПРИМЕЧАНИЕ:** В этом режиме вы отправляете одновременно несколько команд из одного виджета, что может снизить производительность вашего оборудования.\r\n\r\nПример: у вас есть виджет ЗеБРа и для него было установлено значение D1, D2, D3, он отправит 3 команды через Интернет:\r\n\r\n```cpp\r\ndigitalWrite(1, r);\r\ndigitalWrite(2, g);\r\ndigitalWrite(3, b);\r\n```\r\n\r\n- **MERGE** (Объединенный):\r\nКогда выбран режим MERGE, вы отправляете только 1 сообщение, состоящее из массива значений. Но в последствии вам нужно разобрать сообщение на своем оборудовании.\r\n\r\nЭтот режим можно использовать только с виртуальными пин-ами.\r\n\t\r\nПример: добавьте виджет ЗеБРа и установите его в режим MERGE. Выберите виртуальный контакт V1.\r\n\t\r\n```cpp\r\nBLYNK_WRITE(V1) // ЗеБРа назначен на V1 \r\n{\r\n    // получим значение КРАСНОГО канала\r\n    int r = param[0].asInt();\r\n    // получим значение ЗЕЛЕНОГО канала\r\n    int g = param[1].asInt();\r\n    // получим значение СИНЕГО канала\r\n    int b = param[2].asInt();\r\n}\r\n```\r\n\r\n- **Отправка при Отжатии (Send On Release)** доступно для большинства виджетов контроллеров и позволяет уменьшить трафик данных на вашем оборудовании. Например, когда вы перемещаете виджет джойстика, команды непрерывно передаются на аппаратное устройство, во время одного движения джойстика вы можете отправлять десятки команд. Есть случаи, когда это необходимо, однако создание такой нагрузки может привести к сбросу оборудования. Мы рекомендуем включить функцию **Отправка при Отжатии** для большинства случаев, если вам не требуется мгновенная обратная связь. Эта опция включена по умолчанию.\r\n\r\n### Интервал записи (Write interval)\r\nПохоже на вышеуказанный вариант. Однако, позволяет вам передавать значения на ваше оборудование в через определенные интервалы времени. Например, установка интервала записи на 100 мс означает, что при перемещении ползунка на аппаратное обеспечение будет отправлено только 1 значение в течение 100 мс. Эта опция также используется для уменьшения трафика данных на ваше оборудовании.\r\n"
  },
  {
    "path": "mobile/ru/rtc.md",
    "content": "\r\n### Часы реального времени (RTC)\r\n\r\nЧасы реального времени позволяют получать время с сервера. Вы можете предварительно выбрать любой часовой пояс в пользовательском интерфейсе, чтобы получить время на оборудование из нужной локали.\r\n\r\n**Пример кода:** [Часы реального времени](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/RTC/RTC.ino)\r\n"
  },
  {
    "path": "mobile/ru/segmentedSwitch.md",
    "content": "\r\n### Сегментированный переключатель (Segmented Switch)\r\n\r\nВиджет Сегментированный переключатель позволяет отправлять команды на ваше оборудование на основе выбора, сделанного вами в пользовательском интерфейсе. Сегментированный переключатель отправляет индекс выбранного вами элемента, а не строку метки. Отправленный индекс начинается с 1. Он работает так же, как типовой элемент [Комбинированный список (ComboBox)](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA) или [Меню (Menu)](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/menu.md).\r\n\r\nПример кода:\r\n\r\n```cpp\r\nBLYNK_WRITE {\r\n  switch (param.asInt()) {\r\n    case 1: { // Пункт 1\r\n      Serial.println(\"Выбран пункт 1\");\r\n      break;\r\n    }\r\n    case 2: { // Пункт 2\r\n      Serial.println(\"Выбран пункт 2\");\r\n      break;\r\n    }    \r\n  }\r\n}\r\n```\r\n\r\nВы также можете установить пункты меню со стороны оборудования с помощью кода:\r\n\r\n```cpp\r\nBlynk.setProperty(V1, \"labels\", \"label 1\", \"label 2\", \"label 3\");\r\n```\r\n\r\n**Пример кода:** [Меню](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Menu/Menu.ino)\r\n"
  },
  {
    "path": "mobile/ru/segmented_control.md",
    "content": "\r\n### Сегментированный переключатель (Segmented Switch)\r\n\r\nВиджет Сегментированный переключатель позволяет отправлять команды на ваше оборудование на основе выбора, сделанного вами в пользовательском интерфейсе. Сегментированный переключатель отправляет индекс выбранного вами элемента, а не строку метки. Отправленный индекс начинается с 1. Он работает так же, как типовой элемент [Комбинированный список (ComboBox)](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA) или [Меню (Menu)](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/menu.md).\r\n\r\nПример кода:\r\n\r\n```cpp\r\nBLYNK_WRITE {\r\n  switch (param.asInt()) {\r\n    case 1: { // Пункт 1\r\n      Serial.println(\"Выбран пункт 1\");\r\n      break;\r\n    }\r\n    case 2: { // Пункт 2\r\n      Serial.println(\"Выбран пункт 2\");\r\n      break;\r\n    }    \r\n  }\r\n}\r\n```\r\n\r\nВы также можете установить пункты меню со стороны оборудования с помощью кода:\r\n\r\n```cpp\r\nBlynk.setProperty(V1, \"labels\", \"label 1\", \"label 2\", \"label 3\");\r\n```\r\n\r\n**Пример кода:** [Меню](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Menu/Menu.ino)\r\n"
  },
  {
    "path": "mobile/ru/slider.md",
    "content": "\n### Слайдер (Slider)\n\nСлайдер очень похож на потенциометр. Он позволяет посылать значения в диапазоне от минимального значения к максимальному. \nДиапазон допустимых максимального и минимального значений определяется в приложении.\n\nВы так же можете менять состояние слайдера с микроконтроллера. Например, Вы можете изменить положение ползунка в слайдере : \n\n```cpp\nBlynk.virtualWrite(V1, 55);\n```\n\nТак же можно поменять текст в слайдере : \n\n```cpp\nBlynk.setProperty(V1, \"label\", \"Мой слайдерок\");\n```\n\nили изменить цвет : \n\n```cpp\n//#D3435C - Карсный цвет в кодирвке RGB\nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n \n### Отправка при отжатии (Send On Release)\n**Отправка при отжатии** эта функциональность позволяет снизить количество сообщений которые отправляет слайдер при \nсмещении ползунка. Даже при незначительном перемещени ползунка - приложение шлет довольно много команд. \nДля некторых микроконтроллеров это может быть очень большой нагрузкой и они могут начать перегружатся. Тем не менее \nесть сценарии использования для которых это очень важно. По умолчанию, слайдер будет слать значения когда вы отпускаете ползунок. \nМы рекомендуем исползовать этот подход, кроме случая когда Вам необходимо получать промежуточные значения при движении ползунка слайдера.\n\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n"
  },
  {
    "path": "mobile/ru/step.md",
    "content": "\r\n### Шаговое управление (Step Control)\r\n\r\nШаговое управление похоже на две кнопки, назначенные одному пин-у. Одна кнопка увеличивает ваше значение на установленный шаг, а другая уменьшает его. Это очень полезно для случаев использования, когда вам нужно точно изменять ваши значения, но вы не можете достичь такой точности с помощью виджета [Cлайдера](https://github.com/blynkkk/blynkkk.github.io/tree/master/mobile/ru/slider.md).\r\n\r\n**Отправить шаг (Send Step)** опция позволяет вам отправлять на оборудование каждый шаг нвместо фактического значения виджета.\r\n\r\n**Зациклить значения (Loop value)**  опция позволяет сбросить Шаговый виджет на начальное значение при достижении максимального.\r\n\r\nВы можете изменить значение Шагового виджета со стороны оборудования. Например:\r\n\r\n```cpp\r\nBlynk.virtualWrite(V1, val);\r\n```\r\n\r\nВы можете изменить описание виджета со стороны оборудования с помощью кода:\r\n\r\n```cpp\r\nBlynk.setProperty(V1, \"label\", \"Мой счетчик.\");\r\n```\r\n\r\nВы можете изменить шаг виджета со стороны оборудования:\r\n\r\n```cpp\r\nBlynk.setProperty(V1, \"step\", 10);\r\n```\r\n\r\nили изменить цвет: \r\n\r\n```cpp\r\n//#D3435C - Красный цвет в RGB кодировке\r\nBlynk.setProperty(V1, \"color\", \"#D3435C\");\r\n```\r\n\r\nВы также можете получить состояние виджета Шагового управления с сервера в случае, если ваше оборудование отключилось, с помощью функции Blynk.Sync:\r\n\r\n```cpp\r\nBLYNK_CONNECTED() {\r\n  Blynk.syncVirtual(V1);\r\n}\r\n\r\nBLYNK_WRITE(V1) {\r\n  int stepperValue = param.asInt();\r\n}\r\n```\r\n\r\n### Интервал записи (Write interval)\r\nОпция позволяет вам передавать значения на ваше оборудование в через определенные интервалы времени. Например, установка интервала записи на 100 мс означает, что при перемещении ползунка на аппаратное обеспечение будет отправлено только 1 значение в течение 100 мс. Эта опция также используется для уменьшения трафика данных на ваше оборудовании.\r\n\r\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\r\n"
  },
  {
    "path": "mobile/ru/styled_button.md",
    "content": "\r\n###  Стилизованная кнопка (Styled Button)\r\n\r\nРаботает в режиме кнопки или выключателя. Позволяет отправить любое числовое значение при нажатии и отпускании кнопки. \r\nПо умолчанию кнопка использует значения 0/1 (HIGH/LOW). Кнопка при нажатии отправляет 1 (HIGH) а при отпускании отправляет 0 (LOW).\r\n\r\nВы можете изменить состояние кнопки со стороны оборудования. Например, включить кнопку, назначенную виртуальному пин-у V1:\r\n\r\n```cpp\r\nBlynk.virtualWrite(V1, HIGH);\r\n```\r\n\r\nВы можете изменить надписи кнопок со стороны оборудования при помощи кода:\r\n\r\n```cpp\r\nBlynk.setProperty(V1, \"onLabel\", \"ВКЛ\");\r\nBlynk.setProperty(V1, \"offLabel\", \"ВЫКЛ\");\r\n```\r\n\r\nили изменить цвет кнопки во включенном и выключенном состоянии:\r\n\r\n```cpp\r\nBlynk.setProperty(V1, \"onColor\", \"#D3435C\");\r\nBlynk.setProperty(V1, \"offColor\", \"#D3435C\");\r\n```\r\n\r\nили изменить цвет фона кнопки:\r\n\r\n```cpp\r\nBlynk.setProperty(V1, \"onBackColor\", \"#00435C\");\r\nBlynk.setProperty(V1, \"offBackColor\", \"#00435C\");\r\n```\r\n\r\nВы также можете узнать состояние кнопки с сервера, если ваше оборудование внезапно отключилось, с помощью функции Blynk.Sync:\r\n\r\n```cpp\r\nBLYNK_CONNECTED() {\r\n  Blynk.syncVirtual(V1);\r\n}\r\n\r\nBLYNK_WRITE(V1) {\r\n  int buttonState = param.asInt();\r\n}\r\n```\r\n\r\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\r\n\r\n**Пример кода:** [Синхронизация состояния с физической кнопкой через прерывания](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonInterrupt/ButtonInterrupt.ino)\r\n\r\n**Пример кода:** [Синхронизация состояния с физической кнопкой через поллинг](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonPoll/ButtonPoll.ino)\r\n\r\n**Пример кода:** [Синхронизация состояния с физической кнопкой](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/SyncPhysicalButton/SyncPhysicalButton.ino)\r\n"
  },
  {
    "path": "mobile/ru/super_chart.md",
    "content": "\n### Диаграмма (SuperChart)\n\nДиаграмма используется для живой визуализации и хранения данных. Вы можете использовать виджет для логирования данных датчиков,  бинарных событий и многого другого.\n\nЧтобы использовать виджет Диаграмма, вам нужно будет передать данные с оборудования с желаемым интервалом, используя таймеры.\n[Здесь приведен](https://examples.blynk.cc/?board=ESP8266&shield=ESP8266%20WiFi&example=GettingStarted%2FPushData) базовый пример передачи данных.\n\n#### Взаимодействие:\n- **Переключение между режимами текущий и временной** Нажмите диапазоны времени в нижней части виджета, чтобы изменить масштаб Диаграммы по времени.\n\n- **Тап по легенде графиков**  показать или скрыть поток данных.\n\n- **Долгий тап на графике** покажет метку времени и соответствующие значения.\n\n- **Быстро проведите пальцем влево или вправо, чтобы увидеть предыдущие данные** впоследствии вы можете прокручивать данные назад и вперед в пределах заданного временного диапазона.\n\n- **Полноэкранный режим** нажмите эту кнопку, чтобы открыть полноэкранный режим в альбомной ориентации.\n\nЧтобы выйти из режима полного экрана, просто поверните телефон обратно в портретный режим. График должен вращаться автоматически. В полноэкранном режиме вы увидите X (время) и несколько шкал Y.\nПолноэкранный режим можно отключить в настройках виджета.\n\n- **Кнопка меню**\n Кнопка меню откроет дополнительные функции:\n  - Экспорт в CSV\n  - Стереть данные на сервере\n\n#### Настройки диаграммы:\n\n- **Заголовок диаграммы (Chart Title)** общее наименование диаграммы.\n\n- **Размер шрифта заголовка (Title Font Size)** выберите из 3 размеров шрифта.\n\n- **Выравнивание заголовка (Title Alignment)** выберите выравнивание заголовка диаграммы. Этот параметр влияет на положение заголовка и легенды в виджете.\n\n- **Показать ось X (время) (Show x-axis (time))** выберите настройку, если хотите показать шкалу времени внизу графика.\n\n- **Автоматическое масштабирование для всех потоков данных (Override Auto Scaling for All Datastreams)** отключение этой опции позволит выполнить ручную настройку для оси Y (см. ниже).\n\n- **Выбор масштаба времени (Time ranges picker)** Позволяет выбрать необходимые периоды (`15m`,` 30m`, `1h`,` 3h`, ...) и разрешение для вашего графика. Разрешение определяет, насколько подробные ваши данные. Прямо сейчас график поддерживает два типа разрешения: `standard` и `high`. Разрешение также зависит от выбранного периода. Например, `standard` разрешение для `1d` означает, что вы будете получать 24 значения в день (одно в час), а при `high` разрешении вы будете получать за` 1d` 1440 значений в день (одно в минуту).\n\n- **Потоки данных (Datastreams)** добавить потоки данных (см. ниже, как настроить потоки данных).\n\n#### Настройки потоков данных\n\nВиджет поддерживает до 4 потоков данных.\nНажмите значок настроек потоков данных, чтобы открыть настройки.\n\n**Дизайн (Design)** выберите доступные типы диаграмм:\n - Линейная (Line)\n - С областями (Area)\n - Гистограмма (Bar)\n - Бинарная (Binary) (приведение данных к двоичному виду)\n\n**Цвет (Color)** выберите сплошные цвета или градиенты.\n\n**Источник и ввод (Source and input)** - Вы можете использовать три типа источника данных:\n\n**1. Виртуальный пин (Virtual Pin)** - выберите желаемое устройство и виртуальный пин для получения данных.\n\n**2. Теги (Tags)** - диаграмма может агрегировать данные с нескольких устройств, используя встроенные функции агрегирования.\nНапример, если у вас есть 10 датчиков температуры, посылающих температуру с заданным интервалом, Вы можете отобразить среднее значение от 10 датчиков в виджете.\n\nИспользование тегов:\n\n- **[Добавить Тэг](http://docs.blynk.cc/#blynk-main-operations-control-of-multiple-devices-tags)** на каждое устройство, с которого вы хотите агрегировать данные. Это можно сделать в настройках проекта Blynk.\n- **Отправить данные в виртуальный пин (Push data to the same Virtual Pin)** на каждое устройство. (т.е. ```Blynk.virtualWrite (V0, temperature);```)\n- **Выберите тег в качестве источника (Choose Tag as a source)** в виджете Диаграмма и используйте пин, куда поступают данные (т.е. V0)\n\n**Добступные функции:** \n- `SUM` будет суммировать все входящие значения в указанный виртуальный пин со всех устройств, помеченные выбранным тегом\n- `AVG` будет вычислять среднее значение\n- `MED` найдет среднее значение\n- `MIN` будет вычислять минимальное значение\n- `MAX` будет вычислять максимальное значение\n\n**ВАЖНО: Теги не работают в режиме реального времени.**\n\n**3. [Выбор устройства (Device Selector)](https://github.com/blynkkk/blynkkk.github.io/tree/master/mobile/ru/ \tdevice_selector.md)**\nЕсли вы добавите виджет Выбор устройства в свой проект, вы можете использовать его в качестве источника данных для Диаграммы.\nВ том случае, когда вы меняете устройство, диаграмма будет автоматически обновляться.\n\n#### Настройки оси Y (Y-Axis Settings)\nCуществует 4 режима масштабирования данных вдоль оси Y, активируется после отключения общей настройки виджета \"Автоматическое масштабирование для всех потоков данных (Override Auto Scaling for All Datastreams)\".\n\n**1. Авто (Auto)**\nДанные будут автоматически масштабироваться на основе минимальных и максимальных значений заданного периода времени. Это лучший вариант для начинающих.\n\n**2. Минимальный/Максимальный (Min/Max)**\nКогда выбран этот режим, шкала Y будет установлена на выбранные вами границы значений.\nНапример, если ваше оборудование отправляет данные со значениями от -100 до 100, вы можете установить эти границы и данные графика будут отображены полностью.\n\nВы также можете визуализировать данные в другом диапазоне. Допустим, входящие данные имеют значения в диапазоне 0-55, но вы хотели бы видеть только значения в диапазоне 30-50. Вы можете настроить  диапазон, но если значения не соответствуют заданному масштабу оси Y, диаграмма будет обрезана.\n\n**3. Процент от высоты (% of Height)**\nЭта опция позволяет автоматически масштабировать входящие данные на виджете и размещать их так, как вы хотите. \nВ этом режиме вы устанавливаете процент высоты виджета на экране от 0% до 100%.\n\nЕсли вы установите диапазон 0-100%, это будет полная автоматическая шкала. Независимо от того, в каком диапазоне поступают данные, он всегда будет масштабирован по всей высоте виджета.\n\nЕсли вы установите его на 0-25%, то график будет отображаться только на 1/4 высоты виджета.\n\nЭтот параметр очень полезен для **Бинарной диаграммы** или для визуализации нескольких потоков данных на одной и той же диаграмме разными способами.\n\n**4. Дельта (Delta)**\nПока данные остаются в пределах заданного значения дельты, график будет автоматически масштабироваться в этом диапазоне.\nЕсли дельта превышает диапазон, график автоматически масштабируется до минимальных/максимальных значений указанного периода.\n\n**Суффикс (Suffix)**\nЗдесь вы можете указать суффикс, который будет отображаться со значениями во время длительного тап на графике.\n\n**Разрядность (Decimals)**\nОпределяет формат числовых значений, когда вы нажимаете и удерживаете палец на графике. Возможные варианты: #, #.#, #.##, и т.д.\n\n**Соединиить отсуствующие точки графика (Connect Missing Data Points)**\nЕсли этот переключатель включен, то Диаграмма соединит все точки, даже если данные частично отсуствуют.\nЕсли для него установлено значение «ВЫКЛ», то вы увидите пропуски в случае отсутствия данных.\n\n**Настройки Бинарной диаграммы (Binary Chart Settings)**\nЭтот тип диаграммы полезен для построения двоичных данных, например, когда устройство было включено или выключено, или когда было обнаружено движение или когда был достигнут определенный порог значений.\n\nВам необходимо указать точку **Перехода (FLIP)**, которая будет точкой, в которой входящие данные будут принимать состояние `ИСТИНА (TRUE)` или `ЛОЖЬ (FALSE)`.\n\nНапример, вы отправляете данные в диапазоне от 0 до 1023. Если вы установите `512` в качестве точки **Перехода (FLIP)**, то все, что выше `512` (исключая 512), будет записано как `ИСТИНА (TRUE)`, любое значение ниже `512` (включая 512) будет `ЛОЖЬ (FALSE)`.\n\nДругой пример: если вы отправляете `0 и 1` и устанавливаете `0` в качестве точки **Перехода FLIP**, то `1` будет `ИСТИНА`, а `0` будет `ЛОЖЬ`.\n\n**Маркеры состояния (State Labels):**\nЗдесь вы можете указать, как `ИСТИНА/ЛОЖЬ` должны отображаться на графике когда вы нажимаете и удерживаете палец.\nНапример, вы можете установить значение `ИСТИНА` как `Оборудование ВКЛ`, `ЛОЖЬ` как `Оборудование ВЫКЛ`.\n\n"
  },
  {
    "path": "mobile/ru/table.md",
    "content": "\r\n### Таблица (Table)\r\n\r\nТабличный виджет удобен, когда вам нужно структурировать аналогичные данные в пределах одного графического элемента. Работает как обычная таблица.\r\n\r\nВы можете добавить строку в таблицу с помощью кода:\r\n\r\n```\r\nBlynk.virtualWrite(V1, \"add\", id, \"Имя\", \"Значение\");\r\n```\r\n\r\nВы можете обновить строку в таблице с помощью кода:\r\n\r\n```\r\nBlynk.virtualWrite(V1, \"update\", id, \"Новое имя\", \"Новое значение\");\r\n```\r\n\r\nЧтобы выделить любой элемент в таблице, используйте его идентификатор:\r\n\r\n```\r\nBlynk.virtualWrite(V1, \"pick\", 0);\r\n```\r\n\r\nЧтобы выбрать/отменить выбор (сделать значок зеленым/серым) элемент в таблице, используйте его идентификатор:\r\n\r\n```\r\nBlynk.virtualWrite(V1, \"select\", 0);\r\nBlynk.virtualWrite(V1, \"deselect\", 0);\r\n```\r\n\r\n Чтобы очистить таблицу используйте код:\r\n\r\n```\r\nBlynk.virtualWrite(V1, \"clr\");\r\n```\r\n\r\nВы также можете обрабатывать другие действия из таблицы. Например, использовать строку таблицы в качестве кнопки переключения.\r\n\r\n```\r\nBLYNK_WRITE(V1) {\r\n   String cmd = param[0].asStr();\r\n   if (cmd == \"select\") {\r\n       // строка в таблице была выбрана.\r\n       int rowId = param[1].asInt();\r\n   }\r\n   if (cmd == \"deselect\") {\r\n       // строка в таблице была отменена.\r\n       int rowId = param[1].asInt();\r\n   }\r\n   if (cmd == \"order\") {\r\n       // когда строки в таблице переупорядочиваются\r\n       int oldRowIndex = param[1].asInt();\r\n       int newRowIndex = param[2].asInt();\r\n   }\r\n}\r\n```\r\n\r\n**Примечание:** Максимальное количество строк в таблице равно 100. Когда вы достигнете предела, таблица будет работать как список FIFO (Первый пришел - первый ушел).\r\nЭто ограничение можно изменить, настроив свойство ```table.rows.pool.size``` в параметрах локального сервера.\r\n\r\n**Пример кода:** [Простое использование таблицы](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Table/Table_Simple/Table_Simple.ino)\r\n\r\n**Пример кода:** [Расширенное использование таблицы](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Table/Table_Advanced/Table_Advanced.ino)\r\n"
  },
  {
    "path": "mobile/ru/tabs.md",
    "content": "\r\n### Вкладки (Tabs)\r\n\r\nЕдинственная цель виджета Вкладки - расширить пространство вашего проекта.\r\nЧтобы редактировать виджет Вкладок - просто нажмите на выбранную вкладку.\r\nВы можете перетаскивать виджеты между вкладками. \r\nИз списка можно удалить только последнюю вкладку: чтобы удалить ее, проведите пальцем влево по ее названию в экране настроек виджета.\r\n \r\nМаксимальное количество вкладок на iOS составляет 4. \r\n\r\nМаксимальное количество вкладок на Android - 10. \r\n \r\nОставайтесь с нами для предстоящего редизайна виджета вкладок! \r\n"
  },
  {
    "path": "mobile/ru/temperature.md",
    "content": "\r\n### Температура (Temperature)\r\n\r\nТемпература является своего рода [датчиком окружающей среды](https://developer.android.com/guide/topics/sensors/sensors_environment.html) который позволяет измерять температуру окружающего воздуха. Измеряется в ```°C``` - градусах Цельсия.\r\n\r\nДля приема данных из виджета, необходимо использовать код:\r\n\r\n```cpp\r\nBLYNK_WRITE(V1) {\r\n  // температура в градусах цельсия\r\n  int celcius = param.asInt();\r\n}\r\n```\r\n\r\nВиджет Температуры не работает в фоновом режиме.\r\n"
  },
  {
    "path": "mobile/ru/terminal.md",
    "content": "\r\n### Терминал (Terminal)\r\n\r\nОтображает данные с вашего оборудования. Позволяет отправить любую строку с вашего оборудования. Терминал всегда хранит последние 25 сообщений, которые ваше оборудование отправило в Blynk. Этот ограничение может быть увеличено в настройках локального сервера с помощью параметра ```terminal.strings.pool.size```.\r\n\r\nС этим виджетом Вы можете использовать специальные команды:\r\n\r\n```cpp\r\n// Печатает значения, как Serial.print\r\nterminal.print();   \r\n// Печатает значения, как Serial.println()\r\nterminal.println();\r\n// Записать необработанные данные в буффер\r\nterminal.write();\r\n// Убедится, что все данные были отправлены с устройства в терминал\r\nterminal.flush();\r\n// Стереть все данные в терминале\r\nterminal.clear();\r\n```\r\n\r\n**Пример кода:** [Терминал](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Terminal/Terminal.ino)\r\n"
  },
  {
    "path": "mobile/ru/textInput.md",
    "content": "\r\n### Текстовый ввод (Text Input)\r\n\r\nОтображается как строка текстового ввода, где вы можете напрямую изменять строковое значение. Также вы можете ограничить максимальное количество вводимых символов в настройках виджета.\r\n"
  },
  {
    "path": "mobile/ru/text_input.md",
    "content": "\r\n### Текстовый ввод (Text Input)\r\n\r\nОтображается как строка текстового ввода, где вы можете напрямую изменять строковое значение. Также вы можете ограничить максимальное количество вводимых символов в настройках виджета.\r\n\r\n"
  },
  {
    "path": "mobile/ru/time_input.md",
    "content": "\r\n## Ввод времени (Time Input)\r\n\r\nВиджет Ввода времени позволяет вам выбрать время начала/окончания, день недели, часовой пояс, значения в формате до полудня/после полудня и отправить их на ваше оборудование. В настоящее время поддерживаются следующие форматы: ```ЧЧ:ММ``` и ```ЧЧ:ММ AM/PM```.\r\n\r\nАппаратное устройстов будет отсчитывать время пользовательского интерфейса в виде секунд дня (```3600 * часов + 60 * минут```) для запуска/остановки времения. Время, которое виджет отправляет оборудованию, является локальным временем пользователя.\r\nИндексы по выбранных дней:\r\n\r\n```\r\nПонедельник - 1\r\nВторник - 2\r\n...\r\nСуббота - 6\r\nВоскресенье - 7\r\n```\r\nВы также можете изменить состояние виджета в интерфейсе пользователя. Смотрите ниже примеры кода.\r\n\r\n**Пример кода:** [Простой Ввод времени для времени начала](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/SimpleTimeInput/SimpleTimeInput.ino)\r\n\r\n**Пример кода:** [Расширенный Ввод времени](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/AdvancedTimeInput/AdvancedTimeInput.ino)\r\n\r\n**Пример кода:** [Обновление Ввода времени в пользовательском интерфейсе](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/UpdateTimeInputState/UpdateTimeInputState.ino)\r\n"
  },
  {
    "path": "mobile/ru/timeinput.md",
    "content": "\r\n## Ввод времени (Time Input)\r\n\r\nВиджет Ввода времени позволяет вам выбрать время начала/окончания, день недели, часовой пояс, значения в формате до полудня/после полудня и отправить их на ваше оборудование. В настоящее время поддерживаются следующие форматы: ```ЧЧ:ММ``` и ```ЧЧ:ММ AM/PM```.\r\n\r\nАппаратное устройстов будет отсчитывать время пользовательского интерфейса в виде секунд дня (```3600 * часов + 60 * минут```) для запуска/остановки времения. Время, которое виджет отправляет оборудованию, является локальным временем пользователя.\r\nИндексы по выбранных дней:\r\n\r\n```\r\nПонедельник - 1\r\nВторник - 2\r\n...\r\nСуббота - 6\r\nВоскресенье - 7\r\n```\r\nВы также можете изменить состояние виджета в интерфейсе пользователя. Смотрите ниже примеры кода.\r\n\r\n**Пример кода:** [Простой Ввод времени для времени начала](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/SimpleTimeInput/SimpleTimeInput.ino)\r\n\r\n**Пример кода:** [Расширенный Ввод времени](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/AdvancedTimeInput/AdvancedTimeInput.ino)\r\n\r\n**Пример кода:** [Обновление Ввода времени в пользовательском интерфейсе](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/UpdateTimeInputState/UpdateTimeInputState.ino)\r\n"
  },
  {
    "path": "mobile/ru/timer.md",
    "content": "\r\n### Таймер (Timer)\r\n\r\nТаймер запускает действия в определенное время. Даже если смартфон не в сети. По умолчанию время начала отправляет 1 (HIGH), время остановки отправляет 0 (LOW). Вы можете изменить это поведение на любые другие значения.\r\nВы можете изменить настройки Таймера в режиме «Запуска».\r\nВ последней версии Android также есть улучшенный таймер в виджете [Обработчик событий](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/eventor.md).\r\n\r\nC [Обработчиком](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/eventor.md) событий вы можете назначить несколько таймеров на один и тот же пин, отправить любую строку/число, выбирать дни и часовой пояс.\r\nРекомендуется использовать виджет [Обработчик событий](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/eventor.md) поверх виджета Таймер.\r\nОднако виджет Таймер по-прежнему подходит и для простых событий таймера.\r\n\r\n**ПРИМЕЧАНИЕ:** Виджет таймера зависит от времени сервера, а не вашего телефона. Иногда время телефона может не соответствовать времени сервера.\r\n\r\n**Пример кода:** [Таймер](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Timer/Timer.ino)\r\n"
  },
  {
    "path": "mobile/ru/twitter.md",
    "content": "\r\n### Твиттер (Twitter)\r\n\r\nВиджет Твиттер соединяет вашу учетную запись сети Twitter с Blynk и позволяет отправлять \"твиты\" с вашего оборудования.\r\n\r\nПример кода:\r\n```cpp\r\nBlynk.tweet(\"Привет, Blynk-еры! Мой Arduino может слать твиты!\");\r\n```\r\n\r\nОграничения :\r\n\r\n- нельзя отправлять 2 твита с одним и тем же сообщением (это политика Твиттера)\r\n- разрешен только 1 твит за 5 секунд\r\n\r\n### Кодировка в Твиттере\r\n\r\nБиблиотека обрабатывает все строки в кодировке UTF-8. Если вы столкнулись с проблемами, попробуйте напечатать ваше сообщение на последовательный порт и проверить, работает ли оно (COM терминал должен быть настроен на кодировку UTF-8). Если не работает, вам следует проверить поддержку UTF-8 вашего компилятора.\r\nЕсли работает, но ваше сообщение обрезано - вам нужно увеличить длины сообщения (все символы UTF-8 потребляют как минимум вдвое больше байт информации).\r\n\r\n### Увеличение лимита длины сообщения\r\n\r\n Вы можете увеличить максимальную длину сообщения, поместив (до включения Blynk) в верхнюю часть своего кода строку:\r\n```cpp\r\n#define BLYNK_MAX_SENDBYTES 256 // По умолчанию 128 байт\r\n```\r\n\r\n**Пример кода:** [Твиттер](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Twitter/Twitter.ino)\r\n"
  },
  {
    "path": "mobile/ru/value_display.md",
    "content": "\r\n### Отображение значений (Value Display)\r\n\r\nОтображает входящие данные с ваших датчиков или виртуальных пин-ов.\r\nМожет работать в двух режимах:\r\n\r\n- режим PUSH (выберается в списке выбора частоты считывания);\r\n- режим частоты считываний;\r\n\r\nВ режиме PUSH вы обновляете значения виджета со стороны оборудования с помощью кода:\r\n \r\n```cpp\r\nBlynk.virtualWrite(V1, val); \r\n```\r\n\r\nВ этом режиме каждое сообщение, которое отправляет аппаратное устройство автоматически сохраняется на сервере. Режим PUSH не требует, чтобы приложение было онлайн или открыто.\r\n\r\nВ режиме частоты считывния вам необходимо выбрать интервал обновления данных, и приложение будет запускать события считывния с требуемой периодичностью.\r\nВаше приложение должно быть открыто и запущено для отправки запросов на оборудование. Вам не нужен код для аналоговых и цифровых выводов в даном случае. Однако для виртуальных выводов вам необходимо использовать следующий код:\r\n\r\n```cpp\r\n//вызывать из приложения\r\nBLYNK_READ(V1)\r\n{\r\n  //отправить в приложение\r\n  Blynk.virtualWrite(V1, val);\r\n}\r\n```\r\n\r\n#### Отображение значений на рабочем столе\r\n\r\nВы также можете добавить виджет отображение значения на рабочий стол Android. В этом случае отображение значений работает по протоколу HTTPS.\r\nИмейте в виду, что в режиме «Рабочий стол» отображение значений имеет несколько ограничений. Виджет будет обновлять свое состояние только один раз в 15 минут. Вы можете изменить это органичение через настройки виджета. Однако интервал обновления менее 15 минут не гарантируется.\r\nВы также можете изменить размер отображаемого значения на рабочем столе - просто сделайте длинный тап на виджете и измените его размер на необходимый.\r\n\r\n**Примечание:** Добавление виджета на главный экран стоит 100 энергии. Эта энергия не возвращяется при удалении виджета.\r\n\r\n**Примечание:** Виджеты рабочего стола для локальных серверов Blynk требуют открытия порта 8080.\r\n\r\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\r\n"
  },
  {
    "path": "mobile/ru/video.md",
    "content": "\r\n## Видео трансляция (Video Streaming)\r\n\r\nПростой виджет, который позволяет отображать прямой эфир и потокове видео. Виджет поддерживает протоколы RTSP (RP, SDP), HTTP/S прогрессивной потоковой передачи, HTTP/S прямого эфира. Для получения дополнительной информации, пожалуйста ознакомтесь с [официальной документацией Android](https://developer.android.com/guide/appendix/media-formats.html).\r\n\r\nНа данный момент команда Blynk не предоставляет потоковые серверы. Таким образом, вы можете осуществлять потоковую передачу непосредственно с ваше камеры или использовать сторонние сервисы, а также запустить собственны потоковый сервер (например, на оборудовании Raspberry).\r\n\r\nВы можете остановить/запустить видео поток, нажав на сам виджет.\r\n\r\nВы можете изменить URL-адрес видео потока с аппаратного устройства при помощи кода:\r\n\r\n```cpp\r\nBlynk.setProperty(V1, \"url\", \"http://my_new_video_url\");\r\n```\r\n"
  },
  {
    "path": "mobile/ru/webhook.md",
    "content": " \n### Вебхук (Webhook)\n\nВебхук очень мощный виджет, который позволяет Вам легко интегрироватся с любыми сторонними сервисами. С его помощью \nВы можете слать любые HTTP/S запросы на любой сервер или устройство, которое имеет HTTP/S API (например, лампы Philips Hue).\n\nВебхук вешается на вирутальный пин и любая команда, которая приходит на этот пин будет вызывать срабатывание HTTP/S \nзапроса. Команды на такой виртуальный пин могут приходить как со стороны железа, так и со стороны приложения. То есть, \nВы можете слать любой HTTP запрос при нажатии кнопки в приложении, если эта кнопка на том же пине что и вебхук.\n\nВот простой пример, представьте, что Вы хотите слать данные с микроконтроллера не только в Blynk, но и в какой-то другой сервис, \nнапример - Google Docs или в thingspeak.com. Раньше Вам для этого пришлось бы писать что-то вроде :\n\n```cpp\nWiFiClient client;\nif (client.connect(\"api.thingspeak.com\", 80)) {\n    client.print(\"POST /update HTTP/1.1\\n\");\n    client.print(\"Host: api.thingspeak.com\\n\");\n    client.print(\"Connection: close\\n\");\n    client.print(\"X-THINGSPEAKAPIKEY: \" + apiKeyThingspeak1 + \"\\n\");\n    client.print(\"Content-Type: application/x-www-form-urlencoded\\n\");\n    client.print(\"Content-Length: \");\n    client.print(postStr.length());\n    client.print(\"\\n\\n\");\n    client.print(postStr);\n}\n```\n \nС вебхуком этого больше делать не нужно. Достаточно лишь заполнить поля виджета в приложении и выполнить привычное:\n\n```cpp\nBlynk.virtualWrite(V0, value);\n```\n\nГде V0 - пин вебхук виджета.\n\nВ дополнение, Вы можете подставлять значение пина в URL:\n\n```cpp\nhttps://api.thingspeak.com/update?api_key=xxxxxx&field1=/pin/\n```\n\nили тело запроса :\n\n```cpp\n[\"/pin/\"]\n```\n\nТак же можно отправлять несколько значений внутри одного пина (до 5) :\n\n```/pin[0]/```,```/pin[1]/```, ```/pin[2]/```\n\nЕще одна крутая штука - это возможность делать HTTP GET запросы на сервере и слать их результат на микроконтроллер. \nПрелесть тут в том, что Вам не нужно для этого писать сложный код на микроконтроллере. Представьте, что Вам нужно  \nполучить информацию о погоде от какого-то метио сервиса. Например, по такому запросу :\n\n```http://api.sunrise-sunset.org/json?lat=33.3823&lng=35.1856&date=2016-10-01```\n \nВы можете вставить этот запрос в вебхук виджет, выбрать пин ```V0``` и написать :\n \n```cpp\nBLYNK_WRITE(V0){\n  String webhookdata = param.asStr();\n  Serial.println(webhookdata);\n}\n```\n\nТеперь, каждый раз когда вы дергаете ```V0``` с помощью ```Blynk.virtualWrite(V0, 1)``` будет вызвана функция ```BLYNK_WRITE(V0)```.\n\n**Замечание:** обычно HTTP запросы довольно большие, поэтому Вам, вероятно, нужно будет увеличить лимит на максимальную \n длину сообщения на микроконтроллере ```#define BLYNK_MAX_READBYTES 1024```. \n\n**Замечание:** наше облако так же имеет определенные лимиты для вебхука. Мы разрешаем слать только 1 запрос в секунду. \nЭто поведение можно изменить на локальном сервер через свойство ```webhooks.frequency.user.quota.limit```. Пожалуйста, \nиспользуйте вебхуки с умом. Многие веб ресурсы не способны обрабатывать даже 1 запрос в секунду. \n \n**Замечание :** в случае если Ваш вебхук не выполнился 10 раз подряд - вебхук виджет будет остановлен. Чтобы восстановить \nего работу - нужно открыть и закрыть виджет в режиме редактирования. Не выполненными считаются запросы у которых код ответа \nне равен 200 или 302.\n"
  },
  {
    "path": "mobile/segmentedSwitch.md",
    "content": "\n### Segmented Switch\n\nSegmented Switch widget allows you to send command to your hardware based on selection you made on UI. Segmented Switch\nsends index of element you selected and not label string. Sending index starts from 1.\nIt works same way as usual ComboBox or Menu element. \n\nExample code:\n```cpp\nBLYNK_WRITE {\n  switch (param.asInt()) {\n    case 1: { // Item 1\n      Serial.println(\"Item 1 selected\");\n      break;\n    }\n    case 2: { // Item 2\n      Serial.println(\"Item 2 selected\");\n      break;\n    }    \n  }\n}\n```\n\nYou can also set Menu items from hardware side with : \n```cpp\nBlynk.setProperty(V1, \"labels\", \"label 1\", \"label 2\", \"label 3\");\n```\n\n**Sketch:** [Menu](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Menu/Menu.ino)"
  },
  {
    "path": "mobile/segmented_control.md",
    "content": "\n### Segmented Switch\n\nSegmented Switch widget allows you to send command to your hardware based on selection you made on UI. Segmented Switch\nsends index of element you selected and not label string. Sending index starts from 1.\nIt works same way as usual ComboBox or Menu element. \n\nExample code:\n```cpp\nBLYNK_WRITE {\n  switch (param.asInt()) {\n    case 1: { // Item 1\n      Serial.println(\"Item 1 selected\");\n      break;\n    }\n    case 2: { // Item 2\n      Serial.println(\"Item 2 selected\");\n      break;\n    }    \n  }\n}\n```\n\nYou can also set Menu items from hardware side with : \n```cpp\nBlynk.setProperty(V1, \"labels\", \"label 1\", \"label 2\", \"label 3\");\n```\n\n**Sketch:** [Menu](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Menu/Menu.ino)"
  },
  {
    "path": "mobile/slider.md",
    "content": "\n### Slider\n\nSimilar to potentiometer. Allows to send values between MIN and MAX.\n \nYou can change slider state from hardware side. For example, set slider value assigned to virtual pin V1 to 55 : \n\n```cpp\nBlynk.virtualWrite(V1, 55);\n```\n\nYou can change slider label from hardware with : \n\n```cpp\nBlynk.setProperty(V1, \"label\", \"My Slider Label\");\n```\n\nor change color : \n\n```cpp\n//#D3435C - Blynk RED\nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\n### Fraction\nDefines how many digits after the point you would like to see when moving slider.\nWhen you have \"No Fraction\" that means slider will send only integer values without decimal point.\n\"1 digit\" means that values will look like 1.1, 1.2, ..., 2.0, etc.\n \n### Send On Release\n**Send On Release** is available for most controller widgets and allows you to decrease data traffic on your hardware. \nFor example, when you move slider widget, commands are continuously streamed to the hardware, during a single slider move \nyou can send dozens of commands. There are use-cases where it's needed, however creating such a load may cause hardware reset. \nWe recommend enabling **Send On Release** feature for most of the cases, unless you really need instant feedback.\nThis option is enabled by default.\n\n### Write interval\nSimilar to above option. However, allows you to stream values to your hardware within certain interval. For example, \nsetting write interval to 100 ms - means, that while you move slider only 1 value will be send to hardware within 100 ms.\nThis option also used to decrease data traffic on your hardware.\n\n**Sketch:** [Basic Sketch](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)"
  },
  {
    "path": "mobile/step.md",
    "content": "\n### Step Control\n\nStep control is like 2 buttons assigned to 1 pin. One button increments your value by desired step and another \none decrements it. It is very useful for use cases where you need to change your values very precisely and you can't \nachieve this precision with slider widget.\n\n**Send Step** option allows you to send step to hardware instead of actual value of step widget.\n**Loop value** option allows you to reset step widget to start value when maximum value is reached.\n\nYou can change step state from hardware side. For example : \n\n```cpp\nBlynk.virtualWrite(V1, val);\n```\n\nYou can change step labels from hardware with : \n\n```cpp\nBlynk.setProperty(V1, \"label\", \"My Stepper\");\n```\n\nYou can change the step of the step widget from hardware with : \n\n```cpp\nBlynk.setProperty(V1, \"step\", 10);\n```\n\nor change color : \n\n```cpp\n//#D3435C - Blynk RED \nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\nYou can also get step control state from server in case your hardware was disconnected with Blynk Sync feature : \n\n```cpp\nBLYNK_CONNECTED() {\n  Blynk.syncVirtual(V1);\n}\n\nBLYNK_WRITE(V1) {\n  int stepperValue = param.asInt();\n}\n```\n\n### Write interval\nSimilar to above option. However, allows you to stream values to your hardware within certain interval. For example, \nsetting write interval to 100 ms - means, that while you move slider only 1 value will be send to hardware within 100 ms.\nThis option also used to decrease data traffic on your hardware.\n\n**Sketch:** [Basic Sketch](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)"
  },
  {
    "path": "mobile/styled_button.md",
    "content": "\n### Styled Button\n\nWorks in push or switch modes. Allows to send any number value on button click and button release events.\nBy default button uses 0/1 (LOW/HIGH) values. Button sends 1 (HIGH) on press and sends 0 (LOW) on release.\n\nYou can change button state from hardware side. For example, turn on button assigned to virtual pin V1:\n\n```cpp\nBlynk.virtualWrite(V1, HIGH);\n```\n\nYou can change button labels from hardware with : \n\n```cpp\nBlynk.setProperty(V1, \"onLabel\", \"ON\");\n\nBlynk.setProperty(V1, \"offLabel\", \"OFF\");\n```\n\nor change color of the button :\n\n```cpp\nBlynk.setProperty(V1, \"onColor\", \"#D3435C\");\n\nBlynk.setProperty(V1, \"offColor\", \"#D3435C\");\n```\n\nor change background color of the button :\n\n```cpp\nBlynk.setProperty(V1, \"onBackColor\", \"#D3435C\");\n\nBlynk.setProperty(V1, \"offBackColor\", \"#D3435C\");\n```\n\nYou can also get button state from server in case your hardware was disconnected with Blynk Sync feature : \n\n```cpp\nBLYNK_CONNECTED() {\n  Blynk.syncVirtual(V1);\n}\n\nBLYNK_WRITE(V1) {\n  int buttonState = param.asInt();\n}\n```\n\n**Sketch:** [Basic Sketch](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n**Sketch:** [Physical Button Interrupt](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonInterrupt/ButtonInterrupt.ino)\n\n**Sketch:** [Physical Button Poll](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonPoll/ButtonPoll.ino)\n\n**Sketch:** [Physical Button State Sync](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/SyncPhysicalButton/SyncPhysicalButton.ino)"
  },
  {
    "path": "mobile/super_chart.md",
    "content": "\n### SuperChart\n\nSuperChart is used to visualise live and historical data. You can use it for sensor data, for binary event logging and more.\n\nTo use SuperChart widget you would need to push the data from the hardware with the desired interval by using timers.\n[Here is](https://examples.blynk.cc/?board=ESP8266&shield=ESP8266%20WiFi&example=GettingStarted%2FPushData) a basic example for data pushing.\n\n#### Interactions:\n- **Switch between time ranges and Live mode**\n</br>Tap time ranges at the bottom of the widget to change time ranges\n\n- **Tap Legend Elements** to show or hide datastreams\n</br>\n\n- **Tap'n'hold to view timestamp and corresponding values**\n\n- **Quick swipe from left to right to reveal previous data**</br>\nThen you can then scroll data back and forward within the given time range.\n\n- **Full Screen Mode**</br>\nPress this button to open Full Screen view in landscape orientation.\n\nSimply rotate the phone back to portrait mode. Chart should rotate automagically. \nIn full screen view you will see X (time) and multiple Y scales. \nFull Screen Mode can be disabled from widget Settings.\n\n- **Menu Button**</br>\nMenu button will open additional functions:\n\t- Export to CSV\n\t- Erase Data on the server \n\n#### SuperChart Settings:\n- **Chart Title**\n- **Title Font Size**</br>\nYou have a choice of 3 font sizes\n- **Title Alignment**</br>\nChoose chart title alignment. This setting also affects Title and Legend position on the Widget.\n- **Show x-axis (time)**</br>\nSelect it if you want to show the time label at the bottom of your chart.\n- **Time ranges picker**</br>\nAllows you to select required periods (`15m`, `30m`, `1h`, `3h`, ...) and resolution for your chart. Resolution\ndefines how precise your data is. Right now chart supports 2 types of resolution `standard` and `high`. Resolution also\ndepends on the selected period. For example, `standard` resolution for `1d` means you'll get 24 points per day (1 per hour),\nwith `high` resolution you'll get for `1d` 1440 points per day (1 per minute).\n- **Datastreams**</br>\nAdd datastreams (read below how to configure datastreams)\n\n#### Datastream Settings\n\nWidget supports up to 4 Datastreams. \nPress Datastream Settings Icon to open Datastream Settings.\n\n\n**Design:**\nChoose available types of Chart:\n\n- Line\n- Area\n- Bar\n- Binary (anchor LINK to binary)\n\n**Color:**\nChoose solid colors or gradients\n\n**Source and input:**\nYou can use 3 types of Data source: \n\n**1. Virtual Pin**\nChoose the desired Device and Virtual Pin to read the data from. \n\n**2. Tags**\nSuperChart can aggregate data from multiple devices using built-in aggregation functions. \nFor example, if you have 10 Temperature sensors sending temperature with the given period, \nyou can plot average value from 10 sensors on the widget.\n\nTo use Tags:\n\n- **[Add Tag](/#blynk-main-operations-control-of-multiple-devices-tags)** to every device you want to aggregate data from.\n- **Push data to the same Virtual Pin** on every device. (e.g. ```Blynk.virtualWrite (V0, temperature);```)\n- **Choose Tag as a source** in SuperChart Widget and use the pin where the data is coming to (e.g V0)<br>\n\n**Functions available:** \n\t\n- `SUM` will summarize all incoming values to the specified Virtual Pin across all devices tagged with the chosen tag\n- `AVG` will plot average value\n- `MED` will find a median value\n- `MIN` will plot minimum value\n- `MAX` will plot maximum value\n\t\n\n**☝️ IMPORTANT: Tags are not working in Live Mode.**\n\n3. **[Device Selector](/#widgets-time-input-device-selector)**\nIf you add Device Selector Widget to your project, you can use it as a source for SuperChart. \nIn this case, when you change the device in Device Selector, chart will be updated accordingly\n\n**Y-Axis Settings**\n<br>There are 4 modes of how to scale data along the Y axis\n\n1. *Auto*<br>\nData will be auto-scaled based on min and max values of the given time period. This is nice option to start with.\n\n2. **Min/Max**<br>\nWhen this mode is selected, Y scale will be set to the values you choose. \nFor example, if your hardware sends data with values varying from -100 to 100, you can set the chart \nto this values and data will be rendered correctly.\n\nYou may also want to visualize the data within some specific range. \nLet's say incoming data has values in the range of 0-55, but you would like to see only values in the range 30-50. \nYou can set it up and if values are out of Y scale you configured, chart will be cropped\n\n3. **% of Height**<br>\nThis option allows you to auto-scale incoming data on the widget and position it the way you want. \nIn this mode, you set up the percentage of widget height on the screen, from 0% to 100%. \n\nIf you set 0-100%, in fact it's a full auto-scale. No matter in which range the data is coming,  \nit will be always scaled to the whole height of the widget.\n\nIf you set it to 0-25%, then this chart will only be rendered on 1/4 of the widget height.\n\nThis setting is very valuable for **Binary Chart** or for visualizing a few datastreams on the same chart in a different way.\n\n4. *Delta*<br>\nWhile data stays within the given Delta value, chart will be auto-scaled within this range.\nIf delta exceeds the range, chart will be auto-scaled to min/max values of the given period.\n\n**Suffix**<br>\nHere you can specify a suffix that will be shown during the Tap'n'hold.\n\n**Decimals**<br>\nDefines the formatting of the graph value when you Tap'n'hold the graph. Possible options are: #, #.#, #.##, etc.\n\n**Connect Missing Data Points**<br>\nIf this switch is ON, then SuperChart will connect all the dots even if there was no data.\n\nIf it's set to OFF, then you will see gaps in case there was no data.\n\n**Binary Chart Settings**<br>\nThis type of chart is useful to plot binary data, for example when unit was ON or OFF, or when motion was detected or when certain threshold was reached.\n\nYou need to specify a **FLIP** point, which is the point where incoming data will be turned into TRUE or FALSE state.\n\nFor example, you send the data in the range of `0 to 1023`. If you set `512` as a **FLIP** point, then everything above `512` (excluding 512) will be recorded as `TRUE`, any value below `512` (including 512) will be `FALSE`.\n\nAnother example, if you send `0 and 1` and set `0` as a **FLIP** point, then `1` will be `TRUE`, `0` will be `FALSE`\n\n**State Labels:**<br>\nHere you can specify how `TRUE/FALSE` should be shown in Tap'n'Hold mode. \n\nFor example, you can set to `TRUE` to \"Equipment ON\" label, `FALSE` to \"Equipment OFF\"."
  },
  {
    "path": "mobile/table.md",
    "content": "\n### Table\n\nTable widget comes handy when you need to structure similar data within 1 graphical element. It works as a usual table.\n\nYou can add a row to the table with : \n\n```\nBlynk.virtualWrite(V1, \"add\", id, \"Name\", \"Value\");\n```\n\nYou can update a row in the table with :\n\n```\nBlynk.virtualWrite(V1, \"update\", id, \"UpdatedName\", \"UpdatedValue\");\n```\n\nTo highlight any item in a table by using it's id in a table : \n\n```\nBlynk.virtualWrite(V1, \"pick\", 0);\n```\n\nTo select/deselect (make icon green/grey) item in a table by using it's row id in a table : \n\n```\nBlynk.virtualWrite(V1, \"select\", 0);\nBlynk.virtualWrite(V1, \"deselect\", 0);\n```\n\n\nTo clear the table at any time with: \n\n```\nBlynk.virtualWrite(V1, \"clr\");\n```\n\nYou can also handle other actions coming from table. For example, use row as a switch button. \n\n```\nBLYNK_WRITE(V1) {\n   String cmd = param[0].asStr();\n   if (cmd == \"select\") {\n       //row in table was selected. \n       int rowId = param[1].asInt();\n   }\n   if (cmd == \"deselect\") {\n       //row in table was deselected. \n       int rowId = param[1].asInt();\n   }\n   if (cmd == \"order\") {\n       //rows in table where reodered\n       int oldRowIndex = param[1].asInt();\n       int newRowIndex = param[2].asInt();\n   }\n}\n```\n\n**Note :** Max number of rows in the table is 100. When you reach the limit, table will work as FIFO (First In First Out) list.\nThis limit can be changed by configuring ```table.rows.pool.size``` property for Local Server.\n\n**Sketch:** [Simple Table usage](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Table/Table_Simple/Table_Simple.ino)\n\n**Sketch:** [Advanced Table usage](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Table/Table_Advanced/Table_Advanced.ino)"
  },
  {
    "path": "mobile/tabs.md",
    "content": "\n### Tabs\n\nThe only purpose of Tabs widget is to extend your project space. \nIn order to edit tabs widget - just tap on the selected tab. \nYou can drag widgets between tabs. \nOnly the last tab can be removed: to remove it swipe left on its name in Settings screen.\n\nThe maximum number of tabs on iOS is 4\nThe maximum number of tabs on Android is 10\n\nStay tuned for an upcoming Tabs widget redesign!"
  },
  {
    "path": "mobile/temperature.md",
    "content": "\n### Temperature\n\nTemperature is kind of [environment sensors](https://developer.android.com/guide/topics/sensors/sensors_environment.html) \nthat allows you to measure ambient air temperature.\nMeasured in ```°C``` - celcius.\n\nIn order to accept data from it you need to : \n\n```cpp\nBLYNK_WRITE(V1) {\n  // temperature in celcius\n  int celcius = param.asInt();\n}\n```\n\nTemperature doesn't work in background.\n"
  },
  {
    "path": "mobile/terminal.md",
    "content": "\n### Terminal\n\nDisplays data from your hardware. Allows to send any string to your hardware. Terminal always stores last 25 messages\nyour hardware had send to Blynk Cloud. This limit may be increased on Local Server with ```terminal.strings.pool.size``` \nproperty.\n\nYou can use special commands with this widget:\n\n```cpp\n// Print values, like Serial.print\nterminal.print();   \n// Print values, like Serial.println()\nterminal.println();\n // Write a raw data buffer\nterminal.write();\n// Ensure that data was sent out of device\nterminal.flush();\n// Erase all values in the terminal\nterminal.clear();\n```\n\n**Sketch:** [Terminal](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Terminal/Terminal.ino)"
  },
  {
    "path": "mobile/textInput.md",
    "content": "\n### Text Input\n\nText Input displays and let's you directly alter a string value. You can limit a maximum number of characters in widget settings."
  },
  {
    "path": "mobile/text_input.md",
    "content": "# Text Input\n\nText Input displays and let's you directly alter a string value. You can limit a maximum number of characters in widget settings.\n\n"
  },
  {
    "path": "mobile/time_input/README.md",
    "content": "# Time Input\n\nTime input widget allows you to select start/stop time, day of week, timezone, sunrise/sunset formatted values and send them to your hardware. Supported formats for time now are `HH:MM` and `HH:MM AM/PM`.\n\nHardware will get selected on UI time as seconds of day \\(`3600 * hours + 60 * minutes`\\) for start/stop time. Time that widget sends to hardware is user local time. Selected days indexes :\n\n```text\nMonday - 1\nTuesday - 2\n...\nSaturday - 6\nSundays - 7\n```\n\nYou can also change state of widget on UI. See below sketches.\n\n**Sketch:** [Simple Time Input for start time](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/SimpleTimeInput/SimpleTimeInput.ino)\n\n**Sketch:** [Advanced Time Input](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/AdvancedTimeInput/AdvancedTimeInput.ino)\n\n**Sketch:** [Update Time Input State on UI](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/UpdateTimeInputState/UpdateTimeInputState.ino)\n\n"
  },
  {
    "path": "mobile/time_input/untitled-1.md",
    "content": "# Alias\n\n[Permalink](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/new/en/datastream_alias.md)\n\nCannot retrieve contributors at this time\n\n 7 lines \\(4 sloc\\) 332 Bytes\n\n## Datastream: Alias\n\nAlias is an alternative Datastream name which can be changed by the end-user. For example, it can be used by voice assistants like Amazon Echo \\(Alexa\\) and Google Home Assistant .\n\nYou can only use letters, digits and spaces. No other characters are allowed\n\n**IMPORTANT:** Duplicate aliases are not allowed.\n\n"
  },
  {
    "path": "mobile/time_input.md",
    "content": "\n## Time Input\n\nTime input widget allows you to select start/stop time, day of week, timezone, sunrise/sunset formatted values\nand send them to your hardware. Supported formats for time now are ```HH:MM``` and ```HH:MM AM/PM```.\n\nHardware will get selected on UI time as seconds of day (```3600 * hours + 60 * minutes```) for start/stop time.\nTime that widget sends to hardware is user local time.\nSelected days indexes : \n\n```\nMonday - 1\nTuesday - 2\n...\nSaturday - 6\nSundays - 7\n```\n\nYou can also change state of widget on UI. See below sketches.\n\n**Sketch:** [Simple Time Input for start time](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/SimpleTimeInput/SimpleTimeInput.ino)\n\n**Sketch:** [Advanced Time Input](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/AdvancedTimeInput/AdvancedTimeInput.ino)\n\n**Sketch:** [Update Time Input State on UI](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/UpdateTimeInputState/UpdateTimeInputState.ino)"
  },
  {
    "path": "mobile/timeinput.md",
    "content": "\n## Time Input\n\nTime input widget allows you to select start/stop time, day of week, timezone, sunrise/sunset formatted values\nand send them to your hardware. Supported formats for time now are ```HH:MM``` and ```HH:MM AM/PM```.\n\nHardware will get selected on UI time as seconds of day (```3600 * hours + 60 * minutes```) for start/stop time.\nTime that widget sends to hardware is user local time.\nSelected days indexes : \n\n```\nMonday - 1\nTuesday - 2\n...\nSaturday - 6\nSundays - 7\n```\n\nYou can also change state of widget on UI. See below sketches.\n\n**Sketch:** [Simple Time Input for start time](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/SimpleTimeInput/SimpleTimeInput.ino)\n\n**Sketch:** [Advanced Time Input](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/AdvancedTimeInput/AdvancedTimeInput.ino)\n\n**Sketch:** [Update Time Input State on UI](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/UpdateTimeInputState/UpdateTimeInputState.ino)"
  },
  {
    "path": "mobile/timer.md",
    "content": "\n### Timer\n\nTimer triggers actions at a specific time. Even if smartphone is offline. By default start time sends 1 (HIGH), \nstop time sends 0 (LOW). You can change this with any other values.\nYou can change timer settings in \"run\" mode.\nRecent Android version also has improved Timer within Eventor widget.\nWith Eventor Time Event you can assign multiple timers on same pin, send any string/number, select days and timezone. \nIt is recommended to use Eventor over Timer widget.\nHowever Timer widget is still suitable for simple timer events.\n\n**NOTE:** The timer widget rely on the server time and not your phone time. Sometimes the phone time may not match the server time. \n\n**Sketch:** [Timer](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Timer/Timer.ino)"
  },
  {
    "path": "mobile/twitter.md",
    "content": "\n### Twitter\n\nTwitter widget connects your Twitter account to Blynk and allows you to send Tweets from your hardware.\n\nExample code:\n```cpp\nBlynk.tweet(\"Hey, Blynkers! My Arduino can tweet now!\");\n```\n\nLimitations :\n\n- you can't send 2 tweets with same message (it's Twitter policy)\n- only 1 tweet per 5 seconds is allowed\n\n### Unicode in Twitter\n\nThe library handles all strings as UTF8 Unicode. If you're facing problems, try to print your message to the Serial \nand see if it works (the terminal should be set to UTF-8 encoding). If it doesn't work, probably you should read \nabout unicode support of your compiler. \nIf it works, but your message is truncated - you need to increase message length limit \n(all Unicode symbols consume at least twice the size of Latin symbols).\n\n### Increasing message length limit\n\nYou can increase maximum message length by putting on the top of your sketch (before Blynk includes):\n```cpp\n#define BLYNK_MAX_SENDBYTES 256 // Default is 128\n```\n\n**Sketch:** [Twitter](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Twitter/Twitter.ino)"
  },
  {
    "path": "mobile/value_display.md",
    "content": "\n### Value Display\n\nDisplays incoming data from your sensors or Virtual Pins.\nCan work in 2 modes : \n\n- PUSH mode (select it from Frequency Reading picker);\n- Frequency Reading mode;\n\nIn PUSH mode you update value display from hardware side with code : \n \n```cpp\nBlynk.virtualWrite(V1, val); \n```\n\nIn this mode every message that hardware sends to server is stored automatically on server. PUSH mode doesn't require \napplication to be online or opened.\n\nWith Frequency Reading mode you need to select update interval and application will trigger events with required timing. \nYour application should be open and running in order to make requests to hardware. You don't need any code for Analog and \nDigital pins in that case. However for virtual pins you need to use next code : \n\n```cpp\n//triggered from app\nBLYNK_READ(V1)\n{\n  //send to app\n  Blynk.virtualWrite(V1, val);\n}\n```\n\n#### Home Screen Value Display\n\nYou can also add Value Display to your Android Home Screen. Value Display works via HTTPS in that case. \nHave in mind that in \"Home Screen\" mode Value Display has few limitations. Value Display will update it's state only \nonce per 15 min. You can change this via Widget Settings. However update interval less than 15 minutes is not guaranteed.  \nYou can also resize Value Display on Home Screen - just do long click on widget and resize it as you need.\n\n**Note :** Adding home screen widget costs 100 energy. This energy not rechargeable.\n**Note :** Home Screen Widgets for Local Blynk servers requires port 8080 to be opened.\n\n**Sketch:** [BlynkBlink](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)"
  },
  {
    "path": "mobile/video.md",
    "content": "\n## Video Streaming\n\nSimple widget that allows you to display any live or video stream. Widget supports RTSP (RP, SDP), HTTP/S progressive streaming, \nHTTP/S live streaming. For more info please follow [official Android documentation](https://developer.android.com/guide/appendix/media-formats.html). \n\nAt the moment Blynk doesn't provide streaming servers. So you can either stream directly from camera, use 3-d party \nservices or host streaming server on own server (on raspberry for example).\n\nYou can also stop/start video stream with click on widget.\n\nYou can also change video url from hardware with : \n\n```cpp\nBlynk.setProperty(V1, \"url\", \"http://my_new_video_url\");\n```"
  },
  {
    "path": "mobile/webhook.md",
    "content": "\n### Webhook\n\nWebhook is a widget for 3-d party integrations. With webhook widget you can send HTTP/S requests to any 3-d party server \nor device that has HTTP/S API (Philips Hue for instance).\n\nAny write operation from hardware side will trigger webhook widget (same way as for eventor). You can also trigger \nwebhook from application side in case control widget assigned to same pin as webhook. You can trigger 3-d party service \nwith single button click.\n\nFor example, imagine a case when you want to send data from your hardware not only to Blynk but also to Thingspeak server.\nIn typical, classic use case you'll need to write code like this (this is minimal and not full sketch) : \n\n```cpp\nWiFiClient client;\nif (client.connect(\"api.thingspeak.com\", 80)) {\n    client.print(\"POST /update HTTP/1.1\\n\");\n    client.print(\"Host: api.thingspeak.com\\n\");\n    client.print(\"Connection: close\\n\");\n    client.print(\"X-THINGSPEAKAPIKEY: \" + apiKeyThingspeak1 + \"\\n\");\n    client.print(\"Content-Type: application/x-www-form-urlencoded\\n\");\n    client.print(\"Content-Length: \");\n    client.print(postStr.length());\n    client.print(\"\\n\\n\");\n    client.print(postStr);\n}\n```\n \nWith webhook widget this is not necessary anymore. All you need just fill few fields. \n\nAnd do usual :  \n\n```cpp\nBlynk.virtualWrite(V0, value);\n```\n\nwhere V0 is pin assigned to webhook widget.\n\nAlso you can use usual Blynk placeholders for pin value in body or url, for example : \n\n```cpp\nhttps://api.thingspeak.com/update?api_key=xxxxxx&field1=/pin/\n```\n\nor for body\n\n```cpp\n[\"/pin/\"]\n```\n\nYou can also refer to specific index of multi value pin (multi pin supports up to 5 values) : \n\n```/pin[0]/```,```/pin[1]/```, ```/pin[2]/```\n\nAnother cool thing about webhook is that you can make GET requests from Blynk Server side and return response directly to\nyour hardware. The beauty here is that you don't need to code request to 3-d party service. Imagine a case when you want to get \nweather from some 3-d party service. For example, you have an url \n```http://api.sunrise-sunset.org/json?lat=33.3823&lng=35.1856&date=2016-10-01```, you can put it in widget, select ```V0``` pin,\nand do usual :  \n\n```cpp\nBLYNK_WRITE(V0){\n  String webhookdata = param.asStr();\n  Serial.println(webhookdata);\n}\n```\n\nNow, every time you'll trigger ```V0``` pin (with ```Blynk.virtualWrite(V0, 1)``` from hardware side or with control widget\nassigned to ```V0```) - ```BLYNK_WRITE(V0)``` will be triggered.\n\n**NOTE :** usually 3-d party servers returns big responses, so you have to increase hardware maximum allowed message size with \n```#define BLYNK_MAX_READBYTES 1024```. Where ```1024``` - is maximum allowed message size.\n\n**NOTE :** Blynk cloud has limitation for webhook widget - you are allowed to send only 1 request per second. You can\n change this on local server with ```webhooks.frequency.user.quota.limit``` property. Please be very careful using webhooks, \n as many resources not capable to handle even 1 req/sec, so you may be banned on some of them. For example thingspeak \n allows to send 1 request per 15 seconds.\n \n**NOTE :** In order to avoid spamming Blynk Webhook has one more limitation - in case your webhook requests were failed 10 times \nin row your webhook widget will be stopped. In order to resume it you need to open widget and save it again. Failed requests \nare requests that return status code that are not equal to 200 or 302.\n\n**NOTE :** Webhook widget may affect ```Blynk.syncAll()``` feature. As returned response from server may be big. \nSo, please, be careful with it."
  },
  {
    "path": "mobile-app/untitled.md",
    "content": "# Untitled\n\n"
  },
  {
    "path": "new/en/product_categories.md",
    "content": "### Info: Categories\n\nUse this option to group devices by their type on voice assistants (Alexa, Google Assistant) side.\nIt allows you to control the entire group of devices by giving single commands. \n\n#### Examples: \n1. voice command \"Alexa, lights on\" turns on all the bulbs in the room – you don't have to repeat the command for each of them;  \n2. voice command \"Alexa, play the music\" starts playing the music from the nearest or all the speakers (depending on assistants presets).  \n\nChoose the corresponding device type(s) from the dropdown menu.\n"
  },
  {
    "path": "new/en/product_hotspot_prefix.md",
    "content": "### Info: Hotspot Prefix\n\nIt's used in case you set up the device (For example: ESP8266 or ESP32) as WiFi access point.  \nUse this field to give a name to the future access point.  \nThis setting applies during device provisioning.\n"
  },
  {
    "path": "new/en/product_template_ids.md",
    "content": "### Info: Template ID  \n\nProduct's Template ID is used to check if new Device is allowed to work with the Product's settings.  \n  \nFollow these steps to allow the Device to use Product's Template you need: \n- select the Product, open Info tab and copy it's Template ID (several Template IDs can be assigned to one Product);\n- in Arduino IDE sketch find a string that contains \"#define BOARD_TEMPLATE_ID\", change \"TMPL0000\" by pasting Template ID from the previosu step; \n- flash the Device\nThe Device is ready for provision now.  \n\n**Note: the Device will be refused by the app if it's and Product's Template ID don't match.**\n"
  },
  {
    "path": "ota.md",
    "content": "# OTA\n\nBlynk also supports over the air updates for - ESP8266, NodeMCU and SparkFun Blynk boards. OTA supported only for the private servers and for the paid customers for now.\n\n## How does it work?\n\n* You need to use [regular sketch for exported apps](https://github.com/blynkkk/blynk-library/tree/master/examples/Blynk.Inject/Template_ESP8266);\n* After you launched your hardware you are ready for OTA;\n* You can trigger the firmware update for the specific hardware via it's token or for all hardware.\n\n### Flow\n\n1. User triggers OTA with one of below HTTPS request;\n2. User provides within HTTPS request admin credentials and firmware binary file to update hardware with;\n3. When hardware connects to server - server checks it firmware. In case, hardware firmware build date differs from \n\n   uploaded firmware, than server sends special command to hardware with url for the new firmware;\n\n4. Hardware processes url with below [handler](https://github.com/blynkkk/blynk-library/blob/master/examples/Blynk.Inject/Template_ESP8266/OTA.h#L31):\n\n   ```text\n     BLYNK_WRITE(InternalPinOTA) {\n       //url to get firmware from. This is HTTP url\n       //http://localhost:8080/static/ota/FUp_2441873656843727242_upload.bin\n       overTheAirURL = param.asString();\n       ...\n     }\n   ```\n\n   1. Hardware downloads new firmware and starts flashing firmware;  \n\n## Trigger update for the specific hardware\n\n```text\ncurl -v -F file=@Template_ESP8266.ino.nodemcu.bin --insecure -u admin@blynk.cc:admin https://localhost:9443/admin/ota/start?token=123\n```\n\n* `Template_ESP8266.ino.nodemcu.bin` - is relative \\(or full\\) path to your firmware;\n* `--insecure` flag for servers with self-generated certificates. You don't need this flag if you used Let's Encrypt or other trusted certificates;\n* `admin@blynk.cc:admin` admin credentials to your server. This is default ones. Format is `username:password`. You can change it in `server.properties` file;\n* `token` is token of your hardware you want apply the firmware update to. The firmware update will be initiated only in case device is online;\n\n## Trigger OTA for all devices\n\nUpdate for all devices will be triggered only when they are connected to the cloud. You need to remove the token part for that.\n\n```text\ncurl -v -F file=@Template_ESP8266.ino.nodemcu.bin --insecure -u admin@blynk.cc:admin https://localhost:9443/admin/ota/start\n```\n\nIn that case, OTA will be triggered right after device connected to the server. In case device is online firmware update will be initiated only when device will be connected again.\n\n## Trigger OTA for the specific user\n\nIn that case firmware update will be triggered for all devices of specified user.\n\n```text\ncurl -v -F file=@Template_ESP8266.ino.nodemcu.bin --insecure -u admin@blynk.cc:admin https://localhost:9443/admin/ota/start?user=pupkin@gmail.com\n```\n\n## Trigger OTA for specific user and project\n\nIn that case firmware update will be triggered for all devices of specified user within specified project.\n\n```text\ncurl -v -F file=@Template_ESP8266.ino.nodemcu.bin --insecure -u admin@blynk.cc:admin https://localhost:9443/admin/ota/start?user=pupkin@gmail.com&project=123\n```\n\n## Stop OTA\n\n```text\ncurl -v --insecure -u admin@blynk.cc:admin https://localhost:9443/admin/ota/stop\n```\n\n## How to make firmware\n\nIn order to make firmware in Arduino IDE - go to menu: Sketch -&gt; Export compiled Binary.\n\n_NOTE:_ ESP8266 right now takes firmware only via HTTP. And not HTTPS.\n\n"
  },
  {
    "path": "roadmap.md",
    "content": "# Roadmap\n\nWe build Blynk based on Blynkers feedback but with limited resources we have to prioritize our features. At the moment list look like that:\n\n* App Sharing \\(project sharing when other people can control your hardware, but can't modify your project\\); Free Beta\n* App Sharing \\(project sharing when other people can control your hardware, but can't modify your project\\); Subscription based\n* Bluetooth Low Energy support;\n* Hardware state handling \\(changing physical button state changes Blynk application state\\);\n* Hardware online/offlane state improvements \\(better indication for \"is hardware online?\", \"is hardware offline?\"\\);\n* Project space increase\n* Direct Connect support \\(for WiFi\\);\n* RTC widget;\n* Design options for widgets \\(size, button with icons, etc\\);\n* Phone sensors widgets \\(GPS, accelerometer\\);\n* IP camera support;\n* Customizable look and feel of the project\n\nUnder consideration:\n\n* Home screen widget \\(to avoid opening App when you need only 1 button click\\);\n* Haptic feedback \\(vibration\\) when touching widgets\n\n"
  },
  {
    "path": "ru/Amendments.md",
    "content": "#Blynk Amendments\r\n###Tell every maker about Blynk\r\nNo pressure. Just do it. Now.\r\n###Make your idea work without Blynk\r\nBlynk can be easily integrated in almost any project. But before that - make it work **without** it. After you are sure that you can get all the sensor data or can control things from the code – integrate Blynk and make it even more awesome.\r\n###Use search\r\nWe are always happy to chat and help, but remember - every time you ask the question that was answered many many times before that, Blynk Team is not building a new widget or new cool feature. So:\r\n- google before asking\r\n- use search on our forum, it works really well\r\n- check Instructables\r\n###Always wrap your code\r\nThough shalt not post code without ```wrapping it``` "
  },
  {
    "path": "ru/AppExport.md",
    "content": "# App Export\r\n\r\n## Firmware for ESP8266, NodeMCU, BlynkBoard, etc.\r\n\r\n#### Prepare development environment\r\n1. Install [Arduino IDE](https://www.arduino.cc/en/Main/Software)\r\n2. Install [Blynk Library](https://github.com/blynkkk/blynk-library/releases/latest) and restart Arduino IDE\r\n3. Install [ESP8266 core for Arduino](https://github.com/esp8266/Arduino#installing-with-boards-manager)\r\n4. For Windows / OS X, you may need to install USB-Serial drivers according to your converter:\r\n - СP2102: https://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx \r\n - FTDI (FT232, etc): http://www.ftdichip.com/Drivers/VCP.htm\r\n - *TODO: Link to drivers for CH340 and PL2303.*\r\n5. If your board has a NeoPixel RGB LED, install [Adafruit NeoPixel](https://github.com/adafruit/Adafruit_NeoPixel) library from Library Manager\r\n\r\n#### Build your Firmware\r\n1. Open our example in Arduino IDE: ```File -> Examples -> Blynk -> Provisioning -> Blynk_ESP8266```\r\n2. Open ```Settings.h``` tab.\r\n3. Configure your firmware:\r\n  * ```BOARD_NAME``` - ...\r\n  * ```BOARD_VENDOR``` - ...\r\n  * ```PRODUCT_WIFI_SSID``` - ...\r\n  \r\n#### Upload firmare\r\n1. Select your board type: ```Tools -> Board -> [Your Board]```\r\n2. Select your port: ```Tools -> Port -> [...]```\r\n3. Verify and Upload!\r\n\r\nNote that for Blynk Board, you can select board type ```NodeMCU 1.0```.\r\n"
  },
  {
    "path": "ru/BlynkFirmware.md",
    "content": "# Прошивка Blynk\r\n## Конфигурация\r\n\r\n### Blynk.begin()\r\n\r\nСамый простой способ настроить Blynk - это использовать функцию ```Blynk.begin()```:\r\n\r\n```cpp\r\nBlynk.begin(auth, ...);\r\n```\r\n\r\nОна имеет несколько параметров для разных моделей оборудования, а также зависит от типа подключения. Следуйте примеру скетча для вашей конкретной аппаратной модели.\r\n\r\nЧто происходит внутри функции ```Blynk.begin()```:\r\n\r\n1. Подключение к сети (WiFi, Ethernet, ...)\r\n2. Вызов ```Blynk.config (...)``` для установки токена авторизации, адреса сервера и т.д.\r\n3. Пытается сразу подключиться к серверу (может продлится в течении 30 сек)\r\n\r\nЕсли ваш тип платы/подключения пока не поддерживается - вы можете реализовать его самостоятельно. [Вот несколько примеров]https://github.com/blynkkk/blynk-library/tree/master/examples/More/ArduinoClient).\r\n\r\n### Blynk.config()\r\n\r\n```config()``` позволяет управлять сетевым подключением. Вы можете настроить тип подключения (WiFi, Ethernet, ...) самостоятельно, а затем соединиться:\r\n\r\n```cpp\r\nBlynk.config(auth, server, port);\r\n```\r\nили так\r\n```cpp\r\nBlynk.config(auth);\r\n```\r\n\r\n**ПРИМЕЧАНИЕ. После вызова ```Blynk.config (...)``` ваше оборудование еще не подключено к серверу.**\r\nПопытка покдлючение произойдет при выполнении программой первой функции ```Blynk.run ()``` или ```Blynk.connect()```. Чтобы пропустить подключение к серверу или отключить его вручную, вызовите ```Blynk.disconnect()``` после функции конфигурации.\r\n\r\nИспользуйте `connectWiFi` чтобы удобно настроить WiFi соединение:\r\n\r\n```cpp\r\nBlynk.connectWiFi(ssid, pass);\r\n```\r\nЧтобы подключиться к открытой сети WiFi, укажите пустую строку (``\"\"``).\r\n\r\n## Управление соединением\r\n\r\nЕсть несколько функций, которые помогут с управлением соединением:\r\n\r\n### Blynk.connect()\r\nЭта функция будет продолжать попытки подключиться к серверу Blynk.\r\nВозвращает `true` при подключении, `false`, если истекло время ожидания.\r\nВремя ожидания по умолчанию составляет 30 секунд.\r\n\r\n```cpp\r\nbool result = Blynk.connect();\r\nbool result = Blynk.connect(timeout);\r\n```\r\n\r\n### Blynk.disconnect()\r\nОтключает оборудование от сервера Blynk:\r\n\r\n```cpp\r\nBlynk.disconnect();\r\n```\r\n\r\n### Blynk.connected()\r\nВозвращает `true`, когда оборудование подключено к Серверу Blynk,` false`, если нет активного подключения к серверу Blynk.\r\n\r\n```cpp\r\nbool result = Blynk.connected();\r\n```\r\n\r\n### Blynk.run()\r\nЭта функция должна вызываться часто, чтобы обрабатывать входящие команды и выполнять поддреживать соединения с Сервером Blynk.\r\nОбычно вызывается в цикле ```void loop () {}```.\r\n\r\nЭта команда может быть инициирована в других местах вашего кода, если только у вас не заканчивается памяти (в каскадных функциях с локальной памятью).\r\nНапример, не рекомендуется вызывать ```Blynk.run ()``` внутри ```BLYNK_READ``` и ```BLYNK_WRITE``` на устройствах с маленькой оперативной памятью.\r\n\r\n## Управление цифровыми и аналоговыми пинами\r\nБиблиотека Blynk может выполнять основные операции ввода-вывода \"из коробки\":\r\n\r\n    digitalRead\r\n    digitalWrite\r\n    analogRead\r\n    analogWrite (ШИМ или Аналоговый сигнал в зависимости от платформы)\r\n\r\nНет необходимости писать код для простых вещей, таких как светодиод, реле управления и аналоговые датчики. Просто выберите соответствующий пин в приложении Blynk и управляйте им напрямую без дополнительного кода\r\n\r\n## Управление виртуальными пинами\r\nВиртуальные пины (Virtual Pins) - это способ обмена любыми данными между вашим оборудованием и приложением Blynk.\r\nДумайте о виртуальных пинах как о каналах для приема/передачи любых данных. Убедитесь, что вы различаете виртуальные контакты от физических GPIO пинов на вашем оборудовании. Виртуальные контакты не имеют физического представления.\r\n\r\nВиртуальные пины обычно используются для взаимодействия с другими библиотеками (Servo, LCD и др.) и реализации пользовательской логики.\r\nУстройство может отправлять данные в приложение, используя ```Blynk.virtualWrite (pin, value)```, и получать данные из приложения, используя ```BLYNK_WRITE (vPIN)```. Читайте ниже...\r\n\r\n#### Типы данных Виртуальных пинов\r\nВсе значения виртуальных пинов всегда отправляются в виде строк, и нет никаких практических ограничений на данные, которые могут быть отправлены. Однако при работе с числами существуют определенные ограничения на аппаратную часть. Например, целое число на Arduino - 16-бит, допустимый диапазон значений от -32768 до 32767.\r\n\r\nЧтобы интерпретировать входящие данные как целые числа, числа с плавающей запятой, двойные числа и строки, используйте:\r\n\r\n```cpp\r\nparam.asInt();\r\nparam.asFloat();\r\nparam.asDouble();\r\nparam.asStr();\r\n```\r\n\r\nВы также можете получить RAW данные из буфера параметров:\r\n\r\n```cpp\r\nparam.getBuffer()\r\nparam.getLength()\r\n```\r\n\r\n### Blynk.virtualWrite(vPin, value)\r\n\r\n**ПРИМЕЧАНИЕ. Используйте BlynkTimer при использовании этой команды для отправки данных. В противном случае ваше оборудование будет терять связь с сервером**\r\n\r\nОтправка данных в различных форматах на виртуальные пины.\r\n\r\n```cpp\r\n// ОТправка строки\r\nBlynk.virtualWrite(pin, \"abc\");\r\n\r\n// Отправка числа\r\nBlynk.virtualWrite(pin, 123);\r\n\r\n// Отправка дробного числа\r\nBlynk.virtualWrite(pin, 12.34);\r\n\r\n// ОТправка массива значений\r\nBlynk.virtualWrite(pin, \"hello\", 123, 12.34);\r\n\r\n// ОТправка RAW данных\r\nBlynk.virtualWriteBinary(pin, buffer, length);\r\n```\r\n\r\nВызов ```virtualWrite``` пытается немедленно отправить значение в сеть.\r\n\r\n**Примечание:** Для виртуальных контактов с номерами больше 127 синтаксис `V128` недоступен.\r\n\r\nПожалуйста, используйте простой виртуальный пин-код, например:\r\n```cpp\r\nBlynk.virtualWrite(128, \"abc\");\r\n```\r\n\r\n## BlynkTimer\r\nВажно посылать данные с интервалами и сохранять цикл void () как можно более свободным.\r\n\r\n`BlynkTimer` позволяет периодически отправлять данные с заданными интервалами, не мешая работе библиотеки Blynk\r\n`BlynkTimer` наследует [SimpleTimer Library](http://playground.arduino.cc/Code/SimpleTimer), хорошо известную и широко используемую библиотеку для обработки нескольких событий на оборудовании.\r\n`BlynkTimer` включен в библиотеку Blynk по умолчанию и нет необходимости устанавливать SimpleTimer отдельно или включать `SimpleTimer.h`   \r\n\r\n- Один объект `BlynkTimer` позволяет планировать до 16 таймеров.\r\n- Улучшена совместимость с такими платами, как `Arduino 101`, `Intel Galileo` и т.д.\r\n- Когда таймер пытается запуститься несколько раз (из-за заблокированного цикла), он просто пропускает все пропущенные интервалы запуска и вызывает вашу функцию только один раз. Это отличается от `SimpleTimer`, который может вызывать вашу функцию несколько раз в этом сценарии.\r\n\r\nДля получения дополнительной информации об использовании таймера, пожалуйста [посмотрите](http://playground.arduino.cc/Code/SimpleTimer).\r\nА вот и BlynkTimer [пример скетча](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushData/PushData.ino#L30).\r\n\r\nТакже помните, что один экземпляр ```BlynkTimer``` может запланировать до 16 таймеров, поэтому, скорее всего, вам понадобится только один экземпляр BlynkTimer в вашем скетче.\r\n\r\n### BLYNK_WRITE(vPIN)\r\n```BLYNK_WRITE``` это функция, вызывается каждый раз, когда устройство получает обновление значения виртуального пина от сервера (или приложения):\r\n\r\nДля чтения полученных данных используйте код:\r\n\r\n```cpp\r\nBLYNK_WRITE(V0)\r\n{   \r\n  int value = param.asInt(); // Получить значение как целое число\r\n  \r\n  // Параметр может содержать несколько значений, в таком случае:\r\n  int x = param[0].asInt();\r\n  int y = param[1].asInt();\r\n}\r\n```\r\n\r\n**`BLYNK_WRITE` нельзя использовать внутри какого-либо цикла или функции. Это отдельная функция.**\r\n\r\n**Примечание:** Для виртуальных контактов с номерами > 127 используйте API `BLYNK_WRITE_DEFAULT()`\r\n\r\n### BLYNK_READ(vPIN)\r\n\r\n```BLYNK_READ``` - это функция, вызывается, когда от устройства требуется отправить текущее значение Виртуального пина на сервер. Обычно эта функция содержит вызов ```Blynk.virtualWrite```.\r\n\r\n```cpp\r\nBLYNK_READ(V0)\r\n{\r\n  Blynk.virtualWrite(V0, newValue);\r\n}\r\n```\r\n\r\n**Примечание:** Для виртуальных пинов с номерами более 127 используйте API `BLYNK_READ_DEFAULT()`\r\n\r\n### BLYNK_WRITE_DEFAULT()\r\n\r\nПереопределяет обработчик для всех выводов, которые не покрыты пользовательскими функциями ```BLYNK_WRITE```.\r\n\r\n```cpp\r\nBLYNK_WRITE_DEFAULT()\r\n{\r\n  int pin = request.pin;      // Какой именно пин обрабатывается?\r\n  int value = param.asInt();  // Используйте param как обычно.\r\n}\r\n```\r\n\r\n### BLYNK_READ_DEFAULT()\r\n\r\nПереопределяет обработчик для всех выводов, которые не покрыты пользовательскими функциями ```BLYNK_READ```.\r\n\r\n```cpp\r\nBLYNK_READ_DEFAULT()\r\n{\r\n  int pin = request.pin;      // Какой именно пин обрабатывается?\r\n  Blynk.virtualWrite(pin, newValue);\r\n}\r\n```\r\n\r\n### BLYNK_CONNECTED()\r\n\r\nИспользуйте эту функцию, когда вам нужно запустить определенную процедуру, когда оборудование подключается к Blynk Cloud или локльному серверу. Чаще всего вызывают эту функцию для синхронизации значений Сервер-Приложение-Оборудование.\r\n\r\n```cpp\r\nBLYNK_CONNECTED() {\r\n// Здесь Ваш код\r\n}\r\n```\r\n\r\n### BLYNK_APP_CONNECTED()\r\n\r\nЭта функция вызывается каждый раз, когда клиент приложения Blynk подключается к серверу Blynk.\r\n\r\n```cpp\r\nBLYNK_APP_CONNECTED() {\r\n// Здесь Ваш код\r\n}\r\n```\r\n**Примечание:** Сначала включите эту функцию в настройках проекта:\r\n\r\n<img src=\"../images/app_connected_setting.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n[Пример](https://github.com/blynkkk/blynk-library/blob/master/examples/More/AppConnectedEvents/AppConnectedEvents.ino)\r\n\r\n### BLYNK_APP_DISCONNECTED()\r\n\r\nЭта функция вызывается каждый раз, когда приложение Blynk отключается от Blynk Cloud или локального сервера.\r\n\r\n```cpp\r\nBLYNK_APP_DISCONNECTED() {\r\n// Здесь Ваш код\r\n}\r\n```\r\n\r\n**Примечание.** Сначала включите эту функцию в настройках проекта:\r\n\r\n<img src=\"../images/app_connected_setting.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n[Пример](https://github.com/blynkkk/blynk-library/blob/master/examples/More/AppConnectedEvents/AppConnectedEvents.ino)\r\n\r\n### Blynk.syncAll()\r\n\r\nЗапрашивает все сохраненные на сервере последние значения для всех виджетов. Все аналоговые/цифровые/виртуальные значения и состояния выводов будут установлены на последнее сохраненное значение. Каждый виртуальный вывод генерирует событие BLYNK_WRITE ().\r\n\r\n```cpp\r\nBLYNK_CONNECTED() {\r\n    Blynk.syncAll();\r\n}\r\n```\r\n\r\n**Примечание:** Рекомендиуется использовать только на стадии написания кода (иногда возникают ошибки). Для надежности следует применять выборочную синхронзацию ``syncVirtual``.\r\n\r\n### Blynk.syncVirtual(vPin)\r\n\r\nЭта команда обновляет отдельный виртуальный пин до последнего сохраненного значения на сервере. Когда он используется, вызывается соответствующий обработчик ```BLYNK_WRITE```.\r\n\r\n```cpp\r\nBlynk.syncVirtual(V0);\r\n```\r\n\r\nЧтобы обновить несколько контактов, используйте код:\r\n\r\n```\r\nBlynk.syncVirtual(V0, V1, V6, V9, V16);\r\n```\r\n\r\n### Blynk.setProperty(vPin, \"property\", value)\r\n\r\nЭта команда позволяет [изменить свойства виджета](#blynk-main-operations-change-widget-properties)\r\n\r\n## Отладка\r\n\r\n### #define BLYNK_PRINT\r\n### #define BLYNK_DEBUG\r\n\r\nЧтобы включить отладочную информацию на последовательном порту по умолчанию, добавьте в начало скетча.\r\n**ВАЖНО: это должна быть первая строка в вашем коде**:\r\n\r\n```cpp\r\n#define BLYNK_PRINT Serial // Определяет объект/порт, который используется для вывода\r\n#define BLYNK_DEBUG        // Опционально, включает детализированный вывод\r\n```\r\n\r\nОбязательно включите последовательный вывод в ``setup()``:\r\n\r\n```cpp\r\nSerial.begin(9600);\r\n```\r\nОткройте Serial Monitor, и вы увидите отладочные данные.\r\n\r\nВы также можете использовать запасные аппаратные последовательные порты или SoftwareSerial для вывода отладочной информации (вам понадобится адаптер для подключения к ПК).\r\n\r\n<span style=\"color:#D3435C;\">**ПРЕДУПРЕЖДЕНИЕ:** Включение ```BLYNK_DEBUG```' замедлит вашу аппаратную производительность в 10 раз!</span>\r\n\r\n### BLYNK_LOG()\r\n\r\nКогда параметр ```BLYNK_PRINT``` определен, вы можете использовать ```BLYNK_LOG``` для записи ваших LOG журналов. Используется похоже на ```printf```:\r\n\r\n```cpp\r\nBLYNK_LOG(\"This is my value: %d\", 10);\r\n```\r\n\r\nOn some platforms (like Arduino 101) the ```BLYNK_LOG``` may be unavailable, or may just use too much resources.  \r\nIn this case you can use a set of simpler log functions:\r\n\r\nНа некоторых платформах (например, Arduino 101) ```BLYNK_LOG``` может быть недоступен или просто использовать слишком много ресурсов. В этом случае вы можете использовать набор более простых функций журнала:\r\n\r\n```cpp\r\nBLYNK_LOG1(\"Hello World\"); // Print a string\r\nBLYNK_LOG1(10);      // Print a number\r\nBLYNK_LOG2(\"This is my value: \", 10); // Print 2 values\r\nBLYNK_LOG4(\"Temperature: \", 24, \" Humidity: \", 55); // Print 4 values\r\n...\r\n```\r\n\r\n## Минимизация объема кода\r\n\r\nЧтобы свести к минимуму объем программы Flash/RAM памяти, вы можете отключить некоторые встроенные функции:\r\n\r\n1. Comment-out ```#define BLYNK_PRINT``` to remove prints\r\n2. Put on the top of your sketch:\r\n\r\n1. Закомментируйте ```#define BLYNK_PRINT``` для отмены печати порт\r\n2. Поместите верхнюю часть вашего скетча:\r\n\r\n```\r\n#define BLYNK_NO_BUILTIN   // Отключить встроенные аналоговые и цифровые контакты\r\n#define BLYNK_NO_FLOAT     // Отключить операции с плавающей точкой\r\n```\r\n\r\n## Портирование, взлом\r\n\r\nЕсли вы хотите погрузиться в создание/взлом/портирование реализации библиотеки Blynk, пожалуйста, также ознакомтесь [с этой документацией](https://github.com/blynkkk/blynk-library/tree/master/extras/docs).\r\n"
  },
  {
    "path": "ru/BlynkMainOperations.md",
    "content": "# Blynk основные операции\r\n\r\n## Виртуальные Пины (Pins)\r\nBlynk может напрямую управлять цифровыми и аналоговыми выводами ввода/вывода на вашем оборудовании. Вам даже не нужно писать для этого код. Отлично подходит для мигающих светодиодов, но частенько этого не достаточно...\r\n\r\nМы разработали Виртуальные Пины для отправки **любых** данных с вашего микроконтроллера в приложение Blynk и обратно.\r\n\r\nВсе, что вы подключите к своему оборудованию, сможет общаться с Blynk. С помощью Виртуальных Пинов вы можете отправить что-то из приложения, обработать его на микроконтроллере, а затем отправить обратно на смартфон. Вы можете запускать функции, считывать устройства I2C, преобразовывать значения, управлять сервоприводами и двигателями постоянного тока и т. д.\r\n\r\nВиртуальные Пины могут быть использованы для взаимодействия с внешними библиотеками (Servo, LCD и другие), а также реализовать пользовательские функции.\r\n\r\nОборудование может передавать данные в виджеты через Виртуальные Пины, как здесь:\r\n\r\n```cpp\r\nBlynk.virtualWrite(pin, \"abc\");\r\nBlynk.virtualWrite(pin, 123);\r\nBlynk.virtualWrite(pin, 12.34);\r\nBlynk.virtualWrite(pin, \"Привет\", 123, 12.34);\r\n```\r\n\r\nДля получения дополнительной информации о виртуальных пинах, [прочитайте здесь](/#blynk-firmware-virtual-pins-control)\r\n\r\n## Отправить данные из приложения на оборудование\r\nВы можете отправлять любые данные из виджетов в приложении на ваше оборудование.\r\n\r\nВсе [Виджеты Контроллеры](/#widgets-controllers) могут отправлять данные в Виртуальные Пины на вашем оборудовании.\r\nНапример, приведенный ниже код показывает, как получить значения из виджета Кнопки (Button) в приложении.\r\n\r\n```cpp\r\nBLYNK_WRITE(V1) //Виджет кнопки пишет данные в пин V1\r\n{\r\n  int pinData = param.asInt(); \r\n}\r\n```\r\nКогда вы нажимаете кнопку, приложение Blynk отправляет ```1``` На втором клике - отправляет ```0```\r\n\r\nВот как настроен виджет кнопки (Button):\r\n\r\n<img src=\"../images/button_virtual_1.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n\r\nПолный пример кода: [Получение данных](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/GetData/GetData.ino#L24)\r\n\r\n### Отправка массива из виджета\r\nНекоторые виджеты (например, джойстик, zeRGBa) имеют более одной единицы данных.\r\n\r\n<img src=\"../images/joystick_merge_mode.png\" style=\"width: 200px; height:360px\"/>\r\n\r\nЭтот вывод может быть записан в Virtual Pin в виде массива значений.\r\nС аппаратной стороны - вы можете получить любой элемент массива [0,1,2 ...], используя код:\r\n\r\n```cpp\r\nBLYNK_WRITE(V1) // Виджет ЗАПИСЫВАЕТ в Виртуальный Пин V1\r\n{   \r\n  int x = param[0].asInt(); // получить первое значение\r\n  int y = param[1].asInt(); // получить второе значение\r\n  int z = param[N].asInt(); // получить N-ое значение\r\n}\r\n```\r\n\r\n **Пример кода:** [Джойстик две оси](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/JoystickTwoAxis/JoystickTwoAxis.ino#L24)\r\n\r\n## Получить данные с аппаратного обеспечения\r\nСуществует два способа передачи данных с вашего оборудования на виджеты в приложении через виртуальные контакты.\r\n\r\n### Perform requests by Widget\r\n- Using Blynk built-in reading frequency while App is active by setting 'Reading Frequency' parameter to some interval:\r\n\r\n<img src=\"../images/frequency_reading_pull.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n```cpp\r\nBLYNK_READ(V5) // Widget in the app READs Virtal Pin V5 with the certain frequency\r\n{\r\n  // This command writes Arduino's uptime in seconds to Virtual Pin V5\r\n  Blynk.virtualWrite(5, millis() / 1000);\r\n}\r\n```\r\n\r\n**Sketch:** [PushDataOnRequest](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushDataOnRequest/PushDataOnRequest.ino#L26)\r\n\r\n\r\n### Pushing data from hardware\r\nIf you need to PUSH sensor or other data from your hardware to Widget, you can write any logic you want. \r\nJust set the frequency to PUSH mode. Any command that hardware sends to Blynk Cloud is automatically stored on server\r\nand you get this info either with [History Graph](/#widgets-displays-superchart) widget\r\nor with [HTTP API](http://docs.blynkapi.apiary.io/#reference/0/pin-history-data/get-all-history-data-for-specific-pin).\r\n\r\n<img src=\"images/frequency_reading_push.png\" style=\"width: 200px; height:360px\"/>\r\n\r\nWe recommend sending data in intervals and avoiding [Flood Error](https://docs.blynk.cc/#troubleshooting-flood-error).\r\nYou can use timers like [BlynkTimer](/#blynk-firmware-blynktimer).\r\nPlease read instructions inside this [example sketch](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushData/PushData.ino) for more details.\r\n\r\nHere is how it can work:\r\n\r\n```cpp\r\n#include <SPI.h>\r\n#include <Ethernet.h>\r\n#include <BlynkSimpleEthernet.h>\r\n\r\nchar auth[] = \"YourAuthToken\"; // Put your token here\r\n\r\nBlynkTimer timer; // Create a Timer object called \"timer\"! \r\n\r\nvoid setup()\r\n{\r\n  Serial.begin(9600);\r\n  Blynk.begin(auth);\r\n  \r\n  timer.setInterval(1000L, sendUptime); //  Here you set interval (1sec) and which function to call \r\n}\r\n\r\nvoid sendUptime()\r\n{\r\n  // This function sends Arduino up time every 1 second to Virtual Pin (V5)\r\n  // In the app, Widget's reading frequency should be set to PUSH\r\n  // You can send anything with any interval using this construction\r\n  // Don't send more that 10 values per second\r\n  \r\n  Blynk.virtualWrite(V5, millis() / 1000);\r\n}\r\n\r\nvoid loop()\r\n{\r\n  Blynk.run(); // all the Blynk magic happens here\r\n  timer.run(); // BlynkTimer is working...\r\n}\r\n```\r\n\r\n**Sketch:** [PushData](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushData/PushData.ino#L30)\r\n\r\n## State syncing\r\n\r\n### For hardware\r\nIf your hardware looses Internet connection or resets, you can restore all the values from Widgets in the Blynk app.\r\n\r\n```cpp\r\nBLYNK_CONNECTED() {\r\n    Blynk.syncAll();\r\n}\r\n\r\n//here handlers for sync command\r\nBLYNK_WRITE(V0) {\r\n   ....\r\n}\r\n\r\n```\r\n\r\nThe ```Blynk.syncAll()``` command restores all the Widget's values based on the last saved values on the server. \r\nAll analog and digital pin states will be restored. Every Virtual Pin will perform ```BLYNK_WRITE``` event.\r\n\r\n**WARNING**: if pin is empty and wasn't initialized - hardware will not get any response for those pin during sync.\r\n\r\n[Sync Hardware with App state](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/HardwareSyncStateFromApp/HardwareSyncStateFromApp.ino)\r\n\r\nYou can also update a single Virtual Pin value by calling ```Blynk.syncVirtual(V0)``` or you can update several pins with ```Blynk.syncVirtual(V0, V1, V2, ...)```.\r\n\r\nYou can also use server to store any value without widget. Just call ```Blynk.virtualWrite(V0, value)```.\r\n\r\n[Storing single value on server](https://github.com/blynkkk/blynk-library/blob/master/examples/More/ServerAsDataStorage/ServerAsDataStorage_SingleValue/ServerAsDataStorage_SingleValue.ino)\r\n\r\n[Storing multiple values on server](https://github.com/blynkkk/blynk-library/blob/master/examples/More/ServerAsDataStorage/ServerAsDataStorage_MultiValue/ServerAsDataStorage_MultiValue.ino)\r\n\r\n### For app\r\nIf you need to keep your hardware in sync with Widgets' state even if app is offline use ```Blynk.virtualWrite```.\r\n\r\nImagine you have a LED Widget connected to the Virtual Pin V1 in the app, and a physical button attached to your hardware. \r\nWhen you press a physical button, you would expect to see updated state of the LED Widget in the app. \r\nTo achieve that you need to send ```Blynk.virtualWrite(V1, 255)``` when a physical button gets pressed.\r\n\r\n[Represent physical button state via LED widget with interrupts](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonInterrupt/ButtonInterrupt.ino)\r\n\r\n[Represent physical button state via LED widget with polling](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonPoll/ButtonPoll.ino)\r\n\r\n[Represent physical button state via Button widget with polling](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/SyncPhysicalButton/SyncPhysicalButton.ino)\r\n\r\n## Control of multiple devices\r\nBlynk app has support of multiple devices. That means you can assign any widget to specific device with own auth token. \r\nFor example - you may have button on V1 that controls wi-fi bulb A and another button on V1 that controls wi-fi bulb B. In order \r\nto do this you need more than 1 device within your project. To achieve this please go to project settings and click on \"Devices\" section : \r\n\r\n<img src=\"images/new_project_settings.png\" style=\"width: 200px; height:360px\"/>\r\n\r\nYou'll see list of devices :\r\n \r\n<img src=\"images/list_of_devices.png\" style=\"width: 200px; height:360px\"/>\r\n\r\nSo you can add new device : \r\n\r\n<img src=\"images/new_device.png\" style=\"width: 200px; height:360px\"/>\r\n\r\nAfter above steps, every widget will have one more field \"Target\" : \r\n\r\n<img src=\"images/widget_settings_devices.png\" style=\"width: 200px; height:360px\"/>\r\n\r\nNow you need to assign widget to device and after that widget will control only this specific device.\r\n\r\nThat's it! Now you need to upload sketches with correct Auth Tokens to your hardware.\r\n\r\n### Tags\r\n\r\nTags feature allows you to group multiple devices. Tags are very useful in case you want to control few devices with \r\n1 widget. For example, imagine a case when you have 3 smart bulbs and you want to turn on all those bulbs with one \r\nsingle click. You need to assign 3 devices to 1 tag and assign tag to button. That's it.\r\n\r\nTag widgets also support state syncing. So you can get state of widget from your hardware. However you can't update \r\nstate of such widgets from hardware.\r\n\r\n## Devices online status\r\nBlynk app has support for online statuses for multiple devices.\r\n \r\n<img src=\"images/online_status.png\" style=\"width: 200px; height:360px\"/>\r\n\r\nIn ideal world when device closes tcp connection with some ```connection.close()``` - connected server will get notification \r\nregarding closed connection. So you can get instant status update on UI. However in real world this mostly exceptional situation. \r\nIn majority of cases there is no easy and instant way to find out that connection is not active anymore. \r\n\r\nThat's why Blynk uses ```HEARTBEAT``` mechanism. With this approach hardware periodically sends ```ping``` command with predefined \r\ninterval (10 seconds by default, ```BLYNK_HEARTBEAT``` [property](https://github.com/blynkkk/blynk-library/blob/master/src/Blynk/BlynkConfig.h)). \r\nIn case hardware don't send anything within 10 seconds server waits additional 5 seconds and after that connection \r\nassumed to be broken and closed by server. So on UI you'll see connection status update only after 15 seconds when it is \r\nactually happened.\r\n\r\nYou can also change ```HEARTBEAT``` interval from hardware side via ```Blynk.config```. In that case ```newHeartbeatInterval * 2.3``` formula will be applied. So in case you you decided to set ```HEARTBEAT``` interval to \r\n5 seconds. You'll get notification regarding connection with 11 sec delay in worst case.\r\n\r\n## Project Settings\r\n\r\nEvery project has it's own settings:\r\n\r\n- **Theme** - switch between the Light and Black Blynk Theme (Business accounts have wider choice);\r\n- **Keep screen always on** - allows you to use the Blynk app without going to the sleep mode (usually all mobile devices do that);\r\n- **Send app connected command** - with this option enabled the server will send \"App Connected\" and \"App Disconnected\" commands \r\nto your hardware when your Blynk app goes online/offline. [Usage example](https://github.com/blynkkk/blynk-library/blob/master/examples/More/AppConnectedEvents/AppConnectedEvents.ino);\r\n- **Do not show offline notifications** - right now, for debugging purposes, every time your hardware goes offline - the Blynk \r\nServer will notify you with popup in the app about that. However, when debugging is not needed or the Blynk app is used only \r\nvia HTTP/S this notifications are meaningless. So this switch allows you to turn off this popups. Also this switch turns off \r\nthe Push notification \"Notify when offline\" option.\r\n\r\n\r\n## Change Widget properties\r\nChanging some of the widget properties from hardware side is also supported.  \r\nFor example, you can change the color of LED widget based on a condition:\r\n\r\n```\r\n//change LED color\r\nBlynk.setProperty(V0, \"color\", \"#D3435C\");\r\n\r\n//change LED label\r\nBlynk.setProperty(V0, \"label\", \"My New Widget Label\");\r\n\r\n//change MENU labels\r\nBlynk.setProperty(V0, \"labels\", \"Menu Item 1\", \"Menu Item 2\", \"Menu Item 3\");\r\n\r\n```\r\n\r\n[Set Property for single value field](https://github.com/blynkkk/blynk-library/blob/master/examples/More/SetProperty/SetProperty_SingleValue/SetProperty_SingleValue.ino)\r\n\r\n[Set Property for multi value field](https://github.com/blynkkk/blynk-library/blob/master/examples/More/SetProperty/SetProperty_MultiValue/SetProperty_MultiValue.ino)\r\n\r\n**NOTE : ** Changing these parameters work **only** for widgets attached to Virtual pins (analog/digital pins won't work).\r\n\r\nFour widget properties are supported - ```color```, ```label```, ```min```, ```max``` for all widgets : \r\n\r\n```label``` is string for label of all widgets.\r\n\r\n```color``` is string in [HEX](http://www.w3schools.com/html/html_colors.asp) format (in the form: #RRGGBB, \r\nwhere RR (red), GG (green) and BB (blue) are hexadecimal values between 00 and FF). For example :\r\n``` \r\n#define BLYNK_GREEN     \"#23C48E\"\r\n#define BLYNK_BLUE      \"#04C0F8\"\r\n#define BLYNK_YELLOW    \"#ED9D00\"\r\n#define BLYNK_RED       \"#D3435C\"\r\n#define BLYNK_DARK_BLUE \"#5F7CD8\"\r\n``` \r\n\r\n```min```, ```max``` - minimum and maximum values for the widget (for example range for the Slider).\r\nThis numbers may be float.\r\n\r\nOn firmware side, widget objects also support ```setLabel()``` and ```setColor()``` functions.\r\n\r\nWidget specific properties: \r\n\r\n**Button**\r\n\r\n```onLabel``` / ```offLabel``` is string for ON/OFF label of button;\r\n\r\n**Styled Button**\r\n\r\n```onLabel``` / ```offLabel``` is string for ON/OFF label of button;\r\n\r\n```onColor``` / ```offColor``` is string in HEX format for ON/OFF colors of the button;\r\n\r\n```onBackColor``` / ```offBackColor``` is string in HEX format for ON/OFF colors of the button background.\r\n\r\n**Music Player**\r\n\r\n```isOnPlay``` is boolean accepts true/false.\r\n``` \r\nBlynk.setProperty(V0, \"isOnPlay\", \"true\");\r\n``` \r\n\r\n**Menu**\r\n\r\n```labels``` is list of strings for Menu widget selections;\r\n``` \r\nBlynk.setProperty(V0, \"labels\", \"label 1\", \"label 2\", \"label 3\");\r\n``` \r\n\r\n**Video Streaming**\r\n\r\n```cpp\r\nBlynk.setProperty(V1, \"url\", \"http://my_new_video_url\");\r\n```\r\n\r\n**Step**\r\n\r\n```cpp\r\nBlynk.setProperty(V1, \"step\", 10);\r\n```\r\n\r\n**Image**\r\n\r\n```cpp\r\nBlynk.setProperty(V1, \"opacity\", 50); // 0-100%\r\n```\r\n\r\n```cpp\r\nBlynk.setProperty(V1, \"scale\", 30); // 0-100%\r\n```\r\n\r\n```cpp\r\nBlynk.setProperty(V1, \"rotation\", 10); //0-360 degrees\r\n```\r\n\r\nalso, you can fully replace the list of images from the hardware:\r\n\r\n```cpp\r\nBlynk.setProperty(V1, \"urls\", \"https://image1.jpg\", \"https://image2.jpg\");\r\n```\r\n\r\nor you can change individual image by it index:\r\n\r\n```cpp\r\nBlynk.setProperty(V1, \"url\", 1, \"https://image1.jpg\");\r\n```\r\n\r\nYou can also change widget properties via [HTTP API](http://docs.blynkapi.apiary.io/#).\r\n\r\n## Limitations and Recommendations\r\n- Don't put ```Blynk.virtualWrite``` and any other ```Blynk.*``` command inside ```void loop()```- it will cause \r\nlot's of outgoing messages to our server and your connection will be terminated; \r\n\r\n- We recommend calling functions with intervals. For example, use [BlynkTimer](/#blynk-firmware-blynktimer)\r\n\r\n- Avoid using long delays with ```delay()``` – it may cause connection breaks;\r\n\r\n- If you send more than 100 values per second - you may cause \r\n[Flood Error](/#troubleshooting-flood-error) and your hardware will be automatically disconnected from the server;\r\n\r\n- Be careful sending a lot of ```Blynk.virtualWrite``` commands as most hardware is not very powerful (like ESP8266) \r\nso it may not handle many requests. \r\n"
  },
  {
    "path": "ru/BlynkProtocol.md",
    "content": "# Blynk protocol\r\n\r\nBlynk transfers binary messages with the following structure:\r\n\r\n| Command       | Message Id    | Length/Status   | Body     |\r\n|:-------------:|:-------------:|:---------------:|:--------:|\r\n| 1 byte        | 2 bytes       | 2 bytes         | Variable |\r\n\r\nMessage Id and Length are [big endian](http://en.wikipedia.org/wiki/Endianness#Big-endian).\r\nBody has a command-specific format.\r\n\r\nCommand and Status definitions: [BlynkProtocolDefs.h](https://github.com/blynkkk/blynk-library/blob/master/Blynk/BlynkProtocolDefs.h)\r\n\r\nAnother protocol description can be found [here](https://github.com/blynkkk/blynk-server/blob/master/README_FOR_APP_DEVS.md#protocol-messages).\r\n\r\nTypical Blynk library knows how to send(S)/process(P):\r\n\r\n    S   BLYNK_CMD_LOGIN + auth token\r\n    SP  BLYNK_CMD_PING\r\n    SP  BLYNK_CMD_RESPONSE\r\n    SP  BLYNK_CMD_BRIDGE\r\n    SP  BLYNK_CMD_HARDWARE\r\n    S   BLYNK_CMD_TWEET\r\n    S   BLYNK_CMD_EMAIL\r\n    S   BLYNK_CMD_PUSH_NOTIFICATION\r\n\r\n## HARDWARE/BRIDGE command body\r\n\r\nThe body of these commands are encoded as a sequence of strings, separated by ```'\\0'``` ([Null character](http://en.wikipedia.org/wiki/Null_character)).\r\nPlease note that the last value may be not Null-terminated.\r\nIn the following command examples ```\\0``` chars are replaced with spaces.\r\n\r\n### Pin mode\r\n\r\nPinMode command is received by library after connection, or when a mobile application starts.\r\n\r\n    pm <pin> <mode>\r\n    pm <pin> <mode> <pin> <mode> <pin> <mode> ...\r\n\r\nMode:\r\n\r\n* in - INPUT\r\n* out - OUTPUT\r\n* pu - INPUT_PULLUP\r\n* pd - INPUT_PULLDOWN\r\n\r\n### Digital pin operations\r\n\r\nDigital write:\r\n\r\n    dw <pin> <val>\r\n\r\nDigital read:\r\n\r\n    dr <pin>\r\n\r\n### Analog pin operations\r\n\r\n    aw <pin> <val>\r\n\r\n    ar <pin>\r\n\r\n### Virtual pin operations\r\n\r\n    vw <pin> <param0> <param1> <param2> <param3> ...\r\n\r\n    vr <pin>\r\n\r\n### Other operations\r\n\r\n    info\r\n\r\nTODO\r\n\r\n## Developer notes\r\n\r\n* Values in HW commands are plain text.\r\n* In response to ```dr/ar``` command, library should send ```dw/aw``` command on the same pin and with the same message id.\r\n* These situations should cause a connection drop, or reconnection attempt:\r\n * Message with ```ID=0``` is received\r\n * Message with unknown type is received\r\n \r\n## Adding network interface \r\n4 entities should be created to add a new network interface to Blynk:\r\n \r\n1. Select connection interface that will be used for Blynk operation.  \r\n   This should be something like http://www.arduino.cc/en/Tutorial/WebClient  \r\n   Based on the API of the connection, create the **Transport**.  \r\n   Some examples may be found in the Adapters folder:\r\n   * BlynkTransportSerial\r\n   * BlynkTransportCC3000\r\n   * BlynkArduinoClient - *can be reused, if possible*\r\n   \r\n2. Create **Blynk representative class**, which contains connection-specific helper functions (like begin).\r\n   Examples:\r\n   * BlynkEthernet\r\n   * BlynkSerial\r\n   * BlynkCC3000\r\n   * BlynkWildFire\r\n   * BlynkYun\r\n   \r\n3. Create **BlynkSimple*** header for your connection.  \r\n   This constructs main **Blynk instance**, so the user (mostly) doesn't need to get into such details.  \r\n   Examples:\r\n   * BlynkSimpleEthernet.h\r\n   * BlynkSimpleCC3000.h\r\n   * BlynkSimpleWifi.h\r\n   * BlynkSimpleUIPEthernet.h\r\n   \r\n4. Create a **simple example** for your platform ;)\r\n\r\n### Example implementations\r\nUse these to play with the protocol and understand the basics:\r\n\r\n* [Pseudo-library in Python](https://github.com/blynkkk/blynk-library/blob/master/tests/pseudo-library.py)\r\n* [Node.js + Espruino](https://github.com/vshymanskyy/blynk-library-js)\r\n* [Arduino](https://github.com/blynkkk/blynk-library)\r\n* [Particle Core](https://github.com/vshymanskyy/blynk-library-spark)\r\n"
  },
  {
    "path": "ru/BlynkServer.md",
    "content": "# Сервер Blynk\r\n\r\nСервер Blynk - это Java-сервер с открытым исходным кодом, отвечающий за пересылку сообщений между мобильным приложением Blynk и различными платами микроконтроллеров (например, Arduino, Raspberry Pi и т. д.).\r\n\r\nЗагрузите последнюю сборку сервера:\r\n\r\n[Сервер Blynk >](https://github.com/blynkkk/blynk-server/releases)\r\n\r\n## Зачем мне нужен локальный сервер Blynk?\r\n\r\n- Лучшая безопасность. Вы единственный, кто знает о сервере. Вы можете настроить политики безопасности в соответствии с вашими потребностями (MAC, IP-адреса, имена входа и т. Д.). Вы также можете сделать его доступным только в вашей частной сети.\r\n- Лучшая стабильность. Не нужно полагаться на стороннее облачное решение. У вас есть полный контроль.\r\n- Меньшая задержка обработки команд. Сервер как можно ближе к вам.\r\n- Максимальная конфиденциальность. Все данные хранятся локально и не передаются никому.\r\n\r\n## Установка вашего собственного локального сервера Blynk\r\n\r\nДля получения подробных инструкций, пожалуйста прочитайте [страницу GitHub](https://github.com/blynkkk/blynk-server#blynk-server).\r\n"
  },
  {
    "path": "ru/FAQ.md",
    "content": "# Часто задаваемые вопросы (FAQ)\r\n\r\n- Я поддержал Blynk на Kickstarter. Где мои виджеты и почему приложение бесплатное?\r\n> Приложение бесплатно, потому что в противном случае вам придется заплатить, чтобы загрузить его. Так работает AppStore и Google Play.\r\n> Текущая версия Blynk имеет ограниченное количество виджетов. Мы решили сделать их бесплатными для всех, пока не создадим магазин. После этого каждый виджет будет платным. Однако каждый спонсор получит их бесплатно (согласно нашему обещанию).\r\n\r\n- Что такое Blynk Cloud?\r\n> Blynk Cloud - это программное обеспечение с открытым исходным кодом, написанное на Java с использованием простых и защищенных сокетов TCP/IP (для оборудования, которое его поддерживает) и работающее на нашем сервере.\r\n> Приложения Blynk для iOS и Android по умолчанию подключаются к Blynk Cloud. Доступ бесплатен для каждого пользователя Blynk. Мы также предоставляем дистрибутив Private Server для тех, кто хочет [установить его локально](/#blynk-server).\r\n\r\n- Сколько стоит доступ к Cloud Blynk Server?\r\n> Доступ бесплатен для каждого пользователя Blynk.\r\n\r\n- Могу ли я запустить сервер Blynk локально?\r\n> Да. Те из вас, кому нужна дополнительная безопасность или нет подключения к Интернету, могут установить локальный сервер Blynk и запустить его в своей локальной сети. Blynk Server имеет открытый исходный код, и его развертывание занимает менее нескольких секунд. Все инструкции и файлы находятся [здесь](/#blynk-server).\r\n\r\n- What are the requirements to run Private Blynk Server?\r\n> To run Private Blynk Server, all you need is Java Runtime Environment.\r\n\r\n- Каковы требования для запуска локального Blynk Сервера?\r\n> Для запуска локального Blynk Сервера все, что вам нужно, это Java Runtime Environment.\r\n\r\n- Могу ли я запустить сервер Blynk на Raspberry Pi?\r\n> Да, конечно! [инструкция](/#blynk-server-how-to-run-local-blynk-server-launch-blynk-server-on-raspberry-pi).\r\n\r\n- Приложение Blynk работает через Bluetooth?\r\n> Да. Это в работает даже в бета-версии.\r\n\r\n- Blynk поддерживает Ethernet / Wi-FI / UART?\r\n> Да, все из них. См. Полный список [поддерживаемого оборудования](/#support-hardware) и плат расширений.\r\n\r\n- У меня нет платы расширения. Могу ли я использовать Blynk с моим компьютером?\r\n> Да, вы можете использовать Blynk только с помощью USB-кабеля. Существует [пошаговая инструкция](/#other-hardware-connect-over-usb) о том, как это сделать.\r\n\r\n- Может ли Blynk справиться с несколькими Arduinos?\r\n> Да. Есть 3 способа:\r\n> - добавить несколько устройств в ваш проект.\r\n> - вы можете использовать один и тот же [Auth Token](/#Getting-Start-Getting-Start-With-Application-Auth-Token) для разного оборудования. В этом случае вы можете управлять несколькими аппаратными средствами с одной панели.\r\n> - вы можете сделать это, используя [функцию моста](/#widgets-other-bridge), которая позволяет отправлять сообщения с одного оборудования на другое.\r\n\r\n- Сохраняет ли сервер Blynk данные датчиков, когда приложение отключается?\r\n> Да, каждая команда, отправляемая оборудованием на сервер, сохраняется. Вы можете использовать виджет [Диаграмма](/#widgets-display-superchart) для его просмотра.\r\n\r\n- Сколько виртуальных пинов я могу использовать?\r\n> Это зависит в основном от вашего оборудования. Младшее оборудование может использовать до 32 виртуальных пинов. \r\n> Более мощный (например, ESP8266) может использовать до 128, но для этого требуется указать свойство BLYNK_USE_128_VPINS в вашем скетче. [Пример](https://github.com/blynkkk/blynk-library/blob/master/src/Blynk/BlynkConfig.h#L64).\r\n\r\n- Почему приложение требует все эти разрешения?\r\n> http://help.blynk.cc/faq/blynk-android-permissions-explained\r\n"
  },
  {
    "path": "ru/GettingStarted.md",
    "content": "# Начало работы \r\nДавайте начнем уже через 5 минут (чтение не считается!).\r\nМы включим светодиод, подключенный к вашему Arduino, с помощью приложения Blynk на вашем смартфоне.\r\n\r\nПодключите светодиод, как показано на рисунке:\r\n\r\n<img src=\"../images/Arduino_LED.jpg\" style=\"width: 250px; height:350px\"/>\r\n\r\n## Начало работы с приложением Blynk\r\n### 1. Создать учетную запись Blynk\r\nПосле загрузки приложения Blynk вам необходимо создать новую учетную запись Blynk. Если она у вас уже есть, помните: эта учетная запись отделена от учетных записей, используемых для форума Blynk.\r\n\r\nМы рекомендуем использовать **реальный** адрес электронной почты, потому что это упростит ситуацию с настройкой.\r\n\r\n<img src=\"../images/register_account.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n#### Зачем я должен создавать аккаунт?\r\n\r\nУчетная запись необходима для хранения ваших проектов и доступа к ним с нескольких устройств из любого места. Также это мера безопасности.\r\n\r\nВы всегда можете настроить свой собственный [локальный Blynk сервер](/#blynk-server) и иметь полный контроль.\r\n\r\n### 2. Создать новый проект\r\n После того, как вы успешно вошли в свой аккаунт, начните с создания нового проекта.\r\n\r\n<img src=\"../images/getting_started/create_project_button.png\" style=\"width: 200px; height:360px\"/>\r\n \r\n### 3. Выберите ваше оборудование\r\nВыберите модель оборудования, которую вы будете использовать. Проверьте [список поддерживаемого оборудования](/#support-hardware)!\r\n\r\n<img src=\"../images/getting_started/select_hardware.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n### 4. Ключ авторизации (Auth Token)\r\n\r\n**Ключ авторизации** - это уникальный идентификатор, необходимый для подключения вашего оборудования к вашему смартфону.\r\nКаждый новый проект, который вы создаете, будет иметь свой собственный Ключ авторизации. Вы получите Ключ авторизации автоматически на вашу электронную почту после создания проекта. Вы также можете скопировать его вручную. Нажмите на раздел устройств и выберите необходимое устройство:\r\n\r\n<img src=\"../images/getting_started/token_1.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n И вы увидите ключ:\r\n\r\n<img src=\"../images/getting_started/new_device.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n<span style=\"color:#D3435C;\">**ПРИМЕЧАНИЕ:** Не передавайте свой Ключ авторизации кому-либо, если только вы не хотите, чтобы кто-то имел доступ к вашему оборудованию.</span>\r\n\r\nОтправлять ключ по электронной почте очень удобно. Нажмите кнопку `e-mail`, и токен будет отправлен на адрес электронной почты, который вы использовали для регистрации.\r\nВы также можете нажать на строку Ключа, и она будет скопирована в буфер обмена.\r\n\r\nТеперь нажмите кнопку **\"Создать\"**.\r\n\r\n<img src=\"../images/new_project.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n### 5. Добавить виджет\r\n\r\nВаш рабочий стол проекта пуст, давайте добавим кнопку для управления нашим светодиодом.\r\n\r\nНажмите в любом месте на рабочем столе, чтобы открыть окно виджета. Все доступные виджеты расположены здесь. Теперь выберите виджет кнопку (Button).\r\n\r\n**Окно виджетов (Widget Box)**\r\n\r\n<img src=\"../images/widgets_box.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n**Схвати-И-Брось (Drag-n-Drop)** - Нажмите и удерживайте виджет, чтобы перетащить его на новое место.\r\n\r\n**Настройки виджета (Widget Settings)** - Каждый виджет имеет свои настройки. Нажмите на виджет, чтобы добраться до них.\r\n\r\n<img src=\"../images/button_settings.png\" style=\"width: 200px; height:360px\"/>\r\n\r\nНаиболее важным параметром для установки является **PIN** (контакт). Список контактов отражает физические контакты, определенные вашим оборудованием. Если ваш светодиод подключен к цифровому выводу 8 - выберите **D8** (**D** - означает digital - цифровой).\r\n\r\n<img src=\"../images/pin_selection.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n### 6. Запустить проект\r\n\r\nКогда вы закончите с настройками - нажмите кнопку **PLAY**. Это переключит вас из режима EDIT в режим PLAY, где вы можете взаимодействовать с оборудованием. В режиме воспроизведения вы не сможете перетаскивать или настраивать новые виджеты, нажав **STOP** вы вернетесь в режим редактирования.\r\n\r\nВы получите сообщение \"Arduino UNO is offline\" (Arduino UNO не в сет). Мы рассмотрим это в следующем разделе.\r\n\r\n<img src=\"../images/play_button.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n## Начало работы с оборудованием\r\n### Как использовать пример кода\r\nУ вас должна быть установлена библиотека Blynk на вашем компьютере. Если нет - [нажмите здесь](/#downloads-blynk-library).\r\n\r\nПримеры скетчей (кода) помогут вам быстро подключить ваше оборудование и основные функции Blynk.\r\n\r\nОткройте пример эскиза в соответствии с используемой моделью оборудования или платой.\r\n\r\n<img src=\"../images/connection_type_sketch.png\" style=\"width: 500px; height:217px\"/>\r\n\r\nДавайте рассмотрим пример кода для [Arduino UNO + Ethernet-плата](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\r\n\r\n```cpp\r\n#define BLYNK_PRINT Serial\r\n#include <SPI.h>\r\n#include <Ethernet.h>\r\n#include <BlynkSimpleEthernet.h>\r\n\r\nchar auth[] = \"YourAuthToken\";\r\n\r\nvoid setup()\r\n{\r\n  Serial.begin(9600); // Наблюдайет за состоянием подключения в терминале.\r\n  Blynk.begin(auth);  // Здесь ваше Arduino подключается к облаку Blynk.\r\n}\r\n\r\nvoid loop()\r\n{\r\n  Blynk.run(); // Все чудеса Blynk происходят здесь...\r\n}\r\n```\r\n\r\n### Ключ авторизации (Auth Token)\r\nВ этом примере скейтча найдите такую строку:\r\n\r\n```cpp\r\nchar auth[] = \"YourAuthToken\";\r\n```\r\nThis is the [Auth Token](/#getting-started-getting-started-with-application-4-auth-token) that you emailed yourself.\r\nPlease check your email and copy it, then paste it inside the quotation marks.\r\n\r\nЭто [Ключ авторизации](/#getting-started-getting-started-with-application-4-auth-token), который вы должны отправить себе по электронной почте из приложения Blynk. Проверьте свою электронную почту, скопируйте его и вставьте в кавычки.\r\n\r\nДолжно выглядеть примерно так:\r\n\r\n``` \r\nchar auth[] = \"f45626c103a94983b469637978b0c78a\";\r\n``` \r\n\r\nЗагрузите скейтч в плату и откройте последовательный терминал. Подождите, пока не увидите что-то вроде этого:\r\n\r\n``` \r\nBlynk v.X.X.X\r\nYour IP is 192.168.0.11\r\nConnecting...\r\nBlynk connected!\r\n```\r\n\r\n<span style=\"color:#24C48C\">**Великолепно! У вас все настроено! Теперь ваше оборудование подключено к Blynk Cloud!**</span>\r\n\r\n## Используем Blynk\r\nВернитесь в приложение Blynk, нажмите кнопку и включите и выключите светодиод! Это должен быть наш Blynk.\r\n\r\n<img src=\"../images/button_pressed.png\" style=\"width: 200px; height:360px\"/>\r\n\r\nИзучайте [другие примеры скетчей](https://github.com/blynkkk/blynk-library/tree/master/examples). \r\n\r\nНе стесняйтесь экспериментировать и комбинировать различные примеры вместе, чтобы создавать свои собственные удивительные проекты.\r\n\r\nНапример, подключите светодиод к выводу, с активным [ШИМ](http://www.arduino.cc/en/Tutorial/Fading) на Arduino и установите виджет - Слайдер (Slider) для управления яркостью светодиода. Используя те же шаги, что описанны выше.\r\n"
  },
  {
    "path": "ru/HardwareSetUps.md",
    "content": "# Аппаратные настройки\r\n## Arduino через USB (без расширительных плат)\r\n\r\nЕсли у вас нет расширительной платы и ваше оборудование не имеет подключения к сети, вы все равно можете использовать Blynk - напрямую через USB:\r\n\r\n1. Откройте [Arduino Serial USB пример](https://github.com/blynkkk/blynk-library/blob/master/examples/Boards_USB_Serial/Arduino_Serial_USB/Arduino_Serial_USB.ino) и замените [Auth Token](/#getting-started-getting-started-with-application-4-auth-token)\r\n\r\n```cpp\r\n// Вы можете использовать запасной аппаратный серийный порт на платах, которые его имеют (например, Mega)\r\n#include <SoftwareSerial.h>\r\nSoftwareSerial DebugSerial(2, 3); // RX, TX\r\n\r\n#define BLYNK_PRINT DebugSerial\r\n#include <BlynkSimpleStream.h>\r\n\r\n// Вы должны получить Auth Token в приложении Blynk.\r\n// Перейдите в настройки проекта (значок гайки).\r\nchar auth[] = \"YourAuthToken\";\r\n\r\nvoid setup()\r\n{\r\n  // Debug console\r\n  DebugSerial.begin(9600);\r\n\r\n  // Blynk will work through Serial\r\n  Serial.begin(9600);\r\n  Blynk.begin(auth, Serial);\r\n}\r\n\r\nvoid loop()\r\n{\r\n  Blynk.run();\r\n}\r\n```\r\n\r\n2. Запустите скрипт, который обычно находится в папке ```/scripts```:\r\n\r\n - Windows:```My Documents\\Arduino\\libraries\\Blynk\\scripts```\r\n - Mac\t```User$/Documents/Arduino/libraries/Blynk/scripts```\r\n  \r\n**На Windows:**\r\n  \r\nОткройте командную строку cmd.exe\r\n  \r\nЗадайте свой путь к папке blynk-ser.bat. Например:\r\n   \r\n```\r\ncd C:\\blynk-library-0.3.1\\blynk-library-0.3.1\\scripts\r\n```\r\n\r\nRun ```blynk-ser.bat``` file. For example : ```blynk-ser.bat -c COM4``` (where COM4 is port with your Arduino)\r\nЗапустите файл ```blynk-ser.bat```. Например: ```blynk-ser.bat -c COM4``` (где COM4 - порт с вашим Arduino)\r\n  \r\nИ нажмите «Ввод», нажмите «Ввод» и нажмите «Ввод»...\r\n\r\n**На Linux и Mac**:\r\n  \r\nПерейдите в папку ```/scripts.``` Например:\r\n  \r\n```\r\ncd User$/Documents/Arduino/libraries/Blynk/scripts\r\n``` \r\n\r\nКогда окажетесь внутри этой папки, запустите:\r\n  \r\n```\r\nuser:scripts User$ ./blynk-ser.sh\r\n```\r\n\r\n**Предупреждение:** Не закрывайте окно терминала с запущенным скриптом.\r\n  \r\nВ некоторых случаях вам также может потребоваться выполнить:\r\n\r\n```\r\nuser:scripts User$ chmod +x blynk-ser.sh\r\n```\r\n\r\nВам также может понадобиться запустить скрипт с функцией ```sudo```\r\n  \r\n```\r\nuser:scripts User$ sudo ./blynk-ser.sh\r\n``` \r\n\r\nВот что вы увидите в приложении Terminal на Mac (адрес usbmodem может быть другим):\r\n  \r\n```\r\n[ Press Ctrl+C to exit ]\r\n/dev/tty.usbmodem not found.\r\nSelect serial port [ /dev/tty.usbmodem1451 ]: \r\n```\r\n\t\r\nСкопируйте адрес последовательного порта: ```/dev/ tty.usbmodem1451``` и вставьте его обратно:\r\n\r\n```\r\nSelect serial port [ /dev/tty.usbmodem1451 ]: /dev/tty.usbmodem1451\r\n```\r\n\t\r\nПосле того, как вы нажмете Enter, вы увидите текст, похожий на этот:\r\n\r\n```\r\nResetting device /dev/tty.usbmodem1451...\r\nConnecting: GOPEN:/dev/tty.usbmodem1451,raw,echo=0,clocal=1,cs8,nonblock=1,ixoff=0,ixon=0,ispeed=9600,ospeed=9600,crtscts=0 <-> openssl-connect:blynk-cloud.com:9443,cafile=/Users/.../server.crt,nodelay\r\n2015/10/03 00:29:45 socat[30438.2046857984] N opening character device \"/dev/tty.usbmodem1451\" for reading and writing\r\n2015/10/03 00:29:45 socat[30438.2046857984] N opening connection to LEN=16 AF=2 45.55.195.102:9443\r\n2015/10/03 00:29:45 socat[30438.2046857984] N successfully connected from local address LEN=16 AF=2 192.168.0.2:56821\r\n2015/10/03 00:29:45 socat[30438.2046857984] N SSL connection using AES128-SHA\r\n2015/10/03 00:29:45 socat[30438.2046857984] N starting data transfer loop with FDs [3,3] and [4,4]\r\n```\r\n\r\n<span style=\"color:#D3435C;\">**ПРИМЕЧАНИЕ:** Arduino IDE может жаловаться на то, что «программа не отвечает». Вам необходимо прекратить выполнение скрипта перед загрузкой нового скейтча.</span>\r\n\r\n**Дополнительные материалы:**\r\n- [Учебник: Управление Arduino через USB с приложением Blynk. Плата Ethernet не требуется. Mac OS](https://www.youtube.com/watch?v=fgzvoan_3_w)\r\n- [Как управлять Arduino (без проводов) с помощью blynk через USB. Windows](https://www.youtube.com/watch?v=I_hgIj2FdPI)\r\n- [Учебные пособия: управление Arduino с помощью Blynk через USB](http://www.instructables.com/id/Control-arduino-using-Blynk-over-usb/)\r\n\r\n## Raspberry Pi\r\n1. Подключите Raspberry Pi к Интернету и откройте его консоль.\r\n2. Запустите эту команду (она обновляет ваш репозиторий пакетов операционной системы, чтобы добавить необходимые пакеты):\r\n\r\n\t```\r\n\tcurl -sL \"https://deb.nodesource.com/setup_6.x\" | sudo -E bash -\r\n\t```\r\n\r\n3. Загрузите и соберите библиотеку Blynk JS, используя npm:\r\n\r\n\t```\r\n\tsudo apt-get update && sudo apt-get upgrade\r\n\tsudo apt-get install build-essential\r\n\tsudo apt-get install -g npm \r\n\tsudo npm install -g onoff\r\n\tsudo npm install -g blynk-library\r\n\t```\r\n\r\n4. Запустите тестовый скрипт Blynk (поставьте свой ключ авторизации):\r\n\r\n\t```\r\n\tblynk-client 715f8cafe95f4a91bae319d0376caa8c\r\n\t```\r\n\r\n5. Вы можете написать свой собственный скрипт на основе [примеров](https://github.com/vshymanskyy/blynk-library-js/tree/master/examples)\r\n\r\n6. Чтобы включить автоматический перезапуск Blynk для Pi, найдите файл ```/etc/rc.local``` и добавьте туда:\r\n\r\n\t```\r\n\tnode full_path_to_your_script.js <Auth Token> \r\n\t```\r\n\r\n**Дополнительные материалы:**\r\n- [Учебные пособия: Blynk на Javascript для Raspberry Pi, Intel Edison и другие](http://www.instructables.com/id/Blynk-JavaScript-in-20-minutes-Raspberry-Pi-Edison)\r\n- [Учебные пособия: использование датчиков DHT11/DHT12 с Raspberry Pi и Blynk](http://www.instructables.com/id/Raspberry-Pi-Nodejs-Blynk-App-DHT11DHT22AM2302/?ALLSTEPS)\r\n\r\n**Примечание:** Вместо использования Node.js вы также можете создать версию библиотеки C++ (такую же, как для Arduino, на основе WiringPi):\r\n- [Библиотека README для Linux](https://github.com/blynkkk/blynk-library/blob/master/linux/README.md)\r\n- [Тема сообщества Blynk: How-To Raspberry Pi](https://community.blynk.cc/t/howto-for-raspberry-pi/332)\r\n- [Видеоурок - Настройка Blynk и Raspberry Pi](https://www.youtube.com/watch?v=iSG_8g6KyGE)\r\n\r\n## Беспроводной ESP8266\r\n\r\nВы можете запустить Blynk прямо на ESP8266!\r\n\r\nУстановите последнюю версию библиотеки ESP8266 для Arduino, используя [это руководство](https://github.com/esp8266/Arduino#installing-with-boards-manager). \r\n\r\n**Пример кода:** [ESP8266_Standalone](https://github.com/blynkkk/blynk-library/blob/master/examples/Boards_WiFi/ESP8266_Standalone/ESP8266_Standalone.ino)\r\n\r\n**Дополнительные материалы:**\r\n- [Учебные пособия: ESP8266 ESP-12 (Беспроводной) + Blynk](http://www.instructables.com/id/ESP8266-ESP-12Standalone-Blynk-101)\r\n- [Учебные пособия: ESP8266-12 (Беспроводной) датчик температуры lm35 + Blynk](http://www.instructables.com/id/ESP8266-12-blynk-wireless-temperature-LM35-sensor/?ALLSTEPS)\r\n- [Пошаговое руководство на русском языке](http://esp8266.ru/esp8266-blynk)\r\n\r\n## NodeMCU\r\n\r\nПожалуйста, следуйте [этой подробной инструкции](https://github.com/blynkkk/blynk-library/tree/master/examples/Boards_WiFi/NodeMCU#instruction-for-nodemcu-setup).\r\nИли посмотрите [этот видеоурок](https://www.youtube.com/watch?v=FhS44hGk1Lc).\r\n\r\n## Arduino + ESP8266 WiFi с AT командами\r\n\r\nЭтот тип подключения не рекомендуется для начинающих.\r\nЕсли вы хотите попробовать, пожалуйста, внимательно прочитайте [этот раздел справки](http://help.blynk.cc/hardware-and-libraries/arduino/esp8266-with-at-firmware)\r\n\r\n**Примечание:** Некоторые платы, такие как Arduino UNO WiFi от Arduino.org, не используют AT-команды (и не предоставляют соответствующих библиотек), поэтому это делает их непригодными для использования с Blynk.\r\n\r\n## Particle\r\nBlynk работает со всем семейством продуктов Particle: Core, Photon и Electron.\r\n\r\n1. Открыть [Particle Web IDE](https://build.particle.io/build). Требуется регистрация.\r\n2. Идем в библиотеки.\r\n3. Найдите ** Blynk ** в общих библиотеках и нажмите на него.\r\n4. Откройте пример ```01_PARTICLE.INO```.\r\n5. Нажмите «использовать этот пример» (use this example).\r\n6. Поместите свой токен здесь: ```char auth [] =\"YourAuthToken\";``` и прошейте Particle!\r\n\r\nВы можете отсканировать этот QR-код из приложения Blynk, и вы получите готовый к тесту проект для **Particle Photon**. Просто вставьте свой токен ключ в пример ```01_PARTICLE.INO```.\r\n\r\n<img src=\"../images/Particle Demo1530733075.png\" style=\"width: 300px; height:300px\"/>\r\n\r\n**Дополнительные материалы:**\r\n- [Ядро Particle + DHT22](https://www.hackster.io/gusgonnet/temperature-humidity-monitor-with-blynk-7faa51)\r\n"
  },
  {
    "path": "ru/Implementing.md",
    "content": "# Implementing a Blynk HW client (library)\r\nCurrently we provide Arduino/C++ implementation of the library.\r\nIt is very extensible and modular, look at [the list of supported hardware](/#supported-hardware).\r\nAdding new connection types and Arduino-compatible boards is easy.\r\n\r\nTODO: Porting guide.\r\n\r\nBut some devices are programmed in other languages, like:\r\n\r\n* Espruino, JavaScript, Node.JS\r\n* MicroPython, Python\r\n* NodeMCU, eLua\r\n\r\nThis document hints how to write a custom library.\r\n\r\n## Blynk library main functions\r\n\r\n* Provide easy-to use API\r\n * Virtual pin handlers registration\r\n * Provide comfortable wrappers for some widgets\r\n* Manage connection\r\n * Should support different connection type/hardware, if applicable\r\n* Serialize/deserialize Blynk protocol\r\n* Handle direct pin operations\r\n* Should be portable across similar devices (or same technology/programming language), if possible\r\n* Should detect and notify the user about [troubles](/#troubleshooting) where possible (especially Flood)\r\n\r\n### Adding new HW board\r\n\r\nDifferent boards can be added by creating JSON board description file.\r\n\r\n```json\r\n{\r\n    \"name\": \"Arduino UNO\",\r\n    \"map\": {\r\n        \"digital\": {\r\n            \"pins\": {\r\n                \"D0\":  0,  \"D1\":  1,  \"D2\":  2,  \"D3\":  3, \"D4\": 4,\r\n                \"D5\":  5,  \"D6\":  6,  \"D7\":  7,  \"D8\":  8, \"D9\": 9,\r\n                \"D10\": 10, \"D11\": 11, \"D12\": 12, \"D13\": 13\r\n            },\r\n            \"ops\": [ \"dr\", \"dw\" ]\r\n        },\r\n        \"analog\": {\r\n            \"pins\": {\r\n                \"A0\": 14, \"A1\": 15, \"A2\": 16, \"A3\": 17, \"A4\": 18, \"A5\": 19\r\n            },\r\n            \"ops\": [ \"dr\", \"dw\", \"ar\" ],\r\n            \"arRange\":[0, 1023]\r\n        },\r\n        \"pwm\": {\r\n            \"pins\": [\r\n                \"D3\", \"D5\", \"D6\", \"D9\", \"D10\", \"D11\"\r\n            ],\r\n            \"ops\": [ \"aw\" ],\r\n            \"awRange\":[0, 255]\r\n        },\r\n        \"virtual\":  {\r\n            \"pinsRange\": [ 0, 31 ],\r\n            \"ops\": [ \"vr\", \"vw\" ]\r\n        }\r\n    }\r\n}\r\n```\r\n\r\nLook at the [full boards list](https://github.com/blynkkk/blynk-library/tree/master/boards_json).\r\nYou can send us your own board description file for review and App integration.\r\n\r\nThere may be a problem that you want to start testing your implementation, but your board is not listed int the Blynk App.\r\nOn Android, we now have a \"Generic Board\" specially for such purposes.\r\nUnfortunately iOS does not have it yet.\r\n\r\nBasically you can select UNO board and check how it works using just virtual pins.\r\nMost digital pins will also work.\r\nAnalog IO/PWM will not work in general, until we add your board to the App."
  },
  {
    "path": "ru/IntroAndDownloads.md",
    "content": "# Введение\r\nЭто руководство поможет вам понять, как начать использовать Blynk, и даст исчерпывающий обзор всех функций.\r\n\r\nЕсли вы хотите начать использовать Blynk, ознакомьтесь с разделом Начало работы.\r\n<br>\r\n\r\n[Начало работы >](/#getting-started)\r\n\r\n## Как работает Blynk\r\nБлинк был разработан для \"Интернета вещей\" ([Internet of Things](https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82_%D0%B2%D0%B5%D1%89%D0%B5%D0%B9)). Он может управлять оборудованием удаленно, отображать данные датчиков, хранить данные, визуализировать их и делать много других интересных вещей.\r\n\r\nВ платформе есть три основных компонента:\r\n\r\n- **Blynk App (Приложение-клиент)** - позволяет вам создавать разнообразные интерфейсы для ваших проектов, используя различные виджеты.\r\n\r\n- **Blynk Server (Сервер)** - отвечает за все коммуникации между смартфоном и оборудованием.\r\nВы можете использовать наше Облако Blynk или запустить свой [личный сервер Blynk](/#blynk-server) локально.\r\nОн с открытым исходным кодом, может легко обрабатывать тысячи устройств и даже может быть запущен на устройствах типа Raspberry Pi.\r\n\r\n- **Blynk Libraries (Библиотеки)** - разработаны для всех популярных аппаратных платформ - обеспечивают связь с сервером и\r\nобрабатывать все входящие и исходящие команды.\r\n\r\nА теперь представьте: каждый раз, когда вы нажимаете кнопку в приложении Blynk, сообщение отправляется в ~~пространство~~ Облако Blynk, где оно \"волшебным\" образом попадает на ваше оборудование. Передача работает и в противоположном направлении, а все происходит в \"мгновение ока\".\r\n\r\n<img src=\"../images/architecture.png\" style=\"width: 640px; height:478px\"/>\r\n\r\n## Характеристики\r\n* Типовой API и пользовательский интерфейс для всех поддерживаемых устройств и оборудования\r\n* Подключение к сети с помощью:\r\n   * Wi-Fi\r\n   * Bluetooth и BLE\r\n   * Ethernet\r\n   * USB (последовательный)\r\n   * GSM\r\n   * ...\r\n* Набор, простых в использовании, виджетов\r\n* Прямое управление пин-ами без написания кода\r\n* Простота интеграции и добавления новых функций с помощью виртуальных пин-ов\r\n* Мониторинг истории данных с помощью виджета [Диаграмма (SuperChart)](/#widgets-displays-superchart)\r\n* Связать устройства между собой при помощью виджета [Мост (Bridge)](/#widgets-other-bridge)\r\n* Отправка электронных писем, твитов, push-уведомлений и т.д.\r\n* ... постоянно добавляются новые функции!\r\n\r\nВы можете найти [Примеры кода](https://github.com/blynkkk/blynk-library/tree/master/examples), охватывающие основные функции Blynk. Они так же включены в библиотеку Blynk. Все примеры разработаны так, чтобы их можно было легко комбинировать друг с другом.\r\n\r\n## Что нужно для использования Blynk?\r\nВ этот момент вы можете подумать: **«Хорошо, я хочу попробовать. Что мне нужно, чтобы начать?»** - на самом деле, всего пара вещей:\r\n\r\n#### **1. Аппаратные средства**. \r\nArduino, Raspberry Pi или аналогичный набор для разработки.\r\n\r\n**Blynk работает через Интернет.**\r\nЭто означает, что выбранное вами оборудование должно иметь возможность подключаться к Интернету. Некоторым платам, таким как Arduino Uno, понадобится Ethernet или Wi-Fi Shield для связи, другие уже подключены к Интернету, например: ESP8266, Raspberri Pi с WiFi-ключом, Particle Photon или SparkFun Blynk Board. Но даже если у вас нет подключения к сети, вы можете подключить устройства через USB к своему ноутбуку или настольному компьютеру (для новичков это немного сложнее, но мы вам поможем).\r\nЧто действительно круто, так это то, что [список оборудования](/#support-hardware), который работает с Blynk, огромен и продолжает расти.\r\n  \r\n#### **2. Смартфон**. \r\nПриложение Blynk - это качественно разработанный конструктор интерфейсов. Он работает как на iOS, так и на Android, давайте здесь обойдемся без священной войны, хорошо?\r\n\r\n# Загрузки\r\n## **Приложения Blynk для iOS или Android** <br> \r\n[<img src=\"../images/appstore-lrg.svg\" alt=\"Drawing\" style=\" width: 158px; height:42\"/>](https://itunes.apple.com/us/app/blynk-control-arduino-raspberry/id808760481?ls=1&mt=8)  &nbsp; &nbsp; &nbsp; &nbsp;[<img src=\"https://play.google.com/intl/en_us/badges/images/apps/en-play-badge.png\" alt=\"Drawing\" style=\" width: 158px; height:42px\"/>](https://play.google.com/store/apps/details?id=cc.blynk)\r\n\r\n## **Blynk библиотека** <br>\r\n[Скачать библиотеку Blynk >](https://github.com/blynkkk/blynk-library/releases/latest)\r\n\r\nЕсли вы забыли или не знаете, как установить библиотеки Arduino [нажмите здесь](http://www.arduino.cc/en/guide/libraries).\r\n"
  },
  {
    "path": "ru/License.md",
    "content": "# Лицензия\r\nЭтот проект выпущен под лицензией Открытого Программного Обеспечения ([MIT](https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D1%8F_MIT)).\r\n"
  },
  {
    "path": "ru/Links.md",
    "content": "# Ссылочная информация\r\n\r\n* [Blynk site](https://www.blynk.cc)\r\n* [Blynk community](https://community.blynk.cc)\r\n* [Facebook](https://www.fb.com/blynkapp)\r\n* [Twitter](https://twitter.com/blynk_app)\r\n* [Blynk Library](https://github.com/blynkkk/blynk-library)\r\n* [Blynk Examples](https://github.com/blynkkk/blynk-library/tree/master/examples)\r\n* [Blynk Server](https://github.com/blynkkk/blynk-server)\r\n* [Kickstarter campaign](https://www.kickstarter.com/projects/167134865/blynk-build-an-app-for-your-arduino-project-in-5-m/description)\r\n"
  },
  {
    "path": "ru/OTA.md",
    "content": "# Обновление \"по воздуху\" (OTA)\r\n\r\nBlynk также поддерживает беспроводное обновления для плат ESP8266, NodeMCU и SparkFun Blynk. На данный момент ОТА поддерживается только для частных серверов и для платных клиентов.\r\n\r\n## Как это работает?\r\n\r\n - Вам нужно использовать [обычный скетч для экспортируемых приложений](https://github.com/blynkkk/blynk-library/tree/master/examples/Blynk.Inject/Template_ESP8266);\r\n - После того, как вы запустили свое оборудование, все готово к обвнолению \"по воздуху\";\r\n - Вы можете запустить обновление прошивки для конкретного оборудования через его токен или для всего оборудования в сети.\r\n \r\n### Заливка прошивки\r\n  \r\n1. Пользователь запускает OTA одним из нижеуказанных HTTPS-запросов;\r\n2. Пользователь предоставляет в HTTPS-запросе учетные данные администратора и двоичный файл прошивки для обновления оборудования;\r\n3. Когда оборудование подключается к серверу - сервер проверяет его прошивку. В случае, если дата сборки аппаратной прошивки старше загруженной прошивки, сервер отправляет на аппаратное обеспечение специальную команду с URL для новой прошивки;\r\n4. Оборудование обработает указанный URL-адрес таким [обработчиком](https://github.com/blynkkk/blynk-library/blob/master/examples/Blynk.Inject/Template_ESP8266/OTA.h#L31):\r\n \r\n    ```\r\n      BLYNK_WRITE(InternalPinOTA) {\r\n        //URL адрес с прошивкой. Возможен только HTTP адрес\r\n        //http://localhost:8080/static/ota/FUp_2441873656843727242_upload.bin\r\n        overTheAirURL = param.asString();\r\n        ...\r\n      }\r\n    ```\r\n\r\n5. Обрудование самостоятельно загружает новую прошивку и начинает обновление;\r\n\r\n## Выборочное обновление для конкретного оборудования\r\n\r\n```\r\ncurl -v -F file=@Template_ESP8266.ino.nodemcu.bin --insecure -u admin@blynk.cc:admin https://localhost:9443/admin/ota/start?token=123\r\n```\r\n\r\n - ```Template_ESP8266.ino.nodemcu.bin``` - относительный (или полный) путь к вашей прошивке;\r\n - ```--insecure``` флаг для серверов с самостоятельно созданными сертификатами. Вам не нужен этот флаг, если вы использовали Let's Encrypt или другие доверенные сертификаты;\r\n - ```admin@blynk.cc:admin``` учетные данные администратора на вашем сервере. Указаны значения по умлочанию. Формат: ```username:password```. Вы можете изменить имя пользователя и пароль в файле ```server.properties```;\r\n - ```token``` ключь является признаком вашего оборудования, к которому вы хотите применить обновление прошивки. Обновление прошивки будет начато только в том случае, если устройство подключено к сети;\r\n\r\n## Обновление \"по воздуху\" для всех устройств\r\n \r\nОбновление для всех устройств будет запускаться только тогда, когда они подключены к облаку. Для этого вам нужно удалить часть с токен ключом.\r\n\r\n```\r\ncurl -v -F file=@Template_ESP8266.ino.nodemcu.bin --insecure -u admin@blynk.cc:admin https://localhost:9443/admin/ota/start\r\n```\r\n\r\nВ этом случае OTA будет срабатывать сразу после подключения устройства к серверу. Если устройство подключено к сети, обновление встроенного ПО будет начато только после повторного подключения устройства.\r\n\r\n## Обновление \"по воздуху\" от конкретного пользователя\r\n\r\nВ этом случае обновление прошивки будет срабатывать для всех устройств, указанных пользователем.\r\n\r\n```\r\ncurl -v -F file=@Template_ESP8266.ino.nodemcu.bin --insecure -u admin@blynk.cc:admin https://localhost:9443/admin/ota/start?user=pupkin@gmail.com\r\n```\r\n\r\n## Обновление \"по воздуху\" для конкретного пользователя и проекта\r\n\r\nВ этом случае обновление прошивки будет срабатывать для всех устройств указанного пользователя в указанном проекте.\r\n\r\n```\r\ncurl -v -F file=@Template_ESP8266.ino.nodemcu.bin --insecure -u admin@blynk.cc:admin https://localhost:9443/admin/ota/start?user=pupkin@gmail.com&project=123\r\n```\r\n\r\n## Остановка OTA\r\n\r\n```\r\ncurl -v --insecure -u admin@blynk.cc:admin https://localhost:9443/admin/ota/stop\r\n```\r\n\r\n## Как сделать бинарную прошивку \r\n\r\nЧтобы сделать прошивку в Arduino IDE - зайдите в меню: Скетч -> Экспорт бинарного файла.\r\n\r\n**ПРИМЕЧАНИЕ:** ESP8266 принимает прошивку только по протоколу HTTP, а не HTTPS.\r\n"
  },
  {
    "path": "ru/README.md",
    "content": "# https://docs.blynk.cc/\n\n"
  },
  {
    "path": "ru/Roadmap.md",
    "content": "#Roadmap\r\n\r\nWe build Blynk based on Blynkers feedback but with limited resources we have to prioritize our features. At the moment list look like that:\r\n\r\n- App Sharing (project sharing when other people can control your hardware, but can't modify your project); Free Beta\r\n- App Sharing (project sharing when other people can control your hardware, but can't modify your project); Subscription based\r\n- Bluetooth Low Energy support;\r\n- Hardware state handling (changing physical button state changes Blynk application state);\r\n- Hardware online/offlane state improvements (better indication for \"is hardware online?\", \"is hardware offline?\");\r\n- Project space increase\r\n- Direct Connect support (for WiFi);\r\n- RTC widget;\r\n- Design options for widgets (size, button with icons, etc);\r\n- Phone sensors widgets (GPS, accelerometer);\r\n- IP camera support;\r\n- Customizable look and feel of the project\r\n\r\nUnder consideration:\r\n- Home screen widget (to avoid opening App when you need only 1 button click);\r\n- Haptic feedback (vibration) when touching widgets\r\n"
  },
  {
    "path": "ru/Security.md",
    "content": "# Безопасность\r\n\r\nСервер Blynk имеет 5 открытых портов с разным уровнем безопасности.\r\n\r\n* **80** - простое TCP-соединение до оборудования (без защиты)\r\n* **8080** - простое TCP-соединение для оборудования на локальном сервере (без защиты)\r\n* **443** - соединение SSL/TLS для мобильных приложений и оборудования с SSL шифрованием\r\n* **9443** - соединение SSL / TLS для мобильных приложений на локальном сервере и оборудования с SSL шифрованием\r\n\r\nОборудование может выбрать подключение к 443 (9443) или 80 (8080), в зависимости от его совместимости.\r\nСоединение между приложением и сервером всегда осуществляется через SSL/TLS шифрование, поэтому оно всегда защищено.\r\nСоединение между оборудованием и сервером зависит от ваших аппаратных возможностей.\r\nС локальным сервером Blynk тип соединения между оборудованием и сервером не так важен для безопасности, так как локальный сервер обычно размещается в локальной сети, поэтому злоумышленник не может перехватить трафик между оборудованием и сервером.\r\n\r\n## Использование локального сервера Blynk\r\n\r\nДля обеспечения максимальной безопасности вы можете [установить Blynk server локально](/#blynk-server) и ограничить доступ к вашей локальной сети, чтобы никто, кроме вас, не мог получить доступ к серверу. В этом случае все данные хранятся локально в пределах только вашей сети и не отправлятся через Интернет.\r\n\r\nВ случае локального сервера Blynk также нет необходимости защищать соединение между вашим оборудованием и сервером.\r\nЭто справедливо для подключения по Ethernet и частично для соединения по Wi-Fi. В случае с Wi-Fi вы должны использовать WPA/WPA2 (защищенный доступ к Wi-Fi) шифрование для защиты беспроводного трафика.\r\n\r\nАлгоритмы WPA и WPA2 предлагают очень надежное шифрование, которое может защитить все данные, передаваемые по радиоканалу, при условии, что используется достаточно надежный пароль. Даже если ваши данные представляют собой обычный TCP/IP трафик, другой пользователь не сможет расшифровать захваченные пакеты. Тем не менее, убедитесь, что ваш пароль достаточно надежный, иначе единственным ограничивающим фактором для злоумышленника останется время.\r\n\r\n## Использование SSL-шлюза\r\n\r\nБольшинство платформ не способны обрабатывать SSL протокол, поэтому они подключаются по 80 порту. Однако наш [сценарий шлюза](https://github.com/blynkkk/blynk-library/blob/master/scripts/blynk-ser.sh) можно использовать для добавления SSL уровня безопасности SSL к соединениям.\r\n\r\n```bash\r\n./blynk-ser.sh -f SSL\r\n```\r\n\r\nЭтот скрипт перенаправит все аппаратные соединения с порта 9443 сервера через шлюз SSL. Вы можете запустить этот скрипт на своем Raspberry Pi, настольном компьютере или даже прямо на своем роутере!\r\n\r\n**Примечание:** при использовании вашего собственного сервера вы должны перезаписать прилагаемый сертификат server.crt или указать его в сценарии с помощью ключа ```--cert```:\r\n\r\n```bash\r\n./blynk-ser.sh -f SSL -s <server ip> -p 9443 --cert=<certificate>.crt\r\n```\r\n\r\nFlag ```-f SSL``` is enabled by default for USB communication so you don't have to explicit declare it.\r\n\r\n**Note:** SSL is supported by the gateway only on Linux/OSX for now\r\n\r\nIf you want to skip SSL, and connect to TCP, you can also do that:\r\n\r\nФлаг ```-f SSL``` включен по умолчанию при соединении через USB, поэтому вам не нужно его явно объявлять.\r\n\r\n**Примечание:** Пока SSL поддерживается шлюзом только в Linux/OSX.\r\n\r\nЕсли вы хотите пропустить SSL и подключиться к TCP, вы также можете сделать так:\r\n\r\n```bash\r\n./blynk-ser.sh -t TCP\r\n```\r\n"
  },
  {
    "path": "ru/Sharing.md",
    "content": "# Обмен проектами\r\nBlynk предлагает два типа обмена вашими проектами с другими людьми:\r\n\r\n- **Поделитесь доступом к вашему оборудованию.** Задумайтесь о том, чтобы дать кому-то использовать приложение от вашего проекта. Они не могут изменить интерфейс, но могут контролировать и наблюдать, что там происходит.\r\n\r\n- **Поделитесь конфигурацией вашего проекта.** Другие пользователи получат клон вашего проекта в Blynk, отсканировав QR-ссылку, но не смогут управлять вашим оборудованием. Это отлично подходит для обучения, учебных пособий и т.д.\r\n\r\n## Общий доступ к вашему оборудованию\r\nПредставьте, что вы даете кому-то приложение для управления вашим проектом.\r\n\r\n- люди, с которыми вы поделились своим проектом, не могут ничего изменить. Они могут только использовать его \r\n- вы можете обновить свое приложение, изменить макет, добавить виджеты, и оно сразу синхронизируется со всеми устройствами\r\n- вы можете отозвать доступ в любой момент\r\n\r\nКак это работает:\r\n- вы отправляете QR-код своим пользователям (любым способом по электронной почте, распечатываете, публикуете в социальных сетях, и т.п.)\r\n- другие скачивают приложение Blynk, сканируют ваш QR-код, и ваше приложение открывается у них готовыми к использованию. Им даже не нужно входить в систему или создавать учетную запись.\r\n\r\nЗайдите в настройки вашего проекта:\r\n\r\n<img src=\"../images/dash_settings_sharing.png\" style=\"width: 200px; height:360px\"/>\r\n\r\nНажмите на кнопку «Generate Link» (Создать ссылку):\r\n\r\n<img src=\"../images/dash_settings_sharing_generate.png\" style=\"width: 200px; height:360px\"/>\r\n\r\nБудет сгенеририрован QR-код, которым вы можете поделиться с другими:\r\n\r\n<img src=\"../images/dash_public_sharing.png\" style=\"width: 200px; height:360px\"/>\r\n\r\nЭто оно! Теперь **Выйдите из настроек и нажмите кнопку PLAY.**\r\n\r\nДругой человек должен будет установить приложение Blynk и отсканировать QR-код с экрана для входа в систему (сканирование из существующего профиля пока не поддерживается);\r\n\r\n<img src=\"../images/scan_qr.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n**ПРИМЕЧАНИЕ:** Ваш проект должен быть активным, не забудьте нажать кнопку воспроизведения.\r\n\r\n**ПРЕДУПРЕЖДЕНИЕ:** Обмен QR-кодом стоит 1000 энергии, и эта энергия не подлежит восстановлению, даже если вы вообще не использовали обмен.\r\n\r\n## Поделится своей конфигурацией проекта\r\nЕсли вы хотите поделиться настройками своего Проекта, не предоставляя доступ к вашему оборудованию (например, чтобы создать учебный материал или инструкцию) - выполните следующие действия:\r\n\r\nВ настройках проекта перейдите к кнопке **Clone**.\r\n\r\n<img src=\"../images/clone.png\" style=\"width: 200px; height:360px\"/>\r\n\r\nОна сгенерирует QR-код, которым вы можете поделиться с кем угодно.\r\n\r\n<img src=\"../images/QR.png\" style=\"width: 200px; height:360px\"/>\r\n\r\nДругой человек **должен войти в приложение Blynk** и нажать кнопку QR в галерее проектов\r\n\r\n<img src=\"../images/QR_button_edit.png\" style=\"width: 200px; height:360px\"/>\r\n\r\nПосле проверки будет создан новый проект, все виджеты, настройки, макет будут клонированы. Другому человеку понадобится достаточно энергии, чтобы клонировать ваш проект.\r\n\r\n**Ключ аутентификации будет другим!**. Никто не получит доступ к вашему оборудованию. Они просто получают копию интейрфейса и настроек.\r\n"
  },
  {
    "path": "ru/SupportedHardware.md",
    "content": "# Поддерживаемое оборудование\r\n\r\nBlynk уже поддерживает более 400 плат, включая поддержку Arduino, Particle, ARM mbed, TI Energia, MicroPython, Node.js, OpenWRT и многих одноплатных компьютеров. Вы можете легко добавить свои собственные типы подключения (см. [здесь](https://github.com/blynkkk/blynk-library/tree/master/examples/More/ArduinoClient) примеры для Arduino)!\r\n\r\n## Платформы\r\n\r\n- **Arduino** (https://github.com/blynkkk/blynk-library)\r\n  - Arduino MKR WiFi 1010\r\n  - Arduino MKR GSM 1400\r\n  - Arduino MKR NB 1500\r\n  - Arduino Uno, Duemilanove\r\n  - Arduino Nano, Mini, Pro Mini, Pro Micro, Due, Mega\r\n  - Arduino 101 (Intel Curie, с BLE)\r\n  - Arduino MKR1000\r\n  - Arduino Zero\r\n  - Arduino Yún (включая WiFi и Ethernet, через Bridge)\r\n  - Arduino.org UNO WiFi\r\n  - Arduino MKR VIDOR 4000 (используйте пример для MKR WiFi 1010)\r\n  - Arduino UNO WiFi Rev.2 (используйте пример для MKR WiFi 1010)\r\n  \r\n- **Arduino-подобные**\r\n  - Blynk Board\r\n  - ESP8266 (Generic, NodeMCU, Witty Cloud, Huzzah, WeMos D1, Seeed Wio Link, etc.)\r\n  - ESP32 (WiFi, BLE)\r\n  - Nordic nRF51/nRF52 - базовые платы\r\n  - Teensy 3.2/3.1\r\n  - Blue Pill (STM32F103C)\r\n  - Realtek RTL8710 / Ameba via [RTLduino](https://github.com/pvvx/RtlDuino)\r\n  - BBC micro:bit\r\n  - LightBlue Bean *, soon*\r\n  - DFRobot Bluno\r\n  - RedBear Duo (WiFi, BLE)\r\n  - RedBearLab Blend Micro\r\n  - RedBearLab BLE Nano (v1 and v2)\r\n  - Seeed Tiny BLE\r\n  - Simblee BLE\r\n  - RFduino BLE\r\n  - The AirBoard (BLE-Link, RN-XV)\r\n  - Feather M0 WiFi\r\n  - Feather 32u4 BLE\r\n  - Intel Edison\r\n  - Intel Galileo\r\n  - Fishino Guppy, Uno, Mega\r\n  - TinyCircuits TinyDuino (CC3000)\r\n  - Microduino/mCookie Core, Core+, CoreUSB\r\n  - Wicked WildFire V2, V3, V4\r\n  - Digistump Oak\r\n  - chipKIT Uno32\r\n  - Alorium XLR8 (FPGA)\r\n  - LinkIt ONE (WiFi only)\r\n- **Энергеия**\r\n  - Texas Instruments\r\n    - CC3220SF-LaunchXL\r\n    - CC3200-LaunchXL\r\n    - Tiva C Connected LaunchPad\r\n    - Stellaris LM4F120 LaunchPad\r\n    - MSP430F5529 + CC3100\r\n    - LaunchPad MSP432\r\n  - RedBearLab (CC3200, WiFi Mini)\r\n\r\n- **Particle** (https://github.com/vshymanskyy/blynk-library-spark)\r\n  - Core\r\n  - Photon\r\n  - Electron\r\n  - RPi\r\n  - SparkFun RedBoard\r\n  - RedBear Duo (WiFi & BLE)\r\n\r\n- **ARM mbed** (https://developer.mbed.org/users/vshymanskyy/code/Blynk/)\r\n  - Seeed Tiny BLE\r\n  - RedBearLab BLE Nano\r\n  - BBC micro:bit\r\n  - STM32 Nucleo + Wiznet 5100 *, soon*\r\n\r\n- **JavaScript** (Node.js, Espruino, Browsers) (https://www.npmjs.com/package/blynk-library)\r\n  - Regular PC with Linux / Windows / OS X\r\n  - Raspberry Pi (Banana Pi, Orange Pi, ...)\r\n  - BeagleBone Black\r\n  - Onion Omega\r\n  - Onion Omega 2\r\n  - Intel Galileo\r\n  - Intel Edison\r\n  - Intel Joule\r\n  - LeMaker Guitar\r\n  - LeMaker Banana Pro\r\n  - Samsung ARTIK 5\r\n  - PandaBoard, CubieBoard, pcDuino, Tessel 2\r\n  - VoCore, VoCore2 (OpenWRT + [Espruino package](https://github.com/vshymanskyy/OpenWRT-Espruino-packages))\r\n  - Espruino Pico\r\n  - ...\r\n\r\n- **Python** (https://github.com/vshymanskyy/blynk-library-python)\r\n  - MicroPython\r\n  - Python 2\r\n  - Python 3\r\n\r\n- **Lua** (https://github.com/blezek/blynk-esp)\r\n  - NodeMCU\r\n\r\n## Типы подключения Arduino\r\n\r\n- USB (Serial), подключенный к ноутбуку или компьютеру\r\n\r\n- **Ethernet**\r\n  - Arduino MKR ETH\r\n  - Arduino Ethernet Shield (W5100)\r\n  - Arduino Ethernet Shield 2 (W5500)\r\n  - SeeedStudio Ethernet Shield V2.0 (W5200)\r\n  - ENC28J60-based modules\r\n \r\n- **WiFi**\r\n  - ESP8266 as WiFi modem (работает с оригинальной прошивкой)\r\n  - Arduino WiFi 101 Shield\r\n  - Arduino WiFi Shield\r\n  - WIZnet WizFi310\r\n  - Adafruit CC3000 WiFi Breakout / Shield\r\n  - RN-XV WiFly\r\n \r\n- **Bluetooth Smart (BLE 4.0)**\r\n  - HM-10, HC-08\r\n  - DFRobot BLE-Link module\r\n  - Microduino/mCookie BLE\r\n  - RedBearLab BLE Mini\r\n  - nRF8001-based boards (Adafruit Bluefruit LE, etc.)\r\n \r\n- **Bluetooth 2.0 Serial Port Profile (SPP)**\r\n  - HC-05, HC-06, ...\r\n \r\n- **Cellular (GSM/3G/LTE)**\r\n  - SIMCom SIM800 series (SIM800A, SIM800C, SIM800L, SIM800H, SIM808, SIM868)\r\n  - SIMCom SIM900 series (SIM900A, SIM900D, SIM908, SIM968)\r\n  - A6/A7\r\n  - M590\r\n  - BG96\r\n  - GPRSbee\r\n  - Microduino GSM\r\n  - Adafruit FONA (Mini Cellular GSM Breakout)\r\n  - Adafruit FONA 800/808 Shield\r\n\r\n## Сделано сообществом\r\n\r\n- [Marvell® EZ-Connect™ MW300/MW302](https://github.com/vshymanskyy/blynk-library-ez-connect)\r\n- [WIZnet-W5500-EVB](http://instructables.com/id/WIZnet-W5500-EVB-and-Blynk-App-communication)\r\n- [LabVIEW](https://github.com/juncaofish/NI-LabVIEWInterfaceforBlynk)\r\n- [Node-RED](https://github.com/gablau/node-red-contrib-blynk-ws) (can be used as bridge to HTTP, TCP, UDP, MQTT, XMPP, IRC, OSC...)\r\n\r\n## Проблемные платы\r\n\r\nЭти платы не поддерживаются и не работают из коробки:\r\n- [Arduino Tian](http://www.arduino.org/products/boards/arduino-tian)\r\n\r\nЗдесь список [**известных проблем с библиотекой Blynk**](https://github.com/blynkkk/blynk-library/issues?q=is%3Aissue+label%3A\"for+reference\"+)\r\n"
  },
  {
    "path": "ru/Troubleshooting.md",
    "content": "# Решение проблем\r\n\r\n## Соединение\r\n\r\nЕсли у вас возникли проблемы с подключением, выполните следующие действия:\r\n\r\n1. Убедитесь, что ваше оборудование, провода, кабели и блок питания находятся в исправном состоянии, не повреждены и т.д.      \r\n   Используйте качественные USB-кабели и USB-порты.\r\n2. Проверьте проводку, используя примеры (клиент TCP/HTTP или аналогичный), **прилагаемые к вашему оборудованию**.\r\n   * Как только вы поймете, как управлять соединением, использовать Blynk станет намного проще.\r\n3. Попробуйте запустить команду ```telnet blynk-cloud.com 80``` со своего ПК, подключенного к той же сети, что и ваше оборудование. Вы должны увидеть что-то вроде: ```Подключено к blynk-cloud.com```.\r\n4. Попробуйте запустить примеры Blynk по умолчанию для вашей платформы **без изменений**, чтобы увидеть, работают ли они.\r\n   * Дважды проверьте, что вы выбрали **правильный пример** для вашего типа подключения и модели оборудования.\r\n   * Наши примеры содержат **комментарии и объяснения**. **Читайте их внимательно.**\r\n   * Убедитесь, что ваш токен авторизации действителен (скопирован из приложения и **не содержит пробелов и т.п.**)\r\n   * Если это не работает, попробуйте заглянуть в [печать отладочной информации в порт](/#enable-debug).\r\n5. Готово! Добавьте свои модификации и функциональность. Наслаждайтесь Blynk!\r\n\r\n**Примечание:** Если к вашей сети подключено несколько устройств, все они должны иметь разные MAC и IP-адреса. Например, при использовании двух Arduino UNO с Ethernet расширениями, пример по умолчанию для обоих из них вызовет проблемы с подключением. Вам следует использовать пример [ручная настройка Ethernet](https://github.com/blynkkk/blynk-library/blob/master/examples/Boards_Ethernet/Arduino_Ethernet_Manual/Arduino_Ethernet_Manual.ino).\r\n\r\n## Подключение к сети WiFi\r\nЕсли у вас возникли проблемы с подключением по WiFi, пожалуйста, проверьте следующие ошибки:\r\n\r\n* Вы пытаетесь подключиться к сети 'WPA & WPA2 Enterprise' (часто используется в офисах), а ваш шилд не поддерживает этот метод шифрования\r\n* В вашей WiFi-сети есть страница входа, которая запрашивает ввод ключа доступа (часто используется в ресторанах)\r\n* Безопасность вашей сети Wi-Fi запрещает полное подключение чужих устройств (фильтрация MAC-адресов и т.п.)\r\n* Работает Брандмауэр. Порт по умолчанию для аппаратных подключений - 80 (8080 на локальном сервере). Убедитесь, что он открыт.  \r\n\r\n## Задержки (Delay)\r\n\r\nЕсли вы используете длительный ```delay()``` или отправляете свое оборудование в спящий режим внутри ```loop()```, ждите обрыва соединения и снижение производительности.\r\n\r\n***НЕ ДЕЛАЙТЕ ЭТОГО:***\r\n```cpp\r\nvoid loop()\r\n{\r\n  ...\r\n  delay(1000); // это длительная задержка, которую следует избегать\r\n  other_long_operation();  // другие длинные операторы\r\n  ...\r\n  Blynk.run();\r\n}\r\n```\r\n\r\n**Примечание:** Это также относится к обработчикам BLYNK_READ & BLYNK_WRITE!\r\n   \r\n**РЕШЕНИЕ:**\r\nЕсли вам нужно выполнять действия в определенные промежутки времени - используйте таймеры, например [BlynkTimer](/#blynk-firmware-blynktimer).\r\n\r\n## Ошибки из-за флуда\r\n\r\nЕсли ваш код часто отправляет много запросов на наш сервер, ваше оборудование будет отключено. Приложение Blynk может показывать \"Your hardware is offline\" (Ваше оборудование отключено).\r\n\r\nКогда ```Blynk.virtualWrite``` находится в  ```void loop```, он генерирует сотни «запросов» в секунду.\r\n\r\nВот пример того, что может вызвать флуд. **НЕ ДЕЛАЙТЕ ЭТОГО:**\r\n\r\n```cpp\r\nvoid loop()\r\n{\r\n  Blynk.virtualWrite(1, value); // Эта строка отправляет сотни сообщений на сервер Blynk\r\n  Blynk.run();\r\n}\r\n```\r\n\r\n**РЕШЕНИЕ:**\r\nЕсли вам нужно выполнять действия в определенные промежутки времени - используйте таймеры, например [BlynkTimer](/#blynk-firmware-blynktimer).\r\n\r\nИспользование ```delay()``` также не решит проблему. Это может вызвать [другую проблему](/#delay). Используйте таймеры!\r\n\r\nЕсли отправка сотен запросов - это то, что вам необходимо для вашего продукта, вы можете увеличить лимит на локальном сервере и в библиотеке Blynk.\r\nДля локального сервера вам необходимо изменить свойство ```user.message.quota.limit``` в файле ``` server.properties```:   \r\n\r\n        #100 запросов в секунду на одного пользователя.\r\n        user.message.quota.limit=100\r\n        \r\nДля библиотеки вам нужно изменить свойство ```BLYNK_MSG_LIMIT``` в файле ``` BlynkConfig.h```:\r\n \r\n        //Ограничьте количество исходящих команд.\r\n        #define BLYNK_MSG_LIMIT 20\r\n\r\n## Включить отладку\r\n\r\nЧтобы включить отправку отладочной информации в серийный порт по умолчанию, добавьте код в верхней части скейтча **(это должна быть первая строка в скейтче)**:\r\n\r\n```cpp\r\n#define BLYNK_DEBUG // Необязательно, запускает отладку\r\n#define BLYNK_PRINT Serial\r\n```\r\nИ не забудьте включить серийный порт в ```void setup()```:\r\n\r\n```cpp\r\nSerial.begin(9600);\r\n```\r\n\r\nВы также можете использовать запасные аппаратные последовательные порты или SoftwareSerial для вывода отладочной информации (вам понадобится адаптер для подключения к ПК).\r\n\r\n**Примечание:** включение режима отладки замедлит аппаратную производительность в 10 раз.\r\n\r\n## Проблема с Geo DNS\r\n\r\nПроблема с Geo DNS больше не является проблемой. Она была решена в 2017 году.\r\n\r\n## Сброс пароля\r\n\r\nНа экране входа нажмите \"Forgot password?\" (Забыли пароль?) а затем введите адрес электронной почты и кнопку ```Send```.\r\nВы получите инструкции по электронной почте.\r\n\r\n### Android сброс пароля\r\n\r\n1. Откройте инструкцию в электронной почте **со своего смартфона или планшета**;\r\n2. Нажмите кнопку «Reset now» в своем электронном письме;\r\n3. Нажмите на значок Blynk в всплывающем окне и сбросьте пароль:\r\n\r\n<img src=\"../images/reset.png\"/>\r\n"
  },
  {
    "path": "ru/Widgets.md",
    "content": "# Виджеты\r\nВиджеты являются интерфейсными модулями. Каждый из них выполняет определенную функцию ввода / вывода при взаимодействии с оборудованием.\r\n\r\n Есть 4 типа виджетов:\r\n\r\n- **Контроллеры** - используется для отправки команд, которые контролируют/управляют вашим оборудованием;\r\n- **Дисплеи** - используется для визуализации данных с датчиков и других источников;\r\n- **Уведомления** - отправляет сообщения и уведомления;\r\n- **Интерфейс** -  виджеты для выполнения определенных функций графического интерфейса;\r\n- **Другие** -  виджеты, которые не относятся ни к одной категории;\r\n\r\nКаждый виджет имеет свои настройки. Некоторые из виджетов (например, Bridge) просто включают функциональность, и у них нет никаких настроек.\r\n \r\n## Общие настройки виджетов\r\n### Выбор пина\r\nЭто один из основных параметров, который вам нужно установить. Он определяет, какой пин контролировать или читать.. \r\n\r\n<img src=\"../images/pin_selection.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n**Цыфровые Пины (Digital Pins)** -  представляют физические пины цифрового ввода-вывода на вашем оборудовании. Выводы с поддержкой ШИМ помечены символом ```~```\r\n\r\n**Аналоговые Пины (Analog Pins)** -  представляют физические пины аналогового ввода-вывода на вашем оборудовании\r\n\r\n**Виртуальные пины (Virtual Pins)** - не имеют физической реализации. Они используются для передачи любых данных между приложение Blynk и вашим оборудованием.\r\nУзнайте больше о Виртуальных Пинах [здесь](../#blynk-main-operations-virtual-pins).\r\n\r\n### Отображение данных\r\n\r\nЕсли вы хотите пересчитать входящие значения в определенный диапазон, вы можете использовать кнопку сопоставления значений:\r\n\r\n<img src=\"../images/display_edit_mapping.png\" style=\"width: 200px; height:360px\"/>\r\n\r\nДопустим, ваш датчик отправляет значения от 0 до 1023. Но вы хотите в приложении отображать значения в диапазоне от 0 до 100.\r\nКогда сопоставление данных включено, входящее значение 1023 будет отображено как 100.\r\n\r\n### РАЗДЕЛЬНО/ВМЕСТЕ (SPLIT/MERGE)\r\nНекоторые виджеты могут отправлять более одного значения. С помощью этого переключателя вы можете контролировать, как их отправлять.\r\n\r\n- **РАЗДЕЛЬНО**:\r\nКаждый из параметров отправляется непосредственно на пин вашего оборудовании (например, D7). Вам не нужно писать дополнительный код.\r\n\r\n**ПРИМЕЧАНИЕ:**  В этом режиме вы отправляете несколько команд из одного виджета, это может снизить производительность вашего оборудования.\r\n\r\n**ПРИМЕР:**  Если у вас есть виджет джойстика и он настроен на пины D3 и D4, то он отправит 2 команды через Интернет:\r\n\r\n```\r\n\tdigitalWrite(3, value);\r\n\tdigitalWrite(4, value);\r\n```\r\n\r\n- **ВМЕСТЕ:**\r\nКогда выбран режим ВМЕСТЕ, вы отправляете только 1 сообщение, состоящее из массива значений. Поэтому вам нужно разобрать его на совем оборудовании.\r\n\r\nЭтот режим можно использовать только с Виртуальными пинами.\r\n\r\n**ПРИМЕР:** Добавьте виджет zeRGBa и установите его в режим ВМЕСТЕ. Выберите виртуальный пин V1\r\n\t\r\n```\r\n\tBLYNK_WRITE(V1) //  Существующий виджет, который записывает данные в V1\r\n\t{\r\n\t  int r = param[0].asInt(); // получить значение КРАСНОГО канала\r\n\t  int g = param[1].asInt(); // получить значение ЗЕЛЕНОГО канала\r\n\t  int b = param[2].asInt(); // получить значение СИНЕГО канала\r\n\t}\r\n```\r\n\r\n### Разрядность (Decimals)\r\nОпределяет, сколько десятичных знаков вы хотели бы видеть при перемещении ползунка.\r\nКогда выбрано «Без дроби» (No Fraction), ползунок будет отправлять только целочисленные значения без десятичных дробей. \r\n\"1 знак\" означает, что значения будут выглядеть как 1.1, 1.2, ..., 2.0 и т. Д.\r\n\r\n### Отправка при Отжатии (Send On Release)\r\nЭта опция позволяет оптимизировать трафик данных на ваше оборудование.\r\n\r\nНапример, когда вы перемещаете виджет джойстика, команды потоково передаются на ваше оборудование, во момент одного движения джойстика может отправляться десятки команд. Существуют варианты когда, это дейтсвительно необходимо, однако создание такой нагрузки может привести к перегрузке и сбросу оборудования.\r\n\r\n**Отправка при Отжатии** является рекомендуемой настройкой для большинства приложений. Данная настройка влключена по умолчанию.\r\n\r\n###  Интервал записи (Write interval)\r\nАналогична опции «Отправка при Отжатии». Тем не менее, он позволяет вам передавать значения на ваше оборудование в течение определенного интервала. Например, установка **Интервала записи** на 100 мс означает, что при перемещении ползунка только 1 значение будет отправлено оборудованию в течение 100 мсек.\r\nЭта опция также используется для оптимизации потока трафика данных на ваше оборудование.\r\n\r\n###  Цветовой градиент (Color gradient)\r\nКогда вы выбираете градиент, он влияет на цвет элементов виджета на основе входящих значений.\r\nНапример: вы устанавливаете виджет Указатель (Gauge) с параметрами Min и Max от 0 до 100 и выбираете зелено-желто-красный градиент. То когда оборудование отправляет данные:\r\n \r\n- `10`,  Указатель изменит свой цвет на зеленый\r\n- `50` указатель изменит цвет на желтый\r\n- `80` указатель изменит цвет на красный\r\n\r\nЕсть два типа градиентов, которые вы можете выбрать:\r\n- Теплый: Зеленый - Ораньжевый - Красный;\r\n- Холодный: Зеленый - Синий - Фиолетовый.\r\n\r\n## Контроллеры (Controllers)\r\n### Кнопка (Button)\r\nWorks in push or switch modes. Allows to send ON and OFF (LOW/HIGH) values. Button sends 1 (HIGH) on press and sends 0 (LOW) on release.\r\n\r\nРаботает в режиме кнопки или выключателя. Позволяет отправлять значения ВКЛ (ON) и ВЫКЛ (OFF) (НИЗКИЙ / ВЫСОКИЙ) (LOW / HIGH). Кнопка посылает 1 ВЫСОКИЙ (HIGH) при нажатии и 0 НИЗКИЙ (LOW) при отпускании.\r\n\r\n<img src=\"../images/button.png\" style=\"width: 77px; height:80px\"/>\r\n\r\n<img src=\"../images/button_edit.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\r\n\r\n### Слайдер (Slider)\r\nСлайдер очень похож на потенциометр. Позволяет отправлять значения в заданном диапазоне MIN / MAX.\r\n\r\n<img src=\"../images/slider.png\" style=\"width: 77px; height:80px\"/>\r\n\r\n<img src=\"../images/slider_edit.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\r\n\r\n### Таймер (Timer)\r\nТаймер запускает действия в определенное время. Даже если смартфон не в сети. По умолчанию время начала отправляет 1 (HIGH), время остановки отправляет 0 (LOW). Вы можете изменить это поведение на любые другие значения. Вы можете изменить настройки Таймера в режиме «Запуска». В последней версии Android также есть улучшенный таймер в виджете Обработчик событий.\r\n\r\nC [Обработчиком событий (Eventor)](../#widgets-other-obrabotchik-sobytij-eventor) вы можете назначить несколько таймеров на один и тот же пин, отправить любую строку/число, выбирать дни и часовой пояс. Рекомендуется использовать виджет Обработчик событий поверх виджета Таймер. Однако виджет Таймер по-прежнему подходит и для простых событий таймера.\r\n\r\n**ПРИМЕЧАНИЕ:** Виджет таймера зависит от времени сервера, а не вашего телефона. Иногда время телефона может не соответствовать времени сервера.\r\n\r\n<img src=\"../images/timer.png\" style=\"width: 77px; height:80px\"/>\r\n\r\n<img src=\"../images/timer_edit.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n**ПРИМЕЧАНИЕ:** Виджет таймера зависит от времени сервера, а не вашего телефона. Иногда время телефона может не соответствовать времени сервера.\r\n\r\n**Пример кода:** [Таймер](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Timer/Timer.ino)\r\n\r\n### Джойстик (Joystick)\r\nУправление сервоприводом в 4 направлениях.\r\n\r\n#### Параметры:\r\n- режим РАЗДЕЛЬНО/ВМЕСТЕ (SPLIT/MERGE) - читаем [здесь](/#vidgety-obschie-nastroyki-vidgetov-razdelno-vmeste-split-merge)\r\nВиджеты ОБщие настройки виджетов РАЗДЕЛЬНО/ВМЕСТЕ (SPLIT/MERGE)\r\n\r\n- **Вращать при наклоне (Rotate on Tilt)**\r\n\r\nКогда этот параметр включен, Джойстик будет автоматически вращаться, если вы будете использовать смартфон в горизонтальной положении.\r\n\r\n- **Автовозрат (Auto-Return)**\r\n\r\nКогда этот парамтер выключен, ручка джойстика не вернется в центральное положение. Она останется там, где вы ее оставили.\r\n\r\n<img src=\"../images/joystick.png\" style=\"width: 77px; height:80px\"/>\r\n\r\n<img src=\"../images/joystick_edit.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n**Пример кода:** [Джойстик Две Оси](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/JoystickTwoAxis/JoystickTwoAxis.ino)\r\n\r\n### ЗеБРа (zeRGBa)\r\n\r\nЗеБРа - это обычный RGB контроллер (палитры цветов).\r\n\r\n#### Настройки:\r\n\r\n- **Раздельный (SPLIT)**:\r\nКаждый из параметров отправляется непосредственно на пин вашего оборудования (например, D7). Вам не нужно писать код.\r\n\r\n**ПРИМЕЧАНИЕ:** В этом режиме вы отправляете одновременно несколько команд из одного виджета, что может снизить производительность вашего оборудования.\r\n\r\n**ПРИМЕР:** у вас есть виджет ЗеБРа и для него было установлено значение D1, D2, D3, он отправит 3 команды через Интернет:\r\n\r\n```cpp\r\ndigitalWrite(1, r);\r\ndigitalWrite(2, g);\r\ndigitalWrite(3, b);\r\n```\r\n\r\n- **Объединенный (MERGE)**:\r\nКогда выбран этот режим, вы отправляете только 1 сообщение, состоящее из массива значений. Но в последствии вам нужно разобрать сообщение на своем оборудовании.\r\n\r\nЭтот режим можно использовать только с виртуальными пин-ами.\r\n\r\n**ПРИМЕР:** добавьте виджет ЗеБРа и установите его в Объединенный режим (MERGE). Выберите виртуальный контакт V1.\r\n\t\r\n```cpp\r\nBLYNK_WRITE(V1) // ЗеБРа назначен на V1\r\n{\r\n    // получим значение КРАСНОГО канала\r\n    int r = param[0].asInt();\r\n    // получим значение ЗЕЛЕНОГО канала\r\n    int g = param[1].asInt();\r\n    // получим значение СИНЕГО канала\r\n    int b = param[2].asInt();\r\n}\r\n```\r\n\r\n- **Отправка при Отжатии (Send On Release)** доступно для большинства виджетов контроллеров и позволяет уменьшить трафик данных на вашем оборудовании. Например, когда вы перемещаете виджет джойстика, команды непрерывно передаются на аппаратное устройство, во время одного движения джойстика вы можете отправлять десятки команд. Есть случаи, когда это необходимо, однако создание такой нагрузки может привести к сбросу оборудования. Мы рекомендуем включить функцию Отправка при Отжатии для большинства случаев, если вам не требуется мгновенная обратная связь. Эта опция включена по умолчанию.\r\n\r\n- **Интервал записи (Write interval)**\r\n\r\nПохоже на вышеуказанный вариант. Однако, позволяет вам передавать значения на ваше оборудование в через определенные интервалы времени. Например, установка интервала записи на 100 мс означает, что при перемещении ползунка на аппаратное обеспечение будет отправлено только 1 значение в течение 100 мс. Эта опция также используется для уменьшения трафика данных на ваше оборудовании.\r\n\r\n### Шаговое управление (Step Control)\r\nШаговое управление похоже на две кнопки, назначенные одному пин-у. Одна кнопка увеличивает ваше значение на установленный шаг, а другая уменьшает его. \r\nЭто очень полезно для случаев использования, когда вам нужно точно изменять ваши значения, но вы не можете достичь такой точности с помощью виджета Cлайдера.\r\n\r\n**Отправить шаг (Send Step)** опция позволяет вам отправлять на оборудование каждый шаг нвместо фактического значения виджета.\r\n\r\n**Зациклить значения (Loop value)** опция позволяет сбросить Шаговый виджет на начальное значение при достижении максимального.\r\n\r\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\r\n\r\n## Дисплеи \r\n### Отображение значений (Value Display)\r\nОтображает входящие данные с ваших датчиков или виртуальных пин-ов.\r\n\r\n<img src=\"../images/display.png\" style=\"width: 77px; height:80px\"/> \r\n\r\n<img src=\"../images/display_edit.png\" style=\"width: 200px; height:360px\"/>\r\n\r\nМожет работать в двух режимах:\r\n\r\n- режим PUSH (выберается в списке выбора частоты считывания);\r\n- режим частоты считываний;\r\n\r\nВ режиме PUSH вы обновляете значения виджета со стороны оборудования с помощью кода:\r\n \r\n```cpp\r\nBlynk.virtualWrite(V1, val); \r\n```\r\n\r\nВ этом режиме каждое сообщение, которое отправляет аппаратное устройство автоматически сохраняется на сервере. Режим PUSH не требует, чтобы приложение было онлайн или открыто.\r\n\r\nВ режиме частоты считывния вам необходимо выбрать интервал обновления данных, и приложение будет запускать события считывния с требуемой периодичностью.\r\nВаше приложение должно быть открыто и запущено для отправки запросов на оборудование. Вам не нужен код для аналоговых и цифровых выводов в даном случае. Однако для виртуальных выводов вам необходимо использовать следующий код:\r\n\r\n```cpp\r\n//вызывать из приложения\r\nBLYNK_READ(V1)\r\n{\r\n  //отправить в приложение\r\n  Blynk.virtualWrite(V1, val);\r\n}\r\n```\r\n\r\n#### Отображение значений на рабочем столе\r\n\r\nВы также можете добавить виджет отображение значения на рабочий стол Android. В этом случае отображение значений работает по протоколу HTTPS.\r\nИмейте в виду, что в режиме «Рабочий стол» отображение значений имеет несколько ограничений. Виджет будет обновлять свое состояние только один раз в 15 минут. Вы можете изменить это органичение через настройки виджета. Однако интервал обновления менее 15 минут не гарантируется.\r\nВы также можете изменить размер отображаемого значения на рабочем столе - просто сделайте длинный тап на виджете и измените его размер на необходимый.\r\n\r\n**Примечание:** Добавление виджета на главный экран стоит 100 энергии. Эта энергия не возвращяется при удалении виджета.\r\n\r\n**Примечание:** Виджеты рабочего стола для локальных серверов Blynk требуют открытия порта 8080.\r\n\r\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\r\n\r\n### Значение переменной (Labeled Value)\r\nОтображает входящие данные с ваших датчиков или виртуальных пин-ов. Это лучшая версия «Отображения значений», так как в этом виджете есть строка форматирования, поэтому вы можете форматировать входящее значение в любую нужную вам строку.\r\n\r\n<img src=\"../images/display.png\" style=\"width: 77px; height:80px\"/> \r\n\r\n<img src=\"../images/labeled_value_edit.png\" style=\"width: 200px; height:360px\"/>\r\n\r\nМожет работать в 2 режимах:\r\n\r\n- режим PUSH ( выберитается из списка частоты считывания);\r\n- режим частоты считывания;\r\n\r\nВ режиме PUSH вы должны обновлять отображение значений на аппаратной устройстве с помощью кода:\r\n \r\n```cpp\r\nBlynk.virtualWrite(V1, val); \r\n```\r\n\r\nВ этом режиме каждое сообщение, которое аппаратное устройств отправляет на сервер, автоматически сохраняется на сервере. Режим PUSH не требует, чтобы приложение было онлайн или запущено.\r\n\r\nВ режиме частоты считывания вам нужно выбрать интервал обновления, и приложение будет запускать события с требуемым интервалом. Ваше приложение должно быть открыто и запущено для отправки запросов на оборудование. В данном случае вам не нужен код для аналоговых и цифровых пин-ов. Однако для виртуальных пин-ов вам необходимо использовать следующий код:\r\n\r\n```cpp\r\n//вызываем из приложения\r\nBLYNK_READ(V1)\r\n{\r\n  //отправляем в приложение\r\n  Blynk.virtualWrite(V1, val);\r\n}\r\n```\r\n\r\n#### Параметры форматирования\r\n\r\nПредположим, ваш датчик отправляет число 12.6789 в приложение Blynk.\r\nПоддерживаются следующие параметры форматирования:\r\n\r\n```/pin/``` -  отображает значение без форматирования (12.6789)\r\n\r\n```/pin./``` -  отображает значение без десятичной части (13)\r\n\r\n```/pin.#/``` -  отображает значение с одним десятичным знаком (12.7)\r\n\r\n```/pin.##/``` - отображает значение с двумя десятичными знаками (12.68)\r\n\r\n<img src=\"../images/labeled_value_format_edit.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n#### Значение переменной на главном экране\r\n\r\nВы также можете добавить значение переменной на рабочий стол Android. В этом случае значение переменной работает через HTTPS протокол. Имейте в виду, что в режиме «Рабочий стол» значение переменной имеет некторые ограничения. Значение переменной будет обновлять свое состояние только один раз в 15 минут. Вы можете изменить этот параметр через настройки виджета. Однако интервал обновления менее 15 минут не гарантируется. Вы также можете изменить размер виджета Значение переменной на рабочем столе - просто сделайте длинный тап на виджете и измените его размер на необходимый.\r\n\r\n**Примечание:** Добавление виджета на домашний экран стоит 100 энергии. Эта энергия не восстанавливается.\r\n\r\n**Примечание:** Виджеты главного экрана для локальных серверов Blynk требуют открытия порта 8080.\r\n\r\n**Пример кода:** [Светодиод](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\r\n\r\n### Светодиод (LED)\r\n\r\nПростой светодиод для индикации. Вам нужно отправить 0, чтобы выключить светодиод. И 255 для того, чтобы включить светодиод.\r\nИли просто используйте Blynk API, как описано ниже:\r\n\r\n```cpp\r\n//регистрируемся на виртуальном пине 1\r\nWidgetLED led1(V1);\r\nled1.off();\r\nled1.on();\r\n```\r\n    \r\nВсе значения от 0 до 255 изменяют яркость светодиода:\r\n\r\n```cpp\r\nWidgetLED led2(V2);\r\n//установить яркость светодиода на 50%.\r\nled2.setValue(127); \r\n```\r\n\r\n Вы также можете изменить цвет светодиода с помощью кода:\r\n\r\n```cpp\r\n//#D3435C - Красный в RGB формате\r\nBlynk.setProperty(V1, \"color\", \"#D3435C\"); \r\n```\r\n\r\n<img src=\"../images/led.png\" style=\"width: 77px; height:80px\"/>\r\n\r\n#### Светодиод на рабочем столе\r\n\r\nВы можете добавить виджет светодиод на рабочий стол Android. В этом случае светодиод работает через протокол HTTPS. Имейте в виду, что в режиме «Рабочий стол» виджет светодиода имеет некоторые ограничения. Светодиод будет обновлять свое состояние только один раз в 15 минут. Вы можете изменить этот интервал через настройки виджета. Однако интервал обновления менее 15 минут не гарантируется.\r\n\r\n**Примечание:** Добавление виджета на рабочий стол стоит 100 энергии. Эта энергия не возвращается при удалении виджета.\r\n\r\n**Примечание:** Виджеты рабочего стола для локальных серверов Blynk требуют открыть порт 8080.\r\n\r\n**Пример кода:** [Диод](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LED/LED_Blink/LED_Blink.ino)\r\n\r\n### Указатель (Gauge)\r\n\r\nОтличный визуальный способ отображения входящих числовых значений.\r\n\r\n<img src=\"../images/gauge.png\" style=\"width: 77px; height:80px\"/>\r\n\r\n<img src=\"../images/gauge_edit.png\" style=\"width: 200px; height:360px\"/>\r\n\r\nМожет работать в 2 режимах:\r\n\r\n- режим PUSH (выберается в списке выбора частоты считывания);\r\n- режим частоты считываний;\r\n\r\nВ режиме PUSH вы обновляете значения указателя со стороны оборудования с помощью кода:\r\n \r\n```cpp\r\nBlynk.virtualWrite(V1, val); \r\n```\r\n\r\nВ этом режиме каждое сообщение, которое отправляет аппаратное устройство автоматически сохраняется на сервере. Режим PUSH не требует, чтобы приложение было онлайн или открыто.\r\n\r\nВ режиме частоты считывния вам необходимо выбрать интервал обновления данных, и приложение будет запускать события считывния с требуемым периодичностью.\r\nВаше приложение должно быть открыто и запущено для отправки запросов на оборудование. Вам не нужен код для аналоговых и цифровых выводов в даном случае. Однако для виртуальных выводов вам необходимо использовать следующий код:\r\n\r\n```cpp\r\n//вызывать из приложения\r\nBLYNK_READ(V1)\r\n{\r\n  //отправить в приложение\r\n  Blynk.virtualWrite(V1, val);\r\n}\r\n```\r\n\r\n#### Параметры форматирования\r\n\r\nУказатель также имеет поле «Label» (Метка), которое позволяет использовать форматирование.\r\nПредположим, ваш датчик отправляет число 12.6789 в приложение Blynk.\r\nПоддерживаются следующие параметры форматирования:\r\n\r\n```/pin/``` - отображает значение без форматирования (12.6789)\r\n\r\n```/pin./``` - отображает значение без десятичной части (13)\r\n\r\n```/pin.#/``` - отображает значение с одним десятичным знаком (12.7)\r\n\r\n```/pin.##/``` - отображает значение с двумя десятичными знаками (12.68)\r\n\r\n#### Другие опции\r\n\r\nВы также можете изменить метку прибора с помощью:\r\n\r\n```cpp\r\nBlynk.setProperty(V1, \"label\", \"Мое значение метки\");\r\n```\r\n\r\nили изменить цвет (кодировка RGB): \r\n\r\n```cpp\r\n//#D3435C - Красный цвет\r\nBlynk.setProperty(V1, \"color\", \"#D3435C\");\r\n```\r\n\r\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\r\n\r\n### ЖК дисплей (LCD)\r\n\r\nЭто обычный ЖК-дисплей 16x2, \"сделанный\" на нашем секретном предприятии в Китае.\r\nВиджет может работать в двух режимах:\r\n\r\n- Простой (Simple)\r\n- Расширенный (Advanced)\r\n\r\n#### Простой режим (Simple)\r\n\r\nВ простом режиме ваш ЖК-виджет работает как обычный виджет с частотой чтения.\r\n\r\nВ режиме частоты считывания вам нужно выбрать интервал обновления данных, и приложение будет запускать события с требуемым интервалом. Ваше приложение должно быть открыто и запущено для отправки запросов на оборудование. В данном случае вам не нужен код для аналоговых и цифровых пин-ов. Однако для виртуальных пин-ов вам необходимо использовать следующий код:\r\n\r\n```cpp\r\n//вызываем из приложения\r\nBLYNK_READ(V1)\r\n{\r\n  //отправляем в приложение\r\n  Blynk.virtualWrite(V1, val);\r\n}\r\n```\r\n\r\nВ простом режиме ЖК-дисплей также поддерживает параметры форматирования.\r\n\r\n#### Параметры форматирования\r\n\r\nПредположим, ваш датчик отправляет число 12.6789 в приложение Blynk.\r\nПоддерживаются следующие параметры форматирования:\r\n\r\n```/pin/``` -  отображает значение без форматирования (12.6789)\r\n\r\n```/pin./``` -  отображает значение без десятичной части (13)\r\n\r\n```/pin.#/``` -  отображает значение с одним десятичным знаком (12.7)\r\n\r\n```/pin.##/``` - отображает значение с двумя десятичными знаками (12.68)\r\n\r\n<img src=\"../images/lcd_format_edit.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n**Пример кода:** [ЖК дисплей простой режим - PUSH](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_SimpleModePushing/LCD_SimpleModePushing.ino)\r\n\r\n**Пример кода:** [ЖК дисплей простой режим - 1 сек](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_SimpleModeReading/LCD_SimpleModeReading.ino)\r\n\r\n#### Расширенный режим (Advanced)\r\n\r\nРасширенный режим предназначен для опытных пользователей. Позволяет использовать специальные команды для управления ЖК-дисплеем.\r\n\r\n#### Команды\r\n\r\nИнициируем переменную ЖК-дисплея: \r\n\r\n```cpp\r\nWidgetLCD lcd(V1);\r\n```\r\n\r\nОтправим сообщение: \r\n\r\n```cpp\r\nlcd.print(x, y, \"Ваше сообщение\");\r\n```\r\n\r\nГде ```x``` - позиция символа (0-15), ``` y``` - номер строки (0 или 1),\r\n\r\nОчистка ЖК-дисплея:\r\n\r\n```cpp\r\nlcd.clear();\r\n```\r\n\r\n<img src=\"../images/lcd.png\" style=\"width: 77px; height:80px\"/>\r\n\r\n<img src=\"../images/lcd_edit.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n**Пример кода:** [ЖК-дисплей расширенный режим](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_AdvancedMode/LCD_AdvancedMode.ino)\r\n\r\n### Диаграмма (SuperChart)\r\n\r\nДиаграмма используется для живой визуализации и хранения данных. Вы можете использовать виджет для логирования данных датчиков,  бинарных событий и многого другого.\r\n\r\nЧтобы использовать виджет Диаграмма, вам нужно будет передать данные с оборудования с желаемым интервалом, используя таймеры.\r\n[Здесь приведен](https://examples.blynk.cc/?board=ESP8266&shield=ESP8266%20WiFi&example=GettingStarted%2FPushData) базовый пример передачи данных.\r\n\r\n#### Взаимодействие:\r\n- **Переключение между режимами текущий и временной** Нажмите диапазоны времени в нижней части виджета, чтобы изменить масштаб Диаграммы по времени.\r\n\r\n- **Тап по легенде графиков**  показать или скрыть поток данных.\r\n\r\n- **Долгий тап на графике** покажет метку времени и соответствующие значения.\r\n\r\n<img src=\"../images/chart/tapnhold_charts.png\" style=\"width: 300px; height:280px\"/>\r\n\r\n- **Быстро проведите пальцем влево или вправо, чтобы увидеть предыдущие данные** впоследствии вы можете прокручивать данные назад и вперед в пределах заданного временного диапазона.\r\n\r\n<img src=\"../images/chart/swipe_charts.png\" style=\"width: 300px; height:280px\"/>\r\n\r\n- **Полноэкранный режим** нажмите эту кнопку, чтобы открыть полноэкранный режим в альбомной ориентации.\r\n\r\n<img src=\"../images/chart/fullscreen_charts.png\" style=\"width: 300px; height:280px\"/>\r\n\r\nЧтобы выйти из режима полного экрана, просто поверните телефон обратно в портретный режим. График должен вращаться автоматически. В полноэкранном режиме вы увидите X (время) и несколько шкал Y.\r\nПолноэкранный режим можно отключить в настройках виджета.\r\n\r\n- **Кнопка меню**\r\n Кнопка меню откроет дополнительные функции:\r\n  - Экспорт в CSV\r\n  - Стереть данные на сервере\r\n\r\n<img src=\"../images/chart/menu_charts.png\" style=\"width: 300px; height:280px\"/>\r\n\r\n#### Настройки диаграммы:\r\n\r\n- **Заголовок диаграммы (Chart Title)** общее наименование диаграммы.\r\n\r\n- **Размер шрифта заголовка (Title Font Size)** выберите из 3 размеров шрифта.\r\n\r\n- **Выравнивание заголовка (Title Alignment)** выберите выравнивание заголовка диаграммы. Этот параметр влияет на положение заголовка и легенды в виджете.\r\n\r\n- **Показать ось X (время) (Show x-axis (time))** выберите настройку, если хотите показать шкалу времени внизу графика.\r\n\r\n- **Автоматическое масштабирование для всех потоков данных (Override Auto Scaling for All Datastreams)** отключение этой опции позволит выполнить ручную настройку для оси Y (см. ниже).\r\n\r\n- **Выбор масштаба времени (Time ranges picker)** Позволяет выбрать необходимые периоды (`15m`,` 30m`, `1h`,` 3h`, ...) и разрешение для вашего графика. Разрешение определяет, насколько подробные ваши данные. Прямо сейчас график поддерживает два типа разрешения: `standard` и `high`. Разрешение также зависит от выбранного периода. Например, `standard` разрешение для `1d` означает, что вы будете получать 24 значения в день (одно в час), а при `high` разрешении вы будете получать за` 1d` 1440 значений в день (одно в минуту).\r\n\r\n- **Потоки данных (Datastreams)** добавить потоки данных (см. ниже, как настроить потоки данных).\r\n\r\n#### Настройки потоков данных\r\n\r\nВиджет поддерживает до 4 потоков данных.\r\nНажмите значок настроек потоков данных, чтобы открыть настройки.\r\n\r\n<img src=\"../images/chart/datastream_charts.png\"/>\r\n\r\n**Дизайн (Design)** выберите доступные типы диаграмм:\r\n - Линейная (Line)\r\n - С областями (Area)\r\n - Гистограмма (Bar)\r\n - Бинарная (Binary) (приведение данных к двоичному виду)\r\n\r\n**Цвет (Color)** выберите сплошные цвета или градиенты.\r\n\r\n**Источник и ввод (Source and input)** - Вы можете использовать три типа источника данных:\r\n\r\n**1. Виртуальный пин (Virtual Pin)** - выберите желаемое устройство и виртуальный пин для получения данных.\r\n\r\n**2. Теги (Tags)** - диаграмма может агрегировать данные с нескольких устройств, используя встроенные функции агрегирования.\r\nНапример, если у вас есть 10 датчиков температуры, посылающих температуру с заданным интервалом, Вы можете отобразить среднее значение от 10 датчиков в виджете.\r\n\r\nИспользование тегов:\r\n\r\n- **[Добавить Тэг](http://docs.blynk.cc/#blynk-main-operations-control-of-multiple-devices-tags)** на каждое устройство, с которого вы хотите агрегировать данные. Это можно сделать в настройках проекта Blynk.\r\n- **Отправить данные в виртуальный пин (Push data to the same Virtual Pin)** на каждое устройство. (т.е. ```Blynk.virtualWrite (V0, temperature);```)\r\n- **Выберите тег в качестве источника (Choose Tag as a source)** в виджете Диаграмма и используйте пин, куда поступают данные (т.е. V0)\r\n\r\n**Добступные функции:** \r\n- `SUM` будет суммировать все входящие значения в указанный виртуальный пин со всех устройств, помеченные выбранным тегом\r\n- `AVG` будет вычислять среднее значение\r\n- `MED` найдет среднее значение\r\n- `MIN` будет вычислять минимальное значение\r\n- `MAX` будет вычислять максимальное значение\r\n\r\n**ВАЖНО: Теги не работают в режиме реального времени.**\r\n\r\n**3. [Выбор устройства (Device Selector)](https://github.com/blynkkk/blynkkk.github.io/tree/master/mobile/ru/ \tdevice_selector.md)**\r\nЕсли вы добавите виджет Выбор устройства в свой проект, вы можете использовать его в качестве источника данных для Диаграммы.\r\nВ том случае, когда вы меняете устройство, диаграмма будет автоматически обновляться.\r\n\r\n#### Настройки оси Y (Y-Axis Settings)\r\nCуществует 4 режима масштабирования данных вдоль оси Y, активируется после отключения общей настройки виджета \"Автоматическое масштабирование для всех потоков данных (Override Auto Scaling for All Datastreams)\".\r\n\r\n**1. Авто (Auto)**\r\nДанные будут автоматически масштабироваться на основе минимальных и максимальных значений заданного периода времени. Это лучший вариант для начинающих.\r\n\r\n**2. Минимальный/Максимальный (Min/Max)**\r\nКогда выбран этот режим, шкала Y будет установлена на выбранные вами границы значений.\r\nНапример, если ваше оборудование отправляет данные со значениями от -100 до 100, вы можете установить эти границы и данные графика будут отображены полностью.\r\n\r\n<img src=\"../images/chart/yScale_manual_charts.png\" style=\"width: 300px; height:212\"/>\r\n\r\nВы также можете визуализировать данные в другом диапазоне. Допустим, входящие данные имеют значения в диапазоне 0-55, но вы хотели бы видеть только значения в диапазоне 30-50. Вы можете настроить  диапазон, но если значения не соответствуют заданному масштабу оси Y, диаграмма будет обрезана.\r\n\r\n**3. Процент от высоты (% of Height)**\r\nЭта опция позволяет автоматически масштабировать входящие данные на виджете и размещать их так, как вы хотите. \r\nВ этом режиме вы устанавливаете процент высоты виджета на экране от 0% до 100%.\r\n\r\n<img src=\"../images/chart/yheight2_charts.png\" style=\"width: 300px; height:212px\"/>\r\n\r\nЕсли вы установите диапазон 0-100%, это будет полная автоматическая шкала. Независимо от того, в каком диапазоне поступают данные, он всегда будет масштабирован по всей высоте виджета.\r\n\r\nЕсли вы установите его на 0-25%, то график будет отображаться только на 1/4 высоты виджета.\r\n\r\n<img src=\"../images/chart/yheight2_manual_charts.png\" style=\"width: 300px; height:212px\"/>\r\n\r\nЭтот параметр очень полезен для **Бинарной диаграммы** или для визуализации нескольких потоков данных на одной и той же диаграмме разными способами.\r\n\r\n<img src=\"../images/chart/binary_charts.png\" style=\"width: 300px; height:280px\"/>\r\n\r\n**4. Дельта (Delta)**\r\nПока данные остаются в пределах заданного значения дельты, график будет автоматически масштабироваться в этом диапазоне.\r\nЕсли дельта превышает диапазон, график автоматически масштабируется до минимальных/максимальных значений указанного периода.\r\n\r\n**Суффикс (Suffix)**\r\nЗдесь вы можете указать суффикс, который будет отображаться со значениями во время длительного тап на графике.\r\n\r\n**Разрядность (Decimals)**\r\nОпределяет формат числовых значений, когда вы нажимаете и удерживаете палец на графике. Возможные варианты: #, #.#, #.##, и т.д.\r\n\r\n**Соединиить отсуствующие точки графика (Connect Missing Data Points)**\r\nЕсли этот переключатель включен, то Диаграмма соединит все точки, даже если данные частично отсуствуют.\r\n\r\n<img src=\"../images/chart/datapoints1_charts.png\" style=\"width: 300px; height:280px\"/>\r\n\r\nЕсли для него установлено значение «ВЫКЛ», то вы увидите пропуски в случае отсутствия данных.\r\n\r\n<img src=\"../images/chart/datapoints2_charts.png\" style=\"width: 300px; height:280px\"/>\r\n\r\n**Настройки Бинарной диаграммы (Binary Chart Settings)**\r\nЭтот тип диаграммы полезен для построения двоичных данных, например, когда устройство было включено или выключено, или когда было обнаружено движение или когда был достигнут определенный порог значений.\r\n\r\nВам необходимо указать точку **Перехода (FLIP)**, которая будет точкой, в которой входящие данные будут принимать состояние `ИСТИНА (TRUE)` или `ЛОЖЬ (FALSE)`.\r\n\r\nНапример, вы отправляете данные в диапазоне от 0 до 1023. Если вы установите `512` в качестве точки **Перехода (FLIP)**, то все, что выше `512` (исключая 512), будет записано как `ИСТИНА (TRUE)`, любое значение ниже `512` (включая 512) будет `ЛОЖЬ (FALSE)`.\r\n\r\nДругой пример: если вы отправляете `0 и 1` и устанавливаете `0` в качестве точки **Перехода FLIP**, то `1` будет `ИСТИНА`, а `0` будет `ЛОЖЬ`.\r\n\r\n**Маркеры состояния (State Labels):**\r\nЗдесь вы можете указать, как `ИСТИНА/ЛОЖЬ` должны отображаться на графике когда вы нажимаете и удерживаете палец.\r\nНапример, вы можете установить значение `ИСТИНА` как `Оборудование ВКЛ`, `ЛОЖЬ` как `Оборудование ВЫКЛ`.\r\n\r\n### Терминал (Terminal)\r\n\r\nОтображает данные с вашего оборудования. Позволяет отправить любую строку с вашего оборудования. Терминал всегда хранит последние 25 сообщений, которые ваше оборудование отправило в Blynk. Этот ограничение может быть увеличено в настройках локального сервера с помощью параметра ```terminal.strings.pool.size```.\r\n\r\nС этим виджетом Вы можете использовать специальные команды:\r\n\r\n```cpp\r\n// Печатает значения, как Serial.print\r\nterminal.print();   \r\n// Печатает значения, как Serial.println()\r\nterminal.println();\r\n// Записать необработанные данные в буффер\r\nterminal.write();\r\n// Убедится, что все данные были отправлены с устройства в терминал\r\nterminal.flush();\r\n// Стереть все данные в терминале\r\nterminal.clear();\r\n```\r\n\r\n<img src=\"../images/terminal.png\" style=\"width: 77px; height:80px\"/>\r\n\r\n<img src=\"../images/terminal_edit.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n**Пример кода:** [Терминал](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Terminal/Terminal.ino)\r\n\r\n\r\n### Видео трансляция (Video Streaming)\r\n\r\nПростой виджет, который позволяет отображать прямой эфир и потокове видео. Виджет поддерживает протоколы RTSP (RP, SDP), HTTP/S прогрессивной потоковой передачи, HTTP/S прямого эфира. Для получения дополнительной информации, пожалуйста ознакомтесь с [официальной документацией Android](https://developer.android.com/guide/appendix/media-formats.html).\r\n\r\nНа данный момент команда Blynk не предоставляет потоковые серверы. Таким образом, вы можете осуществлять потоковую передачу непосредственно с ваше камеры или использовать сторонние сервисы, а также запустить собственны потоковый сервер (например, на оборудовании Raspberry).\r\n\r\nВы можете остановить/запустить видео поток, нажав на сам виджет.\r\n\r\nВы можете изменить URL-адрес видео потока с аппаратного устройства при помощи кода:\r\n\r\n```cpp\r\nBlynk.setProperty(V1, \"url\", \"http://my_new_video_url\");\r\n```\r\n\r\n### Индикатор уровня (Level Display)\r\n\r\nОтображает входящие данные с ваших датчиков или виртуальных пин-ов. Отображение уровня очень похоже на индикатор выполнения процесса, это очень красивый и причудливый вид для индикации «выполненных» событий, например «уровня заряда батареи».\r\nВы можете обновить отображение значения с аппаратной стороны с помощью кода:\r\n \r\n```cpp\r\nBlynk.virtualWrite(V1, val); \r\n```\r\n\r\nКаждое сообщение, которое аппаратное устройство отправляет на сервер, автоматически сохраняется на сервере.\r\nРежим PUSH не требует, чтобы приложение было онлайн или запущено.\r\n\r\n**Пример кода:** [Пример PUSH](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushData/PushData.ino)\r\n\r\n## Уведомления (Notifications)\r\n### Твиттер (Twitter)\r\n\r\nВиджет Твиттер соединяет вашу учетную запись сети Twitter с Blynk и позволяет отправлять \"твиты\" с вашего оборудования.\r\n\r\n<img src=\"../images/TwitterON.png\" style=\"width: 77px; height:80px\"/>\r\n\r\nПример кода:\r\n```cpp\r\nBlynk.tweet(\"Привет, Blynk-еры! Мой Arduino может слать твиты!\");\r\n```\r\n\r\nОграничения :\r\n\r\n- нельзя отправлять 2 твита с одним и тем же сообщением (это политика Твиттера)\r\n- разрешен только 1 твит за 5 секунд\r\n\r\n### Кодировка в Твиттере\r\n\r\nБиблиотека обрабатывает все строки в кодировке UTF-8. Если вы столкнулись с проблемами, попробуйте напечатать ваше сообщение на последовательный порт и проверить, работает ли оно (COM терминал должен быть настроен на кодировку UTF-8). Если не работает, вам следует проверить поддержку UTF-8 вашего компилятора.\r\nЕсли работает, но ваше сообщение обрезано - вам нужно увеличить длины сообщения (все символы UTF-8 потребляют как минимум вдвое больше байт информации).\r\n\r\n### Увеличение лимита длины сообщения\r\n\r\n Вы можете увеличить максимальную длину сообщения, поместив (до включения Blynk) в верхнюю часть своего кода строку:\r\n```cpp\r\n#define BLYNK_MAX_SENDBYTES 256 // По умолчанию 128 байт\r\n```\r\n\r\n**Пример кода:** [Твиттер](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Twitter/Twitter.ino)\r\n\r\n\r\n### Электронная почта (Email)\r\n\r\nВиджет электронной почты позволяет отправлять электронные письма с вашего оборудования на любой адрес.\r\n\r\nПример кода:\r\n```cpp\r\nBlynk.email(\"my_email@example.com\", \"Тема\", \"Текст вашего сообщения\");\r\n```\r\n\r\nКод содержит первое поле ```to```. С помощью этого поля вы можете определить получателей электронной почты в приложении.\r\nВы можете пропустить поле ```to```, если хотите отправить электронное письмо на адрес электронной почты используемый для входа в приложение Blynk:\r\n\r\n ```cpp\r\n Blynk.email(\"Тема\", \"Текст вашего сообщения\");\r\n ```\r\n\r\nВы можете отправить электронное писбом в форматах либо ```text/html```, либо ```text/plain``` (помните что некоторые клиенты не поддерживают ```text/html```).\r\nВы можете изменить формат содержимого электронного письма в настройках виджета.\r\n\r\nДополнительно в письме вы можете использовать заполнители/переменные ```{DEVICE_NAME}```, ```{DEVICE_OWNER_EMAIL}``` и ```{VENDOR_EMAIL}``` (для локального сервера) в полях ```to``` (кому),``` subject``` (тема) и ```body``` (текст сообщения):\r\n\r\n```cpp\r\nBlynk.email(\"{DEVICE_OWNER_EMAIL}\", \"{DEVICE_NAME} : Тревога\", \"Ваше устройство {DEVICE_NAME} имеет критическую ошибку!\");\r\n```\r\n\r\n<img src=\"../images/mail.png\" style=\"width: 77px; height:80px\"/>\r\n\r\n**Недостатки:**\r\n\r\n- Максимально допустимые ограничения (почта + тема + длина сообщения) = 120 символов. Однако вы можете увеличить этот лимит при необходимости добавив ```#define BLYNK_MAX_SENDBYTES XXX``` к вашему коду. Где ```XXX``` - это максимальная длина вашего письма в символах.\r\nНапример, для ESP вы можете установить максимальную длину 1200 символов ```#define BLYNK_MAX_SENDBYTES 1200```. Параметр  ```#define BLYNK_MAX_SENDBYTES 1200``` должен быть опредлен в коде до включения Blynk.\r\n- Разрешено отправлять 1 электронное письмо в течение 5 секунд;\r\n- Если вы используете Gmail сервис (Google), вы ограничены 500 письмами в день. Другие провайдеры могут иметь аналогичные ограничения, поэтому, пожалуйста, будьте внимательны;\r\n- Пользователи Blynk сервера ограничены 100 сообщениями в день;\r\n\r\n### Кодировка в электронной почте\r\n\r\nБиблиотека обрабатывает все строки в кодировке UTF-8. Если у вас возникли проблемы, попробуйте напечатать ваше сообщение в терминал COM порта и посмотрите на результат (терминал должен быть настроен на кодировку UTF-8). Если не работает, возможно, вам следует также прочитать о поддержке кодировок вашего компилятора. \r\nЕсли работает, но ваше сообщение обрезано - вам нужно увеличить ограничение длины сообщения (т.к. все символы кодировки UTF-8 потребляют как минимум вдвое больше байт информации если символы не Латинские).\r\n\r\n### Увеличение лимита длины сообщения\r\n\r\nВы можете увеличить максимальную длину сообщения, поместив в верхнюю часть своего кода строку (до опредления Blynk):\r\n```cpp\r\n#define BLYNK_MAX_SENDBYTES 256 // По умолчанию 128 байт\r\n```\r\n\r\n**Пример кода:** [Электронная почта](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Email/Email.ino) \r\n\r\n\r\n### Всплывающие уведомления (Push Notifications)\r\n\r\nВиджет Push-уведомлений позволяет отправлять уведомления с вашего оборудования на ваше Android/iOS устройство. В настоящее время он также содержит три дополнительные опции:\r\n\r\n- **Уведомлять, когда оборудование отключено** (Notify when hardware offline) - вы получите push-уведомление, если ваше оборудование отключилось.\r\n- **Автономный период игнорирования** (Offline Ignore Period) - определяет, как долго оборудование может находиться в режиме ожидания (после того, как оно отключилось) перед отправкой уведомления.\r\n\r\nВ случае превышения периода ожидания будет отправлено уведомление «Аппаратное отключение». Вы не получите уведомление, если оборудование переподключится в течение указанного периода.\r\n\r\n- **Приоритет** (Priority) - высокий (high) приоритет дает больше шансов, что ваше сообщение будет доставлено без задержек. См. более подробное объяснение [здесь](https://developers.google.com/cloud-messaging/concept-options#setting-the-priority-of-a-message).\r\n\r\n**ПРЕДУПРЕЖДЕНИЕ**: высокий приоритет способствует большей разрядке батареи, по сравнению с обычными приоритетом уведомлений.\r\n\r\n<img src=\"../images/push.png\" style=\"width: 77px; height:80px\"/>\r\n\r\nПример кода:\r\n\r\n```cpp\r\nBlynk.notify(\"Привет, Blynk-еры! Мое оборудование может отправлять уведомления!\");\r\n```\r\n\r\nВы также можете использовать переменные/заполнители для имени устройства, который будет заменен с сервера именем вашего устройства:\r\n\r\n```cpp\r\nBlynk.notify(\"Привет, Blynk-еры! Мой {DEVICE_NAME} может отправлять уведомления!\");\r\n```\r\n\r\nОграничения:\r\n\r\n- Максимально допустимая длина уведомления составляет 120 символов;\r\n- Каждое устройство может отправлять только 1 уведомление каждые 5 секунд;\r\n\r\n### Кодировка всплывающих уведомлений\r\n\r\nБиблиотека обрабатывает все строки как в кодировке UTF-8. Если вы столкнулись с проблемами, попробуйте отправить ваше сообщение на последовательный порт и посмотреть, работает ли оно (терминал должен быть настроен на кодировку UTF-8). Если так не работает, возможно, вам следует прочитать о поддержке кодировки UTF-8 вашего компилятора.\r\nЕсли работает, но ваше сообщение урезано - вам необходимо увеличить ограничение длины сообщения (все символы UTF-8 потребляют как минимум вдвое больше байт информации).\r\n\r\n### Увеличение лимита длины уведомления\r\n\r\nВы можете увеличить максимальную длину сообщения, поместив строку (до включения Blynk) в верхнюю часть своего кода:\r\n\r\n```cpp\r\n#define BLYNK_MAX_SENDBYTES 256 // По умолчанию 128 байт\r\n```\r\n\r\n**Пример кода:** [Всплывающие уведомления](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/PushNotification/PushNotification_Button/PushNotification_Button.ino)\r\n\r\n## Интерфейсы\r\n### Вкладки (Tabs)\r\n\r\nЕдинственная цель виджета Вкладки - расширить пространство вашего проекта.\r\nЧтобы редактировать виджет Вкладок - просто нажмите на выбранную вкладку.\r\nВы можете перетаскивать виджеты между вкладками. \r\nИз списка можно удалить только последнюю вкладку: чтобы удалить ее, проведите пальцем влево по ее названию в экране настроек виджета.\r\n \r\nМаксимальное количество вкладок на iOS составляет 4. \r\n\r\nМаксимальное количество вкладок на Android - 10. \r\n \r\nОставайтесь с нами для предстоящего редизайна виджета вкладок! \r\n\r\n<img src=\"../images/tabs_settings.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n### Меню (Menu)\r\n\r\nВиджет Меню позволяет отправлять команды на ваше оборудование на основе выборного списка, сделанного вами в пользовательском интерфейсе. Меню отправляет индекс выбранного элемента спика, а не саму строку. Отправляемый индекс начинается с 1. Он работает так же, как типовой элемент \"Комбинированный список\" ([ComboBox](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA)).\r\n\r\n<img src=\"../images/menu_edit.png\" style=\"width: 200px; height:360px\"/>\r\n\r\nПример кода:\r\n\r\n```cpp\r\nBLYNK_WRITE {\r\n  switch (param.asInt()) {\r\n    case 1: { // Пункт 1\r\n      Serial.println(\"Выбран Пункт 1\");\r\n      break;\r\n    }\r\n    case 2: { // Пункт 2\r\n      Serial.println(\"Выбран Пункт 2\");\r\n      break;\r\n    }    \r\n  }\r\n}\r\n```\r\n\r\nВы также можете назначить пункты меню со стороны оборудования с помощью кода:\r\n \r\n```cpp\r\nBlynk.setProperty(V1, \"labels\", \"label 1\", \"label 2\", \"label 3\");\r\n```\r\n\r\n**Пример кода:** [Меню](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Menu/Menu.ino)\r\n\r\n## Ввод времени (Time Input)\r\n\r\nВиджет Ввода времени позволяет вам выбрать время начала/окончания, день недели, часовой пояс, значения в формате до полудня/после полудня и отправить их на ваше оборудование. В настоящее время поддерживаются следующие форматы: ```ЧЧ:ММ``` и ```ЧЧ:ММ AM/PM```.\r\n\r\nАппаратное устройстов будет отсчитывать время пользовательского интерфейса в виде секунд дня (```3600 * часов + 60 * минут```) для запуска/остановки времения. Время, которое виджет отправляет оборудованию, является локальным временем пользователя.\r\nИндексы по выбранных дней:\r\n\r\n```\r\nПонедельник - 1\r\nВторник - 2\r\n...\r\nСуббота - 6\r\nВоскресенье - 7\r\n```\r\nВы также можете изменить состояние виджета в интерфейсе пользователя. Смотрите ниже примеры кода.\r\n\r\n**Пример кода:** [Простой Ввод времени для времени начала](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/SimpleTimeInput/SimpleTimeInput.ino)\r\n\r\n**Пример кода:** [Расширенный Ввод времени](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/AdvancedTimeInput/AdvancedTimeInput.ino)\r\n\r\n**Пример кода:** [Обновление Ввода времени в пользовательском интерфейсе](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/UpdateTimeInputState/UpdateTimeInputState.ino)\r\n\r\n\r\n### Карта (Map)\r\n\r\nВиджет Карты позволяет устанавливать точки/флажки на карте со стороны оборудования. Это очень полезный виджет, если у вас есть несколько устройств, и вы хотите отслеживать их позиции на карте.\r\n\r\nВы можете отправить точку на карту с помощью обычной команды виртуальной записи:\r\n\r\n```cpp\r\nBlynk.virtualWrite(V1, pointIndex, lat, lon, \"Название\");\r\n```\r\n\r\nМы также создали оболочку, чтобы вы могли упростить использование виджета Карты.\r\nВы можете изменить метки флажков на оборудовании с помощью кода:\r\n\r\n```cpp\r\nWidgetMap myMap(V1);\r\n...\r\nint index = 1;\r\nfloat lat = 51.5074;\r\nfloat lon = 0.1278;\r\nmyMap.location(index, lat, lon, \"Название\");\r\n```\r\n\r\nИспользование уникальных ```index``` позволяет вам переопределить существующее значение точки.\r\n\r\n**Пример кода:** [Базовый пример Карты](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Map/Map.ino)\r\n\r\n\r\n### Таблица (Table)\r\n\r\nТабличный виджет удобен, когда вам нужно структурировать аналогичные данные в пределах одного графического элемента. Работает как обычная таблица.\r\n\r\nВы можете добавить строку в таблицу с помощью кода:\r\n\r\n```\r\nBlynk.virtualWrite(V1, \"add\", id, \"Имя\", \"Значение\");\r\n```\r\n\r\nВы можете обновить строку в таблице с помощью кода:\r\n\r\n```\r\nBlynk.virtualWrite(V1, \"update\", id, \"Новое имя\", \"Новое значение\");\r\n```\r\n\r\nЧтобы выделить любой элемент в таблице, используйте его идентификатор:\r\n\r\n```\r\nBlynk.virtualWrite(V1, \"pick\", 0);\r\n```\r\n\r\nЧтобы выбрать/отменить выбор (сделать значок зеленым/серым) элемент в таблице, используйте его идентификатор:\r\n\r\n```\r\nBlynk.virtualWrite(V1, \"select\", 0);\r\nBlynk.virtualWrite(V1, \"deselect\", 0);\r\n```\r\n\r\n Чтобы очистить таблицу используйте код:\r\n\r\n```\r\nBlynk.virtualWrite(V1, \"clr\");\r\n```\r\n\r\nВы также можете обрабатывать другие действия из таблицы. Например, использовать строку таблицы в качестве кнопки переключения.\r\n\r\n```\r\nBLYNK_WRITE(V1) {\r\n   String cmd = param[0].asStr();\r\n   if (cmd == \"select\") {\r\n       // строка в таблице была выбрана.\r\n       int rowId = param[1].asInt();\r\n   }\r\n   if (cmd == \"deselect\") {\r\n       // строка в таблице была отменена.\r\n       int rowId = param[1].asInt();\r\n   }\r\n   if (cmd == \"order\") {\r\n       // когда строки в таблице переупорядочиваются\r\n       int oldRowIndex = param[1].asInt();\r\n       int newRowIndex = param[2].asInt();\r\n   }\r\n}\r\n```\r\n\r\n**Примечание:** Максимальное количество строк в таблице равно 100. Когда вы достигнете предела, таблица будет работать как список FIFO (Первый пришел - первый ушел).\r\nЭто ограничение можно изменить, настроив свойство ```table.rows.pool.size``` в параметрах локального сервера.\r\n\r\n**Пример кода:** [Простое использование таблицы](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Table/Table_Simple/Table_Simple.ino)\r\n\r\n**Пример кода:** [Расширенное использование таблицы](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Table/Table_Advanced/Table_Advanced.ino)\r\n\r\n\r\n### Селектор устройств (Device Selector)\r\n\r\nСелектор устройств - это мощный виджет, который позволяет обновлять виджеты на основе одного активного устройства. \r\nЭтот виджет особенно полезен, когда у вас есть несколько устройств с аналогичной функциональностью.\r\n\r\nПредставьте, что у вас есть 4 устройства, и к каждому устройству подключен датчик температуры и влажности. Для отображения данных по всем 4 устройствам вам необходимо добавить 8 виджетов.\r\n\r\nС помощью Селектора устройств вы можете использовать только 2 виджета, которые будут отображать температуру и влажность в зависимости от активного устройства, выбранного в Селекторе.  \r\n\r\nВсе, что вам нужно сделать, это:\r\n\r\n1. Добавить виджет Селектора устройств в проект\r\n2. Добавить 2 виджета (например виджет отображения значений (Value Display Widget)), чтобы отобразить температуру и влажность\r\n3. В настройках виджетов вы сможете назначить их на Селектор устройств (в разделе источника или цели)\r\n4. Выйти из настроек, запустить проект \r\n\r\nТеперь вы можете изменить активное устройство в Селекторе устройств и увидите, что значения температуры и влажности отражают обновленные данные для только что выбранного вами устройства.\r\n\r\n**ПРИМЕЧАНИЕ:** Виджет вебхук ([Webhook](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/WebHook/WebHook_GET/WebHook_GET.ino)) пока не работает с Селектором устройств.\r\n\r\n### Плитка устройств (Device Tiles)\r\n\r\nПлитка устройств - это мощный виджет, очень похожий на виджет Селектора устройств (Device Selector), но с пользовательским интерфейсом. Позволяет отображать один пин с устройства на одну плитку.\r\nЭтот виджет особенно полезен, когда у вас есть несколько устройств с аналогичной функциональностью. Теперь вы можете группировать похожие устройства на одном макете (шаблоне).\r\n\r\n## Сенсоры \r\n### Акселерометр (Accelerometer)\r\n\r\nАкселерометр один из [сенсоров движения](https://developer.android.com/guide/topics/sensors/sensors_motion.html), \r\nкоторый позволяет определить движение Вашего телефона в пространстве.\r\nОн может пригодится для отслеживания таких событий как тряска, удар, поворот или наклон телефона. Концептуально, акселерометр определяет силу ускорения приложенную к вашему телефону. \r\nЕдиница измерения - м/c^2 приложенная к каждой из осей ```x```, ```y```, ```z```.\r\n\r\nЧтобы получить данные с сенсора нужно использовать следующий код :\r\n\r\n```cpp\r\nBLYNK_WRITE(V1) {\r\n  //сила ускорения, приложенная к оси x\r\n  int x = param[0].asFloat(); \r\n  //сила ускорения, приложенная к оси y\r\n  int y = param[1].asFloat();\r\n  //сила ускорения, приложенная к оси z\r\n  int z = param[2].asFloat();\r\n}\r\n```\r\n\r\nАкселерометр не работает при свернутом приложении.\r\n\r\n### Барометр/Давление (Barometer/pressure)\r\n\r\nБарометр один из сенсоров [окружающей среды](https://developer.android.com/guide/topics/sensors/sensors_environment.html) \r\nи позволяет измерять атмосферное давление.\r\n\r\nИзмеряется в ```hPa``` (гПа) или ```mbar``` (мБар).\r\n\r\nЧтобы получить данные с сенсора нужно использовать следующий код :\r\n\r\n```cpp\r\nBLYNK_WRITE(V1) {\r\n  //Давление в мБар\r\n  int pressure = param[0].asInt(); \r\n}\r\n```\r\n\r\nБарометр не работает при свернутом приложении.\r\n\r\n### Гравитация (Gravity)\r\n\r\nГравитация - это своего рода [датчики движения](https://developer.android.com/guide/topics/sensors/sensors_motion.html), который позволяет обнаруживать движение вашего смартфона.\r\nПолезно для мониторинга движения устройства, таких как наклон, встряхивание, вращение или качание.\r\n\r\nДатчик силы притяжения выдает трехмерный вектор, указывающий направление и величину силы притяжения. \r\nИзмеряется в ```m/s^2``` силы притяжения, приложенной к оси ```x```, ```y```, ```z```.\r\nДля того, чтобы принять данные от него, вам необходимо:\r\n\r\n```cpp\r\nBLYNK_WRITE(V1) {\r\n  //сила притяжения, приложенная к оси x\r\n  int x = param[0].asFloat(); \r\n  //сила притяжения, приложенная к оси y\r\n  int y = param[1].asFloat();\r\n  //сила притяжения, приложенная к оси y\r\n  int z = param[2].asFloat();\r\n}\r\n```\r\n\r\n**ВНИМАНИЕ:** Виджет гравитации не работает в фоновом режиме.\r\n\r\n### Влажность (Humidity)\r\n\r\nВлажность является своего рода [датчиком среды](https://developer.android.com/guide/topics/sensors/sensors_environment.html),\r\nкоторый позволяет измерять относительную влажность окружающей среды.\r\n\r\nИзмеряется в ```%``` - фактически это относительная влажность в процентах.\r\n\r\nДля того, чтобы принять данные от датчика, вам необходимо:\r\n\r\n```cpp\r\nBLYNK_WRITE(V1) {\r\n  //Влажность в %\r\n  int humidity = param.asInt();\r\n}\r\n```\r\n\r\n**ВНИМАНИЕ:** Влажность не работает в фоновом режиме.\r\n\r\n### Свет (Light)\r\n\r\nСвет - это своего рода [датчики окружающей среды](https://developer.android.com/guide/topics/sensors/sensors_environment.html), который позволяет измерять уровень освещенности (уровень внешней освещенности измеряется в люксах). В телефонах чаще всего используется для управления яркостью экрана.\r\n\r\nДля того, чтобы принять данные этого виджета, вам необходимо:\r\n\r\n```cpp\r\nBLYNK_WRITE(V1) {\r\n  //уровень освещенности\r\n  int lx = param.asInt(); \r\n}\r\n```\r\n\r\nВиджет Свет не работает в фоновом режиме.\r\n\r\n### Близость (Proximity)\r\n\r\nБлизость - это своего рода [датчики положения](https://developer.android.com/guide/topics/sensors/sensors_position.html)\r\nэто позволяет определить, насколько близко смартфон к лицу. Измеряется в ```cm``` (см) - расстояние от телефона до лица. Однако большинство этих датчиков возвращает только информацию FAR / NEAR.\r\nПоэтому, возвращаемое значение будет ```0 / 1```. Где 0 / LOW = ```FAR``` (далеко), а 1 / HIGH = ``` NEAR``` (рядом).\r\n \r\nДля того, чтобы принять данные из виджета, вам необходимо:\r\n\r\n```cpp\r\nBLYNK_WRITE(V1) {\r\n  //  расстояние до объекта\r\n  int proximity = param.asInt();\r\n  if (proximity) {\r\n     // РЯДОМ\r\n  } else {\r\n     // ДАЛЕКО\r\n  }\r\n}\r\n```\r\n\r\nВиджет близость не работает в фоновом режиме.\r\n\r\n### Температура (Temperature)\r\n\r\nТемпература является своего рода [датчиком окружающей среды](https://developer.android.com/guide/topics/sensors/sensors_environment.html) который позволяет измерять температуру окружающего воздуха. Измеряется в ```°C``` - градусах Цельсия.\r\n\r\nДля приема данных из виджета, необходимо использовать код:\r\n\r\n```cpp\r\nBLYNK_WRITE(V1) {\r\n  // температура в градусах цельсия\r\n  int celcius = param.asInt();\r\n}\r\n```\r\n\r\nВиджет Температуры не работает в фоновом режиме.\r\n\r\n### Триггер GPS (GPS Trigger)\r\n\r\nВиджет Триггер GPS позволяет легко инициировать события, когда вы входите или выходите из географической зоны. Этот виджет будет работать в фоновом режиме и периодически будет проверять ваши координаты. Если ваше местоположение находится в пределах или вне указанной зоны (географическая зона выбирается на карте виджета), виджет отправит команду ```HIGH```/``` LOW``` на аппаратное устройство. Например, Триггер GPS назначен для пина ```V1```, и включена опция ```Trigger When Enter```. В этом случае, когда вы окажитесь в указанной географической зоне виджет вызовет событие ```HIGH```.\r\n\r\n```cpp\r\nBLYNK_WRITE(V1) {\r\n  int state = param.asInt();\r\n  if (state) {\r\n      //Вы вошли в зону\r\n  } else {\r\n      //Вы вышли из зоны\r\n  }\r\n}\r\n```\r\n\r\nПодробнее о том, как работает GPS-виджет, вы можете прочитать [здесь](https://developer.android.com/guide/topics/location/strategies.html).\r\n\r\n**ВНИМАНИЕ:** Виджет Триггер GPS работает в фоновом режиме.\r\n\r\n### Поток GPS (GPS Streaming)\r\n\r\nПолезно для мониторинга местонахождения смартфона получать данные о широте, долготе, высоте и скорости (скорость часто может быть 0, если смартфон не поддерживает ее измерение).\r\n\r\nЧтобы принимать данные из этого виджета, вам необходимо:\r\n\r\n```cpp\r\nBLYNK_WRITE(V1) {\r\n  float latitude = param[0].asFloat(); \r\n  float longitude = param[1].asFloat();\r\n  float altitude = param[2].asFloat();\r\n  float speed = param[3].asFloat();\r\n}\r\n```\r\n\r\nили вы можете использовать подготовленную оболочку ```GpsParam``` :\r\n\r\n```cpp\r\nBLYNK_WRITE(V1) {\r\n  GpsParam gps(param);\r\n  //Печать лат/лон с 6 десятичными знаками\r\n  Serial.println(gps.getLat(), 7);\r\n  Serial.println(gps.getLon(), 7);\r\n  \r\n  Serial.println(gps.getAltitude(), 2);\r\n  Serial.println(gps.getSpeed(), 2);\r\n}\r\n```\r\n\r\nПоток GPS работает в фоновом режиме.\r\n\r\n**Пример кода:** [Поток GPS](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/GPS_Stream/GPS_Stream.ino)\r\n\r\n## Другие\r\n### Мост (Bridge)\r\n\r\nМост может быть использован для связи между устройствами (без участия приложения). Вы можете отправлять цифровые / аналоговые / виртуальные команды записи с одного устройства на другое, зная только токен авторизации. На данный момент виджет Мост не обязательно использовать в приложении (здесь он используется для указания того, что у нас есть такая функция). \r\n**Вы можете использовать несколько мостов для управления несколькими устройствами.**\r\n\r\n<img src=\"../images/bridge.png\" style=\"width: 77px; height:80px\"/>\r\n\r\nВиджет Мост использует виртуальный пин и превращает его в канал для управления другим устройством. Это означает, что вы можете контролировать любые виртуальные, цифровые или аналоговые пины целевого устройства. Будьте осторожны, не используйте пины типа ```A0, A1, A2 ...``` при обмене данными между различными типами устройств, так как в таких случаях Arduino Core может ссылаться на неверные пины.\r\n\r\nПример кода для устройства A, которое будет отправлять значения на устройство B:\r\n```cpp\r\n//Инициирует виджет Моста на V1 устройства A\r\nWidgetBridge bridge1(V1);\r\n...\r\nvoid setup() {\r\n    Blynk.begin(...);\r\n    while (Blynk.connect() == false) {\r\n        // Ждем пока Blynk подключится\r\n    }\r\n    bridge1.digitalWrite(9, HIGH); // выставим триггер HIGH на D9 \r\n                                   // устройства B. Код на устройстве\r\n                                   // B не требуется\r\n    bridge1.analogWrite(10, 123);\r\n    bridge1.virtualWrite(V1, \"hello\"); // вам нужно написать код на \r\n                                       // устройстве B, чтобы получить\r\n                                       // это значение. См. ниже\r\n    bridge1.virtualWrite(V2, \"value1\", \"value2\", \"value3\");\r\n}\r\n\r\nBLYNK_CONNECTED() {\r\n  bridge1.setAuthToken(\"OtherAuthToken\"); // токен с устройства B\r\n}\r\n```\r\n\r\n**ВАЖНО:** при выполнении ```virtualWrite()``` с виджета Мост, устройство B должно обрабатывать входящие данные с устройства A. \r\nНапример, если вы отправляете значение с устройства A на устройство B, используя ```bridge.virtualWrite (V5)```, вам необходимо использовать свой обработчик на устройстве B:\r\n\r\n```cpp\r\nBLYNK_WRITE(V5){\r\n    int pinData = param.asInt(); // переменная pinData будет хранить значение,\r\n                                 // полученное через Bridge\r\n}\r\n```\r\n\r\nИмейте в виду, что ```bridge.virtualWrite``` не отправляет никаких значений в мобильное приложение. Для этого вам нужно вызвать ```Blynk.virtualWrite```. \r\n\r\n**Пример кода:** [Мост](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Bridge/Bridge.ino)\r\n\r\n### Обработчик событий (Eventor)\r\n\r\nВиджет Обработчик событий позволяет создавать простые правила поведения или **события**. \r\nДавайте рассмотрим типичный вариант использования: считывание температуры с датчика DHT и отправка push-уведомления, когда температура превышает определенный предел:\r\n\r\n```cpp\r\n  float t = dht.readTemperature();\r\n  if (isnan(t)) {\r\n    return;\r\n  }\r\n  if (t > 40) {\r\n    Blynk.notify(String(\"Температура слишком высокая: \") + t);\r\n  }\r\n```\r\n\r\nС Обработчиком событий вам не нужно писать этот код. Все, что вам нужно, это отправить значение с датчика на сервер Blynk:\r\n\r\n```cpp\r\n  float t = dht.readTemperature();\r\n  Blynk.virtualWrite(V0, t);\r\n```\r\n\r\nНе забывайте, что команды ```virtualWrite``` должны быть заключены в таймер и не должны использоваться в основном цикле ```loop```.\r\n\r\n<img src=\"../images/eventor/eventor_for_temp_example.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n**ПРИМЕЧАНИЕ:** Не забудьте добавить виджет уведомлений в приложении.\r\n\r\nОбработчик событий пригодится вам, когда нужно изменить условия на лету без повторной загрузки нового скетча на аппаратное обеспечение. Вы можете создать столько **событий**, сколько вам нужно. Обработчик событий также может быть запущен со стороны приложения. Вам просто нужно назначить виджет на тот же контакт, что и ваше событие в Обработчике событий. \r\nОбработчик событий не постоянно отправляет события. Давайте рассмотрим простой пример, как показано выше ```if (temperature > 40) send notification```. Когда температура превышает 40 пороговых значений - отправляется уведомление. Если температура продолжает оставаться выше 40 никакие повторные действия не будут инициированы. Но если ```temperature``` опускается ниже порогового значения, а затем проходит его снова уведомление будет отправлено повторно (для уведомлений Обработчика событий нет ограничения отправки в течение 5 секунд).\r\n\r\n\r\nОбработчик событий также поддерживает события таймера (Timer). Например, вы можете установить пин ```V1``` ON/HIGH в 21:00:00 каждую пятницу.\r\nВ Обработчике событий вы можете назначить несколько таймеров на один и тот же пин, отправить любую строку/число, выбрать день и часовой пояс.\r\n \r\nЧтобы удалить созданное **событие**, пожалуйста, используйте сдвиг пальцем по экрану. Вы также можете перенести последний элемент самого события.\r\n\r\n**Пример кода:** [Обработчик событий](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Eventor/Eventor.ino)\r\n\r\n**ПРИМЕЧАНИЕ:** Виджет таймера зависит от времени сервера, а не вашего телефона. Иногда время телефона может не соответствовать времени сервера.\r\n\r\n**ПРИМЕЧАНИЕ:** события запускаются только один раз при выполнении условия. Это означитает что [цепочка событий] (https://community.blynk.cc/t/eventor-behavior-bug-feature/20962) невозможна (однако она может быть включена в коммерческой версии).\r\n\r\n<img src=\"../images/eventor/eventor_edit.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n### Часы реального времени (RTC)\r\n\r\nЧасы реального времени позволяют получать время с сервера. Вы можете предварительно выбрать любой часовой пояс в пользовательском интерфейсе, чтобы получить время на оборудование из нужной локали.\r\n\r\n<img src=\"../images/rtc_edit.png\" style=\"width: 200px; height:360px\"/>\r\n\r\n**Пример кода:** [Часы реального времени](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/RTC/RTC.ino)\r\n\r\n### Bluetooth с низким энергопотреблением\r\n\r\nЭтот виджет позволяет включить блутзуз с низким энергопотреблением на вашем телефоне. На текущий момент виджет также \r\nтребует наличия интернет соединения (постараемся пофиксить в ближайшем будущем). Некоторые типы виджетов нельзя \r\nиспользовать вместе с блутузом, например исторический граф, так как он требует чтобы данные отправлялись на сервер, чего \r\nблутуз виджет не делает.\r\n \r\n**Список поддерживаемых чипов и контроллеров:** [BLE](https://github.com/blynkkk/blynk-library/tree/master/examples/Boards_Bluetooth)\r\n\r\n### Блютуз (Bluetooth)\r\n\r\nЭтот виджет позволяет включить блютуз на вашем телефоне. На текущий момент виджет также требует наличия интернет соединения (постараемся пофиксить в ближайшем будущем) и поддерживается только на Android. \r\nНекоторые типы виджетов нельзя использовать вместе с блютузом, например исторический граф, так как он требует чтобы \r\nданные отправлялись на сервер, чего блютуз виджет не делает.\r\n \r\n**Список поддерживаемых чипов и контроллеров:** [BLE](https://github.com/blynkkk/blynk-library/tree/master/examples/Boards_Bluetooth)\r\n\r\n### Музыкальный проигрыватель (Music Player)\r\n\r\nПростой элемент интерфейса с 3 кнопками - имитирует интерфейс музыкального проигрывателя. Каждая кнопка отправляет свою команду на аппаратное устройство: ```play``` (воспроизвести), ```stop``` (стоп), ```prev``` (предыдущий), ```next``` (следующий).\r\n\r\nВы можете изменить состояние виджета в приложении с аппаратной стороны с помощью следующих команд:\r\n\r\n```\r\nBlynk.virtualWrite(Vx, \"play\");\r\nBlynk.virtualWrite(Vx, \"stop\");\r\n```\r\n\r\nВы также можете изменить состояние воспроизведение/остановка виджета с помощью следующего кода (эквивалент вышеупомянутых команд):\r\n\r\n```Blynk.setProperty(V1, \"isOnPlay\", \"false\");```\r\n\r\n**Пример кода:** [Музыкальный проигрыватель](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Player/Player.ino)\r\n\r\n### Вебхук (Webhook)\r\n\r\nВебхук очень мощный виджет, который позволяет Вам легко интегрироватся с любыми сторонними сервисами. С его помощью \r\nВы можете слать любые HTTP/S запросы на любой сервер или устройство, которое имеет HTTP/S API (например, лампы Philips Hue).\r\n\r\nВебхук вешается на вирутальный пин и любая команда, которая приходит на этот пин будет вызывать срабатывание HTTP/S \r\nзапроса. Команды на такой виртуальный пин могут приходить как со стороны железа, так и со стороны приложения. То есть, \r\nВы можете слать любой HTTP запрос при нажатии кнопки в приложении, если эта кнопка на том же пине что и вебхук.\r\n\r\nВот простой пример, представьте, что Вы хотите слать данные с микроконтроллера не только в Blynk, но и в какой-то другой сервис, \r\nнапример - Google Docs или в thingspeak.com. Раньше Вам для этого пришлось бы писать что-то вроде :\r\n\r\n```cpp\r\nWiFiClient client;\r\nif (client.connect(\"api.thingspeak.com\", 80)) {\r\n    client.print(\"POST /update HTTP/1.1\\n\");\r\n    client.print(\"Host: api.thingspeak.com\\n\");\r\n    client.print(\"Connection: close\\n\");\r\n    client.print(\"X-THINGSPEAKAPIKEY: \" + apiKeyThingspeak1 + \"\\n\");\r\n    client.print(\"Content-Type: application/x-www-form-urlencoded\\n\");\r\n    client.print(\"Content-Length: \");\r\n    client.print(postStr.length());\r\n    client.print(\"\\n\\n\");\r\n    client.print(postStr);\r\n}\r\n```\r\n \r\nС вебхуком этого больше делать не нужно.\r\n\r\n<img src=\"../images/webhook_settings.png\" style=\"width: 200px; height:360px\"/>\r\n\r\nДостаточно лишь заполнить поля виджета в приложении и выполнить привычное:\r\n\r\n```cpp\r\nBlynk.virtualWrite(V0, value);\r\n```\r\n\r\nГде V0 - пин вебхук виджета.\r\n\r\nВ дополнение, Вы можете подставлять значение пина в URL:\r\n\r\n```cpp\r\nhttps://api.thingspeak.com/update?api_key=xxxxxx&field1=/pin/\r\n```\r\n\r\nили тело запроса :\r\n\r\n```cpp\r\n[\"/pin/\"]\r\n```\r\n\r\nТак же можно отправлять несколько значений внутри одного пина (до 5) :\r\n\r\n```/pin[0]/```,```/pin[1]/```, ```/pin[2]/```\r\n\r\nЕще одна крутая штука - это возможность делать HTTP GET запросы на сервере и слать их результат на микроконтроллер. \r\nПрелесть тут в том, что Вам не нужно для этого писать сложный код на микроконтроллере. Представьте, что Вам нужно  \r\nполучить информацию о погоде от какого-то метио сервиса. Например, по такому запросу :\r\n\r\n```http://api.sunrise-sunset.org/json?lat=33.3823&lng=35.1856&date=2016-10-01```\r\n \r\nВы можете вставить этот запрос в вебхук виджет, выбрать пин ```V0``` и написать :\r\n \r\n```cpp\r\nBLYNK_WRITE(V0){\r\n  String webhookdata = param.asStr();\r\n  Serial.println(webhookdata);\r\n}\r\n```\r\n\r\nТеперь, каждый раз когда вы дергаете ```V0``` с помощью ```Blynk.virtualWrite(V0, 1)``` будет вызвана функция ```BLYNK_WRITE(V0)```.\r\n\r\n**Замечание:** обычно HTTP запросы довольно большие, поэтому Вам, вероятно, нужно будет увеличить лимит на максимальную \r\n длину сообщения на микроконтроллере ```#define BLYNK_MAX_READBYTES 1024```. \r\n\r\n**Замечание:** наше облако так же имеет определенные лимиты для вебхука. Мы разрешаем слать только 1 запрос в секунду. \r\nЭто поведение можно изменить на локальном сервер через свойство ```webhooks.frequency.user.quota.limit```. Пожалуйста, \r\nиспользуйте вебхуки с умом. Многие веб ресурсы не способны обрабатывать даже 1 запрос в секунду. \r\n \r\n**Замечание :** в случае если Ваш вебхук не выполнился 10 раз подряд - вебхук виджет будет остановлен. Чтобы восстановить \r\nего работу - нужно открыть и закрыть виджет в режиме редактирования. Не выполненными считаются запросы у которых код ответа \r\nне равен 200 или 302.\r\n\r\n\r\n### Отчеты (Reports)\r\n\r\nФункция виджета Отчеты заключается в настройке и разметке отчетов данных в формате CSV. Вы можете выбрать разовые или переодически запланированные отчеты.\r\n\r\nКроме того, в отчетах вы можете очистить все пользовательсике данные, собранные с ваших устройств.\r\n\r\nВам необходимо настроить начальные параметры в режиме редактирования, а затем уже в режиме воспроизведения вы сможете настроить сами отчеты.\r\n\r\n#### Режим редактирования. Конфигурация ввода данных\r\n\r\nВ режиме редактирования (когда ваш проект остановлен) вы определяете потоки данных, которые вы хотели бы позже включить в отчет.\r\nВиджет Отчеты предназначен для работы с виджетом [Плитка устройств (Device Tiles)](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/device_tiles.md). Если вы не используете плитки устройств, вы все равно можете выбрать одно устройство или группу устройств в качестве источника данных для отчетов.\r\n\r\nВы должны выбрать либо [Плитку устройств](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/device_tiles.md), либо одино устройство, либо группу устройств для отчета. Вы не можете объединить эти оба варианта.\r\n\r\n#### Режим воспроизведения \r\n\r\nПосле добавления исходных устройств и их потоков данных нажмите кнопку «Воспроизвести» и нажмите кнопку «Отчеты».\r\n\r\n### Настройка отчетов\r\n\r\nКаждый параметр отчета предполагает свои собственные настройки:\r\n\r\n```Report name``` (Имя отчета) -  дайте вашему отчету осмысленное имя.\r\n\r\n```Data source``` (Источники данных) - выберите потоки данных, которые вы хотели бы включить в отчеты.\r\n\r\n```Report Frequency``` (периодичность отчетов) -  Определяет, как часто будут отправляться отчеты. Они могут быть разовыми и запланированными.\r\n\r\n```one-time``` (Сейчас) -  мгновенно сформирует отчет и отправит его на указанные адреса электронной почты. Нажмите на значок справа, чтобы отправить отчет.\r\n\r\nЗапланированные отчеты могут быть отправлены ```daily```/```weekly```/```monthly``` (ежедневно/еженедельно/ежемесячно).\r\n\r\n ```At Time``` (Время)  установите время дня, когда отчет будет отправлен.\r\n ```Start```/```End``` (Качало/Конец) указывает дату начала и окончания оправки отчетов.\r\n\r\nДля еженедельного отчета вы можете выбрать день недели, когда отчет должен быть отправлен.\r\nДля ежемесячного отчета вы можете выбрать, отправку отчета в первый или последний день месяца.\r\n\r\n```Recipients``` (Получатели) -  укажите до 5 адресов электронной почты..\r\n\r\n```Data resolution``` (Разрешение данных) определяет детализацию ваших отчетов.  Поддерживаемые детализации: ```minute``` (ежеминутно), ```hourly``` (ежечасно) и ```daily``` (ежедневно).\r\nНапример, когда вы генерируете ежедневный отчет с детализацией в 1 минуту, вы получаете ```24 * 60 * 60``` единиц данных в вашем ежедневном отчете за каждый выбранный поток.\r\n\r\n```Group data in reports by``` (Группировка данных в отчетах) -  укажите выходной формат файла-(ов) CSV:\r\n\r\n```Datastream``` (Поток) - вы получите один CSV файл для каждого потока данных.\r\n\r\n```Device``` (Устройство) - вы получите один CSV-файл на каждое устройство. Каждый файл будет содержать все включенные потоки данных.\r\n\r\n```Report``` (Отчет) - вы получите один CSV-файл для всех ваших устройств и всех ваших потоков данных.\r\n\r\n```Timezone correction``` (Времненная зона) -  укажите корректировку часового пояса, если вам нужно настроить дату и время отчета на определенный часовой пояс.\r\n\r\n```Date and time format``` (Формат даты и времени) -  определяет формат поля временной метки ваших данных.\r\nВы можете выбрать ```2018-06-21 20:16:48```, ```2018-06-21T20:16:48+03:00``` или другой поддерживаемый формат.\r\n\r\nСуществует особый формат ```Timestamp``` (Временная метка), которая отражает разницу между текущим временем и полуночью 1 января 1970 года UTC, измеряемую в миллисекундах.\r\n\r\nПосле настройки отчета нажмите кнопку «ОК» в правом верхнем углу. Ваш отчет готов.\r\n\r\nПосле настройки отчета вы увидите, когда запланирован следущий отчет ```Next```, а также увидите расписание для этого отчета.\r\n\r\nПосле отправки отчета хотя бы один раз, вы можете увидеть дату его последней отправки ```Last```.\r\n\r\n```Last``` (Последний) метка также содержит статус отправки отчета:\r\n\r\n  - ```OK``` (Успешно):  отчет был сгенерирован и успешно отправлен Получателям;\r\n  - ```No Data``` (Нет данных): отчет не содержит данных за указанный период;\r\n  - ```Error``` (Ошибка):  что-то пошло не так. Пожалуйста, свяжитесь со службой поддержки Blynk.\r\n\r\nОтчеты будут генерироваться, даже если ваш проект не находится в активном (Play) режиме. Однако помните, неактивные проекты небудут генерировать данные.\r\n\r\n**ПРИМЕЧАНИЕ:** все отчеты формируются в кодировке UTF-16. Пожалуйста, убедитесь, что при открытии файла отчета вы выбрали кодировку UTF-16 в вашем CSV-редакторе.\r\n"
  },
  {
    "path": "ru/amendments.md",
    "content": "# Blynk Amendments\n\n## Tell every maker about Blynk\n\nNo pressure. Just do it. Now.\n\n## Make your idea work without Blynk\n\nBlynk can be easily integrated in almost any project. But before that - make it work **without** it. After you are sure that you can get all the sensor data or can control things from the code – integrate Blynk and make it even more awesome.\n\n## Use search\n\nWe are always happy to chat and help, but remember - every time you ask the question that was answered many many times before that, Blynk Team is not building a new widget or new cool feature. So:\n\n* google before asking\n* use search on our forum, it works really well\n* check Instructables\n\n  **Always wrap your code**\n\n  Though shalt not post code without `wrapping it` \n\n"
  },
  {
    "path": "ru/appexport.md",
    "content": "# App Export\n\n## Firmware for ESP8266, NodeMCU, BlynkBoard, etc.\n\n### Prepare development environment\n\n1. Install [Arduino IDE](https://www.arduino.cc/en/Main/Software)\n2. Install [Blynk Library](https://github.com/blynkkk/blynk-library/releases/latest) and restart Arduino IDE\n3. Install [ESP8266 core for Arduino](https://github.com/esp8266/Arduino#installing-with-boards-manager)\n4. For Windows / OS X, you may need to install USB-Serial drivers according to your converter:\n   * СP2102: [https://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx](https://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx) \n   * FTDI \\(FT232, etc\\): [http://www.ftdichip.com/Drivers/VCP.htm](http://www.ftdichip.com/Drivers/VCP.htm)\n   * _TODO: Link to drivers for CH340 and PL2303._\n5. If your board has a NeoPixel RGB LED, install [Adafruit NeoPixel](https://github.com/adafruit/Adafruit_NeoPixel) library from Library Manager\n\n### Build your Firmware\n\n1. Open our example in Arduino IDE: `File -> Examples -> Blynk -> Provisioning -> Blynk_ESP8266`\n2. Open `Settings.h` tab.\n3. Configure your firmware:\n   * `BOARD_NAME` - ...\n   * `BOARD_VENDOR` - ...\n   * `PRODUCT_WIFI_SSID` - ...\n\n### Upload firmare\n\n1. Select your board type: `Tools -> Board -> [Your Board]`\n2. Select your port: `Tools -> Port -> [...]`\n3. Verify and Upload!\n\nNote that for Blynk Board, you can select board type `NodeMCU 1.0`.\n\n"
  },
  {
    "path": "ru/blynkfirmware.md",
    "content": "# Прошивка Blynk\n\n## Конфигурация\n\n### Blynk.begin\\(\\)\n\nСамый простой способ настроить Blynk - это использовать функцию `Blynk.begin()`:\n\n```cpp\nBlynk.begin(auth, ...);\n```\n\nОна имеет несколько параметров для разных моделей оборудования, а также зависит от типа подключения. Следуйте примеру скетча для вашей конкретной аппаратной модели.\n\nЧто происходит внутри функции `Blynk.begin()`:\n\n1. Подключение к сети \\(WiFi, Ethernet, ...\\)\n2. Вызов `Blynk.config (...)` для установки токена авторизации, адреса сервера и т.д.\n3. Пытается сразу подключиться к серверу \\(может продлится в течении 30 сек\\)\n\nЕсли ваш тип платы/подключения пока не поддерживается - вы можете реализовать его самостоятельно. \\[Вот несколько примеров\\][https://github.com/blynkkk/blynk-library/tree/master/examples/More/ArduinoClient](https://github.com/blynkkk/blynk-library/tree/master/examples/More/ArduinoClient)\\).\n\n### Blynk.config\\(\\)\n\n`config()` позволяет управлять сетевым подключением. Вы можете настроить тип подключения \\(WiFi, Ethernet, ...\\) самостоятельно, а затем соединиться:\n\n```cpp\nBlynk.config(auth, server, port);\n```\n\nили так\n\n```cpp\nBlynk.config(auth);\n```\n\n**ПРИМЕЧАНИЕ. После вызова `Blynk.config (...)` ваше оборудование еще не подключено к серверу.** Попытка покдлючение произойдет при выполнении программой первой функции `Blynk.run ()` или `Blynk.connect()`. Чтобы пропустить подключение к серверу или отключить его вручную, вызовите `Blynk.disconnect()` после функции конфигурации.\n\nИспользуйте `connectWiFi` чтобы удобно настроить WiFi соединение:\n\n```cpp\nBlynk.connectWiFi(ssid, pass);\n```\n\nЧтобы подключиться к открытой сети WiFi, укажите пустую строку \\(`\"\"`\\).\n\n## Управление соединением\n\nЕсть несколько функций, которые помогут с управлением соединением:\n\n### Blynk.connect\\(\\)\n\nЭта функция будет продолжать попытки подключиться к серверу Blynk. Возвращает `true` при подключении, `false`, если истекло время ожидания. Время ожидания по умолчанию составляет 30 секунд.\n\n```cpp\nbool result = Blynk.connect();\nbool result = Blynk.connect(timeout);\n```\n\n### Blynk.disconnect\\(\\)\n\nОтключает оборудование от сервера Blynk:\n\n```cpp\nBlynk.disconnect();\n```\n\n### Blynk.connected\\(\\)\n\nВозвращает `true`, когда оборудование подключено к Серверу Blynk,`false`, если нет активного подключения к серверу Blynk.\n\n```cpp\nbool result = Blynk.connected();\n```\n\n### Blynk.run\\(\\)\n\nЭта функция должна вызываться часто, чтобы обрабатывать входящие команды и выполнять поддреживать соединения с Сервером Blynk. Обычно вызывается в цикле `void loop () {}`.\n\nЭта команда может быть инициирована в других местах вашего кода, если только у вас не заканчивается памяти \\(в каскадных функциях с локальной памятью\\). Например, не рекомендуется вызывать `Blynk.run ()` внутри `BLYNK_READ` и `BLYNK_WRITE` на устройствах с маленькой оперативной памятью.\n\n## Управление цифровыми и аналоговыми пинами\n\nБиблиотека Blynk может выполнять основные операции ввода-вывода \"из коробки\":\n\n```text\ndigitalRead\ndigitalWrite\nanalogRead\nanalogWrite (ШИМ или Аналоговый сигнал в зависимости от платформы)\n```\n\nНет необходимости писать код для простых вещей, таких как светодиод, реле управления и аналоговые датчики. Просто выберите соответствующий пин в приложении Blynk и управляйте им напрямую без дополнительного кода\n\n## Управление виртуальными пинами\n\nВиртуальные пины \\(Virtual Pins\\) - это способ обмена любыми данными между вашим оборудованием и приложением Blynk. Думайте о виртуальных пинах как о каналах для приема/передачи любых данных. Убедитесь, что вы различаете виртуальные контакты от физических GPIO пинов на вашем оборудовании. Виртуальные контакты не имеют физического представления.\n\nВиртуальные пины обычно используются для взаимодействия с другими библиотеками \\(Servo, LCD и др.\\) и реализации пользовательской логики. Устройство может отправлять данные в приложение, используя `Blynk.virtualWrite (pin, value)`, и получать данные из приложения, используя `BLYNK_WRITE (vPIN)`. Читайте ниже...\n\n#### Типы данных Виртуальных пинов\n\nВсе значения виртуальных пинов всегда отправляются в виде строк, и нет никаких практических ограничений на данные, которые могут быть отправлены. Однако при работе с числами существуют определенные ограничения на аппаратную часть. Например, целое число на Arduino - 16-бит, допустимый диапазон значений от -32768 до 32767.\n\nЧтобы интерпретировать входящие данные как целые числа, числа с плавающей запятой, двойные числа и строки, используйте:\n\n```cpp\nparam.asInt();\nparam.asFloat();\nparam.asDouble();\nparam.asStr();\n```\n\nВы также можете получить RAW данные из буфера параметров:\n\n```cpp\nparam.getBuffer()\nparam.getLength()\n```\n\n### Blynk.virtualWrite\\(vPin, value\\)\n\n**ПРИМЕЧАНИЕ. Используйте BlynkTimer при использовании этой команды для отправки данных. В противном случае ваше оборудование будет терять связь с сервером**\n\nОтправка данных в различных форматах на виртуальные пины.\n\n```cpp\n// ОТправка строки\nBlynk.virtualWrite(pin, \"abc\");\n\n// Отправка числа\nBlynk.virtualWrite(pin, 123);\n\n// Отправка дробного числа\nBlynk.virtualWrite(pin, 12.34);\n\n// ОТправка массива значений\nBlynk.virtualWrite(pin, \"hello\", 123, 12.34);\n\n// ОТправка RAW данных\nBlynk.virtualWriteBinary(pin, buffer, length);\n```\n\nВызов `virtualWrite` пытается немедленно отправить значение в сеть.\n\n**Примечание:** Для виртуальных контактов с номерами больше 127 синтаксис `V128` недоступен.\n\nПожалуйста, используйте простой виртуальный пин-код, например:\n\n```cpp\nBlynk.virtualWrite(128, \"abc\");\n```\n\n## BlynkTimer\n\nВажно посылать данные с интервалами и сохранять цикл void \\(\\) как можно более свободным.\n\n`BlynkTimer` позволяет периодически отправлять данные с заданными интервалами, не мешая работе библиотеки Blynk `BlynkTimer` наследует [SimpleTimer Library](http://playground.arduino.cc/Code/SimpleTimer), хорошо известную и широко используемую библиотеку для обработки нескольких событий на оборудовании. `BlynkTimer` включен в библиотеку Blynk по умолчанию и нет необходимости устанавливать SimpleTimer отдельно или включать `SimpleTimer.h`\n\n* Один объект `BlynkTimer` позволяет планировать до 16 таймеров.\n* Улучшена совместимость с такими платами, как `Arduino 101`, `Intel Galileo` и т.д.\n* Когда таймер пытается запуститься несколько раз \\(из-за заблокированного цикла\\), он просто пропускает все пропущенные интервалы запуска и вызывает вашу функцию только один раз. Это отличается от `SimpleTimer`, который может вызывать вашу функцию несколько раз в этом сценарии.\n\nДля получения дополнительной информации об использовании таймера, пожалуйста [посмотрите](http://playground.arduino.cc/Code/SimpleTimer). А вот и BlynkTimer [пример скетча](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushData/PushData.ino#L30).\n\nТакже помните, что один экземпляр `BlynkTimer` может запланировать до 16 таймеров, поэтому, скорее всего, вам понадобится только один экземпляр BlynkTimer в вашем скетче.\n\n### BLYNK\\_WRITE\\(vPIN\\)\n\n`BLYNK_WRITE` это функция, вызывается каждый раз, когда устройство получает обновление значения виртуального пина от сервера \\(или приложения\\):\n\nДля чтения полученных данных используйте код:\n\n```cpp\nBLYNK_WRITE(V0)\n{   \n  int value = param.asInt(); // Получить значение как целое число\n\n  // Параметр может содержать несколько значений, в таком случае:\n  int x = param[0].asInt();\n  int y = param[1].asInt();\n}\n```\n\n**`BLYNK_WRITE` нельзя использовать внутри какого-либо цикла или функции. Это отдельная функция.**\n\n**Примечание:** Для виртуальных контактов с номерами &gt; 127 используйте API `BLYNK_WRITE_DEFAULT()`\n\n### BLYNK\\_READ\\(vPIN\\)\n\n`BLYNK_READ` - это функция, вызывается, когда от устройства требуется отправить текущее значение Виртуального пина на сервер. Обычно эта функция содержит вызов `Blynk.virtualWrite`.\n\n```cpp\nBLYNK_READ(V0)\n{\n  Blynk.virtualWrite(V0, newValue);\n}\n```\n\n**Примечание:** Для виртуальных пинов с номерами более 127 используйте API `BLYNK_READ_DEFAULT()`\n\n### BLYNK\\_WRITE\\_DEFAULT\\(\\)\n\nПереопределяет обработчик для всех выводов, которые не покрыты пользовательскими функциями `BLYNK_WRITE`.\n\n```cpp\nBLYNK_WRITE_DEFAULT()\n{\n  int pin = request.pin;      // Какой именно пин обрабатывается?\n  int value = param.asInt();  // Используйте param как обычно.\n}\n```\n\n### BLYNK\\_READ\\_DEFAULT\\(\\)\n\nПереопределяет обработчик для всех выводов, которые не покрыты пользовательскими функциями `BLYNK_READ`.\n\n```cpp\nBLYNK_READ_DEFAULT()\n{\n  int pin = request.pin;      // Какой именно пин обрабатывается?\n  Blynk.virtualWrite(pin, newValue);\n}\n```\n\n### BLYNK\\_CONNECTED\\(\\)\n\nИспользуйте эту функцию, когда вам нужно запустить определенную процедуру, когда оборудование подключается к Blynk Cloud или локльному серверу. Чаще всего вызывают эту функцию для синхронизации значений Сервер-Приложение-Оборудование.\n\n```cpp\nBLYNK_CONNECTED() {\n// Здесь Ваш код\n}\n```\n\n### BLYNK\\_APP\\_CONNECTED\\(\\)\n\nЭта функция вызывается каждый раз, когда клиент приложения Blynk подключается к серверу Blynk.\n\n```cpp\nBLYNK_APP_CONNECTED() {\n// Здесь Ваш код\n}\n```\n\n**Примечание:** Сначала включите эту функцию в настройках проекта:\n\n![](../.gitbook/assets/app_connected_setting%20%281%29.png)\n\n[Пример](https://github.com/blynkkk/blynk-library/blob/master/examples/More/AppConnectedEvents/AppConnectedEvents.ino)\n\n### BLYNK\\_APP\\_DISCONNECTED\\(\\)\n\nЭта функция вызывается каждый раз, когда приложение Blynk отключается от Blynk Cloud или локального сервера.\n\n```cpp\nBLYNK_APP_DISCONNECTED() {\n// Здесь Ваш код\n}\n```\n\n**Примечание.** Сначала включите эту функцию в настройках проекта:\n\n![](../.gitbook/assets/app_connected_setting.png)\n\n[Пример](https://github.com/blynkkk/blynk-library/blob/master/examples/More/AppConnectedEvents/AppConnectedEvents.ino)\n\n### Blynk.syncAll\\(\\)\n\nЗапрашивает все сохраненные на сервере последние значения для всех виджетов. Все аналоговые/цифровые/виртуальные значения и состояния выводов будут установлены на последнее сохраненное значение. Каждый виртуальный вывод генерирует событие BLYNK\\_WRITE \\(\\).\n\n```cpp\nBLYNK_CONNECTED() {\n    Blynk.syncAll();\n}\n```\n\n**Примечание:** Рекомендиуется использовать только на стадии написания кода \\(иногда возникают ошибки\\). Для надежности следует применять выборочную синхронзацию `syncVirtual`.\n\n### Blynk.syncVirtual\\(vPin\\)\n\nЭта команда обновляет отдельный виртуальный пин до последнего сохраненного значения на сервере. Когда он используется, вызывается соответствующий обработчик `BLYNK_WRITE`.\n\n```cpp\nBlynk.syncVirtual(V0);\n```\n\nЧтобы обновить несколько контактов, используйте код:\n\n```text\nBlynk.syncVirtual(V0, V1, V6, V9, V16);\n```\n\n### Blynk.setProperty\\(vPin, \"property\", value\\)\n\nЭта команда позволяет [изменить свойства виджета](blynkfirmware.md#blynk-main-operations-change-widget-properties)\n\n## Отладка\n\n### \\#define BLYNK\\_PRINT\n\n### \\#define BLYNK\\_DEBUG\n\nЧтобы включить отладочную информацию на последовательном порту по умолчанию, добавьте в начало скетча. **ВАЖНО: это должна быть первая строка в вашем коде**:\n\n```cpp\n#define BLYNK_PRINT Serial // Определяет объект/порт, который используется для вывода\n#define BLYNK_DEBUG        // Опционально, включает детализированный вывод\n```\n\nОбязательно включите последовательный вывод в `setup()`:\n\n```cpp\nSerial.begin(9600);\n```\n\nОткройте Serial Monitor, и вы увидите отладочные данные.\n\nВы также можете использовать запасные аппаратные последовательные порты или SoftwareSerial для вывода отладочной информации \\(вам понадобится адаптер для подключения к ПК\\).\n\n**ПРЕДУПРЕЖДЕНИЕ:** Включение `BLYNK_DEBUG`' замедлит вашу аппаратную производительность в 10 раз!\n\n### BLYNK\\_LOG\\(\\)\n\nКогда параметр `BLYNK_PRINT` определен, вы можете использовать `BLYNK_LOG` для записи ваших LOG журналов. Используется похоже на `printf`:\n\n```cpp\nBLYNK_LOG(\"This is my value: %d\", 10);\n```\n\nOn some platforms \\(like Arduino 101\\) the `BLYNK_LOG` may be unavailable, or may just use too much resources.  \nIn this case you can use a set of simpler log functions:\n\nНа некоторых платформах \\(например, Arduino 101\\) `BLYNK_LOG` может быть недоступен или просто использовать слишком много ресурсов. В этом случае вы можете использовать набор более простых функций журнала:\n\n```cpp\nBLYNK_LOG1(\"Hello World\"); // Print a string\nBLYNK_LOG1(10);      // Print a number\nBLYNK_LOG2(\"This is my value: \", 10); // Print 2 values\nBLYNK_LOG4(\"Temperature: \", 24, \" Humidity: \", 55); // Print 4 values\n...\n```\n\n## Минимизация объема кода\n\nЧтобы свести к минимуму объем программы Flash/RAM памяти, вы можете отключить некоторые встроенные функции:\n\n1. Comment-out `#define BLYNK_PRINT` to remove prints\n2. Put on the top of your sketch:\n3. Закомментируйте `#define BLYNK_PRINT` для отмены печати порт\n4. Поместите верхнюю часть вашего скетча:\n\n```text\n#define BLYNK_NO_BUILTIN   // Отключить встроенные аналоговые и цифровые контакты\n#define BLYNK_NO_FLOAT     // Отключить операции с плавающей точкой\n```\n\n## Портирование, взлом\n\nЕсли вы хотите погрузиться в создание/взлом/портирование реализации библиотеки Blynk, пожалуйста, также ознакомтесь [с этой документацией](https://github.com/blynkkk/blynk-library/tree/master/extras/docs).\n\n"
  },
  {
    "path": "ru/blynkmainoperations.md",
    "content": "# Blynk основные операции\n\n## Виртуальные Пины \\(Pins\\)\n\nBlynk может напрямую управлять цифровыми и аналоговыми выводами ввода/вывода на вашем оборудовании. Вам даже не нужно писать для этого код. Отлично подходит для мигающих светодиодов, но частенько этого не достаточно...\n\nМы разработали Виртуальные Пины для отправки **любых** данных с вашего микроконтроллера в приложение Blynk и обратно.\n\nВсе, что вы подключите к своему оборудованию, сможет общаться с Blynk. С помощью Виртуальных Пинов вы можете отправить что-то из приложения, обработать его на микроконтроллере, а затем отправить обратно на смартфон. Вы можете запускать функции, считывать устройства I2C, преобразовывать значения, управлять сервоприводами и двигателями постоянного тока и т. д.\n\nВиртуальные Пины могут быть использованы для взаимодействия с внешними библиотеками \\(Servo, LCD и другие\\), а также реализовать пользовательские функции.\n\nОборудование может передавать данные в виджеты через Виртуальные Пины, как здесь:\n\n```cpp\nBlynk.virtualWrite(pin, \"abc\");\nBlynk.virtualWrite(pin, 123);\nBlynk.virtualWrite(pin, 12.34);\nBlynk.virtualWrite(pin, \"Привет\", 123, 12.34);\n```\n\nДля получения дополнительной информации о виртуальных пинах, [прочитайте здесь](../#blynk-firmware-virtual-pins-control)\n\n## Отправить данные из приложения на оборудование\n\nВы можете отправлять любые данные из виджетов в приложении на ваше оборудование.\n\nВсе [Виджеты Контроллеры](../#widgets-controllers) могут отправлять данные в Виртуальные Пины на вашем оборудовании. Например, приведенный ниже код показывает, как получить значения из виджета Кнопки \\(Button\\) в приложении.\n\n```cpp\nBLYNK_WRITE(V1) //Виджет кнопки пишет данные в пин V1\n{\n  int pinData = param.asInt(); \n}\n```\n\nКогда вы нажимаете кнопку, приложение Blynk отправляет `1` На втором клике - отправляет `0`\n\nВот как настроен виджет кнопки \\(Button\\):\n\n![](../.gitbook/assets/button_virtual_1.png)\n\nПолный пример кода: [Получение данных](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/GetData/GetData.ino#L24)\n\n### Отправка массива из виджета\n\nНекоторые виджеты \\(например, джойстик, zeRGBa\\) имеют более одной единицы данных.\n\n![](../.gitbook/assets/joystick_merge_mode.png)\n\nЭтот вывод может быть записан в Virtual Pin в виде массива значений. С аппаратной стороны - вы можете получить любой элемент массива \\[0,1,2 ...\\], используя код:\n\n```cpp\nBLYNK_WRITE(V1) // Виджет ЗАПИСЫВАЕТ в Виртуальный Пин V1\n{   \n  int x = param[0].asInt(); // получить первое значение\n  int y = param[1].asInt(); // получить второе значение\n  int z = param[N].asInt(); // получить N-ое значение\n}\n```\n\n**Пример кода:** [Джойстик две оси](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/JoystickTwoAxis/JoystickTwoAxis.ino#L24)\n\n## Получить данные с аппаратного обеспечения\n\nСуществует два способа передачи данных с вашего оборудования на виджеты в приложении через виртуальные контакты.\n\n### Perform requests by Widget\n\n* Using Blynk built-in reading frequency while App is active by setting 'Reading Frequency' parameter to some interval:\n\n![](../.gitbook/assets/frequency_reading_pull.png)\n\n```cpp\nBLYNK_READ(V5) // Widget in the app READs Virtal Pin V5 with the certain frequency\n{\n  // This command writes Arduino's uptime in seconds to Virtual Pin V5\n  Blynk.virtualWrite(5, millis() / 1000);\n}\n```\n\n**Sketch:** [PushDataOnRequest](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushDataOnRequest/PushDataOnRequest.ino#L26)\n\n### Pushing data from hardware\n\nIf you need to PUSH sensor or other data from your hardware to Widget, you can write any logic you want. Just set the frequency to PUSH mode. Any command that hardware sends to Blynk Cloud is automatically stored on server and you get this info either with [History Graph](../#widgets-displays-superchart) widget or with [HTTP API](http://docs.blynkapi.apiary.io/#reference/0/pin-history-data/get-all-history-data-for-specific-pin).\n\n![](https://github.com/blynkkk/blynkkk.github.io/tree/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/ru/images/frequency_reading_push.png)\n\nWe recommend sending data in intervals and avoiding [Flood Error](https://docs.blynk.cc/#troubleshooting-flood-error). You can use timers like [BlynkTimer](../#blynk-firmware-blynktimer). Please read instructions inside this [example sketch](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushData/PushData.ino) for more details.\n\nHere is how it can work:\n\n```cpp\n#include <SPI.h>\n#include <Ethernet.h>\n#include <BlynkSimpleEthernet.h>\n\nchar auth[] = \"YourAuthToken\"; // Put your token here\n\nBlynkTimer timer; // Create a Timer object called \"timer\"! \n\nvoid setup()\n{\n  Serial.begin(9600);\n  Blynk.begin(auth);\n\n  timer.setInterval(1000L, sendUptime); //  Here you set interval (1sec) and which function to call \n}\n\nvoid sendUptime()\n{\n  // This function sends Arduino up time every 1 second to Virtual Pin (V5)\n  // In the app, Widget's reading frequency should be set to PUSH\n  // You can send anything with any interval using this construction\n  // Don't send more that 10 values per second\n\n  Blynk.virtualWrite(V5, millis() / 1000);\n}\n\nvoid loop()\n{\n  Blynk.run(); // all the Blynk magic happens here\n  timer.run(); // BlynkTimer is working...\n}\n```\n\n**Sketch:** [PushData](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushData/PushData.ino#L30)\n\n## State syncing\n\n### For hardware\n\nIf your hardware looses Internet connection or resets, you can restore all the values from Widgets in the Blynk app.\n\n```cpp\nBLYNK_CONNECTED() {\n    Blynk.syncAll();\n}\n\n//here handlers for sync command\nBLYNK_WRITE(V0) {\n   ....\n}\n```\n\nThe `Blynk.syncAll()` command restores all the Widget's values based on the last saved values on the server. All analog and digital pin states will be restored. Every Virtual Pin will perform `BLYNK_WRITE` event.\n\n**WARNING**: if pin is empty and wasn't initialized - hardware will not get any response for those pin during sync.\n\n[Sync Hardware with App state](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/HardwareSyncStateFromApp/HardwareSyncStateFromApp.ino)\n\nYou can also update a single Virtual Pin value by calling `Blynk.syncVirtual(V0)` or you can update several pins with `Blynk.syncVirtual(V0, V1, V2, ...)`.\n\nYou can also use server to store any value without widget. Just call `Blynk.virtualWrite(V0, value)`.\n\n[Storing single value on server](https://github.com/blynkkk/blynk-library/blob/master/examples/More/ServerAsDataStorage/ServerAsDataStorage_SingleValue/ServerAsDataStorage_SingleValue.ino)\n\n[Storing multiple values on server](https://github.com/blynkkk/blynk-library/blob/master/examples/More/ServerAsDataStorage/ServerAsDataStorage_MultiValue/ServerAsDataStorage_MultiValue.ino)\n\n### For app\n\nIf you need to keep your hardware in sync with Widgets' state even if app is offline use `Blynk.virtualWrite`.\n\nImagine you have a LED Widget connected to the Virtual Pin V1 in the app, and a physical button attached to your hardware. When you press a physical button, you would expect to see updated state of the LED Widget in the app. To achieve that you need to send `Blynk.virtualWrite(V1, 255)` when a physical button gets pressed.\n\n[Represent physical button state via LED widget with interrupts](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonInterrupt/ButtonInterrupt.ino)\n\n[Represent physical button state via LED widget with polling](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonPoll/ButtonPoll.ino)\n\n[Represent physical button state via Button widget with polling](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/SyncPhysicalButton/SyncPhysicalButton.ino)\n\n## Control of multiple devices\n\nBlynk app has support of multiple devices. That means you can assign any widget to specific device with own auth token. For example - you may have button on V1 that controls wi-fi bulb A and another button on V1 that controls wi-fi bulb B. In order to do this you need more than 1 device within your project. To achieve this please go to project settings and click on \"Devices\" section :\n\n![](https://github.com/blynkkk/blynkkk.github.io/tree/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/ru/images/new_project_settings.png)\n\nYou'll see list of devices :\n\n![](https://github.com/blynkkk/blynkkk.github.io/tree/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/ru/images/list_of_devices.png)\n\nSo you can add new device :\n\n![](https://github.com/blynkkk/blynkkk.github.io/tree/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/ru/images/new_device.png)\n\nAfter above steps, every widget will have one more field \"Target\" :\n\n![](https://github.com/blynkkk/blynkkk.github.io/tree/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/ru/images/widget_settings_devices.png)\n\nNow you need to assign widget to device and after that widget will control only this specific device.\n\nThat's it! Now you need to upload sketches with correct Auth Tokens to your hardware.\n\n### Tags\n\nTags feature allows you to group multiple devices. Tags are very useful in case you want to control few devices with 1 widget. For example, imagine a case when you have 3 smart bulbs and you want to turn on all those bulbs with one single click. You need to assign 3 devices to 1 tag and assign tag to button. That's it.\n\nTag widgets also support state syncing. So you can get state of widget from your hardware. However you can't update state of such widgets from hardware.\n\n## Devices online status\n\nBlynk app has support for online statuses for multiple devices.\n\n![](https://github.com/blynkkk/blynkkk.github.io/tree/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/ru/images/online_status.png)\n\nIn ideal world when device closes tcp connection with some `connection.close()` - connected server will get notification regarding closed connection. So you can get instant status update on UI. However in real world this mostly exceptional situation. In majority of cases there is no easy and instant way to find out that connection is not active anymore.\n\nThat's why Blynk uses `HEARTBEAT` mechanism. With this approach hardware periodically sends `ping` command with predefined interval \\(10 seconds by default, `BLYNK_HEARTBEAT` [property](https://github.com/blynkkk/blynk-library/blob/master/src/Blynk/BlynkConfig.h)\\). In case hardware don't send anything within 10 seconds server waits additional 5 seconds and after that connection assumed to be broken and closed by server. So on UI you'll see connection status update only after 15 seconds when it is actually happened.\n\nYou can also change `HEARTBEAT` interval from hardware side via `Blynk.config`. In that case `newHeartbeatInterval * 2.3` formula will be applied. So in case you you decided to set `HEARTBEAT` interval to 5 seconds. You'll get notification regarding connection with 11 sec delay in worst case.\n\n## Project Settings\n\nEvery project has it's own settings:\n\n* **Theme** - switch between the Light and Black Blynk Theme \\(Business accounts have wider choice\\);\n* **Keep screen always on** - allows you to use the Blynk app without going to the sleep mode \\(usually all mobile devices do that\\);\n* **Send app connected command** - with this option enabled the server will send \"App Connected\" and \"App Disconnected\" commands \n\n  to your hardware when your Blynk app goes online/offline. [Usage example](https://github.com/blynkkk/blynk-library/blob/master/examples/More/AppConnectedEvents/AppConnectedEvents.ino);\n\n* **Do not show offline notifications** - right now, for debugging purposes, every time your hardware goes offline - the Blynk \n\n  Server will notify you with popup in the app about that. However, when debugging is not needed or the Blynk app is used only \n\n  via HTTP/S this notifications are meaningless. So this switch allows you to turn off this popups. Also this switch turns off \n\n  the Push notification \"Notify when offline\" option.\n\n## Change Widget properties\n\nChanging some of the widget properties from hardware side is also supported.  \nFor example, you can change the color of LED widget based on a condition:\n\n```text\n//change LED color\nBlynk.setProperty(V0, \"color\", \"#D3435C\");\n\n//change LED label\nBlynk.setProperty(V0, \"label\", \"My New Widget Label\");\n\n//change MENU labels\nBlynk.setProperty(V0, \"labels\", \"Menu Item 1\", \"Menu Item 2\", \"Menu Item 3\");\n```\n\n[Set Property for single value field](https://github.com/blynkkk/blynk-library/blob/master/examples/More/SetProperty/SetProperty_SingleValue/SetProperty_SingleValue.ino)\n\n[Set Property for multi value field](https://github.com/blynkkk/blynk-library/blob/master/examples/More/SetProperty/SetProperty_MultiValue/SetProperty_MultiValue.ino)\n\n**NOTE :**  Changing these parameters work **only** for widgets attached to Virtual pins \\(analog/digital pins won't work\\).\n\nFour widget properties are supported - `color`, `label`, `min`, `max` for all widgets :\n\n`label` is string for label of all widgets.\n\n`color` is string in [HEX](http://www.w3schools.com/html/html_colors.asp) format \\(in the form: \\#RRGGBB, where RR \\(red\\), GG \\(green\\) and BB \\(blue\\) are hexadecimal values between 00 and FF\\). For example :\n\n```text\n#define BLYNK_GREEN     \"#23C48E\"\n#define BLYNK_BLUE      \"#04C0F8\"\n#define BLYNK_YELLOW    \"#ED9D00\"\n#define BLYNK_RED       \"#D3435C\"\n#define BLYNK_DARK_BLUE \"#5F7CD8\"\n```\n\n`min`, `max` - minimum and maximum values for the widget \\(for example range for the Slider\\). This numbers may be float.\n\nOn firmware side, widget objects also support `setLabel()` and `setColor()` functions.\n\nWidget specific properties:\n\n**Button**\n\n`onLabel` / `offLabel` is string for ON/OFF label of button;\n\n**Styled Button**\n\n`onLabel` / `offLabel` is string for ON/OFF label of button;\n\n`onColor` / `offColor` is string in HEX format for ON/OFF colors of the button;\n\n`onBackColor` / `offBackColor` is string in HEX format for ON/OFF colors of the button background.\n\n**Music Player**\n\n`isOnPlay` is boolean accepts true/false.\n\n```text\nBlynk.setProperty(V0, \"isOnPlay\", \"true\");\n```\n\n**Menu**\n\n`labels` is list of strings for Menu widget selections;\n\n```text\nBlynk.setProperty(V0, \"labels\", \"label 1\", \"label 2\", \"label 3\");\n```\n\n**Video Streaming**\n\n```cpp\nBlynk.setProperty(V1, \"url\", \"http://my_new_video_url\");\n```\n\n**Step**\n\n```cpp\nBlynk.setProperty(V1, \"step\", 10);\n```\n\n**Image**\n\n```cpp\nBlynk.setProperty(V1, \"opacity\", 50); // 0-100%\n```\n\n```cpp\nBlynk.setProperty(V1, \"scale\", 30); // 0-100%\n```\n\n```cpp\nBlynk.setProperty(V1, \"rotation\", 10); //0-360 degrees\n```\n\nalso, you can fully replace the list of images from the hardware:\n\n```cpp\nBlynk.setProperty(V1, \"urls\", \"https://image1.jpg\", \"https://image2.jpg\");\n```\n\nor you can change individual image by it index:\n\n```cpp\nBlynk.setProperty(V1, \"url\", 1, \"https://image1.jpg\");\n```\n\nYou can also change widget properties via [HTTP API](http://docs.blynkapi.apiary.io/#).\n\n## Limitations and Recommendations\n\n* Don't put `Blynk.virtualWrite` and any other `Blynk.*` command inside `void loop()`- it will cause lot's of outgoing messages to our server and your connection will be terminated;\n* We recommend calling functions with intervals. For example, use [BlynkTimer](../#blynk-firmware-blynktimer)\n* Avoid using long delays with `delay()` – it may cause connection breaks;\n* If you send more than 100 values per second - you may cause [Flood Error](../#troubleshooting-flood-error) and your hardware will be automatically disconnected from the server;\n* Be careful sending a lot of `Blynk.virtualWrite` commands as most hardware is not very powerful \\(like ESP8266\\) so it may not handle many requests.\n\n"
  },
  {
    "path": "ru/blynkprotocol.md",
    "content": "# Blynk protocol\n\nBlynk transfers binary messages with the following structure:\n\n| Command | Message Id | Length/Status | Body |\n| :---: | :---: | :---: | :---: |\n| 1 byte | 2 bytes | 2 bytes | Variable |\n\nMessage Id and Length are [big endian](http://en.wikipedia.org/wiki/Endianness#Big-endian). Body has a command-specific format.\n\nCommand and Status definitions: [BlynkProtocolDefs.h](https://github.com/blynkkk/blynk-library/blob/master/Blynk/BlynkProtocolDefs.h)\n\nAnother protocol description can be found [here](https://github.com/blynkkk/blynk-server/blob/master/README_FOR_APP_DEVS.md#protocol-messages).\n\nTypical Blynk library knows how to send\\(S\\)/process\\(P\\):\n\n```text\nS   BLYNK_CMD_LOGIN + auth token\nSP  BLYNK_CMD_PING\nSP  BLYNK_CMD_RESPONSE\nSP  BLYNK_CMD_BRIDGE\nSP  BLYNK_CMD_HARDWARE\nS   BLYNK_CMD_TWEET\nS   BLYNK_CMD_EMAIL\nS   BLYNK_CMD_PUSH_NOTIFICATION\n```\n\n## HARDWARE/BRIDGE command body\n\nThe body of these commands are encoded as a sequence of strings, separated by `'\\0'` \\([Null character](http://en.wikipedia.org/wiki/Null_character)\\). Please note that the last value may be not Null-terminated. In the following command examples `\\0` chars are replaced with spaces.\n\n### Pin mode\n\nPinMode command is received by library after connection, or when a mobile application starts.\n\n```text\npm <pin> <mode>\npm <pin> <mode> <pin> <mode> <pin> <mode> ...\n```\n\nMode:\n\n* in - INPUT\n* out - OUTPUT\n* pu - INPUT\\_PULLUP\n* pd - INPUT\\_PULLDOWN\n\n### Digital pin operations\n\nDigital write:\n\n```text\ndw <pin> <val>\n```\n\nDigital read:\n\n```text\ndr <pin>\n```\n\n### Analog pin operations\n\n```text\naw <pin> <val>\n\nar <pin>\n```\n\n### Virtual pin operations\n\n```text\nvw <pin> <param0> <param1> <param2> <param3> ...\n\nvr <pin>\n```\n\n### Other operations\n\n```text\ninfo\n```\n\nTODO\n\n## Developer notes\n\n* Values in HW commands are plain text.\n* In response to `dr/ar` command, library should send `dw/aw` command on the same pin and with the same message id.\n* These situations should cause a connection drop, or reconnection attempt:\n  * Message with `ID=0` is received\n  * Message with unknown type is received\n\n## Adding network interface\n\n4 entities should be created to add a new network interface to Blynk:\n\n1. Select connection interface that will be used for Blynk operation. This should be something like [http://www.arduino.cc/en/Tutorial/WebClient](http://www.arduino.cc/en/Tutorial/WebClient) Based on the API of the connection, create the **Transport**. Some examples may be found in the Adapters folder:\n   * BlynkTransportSerial\n   * BlynkTransportCC3000\n   * BlynkArduinoClient - _can be reused, if possible_\n2. Create **Blynk representative class**, which contains connection-specific helper functions \\(like begin\\). Examples:\n   * BlynkEthernet\n   * BlynkSerial\n   * BlynkCC3000\n   * BlynkWildFire\n   * BlynkYun\n3. Create **BlynkSimple\\*** header for your connection. This constructs main **Blynk instance**, so the user \\(mostly\\) doesn't need to get into such details. Examples:\n   * BlynkSimpleEthernet.h\n   * BlynkSimpleCC3000.h\n   * BlynkSimpleWifi.h\n   * BlynkSimpleUIPEthernet.h\n4. Create a **simple example** for your platform ;\\)\n\n### Example implementations\n\nUse these to play with the protocol and understand the basics:\n\n* [Pseudo-library in Python](https://github.com/blynkkk/blynk-library/blob/master/tests/pseudo-library.py)\n* [Node.js + Espruino](https://github.com/vshymanskyy/blynk-library-js)\n* [Arduino](https://github.com/blynkkk/blynk-library)\n* [Particle Core](https://github.com/vshymanskyy/blynk-library-spark)\n\n"
  },
  {
    "path": "ru/blynkserver.md",
    "content": "# Сервер Blynk\n\nСервер Blynk - это Java-сервер с открытым исходным кодом, отвечающий за пересылку сообщений между мобильным приложением Blynk и различными платами микроконтроллеров \\(например, Arduino, Raspberry Pi и т. д.\\).\n\nЗагрузите последнюю сборку сервера:\n\n[Сервер Blynk &gt;](https://github.com/blynkkk/blynk-server/releases)\n\n## Зачем мне нужен локальный сервер Blynk?\n\n* Лучшая безопасность. Вы единственный, кто знает о сервере. Вы можете настроить политики безопасности в соответствии с вашими потребностями \\(MAC, IP-адреса, имена входа и т. Д.\\). Вы также можете сделать его доступным только в вашей частной сети.\n* Лучшая стабильность. Не нужно полагаться на стороннее облачное решение. У вас есть полный контроль.\n* Меньшая задержка обработки команд. Сервер как можно ближе к вам.\n* Максимальная конфиденциальность. Все данные хранятся локально и не передаются никому.\n\n## Установка вашего собственного локального сервера Blynk\n\nДля получения подробных инструкций, пожалуйста прочитайте [страницу GitHub](https://github.com/blynkkk/blynk-server#blynk-server).\n\n"
  },
  {
    "path": "ru/faq.md",
    "content": "# Часто задаваемые вопросы \\(FAQ\\)\n\n* Я поддержал Blynk на Kickstarter. Где мои виджеты и почему приложение бесплатное?\n\n  > Приложение бесплатно, потому что в противном случае вам придется заплатить, чтобы загрузить его. Так работает AppStore и Google Play. Текущая версия Blynk имеет ограниченное количество виджетов. Мы решили сделать их бесплатными для всех, пока не создадим магазин. После этого каждый виджет будет платным. Однако каждый спонсор получит их бесплатно \\(согласно нашему обещанию\\).\n\n* Что такое Blynk Cloud?\n\n  > Blynk Cloud - это программное обеспечение с открытым исходным кодом, написанное на Java с использованием простых и защищенных сокетов TCP/IP \\(для оборудования, которое его поддерживает\\) и работающее на нашем сервере. Приложения Blynk для iOS и Android по умолчанию подключаются к Blynk Cloud. Доступ бесплатен для каждого пользователя Blynk. Мы также предоставляем дистрибутив Private Server для тех, кто хочет [установить его локально](../#blynk-server).\n\n* Сколько стоит доступ к Cloud Blynk Server?\n\n  > Доступ бесплатен для каждого пользователя Blynk.\n\n* Могу ли я запустить сервер Blynk локально?\n\n  > Да. Те из вас, кому нужна дополнительная безопасность или нет подключения к Интернету, могут установить локальный сервер Blynk и запустить его в своей локальной сети. Blynk Server имеет открытый исходный код, и его развертывание занимает менее нескольких секунд. Все инструкции и файлы находятся [здесь](../#blynk-server).\n\n* What are the requirements to run Private Blynk Server?\n\n  > To run Private Blynk Server, all you need is Java Runtime Environment.\n\n* Каковы требования для запуска локального Blynk Сервера?\n\n  > Для запуска локального Blynk Сервера все, что вам нужно, это Java Runtime Environment.\n\n* Могу ли я запустить сервер Blynk на Raspberry Pi?\n\n  > Да, конечно! [инструкция](../#blynk-server-how-to-run-local-blynk-server-launch-blynk-server-on-raspberry-pi).\n\n* Приложение Blynk работает через Bluetooth?\n\n  > Да. Это в работает даже в бета-версии.\n\n* Blynk поддерживает Ethernet / Wi-FI / UART?\n\n  > Да, все из них. См. Полный список [поддерживаемого оборудования](../#support-hardware) и плат расширений.\n\n* У меня нет платы расширения. Могу ли я использовать Blynk с моим компьютером?\n\n  > Да, вы можете использовать Blynk только с помощью USB-кабеля. Существует [пошаговая инструкция](../#other-hardware-connect-over-usb) о том, как это сделать.\n\n* Может ли Blynk справиться с несколькими Arduinos?\n\n  > Да. Есть 3 способа:\n  >\n  > * добавить несколько устройств в ваш проект.\n  > * вы можете использовать один и тот же [Auth Token](../#Getting-Start-Getting-Start-With-Application-Auth-Token) для разного оборудования. В этом случае вы можете управлять несколькими аппаратными средствами с одной панели.\n  > * вы можете сделать это, используя [функцию моста](../#widgets-other-bridge), которая позволяет отправлять сообщения с одного оборудования на другое.\n\n* Сохраняет ли сервер Blynk данные датчиков, когда приложение отключается?\n\n  > Да, каждая команда, отправляемая оборудованием на сервер, сохраняется. Вы можете использовать виджет [Диаграмма](../#widgets-display-superchart) для его просмотра.\n\n* Сколько виртуальных пинов я могу использовать?\n\n  > Это зависит в основном от вашего оборудования. Младшее оборудование может использовать до 32 виртуальных пинов. Более мощный \\(например, ESP8266\\) может использовать до 128, но для этого требуется указать свойство BLYNK\\_USE\\_128\\_VPINS в вашем скетче. [Пример](https://github.com/blynkkk/blynk-library/blob/master/src/Blynk/BlynkConfig.h#L64).\n\n* Почему приложение требует все эти разрешения?\n\n  > [http://help.blynk.cc/faq/blynk-android-permissions-explained](http://help.blynk.cc/faq/blynk-android-permissions-explained)\n\n"
  },
  {
    "path": "ru/gettingstarted.md",
    "content": "# Начало работы\n\nДавайте начнем уже через 5 минут \\(чтение не считается!\\). Мы включим светодиод, подключенный к вашему Arduino, с помощью приложения Blynk на вашем смартфоне.\n\nПодключите светодиод, как показано на рисунке:\n\n![](../.gitbook/assets/Arduino_LED.jpg)\n\n## Начало работы с приложением Blynk\n\n### 1. Создать учетную запись Blynk\n\nПосле загрузки приложения Blynk вам необходимо создать новую учетную запись Blynk. Если она у вас уже есть, помните: эта учетная запись отделена от учетных записей, используемых для форума Blynk.\n\nМы рекомендуем использовать **реальный** адрес электронной почты, потому что это упростит ситуацию с настройкой.\n\n![](../.gitbook/assets/register_account.png)\n\n#### Зачем я должен создавать аккаунт?\n\nУчетная запись необходима для хранения ваших проектов и доступа к ним с нескольких устройств из любого места. Также это мера безопасности.\n\nВы всегда можете настроить свой собственный [локальный Blynk сервер](../#blynk-server) и иметь полный контроль.\n\n### 2. Создать новый проект\n\nПосле того, как вы успешно вошли в свой аккаунт, начните с создания нового проекта.\n\n![](../.gitbook/assets/create_project_button.png)\n\n### 3. Выберите ваше оборудование\n\nВыберите модель оборудования, которую вы будете использовать. Проверьте [список поддерживаемого оборудования](../#support-hardware)!\n\n![](../.gitbook/assets/select_hardware.png)\n\n### 4. Ключ авторизации \\(Auth Token\\)\n\n**Ключ авторизации** - это уникальный идентификатор, необходимый для подключения вашего оборудования к вашему смартфону. Каждый новый проект, который вы создаете, будет иметь свой собственный Ключ авторизации. Вы получите Ключ авторизации автоматически на вашу электронную почту после создания проекта. Вы также можете скопировать его вручную. Нажмите на раздел устройств и выберите необходимое устройство:\n\n![](../.gitbook/assets/token_1.png)\n\nИ вы увидите ключ:\n\n![](../.gitbook/assets/new_device.png)\n\n**ПРИМЕЧАНИЕ:** Не передавайте свой Ключ авторизации кому-либо, если только вы не хотите, чтобы кто-то имел доступ к вашему оборудованию.\n\nОтправлять ключ по электронной почте очень удобно. Нажмите кнопку `e-mail`, и токен будет отправлен на адрес электронной почты, который вы использовали для регистрации. Вы также можете нажать на строку Ключа, и она будет скопирована в буфер обмена.\n\nТеперь нажмите кнопку **\"Создать\"**.\n\n![](../.gitbook/assets/new_project.png)\n\n### 5. Добавить виджет\n\nВаш рабочий стол проекта пуст, давайте добавим кнопку для управления нашим светодиодом.\n\nНажмите в любом месте на рабочем столе, чтобы открыть окно виджета. Все доступные виджеты расположены здесь. Теперь выберите виджет кнопку \\(Button\\).\n\n**Окно виджетов \\(Widget Box\\)**\n\n![](../.gitbook/assets/widgets_box.png)\n\n**Схвати-И-Брось \\(Drag-n-Drop\\)** - Нажмите и удерживайте виджет, чтобы перетащить его на новое место.\n\n**Настройки виджета \\(Widget Settings\\)** - Каждый виджет имеет свои настройки. Нажмите на виджет, чтобы добраться до них.\n\n![](../.gitbook/assets/button_settings.png)\n\nНаиболее важным параметром для установки является **PIN** \\(контакт\\). Список контактов отражает физические контакты, определенные вашим оборудованием. Если ваш светодиод подключен к цифровому выводу 8 - выберите **D8** \\(**D** - означает digital - цифровой\\).\n\n![](../.gitbook/assets/pin_selection%20%281%29.png)\n\n### 6. Запустить проект\n\nКогда вы закончите с настройками - нажмите кнопку **PLAY**. Это переключит вас из режима EDIT в режим PLAY, где вы можете взаимодействовать с оборудованием. В режиме воспроизведения вы не сможете перетаскивать или настраивать новые виджеты, нажав **STOP** вы вернетесь в режим редактирования.\n\nВы получите сообщение \"Arduino UNO is offline\" \\(Arduino UNO не в сет\\). Мы рассмотрим это в следующем разделе.\n\n![](../.gitbook/assets/play_button.png)\n\n## Начало работы с оборудованием\n\n### Как использовать пример кода\n\nУ вас должна быть установлена библиотека Blynk на вашем компьютере. Если нет - [нажмите здесь](../#downloads-blynk-library).\n\nПримеры скетчей \\(кода\\) помогут вам быстро подключить ваше оборудование и основные функции Blynk.\n\nОткройте пример эскиза в соответствии с используемой моделью оборудования или платой.\n\n![](../.gitbook/assets/connection_type_sketch.png)\n\nДавайте рассмотрим пример кода для [Arduino UNO + Ethernet-плата](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n```cpp\n#define BLYNK_PRINT Serial\n#include <SPI.h>\n#include <Ethernet.h>\n#include <BlynkSimpleEthernet.h>\n\nchar auth[] = \"YourAuthToken\";\n\nvoid setup()\n{\n  Serial.begin(9600); // Наблюдайет за состоянием подключения в терминале.\n  Blynk.begin(auth);  // Здесь ваше Arduino подключается к облаку Blynk.\n}\n\nvoid loop()\n{\n  Blynk.run(); // Все чудеса Blynk происходят здесь...\n}\n```\n\n### Ключ авторизации \\(Auth Token\\)\n\nВ этом примере скейтча найдите такую строку:\n\n```cpp\nchar auth[] = \"YourAuthToken\";\n```\n\nThis is the [Auth Token](../#getting-started-getting-started-with-application-4-auth-token) that you emailed yourself. Please check your email and copy it, then paste it inside the quotation marks.\n\nЭто [Ключ авторизации](../#getting-started-getting-started-with-application-4-auth-token), который вы должны отправить себе по электронной почте из приложения Blynk. Проверьте свою электронную почту, скопируйте его и вставьте в кавычки.\n\nДолжно выглядеть примерно так:\n\n```text\nchar auth[] = \"f45626c103a94983b469637978b0c78a\";\n```\n\nЗагрузите скейтч в плату и откройте последовательный терминал. Подождите, пока не увидите что-то вроде этого:\n\n```text\nBlynk v.X.X.X\nYour IP is 192.168.0.11\nConnecting...\nBlynk connected!\n```\n\n**Великолепно! У вас все настроено! Теперь ваше оборудование подключено к Blynk Cloud!**\n\n## Используем Blynk\n\nВернитесь в приложение Blynk, нажмите кнопку и включите и выключите светодиод! Это должен быть наш Blynk.\n\n![](../.gitbook/assets/button_pressed.png)\n\nИзучайте [другие примеры скетчей](https://github.com/blynkkk/blynk-library/tree/master/examples).\n\nНе стесняйтесь экспериментировать и комбинировать различные примеры вместе, чтобы создавать свои собственные удивительные проекты.\n\nНапример, подключите светодиод к выводу, с активным [ШИМ](http://www.arduino.cc/en/Tutorial/Fading) на Arduino и установите виджет - Слайдер \\(Slider\\) для управления яркостью светодиода. Используя те же шаги, что описанны выше.\n\n"
  },
  {
    "path": "ru/hardwaresetups.md",
    "content": "# Аппаратные настройки\n\n## Arduino через USB \\(без расширительных плат\\)\n\nЕсли у вас нет расширительной платы и ваше оборудование не имеет подключения к сети, вы все равно можете использовать Blynk - напрямую через USB:\n\n1. Откройте [Arduino Serial USB пример](https://github.com/blynkkk/blynk-library/blob/master/examples/Boards_USB_Serial/Arduino_Serial_USB/Arduino_Serial_USB.ino) и замените [Auth Token](../#getting-started-getting-started-with-application-4-auth-token)\n\n```cpp\n// Вы можете использовать запасной аппаратный серийный порт на платах, которые его имеют (например, Mega)\n#include <SoftwareSerial.h>\nSoftwareSerial DebugSerial(2, 3); // RX, TX\n\n#define BLYNK_PRINT DebugSerial\n#include <BlynkSimpleStream.h>\n\n// Вы должны получить Auth Token в приложении Blynk.\n// Перейдите в настройки проекта (значок гайки).\nchar auth[] = \"YourAuthToken\";\n\nvoid setup()\n{\n  // Debug console\n  DebugSerial.begin(9600);\n\n  // Blynk will work through Serial\n  Serial.begin(9600);\n  Blynk.begin(auth, Serial);\n}\n\nvoid loop()\n{\n  Blynk.run();\n}\n```\n\n1. Запустите скрипт, который обычно находится в папке `/scripts`:\n   * Windows:`My Documents\\Arduino\\libraries\\Blynk\\scripts`\n   * Mac    `User$/Documents/Arduino/libraries/Blynk/scripts`\n\n**На Windows:**\n\nОткройте командную строку cmd.exe\n\nЗадайте свой путь к папке blynk-ser.bat. Например:\n\n```text\ncd C:\\blynk-library-0.3.1\\blynk-library-0.3.1\\scripts\n```\n\nRun `blynk-ser.bat` file. For example : `blynk-ser.bat -c COM4` \\(where COM4 is port with your Arduino\\) Запустите файл `blynk-ser.bat`. Например: `blynk-ser.bat -c COM4` \\(где COM4 - порт с вашим Arduino\\)\n\nИ нажмите «Ввод», нажмите «Ввод» и нажмите «Ввод»...\n\n**На Linux и Mac**:\n\nПерейдите в папку `/scripts.` Например:\n\n```text\ncd User$/Documents/Arduino/libraries/Blynk/scripts\n```\n\nКогда окажетесь внутри этой папки, запустите:\n\n```text\nuser:scripts User$ ./blynk-ser.sh\n```\n\n**Предупреждение:** Не закрывайте окно терминала с запущенным скриптом.\n\nВ некоторых случаях вам также может потребоваться выполнить:\n\n```text\nuser:scripts User$ chmod +x blynk-ser.sh\n```\n\nВам также может понадобиться запустить скрипт с функцией `sudo`\n\n```text\nuser:scripts User$ sudo ./blynk-ser.sh\n```\n\nВот что вы увидите в приложении Terminal на Mac \\(адрес usbmodem может быть другим\\):\n\n```text\n[ Press Ctrl+C to exit ]\n/dev/tty.usbmodem not found.\nSelect serial port [ /dev/tty.usbmodem1451 ]:\n```\n\nСкопируйте адрес последовательного порта: `/dev/ tty.usbmodem1451` и вставьте его обратно:\n\n```text\nSelect serial port [ /dev/tty.usbmodem1451 ]: /dev/tty.usbmodem1451\n```\n\nПосле того, как вы нажмете Enter, вы увидите текст, похожий на этот:\n\n```text\nResetting device /dev/tty.usbmodem1451...\nConnecting: GOPEN:/dev/tty.usbmodem1451,raw,echo=0,clocal=1,cs8,nonblock=1,ixoff=0,ixon=0,ispeed=9600,ospeed=9600,crtscts=0 <-> openssl-connect:blynk-cloud.com:9443,cafile=/Users/.../server.crt,nodelay\n2015/10/03 00:29:45 socat[30438.2046857984] N opening character device \"/dev/tty.usbmodem1451\" for reading and writing\n2015/10/03 00:29:45 socat[30438.2046857984] N opening connection to LEN=16 AF=2 45.55.195.102:9443\n2015/10/03 00:29:45 socat[30438.2046857984] N successfully connected from local address LEN=16 AF=2 192.168.0.2:56821\n2015/10/03 00:29:45 socat[30438.2046857984] N SSL connection using AES128-SHA\n2015/10/03 00:29:45 socat[30438.2046857984] N starting data transfer loop with FDs [3,3] and [4,4]\n```\n\n**ПРИМЕЧАНИЕ:** Arduino IDE может жаловаться на то, что «программа не отвечает». Вам необходимо прекратить выполнение скрипта перед загрузкой нового скейтча.\n\n**Дополнительные материалы:**\n\n* [Учебник: Управление Arduino через USB с приложением Blynk. Плата Ethernet не требуется. Mac OS](https://www.youtube.com/watch?v=fgzvoan_3_w)\n* [Как управлять Arduino \\(без проводов\\) с помощью blynk через USB. Windows](https://www.youtube.com/watch?v=I_hgIj2FdPI)\n* [Учебные пособия: управление Arduino с помощью Blynk через USB](http://www.instructables.com/id/Control-arduino-using-Blynk-over-usb/)\n\n## Raspberry Pi\n\n1. Подключите Raspberry Pi к Интернету и откройте его консоль.\n2. Запустите эту команду \\(она обновляет ваш репозиторий пакетов операционной системы, чтобы добавить необходимые пакеты\\):\n\n   ```text\n    curl -sL \"https://deb.nodesource.com/setup_6.x\" | sudo -E bash -\n   ```\n\n3. Загрузите и соберите библиотеку Blynk JS, используя npm:\n\n   ```text\n    sudo apt-get update && sudo apt-get upgrade\n    sudo apt-get install build-essential\n    sudo apt-get install -g npm \n    sudo npm install -g onoff\n    sudo npm install -g blynk-library\n   ```\n\n4. Запустите тестовый скрипт Blynk \\(поставьте свой ключ авторизации\\):\n\n   ```text\n    blynk-client 715f8cafe95f4a91bae319d0376caa8c\n   ```\n\n5. Вы можете написать свой собственный скрипт на основе [примеров](https://github.com/vshymanskyy/blynk-library-js/tree/master/examples)\n6. Чтобы включить автоматический перезапуск Blynk для Pi, найдите файл `/etc/rc.local` и добавьте туда:\n\n   ```text\n    node full_path_to_your_script.js <Auth Token>\n   ```\n\n**Дополнительные материалы:**\n\n* [Учебные пособия: Blynk на Javascript для Raspberry Pi, Intel Edison и другие](http://www.instructables.com/id/Blynk-JavaScript-in-20-minutes-Raspberry-Pi-Edison)\n* [Учебные пособия: использование датчиков DHT11/DHT12 с Raspberry Pi и Blynk](http://www.instructables.com/id/Raspberry-Pi-Nodejs-Blynk-App-DHT11DHT22AM2302/?ALLSTEPS)\n\n**Примечание:** Вместо использования Node.js вы также можете создать версию библиотеки C++ \\(такую же, как для Arduino, на основе WiringPi\\):\n\n* [Библиотека README для Linux](https://github.com/blynkkk/blynk-library/blob/master/linux/README.md)\n* [Тема сообщества Blynk: How-To Raspberry Pi](https://community.blynk.cc/t/howto-for-raspberry-pi/332)\n* [Видеоурок - Настройка Blynk и Raspberry Pi](https://www.youtube.com/watch?v=iSG_8g6KyGE)\n\n## Беспроводной ESP8266\n\nВы можете запустить Blynk прямо на ESP8266!\n\nУстановите последнюю версию библиотеки ESP8266 для Arduino, используя [это руководство](https://github.com/esp8266/Arduino#installing-with-boards-manager).\n\n**Пример кода:** [ESP8266\\_Standalone](https://github.com/blynkkk/blynk-library/blob/master/examples/Boards_WiFi/ESP8266_Standalone/ESP8266_Standalone.ino)\n\n**Дополнительные материалы:**\n\n* [Учебные пособия: ESP8266 ESP-12 \\(Беспроводной\\) + Blynk](http://www.instructables.com/id/ESP8266-ESP-12Standalone-Blynk-101)\n* [Учебные пособия: ESP8266-12 \\(Беспроводной\\) датчик температуры lm35 + Blynk](http://www.instructables.com/id/ESP8266-12-blynk-wireless-temperature-LM35-sensor/?ALLSTEPS)\n* [Пошаговое руководство на русском языке](http://esp8266.ru/esp8266-blynk)\n\n## NodeMCU\n\nПожалуйста, следуйте [этой подробной инструкции](https://github.com/blynkkk/blynk-library/tree/master/examples/Boards_WiFi/NodeMCU#instruction-for-nodemcu-setup). Или посмотрите [этот видеоурок](https://www.youtube.com/watch?v=FhS44hGk1Lc).\n\n## Arduino + ESP8266 WiFi с AT командами\n\nЭтот тип подключения не рекомендуется для начинающих. Если вы хотите попробовать, пожалуйста, внимательно прочитайте [этот раздел справки](http://help.blynk.cc/hardware-and-libraries/arduino/esp8266-with-at-firmware)\n\n**Примечание:** Некоторые платы, такие как Arduino UNO WiFi от Arduino.org, не используют AT-команды \\(и не предоставляют соответствующих библиотек\\), поэтому это делает их непригодными для использования с Blynk.\n\n## Particle\n\nBlynk работает со всем семейством продуктов Particle: Core, Photon и Electron.\n\n1. Открыть [Particle Web IDE](https://build.particle.io/build). Требуется регистрация.\n2. Идем в библиотеки.\n3. Найдите  **Blynk**  в общих библиотеках и нажмите на него.\n4. Откройте пример `01_PARTICLE.INO`.\n5. Нажмите «использовать этот пример» \\(use this example\\).\n6. Поместите свой токен здесь: `char auth [] =\"YourAuthToken\";` и прошейте Particle!\n\nВы можете отсканировать этот QR-код из приложения Blynk, и вы получите готовый к тесту проект для **Particle Photon**. Просто вставьте свой токен ключ в пример `01_PARTICLE.INO`.\n\n![](../.gitbook/assets/Particle%20Demo1530733075.png)\n\n**Дополнительные материалы:**\n\n* [Ядро Particle + DHT22](https://www.hackster.io/gusgonnet/temperature-humidity-monitor-with-blynk-7faa51)\n\n"
  },
  {
    "path": "ru/http.md",
    "content": "# HTTP RESTful API\n\nBlynk HTTP RESTful API позволяет легко считывать и записывать значения Pins в приложениях Blynk и на оборудовании. Описание API можно найти [здесь](http://docs.blynkapi.apiary.io). **Предупреждение**: Blynk HTTP API все еще имеет проблему с GEO DNS. Это означает, что вам нужно использовать прямой IP-адрес сервера вместо WEB-имени, чтобы заставить его работать с такими сторонними сервисами, как IFTTT.\n\n"
  },
  {
    "path": "ru/implementing.md",
    "content": "# Implementing a Blynk HW client \\(library\\)\n\nCurrently we provide Arduino/C++ implementation of the library. It is very extensible and modular, look at [the list of supported hardware](../#supported-hardware). Adding new connection types and Arduino-compatible boards is easy.\n\nTODO: Porting guide.\n\nBut some devices are programmed in other languages, like:\n\n* Espruino, JavaScript, Node.JS\n* MicroPython, Python\n* NodeMCU, eLua\n\nThis document hints how to write a custom library.\n\n## Blynk library main functions\n\n* Provide easy-to use API\n  * Virtual pin handlers registration\n  * Provide comfortable wrappers for some widgets\n* Manage connection\n  * Should support different connection type/hardware, if applicable\n* Serialize/deserialize Blynk protocol\n* Handle direct pin operations\n* Should be portable across similar devices \\(or same technology/programming language\\), if possible\n* Should detect and notify the user about [troubles](../#troubleshooting) where possible \\(especially Flood\\)\n\n### Adding new HW board\n\nDifferent boards can be added by creating JSON board description file.\n\n```javascript\n{\n    \"name\": \"Arduino UNO\",\n    \"map\": {\n        \"digital\": {\n            \"pins\": {\n                \"D0\":  0,  \"D1\":  1,  \"D2\":  2,  \"D3\":  3, \"D4\": 4,\n                \"D5\":  5,  \"D6\":  6,  \"D7\":  7,  \"D8\":  8, \"D9\": 9,\n                \"D10\": 10, \"D11\": 11, \"D12\": 12, \"D13\": 13\n            },\n            \"ops\": [ \"dr\", \"dw\" ]\n        },\n        \"analog\": {\n            \"pins\": {\n                \"A0\": 14, \"A1\": 15, \"A2\": 16, \"A3\": 17, \"A4\": 18, \"A5\": 19\n            },\n            \"ops\": [ \"dr\", \"dw\", \"ar\" ],\n            \"arRange\":[0, 1023]\n        },\n        \"pwm\": {\n            \"pins\": [\n                \"D3\", \"D5\", \"D6\", \"D9\", \"D10\", \"D11\"\n            ],\n            \"ops\": [ \"aw\" ],\n            \"awRange\":[0, 255]\n        },\n        \"virtual\":  {\n            \"pinsRange\": [ 0, 31 ],\n            \"ops\": [ \"vr\", \"vw\" ]\n        }\n    }\n}\n```\n\nLook at the [full boards list](https://github.com/blynkkk/blynk-library/tree/master/boards_json). You can send us your own board description file for review and App integration.\n\nThere may be a problem that you want to start testing your implementation, but your board is not listed int the Blynk App. On Android, we now have a \"Generic Board\" specially for such purposes. Unfortunately iOS does not have it yet.\n\nBasically you can select UNO board and check how it works using just virtual pins. Most digital pins will also work. Analog IO/PWM will not work in general, until we add your board to the App.\n\n"
  },
  {
    "path": "ru/introanddownloads.md",
    "content": "# IntroAndDownloads\n\n## Введение\n\nЭто руководство поможет вам понять, как начать использовать Blynk, и даст исчерпывающий обзор всех функций.\n\nЕсли вы хотите начать использовать Blynk, ознакомьтесь с разделом Начало работы.   \n\n\n[Начало работы &gt;](../#getting-started)\n\n### Как работает Blynk\n\nБлинк был разработан для \"Интернета вещей\" \\([Internet of Things](https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82_%D0%B2%D0%B5%D1%89%D0%B5%D0%B9)\\). Он может управлять оборудованием удаленно, отображать данные датчиков, хранить данные, визуализировать их и делать много других интересных вещей.\n\nВ платформе есть три основных компонента:\n\n* **Blynk App \\(Приложение-клиент\\)** - позволяет вам создавать разнообразные интерфейсы для ваших проектов, используя различные виджеты.\n* **Blynk Server \\(Сервер\\)** - отвечает за все коммуникации между смартфоном и оборудованием. Вы можете использовать наше Облако Blynk или запустить свой [личный сервер Blynk](../#blynk-server) локально. Он с открытым исходным кодом, может легко обрабатывать тысячи устройств и даже может быть запущен на устройствах типа Raspberry Pi.\n* **Blynk Libraries \\(Библиотеки\\)** - разработаны для всех популярных аппаратных платформ - обеспечивают связь с сервером и обрабатывать все входящие и исходящие команды.\n\nА теперь представьте: каждый раз, когда вы нажимаете кнопку в приложении Blynk, сообщение отправляется в ~~пространство~~ Облако Blynk, где оно \"волшебным\" образом попадает на ваше оборудование. Передача работает и в противоположном направлении, а все происходит в \"мгновение ока\".\n\n![](../.gitbook/assets/architecture.png)\n\n### Характеристики\n\n* Типовой API и пользовательский интерфейс для всех поддерживаемых устройств и оборудования\n* Подключение к сети с помощью:\n  * Wi-Fi\n  * Bluetooth и BLE\n  * Ethernet\n  * USB \\(последовательный\\)\n  * GSM\n  * ...\n* Набор, простых в использовании, виджетов\n* Прямое управление пин-ами без написания кода\n* Простота интеграции и добавления новых функций с помощью виртуальных пин-ов\n* Мониторинг истории данных с помощью виджета [Диаграмма \\(SuperChart\\)](../#widgets-displays-superchart)\n* Связать устройства между собой при помощью виджета [Мост \\(Bridge\\)](../#widgets-other-bridge)\n* Отправка электронных писем, твитов, push-уведомлений и т.д.\n* ... постоянно добавляются новые функции!\n\nВы можете найти [Примеры кода](https://github.com/blynkkk/blynk-library/tree/master/examples), охватывающие основные функции Blynk. Они так же включены в библиотеку Blynk. Все примеры разработаны так, чтобы их можно было легко комбинировать друг с другом.\n\n### Что нужно для использования Blynk?\n\nВ этот момент вы можете подумать: **«Хорошо, я хочу попробовать. Что мне нужно, чтобы начать?»** - на самом деле, всего пара вещей:\n\n#### **1. Аппаратные средства**.\n\nArduino, Raspberry Pi или аналогичный набор для разработки.\n\n**Blynk работает через Интернет.** Это означает, что выбранное вами оборудование должно иметь возможность подключаться к Интернету. Некоторым платам, таким как Arduino Uno, понадобится Ethernet или Wi-Fi Shield для связи, другие уже подключены к Интернету, например: ESP8266, Raspberri Pi с WiFi-ключом, Particle Photon или SparkFun Blynk Board. Но даже если у вас нет подключения к сети, вы можете подключить устройства через USB к своему ноутбуку или настольному компьютеру \\(для новичков это немного сложнее, но мы вам поможем\\). Что действительно круто, так это то, что [список оборудования](../#support-hardware), который работает с Blynk, огромен и продолжает расти.\n\n#### **2. Смартфон**.\n\nПриложение Blynk - это качественно разработанный конструктор интерфейсов. Он работает как на iOS, так и на Android, давайте здесь обойдемся без священной войны, хорошо?\n\n## Загрузки\n\n### **Приложения Blynk для iOS или Android** \n\n[![Drawing](../.gitbook/assets/appstore-lrg.svg)](https://itunes.apple.com/us/app/blynk-control-arduino-raspberry/id808760481?ls=1&mt=8)        [![Drawing](https://play.google.com/intl/en_us/badges/images/apps/en-play-badge.png)](https://play.google.com/store/apps/details?id=cc.blynk)\n\n### **Blynk библиотека** \n\n[Скачать библиотеку Blynk &gt;](https://github.com/blynkkk/blynk-library/releases/latest)\n\nЕсли вы забыли или не знаете, как установить библиотеки Arduino [нажмите здесь](http://www.arduino.cc/en/guide/libraries).\n\n"
  },
  {
    "path": "ru/license.md",
    "content": "# Лицензия\n\nЭтот проект выпущен под лицензией Открытого Программного Обеспечения \\([MIT](https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D1%8F_MIT)\\).\n\n"
  },
  {
    "path": "ru/links.md",
    "content": "# Ссылочная информация\n\n* [Blynk site](https://www.blynk.cc)\n* [Blynk community](https://community.blynk.cc)\n* [Facebook](https://www.fb.com/blynkapp)\n* [Twitter](https://twitter.com/blynk_app)\n* [Blynk Library](https://github.com/blynkkk/blynk-library)\n* [Blynk Examples](https://github.com/blynkkk/blynk-library/tree/master/examples)\n* [Blynk Server](https://github.com/blynkkk/blynk-server)\n* [Kickstarter campaign](https://www.kickstarter.com/projects/167134865/blynk-build-an-app-for-your-arduino-project-in-5-m/description)\n\n"
  },
  {
    "path": "ru/ota.md",
    "content": "# Обновление \"по воздуху\" \\(OTA\\)\n\nBlynk также поддерживает беспроводное обновления для плат ESP8266, NodeMCU и SparkFun Blynk. На данный момент ОТА поддерживается только для частных серверов и для платных клиентов.\n\n## Как это работает?\n\n* Вам нужно использовать [обычный скетч для экспортируемых приложений](https://github.com/blynkkk/blynk-library/tree/master/examples/Blynk.Inject/Template_ESP8266);\n* После того, как вы запустили свое оборудование, все готово к обвнолению \"по воздуху\";\n* Вы можете запустить обновление прошивки для конкретного оборудования через его токен или для всего оборудования в сети.\n\n### Заливка прошивки\n\n1. Пользователь запускает OTA одним из нижеуказанных HTTPS-запросов;\n2. Пользователь предоставляет в HTTPS-запросе учетные данные администратора и двоичный файл прошивки для обновления оборудования;\n3. Когда оборудование подключается к серверу - сервер проверяет его прошивку. В случае, если дата сборки аппаратной прошивки старше загруженной прошивки, сервер отправляет на аппаратное обеспечение специальную команду с URL для новой прошивки;\n4. Оборудование обработает указанный URL-адрес таким [обработчиком](https://github.com/blynkkk/blynk-library/blob/master/examples/Blynk.Inject/Template_ESP8266/OTA.h#L31):\n\n   ```text\n      BLYNK_WRITE(InternalPinOTA) {\n        //URL адрес с прошивкой. Возможен только HTTP адрес\n        //http://localhost:8080/static/ota/FUp_2441873656843727242_upload.bin\n        overTheAirURL = param.asString();\n        ...\n      }\n   ```\n\n5. Обрудование самостоятельно загружает новую прошивку и начинает обновление;\n\n## Выборочное обновление для конкретного оборудования\n\n```text\ncurl -v -F file=@Template_ESP8266.ino.nodemcu.bin --insecure -u admin@blynk.cc:admin https://localhost:9443/admin/ota/start?token=123\n```\n\n* `Template_ESP8266.ino.nodemcu.bin` - относительный \\(или полный\\) путь к вашей прошивке;\n* `--insecure` флаг для серверов с самостоятельно созданными сертификатами. Вам не нужен этот флаг, если вы использовали Let's Encrypt или другие доверенные сертификаты;\n* `admin@blynk.cc:admin` учетные данные администратора на вашем сервере. Указаны значения по умлочанию. Формат: `username:password`. Вы можете изменить имя пользователя и пароль в файле `server.properties`;\n* `token` ключь является признаком вашего оборудования, к которому вы хотите применить обновление прошивки. Обновление прошивки будет начато только в том случае, если устройство подключено к сети;\n\n## Обновление \"по воздуху\" для всех устройств\n\nОбновление для всех устройств будет запускаться только тогда, когда они подключены к облаку. Для этого вам нужно удалить часть с токен ключом.\n\n```text\ncurl -v -F file=@Template_ESP8266.ino.nodemcu.bin --insecure -u admin@blynk.cc:admin https://localhost:9443/admin/ota/start\n```\n\nВ этом случае OTA будет срабатывать сразу после подключения устройства к серверу. Если устройство подключено к сети, обновление встроенного ПО будет начато только после повторного подключения устройства.\n\n## Обновление \"по воздуху\" от конкретного пользователя\n\nВ этом случае обновление прошивки будет срабатывать для всех устройств, указанных пользователем.\n\n```text\ncurl -v -F file=@Template_ESP8266.ino.nodemcu.bin --insecure -u admin@blynk.cc:admin https://localhost:9443/admin/ota/start?user=pupkin@gmail.com\n```\n\n## Обновление \"по воздуху\" для конкретного пользователя и проекта\n\nВ этом случае обновление прошивки будет срабатывать для всех устройств указанного пользователя в указанном проекте.\n\n```text\ncurl -v -F file=@Template_ESP8266.ino.nodemcu.bin --insecure -u admin@blynk.cc:admin https://localhost:9443/admin/ota/start?user=pupkin@gmail.com&project=123\n```\n\n## Остановка OTA\n\n```text\ncurl -v --insecure -u admin@blynk.cc:admin https://localhost:9443/admin/ota/stop\n```\n\n## Как сделать бинарную прошивку\n\nЧтобы сделать прошивку в Arduino IDE - зайдите в меню: Скетч -&gt; Экспорт бинарного файла.\n\n**ПРИМЕЧАНИЕ:** ESP8266 принимает прошивку только по протоколу HTTP, а не HTTPS.\n\n"
  },
  {
    "path": "ru/readme.md",
    "content": "\n### Перевод на русский язык.\n\nWEB-help. Copyright, 2019.\n"
  },
  {
    "path": "ru/roadmap.md",
    "content": "# Roadmap\n\nWe build Blynk based on Blynkers feedback but with limited resources we have to prioritize our features. At the moment list look like that:\n\n* App Sharing \\(project sharing when other people can control your hardware, but can't modify your project\\); Free Beta\n* App Sharing \\(project sharing when other people can control your hardware, but can't modify your project\\); Subscription based\n* Bluetooth Low Energy support;\n* Hardware state handling \\(changing physical button state changes Blynk application state\\);\n* Hardware online/offlane state improvements \\(better indication for \"is hardware online?\", \"is hardware offline?\"\\);\n* Project space increase\n* Direct Connect support \\(for WiFi\\);\n* RTC widget;\n* Design options for widgets \\(size, button with icons, etc\\);\n* Phone sensors widgets \\(GPS, accelerometer\\);\n* IP camera support;\n* Customizable look and feel of the project\n\nUnder consideration:\n\n* Home screen widget \\(to avoid opening App when you need only 1 button click\\);\n* Haptic feedback \\(vibration\\) when touching widgets\n\n"
  },
  {
    "path": "ru/ru.md",
    "content": "# Перевод на русский язык.\n\nWEB-help. Copyright, 2019.\n\n"
  },
  {
    "path": "ru/security.md",
    "content": "# Безопасность\n\nСервер Blynk имеет 5 открытых портов с разным уровнем безопасности.\n\n* **80** - простое TCP-соединение до оборудования \\(без защиты\\)\n* **8080** - простое TCP-соединение для оборудования на локальном сервере \\(без защиты\\)\n* **443** - соединение SSL/TLS для мобильных приложений и оборудования с SSL шифрованием\n* **9443** - соединение SSL / TLS для мобильных приложений на локальном сервере и оборудования с SSL шифрованием\n\nОборудование может выбрать подключение к 443 \\(9443\\) или 80 \\(8080\\), в зависимости от его совместимости. Соединение между приложением и сервером всегда осуществляется через SSL/TLS шифрование, поэтому оно всегда защищено. Соединение между оборудованием и сервером зависит от ваших аппаратных возможностей. С локальным сервером Blynk тип соединения между оборудованием и сервером не так важен для безопасности, так как локальный сервер обычно размещается в локальной сети, поэтому злоумышленник не может перехватить трафик между оборудованием и сервером.\n\n## Использование локального сервера Blynk\n\nДля обеспечения максимальной безопасности вы можете [установить Blynk server локально](../#blynk-server) и ограничить доступ к вашей локальной сети, чтобы никто, кроме вас, не мог получить доступ к серверу. В этом случае все данные хранятся локально в пределах только вашей сети и не отправлятся через Интернет.\n\nВ случае локального сервера Blynk также нет необходимости защищать соединение между вашим оборудованием и сервером. Это справедливо для подключения по Ethernet и частично для соединения по Wi-Fi. В случае с Wi-Fi вы должны использовать WPA/WPA2 \\(защищенный доступ к Wi-Fi\\) шифрование для защиты беспроводного трафика.\n\nАлгоритмы WPA и WPA2 предлагают очень надежное шифрование, которое может защитить все данные, передаваемые по радиоканалу, при условии, что используется достаточно надежный пароль. Даже если ваши данные представляют собой обычный TCP/IP трафик, другой пользователь не сможет расшифровать захваченные пакеты. Тем не менее, убедитесь, что ваш пароль достаточно надежный, иначе единственным ограничивающим фактором для злоумышленника останется время.\n\n## Использование SSL-шлюза\n\nБольшинство платформ не способны обрабатывать SSL протокол, поэтому они подключаются по 80 порту. Однако наш [сценарий шлюза](https://github.com/blynkkk/blynk-library/blob/master/scripts/blynk-ser.sh) можно использовать для добавления SSL уровня безопасности SSL к соединениям.\n\n```bash\n./blynk-ser.sh -f SSL\n```\n\nЭтот скрипт перенаправит все аппаратные соединения с порта 9443 сервера через шлюз SSL. Вы можете запустить этот скрипт на своем Raspberry Pi, настольном компьютере или даже прямо на своем роутере!\n\n**Примечание:** при использовании вашего собственного сервера вы должны перезаписать прилагаемый сертификат server.crt или указать его в сценарии с помощью ключа `--cert`:\n\n```bash\n./blynk-ser.sh -f SSL -s <server ip> -p 9443 --cert=<certificate>.crt\n```\n\nFlag `-f SSL` is enabled by default for USB communication so you don't have to explicit declare it.\n\n**Note:** SSL is supported by the gateway only on Linux/OSX for now\n\nIf you want to skip SSL, and connect to TCP, you can also do that:\n\nФлаг `-f SSL` включен по умолчанию при соединении через USB, поэтому вам не нужно его явно объявлять.\n\n**Примечание:** Пока SSL поддерживается шлюзом только в Linux/OSX.\n\nЕсли вы хотите пропустить SSL и подключиться к TCP, вы также можете сделать так:\n\n```bash\n./blynk-ser.sh -t TCP\n```\n\n"
  },
  {
    "path": "ru/sharing.md",
    "content": "# Обмен проектами\n\nBlynk предлагает два типа обмена вашими проектами с другими людьми:\n\n* **Поделитесь доступом к вашему оборудованию.** Задумайтесь о том, чтобы дать кому-то использовать приложение от вашего проекта. Они не могут изменить интерфейс, но могут контролировать и наблюдать, что там происходит.\n* **Поделитесь конфигурацией вашего проекта.** Другие пользователи получат клон вашего проекта в Blynk, отсканировав QR-ссылку, но не смогут управлять вашим оборудованием. Это отлично подходит для обучения, учебных пособий и т.д.\n\n## Общий доступ к вашему оборудованию\n\nПредставьте, что вы даете кому-то приложение для управления вашим проектом.\n\n* люди, с которыми вы поделились своим проектом, не могут ничего изменить. Они могут только использовать его \n* вы можете обновить свое приложение, изменить макет, добавить виджеты, и оно сразу синхронизируется со всеми устройствами\n* вы можете отозвать доступ в любой момент\n\nКак это работает:\n\n* вы отправляете QR-код своим пользователям \\(любым способом по электронной почте, распечатываете, публикуете в социальных сетях, и т.п.\\)\n* другие скачивают приложение Blynk, сканируют ваш QR-код, и ваше приложение открывается у них готовыми к использованию. Им даже не нужно входить в систему или создавать учетную запись.\n\nЗайдите в настройки вашего проекта:\n\n![](../.gitbook/assets/dash_settings_sharing.png)\n\nНажмите на кнопку «Generate Link» \\(Создать ссылку\\):\n\n![](../.gitbook/assets/dash_settings_sharing_generate.png)\n\nБудет сгенеририрован QR-код, которым вы можете поделиться с другими:\n\n![](../.gitbook/assets/dash_public_sharing.png)\n\nЭто оно! Теперь **Выйдите из настроек и нажмите кнопку PLAY.**\n\nДругой человек должен будет установить приложение Blynk и отсканировать QR-код с экрана для входа в систему \\(сканирование из существующего профиля пока не поддерживается\\);\n\n![](../.gitbook/assets/scan_qr.png)\n\n**ПРИМЕЧАНИЕ:** Ваш проект должен быть активным, не забудьте нажать кнопку воспроизведения.\n\n**ПРЕДУПРЕЖДЕНИЕ:** Обмен QR-кодом стоит 1000 энергии, и эта энергия не подлежит восстановлению, даже если вы вообще не использовали обмен.\n\n## Поделится своей конфигурацией проекта\n\nЕсли вы хотите поделиться настройками своего Проекта, не предоставляя доступ к вашему оборудованию \\(например, чтобы создать учебный материал или инструкцию\\) - выполните следующие действия:\n\nВ настройках проекта перейдите к кнопке **Clone**.\n\n![](../.gitbook/assets/clone.png)\n\nОна сгенерирует QR-код, которым вы можете поделиться с кем угодно.\n\n![](../.gitbook/assets/QR.png)\n\nДругой человек **должен войти в приложение Blynk** и нажать кнопку QR в галерее проектов\n\n![](../.gitbook/assets/QR_button_edit.png)\n\nПосле проверки будет создан новый проект, все виджеты, настройки, макет будут клонированы. Другому человеку понадобится достаточно энергии, чтобы клонировать ваш проект.\n\n**Ключ аутентификации будет другим!**. Никто не получит доступ к вашему оборудованию. Они просто получают копию интейрфейса и настроек.\n\n"
  },
  {
    "path": "ru/supportedhardware.md",
    "content": "# Поддерживаемое оборудование\n\nBlynk уже поддерживает более 400 плат, включая поддержку Arduino, Particle, ARM mbed, TI Energia, MicroPython, Node.js, OpenWRT и многих одноплатных компьютеров. Вы можете легко добавить свои собственные типы подключения \\(см. [здесь](https://github.com/blynkkk/blynk-library/tree/master/examples/More/ArduinoClient) примеры для Arduino\\)!\n\n## Платформы\n\n* **Arduino** \\([https://github.com/blynkkk/blynk-library](https://github.com/blynkkk/blynk-library)\\)\n  * Arduino MKR WiFi 1010\n  * Arduino MKR GSM 1400\n  * Arduino MKR NB 1500\n  * Arduino Uno, Duemilanove\n  * Arduino Nano, Mini, Pro Mini, Pro Micro, Due, Mega\n  * Arduino 101 \\(Intel Curie, с BLE\\)\n  * Arduino MKR1000\n  * Arduino Zero\n  * Arduino Yún \\(включая WiFi и Ethernet, через Bridge\\)\n  * Arduino.org UNO WiFi\n  * Arduino MKR VIDOR 4000 \\(используйте пример для MKR WiFi 1010\\)\n  * Arduino UNO WiFi Rev.2 \\(используйте пример для MKR WiFi 1010\\)\n* **Arduino-подобные**\n  * Blynk Board\n  * ESP8266 \\(Generic, NodeMCU, Witty Cloud, Huzzah, WeMos D1, Seeed Wio Link, etc.\\)\n  * ESP32 \\(WiFi, BLE\\)\n  * Nordic nRF51/nRF52 - базовые платы\n  * Teensy 3.2/3.1\n  * Blue Pill \\(STM32F103C\\)\n  * Realtek RTL8710 / Ameba via [RTLduino](https://github.com/pvvx/RtlDuino)\n  * BBC micro:bit\n  * LightBlue Bean _, soon_\n  * DFRobot Bluno\n  * RedBear Duo \\(WiFi, BLE\\)\n  * RedBearLab Blend Micro\n  * RedBearLab BLE Nano \\(v1 and v2\\)\n  * Seeed Tiny BLE\n  * Simblee BLE\n  * RFduino BLE\n  * The AirBoard \\(BLE-Link, RN-XV\\)\n  * Feather M0 WiFi\n  * Feather 32u4 BLE\n  * Intel Edison\n  * Intel Galileo\n  * Fishino Guppy, Uno, Mega\n  * TinyCircuits TinyDuino \\(CC3000\\)\n  * Microduino/mCookie Core, Core+, CoreUSB\n  * Wicked WildFire V2, V3, V4\n  * Digistump Oak\n  * chipKIT Uno32\n  * Alorium XLR8 \\(FPGA\\)\n  * LinkIt ONE \\(WiFi only\\)\n* **Энергеия**\n  * Texas Instruments\n    * CC3220SF-LaunchXL\n    * CC3200-LaunchXL\n    * Tiva C Connected LaunchPad\n    * Stellaris LM4F120 LaunchPad\n    * MSP430F5529 + CC3100\n    * LaunchPad MSP432\n  * RedBearLab \\(CC3200, WiFi Mini\\)\n* **Particle** \\([https://github.com/vshymanskyy/blynk-library-spark](https://github.com/vshymanskyy/blynk-library-spark)\\)\n  * Core\n  * Photon\n  * Electron\n  * RPi\n  * SparkFun RedBoard\n  * RedBear Duo \\(WiFi & BLE\\)\n* **ARM mbed** \\([https://developer.mbed.org/users/vshymanskyy/code/Blynk/](https://developer.mbed.org/users/vshymanskyy/code/Blynk/)\\)\n  * Seeed Tiny BLE\n  * RedBearLab BLE Nano\n  * BBC micro:bit\n  * STM32 Nucleo + Wiznet 5100 _, soon_\n* **JavaScript** \\(Node.js, Espruino, Browsers\\) \\([https://www.npmjs.com/package/blynk-library](https://www.npmjs.com/package/blynk-library)\\)\n  * Regular PC with Linux / Windows / OS X\n  * Raspberry Pi \\(Banana Pi, Orange Pi, ...\\)\n  * BeagleBone Black\n  * Onion Omega\n  * Onion Omega 2\n  * Intel Galileo\n  * Intel Edison\n  * Intel Joule\n  * LeMaker Guitar\n  * LeMaker Banana Pro\n  * Samsung ARTIK 5\n  * PandaBoard, CubieBoard, pcDuino, Tessel 2\n  * VoCore, VoCore2 \\(OpenWRT + [Espruino package](https://github.com/vshymanskyy/OpenWRT-Espruino-packages)\\)\n  * Espruino Pico\n  * ...\n* **Python** \\([https://github.com/vshymanskyy/blynk-library-python](https://github.com/vshymanskyy/blynk-library-python)\\)\n  * MicroPython\n  * Python 2\n  * Python 3\n* **Lua** \\([https://github.com/blezek/blynk-esp](https://github.com/blezek/blynk-esp)\\)\n  * NodeMCU\n\n## Типы подключения Arduino\n\n* USB \\(Serial\\), подключенный к ноутбуку или компьютеру\n* **Ethernet**\n  * Arduino MKR ETH\n  * Arduino Ethernet Shield \\(W5100\\)\n  * Arduino Ethernet Shield 2 \\(W5500\\)\n  * SeeedStudio Ethernet Shield V2.0 \\(W5200\\)\n  * ENC28J60-based modules\n* **WiFi**\n  * ESP8266 as WiFi modem \\(работает с оригинальной прошивкой\\)\n  * Arduino WiFi 101 Shield\n  * Arduino WiFi Shield\n  * WIZnet WizFi310\n  * Adafruit CC3000 WiFi Breakout / Shield\n  * RN-XV WiFly\n* **Bluetooth Smart \\(BLE 4.0\\)**\n  * HM-10, HC-08\n  * DFRobot BLE-Link module\n  * Microduino/mCookie BLE\n  * RedBearLab BLE Mini\n  * nRF8001-based boards \\(Adafruit Bluefruit LE, etc.\\)\n* **Bluetooth 2.0 Serial Port Profile \\(SPP\\)**\n  * HC-05, HC-06, ...\n* **Cellular \\(GSM/3G/LTE\\)**\n  * SIMCom SIM800 series \\(SIM800A, SIM800C, SIM800L, SIM800H, SIM808, SIM868\\)\n  * SIMCom SIM900 series \\(SIM900A, SIM900D, SIM908, SIM968\\)\n  * A6/A7\n  * M590\n  * BG96\n  * GPRSbee\n  * Microduino GSM\n  * Adafruit FONA \\(Mini Cellular GSM Breakout\\)\n  * Adafruit FONA 800/808 Shield\n\n## Сделано сообществом\n\n* [Marvell® EZ-Connect™ MW300/MW302](https://github.com/vshymanskyy/blynk-library-ez-connect)\n* [WIZnet-W5500-EVB](http://instructables.com/id/WIZnet-W5500-EVB-and-Blynk-App-communication)\n* [LabVIEW](https://github.com/juncaofish/NI-LabVIEWInterfaceforBlynk)\n* [Node-RED](https://github.com/gablau/node-red-contrib-blynk-ws) \\(can be used as bridge to HTTP, TCP, UDP, MQTT, XMPP, IRC, OSC...\\)\n\n## Проблемные платы\n\nЭти платы не поддерживаются и не работают из коробки:\n\n* [Arduino Tian](http://www.arduino.org/products/boards/arduino-tian)\n\nЗдесь список \\[**известных проблем с библиотекой Blynk**\\]\\([https://github.com/blynkkk/blynk-library/issues?q=is%3Aissue+label%3A\"for+reference\"+](https://github.com/blynkkk/blynk-library/issues?q=is%3Aissue+label%3A\"for+reference\"+)\\)\n\n"
  },
  {
    "path": "ru/troubleshooting.md",
    "content": "# Решение проблем\n\n## Соединение\n\nЕсли у вас возникли проблемы с подключением, выполните следующие действия:\n\n1. Убедитесь, что ваше оборудование, провода, кабели и блок питания находятся в исправном состоянии, не повреждены и т.д.      \n\n   Используйте качественные USB-кабели и USB-порты.\n\n2. Проверьте проводку, используя примеры \\(клиент TCP/HTTP или аналогичный\\), **прилагаемые к вашему оборудованию**.\n   * Как только вы поймете, как управлять соединением, использовать Blynk станет намного проще.\n3. Попробуйте запустить команду `telnet blynk-cloud.com 80` со своего ПК, подключенного к той же сети, что и ваше оборудование. Вы должны увидеть что-то вроде: `Подключено к blynk-cloud.com`.\n4. Попробуйте запустить примеры Blynk по умолчанию для вашей платформы **без изменений**, чтобы увидеть, работают ли они.\n   * Дважды проверьте, что вы выбрали **правильный пример** для вашего типа подключения и модели оборудования.\n   * Наши примеры содержат **комментарии и объяснения**. **Читайте их внимательно.**\n   * Убедитесь, что ваш токен авторизации действителен \\(скопирован из приложения и **не содержит пробелов и т.п.**\\)\n   * Если это не работает, попробуйте заглянуть в [печать отладочной информации в порт](../#enable-debug).\n5. Готово! Добавьте свои модификации и функциональность. Наслаждайтесь Blynk!\n\n**Примечание:** Если к вашей сети подключено несколько устройств, все они должны иметь разные MAC и IP-адреса. Например, при использовании двух Arduino UNO с Ethernet расширениями, пример по умолчанию для обоих из них вызовет проблемы с подключением. Вам следует использовать пример [ручная настройка Ethernet](https://github.com/blynkkk/blynk-library/blob/master/examples/Boards_Ethernet/Arduino_Ethernet_Manual/Arduino_Ethernet_Manual.ino).\n\n## Подключение к сети WiFi\n\nЕсли у вас возникли проблемы с подключением по WiFi, пожалуйста, проверьте следующие ошибки:\n\n* Вы пытаетесь подключиться к сети 'WPA & WPA2 Enterprise' \\(часто используется в офисах\\), а ваш шилд не поддерживает этот метод шифрования\n* В вашей WiFi-сети есть страница входа, которая запрашивает ввод ключа доступа \\(часто используется в ресторанах\\)\n* Безопасность вашей сети Wi-Fi запрещает полное подключение чужих устройств \\(фильтрация MAC-адресов и т.п.\\)\n* Работает Брандмауэр. Порт по умолчанию для аппаратных подключений - 80 \\(8080 на локальном сервере\\). Убедитесь, что он открыт.  \n\n## Задержки \\(Delay\\)\n\nЕсли вы используете длительный `delay()` или отправляете свое оборудование в спящий режим внутри `loop()`, ждите обрыва соединения и снижение производительности.\n\n_**НЕ ДЕЛАЙТЕ ЭТОГО:**_\n\n```cpp\nvoid loop()\n{\n  ...\n  delay(1000); // это длительная задержка, которую следует избегать\n  other_long_operation();  // другие длинные операторы\n  ...\n  Blynk.run();\n}\n```\n\n**Примечание:** Это также относится к обработчикам BLYNK\\_READ & BLYNK\\_WRITE!\n\n**РЕШЕНИЕ:** Если вам нужно выполнять действия в определенные промежутки времени - используйте таймеры, например [BlynkTimer](../#blynk-firmware-blynktimer).\n\n## Ошибки из-за флуда\n\nЕсли ваш код часто отправляет много запросов на наш сервер, ваше оборудование будет отключено. Приложение Blynk может показывать \"Your hardware is offline\" \\(Ваше оборудование отключено\\).\n\nКогда `Blynk.virtualWrite` находится в `void loop`, он генерирует сотни «запросов» в секунду.\n\nВот пример того, что может вызвать флуд. **НЕ ДЕЛАЙТЕ ЭТОГО:**\n\n```cpp\nvoid loop()\n{\n  Blynk.virtualWrite(1, value); // Эта строка отправляет сотни сообщений на сервер Blynk\n  Blynk.run();\n}\n```\n\n**РЕШЕНИЕ:** Если вам нужно выполнять действия в определенные промежутки времени - используйте таймеры, например [BlynkTimer](../#blynk-firmware-blynktimer).\n\nИспользование `delay()` также не решит проблему. Это может вызвать [другую проблему](../#delay). Используйте таймеры!\n\nЕсли отправка сотен запросов - это то, что вам необходимо для вашего продукта, вы можете увеличить лимит на локальном сервере и в библиотеке Blynk. Для локального сервера вам необходимо изменить свойство `user.message.quota.limit` в файле `server.properties`:\n\n```text\n    #100 запросов в секунду на одного пользователя.\n    user.message.quota.limit=100\n```\n\nДля библиотеки вам нужно изменить свойство `BLYNK_MSG_LIMIT` в файле `BlynkConfig.h`:\n\n```text\n    //Ограничьте количество исходящих команд.\n    #define BLYNK_MSG_LIMIT 20\n```\n\n## Включить отладку\n\nЧтобы включить отправку отладочной информации в серийный порт по умолчанию, добавьте код в верхней части скейтча **\\(это должна быть первая строка в скейтче\\)**:\n\n```cpp\n#define BLYNK_DEBUG // Необязательно, запускает отладку\n#define BLYNK_PRINT Serial\n```\n\nИ не забудьте включить серийный порт в `void setup()`:\n\n```cpp\nSerial.begin(9600);\n```\n\nВы также можете использовать запасные аппаратные последовательные порты или SoftwareSerial для вывода отладочной информации \\(вам понадобится адаптер для подключения к ПК\\).\n\n**Примечание:** включение режима отладки замедлит аппаратную производительность в 10 раз.\n\n## Проблема с Geo DNS\n\nПроблема с Geo DNS больше не является проблемой. Она была решена в 2017 году.\n\n## Сброс пароля\n\nНа экране входа нажмите \"Forgot password?\" \\(Забыли пароль?\\) а затем введите адрес электронной почты и кнопку `Send`. Вы получите инструкции по электронной почте.\n\n### Android сброс пароля\n\n1. Откройте инструкцию в электронной почте **со своего смартфона или планшета**;\n2. Нажмите кнопку «Reset now» в своем электронном письме;\n3. Нажмите на значок Blynk в всплывающем окне и сбросьте пароль:\n\n![](../.gitbook/assets/reset.png)\n\n"
  },
  {
    "path": "ru/widgets.md",
    "content": "# Виджеты\n\nВиджеты являются интерфейсными модулями. Каждый из них выполняет определенную функцию ввода / вывода при взаимодействии с оборудованием.\n\nЕсть 4 типа виджетов:\n\n* **Контроллеры** - используется для отправки команд, которые контролируют/управляют вашим оборудованием;\n* **Дисплеи** - используется для визуализации данных с датчиков и других источников;\n* **Уведомления** - отправляет сообщения и уведомления;\n* **Интерфейс** -  виджеты для выполнения определенных функций графического интерфейса;\n* **Другие** -  виджеты, которые не относятся ни к одной категории;\n\nКаждый виджет имеет свои настройки. Некоторые из виджетов \\(например, Bridge\\) просто включают функциональность, и у них нет никаких настроек.\n\n## Общие настройки виджетов\n\n### Выбор пина\n\nЭто один из основных параметров, который вам нужно установить. Он определяет, какой пин контролировать или читать..\n\n![](../.gitbook/assets/pin_selection.png)\n\n**Цыфровые Пины \\(Digital Pins\\)** - представляют физические пины цифрового ввода-вывода на вашем оборудовании. Выводы с поддержкой ШИМ помечены символом `~`\n\n**Аналоговые Пины \\(Analog Pins\\)** - представляют физические пины аналогового ввода-вывода на вашем оборудовании\n\n**Виртуальные пины \\(Virtual Pins\\)** - не имеют физической реализации. Они используются для передачи любых данных между приложение Blynk и вашим оборудованием. Узнайте больше о Виртуальных Пинах [здесь](../#blynk-main-operations-virtual-pins).\n\n### Отображение данных\n\nЕсли вы хотите пересчитать входящие значения в определенный диапазон, вы можете использовать кнопку сопоставления значений:\n\n![](../.gitbook/assets/display_edit_mapping.png)\n\nДопустим, ваш датчик отправляет значения от 0 до 1023. Но вы хотите в приложении отображать значения в диапазоне от 0 до 100. Когда сопоставление данных включено, входящее значение 1023 будет отображено как 100.\n\n### РАЗДЕЛЬНО/ВМЕСТЕ \\(SPLIT/MERGE\\)\n\nНекоторые виджеты могут отправлять более одного значения. С помощью этого переключателя вы можете контролировать, как их отправлять.\n\n* **РАЗДЕЛЬНО**:\n\n  Каждый из параметров отправляется непосредственно на пин вашего оборудовании \\(например, D7\\). Вам не нужно писать дополнительный код.\n\n**ПРИМЕЧАНИЕ:** В этом режиме вы отправляете несколько команд из одного виджета, это может снизить производительность вашего оборудования.\n\n**ПРИМЕР:** Если у вас есть виджет джойстика и он настроен на пины D3 и D4, то он отправит 2 команды через Интернет:\n\n```text\n    digitalWrite(3, value);\n    digitalWrite(4, value);\n```\n\n* **ВМЕСТЕ:**\n\n  Когда выбран режим ВМЕСТЕ, вы отправляете только 1 сообщение, состоящее из массива значений. Поэтому вам нужно разобрать его на совем оборудовании.\n\nЭтот режим можно использовать только с Виртуальными пинами.\n\n**ПРИМЕР:** Добавьте виджет zeRGBa и установите его в режим ВМЕСТЕ. Выберите виртуальный пин V1\n\n```text\n    BLYNK_WRITE(V1) //  Существующий виджет, который записывает данные в V1\n    {\n      int r = param[0].asInt(); // получить значение КРАСНОГО канала\n      int g = param[1].asInt(); // получить значение ЗЕЛЕНОГО канала\n      int b = param[2].asInt(); // получить значение СИНЕГО канала\n    }\n```\n\n### Разрядность \\(Decimals\\)\n\nОпределяет, сколько десятичных знаков вы хотели бы видеть при перемещении ползунка. Когда выбрано «Без дроби» \\(No Fraction\\), ползунок будет отправлять только целочисленные значения без десятичных дробей. \"1 знак\" означает, что значения будут выглядеть как 1.1, 1.2, ..., 2.0 и т. Д.\n\n### Отправка при Отжатии \\(Send On Release\\)\n\nЭта опция позволяет оптимизировать трафик данных на ваше оборудование.\n\nНапример, когда вы перемещаете виджет джойстика, команды потоково передаются на ваше оборудование, во момент одного движения джойстика может отправляться десятки команд. Существуют варианты когда, это дейтсвительно необходимо, однако создание такой нагрузки может привести к перегрузке и сбросу оборудования.\n\n**Отправка при Отжатии** является рекомендуемой настройкой для большинства приложений. Данная настройка влключена по умолчанию.\n\n### Интервал записи \\(Write interval\\)\n\nАналогична опции «Отправка при Отжатии». Тем не менее, он позволяет вам передавать значения на ваше оборудование в течение определенного интервала. Например, установка **Интервала записи** на 100 мс означает, что при перемещении ползунка только 1 значение будет отправлено оборудованию в течение 100 мсек. Эта опция также используется для оптимизации потока трафика данных на ваше оборудование.\n\n### Цветовой градиент \\(Color gradient\\)\n\nКогда вы выбираете градиент, он влияет на цвет элементов виджета на основе входящих значений. Например: вы устанавливаете виджет Указатель \\(Gauge\\) с параметрами Min и Max от 0 до 100 и выбираете зелено-желто-красный градиент. То когда оборудование отправляет данные:\n\n* `10`,  Указатель изменит свой цвет на зеленый\n* `50` указатель изменит цвет на желтый\n* `80` указатель изменит цвет на красный\n\nЕсть два типа градиентов, которые вы можете выбрать:\n\n* Теплый: Зеленый - Ораньжевый - Красный;\n* Холодный: Зеленый - Синий - Фиолетовый.\n\n## Контроллеры \\(Controllers\\)\n\n### Кнопка \\(Button\\)\n\nWorks in push or switch modes. Allows to send ON and OFF \\(LOW/HIGH\\) values. Button sends 1 \\(HIGH\\) on press and sends 0 \\(LOW\\) on release.\n\nРаботает в режиме кнопки или выключателя. Позволяет отправлять значения ВКЛ \\(ON\\) и ВЫКЛ \\(OFF\\) \\(НИЗКИЙ / ВЫСОКИЙ\\) \\(LOW / HIGH\\). Кнопка посылает 1 ВЫСОКИЙ \\(HIGH\\) при нажатии и 0 НИЗКИЙ \\(LOW\\) при отпускании.\n\n![](../.gitbook/assets/button.png)\n\n![](../.gitbook/assets/button_edit.png)\n\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n### Слайдер \\(Slider\\)\n\nСлайдер очень похож на потенциометр. Позволяет отправлять значения в заданном диапазоне MIN / MAX.\n\n![](../.gitbook/assets/slider.png)\n\n![](../.gitbook/assets/slider_edit.png)\n\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n### Таймер \\(Timer\\)\n\nТаймер запускает действия в определенное время. Даже если смартфон не в сети. По умолчанию время начала отправляет 1 \\(HIGH\\), время остановки отправляет 0 \\(LOW\\). Вы можете изменить это поведение на любые другие значения. Вы можете изменить настройки Таймера в режиме «Запуска». В последней версии Android также есть улучшенный таймер в виджете Обработчик событий.\n\nC [Обработчиком событий \\(Eventor\\)](../#widgets-other-obrabotchik-sobytij-eventor) вы можете назначить несколько таймеров на один и тот же пин, отправить любую строку/число, выбирать дни и часовой пояс. Рекомендуется использовать виджет Обработчик событий поверх виджета Таймер. Однако виджет Таймер по-прежнему подходит и для простых событий таймера.\n\n**ПРИМЕЧАНИЕ:** Виджет таймера зависит от времени сервера, а не вашего телефона. Иногда время телефона может не соответствовать времени сервера.\n\n![](../.gitbook/assets/timer.png)\n\n![](../.gitbook/assets/timer_edit.png)\n\n**ПРИМЕЧАНИЕ:** Виджет таймера зависит от времени сервера, а не вашего телефона. Иногда время телефона может не соответствовать времени сервера.\n\n**Пример кода:** [Таймер](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Timer/Timer.ino)\n\n### Джойстик \\(Joystick\\)\n\nУправление сервоприводом в 4 направлениях.\n\n#### Параметры:\n\n* режим РАЗДЕЛЬНО/ВМЕСТЕ \\(SPLIT/MERGE\\) - читаем [здесь](../#vidgety-obschie-nastroyki-vidgetov-razdelno-vmeste-split-merge) Виджеты ОБщие настройки виджетов РАЗДЕЛЬНО/ВМЕСТЕ \\(SPLIT/MERGE\\)\n* **Вращать при наклоне \\(Rotate on Tilt\\)**\n\nКогда этот параметр включен, Джойстик будет автоматически вращаться, если вы будете использовать смартфон в горизонтальной положении.\n\n* **Автовозрат \\(Auto-Return\\)**\n\nКогда этот парамтер выключен, ручка джойстика не вернется в центральное положение. Она останется там, где вы ее оставили.\n\n![](../.gitbook/assets/joystick.png)\n\n![](../.gitbook/assets/joystick_edit.png)\n\n**Пример кода:** [Джойстик Две Оси](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/JoystickTwoAxis/JoystickTwoAxis.ino)\n\n### ЗеБРа \\(zeRGBa\\)\n\nЗеБРа - это обычный RGB контроллер \\(палитры цветов\\).\n\n#### Настройки:\n\n* **Раздельный \\(SPLIT\\)**:\n\n  Каждый из параметров отправляется непосредственно на пин вашего оборудования \\(например, D7\\). Вам не нужно писать код.\n\n**ПРИМЕЧАНИЕ:** В этом режиме вы отправляете одновременно несколько команд из одного виджета, что может снизить производительность вашего оборудования.\n\n**ПРИМЕР:** у вас есть виджет ЗеБРа и для него было установлено значение D1, D2, D3, он отправит 3 команды через Интернет:\n\n```cpp\ndigitalWrite(1, r);\ndigitalWrite(2, g);\ndigitalWrite(3, b);\n```\n\n* **Объединенный \\(MERGE\\)**:\n\n  Когда выбран этот режим, вы отправляете только 1 сообщение, состоящее из массива значений. Но в последствии вам нужно разобрать сообщение на своем оборудовании.\n\nЭтот режим можно использовать только с виртуальными пин-ами.\n\n**ПРИМЕР:** добавьте виджет ЗеБРа и установите его в Объединенный режим \\(MERGE\\). Выберите виртуальный контакт V1.\n\n```cpp\nBLYNK_WRITE(V1) // ЗеБРа назначен на V1\n{\n    // получим значение КРАСНОГО канала\n    int r = param[0].asInt();\n    // получим значение ЗЕЛЕНОГО канала\n    int g = param[1].asInt();\n    // получим значение СИНЕГО канала\n    int b = param[2].asInt();\n}\n```\n\n* **Отправка при Отжатии \\(Send On Release\\)** доступно для большинства виджетов контроллеров и позволяет уменьшить трафик данных на вашем оборудовании. Например, когда вы перемещаете виджет джойстика, команды непрерывно передаются на аппаратное устройство, во время одного движения джойстика вы можете отправлять десятки команд. Есть случаи, когда это необходимо, однако создание такой нагрузки может привести к сбросу оборудования. Мы рекомендуем включить функцию Отправка при Отжатии для большинства случаев, если вам не требуется мгновенная обратная связь. Эта опция включена по умолчанию.\n* **Интервал записи \\(Write interval\\)**\n\nПохоже на вышеуказанный вариант. Однако, позволяет вам передавать значения на ваше оборудование в через определенные интервалы времени. Например, установка интервала записи на 100 мс означает, что при перемещении ползунка на аппаратное обеспечение будет отправлено только 1 значение в течение 100 мс. Эта опция также используется для уменьшения трафика данных на ваше оборудовании.\n\n### Шаговое управление \\(Step Control\\)\n\nШаговое управление похоже на две кнопки, назначенные одному пин-у. Одна кнопка увеличивает ваше значение на установленный шаг, а другая уменьшает его. Это очень полезно для случаев использования, когда вам нужно точно изменять ваши значения, но вы не можете достичь такой точности с помощью виджета Cлайдера.\n\n**Отправить шаг \\(Send Step\\)** опция позволяет вам отправлять на оборудование каждый шаг нвместо фактического значения виджета.\n\n**Зациклить значения \\(Loop value\\)** опция позволяет сбросить Шаговый виджет на начальное значение при достижении максимального.\n\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n## Дисплеи\n\n### Отображение значений \\(Value Display\\)\n\nОтображает входящие данные с ваших датчиков или виртуальных пин-ов.\n\n![](../.gitbook/assets/display.png)\n\n![](../.gitbook/assets/display_edit.png)\n\nМожет работать в двух режимах:\n\n* режим PUSH \\(выберается в списке выбора частоты считывания\\);\n* режим частоты считываний;\n\nВ режиме PUSH вы обновляете значения виджета со стороны оборудования с помощью кода:\n\n```cpp\nBlynk.virtualWrite(V1, val);\n```\n\nВ этом режиме каждое сообщение, которое отправляет аппаратное устройство автоматически сохраняется на сервере. Режим PUSH не требует, чтобы приложение было онлайн или открыто.\n\nВ режиме частоты считывния вам необходимо выбрать интервал обновления данных, и приложение будет запускать события считывния с требуемой периодичностью. Ваше приложение должно быть открыто и запущено для отправки запросов на оборудование. Вам не нужен код для аналоговых и цифровых выводов в даном случае. Однако для виртуальных выводов вам необходимо использовать следующий код:\n\n```cpp\n//вызывать из приложения\nBLYNK_READ(V1)\n{\n  //отправить в приложение\n  Blynk.virtualWrite(V1, val);\n}\n```\n\n#### Отображение значений на рабочем столе\n\nВы также можете добавить виджет отображение значения на рабочий стол Android. В этом случае отображение значений работает по протоколу HTTPS. Имейте в виду, что в режиме «Рабочий стол» отображение значений имеет несколько ограничений. Виджет будет обновлять свое состояние только один раз в 15 минут. Вы можете изменить это органичение через настройки виджета. Однако интервал обновления менее 15 минут не гарантируется. Вы также можете изменить размер отображаемого значения на рабочем столе - просто сделайте длинный тап на виджете и измените его размер на необходимый.\n\n**Примечание:** Добавление виджета на главный экран стоит 100 энергии. Эта энергия не возвращяется при удалении виджета.\n\n**Примечание:** Виджеты рабочего стола для локальных серверов Blynk требуют открытия порта 8080.\n\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n### Значение переменной \\(Labeled Value\\)\n\nОтображает входящие данные с ваших датчиков или виртуальных пин-ов. Это лучшая версия «Отображения значений», так как в этом виджете есть строка форматирования, поэтому вы можете форматировать входящее значение в любую нужную вам строку.\n\n![](../.gitbook/assets/display%20%281%29.png)\n\n![](../.gitbook/assets/labeled_value_edit.png)\n\nМожет работать в 2 режимах:\n\n* режим PUSH \\( выберитается из списка частоты считывания\\);\n* режим частоты считывания;\n\nВ режиме PUSH вы должны обновлять отображение значений на аппаратной устройстве с помощью кода:\n\n```cpp\nBlynk.virtualWrite(V1, val);\n```\n\nВ этом режиме каждое сообщение, которое аппаратное устройств отправляет на сервер, автоматически сохраняется на сервере. Режим PUSH не требует, чтобы приложение было онлайн или запущено.\n\nВ режиме частоты считывания вам нужно выбрать интервал обновления, и приложение будет запускать события с требуемым интервалом. Ваше приложение должно быть открыто и запущено для отправки запросов на оборудование. В данном случае вам не нужен код для аналоговых и цифровых пин-ов. Однако для виртуальных пин-ов вам необходимо использовать следующий код:\n\n```cpp\n//вызываем из приложения\nBLYNK_READ(V1)\n{\n  //отправляем в приложение\n  Blynk.virtualWrite(V1, val);\n}\n```\n\n#### Параметры форматирования\n\nПредположим, ваш датчик отправляет число 12.6789 в приложение Blynk. Поддерживаются следующие параметры форматирования:\n\n`/pin/` - отображает значение без форматирования \\(12.6789\\)\n\n`/pin./` - отображает значение без десятичной части \\(13\\)\n\n`/pin.#/` - отображает значение с одним десятичным знаком \\(12.7\\)\n\n`/pin.##/` - отображает значение с двумя десятичными знаками \\(12.68\\)\n\n![](../.gitbook/assets/labeled_value_format_edit.png)\n\n#### Значение переменной на главном экране\n\nВы также можете добавить значение переменной на рабочий стол Android. В этом случае значение переменной работает через HTTPS протокол. Имейте в виду, что в режиме «Рабочий стол» значение переменной имеет некторые ограничения. Значение переменной будет обновлять свое состояние только один раз в 15 минут. Вы можете изменить этот параметр через настройки виджета. Однако интервал обновления менее 15 минут не гарантируется. Вы также можете изменить размер виджета Значение переменной на рабочем столе - просто сделайте длинный тап на виджете и измените его размер на необходимый.\n\n**Примечание:** Добавление виджета на домашний экран стоит 100 энергии. Эта энергия не восстанавливается.\n\n**Примечание:** Виджеты главного экрана для локальных серверов Blynk требуют открытия порта 8080.\n\n**Пример кода:** [Светодиод](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n### Светодиод \\(LED\\)\n\nПростой светодиод для индикации. Вам нужно отправить 0, чтобы выключить светодиод. И 255 для того, чтобы включить светодиод. Или просто используйте Blynk API, как описано ниже:\n\n```cpp\n//регистрируемся на виртуальном пине 1\nWidgetLED led1(V1);\nled1.off();\nled1.on();\n```\n\nВсе значения от 0 до 255 изменяют яркость светодиода:\n\n```cpp\nWidgetLED led2(V2);\n//установить яркость светодиода на 50%.\nled2.setValue(127);\n```\n\nВы также можете изменить цвет светодиода с помощью кода:\n\n```cpp\n//#D3435C - Красный в RGB формате\nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\n![](../.gitbook/assets/led.png)\n\n#### Светодиод на рабочем столе\n\nВы можете добавить виджет светодиод на рабочий стол Android. В этом случае светодиод работает через протокол HTTPS. Имейте в виду, что в режиме «Рабочий стол» виджет светодиода имеет некоторые ограничения. Светодиод будет обновлять свое состояние только один раз в 15 минут. Вы можете изменить этот интервал через настройки виджета. Однако интервал обновления менее 15 минут не гарантируется.\n\n**Примечание:** Добавление виджета на рабочий стол стоит 100 энергии. Эта энергия не возвращается при удалении виджета.\n\n**Примечание:** Виджеты рабочего стола для локальных серверов Blynk требуют открыть порт 8080.\n\n**Пример кода:** [Диод](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LED/LED_Blink/LED_Blink.ino)\n\n### Указатель \\(Gauge\\)\n\nОтличный визуальный способ отображения входящих числовых значений.\n\n![](../.gitbook/assets/gauge.png)\n\n![](../.gitbook/assets/gauge_edit.png)\n\nМожет работать в 2 режимах:\n\n* режим PUSH \\(выберается в списке выбора частоты считывания\\);\n* режим частоты считываний;\n\nВ режиме PUSH вы обновляете значения указателя со стороны оборудования с помощью кода:\n\n```cpp\nBlynk.virtualWrite(V1, val);\n```\n\nВ этом режиме каждое сообщение, которое отправляет аппаратное устройство автоматически сохраняется на сервере. Режим PUSH не требует, чтобы приложение было онлайн или открыто.\n\nВ режиме частоты считывния вам необходимо выбрать интервал обновления данных, и приложение будет запускать события считывния с требуемым периодичностью. Ваше приложение должно быть открыто и запущено для отправки запросов на оборудование. Вам не нужен код для аналоговых и цифровых выводов в даном случае. Однако для виртуальных выводов вам необходимо использовать следующий код:\n\n```cpp\n//вызывать из приложения\nBLYNK_READ(V1)\n{\n  //отправить в приложение\n  Blynk.virtualWrite(V1, val);\n}\n```\n\n#### Параметры форматирования\n\nУказатель также имеет поле «Label» \\(Метка\\), которое позволяет использовать форматирование. Предположим, ваш датчик отправляет число 12.6789 в приложение Blynk. Поддерживаются следующие параметры форматирования:\n\n`/pin/` - отображает значение без форматирования \\(12.6789\\)\n\n`/pin./` - отображает значение без десятичной части \\(13\\)\n\n`/pin.#/` - отображает значение с одним десятичным знаком \\(12.7\\)\n\n`/pin.##/` - отображает значение с двумя десятичными знаками \\(12.68\\)\n\n#### Другие опции\n\nВы также можете изменить метку прибора с помощью:\n\n```cpp\nBlynk.setProperty(V1, \"label\", \"Мое значение метки\");\n```\n\nили изменить цвет \\(кодировка RGB\\):\n\n```cpp\n//#D3435C - Красный цвет\nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n### ЖК дисплей \\(LCD\\)\n\nЭто обычный ЖК-дисплей 16x2, \"сделанный\" на нашем секретном предприятии в Китае. Виджет может работать в двух режимах:\n\n* Простой \\(Simple\\)\n* Расширенный \\(Advanced\\)\n\n#### Простой режим \\(Simple\\)\n\nВ простом режиме ваш ЖК-виджет работает как обычный виджет с частотой чтения.\n\nВ режиме частоты считывания вам нужно выбрать интервал обновления данных, и приложение будет запускать события с требуемым интервалом. Ваше приложение должно быть открыто и запущено для отправки запросов на оборудование. В данном случае вам не нужен код для аналоговых и цифровых пин-ов. Однако для виртуальных пин-ов вам необходимо использовать следующий код:\n\n```cpp\n//вызываем из приложения\nBLYNK_READ(V1)\n{\n  //отправляем в приложение\n  Blynk.virtualWrite(V1, val);\n}\n```\n\nВ простом режиме ЖК-дисплей также поддерживает параметры форматирования.\n\n#### Параметры форматирования\n\nПредположим, ваш датчик отправляет число 12.6789 в приложение Blynk. Поддерживаются следующие параметры форматирования:\n\n`/pin/` - отображает значение без форматирования \\(12.6789\\)\n\n`/pin./` - отображает значение без десятичной части \\(13\\)\n\n`/pin.#/` - отображает значение с одним десятичным знаком \\(12.7\\)\n\n`/pin.##/` - отображает значение с двумя десятичными знаками \\(12.68\\)\n\n![](../.gitbook/assets/lcd_format_edit.png)\n\n**Пример кода:** [ЖК дисплей простой режим - PUSH](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_SimpleModePushing/LCD_SimpleModePushing.ino)\n\n**Пример кода:** [ЖК дисплей простой режим - 1 сек](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_SimpleModeReading/LCD_SimpleModeReading.ino)\n\n#### Расширенный режим \\(Advanced\\)\n\nРасширенный режим предназначен для опытных пользователей. Позволяет использовать специальные команды для управления ЖК-дисплеем.\n\n#### Команды\n\nИнициируем переменную ЖК-дисплея:\n\n```cpp\nWidgetLCD lcd(V1);\n```\n\nОтправим сообщение:\n\n```cpp\nlcd.print(x, y, \"Ваше сообщение\");\n```\n\nГде `x` - позиция символа \\(0-15\\), `y` - номер строки \\(0 или 1\\),\n\nОчистка ЖК-дисплея:\n\n```cpp\nlcd.clear();\n```\n\n![](../.gitbook/assets/lcd.png)\n\n![](../.gitbook/assets/lcd_edit.png)\n\n**Пример кода:** [ЖК-дисплей расширенный режим](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_AdvancedMode/LCD_AdvancedMode.ino)\n\n### Диаграмма \\(SuperChart\\)\n\nДиаграмма используется для живой визуализации и хранения данных. Вы можете использовать виджет для логирования данных датчиков, бинарных событий и многого другого.\n\nЧтобы использовать виджет Диаграмма, вам нужно будет передать данные с оборудования с желаемым интервалом, используя таймеры. [Здесь приведен](https://examples.blynk.cc/?board=ESP8266&shield=ESP8266%20WiFi&example=GettingStarted%2FPushData) базовый пример передачи данных.\n\n#### Взаимодействие:\n\n* **Переключение между режимами текущий и временной** Нажмите диапазоны времени в нижней части виджета, чтобы изменить масштаб Диаграммы по времени.\n* **Тап по легенде графиков** показать или скрыть поток данных.\n* **Долгий тап на графике** покажет метку времени и соответствующие значения.\n\n![](../.gitbook/assets/tapnhold_charts.png)\n\n* **Быстро проведите пальцем влево или вправо, чтобы увидеть предыдущие данные** впоследствии вы можете прокручивать данные назад и вперед в пределах заданного временного диапазона.\n\n![](../.gitbook/assets/swipe_charts.png)\n\n* **Полноэкранный режим** нажмите эту кнопку, чтобы открыть полноэкранный режим в альбомной ориентации.\n\n![](../.gitbook/assets/fullscreen_charts.png)\n\nЧтобы выйти из режима полного экрана, просто поверните телефон обратно в портретный режим. График должен вращаться автоматически. В полноэкранном режиме вы увидите X \\(время\\) и несколько шкал Y. Полноэкранный режим можно отключить в настройках виджета.\n\n* **Кнопка меню**\n\n  Кнопка меню откроет дополнительные функции:\n\n  * Экспорт в CSV\n  * Стереть данные на сервере\n\n![](../.gitbook/assets/menu_charts.png)\n\n#### Настройки диаграммы:\n\n* **Заголовок диаграммы \\(Chart Title\\)** общее наименование диаграммы.\n* **Размер шрифта заголовка \\(Title Font Size\\)** выберите из 3 размеров шрифта.\n* **Выравнивание заголовка \\(Title Alignment\\)** выберите выравнивание заголовка диаграммы. Этот параметр влияет на положение заголовка и легенды в виджете.\n* **Показать ось X \\(время\\) \\(Show x-axis \\(time\\)\\)** выберите настройку, если хотите показать шкалу времени внизу графика.\n* **Автоматическое масштабирование для всех потоков данных \\(Override Auto Scaling for All Datastreams\\)** отключение этой опции позволит выполнить ручную настройку для оси Y \\(см. ниже\\).\n* **Выбор масштаба времени \\(Time ranges picker\\)** Позволяет выбрать необходимые периоды \\(`15m`,`30m`, `1h`,`3h`, ...\\) и разрешение для вашего графика. Разрешение определяет, насколько подробные ваши данные. Прямо сейчас график поддерживает два типа разрешения: `standard` и `high`. Разрешение также зависит от выбранного периода. Например, `standard` разрешение для `1d` означает, что вы будете получать 24 значения в день \\(одно в час\\), а при `high` разрешении вы будете получать за`1d` 1440 значений в день \\(одно в минуту\\).\n* **Потоки данных \\(Datastreams\\)** добавить потоки данных \\(см. ниже, как настроить потоки данных\\).\n\n#### Настройки потоков данных\n\nВиджет поддерживает до 4 потоков данных. Нажмите значок настроек потоков данных, чтобы открыть настройки.\n\n![](../.gitbook/assets/datastream_charts.png)\n\n**Дизайн \\(Design\\)** выберите доступные типы диаграмм:\n\n* Линейная \\(Line\\)\n* С областями \\(Area\\)\n* Гистограмма \\(Bar\\)\n* Бинарная \\(Binary\\) \\(приведение данных к двоичному виду\\)\n\n**Цвет \\(Color\\)** выберите сплошные цвета или градиенты.\n\n**Источник и ввод \\(Source and input\\)** - Вы можете использовать три типа источника данных:\n\n**1. Виртуальный пин \\(Virtual Pin\\)** - выберите желаемое устройство и виртуальный пин для получения данных.\n\n**2. Теги \\(Tags\\)** - диаграмма может агрегировать данные с нескольких устройств, используя встроенные функции агрегирования. Например, если у вас есть 10 датчиков температуры, посылающих температуру с заданным интервалом, Вы можете отобразить среднее значение от 10 датчиков в виджете.\n\nИспользование тегов:\n\n* [**Добавить Тэг**](http://docs.blynk.cc/#blynk-main-operations-control-of-multiple-devices-tags) на каждое устройство, с которого вы хотите агрегировать данные. Это можно сделать в настройках проекта Blynk.\n* **Отправить данные в виртуальный пин \\(Push data to the same Virtual Pin\\)** на каждое устройство. \\(т.е. `Blynk.virtualWrite (V0, temperature);`\\)\n* **Выберите тег в качестве источника \\(Choose Tag as a source\\)** в виджете Диаграмма и используйте пин, куда поступают данные \\(т.е. V0\\)\n\n**Добступные функции:**\n\n* `SUM` будет суммировать все входящие значения в указанный виртуальный пин со всех устройств, помеченные выбранным тегом\n* `AVG` будет вычислять среднее значение\n* `MED` найдет среднее значение\n* `MIN` будет вычислять минимальное значение\n* `MAX` будет вычислять максимальное значение\n\n**ВАЖНО: Теги не работают в режиме реального времени.**\n\n**3.** [**Выбор устройства \\(Device Selector\\)**](https://github.com/blynkkk/blynkkk.github.io/tree/master/mobile/ru/%20device_selector.md) Если вы добавите виджет Выбор устройства в свой проект, вы можете использовать его в качестве источника данных для Диаграммы. В том случае, когда вы меняете устройство, диаграмма будет автоматически обновляться.\n\n#### Настройки оси Y \\(Y-Axis Settings\\)\n\nCуществует 4 режима масштабирования данных вдоль оси Y, активируется после отключения общей настройки виджета \"Автоматическое масштабирование для всех потоков данных \\(Override Auto Scaling for All Datastreams\\)\".\n\n**1. Авто \\(Auto\\)** Данные будут автоматически масштабироваться на основе минимальных и максимальных значений заданного периода времени. Это лучший вариант для начинающих.\n\n**2. Минимальный/Максимальный \\(Min/Max\\)** Когда выбран этот режим, шкала Y будет установлена на выбранные вами границы значений. Например, если ваше оборудование отправляет данные со значениями от -100 до 100, вы можете установить эти границы и данные графика будут отображены полностью.\n\n![](../.gitbook/assets/yScale_manual_charts.png)\n\nВы также можете визуализировать данные в другом диапазоне. Допустим, входящие данные имеют значения в диапазоне 0-55, но вы хотели бы видеть только значения в диапазоне 30-50. Вы можете настроить диапазон, но если значения не соответствуют заданному масштабу оси Y, диаграмма будет обрезана.\n\n**3. Процент от высоты \\(% of Height\\)** Эта опция позволяет автоматически масштабировать входящие данные на виджете и размещать их так, как вы хотите. В этом режиме вы устанавливаете процент высоты виджета на экране от 0% до 100%.\n\n![](../.gitbook/assets/yheight2_charts.png)\n\nЕсли вы установите диапазон 0-100%, это будет полная автоматическая шкала. Независимо от того, в каком диапазоне поступают данные, он всегда будет масштабирован по всей высоте виджета.\n\nЕсли вы установите его на 0-25%, то график будет отображаться только на 1/4 высоты виджета.\n\n![](../.gitbook/assets/yheight2_manual_charts.png)\n\nЭтот параметр очень полезен для **Бинарной диаграммы** или для визуализации нескольких потоков данных на одной и той же диаграмме разными способами.\n\n![](../.gitbook/assets/binary_charts.png)\n\n**4. Дельта \\(Delta\\)** Пока данные остаются в пределах заданного значения дельты, график будет автоматически масштабироваться в этом диапазоне. Если дельта превышает диапазон, график автоматически масштабируется до минимальных/максимальных значений указанного периода.\n\n**Суффикс \\(Suffix\\)** Здесь вы можете указать суффикс, который будет отображаться со значениями во время длительного тап на графике.\n\n**Разрядность \\(Decimals\\)** Определяет формат числовых значений, когда вы нажимаете и удерживаете палец на графике. Возможные варианты: \\#, \\#.\\#, \\#.\\#\\#, и т.д.\n\n**Соединиить отсуствующие точки графика \\(Connect Missing Data Points\\)** Если этот переключатель включен, то Диаграмма соединит все точки, даже если данные частично отсуствуют.\n\n![](../.gitbook/assets/datapoints1_charts.png)\n\nЕсли для него установлено значение «ВЫКЛ», то вы увидите пропуски в случае отсутствия данных.\n\n![](../.gitbook/assets/datapoints2_charts.png)\n\n**Настройки Бинарной диаграммы \\(Binary Chart Settings\\)** Этот тип диаграммы полезен для построения двоичных данных, например, когда устройство было включено или выключено, или когда было обнаружено движение или когда был достигнут определенный порог значений.\n\nВам необходимо указать точку **Перехода \\(FLIP\\)**, которая будет точкой, в которой входящие данные будут принимать состояние `ИСТИНА (TRUE)` или `ЛОЖЬ (FALSE)`.\n\nНапример, вы отправляете данные в диапазоне от 0 до 1023. Если вы установите `512` в качестве точки **Перехода \\(FLIP\\)**, то все, что выше `512` \\(исключая 512\\), будет записано как `ИСТИНА (TRUE)`, любое значение ниже `512` \\(включая 512\\) будет `ЛОЖЬ (FALSE)`.\n\nДругой пример: если вы отправляете `0 и 1` и устанавливаете `0` в качестве точки **Перехода FLIP**, то `1` будет `ИСТИНА`, а `0` будет `ЛОЖЬ`.\n\n**Маркеры состояния \\(State Labels\\):** Здесь вы можете указать, как `ИСТИНА/ЛОЖЬ` должны отображаться на графике когда вы нажимаете и удерживаете палец. Например, вы можете установить значение `ИСТИНА` как `Оборудование ВКЛ`, `ЛОЖЬ` как `Оборудование ВЫКЛ`.\n\n### Терминал \\(Terminal\\)\n\nОтображает данные с вашего оборудования. Позволяет отправить любую строку с вашего оборудования. Терминал всегда хранит последние 25 сообщений, которые ваше оборудование отправило в Blynk. Этот ограничение может быть увеличено в настройках локального сервера с помощью параметра `terminal.strings.pool.size`.\n\nС этим виджетом Вы можете использовать специальные команды:\n\n```cpp\n// Печатает значения, как Serial.print\nterminal.print();   \n// Печатает значения, как Serial.println()\nterminal.println();\n// Записать необработанные данные в буффер\nterminal.write();\n// Убедится, что все данные были отправлены с устройства в терминал\nterminal.flush();\n// Стереть все данные в терминале\nterminal.clear();\n```\n\n![](../.gitbook/assets/terminal.png)\n\n![](../.gitbook/assets/terminal_edit.png)\n\n**Пример кода:** [Терминал](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Terminal/Terminal.ino)\n\n### Видео трансляция \\(Video Streaming\\)\n\nПростой виджет, который позволяет отображать прямой эфир и потокове видео. Виджет поддерживает протоколы RTSP \\(RP, SDP\\), HTTP/S прогрессивной потоковой передачи, HTTP/S прямого эфира. Для получения дополнительной информации, пожалуйста ознакомтесь с [официальной документацией Android](https://developer.android.com/guide/appendix/media-formats.html).\n\nНа данный момент команда Blynk не предоставляет потоковые серверы. Таким образом, вы можете осуществлять потоковую передачу непосредственно с ваше камеры или использовать сторонние сервисы, а также запустить собственны потоковый сервер \\(например, на оборудовании Raspberry\\).\n\nВы можете остановить/запустить видео поток, нажав на сам виджет.\n\nВы можете изменить URL-адрес видео потока с аппаратного устройства при помощи кода:\n\n```cpp\nBlynk.setProperty(V1, \"url\", \"http://my_new_video_url\");\n```\n\n### Индикатор уровня \\(Level Display\\)\n\nОтображает входящие данные с ваших датчиков или виртуальных пин-ов. Отображение уровня очень похоже на индикатор выполнения процесса, это очень красивый и причудливый вид для индикации «выполненных» событий, например «уровня заряда батареи». Вы можете обновить отображение значения с аппаратной стороны с помощью кода:\n\n```cpp\nBlynk.virtualWrite(V1, val);\n```\n\nКаждое сообщение, которое аппаратное устройство отправляет на сервер, автоматически сохраняется на сервере. Режим PUSH не требует, чтобы приложение было онлайн или запущено.\n\n**Пример кода:** [Пример PUSH](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushData/PushData.ino)\n\n## Уведомления \\(Notifications\\)\n\n### Твиттер \\(Twitter\\)\n\nВиджет Твиттер соединяет вашу учетную запись сети Twitter с Blynk и позволяет отправлять \"твиты\" с вашего оборудования.\n\n![](../.gitbook/assets/TwitterON.png)\n\nПример кода:\n\n```cpp\nBlynk.tweet(\"Привет, Blynk-еры! Мой Arduino может слать твиты!\");\n```\n\nОграничения :\n\n* нельзя отправлять 2 твита с одним и тем же сообщением \\(это политика Твиттера\\)\n* разрешен только 1 твит за 5 секунд\n\n### Кодировка в Твиттере\n\nБиблиотека обрабатывает все строки в кодировке UTF-8. Если вы столкнулись с проблемами, попробуйте напечатать ваше сообщение на последовательный порт и проверить, работает ли оно \\(COM терминал должен быть настроен на кодировку UTF-8\\). Если не работает, вам следует проверить поддержку UTF-8 вашего компилятора. Если работает, но ваше сообщение обрезано - вам нужно увеличить длины сообщения \\(все символы UTF-8 потребляют как минимум вдвое больше байт информации\\).\n\n### Увеличение лимита длины сообщения\n\nВы можете увеличить максимальную длину сообщения, поместив \\(до включения Blynk\\) в верхнюю часть своего кода строку:\n\n```cpp\n#define BLYNK_MAX_SENDBYTES 256 // По умолчанию 128 байт\n```\n\n**Пример кода:** [Твиттер](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Twitter/Twitter.ino)\n\n### Электронная почта \\(Email\\)\n\nВиджет электронной почты позволяет отправлять электронные письма с вашего оборудования на любой адрес.\n\nПример кода:\n\n```cpp\nBlynk.email(\"my_email@example.com\", \"Тема\", \"Текст вашего сообщения\");\n```\n\nКод содержит первое поле `to`. С помощью этого поля вы можете определить получателей электронной почты в приложении. Вы можете пропустить поле `to`, если хотите отправить электронное письмо на адрес электронной почты используемый для входа в приложение Blynk:\n\n```cpp\n Blynk.email(\"Тема\", \"Текст вашего сообщения\");\n```\n\nВы можете отправить электронное писбом в форматах либо `text/html`, либо `text/plain` \\(помните что некоторые клиенты не поддерживают `text/html`\\). Вы можете изменить формат содержимого электронного письма в настройках виджета.\n\nДополнительно в письме вы можете использовать заполнители/переменные `{DEVICE_NAME}`, `{DEVICE_OWNER_EMAIL}` и `{VENDOR_EMAIL}` \\(для локального сервера\\) в полях `to` \\(кому\\),`subject` \\(тема\\) и `body` \\(текст сообщения\\):\n\n```cpp\nBlynk.email(\"{DEVICE_OWNER_EMAIL}\", \"{DEVICE_NAME} : Тревога\", \"Ваше устройство {DEVICE_NAME} имеет критическую ошибку!\");\n```\n\n![](../.gitbook/assets/mail.png)\n\n**Недостатки:**\n\n* Максимально допустимые ограничения \\(почта + тема + длина сообщения\\) = 120 символов. Однако вы можете увеличить этот лимит при необходимости добавив `#define BLYNK_MAX_SENDBYTES XXX` к вашему коду. Где `XXX` - это максимальная длина вашего письма в символах.\n\n  Например, для ESP вы можете установить максимальную длину 1200 символов `#define BLYNK_MAX_SENDBYTES 1200`. Параметр  `#define BLYNK_MAX_SENDBYTES 1200` должен быть опредлен в коде до включения Blynk.\n\n* Разрешено отправлять 1 электронное письмо в течение 5 секунд;\n* Если вы используете Gmail сервис \\(Google\\), вы ограничены 500 письмами в день. Другие провайдеры могут иметь аналогичные ограничения, поэтому, пожалуйста, будьте внимательны;\n* Пользователи Blynk сервера ограничены 100 сообщениями в день;\n\n### Кодировка в электронной почте\n\nБиблиотека обрабатывает все строки в кодировке UTF-8. Если у вас возникли проблемы, попробуйте напечатать ваше сообщение в терминал COM порта и посмотрите на результат \\(терминал должен быть настроен на кодировку UTF-8\\). Если не работает, возможно, вам следует также прочитать о поддержке кодировок вашего компилятора. Если работает, но ваше сообщение обрезано - вам нужно увеличить ограничение длины сообщения \\(т.к. все символы кодировки UTF-8 потребляют как минимум вдвое больше байт информации если символы не Латинские\\).\n\n### Увеличение лимита длины сообщения\n\nВы можете увеличить максимальную длину сообщения, поместив в верхнюю часть своего кода строку \\(до опредления Blynk\\):\n\n```cpp\n#define BLYNK_MAX_SENDBYTES 256 // По умолчанию 128 байт\n```\n\n**Пример кода:** [Электронная почта](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Email/Email.ino)\n\n### Всплывающие уведомления \\(Push Notifications\\)\n\nВиджет Push-уведомлений позволяет отправлять уведомления с вашего оборудования на ваше Android/iOS устройство. В настоящее время он также содержит три дополнительные опции:\n\n* **Уведомлять, когда оборудование отключено** \\(Notify when hardware offline\\) - вы получите push-уведомление, если ваше оборудование отключилось.\n* **Автономный период игнорирования** \\(Offline Ignore Period\\) - определяет, как долго оборудование может находиться в режиме ожидания \\(после того, как оно отключилось\\) перед отправкой уведомления.\n\nВ случае превышения периода ожидания будет отправлено уведомление «Аппаратное отключение». Вы не получите уведомление, если оборудование переподключится в течение указанного периода.\n\n* **Приоритет** \\(Priority\\) - высокий \\(high\\) приоритет дает больше шансов, что ваше сообщение будет доставлено без задержек. См. более подробное объяснение [здесь](https://developers.google.com/cloud-messaging/concept-options#setting-the-priority-of-a-message).\n\n**ПРЕДУПРЕЖДЕНИЕ**: высокий приоритет способствует большей разрядке батареи, по сравнению с обычными приоритетом уведомлений.\n\n![](../.gitbook/assets/push.png)\n\nПример кода:\n\n```cpp\nBlynk.notify(\"Привет, Blynk-еры! Мое оборудование может отправлять уведомления!\");\n```\n\nВы также можете использовать переменные/заполнители для имени устройства, который будет заменен с сервера именем вашего устройства:\n\n```cpp\nBlynk.notify(\"Привет, Blynk-еры! Мой {DEVICE_NAME} может отправлять уведомления!\");\n```\n\nОграничения:\n\n* Максимально допустимая длина уведомления составляет 120 символов;\n* Каждое устройство может отправлять только 1 уведомление каждые 5 секунд;\n\n### Кодировка всплывающих уведомлений\n\nБиблиотека обрабатывает все строки как в кодировке UTF-8. Если вы столкнулись с проблемами, попробуйте отправить ваше сообщение на последовательный порт и посмотреть, работает ли оно \\(терминал должен быть настроен на кодировку UTF-8\\). Если так не работает, возможно, вам следует прочитать о поддержке кодировки UTF-8 вашего компилятора. Если работает, но ваше сообщение урезано - вам необходимо увеличить ограничение длины сообщения \\(все символы UTF-8 потребляют как минимум вдвое больше байт информации\\).\n\n### Увеличение лимита длины уведомления\n\nВы можете увеличить максимальную длину сообщения, поместив строку \\(до включения Blynk\\) в верхнюю часть своего кода:\n\n```cpp\n#define BLYNK_MAX_SENDBYTES 256 // По умолчанию 128 байт\n```\n\n**Пример кода:** [Всплывающие уведомления](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/PushNotification/PushNotification_Button/PushNotification_Button.ino)\n\n## Интерфейсы\n\n### Вкладки \\(Tabs\\)\n\nЕдинственная цель виджета Вкладки - расширить пространство вашего проекта. Чтобы редактировать виджет Вкладок - просто нажмите на выбранную вкладку. Вы можете перетаскивать виджеты между вкладками. Из списка можно удалить только последнюю вкладку: чтобы удалить ее, проведите пальцем влево по ее названию в экране настроек виджета.\n\nМаксимальное количество вкладок на iOS составляет 4.\n\nМаксимальное количество вкладок на Android - 10.\n\nОставайтесь с нами для предстоящего редизайна виджета вкладок!\n\n![](../.gitbook/assets/tabs_settings.png)\n\n### Меню \\(Menu\\)\n\nВиджет Меню позволяет отправлять команды на ваше оборудование на основе выборного списка, сделанного вами в пользовательском интерфейсе. Меню отправляет индекс выбранного элемента спика, а не саму строку. Отправляемый индекс начинается с 1. Он работает так же, как типовой элемент \"Комбинированный список\" \\([ComboBox](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA)\\).\n\n![](../.gitbook/assets/menu_edit.png)\n\nПример кода:\n\n```cpp\nBLYNK_WRITE {\n  switch (param.asInt()) {\n    case 1: { // Пункт 1\n      Serial.println(\"Выбран Пункт 1\");\n      break;\n    }\n    case 2: { // Пункт 2\n      Serial.println(\"Выбран Пункт 2\");\n      break;\n    }    \n  }\n}\n```\n\nВы также можете назначить пункты меню со стороны оборудования с помощью кода:\n\n```cpp\nBlynk.setProperty(V1, \"labels\", \"label 1\", \"label 2\", \"label 3\");\n```\n\n**Пример кода:** [Меню](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Menu/Menu.ino)\n\n## Ввод времени \\(Time Input\\)\n\nВиджет Ввода времени позволяет вам выбрать время начала/окончания, день недели, часовой пояс, значения в формате до полудня/после полудня и отправить их на ваше оборудование. В настоящее время поддерживаются следующие форматы: `ЧЧ:ММ` и `ЧЧ:ММ AM/PM`.\n\nАппаратное устройстов будет отсчитывать время пользовательского интерфейса в виде секунд дня \\(`3600 * часов + 60 * минут`\\) для запуска/остановки времения. Время, которое виджет отправляет оборудованию, является локальным временем пользователя. Индексы по выбранных дней:\n\n```text\nПонедельник - 1\nВторник - 2\n...\nСуббота - 6\nВоскресенье - 7\n```\n\nВы также можете изменить состояние виджета в интерфейсе пользователя. Смотрите ниже примеры кода.\n\n**Пример кода:** [Простой Ввод времени для времени начала](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/SimpleTimeInput/SimpleTimeInput.ino)\n\n**Пример кода:** [Расширенный Ввод времени](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/AdvancedTimeInput/AdvancedTimeInput.ino)\n\n**Пример кода:** [Обновление Ввода времени в пользовательском интерфейсе](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/UpdateTimeInputState/UpdateTimeInputState.ino)\n\n### Карта \\(Map\\)\n\nВиджет Карты позволяет устанавливать точки/флажки на карте со стороны оборудования. Это очень полезный виджет, если у вас есть несколько устройств, и вы хотите отслеживать их позиции на карте.\n\nВы можете отправить точку на карту с помощью обычной команды виртуальной записи:\n\n```cpp\nBlynk.virtualWrite(V1, pointIndex, lat, lon, \"Название\");\n```\n\nМы также создали оболочку, чтобы вы могли упростить использование виджета Карты. Вы можете изменить метки флажков на оборудовании с помощью кода:\n\n```cpp\nWidgetMap myMap(V1);\n...\nint index = 1;\nfloat lat = 51.5074;\nfloat lon = 0.1278;\nmyMap.location(index, lat, lon, \"Название\");\n```\n\nИспользование уникальных `index` позволяет вам переопределить существующее значение точки.\n\n**Пример кода:** [Базовый пример Карты](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Map/Map.ino)\n\n### Таблица \\(Table\\)\n\nТабличный виджет удобен, когда вам нужно структурировать аналогичные данные в пределах одного графического элемента. Работает как обычная таблица.\n\nВы можете добавить строку в таблицу с помощью кода:\n\n```text\nBlynk.virtualWrite(V1, \"add\", id, \"Имя\", \"Значение\");\n```\n\nВы можете обновить строку в таблице с помощью кода:\n\n```text\nBlynk.virtualWrite(V1, \"update\", id, \"Новое имя\", \"Новое значение\");\n```\n\nЧтобы выделить любой элемент в таблице, используйте его идентификатор:\n\n```text\nBlynk.virtualWrite(V1, \"pick\", 0);\n```\n\nЧтобы выбрать/отменить выбор \\(сделать значок зеленым/серым\\) элемент в таблице, используйте его идентификатор:\n\n```text\nBlynk.virtualWrite(V1, \"select\", 0);\nBlynk.virtualWrite(V1, \"deselect\", 0);\n```\n\nЧтобы очистить таблицу используйте код:\n\n```text\nBlynk.virtualWrite(V1, \"clr\");\n```\n\nВы также можете обрабатывать другие действия из таблицы. Например, использовать строку таблицы в качестве кнопки переключения.\n\n```text\nBLYNK_WRITE(V1) {\n   String cmd = param[0].asStr();\n   if (cmd == \"select\") {\n       // строка в таблице была выбрана.\n       int rowId = param[1].asInt();\n   }\n   if (cmd == \"deselect\") {\n       // строка в таблице была отменена.\n       int rowId = param[1].asInt();\n   }\n   if (cmd == \"order\") {\n       // когда строки в таблице переупорядочиваются\n       int oldRowIndex = param[1].asInt();\n       int newRowIndex = param[2].asInt();\n   }\n}\n```\n\n**Примечание:** Максимальное количество строк в таблице равно 100. Когда вы достигнете предела, таблица будет работать как список FIFO \\(Первый пришел - первый ушел\\). Это ограничение можно изменить, настроив свойство `table.rows.pool.size` в параметрах локального сервера.\n\n**Пример кода:** [Простое использование таблицы](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Table/Table_Simple/Table_Simple.ino)\n\n**Пример кода:** [Расширенное использование таблицы](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Table/Table_Advanced/Table_Advanced.ino)\n\n### Селектор устройств \\(Device Selector\\)\n\nСелектор устройств - это мощный виджет, который позволяет обновлять виджеты на основе одного активного устройства. Этот виджет особенно полезен, когда у вас есть несколько устройств с аналогичной функциональностью.\n\nПредставьте, что у вас есть 4 устройства, и к каждому устройству подключен датчик температуры и влажности. Для отображения данных по всем 4 устройствам вам необходимо добавить 8 виджетов.\n\nС помощью Селектора устройств вы можете использовать только 2 виджета, которые будут отображать температуру и влажность в зависимости от активного устройства, выбранного в Селекторе.\n\nВсе, что вам нужно сделать, это:\n\n1. Добавить виджет Селектора устройств в проект\n2. Добавить 2 виджета \\(например виджет отображения значений \\(Value Display Widget\\)\\), чтобы отобразить температуру и влажность\n3. В настройках виджетов вы сможете назначить их на Селектор устройств \\(в разделе источника или цели\\)\n4. Выйти из настроек, запустить проект \n\nТеперь вы можете изменить активное устройство в Селекторе устройств и увидите, что значения температуры и влажности отражают обновленные данные для только что выбранного вами устройства.\n\n**ПРИМЕЧАНИЕ:** Виджет вебхук \\([Webhook](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/WebHook/WebHook_GET/WebHook_GET.ino)\\) пока не работает с Селектором устройств.\n\n### Плитка устройств \\(Device Tiles\\)\n\nПлитка устройств - это мощный виджет, очень похожий на виджет Селектора устройств \\(Device Selector\\), но с пользовательским интерфейсом. Позволяет отображать один пин с устройства на одну плитку. Этот виджет особенно полезен, когда у вас есть несколько устройств с аналогичной функциональностью. Теперь вы можете группировать похожие устройства на одном макете \\(шаблоне\\).\n\n## Сенсоры\n\n### Акселерометр \\(Accelerometer\\)\n\nАкселерометр один из [сенсоров движения](https://developer.android.com/guide/topics/sensors/sensors_motion.html), который позволяет определить движение Вашего телефона в пространстве. Он может пригодится для отслеживания таких событий как тряска, удар, поворот или наклон телефона. Концептуально, акселерометр определяет силу ускорения приложенную к вашему телефону. Единица измерения - м/c^2 приложенная к каждой из осей `x`, `y`, `z`.\n\nЧтобы получить данные с сенсора нужно использовать следующий код :\n\n```cpp\nBLYNK_WRITE(V1) {\n  //сила ускорения, приложенная к оси x\n  int x = param[0].asFloat(); \n  //сила ускорения, приложенная к оси y\n  int y = param[1].asFloat();\n  //сила ускорения, приложенная к оси z\n  int z = param[2].asFloat();\n}\n```\n\nАкселерометр не работает при свернутом приложении.\n\n### Барометр/Давление \\(Barometer/pressure\\)\n\nБарометр один из сенсоров [окружающей среды](https://developer.android.com/guide/topics/sensors/sensors_environment.html) и позволяет измерять атмосферное давление.\n\nИзмеряется в `hPa` \\(гПа\\) или `mbar` \\(мБар\\).\n\nЧтобы получить данные с сенсора нужно использовать следующий код :\n\n```cpp\nBLYNK_WRITE(V1) {\n  //Давление в мБар\n  int pressure = param[0].asInt(); \n}\n```\n\nБарометр не работает при свернутом приложении.\n\n### Гравитация \\(Gravity\\)\n\nГравитация - это своего рода [датчики движения](https://developer.android.com/guide/topics/sensors/sensors_motion.html), который позволяет обнаруживать движение вашего смартфона. Полезно для мониторинга движения устройства, таких как наклон, встряхивание, вращение или качание.\n\nДатчик силы притяжения выдает трехмерный вектор, указывающий направление и величину силы притяжения. Измеряется в `m/s^2` силы притяжения, приложенной к оси `x`, `y`, `z`. Для того, чтобы принять данные от него, вам необходимо:\n\n```cpp\nBLYNK_WRITE(V1) {\n  //сила притяжения, приложенная к оси x\n  int x = param[0].asFloat(); \n  //сила притяжения, приложенная к оси y\n  int y = param[1].asFloat();\n  //сила притяжения, приложенная к оси y\n  int z = param[2].asFloat();\n}\n```\n\n**ВНИМАНИЕ:** Виджет гравитации не работает в фоновом режиме.\n\n### Влажность \\(Humidity\\)\n\nВлажность является своего рода [датчиком среды](https://developer.android.com/guide/topics/sensors/sensors_environment.html), который позволяет измерять относительную влажность окружающей среды.\n\nИзмеряется в `%` - фактически это относительная влажность в процентах.\n\nДля того, чтобы принять данные от датчика, вам необходимо:\n\n```cpp\nBLYNK_WRITE(V1) {\n  //Влажность в %\n  int humidity = param.asInt();\n}\n```\n\n**ВНИМАНИЕ:** Влажность не работает в фоновом режиме.\n\n### Свет \\(Light\\)\n\nСвет - это своего рода [датчики окружающей среды](https://developer.android.com/guide/topics/sensors/sensors_environment.html), который позволяет измерять уровень освещенности \\(уровень внешней освещенности измеряется в люксах\\). В телефонах чаще всего используется для управления яркостью экрана.\n\nДля того, чтобы принять данные этого виджета, вам необходимо:\n\n```cpp\nBLYNK_WRITE(V1) {\n  //уровень освещенности\n  int lx = param.asInt(); \n}\n```\n\nВиджет Свет не работает в фоновом режиме.\n\n### Близость \\(Proximity\\)\n\nБлизость - это своего рода [датчики положения](https://developer.android.com/guide/topics/sensors/sensors_position.html) это позволяет определить, насколько близко смартфон к лицу. Измеряется в `cm` \\(см\\) - расстояние от телефона до лица. Однако большинство этих датчиков возвращает только информацию FAR / NEAR. Поэтому, возвращаемое значение будет `0 / 1`. Где 0 / LOW = `FAR` \\(далеко\\), а 1 / HIGH = `NEAR` \\(рядом\\).\n\nДля того, чтобы принять данные из виджета, вам необходимо:\n\n```cpp\nBLYNK_WRITE(V1) {\n  //  расстояние до объекта\n  int proximity = param.asInt();\n  if (proximity) {\n     // РЯДОМ\n  } else {\n     // ДАЛЕКО\n  }\n}\n```\n\nВиджет близость не работает в фоновом режиме.\n\n### Температура \\(Temperature\\)\n\nТемпература является своего рода [датчиком окружающей среды](https://developer.android.com/guide/topics/sensors/sensors_environment.html) который позволяет измерять температуру окружающего воздуха. Измеряется в `°C` - градусах Цельсия.\n\nДля приема данных из виджета, необходимо использовать код:\n\n```cpp\nBLYNK_WRITE(V1) {\n  // температура в градусах цельсия\n  int celcius = param.asInt();\n}\n```\n\nВиджет Температуры не работает в фоновом режиме.\n\n### Триггер GPS \\(GPS Trigger\\)\n\nВиджет Триггер GPS позволяет легко инициировать события, когда вы входите или выходите из географической зоны. Этот виджет будет работать в фоновом режиме и периодически будет проверять ваши координаты. Если ваше местоположение находится в пределах или вне указанной зоны \\(географическая зона выбирается на карте виджета\\), виджет отправит команду `HIGH`/`LOW` на аппаратное устройство. Например, Триггер GPS назначен для пина `V1`, и включена опция `Trigger When Enter`. В этом случае, когда вы окажитесь в указанной географической зоне виджет вызовет событие `HIGH`.\n\n```cpp\nBLYNK_WRITE(V1) {\n  int state = param.asInt();\n  if (state) {\n      //Вы вошли в зону\n  } else {\n      //Вы вышли из зоны\n  }\n}\n```\n\nПодробнее о том, как работает GPS-виджет, вы можете прочитать [здесь](https://developer.android.com/guide/topics/location/strategies.html).\n\n**ВНИМАНИЕ:** Виджет Триггер GPS работает в фоновом режиме.\n\n### Поток GPS \\(GPS Streaming\\)\n\nПолезно для мониторинга местонахождения смартфона получать данные о широте, долготе, высоте и скорости \\(скорость часто может быть 0, если смартфон не поддерживает ее измерение\\).\n\nЧтобы принимать данные из этого виджета, вам необходимо:\n\n```cpp\nBLYNK_WRITE(V1) {\n  float latitude = param[0].asFloat(); \n  float longitude = param[1].asFloat();\n  float altitude = param[2].asFloat();\n  float speed = param[3].asFloat();\n}\n```\n\nили вы можете использовать подготовленную оболочку `GpsParam` :\n\n```cpp\nBLYNK_WRITE(V1) {\n  GpsParam gps(param);\n  //Печать лат/лон с 6 десятичными знаками\n  Serial.println(gps.getLat(), 7);\n  Serial.println(gps.getLon(), 7);\n\n  Serial.println(gps.getAltitude(), 2);\n  Serial.println(gps.getSpeed(), 2);\n}\n```\n\nПоток GPS работает в фоновом режиме.\n\n**Пример кода:** [Поток GPS](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/GPS_Stream/GPS_Stream.ino)\n\n## Другие\n\n### Мост \\(Bridge\\)\n\nМост может быть использован для связи между устройствами \\(без участия приложения\\). Вы можете отправлять цифровые / аналоговые / виртуальные команды записи с одного устройства на другое, зная только токен авторизации. На данный момент виджет Мост не обязательно использовать в приложении \\(здесь он используется для указания того, что у нас есть такая функция\\). **Вы можете использовать несколько мостов для управления несколькими устройствами.**\n\n![](../.gitbook/assets/bridge.png)\n\nВиджет Мост использует виртуальный пин и превращает его в канал для управления другим устройством. Это означает, что вы можете контролировать любые виртуальные, цифровые или аналоговые пины целевого устройства. Будьте осторожны, не используйте пины типа `A0, A1, A2 ...` при обмене данными между различными типами устройств, так как в таких случаях Arduino Core может ссылаться на неверные пины.\n\nПример кода для устройства A, которое будет отправлять значения на устройство B:\n\n```cpp\n//Инициирует виджет Моста на V1 устройства A\nWidgetBridge bridge1(V1);\n...\nvoid setup() {\n    Blynk.begin(...);\n    while (Blynk.connect() == false) {\n        // Ждем пока Blynk подключится\n    }\n    bridge1.digitalWrite(9, HIGH); // выставим триггер HIGH на D9 \n                                   // устройства B. Код на устройстве\n                                   // B не требуется\n    bridge1.analogWrite(10, 123);\n    bridge1.virtualWrite(V1, \"hello\"); // вам нужно написать код на \n                                       // устройстве B, чтобы получить\n                                       // это значение. См. ниже\n    bridge1.virtualWrite(V2, \"value1\", \"value2\", \"value3\");\n}\n\nBLYNK_CONNECTED() {\n  bridge1.setAuthToken(\"OtherAuthToken\"); // токен с устройства B\n}\n```\n\n**ВАЖНО:** при выполнении `virtualWrite()` с виджета Мост, устройство B должно обрабатывать входящие данные с устройства A. Например, если вы отправляете значение с устройства A на устройство B, используя `bridge.virtualWrite (V5)`, вам необходимо использовать свой обработчик на устройстве B:\n\n```cpp\nBLYNK_WRITE(V5){\n    int pinData = param.asInt(); // переменная pinData будет хранить значение,\n                                 // полученное через Bridge\n}\n```\n\nИмейте в виду, что `bridge.virtualWrite` не отправляет никаких значений в мобильное приложение. Для этого вам нужно вызвать `Blynk.virtualWrite`.\n\n**Пример кода:** [Мост](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Bridge/Bridge.ino)\n\n### Обработчик событий \\(Eventor\\)\n\nВиджет Обработчик событий позволяет создавать простые правила поведения или **события**. Давайте рассмотрим типичный вариант использования: считывание температуры с датчика DHT и отправка push-уведомления, когда температура превышает определенный предел:\n\n```cpp\n  float t = dht.readTemperature();\n  if (isnan(t)) {\n    return;\n  }\n  if (t > 40) {\n    Blynk.notify(String(\"Температура слишком высокая: \") + t);\n  }\n```\n\nС Обработчиком событий вам не нужно писать этот код. Все, что вам нужно, это отправить значение с датчика на сервер Blynk:\n\n```cpp\n  float t = dht.readTemperature();\n  Blynk.virtualWrite(V0, t);\n```\n\nНе забывайте, что команды `virtualWrite` должны быть заключены в таймер и не должны использоваться в основном цикле `loop`.\n\n![](../.gitbook/assets/eventor_for_temp_example.png)\n\n**ПРИМЕЧАНИЕ:** Не забудьте добавить виджет уведомлений в приложении.\n\nОбработчик событий пригодится вам, когда нужно изменить условия на лету без повторной загрузки нового скетча на аппаратное обеспечение. Вы можете создать столько **событий**, сколько вам нужно. Обработчик событий также может быть запущен со стороны приложения. Вам просто нужно назначить виджет на тот же контакт, что и ваше событие в Обработчике событий. Обработчик событий не постоянно отправляет события. Давайте рассмотрим простой пример, как показано выше `if (temperature > 40) send notification`. Когда температура превышает 40 пороговых значений - отправляется уведомление. Если температура продолжает оставаться выше 40 никакие повторные действия не будут инициированы. Но если `temperature` опускается ниже порогового значения, а затем проходит его снова уведомление будет отправлено повторно \\(для уведомлений Обработчика событий нет ограничения отправки в течение 5 секунд\\).\n\nОбработчик событий также поддерживает события таймера \\(Timer\\). Например, вы можете установить пин `V1` ON/HIGH в 21:00:00 каждую пятницу. В Обработчике событий вы можете назначить несколько таймеров на один и тот же пин, отправить любую строку/число, выбрать день и часовой пояс.\n\nЧтобы удалить созданное **событие**, пожалуйста, используйте сдвиг пальцем по экрану. Вы также можете перенести последний элемент самого события.\n\n**Пример кода:** [Обработчик событий](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Eventor/Eventor.ino)\n\n**ПРИМЕЧАНИЕ:** Виджет таймера зависит от времени сервера, а не вашего телефона. Иногда время телефона может не соответствовать времени сервера.\n\n**ПРИМЕЧАНИЕ:** события запускаются только один раз при выполнении условия. Это означитает что \\[цепочка событий\\] \\([https://community.blynk.cc/t/eventor-behavior-bug-feature/20962](https://community.blynk.cc/t/eventor-behavior-bug-feature/20962)\\) невозможна \\(однако она может быть включена в коммерческой версии\\).\n\n![](../.gitbook/assets/eventor_edit.png)\n\n### Часы реального времени \\(RTC\\)\n\nЧасы реального времени позволяют получать время с сервера. Вы можете предварительно выбрать любой часовой пояс в пользовательском интерфейсе, чтобы получить время на оборудование из нужной локали.\n\n![](../.gitbook/assets/rtc_edit.png)\n\n**Пример кода:** [Часы реального времени](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/RTC/RTC.ino)\n\n### Bluetooth с низким энергопотреблением\n\nЭтот виджет позволяет включить блутзуз с низким энергопотреблением на вашем телефоне. На текущий момент виджет также требует наличия интернет соединения \\(постараемся пофиксить в ближайшем будущем\\). Некоторые типы виджетов нельзя использовать вместе с блутузом, например исторический граф, так как он требует чтобы данные отправлялись на сервер, чего блутуз виджет не делает.\n\n**Список поддерживаемых чипов и контроллеров:** [BLE](https://github.com/blynkkk/blynk-library/tree/master/examples/Boards_Bluetooth)\n\n### Блютуз \\(Bluetooth\\)\n\nЭтот виджет позволяет включить блютуз на вашем телефоне. На текущий момент виджет также требует наличия интернет соединения \\(постараемся пофиксить в ближайшем будущем\\) и поддерживается только на Android. Некоторые типы виджетов нельзя использовать вместе с блютузом, например исторический граф, так как он требует чтобы данные отправлялись на сервер, чего блютуз виджет не делает.\n\n**Список поддерживаемых чипов и контроллеров:** [BLE](https://github.com/blynkkk/blynk-library/tree/master/examples/Boards_Bluetooth)\n\n### Музыкальный проигрыватель \\(Music Player\\)\n\nПростой элемент интерфейса с 3 кнопками - имитирует интерфейс музыкального проигрывателя. Каждая кнопка отправляет свою команду на аппаратное устройство: `play` \\(воспроизвести\\), `stop` \\(стоп\\), `prev` \\(предыдущий\\), `next` \\(следующий\\).\n\nВы можете изменить состояние виджета в приложении с аппаратной стороны с помощью следующих команд:\n\n```text\nBlynk.virtualWrite(Vx, \"play\");\nBlynk.virtualWrite(Vx, \"stop\");\n```\n\nВы также можете изменить состояние воспроизведение/остановка виджета с помощью следующего кода \\(эквивалент вышеупомянутых команд\\):\n\n`Blynk.setProperty(V1, \"isOnPlay\", \"false\");`\n\n**Пример кода:** [Музыкальный проигрыватель](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Player/Player.ino)\n\n### Вебхук \\(Webhook\\)\n\nВебхук очень мощный виджет, который позволяет Вам легко интегрироватся с любыми сторонними сервисами. С его помощью Вы можете слать любые HTTP/S запросы на любой сервер или устройство, которое имеет HTTP/S API \\(например, лампы Philips Hue\\).\n\nВебхук вешается на вирутальный пин и любая команда, которая приходит на этот пин будет вызывать срабатывание HTTP/S запроса. Команды на такой виртуальный пин могут приходить как со стороны железа, так и со стороны приложения. То есть, Вы можете слать любой HTTP запрос при нажатии кнопки в приложении, если эта кнопка на том же пине что и вебхук.\n\nВот простой пример, представьте, что Вы хотите слать данные с микроконтроллера не только в Blynk, но и в какой-то другой сервис, например - Google Docs или в thingspeak.com. Раньше Вам для этого пришлось бы писать что-то вроде :\n\n```cpp\nWiFiClient client;\nif (client.connect(\"api.thingspeak.com\", 80)) {\n    client.print(\"POST /update HTTP/1.1\\n\");\n    client.print(\"Host: api.thingspeak.com\\n\");\n    client.print(\"Connection: close\\n\");\n    client.print(\"X-THINGSPEAKAPIKEY: \" + apiKeyThingspeak1 + \"\\n\");\n    client.print(\"Content-Type: application/x-www-form-urlencoded\\n\");\n    client.print(\"Content-Length: \");\n    client.print(postStr.length());\n    client.print(\"\\n\\n\");\n    client.print(postStr);\n}\n```\n\nС вебхуком этого больше делать не нужно.\n\n![](../.gitbook/assets/webhook_settings.png)\n\nДостаточно лишь заполнить поля виджета в приложении и выполнить привычное:\n\n```cpp\nBlynk.virtualWrite(V0, value);\n```\n\nГде V0 - пин вебхук виджета.\n\nВ дополнение, Вы можете подставлять значение пина в URL:\n\n```cpp\nhttps://api.thingspeak.com/update?api_key=xxxxxx&field1=/pin/\n```\n\nили тело запроса :\n\n```cpp\n[\"/pin/\"]\n```\n\nТак же можно отправлять несколько значений внутри одного пина \\(до 5\\) :\n\n`/pin[0]/`,`/pin[1]/`, `/pin[2]/`\n\nЕще одна крутая штука - это возможность делать HTTP GET запросы на сервере и слать их результат на микроконтроллер. Прелесть тут в том, что Вам не нужно для этого писать сложный код на микроконтроллере. Представьте, что Вам нужно  \nполучить информацию о погоде от какого-то метио сервиса. Например, по такому запросу :\n\n```text\nВы можете вставить этот запрос в вебхук виджет, выбрать пин ```V0``` и написать :\n\n```cpp\nBLYNK_WRITE(V0){\n  String webhookdata = param.asStr();\n  Serial.println(webhookdata);\n}\n```\n\nТеперь, каждый раз когда вы дергаете `V0` с помощью `Blynk.virtualWrite(V0, 1)` будет вызвана функция `BLYNK_WRITE(V0)`.\n\n**Замечание:** обычно HTTP запросы довольно большие, поэтому Вам, вероятно, нужно будет увеличить лимит на максимальную длину сообщения на микроконтроллере `#define BLYNK_MAX_READBYTES 1024`.\n\n**Замечание:** наше облако так же имеет определенные лимиты для вебхука. Мы разрешаем слать только 1 запрос в секунду. Это поведение можно изменить на локальном сервер через свойство `webhooks.frequency.user.quota.limit`. Пожалуйста, используйте вебхуки с умом. Многие веб ресурсы не способны обрабатывать даже 1 запрос в секунду.\n\n**Замечание :** в случае если Ваш вебхук не выполнился 10 раз подряд - вебхук виджет будет остановлен. Чтобы восстановить его работу - нужно открыть и закрыть виджет в режиме редактирования. Не выполненными считаются запросы у которых код ответа не равен 200 или 302.\n\n### Отчеты \\(Reports\\)\n\nФункция виджета Отчеты заключается в настройке и разметке отчетов данных в формате CSV. Вы можете выбрать разовые или переодически запланированные отчеты.\n\nКроме того, в отчетах вы можете очистить все пользовательсике данные, собранные с ваших устройств.\n\nВам необходимо настроить начальные параметры в режиме редактирования, а затем уже в режиме воспроизведения вы сможете настроить сами отчеты.\n\n#### Режим редактирования. Конфигурация ввода данных\n\nВ режиме редактирования \\(когда ваш проект остановлен\\) вы определяете потоки данных, которые вы хотели бы позже включить в отчет. Виджет Отчеты предназначен для работы с виджетом [Плитка устройств \\(Device Tiles\\)](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/device_tiles.md). Если вы не используете плитки устройств, вы все равно можете выбрать одно устройство или группу устройств в качестве источника данных для отчетов.\n\nВы должны выбрать либо [Плитку устройств](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/device_tiles.md), либо одино устройство, либо группу устройств для отчета. Вы не можете объединить эти оба варианта.\n\n#### Режим воспроизведения\n\nПосле добавления исходных устройств и их потоков данных нажмите кнопку «Воспроизвести» и нажмите кнопку «Отчеты».\n\n### Настройка отчетов\n\nКаждый параметр отчета предполагает свои собственные настройки:\n\n`Report name` \\(Имя отчета\\) - дайте вашему отчету осмысленное имя.\n\n`Data source` \\(Источники данных\\) - выберите потоки данных, которые вы хотели бы включить в отчеты.\n\n`Report Frequency` \\(периодичность отчетов\\) - Определяет, как часто будут отправляться отчеты. Они могут быть разовыми и запланированными.\n\n`one-time` \\(Сейчас\\) - мгновенно сформирует отчет и отправит его на указанные адреса электронной почты. Нажмите на значок справа, чтобы отправить отчет.\n\nЗапланированные отчеты могут быть отправлены `daily`/`weekly`/`monthly` \\(ежедневно/еженедельно/ежемесячно\\).\n\n`At Time` \\(Время\\) установите время дня, когда отчет будет отправлен. `Start`/`End` \\(Качало/Конец\\) указывает дату начала и окончания оправки отчетов.\n\nДля еженедельного отчета вы можете выбрать день недели, когда отчет должен быть отправлен. Для ежемесячного отчета вы можете выбрать, отправку отчета в первый или последний день месяца.\n\n`Recipients` \\(Получатели\\) - укажите до 5 адресов электронной почты..\n\n`Data resolution` \\(Разрешение данных\\) определяет детализацию ваших отчетов. Поддерживаемые детализации: `minute` \\(ежеминутно\\), `hourly` \\(ежечасно\\) и `daily` \\(ежедневно\\). Например, когда вы генерируете ежедневный отчет с детализацией в 1 минуту, вы получаете `24 * 60 * 60` единиц данных в вашем ежедневном отчете за каждый выбранный поток.\n\n`Group data in reports by` \\(Группировка данных в отчетах\\) - укажите выходной формат файла-\\(ов\\) CSV:\n\n`Datastream` \\(Поток\\) - вы получите один CSV файл для каждого потока данных.\n\n`Device` \\(Устройство\\) - вы получите один CSV-файл на каждое устройство. Каждый файл будет содержать все включенные потоки данных.\n\n`Report` \\(Отчет\\) - вы получите один CSV-файл для всех ваших устройств и всех ваших потоков данных.\n\n`Timezone correction` \\(Времненная зона\\) - укажите корректировку часового пояса, если вам нужно настроить дату и время отчета на определенный часовой пояс.\n\n`Date and time format` \\(Формат даты и времени\\) - определяет формат поля временной метки ваших данных. Вы можете выбрать `2018-06-21 20:16:48`, `2018-06-21T20:16:48+03:00` или другой поддерживаемый формат.\n\nСуществует особый формат `Timestamp` \\(Временная метка\\), которая отражает разницу между текущим временем и полуночью 1 января 1970 года UTC, измеряемую в миллисекундах.\n\nПосле настройки отчета нажмите кнопку «ОК» в правом верхнем углу. Ваш отчет готов.\n\nПосле настройки отчета вы увидите, когда запланирован следущий отчет `Next`, а также увидите расписание для этого отчета.\n\nПосле отправки отчета хотя бы один раз, вы можете увидеть дату его последней отправки `Last`.\n\n`Last` \\(Последний\\) метка также содержит статус отправки отчета:\n\n* `OK` \\(Успешно\\):  отчет был сгенерирован и успешно отправлен Получателям;\n* `No Data` \\(Нет данных\\): отчет не содержит данных за указанный период;\n* `Error` \\(Ошибка\\):  что-то пошло не так. Пожалуйста, свяжитесь со службой поддержки Blynk.\n\nОтчеты будут генерироваться, даже если ваш проект не находится в активном \\(Play\\) режиме. Однако помните, неактивные проекты небудут генерировать данные.\n\n**ПРИМЕЧАНИЕ:** все отчеты формируются в кодировке UTF-16. Пожалуйста, убедитесь, что при открытии файла отчета вы выбрали кодировку UTF-16 в вашем CSV-редакторе.\n\n"
  },
  {
    "path": "scripts/flatdoc.js",
    "content": "/*!\n * Flatdoc - (c) 2013, 2014 Rico Sta. Cruz\n * http://ricostacruz.com/flatdoc\n * @license MIT\n */\n\n(function($) {\n  var exports = this;\n\n  var marked;\n\n  /**\n   * Basic Flatdoc module.\n   *\n   * The main entry point is `Flatdoc.run()`, which invokes the [Runner].\n   *\n   *     Flatdoc.run({\n   *       fetcher: Flatdoc.github('rstacruz/backbone-patterns');\n   *     });\n   *\n   * These fetcher functions are available:\n   *\n   *     Flatdoc.github('owner/repo')\n   *     Flatdoc.github('owner/repo', 'API.md')\n   *     Flatdoc.github('owner/repo', 'API.md', 'branch')\n   *     Flatdoc.bitbucket('owner/repo')\n   *     Flatdoc.bitbucket('owner/repo', 'API.md')\n   *     Flatdoc.bitbucket('owner/repo', 'API.md', 'branch')\n   *     Flatdoc.file('http://path/to/url')\n   *     Flatdoc.file([ 'http://path/to/url', ... ])\n   */\n\n  var Flatdoc = exports.Flatdoc = {};\n\n  /**\n   * Creates a runner.\n   * See [Flatdoc].\n   */\n\n  Flatdoc.run = function(options) {\n    $(function() { (new Flatdoc.runner(options)).run(); });\n  };\n\n  /**\n   * File fetcher function.\n   *\n   * Fetches a given `url` via AJAX.\n   * See [Runner#run()] for a description of fetcher functions.\n   */\n\n  Flatdoc.file = function(url) {\n    function loadData(locations, response, callback) {\n      if (locations.length === 0) callback(null, response);\n\n      else $.get(locations.shift())\n        .fail(function(e) {\n          callback(e, null);\n        })\n        .done(function (data) {\n          if (response.length > 0) response += '\\n\\n';\n          response += data;\n          loadData(locations, response, callback);\n        });\n    }\n\n    return function(callback) {\n      loadData(url instanceof Array ?\n        url : [url], '', callback);\n    };\n  };\n\n  /**\n   * Github fetcher.\n   * Fetches from repo `repo` (in format 'user/repo').\n   *\n   * If the parameter `filepath` is supplied, it fetches the contents of that\n   * given file in the repo's default branch. To fetch the contents of\n   * `filepath` from a different branch, the parameter `ref` should be\n   * supplied with the target branch name.\n   *\n   * See [Runner#run()] for a description of fetcher functions.\n   *\n   * See: http://developer.github.com/v3/repos/contents/\n   */\n  Flatdoc.github = function(repo, filepath, ref) {\n    var url;\n    if (filepath) {\n      url = 'https://api.github.com/repos/'+repo+'/contents/'+filepath;\n    } else {\n      url = 'https://api.github.com/repos/'+repo+'/readme';\n    }\n    if (ref) {\n      url += '?ref='+ref;\n    }\n    return function(callback) {\n      $.get(url)\n        .fail(function(e) { callback(e, null); })\n        .done(function(data) {\n          var markdown = exports.Base64.decode(data.content);\n          callback(null, markdown);\n        });\n    };\n  };\n\n  /**\n   * Bitbucket fetcher.\n   * Fetches from repo `repo` (in format 'user/repo').\n   *\n   * If the parameter `filepath` is supplied, it fetches the contents of that\n   * given file in the repo.\n   *\n   * See [Runner#run()] for a description of fetcher functions.\n   *\n   * See: https://confluence.atlassian.com/display/BITBUCKET/src+Resources#srcResources-GETrawcontentofanindividualfile\n   * See: http://ben.onfabrik.com/posts/embed-bitbucket-source-code-on-your-website\n   * Bitbucket appears to have stricter restrictions on\n   * Access-Control-Allow-Origin, and so the method here is a bit\n   * more complicated than for Github\n   *\n   * If you don't pass a branch name, then 'default' for Hg repos is assumed\n   * For git, you should pass 'master'. In both cases, you should also be able\n   * to pass in a revision number here -- in Mercurial, this also includes\n   * things like 'tip' or the repo-local integer revision number\n   * Default to Mercurial because Git users historically tend to use GitHub\n   */\n  Flatdoc.bitbucket = function(repo, filepath, branch) {\n    if (!filepath) filepath = 'readme.md';\n    if (!branch) branch = 'default';\n\n    var url = 'https://bitbucket.org/api/1.0/repositories/'+repo+'/src/'+branch+'/'+filepath;\n\n   return function(callback) {\n     $.ajax({\n      url: url,\n      dataType: 'jsonp',\n      error: function(xhr, status, error) {\n        alert(error);\n      },\n      success: function(response) {\n        var markdown = response.data;\n        callback(null, markdown);\n      }\n  });\n};\n};\n\n  /**\n   * Parser module.\n   * Parses a given Markdown document and returns a JSON object with data\n   * on the Markdown document.\n   *\n   *     var data = Flatdoc.parser.parse('markdown source here');\n   *     console.log(data);\n   *\n   *     data == {\n   *       title: 'My Project',\n   *       content: '<p>This project is a...',\n   *       menu: {...}\n   *     }\n   */\n\n  var Parser = Flatdoc.parser = {};\n\n  /**\n   * Parses a given Markdown document.\n   * See `Parser` for more info.\n   */\n  Parser.parse = function(source, highlight) {\n    marked = exports.marked;\n\n    Parser.setMarkedOptions(highlight);\n\n    var html = $(\"<div>\" + marked(source));\n    var h1 = html.find('h1').eq(0);\n    var title = h1.text();\n\n    // Mangle content\n    Transformer.mangle(html);\n    var menu = Transformer.getMenu(html);\n\n    return { title: title, content: html, menu: menu };\n  };\n\n  Parser.setMarkedOptions = function(highlight) {\n    marked.setOptions({\n      highlight: function(code, lang) {\n        if (lang) {\n          return highlight(code, lang);\n        }\n        return code;\n      }\n    });\n  };\n\n  /**\n   * Transformer module.\n   * This takes care of any HTML mangling needed.  The main entry point is\n   * `.mangle()` which applies all transformations needed.\n   *\n   *     var $content = $(\"<p>Hello there, this is a docu...\");\n   *     Flatdoc.transformer.mangle($content);\n   *\n   * If you would like to change any of the transformations, decorate any of\n   * the functions in `Flatdoc.transformer`.\n   */\n\n  var Transformer = Flatdoc.transformer = {};\n\n  /**\n   * Takes a given HTML `$content` and improves the markup of it by executing\n   * the transformations.\n   *\n   * > See: [Transformer](#transformer)\n   */\n  Transformer.mangle = function($content) {\n    this.addIDs($content);\n    this.buttonize($content);\n    this.smartquotes($content);\n  };\n\n  /**\n   * Adds IDs to headings.\n   */\n\n  Transformer.addIDs = function($content) {\n    var slugs = ['', '', ''];\n    $content.find('h1, h2, h3').each(function() {\n      var $el = $(this);\n      var num = parseInt(this.nodeName[1]);\n      var text = $el.text();\n      var slug = Flatdoc.slugify(text);\n      if (num > 1) slug = slugs[num - 2] + '-' + slug;\n      slugs.length = num - 1;\n      slugs = slugs.concat([slug, slug]);\n      $el.attr('id', slug);\n    });\n  };\n\n  /**\n   * Returns menu data for a given HTML.\n   *\n   *     menu = Flatdoc.transformer.getMenu($content);\n   *     menu == {\n   *       level: 0,\n   *       items: [{\n   *         section: \"Getting started\",\n   *         level: 1,\n   *         items: [...]}, ...]}\n   */\n\n  Transformer.getMenu = function($content) {\n    var root = {items: [], id: '', level: 0};\n    var cache = [root];\n\n    function mkdir_p(level) {\n      cache.length = level + 1;\n      var obj = cache[level];\n      if (!obj) {\n        var parent = (level > 1) ? mkdir_p(level-1) : root;\n        obj = { items: [], level: level };\n        cache = cache.concat([obj, obj]);\n        parent.items.push(obj);\n      }\n      return obj;\n    }\n\n    $content.find('h1, h2, h3').each(function() {\n      var $el = $(this);\n      var level = +(this.nodeName.substr(1));\n\n      var parent = mkdir_p(level-1);\n\n      var obj = { section: $el.text(), items: [], level: level, id: $el.attr('id') };\n      parent.items.push(obj);\n      cache[level] = obj;\n    });\n\n    return root;\n  };\n\n  /**\n   * Changes \"button >\" text to buttons.\n   */\n\n  Transformer.buttonize = function($content) {\n    $content.find('a').each(function() {\n      var $a = $(this);\n\n      var m = $a.text().match(/^(.*) >$/);\n      if (m) $a.text(m[1]).addClass('button');\n    });\n  };\n\n  /**\n   * Applies smart quotes to a given element.\n   * It leaves `code` and `pre` blocks alone.\n   */\n\n  Transformer.smartquotes = function ($content) {\n    var nodes = getTextNodesIn($content), len = nodes.length;\n    for (var i=0; i<len; i++) {\n      var node = nodes[i];\n      node.nodeValue = quotify(node.nodeValue);\n    }\n  };\n\n  /**\n   * Syntax highlighters.\n   *\n   * You may add or change more highlighters via the `Flatdoc.highlighters`\n   * object.\n   *\n   *     Flatdoc.highlighters.js = function(code) {\n   *     };\n   *\n   * Each of these functions\n   */\n\n  var Highlighters = Flatdoc.highlighters = {};\n\n  /**\n   * JavaScript syntax highlighter.\n   *\n   * Thanks @visionmedia!\n   */\n\n  Highlighters.js = Highlighters.javascript = function(code) {\n    return code\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;')\n      .replace(/(\"[^\\\"]*?\")/g, '<span class=\"string\">$1</span>')\n      .replace(/('[^\\']*?')/g, '<span class=\"string\">$1</span>')\n      .replace(/\\/\\/(.*)/gm, '<span class=\"comment\">//$1</span>')\n      .replace(/\\/\\*(.*)\\*\\//gm, '<span class=\"comment\">/*$1*/</span>')\n      .replace(/(\\d+\\.\\d+)/gm, '<span class=\"number\">$1</span>')\n      .replace(/(\\d+)/gm, '<span class=\"number\">$1</span>')\n      .replace(/\\bnew *(\\w+)/gm, '<span class=\"keyword\">new</span> <span class=\"init\">$1</span>')\n      .replace(/\\b(function|new|throw|return|var|if|else)\\b/gm, '<span class=\"keyword\">$1</span>');\n  };\n\n  Highlighters.html = function(code) {\n    return code\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;')\n      .replace(/(\"[^\\\"]*?\")/g, '<span class=\"string\">$1</span>')\n      .replace(/('[^\\']*?')/g, '<span class=\"string\">$1</span>')\n      .replace(/&lt;!--(.*)--&gt;/g, '<span class=\"comment\">&lt;!--$1--&gt;</span>')\n      .replace(/&lt;([^!][^\\s&]*)/g, '&lt;<span class=\"keyword\">$1</span>');\n  };\n\n  Highlighters.generic = function(code) {\n    return code\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;')\n      .replace(/(\"[^\\\"]*?\")/g, '<span class=\"string\">$1</span>')\n      .replace(/('[^\\']*?')/g, '<span class=\"string\">$1</span>')\n      .replace(/(\\/\\/|#)(.*)/gm, '<span class=\"comment\">$1$2</span>')\n      .replace(/(\\d+\\.\\d+)/gm, '<span class=\"number\">$1</span>')\n      .replace(/(\\d+)/gm, '<span class=\"number\">$1</span>');\n  };\n\n  /**\n   * Menu view. Renders menus\n   */\n\n  var MenuView = Flatdoc.menuView = function(menu) {\n    var $el = $(\"<ul>\");\n\n    function process(node, $parent) {\n      var id = node.id || 'root';\n\n      var $li = $('<li>')\n        .attr('id', id + '-item')\n        .addClass('level-' + node.level)\n        .appendTo($parent);\n\n      if (node.section) {\n        var $a = $('<a>')\n          .html(node.section)\n          .attr('id', id + '-link')\n          .attr('href', '#' + node.id)\n          .addClass('level-' + node.level)\n          .appendTo($li);\n      }\n\n      if (node.items.length > 0) {\n        var $ul = $('<ul>')\n          .addClass('level-' + (node.level+1))\n          .attr('id', id + '-list')\n          .appendTo($li);\n\n        node.items.forEach(function(item) {\n          process(item, $ul);\n        });\n      }\n    }\n\n    process(menu, $el);\n    return $el;\n  };\n\n  /**\n   * A runner module that fetches via a `fetcher` function.\n   *\n   *     var runner = new Flatdoc.runner({\n   *       fetcher: Flatdoc.url('readme.txt')\n   *     });\n   *     runner.run();\n   *\n   * The following options are available:\n   *\n   *  - `fetcher` - a function that takes a callback as an argument and\n   *    executes that callback when data is returned.\n   *\n   * See: [Flatdoc.run()]\n   */\n\n  var Runner = Flatdoc.runner = function(options) {\n    this.initialize(options);\n  };\n\n  Runner.prototype.root    = '[role~=\"flatdoc\"]';\n  Runner.prototype.menu    = '[role~=\"flatdoc-menu\"]';\n  Runner.prototype.title   = '[role~=\"flatdoc-title\"]';\n  Runner.prototype.content = '[role~=\"flatdoc-content\"]';\n\n  Runner.prototype.initialize = function(options) {\n    $.extend(this, options);\n  };\n\n  /**\n   * Syntax highlighting.\n   *\n   * You may define a custom highlight function such as `highlight` from\n   * the highlight.js library.\n   *\n   *     Flatdoc.run({\n   *       highlight: function (code, value) {\n   *         return hljs.highlight(lang, code).value;\n   *       },\n   *       ...\n   *     });\n   *\n   */\n\n  Runner.prototype.highlight = function(code, lang) {\n    var fn = Flatdoc.highlighters[lang] || Flatdoc.highlighters.generic;\n    return fn(code);\n  };\n\n  /**\n   * Loads the Markdown document (via the fetcher), parses it, and applies it\n   * to the elements.\n   */\n\n  Runner.prototype.run = function() {\n    var doc = this;\n    $(doc.root).trigger('flatdoc:loading');\n    doc.fetcher(function(err, markdown) {\n      if (err) {\n        console.error('[Flatdoc] fetching Markdown data failed.', err);\n        return;\n      }\n      var data = Flatdoc.parser.parse(markdown, doc.highlight);\n      doc.applyData(data, doc);\n      var id = location.hash.substr(1);\n      if (id) {\n        var el = document.getElementById(id);\n        if (el) el.scrollIntoView(true);\n      }\n      $(doc.root).trigger('flatdoc:ready');\n    });\n  };\n\n  /**\n   * Applies given doc data `data` to elements in object `elements`.\n   */\n\n  Runner.prototype.applyData = function(data) {\n    var elements = this;\n\n    elements.el('title').html(data.title);\n    elements.el('content').html(data.content.find('>*'));\n    elements.el('menu').html(MenuView(data.menu));\n  };\n\n  /**\n   * Fetches a given element from the DOM.\n   *\n   * Returns a jQuery object.\n   * @api private\n   */\n\n  Runner.prototype.el = function(aspect) {\n    return $(this[aspect], this.root);\n  };\n\n  /*\n   * Helpers\n   */\n\n  // http://stackoverflow.com/questions/298750/how-do-i-select-text-nodes-with-jquery\n  function getTextNodesIn(el) {\n    var exclude = 'iframe,pre,code';\n    return $(el).find(':not('+exclude+')').andSelf().contents().filter(function() {\n      return this.nodeType == 3 && $(this).closest(exclude).length === 0;\n    });\n  }\n\n  // http://www.leancrew.com/all-this/2010/11/smart-quotes-in-javascript/\n  function quotify(a) {\n    a = a.replace(/(^|[\\-\\u2014\\s(\\[\"])'/g, \"$1\\u2018\");        // opening singles\n    a = a.replace(/'/g, \"\\u2019\");                              // closing singles & apostrophes\n    a = a.replace(/(^|[\\-\\u2014\\/\\[(\\u2018\\s])\"/g, \"$1\\u201c\"); // opening doubles\n    a = a.replace(/\"/g, \"\\u201d\");                              // closing doubles\n    a = a.replace(/\\.\\.\\./g, \"\\u2026\");                         // ellipses\n    a = a.replace(/--/g, \"\\u2014\");                             // em-dashes\n    return a;\n  }\n\n})(jQuery);\n\n/* jshint ignore:start */\n\n/*!\n * marked - a markdown parser\n * Copyright (c) 2011-2013, Christopher Jeffrey. (MIT Licensed)\n * https://github.com/chjj/marked\n */\n\n(function(){var t={newline:/^\\n+/,code:/^( {4}[^\\n]+\\n*)+/,fences:o,hr:/^( *[-*_]){3,} *(?:\\n+|$)/,heading:/^ *(#{1,6}) *([^\\n]+?) *#* *(?:\\n+|$)/,nptable:o,lheading:/^([^\\n]+)\\n *(=|-){3,} *\\n*/,blockquote:/^( *>[^\\n]+(\\n[^\\n]+)*\\n*)+/,list:/^( *)(bull) [\\s\\S]+?(?:hr|\\n{2,}(?! )(?!\\1bull )\\n*|\\s*$)/,html:/^ *(?:comment|closed|closing) *(?:\\n{2,}|\\s*$)/,def:/^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +[\"(]([^\\n]+)[\")])? *(?:\\n+|$)/,table:o,paragraph:/^((?:[^\\n]+\\n?(?!hr|heading|lheading|blockquote|tag|def))+)\\n*/,text:/^[^\\n]+/};t.bullet=/(?:[*+-]|\\d+\\.)/;t.item=/^( *)(bull) [^\\n]*(?:\\n(?!\\1bull )[^\\n]*)*/;t.item=l(t.item,\"gm\")(/bull/g,t.bullet)();t.list=l(t.list)(/bull/g,t.bullet)(\"hr\",/\\n+(?=(?: *[-*_]){3,} *(?:\\n+|$))/)();t._tag=\"(?!(?:\"+\"a|em|strong|small|s|cite|q|dfn|abbr|data|time|code\"+\"|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo\"+\"|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:/|@)\\\\b\";t.html=l(t.html)(\"comment\",/<!--[\\s\\S]*?-->/)(\"closed\",/<(tag)[\\s\\S]+?<\\/\\1>/)(\"closing\",/<tag(?:\"[^\"]*\"|'[^']*'|[^'\">])*?>/)(/tag/g,t._tag)();t.paragraph=l(t.paragraph)(\"hr\",t.hr)(\"heading\",t.heading)(\"lheading\",t.lheading)(\"blockquote\",t.blockquote)(\"tag\",\"<\"+t._tag)(\"def\",t.def)();t.normal=h({},t);t.gfm=h({},t.normal,{fences:/^ *(`{3,}|~{3,}) *(\\S+)? *\\n([\\s\\S]+?)\\s*\\1 *(?:\\n+|$)/,paragraph:/^/});t.gfm.paragraph=l(t.paragraph)(\"(?!\",\"(?!\"+t.gfm.fences.source.replace(\"\\\\1\",\"\\\\2\")+\"|\")();t.tables=h({},t.gfm,{nptable:/^ *(\\S.*\\|.*)\\n *([-:]+ *\\|[-| :]*)\\n((?:.*\\|.*(?:\\n|$))*)\\n*/,table:/^ *\\|(.+)\\n *\\|( *[-:]+[-| :]*)\\n((?: *\\|.*(?:\\n|$))*)\\n*/});function e(e){this.tokens=[];this.tokens.links={};this.options=e||a.defaults;this.rules=t.normal;if(this.options.gfm){if(this.options.tables){this.rules=t.tables}else{this.rules=t.gfm}}}e.rules=t;e.lex=function(t,n){var s=new e(n);return s.lex(t)};e.prototype.lex=function(t){t=t.replace(/\\r\\n|\\r/g,\"\\n\").replace(/\\t/g,\"    \").replace(/\\u00a0/g,\" \").replace(/\\u2424/g,\"\\n\");return this.token(t,true)};e.prototype.token=function(e,n){var e=e.replace(/^ +$/gm,\"\"),s,i,r,l,o,h,a,u,p;while(e){if(r=this.rules.newline.exec(e)){e=e.substring(r[0].length);if(r[0].length>1){this.tokens.push({type:\"space\"})}}if(r=this.rules.code.exec(e)){e=e.substring(r[0].length);r=r[0].replace(/^ {4}/gm,\"\");this.tokens.push({type:\"code\",text:!this.options.pedantic?r.replace(/\\n+$/,\"\"):r});continue}if(r=this.rules.fences.exec(e)){e=e.substring(r[0].length);this.tokens.push({type:\"code\",lang:r[2],text:r[3]});continue}if(r=this.rules.heading.exec(e)){e=e.substring(r[0].length);this.tokens.push({type:\"heading\",depth:r[1].length,text:r[2]});continue}if(n&&(r=this.rules.nptable.exec(e))){e=e.substring(r[0].length);h={type:\"table\",header:r[1].replace(/^ *| *\\| *$/g,\"\").split(/ *\\| */),align:r[2].replace(/^ *|\\| *$/g,\"\").split(/ *\\| */),cells:r[3].replace(/\\n$/,\"\").split(\"\\n\")};for(u=0;u<h.align.length;u++){if(/^ *-+: *$/.test(h.align[u])){h.align[u]=\"right\"}else if(/^ *:-+: *$/.test(h.align[u])){h.align[u]=\"center\"}else if(/^ *:-+ *$/.test(h.align[u])){h.align[u]=\"left\"}else{h.align[u]=null}}for(u=0;u<h.cells.length;u++){h.cells[u]=h.cells[u].split(/ *\\| */)}this.tokens.push(h);continue}if(r=this.rules.lheading.exec(e)){e=e.substring(r[0].length);this.tokens.push({type:\"heading\",depth:r[2]===\"=\"?1:2,text:r[1]});continue}if(r=this.rules.hr.exec(e)){e=e.substring(r[0].length);this.tokens.push({type:\"hr\"});continue}if(r=this.rules.blockquote.exec(e)){e=e.substring(r[0].length);this.tokens.push({type:\"blockquote_start\"});r=r[0].replace(/^ *> ?/gm,\"\");this.token(r,n);this.tokens.push({type:\"blockquote_end\"});continue}if(r=this.rules.list.exec(e)){e=e.substring(r[0].length);l=r[2];this.tokens.push({type:\"list_start\",ordered:l.length>1});r=r[0].match(this.rules.item);s=false;p=r.length;u=0;for(;u<p;u++){h=r[u];a=h.length;h=h.replace(/^ *([*+-]|\\d+\\.) +/,\"\");if(~h.indexOf(\"\\n \")){a-=h.length;h=!this.options.pedantic?h.replace(new RegExp(\"^ {1,\"+a+\"}\",\"gm\"),\"\"):h.replace(/^ {1,4}/gm,\"\")}if(this.options.smartLists&&u!==p-1){o=t.bullet.exec(r[u+1])[0];if(l!==o&&!(l.length>1&&o.length>1)){e=r.slice(u+1).join(\"\\n\")+e;u=p-1}}i=s||/\\n\\n(?!\\s*$)/.test(h);if(u!==p-1){s=h[h.length-1]===\"\\n\";if(!i)i=s}this.tokens.push({type:i?\"loose_item_start\":\"list_item_start\"});this.token(h,false);this.tokens.push({type:\"list_item_end\"})}this.tokens.push({type:\"list_end\"});continue}if(r=this.rules.html.exec(e)){e=e.substring(r[0].length);this.tokens.push({type:this.options.sanitize?\"paragraph\":\"html\",pre:r[1]===\"pre\"||r[1]===\"script\",text:r[0]});continue}if(n&&(r=this.rules.def.exec(e))){e=e.substring(r[0].length);this.tokens.links[r[1].toLowerCase()]={href:r[2],title:r[3]};continue}if(n&&(r=this.rules.table.exec(e))){e=e.substring(r[0].length);h={type:\"table\",header:r[1].replace(/^ *| *\\| *$/g,\"\").split(/ *\\| */),align:r[2].replace(/^ *|\\| *$/g,\"\").split(/ *\\| */),cells:r[3].replace(/(?: *\\| *)?\\n$/,\"\").split(\"\\n\")};for(u=0;u<h.align.length;u++){if(/^ *-+: *$/.test(h.align[u])){h.align[u]=\"right\"}else if(/^ *:-+: *$/.test(h.align[u])){h.align[u]=\"center\"}else if(/^ *:-+ *$/.test(h.align[u])){h.align[u]=\"left\"}else{h.align[u]=null}}for(u=0;u<h.cells.length;u++){h.cells[u]=h.cells[u].replace(/^ *\\| *| *\\| *$/g,\"\").split(/ *\\| */)}this.tokens.push(h);continue}if(n&&(r=this.rules.paragraph.exec(e))){e=e.substring(r[0].length);this.tokens.push({type:\"paragraph\",text:r[1][r[1].length-1]===\"\\n\"?r[1].slice(0,-1):r[1]});continue}if(r=this.rules.text.exec(e)){e=e.substring(r[0].length);this.tokens.push({type:\"text\",text:r[0]});continue}if(e){throw new Error(\"Infinite loop on byte: \"+e.charCodeAt(0))}}return this.tokens};var n={escape:/^\\\\([\\\\`*{}\\[\\]()#+\\-.!_>])/,autolink:/^<([^ >]+(@|:\\/)[^ >]+)>/,url:o,tag:/^<!--[\\s\\S]*?-->|^<\\/?\\w+(?:\"[^\"]*\"|'[^']*'|[^'\">])*?>/,link:/^!?\\[(inside)\\]\\(href\\)/,reflink:/^!?\\[(inside)\\]\\s*\\[([^\\]]*)\\]/,nolink:/^!?\\[((?:\\[[^\\]]*\\]|[^\\[\\]])*)\\]/,strong:/^__([\\s\\S]+?)__(?!_)|^\\*\\*([\\s\\S]+?)\\*\\*(?!\\*)/,em:/^\\b_((?:__|[\\s\\S])+?)_\\b|^\\*((?:\\*\\*|[\\s\\S])+?)\\*(?!\\*)/,code:/^(`+)\\s*([\\s\\S]*?[^`])\\s*\\1(?!`)/,br:/^ {2,}\\n(?!\\s*$)/,del:o,text:/^[\\s\\S]+?(?=[\\\\<!\\[_*`]| {2,}\\n|$)/};n._inside=/(?:\\[[^\\]]*\\]|[^\\]]|\\](?=[^\\[]*\\]))*/;n._href=/\\s*<?([^\\s]*?)>?(?:\\s+['\"]([\\s\\S]*?)['\"])?\\s*/;n.link=l(n.link)(\"inside\",n._inside)(\"href\",n._href)();n.reflink=l(n.reflink)(\"inside\",n._inside)();n.normal=h({},n);n.pedantic=h({},n.normal,{strong:/^__(?=\\S)([\\s\\S]*?\\S)__(?!_)|^\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*(?!\\*)/,em:/^_(?=\\S)([\\s\\S]*?\\S)_(?!_)|^\\*(?=\\S)([\\s\\S]*?\\S)\\*(?!\\*)/});n.gfm=h({},n.normal,{escape:l(n.escape)(\"])\",\"~|])\")(),url:/^(https?:\\/\\/[^\\s<]+[^<.,:;\"')\\]\\s])/,del:/^~~(?=\\S)([\\s\\S]*?\\S)~~/,text:l(n.text)(\"]|\",\"~]|\")(\"|\",\"|https?://|\")()});n.breaks=h({},n.gfm,{br:l(n.br)(\"{2,}\",\"*\")(),text:l(n.gfm.text)(\"{2,}\",\"*\")()});function s(t,e){this.options=e||a.defaults;this.links=t;this.rules=n.normal;if(!this.links){throw new Error(\"Tokens array requires a `links` property.\")}if(this.options.gfm){if(this.options.breaks){this.rules=n.breaks}else{this.rules=n.gfm}}else if(this.options.pedantic){this.rules=n.pedantic}}s.rules=n;s.output=function(t,e,n){var i=new s(e,n);return i.output(t)};s.prototype.output=function(t){var e=\"\",n,s,i,l;while(t){if(l=this.rules.escape.exec(t)){t=t.substring(l[0].length);e+=l[1];continue}if(l=this.rules.autolink.exec(t)){t=t.substring(l[0].length);if(l[2]===\"@\"){s=l[1][6]===\":\"?this.mangle(l[1].substring(7)):this.mangle(l[1]);i=this.mangle(\"mailto:\")+s}else{s=r(l[1]);i=s}e+='<a href=\"'+i+'\">'+s+\"</a>\";continue}if(l=this.rules.url.exec(t)){t=t.substring(l[0].length);s=r(l[1]);i=s;e+='<a href=\"'+i+'\">'+s+\"</a>\";continue}if(l=this.rules.tag.exec(t)){t=t.substring(l[0].length);e+=this.options.sanitize?r(l[0]):l[0];continue}if(l=this.rules.link.exec(t)){t=t.substring(l[0].length);e+=this.outputLink(l,{href:l[2],title:l[3]});continue}if((l=this.rules.reflink.exec(t))||(l=this.rules.nolink.exec(t))){t=t.substring(l[0].length);n=(l[2]||l[1]).replace(/\\s+/g,\" \");n=this.links[n.toLowerCase()];if(!n||!n.href){e+=l[0][0];t=l[0].substring(1)+t;continue}e+=this.outputLink(l,n);continue}if(l=this.rules.strong.exec(t)){t=t.substring(l[0].length);e+=\"<strong>\"+this.output(l[2]||l[1])+\"</strong>\";continue}if(l=this.rules.em.exec(t)){t=t.substring(l[0].length);e+=\"<em>\"+this.output(l[2]||l[1])+\"</em>\";continue}if(l=this.rules.code.exec(t)){t=t.substring(l[0].length);e+=\"<code>\"+r(l[2],true)+\"</code>\";continue}if(l=this.rules.br.exec(t)){t=t.substring(l[0].length);e+=\"<br>\";continue}if(l=this.rules.del.exec(t)){t=t.substring(l[0].length);e+=\"<del>\"+this.output(l[1])+\"</del>\";continue}if(l=this.rules.text.exec(t)){t=t.substring(l[0].length);e+=r(l[0]);continue}if(t){throw new Error(\"Infinite loop on byte: \"+t.charCodeAt(0))}}return e};s.prototype.outputLink=function(t,e){if(t[0][0]!==\"!\"){return'<a href=\"'+r(e.href)+'\"'+(e.title?' title=\"'+r(e.title)+'\"':\"\")+\">\"+this.output(t[1])+\"</a>\"}else{return'<img src=\"'+r(e.href)+'\" alt=\"'+r(t[1])+'\"'+(e.title?' title=\"'+r(e.title)+'\"':\"\")+\">\"}};s.prototype.smartypants=function(t){if(!this.options.smartypants)return t;return t.replace(/--/g,\"—\").replace(/'([^']*)'/g,\"‘$1’\").replace(/\"([^\"]*)\"/g,\"“$1”\").replace(/\\.{3}/g,\"…\")};s.prototype.mangle=function(t){var e=\"\",n=t.length,s=0,i;for(;s<n;s++){i=t.charCodeAt(s);if(Math.random()>.5){i=\"x\"+i.toString(16)}e+=\"&#\"+i+\";\"}return e};function i(t){this.tokens=[];this.token=null;this.options=t||a.defaults}i.parse=function(t,e){var n=new i(e);return n.parse(t)};i.prototype.parse=function(t){this.inline=new s(t.links,this.options);this.tokens=t.reverse();var e=\"\";while(this.next()){e+=this.tok()}return e};i.prototype.next=function(){return this.token=this.tokens.pop()};i.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0};i.prototype.parseText=function(){var t=this.token.text;while(this.peek().type===\"text\"){t+=\"\\n\"+this.next().text}return this.inline.output(t)};i.prototype.tok=function(){switch(this.token.type){case\"space\":{return\"\"}case\"hr\":{return\"<hr>\\n\"}case\"heading\":{return\"<h\"+this.token.depth+\">\"+this.inline.output(this.token.text)+\"</h\"+this.token.depth+\">\\n\"}case\"code\":{if(this.options.highlight){var t=this.options.highlight(this.token.text,this.token.lang);if(t!=null&&t!==this.token.text){this.token.escaped=true;this.token.text=t}}if(!this.token.escaped){this.token.text=r(this.token.text,true)}return\"<pre><code\"+(this.token.lang?' class=\"'+this.options.langPrefix+this.token.lang+'\"':\"\")+\">\"+this.token.text+\"</code></pre>\\n\"}case\"table\":{var e=\"\",n,s,i,l,o;e+=\"<thead>\\n<tr>\\n\";for(s=0;s<this.token.header.length;s++){n=this.inline.output(this.token.header[s]);e+=this.token.align[s]?'<th align=\"'+this.token.align[s]+'\">'+n+\"</th>\\n\":\"<th>\"+n+\"</th>\\n\"}e+=\"</tr>\\n</thead>\\n\";e+=\"<tbody>\\n\";for(s=0;s<this.token.cells.length;s++){i=this.token.cells[s];e+=\"<tr>\\n\";for(o=0;o<i.length;o++){l=this.inline.output(i[o]);e+=this.token.align[o]?'<td align=\"'+this.token.align[o]+'\">'+l+\"</td>\\n\":\"<td>\"+l+\"</td>\\n\"}e+=\"</tr>\\n\"}e+=\"</tbody>\\n\";return\"<table>\\n\"+e+\"</table>\\n\"}case\"blockquote_start\":{var e=\"\";while(this.next().type!==\"blockquote_end\"){e+=this.tok()}return\"<blockquote>\\n\"+e+\"</blockquote>\\n\"}case\"list_start\":{var h=this.token.ordered?\"ol\":\"ul\",e=\"\";while(this.next().type!==\"list_end\"){e+=this.tok()}return\"<\"+h+\">\\n\"+e+\"</\"+h+\">\\n\"}case\"list_item_start\":{var e=\"\";while(this.next().type!==\"list_item_end\"){e+=this.token.type===\"text\"?this.parseText():this.tok()}return\"<li>\"+e+\"</li>\\n\"}case\"loose_item_start\":{var e=\"\";while(this.next().type!==\"list_item_end\"){e+=this.tok()}return\"<li>\"+e+\"</li>\\n\"}case\"html\":{return!this.token.pre&&!this.options.pedantic?this.inline.output(this.token.text):this.token.text}case\"paragraph\":{return\"<p>\"+this.inline.output(this.token.text)+\"</p>\\n\"}case\"text\":{return\"<p>\"+this.parseText()+\"</p>\\n\"}}};function r(t,e){return t.replace(!e?/&(?!#?\\w+;)/g:/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\").replace(/'/g,\"&#39;\")}function l(t,e){t=t.source;e=e||\"\";return function n(s,i){if(!s)return new RegExp(t,e);i=i.source||i;i=i.replace(/(^|[^\\[])\\^/g,\"$1\");t=t.replace(s,i);return n}}function o(){}o.exec=o;function h(t){var e=1,n,s;for(;e<arguments.length;e++){n=arguments[e];for(s in n){if(Object.prototype.hasOwnProperty.call(n,s)){t[s]=n[s]}}}return t}function a(t,n,s){if(s||typeof n===\"function\"){if(!s){s=n;n=null}if(n)n=h({},a.defaults,n);var l=e.lex(l,n),o=n.highlight,u=0,p=l.length,g=0;if(!o||o.length<3){return s(null,i.parse(l,n))}var c=function(){delete n.highlight;var t=i.parse(l,n);n.highlight=o;return s(null,t)};for(;g<p;g++){(function(t){if(t.type!==\"code\")return;u++;return o(t.text,t.lang,function(e,n){if(n==null||n===t.text){return--u||c()}t.text=n;t.escaped=true;--u||c()})})(l[g])}return}try{if(n)n=h({},a.defaults,n);return i.parse(e.lex(t,n),n)}catch(f){f.message+=\"\\nPlease report this to https://github.com/chjj/marked.\";if((n||a.defaults).silent){return\"<p>An error occured:</p><pre>\"+r(f.message+\"\",true)+\"</pre>\"}throw f}}a.options=a.setOptions=function(t){h(a.defaults,t);return a};a.defaults={gfm:true,tables:true,breaks:false,pedantic:false,sanitize:false,smartLists:false,silent:false,highlight:null,langPrefix:\"lang-\"};a.Parser=i;a.parser=i.parse;a.Lexer=e;a.lexer=e.lex;a.InlineLexer=s;a.inlineLexer=s.output;a.parse=a;if(typeof exports===\"object\"){module.exports=a}else if(typeof define===\"function\"&&define.amd){define(function(){return a})}else{this.marked=a}}).call(function(){return this||(typeof window!==\"undefined\"?window:global)}());\n\n/*!\n * base64.js\n * http://github.com/dankogai/js-base64\n */\n\n(function(r){\"use strict\";if(r.Base64)return;var e=\"2.1.2\";var t;if(typeof module!==\"undefined\"&&module.exports){t=require(\"buffer\").Buffer}var n=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";var a=function(r){var e={};for(var t=0,n=r.length;t<n;t++)e[r.charAt(t)]=t;return e}(n);var o=String.fromCharCode;var u=function(r){if(r.length<2){var e=r.charCodeAt(0);return e<128?r:e<2048?o(192|e>>>6)+o(128|e&63):o(224|e>>>12&15)+o(128|e>>>6&63)+o(128|e&63)}else{var e=65536+(r.charCodeAt(0)-55296)*1024+(r.charCodeAt(1)-56320);return o(240|e>>>18&7)+o(128|e>>>12&63)+o(128|e>>>6&63)+o(128|e&63)}};var c=/[\\uD800-\\uDBFF][\\uDC00-\\uDFFFF]|[^\\x00-\\x7F]/g;var i=function(r){return r.replace(c,u)};var f=function(r){var e=[0,2,1][r.length%3],t=r.charCodeAt(0)<<16|(r.length>1?r.charCodeAt(1):0)<<8|(r.length>2?r.charCodeAt(2):0),a=[n.charAt(t>>>18),n.charAt(t>>>12&63),e>=2?\"=\":n.charAt(t>>>6&63),e>=1?\"=\":n.charAt(t&63)];return a.join(\"\")};var h=r.btoa||function(r){return r.replace(/[\\s\\S]{1,3}/g,f)};var d=t?function(r){return new t(r).toString(\"base64\")}:function(r){return h(i(r))};var v=function(r,e){return!e?d(r):d(r).replace(/[+\\/]/g,function(r){return r==\"+\"?\"-\":\"_\"}).replace(/=/g,\"\")};var g=function(r){return v(r,true)};var l=new RegExp([\"[À-ß][-¿]\",\"[à-ï][-¿]{2}\",\"[ð-÷][-¿]{3}\"].join(\"|\"),\"g\");var A=function(r){switch(r.length){case 4:var e=(7&r.charCodeAt(0))<<18|(63&r.charCodeAt(1))<<12|(63&r.charCodeAt(2))<<6|63&r.charCodeAt(3),t=e-65536;return o((t>>>10)+55296)+o((t&1023)+56320);case 3:return o((15&r.charCodeAt(0))<<12|(63&r.charCodeAt(1))<<6|63&r.charCodeAt(2));default:return o((31&r.charCodeAt(0))<<6|63&r.charCodeAt(1))}};var s=function(r){return r.replace(l,A)};var p=function(r){var e=r.length,t=e%4,n=(e>0?a[r.charAt(0)]<<18:0)|(e>1?a[r.charAt(1)]<<12:0)|(e>2?a[r.charAt(2)]<<6:0)|(e>3?a[r.charAt(3)]:0),u=[o(n>>>16),o(n>>>8&255),o(n&255)];u.length-=[0,0,2,1][t];return u.join(\"\")};var C=r.atob||function(r){return r.replace(/[\\s\\S]{1,4}/g,p)};var b=t?function(r){return new t(r,\"base64\").toString()}:function(r){return s(C(r))};var B=function(r){return b(r.replace(/[-_]/g,function(r){return r==\"-\"?\"+\":\"/\"}).replace(/[^A-Za-z0-9\\+\\/]/g,\"\"))};r.Base64={VERSION:e,atob:C,btoa:h,fromBase64:B,toBase64:v,utob:i,encode:v,encodeURI:g,btou:s,decode:B};if(typeof Object.defineProperty===\"function\"){var S=function(r){return{value:r,enumerable:false,writable:true,configurable:true}};r.Base64.extendString=function(){Object.defineProperty(String.prototype,\"fromBase64\",S(function(){return B(this)}));Object.defineProperty(String.prototype,\"toBase64\",S(function(r){return v(this,r)}));Object.defineProperty(String.prototype,\"toBase64URI\",S(function(){return v(this,true)}))}}})(this);\n\n/*!\n * node-parameterize 0.0.7\n * https://github.com/fyalavuz/node-parameterize\n * Exported as `Flatdoc.slugify`\n */\n\n(function(r){var LATIN_MAP={\"À\":\"A\",\"Á\":\"A\",\"Â\":\"A\",\"Ã\":\"A\",\"Ä\":\"A\",\"Å\":\"A\",\"Æ\":\"AE\",\"Ç\":\"C\",\"È\":\"E\",\"É\":\"E\",\"Ê\":\"E\",\"Ë\":\"E\",\"Ì\":\"I\",\"Í\":\"I\",\"Î\":\"I\",\"Ï\":\"I\",\"Ð\":\"D\",\"Ñ\":\"N\",\"Ò\":\"O\",\"Ó\":\"O\",\"Ô\":\"O\",\"Õ\":\"O\",\"Ö\":\"O\",\"Ő\":\"O\",\"Ø\":\"O\",\"Ù\":\"U\",\"Ú\":\"U\",\"Û\":\"U\",\"Ü\":\"U\",\"Ű\":\"U\",\"Ý\":\"Y\",\"Þ\":\"TH\",\"ß\":\"ss\",\"à\":\"a\",\"á\":\"a\",\"â\":\"a\",\"ã\":\"a\",\"ä\":\"a\",\"å\":\"a\",\"æ\":\"ae\",\"ç\":\"c\",\"è\":\"e\",\"é\":\"e\",\"ê\":\"e\",\"ë\":\"e\",\"ì\":\"i\",\"í\":\"i\",\"î\":\"i\",\"ï\":\"i\",\"ð\":\"d\",\"ñ\":\"n\",\"ò\":\"o\",\"ó\":\"o\",\"ô\":\"o\",\"õ\":\"o\",\"ö\":\"o\",\"ő\":\"o\",\"ø\":\"o\",\"ù\":\"u\",\"ú\":\"u\",\"û\":\"u\",\"ü\":\"u\",\"ű\":\"u\",\"ý\":\"y\",\"þ\":\"th\",\"ÿ\":\"y\"};var LATIN_SYMBOLS_MAP={\"©\":\"(c)\"};var GREEK_MAP={\"α\":\"a\",\"β\":\"b\",\"γ\":\"g\",\"δ\":\"d\",\"ε\":\"e\",\"ζ\":\"z\",\"η\":\"h\",\"θ\":\"8\",\"ι\":\"i\",\"κ\":\"k\",\"λ\":\"l\",\"μ\":\"m\",\"ν\":\"n\",\"ξ\":\"3\",\"ο\":\"o\",\"π\":\"p\",\"ρ\":\"r\",\"σ\":\"s\",\"τ\":\"t\",\"υ\":\"y\",\"φ\":\"f\",\"χ\":\"x\",\"ψ\":\"ps\",\"ω\":\"w\",\"ά\":\"a\",\"έ\":\"e\",\"ί\":\"i\",\"ό\":\"o\",\"ύ\":\"y\",\"ή\":\"h\",\"ώ\":\"w\",\"ς\":\"s\",\"ϊ\":\"i\",\"ΰ\":\"y\",\"ϋ\":\"y\",\"ΐ\":\"i\",\"Α\":\"A\",\"Β\":\"B\",\"Γ\":\"G\",\"Δ\":\"D\",\"Ε\":\"E\",\"Ζ\":\"Z\",\"Η\":\"H\",\"Θ\":\"8\",\"Ι\":\"I\",\"Κ\":\"K\",\"Λ\":\"L\",\"Μ\":\"M\",\"Ν\":\"N\",\"Ξ\":\"3\",\"Ο\":\"O\",\"Π\":\"P\",\"Ρ\":\"R\",\"Σ\":\"S\",\"Τ\":\"T\",\"Υ\":\"Y\",\"Φ\":\"F\",\"Χ\":\"X\",\"Ψ\":\"PS\",\"Ω\":\"W\",\"Ά\":\"A\",\"Έ\":\"E\",\"Ί\":\"I\",\"Ό\":\"O\",\"Ύ\":\"Y\",\"Ή\":\"H\",\"Ώ\":\"W\",\"Ϊ\":\"I\",\"Ϋ\":\"Y\"};var TURKISH_MAP={\"ş\":\"s\",\"Ş\":\"S\",\"ı\":\"i\",\"İ\":\"I\",\"ç\":\"c\",\"Ç\":\"C\",\"ü\":\"u\",\"Ü\":\"U\",\"ö\":\"o\",\"Ö\":\"O\",\"ğ\":\"g\",\"Ğ\":\"G\"};var RUSSIAN_MAP={\"а\":\"a\",\"б\":\"b\",\"в\":\"v\",\"г\":\"g\",\"д\":\"d\",\"е\":\"e\",\"ё\":\"yo\",\"ж\":\"zh\",\"з\":\"z\",\"и\":\"i\",\"й\":\"j\",\"к\":\"k\",\"л\":\"l\",\"м\":\"m\",\"н\":\"n\",\"о\":\"o\",\"п\":\"p\",\"р\":\"r\",\"с\":\"s\",\"т\":\"t\",\"у\":\"u\",\"ф\":\"f\",\"х\":\"h\",\"ц\":\"c\",\"ч\":\"ch\",\"ш\":\"sh\",\"щ\":\"sh\",\"ъ\":\"\",\"ы\":\"y\",\"ь\":\"\",\"э\":\"e\",\"ю\":\"yu\",\"я\":\"ya\",\"А\":\"A\",\"Б\":\"B\",\"В\":\"V\",\"Г\":\"G\",\"Д\":\"D\",\"Е\":\"E\",\"Ё\":\"Yo\",\"Ж\":\"Zh\",\"З\":\"Z\",\"И\":\"I\",\"Й\":\"J\",\"К\":\"K\",\"Л\":\"L\",\"М\":\"M\",\"Н\":\"N\",\"О\":\"O\",\"П\":\"P\",\"Р\":\"R\",\"С\":\"S\",\"Т\":\"T\",\"У\":\"U\",\"Ф\":\"F\",\"Х\":\"H\",\"Ц\":\"C\",\"Ч\":\"Ch\",\"Ш\":\"Sh\",\"Щ\":\"Sh\",\"Ъ\":\"\",\"Ы\":\"Y\",\"Ь\":\"\",\"Э\":\"E\",\"Ю\":\"Yu\",\"Я\":\"Ya\"};var UKRAINIAN_MAP={\"Є\":\"Ye\",\"І\":\"I\",\"Ї\":\"Yi\",\"Ґ\":\"G\",\"є\":\"ye\",\"і\":\"i\",\"ї\":\"yi\",\"ґ\":\"g\"};var CZECH_MAP={\"č\":\"c\",\"ď\":\"d\",\"ě\":\"e\",\"ň\":\"n\",\"ř\":\"r\",\"š\":\"s\",\"ť\":\"t\",\"ů\":\"u\",\"ž\":\"z\",\"Č\":\"C\",\"Ď\":\"D\",\"Ě\":\"E\",\"Ň\":\"N\",\"Ř\":\"R\",\"Š\":\"S\",\"Ť\":\"T\",\"Ů\":\"U\",\"Ž\":\"Z\"};var POLISH_MAP={\"ą\":\"a\",\"ć\":\"c\",\"ę\":\"e\",\"ł\":\"l\",\"ń\":\"n\",\"ó\":\"o\",\"ś\":\"s\",\"ź\":\"z\",\"ż\":\"z\",\"Ą\":\"A\",\"Ć\":\"C\",\"Ę\":\"e\",\"Ł\":\"L\",\"Ń\":\"N\",\"Ó\":\"o\",\"Ś\":\"S\",\"Ź\":\"Z\",\"Ż\":\"Z\"};var LATVIAN_MAP={\"ā\":\"a\",\"č\":\"c\",\"ē\":\"e\",\"ģ\":\"g\",\"ī\":\"i\",\"ķ\":\"k\",\"ļ\":\"l\",\"ņ\":\"n\",\"š\":\"s\",\"ū\":\"u\",\"ž\":\"z\",\"Ā\":\"A\",\"Č\":\"C\",\"Ē\":\"E\",\"Ģ\":\"G\",\"Ī\":\"i\",\"Ķ\":\"k\",\"Ļ\":\"L\",\"Ņ\":\"N\",\"Š\":\"S\",\"Ū\":\"u\",\"Ž\":\"Z\"};var ALL_DOWNCODE_MAPS=new Array;ALL_DOWNCODE_MAPS[0]=LATIN_MAP;ALL_DOWNCODE_MAPS[1]=LATIN_SYMBOLS_MAP;ALL_DOWNCODE_MAPS[2]=GREEK_MAP;ALL_DOWNCODE_MAPS[3]=TURKISH_MAP;ALL_DOWNCODE_MAPS[4]=RUSSIAN_MAP;ALL_DOWNCODE_MAPS[5]=UKRAINIAN_MAP;ALL_DOWNCODE_MAPS[6]=CZECH_MAP;ALL_DOWNCODE_MAPS[7]=POLISH_MAP;ALL_DOWNCODE_MAPS[8]=LATVIAN_MAP;var Downcoder=new Object;Downcoder.Initialize=function(){if(Downcoder.map)return;Downcoder.map={};Downcoder.chars=\"\";for(var i in ALL_DOWNCODE_MAPS){var lookup=ALL_DOWNCODE_MAPS[i];for(var c in lookup){Downcoder.map[c]=lookup[c];Downcoder.chars+=c}}Downcoder.regex=new RegExp(\"[\"+Downcoder.chars+\"]|[^\"+Downcoder.chars+\"]+\",\"g\")};downcode=function(slug){Downcoder.Initialize();var downcoded=\"\";var pieces=slug.match(Downcoder.regex);if(pieces){for(var i=0;i<pieces.length;i++){if(pieces[i].length==1){var mapped=Downcoder.map[pieces[i]];if(mapped!=null){downcoded+=mapped;continue}}downcoded+=pieces[i]}}else{downcoded=slug}return downcoded};Flatdoc.slugify=function(s,num_chars){s=downcode(s);s=s.replace(/[^-\\w\\s]/g,\"\");s=s.replace(/^\\s+|\\s+$/g,\"\");s=s.replace(/[-\\s]+/g,\"-\");s=s.toLowerCase();return s.substring(0,num_chars)};})();\n\n/* jshint ignore:end */\n"
  },
  {
    "path": "scripts/legacy.js",
    "content": "/*!\n\nSupport JS for legacy browsers.\nIncludes:\n\n  HTML5 Shiv\n    @afarkas @jdalton @jon_neal @rem\n    MIT/GPL2 Licensed\n    https://github.com/aFarkas/html5shiv\n\n  matchMedia() polyfill\n    (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license\n\n  Respond.js\n    min/max-width media query polyfill\n    (c) Scott Jehl. MIT/GPLv2 Lic.\n    http://j.mp/respondjs\n\n*/\n/*\n HTML5 Shiv v3.6.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed\n*/\n(function(l,f){function m(){var a=e.elements;return\"string\"==typeof a?a.split(\" \"):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag();\na.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function(\"h,f\",\"return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&(\"+m().join().replace(/\\w+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c(\"'+a+'\")'})+\");return n}\")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement(\"p\");d=d.getElementsByTagName(\"head\")[0]||d.documentElement;c.innerHTML=\"x<style>article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}</style>\";\nc=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o=\"_html5shiv\",h=0,n={},g;(function(){try{var a=f.createElement(\"a\");a.innerHTML=\"<xyz></xyz>\";j=\"hidden\"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement(\"a\");var c=f.createDocumentFragment();b=\"undefined\"==typeof c.cloneNode||\n\"undefined\"==typeof c.createDocumentFragment||\"undefined\"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||\"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup main mark meter nav output progress section summary time video\",version:\"3.6.2\",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:\"default\",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);if(g)return a.createDocumentFragment();\nfor(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d<h;d++)c.createElement(e[d]);return c}};l.html5=e;q(f)})(this,document);\n/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */\n/*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */\n\nwindow.matchMedia = window.matchMedia || (function( doc, undefined ) {\n\n  \"use strict\";\n\n  var bool,\n      docElem = doc.documentElement,\n      refNode = docElem.firstElementChild || docElem.firstChild,\n      // fakeBody required for <FF4 when executed in <head>\n      fakeBody = doc.createElement( \"body\" ),\n      div = doc.createElement( \"div\" );\n\n  div.id = \"mq-test-1\";\n  div.style.cssText = \"position:absolute;top:-100em\";\n  fakeBody.style.background = \"none\";\n  fakeBody.appendChild(div);\n\n  return function(q){\n\n    div.innerHTML = \"&shy;<style media=\\\"\" + q + \"\\\"> #mq-test-1 { width: 42px; }</style>\";\n\n    docElem.insertBefore( fakeBody, refNode );\n    bool = div.offsetWidth === 42;\n    docElem.removeChild( fakeBody );\n\n    return {\n      matches: bool,\n      media: q\n    };\n\n  };\n\n}( document ));\n\n\n\n\n\n/*! Respond.js v1.1.0: min/max-width media query polyfill. (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs  */\n(function( win ){\n\n\t\"use strict\";\n\n\t//exposed namespace\n\tvar respond = {};\n\twin.respond = respond;\n\t\n\t//define update even in native-mq-supporting browsers, to avoid errors\n\trespond.update = function(){};\n\t\n\t//expose media query support flag for external use\n\trespond.mediaQueriesSupported\t= win.matchMedia && win.matchMedia( \"only all\" ).matches;\n\t\n\t//if media queries are supported, exit here\n\tif( respond.mediaQueriesSupported ){\n\t\treturn;\n\t}\n\t\n\t//define vars\n\tvar doc = win.document,\n\t\tdocElem = doc.documentElement,\n\t\tmediastyles = [],\n\t\trules = [],\n\t\tappendedEls = [],\n\t\tparsedSheets = {},\n\t\tresizeThrottle = 30,\n\t\thead = doc.getElementsByTagName( \"head\" )[0] || docElem,\n\t\tbase = doc.getElementsByTagName( \"base\" )[0],\n\t\tlinks = head.getElementsByTagName( \"link\" ),\n\t\trequestQueue = [],\n\t\t\n\t\t//loop stylesheets, send text content to translate\n\t\tripCSS = function(){\n\n\t\t\tfor( var i = 0; i < links.length; i++ ){\n\t\t\t\tvar sheet = links[ i ],\n\t\t\t\thref = sheet.href,\n\t\t\t\tmedia = sheet.media,\n\t\t\t\tisCSS = sheet.rel && sheet.rel.toLowerCase() === \"stylesheet\";\n\n\t\t\t\t//only links plz and prevent re-parsing\n\t\t\t\tif( !!href && isCSS && !parsedSheets[ href ] ){\n\t\t\t\t\t// selectivizr exposes css through the rawCssText expando\n\t\t\t\t\tif (sheet.styleSheet && sheet.styleSheet.rawCssText) {\n\t\t\t\t\t\ttranslate( sheet.styleSheet.rawCssText, href, media );\n\t\t\t\t\t\tparsedSheets[ href ] = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif( (!/^([a-zA-Z:]*\\/\\/)/.test( href ) && !base) ||\n\t\t\t\t\t\t\thref.replace( RegExp.$1, \"\" ).split( \"/\" )[0] === win.location.host ){\n\t\t\t\t\t\t\trequestQueue.push( {\n\t\t\t\t\t\t\t\thref: href,\n\t\t\t\t\t\t\t\tmedia: media\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tmakeRequests();\n\t\t},\n\t\t\n\t\t//recurse through request queue, get css text\n\t\tmakeRequests\t= function(){\n\t\t\tif( requestQueue.length ){\n\t\t\t\tvar thisRequest = requestQueue.shift();\n\t\t\t\t\n\t\t\t\tajax( thisRequest.href, function( styles ){\n\t\t\t\t\ttranslate( styles, thisRequest.href, thisRequest.media );\n\t\t\t\t\tparsedSheets[ thisRequest.href ] = true;\n\n\t\t\t\t\t// by wrapping recursive function call in setTimeout \n\t\t\t\t\t// we prevent \"Stack overflow\" error in IE7\n\t\t\t\t\twin.setTimeout(function(){ makeRequests(); },0);\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\t\t\n\t\t//find media blocks in css text, convert to style blocks\n\t\ttranslate = function( styles, href, media ){\n\t\t\tvar qs = styles.match(  /@media[^\\{]+\\{([^\\{\\}]*\\{[^\\}\\{]*\\})+/gi ),\n\t\t\t\tql = qs && qs.length || 0;\n\n\t\t\t//try to get CSS path\n\t\t\thref = href.substring( 0, href.lastIndexOf( \"/\" ) );\n\n\t\t\tvar repUrls\t= function( css ){\n\t\t\t\t\treturn css.replace( /(url\\()['\"]?([^\\/\\)'\"][^:\\)'\"]+)['\"]?(\\))/g, \"$1\" + href + \"$2$3\" );\n\t\t\t\t},\n\t\t\t\tuseMedia = !ql && media;\n\n\t\t\t//if path exists, tack on trailing slash\n\t\t\tif( href.length ){ href += \"/\"; }\t\n\t\t\t\t\n\t\t\t//if no internal queries exist, but media attr does, use that\t\n\t\t\t//note: this currently lacks support for situations where a media attr is specified on a link AND\n\t\t\t\t//its associated stylesheet has internal CSS media queries.\n\t\t\t\t//In those cases, the media attribute will currently be ignored.\n\t\t\tif( useMedia ){\n\t\t\t\tql = 1;\n\t\t\t}\n\n\t\t\tfor( var i = 0; i < ql; i++ ){\n\t\t\t\tvar fullq, thisq, eachq, eql;\n\n\t\t\t\t//media attr\n\t\t\t\tif( useMedia ){\n\t\t\t\t\tfullq = media;\n\t\t\t\t\trules.push( repUrls( styles ) );\n\t\t\t\t}\n\t\t\t\t//parse for styles\n\t\t\t\telse{\n\t\t\t\t\tfullq = qs[ i ].match( /@media *([^\\{]+)\\{([\\S\\s]+?)$/ ) && RegExp.$1;\n\t\t\t\t\trules.push( RegExp.$2 && repUrls( RegExp.$2 ) );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\teachq = fullq.split( \",\" );\n\t\t\t\teql\t= eachq.length;\n\t\t\t\t\t\n\t\t\t\tfor( var j = 0; j < eql; j++ ){\n\t\t\t\t\tthisq = eachq[ j ];\n\t\t\t\t\tmediastyles.push( { \n\t\t\t\t\t\tmedia : thisq.split( \"(\" )[ 0 ].match( /(only\\s+)?([a-zA-Z]+)\\s?/ ) && RegExp.$2 || \"all\",\n\t\t\t\t\t\trules : rules.length - 1,\n\t\t\t\t\t\thasquery : thisq.indexOf(\"(\") > -1,\n\t\t\t\t\t\tminw : thisq.match( /\\(\\s*min\\-width\\s*:\\s*(\\s*[0-9\\.]+)(px|em)\\s*\\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || \"\" ), \n\t\t\t\t\t\tmaxw : thisq.match( /\\(\\s*max\\-width\\s*:\\s*(\\s*[0-9\\.]+)(px|em)\\s*\\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || \"\" )\n\t\t\t\t\t} );\n\t\t\t\t}\t\n\t\t\t}\n\n\t\t\tapplyMedia();\n\t\t},\n        \n\t\tlastCall,\n\t\t\n\t\tresizeDefer,\n\t\t\n\t\t// returns the value of 1em in pixels\n\t\tgetEmValue = function() {\n\t\t\tvar ret,\n\t\t\t\tdiv = doc.createElement('div'),\n\t\t\t\tbody = doc.body,\n\t\t\t\tfakeUsed = false;\n\t\t\t\t\t\t\t\t\t\n\t\t\tdiv.style.cssText = \"position:absolute;font-size:1em;width:1em\";\n\t\t\t\t\t\n\t\t\tif( !body ){\n\t\t\t\tbody = fakeUsed = doc.createElement( \"body\" );\n\t\t\t\tbody.style.background = \"none\";\n\t\t\t}\n\t\t\t\t\t\n\t\t\tbody.appendChild( div );\n\t\t\t\t\t\t\t\t\n\t\t\tdocElem.insertBefore( body, docElem.firstChild );\n\t\t\t\t\t\t\t\t\n\t\t\tret = div.offsetWidth;\n\t\t\t\t\t\t\t\t\n\t\t\tif( fakeUsed ){\n\t\t\t\tdocElem.removeChild( body );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbody.removeChild( div );\n\t\t\t}\n\t\t\t\n\t\t\t//also update eminpx before returning\n\t\t\tret = eminpx = parseFloat(ret);\n\t\t\t\t\t\t\t\t\n\t\t\treturn ret;\n\t\t},\n\t\t\n\t\t//cached container for 1em value, populated the first time it's needed \n\t\teminpx,\n\t\t\n\t\t//enable/disable styles\n\t\tapplyMedia = function( fromResize ){\n\t\t\tvar name = \"clientWidth\",\n\t\t\t\tdocElemProp = docElem[ name ],\n\t\t\t\tcurrWidth = doc.compatMode === \"CSS1Compat\" && docElemProp || doc.body[ name ] || docElemProp,\n\t\t\t\tstyleBlocks\t= {},\n\t\t\t\tlastLink = links[ links.length-1 ],\n\t\t\t\tnow = (new Date()).getTime();\n\n\t\t\t//throttle resize calls\t\n\t\t\tif( fromResize && lastCall && now - lastCall < resizeThrottle ){\n\t\t\t\twin.clearTimeout( resizeDefer );\n\t\t\t\tresizeDefer = win.setTimeout( applyMedia, resizeThrottle );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlastCall = now;\n\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\tfor( var i in mediastyles ){\n\t\t\t\tif( mediastyles.hasOwnProperty( i ) ){\n\t\t\t\t\tvar thisstyle = mediastyles[ i ],\n\t\t\t\t\t\tmin = thisstyle.minw,\n\t\t\t\t\t\tmax = thisstyle.maxw,\n\t\t\t\t\t\tminnull = min === null,\n\t\t\t\t\t\tmaxnull = max === null,\n\t\t\t\t\t\tem = \"em\";\n\t\t\t\t\t\n\t\t\t\t\tif( !!min ){\n\t\t\t\t\t\tmin = parseFloat( min ) * ( min.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );\n\t\t\t\t\t}\n\t\t\t\t\tif( !!max ){\n\t\t\t\t\t\tmax = parseFloat( max ) * ( max.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// if there's no media query at all (the () part), or min or max is not null, and if either is present, they're true\n\t\t\t\t\tif( !thisstyle.hasquery || ( !minnull || !maxnull ) && ( minnull || currWidth >= min ) && ( maxnull || currWidth <= max ) ){\n\t\t\t\t\t\tif( !styleBlocks[ thisstyle.media ] ){\n\t\t\t\t\t\t\tstyleBlocks[ thisstyle.media ] = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstyleBlocks[ thisstyle.media ].push( rules[ thisstyle.rules ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//remove any existing respond style element(s)\n\t\t\tfor( var j in appendedEls ){\n\t\t\t\tif( appendedEls.hasOwnProperty( j ) ){\n\t\t\t\t\tif( appendedEls[ j ] && appendedEls[ j ].parentNode === head ){\n\t\t\t\t\t\thead.removeChild( appendedEls[ j ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//inject active styles, grouped by media type\n\t\t\tfor( var k in styleBlocks ){\n\t\t\t\tif( styleBlocks.hasOwnProperty( k ) ){\n\t\t\t\t\tvar ss = doc.createElement( \"style\" ),\n\t\t\t\t\t\tcss = styleBlocks[ k ].join( \"\\n\" );\n\t\t\t\t\t\n\t\t\t\t\tss.type = \"text/css\";\t\n\t\t\t\t\tss.media = k;\n\t\t\t\t\t\n\t\t\t\t\t//originally, ss was appended to a documentFragment and sheets were appended in bulk.\n\t\t\t\t\t//this caused crashes in IE in a number of circumstances, such as when the HTML element had a bg image set, so appending beforehand seems best. Thanks to @dvelyk for the initial research on this one!\n\t\t\t\t\thead.insertBefore( ss, lastLink.nextSibling );\n\t\t\t\t\t\n\t\t\t\t\tif ( ss.styleSheet ){ \n\t\t\t\t\t\tss.styleSheet.cssText = css;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tss.appendChild( doc.createTextNode( css ) );\n\t\t\t\t\t}\n\n\t\t\t\t\t//push to appendedEls to track for later removal\n\t\t\t\t\tappendedEls.push( ss );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t//tweaked Ajax functions from Quirksmode\n\t\tajax = function( url, callback ) {\n\t\t\tvar req = xmlHttp();\n\t\t\tif (!req){\n\t\t\t\treturn;\n\t\t\t}\t\n\t\t\treq.open( \"GET\", url, true );\n\t\t\treq.onreadystatechange = function () {\n\t\t\t\tif ( req.readyState !== 4 || req.status !== 200 && req.status !== 304 ){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcallback( req.responseText );\n\t\t\t};\n\t\t\tif ( req.readyState === 4 ){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treq.send( null );\n\t\t},\n\t\t//define ajax obj \n\t\txmlHttp = (function() {\n\t\t\tvar xmlhttpmethod = false;\t\n\t\t\ttry {\n\t\t\t\txmlhttpmethod = new win.XMLHttpRequest();\n\t\t\t}\n\t\t\tcatch( e ){\n\t\t\t\txmlhttpmethod = new win.ActiveXObject( \"Microsoft.XMLHTTP\" );\n\t\t\t}\n\t\t\treturn function(){\n\t\t\t\treturn xmlhttpmethod;\n\t\t\t};\n\t\t})();\n\t\n\t//translate CSS\n\tripCSS();\n\t\n\t//expose update for re-running respond later on\n\trespond.update = ripCSS;\n\t\n\t//adjust on resize\n\tfunction callMedia(){\n\t\tapplyMedia( true );\n\t}\n\tif( win.addEventListener ){\n\t\twin.addEventListener( \"resize\", callMedia, false );\n\t}\n\telse if( win.attachEvent ){\n\t\twin.attachEvent( \"onresize\", callMedia );\n\t}\n})(this);\n"
  },
  {
    "path": "scripts/script.js",
    "content": "(function($) {\n  var $window = $(window);\n  var $document = $(document);\n\n /*\n  * Scrollspy.\n  */\n\n $document.on('flatdoc:ready', function() {\n    $(\"h2, h3\").scrollagent(function(cid, pid, currentElement, previousElement) {\n      if (pid) {\n       $(\"[href='#\"+pid+\"']\").removeClass('active');\n      }\n      if (cid) {\n       $(\"[href='#\"+cid+\"']\").addClass('active');\n      }\n    });\n  });\n\n /*\n  * Anchor jump links.\n  */\n\n $document.on('flatdoc:ready', function() {\n   $('.menu a').anchorjump();\n });\n\n /*\n  * Title card.\n  */\n\n  $(function() {\n    var $card = $('.title-card');\n    if (!$card.length) return;\n\n    var $header = $('.header');\n    var headerHeight = $header.length ? $header.outerHeight() : 0;\n\n    $window\n      .on('resize.title-card', function() {\n        var windowWidth = $window.width();\n\n        if (windowWidth < 480) {\n          $card.css('height', '');\n        } else {\n          var height = $window.height();\n          $card.css('height', height - headerHeight);\n        }\n      })\n      .trigger('resize.title-card');\n  });\n\n  /*\n   * Sidebar stick.\n   */\n\n  $(function() {\n    var $sidebar = $('.menubar');\n    var elTop;\n\n    $window\n      .on('resize.sidestick', function() {\n        $sidebar.removeClass('fixed');\n        elTop = $sidebar.offset().top;\n        $window.trigger('scroll.sidestick');\n      })\n      .on('scroll.sidestick', function() {\n        var scrollY = $window.scrollTop();\n        $sidebar.toggleClass('fixed', (scrollY >= elTop));\n      })\n      .trigger('resize.sidestick');\n  });\n\n})(jQuery);\n/*! jQuery.scrollagent (c) 2012, Rico Sta. Cruz. MIT License.\n *  https://github.com/rstacruz/jquery-stuff/tree/master/scrollagent */\n\n// Call $(...).scrollagent() with a callback function.\n//\n// The callback will be called everytime the focus changes.\n//\n// Example:\n//\n//      $(\"h2\").scrollagent(function(cid, pid, currentElement, previousElement) {\n//        if (pid) {\n//          $(\"[href='#\"+pid+\"']\").removeClass('active');\n//        }\n//        if (cid) {\n//          $(\"[href='#\"+cid+\"']\").addClass('active');\n//        }\n//      });\n\n(function($) {\n\n  $.fn.scrollagent = function(options, callback) {\n    // Account for $.scrollspy(function)\n    if (typeof callback === 'undefined') {\n      callback = options;\n      options = {};\n    }\n\n    var $sections = $(this);\n    var $parent = options.parent || $(window);\n\n    // Find the top offsets of each section\n    var offsets = [];\n    $sections.each(function(i) {\n      var offset = $(this).attr('data-anchor-offset') ?\n        parseInt($(this).attr('data-anchor-offset'), 10) :\n        (options.offset || 0);\n\n      offsets.push({\n        id: $(this).attr('id'),\n        index: i,\n        el: this,\n        offset: offset\n      });\n    });\n\n    // State\n    var current = null;\n    var height = null;\n    var range = null;\n\n    // Save the height. Do this only whenever the window is resized so we don't\n    // recalculate often.\n    $(window).on('resize', function() {\n      height = $parent.height();\n      range = $(document).height();\n    });\n\n    // Find the current active section every scroll tick.\n    $parent.on('scroll', function() {\n      var y = $parent.scrollTop();\n      y += height * (0.3 + 0.7 * Math.pow(y/range, 2));\n\n      var latest = null;\n\n      for (var i in offsets) {\n        if (offsets.hasOwnProperty(i)) {\n          var offset = offsets[i];\n          if ($(offset.el).offset().top + offset.offset < y) latest = offset;\n        }\n      }\n\n      if (latest && (!current || (latest.index !== current.index))) {\n        callback.call($sections,\n          latest ? latest.id : null,\n          current ? current.id : null,\n          latest ? latest.el : null,\n          current ? current.el : null);\n        current = latest;\n      }\n    });\n\n    $(window).trigger('resize');\n    $parent.trigger('scroll');\n\n    return this;\n  };\n\n})(jQuery);\n/*! Anchorjump (c) 2012, Rico Sta. Cruz. MIT License.\n *   http://github.com/rstacruz/jquery-stuff/tree/master/anchorjump */\n\n// Makes anchor jumps happen with smooth scrolling.\n//\n//    $(\"#menu a\").anchorjump();\n//    $(\"#menu a\").anchorjump({ offset: -30 });\n//\n//    // Via delegate:\n//    $(\"#menu\").anchorjump({ for: 'a', offset: -30 });\n//\n// You may specify a parent. This makes it scroll down to the parent.\n// Great for tabbed views.\n//\n//     $('#menu a').anchorjump({ parent: '.anchor' });\n//\n// You can jump to a given area.\n//\n//     $.anchorjump('#bank-deposit', options);\n\n(function($) {\n  var defaults = {\n    'speed': 500,\n    'offset': 0,\n    'for': null,\n    'parent': null\n  };\n\n  $.fn.anchorjump = function(options) {\n    options = $.extend({}, defaults, options);\n\n    if (options['for']) {\n      this.on('click', options['for'], onClick);\n    } else {\n      this.on('click', onClick);\n    }\n\n    function onClick(e) {\n      var $a = $(e.target).closest('a');\n      if (e.ctrlKey || e.metaKey || e.altKey || $a.attr('target')) return;\n\n      e.preventDefault();\n      var href = $a.attr('href');\n\n      $.anchorjump(href, options);\n    }\n  };\n\n  // Jump to a given area.\n  $.anchorjump = function(href, options) {\n    options = $.extend({}, defaults, options);\n\n    var top = 0;\n\n    if (href != '#') {\n      var $area = $(href);\n      // Find the parent\n      if (options.parent) {\n        var $parent = $area.closest(options.parent);\n        if ($parent.length) { $area = $parent; }\n      }\n      if (!$area.length) { return; }\n\n      // Determine the pixel offset; use the default if not available\n      var offset =\n        $area.attr('data-anchor-offset') ?\n        parseInt($area.attr('data-anchor-offset'), 10) :\n        options.offset;\n\n      top = Math.max(0, $area.offset().top + offset);\n    }\n\n    $('html, body').animate({ scrollTop: top }, options.speed);\n    $('body').trigger('anchor', href);\n\n    // Add the location hash via pushState.\n    if (window.history.pushState) {\n      window.history.pushState({ href: href }, \"\", href);\n    }\n  };\n})(jQuery);\n"
  },
  {
    "path": "security.md",
    "content": "# Security\n\nBlynk server has 5 ports open for different security levels.\n\n* **80** - plain TCP connection for the hardware \\(no security\\)\n* **8080** - plain TCP connection for hardware \\(no security\\)\n* **443** - SSL/TLS connection for the Mobile Apps and hardware with SSL\n* **9443** - SSL/TLS connection for the Mobile Apps and hardware with SSL\n\nHardware may select to connect to 443 \\(9443\\) or 80 \\(8080\\), depending on it's capabilities. Connection between the app and the server is always is done through SSL/TLS, so it is always secured. Connection between the hardware and server depends on your hardware capabilities.\n\n## Use Local Blynk Server\n\nLocal Blynk Server is no longer supported.\n\n## Use SSL gateway\n\nMost platforms are not capable to handle SSL, so they connect to 80. However, our [gateway script](https://github.com/blynkkk/blynk-library/blob/master/scripts/blynk-ser.sh) can be used to add SSL security layer to communication.\n\n```bash\n./blynk-ser.sh -f SSL\n```\n\nThis will forward all hardware connections from 9443 port to the server via SSL gateway. You can run this script on your Raspberry Pi, desktop computer, or even directly on your router!\n\n**Note:** when using your own server, you should overwrite the bundled server.crt certificate, or specify it to the script using `--cert` switch:\n\n```bash\n./blynk-ser.sh -f SSL -s <server ip> -p 9443 --cert=<certificate>.crt\n```\n\nFlag `-f SSL` is enabled by default for USB communication so you don't have to explicit declare it.\n\n**Note:** SSL is supported by the gateway only on Linux/OSX for now\n\nIf you want to skip SSL, and connect to TCP, you can also do that:\n\n```bash\n./blynk-ser.sh -t TCP\n```\n\n"
  },
  {
    "path": "sharing.md",
    "content": "# Sharing\n\nBlynk offers two types of sharing your projects with other people:\n\n* **Share access to your hardware.** Think about giving someone an App for your Project. They can't modify, but can control and see what's there.\n* **Share your Project configuration.** Others will get a clone of your project by scanning a given QR link, but they won't be able to control your hardware. It's great for tutorials, instructables, etc.\n\n## Shared access to your hardware\n\nImagine giving someone an App to control your Project.\n\n* people you’ve shared your project with can’t modify anything. They can only use it\n* you can update your app, change the layout, add widgets and it’s immediately synced to everyone\n* you can revoke access at any moment\n\nHow it works:\n\n* you send the QR code to your users \\(you can email, print, post to social media, do whatever you want\\)\n* others download Blynk app, scan the QR code and your app opens for them ready to use. They don’t even need to login or create an account.\n\nGo to your Project's Settings:\n\n![](.gitbook/assets/dash_settings_sharing.png)\n\nClick on \"Generate Link\" button :\n\n![](.gitbook/assets/dash_settings_sharing_generate.png)\n\nIt will generate QR code you can share with others:\n\n![](.gitbook/assets/dash_public_sharing.png)\n\nThat's it! Now **Exit the settings and press PLAY button.**\n\nAnother person would need to install Blynk app and scan QR code from the login screen \\(scanning from existing profile is not yet supported\\) ;\n\n![](.gitbook/assets/scan_qr.png)\n\n**NOTE:** Your Project should be active, don't forget to press Play button.\n\n**WARNING:** Sharing costs 1000 energy and this energy is not recoverable even you didn't use sharing at all.\n\n## Share your Project configuration\n\nIn case you want to share your Project's set up without giving access to your hardware \\(for example to make a tutorial or instructable\\)- follow the steps:\n\nIn Project's Settings go to **Clone** button.\n\n![](.gitbook/assets/clone.png)\n\nIt will generate QR code you can share with anyone.\n\n![](.gitbook/assets/QR.png)\n\nAnother person **should Log In to Blynk app** and press QR button in Projects gallery\n\n![](.gitbook/assets/QR_button_edit.png)\n\nAfter the scan, a new Project will be created, all the widgets, settings, layout will be cloned. Another person would need enough Energy Balance to clone your Project.\n\n**Auth Token will be different!**. Nobody will get access to your hardware. They just get a copy of the layout and settings.\n\n"
  },
  {
    "path": "supportedhardware.md",
    "content": "# Supported Hardware\n\nBlynk supports more than 400 boards already, including support for Arduino, Particle, ARM mbed, TI Energia, MicroPython, Node.js, OpenWRT and many Single Board Computers. You can add your own connection types easily \\(see [these](https://github.com/blynkkk/blynk-library/tree/master/examples/More/ArduinoClient) examples for Arduino\\)!\n\n## Platforms\n\n* **Arduino** \\([https://github.com/blynkkk/blynk-library](https://github.com/blynkkk/blynk-library)\\)\n  * Arduino MKR WiFi 1010\n  * Arduino MKR GSM 1400\n  * Arduino MKR NB 1500\n  * Arduino Uno, Duemilanove\n  * Arduino Nano, Mini, Pro Mini, Pro Micro, Due, Mega\n  * Arduino 101 \\(Intel Curie, with BLE\\)\n  * Arduino MKR1000\n  * Arduino Zero\n  * Arduino Yún \\(onboard WiFi and Ethernet, via Bridge\\)\n  * Arduino.org UNO WiFi\n  * Arduino MKR VIDOR 4000 \\(use the example for MKR WiFi 1010\\)\n  * Arduino UNO WiFi Rev.2 \\(use the example for MKR WiFi 1010\\)\n* **Arduino-like**\n  * Blynk Board\n  * ESP8266 \\(Generic, NodeMCU, Witty Cloud, Huzzah, WeMos D1, Seeed Wio Link, etc.\\)\n  * ESP32 \\(WiFi, BLE\\)\n  * Nordic nRF51/nRF52 - based boards\n  * Teensy 3.2/3.1\n  * Blue Pill \\(STM32F103C\\)\n  * Realtek RTL8710 / Ameba via [RTLduino](https://github.com/pvvx/RtlDuino)\n  * BBC micro:bit\n  * LightBlue Bean _, soon_\n  * DFRobot Bluno\n  * RedBear Duo \\(WiFi, BLE\\)\n  * RedBearLab Blend Micro\n  * RedBearLab BLE Nano \\(v1 and v2\\)\n  * Seeed Tiny BLE\n  * Simblee BLE\n  * RFduino BLE\n  * The AirBoard \\(BLE-Link, RN-XV\\)\n  * Feather M0 WiFi\n  * Feather 32u4 BLE\n  * Intel Edison\n  * Intel Galileo\n  * Fishino Guppy, Uno, Mega\n  * TinyCircuits TinyDuino \\(CC3000\\)\n  * Microduino/mCookie Core, Core+, CoreUSB\n  * Wicked WildFire V2, V3, V4\n  * Digistump Oak\n  * chipKIT Uno32\n  * Alorium XLR8 \\(FPGA\\)\n  * LinkIt ONE \\(WiFi only\\)\n* **Energia**\n  * Texas Instruments\n    * CC3220SF-LaunchXL\n    * CC3200-LaunchXL\n    * Tiva C Connected LaunchPad\n    * Stellaris LM4F120 LaunchPad\n    * MSP430F5529 + CC3100\n    * LaunchPad MSP432\n  * RedBearLab \\(CC3200, WiFi Mini\\)\n* **Particle** [https://github.com/vshymanskyy/blynk-library-spark](https://github.com/vshymanskyy/blynk-library-spark)\\)\n  * Core\n  * Photon\n  * Electron\n  * RPi\n  * SparkFun RedBoard\n  * RedBear Duo \\(WiFi & BLE\\)\n* **ARM mbed** \\([https://developer.mbed.org/users/vshymanskyy/code/Blynk/](https://developer.mbed.org/users/vshymanskyy/code/Blynk/)\\)\n  * Seeed Tiny BLE\n  * RedBearLab BLE Nano\n  * BBC micro:bit\n  * STM32 Nucleo + Wiznet 5100 _, soon_\n* **JavaScript** \\(Node.js, Espruino, Browsers\\) \\([https://www.npmjs.com/package/blynk-library](https://www.npmjs.com/package/blynk-library)\\)\n  * Regular PC with Linux / Windows / OS X\n  * Raspberry Pi \\(Banana Pi, Orange Pi, ...\\)\n  * BeagleBone Black\n  * Onion Omega\n  * Onion Omega 2\n  * Intel Galileo\n  * Intel Edison\n  * Intel Joule\n  * LeMaker Guitar\n  * LeMaker Banana Pro\n  * Samsung ARTIK 5\n  * PandaBoard, CubieBoard, pcDuino, Tessel 2\n  * VoCore, VoCore2 \\(OpenWRT + [Espruino package](https://github.com/vshymanskyy/OpenWRT-Espruino-packages)\\)\n  * Espruino Pico\n  * ...\n* **Python** \\([https://github.com/vshymanskyy/blynk-library-python](https://github.com/vshymanskyy/blynk-library-python)\\)\n  * MicroPython\n  * Python 2\n  * Python 3\n* **Lua** \\([https://github.com/blezek/blynk-esp](https://github.com/blezek/blynk-esp)\\)\n  * NodeMCU\n\n## Arduino connection types\n\n* USB \\(Serial\\), connected to your laptop or desktop\n* **Ethernet**\n  * Arduino MKR ETH\n  * Arduino Ethernet Shield \\(W5100\\)\n  * Arduino Ethernet Shield 2 \\(W5500\\)\n  * SeeedStudio Ethernet Shield V2.0 \\(W5200\\)\n  * ENC28J60-based modules\n* **WiFi**\n  * ESP8266 as WiFi modem \\(running original firmware\\)\n  * Arduino WiFi 101 Shield\n  * Arduino WiFi Shield\n  * WIZnet WizFi310\n  * Adafruit CC3000 WiFi Breakout / Shield\n  * RN-XV WiFly\n* **Bluetooth Smart \\(BLE 4.0\\)**\n  * HM-10, HC-08\n  * DFRobot BLE-Link module\n  * Microduino/mCookie BLE\n  * RedBearLab BLE Mini\n  * nRF8001-based boards \\(Adafruit Bluefruit LE, etc.\\)\n* **Bluetooth 2.0 Serial Port Profile \\(SPP\\)**\n  * HC-05, HC-06, ...\n* **Cellular \\(GSM/3G/LTE\\)**\n  * SIMCom SIM800 series \\(SIM800A, SIM800C, SIM800L, SIM800H, SIM808, SIM868\\)\n  * SIMCom SIM900 series \\(SIM900A, SIM900D, SIM908, SIM968\\)\n  * A6/A7\n  * M590\n  * BG96\n  * GPRSbee\n  * Microduino GSM\n  * Adafruit FONA \\(Mini Cellular GSM Breakout\\)\n  * Adafruit FONA 800/808 Shield\n\n## Made by Community\n\n* [Marvell® EZ-Connect™ MW300/MW302](https://github.com/vshymanskyy/blynk-library-ez-connect)\n* [WIZnet-W5500-EVB](http://instructables.com/id/WIZnet-W5500-EVB-and-Blynk-App-communication)\n* [LabVIEW](https://github.com/juncaofish/NI-LabVIEWInterfaceforBlynk)\n* [Node-RED](https://github.com/gablau/node-red-contrib-blynk-ws) \\(can be used as bridge to HTTP, TCP, UDP, MQTT, XMPP, IRC, OSC...\\)\n\n## Problematic Boards\n\nThese boards are not supported and do not work out of the box:\n\n* [Arduino Tian](http://www.arduino.org/products/boards/arduino-tian)\n\nHere is a list of \\[**known library issues**\\]\\([https://github.com/blynkkk/blynk-library/issues?q=is%3Aissue+label%3A\"for+reference\"+](https://github.com/blynkkk/blynk-library/issues?q=is%3Aissue+label%3A\"for+reference\"+)\\)\n\n"
  },
  {
    "path": "table.css",
    "content": ".StatusCake table{font-family:verdana,arial,sans-serif;font-size:11px;color:#333;border-width:1px;border-color:#deeaee;border-collapse:collapse}.StatusCake{width:50%}.StatusCake table th{background:#c8d7dc;border-width:1px;color:#fff;padding:8px;border-style:solid;border-color:#deeaee}.PoweredBy{width:170px;float:right;text-align:center;margin-right:16px;font-size:12px;padding-top:2px;font-family:Verdana,Geneva,sans-serif;font-weight:700;height:18px;-webkit-border-bottom-right-radius:7px;-webkit-border-bottom-left-radius:7px;-moz-border-radius-bottomright:7px;-moz-border-radius-bottomleft:7px;border-bottom-right-radius:7px;border-bottom-left-radius:7px;background:#fff;background:-moz-linear-gradient(top,rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,rgba(255,255,255,1)),color-stop(100%,rgba(229,229,229,1)));background:-webkit-linear-gradient(top,rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%);background:-o-linear-gradient(top,rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%);background:-ms-linear-gradient(top,rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%);background:linear-gradient(to bottom,rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff',endColorstr='#e5e5e5',GradientType=0 )}.PoweredBy a{color:#40626c;text-shadow:1px 1px #fff;text-decoration:none}.StatusCake table tr{background-color:#fff}.StatusCake .title{display:block;width:100%;height:32px;margin-top:15px;background:#f2f5f6;background:-moz-linear-gradient(top,#f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#f2f5f6),color-stop(37%,#e3eaed),color-stop(100%,#c8d7dc));background:-webkit-linear-gradient(top,#f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);background:-o-linear-gradient(top,#f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);background:-ms-linear-gradient(top,#f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);background:linear-gradient(to bottom,#f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#f2f5f6',endColorstr='#c8d7dc',GradientType=0 );-webkit-border-top-left-radius:7px;-webkit-border-top-right-radius:7px;-moz-border-radius-topleft:7px;-moz-border-radius-topright:7px;border-top-left-radius:7px;border-top-right-radius:7px}.StatusCake .title .text{padding:7px;font-size:14px;width:70%;float:left;font-family:verdana,arial,sans-serif;font-weight:700;color:#2f6779}#StatusTable{cursor:pointer!important}.StatusCake table tr:hover{background:#f2f5f6;background:-moz-linear-gradient(top,#f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#f2f5f6),color-stop(37%,#e3eaed),color-stop(100%,#c8d7dc));background:-webkit-linear-gradient(top,#f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);background:-o-linear-gradient(top,#f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);background:-ms-linear-gradient(top,#f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);background:linear-gradient(to bottom,#f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#f2f5f6',endColorstr='#c8d7dc',GradientType=0 )}.StatusCake .StatusGreen{background:#24c48e;background:-moz-linear-gradient(top,#24c48e 0%,#abdc28 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#24c48e),color-stop(100%,#abdc28));background:-webkit-linear-gradient(top,#24c48e 0%,#abdc28 100%);background:-o-linear-gradient(top,#24c48e 0%,#abdc28 100%);background:-ms-linear-gradient(top,#24c48e 0%,#abdc28 100%);background:linear-gradient(to bottom,#24c48e 0%,#abdc28 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#24c48e',endColorstr='#abdc28',GradientType=0 )}.StatusCake .StatusRed{background:#a90329;background:-moz-linear-gradient(top,#a90329 0%,#8f0222 44%,#6d0019 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#a90329),color-stop(44%,#8f0222),color-stop(100%,#6d0019));background:-webkit-linear-gradient(top,#a90329 0%,#8f0222 44%,#6d0019 100%);background:-o-linear-gradient(top,#a90329 0%,#8f0222 44%,#6d0019 100%);background:-ms-linear-gradient(top,#a90329 0%,#8f0222 44%,#6d0019 100%);background:linear-gradient(to bottom,#a90329 0%,#8f0222 44%,#6d0019 100%);color:#fff;filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#a90329',endColorstr='#6d0019',GradientType=0 )}.StatusCake table td{border-width:1px;padding:8px;border-style:solid;border-color:#deeaee}\n"
  },
  {
    "path": "themes/blynk.css",
    "content": "/*! Squarespace LESS Compiler  (less.js language v1.3.3)  */\n/*! normalize.css v2.1.3 | MIT License | git.io/normalize */\narticle,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}a{background:transparent}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:\"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\"}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=\"button\"],input[type=\"reset\"],input[type=\"submit\"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}input[type=\"checkbox\"],input[type=\"radio\"]{box-sizing:border-box;padding:0}input[type=\"search\"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=\"search\"]::-webkit-search-cancel-button,input[type=\"search\"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}nav ul{list-style-type:none;margin:0;padding:0}\n/*! Squarespace LESS Compiler  (less.js language v1.3.3)  */\n.clear{zoom:1}.clear:after{display:block;visibility:hidden;font-size:0;height:0;clear:both;content:\".\"}@-webkit-keyframes spin-frames{from{-webkit-transform:rotate(0deg);-webkit-animation-timing-function:linear}to{-webkit-transform:rotate(360deg);-webkit-animation-timing-function:linear}}@-moz-keyframes spin-frames{from{-moz-transform:rotate(0deg);-moz-animation-timing-function:linear}to{-moz-transform:rotate(360deg);-moz-animation-timing-function:linear}}.sqs-lightbox-signup-spinner{position:fixed !important;left:50% !important;margin-top:-150px !important;margin-left:-150px !important;width:300px !important;height:300px !important}.squarespace-signup-text{font-family:'proxima-nova','Helvetica Neue',Helvetica,Arial,sans-serif;color:#fff;width:300px;text-align:center;padding-top:15px;line-height:21px;font-size:15px;padding-bottom:100px}.squarespace-signup-text .join-thank-you{font-weight:bold;padding-bottom:20px}.squarespace-signup-spinner{background:transparent url('//static.squarespace.com/universal/images-v6/big-gear.png') center center no-repeat;width:300px !important;height:220px !important;-webkit-animation-duration:2s;-moz-animation-duration:2s;-o-animation-duration:2s;animation-duration:2s;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-o-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:spin-frames;-moz-animation-name:spin-frames;-o-animation-name:spin-frames;animation-name:spin-frames}.squarespace-signup-spinner.stopped{-webkit-animation-name:stopped;-moz-animation-name:stopped;-o-animation-name:stopped;animation-name:stopped}.sqs-lightbox.light .squarespace-signup-text{font:12px / 22px 'Gotham SSm A','Gotham SSm B','Gotham SSm','Gotham','Proxima Nova','Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif !important;background-color:transparent !important;letter-spacing:0 !important;display:block !important;float:none !important;color:#000 !important;height:auto !important;width:auto !important;margin:0 !important;padding:0 !important;text-transform:none !important;color:#3e3e3e}.sqs-lightbox.light .squarespace-signup-spinner{background:transparent url('//static.squarespace.com/universal/images-v6/big-gear-dark.png') center center no-repeat}.sqs-g{letter-spacing:-.31em;*letter-spacing:normal;*word-spacing:-.43em;text-rendering:optimizespeed}.opera-only :-o-prefocus,.sqs-g{word-spacing:-.43em}.yui3-u,.sqs-u{display:inline-block;zoom:1;*display:inline;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.sqs-u-1,.sqs-u-1-2,.sqs-u-1-3,.sqs-u-2-3,.sqs-u-1-4,.sqs-u-3-4,.sqs-u-1-5,.sqs-u-2-5,.sqs-u-3-5,.sqs-u-4-5,.sqs-u-1-6,.sqs-u-5-6,.sqs-u-1-8,.sqs-u-3-8,.sqs-u-5-8,.sqs-u-7-8,.sqs-u-1-12,.sqs-u-5-12,.sqs-u-7-12,.sqs-u-11-12,.sqs-u-1-24,.sqs-u-5-24,.sqs-u-7-24,.sqs-u-11-24,.sqs-u-13-24,.sqs-u-17-24,.sqs-u-19-24,.sqs-u-23-24{display:inline-block;zoom:1;*display:inline;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.sqs-u-1{display:block}.sqs-u-1-2{width:50%}.sqs-u-1-3{width:33.33333%}.sqs-u-2-3{width:66.66666%}.sqs-u-1-4{width:25%}.sqs-u-3-4{width:75%}.sqs-u-1-5{width:20%}.sqs-u-2-5{width:40%}.sqs-u-3-5{width:60%}.sqs-u-4-5{width:80%}.sqs-u-1-6{width:16.656%}.sqs-u-5-6{width:83.33%}.sqs-u-1-8{width:12.5%}.sqs-u-3-8{width:37.5%}.sqs-u-5-8{width:62.5%}.sqs-u-7-8{width:87.5%}.sqs-u-1-12{width:8.3333%}.sqs-u-5-12{width:41.6666%}.sqs-u-7-12{width:58.3333%}.sqs-u-11-12{width:91.6666%}.sqs-u-1-24{width:4.1666%}.sqs-u-5-24{width:20.8333%}.sqs-u-7-24{width:29.1666%}.sqs-u-11-24{width:45.8333%}.sqs-u-13-24{width:54.1666%}.sqs-u-17-24{width:70.8333%}.sqs-u-19-24{width:79.1666%}.sqs-u-23-24{width:95.8333%}#sqs-css-stamp.cssgrids{display:none}.yui3-widget-hidden{display:none}.yui3-widget-content{overflow:hidden}.yui3-widget-content-expanded{box-sizing:border-box;height:100%}.yui3-widget-tmp-forcesize{overflow:hidden !important}.sqs-panel{position:absolute}.sqs-panel-hidden{visibility:hidden}.sqs-widget-tmp-forcesize .sqs-panel-content{overflow:hidden !important}.sqs-panel .sqs-widget-hd{position:relative}.sqs-panel .sqs-widget-hd .sqs-widget-buttons{position:absolute;top:0;right:0}.sqs-panel .sqs-widget-ft .sqs-widget-buttons{display:inline-block;*display:inline;zoom:1}.yui3-slider,.yui3-slider-rail{display:-moz-inline-stack;display:inline-block;*display:inline;zoom:1;vertical-align:middle}.yui3-slider-content{position:relative;display:block}.yui3-slider-rail{position:relative}.yui3-slider-rail-cap-top,.yui3-slider-rail-cap-left,.yui3-slider-rail-cap-bottom,.yui3-slider-rail-cap-right,.yui3-slider-thumb,.yui3-slider-thumb-image,.yui3-slider-thumb-shadow{position:absolute}.yui3-slider-thumb{overflow:hidden}.sqs-aclist,.yui3-aclist{position:absolute;z-index:10}.sqs-aclist-hidden,.yui3-aclist-hidden{visibility:hidden}.sqs-aclist-aria,.yui3-aclist-aria{left:-9999px;position:absolute}.sqs-aclist-list,.yui3-aclist-list{list-style:none;margin:0;overflow:hidden;padding:0}.sqs-aclist-item,.yui3-aclist-item{cursor:pointer;list-style:none;padding:2px 5px}.sqs-aclist-item-active,.yui3-aclist-item-active{outline:#afafaf dotted thin}body.native-currency-code-usd .sqs-money-native:before{content:'$'}body.native-currency-code-cad .sqs-money-native:before{content:'$'}body.native-currency-code-cad .sqs-money-native:after{content:' CAD'}body.native-currency-code-gbp .sqs-money-native:before{content:'£'}body.native-currency-code-eur .sqs-money-native:before{content:'€'}body.native-currency-code-aud .sqs-money-native:before{content:'$'}body.native-currency-code-aud .sqs-money-native:after{content:' AUD'}body.native-currency-code-chf .sqs-money-native:before{content:'CHF'}.password-prompt-overlay{z-index:50499;position:fixed;left:0;top:0;right:0;bottom:0;opacity:0;-webkit-transition:all .2s cubic-bezier(.645,.045,.355,1);transition:all .2s cubic-bezier(.645,.045,.355,1);background:#000;background:-webkit-gradient(radial,50% 25%,0,50% 25%,800,from(rgba(0,0,0,.85)),to(#000)) transparent;background:-moz-radial-gradient(center 45deg,circle cover,rgba(0,0,0,.85) 0%,#000 100%) transparent}.sqs-password-prompt{background:#f2f2f2;box-shadow:0 4px 33px rgba(0,0,0,.22),0 0 0 1px rgba(0,0,0,.04);position:absolute;left:50%;top:100px;margin-left:-160px;z-index:50500;-webkit-transition:all .2s cubic-bezier(.645,.045,.355,1);transition:all .2s cubic-bezier(.645,.045,.355,1);height:190px;width:320px;opacity:0;-webkit-transform:scale(.98);-moz-transform:scale(.98);-ms-transform:scale(.98);transform:scale(.98)}.sqs-password-prompt.shown{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}.sqs-password-prompt-content .title{text-transform:uppercase;font-weight:500;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;border-bottom:1px solid #e2e2e2}.sqs-password-prompt-content .password{box-sizing:border-box;position:relative;background-color:#fff;padding:11px;line-height:22px;height:44px;width:100%;color:#3e3e3e;border:none}.sqs-password-prompt-content .password:focus{outline:none}.sqs-password-prompt-content .title,.sqs-password-prompt-content .fields{padding:16.5px 33px}.sqs-password-prompt-content .buttons{position:absolute;bottom:0;width:100%;border-top:1px solid #e4e4e4;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex}.sqs-password-prompt-content .buttons:empty{border-top:0}.sqs-password-prompt-content .buttons>*{-webkit-box-flex:1;-moz-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;display:flex;align-items:center;justify-content:center;border-left:1px solid #e4e4e4 !important}.sqs-password-prompt-content .buttons>*:first-child{border-left:none !important}.sqs-password-prompt-content .buttons input,.sqs-password-prompt-content .buttons button{background:transparent}.sqs-password-prompt-content .buttons a{border-bottom:none}.sqs-password-prompt-content .buttons>*{cursor:pointer;outline:none;background:#f2f2f2;padding:11px;text-align:center;-webkit-transition:background-color .1s ease-in-out;transition:background-color .1s ease-in-out;line-height:22px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;font-family:inherit;-webkit-appearance:none;-moz-appearance:none;appearance:none}.sqs-password-prompt-content .buttons>*,.sqs-password-prompt-content .buttons>*>*{color:#3e3e3e !important;-webkit-appearance:none;border:0;text-transform:uppercase;outline:none;font-size:11px;font-weight:500}.sqs-password-prompt-content .buttons>*:hover{background-color:#fff;box-shadow:none}.sqs-system-error{color:#3e3e3e !important;background:transparent url('//static.squarespace.com/universal/images-v6/damask/error-dark.png') center center no-repeat;background-position:12px 12px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:1.5dppx){.sqs-system-error{background-image:url('//static.squarespace.com/universal/images-v6/damask/error-dark@2x.png');background-size:44px}}.sqs-system-error input{cursor:pointer;outline:none;background:#3e3e3e;padding:11px;text-align:center;-webkit-transition:background-color .1s ease-in-out;transition:background-color .1s ease-in-out;line-height:22px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;font-family:inherit;-webkit-appearance:none;-moz-appearance:none;appearance:none}.sqs-system-error input,.sqs-system-error input>*{color:#fff !important;-webkit-appearance:none;border:0;text-transform:uppercase;outline:none;font-size:11px;font-weight:500}.sqs-system-error input:hover{background-color:#000;box-shadow:none}.sqs-system-error-overlay.dialog-screen-overlay{background:rgba(242,242,242,.98)}.sqs-widgets-confirmation{position:absolute;z-index:1000000;font-size:12px}.sqs-widgets-confirmation-content{color:inherit;background-color:#f2f2f2;padding:22px 33px;text-align:center;box-shadow:0 4px 33px rgba(0,0,0,.22),0 0 0 1px rgba(0,0,0,.04)}.sqs-widgets-confirmation-content>.title{text-transform:uppercase;font-weight:500;margin-bottom:11px}.sqs-widgets-confirmation-content .message{margin:11px 0;line-height:22px}.sqs-widgets-confirmation-content .fields{margin-bottom:11px}.sqs-widgets-confirmation-content .fields .check-field-wrapper{padding:0}.sqs-widgets-confirmation-content .fields .check-field-wrapper .field-description{background:none}.sqs-widgets-confirmation-content .buttons{border-top:1px solid #e4e4e4;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;margin:22px -33px -22px}.sqs-widgets-confirmation-content .buttons:empty{border-top:0}.sqs-widgets-confirmation-content .buttons>*{-webkit-box-flex:1;-moz-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;display:flex;align-items:center;justify-content:center;border-left:1px solid #e4e4e4 !important}.sqs-widgets-confirmation-content .buttons>*:first-child{border-left:none !important}.sqs-widgets-confirmation-content .buttons input,.sqs-widgets-confirmation-content .buttons button{background:transparent}.sqs-widgets-confirmation-content .buttons a{border-bottom:none}.sqs-widgets-confirmation-content .buttons .confirmation-button:not(.reject){cursor:pointer;outline:none;background:#f2f2f2;padding:11px;text-align:center;-webkit-transition:background-color .1s ease-in-out;transition:background-color .1s ease-in-out;line-height:22px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;font-family:inherit;-webkit-appearance:none;-moz-appearance:none;appearance:none}.sqs-widgets-confirmation-content .buttons .confirmation-button:not(.reject),.sqs-widgets-confirmation-content .buttons .confirmation-button:not(.reject)>*{color:#3e3e3e !important;-webkit-appearance:none;border:0;text-transform:uppercase;outline:none;font-size:11px;font-weight:500}.sqs-widgets-confirmation-content .buttons .confirmation-button:not(.reject):hover{background-color:#fff;box-shadow:none}.sqs-widgets-confirmation-content .buttons .confirmation-button.reject{cursor:pointer;outline:none;background:#f2f2f2;padding:11px;text-align:center;-webkit-transition:background-color .1s ease-in-out;transition:background-color .1s ease-in-out;line-height:22px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;font-family:inherit;-webkit-appearance:none;-moz-appearance:none;appearance:none}.sqs-widgets-confirmation-content .buttons .confirmation-button.reject,.sqs-widgets-confirmation-content .buttons .confirmation-button.reject>*{color:#3e3e3e !important;-webkit-appearance:none;border:0;text-transform:uppercase;outline:none;font-size:11px;font-weight:500}.sqs-widgets-confirmation-content .buttons .confirmation-button.reject:hover{background-color:#000;box-shadow:none}.sqs-widgets-confirmation-content .buttons .confirmation-button.reject:hover{background-color:#f0523d}.sqs-widgets-confirmation-content .buttons .confirmation-button.reject:hover,.sqs-widgets-confirmation-content .buttons .confirmation-button.reject:hover *{color:#fff !important}.sqs-widgets-confirmation.sqs-widgets-data-confirmation .sqs-widgets-confirmation-content{text-align:left}.sqs-widgets-confirmation.danger-zone .sqs-widgets-confirmation-content{color:#fff !important;background-color:#f0523d}.sqs-widgets-confirmation.danger-zone .sqs-widgets-confirmation-content .buttons .confirmation-button{background-color:#f0523d;color:#fff !important}.sqs-widgets-confirmation.danger-zone .sqs-widgets-confirmation-content .buttons .confirmation-button:hover{background-color:#e4351e}.sqs-widgets-confirmation.dangerous-confirmation-button .sqs-widgets-confirmation-content .buttons .confirm:hover{background-color:#f0523d;color:#fff !important}.sqs-widgets-confirmation.reject-warning .buttons .confirmation-button.reject:hover{background-color:#f0523d;color:#fff}.sqs-widgets-confirmation.delete-collection .confirmation-button.confirm:hover{background-color:#f0523d;color:#fff !important}.sqs-widgets-confirmation.with-media .title:empty,.sqs-widgets-confirmation.with-media .message:empty{display:none}.sqs-widgets-confirmation.with-media .title:empty+.message:empty+.media{margin-top:-22px}.sqs-widgets-confirmation.with-media .media{display:block;position:relative;margin:0px -33px}.sqs-widgets-confirmation.with-media .media>*{display:block;position:relative;margin:0 auto}.sqs-widgets-confirmation.with-media .buttons{margin-top:0px}.sqs-widgets-confirmation.shown .media>*{width:100%}.sqs-widgets-confirmation{opacity:0;-webkit-transform:scale(.96);-moz-transform:scale(.96);-ms-transform:scale(.96);transform:scale(.96)}.sqs-widgets-confirmation.mobile{-webkit-transform:translatey(-50%);-moz-transform:translatey(-50%);-ms-transform:translatey(-50%);transform:translatey(-50%)}.sqs-widgets-confirmation.shown{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);transform:scale(1);-webkit-animation-name:show-confirmation;-moz-animation-name:show-confirmation;-o-animation-name:show-confirmation;animation-name:show-confirmation;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s}.sqs-widgets-confirmation.shown.mobile{-webkit-transform:translatey(0);-moz-transform:translatey(0);-ms-transform:translatey(0);transform:translatey(0);-webkit-animation-name:show-confirmation-mobile;-moz-animation-name:show-confirmation-mobile;-o-animation-name:show-confirmation-mobile;animation-name:show-confirmation-mobile}.sqs-widgets-confirmation.hiding{opacity:0;-webkit-animation-name:none;-moz-animation-name:none;-o-animation-name:none;animation-name:none;-webkit-transition-property:all;transition-property:all;-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transform:scale(.96);-moz-transform:scale(.96);-ms-transform:scale(.96);transform:scale(.96)}.sqs-widgets-confirmation.hiding.mobile{-webkit-transform:translatey(-50%);-moz-transform:translatey(-50%);-ms-transform:translatey(-50%);transform:translatey(-50%)}.sqs-widgets-confirmation-hidden{display:none}@-webkit-keyframes show-confirmation{from{opacity:0;-webkit-transform:scale(.96);-moz-transform:scale(.96);-ms-transform:scale(.96);transform:scale(.96)}to{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@-moz-keyframes show-confirmation{from{opacity:0;-webkit-transform:scale(.96);-moz-transform:scale(.96);-ms-transform:scale(.96);transform:scale(.96)}to{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@keyframes show-confirmation{from{opacity:0;-webkit-transform:scale(.96);-moz-transform:scale(.96);-ms-transform:scale(.96);transform:scale(.96)}to{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@-webkit-keyframes show-confirmation-mobile{from{-webkit-transform:translatey(-50%);-moz-transform:translatey(-50%);-ms-transform:translatey(-50%);transform:translatey(-50%)}to{-webkit-transform:translatey(0);-moz-transform:translatey(0);-ms-transform:translatey(0);transform:translatey(0)}}@keyframes show-confirmation-mobile{from{-webkit-transform:translatey(-50%);-moz-transform:translatey(-50%);-ms-transform:translatey(-50%);transform:translatey(-50%)}to{-webkit-transform:translatey(0);-moz-transform:translatey(0);-ms-transform:translatey(0);transform:translatey(0)}}.sqs-widgets-confirmation-overlay{display:block;background:#000;position:fixed;top:0;left:0;width:100%;height:100%;opacity:.4;z-index:999999}.ReactModal__Overlay{-webkit-perspective:600;perspective:600;opacity:0;overflow-x:hidden;overflow-y:auto;background-color:rgba(0,0,0,.4);z-index:999999}.ReactModal__Overlay--after-open{opacity:1;-webkit-transition:opacity 150ms;transition:opacity 150ms}.ReactModal__Content{position:fixed;top:50%;left:50%;transform-origin:top left;-webkit-transform:scale(.96) translate(-50%,-50%);-moz-transform:scale(.96) translate(-50%,-50%);-ms-transform:scale(.96) translate(-50%,-50%);transform:scale(.96) translate(-50%,-50%)}.ReactModal__Content.positionToPoint{transform-origin:center center;-webkit-transform:scale(.96);-moz-transform:scale(.96);-ms-transform:scale(.96);transform:scale(.96)}.ReactModal__Content:focus{outline:none}.ReactModal__Content--after-open{-webkit-transform:scale(1) translate(-50%,-50%);-moz-transform:scale(1) translate(-50%,-50%);-ms-transform:scale(1) translate(-50%,-50%);transform:scale(1) translate(-50%,-50%);-webkit-transition:transform 300ms;transition:transform 300ms}.ReactModal__Content--after-open.positionToPoint{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}.ReactModal__Overlay--before-close{opacity:0}.ReactModal__Content--before-close{-webkit-transform:scale(.96) translate(-50%,-50%);-moz-transform:scale(.96) translate(-50%,-50%);-ms-transform:scale(.96) translate(-50%,-50%);transform:scale(.96) translate(-50%,-50%);-webkit-transition:transform 300ms;transition:transform 300ms}.ReactModal__Content--before-close.positionToPoint{-webkit-transform:scale(.96);-moz-transform:scale(.96);-ms-transform:scale(.96);transform:scale(.96)}.ReactModal__Content.modal-dialog{border:none;background-color:transparent}.Modal{color:inherit;background-color:#f2f2f2;padding:22px 33px;box-sizing:border-box;box-shadow:0 4px 33px rgba(0,0,0,.22),0 0 0 1px rgba(0,0,0,.04)}.Modal-header{text-transform:uppercase;font-weight:500;margin-bottom:11px}.Modal-body{margin:11px 0}.Modal-fields{margin-bottom:11px}.Modal-fields .check-field-wrapper{padding:0}.Modal-fields .check-field-wrapper .field-description{background:none}.Modal-footer{border-top:1px solid #e4e4e4;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;margin:22px -33px -22px}.Modal-footer:empty{border-top:0}.Modal-footer>*{-webkit-box-flex:1;-moz-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;display:flex;align-items:center;justify-content:center;border-left:1px solid #e4e4e4 !important}.Modal-footer>*:first-child{border-left:none !important}.Modal-footer input,.Modal-footer button{background:transparent}.Modal-footer a{border-bottom:none}.Modal-button{cursor:pointer;outline:none;background:#f2f2f2;padding:11px;text-align:center;-webkit-transition:background-color .1s ease-in-out;transition:background-color .1s ease-in-out;line-height:22px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;font-family:inherit;-webkit-appearance:none;-moz-appearance:none;appearance:none}.Modal-button,.Modal-button>*{color:#3e3e3e !important;-webkit-appearance:none;border:0;text-transform:uppercase;outline:none;font-size:11px;font-weight:500}.Modal-button:hover{background-color:#fff;box-shadow:none}.Modal-button--danger{cursor:pointer;outline:none;background:#f2f2f2;padding:11px;text-align:center;-webkit-transition:background-color .1s ease-in-out;transition:background-color .1s ease-in-out;line-height:22px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;font-family:inherit;-webkit-appearance:none;-moz-appearance:none;appearance:none}.Modal-button--danger,.Modal-button--danger>*{color:#3e3e3e !important;-webkit-appearance:none;border:0;text-transform:uppercase;outline:none;font-size:11px;font-weight:500}.Modal-button--danger:hover{background-color:#000;box-shadow:none}.Modal-button--danger:hover{background-color:#f0523d}.Modal-button--danger:hover,.Modal-button--danger:hover *{color:#fff !important}.Survey-prompt{margin-top:11px;font-size:12px;color:#797979}.SurveyModal-body{overflow:hidden}.SurveyModal-title{text-transform:uppercase;font-weight:500;font-size:16px}.SurveyModal .expand-enter{max-height:0;-webkit-transition:max-height .6s ease-in-out;transition:max-height .6s ease-in-out}.SurveyModal .expand-enter.expand-enter-active{max-height:500px}body.no-scroll{height:100%;position:fixed}.no-scroll{overflow:hidden !important}.sqs-lightbox-overlay{position:fixed;opacity:0;top:0;left:0;background:#000;height:100%;width:100%}.sqs-lightbox-overlay.sqs-lightbox-overlay-style-orb{background:-webkit-gradient(radial,50% 25%,0,50% 25%,800,from(rgba(0,0,0,.75)),to(#000));background:-moz-radial-gradient(center 45deg,circle cover,rgba(0,0,0,.75) 0%,#000 100%)}.sqs-lightbox-overlay.light{background:rgba(242,242,242,.98) !important;color:#3e3e3e}.sqs-lightbox-overlay.white.sqs-lightbox-overlay-style-orb{background:-webkit-gradient(radial,50% 25%,0,50% 25%,800,from(rgba(255,255,255,.96)),to(#fff));background:-moz-radial-gradient(center 45deg,circle cover,from(rgba(255,255,255,.96)),to(#fff))}.sqsp-tooltip{color:inherit;background-color:#f2f2f2;padding:22px 33px;box-shadow:0 4px 33px rgba(0,0,0,.22),0 0 0 1px rgba(0,0,0,.04);position:absolute;overflow:hidden;text-align:left !important;max-width:250px}.sqsp-tooltip .title{text-transform:uppercase;font-weight:500;margin-bottom:11px}.sqsp-tooltip .description{margin:11px 0}.sqsp-tooltip .buttons{margin:22px -33px -22px;border-top:1px solid #e4e4e4;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex}.sqsp-tooltip .buttons:empty{border-top:0}.sqsp-tooltip .buttons>*{-webkit-box-flex:1;-moz-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;display:flex;align-items:center;justify-content:center;border-left:1px solid #e4e4e4 !important}.sqsp-tooltip .buttons>*:first-child{border-left:none !important}.sqsp-tooltip .buttons input,.sqsp-tooltip .buttons button{background:transparent}.sqsp-tooltip .buttons a{border-bottom:none}.sqsp-tooltip .buttons a:not(.reject){cursor:pointer;outline:none;background:#f2f2f2;padding:11px;text-align:center;-webkit-transition:background-color .1s ease-in-out;transition:background-color .1s ease-in-out;line-height:22px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;font-family:inherit;-webkit-appearance:none;-moz-appearance:none;appearance:none}.sqsp-tooltip .buttons a:not(.reject),.sqsp-tooltip .buttons a:not(.reject)>*{color:#3e3e3e !important;-webkit-appearance:none;border:0;text-transform:uppercase;outline:none;font-size:11px;font-weight:500}.sqsp-tooltip .buttons a:not(.reject):hover{background-color:#fff;box-shadow:none}.sqsp-tooltip .buttons a.reject{cursor:pointer;outline:none;background:#f2f2f2;padding:11px;text-align:center;-webkit-transition:background-color .1s ease-in-out;transition:background-color .1s ease-in-out;line-height:22px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;font-family:inherit;-webkit-appearance:none;-moz-appearance:none;appearance:none}.sqsp-tooltip .buttons a.reject,.sqsp-tooltip .buttons a.reject>*{color:#3e3e3e !important;-webkit-appearance:none;border:0;text-transform:uppercase;outline:none;font-size:11px;font-weight:500}.sqsp-tooltip .buttons a.reject:hover{background-color:#000;box-shadow:none}.sqsp-tooltip .buttons a.reject:hover{background-color:#f0523d}.sqsp-tooltip .buttons a.reject:hover,.sqsp-tooltip .buttons a.reject:hover *{color:#fff !important}.sqs-action-overlay{position:absolute;top:0;right:0;white-space:nowrap;-webkit-transition:opacity .1s ease-out;transition:opacity .1s ease-out;opacity:0;background-color:#3e3e3e;overflow:hidden;z-index:50;height:32px;border-radius:3px}.sqs-action-overlay.loading{opacity:1}.sqs-action-overlay.bottom{top:auto;bottom:0}.sqs-action-overlay>div{display:inline-block;height:32px;width:33px;opacity:.3;cursor:pointer}.sqs-action-overlay>div:hover{opacity:.9}.sqs-action-overlay>div:active,.sqs-action-overlay>div:focus{opacity:1}.sqs-action-overlay>div.edit-image,.sqs-action-overlay>div.edit{background:transparent url('//static.squarespace.com/universal/images-v6/damask/edit-16-light.png') center center no-repeat}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:1.5dppx){.sqs-action-overlay>div.edit-image,.sqs-action-overlay>div.edit{background-image:url('//static.squarespace.com/universal/images-v6/damask/edit-32-light.png');background-size:16px}}.sqs-action-overlay>div.edit.loading{background:none}.sqs-action-overlay>div.image-info{background:transparent url('//static.squarespace.com/universal/images-v6/damask/settings-16-light.png') center center no-repeat}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:1.5dppx){.sqs-action-overlay>div.image-info{background-image:url('//static.squarespace.com/universal/images-v6/damask/settings-32-light.png');background-size:16px}}.sqs-action-overlay>div.remove,.sqs-action-overlay>div.remove-image{background:transparent url('//static.squarespace.com/universal/images-v6/damask/trash-9-light.png') center center no-repeat;cursor:pointer}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:1.5dppx){.sqs-action-overlay>div.remove,.sqs-action-overlay>div.remove-image{background-image:url('//static.squarespace.com/universal/images-v6/damask/trash-9-light@2x.png');background-size:9px 11px}}.sqs-action-overlay>div.remove:hover,.sqs-action-overlay>div.remove-image:hover{background:transparent url('//static.squarespace.com/universal/images-v6/damask/trash-9-red.png') center center no-repeat}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:1.5dppx){.sqs-action-overlay>div.remove:hover,.sqs-action-overlay>div.remove-image:hover{background-image:url('//static.squarespace.com/universal/images-v6/damask/trash-9-red@2x.png');background-size:9px 11px}}.sqs-action-overlay>div.remove:hover,.sqs-action-overlay>div.remove-image:hover{background:#f0523d url('//static.squarespace.com/universal/images-v6/damask/trash-9-light.png') center center no-repeat}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:1.5dppx){.sqs-action-overlay>div.remove:hover,.sqs-action-overlay>div.remove-image:hover{background-image:url('//static.squarespace.com/universal/images-v6/damask/trash-9-light@2x.png');background-size:9px 11px}}.sqs-action-overlay>div.video-info{background:transparent url('//static.squarespace.com/universal/images-v6/damask/settings-16-light.png') center center no-repeat}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:1.5dppx){.sqs-action-overlay>div.video-info{background-image:url('//static.squarespace.com/universal/images-v6/damask/settings-32-light.png');background-size:16px}}.sqs-action-overlay>div.getty{background:transparent url('//static.squarespace.com/universal/images-v6/damask/getty-16-light.png') center center no-repeat}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:1.5dppx){.sqs-action-overlay>div.getty{background-image:url('//static.squarespace.com/universal/images-v6/damask/getty-32-light.png');background-size:16px}}.sqs-action-overlay>div.buy{background:transparent url('//static.squarespace.com/universal/images-v6/damask/shopping-cart-16-light.png') center center no-repeat}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:1.5dppx){.sqs-action-overlay>div.buy{background-image:url('//static.squarespace.com/universal/images-v6/damask/shopping-cart-32-light.png');background-size:16px}}.sqs-action-overlay>div.remove-video{background:transparent url('//static.squarespace.com/universal/images-v6/damask/trash-9-light.png') center center no-repeat;cursor:pointer}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:1.5dppx){.sqs-action-overlay>div.remove-video{background-image:url('//static.squarespace.com/universal/images-v6/damask/trash-9-light@2x.png');background-size:9px 11px}}.sqs-action-overlay>div.remove-video:hover{background:transparent url('//static.squarespace.com/universal/images-v6/damask/trash-9-red.png') center center no-repeat}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:1.5dppx){.sqs-action-overlay>div.remove-video:hover{background-image:url('//static.squarespace.com/universal/images-v6/damask/trash-9-red@2x.png');background-size:9px 11px}}.sqs-action-overlay>div.remove-video:hover{background:#f0523d url('//static.squarespace.com/universal/images-v6/damask/trash-9-light.png') center center no-repeat}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:1.5dppx){.sqs-action-overlay>div.remove-video:hover{background-image:url('//static.squarespace.com/universal/images-v6/damask/trash-9-light@2x.png');background-size:9px 11px}}.sqs-action-overlay>div.loading{background:none;position:relative;opacity:1}.sqs-action-overlay>div.loading .sqs-spin.default{position:relative;top:50%;left:50%;-webkit-transform:translatex(-50%) translatey(-50%);-moz-transform:translatex(-50%) translatey(-50%);-ms-transform:translatex(-50%) translatey(-50%);transform:translatex(-50%) translatey(-50%)}.sqs-action-overlay-container:hover .sqs-action-overlay{opacity:1}.touch .sqs-action-overlay{opacity:1}.image-focal-point{border-radius:14px;height:14px;width:14px;margin-left:-10px;margin-top:-10px;position:absolute;border:3px solid rgba(255,255,255,.8);background:rgba(0,0,0,.2);cursor:move;opacity:0}.sqs-loading-overlay-node{background:rgba(255,255,255,.9)}.sqs-loading-overlay-node .sqs-spin{position:absolute;top:50%;left:50%}.sqs-loading-overlay-node .sqs-spin.large{margin-top:-11px;margin-left:-11px}.sqs-loading-overlay-node .sqs-spin.extra-large{margin-top:-20px;margin-left:-20px}.sqs-loading-overlay-node.has-title .title{position:absolute;top:50%;width:100%;text-align:center;margin-top:22px;color:#999;font-size:14px}.sqs-loading-overlay-node.has-title .sqs-spin{margin-top:-22px}body>.login-wrapper{position:fixed;top:0;left:0;height:100%;width:100%;z-index:30100;transition:all .5s ease-in-out}body>.login-wrapper.hidden{opacity:0}@font-face{font-family:'squarespace-ui-font';src:url('//static.squarespace.com/universal/fonts/squarespace-ui-font.eot');src:url('//static.squarespace.com/universal/fonts/squarespace-ui-font.eot?#iefix') format('embedded-opentype'),url('//static.squarespace.com/universal/fonts/squarespace-ui-font.svg#squarespace-ui-font') format('svg'),url('//static.squarespace.com/universal/fonts/squarespace-ui-font.woff') format('woff'),url('//static.squarespace.com/universal/fonts/squarespace-ui-font.ttf') format('truetype');font-weight:normal;font-style:normal}.sqs-ui-font-family{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased}[class^=\"sqs-ui-font-\"]:before,[class*=\" sqs-ui-font-\"]:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased}/*IE9_SPLIT_MARKER*/\n[data-icon]:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:attr(data-icon)}.sqs-gallery-container a{border-bottom:0 !important}.sqs-gallery-container iframe{width:100%;height:100%;background:transparent;display:block}.sqs-gallery-controls .previous,.sqs-gallery-controls .next{position:absolute;top:50%;outline:none;color:#fff !important;z-index:999;font-size:14px;line-height:40px;margin-top:-30px;background-color:rgba(0,0,0,.12);display:inline-block;padding:10px;-webkit-transition:all 200ms cubic-bezier(.25,.46,.45,.94);-moz-transition:all 200ms cubic-bezier(.25,.46,.45,.94);-ms-transition:all 200ms cubic-bezier(.25,.46,.45,.94);-o-transition:all 200ms cubic-bezier(.25,.46,.45,.94);transition:all 200ms cubic-bezier(.25,.46,.45,.94)}.sqs-gallery-controls .previous:hover,.sqs-gallery-controls .next:hover{background-color:rgba(0,0,0,.2);color:#fff}.sqs-gallery-controls .previous{left:0px}.sqs-gallery-controls .previous:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e02c\";text-align:center;display:inline-block;vertical-align:middle}.sqs-gallery-controls .previous:before{font-size:32px;width:32px;height:32px;line-height:32px}.sqs-gallery-controls .next{right:0px}.sqs-gallery-controls .next:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e02d\";text-align:center;display:inline-block;vertical-align:middle}.sqs-gallery-controls .next:before{font-size:32px;width:32px;height:32px;line-height:32px}.sqs-gallery-controls .next:before,.sqs-gallery-controls .previous:before{font-size:24px;width:24px;height:24px;line-height:24px}.sqs-gallery-design-stacked{position:relative;text-align:left}.sqs-gallery-design-stacked-slide{position:absolute;top:0;left:0;width:100%;height:100%}.sqs-gallery-design-stacked-slide img{box-shadow:#000 0em 0em 0em}.sqs-gallery-design-stacked-slide.normal img{height:100%}.sqs-gallery-design-stacked-slide:only-child{cursor:default}.sqs-gallery-design-stacked-scrollHorz,.sqs-gallery-design-stacked-swipe{overflow:hidden}.sqs-gallery-design-stacked-scrollHorz .sqs-gallery-design-stacked-slide,.sqs-gallery-design-stacked-swipe .sqs-gallery-design-stacked-slide{position:relative;float:left}.sqs-gallery-design-stacked-swipe-wrapper{overflow-x:scroll;-webkit-transform:translatez(0);-ms-overflow-style:none;-ms-scroll-chaining:none;-ms-scroll-snap-type:mandatory;-ms-scroll-snap-points-x:snapinterval(0%,100%)}.sqs-gallery-design-strip{position:relative;overflow:hidden;height:100%}.sqs-gallery-design-strip .sqs-wrapper{position:relative;height:100%}.sqs-gallery-design-strip-slide{float:left;height:100% !important;max-width:none !important;width:auto !important;cursor:pointer;position:relative}.sqs-gallery-design-strip-slide .sqs-video-wrapper{height:100% !important}.sqs-gallery-design-strip-slide:only-child{cursor:default}.sqs-gallery-design-autocolumns{position:relative}.sqs-gallery-design-autocolumns-slide{position:absolute}.sqs-gallery-design-autocolumns-slide img{width:100%;display:inline-block;-webkit-transition:opacity .2s;transition:opacity .2s;opacity:1}.sqs-gallery-design-autocolumns-slide img.loading{opacity:0}.sqs-gallery-design-autocolumns-slide.content-fit img,.sqs-gallery-design-autocolumns-slide .content-fit img{width:auto}.sqs-gallery-design-autocolumns-slide.slide-stretched img{height:100%}.sqs-gallery-design-carousel .sqs-gallery-controls{overflow:hidden}.sqs-gallery-design-carousel .sqs-gallery-controls .next,.sqs-gallery-design-carousel .sqs-gallery-controls .previous{display:block;float:right;position:relative;top:auto;left:auto;right:auto;bottom:auto;margin:0 0 15px 0;padding:0;background-color:transparent;color:inherit !important;font-size:16px;line-height:16px;cursor:pointer}.sqs-gallery-design-carousel .sqs-gallery-controls.show-hover-effect .previous:hover,.sqs-gallery-design-carousel .sqs-gallery-controls.show-hover-effect .next:hover{background-color:transparent;color:#1d1d1d;opacity:1}.sqs-gallery-design-carousel .sqs-gallery-controls.show-hover-effect .sqs-disabled:hover{cursor:default;opacity:.4}.sqs-gallery-design-carousel .sqs-gallery-controls .next:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e02d\";text-align:center;display:inline-block;vertical-align:middle}.sqs-gallery-design-carousel .sqs-gallery-controls .next:before{font-size:32px;width:32px;height:32px;line-height:32px}.sqs-gallery-design-carousel .sqs-gallery-controls .next:before{font-size:16px;width:16px;height:16px;line-height:16px}.sqs-gallery-design-carousel .sqs-gallery-controls .previous{margin-right:10px}.sqs-gallery-design-carousel .sqs-gallery-controls .previous:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e02c\";text-align:center;display:inline-block;vertical-align:middle}.sqs-gallery-design-carousel .sqs-gallery-controls .previous:before{font-size:32px;width:32px;height:32px;line-height:32px}.sqs-gallery-design-carousel .sqs-gallery-controls .previous:before{font-size:16px;width:16px;height:16px;line-height:16px}.sqs-gallery-design-carousel .sqs-gallery-controls .sqs-disabled{cursor:default;opacity:.4}.sqs-gallery-design-carousel .sqs-gallery-controls .sqs-hidden{display:none}.sqs-gallery-design-carousel .sqs-gallery-container{width:100%;overflow:hidden}.sqs-gallery-design-carousel .sqs-gallery{margin:0 0 0 -1% !important;white-space:nowrap;vertical-align:top;font-size:0;-webkit-transition:-webkit-transform .4s ease;-moz-transition:-moz-transform .4s ease;-ms-transition:-ms-transform .4s ease;-o-transition:-o-transform .4s ease;transition:transform .4s ease}.sqs-gallery-design-carousel .sqs-gallery-design-carousel-slide{display:inline-block;width:33.66666666666667%;padding:0 1%;white-space:nowrap;vertical-align:top;font-size:0}.sqs-gallery-design-carousel .sqs-gallery-design-carousel-slide img{width:100%;height:auto}.sqs-gallery-design-carousel .sqs-gallery-design-carousel-slide *{white-space:normal}.sqs-gallery-design-carousel.sqs-gallery-design-carousel-slides-in-view-1 .sqs-gallery-design-carousel-slide{width:101%}.sqs-gallery-design-carousel.sqs-gallery-design-carousel-slides-in-view-2 .sqs-gallery-design-carousel-slide{width:50.5%}.sqs-gallery-design-carousel.sqs-gallery-design-carousel-slides-in-view-3 .sqs-gallery-design-carousel-slide:nth-child(3n+1),.sqs-gallery-design-carousel.sqs-gallery-design-carousel-slides-in-view-3 .sqs-gallery-design-carousel-slide:nth-child(3n+2){width:33.66%}.sqs-gallery-design-carousel.sqs-gallery-design-carousel-slides-in-view-3 .sqs-gallery-design-carousel-slide:nth-child(3n+3){width:33.68%}.sqs-gallery-design-carousel.sqs-gallery-design-carousel-slides-in-view-4 .sqs-gallery-design-carousel-slide{width:25.25%}.sqs-gallery-design-carousel.sqs-gallery-design-carousel-slides-in-view-5 .sqs-gallery-design-carousel-slide{width:20.2%}@media screen and (max-width:724px){.sqs-gallery-design-carousel.sqs-gallery-design-carousel-slides-in-view-4 .sqs-gallery-design-carousel-slide:nth-child(3n+1),.sqs-gallery-design-carousel.sqs-gallery-design-carousel-slides-in-view-4 .sqs-gallery-design-carousel-slide:nth-child(3n+2),.sqs-gallery-design-carousel.sqs-gallery-design-carousel-slides-in-view-5 .sqs-gallery-design-carousel-slide:nth-child(3n+1),.sqs-gallery-design-carousel.sqs-gallery-design-carousel-slides-in-view-5 .sqs-gallery-design-carousel-slide:nth-child(3n+2){width:33.66%}.sqs-gallery-design-carousel.sqs-gallery-design-carousel-slides-in-view-4 .sqs-gallery-design-carousel-slide:nth-child(3n+3),.sqs-gallery-design-carousel.sqs-gallery-design-carousel-slides-in-view-5 .sqs-gallery-design-carousel-slide:nth-child(3n+3){width:33.68%}}@media screen and (max-width:480px){.sqs-gallery-design-carousel.sqs-gallery-design-carousel-slides-in-view-3 .sqs-gallery-design-carousel-slide,.sqs-gallery-design-carousel.sqs-gallery-design-carousel-slides-in-view-4 .sqs-gallery-design-carousel-slide,.sqs-gallery-design-carousel.sqs-gallery-design-carousel-slides-in-view-5 .sqs-gallery-design-carousel-slide{width:50.5% !important}}.sqs-gallery-design-list .sqs-gallery-design-list-slide{overflow:hidden;margin-bottom:17px !important;padding-bottom:17px !important}.sqs-gallery-design-list .sqs-gallery-image-container{float:left;width:25%;padding-right:20px;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box}.sqs-gallery-design-list .sqs-gallery-meta-container{float:left;width:75%;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box}.sqs-gallery-design-list .sqs-gallery-design-list-slide.no-image .sqs-gallery-image-container{width:0 !important}.sqs-gallery-design-list .sqs-gallery-design-list-slide.no-image .sqs-gallery-meta-container{width:100% !important}@media screen and (max-width:480px){.sqs-gallery-design-list .sqs-gallery-design-list-slide:not(.no-image) .sqs-gallery-image-container{width:35% !important}.sqs-gallery-design-list .sqs-gallery-design-list-slide:not(.no-image) .sqs-gallery-meta-container{width:65% !important}}.sqs-gallery-design-autorows .sqs-gallery-design-autorows-slide{float:left;cursor:pointer;overflow:hidden}.sqs-gallery-design-autorows .sqs-gallery-design-autorows-slide img{height:100%}.sqs-gallery-design-autorows .sqs-gallery-design-autorows-slide .meta{display:none}.sqs-gallery-design-autogrid{zoom:1}.sqs-gallery-design-autogrid:after{display:block;visibility:hidden;font-size:0;height:0;clear:both;content:\".\"}.sqs-gallery-design-autogrid-slide{position:relative;float:left}.sqs-gallery-design-autogrid-slide .img-wrapper{height:0}.sqs-gallery-design-autogrid-slide img{width:100%}.yui3-lightbox2{-moz-user-select:text;-webkit-user-select:text;-ms-user-select:text;user-select:text}.yui3-lightbox2 .yui3-lightbox2-content{height:100%;left:0;position:absolute;width:100%;overflow:hidden}.yui3-lightbox2 .sqs-lightbox-slideshow{height:100%;opacity:0;z-index:100000001}.yui3-lightbox2 .sqs-lightbox-slideshow .sqs-lightbox-padder{position:absolute;text-align:left;top:2%;left:2%;bottom:2%;right:2%}.yui3-lightbox2 .sqs-lightbox-overlay{position:absolute;opacity:0;top:0;left:0;background:#000;height:100%;width:100%}.yui3-lightbox2 .sqs-lightbox-meta{position:absolute;padding:20px;color:#fff;z-index:100000001;margin:20px auto 0;-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";opacity:0;-webkit-transition:opacity ease-out .2s;transition:opacity ease-out .2s}.yui3-lightbox2 .sqs-lightbox-meta.overlay-description-visible{background:#000;-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)\";background:rgba(0,0,0,.7);opacity:1 !important}.yui3-lightbox2 .sqs-lightbox-meta p:first-child{margin-top:0}.yui3-lightbox2 .sqs-lightbox-meta p:last-child{margin-bottom:0}.yui3-lightbox2 .sqs-lightbox-meta h1{font-size:1em;color:#fff;margin:0 0 10px}.yui3-lightbox2 .sqs-lightbox-meta p a{color:#fff;text-decoration:underline}.yui3-lightbox2 .sqs-lightbox-close,.yui3-lightbox2 .sqs-lightbox-previous,.yui3-lightbox2 .sqs-lightbox-next,.yui3-lightbox2 .sqs-lightbox-meta-trigger{position:absolute;z-index:100000002;display:inline-block;color:#ccc;height:20px;width:20px;font-size:26px;cursor:pointer;outline:none}.yui3-lightbox2 .sqs-lightbox-next,.yui3-lightbox2 .sqs-lightbox-previous{padding:12px;opacity:0;top:50%;margin-top:-22px;-webkit-transition:opacity .2s;transition:opacity .2s}.yui3-lightbox2 .sqs-lightbox-next.mouseover,.yui3-lightbox2 .sqs-lightbox-previous.mouseover{opacity:1}.yui3-lightbox2 .sqs-lightbox-next{right:2%}.yui3-lightbox2 .sqs-lightbox-next:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e02d\";text-align:center;display:inline-block;vertical-align:middle}.yui3-lightbox2 .sqs-lightbox-next:before{font-size:32px;width:32px;height:32px;line-height:32px}.yui3-lightbox2 .sqs-lightbox-previous{left:2%}.yui3-lightbox2 .sqs-lightbox-previous:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e02c\";text-align:center;display:inline-block;vertical-align:middle}.yui3-lightbox2 .sqs-lightbox-previous:before{font-size:32px;width:32px;height:32px;line-height:32px}.yui3-lightbox2 .sqs-lightbox-next::before,.yui3-lightbox2 .sqs-lightbox-previous::before{font-size:22px}.yui3-lightbox2 .sqs-lightbox-close{padding:2px;right:2%;top:2%;text-align:right}.yui3-lightbox2 .sqs-lightbox-close:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e02e\";text-align:center;display:inline-block;vertical-align:middle}.yui3-lightbox2 .sqs-lightbox-close:before{font-size:32px;width:32px;height:32px;line-height:32px}.yui3-lightbox2 .sqs-lightbox-meta-trigger{bottom:0;right:0;padding:2%;text-align:center;font-size:26px;line-height:.5;text-align:right}body.sqs-lightbox-open{position:static !important;overflow-y:hidden}.sqs-gallery img:not([src]){opacity:0}.fadeable-plugged.display-status-hidden{display:none}.sqs-video-wrapper .intrinsic{max-width:100%}.sqs-video-wrapper.video-none{position:relative}.sqs-video-wrapper.video-fill{position:absolute;width:100%;height:100%}.sqs-video-wrapper.video-fit{position:absolute;width:100%}.sqs-video-wrapper.video-fit .intrinsic{width:100%}.sqs-video-wrapper.video-fit .intrinsic-inner{position:relative}.sqs-video-wrapper iframe{position:absolute;top:0;left:0;width:100%;height:100%}.sqs-video-wrapper object,.sqs-video-wrapper embed{position:absolute;top:0;left:0;width:100%;height:100%}.sqs-video-wrapper .sqs-video-overlay{display:block;position:absolute;top:0;left:0;width:100%;height:100%;background-size:cover;color:#000;background-position:center center;background-repeat:no-repeat}.sqs-video-wrapper .sqs-video-overlay .sqs-video-opaque{position:absolute;bottom:0;width:100%;height:100%;background:#000;opacity:0}.sqs-video-wrapper .sqs-video-overlay.no-thumb .sqs-video-opaque{opacity:1}.sqs-video-wrapper .sqs-video-overlay .sqs-video-icon{opacity:.8;position:absolute;top:50%;left:50%;background-image:url('//static.squarespace.com/universal/images-v6/icons/icon-video-48-light-solid.png');background-position:center center;background-repeat:no-repeat;height:48px;width:48px;margin-left:-24px;margin-top:-24px;cursor:pointer}html.blogapp .sqs-video-wrapper .sqs-video-overlay .sqs-video-icon{background-image:url('gallery-play-big.png');height:80px;width:80px;margin-left:-40px;margin-top:-40px;opacity:.75}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-resolution:192dpi){html.blogapp .sqs-video-wrapper .sqs-video-overlay .sqs-video-icon{background-image:url('gallery-play-big@2x.png');background-size:80px}}.sqs-video-wrapper.video-invalid{position:static !important;height:48px !important}.sqs-video-wrapper .sqs-video-invalid-wrapper{position:absolute;top:0;left:0;width:100%;height:100%;overflow:hidden}.sqs-follow-button-hidden{display:none}body.sqs-search-ui{background:red;overflow:hidden;color:red}body.sqs-search-ui-fullscreen.no-scroll{position:static}.sqs-search-ui-input-box{padding-bottom:10px}body.sqs-search-ui-fullscreen .sqs-search-ui{background:#fff;position:fixed;top:0;left:0;right:0;bottom:0;z-index:100000;padding:100px 100px 50px;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif}body.sqs-search-ui-fullscreen .sqs-search-ui.display-status-hidden{position:absolute}body.sqs-search-ui-fullscreen .sqs-search-ui-close{-webkit-transition:opacity .1s ease-out;transition:opacity .1s ease-out;position:absolute;top:0;right:0;height:60px;width:60px;background:transparent url('//static.squarespace.com/universal/images-v6/icons/icon-closethin-15-dark.png') center center no-repeat;z-index:10100;opacity:.4;cursor:pointer}body.sqs-search-ui-fullscreen .sqs-search-ui-close:hover{opacity:1}body.sqs-search-ui-fullscreen .sqs-search-ui input{position:fixed;top:0;left:0;right:0;margin-left:96px;margin-top:60px;font-weight:500;font-family:inherit}body.sqs-search-ui-fullscreen .sqs-search-ui .yui3-aclist,body.sqs-search-ui-fullscreen .sqs-search-ui .yui3-scrollingautocompletelist{margin-left:96px;font-size:11px;line-height:18px;padding-left:5px;position:fixed;top:130px;left:0;color:#000;background:#fff;width:300px}body.sqs-search-ui-fullscreen .sqs-search-ui .yui3-aclist .yui3-aclist-item,body.sqs-search-ui-fullscreen .sqs-search-ui .yui3-scrollingautocompletelist .yui3-aclist-item{list-style:none;margin-top:2px}body.sqs-search-ui-fullscreen .sqs-search-ui .yui3-aclist .yui3-aclist-item-active,body.sqs-search-ui-fullscreen .sqs-search-ui .yui3-scrollingautocompletelist .yui3-aclist-item-active{outline:none;color:#000;font-weight:bold}body.sqs-search-ui-fullscreen .sqs-search-ui-list{position:absolute;top:200px;left:0;right:0;bottom:0;margin:-1px 85px 0}body.sqs-search-ui-fullscreen .sqs-search-ui-list .search-results{position:absolute;width:100%}body.sqs-search-ui-fullscreen .sqs-search-ui-pagination{display:none}body.sqs-search-ui-fullscreen .sqs-search-ui-item{padding:16px}body.sqs-search-ui-fullscreen .sqs-search-ui-item.active{background-color:#fcfcfc}body.sqs-search-ui-fullscreen .sqs-search-ui-item img{height:50px;width:50px;float:left;margin-right:16px}body.sqs-search-ui-fullscreen .sqs-search-ui-item .sqs-title .record-type{font-weight:200;color:#888;font-size:11px;padding-left:7px;display:none}body.sqs-search-ui-fullscreen .sqs-search-ui-item .sqs-title .edit{-webkit-transition:color,background-color .1s ease-out;transition:color,background-color .1s ease-out;background:#f2f2f2;color:#111;font-size:10px;padding:2px 10px;border-radius:10px;margin-left:6px}body.sqs-search-ui-fullscreen .sqs-search-ui-item .sqs-title .edit:hover{background:#111;color:#fff}@media screen and (max-width:600px){body.sqs-search-ui-fullscreen .sqs-search-ui{padding:8em 2em 0}body.sqs-search-ui-fullscreen .sqs-search-ui input{margin-left:1em}body.sqs-search-ui-fullscreen .sqs-search-ui .yui3-aclist,body.sqs-search-ui-fullscreen .sqs-search-ui .yui3-scrollingautocompletelist{display:none}body.sqs-search-ui-fullscreen .sqs-search-ui-list{top:150px;margin:0 2em}}.sqs-search-container .search-notice{font-size:12px;color:#000}.sqs-search-container .search-notice.error{color:#d10000}.sqs-search-container .search-notice.hide{display:none}.sqs-search-container-waiting{background:#fff;height:100%;width:100%;position:absolute;opacity:.5}.sqs-search-container a{color:#999;text-decoration:none}.sqs-search-container input{background:none;border:none;outline:none;font-size:30px}.sqs-search-container input::-webkit-input-placeholder{color:#eee}.sqs-search-container input:-moz-placeholder{color:#eee}.sqs-search-container input::selection{color:#fff;background-color:#000}.sqs-search-container input:focus{box-shadow:none;border:none}.sqs-search-container-list{overflow-y:auto;overflow-x:hidden}.sqs-search-container-list .search-results{border-top:1px solid rgba(200,200,200,.35);border-bottom:1px solid rgba(200,200,200,.35)}.sqs-search-container-list .search-results.empty{border:none}.search-result:first-child .sqs-search-container-item{border-top:none}.sqs-search-container-item{position:relative;border-top:1px solid rgba(200,200,200,.35);zoom:1;cursor:pointer}.sqs-search-container-item:after{display:block;visibility:hidden;font-size:0;height:0;clear:both;content:\".\"}.sqs-search-container-item:first-child{margin-top:0}.sqs-search-container-item mark{font-weight:bold}.sqs-search-container-item em{font-style:italic}.sqs-search-container-item .sqs-title{font-size:1.5em;font-weight:400;line-height:1.3em;margin-bottom:.5em}.sqs-search-container-item .sqs-content{font-weight:400;font-size:1em;line-height:1.4em}.sqs-search-container-item .sqs-content span{margin:2px 0}.sqs-search-container .loading{opacity:.75}.sqs-search-container .loading .desc{display:block;float:left;padding-top:4px;padding-left:12px}.sqs-search-container .loading .spinner-wrapper{display:block;float:left}@media screen and (max-width:600px){.sqs-search-container-list{top:160px}.sqs-search-container-list .search-results{margin-right:0px}.sqs-search-container input{font-size:24px !important}}.sqs-ss-badge{position:fixed;height:44px;overflow:hidden;border-radius:44px;width:44px;background:#000;opacity:0;cursor:pointer;z-index:10001;-webkit-transition:all .4s cubic-bezier(.23,1,.32,1);transition:all .4s cubic-bezier(.23,1,.32,1)}.sqs-ss-badge-content{white-space:nowrap}.sqs-ss-badge .badge-closed,.sqs-ss-badge .badge-open{display:inline-block;vertical-align:top;height:44px;-webkit-transform:scale(1) translatez(0);-moz-transform:scale(1) translatez(0);-ms-transform:scale(1) translatez(0);transform:scale(1) translatez(0);-webkit-transition:all .4s cubic-bezier(.23,1,.32,1);transition:all .4s cubic-bezier(.23,1,.32,1)}.sqs-ss-badge .badge-closed{width:44px;background:transparent url('//static.squarespace.com/universal/images-v6/icons/icon-squarespace-16-light.png') center center no-repeat}.sqs-ss-badge .badge-open{width:0;opacity:0}.sqs-ss-badge .badge-open .badge-open-inner{white-space:nowrap}.sqs-ss-badge .badge-open .badge-open-inner h2{color:#e2e2e2 !important;font:300 10px 'proxima-nova','HelveticaNeue-Light','Helvetica Neue Light','Helvetica Neue',Helvetica,Arial,'Lucida Grande',sans-serif !important;line-height:44px !important;letter-spacing:1px;text-transform:uppercase;margin:0 !important}.sqs-ss-badge[data-position=\"top-left\"]{top:22px;left:22px}.sqs-ss-badge[data-position=\"top-center\"]{right:0;top:20px;left:0;margin:auto;-webkit-transform:translatey(-100px);-moz-transform:translatey(-100px);-ms-transform:translatey(-100px);transform:translatey(-100px)}.sqs-ss-badge[data-position=\"top-right\"]{top:22px;right:22px}.sqs-ss-badge[data-position=\"bottom-left\"]{bottom:22px;left:22px}.sqs-ss-badge[data-position=\"bottom-center\"]{right:0;bottom:20px;left:0;margin:auto}.sqs-ss-badge[data-position=\"bottom-right\"]{right:22px;bottom:22px}.sqs-ss-badge.badge-auto-hide[data-position=\"top-left\"],.sqs-ss-badge.badge-auto-hide[data-position=\"top-center\"],.sqs-ss-badge.badge-auto-hide[data-position=\"top-right\"]{-webkit-transform:translatey(-100px);-moz-transform:translatey(-100px);-ms-transform:translatey(-100px);transform:translatey(-100px)}.sqs-ss-badge.badge-auto-hide[data-position=\"bottom-left\"],.sqs-ss-badge.badge-auto-hide[data-position=\"bottom-center\"],.sqs-ss-badge.badge-auto-hide[data-position=\"bottom-right\"]{-webkit-transform:translatey(100px);-moz-transform:translatey(100px);-ms-transform:translatey(100px);transform:translatey(100px)}.sqs-ss-badge.is-mobile[data-devices=\"desktop-only\"]{display:none}.sqs-ss-badge[data-type=\"white\"]{background:#fff}.sqs-ss-badge[data-type=\"white\"] .badge-open .badge-open-inner h2{color:#111 !important}.sqs-ss-badge[data-type=\"white\"] .badge-closed{background-image:url(\"//static.squarespace.com/universal/images-v6/icons/icon-squarespace-16-dark.png\")}.sqs-ss-badge.badge-visible{opacity:1;-webkit-transform:translatez(0) !important;-moz-transform:translatez(0) !important;-ms-transform:translatez(0) !important;transform:translatez(0) !important}.sqs-ss-badge:not(.is-mobile):hover{width:220px;border-radius:0}.sqs-ss-badge:not(.is-mobile):hover .badge-open{transform:none;opacity:1}.sqs-ss-badge-mobile-info-bar-present[data-position=\"bottom-left\"],.sqs-ss-badge-mobile-info-bar-present[data-position=\"bottom-center\"],.sqs-ss-badge-mobile-info-bar-present[data-position=\"bottom-right\"]{bottom:72px}.sqs-ss-badge:not(.is-mobile):hover+.sqs-ss-badge-cover{visibility:visible;opacity:1}.sqs-ss-badge[data-position=\"top-left\"]+.sqs-ss-badge-cover{background:-moz-radial-gradient(top left,circle cover,rgba(0,0,0,.1) 0%,rgba(0,0,0,.5) 100%);background:-ms-radial-gradient(top left,circle cover,rgba(0,0,0,.1) 0%,rgba(0,0,0,.5) 100%);background:radial-gradient(circle at top left,rgba(0,0,0,.1) 0%,rgba(0,0,0,.5) 100%)}.sqs-ss-badge[data-position=\"top-center\"]+.sqs-ss-badge-cover{background:-moz-radial-gradient(top center,circle cover,rgba(0,0,0,.1) 0%,rgba(0,0,0,.5) 100%);background:-ms-radial-gradient(top center,circle cover,rgba(0,0,0,.1) 0%,rgba(0,0,0,.5) 100%);background:radial-gradient(circle at top center,rgba(0,0,0,.1) 0%,rgba(0,0,0,.5) 100%)}.sqs-ss-badge[data-position=\"top-right\"]+.sqs-ss-badge-cover{background:-moz-radial-gradient(top right,circle cover,rgba(0,0,0,.1) 0%,rgba(0,0,0,.5) 100%);background:-ms-radial-gradient(top right,circle cover,rgba(0,0,0,.1) 0%,rgba(0,0,0,.5) 100%);background:radial-gradient(circle at top right,rgba(0,0,0,.1) 0%,rgba(0,0,0,.5) 100%)}.sqs-ss-badge[data-position=\"bottom-left\"]+.sqs-ss-badge-cover{background:-moz-radial-gradient(bottom left,circle cover,rgba(0,0,0,.1) 0%,rgba(0,0,0,.5) 100%);background:-ms-radial-gradient(bottom left,circle cover,rgba(0,0,0,.1) 0%,rgba(0,0,0,.5) 100%);background:radial-gradient(circle at bottom left,rgba(0,0,0,.1) 0%,rgba(0,0,0,.5) 100%)}.sqs-ss-badge[data-position=\"bottom-center\"]+.sqs-ss-badge-cover{background:-moz-radial-gradient(bottom center,circle cover,rgba(0,0,0,.1) 0%,rgba(0,0,0,.5) 100%);background:-ms-radial-gradient(bottom center,circle cover,rgba(0,0,0,.1) 0%,rgba(0,0,0,.5) 100%);background:radial-gradient(circle at bottom center,rgba(0,0,0,.1) 0%,rgba(0,0,0,.5) 100%)}.sqs-ss-badge[data-position=\"bottom-right\"]+.sqs-ss-badge-cover{background:-moz-radial-gradient(bottom right,circle cover,rgba(0,0,0,.1) 0%,rgba(0,0,0,.5) 100%);background:-ms-radial-gradient(bottom right,circle cover,rgba(0,0,0,.1) 0%,rgba(0,0,0,.5) 100%);background:radial-gradient(circle at bottom right,rgba(0,0,0,.1) 0%,rgba(0,0,0,.5) 100%)}body.sqs-style-mode[data-position=\"top-left\"]{top:22px;left:242px}body.sqs-style-mode[data-position=\"bottom-left\"]{bottom:22px;left:242px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dppx){.sqs-ss-badge .badge-closed{background-size:16px;background-image:url(\"//static.squarespace.com/universal/images-v6/icons/icon-squarespace-32-light.png\")}.sqs-ss-badge[data-type=\"white\"] .badge-closed{background-image:url(\"//static.squarespace.com/universal/images-v6/icons/icon-squarespace-32-dark.png\")}}.sqs-ss-badge-cover{position:fixed;width:100%;height:100%;top:0;left:0;opacity:0;visibility:hidden;background-color:rgba(0,0,0,.6);z-index:10000;-webkit-transition:all .3s ease;transition:all .3s ease}.sqs-licensed-asset-preview-bar{z-index:9999;position:fixed;left:0;right:0;bottom:0;height:88px;background-color:#3e3e3e;color:#fff;padding:11px;box-sizing:border-box}.sqs-licensed-asset-preview-bar-content{text-align:center;position:absolute;top:50%;width:100%;-webkit-transform:translate(0,-50%);-moz-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%)}.sqs-licensed-asset-preview-bar-content span{font-family:helvetica,sans-serif;text-transform:uppercase;letter-spacing:1px;font-weight:500;font-size:11px}.sqs-mobile-info-bar{position:fixed;z-index:10000;bottom:0;left:0;width:100%;background:#ebebeb;-webkit-transition:all .2s cubic-bezier(.23,.47,.32,1);transition:all .2s cubic-bezier(.23,.47,.32,1)}.sqs-mobile-info-bar-content{-webkit-backface-visibility:hidden}.sqs-mobile-info-bar-triggers{font-size:0;padding:0 20px;text-align:center}.sqs-mobile-info-bar-trigger{cursor:pointer;display:inline-block;width:25%;padding:15px 0;text-align:center}.sqs-mobile-info-bar-trigger a{display:block}.sqs-mobile-info-bar-trigger-icon{display:block;width:16px;height:16px;margin:0 auto 8px auto;background-size:contain;background-repeat:no-repeat}.sqs-mobile-info-bar-trigger-label{display:block;font-size:10px;line-height:1em;letter-spacing:1px;color:#222;text-transform:uppercase;font-family:'proxima-nova',arial,sans-serif}.sqs-mobile-info-bar-trigger[data-type=\"location\"] .sqs-mobile-info-bar-trigger-icon{background-image:url(//static.squarespace.com/universal/images-v6/mobile-info-bar/map.png)}.sqs-mobile-info-bar-trigger[data-type=\"contactEmail\"] .sqs-mobile-info-bar-trigger-icon{background-image:url(//static.squarespace.com/universal/images-v6/mobile-info-bar/email.png)}.sqs-mobile-info-bar-trigger[data-type=\"contactPhoneNumber\"] .sqs-mobile-info-bar-trigger-icon{background-image:url(//static.squarespace.com/universal/images-v6/mobile-info-bar/call.png)}.sqs-mobile-info-bar-trigger[data-type=\"businessHours\"] .sqs-mobile-info-bar-trigger-icon{background-image:url(//static.squarespace.com/universal/images-v6/mobile-info-bar/hours.png)}.sqs-mobile-info-bar-overlay{visibility:hidden;position:fixed;top:0;left:0;width:100%;height:100%;opacity:0;background:#ebebeb;color:#222;-webkit-transition:opacity .2s cubic-bezier(.23,.47,.32,1);transition:opacity .2s cubic-bezier(.23,.47,.32,1)}.sqs-mobile-info-bar-overlay-content,.sqs-mobile-info-bar-overlay-content>div{position:absolute !important;top:0;left:0;width:100%;height:100%}.sqs-mobile-info-bar-overlay-content>div{display:none}.sqs-mobile-info-bar-overlay-content .sqs-business-hours{top:10%;left:10%;width:80%;height:80%}.sqs-mobile-info-bar-overlay-content .sqs-mobile-info-bar-map{top:0;left:0;width:100%;height:100%}.sqs-mobile-info-bar-overlay-content .sqs-mobile-info-bar-address{position:absolute;width:100%;height:auto;color:#aaa;background:#ebebeb;bottom:0;padding:20px;font-size:12px;line-height:19px;font-family:'proxima-nova',arial,sans-serif;box-sizing:border-box}.sqs-mobile-info-bar-overlay-content .sqs-mobile-info-bar-address [data-type=\"addressTitle\"]{color:#222;font-size:14px;line-height:14px;margin:2px 0 7px 0}.sqs-mobile-info-bar-overlay-content .sqs-mobile-info-bar-address-link{background:url(//static.squarespace.com/universal/images-v6/icons/icon-external-link-18-dark.png) no-repeat;position:absolute;width:18px;height:18px;top:50%;right:20px;margin-top:-9px}.sqs-mobile-info-bar-overlay-close{cursor:pointer;position:fixed;background:#ebebeb;top:10px;right:10px;padding:13px}.sqs-mobile-info-bar-overlay-close:after{content:'×';display:block;font-family:helvetica,arial,sans-serif;font-weight:100;font-size:19px;line-height:15px;padding:0;color:#222}.sqs-mobile-info-bar-show-overlay{z-index:10010}.sqs-mobile-info-bar-show-overlay .sqs-mobile-info-bar-overlay{opacity:1;visibility:visible}.sqs-mobile-info-bar-dark{background:#222}.sqs-mobile-info-bar-dark .sqs-mobile-info-bar-overlay{background:#222;color:#fff}.sqs-mobile-info-bar-dark .sqs-mobile-info-bar-address{background:#222}.sqs-mobile-info-bar-dark .sqs-mobile-info-bar-address [data-type=\"addressTitle\"]{color:#fff}.sqs-mobile-info-bar-dark .sqs-mobile-info-bar-address-link{background-image:url(//static.squarespace.com/universal/images-v6/icons/icon-external-link-18-light.png)}.sqs-mobile-info-bar-dark .sqs-mobile-info-bar-trigger-label{color:#fff}.sqs-mobile-info-bar-dark .sqs-mobile-info-bar-trigger[data-type=\"location\"] .sqs-mobile-info-bar-trigger-icon{background-image:url(//static.squarespace.com/universal/images-v6/mobile-info-bar/map-light.png)}.sqs-mobile-info-bar-dark .sqs-mobile-info-bar-trigger[data-type=\"contactEmail\"] .sqs-mobile-info-bar-trigger-icon{background-image:url(//static.squarespace.com/universal/images-v6/mobile-info-bar/email-light.png)}.sqs-mobile-info-bar-dark .sqs-mobile-info-bar-trigger[data-type=\"contactPhoneNumber\"] .sqs-mobile-info-bar-trigger-icon{background-image:url(//static.squarespace.com/universal/images-v6/mobile-info-bar/call-light.png)}.sqs-mobile-info-bar-dark .sqs-mobile-info-bar-trigger[data-type=\"businessHours\"] .sqs-mobile-info-bar-trigger-icon{background-image:url(//static.squarespace.com/universal/images-v6/mobile-info-bar/hours-light.png)}.sqs-mobile-info-bar-dark .sqs-mobile-info-bar-overlay-close,.sqs-mobile-info-bar-overlay-close-dark{background:#222}.sqs-mobile-info-bar-dark .sqs-mobile-info-bar-overlay-close:after,.sqs-mobile-info-bar-overlay-close-dark:after{color:#fff}.sqs-style-mode .sqs-mobile-info-bar,.sqs-mobile-info-bar-hide{-webkit-transform:translate3d(0,100px,0);-moz-transform:translate3d(0,100px,0);-ms-transform:translate3d(0,100px,0);transform:translate3d(0,100px,0)}.sqs-business-hours{max-width:250px;margin-left:auto;margin-right:auto}.sqs-business-hours-day{margin:.5em 0;font-family:'proxima-nova',sans-serif;font-size:16px;line-height:1.4;font-style:normal;letter-spacing:1px;zoom:1}.sqs-business-hours-day-label{color:#aaa;float:left;position:relative;top:2px;width:35%;margin-right:10%;font-size:13px;text-transform:uppercase;text-align:right}.sqs-business-hours-day-hours{float:right;width:55%}.sqs-business-hours-day .closed{color:#999}.sqs-business-hours-day:after{display:block;visibility:hidden;font-size:0;height:0;clear:both;content:\".\"}.sqs-business-hours-store{text-align:center;margin:1em 0 3em 0;color:#aaa;font-family:'proxima-nova',sans-serif;font-size:16px;line-height:1.65}.sqs-business-hours-store span{text-transform:uppercase;letter-spacing:2px;color:#222;font-size:20px}.sqs-business-hours-dark .sqs-business-hours-store span{color:#fff}/*IE9_SPLIT_MARKER*/\n\n/*! Squarespace LESS Compiler  (less.js language v1.3.3)  */\n.sqs-block.vsize-1 .sqs-block-content{height:34px}.sqs-block.vsize-2 .sqs-block-content{height:68px}.sqs-block.vsize-3 .sqs-block-content{height:102px}.sqs-block.vsize-4 .sqs-block-content{height:136px}.sqs-block.vsize-5 .sqs-block-content{height:170px}.sqs-block.vsize-6 .sqs-block-content{height:204px}.sqs-block.vsize-7 .sqs-block-content{height:238px}.sqs-block.vsize-8 .sqs-block-content{height:272px}.sqs-block.vsize-9 .sqs-block-content{height:306px}.sqs-block.vsize-10 .sqs-block-content{height:340px}.sqs-block.vsize-11 .sqs-block-content{height:374px}.sqs-block.vsize-12 .sqs-block-content{height:408px}.sqs-block.vsize-13 .sqs-block-content{height:442px}.sqs-block.vsize-14 .sqs-block-content{height:476px}.sqs-block.vsize-15 .sqs-block-content{height:510px}.sqs-block.vsize-16 .sqs-block-content{height:544px}.sqs-block.vsize-17 .sqs-block-content{height:578px}.sqs-block.vsize-18 .sqs-block-content{height:612px}.sqs-block.vsize-19 .sqs-block-content{height:646px}.sqs-block.vsize-20 .sqs-block-content{height:680px}.sqs-block.vsize-21 .sqs-block-content{height:714px}.sqs-block.vsize-22 .sqs-block-content{height:748px}.sqs-block.vsize-23 .sqs-block-content{height:782px}.sqs-block.vsize-24 .sqs-block-content{height:816px}.sqs-block.vsize-25 .sqs-block-content{height:850px}.sqs-block.vsize-26 .sqs-block-content{height:884px}.sqs-block.vsize-27 .sqs-block-content{height:918px}.sqs-block.vsize-28 .sqs-block-content{height:952px}.sqs-block.vsize-29 .sqs-block-content{height:986px}.sqs-block.vsize-30 .sqs-block-content{height:1020px}.sqs-row{width:auto !important;*zoom:1}.sqs-row:before,.sqs-row:after{content:\"\";display:table}.sqs-row:after{clear:both}[class*=sqs-col]{float:left}[class*=sqs-col] .sqs-block{padding-left:17px;padding-right:17px}[class*=sqs-col]:last-child{padding-right:0}.sqs-col-12{width:100%}.sqs-col-12 .sqs-col-12{width:100%}.sqs-col-12 .sqs-col-11{width:91.6667%}.sqs-col-12 .sqs-col-10{width:83.3333%}.sqs-col-12 .sqs-col-9{width:75%}.sqs-col-12 .sqs-col-8{width:66.6667%}.sqs-col-12 .sqs-col-7{width:58.3333%}.sqs-col-12 .sqs-col-6{width:50%}.sqs-col-12 .sqs-col-5{width:41.6667%}.sqs-col-12 .sqs-col-4{width:33.3333%}.sqs-col-12 .sqs-col-3{width:25%}.sqs-col-12 .sqs-col-2{width:16.6667%}.sqs-col-12 .sqs-col-1{width:8.3333%}.sqs-col-11{width:91.6667%}.sqs-col-11 .sqs-col-11{width:100%}.sqs-col-11 .sqs-col-10{width:90.9091%}.sqs-col-11 .sqs-col-9{width:81.8182%}.sqs-col-11 .sqs-col-8{width:72.7273%}.sqs-col-11 .sqs-col-7{width:63.6364%}.sqs-col-11 .sqs-col-6{width:54.5455%}.sqs-col-11 .sqs-col-5{width:45.4545%}.sqs-col-11 .sqs-col-4{width:36.3636%}.sqs-col-11 .sqs-col-3{width:27.2727%}.sqs-col-11 .sqs-col-2{width:18.1818%}.sqs-col-11 .sqs-col-1{width:9.0909%}.sqs-col-10{width:83.3333%}.sqs-col-10 .sqs-col-10{width:100%}.sqs-col-10 .sqs-col-9{width:90%}.sqs-col-10 .sqs-col-8{width:80%}.sqs-col-10 .sqs-col-7{width:70%}.sqs-col-10 .sqs-col-6{width:60%}.sqs-col-10 .sqs-col-5{width:50%}.sqs-col-10 .sqs-col-4{width:40%}.sqs-col-10 .sqs-col-3{width:30%}.sqs-col-10 .sqs-col-2{width:20%}.sqs-col-10 .sqs-col-1{width:10%}.sqs-col-9{width:75%}.sqs-col-9 .sqs-col-9{width:100%}.sqs-col-9 .sqs-col-8{width:88.8889%}.sqs-col-9 .sqs-col-7{width:77.7778%}.sqs-col-9 .sqs-col-6{width:66.6667%}.sqs-col-9 .sqs-col-5{width:55.5556%}.sqs-col-9 .sqs-col-4{width:44.4444%}.sqs-col-9 .sqs-col-3{width:33.3333%}.sqs-col-9 .sqs-col-2{width:22.2222%}.sqs-col-9 .sqs-col-1{width:11.1111%}.sqs-col-8{width:66.6667%}.sqs-col-8 .sqs-col-8{width:100%}.sqs-col-8 .sqs-col-7{width:87.5%}.sqs-col-8 .sqs-col-6{width:75%}.sqs-col-8 .sqs-col-5{width:62.5%}.sqs-col-8 .sqs-col-4{width:50%}.sqs-col-8 .sqs-col-3{width:37.5%}.sqs-col-8 .sqs-col-2{width:25%}.sqs-col-8 .sqs-col-1{width:12.5%}.sqs-col-7{width:58.3333%}.sqs-col-7 .sqs-col-7{width:100%}.sqs-col-7 .sqs-col-6{width:85.7143%}.sqs-col-7 .sqs-col-5{width:71.4286%}.sqs-col-7 .sqs-col-4{width:57.1429%}.sqs-col-7 .sqs-col-3{width:42.8571%}.sqs-col-7 .sqs-col-2{width:28.5714%}.sqs-col-7 .sqs-col-1{width:14.2857%}.sqs-col-6{width:50%}.sqs-col-6 .sqs-col-6{width:100%}.sqs-col-6 .sqs-col-5{width:83.3333%}.sqs-col-6 .sqs-col-4{width:66.6667%}.sqs-col-6 .sqs-col-3{width:50%}.sqs-col-6 .sqs-col-2{width:33.3333%}.sqs-col-6 .sqs-col-1{width:16.6667%}.sqs-col-5{width:41.6667%}.sqs-col-5 .sqs-col-5{width:100%}.sqs-col-5 .sqs-col-4{width:80%}.sqs-col-5 .sqs-col-3{width:60%}.sqs-col-5 .sqs-col-2{width:40%}.sqs-col-5 .sqs-col-1{width:20%}.sqs-col-4{width:33.3333%}.sqs-col-4 .sqs-col-4{width:100%}.sqs-col-4 .sqs-col-3{width:75%}.sqs-col-4 .sqs-col-2{width:50%}.sqs-col-4 .sqs-col-1{width:25%}.sqs-col-3{width:25%}.sqs-col-3 .sqs-col-3{width:100%}.sqs-col-3 .sqs-col-2{width:66.6667%}.sqs-col-3 .sqs-col-1{width:33.3333%}.sqs-col-2{width:16.6667%}.sqs-col-2 .sqs-col-2{width:100%}.sqs-col-2 .sqs-col-1{width:50%}.sqs-col-1{width:8.3333%}.sqs-col-1 .sqs-col-1{width:100%}.sqs-layout > .sqs-row{margin-left:-17px;margin-right:-17px}.sqs-layout:not(.sqs-editing) .sqs-row .sqs-block:not(.float):first-child{padding-top:0}.sqs-layout:not(.sqs-editing) .sqs-block+.sqs-row .sqs-block:not(.float):first-child{padding-top:17px}.sqs-layout:not(.sqs-editing) .sqs-row+.sqs-row .sqs-block:not(.float):first-child{padding-top:17px}.sqs-layout:not(.sqs-editing)>.sqs-row:first-child>[class*=sqs-col]:first-child>.sqs-block:last-child,.sqs-layout:not(.sqs-editing) .sqs-block+.sqs-row .sqs-block:not(.float):last-child{padding-bottom:17px}.sqs-layout:not(.sqs-editing) .sqs-row+.sqs-row:not(:last-child) .sqs-block:last-child{padding-bottom:17px}.sqs-block.sized .sqs-block-content{overflow:hidden}.text-align-center{text-align:center}.text-align-right{text-align:right}.columns-1 [class*=sqs-col-]{width:100% !important}.sqs-block .state-message,.sqs-state-message{font:400 normal 12px / 22px 'Gotham SSm A','Gotham SSm B','Gotham SSm','Gotham','Proxima Nova','Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;letter-spacing:normal;padding:19px;padding-left:60px;color:#3e3e3e;position:relative;background-color:rgba(128,128,128,.15000000000000002)}.sqs-block .state-message:after,.sqs-state-message:after{content:\" \";position:absolute;top:0;left:0;height:60px;width:60px;background:transparent url(/universal/images-v6/icons/block-indicator-dark.png) no-repeat center}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:1.5dppx){.sqs-block .state-message:after,.sqs-state-message:after{background-image:url('/universal/images-v6/icons/block-indicator-dark@2x.png');background-size:22px}}.sqs-block .state-message.information,.sqs-state-message.information{background:#222;padding:30px 20px;text-align:center;color:#999;font-size:11px}.sqs-block .state-message .title,.sqs-state-message .title{padding-bottom:8px;font-size:14px}html.cameron .sqs-block .state-message .title,html.cameron .sqs-state-message .title{color:#eee}.sqs-block .state-message>.sqs-state-message-button,.sqs-state-message>.sqs-state-message-button,.sqs-block .state-message .sqs-state-message-buttons-wrapper,.sqs-state-message .sqs-state-message-buttons-wrapper{margin-top:19px;margin-left:-41px;display:block !important;position:relative}.sqs-block .state-message .sqs-state-message-button,.sqs-state-message .sqs-state-message-button{cursor:pointer;outline:none;background:#3e3e3e;padding:11px;-webkit-transition:background-color .1s ease-in-out;-moz-transition:background-color .1s ease-in-out;-ms-transition:background-color .1s ease-in-out;-o-transition:background-color .1s ease-in-out;transition:background-color .1s ease-in-out;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;font-family:inherit;-webkit-appearance:none;-moz-appearance:none;appearance:none;line-height:22px;text-align:center;display:inline-block;position:relative}.sqs-block .state-message .sqs-state-message-button,.sqs-state-message .sqs-state-message-button,.sqs-block .state-message .sqs-state-message-button>*,.sqs-state-message .sqs-state-message-button>*{color:#fff !important;-webkit-appearance:none;border:0;text-transform:uppercase;outline:none;font-size:11px;font-weight:500}.sqs-block .state-message .sqs-state-message-button:hover,.sqs-state-message .sqs-state-message-button:hover{background-color:#000;box-shadow:none}.sqs-layout.sqs-editing .sqs-block .sqs-block .state-message .sqs-state-message-button,.sqs-layout.sqs-editing .sqs-block .sqs-state-message .sqs-state-message-button{z-index:1001}.sqs-col-0{width:0;display:none}.sqs-block{position:relative;height:auto;outline:1px solid transparent;-webkit-transition:box-shadow .1s ease-in-out;-moz-transition:box-shadow .1s ease-in-out;-ms-transition:box-shadow .1s ease-in-out;-o-transition:box-shadow .1s ease-in-out;transition:box-shadow .1s ease-in-out;padding-top:17px;padding-bottom:17px}.sqs-block:not(.sqs-block-html):not(.sqs-block-markdown){clear:both}.sqs-layout.sqs-editing .sqs-block.sqs-block-focused:not(.sqs-block-html),.sqs-layout.sqs-editing .sqs-block.sqs-block-editing:not(.sqs-block-html),html:not(.blogapp) .sqs-layout.sqs-editing .sqs-block.sqs-block.sqs-selected,html:not(.blogapp) .sqs-layout.sqs-editing .sqs-block.sqs-block-editable:hover,.sqs-layout.sqs-editing .sqs-block.sqs-confirmation-open{box-shadow:inset 0 0 0 1px rgba(0,0,0,.1)}.sqs-layout.sqs-editing .sqs-block.sqs-block-focused.sqs-block-html:hover,.sqs-layout.sqs-editing .sqs-block.sqs-block.sqs-selected.sqs-block-html.sqs-block-editing{box-shadow:none !important}.sqs-layout.sqs-editing .sqs-block.sqs-dd-dragging,.sqs-layout.sqs-editing .sqs-block.yui3-dd-dragging{z-index:9995 !important;opacity:.3;-webkit-transition:opacity .15s ease-in-out, -webkit-transform .15s ease-in-out;-moz-transition:opacity .15s ease-in-out, -webkit-transform .15s ease-in-out;-ms-transition:opacity .15s ease-in-out, -webkit-transform .15s ease-in-out;-o-transition:opacity .15s ease-in-out, -webkit-transform .15s ease-in-out;transition:opacity .15s ease-in-out, -webkit-transform .15s ease-in-out;box-sizing:border-box}.sqs-block iframe.embedded-scripts-preview{display:block;position:relative;border:0}.sqs-block .removed-script{display:block;opacity:.6}.sqs-block .removed-script::before{content:'Script Disabled';font-style:italic}html.blogapp .sqs-block{-webkit-transition:none !important;-moz-transition:none !important;-ms-transition:none !important;-o-transition:none !important;transition:none !important}html .sqs-block.sqs-block-editable:not(.sqs-block-editing){cursor:url(/universal/images-v6/grab.cur) 8 8,move;cursor:-webkit-grab;cursor:-moz-grab}html .sqs-block.sqs-block-editable:not(.sqs-block-editing) .sqs-dd-invalid-handle{cursor:default}html.sqs-dragging-block *{cursor:url(/universal/images-v6/grabbing.cur) 8 8,move;cursor:-webkit-grabbing;cursor:-moz-grabbing}html .sqs-locked-layout .sqs-block{cursor:default !important}html .sqs-block.sqs-block-html .sqs-block-content{cursor:auto}.sqs-block.sqs-block-code img{max-width:100%}.sqs-block-hidden{height:0;overflow:hidden}.yui3-overlay-hidden{display:none}.sqs-editing-overlay{position:absolute;top:0;left:0;right:0;bottom:0;z-index:1000;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.sqs-locked-height .sqs-editing-overlay{background-color:rgba(255,255,255,.5)}html.browser-msie .sqs-editing-overlay{background-color:rgba(128,128,128,.05)}body.sqs-dragging .sqs-layout .sqs-content-overlay{display:block !important}.sqs-content-overlay{position:absolute;left:0;width:100%}[class*=aspect-overlay]{padding-bottom:20px;position:absolute}[class*=aspect-overlay] .yui3-overlay-content{background:rgba(0,0,0,.9);color:#fff;font:12px/24px 'Helvetica Neue',Helvetica,Arial,sans-serif;text-align:center;width:50px;border-radius:5px}.sqs-block .yui3-resize-handle{display:none;position:absolute;height:50px;width:50px}.sqs-block .yui3-resize-handles-wrapper{z-index:10}.sqs-block .yui3-resize-handle-inner{position:absolute;top:50%;left:50%;margin-top:-7px;margin-left:-7px;height:13px;width:13px;border-radius:100px;background-color:grey}.sqs-block .yui3-resize-handle-b{margin-bottom:-25px;margin-left:-25px;bottom:-1px;left:50%;cursor:row-resize}.sqs-block .yui3-resize-handle-l{left:0;top:0;bottom:0;width:10px;cursor:col-resize}.sqs-block .yui3-resize-handle-r{right:0;top:0;bottom:0;width:10px;cursor:col-resize}.sqs-block .yui3-resize-handle.sqs-dd-dragging .yui3-resize-handle,.sqs-block .yui3-resize-handle.yui3-dd-dragging .yui3-resize-handle{display:none}.sqs-block[class*=focused] .yui3-resize-handle,.sqs-block.sqs-block-editing .yui3-resize-handle{display:block;z-index:9999}.sqs-block[class*=float]{z-index:10 !important;box-sizing:border-box;clear:none}.sqs-block[class*=float-left]{float:left;margin-right:17px}.sqs-block[class*=float-left]+ .sqs-block[class*=float-left]{clear:left}.sqs-block[class*=float-right]{float:right;margin-left:17px}.sqs-block[class*=float-right]+ .sqs-block[class*=float-right]{clear:right}.sqs-remove-button{position:absolute !important;border-radius:100px;background:#111 url('icon_close_14_light.png') center center no-repeat;background-size:7px;cursor:pointer}body.sqs-index .sqs-remove-button{background:#111 url('/universal/images-v6/icons/icon_close_14_light.png') center center no-repeat}.sqs-block-error{padding-top:12px;padding-bottom:12px}.sqs-block-error .sqs-block-content{border:1px solid #ddd;background:#eee;color:#333}html.blogapp .sqs-block-error{padding-top:17px;padding-bottom:17px}html.blogapp .sqs-block-error .sqs-block-content{padding:6px 12px}html.blogapp .sqs-state-message,html.blogapp .state-message{display:block;border:1px solid #ddd;padding:6px 12px;background:#eee;text-align:center;color:#333}.sqs-block .sqs-intrinsic{position:relative !important}.sqs-block .sqs-intrinsic .sqs-intrinsic-content{position:absolute !important;top:0;left:0;height:100%;max-width:none;width:100%}@font-face{font-family:'squarespace-ui-font';src:url('//static.squarespace.com/universal/fonts/squarespace-ui-font.eot');src:url('//static.squarespace.com/universal/fonts/squarespace-ui-font.eot?#iefix') format('embedded-opentype'),url('//static.squarespace.com/universal/fonts/squarespace-ui-font.svg#squarespace-ui-font') format('svg'),url('//static.squarespace.com/universal/fonts/squarespace-ui-font.woff') format('woff'),url('//static.squarespace.com/universal/fonts/squarespace-ui-font.ttf') format('truetype');font-weight:normal;font-style:normal}.sqs-ui-font-family{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased}[class^=\"sqs-ui-font-\"]:before,[class*=\" sqs-ui-font-\"]:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased}[data-icon]:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:attr(data-icon)}#list-paging a,#item-paging a{text-decoration:none}#list-paging a.newer .pagination-icon:before,#item-paging a.newer .pagination-icon:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e000\";text-align:center;display:inline-block;vertical-align:middle}#list-paging a.newer .pagination-icon:before,#item-paging a.newer .pagination-icon:before{font-size:16px;width:16px;height:16px;line-height:16px}#list-paging a.newer .pagination-icon:before,#item-paging a.newer .pagination-icon:before{font-size:inherit;width:16px;height:16px;line-height:16px}#list-paging a.older .pagination-icon:after,#item-paging a.older .pagination-icon:after{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e003\";text-align:center;display:inline-block;vertical-align:middle}#list-paging a.older .pagination-icon:after,#item-paging a.older .pagination-icon:after{font-size:16px;width:16px;height:16px;line-height:16px}#list-paging a.older .pagination-icon:after,#item-paging a.older .pagination-icon:after{font-size:inherit;width:16px;height:16px;line-height:16px}#list-paging,#item-paging{border-top:1px solid #e3e3e3;border-bottom:1px solid #e3e3e3;margin:3em 0 0 0}#list-paging a,#item-paging a{padding:1.5em 0;display:inline-block;width:48%}#list-paging a.newer .pagination-icon,#item-paging a.newer .pagination-icon{margin-right:.5em}#list-paging a.newer:after,#item-paging a.newer:after{content:\"Newer\"}#list-paging a.older,#item-paging a.older{float:right;text-align:right}#list-paging a.older .pagination-icon,#item-paging a.older .pagination-icon{margin-left:.5em}#list-paging a.older:before,#item-paging a.older:before{content:\"Older\"}#list-paging a.disabled,#item-paging a.disabled{color:#ddd}.like-share{float:right}.like-share .sqs-simple-like{display:inline-block;margin-right:.5em}.like-share .sqs-simple-like .like-icon{float:none;display:inline-block;vertical-align:middle}.like-share .squarespace-social-buttons{display:inline-block;margin-right:.5em}.like-share .squarespace-social-buttons .ss-social-button-icon{float:none;display:inline-block;vertical-align:middle}.like-share.empty{display:none}body:not(.event-show-past-events) .eventlist.eventlist--past{display:none}.eventlist-event{position:relative;margin:68px 0 0 0;padding:0}.eventlist-event:first-of-type{margin:0}.eventlist-column-thumbnail{display:block;float:left;width:35%;height:0;padding-bottom:23.333333333333332%;text-decoration:none !important;background:rgba(110,110,110,.05)}.eventlist-column-thumbnail img{-webkit-transition:opacity .3s ease-in;-moz-transition:opacity .3s ease-in;-ms-transition:opacity .3s ease-in;-o-transition:opacity .3s ease-in;transition:opacity .3s ease-in}.eventlist-column-thumbnail img:not(.loaded){opacity:0}body:not(.event-thumbnails) .eventlist-column-thumbnail{display:none}.event-disable-item-pages .eventlist-column-thumbnail{cursor:default;pointer-events:none}.event-thumbnail-size-11-square .eventlist-column-thumbnail{padding-bottom:35%}.event-thumbnail-size-32-standard .eventlist-column-thumbnail{padding-bottom:23.333333333333332%}.event-thumbnail-size-23-standard-vertical .eventlist-column-thumbnail{padding-bottom:52.5%}.event-thumbnail-size-43-four-thirds .eventlist-column-thumbnail{padding-bottom:26.25%}.event-thumbnail-size-169-widescreen .eventlist-column-thumbnail{padding-bottom:19.6875%}.event-thumbnail-size-2401-anamorphic-widescreen .eventlist-column-thumbnail{padding-bottom:14.583333333333334%}.eventlist-column-thumbnail:empty{height:auto;min-height:100px;padding-bottom:0 !important;background:transparent}.eventlist-column-date{display:block;position:absolute;top:0;left:0;width:35%;margin:0;padding:0;color:#333 !important;text-decoration:none !important}.event-disable-item-pages .eventlist-column-date{cursor:default;pointer-events:none}body:not(.event-date-label) .eventlist-column-date{display:none}body:not(.event-thumbnails) .eventlist-column-date{position:static;float:left;width:70px}.eventlist-datetag{display:table;position:absolute;top:10px;right:10px;height:auto;min-height:70px;width:70px;margin:0;padding:0;background:#fff;color:#333;font-size:14px;line-height:14px;text-align:center;box-sizing:border-box}body:not(.event-thumbnails) .eventlist-datetag{position:static;background:#e8ecec}.eventlist-event:not(.eventlist-event--hasimg) .eventlist-datetag{top:0;background:#e8ecec}.eventlist-datetag-inner{display:table-cell;vertical-align:middle;margin:0;padding:6px;color:inherit;font-size:0;line-height:0;letter-spacing:0}.eventlist-datetag-startdate--month,.eventlist-datetag-startdate--day,.eventlist-datetag-time,.eventlist-datetag-enddate{margin:3px 0;line-height:1em;text-transform:uppercase;white-space:nowrap}.eventlist-event--past .eventlist-datetag-startdate--month,.eventlist-event--past .eventlist-datetag-startdate--day,.eventlist-event--past .eventlist-datetag-time,.eventlist-event--past .eventlist-datetag-enddate{opacity:.3}.eventlist-datetag-time,.eventlist-datetag-enddate{border-top:1px solid #ddd;margin:6px 0 0 0;padding-top:6px;font-size:11px}.eventlist-datetag-startdate--month{font-size:14px;margin-top:6px}.eventlist-datetag-startdate--day{font-size:26px}body:not(.event-date-label-time) .eventlist-datetag-time{display:none}.eventlist-datetag-enddate:before{content:\"to \"}.eventlist-datetag-status{display:none;position:absolute;top:0px;left:35px;width:1px;height:70px;background:#000;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.eventlist-event--past .eventlist-datetag-status{display:block}.eventlist-event--past.eventlist-event--multiday .eventlist-datetag-status,body.event-date-label-time .eventlist-event--past .eventlist-datetag-status{top:0px;height:85px;-webkit-transform:rotate(38deg);-moz-transform:rotate(38deg);-ms-transform:rotate(38deg);-o-transform:rotate(38deg);transform:rotate(38deg)}.eventlist-column-info{float:left;width:65%;padding:0 0 0 34px;box-sizing:border-box}body:not(.event-thumbnails) .eventlist-column-info{width:calc(100% -  70px);width:-webkit-calc(100% -  70px);width:-moz-calc(100% -  70px)}body:not(.event-thumbnails):not(.event-date-label) .eventlist-column-info{width:100%;padding-left:0}.eventlist-cats{margin:0 0 4.25px 0;padding:0;font-size:14px;line-height:1.4em}.eventlist-cats a{color:inherit !important;text-decoration:none !important}body:not(.event-list-show-cats) .eventlist-cats{display:none}.eventlist-title{margin:0 0 17px 0 !important;padding:0 !important;font-size:28px !important;line-height:1.2em !important}.eventlist-title .eventlist-title-link{margin:0 !important;padding:0 !important;color:inherit !important;text-decoration:none !important;font-size:inherit !important;line-height:inherit !important}.eventlist-title .eventlist-title-link:empty:before{content:\"Untitled Event\"}.event-disable-item-pages .eventlist-title .eventlist-title-link{cursor:default;pointer-events:none}.eventlist-meta{list-style-type:none;margin:0 0 17px 0;padding:0}.eventlist-meta-item{margin:0;padding:0;text-align:left}.event-icons .eventlist-meta-item{position:relative;padding-left:25.5px}.event-icons .eventlist-meta-item:before{opacity:.5;position:absolute;top:3px;left:-2px}.event-icons .eventlist-meta-item.eventlist-meta-date:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e015\";text-align:center;display:inline-block;vertical-align:middle}.event-icons .eventlist-meta-item.eventlist-meta-date:before{font-size:16px;width:16px;height:16px;line-height:16px}.event-icons .eventlist-meta-item.eventlist-meta-time:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e00c\";text-align:center;display:inline-block;vertical-align:middle}.event-icons .eventlist-meta-item.eventlist-meta-time:before{font-size:16px;width:16px;height:16px;line-height:16px}.event-icons .eventlist-meta-item.eventlist-meta-address:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e02f\";text-align:center;display:inline-block;vertical-align:middle}.event-icons .eventlist-meta-item.eventlist-meta-address:before{font-size:16px;width:16px;height:16px;line-height:16px}body:not(.event-list-date) .eventlist-meta-date,body:not(.event-list-time) .eventlist-meta-time,body:not(.event-list-address) .eventlist-meta-address{display:none}.event-list-time .eventlist-event--multiday .eventlist-meta-date .event-date:after{content:\", \"}.event-list-time .eventlist-event--multiday .eventlist-meta-time{display:inline-block}.eventlist-meta-address-line:after{content:\", \"}.eventlist-meta-address-line:last-of-type:after{content:none}.eventlist-meta-address-maplink:before{content:\"(map)\"}body:not(.event-list-icalgcal-links) .eventlist-meta-export{display:none}.eventlist-meta-export-google:before{content:'Google Calendar'}.eventlist-meta-export-divider{margin:0 4px}.eventlist-meta-export-divider:before{content:\"\\00B7\"}.eventlist-meta-export-ical:before{content:'ICS'}body:not(.event-excerpts) .eventlist-description,body:not(.event-excerpts) .eventlist-excerpt{display:none}.eventlist-excerpt{margin:0 0 17px 0}.eventlist-button{margin:5.666666666666667px 0 25.5px 0;display:inline-block;width:auto;height:auto;padding:1em 2.5em;color:#fff;background-color:#272727;border-width:0;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:12px;line-height:1em;font-weight:normal;font-style:normal;text-transform:uppercase;letter-spacing:0px;text-align:center;text-decoration:none;cursor:pointer;outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.eventlist-button:before{content:\"View Event \\2192\"}body:not(.event-list-cta-button) .eventlist-button{display:none !important}body:not(.event-list-like-and-share-buttons) .eventlist-actions{display:none}.eventlist-actions .sqs-simple-like{line-height:inherit}.eventlist-actions .sqs-simple-like .like-count{margin-right:1.2em}.eventlist-actions .sqs-simple-like .like-count:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e012\";text-align:center;display:inline-block;vertical-align:middle}.eventlist-actions .sqs-simple-like .like-count:before{font-size:16px;width:16px;height:16px;line-height:16px}.eventlist-actions .sqs-simple-like .like-count:before{margin-right:.2em;position:relative;top:.13em;font-size:1.2em;width:auto;height:auto;line-height:inherit;text-align:left;vertical-align:initial}.eventlist-actions .sqs-simple-like .like-icon{display:none}.eventlist-actions .ss-social-button:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e02b\";text-align:center;display:inline-block;vertical-align:middle}.eventlist-actions .ss-social-button:before{font-size:16px;width:16px;height:16px;line-height:16px}.eventlist-actions .ss-social-button:before{margin-right:.4em;font-size:.85em;width:auto;height:auto;line-height:inherit;text-align:left;vertical-align:initial}.eventlist-actions .ss-social-button div{display:inline-block}.eventlist-actions .ss-social-button-icon{display:none !important}.eventlist-filter{font-size:18px;line-height:1em;margin:0 0 51px 0}.eventlist-filter:before{content:\"Filtering by: \"}.eventlist-past-upcoming-divider{display:none;height:0;border:none;border-top:1px solid rgba(230,230,230,.8);font-size:68px;line-height:68px}.eventlist--upcoming+.eventlist--past .eventlist-past-upcoming-divider{display:block}.event-datetime-divider:before{content:\" \\2013 \"}.eventlist-empty:before{content:\"There are no upcoming events at this time.\"}.eventitem-backlink{display:inline-block;margin:0 0 51px 0;text-transform:uppercase}.eventitem-backlink:before{content:\"\\2190\\0020 Back to All Events\"}body:not(.event-item-back-link) .eventitem-backlink{display:none}.eventitem{position:relative}.eventitem-column-meta{float:left;width:30%;box-sizing:border-box}.eventitem-title{margin:0 0 34px 0 !important;padding:0 !important;font-size:28px !important;line-height:1.2em !important}.eventitem-title:empty:before{content:\"Untitled Event\"}.eventitem-meta{list-style-type:none;margin:0 0 17px 0;padding:0}.eventitem-meta-item{margin:0;padding:0;font-size:.9em;line-height:1.6em}.eventitem--multiday .eventitem-meta-date .event-date:after{content:\", \"}.eventitem--multiday .eventitem-meta-time{display:inline-block}.eventitem-meta-address-line:after{content:\", \"}.eventitem-meta-address-line:last-of-type:after{content:none}.eventitem-meta-address-line.eventitem-meta-address-line--title{display:block}.eventitem-meta-address-line.eventitem-meta-address-line--title:after{content:none}.eventitem-meta-address-maplink:before{content:\"(map)\"}body:not(.event-icalgcal-links) .event-meta-addtocalendar-container{display:none}.eventitem-meta-export-google:before{content:\"Google Calendar\"}.eventitem-meta-export-divider{margin:0 4px}.eventitem-meta-export-divider:before{content:\"\\00B7\"}.eventitem-meta-export-ical:before{content:\"ICS\"}.eventitem-meta-cats:before{content:\"Posted in \"}.eventitem-meta-tags:before{content:\"Tagged \"}.event-meta-socialicon-container .sqs-simple-like{line-height:inherit}.event-meta-socialicon-container .sqs-simple-like .like-count{margin-right:1.2em}.event-meta-socialicon-container .sqs-simple-like .like-count:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e012\";text-align:center;display:inline-block;vertical-align:middle}.event-meta-socialicon-container .sqs-simple-like .like-count:before{font-size:16px;width:16px;height:16px;line-height:16px}.event-meta-socialicon-container .sqs-simple-like .like-count:before{margin-right:.2em;position:relative;top:.13em;font-size:1.2em;width:auto;height:auto;line-height:inherit;text-align:left;vertical-align:initial}.event-meta-socialicon-container .sqs-simple-like .like-icon{display:none}.event-meta-socialicon-container .ss-social-button:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e02b\";text-align:center;display:inline-block;vertical-align:middle}.event-meta-socialicon-container .ss-social-button:before{font-size:16px;width:16px;height:16px;line-height:16px}.event-meta-socialicon-container .ss-social-button:before{margin-right:.4em;font-size:.85em;width:auto;height:auto;line-height:inherit;text-align:left;vertical-align:initial}.event-meta-socialicon-container .ss-social-button div{display:inline-block}.event-meta-socialicon-container .ss-social-button-icon{display:none !important}body:not(.event-like-and-share-buttons) .event-meta-socialicon-container{display:none}.eventitem-column-content{float:left;width:70%;padding-left:34px;box-sizing:border-box}.eventitem-content-footer{margin:17px 0 0 0}.eventitem-content-footer .eventitem-sourceurl{margin:0 0 8.5px 0}.eventitem-content-footer .eventitem-sourceurl:before{content:\"Source: \"}.eventitem-content-footer .eventitem-meta{margin:0 0 8.5px 0}.eventitem-content-footer .eventitem-meta>*{font-size:inherit}.eventitem-pager{margin:170px 0 0 0}.eventitem-pager-newer,.eventitem-pager-older{float:left;display:inline-block;text-decoration:none;box-sizing:border-box}.eventitem-pager-older .eventitem-pager-date:before{content:\"Earlier Event: \"}.eventitem-pager-newer{float:right;text-align:right}.eventitem-pager-newer .eventitem-pager-date:before{content:\"Later Event: \"}.eventitem-pager-disabled{opacity:.4}.event-list-compact-view .eventlist-column-thumbnail,.event-list-compact-view .eventlist-column-date,.event-list-compact-view .eventlist-column-info{width:100% !important}.event-list-compact-view .eventlist-column-thumbnail:empty{min-height:0}.event-list-compact-view.event-thumbnail-size-11-square .eventlist-column-thumbnail{padding-bottom:100%}.event-list-compact-view.event-thumbnail-size-32-standard .eventlist-column-thumbnail{padding-bottom:66.666%}.event-list-compact-view.event-thumbnail-size-23-standard-vertical .eventlist-column-thumbnail{padding-bottom:150%}.event-list-compact-view.event-thumbnail-size-43-four-thirds .eventlist-column-thumbnail{padding-bottom:75%}.event-list-compact-view.event-thumbnail-size-169-widescreen .eventlist-column-thumbnail{padding-bottom:56.25%}.event-list-compact-view.event-thumbnail-size-2401-anamorphic-widescreen .eventlist-column-thumbnail{padding-bottom:41.666%}.event-list-compact-view .eventlist-datetag{left:0;right:auto}.event-list-compact-view.event-thumbnails .eventlist-event--hasimg .eventlist-datetag{left:10px}.event-list-compact-view.event-thumbnails .eventlist-event:not(.eventlist-event--hasimg) .eventlist-column-date{position:static;float:left;width:70px}.event-list-compact-view.event-thumbnails .eventlist-event:not(.eventlist-event--hasimg) .eventlist-column-date .eventlist-datetag{position:static}.event-list-compact-view .eventlist-column-info{margin:25.5px 0 0 0;padding:0}.event-list-compact-viewbody:not(.event-thumbnails):not(.event-date-label) .eventlist-event{margin-top:34px}.event-list-compact-viewbody:not(.event-thumbnails):not(.event-date-label) .eventlist-column-info{margin-top:0}.event-list-compact-view .eventitem-title{margin-bottom:17px !important}.event-list-compact-view .eventitem-column-meta{margin-bottom:34px}.event-list-compact-view .eventitem-column-meta,.event-list-compact-view .eventitem-column-content{float:none;width:auto;padding:0}.event-item-compact-view .eventitem-title{margin-bottom:17px !important}.event-item-compact-view .eventitem-column-meta{margin-bottom:34px}.event-item-compact-view .eventitem-column-meta,.event-item-compact-view .eventitem-column-content{float:none;width:auto;padding:0}@media only screen and (max-width:639px){.eventlist-column-thumbnail,.eventlist-column-date,.eventlist-column-info{width:100% !important}.eventlist-column-thumbnail:empty{min-height:0}.event-thumbnail-size-11-square .eventlist-column-thumbnail{padding-bottom:100%}.event-thumbnail-size-32-standard .eventlist-column-thumbnail{padding-bottom:66.666%}.event-thumbnail-size-23-standard-vertical .eventlist-column-thumbnail{padding-bottom:150%}.event-thumbnail-size-43-four-thirds .eventlist-column-thumbnail{padding-bottom:75%}.event-thumbnail-size-169-widescreen .eventlist-column-thumbnail{padding-bottom:56.25%}.event-thumbnail-size-2401-anamorphic-widescreen .eventlist-column-thumbnail{padding-bottom:41.666%}.eventlist-datetag{left:0;right:auto}.event-thumbnails .eventlist-event--hasimg .eventlist-datetag{left:10px}.event-thumbnails .eventlist-event:not(.eventlist-event--hasimg) .eventlist-column-date{position:static;float:left;width:70px}.event-thumbnails .eventlist-event:not(.eventlist-event--hasimg) .eventlist-column-date .eventlist-datetag{position:static}.eventlist-column-info{margin:25.5px 0 0 0;padding:0}body:not(.event-thumbnails):not(.event-date-label) .eventlist-event{margin-top:34px}body:not(.event-thumbnails):not(.event-date-label) .eventlist-column-info{margin-top:0}.eventitem-title{margin-bottom:17px !important}.eventitem-column-meta{margin-bottom:34px}.eventitem-column-meta,.eventitem-column-content{float:none;width:auto;padding:0}.eventitem-title{margin-bottom:17px !important}.eventitem-column-meta{margin-bottom:34px}.eventitem-column-meta,.eventitem-column-content{float:none;width:auto;padding:0}}.event-time-24hr{display:none}.event-time-format .event-time-12hr{display:none}.event-time-format .event-time-24hr{display:inline}.sqs-audio-playlist{zoom:1}.sqs-audio-playlist.loading{visibility:hidden}.sqs-audio-playlist:after{display:block;visibility:hidden;font-size:0;height:0;clear:both;content:\".\"}.sqs-audio-playlist:after{display:block;visibility:hidden;font-size:0;height:0;clear:both;content:\".\"}.sqs-audio-playlist.hidden{display:none}.sqs-audio-playlist .album-info{width:33%;float:left;zoom:1}.sqs-audio-playlist .album-info:after{display:block;visibility:hidden;font-size:0;height:0;clear:both;content:\".\"}.sqs-audio-playlist .album-info:after{display:block;visibility:hidden;font-size:0;height:0;clear:both;content:\".\"}.sqs-audio-playlist .album-cover-wrapper{position:relative;width:90px;height:90px;margin-bottom:30px}.sqs-audio-playlist .album-controls{position:absolute;top:0;right:0;bottom:0;left:0;cursor:pointer}.sqs-audio-playlist .album-controls .button{-webkit-transition:.25s all linear;-moz-transition:.25s all linear;-ms-transition:.25s all linear;-o-transition:.25s all linear;transition:.25s all linear;-moz-border-radius:50%;border-radius:50%;position:absolute;bottom:50%;left:50%;display:block;width:90px;height:90px;margin-bottom:-45px;margin-left:-45px;background:#000}.sqs-audio-playlist .album-controls .icon{display:block;position:relative;left:50%;top:50%;margin-top:-20px;margin-left:-10px;width:0px;height:0px;border-top:18px solid transparent;border-bottom:18px solid transparent;border-left:30px solid #fff;-webkit-transform:translatez();-ms-transform:translatez();transform:translatez()}.sqs-audio-playlist .album-title{font-size:1.5em;margin:0}.sqs-audio-playlist .album-title a{text-decoration:none}.sqs-audio-playlist.playing .album-controls .button .icon{border-width:0px;margin-top:-15px;margin-left:-13px}.sqs-audio-playlist.playing .album-controls .button .icon,.sqs-audio-playlist.playing .album-controls .button .icon:before{height:30px;width:10px;background-color:#fff}.sqs-audio-playlist.playing .album-controls .button .icon:before{content:'';display:block;margin-left:16px}.sqs-audio-playlist.has-album-cover .album-cover-wrapper{position:relative;width:100%;height:0;padding-bottom:100%;margin-bottom:20px}.sqs-audio-playlist.has-album-cover .album-cover{position:absolute;top:0;right:0;bottom:0;left:0}.sqs-audio-playlist.has-album-cover .button{background:rgba(0,0,0,.7);opacity:.9}.sqs-audio-playlist.has-album-cover:hover .button{background:rgba(0,0,0,.9)}.sqs-audio-playlist.has-album-cover.playing .album-controls .button{margin:-15px;bottom:0;left:0;-webkit-transform:scale(.4,.4);-ms-transform:scale(.4,.4);transform:scale(.4,.4)}.sqs-audio-playlist.has-album-cover.playing .album-controls .button .icon{border-width:0px;margin-top:-15px;margin-left:-13px}.sqs-audio-playlist.has-album-cover.playing .album-controls .button .icon,.sqs-audio-playlist.has-album-cover.playing .album-controls .button .icon:before{height:30px;width:10px;background-color:#fff}.sqs-audio-playlist.has-album-cover.playing .album-controls .button .icon:before{content:'';display:block;margin-left:16px}.sqs-audio-playlist.has-album-cover.playing .track{opacity:.4}.sqs-audio-playlist.has-album-cover.playing .track:hover,.sqs-audio-playlist.has-album-cover.playing .track.selected{opacity:1}.sqs-audio-playlist .tracks{float:right;width:60%;margin:0;padding:0}.sqs-audio-playlist .track{list-style-type:none;padding:0;margin:0 0 5%;cursor:pointer;zoom:1;font-style:normal;font-weight:normal;letter-spacing:0;text-transform:none;font-size:13px;line-height:1.4em}.sqs-audio-playlist .track:after{display:block;visibility:hidden;font-size:0;height:0;clear:both;content:\".\"}.sqs-audio-playlist .track:after{display:block;visibility:hidden;font-size:0;height:0;clear:both;content:\".\"}.sqs-audio-playlist .track-progress-bar{clear:both;height:2px;position:relative;cursor:pointer;padding-bottom:2.5%}.sqs-audio-playlist .track-progress-bar .bar{position:absolute;top:0;left:0;height:2px;width:0%}.sqs-audio-playlist .track-progress-bar .bar.bg{width:100%}.sqs-audio-playlist .track-progress-bar .bar.play-bar{position:relative}.sqs-audio-playlist .track-meta{float:right;text-align:right}.sqs-audio-playlist .track-info .title a{font-size:16px}.sqs-audio-playlist.tablet .album-info,.sqs-audio-playlist.tablet .tracks{width:100%;float:none}.sqs-audio-playlist.tablet .album-info{padding-bottom:8%}.sqs-audio-playlist.tablet .album-cover-wrapper{float:left;margin-right:30px}.sqs-audio-playlist.tablet.has-album-cover .album-cover-wrapper{width:40%;padding-bottom:40%}.sqs-audio-playlist.tablet.no-main-image .album-description{margin-left:120px}.sqs-audio-playlist.phone .album-info,.sqs-audio-playlist.phone .tracks{width:100%;float:none}.sqs-audio-playlist.phone .tracks{margin-top:30px}.sqs-audio-playlist.phone .tracks .track{margin-bottom:10%}.sqs-audio-playlist.phone .album-info{padding-bottom:0}.sqs-audio-playlist.phone .album-cover-wrapper{float:none;margin-right:0;margin-bottom:20px}.sqs-audio-playlist.phone.has-album-cover .album-cover-wrapper{width:100%;padding-bottom:100%}.sqs-audio-playlist.phone.no-main-image .album-description{margin-left:0}.sqs-audio-playlist .track-progress-bar{-webkit-tap-highlight-color:rgba(0,0,0,.5)}.sqs-audio-playlist .track-progress-bar .bar{-webkit-tap-highlight-color:rgba(0,0,0,.5)}.sqs-audio-playlist .track-progress-bar .bar.bg{background-color:#000;background-color:rgba(0,0,0,.1)}.sqs-audio-playlist .track-progress-bar .bar.load-bar{background-color:#000;background-color:rgba(0,0,0,.05)}.sqs-audio-playlist .track-progress-bar .bar.play-bar{background-color:#000;background-color:rgba(0,0,0,.8)}.sqs-audio-playlist .track-meta .track-time{color:#000;color:rgba(0,0,0,.5)}.sqs-audio-playlist .track-meta .actions{color:#000;color:rgba(0,0,0,.2)}.sqs-audio-playlist .track-meta .actions a{color:#000;color:rgba(0,0,0,.5)}.sqs-audio-playlist .track-meta .actions a:hover{color:#000;color:rgba(0,0,0,.8)}.sqs-audio-playlist .track-info .title a{color:#000;color:rgba(0,0,0,.85)}.sqs-audio-playlist .track-info .artist{color:#000;color:rgba(0,0,0,.5)}.hide-album-share-link .sqs-audio-playlist .squarespace-social-buttons{display:none}#productList{clear:both;margin-left:-3%;margin-top:-3%;width:103%}#productList .product{cursor:pointer;float:left;margin-left:2.912621359223301%;margin-top:3%;position:relative;width:30.420711974110034%;-webkit-transform:translatez(0)}#productList .product .product-image{-webkit-transition:opacity .14s ease-out}#productList .product .product-image .intrinsic{padding-bottom:100%;line-height:0;position:relative;overflow:hidden}#productList .product .product-image .intrinsic>div{position:absolute;top:0;left:0;bottom:0;right:0;background-color:rgba(0,0,0,0)}#productList .product .product-image img{-webkit-transition:opacity .3s ease-out;-moz-transition:opacity .3s ease-out;transition:opacity .3s ease-out}#productList .product .product-mark{position:absolute;top:15px;right:0;background:#222;padding:6px 8px;color:#fff;line-height:1em;text-transform:uppercase;-webkit-font-smoothing:antialiased}#productList .product .product-title{font-size:15px;line-height:1.5em;margin-top:1em}#productList .product .product-price{font-size:12px;display:none;line-height:1.5em}#productList .product .product-price .original-price{text-decoration:line-through;opacity:.7;filter:alpha(opacity=70)}#productList .product .product-price .strikeout{text-decoration:line-through}#productList .product .product-image img{will-change:opacity}#productList .product:hover .product-image img{opacity:.8;filter:alpha(opacity=80)}#productList .product .product-quick-view-button-hover-zone{opacity:0;position:absolute;top:0;left:0;width:100%;height:0}#productList .product:hover .product-quick-view-button-hover-zone{opacity:1}#productList .product .product-quick-view-button-container{position:absolute;top:auto;bottom:10%;width:100%;text-align:center}#productList .product:nth-child(3n+1){clear:left}#productList ul.pagination{clear:both;margin-top:15px;margin-left:2.912621359223301%}#productList ul.pagination li{display:inline-block}#productList ul.pagination li.previous-page{text-align:left}#productList ul.pagination li.next-page{text-align:right}.product-list-alignment-center #productList .product-title,.product-list-alignment-center #productList .product-price{text-align:center}.product-item-size-11-square #productList .product .product-image .intrinsic,.product-item-size-11-square #productList .product .product-quick-view-button-hover-zone{padding-bottom:100%}.product-item-size-32-standard #productList .product .product-image .intrinsic,.product-item-size-32-standard #productList .product .product-quick-view-button-hover-zone{padding-bottom:66.666%}.product-item-size-23-standard-vertical #productList .product .product-image .intrinsic,.product-item-size-23-standard-vertical #productList .product .product-quick-view-button-hover-zone{padding-bottom:150%}.product-item-size-43-four-thirds #productList .product .product-image .intrinsic,.product-item-size-43-four-thirds #productList .product .product-quick-view-button-hover-zone{padding-bottom:75%}.product-item-size-169-widescreen #productList .product .product-image .intrinsic,.product-item-size-169-widescreen #productList .product .product-quick-view-button-hover-zone{padding-bottom:56.25%}@media only screen and (min-width:700px){.no-touch .product-list-titles-overlay #productList .product .product-image{margin:0}.no-touch .product-list-titles-overlay #productList .product .product-overlay{position:absolute;top:0;left:0;bottom:0;right:0;background:rgba(0,0,0,.6);color:#fff;-webkit-font-smoothing:antialiased}.no-touch .product-list-titles-overlay #productList .product .product-mark{font-size:12px;line-height:normal}.no-touch .product-list-titles-overlay #productList .product .product-meta{position:absolute;width:80%;margin:0 10%;top:50%}.no-touch .product-list-titles-overlay #productList .product .product-title{font-size:16px;font-weight:700;line-height:1.5em;color:#fff}.no-touch .product-list-titles-overlay #productList .product .product-price{font-size:13px;line-height:normal;color:#fff}.no-touch .product-list-titles-overlay #productList .product .product-overlay{opacity:0;-webkit-transition:opacity .3s ease-out;-moz-transition:opacity .3s ease-out;-ms-transition:opacity .3s ease-out;-o-transition:opacity .3s ease-out;transition:opacity .3s ease-out;filter:alpha(opacity=0)}.no-touch .product-list-titles-overlay #productList .product .product-mark{opacity:1;-webkit-transition:opacity .3s ease-out;-moz-transition:opacity .3s ease-out;-ms-transition:opacity .3s ease-out;-o-transition:opacity .3s ease-out;transition:opacity .3s ease-out;filter:alpha(opacity=100)}.no-touch .product-list-titles-overlay #productList .product .product-meta{opacity:0;-webkit-transition:opacity .35s cubic-bezier(0,0,1,1);-moz-transition:opacity .35s cubic-bezier(0,0,1,1);-ms-transition:opacity .35s cubic-bezier(0,0,1,1);-o-transition:opacity .35s cubic-bezier(0,0,1,1);transition:opacity .35s cubic-bezier(0,0,1,1);filter:alpha(opacity=0)}.no-touch .product-list-titles-overlay #productList .product .product-title{margin-top:5px;-webkit-transition:margin .3s cubic-bezier(0,0,.28,1);-moz-transition:margin .3s cubic-bezier(0,0,.28,1);-ms-transition:margin .3s cubic-bezier(0,0,.28,1);-o-transition:margin .3s cubic-bezier(0,0,.28,1);transition:margin .3s cubic-bezier(0,0,.28,1)}.no-touch .product-list-titles-overlay #productList .product .product-title,.no-touch .product-list-titles-overlay #productList .product .product-price{text-align:center}.no-touch .product-list-titles-overlay #productList .product:hover .product-overlay{opacity:1;filter:alpha(opacity=100)}.no-touch .product-list-titles-overlay #productList .product:hover .product-mark{opacity:0;filter:alpha(opacity=0)}.no-touch .product-list-titles-overlay #productList .product:hover .product-meta{opacity:1;filter:alpha(opacity=100)}.no-touch .product-list-titles-overlay #productList .product:hover .product-title{margin-top:0}}.product-list-titles-under .product-meta{margin-top:0 !important}.show-product-price #productList .product .product-price{display:block}.sqs-style-mode .product-overlay{opacity:1 !important}.sqs-style-mode .product-mark{opacity:0 !important}.sqs-style-mode .product-meta{opacity:1 !important}#productNav{text-transform:uppercase;margin-bottom:30px;display:none}.product-title.mobile{display:none}#productDetails{position:relative;float:right;width:48.5%}#productDetails .product-title{margin:0 0 .5em}#productDetails .product-mark{float:right;background:#222;padding:6px 8px;color:#fff;line-height:1em;text-transform:uppercase;-webkit-font-smoothing:subpixel-antialiased;font-size:12px}#productDetails .product-price{margin:1em 0;font-size:16px;line-height:1.5em}#productDetails .product-price input{width:130px;height:30px;padding-left:5px}#productDetails .product-price .minimum-price{margin-top:3px;margin-left:10px}#productDetails .product-price .original-price{text-decoration:line-through;opacity:.7;filter:alpha(opacity=70)}#productDetails .product-price .strikeout{text-decoration:line-through}#productDetails .product-variants .variant-option{margin:1.2em 0}#productDetails .product-variants .variant-out-of-stock{color:#c00}#productDetails .product-quantity-select{margin-top:1.2em 0}#productDetails input{padding:5px 10px;border:1px solid #ccc;-moz-border-radius:3px;border-radius:3px}.product-sharing{display:none}.product-social-sharing .product-sharing{display:block}#productGallery{width:48.5%;float:left}#productGallery .intrinsic{max-width:100%}#productGallery .wrapper{padding-bottom:100%;position:relative}#productGallery #productSlideshow{position:absolute;top:0;bottom:0;left:0;width:100%;background-color:rgba(0,0,0,0)}#productGallery #productSlideshow .slide{height:100%;width:100%;overflow:hidden;cursor:pointer}#productGallery #productThumbnails{margin-left:-5px;visibility:hidden;overflow:hidden}#productGallery #productThumbnails .slide{width:50px;height:50px;margin:5px 0 0 5px;font-size:0;cursor:pointer;float:left;background-color:rgba(0,0,0,0)}.product-gallery-size-11-square #productGallery .intrinsic .wrapper{padding-bottom:100%}.product-gallery-size-32-standard #productGallery .intrinsic .wrapper{padding-bottom:66.666%}.product-gallery-size-23-standard-vertical #productGallery .intrinsic .wrapper{padding-bottom:150%}.product-gallery-size-43-four-thirds #productGallery .intrinsic .wrapper{padding-bottom:75%}.product-gallery-size-169-widescreen #productGallery .intrinsic .wrapper{padding-bottom:56.25%}.product-description{clear:both;margin-top:24px}.show-product-item-nav #productWrapper #productNav{display:block}.sqs-add-to-cart-button-wrapper{visibility:hidden}.sqs-add-to-cart-button{display:inline-block;width:auto;height:auto;padding:1em 2.5em;color:#fff;background-color:#272727;border-width:0;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:12px;line-height:1em;font-weight:normal;font-style:normal;text-transform:uppercase;letter-spacing:0px;text-align:center;text-decoration:none;cursor:pointer;outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;font-size:13px}.sqs-add-to-cart-button-inner{position:relative}.sqs-add-to-cart-button.cart-adding .sqs-spin{position:absolute;top:50%;margin-top:-12px}.sqs-add-to-cart-button.cart-adding .status-text{display:inline-block;margin-left:35px}.sqs-add-to-cart-button.cart-added .status-text{margin-left:0}.collection-type-products .sqs-add-to-cart-button{margin:20px 0;padding:1.5em 4em !important}.sqs-donate-button{display:inline-block;width:auto;height:auto;padding:1em 2.5em;color:#fff;background-color:#272727;border-width:0;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:12px;line-height:1em;font-weight:normal;font-style:normal;text-transform:uppercase;letter-spacing:0px;text-align:center;text-decoration:none;cursor:pointer;outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media only screen and (max-width:700px){#productSummary .product-title{display:none}#productSummary .product-title.mobile{display:block}.product-meta{margin-top:0 !important}#productDetails,#productGallery{width:100%;float:none}#productList{width:100%;margin-left:0;margin-top:0}#productList .product{float:left;margin-left:0;margin-top:0;width:100%;cursor:pointer;margin-bottom:3%}#productList .product .product-image{margin-bottom:3%}#productList .product .product-image .content-fit{position:absolute;top:0;left:0;bottom:0;right:0}#productList .product .product-image img{-webkit-transition:opacity .3s ease-out}.product-quick-view{display:none}}.collection-type-gallery:not(.gallery-design-grid) .arrow.previous-slide:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e000\";text-align:center;display:inline-block;vertical-align:middle}.collection-type-gallery:not(.gallery-design-grid) .arrow.previous-slide:before{font-size:16px;width:16px;height:16px;line-height:16px}.collection-type-gallery:not(.gallery-design-grid) .arrow.previous-slide:before{font-size:16px;width:40px;height:40px;line-height:40px}.collection-type-gallery:not(.gallery-design-grid) .arrow.next-slide:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e003\";text-align:center;display:inline-block;vertical-align:middle}.collection-type-gallery:not(.gallery-design-grid) .arrow.next-slide:before{font-size:16px;width:16px;height:16px;line-height:16px}.collection-type-gallery:not(.gallery-design-grid) .arrow.next-slide:before{font-size:16px;width:40px;height:40px;line-height:40px}.collection-type-gallery.gallery-design-grid .dots,.collection-type-gallery.gallery-design-grid .thumbnail-wrapper,.collection-type-gallery.gallery-design-grid .circles,.collection-type-gallery.gallery-design-grid .numbers,.collection-type-gallery.gallery-design-grid .simple{display:none}.collection-type-gallery.gallery-design-grid .slide{cursor:pointer}.collection-type-gallery.gallery-design-grid .slide .slide-meta{display:none}.collection-type-gallery.gallery-design-grid .slide>a{display:block;height:100%}.collection-type-gallery.gallery-design-grid.lightbox-style-light .yui3-lightbox2 .sqs-lightbox-overlay{background:#fff}.collection-type-gallery.gallery-design-grid.lightbox-style-light .yui3-lightbox2 .sqs-lightbox-close,.collection-type-gallery.gallery-design-grid.lightbox-style-light .yui3-lightbox2 .sqs-lightbox-previous,.collection-type-gallery.gallery-design-grid.lightbox-style-light .yui3-lightbox2 .sqs-lightbox-next,.collection-type-gallery.gallery-design-grid.lightbox-style-light .yui3-lightbox2 .sqs-lightbox-meta-trigger{color:#111}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery{cursor:pointer;opacity:0;zoom:1;-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";-webkit-transition:opacity .2s ease-out;-moz-transition:opacity .2s ease-out;-ms-transition:opacity .2s ease-out;-o-transition:opacity .2s ease-out;transition:opacity .2s ease-out}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .arrow,.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .icons span{-moz-user-select:-moz-none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .gallery-wrapper{position:relative;width:100%}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .gallery-wrapper .slides{display:block;width:100%;height:100% !important;-webkit-transition:opacity .2s ease-out;-moz-transition:opacity .2s ease-out;-ms-transition:opacity .2s ease-out;-o-transition:opacity .2s ease-out;transition:opacity .2s ease-out}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .gallery-wrapper .slides .slide{opacity:0;zoom:1;-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";height:100% !important}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .gallery-wrapper .slides .slide>a{display:block;height:100%}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .slides-controls{position:relative;z-index:991;overflow:hidden}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .arrow{z-index:997;position:absolute;width:100%;height:40px;margin-top:-20px;text-align:center;line-height:40px;font-weight:bold;color:#fff;background:#222;-webkit-transition:opacity .1s ease-in;-moz-transition:opacity .1s ease-in;-ms-transition:opacity .1s ease-in;-o-transition:opacity .1s ease-in;transition:opacity .1s ease-in}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .arrow.previous-slide{left:0;margin-left:2%;width:40px;height:40px}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .arrow.next-slide{right:0;margin-right:2%;float:right;width:40px;height:40px}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .arrow.sqs-disabled{opacity:0}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .dots,.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .thumbnail-wrapper,.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .circles,.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .numbers,.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .simple{display:none;margin:20px 0}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .dots.sqs-gallery-controls-disabled,.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .thumbnail-wrapper.sqs-gallery-controls-disabled,.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .circles.sqs-gallery-controls-disabled,.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .numbers.sqs-gallery-controls-disabled,.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .simple.sqs-gallery-controls-disabled{display:none}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .dots{text-align:center}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .dots .dot{font-size:30px;margin:0 5px}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .dots .dot:after{content:\"·\"}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .numbers{text-align:center}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .numbers .number{font-size:12px;margin:0 .5em}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .circles{font-size:0;position:absolute;bottom:0;text-align:center;z-index:999;width:100%;height:16px;margin:40px 0}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .circles .circle{display:inline-block;width:10px;height:10px;border:2px solid #fff;margin:0 5px;border-radius:100%;-webkit-border-radius:999px}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .circles .circle.sqs-active-slide{background:#fff}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .simple{text-align:center;font-size:12px}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .simple .previous.sqs-disabled,.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .simple .next.sqs-disabled{opacity:.5}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .simple .current-index{letter-spacing:2px}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .simple .current-index:after{content:\" / \"}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .simple .previous{float:left}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .simple .previous:after{content:\"Previous\"}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .simple .next{float:right}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .simple .next:after{content:\"Next\"}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .dots .dot,.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .numbers .number,.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .thumbnail-wrapper .thumbnail{opacity:.5}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .dots .dot.sqs-active-slide,.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .numbers .number.sqs-active-slide,.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .thumbnail-wrapper .thumbnail.sqs-active-slide{opacity:1}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .thumbnail-wrapper .thumbnail{width:100px !important}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .slide-meta{display:none;position:absolute;width:100%;bottom:0;z-index:996;height:auto;background:rgba(0,0,0,.7);padding:24px 0}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .slide-meta .title{margin:0;font-size:14px;color:#fff;padding:0 2%}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .slide-meta .description{margin-top:.5em;display:inline-block;padding:0 2%}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .slide-meta .description p,.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .slide-meta .clickthrough a{font-size:13px;line-height:1.4em;color:#999}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .slide-meta .description p,.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .slide-meta .clickthrough{margin:0}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .slide-meta .description p a{color:#999;text-decoration:underline}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .slide-meta .clickthrough{display:inline-block}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .slide-meta .clickthrough a{border-bottom:1px solid}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery .slide-meta .clickthrough a:before{content:\"Read more\"}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery.sqs-system-gallery-init{position:relative}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery.sqs-system-gallery-init>*{display:none}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery.sqs-system-gallery-ready{opacity:.01;opacity:1;zoom:1;-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=10)\"}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery.sqs-system-gallery-interaction .arrow{opacity:0}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery.sqs-system-gallery-interaction.sqs-system-gallery-hover-slides-left .arrow.previous-slide:not(.sqs-disabled),.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery.sqs-system-gallery-video-iframe .arrow.previous-slide:not(.sqs-disabled){opacity:1}.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery.sqs-system-gallery-interaction.sqs-system-gallery-hover-slides-right .arrow.next-slide:not(.sqs-disabled),.collection-type-gallery:not(.gallery-design-grid) .sqs-system-gallery.sqs-system-gallery-video-iframe .arrow.next-slide:not(.sqs-disabled){opacity:1}.collection-type-gallery:not(.gallery-design-grid).dialog-open .arrow.previous-slide:not(.sqs-disabled){opacity:1}.collection-type-gallery:not(.gallery-design-grid).dialog-open .arrow.next-slide:not(.sqs-disabled){opacity:1}.collection-type-gallery:not(.gallery-design-grid).gallery-navigation-thumbnails .sqs-system-gallery .thumbnail-wrapper{display:block}.collection-type-gallery:not(.gallery-design-grid).gallery-navigation-bullets .sqs-system-gallery .dots{display:block}.collection-type-gallery:not(.gallery-design-grid).gallery-navigation-numbers .sqs-system-gallery .numbers{display:block}.collection-type-gallery:not(.gallery-design-grid).gallery-navigation-circles .sqs-system-gallery .slide-meta{bottom:auto;top:0}.collection-type-gallery:not(.gallery-design-grid).gallery-navigation-circles .sqs-system-gallery .circles{display:block}.collection-type-gallery:not(.gallery-design-grid).gallery-navigation-simple .sqs-system-gallery .simple{display:block}.collection-type-gallery:not(.gallery-design-grid).gallery-info-overlay-always-show .sqs-system-gallery .slide-meta.show{display:block}.collection-type-gallery:not(.gallery-design-grid).gallery-info-overlay-show-on-hover .slide:hover .slide-meta.show{display:block}.collection-type-gallery:not(.gallery-design-grid):not(.gallery-show-arrows) .sqs-system-gallery .arrow{opacity:0 !important}.collection-type-gallery:not(.gallery-design-grid).gallery-aspect-ratio-11-square .sqs-system-gallery.sqs-system-gallery-init{padding-bottom:100%}.collection-type-gallery:not(.gallery-design-grid).gallery-aspect-ratio-11-square .thumbnail-wrapper{height:100px}.collection-type-gallery:not(.gallery-design-grid).gallery-aspect-ratio-32-standard .sqs-system-gallery.sqs-system-gallery-init{padding-bottom:66.66%}.collection-type-gallery:not(.gallery-design-grid).gallery-aspect-ratio-32-standard .thumbnail-wrapper{height:66px}.collection-type-gallery:not(.gallery-design-grid).gallery-aspect-ratio-43-four-thirds .sqs-system-gallery.sqs-system-gallery-init{padding-bottom:75%}.collection-type-gallery:not(.gallery-design-grid).gallery-aspect-ratio-43-four-thirds .thumbnail-wrapper{height:75px}.collection-type-gallery:not(.gallery-design-grid).gallery-aspect-ratio-169-widescreen .sqs-system-gallery.sqs-system-gallery-init{padding-bottom:56.25%}.collection-type-gallery:not(.gallery-design-grid).gallery-aspect-ratio-169-widescreen .thumbnail-wrapper{height:56.25px}.collection-type-gallery:not(.gallery-design-grid).gallery-arrow-style-circular .sqs-system-gallery .arrow{border-radius:100%;-webkit-border-radius:999px}.collection-type-gallery:not(.gallery-design-grid).gallery-arrow-style-round-corners .sqs-system-gallery .arrow{border-radius:10%;-webkit-border-radius:4px}.collection-type-gallery:not(.gallery-design-grid).gallery-arrow-style-rectangular .sqs-system-gallery .arrow{border-radius:0;-webkit-border-radius:0}.collection-type-gallery:not(.gallery-design-grid).gallery-arrow-style-no-background .sqs-system-gallery .arrow{border-radius:0;background:none;-webkit-border-radius:0}@media screen and (max-width:480px){.collection-type-gallery .sqs-system-gallery .slide-meta{display:none !important}}.sqs-gallery-block-stacked{padding:0;margin:0}.sqs-gallery-block-stacked a{border:0}.sqs-gallery-block-stacked .image-wrapper{margin:0 0 1px 0;line-height:1px}.sqs-gallery-block-stacked .image-wrapper img{width:100%}.sqs-gallery-block-stacked .meta{display:none;max-width:28em}.sqs-gallery-block-stacked.sqs-gallery-block-show-meta .meta{display:block}.sqs-gallery-block-stacked .meta-inside{margin-bottom:28px;margin-top:14px}.sqs-gallery-block-stacked .meta-title{margin-bottom:.3em}.sqs-gallery-block-stacked .meta-description{font-size:.9em;line-height:1.5em}.sqs-gallery-block-stacked .meta-description p{margin-bottom:0;margin-top:0}.sqs-gallery-block-slideshow{position:relative;background-color:rgba(175,175,175,.1)}.sqs-gallery-block-slideshow .slide>a{position:absolute;top:0;left:0;width:100%;height:100%;display:block}.sqs-gallery-block-slideshow .slide .meta{opacity:0}.sqs-gallery-block-slideshow .meta{position:absolute;opacity:0;background-color:#111;background-color:rgba(0,0,0,.3)}.sqs-gallery-block-slideshow .meta .meta-title{color:#fff}.sqs-gallery-block-slideshow .meta .meta-title{font-size:18px;line-height:1.2em;letter-spacing:1px}.sqs-gallery-block-slideshow .meta .meta-title+.meta-description{margin-top:.3em}.sqs-gallery-block-slideshow .meta .meta-description,.sqs-gallery-block-slideshow .meta .meta-description p{color:#ddd;color:rgba(255,255,255,.95);font-size:14px;line-height:1.5em}.sqs-gallery-block-slideshow .meta .meta-description strong{color:inherit}.sqs-gallery-block-slideshow .meta .meta-description *:first-child{margin-top:0}.sqs-gallery-block-slideshow .meta .meta-description *:last-child{margin-bottom:0}.sqs-gallery-block-slideshow .meta-inside{padding:25px}.sqs-gallery-block-slideshow .meta a,.sqs-gallery-block-slideshow .meta a:hover{color:#fff;text-decoration:underline}.sqs-gallery-block-slideshow .meta.overflow{overflow-y:auto}.sqs-gallery-block-slideshow .slide.loaded .meta{opacity:1}.sqs-gallery-block-slideshow.sqs-gallery-block-meta-hover .meta{opacity:0 !important;-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\"}.sqs-gallery-block-slideshow.sqs-gallery-block-meta-hover .slide:hover .meta{opacity:1 !important;-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)\"}.sqs-gallery-block-slideshow .meta{display:none;-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\"}.sqs-gallery-block-slideshow.sqs-gallery-block-show-meta .sqs-active-slide .meta{display:block;opacity:1;-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)\"}.sqs-gallery-block-slideshow.sqs-gallery-block-show-meta .mobile-view .slide.loaded>a{line-height:0;height:auto;position:static}.sqs-gallery-block-slideshow.sqs-gallery-block-show-meta .mobile-view .slide.loaded .sqs-video-wrapper{position:static}.sqs-gallery-block-slideshow.sqs-gallery-block-show-meta .mobile-view .slide.loaded .meta{background-color:transparent;color:inherit;padding:20px 0 10px 0;margin:0;max-width:none !important;opacity:1 !important;position:static !important}.sqs-gallery-block-slideshow.sqs-gallery-block-show-meta .mobile-view .slide.loaded .meta .meta-inside{padding:0}.sqs-gallery-block-slideshow.sqs-gallery-block-show-meta .mobile-view .slide.loaded .meta .meta-title,.sqs-gallery-block-slideshow.sqs-gallery-block-show-meta .mobile-view .slide.loaded .meta .meta-description,.sqs-gallery-block-slideshow.sqs-gallery-block-show-meta .mobile-view .slide.loaded .meta .meta-description p{color:inherit}.sqs-gallery-block-slideshow.sqs-gallery-block-show-meta .mobile-view .slide.loaded .meta .meta-title{font-size:.9em}.sqs-gallery-block-slideshow.sqs-gallery-block-show-meta .mobile-view .slide.loaded .meta .meta-description{font-size:.9em}.sqs-gallery-block-slideshow.sqs-gallery-block-show-meta .mobile-view .slide.loaded .meta .meta-description p{font-size:1em;line-height:1.3em}.sqs-gallery-block-slideshow .slide.video-playing .meta{display:none}.sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-top .meta,.sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-top-left .meta,.sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-top-right .meta{top:0px}.sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-top-left .meta,.sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-top-right .meta{max-width:50%;margin:20px}.sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-center .meta{max-width:50%;top:50%;left:50%;text-align:center}.sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-bottom .meta,.sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-bottom-left .meta,.sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-bottom-right .meta{bottom:0px}.sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-bottom .meta{background:-moz-linear-gradient(top,rgba(0,0,0,0) 0%,rgba(30,30,30,.3) 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,rgba(0,0,0,0)),color-stop(100%,rgba(30,30,30,.3)));background:-webkit-linear-gradient(top,rgba(0,0,0,0) 0%,rgba(30,30,30,.3) 100%);background:-o-linear-gradient(top,rgba(0,0,0,0) 0%,rgba(30,30,30,.3) 100%);background:-ms-linear-gradient(top,rgba(0,0,0,0) 0%,rgba(30,30,30,.3) 100%);background:linear-gradient(to bottom,rgba(0,0,0,0) 0%,rgba(30,30,30,.3) 100%)}.sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-bottom .meta-inside{padding:30px 20px 15px}.sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-bottom-left .meta,.sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-bottom-right .meta{max-width:50%;margin:20px}.sqs-gallery-block-slider{position:relative;height:100%}.sqs-gallery-block-grid.sqs-gallery-thumbnails-per-row-1 .sqs-gallery-design-grid-slide{width:100%}.sqs-gallery-block-grid.sqs-gallery-thumbnails-per-row-2 .sqs-gallery-design-grid-slide{width:50%}.sqs-gallery-block-grid.sqs-gallery-thumbnails-per-row-3 .sqs-gallery-design-grid-slide{width:33.333333333333336%}.sqs-gallery-block-grid.sqs-gallery-thumbnails-per-row-4 .sqs-gallery-design-grid-slide{width:25%}.sqs-gallery-block-grid.sqs-gallery-thumbnails-per-row-5 .sqs-gallery-design-grid-slide{width:20%}.sqs-gallery-block-grid.sqs-gallery-thumbnails-per-row-6 .sqs-gallery-design-grid-slide{width:16.666666666666668%}.sqs-gallery-block-grid.sqs-gallery-thumbnails-per-row-7 .sqs-gallery-design-grid-slide{width:14.285714285714286%}.sqs-gallery-block-grid.sqs-gallery-thumbnails-per-row-8 .sqs-gallery-design-grid-slide{width:12.5%}.sqs-gallery-block-grid.sqs-gallery-thumbnails-per-row-9 .sqs-gallery-design-grid-slide{width:11.11111111111111%}.sqs-gallery-block-grid.sqs-gallery-thumbnails-per-row-10 .sqs-gallery-design-grid-slide{width:10%}.sqs-gallery-block-grid.sqs-gallery-aspect-ratio-square .slide .margin-wrapper a.image-slide-anchor,.sqs-gallery-block-grid.sqs-gallery-aspect-ratio-square .slide .margin-wrapper .content-wrapper,.sqs-gallery-block-grid.sqs-gallery-aspect-ratio-square .slide .margin-wrapper .content-wrapper.content-fill .sqs-video-wrapper{padding-bottom:100%}.sqs-gallery-block-grid.sqs-gallery-aspect-ratio-standard .slide .margin-wrapper a.image-slide-anchor,.sqs-gallery-block-grid.sqs-gallery-aspect-ratio-standard .slide .margin-wrapper .content-wrapper,.sqs-gallery-block-grid.sqs-gallery-aspect-ratio-standard .slide .margin-wrapper .content-wrapper.content-fill .sqs-video-wrapper{padding-bottom:66.666%}.sqs-gallery-block-grid.sqs-gallery-aspect-ratio-standard-vertical .slide .margin-wrapper a.image-slide-anchor,.sqs-gallery-block-grid.sqs-gallery-aspect-ratio-standard-vertical .slide .margin-wrapper .content-wrapper,.sqs-gallery-block-grid.sqs-gallery-aspect-ratio-standard-vertical .slide .margin-wrapper .content-wrapper.content-fill .sqs-video-wrapper{padding-bottom:150%}.sqs-gallery-block-grid.sqs-gallery-aspect-ratio-four-three .slide .margin-wrapper a.image-slide-anchor,.sqs-gallery-block-grid.sqs-gallery-aspect-ratio-four-three .slide .margin-wrapper .content-wrapper,.sqs-gallery-block-grid.sqs-gallery-aspect-ratio-four-three .slide .margin-wrapper .content-wrapper.content-fill .sqs-video-wrapper{padding-bottom:75%}.sqs-gallery-block-grid.sqs-gallery-aspect-ratio-three-four-vertical .slide .margin-wrapper a.image-slide-anchor,.sqs-gallery-block-grid.sqs-gallery-aspect-ratio-three-four-vertical .slide .margin-wrapper .content-wrapper,.sqs-gallery-block-grid.sqs-gallery-aspect-ratio-three-four-vertical .slide .margin-wrapper .content-wrapper.content-fill .sqs-video-wrapper{padding-bottom:133.333%}.sqs-gallery-block-grid.sqs-gallery-aspect-ratio-widescreen .slide .margin-wrapper a.image-slide-anchor,.sqs-gallery-block-grid.sqs-gallery-aspect-ratio-widescreen .slide .margin-wrapper .content-wrapper,.sqs-gallery-block-grid.sqs-gallery-aspect-ratio-widescreen .slide .margin-wrapper .content-wrapper.content-fill .sqs-video-wrapper{padding-bottom:56.25%}.sqs-gallery-block-grid.sqs-gallery-aspect-ratio-anamorphic-widescreen .slide .margin-wrapper a.image-slide-anchor,.sqs-gallery-block-grid.sqs-gallery-aspect-ratio-anamorphic-widescreen .slide .margin-wrapper .content-wrapper,.sqs-gallery-block-grid.sqs-gallery-aspect-ratio-anamorphic-widescreen .slide .margin-wrapper .content-wrapper.content-fill .sqs-video-wrapper{padding-bottom:41.666%}.sqs-gallery-block-grid .slide{float:left;width:25%}.sqs-gallery-block-grid .slide .margin-wrapper{position:relative}.sqs-gallery-block-grid .slide .margin-wrapper a.image-slide-anchor{padding-bottom:100%;width:100%;height:0;display:block}.sqs-gallery-block-grid .slide .margin-wrapper a.image-slide-anchor img{display:inline-block}.sqs-gallery-block-grid .slide .margin-wrapper .content-wrapper{padding-bottom:100%;width:100%;display:block}.sqs-gallery-block-grid .slide .margin-wrapper .content-wrapper.content-fill .sqs-video-wrapper{height:0;padding-bottom:100%}.sqs-gallery-block-grid .slide .margin-wrapper .image-slide-title{text-align:center;display:none}.sqs-gallery-block-grid .slide .meta{position:relative}.sqs-gallery-block-grid .slide .meta h1{font-size:12px;letter-spacing:normal;margin:0}.sqs-block .sqs-gallery-thumbnails .sqs-video-thumbnail{position:relative}.sqs-block .sqs-gallery-thumbnails .sqs-video-thumbnail img{height:100%}.sqs-block .sqs-gallery-thumbnails .sqs-video-thumbnail .sqs-video-thumbnail-icon{opacity:1;position:absolute;top:50%;left:50%;background-image:url('//static.squarespace.com/universal/images-v6/icons/icon-video-24-light-solid.png');background-position:center center;height:24px;width:24px;margin-left:-12px;margin-top:-12px}.sqs-block .sqs-gallery-thumbnails .sqs-video-thumbnail.no-image .sqs-video-thumbnail-inner{background-image:url('//static.squarespace.com/universal/images-v6/icons/icon-video-24-light-solid.png');background-position:center center;background-repeat:no-repeat}.sqs-block .sqs-gallery-thumbnails .sqs-video-thumbnail:not(.no-image).loading .sqs-video-thumbnail-icon{opacity:0}.sqs-block .sqs-gallery-thumbnails .sqs-video-thumbnail .sqs-video-thumbnail-inner{height:100%;background:#000}.sqs-block .sqs-gallery-thumbnails .sqs-gallery-design-strip-slide{opacity:.5}.sqs-block .sqs-gallery-thumbnails .sqs-gallery-design-strip-slide.sqs-active-slide{opacity:1}@media only screen and (max-width:480px){.sqs-gallery-block-slideshow .meta{display:none !important}}@media only screen and (device-width:768px){.sqs-gallery-block-slideshow.sqs-gallery-block-show-meta .meta{opacity:1 !important}}.sqs-block.gallery-block .sqs-helper .sqs-handle-bottom{display:none}.sqs-block.gallery-block.sized .sqs-helper .sqs-handle-bottom{display:block}.sqs-layout.editing .sqs-block.gallery-block:hover .sqs-gallery-block-slideshow.sqs-gallery-block-meta-hover .meta{opacity:1 !important}.summary-block ul{list-style-type:none;margin:0;padding:0}.summary-block .summary-item:not(:last-child){margin-bottom:24px}.summary-block .summary-collection-title{display:none}.summary-block .summary-thumbnail{overflow:hidden;height:150px}.summary-block .summary-title{font-size:1.2em}.summary-block .summary-content-below-thumbnail .summary-title{margin:1em 0 0 0}.summary-block .summary-excerpt{margin:.75em 0}.summary-block .summary-excerpt p{font-size:.9em}.summary-block .timestamp{display:block;font-size:.8em;text-transform:uppercase}.summary-block .summary-more-link{display:none;margin-left:3px}.sqs-block-collectionlink .collectionlink-thumbnail,.link-block .collectionlink-thumbnail{overflow:hidden;height:150px}.sqs-block-collectionlink .collectionlink-thumbnail a,.link-block .collectionlink-thumbnail a{display:block;height:100%}.sqs-block-collectionlink .collectionlink-title,.link-block .collectionlink-title{font-size:1.2em}.sqs-block-collectionlink .collectionlink-title a,.link-block .collectionlink-title a{display:block}.sqs-block-collectionlink .collectionlink-content-below-thumbnail .collectionlink-title,.link-block .collectionlink-content-below-thumbnail .collectionlink-title{margin:1em 0 0 0}.sqs-block-collectionlink .collectionlink-description,.link-block .collectionlink-description{margin:.75em 0}.sqs-block-collectionlink .collectionlink-description p,.link-block .collectionlink-description p{font-size:.9em}.sqs-block-collectionlink .collection-more-link,.link-block .collection-more-link{display:none;margin-left:3px}.sqs-svg-icon--wrapper{position:relative;cursor:pointer;overflow:hidden;display:inline-block;width:32px;height:32px;text-decoration:none;-webkit-transform:translatez(0);-moz-transform:translatez(0);-ms-transform:translatez(0);-o-transform:translatez(0);transform:translatez(0)}.sqs-svg-icon--wrapper>div{position:absolute;top:0;left:0;width:100%;height:100%}.sqs-svg-icon--wrapper svg{position:absolute;top:0;left:0;width:100%;height:100%}.sqs-svg-icon--wrapper{border-color:transparent}.social-icons-size-extra-small.social-icons-style-regular .sqs-svg-icon--wrapper{width:16px;height:16px;margin:0 5px}.social-icons-size-small.social-icons-style-regular .sqs-svg-icon--wrapper{width:20px;height:20px;margin:0 6px}.social-icons-size-medium.social-icons-style-regular .sqs-svg-icon--wrapper{width:24px;height:24px;margin:0 7px}.social-icons-size-large.social-icons-style-regular .sqs-svg-icon--wrapper{width:28px;height:28px;margin:0 8px}.social-icons-size-extra-large.social-icons-style-regular .sqs-svg-icon--wrapper{width:32px;height:32px;margin:0 9px}.social-icons-size-extra-small.social-icons-style-border .sqs-svg-icon--wrapper,.social-icons-size-extra-small.social-icons-style-knockout .sqs-svg-icon--wrapper,.social-icons-size-extra-small.social-icons-style-solid .sqs-svg-icon--wrapper{width:24px;height:24px;margin:0 3px}.social-icons-size-small.social-icons-style-border .sqs-svg-icon--wrapper,.social-icons-size-small.social-icons-style-knockout .sqs-svg-icon--wrapper,.social-icons-size-small.social-icons-style-solid .sqs-svg-icon--wrapper{width:28px;height:28px;margin:0 4px}.social-icons-size-medium.social-icons-style-border .sqs-svg-icon--wrapper,.social-icons-size-medium.social-icons-style-knockout .sqs-svg-icon--wrapper,.social-icons-size-medium.social-icons-style-solid .sqs-svg-icon--wrapper{width:32px;height:32px;margin:0 4px}.social-icons-size-large.social-icons-style-border .sqs-svg-icon--wrapper,.social-icons-size-large.social-icons-style-knockout .sqs-svg-icon--wrapper,.social-icons-size-large.social-icons-style-solid .sqs-svg-icon--wrapper{width:36px;height:36px;margin:0 5px}.social-icons-size-extra-large.social-icons-style-border .sqs-svg-icon--wrapper,.social-icons-size-extra-large.social-icons-style-knockout .sqs-svg-icon--wrapper,.social-icons-size-extra-large.social-icons-style-solid .sqs-svg-icon--wrapper{width:48px;height:48px;margin:0 6px}.social-icons-shape-square .sqs-svg-icon--wrapper{border-radius:0}.social-icons-style-border.social-icons-shape-circle .sqs-svg-icon--wrapper,.social-icons-style-solid.social-icons-shape-circle .sqs-svg-icon--wrapper,.social-icons-style-knockout.social-icons-shape-circle .sqs-svg-icon--wrapper{border-radius:50%}.social-icons-style-border.social-icons-shape-rounded .sqs-svg-icon--wrapper,.social-icons-style-solid.social-icons-shape-rounded .sqs-svg-icon--wrapper,.social-icons-style-knockout.social-icons-shape-rounded .sqs-svg-icon--wrapper{border-radius:15%}.social-icons-style-border .sqs-svg-icon--wrapper{border:2px solid;box-sizing:border-box}.social-icons-style-regular .sqs-svg-icon--wrapper>div{-webkit-transform:scale(2);-moz-transform:scale(2);-ms-transform:scale(2);-o-transform:scale(2);transform:scale(2)}.sqs-svg-icon--wrapper:first-of-type{margin-left:0 !important}.sqs-svg-icon--wrapper:last-of-type{margin-right:0 !important}.social-icons-color-standard.social-icons-style-regular .fivehundredpix .sqs-use--icon{fill:#00aeef}.social-icons-color-standard.social-icons-style-regular .fivehundredpix .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .fivehundredpix .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .fivehundredpix .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .fivehundredpix .sqs-use--icon{fill:rgba(0,174,239,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .fivehundredpix:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .fivehundredpix:hover .sqs-use--icon{fill:#00aeef}.social-icons-color-standard.social-icons-style-border .fivehundredpix{border-color:#00aeef}.social-icons-color-standard.social-icons-style-border .fivehundredpix .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .fivehundredpix .sqs-use--icon{fill:#00aeef}.social-icons-color-standard.social-icons-style-border .fivehundredpix .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .fivehundredpix:hover{background-color:#00aeef}.social-icons-color-standard.social-icons-style-border .fivehundredpix:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .fivehundredpix .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .fivehundredpix .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .fivehundredpix .sqs-use--mask{fill:#00aeef}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .fivehundredpix .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .fivehundredpix .sqs-use--mask{fill:rgba(0,174,239,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .fivehundredpix:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .fivehundredpix:hover .sqs-use--mask{fill:#00aeef}.social-icons-color-standard.social-icons-style-solid .fivehundredpix .sqs-use--mask{fill:#00aeef}.social-icons-color-standard.social-icons-style-solid .fivehundredpix .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .fivehundredpix .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .fivehundredpix .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .fivehundredpix .sqs-use--mask{fill:rgba(0,174,239,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .fivehundredpix .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .fivehundredpix .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .fivehundredpix .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .fivehundredpix .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .fivehundredpix:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .fivehundredpix:hover .sqs-use--mask{fill:#00aeef}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .fivehundredpix:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .fivehundredpix:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .fivehundredpix:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .fivehundredpix:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .bandsintown .sqs-use--icon{fill:#00b4b3}.social-icons-color-standard.social-icons-style-regular .bandsintown .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .bandsintown .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .bandsintown .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .bandsintown .sqs-use--icon{fill:rgba(0,180,179,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .bandsintown:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .bandsintown:hover .sqs-use--icon{fill:#00b4b3}.social-icons-color-standard.social-icons-style-border .bandsintown{border-color:#00b4b3}.social-icons-color-standard.social-icons-style-border .bandsintown .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .bandsintown .sqs-use--icon{fill:#00b4b3}.social-icons-color-standard.social-icons-style-border .bandsintown .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .bandsintown:hover{background-color:#00b4b3}.social-icons-color-standard.social-icons-style-border .bandsintown:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .bandsintown .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .bandsintown .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .bandsintown .sqs-use--mask{fill:#00b4b3}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .bandsintown .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .bandsintown .sqs-use--mask{fill:rgba(0,180,179,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .bandsintown:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .bandsintown:hover .sqs-use--mask{fill:#00b4b3}.social-icons-color-standard.social-icons-style-solid .bandsintown .sqs-use--mask{fill:#00b4b3}.social-icons-color-standard.social-icons-style-solid .bandsintown .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .bandsintown .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .bandsintown .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .bandsintown .sqs-use--mask{fill:rgba(0,180,179,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .bandsintown .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .bandsintown .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .bandsintown .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .bandsintown .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .bandsintown:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .bandsintown:hover .sqs-use--mask{fill:#00b4b3}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .bandsintown:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .bandsintown:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .bandsintown:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .bandsintown:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .behance .sqs-use--icon{fill:#1769ff}.social-icons-color-standard.social-icons-style-regular .behance .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .behance .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .behance .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .behance .sqs-use--icon{fill:rgba(23,105,255,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .behance:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .behance:hover .sqs-use--icon{fill:#1769ff}.social-icons-color-standard.social-icons-style-border .behance{border-color:#1769ff}.social-icons-color-standard.social-icons-style-border .behance .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .behance .sqs-use--icon{fill:#1769ff}.social-icons-color-standard.social-icons-style-border .behance .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .behance:hover{background-color:#1769ff}.social-icons-color-standard.social-icons-style-border .behance:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .behance .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .behance .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .behance .sqs-use--mask{fill:#1769ff}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .behance .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .behance .sqs-use--mask{fill:rgba(23,105,255,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .behance:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .behance:hover .sqs-use--mask{fill:#1769ff}.social-icons-color-standard.social-icons-style-solid .behance .sqs-use--mask{fill:#1769ff}.social-icons-color-standard.social-icons-style-solid .behance .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .behance .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .behance .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .behance .sqs-use--mask{fill:rgba(23,105,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .behance .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .behance .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .behance .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .behance .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .behance:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .behance:hover .sqs-use--mask{fill:#1769ff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .behance:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .behance:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .behance:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .behance:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .codepen .sqs-use--icon{fill:#222}.social-icons-color-standard.social-icons-style-regular .codepen .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .codepen .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .codepen .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .codepen .sqs-use--icon{fill:rgba(34,34,34,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .codepen:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .codepen:hover .sqs-use--icon{fill:#222}.social-icons-color-standard.social-icons-style-border .codepen{border-color:#222}.social-icons-color-standard.social-icons-style-border .codepen .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .codepen .sqs-use--icon{fill:#222}.social-icons-color-standard.social-icons-style-border .codepen .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .codepen:hover{background-color:#222}.social-icons-color-standard.social-icons-style-border .codepen:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .codepen .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .codepen .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .codepen .sqs-use--mask{fill:#222}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .codepen .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .codepen .sqs-use--mask{fill:rgba(34,34,34,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .codepen:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .codepen:hover .sqs-use--mask{fill:#222}.social-icons-color-standard.social-icons-style-solid .codepen .sqs-use--mask{fill:#222}.social-icons-color-standard.social-icons-style-solid .codepen .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .codepen .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .codepen .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .codepen .sqs-use--mask{fill:rgba(34,34,34,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .codepen .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .codepen .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .codepen .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .codepen .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .codepen:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .codepen:hover .sqs-use--mask{fill:#222}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .codepen:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .codepen:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .codepen:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .codepen:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .dribbble .sqs-use--icon{fill:#ea4c89}.social-icons-color-standard.social-icons-style-regular .dribbble .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .dribbble .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .dribbble .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .dribbble .sqs-use--icon{fill:rgba(234,76,137,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .dribbble:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .dribbble:hover .sqs-use--icon{fill:#ea4c89}.social-icons-color-standard.social-icons-style-border .dribbble{border-color:#ea4c89}.social-icons-color-standard.social-icons-style-border .dribbble .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .dribbble .sqs-use--icon{fill:#ea4c89}.social-icons-color-standard.social-icons-style-border .dribbble .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .dribbble:hover{background-color:#ea4c89}.social-icons-color-standard.social-icons-style-border .dribbble:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .dribbble .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .dribbble .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .dribbble .sqs-use--mask{fill:#ea4c89}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .dribbble .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .dribbble .sqs-use--mask{fill:rgba(234,76,137,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .dribbble:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .dribbble:hover .sqs-use--mask{fill:#ea4c89}.social-icons-color-standard.social-icons-style-solid .dribbble .sqs-use--mask{fill:#ea4c89}.social-icons-color-standard.social-icons-style-solid .dribbble .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .dribbble .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .dribbble .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .dribbble .sqs-use--mask{fill:rgba(234,76,137,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .dribbble .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .dribbble .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .dribbble .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .dribbble .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .dribbble:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .dribbble:hover .sqs-use--mask{fill:#ea4c89}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .dribbble:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .dribbble:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .dribbble:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .dribbble:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .dropbox .sqs-use--icon{fill:#007ee5}.social-icons-color-standard.social-icons-style-regular .dropbox .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .dropbox .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .dropbox .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .dropbox .sqs-use--icon{fill:rgba(0,126,229,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .dropbox:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .dropbox:hover .sqs-use--icon{fill:#007ee5}.social-icons-color-standard.social-icons-style-border .dropbox{border-color:#007ee5}.social-icons-color-standard.social-icons-style-border .dropbox .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .dropbox .sqs-use--icon{fill:#007ee5}.social-icons-color-standard.social-icons-style-border .dropbox .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .dropbox:hover{background-color:#007ee5}.social-icons-color-standard.social-icons-style-border .dropbox:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .dropbox .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .dropbox .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .dropbox .sqs-use--mask{fill:#007ee5}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .dropbox .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .dropbox .sqs-use--mask{fill:rgba(0,126,229,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .dropbox:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .dropbox:hover .sqs-use--mask{fill:#007ee5}.social-icons-color-standard.social-icons-style-solid .dropbox .sqs-use--mask{fill:#007ee5}.social-icons-color-standard.social-icons-style-solid .dropbox .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .dropbox .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .dropbox .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .dropbox .sqs-use--mask{fill:rgba(0,126,229,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .dropbox .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .dropbox .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .dropbox .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .dropbox .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .dropbox:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .dropbox:hover .sqs-use--mask{fill:#007ee5}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .dropbox:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .dropbox:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .dropbox:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .dropbox:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .email .sqs-use--icon{fill:#222}.social-icons-color-standard.social-icons-style-regular .email .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .email .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .email .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .email .sqs-use--icon{fill:rgba(34,34,34,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .email:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .email:hover .sqs-use--icon{fill:#222}.social-icons-color-standard.social-icons-style-border .email{border-color:#222}.social-icons-color-standard.social-icons-style-border .email .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .email .sqs-use--icon{fill:#222}.social-icons-color-standard.social-icons-style-border .email .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .email:hover{background-color:#222}.social-icons-color-standard.social-icons-style-border .email:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .email .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .email .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .email .sqs-use--mask{fill:#222}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .email .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .email .sqs-use--mask{fill:rgba(34,34,34,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .email:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .email:hover .sqs-use--mask{fill:#222}.social-icons-color-standard.social-icons-style-solid .email .sqs-use--mask{fill:#222}.social-icons-color-standard.social-icons-style-solid .email .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .email .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .email .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .email .sqs-use--mask{fill:rgba(34,34,34,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .email .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .email .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .email .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .email .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .email:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .email:hover .sqs-use--mask{fill:#222}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .email:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .email:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .email:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .email:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .facebook .sqs-use--icon{fill:#3b5998}.social-icons-color-standard.social-icons-style-regular .facebook .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .facebook .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .facebook .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .facebook .sqs-use--icon{fill:rgba(59,89,152,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .facebook:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .facebook:hover .sqs-use--icon{fill:#3b5998}.social-icons-color-standard.social-icons-style-border .facebook{border-color:#3b5998}.social-icons-color-standard.social-icons-style-border .facebook .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .facebook .sqs-use--icon{fill:#3b5998}.social-icons-color-standard.social-icons-style-border .facebook .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .facebook:hover{background-color:#3b5998}.social-icons-color-standard.social-icons-style-border .facebook:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .facebook .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .facebook .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .facebook .sqs-use--mask{fill:#3b5998}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .facebook .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .facebook .sqs-use--mask{fill:rgba(59,89,152,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .facebook:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .facebook:hover .sqs-use--mask{fill:#3b5998}.social-icons-color-standard.social-icons-style-solid .facebook .sqs-use--mask{fill:#3b5998}.social-icons-color-standard.social-icons-style-solid .facebook .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .facebook .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .facebook .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .facebook .sqs-use--mask{fill:rgba(59,89,152,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .facebook .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .facebook .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .facebook .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .facebook .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .facebook:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .facebook:hover .sqs-use--mask{fill:#3b5998}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .facebook:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .facebook:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .facebook:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .facebook:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .flickr .sqs-use--icon{fill:#0063dc}.social-icons-color-standard.social-icons-style-regular .flickr .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .flickr .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .flickr .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .flickr .sqs-use--icon{fill:rgba(0,99,220,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .flickr:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .flickr:hover .sqs-use--icon{fill:#0063dc}.social-icons-color-standard.social-icons-style-border .flickr{border-color:#0063dc}.social-icons-color-standard.social-icons-style-border .flickr .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .flickr .sqs-use--icon{fill:#0063dc}.social-icons-color-standard.social-icons-style-border .flickr .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .flickr:hover{background-color:#0063dc}.social-icons-color-standard.social-icons-style-border .flickr:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .flickr .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .flickr .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .flickr .sqs-use--mask{fill:#0063dc}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .flickr .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .flickr .sqs-use--mask{fill:rgba(0,99,220,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .flickr:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .flickr:hover .sqs-use--mask{fill:#0063dc}.social-icons-color-standard.social-icons-style-solid .flickr .sqs-use--mask{fill:#0063dc}.social-icons-color-standard.social-icons-style-solid .flickr .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .flickr .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .flickr .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .flickr .sqs-use--mask{fill:rgba(0,99,220,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .flickr .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .flickr .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .flickr .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .flickr .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .flickr:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .flickr:hover .sqs-use--mask{fill:#0063dc}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .flickr:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .flickr:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .flickr:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .flickr:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .foursquare .sqs-use--icon{fill:#f94877}.social-icons-color-standard.social-icons-style-regular .foursquare .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .foursquare .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .foursquare .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .foursquare .sqs-use--icon{fill:rgba(249,72,119,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .foursquare:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .foursquare:hover .sqs-use--icon{fill:#f94877}.social-icons-color-standard.social-icons-style-border .foursquare{border-color:#f94877}.social-icons-color-standard.social-icons-style-border .foursquare .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .foursquare .sqs-use--icon{fill:#f94877}.social-icons-color-standard.social-icons-style-border .foursquare .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .foursquare:hover{background-color:#f94877}.social-icons-color-standard.social-icons-style-border .foursquare:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .foursquare .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .foursquare .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .foursquare .sqs-use--mask{fill:#f94877}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .foursquare .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .foursquare .sqs-use--mask{fill:rgba(249,72,119,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .foursquare:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .foursquare:hover .sqs-use--mask{fill:#f94877}.social-icons-color-standard.social-icons-style-solid .foursquare .sqs-use--mask{fill:#f94877}.social-icons-color-standard.social-icons-style-solid .foursquare .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .foursquare .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .foursquare .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .foursquare .sqs-use--mask{fill:rgba(249,72,119,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .foursquare .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .foursquare .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .foursquare .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .foursquare .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .foursquare:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .foursquare:hover .sqs-use--mask{fill:#f94877}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .foursquare:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .foursquare:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .foursquare:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .foursquare:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .github .sqs-use--icon{fill:#4183c4}.social-icons-color-standard.social-icons-style-regular .github .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .github .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .github .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .github .sqs-use--icon{fill:rgba(65,131,196,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .github:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .github:hover .sqs-use--icon{fill:#4183c4}.social-icons-color-standard.social-icons-style-border .github{border-color:#4183c4}.social-icons-color-standard.social-icons-style-border .github .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .github .sqs-use--icon{fill:#4183c4}.social-icons-color-standard.social-icons-style-border .github .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .github:hover{background-color:#4183c4}.social-icons-color-standard.social-icons-style-border .github:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .github .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .github .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .github .sqs-use--mask{fill:#4183c4}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .github .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .github .sqs-use--mask{fill:rgba(65,131,196,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .github:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .github:hover .sqs-use--mask{fill:#4183c4}.social-icons-color-standard.social-icons-style-solid .github .sqs-use--mask{fill:#4183c4}.social-icons-color-standard.social-icons-style-solid .github .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .github .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .github .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .github .sqs-use--mask{fill:rgba(65,131,196,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .github .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .github .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .github .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .github .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .github:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .github:hover .sqs-use--mask{fill:#4183c4}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .github:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .github:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .github:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .github:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .googleplay .sqs-use--icon{fill:#5adfcb}.social-icons-color-standard.social-icons-style-regular .googleplay .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .googleplay .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .googleplay .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .googleplay .sqs-use--icon{fill:rgba(90,223,203,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .googleplay:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .googleplay:hover .sqs-use--icon{fill:#5adfcb}.social-icons-color-standard.social-icons-style-border .googleplay{border-color:#5adfcb}.social-icons-color-standard.social-icons-style-border .googleplay .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .googleplay .sqs-use--icon{fill:#5adfcb}.social-icons-color-standard.social-icons-style-border .googleplay .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .googleplay:hover{background-color:#5adfcb}.social-icons-color-standard.social-icons-style-border .googleplay:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .googleplay .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .googleplay .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .googleplay .sqs-use--mask{fill:#5adfcb}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .googleplay .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .googleplay .sqs-use--mask{fill:rgba(90,223,203,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .googleplay:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .googleplay:hover .sqs-use--mask{fill:#5adfcb}.social-icons-color-standard.social-icons-style-solid .googleplay .sqs-use--mask{fill:#5adfcb}.social-icons-color-standard.social-icons-style-solid .googleplay .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .googleplay .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .googleplay .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .googleplay .sqs-use--mask{fill:rgba(90,223,203,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .googleplay .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .googleplay .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .googleplay .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .googleplay .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .googleplay:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .googleplay:hover .sqs-use--mask{fill:#5adfcb}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .googleplay:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .googleplay:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .googleplay:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .googleplay:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .google .sqs-use--icon{fill:#dd4b39}.social-icons-color-standard.social-icons-style-regular .google .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .google .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .google .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .google .sqs-use--icon{fill:rgba(221,75,57,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .google:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .google:hover .sqs-use--icon{fill:#dd4b39}.social-icons-color-standard.social-icons-style-border .google{border-color:#dd4b39}.social-icons-color-standard.social-icons-style-border .google .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .google .sqs-use--icon{fill:#dd4b39}.social-icons-color-standard.social-icons-style-border .google .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .google:hover{background-color:#dd4b39}.social-icons-color-standard.social-icons-style-border .google:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .google .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .google .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .google .sqs-use--mask{fill:#dd4b39}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .google .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .google .sqs-use--mask{fill:rgba(221,75,57,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .google:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .google:hover .sqs-use--mask{fill:#dd4b39}.social-icons-color-standard.social-icons-style-solid .google .sqs-use--mask{fill:#dd4b39}.social-icons-color-standard.social-icons-style-solid .google .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .google .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .google .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .google .sqs-use--mask{fill:rgba(221,75,57,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .google .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .google .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .google .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .google .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .google:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .google:hover .sqs-use--mask{fill:#dd4b39}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .google:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .google:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .google:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .google:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .houzz .sqs-use--icon{fill:#7ac143}.social-icons-color-standard.social-icons-style-regular .houzz .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .houzz .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .houzz .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .houzz .sqs-use--icon{fill:rgba(122,193,67,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .houzz:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .houzz:hover .sqs-use--icon{fill:#7ac143}.social-icons-color-standard.social-icons-style-border .houzz{border-color:#7ac143}.social-icons-color-standard.social-icons-style-border .houzz .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .houzz .sqs-use--icon{fill:#7ac143}.social-icons-color-standard.social-icons-style-border .houzz .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .houzz:hover{background-color:#7ac143}.social-icons-color-standard.social-icons-style-border .houzz:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .houzz .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .houzz .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .houzz .sqs-use--mask{fill:#7ac143}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .houzz .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .houzz .sqs-use--mask{fill:rgba(122,193,67,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .houzz:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .houzz:hover .sqs-use--mask{fill:#7ac143}.social-icons-color-standard.social-icons-style-solid .houzz .sqs-use--mask{fill:#7ac143}.social-icons-color-standard.social-icons-style-solid .houzz .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .houzz .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .houzz .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .houzz .sqs-use--mask{fill:rgba(122,193,67,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .houzz .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .houzz .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .houzz .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .houzz .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .houzz:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .houzz:hover .sqs-use--mask{fill:#7ac143}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .houzz:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .houzz:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .houzz:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .houzz:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .instagram .sqs-use--icon{fill:#3f729b}.social-icons-color-standard.social-icons-style-regular .instagram .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .instagram .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .instagram .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .instagram .sqs-use--icon{fill:rgba(63,114,155,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .instagram:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .instagram:hover .sqs-use--icon{fill:#3f729b}.social-icons-color-standard.social-icons-style-border .instagram{border-color:#3f729b}.social-icons-color-standard.social-icons-style-border .instagram .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .instagram .sqs-use--icon{fill:#3f729b}.social-icons-color-standard.social-icons-style-border .instagram .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .instagram:hover{background-color:#3f729b}.social-icons-color-standard.social-icons-style-border .instagram:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .instagram .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .instagram .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .instagram .sqs-use--mask{fill:#3f729b}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .instagram .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .instagram .sqs-use--mask{fill:rgba(63,114,155,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .instagram:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .instagram:hover .sqs-use--mask{fill:#3f729b}.social-icons-color-standard.social-icons-style-solid .instagram .sqs-use--mask{fill:#3f729b}.social-icons-color-standard.social-icons-style-solid .instagram .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .instagram .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .instagram .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .instagram .sqs-use--mask{fill:rgba(63,114,155,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .instagram .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .instagram .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .instagram .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .instagram .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .instagram:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .instagram:hover .sqs-use--mask{fill:#3f729b}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .instagram:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .instagram:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .instagram:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .instagram:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .itunes .sqs-use--icon{fill:#ff3241}.social-icons-color-standard.social-icons-style-regular .itunes .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .itunes .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .itunes .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .itunes .sqs-use--icon{fill:rgba(255,50,65,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .itunes:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .itunes:hover .sqs-use--icon{fill:#ff3241}.social-icons-color-standard.social-icons-style-border .itunes{border-color:#ff3241}.social-icons-color-standard.social-icons-style-border .itunes .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .itunes .sqs-use--icon{fill:#ff3241}.social-icons-color-standard.social-icons-style-border .itunes .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .itunes:hover{background-color:#ff3241}.social-icons-color-standard.social-icons-style-border .itunes:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .itunes .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .itunes .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .itunes .sqs-use--mask{fill:#ff3241}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .itunes .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .itunes .sqs-use--mask{fill:rgba(255,50,65,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .itunes:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .itunes:hover .sqs-use--mask{fill:#ff3241}.social-icons-color-standard.social-icons-style-solid .itunes .sqs-use--mask{fill:#ff3241}.social-icons-color-standard.social-icons-style-solid .itunes .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .itunes .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .itunes .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .itunes .sqs-use--mask{fill:rgba(255,50,65,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .itunes .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .itunes .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .itunes .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .itunes .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .itunes:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .itunes:hover .sqs-use--mask{fill:#ff3241}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .itunes:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .itunes:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .itunes:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .itunes:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .linkedin .sqs-use--icon{fill:#0976b4}.social-icons-color-standard.social-icons-style-regular .linkedin .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .linkedin .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .linkedin .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .linkedin .sqs-use--icon{fill:rgba(9,118,180,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .linkedin:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .linkedin:hover .sqs-use--icon{fill:#0976b4}.social-icons-color-standard.social-icons-style-border .linkedin{border-color:#0976b4}.social-icons-color-standard.social-icons-style-border .linkedin .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .linkedin .sqs-use--icon{fill:#0976b4}.social-icons-color-standard.social-icons-style-border .linkedin .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .linkedin:hover{background-color:#0976b4}.social-icons-color-standard.social-icons-style-border .linkedin:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .linkedin .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .linkedin .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .linkedin .sqs-use--mask{fill:#0976b4}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .linkedin .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .linkedin .sqs-use--mask{fill:rgba(9,118,180,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .linkedin:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .linkedin:hover .sqs-use--mask{fill:#0976b4}.social-icons-color-standard.social-icons-style-solid .linkedin .sqs-use--mask{fill:#0976b4}.social-icons-color-standard.social-icons-style-solid .linkedin .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .linkedin .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .linkedin .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .linkedin .sqs-use--mask{fill:rgba(9,118,180,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .linkedin .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .linkedin .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .linkedin .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .linkedin .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .linkedin:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .linkedin:hover .sqs-use--mask{fill:#0976b4}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .linkedin:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .linkedin:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .linkedin:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .linkedin:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .medium .sqs-use--icon{fill:#222}.social-icons-color-standard.social-icons-style-regular .medium .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .medium .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .medium .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .medium .sqs-use--icon{fill:rgba(34,34,34,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .medium:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .medium:hover .sqs-use--icon{fill:#222}.social-icons-color-standard.social-icons-style-border .medium{border-color:#222}.social-icons-color-standard.social-icons-style-border .medium .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .medium .sqs-use--icon{fill:#222}.social-icons-color-standard.social-icons-style-border .medium .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .medium:hover{background-color:#222}.social-icons-color-standard.social-icons-style-border .medium:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .medium .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .medium .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .medium .sqs-use--mask{fill:#222}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .medium .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .medium .sqs-use--mask{fill:rgba(34,34,34,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .medium:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .medium:hover .sqs-use--mask{fill:#222}.social-icons-color-standard.social-icons-style-solid .medium .sqs-use--mask{fill:#222}.social-icons-color-standard.social-icons-style-solid .medium .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .medium .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .medium .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .medium .sqs-use--mask{fill:rgba(34,34,34,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .medium .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .medium .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .medium .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .medium .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .medium:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .medium:hover .sqs-use--mask{fill:#222}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .medium:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .medium:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .medium:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .medium:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .meetup .sqs-use--icon{fill:#e0393e}.social-icons-color-standard.social-icons-style-regular .meetup .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .meetup .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .meetup .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .meetup .sqs-use--icon{fill:rgba(224,57,62,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .meetup:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .meetup:hover .sqs-use--icon{fill:#e0393e}.social-icons-color-standard.social-icons-style-border .meetup{border-color:#e0393e}.social-icons-color-standard.social-icons-style-border .meetup .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .meetup .sqs-use--icon{fill:#e0393e}.social-icons-color-standard.social-icons-style-border .meetup .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .meetup:hover{background-color:#e0393e}.social-icons-color-standard.social-icons-style-border .meetup:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .meetup .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .meetup .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .meetup .sqs-use--mask{fill:#e0393e}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .meetup .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .meetup .sqs-use--mask{fill:rgba(224,57,62,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .meetup:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .meetup:hover .sqs-use--mask{fill:#e0393e}.social-icons-color-standard.social-icons-style-solid .meetup .sqs-use--mask{fill:#e0393e}.social-icons-color-standard.social-icons-style-solid .meetup .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .meetup .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .meetup .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .meetup .sqs-use--mask{fill:rgba(224,57,62,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .meetup .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .meetup .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .meetup .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .meetup .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .meetup:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .meetup:hover .sqs-use--mask{fill:#e0393e}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .meetup:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .meetup:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .meetup:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .meetup:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .pinterest .sqs-use--icon{fill:#cc2127}.social-icons-color-standard.social-icons-style-regular .pinterest .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .pinterest .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .pinterest .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .pinterest .sqs-use--icon{fill:rgba(204,33,39,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .pinterest:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .pinterest:hover .sqs-use--icon{fill:#cc2127}.social-icons-color-standard.social-icons-style-border .pinterest{border-color:#cc2127}.social-icons-color-standard.social-icons-style-border .pinterest .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .pinterest .sqs-use--icon{fill:#cc2127}.social-icons-color-standard.social-icons-style-border .pinterest .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .pinterest:hover{background-color:#cc2127}.social-icons-color-standard.social-icons-style-border .pinterest:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .pinterest .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .pinterest .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .pinterest .sqs-use--mask{fill:#cc2127}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .pinterest .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .pinterest .sqs-use--mask{fill:rgba(204,33,39,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .pinterest:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .pinterest:hover .sqs-use--mask{fill:#cc2127}.social-icons-color-standard.social-icons-style-solid .pinterest .sqs-use--mask{fill:#cc2127}.social-icons-color-standard.social-icons-style-solid .pinterest .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .pinterest .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .pinterest .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .pinterest .sqs-use--mask{fill:rgba(204,33,39,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .pinterest .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .pinterest .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .pinterest .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .pinterest .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .pinterest:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .pinterest:hover .sqs-use--mask{fill:#cc2127}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .pinterest:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .pinterest:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .pinterest:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .pinterest:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .rdio .sqs-use--icon{fill:#006ed2}.social-icons-color-standard.social-icons-style-regular .rdio .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .rdio .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .rdio .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .rdio .sqs-use--icon{fill:rgba(0,110,210,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .rdio:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .rdio:hover .sqs-use--icon{fill:#006ed2}.social-icons-color-standard.social-icons-style-border .rdio{border-color:#006ed2}.social-icons-color-standard.social-icons-style-border .rdio .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .rdio .sqs-use--icon{fill:#006ed2}.social-icons-color-standard.social-icons-style-border .rdio .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .rdio:hover{background-color:#006ed2}.social-icons-color-standard.social-icons-style-border .rdio:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .rdio .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .rdio .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .rdio .sqs-use--mask{fill:#006ed2}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .rdio .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .rdio .sqs-use--mask{fill:rgba(0,110,210,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .rdio:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .rdio:hover .sqs-use--mask{fill:#006ed2}.social-icons-color-standard.social-icons-style-solid .rdio .sqs-use--mask{fill:#006ed2}.social-icons-color-standard.social-icons-style-solid .rdio .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .rdio .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .rdio .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .rdio .sqs-use--mask{fill:rgba(0,110,210,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .rdio .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .rdio .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .rdio .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .rdio .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .rdio:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .rdio:hover .sqs-use--mask{fill:#006ed2}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .rdio:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .rdio:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .rdio:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .rdio:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .reddit .sqs-use--icon{fill:#ff4500}.social-icons-color-standard.social-icons-style-regular .reddit .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .reddit .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .reddit .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .reddit .sqs-use--icon{fill:rgba(255,69,0,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .reddit:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .reddit:hover .sqs-use--icon{fill:#ff4500}.social-icons-color-standard.social-icons-style-border .reddit{border-color:#ff4500}.social-icons-color-standard.social-icons-style-border .reddit .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .reddit .sqs-use--icon{fill:#ff4500}.social-icons-color-standard.social-icons-style-border .reddit .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .reddit:hover{background-color:#ff4500}.social-icons-color-standard.social-icons-style-border .reddit:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .reddit .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .reddit .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .reddit .sqs-use--mask{fill:#ff4500}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .reddit .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .reddit .sqs-use--mask{fill:rgba(255,69,0,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .reddit:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .reddit:hover .sqs-use--mask{fill:#ff4500}.social-icons-color-standard.social-icons-style-solid .reddit .sqs-use--mask{fill:#ff4500}.social-icons-color-standard.social-icons-style-solid .reddit .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .reddit .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .reddit .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .reddit .sqs-use--mask{fill:rgba(255,69,0,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .reddit .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .reddit .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .reddit .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .reddit .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .reddit:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .reddit:hover .sqs-use--mask{fill:#ff4500}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .reddit:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .reddit:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .reddit:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .reddit:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .rss .sqs-use--icon{fill:#222}.social-icons-color-standard.social-icons-style-regular .rss .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .rss .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .rss .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .rss .sqs-use--icon{fill:rgba(34,34,34,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .rss:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .rss:hover .sqs-use--icon{fill:#222}.social-icons-color-standard.social-icons-style-border .rss{border-color:#222}.social-icons-color-standard.social-icons-style-border .rss .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .rss .sqs-use--icon{fill:#222}.social-icons-color-standard.social-icons-style-border .rss .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .rss:hover{background-color:#222}.social-icons-color-standard.social-icons-style-border .rss:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .rss .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .rss .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .rss .sqs-use--mask{fill:#222}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .rss .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .rss .sqs-use--mask{fill:rgba(34,34,34,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .rss:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .rss:hover .sqs-use--mask{fill:#222}.social-icons-color-standard.social-icons-style-solid .rss .sqs-use--mask{fill:#222}.social-icons-color-standard.social-icons-style-solid .rss .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .rss .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .rss .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .rss .sqs-use--mask{fill:rgba(34,34,34,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .rss .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .rss .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .rss .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .rss .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .rss:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .rss:hover .sqs-use--mask{fill:#222}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .rss:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .rss:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .rss:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .rss:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .smugmug .sqs-use--icon{fill:#7dbb00}.social-icons-color-standard.social-icons-style-regular .smugmug .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .smugmug .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .smugmug .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .smugmug .sqs-use--icon{fill:rgba(125,187,0,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .smugmug:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .smugmug:hover .sqs-use--icon{fill:#7dbb00}.social-icons-color-standard.social-icons-style-border .smugmug{border-color:#7dbb00}.social-icons-color-standard.social-icons-style-border .smugmug .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .smugmug .sqs-use--icon{fill:#7dbb00}.social-icons-color-standard.social-icons-style-border .smugmug .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .smugmug:hover{background-color:#7dbb00}.social-icons-color-standard.social-icons-style-border .smugmug:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .smugmug .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .smugmug .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .smugmug .sqs-use--mask{fill:#7dbb00}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .smugmug .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .smugmug .sqs-use--mask{fill:rgba(125,187,0,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .smugmug:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .smugmug:hover .sqs-use--mask{fill:#7dbb00}.social-icons-color-standard.social-icons-style-solid .smugmug .sqs-use--mask{fill:#7dbb00}.social-icons-color-standard.social-icons-style-solid .smugmug .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .smugmug .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .smugmug .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .smugmug .sqs-use--mask{fill:rgba(125,187,0,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .smugmug .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .smugmug .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .smugmug .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .smugmug .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .smugmug:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .smugmug:hover .sqs-use--mask{fill:#7dbb00}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .smugmug:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .smugmug:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .smugmug:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .smugmug:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .soundcloud .sqs-use--icon{fill:#f60}.social-icons-color-standard.social-icons-style-regular .soundcloud .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .soundcloud .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .soundcloud .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .soundcloud .sqs-use--icon{fill:rgba(255,102,0,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .soundcloud:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .soundcloud:hover .sqs-use--icon{fill:#f60}.social-icons-color-standard.social-icons-style-border .soundcloud{border-color:#f60}.social-icons-color-standard.social-icons-style-border .soundcloud .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .soundcloud .sqs-use--icon{fill:#f60}.social-icons-color-standard.social-icons-style-border .soundcloud .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .soundcloud:hover{background-color:#f60}.social-icons-color-standard.social-icons-style-border .soundcloud:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .soundcloud .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .soundcloud .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .soundcloud .sqs-use--mask{fill:#f60}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .soundcloud .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .soundcloud .sqs-use--mask{fill:rgba(255,102,0,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .soundcloud:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .soundcloud:hover .sqs-use--mask{fill:#f60}.social-icons-color-standard.social-icons-style-solid .soundcloud .sqs-use--mask{fill:#f60}.social-icons-color-standard.social-icons-style-solid .soundcloud .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .soundcloud .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .soundcloud .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .soundcloud .sqs-use--mask{fill:rgba(255,102,0,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .soundcloud .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .soundcloud .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .soundcloud .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .soundcloud .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .soundcloud:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .soundcloud:hover .sqs-use--mask{fill:#f60}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .soundcloud:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .soundcloud:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .soundcloud:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .soundcloud:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .spotify .sqs-use--icon{fill:#84bd00}.social-icons-color-standard.social-icons-style-regular .spotify .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .spotify .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .spotify .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .spotify .sqs-use--icon{fill:rgba(132,189,0,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .spotify:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .spotify:hover .sqs-use--icon{fill:#84bd00}.social-icons-color-standard.social-icons-style-border .spotify{border-color:#84bd00}.social-icons-color-standard.social-icons-style-border .spotify .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .spotify .sqs-use--icon{fill:#84bd00}.social-icons-color-standard.social-icons-style-border .spotify .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .spotify:hover{background-color:#84bd00}.social-icons-color-standard.social-icons-style-border .spotify:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .spotify .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .spotify .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .spotify .sqs-use--mask{fill:#84bd00}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .spotify .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .spotify .sqs-use--mask{fill:rgba(132,189,0,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .spotify:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .spotify:hover .sqs-use--mask{fill:#84bd00}.social-icons-color-standard.social-icons-style-solid .spotify .sqs-use--mask{fill:#84bd00}.social-icons-color-standard.social-icons-style-solid .spotify .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .spotify .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .spotify .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .spotify .sqs-use--mask{fill:rgba(132,189,0,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .spotify .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .spotify .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .spotify .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .spotify .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .spotify:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .spotify:hover .sqs-use--mask{fill:#84bd00}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .spotify:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .spotify:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .spotify:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .spotify:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .squarespace .sqs-use--icon{fill:#222}.social-icons-color-standard.social-icons-style-regular .squarespace .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .squarespace .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .squarespace .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .squarespace .sqs-use--icon{fill:rgba(34,34,34,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .squarespace:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .squarespace:hover .sqs-use--icon{fill:#222}.social-icons-color-standard.social-icons-style-border .squarespace{border-color:#222}.social-icons-color-standard.social-icons-style-border .squarespace .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .squarespace .sqs-use--icon{fill:#222}.social-icons-color-standard.social-icons-style-border .squarespace .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .squarespace:hover{background-color:#222}.social-icons-color-standard.social-icons-style-border .squarespace:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .squarespace .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .squarespace .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .squarespace .sqs-use--mask{fill:#222}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .squarespace .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .squarespace .sqs-use--mask{fill:rgba(34,34,34,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .squarespace:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .squarespace:hover .sqs-use--mask{fill:#222}.social-icons-color-standard.social-icons-style-solid .squarespace .sqs-use--mask{fill:#222}.social-icons-color-standard.social-icons-style-solid .squarespace .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .squarespace .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .squarespace .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .squarespace .sqs-use--mask{fill:rgba(34,34,34,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .squarespace .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .squarespace .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .squarespace .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .squarespace .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .squarespace:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .squarespace:hover .sqs-use--mask{fill:#222}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .squarespace:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .squarespace:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .squarespace:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .squarespace:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .stumbleupon .sqs-use--icon{fill:#eb4924}.social-icons-color-standard.social-icons-style-regular .stumbleupon .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .stumbleupon .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .stumbleupon .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .stumbleupon .sqs-use--icon{fill:rgba(235,73,36,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .stumbleupon:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .stumbleupon:hover .sqs-use--icon{fill:#eb4924}.social-icons-color-standard.social-icons-style-border .stumbleupon{border-color:#eb4924}.social-icons-color-standard.social-icons-style-border .stumbleupon .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .stumbleupon .sqs-use--icon{fill:#eb4924}.social-icons-color-standard.social-icons-style-border .stumbleupon .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .stumbleupon:hover{background-color:#eb4924}.social-icons-color-standard.social-icons-style-border .stumbleupon:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .stumbleupon .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .stumbleupon .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .stumbleupon .sqs-use--mask{fill:#eb4924}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .stumbleupon .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .stumbleupon .sqs-use--mask{fill:rgba(235,73,36,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .stumbleupon:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .stumbleupon:hover .sqs-use--mask{fill:#eb4924}.social-icons-color-standard.social-icons-style-solid .stumbleupon .sqs-use--mask{fill:#eb4924}.social-icons-color-standard.social-icons-style-solid .stumbleupon .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .stumbleupon .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .stumbleupon .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .stumbleupon .sqs-use--mask{fill:rgba(235,73,36,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .stumbleupon .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .stumbleupon .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .stumbleupon .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .stumbleupon .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .stumbleupon:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .stumbleupon:hover .sqs-use--mask{fill:#eb4924}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .stumbleupon:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .stumbleupon:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .stumbleupon:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .stumbleupon:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .tumblr .sqs-use--icon{fill:#35465d}.social-icons-color-standard.social-icons-style-regular .tumblr .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .tumblr .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .tumblr .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .tumblr .sqs-use--icon{fill:rgba(53,70,93,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .tumblr:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .tumblr:hover .sqs-use--icon{fill:#35465d}.social-icons-color-standard.social-icons-style-border .tumblr{border-color:#35465d}.social-icons-color-standard.social-icons-style-border .tumblr .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .tumblr .sqs-use--icon{fill:#35465d}.social-icons-color-standard.social-icons-style-border .tumblr .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .tumblr:hover{background-color:#35465d}.social-icons-color-standard.social-icons-style-border .tumblr:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .tumblr .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .tumblr .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .tumblr .sqs-use--mask{fill:#35465d}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .tumblr .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .tumblr .sqs-use--mask{fill:rgba(53,70,93,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .tumblr:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .tumblr:hover .sqs-use--mask{fill:#35465d}.social-icons-color-standard.social-icons-style-solid .tumblr .sqs-use--mask{fill:#35465d}.social-icons-color-standard.social-icons-style-solid .tumblr .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .tumblr .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .tumblr .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .tumblr .sqs-use--mask{fill:rgba(53,70,93,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .tumblr .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .tumblr .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .tumblr .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .tumblr .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .tumblr:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .tumblr:hover .sqs-use--mask{fill:#35465d}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .tumblr:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .tumblr:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .tumblr:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .tumblr:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .twitch .sqs-use--icon{fill:#6441a5}.social-icons-color-standard.social-icons-style-regular .twitch .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .twitch .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .twitch .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .twitch .sqs-use--icon{fill:rgba(100,65,165,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .twitch:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .twitch:hover .sqs-use--icon{fill:#6441a5}.social-icons-color-standard.social-icons-style-border .twitch{border-color:#6441a5}.social-icons-color-standard.social-icons-style-border .twitch .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .twitch .sqs-use--icon{fill:#6441a5}.social-icons-color-standard.social-icons-style-border .twitch .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .twitch:hover{background-color:#6441a5}.social-icons-color-standard.social-icons-style-border .twitch:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .twitch .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .twitch .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .twitch .sqs-use--mask{fill:#6441a5}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .twitch .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .twitch .sqs-use--mask{fill:rgba(100,65,165,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .twitch:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .twitch:hover .sqs-use--mask{fill:#6441a5}.social-icons-color-standard.social-icons-style-solid .twitch .sqs-use--mask{fill:#6441a5}.social-icons-color-standard.social-icons-style-solid .twitch .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .twitch .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .twitch .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .twitch .sqs-use--mask{fill:rgba(100,65,165,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .twitch .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .twitch .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .twitch .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .twitch .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .twitch:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .twitch:hover .sqs-use--mask{fill:#6441a5}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .twitch:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .twitch:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .twitch:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .twitch:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .twitter .sqs-use--icon{fill:#55acee}.social-icons-color-standard.social-icons-style-regular .twitter .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .twitter .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .twitter .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .twitter .sqs-use--icon{fill:rgba(85,172,238,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .twitter:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .twitter:hover .sqs-use--icon{fill:#55acee}.social-icons-color-standard.social-icons-style-border .twitter{border-color:#55acee}.social-icons-color-standard.social-icons-style-border .twitter .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .twitter .sqs-use--icon{fill:#55acee}.social-icons-color-standard.social-icons-style-border .twitter .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .twitter:hover{background-color:#55acee}.social-icons-color-standard.social-icons-style-border .twitter:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .twitter .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .twitter .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .twitter .sqs-use--mask{fill:#55acee}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .twitter .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .twitter .sqs-use--mask{fill:rgba(85,172,238,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .twitter:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .twitter:hover .sqs-use--mask{fill:#55acee}.social-icons-color-standard.social-icons-style-solid .twitter .sqs-use--mask{fill:#55acee}.social-icons-color-standard.social-icons-style-solid .twitter .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .twitter .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .twitter .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .twitter .sqs-use--mask{fill:rgba(85,172,238,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .twitter .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .twitter .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .twitter .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .twitter .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .twitter:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .twitter:hover .sqs-use--mask{fill:#55acee}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .twitter:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .twitter:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .twitter:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .twitter:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .vevo .sqs-use--icon{fill:#ff0031}.social-icons-color-standard.social-icons-style-regular .vevo .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .vevo .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .vevo .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .vevo .sqs-use--icon{fill:rgba(255,0,49,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .vevo:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .vevo:hover .sqs-use--icon{fill:#ff0031}.social-icons-color-standard.social-icons-style-border .vevo{border-color:#ff0031}.social-icons-color-standard.social-icons-style-border .vevo .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .vevo .sqs-use--icon{fill:#ff0031}.social-icons-color-standard.social-icons-style-border .vevo .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .vevo:hover{background-color:#ff0031}.social-icons-color-standard.social-icons-style-border .vevo:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .vevo .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .vevo .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .vevo .sqs-use--mask{fill:#ff0031}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .vevo .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .vevo .sqs-use--mask{fill:rgba(255,0,49,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .vevo:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .vevo:hover .sqs-use--mask{fill:#ff0031}.social-icons-color-standard.social-icons-style-solid .vevo .sqs-use--mask{fill:#ff0031}.social-icons-color-standard.social-icons-style-solid .vevo .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .vevo .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .vevo .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .vevo .sqs-use--mask{fill:rgba(255,0,49,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .vevo .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .vevo .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .vevo .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .vevo .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .vevo:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .vevo:hover .sqs-use--mask{fill:#ff0031}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .vevo:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .vevo:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .vevo:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .vevo:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .vimeo .sqs-use--icon{fill:#1ab7ea}.social-icons-color-standard.social-icons-style-regular .vimeo .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .vimeo .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .vimeo .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .vimeo .sqs-use--icon{fill:rgba(26,183,234,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .vimeo:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .vimeo:hover .sqs-use--icon{fill:#1ab7ea}.social-icons-color-standard.social-icons-style-border .vimeo{border-color:#1ab7ea}.social-icons-color-standard.social-icons-style-border .vimeo .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .vimeo .sqs-use--icon{fill:#1ab7ea}.social-icons-color-standard.social-icons-style-border .vimeo .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .vimeo:hover{background-color:#1ab7ea}.social-icons-color-standard.social-icons-style-border .vimeo:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .vimeo .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .vimeo .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .vimeo .sqs-use--mask{fill:#1ab7ea}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .vimeo .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .vimeo .sqs-use--mask{fill:rgba(26,183,234,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .vimeo:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .vimeo:hover .sqs-use--mask{fill:#1ab7ea}.social-icons-color-standard.social-icons-style-solid .vimeo .sqs-use--mask{fill:#1ab7ea}.social-icons-color-standard.social-icons-style-solid .vimeo .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .vimeo .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .vimeo .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .vimeo .sqs-use--mask{fill:rgba(26,183,234,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .vimeo .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .vimeo .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .vimeo .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .vimeo .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .vimeo:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .vimeo:hover .sqs-use--mask{fill:#1ab7ea}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .vimeo:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .vimeo:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .vimeo:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .vimeo:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .vine .sqs-use--icon{fill:#00b488}.social-icons-color-standard.social-icons-style-regular .vine .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .vine .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .vine .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .vine .sqs-use--icon{fill:rgba(0,180,136,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .vine:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .vine:hover .sqs-use--icon{fill:#00b488}.social-icons-color-standard.social-icons-style-border .vine{border-color:#00b488}.social-icons-color-standard.social-icons-style-border .vine .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .vine .sqs-use--icon{fill:#00b488}.social-icons-color-standard.social-icons-style-border .vine .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .vine:hover{background-color:#00b488}.social-icons-color-standard.social-icons-style-border .vine:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .vine .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .vine .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .vine .sqs-use--mask{fill:#00b488}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .vine .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .vine .sqs-use--mask{fill:rgba(0,180,136,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .vine:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .vine:hover .sqs-use--mask{fill:#00b488}.social-icons-color-standard.social-icons-style-solid .vine .sqs-use--mask{fill:#00b488}.social-icons-color-standard.social-icons-style-solid .vine .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .vine .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .vine .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .vine .sqs-use--mask{fill:rgba(0,180,136,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .vine .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .vine .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .vine .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .vine .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .vine:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .vine:hover .sqs-use--mask{fill:#00b488}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .vine:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .vine:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .vine:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .vine:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .vsco .sqs-use--icon{fill:#a9a849}.social-icons-color-standard.social-icons-style-regular .vsco .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .vsco .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .vsco .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .vsco .sqs-use--icon{fill:rgba(169,168,73,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .vsco:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .vsco:hover .sqs-use--icon{fill:#a9a849}.social-icons-color-standard.social-icons-style-border .vsco{border-color:#a9a849}.social-icons-color-standard.social-icons-style-border .vsco .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .vsco .sqs-use--icon{fill:#a9a849}.social-icons-color-standard.social-icons-style-border .vsco .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .vsco:hover{background-color:#a9a849}.social-icons-color-standard.social-icons-style-border .vsco:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .vsco .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .vsco .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .vsco .sqs-use--mask{fill:#a9a849}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .vsco .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .vsco .sqs-use--mask{fill:rgba(169,168,73,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .vsco:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .vsco:hover .sqs-use--mask{fill:#a9a849}.social-icons-color-standard.social-icons-style-solid .vsco .sqs-use--mask{fill:#a9a849}.social-icons-color-standard.social-icons-style-solid .vsco .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .vsco .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .vsco .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .vsco .sqs-use--mask{fill:rgba(169,168,73,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .vsco .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .vsco .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .vsco .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .vsco .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .vsco:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .vsco:hover .sqs-use--mask{fill:#a9a849}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .vsco:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .vsco:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .vsco:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .vsco:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .yelp .sqs-use--icon{fill:#c41200}.social-icons-color-standard.social-icons-style-regular .yelp .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .yelp .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .yelp .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .yelp .sqs-use--icon{fill:rgba(196,18,0,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .yelp:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .yelp:hover .sqs-use--icon{fill:#c41200}.social-icons-color-standard.social-icons-style-border .yelp{border-color:#c41200}.social-icons-color-standard.social-icons-style-border .yelp .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .yelp .sqs-use--icon{fill:#c41200}.social-icons-color-standard.social-icons-style-border .yelp .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .yelp:hover{background-color:#c41200}.social-icons-color-standard.social-icons-style-border .yelp:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .yelp .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .yelp .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .yelp .sqs-use--mask{fill:#c41200}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .yelp .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .yelp .sqs-use--mask{fill:rgba(196,18,0,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .yelp:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .yelp:hover .sqs-use--mask{fill:#c41200}.social-icons-color-standard.social-icons-style-solid .yelp .sqs-use--mask{fill:#c41200}.social-icons-color-standard.social-icons-style-solid .yelp .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .yelp .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .yelp .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .yelp .sqs-use--mask{fill:rgba(196,18,0,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .yelp .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .yelp .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .yelp .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .yelp .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .yelp:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .yelp:hover .sqs-use--mask{fill:#c41200}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .yelp:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .yelp:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .yelp:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .yelp:hover .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-regular .youtube .sqs-use--icon{fill:#e52d27}.social-icons-color-standard.social-icons-style-regular .youtube .sqs-use--background,.social-icons-color-standard.social-icons-style-regular .youtube .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .youtube .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .youtube .sqs-use--icon{fill:rgba(229,45,39,.4)}.social-icons-color-standard.social-icons-style-regular .sqs-svg-icon--list:hover .youtube:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-regular.sqs-svg-icon--list:hover .youtube:hover .sqs-use--icon{fill:#e52d27}.social-icons-color-standard.social-icons-style-border .youtube{border-color:#e52d27}.social-icons-color-standard.social-icons-style-border .youtube .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-border .youtube .sqs-use--icon{fill:#e52d27}.social-icons-color-standard.social-icons-style-border .youtube .sqs-use--mask{fill:transparent}.social-icons-color-standard.social-icons-style-border .youtube:hover{background-color:#e52d27}.social-icons-color-standard.social-icons-style-border .youtube:hover .sqs-use--icon{fill:#fff}.social-icons-color-standard.social-icons-style-knockout .youtube .sqs-use--background{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .youtube .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-knockout .youtube .sqs-use--mask{fill:#e52d27}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .youtube .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .youtube .sqs-use--mask{fill:rgba(229,45,39,.4)}.social-icons-color-standard.social-icons-style-knockout .sqs-svg-icon--list:hover .youtube:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-knockout.sqs-svg-icon--list:hover .youtube:hover .sqs-use--mask{fill:#e52d27}.social-icons-color-standard.social-icons-style-solid .youtube .sqs-use--mask{fill:#e52d27}.social-icons-color-standard.social-icons-style-solid .youtube .sqs-use--icon{fill:transparent}.social-icons-color-standard.social-icons-style-solid .youtube .sqs-use--background{fill:#fff}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .youtube .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .youtube .sqs-use--mask{fill:rgba(229,45,39,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .youtube .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .youtube .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .youtube .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .youtube .sqs-use--background{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .youtube:hover .sqs-use--mask,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .youtube:hover .sqs-use--mask{fill:#e52d27}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .youtube:hover .sqs-use--icon,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .youtube:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-color-standard.social-icons-style-solid .sqs-svg-icon--list:hover .youtube:hover .sqs-use--background,.social-icons-color-standard.social-icons-style-solid.sqs-svg-icon--list:hover .youtube:hover .sqs-use--background{fill:#fff}.sqs-svg-icon--wrapper{-webkit-transition:background-color 170ms ease-in-out;-moz-transition:background-color 170ms ease-in-out;-ms-transition:background-color 170ms ease-in-out;-o-transition:background-color 170ms ease-in-out;transition:background-color 170ms ease-in-out}.sqs-use--icon,.sqs-use--mask,.sqs-use--background{-webkit-transition:fill 170ms ease-in-out;-moz-transition:fill 170ms ease-in-out;-ms-transition:fill 170ms ease-in-out;-o-transition:fill 170ms ease-in-out;transition:fill 170ms ease-in-out}.social-solid-icon-anim-out 0%{fill:#fff}.social-solid-icon-anim-out 100%{fill:rgba(255,255,255,.4)}@-webkit-keyframes social-solid-icon-anim-out{0%{fill:#fff}100%{fill:rgba(255,255,255,.4)}}@keyframes social-solid-icon-anim{0%{fill:#fff}100%{fill:rgba(255,255,255,.4)}}.social-solid-icon-anim-off 0%{fill:rgba(255,255,255,.4)}.social-solid-icon-anim-off 99%{fill:#fff}.social-solid-icon-anim-off 100%{fill:rgba(255,255,255,0)}@-webkit-keyframes social-solid-icon-anim-off{0%{fill:rgba(255,255,255,.4)}99%{fill:#fff}100%{fill:rgba(255,255,255,0)}}@keyframes social-solid-icon-anim{0%{fill:rgba(255,255,255,.4)}99%{fill:#fff}100%{fill:rgba(255,255,255,0)}}.social-solid-icon-anim-in 0%{fill:rgba(255,255,255,.4)}.social-solid-icon-anim-in 100%{fill:#fff}@-webkit-keyframes social-solid-icon-anim-in{0%{fill:rgba(255,255,255,.4)}100%{fill:#fff}}/*IE9_SPLIT_MARKER*/\n@keyframes social-solid-icon-anim{0%{fill:rgba(255,255,255,.4)}100%{fill:#fff}}.social-icons-style-solid .sqs-use--background{-webkit-transition:fill 0ms 170ms ease-in-out;-moz-transition:fill 0ms 170ms ease-in-out;-ms-transition:fill 0ms 170ms ease-in-out;-o-transition:fill 0ms 170ms ease-in-out;transition:fill 0ms 170ms ease-in-out}.social-icons-style-solid .sqs-use--icon{-webkit-animation:social-solid-icon-anim-off 170ms ease-in-out;animation:social-solid-icon-anim-off 170ms ease-in-out}.social-icons-style-solid .sqs-svg-icon--list:hover .sqs-use--icon,.social-icons-style-solid.sqs-svg-icon--list:hover .sqs-use--icon{-webkit-animation:social-solid-icon-anim-out 170ms ease-in-out;animation:social-solid-icon-anim-out 170ms ease-in-out}.social-icons-style-solid .sqs-svg-icon--list:hover .sqs-use--background,.social-icons-style-solid.sqs-svg-icon--list:hover .sqs-use--background{-webkit-transition:fill 0ms 0ms ease-in-out;-moz-transition:fill 0ms 0ms ease-in-out;-ms-transition:fill 0ms 0ms ease-in-out;-o-transition:fill 0ms 0ms ease-in-out;transition:fill 0ms 0ms ease-in-out}.social-icons-style-solid .sqs-svg-icon--list:hover .sqs-svg-icon--wrapper:hover .sqs-use--icon,.social-icons-style-solid.sqs-svg-icon--list:hover .sqs-svg-icon--wrapper:hover .sqs-use--icon{-webkit-animation:social-solid-icon-anim-in 170ms ease-in-out;animation:social-solid-icon-anim-in 170ms ease-in-out}.social-icons-style-solid .sqs-svg-icon--list:hover .sqs-svg-icon--wrapper:hover .sqs-use--background,.social-icons-style-solid.sqs-svg-icon--list:hover .sqs-svg-icon--wrapper:hover .sqs-use--background{-webkit-transition:fill 0ms 160ms ease-in-out;-moz-transition:fill 0ms 160ms ease-in-out;-ms-transition:fill 0ms 160ms ease-in-out;-o-transition:fill 0ms 160ms ease-in-out;transition:fill 0ms 160ms ease-in-out}.sqs-svg-icon--list.social-icon-alignment-left{text-align:left}.sqs-svg-icon--list.social-icon-alignment-right{text-align:right}.sqs-svg-icon--list.social-icon-alignment-center{text-align:center}.rss-block .social-rss:before,.rss-block .social-rss-square:before,.rss-block .social-rss-round:before{font-family:'social-icon-font';speak:none;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;position:relative;top:0;margin-right:10px;font-size:.7em}.rss-block .social-rss:before{content:\"\\e630\"}.social-icons-style-regular .sqs-use--icon{fill:#fff}.social-icons-style-regular .sqs-use--background,.social-icons-style-regular .sqs-use--mask{fill:transparent}.social-icons-style-regular.social-icons-color-white .sqs-use--icon{fill:#fff}.social-icons-style-regular.social-icons-color-white .sqs-use--background,.social-icons-style-regular.social-icons-color-white .sqs-use--mask{fill:transparent}.social-icons-style-regular.social-icons-color-black .sqs-use--icon{fill:#222}.social-icons-style-regular.social-icons-color-black .sqs-use--background,.social-icons-style-regular.social-icons-color-black .sqs-use--mask{fill:transparent}.social-icons-style-border .sqs-svg-icon--wrapper{border-color:#fff}.social-icons-style-border .sqs-use--icon{fill:#fff}.social-icons-style-border .sqs-use--background,.social-icons-style-border .sqs-use--mask{fill:transparent}.social-icons-style-border.social-icons-color-white .sqs-svg-icon--wrapper{border-color:#fff}.social-icons-style-border.social-icons-color-white .sqs-use--icon{fill:#fff}.social-icons-style-border.social-icons-color-white .sqs-use--background,.social-icons-style-border.social-icons-color-white .sqs-use--mask{fill:transparent}.social-icons-style-border.social-icons-color-black .sqs-svg-icon--wrapper{border-color:#222}.social-icons-style-border.social-icons-color-black .sqs-use--icon{fill:#222}.social-icons-style-border.social-icons-color-black .sqs-use--background,.social-icons-style-border.social-icons-color-black .sqs-use--mask{fill:transparent}.social-icons-style-knockout .sqs-use--mask{fill:#fff}.social-icons-style-knockout .sqs-use--background,.social-icons-style-knockout .sqs-use--icon{fill:transparent}.social-icons-style-knockout.social-icons-color-white .sqs-use--mask{fill:#fff}.social-icons-style-knockout.social-icons-color-white .sqs-use--background,.social-icons-style-knockout.social-icons-color-white .sqs-use--icon{fill:transparent}.social-icons-style-knockout.social-icons-color-black .sqs-use--mask{fill:#222}.social-icons-style-knockout.social-icons-color-black .sqs-use--background,.social-icons-style-knockout.social-icons-color-black .sqs-use--icon{fill:transparent}.social-icons-style-solid .sqs-use--icon{fill:#222}.social-icons-style-solid .sqs-use--background{fill:#222}.social-icons-style-solid .sqs-use--mask{fill:#fff}.social-icons-style-solid.social-icons-color-white .sqs-use--icon{fill:#222}.social-icons-style-solid.social-icons-color-white .sqs-use--background{fill:#fff}.social-icons-style-solid.social-icons-color-white .sqs-use--mask{fill:#fff}.social-icons-style-solid.social-icons-color-black .sqs-use--icon{fill:#fff}.social-icons-style-solid.social-icons-color-black .sqs-use--background{fill:#222}.social-icons-style-solid.social-icons-color-black .sqs-use--mask{fill:#222}.social-icons-style-border .sqs-svg-icon--wrapper:hover{background-color:#fff}.social-icons-style-border .sqs-svg-icon--wrapper:hover .sqs-use--icon{fill:#222}.social-icons-style-border.social-icons-color-white .sqs-svg-icon--wrapper:hover{background-color:#fff}.social-icons-style-border.social-icons-color-white .sqs-svg-icon--wrapper:hover .sqs-use--icon{fill:#222}.social-icons-style-border.social-icons-color-black .sqs-svg-icon--wrapper:hover{background-color:#222}.social-icons-style-border.social-icons-color-black .sqs-svg-icon--wrapper:hover .sqs-use--icon{fill:#fff}.social-icons-style-regular:hover .sqs-svg-icon--wrapper .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-style-regular:hover .sqs-svg-icon--wrapper:hover .sqs-use--icon{fill:#fff}.social-icons-style-regular.social-icons-color-white:hover .sqs-svg-icon--wrapper .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-style-regular.social-icons-color-white:hover .sqs-svg-icon--wrapper:hover .sqs-use--icon{fill:#fff}.social-icons-style-regular.social-icons-color-black:hover .sqs-svg-icon--wrapper .sqs-use--icon{fill:rgba(34,34,34,.4)}.social-icons-style-regular.social-icons-color-black:hover .sqs-svg-icon--wrapper:hover .sqs-use--icon{fill:#222}.social-icons-style-knockout:hover .sqs-svg-icon--wrapper .sqs-use--mask{fill:rgba(255,255,255,.4)}.social-icons-style-knockout:hover .sqs-svg-icon--wrapper:hover .sqs-use--mask{fill:#fff}.social-icons-style-knockout.social-icons-color-white:hover .sqs-svg-icon--wrapper .sqs-use--mask{fill:rgba(255,255,255,.4)}.social-icons-style-knockout.social-icons-color-white:hover .sqs-svg-icon--wrapper:hover .sqs-use--mask{fill:#fff}.social-icons-style-knockout.social-icons-color-black:hover .sqs-svg-icon--wrapper .sqs-use--mask{fill:rgba(34,34,34,.4)}.social-icons-style-knockout.social-icons-color-black:hover .sqs-svg-icon--wrapper:hover .sqs-use--mask{fill:#222}.social-icons-style-solid:hover .sqs-svg-icon--wrapper .sqs-use--mask{fill:rgba(255,255,255,.4)}.social-icons-style-solid:hover .sqs-svg-icon--wrapper .sqs-use--icon{fill:rgba(34,34,34,.4)}.social-icons-style-solid:hover .sqs-svg-icon--wrapper .sqs-use--background{fill:rgba(34,34,34,0)}.social-icons-style-solid:hover .sqs-svg-icon--wrapper:hover .sqs-use--mask{fill:#fff}.social-icons-style-solid:hover .sqs-svg-icon--wrapper:hover .sqs-use--icon{fill:rgba(34,34,34,0)}.social-icons-style-solid:hover .sqs-svg-icon--wrapper:hover .sqs-use--background{fill:#222}.social-icons-style-solid.social-icons-color-white:hover .sqs-svg-icon--wrapper .sqs-use--mask,.social-icons-style-solid.social-icons-color-black:hover .sqs-svg-icon--wrapper .sqs-use--mask{fill:rgba(255,255,255,.4)}.social-icons-style-solid.social-icons-color-white:hover .sqs-svg-icon--wrapper .sqs-use--icon,.social-icons-style-solid.social-icons-color-black:hover .sqs-svg-icon--wrapper .sqs-use--icon{fill:rgba(34,34,34,.4)}.social-icons-style-solid.social-icons-color-white:hover .sqs-svg-icon--wrapper .sqs-use--background,.social-icons-style-solid.social-icons-color-black:hover .sqs-svg-icon--wrapper .sqs-use--background{fill:rgba(34,34,34,0)}.social-icons-style-solid.social-icons-color-white:hover .sqs-svg-icon--wrapper:hover .sqs-use--mask,.social-icons-style-solid.social-icons-color-black:hover .sqs-svg-icon--wrapper:hover .sqs-use--mask{fill:#222}.social-icons-style-solid.social-icons-color-white:hover .sqs-svg-icon--wrapper:hover .sqs-use--icon,.social-icons-style-solid.social-icons-color-black:hover .sqs-svg-icon--wrapper:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-style-solid.social-icons-color-white:hover .sqs-svg-icon--wrapper:hover .sqs-use--background,.social-icons-style-solid.social-icons-color-black:hover .sqs-svg-icon--wrapper:hover .sqs-use--background{fill:#fff}@font-face{font-family:'social-icon-font';src:url('//static.squarespace.com/universal/fonts/social-20141119/social-icon-font.eot');src:url('//static.squarespace.com/universal/fonts/social-20141119/social-icon-font.eot?#iefix') format('embedded-opentype'),url('//static.squarespace.com/universal/fonts/social-20141119/social-icon-font.woff') format('woff'),url('//static.squarespace.com/universal/fonts/social-20141119/social-icon-font.ttf') format('truetype'),url('//static.squarespace.com/universal/fonts/social-20141119/social-icon-font.svg#social-icon-font') format('svg');font-weight:normal;font-style:normal}.social-smugmug:before,.social-dribbble:before,.social-youtube:before,.social-vimeo:before,.social-twitter:before,.social-tumblr:before,.social-pinterest:before,.social-linkedin:before,.social-instagram:before,.social-google:before,.social-foursquare:before,.social-flickr:before,.social-facebook:before,.social-fivehundredpix:before,.social-fivehundredpx:before,.social-email:before,.social-github:before,.social-rss:before,.social-spotify:before,.social-soundcloud:before,.social-itunes:before,.social-googleplay:before,.social-dropbox:before,.social-bandsintown:before,.social-behance:before,.social-codepen:before,.social-medium:before,.social-rdio:before,.social-squarespace:before,.social-vine:before,.social-yelp:before,.social-vevo:before,.social-meetup:before,.social-twitch:before,.social-vsco:before,.social-smugmug-square:before,.social-dribbble-square:before,.social-youtube-square:before,.social-vimeo-square:before,.social-twitter-square:before,.social-tumblr-square:before,.social-pinterest-square:before,.social-linkedin-square:before,.social-instagram-square:before,.social-google-square:before,.social-foursquare-square:before,.social-flickr-square:before,.social-facebook-square:before,.social-fivehundredpix-square:before,.social-fivehundredpx-square:before,.social-email-square:before,.social-github-square:before,.social-rss-square:before,.social-spotify-square:before,.social-soundcloud-square:before,.social-itunes-square:before,.social-googleplay-square:before,.social-dropbox-square:before,.social-bandsintown-square:before,.social-behance-square:before,.social-codepen-square:before,.social-medium-square:before,.social-rdio-square:before,.social-squarespace-square:before,.social-vine-square:before,.social-yelp-square:before,.social-vevo-square:before,.social-meetup-square:before,.social-twitch-square:before,.social-vsco-square:before,.social-smugmug-round:before,.social-dribbble-round:before,.social-youtube-round:before,.social-vimeo-round:before,.social-twitter-round:before,.social-tumblr-round:before,.social-pinterest-round:before,.social-linkedin-round:before,.social-instagram-round:before,.social-google-round:before,.social-foursquare-round:before,.social-flickr-round:before,.social-facebook-round:before,.social-fivehundredpix-round:before,.social-fivehundredpx-round:before,.social-email-round:before,.social-github-round:before,.social-rss-round:before,.social-spotify-round:before,.social-soundcloud-round:before,.social-itunes-round:before,.social-googleplay-round:before,.social-dropbox-round:before,.social-bandsintown-round:before,.social-behance-round:before,.social-codepen-round:before,.social-medium-round:before,.social-rdio-round:before,.social-squarespace-round:before,.social-vine-round:before,.social-yelp-round:before,.social-vevo-round:before,.social-meetup-round:before,.social-twitch-round:before,.social-vsco-round:before{font-family:'social-icon-font';speak:none;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.social-smugmug:before{content:\"\\e600\"}.social-icon-style-square .social-smugmug:before{content:\"\\e601\"}.social-icon-style-round .social-smugmug:before{content:\"\\e602\"}.social-dribbble:before{content:\"\\e603\"}.social-icon-style-square .social-dribbble:before{content:\"\\e604\"}.social-icon-style-round .social-dribbble:before{content:\"\\e605\"}.social-youtube:before{content:\"\\e606\"}.social-icon-style-square .social-youtube:before{content:\"\\e607\"}.social-icon-style-round .social-youtube:before{content:\"\\e608\"}.social-vimeo:before{content:\"\\e609\"}.social-icon-style-square .social-vimeo:before{content:\"\\e60a\"}.social-icon-style-round .social-vimeo:before{content:\"\\e60b\"}.social-twitter:before{content:\"\\e60c\"}.social-icon-style-square .social-twitter:before{content:\"\\e60d\"}.social-icon-style-round .social-twitter:before{content:\"\\e60e\"}.social-tumblr:before{content:\"\\e60f\"}.social-icon-style-square .social-tumblr:before{content:\"\\e610\"}.social-icon-style-round .social-tumblr:before{content:\"\\e611\"}.social-pinterest:before{content:\"\\e612\"}.social-icon-style-square .social-pinterest:before{content:\"\\e613\"}.social-icon-style-round .social-pinterest:before{content:\"\\e614\"}.social-linkedin:before{content:\"\\e615\"}.social-icon-style-square .social-linkedin:before{content:\"\\e616\"}.social-icon-style-round .social-linkedin:before{content:\"\\e617\"}.social-instagram:before{content:\"\\e618\"}.social-icon-style-square .social-instagram:before{content:\"\\e619\"}.social-icon-style-round .social-instagram:before{content:\"\\e61a\"}.social-google:before{content:\"\\e61b\"}.social-icon-style-square .social-google:before{content:\"\\e61c\"}.social-icon-style-round .social-google:before{content:\"\\e61d\"}.social-googleauth2:before{content:\"\\e61b\"}.social-foursquare:before{content:\"\\e61e\"}.social-icon-style-square .social-foursquare:before{content:\"\\e61f\"}.social-icon-style-round .social-foursquare:before{content:\"\\e620\"}.social-flickr:before{content:\"\\e621\"}.social-icon-style-square .social-flickr:before{content:\"\\e622\"}.social-icon-style-round .social-flickr:before{content:\"\\e623\"}.social-facebook:before{content:\"\\e624\"}.social-icon-style-square .social-facebook:before{content:\"\\e625\"}.social-icon-style-round .social-facebook:before{content:\"\\e626\"}.social-fivehundredpix:before{content:\"\\e627\"}.social-icon-style-square .social-fivehundredpix:before{content:\"\\e628\"}.social-icon-style-round .social-fivehundredpix:before{content:\"\\e629\"}.social-fivehundredpx:before{content:\"\\e627\"}.social-icon-style-square .social-fivehundredpx:before{content:\"\\e628\"}.social-icon-style-round .social-fivehundredpx:before{content:\"\\e629\"}.social-email:before{content:\"\\e62a\"}.social-icon-style-square .social-email:before{content:\"\\e62b\"}.social-icon-style-round .social-email:before{content:\"\\e62c\"}.social-github:before{content:\"\\e62d\"}.social-icon-style-square .social-github:before{content:\"\\e62e\"}.social-icon-style-round .social-github:before{content:\"\\e62f\"}.social-rss:before{content:\"\\e630\"}.social-icon-style-square .social-rss:before{content:\"\\e631\"}.social-icon-style-round .social-rss:before{content:\"\\e632\"}.social-spotify:before{content:\"\\e633\"}.social-icon-style-square .social-spotify:before{content:\"\\e634\"}.social-icon-style-round .social-spotify:before{content:\"\\e635\"}.social-soundcloud:before{content:\"\\e636\"}.social-icon-style-square .social-soundcloud:before{content:\"\\e637\"}.social-icon-style-round .social-soundcloud:before{content:\"\\e638\"}.social-itunes:before{content:\"\\e639\"}.social-icon-style-square .social-itunes:before{content:\"\\e63a\"}.social-icon-style-round .social-itunes:before{content:\"\\e63b\"}.social-googleplay:before{content:\"\\e63c\"}.social-icon-style-square .social-googleplay:before{content:\"\\e63d\"}.social-icon-style-round .social-googleplay:before{content:\"\\e63e\"}.social-dropbox:before{content:\"\\e63f\"}.social-icon-style-square .social-dropbox:before{content:\"\\e640\"}.social-icon-style-round .social-dropbox:before{content:\"\\e641\"}.social-bandsintown:before{content:\"\\e642\"}.social-icon-style-square .social-bandsintown:before{content:\"\\e643\"}.social-icon-style-round .social-bandsintown:before{content:\"\\e644\"}.social-behance:before{content:\"\\e645\"}.social-icon-style-square .social-behance:before{content:\"\\e646\"}.social-icon-style-round .social-behance:before{content:\"\\e647\"}.social-codepen:before{content:\"\\e648\"}.social-icon-style-square .social-codepen:before{content:\"\\e649\"}.social-icon-style-round .social-codepen:before{content:\"\\e64a\"}.social-medium:before{content:\"\\e64b\"}.social-icon-style-square .social-medium:before{content:\"\\e64c\"}.social-icon-style-round .social-medium:before{content:\"\\e64d\"}.social-rdio:before{content:\"\\e64e\"}.social-icon-style-square .social-rdio:before{content:\"\\e64f\"}.social-icon-style-round .social-rdio:before{content:\"\\e650\"}.social-squarespace:before{content:\"\\e651\"}.social-icon-style-square .social-squarespace:before{content:\"\\e652\"}.social-icon-style-round .social-squarespace:before{content:\"\\e653\"}.social-vine:before{content:\"\\e654\"}.social-icon-style-square .social-vine:before{content:\"\\e655\"}.social-icon-style-round .social-vine:before{content:\"\\e656\"}.social-yelp:before{content:\"\\e657\"}.social-icon-style-square .social-yelp:before{content:\"\\e658\"}.social-icon-style-round .social-yelp:before{content:\"\\e659\"}.social-meetup:before{content:\"\\e65a\"}.social-icon-style-square .social-meetup:before{content:\"\\e65b\"}.social-icon-style-round .social-meetup:before{content:\"\\e65c\"}.social-vevo:before{content:\"\\e65d\"}.social-icon-style-square .social-vevo:before{content:\"\\e65e\"}.social-icon-style-round .social-vevo:before{content:\"\\e65f\"}.social-twitch:before{content:\"\\e660\"}.social-icon-style-square .social-twitch:before{content:\"\\e661\"}.social-icon-style-round .social-twitch:before{content:\"\\e662\"}.social-vsco:before{content:\"\\e663\"}.social-icon-style-square .social-vsco:before{content:\"\\e664\"}.social-icon-style-round .social-vsco:before{content:\"\\e665\"}.sqs-block-socialaccountlinks .social-account-svg-list,.sqs-block-socialaccountlinks-v2 .social-account-svg-list{text-align:left}.sqs-block-socialaccountlinks .social-account-svg-list:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list:before,.sqs-block-socialaccountlinks .social-account-svg-list:after,.sqs-block-socialaccountlinks-v2 .social-account-svg-list:after{content:\"\";display:table}.sqs-block-socialaccountlinks .social-account-svg-list:after,.sqs-block-socialaccountlinks-v2 .social-account-svg-list:after{clear:both}.sqs-block-socialaccountlinks .social-account-svg-list a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list a,.sqs-block-socialaccountlinks .social-account-svg-list a:link,.sqs-block-socialaccountlinks-v2 .social-account-svg-list a:link,.sqs-block-socialaccountlinks .social-account-svg-list a:visited,.sqs-block-socialaccountlinks-v2 .social-account-svg-list a:visited{display:inline-block;width:20px;height:20px;font-size:20px;color:#111;text-decoration:none !important;*zoom:1;*display:inline;font-weight:normal}.sqs-block-socialaccountlinks .social-account-svg-list a:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list a:before,.sqs-block-socialaccountlinks .social-account-svg-list a:link:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list a:link:before,.sqs-block-socialaccountlinks .social-account-svg-list a:visited:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list a:visited:before{font-size:20px;line-height:20px}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-alignment-left a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-alignment-left a{margin-right:.75em}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-alignment-right a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-alignment-right a{margin-left:.75em}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-alignment-center a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-alignment-center a{margin:0 .375em}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-alignment-center,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-alignment-center{text-align:center}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-alignment-right,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-alignment-right{text-align:right}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-white a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-white a,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-white a:visited,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-white a:visited{color:#fff}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-bandsintown,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-bandsintown,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-bandsintown,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-bandsintown,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-bandsintown,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-bandsintown{color:#00b4b3}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-behance,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-behance,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-behance,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-behance,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-behance,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-behance{color:#1769ff}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-codepen,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-codepen,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-codepen,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-codepen,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-codepen,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-codepen{color:#222}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-dribbble,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-dribbble,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-dribbble,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-dribbble,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-dribbble,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-dribbble{color:#ea4c89}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-dropbox,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-dropbox,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-dropbox,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-dropbox,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-dropbox,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-dropbox{color:#007ee5}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-email,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-email,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-email,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-email,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-email,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-email{color:#222}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-facebook,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-facebook,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-facebook,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-facebook,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-facebook,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-facebook{color:#3b5998}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-fivehundredpix,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-fivehundredpix,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-fivehundredpix,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-fivehundredpix,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-fivehundredpix,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-fivehundredpix,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-fivehundredpx,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-fivehundredpx,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-fivehundredpx,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-fivehundredpx,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-fivehundredpx,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-fivehundredpx{color:#00aeef}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-flickr,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-flickr,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-flickr,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-flickr,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-flickr,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-flickr{color:#0063dc}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-foursquare,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-foursquare,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-foursquare,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-foursquare,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-foursquare,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-foursquare{color:#f94877}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-github,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-github,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-github,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-github,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-github,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-github{color:#4183c4}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-google,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-google,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-google,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-google,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-google,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-google{color:#dd4b39}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-googleplay,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-googleplay,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-googleplay,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-googleplay,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-googleplay,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-googleplay{color:#5adfcb}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-instagram,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-instagram,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-instagram,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-instagram,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-instagram,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-instagram{color:#3f729b}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-itunes,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-itunes,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-itunes,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-itunes,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-itunes,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-itunes{color:#ff3241}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-linkedin,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-linkedin,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-linkedin,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-linkedin,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-linkedin,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-linkedin{color:#0976b4}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-medium,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-medium,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-medium,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-medium,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-medium,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-medium{color:#222}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-meetup,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-meetup,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-meetup,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-meetup,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-meetup,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-meetup{color:#e0393e}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-pinterest,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-pinterest,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-pinterest,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-pinterest,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-pinterest,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-pinterest{color:#cc2127}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-rdio,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-rdio,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-rdio,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-rdio,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-rdio,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-rdio{color:#006ed2}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-rss,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-rss,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-rss,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-rss,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-rss,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-rss{color:#222}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-smugmug,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-smugmug,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-smugmug,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-smugmug,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-smugmug,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-smugmug{color:#7dbb00}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-soundcloud,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-soundcloud,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-soundcloud,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-soundcloud,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-soundcloud,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-soundcloud{color:#f80}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-spotify,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-spotify,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-spotify,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-spotify,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-spotify,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-spotify{color:#84bd00}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-squarespace,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-squarespace,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-squarespace,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-squarespace,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-squarespace,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-squarespace{color:#222}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-tumblr,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-tumblr,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-tumblr,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-tumblr,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-tumblr,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-tumblr{color:#35465d}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-twitter,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-twitter,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-twitter,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-twitter,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-twitter,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-twitter{color:#55acee}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-vimeo,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-vimeo,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-vimeo,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-vimeo,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-vimeo,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-vimeo{color:#1ab7ea}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-vine,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-vine,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-vine,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-vine,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-vine,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-vine{color:#00b488}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-yelp,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-yelp,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-yelp,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-yelp,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-yelp,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-yelp{color:#c41200}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-youtube,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-youtube,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-youtube,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-youtube,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-youtube,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-youtube{color:#e52d27}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-meetup,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-meetup,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-meetup,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-meetup,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-meetup,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-meetup{color:#e0393e}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-vevo,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-vevo,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-vevo,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-vevo,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-vevo,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-vevo{color:#ff0031}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-twitch,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-twitch,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-twitch,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-twitch,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-twitch,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-twitch{color:#6441a5}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-vsco,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-vsco,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-vsco,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-vsco,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-vsco,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-vsco{color:#a9a849}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large a,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large a:link,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large a:link,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large a:visited,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large a:visited{width:24px;height:24px;font-size:24px}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large a:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large a:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large a:link:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large a:link:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large a:visited:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large a:visited:before{font-size:24px;line-height:24px}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small a,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small a:link,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small a:link,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small a:visited,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small a:visited{width:16px;height:16px;font-size:16px}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small a:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small a:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small a:link:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small a:link:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small a:visited:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small a:visited:before{font-size:16px;line-height:16px}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-round a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-round a,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-square a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-square a,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-round a:link,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-round a:link,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-square a:link,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-square a:link,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-round a:visited,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-round a:visited,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-square a:visited,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-square a:visited{width:30px;height:30px;font-size:30px}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-round a:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-round a:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-square a:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-square a:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-round a:link:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-round a:link:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-square a:link:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-square a:link:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-round a:visited:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-round a:visited:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-square a:visited:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-square a:visited:before{font-size:30px;line-height:30px}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-round.social-icon-alignment-left a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-round.social-icon-alignment-left a,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-square.social-icon-alignment-left a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-square.social-icon-alignment-left a{margin-right:.25em}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-round.social-icon-alignment-right a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-round.social-icon-alignment-right a,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-square.social-icon-alignment-right a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-square.social-icon-alignment-right a{margin-left:.25em}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-round.social-icon-alignment-center a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-round.social-icon-alignment-center a,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-square.social-icon-alignment-center a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-square.social-icon-alignment-center a{margin:0 .125em}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large.social-icon-style-round a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large.social-icon-style-round a,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large.social-icon-style-square a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large.social-icon-style-square a,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large.social-icon-style-round a:link,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large.social-icon-style-round a:link,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large.social-icon-style-square a:link,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large.social-icon-style-square a:link,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large.social-icon-style-round a:visited,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large.social-icon-style-round a:visited,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large.social-icon-style-square a:visited,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large.social-icon-style-square a:visited{width:36px;height:36px;font-size:36px}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large.social-icon-style-round a:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large.social-icon-style-round a:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large.social-icon-style-square a:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large.social-icon-style-square a:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large.social-icon-style-round a:link:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large.social-icon-style-round a:link:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large.social-icon-style-square a:link:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large.social-icon-style-square a:link:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large.social-icon-style-round a:visited:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large.social-icon-style-round a:visited:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large.social-icon-style-square a:visited:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large.social-icon-style-square a:visited:before{font-size:36px;line-height:36px}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small.social-icon-style-round a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small.social-icon-style-round a,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small.social-icon-style-square a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small.social-icon-style-square a,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small.social-icon-style-round a:link,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small.social-icon-style-round a:link,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small.social-icon-style-square a:link,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small.social-icon-style-square a:link,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small.social-icon-style-round a:visited,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small.social-icon-style-round a:visited,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small.social-icon-style-square a:visited,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small.social-icon-style-square a:visited{width:24px;height:24px;font-size:24px}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small.social-icon-style-round a:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small.social-icon-style-round a:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small.social-icon-style-square a:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small.social-icon-style-square a:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small.social-icon-style-round a:link:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small.social-icon-style-round a:link:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small.social-icon-style-square a:link:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small.social-icon-style-square a:link:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small.social-icon-style-round a:visited:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small.social-icon-style-round a:visited:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small.social-icon-style-square a:visited:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small.social-icon-style-square a:visited:before{font-size:24px;line-height:24px}.sqs-album-block{zoom:1;font-size:13px;color:#282828}.sqs-album-block .social-links{display:inline-block;line-height:3em}.sqs-album-block .social-links .social-account-svg-list{text-align:left}.sqs-album-block .social-links .social-account-svg-list:before,.sqs-album-block .social-links .social-account-svg-list:after{content:\"\";display:table}.sqs-album-block .social-links .social-account-svg-list:after{clear:both}.sqs-album-block .social-links .social-account-svg-list a,.sqs-album-block .social-links .social-account-svg-list a:link,.sqs-album-block .social-links .social-account-svg-list a:visited{display:inline-block;width:20px;height:20px;font-size:20px;color:#111;text-decoration:none !important;*zoom:1;*display:inline;font-weight:normal}.sqs-album-block .social-links .social-account-svg-list a:before,.sqs-album-block .social-links .social-account-svg-list a:link:before,.sqs-album-block .social-links .social-account-svg-list a:visited:before{font-size:20px;line-height:20px}.sqs-album-block .social-links .social-account-svg-list.social-icon-alignment-left a{margin-right:.75em}.sqs-album-block .social-links .social-account-svg-list.social-icon-alignment-right a{margin-left:.75em}.sqs-album-block .social-links .social-account-svg-list.social-icon-alignment-center a{margin:0 .375em}.sqs-album-block .social-links .social-account-svg-list.social-icon-alignment-center{text-align:center}.sqs-album-block .social-links .social-account-svg-list.social-icon-alignment-right{text-align:right}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-white a,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-white a:visited{color:#fff}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-bandsintown,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-bandsintown,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-bandsintown{color:#00b4b3}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-behance,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-behance,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-behance{color:#1769ff}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-codepen,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-codepen,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-codepen{color:#222}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-dribbble,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-dribbble,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-dribbble{color:#ea4c89}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-dropbox,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-dropbox,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-dropbox{color:#007ee5}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-email,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-email,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-email{color:#222}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-facebook,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-facebook,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-facebook{color:#3b5998}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-fivehundredpix,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-fivehundredpix,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-fivehundredpix,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-fivehundredpx,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-fivehundredpx,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-fivehundredpx{color:#00aeef}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-flickr,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-flickr,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-flickr{color:#0063dc}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-foursquare,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-foursquare,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-foursquare{color:#f94877}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-github,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-github,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-github{color:#4183c4}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-google,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-google,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-google{color:#dd4b39}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-googleplay,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-googleplay,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-googleplay{color:#5adfcb}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-instagram,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-instagram,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-instagram{color:#3f729b}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-itunes,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-itunes,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-itunes{color:#ff3241}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-linkedin,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-linkedin,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-linkedin{color:#0976b4}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-medium,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-medium,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-medium{color:#222}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-meetup,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-meetup,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-meetup{color:#e0393e}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-pinterest,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-pinterest,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-pinterest{color:#cc2127}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-rdio,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-rdio,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-rdio{color:#006ed2}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-rss,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-rss,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-rss{color:#222}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-smugmug,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-smugmug,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-smugmug{color:#7dbb00}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-soundcloud,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-soundcloud,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-soundcloud{color:#f80}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-spotify,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-spotify,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-spotify{color:#84bd00}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-squarespace,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-squarespace,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-squarespace{color:#222}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-tumblr,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-tumblr,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-tumblr{color:#35465d}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-twitter,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-twitter,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-twitter{color:#55acee}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-vimeo,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-vimeo,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-vimeo{color:#1ab7ea}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-vine,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-vine,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-vine{color:#00b488}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-yelp,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-yelp,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-yelp{color:#c41200}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-youtube,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-youtube,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-youtube{color:#e52d27}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-meetup,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-meetup,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-meetup{color:#e0393e}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-vevo,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-vevo,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-vevo{color:#ff0031}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-twitch,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-twitch,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-twitch{color:#6441a5}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-vsco,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-vsco,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-vsco{color:#a9a849}.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large a,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large a:link,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large a:visited{width:24px;height:24px;font-size:24px}.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large a:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large a:link:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large a:visited:before{font-size:24px;line-height:24px}.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small a,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small a:link,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small a:visited{width:16px;height:16px;font-size:16px}.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small a:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small a:link:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small a:visited:before{font-size:16px;line-height:16px}.sqs-album-block .social-links .social-account-svg-list.social-icon-style-round a,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-square a,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-round a:link,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-square a:link,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-round a:visited,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-square a:visited{width:30px;height:30px;font-size:30px}.sqs-album-block .social-links .social-account-svg-list.social-icon-style-round a:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-square a:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-round a:link:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-square a:link:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-round a:visited:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-square a:visited:before{font-size:30px;line-height:30px}.sqs-album-block .social-links .social-account-svg-list.social-icon-style-round.social-icon-alignment-left a,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-square.social-icon-alignment-left a{margin-right:.25em}.sqs-album-block .social-links .social-account-svg-list.social-icon-style-round.social-icon-alignment-right a,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-square.social-icon-alignment-right a{margin-left:.25em}.sqs-album-block .social-links .social-account-svg-list.social-icon-style-round.social-icon-alignment-center a,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-square.social-icon-alignment-center a{margin:0 .125em}.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large.social-icon-style-round a,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large.social-icon-style-square a,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large.social-icon-style-round a:link,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large.social-icon-style-square a:link,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large.social-icon-style-round a:visited,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large.social-icon-style-square a:visited{width:36px;height:36px;font-size:36px}.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large.social-icon-style-round a:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large.social-icon-style-square a:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large.social-icon-style-round a:link:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large.social-icon-style-square a:link:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large.social-icon-style-round a:visited:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large.social-icon-style-square a:visited:before{font-size:36px;line-height:36px}.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small.social-icon-style-round a,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small.social-icon-style-square a,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small.social-icon-style-round a:link,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small.social-icon-style-square a:link,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small.social-icon-style-round a:visited,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small.social-icon-style-square a:visited{width:24px;height:24px;font-size:24px}.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small.social-icon-style-round a:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small.social-icon-style-square a:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small.social-icon-style-round a:link:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small.social-icon-style-square a:link:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small.social-icon-style-round a:visited:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small.social-icon-style-square a:visited:before{font-size:24px;line-height:24px}.sqs-album-block .social-links .social-account-svg-list{text-align:left}.sqs-album-block .social-links .social-account-svg-list:before,.sqs-album-block .social-links .social-account-svg-list:after{content:\"\";display:table}.sqs-album-block .social-links .social-account-svg-list:after{clear:both}.sqs-album-block .social-links .social-account-svg-list a,.sqs-album-block .social-links .social-account-svg-list a:link,.sqs-album-block .social-links .social-account-svg-list a:visited{display:inline-block;width:20px;height:20px;font-size:20px;color:#111;text-decoration:none !important;*zoom:1;*display:inline;font-weight:normal}.sqs-album-block .social-links .social-account-svg-list a:before,.sqs-album-block .social-links .social-account-svg-list a:link:before,.sqs-album-block .social-links .social-account-svg-list a:visited:before{font-size:20px;line-height:20px}.sqs-album-block .social-links .social-account-svg-list.social-icon-alignment-left a{margin-right:.75em}.sqs-album-block .social-links .social-account-svg-list.social-icon-alignment-right a{margin-left:.75em}.sqs-album-block .social-links .social-account-svg-list.social-icon-alignment-center a{margin:0 .375em}.sqs-album-block .social-links .social-account-svg-list.social-icon-alignment-center{text-align:center}.sqs-album-block .social-links .social-account-svg-list.social-icon-alignment-right{text-align:right}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-white a,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-white a:visited{color:#fff}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-bandsintown,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-bandsintown,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-bandsintown{color:#00b4b3}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-behance,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-behance,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-behance{color:#1769ff}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-codepen,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-codepen,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-codepen{color:#222}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-dribbble,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-dribbble,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-dribbble{color:#ea4c89}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-dropbox,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-dropbox,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-dropbox{color:#007ee5}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-email,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-email,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-email{color:#222}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-facebook,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-facebook,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-facebook{color:#3b5998}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-fivehundredpix,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-fivehundredpix,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-fivehundredpix,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-fivehundredpx,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-fivehundredpx,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-fivehundredpx{color:#00aeef}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-flickr,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-flickr,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-flickr{color:#0063dc}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-foursquare,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-foursquare,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-foursquare{color:#f94877}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-github,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-github,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-github{color:#4183c4}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-google,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-google,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-google{color:#dd4b39}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-googleplay,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-googleplay,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-googleplay{color:#5adfcb}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-instagram,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-instagram,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-instagram{color:#3f729b}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-itunes,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-itunes,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-itunes{color:#ff3241}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-linkedin,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-linkedin,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-linkedin{color:#0976b4}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-medium,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-medium,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-medium{color:#222}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-meetup,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-meetup,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-meetup{color:#e0393e}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-pinterest,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-pinterest,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-pinterest{color:#cc2127}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-rdio,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-rdio,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-rdio{color:#006ed2}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-rss,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-rss,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-rss{color:#222}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-smugmug,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-smugmug,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-smugmug{color:#7dbb00}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-soundcloud,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-soundcloud,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-soundcloud{color:#f80}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-spotify,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-spotify,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-spotify{color:#84bd00}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-squarespace,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-squarespace,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-squarespace{color:#222}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-tumblr,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-tumblr,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-tumblr{color:#35465d}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-twitter,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-twitter,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-twitter{color:#55acee}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-vimeo,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-vimeo,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-vimeo{color:#1ab7ea}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-vine,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-vine,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-vine{color:#00b488}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-yelp,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-yelp,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-yelp{color:#c41200}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-youtube,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-youtube,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-youtube{color:#e52d27}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-meetup,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-meetup,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-meetup{color:#e0393e}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-vevo,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-vevo,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-vevo{color:#ff0031}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-twitch,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-twitch,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-twitch{color:#6441a5}.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a.social-vsco,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:link.social-vsco,.sqs-album-block .social-links .social-account-svg-list.social-icon-color-standard a:visited.social-vsco{color:#a9a849}.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large a,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large a:link,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large a:visited{width:24px;height:24px;font-size:24px}.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large a:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large a:link:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large a:visited:before{font-size:24px;line-height:24px}.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small a,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small a:link,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small a:visited{width:16px;height:16px;font-size:16px}.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small a:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small a:link:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small a:visited:before{font-size:16px;line-height:16px}.sqs-album-block .social-links .social-account-svg-list.social-icon-style-round a,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-square a,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-round a:link,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-square a:link,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-round a:visited,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-square a:visited{width:30px;height:30px;font-size:30px}.sqs-album-block .social-links .social-account-svg-list.social-icon-style-round a:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-square a:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-round a:link:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-square a:link:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-round a:visited:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-square a:visited:before{font-size:30px;line-height:30px}.sqs-album-block .social-links .social-account-svg-list.social-icon-style-round.social-icon-alignment-left a,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-square.social-icon-alignment-left a{margin-right:.25em}.sqs-album-block .social-links .social-account-svg-list.social-icon-style-round.social-icon-alignment-right a,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-square.social-icon-alignment-right a{margin-left:.25em}.sqs-album-block .social-links .social-account-svg-list.social-icon-style-round.social-icon-alignment-center a,.sqs-album-block .social-links .social-account-svg-list.social-icon-style-square.social-icon-alignment-center a{margin:0 .125em}.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large.social-icon-style-round a,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large.social-icon-style-square a,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large.social-icon-style-round a:link,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large.social-icon-style-square a:link,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large.social-icon-style-round a:visited,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large.social-icon-style-square a:visited{width:36px;height:36px;font-size:36px}.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large.social-icon-style-round a:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large.social-icon-style-square a:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large.social-icon-style-round a:link:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large.social-icon-style-square a:link:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large.social-icon-style-round a:visited:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-large.social-icon-style-square a:visited:before{font-size:36px;line-height:36px}.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small.social-icon-style-round a,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small.social-icon-style-square a,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small.social-icon-style-round a:link,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small.social-icon-style-square a:link,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small.social-icon-style-round a:visited,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small.social-icon-style-square a:visited{width:24px;height:24px;font-size:24px}.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small.social-icon-style-round a:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small.social-icon-style-square a:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small.social-icon-style-round a:link:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small.social-icon-style-square a:link:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small.social-icon-style-round a:visited:before,.sqs-album-block .social-links .social-account-svg-list.social-icon-size-small.social-icon-style-square a:visited:before{font-size:24px;line-height:24px}.sqs-album-block:after{display:block;visibility:hidden;font-size:0;height:0;clear:both;content:\".\"}.sqs-album-block:after{display:block;visibility:hidden;font-size:0;height:0;clear:both;content:\".\"}.sqs-album-block .album-info{width:33%;float:left;zoom:1}.sqs-album-block .album-info:after{display:block;visibility:hidden;font-size:0;height:0;clear:both;content:\".\"}.sqs-album-block .album-info:after{display:block;visibility:hidden;font-size:0;height:0;clear:both;content:\".\"}.sqs-album-block .album-cover-wrapper{position:relative;width:90px;height:90px;margin-bottom:30px}.sqs-album-block .album-controls{position:absolute;top:0;right:0;bottom:0;left:0;cursor:pointer}.sqs-album-block .album-controls .button{-webkit-transition:.25s all linear;-moz-transition:.25s all linear;-ms-transition:.25s all linear;-o-transition:.25s all linear;transition:.25s all linear;-moz-border-radius:50%;border-radius:50%;position:absolute;bottom:50%;left:50%;display:block;width:90px;height:90px;margin-bottom:-45px;margin-left:-45px;background:#000}.sqs-album-block .album-controls .icon{display:block;position:relative;left:50%;top:50%;margin-top:-20px;margin-left:-10px;width:0px;height:0px;border-top:18px solid transparent;border-bottom:18px solid transparent;border-left:30px solid #fff;-webkit-transform:translatez();-ms-transform:translatez();transform:translatez()}.sqs-album-block .album-title{margin:0;margin-bottom:3px}.sqs-album-block.playing .album-controls .button .icon{border-width:0px;margin-top:-15px;margin-left:-13px}.sqs-album-block.playing .album-controls .button .icon,.sqs-album-block.playing .album-controls .button .icon:before{height:30px;width:10px;background-color:#fff}.sqs-album-block.playing .album-controls .button .icon:before{content:'';display:block;margin-left:16px}.sqs-album-block.has-album-cover .album-cover-wrapper{position:relative;width:100%;height:0;padding-bottom:100%;margin-bottom:20px}.sqs-album-block.has-album-cover .album-cover{position:absolute;top:0;right:0;bottom:0;left:0}.sqs-album-block.has-album-cover .button{background:rgba(0,0,0,.7);opacity:.9}.sqs-album-block.has-album-cover:hover .button{background:rgba(0,0,0,.9)}.sqs-album-block.has-album-cover.playing .album-controls .button{margin:-15px;bottom:0;left:0;-webkit-transform:scale(.4,.4);-ms-transform:scale(.4,.4);transform:scale(.4,.4)}.sqs-album-block.playing .track{opacity:.4}.sqs-album-block.playing .track:hover,.sqs-album-block.playing .track.selected,.sqs-album-block.playing .track.universal-track{opacity:1}.sqs-album-block .tracks{float:right;width:60%;margin:0;padding:0}.sqs-album-block .track{list-style-type:none;padding:0;margin:0 0 36px;cursor:pointer;zoom:1;font-style:normal;font-weight:normal;letter-spacing:0;text-transform:none;line-height:1.4em}.sqs-album-block .track:after{display:block;visibility:hidden;font-size:0;height:0;clear:both;content:\".\"}.sqs-album-block .track:after{display:block;visibility:hidden;font-size:0;height:0;clear:both;content:\".\"}.sqs-album-block .track-progress-bar{clear:both;height:2px;position:relative;cursor:pointer;padding-bottom:2.5%}.sqs-album-block .track-progress-bar .bar{position:absolute;top:0;left:0;height:4px;width:0%}.sqs-album-block .track-progress-bar .bar.bg{width:100%}.sqs-album-block .track-progress-bar .bar.play-bar{position:relative}.sqs-album-block .timers{float:right;text-align:right;margin-left:1em}.sqs-album-block .tracks .timers .elapsed{display:none}.sqs-album-block.playing .tracks .track.selected .timers .duration,.sqs-album-block.paused .tracks .track.selected .timers .duration{display:none}.sqs-album-block.playing .tracks .track.selected .timers .elapsed,.sqs-album-block.paused .tracks .track.selected .timers .elapsed{display:block}.sqs-album-block .universal-player{display:none;margin-top:25px;width:100%}.sqs-album-block .universal-player .universal-progress{padding-bottom:1em}.sqs-album-block .universal-controls{margin-bottom:1em}.sqs-album-block .universal-controls .play-pause-group{display:inline-block}.sqs-album-block .universal-controls .next-prev-group{display:inline-block;float:right}.sqs-album-block .universal-controls .pause{display:none}.sqs-album-block.playing .universal-controls .pause{display:block}.sqs-album-block.playing .universal-controls .play{display:none}.sqs-album-block.hide-track-artists .artist{display:none}.sqs-album-block.md .album-info,.sqs-album-block.md .tracks{width:100%;float:none}.sqs-album-block.md .album-info{padding-bottom:60px}.sqs-album-block.md .album-cover-wrapper{float:left;margin-right:30px}.sqs-album-block.md.has-album-cover .album-cover-wrapper{width:40%;padding-bottom:40%}.sqs-album-block.md.no-main-image .album-description{margin-left:120px}.sqs-album-block.sm .album-info,.sqs-album-block.sm .tracks{width:100%;float:none}.sqs-album-block.sm .tracks{margin-top:30px}.sqs-album-block.sm .tracks .track{margin-bottom:27px}.sqs-album-block.sm .album-info{padding-bottom:0}.sqs-album-block.sm .album-cover-wrapper{float:none;margin-right:0;margin-bottom:20px}.sqs-album-block.sm.has-album-cover .album-cover-wrapper{width:100%;padding-bottom:100%;float:none;margin-right:0}.sqs-album-block.sm.no-main-image .album-description{margin-left:0}.sqs-album-block.mini-player .album-description,.sqs-album-block.mini-player .album-title,.sqs-album-block.mini-player .album-artist-name,.sqs-album-block.mini-player .tracks,.sqs-album-block.mini-player .social-links{display:none}.sqs-album-block.mini-player.no-album-cover .album-info{display:none}.sqs-album-block.mini-player.lg.has-album-cover .album-info,.sqs-album-block.mini-player.md.has-album-cover .album-info{width:145px;display:inline-block;float:left;padding-bottom:0;margin-right:1em}.sqs-album-block.mini-player.lg .universal-player,.sqs-album-block.mini-player.md .universal-player{display:inline-block}.sqs-album-block.mini-player.lg.has-album-cover .universal-player,.sqs-album-block.mini-player.md.has-album-cover .universal-player{width:calc(100% - 145px - 1em)}.sqs-album-block.mini-player.lg.has-album-cover .play-pause-group,.sqs-album-block.mini-player.md.has-album-cover .play-pause-group{display:none}.sqs-album-block.mini-player.lg.has-album-cover .next-prev-group,.sqs-album-block.mini-player.md.has-album-cover .next-prev-group{float:none}.sqs-album-block.mini-player.lg.has-album-cover .album-cover-wrapper,.sqs-album-block.mini-player.md.has-album-cover .album-cover-wrapper{padding-bottom:100%;width:145px;margin:0;float:none}.sqs-album-block.mini-player.sm .universal-player{display:block}.sqs-album-block .album-title{font-weight:bold;font-size:20px}.sqs-album-block .album-description{line-height:21px;font-size:13px}.sqs-album-block.sm .album-description{font-size:11px}.sqs-album-block .title a{font-size:15px;text-decoration:none}.sqs-album-block .tracks .timers .elapsed:before{content:\"(\"}.sqs-album-block .tracks .timers .elapsed:after{content:\")\"}.sqs-album-block .universal-controls{text-transform:uppercase}.sqs-album-block .universal-controls a{text-decoration:none}.sqs-album-block .track-progress-bar{-webkit-tap-highlight-color:rgba(40,40,40,.17)}.sqs-album-block .track-progress-bar .bar{-webkit-tap-highlight-color:rgba(40,40,40,.17)}.sqs-album-block .track-progress-bar .bar.bg{background-color:rgba(40,40,40,.17)}.sqs-album-block .track-progress-bar .bar.load-bar{background-color:rgba(40,40,40,.07)}.sqs-album-block .track-progress-bar .bar.play-bar{background-color:#282828}.sqs-album-block .timers,.sqs-album-block .artist,.sqs-album-block .album-description{color:rgba(40,40,40,.5)}.sqs-album-block .track.selected .timers .elapsed{color:#282828}.sqs-album-block .title a{color:#282828}.sqs-album-block .universal-controls a{color:#282828}.sqs-album-block.inverted{color:#d7d7d7}.sqs-album-block.inverted .track-progress-bar{-webkit-tap-highlight-color:rgba(215,215,215,.17)}.sqs-album-block.inverted .track-progress-bar .bar{-webkit-tap-highlight-color:rgba(215,215,215,.17)}.sqs-album-block.inverted .track-progress-bar .bar.bg{background-color:rgba(215,215,215,.17)}.sqs-album-block.inverted .track-progress-bar .bar.load-bar{background-color:rgba(215,215,215,.07)}.sqs-album-block.inverted .track-progress-bar .bar.play-bar{background-color:#d7d7d7}.sqs-album-block.inverted .timers,.sqs-album-block.inverted .artist,.sqs-album-block.inverted .album-description{color:rgba(215,215,215,.5)}.sqs-album-block.inverted .track.selected .timers .elapsed{color:#d7d7d7}.sqs-album-block.inverted .title a{color:#d7d7d7}.sqs-album-block.inverted .universal-controls a{color:#d7d7d7}.social-summary-block .state-message.synchronizing{background-image:none;padding-left:15px}.social-summary-block .state-message.synchronizing .sync-text{float:left;margin-left:10px}.social-summary-block .state-message.synchronizing .spinner{float:left;background:transparent url('//static.squarespace.com/universal/images-v6/icons/icon-settings-16-light.png') center center no-repeat;height:19px;width:19px;-webkit-animation-duration:2s;-moz-animation-duration:2s;-o-animation-duration:2s;animation-duration:2s;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-o-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:spin-frames;-moz-animation-name:spin-frames;-o-animation-name:spin-frames;animation-name:spin-frames}.product-block .image-container{position:relative;display:block;width:100%}.product-block .image-container a{display:block;width:100%}.product-block .image-container img{width:100%;max-width:100%}.product-block .image-container .product-mark{position:absolute;top:15px;right:0;background:#222;padding:6px 8px;color:#fff;line-height:1em;text-transform:uppercase;-webkit-font-smoothing:antialiased}.product-block .productDetails.center{text-align:center}.product-block .productDetails.right{text-align:right}.product-block .productDetails .product-title{font-size:1.3em;line-height:1em;margin:1em 0 .2em 0;display:inline-block}.product-block .productDetails .product-price{font-size:1.1em;margin:0 0 1em 0}.product-block .productDetails .product-price input{width:130px;height:30px;padding-left:5px}.product-block .productDetails .product-price .minimum-price{margin-top:3px;margin-left:10px}.product-block .productDetails .product-price .original-price{text-decoration:line-through;opacity:.7;filter:alpha(opacity=70)}.product-block .productDetails .product-price .strikeout{text-decoration:line-through}.product-block .productDetails .product-variants .variant-option{margin:0 0 1em 0}.product-block .productDetails .product-variants .variant-out-of-stock{color:#c00;margin-top:8px}.product-block .buy-button,.product-block .sqs-add-to-cart-button-wrapper{margin:20px 0;display:block}.product-block .buy-button:hover,.product-block .sqs-add-to-cart-button-wrapper:hover{opacity:1}.product-block .sqs-add-to-cart-button{display:inline-block;width:auto;height:auto;padding:1em 2.5em;color:#fff;background-color:#272727;border-width:0;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:12px;line-height:1em;font-weight:normal;font-style:normal;text-transform:uppercase;letter-spacing:0px;text-align:center;text-decoration:none;cursor:pointer;outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.product-block .sqs-amazon-button{display:inline-block;width:auto;height:auto;padding:1em 2.5em;color:#fff;background-color:#272727;border-width:0;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:12px;line-height:1em;font-weight:normal;font-style:normal;text-transform:uppercase;letter-spacing:0px;text-align:center;text-decoration:none;cursor:pointer;outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;text-transform:none}.product-block .center .sqs-amazon-button{text-align:center}.product-block .right .sqs-amazon-button{text-align:right}.sqs-block-quote figure{margin:1em 0}.sqs-block-quote blockquote{margin:0}.sqs-block-quote .source{text-align:right}.foursquare-block ul{list-style-type:none;margin:0;padding:0;line-height:1.4em}.foursquare-block ul .foursquare-checkin{margin-bottom:12px}.foursquare-block ul .foursquare-checkin a{border:0}.foursquare-block ul .foursquare-checkin .foursquare-icon-wrapper{float:left}.foursquare-block ul .foursquare-checkin .foursquare-text{margin-left:42px;font-size:12px}.foursquare-block ul .foursquare-checkin .foursquare-venue{font-weight:bold}.foursquare-block ul .foursquare-checkin .foursquare-location{display:inline-block;padding-left:4px}.foursquare-block ul .foursquare-checkin .foursquare-timestamp{font-size:10px}.tagcloud-block ul{list-style-type:none;margin:0;padding-left:0}.tagcloud-block ul li{display:inline-block}.sqs-block-postsbycategory ul,.sqs-block-postsbyauthor ul,.sqs-block-postsbytag ul,.sqs-block-postsbymonth ul{list-style-type:none;margin:0;padding:0}.sqs-block-postsbycategory ul li,.sqs-block-postsbyauthor ul li,.sqs-block-postsbytag ul li,.sqs-block-postsbymonth ul li{margin:0 0 .3em 0;padding:0}.sqs-block-postsbycategory .count,.sqs-block-postsbyauthor .count,.sqs-block-postsbytag .count,.sqs-block-postsbymonth .count{display:none}.sqs-block-image .sqs-image-caption p,.sqs-block-image .image-caption p{font-size:12px;line-height:1.68em}.sqs-block-image .sqs-image-caption p a,.sqs-block-image .image-caption p a{display:inline}body.squarespace-config .sqs-block-image .sqs-image-caption{color:#999}body.squarespace-config .sqs-block-image .sqs-image-caption p{margin-bottom:0}body.squarespace-config .sqs-block-image .sqs-image-caption.sqs-placeholder-show{margin-top:1em}body.squarespace-config .sqs-block-image .sqs-image-caption .sqs-html-content{min-height:23px}.sqs-block-image:not(.sqs-block-focused) .sqs-image-caption.sqs-placeholder-show{display:none}.sqs-block-image .sqs-placeholder p{margin:0;margin-top:.7em}.sqs-block-image .image-block-outer-wrapper .image-block-wrapper img{max-width:none}.sqs-block-image .image-block-lightbox{cursor:pointer;display:block}.sqs-block-image .lightbox img{cursor:pointer}.sqs-block-image.sized .image-block-wrapper{overflow:hidden;padding-bottom:inherit !important}.sqs-block-image.sized .image-block-wrapper img{text-align:inherit;max-width:none}.sqs-block-image img{display:block}.sqs-block-image .image-block-wrapper.sqs-default-image{text-align:center}.sqs-block-image .image-block-wrapper.sqs-default-image img{display:inline-block}.sqs-block-image .image-block-outer-wrapper.layout-caption-overlay .intrinsic,.sqs-block-image .image-block-outer-wrapper.layout-caption-overlay-hover .intrinsic{position:relative}.sqs-block-image .image-block-outer-wrapper.layout-caption-overlay .intrinsic .image-caption-wrapper,.sqs-block-image .image-block-outer-wrapper.layout-caption-overlay-hover .intrinsic .image-caption-wrapper{position:absolute;overflow:hidden;top:auto;bottom:0;left:0;right:0;padding:18px;background:rgba(0,0,0,.7)}.sqs-block-image .image-block-outer-wrapper.layout-caption-overlay .intrinsic .image-caption-wrapper h1,.sqs-block-image .image-block-outer-wrapper.layout-caption-overlay-hover .intrinsic .image-caption-wrapper h1,.sqs-block-image .image-block-outer-wrapper.layout-caption-overlay .intrinsic .image-caption-wrapper strong,.sqs-block-image .image-block-outer-wrapper.layout-caption-overlay-hover .intrinsic .image-caption-wrapper strong{color:#eee}.sqs-block-image .image-block-outer-wrapper.layout-caption-overlay .intrinsic .image-caption-wrapper p,.sqs-block-image .image-block-outer-wrapper.layout-caption-overlay-hover .intrinsic .image-caption-wrapper p{color:#bbb;line-height:1.68em}.sqs-block-image .image-block-outer-wrapper.layout-caption-overlay .intrinsic .image-caption-wrapper p a,.sqs-block-image .image-block-outer-wrapper.layout-caption-overlay-hover .intrinsic .image-caption-wrapper p a{color:#bbb;text-decoration:underline}.sqs-block-image .image-block-outer-wrapper.layout-caption-overlay .intrinsic .image-caption-wrapper p:first-child,.sqs-block-image .image-block-outer-wrapper.layout-caption-overlay-hover .intrinsic .image-caption-wrapper p:first-child{padding-top:0;margin-top:0}.sqs-block-image .image-block-outer-wrapper.layout-caption-overlay .intrinsic .image-caption-wrapper p:last-child,.sqs-block-image .image-block-outer-wrapper.layout-caption-overlay-hover .intrinsic .image-caption-wrapper p:last-child{padding-bottom:0;margin-bottom:0}.sqs-block-image .image-block-outer-wrapper.layout-caption-overlay-hover:hover .image-caption-wrapper{visibility:visible;opacity:1}.sqs-block-image .image-block-outer-wrapper.layout-caption-overlay-hover .image-caption-wrapper{visibility:hidden;opacity:0;-webkit-transition:opacity .1s ease-out;-moz-transition:opacity .1s ease-out;-ms-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.sqs-block-image .image-block-outer-wrapper.layout-caption-overlay-hover:hover .image-caption{margin-bottom:0}.sqs-block-image .image-block-outer-wrapper.layout-caption-overlay-hover .image-caption{-webkit-transition:margin-bottom .1s ease-out;-moz-transition:margin-bottom .1s ease-out;-ms-transition:margin-bottom .1s ease-out;-o-transition:margin-bottom .1s ease-out;transition:margin-bottom .1s ease-out;margin-bottom:-5px}.sqs-block-image .image-block-outer-wrapper.layout-image-left{zoom:1}.sqs-block-image .image-block-outer-wrapper.layout-image-left:after{display:block;visibility:hidden;font-size:0;height:0;clear:both;content:\".\"}.sqs-block-image .image-block-outer-wrapper.layout-image-left .image-block-wrapper{float:left}.sqs-block-image .image-block-outer-wrapper.layout-image-left .image-caption-wrapper{float:left}.sqs-block-image .image-block-outer-wrapper.layout-image-left .image-caption{padding-left:15px}.sqs-block-image .image-block-outer-wrapper.layout-image-left .image-caption h1{font-size:18px;line-height:24px}.sqs-block-image .image-block-outer-wrapper.layout-image-right{zoom:1}.sqs-block-image .image-block-outer-wrapper.layout-image-right:after{display:block;visibility:hidden;font-size:0;height:0;clear:both;content:\".\"}.sqs-block-image .image-block-outer-wrapper.layout-image-right .image-block-wrapper{float:right}.sqs-block-image .image-block-outer-wrapper.layout-image-right .image-caption-wrapper{float:right;text-align:right}.sqs-block-image .image-block-outer-wrapper.layout-image-right .image-caption{padding-right:15px}.sqs-block-image .image-block-outer-wrapper.layout-image-right .image-caption h1{font-size:18px;line-height:24px}.sqs-block-image .image-block-wrapper{line-height:0;text-align:center;position:relative;overflow:hidden}.sqs-block-image .image-block-wrapper img{max-width:100%}.sqs-block-image .image-block-wrapper img.block-stretch{width:100%}.sqs-block-image .image-block-wrapper.float-right .image-block-wrapper{text-align:right}.sqs-block-image .intrinsic{margin:auto}.sqs-block-image .intrinsic .image-block-wrapper img{position:absolute;top:0;left:0;width:100%}.sqs-block-image .sqs-action-overlay{z-index:1000}.sqs-block-image .processing{background:#ccc;text-align:center}.sqs-block-image .processing .progress-container{background:#ccc;top:15px}.sqs-block-image .processing-failed{background:#ccc;text-align:center;position:relative;height:100%}.sqs-block-image.vsize-1 .image-block-wrapper{height:34px}.sqs-block-image.vsize-2 .image-block-wrapper{height:68px}.sqs-block-image.vsize-3 .image-block-wrapper{height:102px}.sqs-block-image.vsize-4 .image-block-wrapper{height:136px}.sqs-block-image.vsize-5 .image-block-wrapper{height:170px}.sqs-block-image.vsize-6 .image-block-wrapper{height:204px}.sqs-block-image.vsize-7 .image-block-wrapper{height:238px}.sqs-block-image.vsize-8 .image-block-wrapper{height:272px}.sqs-block-image.vsize-9 .image-block-wrapper{height:306px}.sqs-block-image.vsize-10 .image-block-wrapper{height:340px}.sqs-block-image.vsize-11 .image-block-wrapper{height:374px}.sqs-block-image.vsize-12 .image-block-wrapper{height:408px}.sqs-block-image.vsize-13 .image-block-wrapper{height:442px}.sqs-block-image.vsize-14 .image-block-wrapper{height:476px}.sqs-block-image.vsize-15 .image-block-wrapper{height:510px}.sqs-block-image.vsize-16 .image-block-wrapper{height:544px}.sqs-block-image.vsize-17 .image-block-wrapper{height:578px}.sqs-block-image.vsize-18 .image-block-wrapper{height:612px}.sqs-block-image.vsize-19 .image-block-wrapper{height:646px}.sqs-block-image.vsize-20 .image-block-wrapper{height:680px}.sqs-block-image.vsize-21 .image-block-wrapper{height:714px}.sqs-block-image.vsize-22 .image-block-wrapper{height:748px}.sqs-block-image.vsize-23 .image-block-wrapper{height:782px}.sqs-block-image.vsize-24 .image-block-wrapper{height:816px}.sqs-block-image.vsize-25 .image-block-wrapper{height:850px}.sqs-block-image.vsize-26 .image-block-wrapper{height:884px}.sqs-block-image.vsize-27 .image-block-wrapper{height:918px}.sqs-block-image.vsize-28 .image-block-wrapper{height:952px}.sqs-block-image.vsize-29 .image-block-wrapper{height:986px}.sqs-block-image.vsize-30 .image-block-wrapper{height:1020px}.sqs-block-image.vsize-1 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-2 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-3 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-4 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-5 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-6 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-7 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-8 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-9 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-10 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-11 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-12 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-13 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-14 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-15 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-16 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-17 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-18 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-19 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-20 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-21 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-22 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-23 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-24 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-25 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-26 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-27 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-28 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-29 .sqs-block-content{height:auto;overflow:visible}.sqs-block-image.vsize-30 .sqs-block-content{height:auto;overflow:visible}.sqs-block-horizontalrule hr{border:none;color:#bbb;background-color:#bbb;height:1px}.sqs-block-html{clear:none}.sqs-block-html .sqs-block-content{outline:none}.sqs-block-html .sqs-block-content>*:first-child{margin-top:0}.sqs-block-html .sqs-block-content>*:last-child{margin-bottom:0}.sqs-html{position:relative;z-index:1}.sqs-html .sqs-html-content{outline:none;z-index:2}.sqs-html .sqs-html-hidden{display:none}.sqs-block-markdown{clear:none}.sqs-block-markdown .sqs-block-content{position:relative}.sqs-block-markdown .sqs-block-content *:first-child{margin-top:0}.sqs-block-markdown .sqs-block-content *:last-child{margin-bottom:0}.sqs-block-markdown .sqs-placeholder{color:#999}.sqs-block-markdown .sqs-editing-overlay{display:none}.sqs-block-markdown hr{border:none;border-bottom:1px solid #ccc;width:75%;margin-left:auto;margin-right:auto}.sqs-block-markdown textarea{position:absolute;top:17px;bottom:0;left:17px;right:17px;width:calc( 100% - 34px);padding:0;margin:0;border:none;background:transparent;outline:none;resize:none;overflow:hidden;color:#333}.sqs-block-markdown .textarea-clone{margin:0;min-height:18px;visibility:hidden}.sqs-block-markdown textarea,.sqs-block-markdown .textarea-clone{font:15px/18px 'Courier New',monospace !important;white-space:pre-wrap;word-wrap:break-word}.sqs-block-markdown img{max-width:100%;height:auto}.source-code{white-space:pre;overflow:auto}.cm-keyword{color:#708}.cm-atom{color:#219}.cm-number{color:#164}.cm-def{color:blue}.cm-variable-2{color:#05a}.cm-variable-3{color:#085}.cm-comment{color:#aaa}.cm-string{color:#1a1}.cm-string-2{color:#5f0}.cm-meta{color:#555}.cm-error{color:red}.cm-qualifier{color:#555}.cm-builtin{color:#30a}.cm-bracket{color:#cc7}.cm-tag{color:#170}.cm-attribute{color:#00c}.cm-header{color:#000}.cm-quote{color:#900}.cm-hr{color:#999}.cm-link{color:#00c}.dark .cm-comment{color:#75715e}.dark .cm-atom{color:#ae81ff}.dark .cm-number{color:#ae81ff}.dark .cm-property,.dark .cm-attribute{color:#a6e22e}.dark .cm-keyword{color:#f92672}.dark .cm-string{color:#e6db74}.dark .cm-variable-2{color:#9effff}.dark .cm-def{color:#fd971f}.dark .cm-error{background:#f92672;color:#f8f8f0}.dark .cm-bracket{color:#f8f8f2}.dark .cm-tag{color:#f92672}.dark .cm-link{color:#ae81ff}.code-block .state-message:not(:last-child){margin-bottom:10px}.embed-block .intrinsic,.video-block .intrinsic,.embed-block .sqs-block-content .intrinsic,.video-block .sqs-block-content .intrinsic{position:relative}.embed-block .intrinsic .embed-block-wrapper:not(.embed-block-provider-SoundCloud),.video-block .intrinsic .embed-block-wrapper:not(.embed-block-provider-SoundCloud),.embed-block .sqs-block-content .intrinsic .embed-block-wrapper:not(.embed-block-provider-SoundCloud),.video-block .sqs-block-content .intrinsic .embed-block-wrapper:not(.embed-block-provider-SoundCloud){position:relative}.embed-block .intrinsic .embed-block-wrapper:not(.embed-block-provider-SoundCloud) .sqs-video-wrapper,.video-block .intrinsic .embed-block-wrapper:not(.embed-block-provider-SoundCloud) .sqs-video-wrapper,.embed-block .sqs-block-content .intrinsic .embed-block-wrapper:not(.embed-block-provider-SoundCloud) .sqs-video-wrapper,.video-block .sqs-block-content .intrinsic .embed-block-wrapper:not(.embed-block-provider-SoundCloud) .sqs-video-wrapper{position:absolute;top:0;left:0;width:100%;height:100%}.embed-block .intrinsic .embed-block-wrapper:not(.embed-block-provider-SoundCloud) iframe,.video-block .intrinsic .embed-block-wrapper:not(.embed-block-provider-SoundCloud) iframe,.embed-block .sqs-block-content .intrinsic .embed-block-wrapper:not(.embed-block-provider-SoundCloud) iframe,.video-block .sqs-block-content .intrinsic .embed-block-wrapper:not(.embed-block-provider-SoundCloud) iframe{position:absolute;top:0;left:0;width:100%;height:100%}.embed-block .intrinsic .embed-block-wrapper:not(.embed-block-provider-SoundCloud) .flickr-oembed,.video-block .intrinsic .embed-block-wrapper:not(.embed-block-provider-SoundCloud) .flickr-oembed,.embed-block .sqs-block-content .intrinsic .embed-block-wrapper:not(.embed-block-provider-SoundCloud) .flickr-oembed,.video-block .sqs-block-content .intrinsic .embed-block-wrapper:not(.embed-block-provider-SoundCloud) .flickr-oembed{position:absolute;top:0;left:0;width:100%;height:100%}.embed-block .intrinsic .embed-block-provider-SoundCloud,.video-block .intrinsic .embed-block-provider-SoundCloud,.embed-block .sqs-block-content .intrinsic .embed-block-provider-SoundCloud,.video-block .sqs-block-content .intrinsic .embed-block-provider-SoundCloud{padding-bottom:0 !important}.embed-block .intrinsic .embed-block-provider-SoundCloud iframe,.video-block .intrinsic .embed-block-provider-SoundCloud iframe,.embed-block .sqs-block-content .intrinsic .embed-block-provider-SoundCloud iframe,.video-block .sqs-block-content .intrinsic .embed-block-provider-SoundCloud iframe{width:100%}.sqs-block-soundcloud .sqs-intrinsic iframe{position:absolute;top:0;left:0;width:100% !important;height:100% !important}.sqs-block-audio{min-height:34px}.sqs-block-tourdates .sqs-spin{position:absolute;top:50px;left:50%;margin-left:-15px}.sqs-block-tourdates .tour-list{list-style-type:none;margin:0;padding:0;min-height:150px}.sqs-block-tourdates .loaded .tour-list{min-height:0}.sqs-block-tourdates .tour-item{position:relative;margin:0;padding:17px 0;border-bottom:1px solid rgba(130,130,130,.15);overflow:hidden}.sqs-block-tourdates .tour-item.clone{display:none}.sqs-block-tourdates .tour-item:first-of-type{padding-top:0}.sqs-block-tourdates .tour-item:last-of-type{border:none}.sqs-block-tourdates .loaded .tour-item-no-results:after{content:'There are no upcoming tour dates.'}.sqs-block-tourdates .tour-timeframe,.sqs-block-tourdates .tour-venue,.sqs-block-tourdates .tour-location,.sqs-block-tourdates .tour-actions{float:left;box-sizing:border-box;font-size:16px;line-height:28px}.sqs-block-tourdates .tour-timeframe{width:120px;white-space:nowrap;padding:2px 0 0 0;font-size:13px !important;font-weight:bold;letter-spacing:.5px}.sqs-block-tourdates .tour-date,.sqs-block-tourdates .tour-weekday{box-sizing:border-box;display:inline-block;width:50%;text-transform:uppercase}.sqs-block-tourdates .tour-venue{width:calc(60% -  171px);width:-webkit-calc(60% -  171px);width:-moz-calc(60% -  171px);padding:1px 25.5px 0 0}.sqs-block-tourdates .tour-venue-link,.sqs-block-tourdates .tour-location-link{color:inherit !important;text-decoration:none !important}.sqs-block-tourdates .tour-venue-name,.sqs-block-tourdates .tour-lineup{display:block}.sqs-block-tourdates .tour-lineup{opacity:.6;margin-top:2px;font-size:14px;line-height:18px}.sqs-block-tourdates .tour-lineup:before{content:'w/ '}.sqs-block-tourdates .tour-lineup-item{display:inline}.sqs-block-tourdates .tour-lineup-item:after{content:', '}.sqs-block-tourdates .tour-lineup-item:last-of-type:after{content:none}.sqs-block-tourdates .tour-location{width:calc(40% -  114px);width:-webkit-calc(40% -  114px);width:-moz-calc(40% -  114px);padding:1px 25.5px 0 0}.sqs-block-tourdates .tour-actions{width:165px;white-space:nowrap;text-align:right}.sqs-block-tourdates .tour-button{width:auto;height:auto;padding:1em 2.5em;color:#fff;background-color:#272727;border-width:0;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:12px;line-height:1em;font-weight:normal;font-style:normal;text-transform:uppercase;letter-spacing:0px;text-align:center;text-decoration:none;cursor:pointer;outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;display:inline-block;padding:0 12px !important;font-size:11px !important;line-height:28px}.sqs-block-tourdates .tour-button--ticket:empty{display:none}.sqs-block-tourdates .tour-button--disabled.tour-button,.sqs-block-tourdates .tour-button--soldout.tour-button,.sqs-block-tourdates .tour-button--disabled.tour-button:hover,.sqs-block-tourdates .tour-button--soldout.tour-button:hover{opacity:.3;cursor:default;pointer-events:none}.sqs-block-tourdates .tour-button--rsvp:before{content:'RSVP'}.sqs-block-tourdates .tourblock-compact-mode .tour-item{display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-flow:column nowrap;-moz-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap;-webkit-box-pack:flex-start;-ms-flex-pack:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;justify-content:flex-start;width:100%;position:relative;padding:20px 0;flex-direction:column;-webkit-box-orient:vertical;overflow:visible}.sqs-block-tourdates .tourblock-compact-mode .tour-item:first-of-type{padding-top:0}.sqs-block-tourdates .tourblock-compact-mode .tour-timeframe,.sqs-block-tourdates .tourblock-compact-mode .tour-venue,.sqs-block-tourdates .tourblock-compact-mode .tour-location,.sqs-block-tourdates .tourblock-compact-mode .tour-actions{float:none;display:block;width:auto;-webkit-flex-basis:auto;-moz-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto;padding-top:0 !important}.sqs-block-tourdates .tourblock-compact-mode .tour-timeframe{-webkit-box-ordinal-group:1;-moz-box-ordinal-group:1;-ms-flex-order:1;-webkit-order:1;order:1}.sqs-block-tourdates .tourblock-compact-mode .tour-location{-webkit-box-ordinal-group:2;-moz-box-ordinal-group:2;-ms-flex-order:2;-webkit-order:2;order:2}.sqs-block-tourdates .tourblock-compact-mode .tour-venue{-webkit-box-ordinal-group:3;-moz-box-ordinal-group:3;-ms-flex-order:3;-webkit-order:3;order:3}.sqs-block-tourdates .tourblock-compact-mode .tour-timeframe{margin-bottom:14px;right:0}.sqs-block-tourdates .tourblock-compact-mode .tour-date,.sqs-block-tourdates .tourblock-compact-mode .tour-weekday{width:auto;margin-right:5px}.sqs-block-tourdates .tourblock-compact-mode .tour-lineup{margin-top:0}.sqs-block-tourdates .tourblock-compact-mode .tour-actions{position:absolute;top:18px;right:0}.sqs-block-tourdates .tourblock-compact-mode .tour-item:first-of-type .tour-actions{top:-2px}.sqs-block-tourdates .tourblock-has-small-container .tour-item{display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-flow:column nowrap;-moz-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap;-webkit-box-pack:flex-start;-ms-flex-pack:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;justify-content:flex-start;width:100%;position:relative;padding:20px 0;flex-direction:column;-webkit-box-orient:vertical;overflow:visible}.sqs-block-tourdates .tourblock-has-small-container .tour-item:first-of-type{padding-top:0}.sqs-block-tourdates .tourblock-has-small-container .tour-timeframe,.sqs-block-tourdates .tourblock-has-small-container .tour-venue,.sqs-block-tourdates .tourblock-has-small-container .tour-location,.sqs-block-tourdates .tourblock-has-small-container .tour-actions{float:none;display:block;width:auto;-webkit-flex-basis:auto;-moz-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto;padding-top:0 !important}.sqs-block-tourdates .tourblock-has-small-container .tour-timeframe{-webkit-box-ordinal-group:1;-moz-box-ordinal-group:1;-ms-flex-order:1;-webkit-order:1;order:1}.sqs-block-tourdates .tourblock-has-small-container .tour-location{-webkit-box-ordinal-group:2;-moz-box-ordinal-group:2;-ms-flex-order:2;-webkit-order:2;order:2}.sqs-block-tourdates .tourblock-has-small-container .tour-venue{-webkit-box-ordinal-group:3;-moz-box-ordinal-group:3;-ms-flex-order:3;-webkit-order:3;order:3}.sqs-block-tourdates .tourblock-has-small-container .tour-timeframe{margin-bottom:14px;right:0}.sqs-block-tourdates .tourblock-has-small-container .tour-date,.sqs-block-tourdates .tourblock-has-small-container .tour-weekday{width:auto;margin-right:5px}.sqs-block-tourdates .tourblock-has-small-container .tour-lineup{margin-top:0}.sqs-block-tourdates .tourblock-has-small-container .tour-actions{position:absolute;top:18px;right:0}.sqs-block-tourdates .tourblock-has-small-container .tour-item:first-of-type .tour-actions{top:-2px}@media screen and (max-width:450px){.sqs-block-tourdates .tour-item{display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-flow:column nowrap;-moz-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap;-webkit-box-pack:flex-start;-ms-flex-pack:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;justify-content:flex-start;width:100%;position:relative;padding:20px 0;flex-direction:column;-webkit-box-orient:vertical;overflow:visible}.sqs-block-tourdates .tour-item:first-of-type{padding-top:0}.sqs-block-tourdates .tour-timeframe,.sqs-block-tourdates .tour-venue,.sqs-block-tourdates .tour-location,.sqs-block-tourdates .tour-actions{float:none;display:block;width:auto;-webkit-flex-basis:auto;-moz-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto;padding-top:0 !important}.sqs-block-tourdates .tour-timeframe{-webkit-box-ordinal-group:1;-moz-box-ordinal-group:1;-ms-flex-order:1;-webkit-order:1;order:1}.sqs-block-tourdates .tour-location{-webkit-box-ordinal-group:2;-moz-box-ordinal-group:2;-ms-flex-order:2;-webkit-order:2;order:2}.sqs-block-tourdates .tour-venue{-webkit-box-ordinal-group:3;-moz-box-ordinal-group:3;-ms-flex-order:3;-webkit-order:3;order:3}.sqs-block-tourdates .tour-timeframe{margin-bottom:14px;right:0}.sqs-block-tourdates .tour-date,.sqs-block-tourdates .tour-weekday{width:auto;margin-right:5px}.sqs-block-tourdates .tour-lineup{margin-top:0}.sqs-block-tourdates .tour-actions{position:absolute;top:18px;right:0}.sqs-block-tourdates .tour-item:first-of-type .tour-actions{top:-2px}}.button-style-outline .sqs-block-tourdates .tour-timeframe{padding-top:3px}.button-style-outline .sqs-block-tourdates .tour-venue,.button-style-outline .sqs-block-tourdates .tour-location{padding-top:2px}.button-style-outline .sqs-block-tourdates .tour-button{margin-left:2px}.sqs-search-ui-button-wrapper{position:relative}.sqs-search-ui-button-wrapper.color-dark .search-input{background-image:url(/universal/images-v6/icons/icon-searchqueries-20-dark.png);border:1px solid #aaa}.sqs-search-ui-button-wrapper.color-dark::-webkit-input-placeholder{color:#666}.sqs-search-ui-button-wrapper.color-dark:-moz-placeholder{color:#666}.sqs-search-ui-button-wrapper.color-dark::-moz-placeholder{color:#666}.sqs-search-ui-button-wrapper.color-dark:-ms-input-placeholder{color:#666}.sqs-search-ui-button-wrapper.color-light .search-input{background-image:url(/universal/images-v6/icons/icon-searchqueries-20-light.png);color:#f7f7f7;border:1px solid #eee}.sqs-search-ui-button-wrapper.color-light::-webkit-input-placeholder{color:#ddd}.sqs-search-ui-button-wrapper.color-light:-moz-placeholder{color:#ddd}.sqs-search-ui-button-wrapper.color-light::-moz-placeholder{color:#ddd}.sqs-search-ui-button-wrapper.color-light:-ms-input-placeholder{color:#ddd}.sqs-search-ui-button-wrapper .search-input{opacity:.7;-webkit-transition:opacity .2s ease-out;-moz-transition:opacity .2s ease-out;-ms-transition:opacity .2s ease-out;-o-transition:opacity .2s ease-out;transition:opacity .2s ease-out;-webkit-transition:background-image .2s ease-out;-moz-transition:background-image .2s ease-out;-ms-transition:background-image .2s ease-out;-o-transition:background-image .2s ease-out;transition:background-image .2s ease-out;padding:12px 12px 12px 45px;background:no-repeat 15px 50%;width:100%;min-height:20px;display:block;outline:0;box-sizing:border-box}.sqs-search-ui-button-wrapper .search-input.loading{background-image:none}.sqs-search-ui-button-wrapper .search-input.disabled{cursor:pointer}.sqs-search-ui-button-wrapper .search-input.hover-effect:hover,.sqs-search-ui-button-wrapper .search-input.hover-effect:focus{opacity:1}.sqs-search-ui-button-wrapper .search-input:hover::-webkit-input-placeholder{font-style:normal}.sqs-search-ui-button-wrapper .search-input:hover:-moz-placeholder{font-style:normal}.sqs-search-ui-button-wrapper .search-input:hover::-moz-placeholder{font-style:normal}.sqs-search-ui-button-wrapper .search-input:hover:-ms-input-placeholder{font-style:normal}.sqs-search-ui-button-wrapper .spinner-wrapper{position:absolute;top:50%;-webkit-transform:translatey(-50%);-moz-transform:translatey(-50%);-ms-transform:translatey(-50%);-o-transform:translatey(-50%);transform:translatey(-50%);left:18px}.sqs-search-ui-button-wrapper .spinner-wrapper .sqs-spin{display:block;vertical-align:middle}.sqs-search-preview-ui{position:absolute;z-index:999999;background-color:#fff;width:100%}.sqs-search-preview-ui .sqs-search-ui-result{border-top:none;border:1px solid #ddd}.sqs-search-preview-ui .sqs-search-ui-result .search-result-notice{background-color:#fff;font-weight:200;font-size:12px;padding:6px 12px}.sqs-search-preview-ui .sqs-search-ui-result .search-result-notice.hide{display:none}.sqs-search-preview-ui .sqs-search-ui-result .sqs-search-ui-list{max-height:500px;overflow-x:hidden;overflow-y:scroll}.sqs-search-preview-ui .sqs-search-ui-result .sqs-search-ui-list .search-result{padding:16px;cursor:pointer;border-bottom:1px solid #ddd;-webkit-transition:background-color .2s ease-out;-moz-transition:background-color .2s ease-out;-ms-transition:background-color .2s ease-out;-o-transition:background-color .2s ease-out;transition:background-color .2s ease-out}.sqs-search-preview-ui .sqs-search-ui-result .sqs-search-ui-list .search-result:last-child{border-bottom:none}.sqs-search-preview-ui .sqs-search-ui-result .sqs-search-ui-list .search-result.selected,.sqs-search-preview-ui .sqs-search-ui-result .sqs-search-ui-list .search-result:hover{background-color:#f5f5f5}.sqs-search-preview-ui .sqs-search-ui-result .sqs-search-ui-list .search-result .sqs-search-ui-item{border-top:none}.sqs-search-preview-ui .sqs-search-ui-result .sqs-search-ui-list .search-result .sqs-search-ui-item em{color:#222;font-style:italic}.sqs-search-preview-ui .sqs-search-ui-result .sqs-search-ui-list .search-result .sqs-search-ui-item .sqs-main-image{position:absolute;top:0;left:0;right:0;bottom:0}.sqs-search-preview-ui .sqs-search-ui-result .sqs-search-ui-list .search-result .sqs-search-ui-item .sqs-main-image-container{width:50px;float:right;margin-left:5px;box-shadow:#ddd 1px -1px 5px}.sqs-search-preview-ui .sqs-search-ui-result .sqs-search-ui-list .search-result .sqs-search-ui-item .sqs-main-image-intrinsic{position:relative;width:100%;height:0;padding-bottom:100%}.sqs-search-preview-ui .sqs-search-ui-result .sqs-search-ui-list .search-result .sqs-search-ui-item .sqs-title{font-size:16px;line-height:1.2em;margin-bottom:.5em;color:#333}.sqs-search-preview-ui .sqs-search-ui-result .sqs-search-ui-list .search-result .sqs-search-ui-item .sqs-content{font-size:12px;line-height:1.4em}.sqs-search-preview-ui.no-image .sqs-main-image-container{display:none}.sqs-block-map .sqs-block-map-content{position:relative}.sqs-block-map .sqs-block-map-content .sqs-map-wrapper{position:absolute !important;top:0;left:0;height:100%;max-width:none;width:100%}.rss-block .social-rss:before{position:relative;top:-.05em;margin-right:.4em;font-size:.7em}.twitter-block .tweet-list{list-style-type:none;margin:0 0 2.2em 0;padding:0}.twitter-block .tweet{margin:0 0 2.2em 0}.twitter-block .tweet a{border:0}.twitter-block .tweet .tweet-avatar-wrapper{float:left}.twitter-block .tweet .tweet-avatar{border-radius:2px}.twitter-block .tweet .tweet-text-wrapper{margin-left:60px}.twitter-block .tweet.no-avatar .tweet-text-wrapper{margin-left:0px}.twitter-block .tweet .tweet-from{font-size:1.1em;margin:0 0 .5em 0;line-height:1em;font-weight:bold}.twitter-block .tweet .tweet-timestamp a{font-size:.8em}.form-wrapper .field-list{line-height:normal}.form-wrapper .field-list fieldset,.form-wrapper .field-list legend{margin:0;padding:0;border:0}.form-wrapper .field-list legend{display:none}.form-wrapper .field-list textarea{min-height:100px;resize:vertical}.form-wrapper .field-list textarea.medium{min-height:200px}.form-wrapper .field-list textarea.large{min-height:300px}.form-wrapper .field-list .section{margin:2em 0;padding-bottom:.3em;font-size:.9em;text-transform:uppercase}.form-wrapper .field-list .section.underline{border-bottom:1px solid #999}.form-wrapper .field-list .section:nth-child(1){margin:0 0 2em 0}.form-wrapper .field-list .title{display:block}.form-wrapper .field-list .description{padding:.5em 0 .5em;font-size:12px;-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)\";filter:alpha(opacity=70);-moz-opacity:.7;-khtml-opacity:.7;opacity:.7;display:block}.form-wrapper .field-list .field{position:relative;margin:0 0 24px}.form-wrapper .field-list .field .caption{font-size:12px}.form-wrapper .field-list .field .caption .field-element{font-size:14px}.form-wrapper .field-list .field .field-element{width:100%;padding:12px;margin:6px 0 4px;border:1px solid #ccc;background:#fafafa;font-family:sans-serif;font-size:12px;line-height:normal;box-sizing:border-box;border-radius:2px}.form-wrapper .field-list .field .field-element:focus{background:#fff;-webkit-transition:background .1s ease-in;-moz-transition:background .1s ease-in;-ms-transition:background .1s ease-in;-o-transition:background .1s ease-in;transition:background .1s ease-in;outline:none}.form-wrapper .field-list .field select{margin:6px 0 4px;max-width:100%}.form-wrapper .field-list .field .prefix{position:absolute;bottom:16px;left:8px;color:#aaa;font-family:sans-serif;font-size:13px;line-height:16px}.form-wrapper .field-list .field.twitter .field-element{padding-left:22px}.form-wrapper .field-list .field.currency.hassymbol .field-element{padding-left:20px}.form-wrapper .field-list .field.website .field-element{padding-left:45px}.form-wrapper .field-list .field.checkbox label,.form-wrapper .field-list .field.radio label{cursor:pointer}.form-wrapper .field-list .field.checkbox input,.form-wrapper .field-list .field.radio input{margin-right:5px}.form-wrapper .field-list .field .option{margin:6px 0 4px;font-size:13px}.form-wrapper .field-list .field.likert .item{overflow:hidden;margin:1.6em 0 1.6em 0}.form-wrapper .field-list .field.likert .question{margin:0 0 .5em 0;font-size:.9em}.form-wrapper .field-list .field.likert .option{width:20%;float:left;text-align:left;border-top:1px solid #ddd}.form-wrapper .field-list .field.likert .option label{margin:0;padding:0 0 0 1px;font-size:.9em;display:block;cursor:pointer}.form-wrapper .field-list .field.likert .option input{margin:10px 0;display:block}.form-wrapper .field-list .field.likert .option:last-of-type{border-right:none}.form-wrapper .field-list .fields{margin:0 0 0 -2%}.form-wrapper .field-list .fields .title,.form-wrapper .field-list .fields .description,.form-wrapper .field-list .fields .field,.form-wrapper .field-list .fields .field-error{margin-left:2%}.form-wrapper .field-list .fields .field{float:left}.form-wrapper .field-list .fields .field.two-digits{width:3.5em}.form-wrapper .field-list .fields .field.three-digits{width:4.2em}.form-wrapper .field-list .fields .field.four-digits{width:4.8em}.form-wrapper .field-list .fields .field.ampm{width:4.5em}.form-wrapper .field-list .fields.name .field{width:48%}.form-wrapper .field-list .fields.address .field.address1,.form-wrapper .field-list .fields.address .field.address2{width:98%}.form-wrapper .field-list .fields.address .field.city{width:70%}.form-wrapper .field-list .fields.address .field.state-province{width:26%}.form-wrapper .field-list .fields.address .field.zip{width:36%}.form-wrapper .field-list .fields.address .field.country{width:98%}.form-wrapper .field-list .fields.payment .field.card-expiry-month{width:40%}.form-wrapper .field-list .fields.payment .field.card-expiry-year{width:40%}.form-wrapper .field-list .form-item.error,.form-wrapper .field-list .form-item.error .caption,.form-wrapper .field-list .form-item.error .title,.form-wrapper .field-list .form-item.error .description{color:#bd0000}.form-wrapper .field-list .form-item.error input,.form-wrapper .field-list .form-item.error textarea{border:1px solid #e99292}.form-wrapper .form-button-wrapper--align-left{text-align:left}.form-wrapper .form-button-wrapper--align-center{text-align:center}.form-wrapper .form-button-wrapper--align-right{text-align:right}.form-wrapper input[type=submit]{display:inline-block;width:auto;height:auto;padding:1em 2.5em;color:#fff;background-color:#272727;border-width:0;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:12px;line-height:1em;font-weight:normal;font-style:normal;text-transform:uppercase;letter-spacing:0px;text-align:center;text-decoration:none;cursor:pointer;outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;font-size:14px;text-transform:none}.form-wrapper .form-submission-text{margin-top:20px}.form-wrapper .field-error{color:#fff;background:#cc3b3b url('//static.squarespace.com/universal/images-v6/standard/icon_close_7_light.png') no-repeat 9px 50%;padding:5px 15px 3px 25px;font-size:13px;border-radius:2px;margin:12px 0;line-height:23px;display:inline-block}.form-wrapper .field .field-error{margin-bottom:.5em}.form-wrapper .submitting .field-list{opacity:.7}.form-wrapper .hidden,.form-wrapper.hidden{display:none}.form-block .lightbox-handle-wrapper--align-left{text-align:left}.form-block .lightbox-handle-wrapper--align-center{text-align:center}.form-block .lightbox-handle-wrapper--align-right{text-align:right}.form-block .lightbox-handle{display:inline-block;width:auto;height:auto;padding:1em 2.5em;color:#fff;background-color:#272727;border-width:0;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:12px;line-height:1em;font-weight:normal;font-style:normal;text-transform:uppercase;letter-spacing:0px;text-align:center;text-decoration:none;cursor:pointer;outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;font-size:14px;text-transform:none}.sqs-modal-lightbox{width:100%;font-size:14px;text-transform:none;font-style:normal;text-decoration:none}.sqs-modal-lightbox-content{z-index:100000000;position:absolute;height:100%;width:100%;top:0}.sqs-modal-lightbox-content .lightbox-background{position:absolute;top:0;width:100%;height:100%;background:#000;opacity:.4}.sqs-modal-lightbox-content .lightbox-inner{position:absolute;overflow:auto;-webkit-overflow-scrolling:touch;width:100%;height:100%;top:0}.sqs-modal-lightbox-content .lightbox-inner .lightbox-content{max-width:600px;margin:0 auto;position:relative;padding:40px;background:#fff}.sqs-modal-lightbox-content .lightbox-inner .lightbox-content .form-wrapper{color:#222;font-family:inherit}.sqs-modal-lightbox-content .lightbox-inner .lightbox-content .form-wrapper .form-title{font-size:22px;line-height:1.2em;margin-right:22px;color:#333}.sqs-modal-lightbox-content .lightbox-inner .lightbox-content .form-wrapper .form-inner-wrapper form{margin-top:55px}.sqs-modal-lightbox-content .lightbox-inner .lightbox-content .form-wrapper .form-inner-wrapper form .radio .option{margin-left:1px}.sqs-modal-lightbox-content .lightbox-inner .lightbox-content .lightbox-close{position:absolute;color:#333;font-size:22px;width:22px;line-height:22px;top:40px;right:40px;text-align:center;cursor:pointer}@media only screen and (max-width:600px){.sqs-modal-lightbox .lightbox-inner{background:#fff}.sqs-modal-lightbox .lightbox-inner .lightbox-content{margin-top:0 !important}}html.sqs-modal-lightbox-open,html.sqs-modal-lightbox-open body{overflow:hidden}.menu-block .menu-selector{margin-bottom:3em}.menu-block .menu-selector label{display:inline-block;padding:0 .5em;font-size:1.1em}.menu-block .menu-select-button{display:none}.menu-block .menu-header{margin-bottom:3em}.menu-block .menu-section{margin-top:1em}.menu-block .menu-section+.menu-section{margin-top:5em}.menu-block .menu-section-header{margin-bottom:2em;padding-bottom:1em}.menu-block .menu-section-title{font-size:1.5em}.menu-block .menu-section-description{font-size:.85em;line-height:1.4em}.menu-block .menu-item{margin-bottom:2em;margin-top:0;line-height:1.2em}.menu-block .menu-item-title{font-size:1.1em;font-weight:700;line-height:1.2em}.menu-block .menu-item-description{line-height:1.3em;margin-top:5px}.menu-block .menu-item-price-bottom{margin:.5em 0}.menu-block .menu-item-option{font-size:.8em;font-style:italic}.menu-block .menu-style-classic .menu-selector,.menu-block .menu-style-classic .menu-header,.menu-block .menu-style-classic .menu-section-title,.menu-block .menu-style-classic .menu-section-description{text-align:center}.menu-block .menu-style-classic .menu-items{-webkit-column-width:18em;-webkit-column-gap:3em;-moz-column-width:18em;-moz-column-gap:3em;-ms-column-width:18em;-ms-column-gap:3em;-o-column-width:18em;-o-column-gap:3em;column-width:18em;column-gap:3em}.menu-block .menu-style-classic .menu-item{page-break-inside:avoid;-webkit-column-break-inside:avoid;-moz-column-break-inside:avoid;-ms-column-break-inside:avoid;-o-column-break-inside:avoid;break-inside:avoid;width:100%}.menu-block .menu-style-classic .menu-item-description{margin-right:3em}.menu-block .menu-style-classic .menu-item-price-top{float:right;padding-left:20px}.menu-block .menu-style-classic .menu-item-price-bottom{display:none}.menu-block .menu-style-simple .menu-selector,.menu-block .menu-style-simple .menu{text-align:center}.menu-block .menu-style-simple .menu-item-price-top{display:none}.donation-block .sqs-donate-button-wrapper{display:block}.donation-block .sqs-donate-button-wrapper--align-left{text-align:left}.donation-block .sqs-donate-button-wrapper--align-center{text-align:center}.donation-block .sqs-donate-button-wrapper--align-right{text-align:right}.donation-block .sqs-donate-button{display:inline-block;width:auto;height:auto;padding:1em 2.5em;color:#fff;background-color:#272727;border-width:0;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:12px;line-height:1em;font-weight:normal;font-style:normal;text-transform:uppercase;letter-spacing:0px;text-align:center;text-decoration:none;cursor:pointer;outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.sqs-block-opentable-hidden{display:none !important}.sqs-block-opentable iframe{visibility:hidden;position:absolute}.sqs-block-opentable *{box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box}.sqs-block-opentable #OT_form{padding:0;margin:0;width:165px;width:auto}.sqs-block-opentable .OT_wrapper{border:none;border-radius:0;background-color:rgba(0,0,0,.05);font-family:inherit;width:100%;margin:0;padding:34px 17px 40px;background:rgba(0,0,0,.05);color:#272727;font-size:15px;line-height:1em;text-align:center;position:relative}.sqs-block-opentable .OT_header{width:85%;margin:0 auto;position:relative}.sqs-block-opentable .OT_title{position:relative;width:100%;margin:0 0 17px 0;padding:0;font-size:30px;color:#272727;color:rgba(0,0,0,.95);font-weight:normal;text-align:center;line-height:1em}.sqs-block-opentable .OT_subtitle{margin:0;padding:0;font-size:10px;letter-spacing:.15em;color:#272727;color:rgba(0,0,0,.8);text-transform:uppercase;font-weight:normal;white-space:nowrap;width:auto;line-height:1em}.sqs-block-opentable .OT_list{list-style:none;margin:28px 0 0 0;padding:0;width:auto;display:inline-block;line-height:1em}.sqs-block-opentable .OT_day,.sqs-block-opentable .OT_time,.sqs-block-opentable .OT_party{margin:0 12px;padding:6px 0 6px 35px;height:auto;background-image:url('/universal/images-v6/icons/opentable-icons.svg');background-repeat:no-repeat;background-position:0 0;width:33%;min-width:150px;max-width:180px;position:relative;border:none !important;list-style:none;display:inline-block;line-height:1em}.sqs-block-opentable.sqs-block-opentable-hide-fields .OT_day,.sqs-block-opentable.sqs-block-opentable-hide-fields .OT_time,.sqs-block-opentable.sqs-block-opentable-hide-fields .OT_party{display:none}.sqs-block-opentable.sqs-block-opentable-hide-fields .OT_submit{margin:0}.sqs-block-opentable .OT_day{margin:0 12px;padding:6px 0 6px 35px;background-position:-18px -7px;border:none;list-style:none;background-size:123px}.sqs-block-opentable .OT_time{background-position:-18px -55px;border:none}.sqs-block-opentable .OT_party{background-position:-18px -102px;border:none}.sqs-block-opentable .OT_searchTimeField,.sqs-block-opentable .OT_searchDateField,.sqs-block-opentable .OT_searchPartyField{font-family:inherit;background:#fff url('/universal/images-v6/icons/opentable-icons.svg') no-repeat;color:#272727;font-weight:normal;margin:0;border:1px solid rgba(0,0,0,.12);width:100%;height:auto;font-size:13px;font-style:normal;padding:.7em 1.1em;border-radius:0px;cursor:pointer;line-height:normal;outline:none;background-position:right -14px top -75px;background-size:43px;-moz-background-clip:padding;-webkit-background-clip:padding;background-clip:padding-box}.sqs-block-opentable #OT_timeList,.sqs-block-opentable #OT_partyList{max-height:195px;overflow:auto;border:1px solid rgba(0,0,0,.12);position:absolute;width:auto;top:100%;left:35px;right:0;display:none;margin-top:-7px;text-align:left;-moz-background-clip:padding;-webkit-background-clip:padding;background-clip:padding-box}.sqs-block-opentable .OT_navList{list-style:none;padding:0;margin:-6px 0 0 0;float:none;position:absolute;background-color:#fff;z-index:200;width:auto;top:100%;left:35px;right:0}.sqs-block-opentable .OT_navListItem{padding:0;margin:0;position:relative;float:none;line-height:1em;width:auto;list-style:none}.sqs-block-opentable #OT_timeList .OT_navListItem,.sqs-block-opentable #OT_partyList .OT_navListItem{width:auto}.sqs-block-opentable #OT_timeList li a.OT_navLink,.sqs-block-opentable #OT_partyList li a.OT_navLink{border:0;width:auto}.sqs-block-opentable a.OT_navLink:link,.sqs-block-opentable a.OT_navLink:visited,.sqs-block-opentable a.OT_navLink:hover,.sqs-block-opentable a.OT_navLink:active{font-family:inherit;color:#272727;text-decoration:none;font-size:13px;line-height:1em;width:auto;display:block;padding:.7em 1.1em;border:none}.sqs-block-opentable a.OT_navLink:hover,.sqs-block-opentable a.OT_navLink.selected,.sqs-block-opentable a.OT_navLink:active{background-color:rgba(0,0,0,.05);color:#272727;opacity:1}.sqs-block-opentable a.OT_navLink.selected,.sqs-block-opentable a.OT_navLink:active{background-color:rgba(0,0,0,.12)}.sqs-block-opentable .OT_submit{margin:24px 0 0 0;padding:0;width:auto;height:auto;list-style:none;display:block}.sqs-block-opentable .OTButton,.sqs-block-opentable #OTButton{width:auto;text-align:center;margin:0;padding:0}.sqs-block-opentable a.OT_Find_a_Table:link,.sqs-block-opentable a.OT_Find_a_Table:visited,.sqs-block-opentable a.OT_Find_a_Table:hover,.sqs-block-opentable a.OT_Find_a_Table:active{background-image:none;background-repeat:repeat;background-position:0 0;background-color:#272727;background-color:rgba(0,0,0,.95);font-family:inherit;font-size:13px;font-weight:normal;text-decoration:none;color:#fff;text-align:center;height:auto;display:inline-block;padding:1.1em 2.3em;line-height:normal;text-shadow:none;opacity:.8;position:relative;width:auto;border:none;text-transform:uppercase;white-space:nowrap;cursor:pointer;outline:none;-webkit-appearance:none;-moz-appearance:none;-webkit-transition:opacity .3s ease-out,background .3s ease-out;-moz-transition:opacity .3s ease-out,background .3s ease-out;-ms-transition:opacity .3s ease-out,background .3s ease-out;-o-transition:opacity .3s ease-out,background .3s ease-out;transition:opacity .3s ease-out,background .3s ease-out}.opentable-style-light .OT_wrapper{color:#fff}.opentable-style-light .OT_title{color:#fff}.opentable-style-light .OT_subtitle{color:#fff}.opentable-style-light a.OT_Find_a_Table:link,.opentable-style-light a.OT_Find_a_Table:visited,.opentable-style-light a.OT_Find_a_Table:hover,.opentable-style-light a.OT_Find_a_Table:active{background-color:#272727;background-color:rgba(0,0,0,.3);background:rgba(0,0,0,.05)}.opentable-style-light a.OT_Find_a_Table:link:hover,.opentable-style-light a.OT_Find_a_Table:visited:hover,.opentable-style-light a.OT_Find_a_Table:hover:hover,.opentable-style-light a.OT_Find_a_Table:active:hover{background-color:#272727;background-color:rgba(0,0,0,.8);background:rgba(0,0,0,.05)}.opentable-style-light .OT_day{background-position:-80px -7px}.opentable-style-light .OT_time{background-position:-80px -55px}.opentable-style-light .OT_party{background-position:-80px -102px}.hide-opentable-icons .OT_day,.hide-opentable-icons .OT_time,.hide-opentable-icons .OT_party{margin:0;padding:6px;background:none}.hide-opentable-icons #OT_timeList,.hide-opentable-icons #OT_partyList,.hide-opentable-icons .OT_navList{left:6px;right:6px}.no-svg .OT_day,.no-svg .OT_time,.no-svg .OT_party,.no-svg .OT_searchTimeField,.no-svg .OT_searchDateField,.no-svg .OT_searchPartyField{background-image:url('/universal/images-v6/icons/opentable-icons.png')}.sqs-svg-icon--list.social-icon-alignment-left{text-align:left}.sqs-svg-icon--list.social-icon-alignment-right{text-align:right}.sqs-svg-icon--list.social-icon-alignment-center{text-align:center}.rss-block .social-rss:before,.rss-block .social-rss-square:before,.rss-block .social-rss-round:before{font-family:'social-icon-font';speak:none;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;position:relative;top:0;margin-right:10px;font-size:.7em}.rss-block .social-rss:before{content:\"\\e630\"}.social-icons-style-regular .sqs-use--icon{fill:#fff}.social-icons-style-regular .sqs-use--background,.social-icons-style-regular .sqs-use--mask{fill:transparent}.social-icons-style-regular.social-icons-color-white .sqs-use--icon{fill:#fff}.social-icons-style-regular.social-icons-color-white .sqs-use--background,.social-icons-style-regular.social-icons-color-white .sqs-use--mask{fill:transparent}.social-icons-style-regular.social-icons-color-black .sqs-use--icon{fill:#222}.social-icons-style-regular.social-icons-color-black .sqs-use--background,.social-icons-style-regular.social-icons-color-black .sqs-use--mask{fill:transparent}.social-icons-style-border .sqs-svg-icon--wrapper{border-color:#fff}.social-icons-style-border .sqs-use--icon{fill:#fff}.social-icons-style-border .sqs-use--background,.social-icons-style-border .sqs-use--mask{fill:transparent}.social-icons-style-border.social-icons-color-white .sqs-svg-icon--wrapper{border-color:#fff}.social-icons-style-border.social-icons-color-white .sqs-use--icon{fill:#fff}.social-icons-style-border.social-icons-color-white .sqs-use--background,.social-icons-style-border.social-icons-color-white .sqs-use--mask{fill:transparent}.social-icons-style-border.social-icons-color-black .sqs-svg-icon--wrapper{border-color:#222}.social-icons-style-border.social-icons-color-black .sqs-use--icon{fill:#222}.social-icons-style-border.social-icons-color-black .sqs-use--background,.social-icons-style-border.social-icons-color-black .sqs-use--mask{fill:transparent}.social-icons-style-knockout .sqs-use--mask{fill:#fff}.social-icons-style-knockout .sqs-use--background,.social-icons-style-knockout .sqs-use--icon{fill:transparent}.social-icons-style-knockout.social-icons-color-white .sqs-use--mask{fill:#fff}.social-icons-style-knockout.social-icons-color-white .sqs-use--background,.social-icons-style-knockout.social-icons-color-white .sqs-use--icon{fill:transparent}.social-icons-style-knockout.social-icons-color-black .sqs-use--mask{fill:#222}.social-icons-style-knockout.social-icons-color-black .sqs-use--background,.social-icons-style-knockout.social-icons-color-black .sqs-use--icon{fill:transparent}.social-icons-style-solid .sqs-use--icon{fill:#222}.social-icons-style-solid .sqs-use--background{fill:#222}.social-icons-style-solid .sqs-use--mask{fill:#fff}.social-icons-style-solid.social-icons-color-white .sqs-use--icon{fill:#222}.social-icons-style-solid.social-icons-color-white .sqs-use--background{fill:#fff}.social-icons-style-solid.social-icons-color-white .sqs-use--mask{fill:#fff}.social-icons-style-solid.social-icons-color-black .sqs-use--icon{fill:#fff}.social-icons-style-solid.social-icons-color-black .sqs-use--background{fill:#222}.social-icons-style-solid.social-icons-color-black .sqs-use--mask{fill:#222}.social-icons-style-border .sqs-svg-icon--wrapper:hover{background-color:#fff}.social-icons-style-border .sqs-svg-icon--wrapper:hover .sqs-use--icon{fill:#222}.social-icons-style-border.social-icons-color-white .sqs-svg-icon--wrapper:hover{background-color:#fff}.social-icons-style-border.social-icons-color-white .sqs-svg-icon--wrapper:hover .sqs-use--icon{fill:#222}.social-icons-style-border.social-icons-color-black .sqs-svg-icon--wrapper:hover{background-color:#222}.social-icons-style-border.social-icons-color-black .sqs-svg-icon--wrapper:hover .sqs-use--icon{fill:#fff}.social-icons-style-regular:hover .sqs-svg-icon--wrapper .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-style-regular:hover .sqs-svg-icon--wrapper:hover .sqs-use--icon{fill:#fff}.social-icons-style-regular.social-icons-color-white:hover .sqs-svg-icon--wrapper .sqs-use--icon{fill:rgba(255,255,255,.4)}.social-icons-style-regular.social-icons-color-white:hover .sqs-svg-icon--wrapper:hover .sqs-use--icon{fill:#fff}.social-icons-style-regular.social-icons-color-black:hover .sqs-svg-icon--wrapper .sqs-use--icon{fill:rgba(34,34,34,.4)}.social-icons-style-regular.social-icons-color-black:hover .sqs-svg-icon--wrapper:hover .sqs-use--icon{fill:#222}.social-icons-style-knockout:hover .sqs-svg-icon--wrapper .sqs-use--mask{fill:rgba(255,255,255,.4)}.social-icons-style-knockout:hover .sqs-svg-icon--wrapper:hover .sqs-use--mask{fill:#fff}.social-icons-style-knockout.social-icons-color-white:hover .sqs-svg-icon--wrapper .sqs-use--mask{fill:rgba(255,255,255,.4)}.social-icons-style-knockout.social-icons-color-white:hover .sqs-svg-icon--wrapper:hover .sqs-use--mask{fill:#fff}.social-icons-style-knockout.social-icons-color-black:hover .sqs-svg-icon--wrapper .sqs-use--mask{fill:rgba(34,34,34,.4)}.social-icons-style-knockout.social-icons-color-black:hover .sqs-svg-icon--wrapper:hover .sqs-use--mask{fill:#222}.social-icons-style-solid:hover .sqs-svg-icon--wrapper .sqs-use--mask{fill:rgba(255,255,255,.4)}.social-icons-style-solid:hover .sqs-svg-icon--wrapper .sqs-use--icon{fill:rgba(34,34,34,.4)}.social-icons-style-solid:hover .sqs-svg-icon--wrapper .sqs-use--background{fill:rgba(34,34,34,0)}.social-icons-style-solid:hover .sqs-svg-icon--wrapper:hover .sqs-use--mask{fill:#fff}.social-icons-style-solid:hover .sqs-svg-icon--wrapper:hover .sqs-use--icon{fill:rgba(34,34,34,0)}.social-icons-style-solid:hover .sqs-svg-icon--wrapper:hover .sqs-use--background{fill:#222}.social-icons-style-solid.social-icons-color-white:hover .sqs-svg-icon--wrapper .sqs-use--mask,.social-icons-style-solid.social-icons-color-black:hover .sqs-svg-icon--wrapper .sqs-use--mask{fill:rgba(255,255,255,.4)}.social-icons-style-solid.social-icons-color-white:hover .sqs-svg-icon--wrapper .sqs-use--icon,.social-icons-style-solid.social-icons-color-black:hover .sqs-svg-icon--wrapper .sqs-use--icon{fill:rgba(34,34,34,.4)}.social-icons-style-solid.social-icons-color-white:hover .sqs-svg-icon--wrapper .sqs-use--background,.social-icons-style-solid.social-icons-color-black:hover .sqs-svg-icon--wrapper .sqs-use--background{fill:rgba(34,34,34,0)}.social-icons-style-solid.social-icons-color-white:hover .sqs-svg-icon--wrapper:hover .sqs-use--mask,.social-icons-style-solid.social-icons-color-black:hover .sqs-svg-icon--wrapper:hover .sqs-use--mask{fill:#222}.social-icons-style-solid.social-icons-color-white:hover .sqs-svg-icon--wrapper:hover .sqs-use--icon,.social-icons-style-solid.social-icons-color-black:hover .sqs-svg-icon--wrapper:hover .sqs-use--icon{fill:rgba(255,255,255,0)}.social-icons-style-solid.social-icons-color-white:hover .sqs-svg-icon--wrapper:hover .sqs-use--background,.social-icons-style-solid.social-icons-color-black:hover .sqs-svg-icon--wrapper:hover .sqs-use--background{fill:#fff}.sqs-block-socialaccountlinks .social-account-svg-list,.sqs-block-socialaccountlinks-v2 .social-account-svg-list{text-align:left}.sqs-block-socialaccountlinks .social-account-svg-list:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list:before,.sqs-block-socialaccountlinks .social-account-svg-list:after,.sqs-block-socialaccountlinks-v2 .social-account-svg-list:after{content:\"\";display:table}.sqs-block-socialaccountlinks .social-account-svg-list:after,.sqs-block-socialaccountlinks-v2 .social-account-svg-list:after{clear:both}.sqs-block-socialaccountlinks .social-account-svg-list a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list a,.sqs-block-socialaccountlinks .social-account-svg-list a:link,.sqs-block-socialaccountlinks-v2 .social-account-svg-list a:link,.sqs-block-socialaccountlinks .social-account-svg-list a:visited,.sqs-block-socialaccountlinks-v2 .social-account-svg-list a:visited{display:inline-block;width:20px;height:20px;font-size:20px;color:#111;text-decoration:none !important;*zoom:1;*display:inline;font-weight:normal}.sqs-block-socialaccountlinks .social-account-svg-list a:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list a:before,.sqs-block-socialaccountlinks .social-account-svg-list a:link:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list a:link:before,.sqs-block-socialaccountlinks .social-account-svg-list a:visited:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list a:visited:before{font-size:20px;line-height:20px}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-alignment-left a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-alignment-left a{margin-right:.75em}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-alignment-right a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-alignment-right a{margin-left:.75em}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-alignment-center a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-alignment-center a{margin:0 .375em}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-alignment-center,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-alignment-center{text-align:center}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-alignment-right,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-alignment-right{text-align:right}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-white a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-white a,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-white a:visited,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-white a:visited{color:#fff}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-bandsintown,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-bandsintown,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-bandsintown,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-bandsintown,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-bandsintown,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-bandsintown{color:#00b4b3}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-behance,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-behance,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-behance,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-behance,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-behance,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-behance{color:#1769ff}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-codepen,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-codepen,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-codepen,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-codepen,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-codepen,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-codepen{color:#222}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-dribbble,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-dribbble,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-dribbble,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-dribbble,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-dribbble,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-dribbble{color:#ea4c89}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-dropbox,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-dropbox,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-dropbox,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-dropbox,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-dropbox,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-dropbox{color:#007ee5}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-email,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-email,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-email,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-email,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-email,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-email{color:#222}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-facebook,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-facebook,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-facebook,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-facebook,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-facebook,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-facebook{color:#3b5998}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-fivehundredpix,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-fivehundredpix,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-fivehundredpix,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-fivehundredpix,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-fivehundredpix,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-fivehundredpix,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-fivehundredpx,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-fivehundredpx,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-fivehundredpx,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-fivehundredpx,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-fivehundredpx,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-fivehundredpx{color:#00aeef}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-flickr,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-flickr,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-flickr,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-flickr,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-flickr,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-flickr{color:#0063dc}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-foursquare,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-foursquare,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-foursquare,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-foursquare,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-foursquare,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-foursquare{color:#f94877}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-github,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-github,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-github,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-github,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-github,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-github{color:#4183c4}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-google,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-google,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-google,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-google,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-google,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-google{color:#dd4b39}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-googleplay,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-googleplay,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-googleplay,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-googleplay,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-googleplay,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-googleplay{color:#5adfcb}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-instagram,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-instagram,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-instagram,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-instagram,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-instagram,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-instagram{color:#3f729b}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-itunes,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-itunes,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-itunes,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-itunes,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-itunes,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-itunes{color:#ff3241}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-linkedin,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-linkedin,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-linkedin,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-linkedin,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-linkedin,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-linkedin{color:#0976b4}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-medium,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-medium,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-medium,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-medium,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-medium,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-medium{color:#222}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-meetup,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-meetup,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-meetup,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-meetup,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-meetup,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-meetup{color:#e0393e}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-pinterest,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-pinterest,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-pinterest,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-pinterest,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-pinterest,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-pinterest{color:#cc2127}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-rdio,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-rdio,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-rdio,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-rdio,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-rdio,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-rdio{color:#006ed2}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-rss,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-rss,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-rss,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-rss,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-rss,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-rss{color:#222}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-smugmug,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-smugmug,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-smugmug,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-smugmug,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-smugmug,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-smugmug{color:#7dbb00}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-soundcloud,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-soundcloud,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-soundcloud,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-soundcloud,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-soundcloud,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-soundcloud{color:#f80}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-spotify,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-spotify,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-spotify,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-spotify,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-spotify,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-spotify{color:#84bd00}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-squarespace,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-squarespace,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-squarespace,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-squarespace,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-squarespace,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-squarespace{color:#222}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-tumblr,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-tumblr,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-tumblr,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-tumblr,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-tumblr,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-tumblr{color:#35465d}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-twitter,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-twitter,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-twitter,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-twitter,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-twitter,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-twitter{color:#55acee}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-vimeo,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-vimeo,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-vimeo,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-vimeo,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-vimeo,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-vimeo{color:#1ab7ea}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-vine,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-vine,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-vine,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-vine,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-vine,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-vine{color:#00b488}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-yelp,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-yelp,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-yelp,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-yelp,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-yelp,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-yelp{color:#c41200}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-youtube,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-youtube,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-youtube,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-youtube,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-youtube,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-youtube{color:#e52d27}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-meetup,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-meetup,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-meetup,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-meetup,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-meetup,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-meetup{color:#e0393e}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-vevo,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-vevo,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-vevo,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-vevo,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-vevo,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-vevo{color:#ff0031}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-twitch,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-twitch,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-twitch,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-twitch,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-twitch,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-twitch{color:#6441a5}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a.social-vsco,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a.social-vsco,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:link.social-vsco,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:link.social-vsco,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-color-standard a:visited.social-vsco,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-color-standard a:visited.social-vsco{color:#a9a849}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large a,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large a:link,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large a:link,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large a:visited,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large a:visited{width:24px;height:24px;font-size:24px}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large a:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large a:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large a:link:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large a:link:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large a:visited:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large a:visited:before{font-size:24px;line-height:24px}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small a,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small a:link,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small a:link,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small a:visited,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small a:visited{width:16px;height:16px;font-size:16px}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small a:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small a:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small a:link:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small a:link:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small a:visited:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small a:visited:before{font-size:16px;line-height:16px}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-round a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-round a,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-square a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-square a,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-round a:link,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-round a:link,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-square a:link,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-square a:link,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-round a:visited,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-round a:visited,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-square a:visited,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-square a:visited{width:30px;height:30px;font-size:30px}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-round a:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-round a:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-square a:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-square a:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-round a:link:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-round a:link:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-square a:link:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-square a:link:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-round a:visited:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-round a:visited:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-square a:visited:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-square a:visited:before{font-size:30px;line-height:30px}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-round.social-icon-alignment-left a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-round.social-icon-alignment-left a,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-square.social-icon-alignment-left a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-square.social-icon-alignment-left a{margin-right:.25em}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-round.social-icon-alignment-right a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-round.social-icon-alignment-right a,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-square.social-icon-alignment-right a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-square.social-icon-alignment-right a{margin-left:.25em}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-round.social-icon-alignment-center a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-round.social-icon-alignment-center a,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-style-square.social-icon-alignment-center a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-style-square.social-icon-alignment-center a{margin:0 .125em}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large.social-icon-style-round a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large.social-icon-style-round a,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large.social-icon-style-square a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large.social-icon-style-square a,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large.social-icon-style-round a:link,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large.social-icon-style-round a:link,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large.social-icon-style-square a:link,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large.social-icon-style-square a:link,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large.social-icon-style-round a:visited,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large.social-icon-style-round a:visited,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large.social-icon-style-square a:visited,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large.social-icon-style-square a:visited{width:36px;height:36px;font-size:36px}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large.social-icon-style-round a:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large.social-icon-style-round a:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large.social-icon-style-square a:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large.social-icon-style-square a:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large.social-icon-style-round a:link:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large.social-icon-style-round a:link:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large.social-icon-style-square a:link:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large.social-icon-style-square a:link:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large.social-icon-style-round a:visited:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large.social-icon-style-round a:visited:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-large.social-icon-style-square a:visited:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-large.social-icon-style-square a:visited:before{font-size:36px;line-height:36px}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small.social-icon-style-round a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small.social-icon-style-round a,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small.social-icon-style-square a,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small.social-icon-style-square a,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small.social-icon-style-round a:link,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small.social-icon-style-round a:link,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small.social-icon-style-square a:link,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small.social-icon-style-square a:link,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small.social-icon-style-round a:visited,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small.social-icon-style-round a:visited,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small.social-icon-style-square a:visited,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small.social-icon-style-square a:visited{width:24px;height:24px;font-size:24px}.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small.social-icon-style-round a:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small.social-icon-style-round a:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small.social-icon-style-square a:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small.social-icon-style-square a:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small.social-icon-style-round a:link:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small.social-icon-style-round a:link:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small.social-icon-style-square a:link:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small.social-icon-style-square a:link:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small.social-icon-style-round a:visited:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small.social-icon-style-round a:visited:before,.sqs-block-socialaccountlinks .social-account-svg-list.social-icon-size-small.social-icon-style-square a:visited:before,.sqs-block-socialaccountlinks-v2 .social-account-svg-list.social-icon-size-small.social-icon-style-square a:visited:before{font-size:24px;line-height:24px}.newsletter-block *{box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box}.newsletter-block .newsletter-form-wrapper{width:100%;padding:34px 17px;background:rgba(0,199,166,0);color:#272727;font-size:15px}.newsletter-block .newsletter-form-wrapper.hidden,.newsletter-block .newsletter-form-wrapper .hidden{display:none}.newsletter-block .newsletter-form{text-align:center}.newsletter-block .newsletter-form-header{width:85%;margin:0 auto}.newsletter-block .newsletter-form-header-title{margin:0 0 17px 0;padding:0;color:#272727;font-size:30px;line-height:1.2em;text-align:center}.newsletter-block .newsletter-form-header-title a{color:#272727 !important;text-decoration:underline}.newsletter-block .newsletter-form-header-description p{margin:17px 0;padding:0;color:#272727;font-size:15px;line-height:1.6em;text-align:center}.newsletter-block .newsletter-form-header-description a{color:#272727 !important;text-decoration:underline}.newsletter-block .newsletter-form-body{padding:0 0 12px 0}.newsletter-block .newsletter-form-fields-wrapper{display:inline-block;width:auto;margin:12px 0 0 0}.newsletter-block .newsletter-form-name-fieldset{display:inline-block;width:auto;margin:0;padding:0;border:none}.newsletter-block .newsletter-form-field-wrapper{display:inline-block;width:auto;padding:6px 3px}.newsletter-block .newsletter-form-field-label{display:none}.newsletter-block .newsletter-form-field-element{width:100%;padding:1em;background:#fff;border:1px solid rgba(0,0,0,.12);font-family:inherit;font-size:15px;line-height:normal;outline:none;-moz-background-clip:padding;-webkit-background-clip:padding;background-clip:padding-box;-webkit-transition:background .3s ease-out,border .3s ease-out;-moz-transition:background .3s ease-out,border .3s ease-out;-ms-transition:background .3s ease-out,border .3s ease-out;-o-transition:background .3s ease-out,border .3s ease-out;transition:background .3s ease-out,border .3s ease-out}.newsletter-block .newsletter-form-field-element:focus{background:#fff;-moz-background-clip:padding;-webkit-background-clip:padding;background-clip:padding-box}.newsletter-block .newsletter-form-field-element::-webkit-input-placeholder{color:rgba(0,0,0,.3)}.newsletter-block .newsletter-form-field-element:-moz-placeholder{color:rgba(0,0,0,.3)}.newsletter-block .newsletter-form-field-element::-moz-placeholder{color:rgba(0,0,0,.3)}.newsletter-block .newsletter-form-field-element:-ms-input-placeholder{color:rgba(0,0,0,.3)}.newsletter-block .field-error{display:none}.newsletter-block .newsletter-form-field-wrapper .field-error{display:block;margin-bottom:12px;padding:6px;background:#fed9db;color:#f23d3d;font-size:12px;line-height:normal}.newsletter-block .newsletter-form-button-wrapper{display:inline-block;width:auto;margin:12px 0 0 0;padding:6px 3px}.newsletter-block .newsletter-form-button{position:relative;width:auto;padding:1em 2.25em;color:#fff;background-color:#23c890;border:1px solid #23c890 !important;font-family:inherit;font-size:15px;line-height:normal;font-weight:normal;text-align:center;text-transform:uppercase;white-space:nowrap;cursor:pointer;outline:none;-webkit-appearance:none;-moz-appearance:none}.newsletter-block .newsletter-form-spinner.sqs-spin.light.large{visibility:hidden;position:absolute;top:50%;left:50%;height:22px;width:22px;margin-top:-11px;margin-left:-11px}.newsletter-block .newsletter-form:not(.submitting) .newsletter-form-spinner.sqs-spin.light.large{-webkit-animation:none;-moz-animation:none;-ms-animation:none;-o-animation:none;animation:none}.newsletter-block .newsletter-form.submitting .newsletter-form-spinner.sqs-spin.light.large{visibility:visible}.newsletter-block .newsletter-form.submitting .newsletter-form-button-label{visibility:hidden}.newsletter-block .newsletter-form-footnote p{opacity:.8;margin:17px 0;padding:0;color:#272727;font-size:12px !important;line-height:normal}.newsletter-block .newsletter-form-footnote p:last-child{margin-bottom:0}.newsletter-block .newsletter-form-footnote a{color:#272727 !important;text-decoration:underline}.newsletter-block .form-submission-text p{margin:17px 0;padding:0;color:#272727;font-size:15px;line-height:1.6em}.newsletter-block .form-submission-text p:first-child{margin-top:0}.newsletter-block .form-submission-text p:last-child{margin-bottom:0}.newsletter-block .form-submission-text a{color:#272727 !important;text-decoration:underline}.newsletter-style-light .newsletter-block .newsletter-form-wrapper,.newsletter-style-light .newsletter-block .newsletter-form-header-title,.newsletter-style-light .newsletter-block .newsletter-form-header-description p,.newsletter-style-light .newsletter-block .newsletter-form-footnote p,.newsletter-style-light .newsletter-block .form-submission-text p{color:#fff}.newsletter-style-light .newsletter-block .newsletter-form-header-title a,.newsletter-style-light .newsletter-block .newsletter-form-header-description a,.newsletter-style-light .newsletter-block .newsletter-form-footnote a,.newsletter-style-light .newsletter-block .form-submission-text a{color:#fff !important}.newsletter-form-small-mode .newsletter-form-wrapper{padding:22px 17px}.newsletter-form-small-mode .newsletter-form-header{width:100%}.newsletter-form-small-mode .newsletter-form-header-title{font-size:22.5px !important;margin:0 0 14px 0}.newsletter-form-small-mode .newsletter-form-header-description p{margin:0 0 14px 0;line-height:normal}.newsletter-form-small-mode .newsletter-form-body{padding:0 0 6px 0}.newsletter-form-small-mode .newsletter-form-fields-wrapper{display:block}.newsletter-form-small-mode .newsletter-form-name-fieldset{width:100%}.newsletter-form-small-mode .newsletter-form-field-wrapper,.newsletter-form-small-mode .newsletter-form-button-wrapper{display:block;width:100%;min-width:0;padding:5px 0}.newsletter-form-small-mode .newsletter-form-button-wrapper{margin:6px 0 0 0}.newsletter-form-small-mode .newsletter-form-footnote p{margin:14px 0}.newsletter-form-small-mode .newsletter-form-footnote p:last-child{margin-bottom:0}.newsletter-form-small-mode .form-submission-text p{margin:14px 0;line-height:normal}.newsletter-form-small-mode .form-submission-text p:first-child{margin-top:0}.newsletter-form-small-mode .form-submission-text p:last-child{margin-bottom:0}@media screen and (max-width:320px){.newsletter-block .newsletter-form-wrapper{padding:22px 17px}.newsletter-block .newsletter-form-header{width:100%}.newsletter-block .newsletter-form-header-title{font-size:22.5px !important;margin:0 0 14px 0}.newsletter-block .newsletter-form-header-description p{margin:0 0 14px 0;line-height:normal}.newsletter-block .newsletter-form-body{padding:0 0 6px 0}.newsletter-block .newsletter-form-fields-wrapper{display:block}.newsletter-block .newsletter-form-name-fieldset{width:100%}.newsletter-block .newsletter-form-field-wrapper,.newsletter-block .newsletter-form-button-wrapper{display:block;width:100%;min-width:0;padding:5px 0}.newsletter-block .newsletter-form-button-wrapper{margin:6px 0 0 0}.newsletter-block .newsletter-form-footnote p{margin:14px 0}.newsletter-block .newsletter-form-footnote p:last-child{margin-bottom:0}.newsletter-block .form-submission-text p{margin:14px 0;line-height:normal}.newsletter-block .form-submission-text p:first-child{margin-top:0}.newsletter-block .form-submission-text p:last-child{margin-bottom:0}}.newsletter-block.newsletter-form-has-small-container .newsletter-form-wrapper{padding:22px 17px}.newsletter-block.newsletter-form-has-small-container .newsletter-form-header{width:100%}.newsletter-block.newsletter-form-has-small-container .newsletter-form-header-title{font-size:22.5px !important;margin:0 0 14px 0}.newsletter-block.newsletter-form-has-small-container .newsletter-form-header-description p{margin:0 0 14px 0;line-height:normal}.newsletter-block.newsletter-form-has-small-container .newsletter-form-body{padding:0 0 6px 0}.newsletter-block.newsletter-form-has-small-container .newsletter-form-fields-wrapper{display:block}.newsletter-block.newsletter-form-has-small-container .newsletter-form-name-fieldset{width:100%}.newsletter-block.newsletter-form-has-small-container .newsletter-form-field-wrapper,.newsletter-block.newsletter-form-has-small-container .newsletter-form-button-wrapper{display:block;width:100%;min-width:0;padding:5px 0}.newsletter-block.newsletter-form-has-small-container .newsletter-form-button-wrapper{margin:6px 0 0 0}.newsletter-block.newsletter-form-has-small-container .newsletter-form-footnote p{margin:14px 0}.newsletter-block.newsletter-form-has-small-container .newsletter-form-footnote p:last-child{margin-bottom:0}.newsletter-block.newsletter-form-has-small-container .form-submission-text p{margin:14px 0;line-height:normal}.newsletter-block.newsletter-form-has-small-container .form-submission-text p:first-child{margin-top:0}.newsletter-block.newsletter-form-has-small-container .form-submission-text p:last-child{margin-bottom:0}.newsletter-block.newsletter-form-has-regular-container .newsletter-form-field-wrapper{min-width:250px}.small-button-block-font{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:600;font-style:normal;text-transform:uppercase;letter-spacing:1px}.medium-button-block-font{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:600;font-style:normal;text-transform:uppercase;letter-spacing:1px}.large-button-block-font{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:600;font-style:normal;text-transform:uppercase;letter-spacing:1px}.sqs-block-button .sqs-block-button-container--left{text-align:left}.sqs-block-button .sqs-block-button-container--center{text-align:center}.sqs-block-button .sqs-block-button-container--right{text-align:right}.sqs-block-button .sqs-block-button-element{display:inline-block;width:auto;height:auto;padding:1em 2.5em;color:#fff;background-color:#272727;border-width:0;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:12px;line-height:1em;font-weight:normal;font-style:normal;text-transform:uppercase;letter-spacing:0px;text-align:center;text-decoration:none;cursor:pointer;outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;line-height:normal}.sqs-block-button .sqs-block-button-element:hover{opacity:1}.sqs-block-button .sqs-block-button-element--small{padding:13px 26px;color:#23c890;background-color:#29292d;border-color:#29292d;font-size:12px;font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-family:\"proxima-nova\";text-transform:uppercase;letter-spacing:1px;font-weight:600;font-style:normal}.sqs-block-button .sqs-block-button-element--medium{padding:21px 34px;color:#fff;background-color:#23c890;border-color:#23c890;font-size:15px;font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;text-transform:uppercase;letter-spacing:1px;font-weight:600;font-style:normal}.sqs-block-button .sqs-block-button-element--large{padding:25px 46px;color:#fff;background-color:#23c890;border-color:#23c890;font-size:20px;font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-family:\"proxima-nova\";text-transform:uppercase;letter-spacing:1px;font-weight:600;font-style:normal}.small-button-style-solid .sqs-block-button .sqs-block-button-element--small,.medium-button-style-solid .sqs-block-button .sqs-block-button-element--medium,.large-button-style-solid .sqs-block-button .sqs-block-button-element--large{-webkit-transition:.1s opacity linear;-moz-transition:.1s opacity linear;-o-transition:.1s opacity linear;transition:.1s opacity linear;-webkit-backface-visibility:hidden}.small-button-style-solid .sqs-block-button .sqs-block-button-element--small:hover,.medium-button-style-solid .sqs-block-button .sqs-block-button-element--medium:hover,.large-button-style-solid .sqs-block-button .sqs-block-button-element--large:hover{opacity:.8}.small-button-style-outline .sqs-block-button .sqs-block-button-element--small,.medium-button-style-outline .sqs-block-button .sqs-block-button-element--medium,.large-button-style-outline .sqs-block-button .sqs-block-button-element--large{border-width:2px;border-style:solid;background-color:transparent;-webkit-transition:0.1s background-color linear, 0.1s color linear;-moz-transition:0.1s background-color linear, 0.1s color linear;-o-transition:0.1s background-color linear, 0.1s color linear;transition:0.1s background-color linear, 0.1s color linear}.small-button-style-outline .sqs-block-button .sqs-block-button-element--small:hover,.medium-button-style-outline .sqs-block-button .sqs-block-button-element--medium:hover,.large-button-style-outline .sqs-block-button .sqs-block-button-element--large:hover{color:#fff}.small-button-style-outline .sqs-block-button .sqs-block-button-element--small{color:#29292d}.small-button-style-outline .sqs-block-button .sqs-block-button-element--small:hover{background-color:#29292d;color:#fff}.medium-button-style-outline .sqs-block-button .sqs-block-button-element--medium{color:#23c890}.medium-button-style-outline .sqs-block-button .sqs-block-button-element--medium:hover{background-color:#23c890;color:#1d1d1d;color:#fff}.large-button-style-outline .sqs-block-button .sqs-block-button-element--large{color:#23c890}.large-button-style-outline .sqs-block-button .sqs-block-button-element--large:hover{background-color:#23c890;color:#1d1d1d;color:#fff}.small-button-style-raised .sqs-block-button .sqs-block-button-element--small,.medium-button-style-raised .sqs-block-button .sqs-block-button-element--medium,.large-button-style-raised .sqs-block-button .sqs-block-button-element--large{position:relative;-webkit-transition:.1s background-color linear;-moz-transition:.1s background-color linear;-o-transition:.1s background-color linear;transition:.1s background-color linear}.small-button-style-raised .sqs-block-button .sqs-block-button-element--small:active,.medium-button-style-raised .sqs-block-button .sqs-block-button-element--medium:active,.large-button-style-raised .sqs-block-button .sqs-block-button-element--large:active{top:1px}.small-button-style-raised .sqs-block-button .sqs-block-button-element--small{-webkit-box-shadow:0 2px 0 0 #161618;-moz-box-shadow:0 2px 0 0 #161618;box-shadow:0 2px 0 0 #161618}.small-button-style-raised .sqs-block-button .sqs-block-button-element--small:hover{background-color:#303035}.small-button-style-raised .sqs-block-button .sqs-block-button-element--small:active{-webkit-box-shadow:0 1px 0 0 #161618;-moz-box-shadow:0 1px 0 0 #161618;box-shadow:0 1px 0 0 #161618}.medium-button-style-raised .sqs-block-button .sqs-block-button-element--medium{-webkit-box-shadow:0 2px 0 0 #1da577;-moz-box-shadow:0 2px 0 0 #1da577;box-shadow:0 2px 0 0 #1da577}.medium-button-style-raised .sqs-block-button .sqs-block-button-element--medium:hover{background-color:#25d599}.medium-button-style-raised .sqs-block-button .sqs-block-button-element--medium:active{-webkit-box-shadow:0 1px 0 0 #1da577;-moz-box-shadow:0 1px 0 0 #1da577;box-shadow:0 1px 0 0 #1da577}.large-button-style-raised .sqs-block-button .sqs-block-button-element--large{-webkit-box-shadow:0 3px 0 0 #1da577;-moz-box-shadow:0 3px 0 0 #1da577;box-shadow:0 3px 0 0 #1da577}.large-button-style-raised .sqs-block-button .sqs-block-button-element--large:hover{background-color:#25d599}.large-button-style-raised .sqs-block-button .sqs-block-button-element--large:active{top:2px;-webkit-box-shadow:0 1px 0 0 #1da577;-moz-box-shadow:0 1px 0 0 #1da577;box-shadow:0 1px 0 0 #1da577}.small-button-shape-rounded .sqs-block-button .sqs-block-button-element--small,.medium-button-shape-rounded .sqs-block-button .sqs-block-button-element--medium,.large-button-shape-rounded .sqs-block-button .sqs-block-button-element--large{border-radius:3px}.small-button-shape-pill .sqs-block-button .sqs-block-button-element--small,.medium-button-shape-pill .sqs-block-button .sqs-block-button-element--medium,.large-button-shape-pill .sqs-block-button .sqs-block-button-element--large{border-radius:300px}@media screen and (max-width:640px){.sqs-block-button .sqs-block-button-element--large{padding:21px 34px;font-size:15px}}.sqs-block-summary-v2 *{box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box}.sqs-block-summary-v2 .summary-heading{display:none;margin:0 0 15px 0;padding-right:10px;font-size:14px;line-height:normal;text-transform:uppercase}.sqs-block-summary-v2 .summary-carousel-pager{display:none}.sqs-block-summary-v2 .summary-item-list{list-style-type:none;margin:0;padding:0}.sqs-block-summary-v2 .summary-item{visibility:hidden;overflow:hidden}.sqs-block-summary-v2 .summary-item.positioned{visibility:visible}.sqs-block-summary-v2 .summary-thumbnail-container{display:block}.sqs-block-summary-v2 .summary-thumbnail-container:hover{opacity:1 !important}.sqs-block-summary-v2 .img-wrapper,.sqs-block-summary-v2 .sqs-video-wrapper{position:relative;width:100%;height:auto}.sqs-block-summary-v2 .img-wrapper img,.sqs-block-summary-v2 .sqs-video-wrapper img{opacity:0;display:block;width:100%;height:auto;font-size:13px;line-height:normal;-webkit-transition:.6s opacity;-moz-transition:.6s opacity;-ms-transition:.6s opacity;-o-transition:.6s opacity;transition:.6s opacity}.sqs-block-summary-v2 .img-wrapper img.loaded,.sqs-block-summary-v2 .sqs-video-wrapper img.loaded{opacity:1}.sqs-block-summary-v2 .summary-product-status .product-mark{position:absolute;top:15px;right:0;padding:6px 8px;background:#222;color:#fff;font-size:14px;line-height:14px;text-transform:uppercase;-webkit-font-smoothing:antialiased;box-sizing:content-box;-webkit-box-sizing:content-box;-moz-box-sizing:content-box}.sqs-block-summary-v2 .summary-product-quick-view{opacity:0;position:absolute;bottom:20px;left:0;width:100%;font-size:14px;text-align:center;-webkit-transition:.6s opacity;-moz-transition:.6s opacity;-ms-transition:.6s opacity;-o-transition:.6s opacity;transition:.6s opacity}.sqs-block-summary-v2 .summary-item:hover .summary-product-quick-view{opacity:1}.sqs-block-summary-v2 .summary-thumbnail-event-date{display:none;position:absolute;top:10px;right:10px;height:50px;width:50px;padding:3px;background:#fff;text-align:center;box-sizing:content-box;-webkit-box-sizing:content-box;-moz-box-sizing:content-box}.sqs-block-summary-v2 .summary-thumbnail-event-date-inner{display:table-cell;vertical-align:middle}.sqs-block-summary-v2 .summary-thumbnail-event-date-month{display:block;color:#333;font-size:14px;line-height:14px;text-transform:uppercase}.sqs-block-summary-v2 .summary-thumbnail-event-date-day{display:block;color:#333;font-size:26px;line-height:26px}.sqs-block-summary-v2 .summary-content{text-align:left}.sqs-block-summary-v2 .summary-title{margin:0 0 10px 0;font-size:20px;line-height:1.2em;text-align:left}.sqs-block-summary-v2 .summary-price{margin:0 0 10px 0}.sqs-block-summary-v2 .summary-price .product-price{font-size:14px;line-height:20px;text-align:left}.sqs-block-summary-v2 .summary-price .product-price .original-price{opacity:.7;filter:alpha(opacity=70);text-decoration:line-through}.sqs-block-summary-v2 .summary-excerpt{margin:0 0 10px 0}.sqs-block-summary-v2 .summary-excerpt p,.sqs-block-summary-v2 .summary-excerpt ul,.sqs-block-summary-v2 .summary-excerpt li{font-size:14px;line-height:1.4em;margin:0 0 10px 0;text-align:left}.sqs-block-summary-v2 .summary-excerpt p:first-of-type,.sqs-block-summary-v2 .summary-excerpt ul:first-of-type,.sqs-block-summary-v2 .summary-excerpt li:first-of-type{margin-top:0 !important}.sqs-block-summary-v2 .summary-excerpt p:last-of-type,.sqs-block-summary-v2 .summary-excerpt ul:last-of-type,.sqs-block-summary-v2 .summary-excerpt li:last-of-type{margin-bottom:0 !important}.sqs-block-summary-v2 .summary-read-more-link{display:none;margin:0 0 10px 0;font-size:14px;line-height:20px;text-align:left}.sqs-block-summary-v2 .summary-read-more-link:after{content:'Read More \\2192'}.sqs-block-summary-v2 .summary-metadata-container{display:none;font-size:13px;line-height:normal}.sqs-block-summary-v2 .summary-block-setting-metadata-position-above-title .summary-metadata-container--above-title,.sqs-block-summary-v2 .summary-block-setting-metadata-position-below-title .summary-metadata-container--below-title,.sqs-block-summary-v2 .summary-block-setting-metadata-position-below-content .summary-metadata-container--below-content{display:block}.sqs-block-summary-v2 .summary-block-setting-metadata-position-above-title.summary-block-setting-primary-metadata-date .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-below-title.summary-block-setting-primary-metadata-date .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-above-title.summary-block-setting-secondary-metadata-date .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-below-title.summary-block-setting-secondary-metadata-date .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-above-title.summary-block-setting-primary-metadata-event-time .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-below-title.summary-block-setting-primary-metadata-event-time .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-above-title.summary-block-setting-secondary-metadata-event-time .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-below-title.summary-block-setting-secondary-metadata-event-time .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-above-title.summary-block-setting-primary-metadata-cats .summary-item-has-cats .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-below-title.summary-block-setting-primary-metadata-cats .summary-item-has-cats .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-above-title.summary-block-setting-secondary-metadata-cats .summary-item-has-cats .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-below-title.summary-block-setting-secondary-metadata-cats .summary-item-has-cats .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-above-title.summary-block-setting-primary-metadata-tags .summary-item-has-tags .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-below-title.summary-block-setting-primary-metadata-tags .summary-item-has-tags .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-above-title.summary-block-setting-secondary-metadata-tags .summary-item-has-tags .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-below-title.summary-block-setting-secondary-metadata-tags .summary-item-has-tags .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-above-title.summary-block-setting-primary-metadata-author .summary-item-has-author .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-below-title.summary-block-setting-primary-metadata-author .summary-item-has-author .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-above-title.summary-block-setting-secondary-metadata-author .summary-item-has-author .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-below-title.summary-block-setting-secondary-metadata-author .summary-item-has-author .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-above-title.summary-block-setting-primary-metadata-comments .summary-item-has-comments-enabled .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-below-title.summary-block-setting-primary-metadata-comments .summary-item-has-comments-enabled .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-above-title.summary-block-setting-secondary-metadata-comments .summary-item-has-comments-enabled .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-below-title.summary-block-setting-secondary-metadata-comments .summary-item-has-comments-enabled .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-above-title.summary-block-setting-primary-metadata-location .summary-item-has-location .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-below-title.summary-block-setting-primary-metadata-location .summary-item-has-location .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-above-title.summary-block-setting-secondary-metadata-location .summary-item-has-location .summary-metadata-container,.sqs-block-summary-v2 .summary-block-setting-metadata-position-below-title.summary-block-setting-secondary-metadata-location .summary-item-has-location .summary-metadata-container{margin:0 0 10px 0}.sqs-block-summary-v2 .summary-metadata{display:none}.sqs-block-summary-v2 .summary-block-setting-primary-metadata-date .summary-metadata--primary,.sqs-block-summary-v2 .summary-block-setting-primary-metadata-event-time .summary-metadata--primary,.sqs-block-summary-v2 .summary-block-setting-primary-metadata-cats .summary-item-has-cats .summary-metadata--primary,.sqs-block-summary-v2 .summary-block-setting-primary-metadata-tags .summary-item-has-tags .summary-metadata--primary,.sqs-block-summary-v2 .summary-block-setting-primary-metadata-author .summary-item-has-author .summary-metadata--primary,.sqs-block-summary-v2 .summary-block-setting-primary-metadata-comments .summary-item-has-comments-enabled .summary-metadata--primary,.sqs-block-summary-v2 .summary-block-setting-primary-metadata-location .summary-item-has-location .summary-metadata--primary{display:inline-block}.sqs-block-summary-v2 .summary-block-setting-secondary-metadata-date .summary-metadata--secondary,.sqs-block-summary-v2 .summary-block-setting-secondary-metadata-event-time .summary-metadata--secondary,.sqs-block-summary-v2 .summary-block-setting-secondary-metadata-cats .summary-item-has-cats .summary-metadata--secondary,.sqs-block-summary-v2 .summary-block-setting-secondary-metadata-tags .summary-item-has-tags .summary-metadata--secondary,.sqs-block-summary-v2 .summary-block-setting-secondary-metadata-author .summary-item-has-author .summary-metadata--secondary,.sqs-block-summary-v2 .summary-block-setting-secondary-metadata-comments .summary-item-has-comments-enabled .summary-metadata--secondary,.sqs-block-summary-v2 .summary-block-setting-secondary-metadata-location .summary-item-has-location .summary-metadata--secondary{display:inline-block}.sqs-block-summary-v2 .summary-metadata-item{display:none;opacity:.7;margin:0;font-size:13px;line-height:1.4em;text-transform:none}.sqs-block-summary-v2 .summary-metadata-item a,.sqs-block-summary-v2 .summary-metadata-item a:hover{opacity:1;text-decoration:none}.sqs-block-summary-v2 .summary-block-setting-primary-metadata-date .summary-metadata--primary .summary-metadata-item--date,.sqs-block-summary-v2 .summary-block-setting-primary-metadata-event-time .summary-metadata--primary .summary-metadata-item--event-time,.sqs-block-summary-v2 .summary-block-setting-primary-metadata-cats .summary-item-has-cats .summary-metadata--primary .summary-metadata-item--cats,.sqs-block-summary-v2 .summary-block-setting-primary-metadata-tags .summary-item-has-tags .summary-metadata--primary .summary-metadata-item--tags,.sqs-block-summary-v2 .summary-block-setting-primary-metadata-author .summary-item-has-author .summary-metadata--primary .summary-metadata-item--author,.sqs-block-summary-v2 .summary-block-setting-primary-metadata-comments .summary-item-has-comments-enabled .summary-metadata--primary .summary-metadata-item--comments,.sqs-block-summary-v2 .summary-block-setting-primary-metadata-location .summary-item-has-location .summary-metadata--primary .summary-metadata-item--location{display:inline-block}.sqs-block-summary-v2 .summary-block-setting-secondary-metadata-date .summary-metadata--secondary .summary-metadata-item--date,.sqs-block-summary-v2 .summary-block-setting-secondary-metadata-event-time .summary-metadata--secondary .summary-metadata-item--event-time,.sqs-block-summary-v2 .summary-block-setting-secondary-metadata-cats .summary-item-has-cats .summary-metadata--secondary .summary-metadata-item--cats,.sqs-block-summary-v2 .summary-block-setting-secondary-metadata-tags .summary-item-has-tags .summary-metadata--secondary .summary-metadata-item--tags,.sqs-block-summary-v2 .summary-block-setting-secondary-metadata-author .summary-item-has-author .summary-metadata--secondary .summary-metadata-item--author,.sqs-block-summary-v2 .summary-block-setting-secondary-metadata-comments .summary-item-has-comments-enabled .summary-metadata--secondary .summary-metadata-item--comments,.sqs-block-summary-v2 .summary-block-setting-secondary-metadata-location .summary-item-has-location .summary-metadata--secondary .summary-metadata-item--location{display:inline-block}.sqs-block-summary-v2 .summary-block-setting-secondary-metadata-date .summary-metadata--primary .summary-metadata-item:after,.sqs-block-summary-v2 .summary-block-setting-secondary-metadata-event-time .summary-metadata--primary .summary-metadata-item:after,.sqs-block-summary-v2 .summary-block-setting-secondary-metadata-cats .summary-item-has-cats .summary-metadata--primary .summary-metadata-item:after,.sqs-block-summary-v2 .summary-block-setting-secondary-metadata-tags .summary-item-has-tags .summary-metadata--primary .summary-metadata-item:after,.sqs-block-summary-v2 .summary-block-setting-secondary-metadata-author .summary-item-has-author .summary-metadata--primary .summary-metadata-item:after,.sqs-block-summary-v2 .summary-block-setting-secondary-metadata-comments .summary-item-has-comments-enabled .summary-metadata--primary .summary-metadata-item:after,.sqs-block-summary-v2 .summary-block-setting-secondary-metadata-location .summary-item-has-location .summary-metadata--primary .summary-metadata-item:after{content:\" ·\";margin:0 .3em}.sqs-block-summary-v2 .summary-block-setting-text-size-extralarge .summary-title{font-size:54px}.sqs-block-summary-v2 .summary-block-setting-text-size-extralarge .summary-excerpt p{font-size:16px}.sqs-block-summary-v2 .summary-block-setting-text-size-large .summary-title{font-size:30px}.sqs-block-summary-v2 .summary-block-setting-text-size-medium .summary-title{font-size:20px}.sqs-block-summary-v2 .summary-block-setting-text-size-small .summary-title{font-size:14px}.sqs-block-summary-v2 .summary-block-setting-text-align-center .summary-title,.sqs-block-summary-v2 .summary-block-setting-text-align-center .summary-price .product-price,.sqs-block-summary-v2 .summary-block-setting-text-align-center .summary-excerpt p,.sqs-block-summary-v2 .summary-block-setting-text-align-center .summary-read-more-link,.sqs-block-summary-v2 .summary-block-setting-text-align-center .summary-content{text-align:center}.sqs-block-summary-v2 .summary-block-setting-text-align-right .summary-title,.sqs-block-summary-v2 .summary-block-setting-text-align-right .summary-price .product-price,.sqs-block-summary-v2 .summary-block-setting-text-align-right .summary-excerpt p,.sqs-block-summary-v2 .summary-block-setting-text-align-right .summary-read-more-link,.sqs-block-summary-v2 .summary-block-setting-text-align-right .summary-content{text-align:right}.sqs-block-summary-v2 .summary-item-record-type-text .summary-read-more-link{display:block}.sqs-block-summary-v2 .summary-item-record-type-event .summary-thumbnail-event-date{display:table}.sqs-block-summary-v2 .summary-thumbnail-container{margin:0}.sqs-block-summary-v2 .summary-block-setting-show-title .summary-thumbnail-container,.sqs-block-summary-v2 .summary-block-setting-show-price .summary-item-record-type-store-item .summary-thumbnail-container,.sqs-block-summary-v2 .summary-block-setting-show-excerpt .summary-thumbnail-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-primary-metadata-none) .summary-thumbnail-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-secondary-metadata-none) .summary-thumbnail-container{margin:0 0 15px 0}.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt) .summary-title,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt) .summary-price{margin:0 0 2px 0}.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-above-title.summary-block-setting-primary-metadata-date .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-below-title.summary-block-setting-primary-metadata-date .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-above-title.summary-block-setting-secondary-metadata-date .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-below-title.summary-block-setting-secondary-metadata-date .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-above-title.summary-block-setting-primary-metadata-event-time .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-below-title.summary-block-setting-primary-metadata-event-time .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-above-title.summary-block-setting-secondary-metadata-event-time .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-below-title.summary-block-setting-secondary-metadata-event-time .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-above-title.summary-block-setting-primary-metadata-cats .summary-item-has-cats .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-below-title.summary-block-setting-primary-metadata-cats .summary-item-has-cats .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-above-title.summary-block-setting-secondary-metadata-cats .summary-item-has-cats .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-below-title.summary-block-setting-secondary-metadata-cats .summary-item-has-cats .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-above-title.summary-block-setting-primary-metadata-tags .summary-item-has-tags .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-below-title.summary-block-setting-primary-metadata-tags .summary-item-has-tags .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-above-title.summary-block-setting-secondary-metadata-tags .summary-item-has-tags .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-below-title.summary-block-setting-secondary-metadata-tags .summary-item-has-tags .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-above-title.summary-block-setting-primary-metadata-author .summary-item-has-author .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-below-title.summary-block-setting-primary-metadata-author .summary-item-has-author .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-above-title.summary-block-setting-secondary-metadata-author .summary-item-has-author .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-below-title.summary-block-setting-secondary-metadata-author .summary-item-has-author .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-above-title.summary-block-setting-primary-metadata-comments .summary-item-has-comments-enabled .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-below-title.summary-block-setting-primary-metadata-comments .summary-item-has-comments-enabled .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-above-title.summary-block-setting-secondary-metadata-comments .summary-item-has-comments-enabled .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-below-title.summary-block-setting-secondary-metadata-comments .summary-item-has-comments-enabled .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-above-title.summary-block-setting-primary-metadata-location .summary-item-has-location .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-below-title.summary-block-setting-primary-metadata-location .summary-item-has-location .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-above-title.summary-block-setting-secondary-metadata-location .summary-item-has-location .summary-metadata-container,.sqs-block-summary-v2 .summary-block-wrapper:not(.summary-block-setting-show-excerpt).summary-block-setting-metadata-position-below-title.summary-block-setting-secondary-metadata-location .summary-item-has-location .summary-metadata-container{margin:0 0 2px 0}.sqs-block-summary-v2 .summary-block-setting-design-list .summary-item{visibility:visible !important;margin-bottom:17px !important;padding-bottom:17px !important}.sqs-block-summary-v2 .summary-block-setting-design-list .summary-item.summary-item-show-thumbnail{margin-bottom:17px !important;padding-bottom:17px !important}.sqs-block-summary-v2 .summary-block-setting-design-list .summary-thumbnail-container{margin:0 !important}.sqs-block-summary-v2 .summary-block-setting-design-list.summary-block-setting-design-list-thumbnail-right .summary-thumbnail-container{float:right;padding:0 0 0 20px}.sqs-block-summary-v2 .summary-block-setting-design-list.summary-block-setting-design-list-thumbnail-right .summary-item-record-type-store-item .product-mark{right:0;left:auto}.sqs-block-summary-v2 .summary-block-setting-design-list .summary-item-record-type-store-item .product-mark{left:0;right:auto}.sqs-block-summary-v2 .summary-block-setting-design-list .summary-item-record-type-event .summary-thumbnail-event-date{display:none}.sqs-block-summary-v2 .summary-block-setting-design-carousel .summary-carousel-pager{display:block}.sqs-block-summary-v2 .summary-block-setting-design-carousel .summary-block-header{overflow:hidden}.sqs-block-summary-v2 .summary-block-setting-design-carousel .summary-heading{display:block;float:left;width:calc(100% -  50px);width:-webkit-calc(100% -  50px);width:-moz-calc(100% -  50px)}.sqs-block-summary-v2 .summary-block-setting-design-carousel .summary-collection-title{display:none}.sqs-block-summary-v2 .summary-block-setting-design-carousel .summary-carousel-pager{float:right;width:50px}@media only screen and (max-width:700px){.sqs-block-summary-v2 .summary-product-quick-view{display:none}}.sqs-block-archive .archive-group-list,.sqs-block-archive .archive-item-list{list-style-type:none;margin:0;padding:0}.sqs-block-archive .archive-group-count::before{content:\"(\"}.sqs-block-archive .archive-group-count::after{content:\")\"}.sqs-block-archive .archive-block-setting-layout-list.archive-block-setting-multicolumns .archive-group-list{columns:140px;column-gap:60px;-moz-columns:140px;-moz-column-gap:60px;-webkit-columns:140px;-webkit-column-gap:60px}.sqs-block-archive .archive-block-setting-layout-index .archive-group-name-link{font-size:1.4em;line-height:1.4em;text-decoration:none}.sqs-block-archive .archive-block-setting-layout-index .archive-item-list{display:block;margin:1.4em 0 2.8em 0;font-size:1em;line-height:1.4em}.sqs-block-archive .archive-block-setting-layout-index .archive-item{margin:0 0 .7em 0}.sqs-block-archive .archive-block-setting-layout-index .archive-item.archive-item--show-date{margin:0 0 1.4em 0}.sqs-block-archive .archive-block-setting-layout-index .archive-item-date-before{display:none;opacity:.7;margin-right:5px}.sqs-block-archive .archive-block-setting-layout-index .archive-item-link{display:block;margin-right:5px;color:inherit !important}.sqs-block-archive .archive-block-setting-layout-index .archive-item-link--untitled::before{content:\"Untitled\"}.sqs-block-archive .archive-block-setting-layout-index .archive-item-date-after{display:block;opacity:.7}.sqs-block-archive .archive-block-setting-layout-index.archive-block-setting-multicolumns .archive-group-list{columns:225px;column-gap:60px;-moz-columns:225px;-moz-column-gap:60px;-webkit-columns:225px;-webkit-column-gap:60px}.sqs-block-archive .archive-block-setting-layout-index.archive-block-setting-multicolumns .archive-group{display:inline-block;column-break-inside:avoid;-moz-column-break-inside:avoid;-webkit-column-break-inside:avoid}.sqs-block-archive .archive-block-setting-layout-index.archive-block-setting-multicolumns .archive-group-name-link,.sqs-block-archive .archive-block-setting-layout-index.archive-block-setting-multicolumns .archive-item-list{display:inline-block;min-width:225px}.sqs-block-archive .archive-block-setting-layout-dropdown.archive-block-wrapper{max-width:300px;background:rgba(0,0,0,.025);border-radius:1px}.sqs-block-archive .archive-block-setting-layout-dropdown .archive-dropdown-toggle-checkbox{position:absolute;left:-9999px}.sqs-block-archive .archive-block-setting-layout-dropdown .archive-dropdown-toggle-checkbox:checked~.archive-group-list{display:block}.sqs-block-archive .archive-block-setting-layout-dropdown .archive-dropdown-toggle-checkbox:checked~.archive-dropdown-toggle-label .archive-dropdown-toggle-icon:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e006\";text-align:center;display:inline-block;vertical-align:middle}.sqs-block-archive .archive-block-setting-layout-dropdown .archive-dropdown-toggle-checkbox:checked~.archive-dropdown-toggle-label .archive-dropdown-toggle-icon:before{font-size:16px;width:16px;height:16px;line-height:16px}.sqs-block-archive .archive-block-setting-layout-dropdown .archive-dropdown-toggle-checkbox:checked~.archive-dropdown-toggle-label .archive-dropdown-toggle-icon:before{font-size:1em;width:1em;height:1em;line-height:1em}.sqs-block-archive .archive-block-setting-layout-dropdown .archive-dropdown-toggle-label{display:block;padding:12px 18px;font-size:1em;line-height:1.6em;cursor:pointer;overflow:hidden;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.sqs-block-archive .archive-block-setting-layout-dropdown .archive-dropdown-toggle-title{float:left;width:90%;padding-right:5px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;box-sizing:border-box}.sqs-block-archive .archive-block-setting-layout-dropdown .archive-dropdown-toggle-icon{position:relative;bottom:1px;float:right;width:10%;text-align:right;box-sizing:border-box}.sqs-block-archive .archive-block-setting-layout-dropdown .archive-dropdown-toggle-icon:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e009\";text-align:center;display:inline-block;vertical-align:middle}.sqs-block-archive .archive-block-setting-layout-dropdown .archive-dropdown-toggle-icon:before{font-size:16px;width:16px;height:16px;line-height:16px}.sqs-block-archive .archive-block-setting-layout-dropdown .archive-dropdown-toggle-icon:before{font-size:1em;width:1em;height:1em;line-height:1em}.sqs-block-archive .archive-block-setting-layout-dropdown .archive-group-list{display:none;padding:0 18px 12px}.sqs-block-archive .archive-block-setting-layout-dropdown .archive-group-name-link{text-decoration:none}@media only screen and (max-width:400px){.sqs-block-archive .archive-block-setting-layout-dropdown.archive-block-wrapper{max-width:none}}.sqs-block-archive.sqs-edit-dialog-open .sqs-editing-overlay,.sqs-block-archive.sqs-edit-dialog-open .sqs-block-editor-button-container{z-index:1}.sqs-block-archive.sqs-edit-dialog-open .sqs-block-archive-content{position:relative;z-index:1000}.sqs-block-archive.sqs-edit-dialog-open .archive-group-list{pointer-events:none}.sqs-block-spacer .sqs-block-content{visibility:hidden}.sqs-layout .html-block.sqs-block img{max-width:100%;height:auto}.sqs-layout .html-block.sqs-block img[align=left]{margin-right:34px}.sqs-layout .html-block.sqs-block img[align=right]{margin-left:34px}.sqs-layout .html-block.sqs-block img[align=top]{vertical-align:top}.sqs-layout .html-block.sqs-block img[align=middle]{vertical-align:middle}.sqs-layout .html-block.sqs-block img[align=bottom]{vertical-align:bottom}.sqs-layout .html-block.sqs-block .full-image-float-left,.sqs-layout .html-block.sqs-block .thumbnail-image-float-left{float:left;margin-right:34px}.sqs-layout .html-block.sqs-block .full-image-float-right,.sqs-layout .html-block.sqs-block .thumbnail-image-float-right{float:right;margin-left:34px}.sqs-layout .html-block.sqs-block .full-image-block{display:block;margin-bottom:34px}.sqs-layout .html-block.sqs-block div[data-src=\"v5\"] img{max-width:100%}.sqs-layout .html-block.sqs-block .thumbnail-caption{display:block}.sqs-layout .html-block.sqs-block .entry-content img{margin:0 0 34px 0}.sqs-layout .html-block.sqs-block .alignleft,.sqs-layout .html-block.sqs-block img.alignleft{margin-right:34px;display:inline;float:left;width:auto}.sqs-layout .html-block.sqs-block .alignright,.sqs-layout .html-block.sqs-block img.alignright{margin-left:34px;display:inline;float:right;width:auto}.sqs-layout .html-block.sqs-block .aligncenter,.sqs-layout .html-block.sqs-block img.aligncenter{margin-right:auto;margin-left:auto;display:block;clear:both;width:auto}.sqs-layout .html-block.sqs-block blockquote.left{margin-right:34px;text-align:right;margin-left:0;width:33%;float:left}.sqs-layout .html-block.sqs-block blockquote.right{margin-left:34px;text-align:left;margin-right:0;width:33%;float:right}.system-button-font{font-family:\"proxima-nova\",sans-serif;font-weight:600;font-style:normal;text-transform:uppercase;letter-spacing:1px}body:not(.button-style-default) .sqs-editable-button,body:not(.button-style-default) .sqs-editable-button-layout{display:inline-block;width:auto;height:auto;padding:1em 2.5em;border-width:0;text-align:center;cursor:pointer;outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}body:not(.button-style-default) .sqs-editable-button:hover,body:not(.button-style-default) .sqs-editable-button-layout:hover{opacity:1}body:not(.button-style-default) .sqs-editable-button,body:not(.button-style-default) .sqs-editable-button-color{color:#fff;background-color:#23c890;border-color:#23c890}body:not(.button-style-default) .sqs-editable-button,body:not(.button-style-default) .sqs-editable-button-font{font-family:\"proxima-nova\",sans-serif;letter-spacing:1px;font-family:\"proxima-nova\";text-transform:uppercase;letter-spacing:.6px;font-weight:600;font-style:normal}body:not(.button-style-default).button-style-solid .sqs-editable-button,body:not(.button-style-default).button-style-solid .sqs-editable-button-style{-webkit-transition:.1s opacity linear;-moz-transition:.1s opacity linear;-o-transition:.1s opacity linear;transition:.1s opacity linear;-webkit-backface-visibility:hidden}body:not(.button-style-default).button-style-solid .sqs-editable-button:hover,body:not(.button-style-default).button-style-solid .sqs-editable-button-style:hover{opacity:.8}body:not(.button-style-default).button-style-outline .sqs-editable-button,body:not(.button-style-default).button-style-outline .sqs-editable-button-style{border-width:2px;border-style:solid;-webkit-transition:0.1s background-color linear, 0.1s color linear;-moz-transition:0.1s background-color linear, 0.1s color linear;-o-transition:0.1s background-color linear, 0.1s color linear;transition:0.1s background-color linear, 0.1s color linear}body:not(.button-style-default).button-style-outline .sqs-editable-button,body:not(.button-style-default).button-style-outline .sqs-editable-button-color{background-color:transparent;color:#23c890}body:not(.button-style-default).button-style-outline .sqs-editable-button:hover,body:not(.button-style-default).button-style-outline .sqs-editable-button-color:hover{background-color:#23c890;color:#1d1d1d;color:#fff}body:not(.button-style-default).button-style-raised .sqs-editable-button,body:not(.button-style-default).button-style-raised .sqs-editable-button-style{position:relative;-webkit-transition:.1s background-color linear;-moz-transition:.1s background-color linear;-o-transition:.1s background-color linear;transition:.1s background-color linear}body:not(.button-style-default).button-style-raised .sqs-editable-button:active,body:not(.button-style-default).button-style-raised .sqs-editable-button-style:active{top:1px}body:not(.button-style-default).button-style-raised .sqs-editable-button,body:not(.button-style-default).button-style-raised .sqs-editable-button-color{-webkit-box-shadow:0 2px 0 0 #1da577;-moz-box-shadow:0 2px 0 0 #1da577;box-shadow:0 2px 0 0 #1da577}body:not(.button-style-default).button-style-raised .sqs-editable-button:hover,body:not(.button-style-default).button-style-raised .sqs-editable-button-color:hover{background-color:#25d599}body:not(.button-style-default).button-style-raised .sqs-editable-button:active,body:not(.button-style-default).button-style-raised .sqs-editable-button-color:active{-webkit-box-shadow:0 1px 0 0 #1da577;-moz-box-shadow:0 1px 0 0 #1da577;box-shadow:0 1px 0 0 #1da577}body:not(.button-style-default).button-corner-style-square .sqs-editable-button,body:not(.button-style-default).button-corner-style-square .sqs-editable-button-shape{border-radius:0}body:not(.button-style-default).button-corner-style-rounded .sqs-editable-button,body:not(.button-style-default).button-corner-style-rounded .sqs-editable-button-shape{border-radius:3px}body:not(.button-style-default).button-corner-style-pill .sqs-editable-button,body:not(.button-style-default).button-corner-style-pill .sqs-editable-button-shape{border-radius:300px}body:not(.button-style-default).button-style-outline .newsletter-block .newsletter-form-button{border-width:1px;-webkit-box-shadow:inset 0px 0px 0px 1px #23c890;-moz-box-shadow:inset 0px 0px 0px 1px #23c890;box-shadow:inset 0px 0px 0px 1px #23c890;background:transparent;color:#23c890}body:not(.button-style-default).button-style-outline .newsletter-block .newsletter-form-button:hover{background-color:#23c890;color:#1d1d1d;color:#fff}body:not(.button-style-default).button-style-raised .newsletter-block .newsletter-form-button{border-width:0 !important;top:-1px;-webkit-box-shadow:0 2px 0 0 #1da577;-moz-box-shadow:0 2px 0 0 #1da577;box-shadow:0 2px 0 0 #1da577}body:not(.button-style-default).button-style-raised .newsletter-block .newsletter-form-button:hover{background-color:#25d599}body:not(.button-style-default).button-style-raised .newsletter-block .newsletter-form-button:active{top:0px;-webkit-box-shadow:0 1px 0 0 #1da577;-moz-box-shadow:0 1px 0 0 #1da577;box-shadow:0 1px 0 0 #1da577}body:not(.button-style-default) .opentable-block .OT_Find_a_Table{font-family:\"proxima-nova\",sans-serif;letter-spacing:1px;font-family:\"proxima-nova\";text-transform:uppercase;letter-spacing:.6px;font-weight:600;font-style:normal}body:not(.button-style-default).button-corner-style-rounded .opentable-block .OT_Find_a_Table{border-radius:3px}body:not(.button-style-default).button-corner-style-pill .opentable-block .OT_Find_a_Table{border-radius:300px}.announcement-bar-font{font-family:'proxima-nova',arial,sans-serif;font-size:13px;font-weight:300;font-style:normal;letter-spacing:1px;text-transform:none}.sqs-announcement-bar{overflow:hidden;position:relative;top:0;left:0;z-index:10000;background:#f5dc00;text-align:center;-webkit-transition:height .3s cubic-bezier(.23,1,.32,1);-moz-transition:height .3s cubic-bezier(.23,1,.32,1);-ms-transition:height .3s cubic-bezier(.23,1,.32,1);-o-transition:height .3s cubic-bezier(.23,1,.32,1);transition:height .3s cubic-bezier(.23,1,.32,1)}.sqs-announcement-bar-url{position:absolute;top:0;left:0;width:100%;height:100%}.sqs-announcement-bar-text{padding:.8em 3em;font-family:'proxima-nova',arial,sans-serif;font-size:13px;font-weight:300;font-family:\"proxima-nova\";font-size:19px;text-transform:none;letter-spacing:1px;font-weight:700;font-style:normal;line-height:1.2em}.sqs-announcement-bar-text p{color:#000;margin:0;font-family:'proxima-nova',arial,sans-serif;font-size:13px;font-weight:300;font-family:\"proxima-nova\";font-size:19px;text-transform:none;letter-spacing:1px;font-weight:700;font-style:normal;line-height:inherit}.sqs-announcement-bar-text a{position:relative;color:#000 !important;text-decoration:underline !important}.sqs-announcement-bar-close{cursor:pointer;position:absolute;top:0;right:0;width:2.8em;height:2.78em;background:rgba(0,0,0,.15);color:#000}.sqs-announcement-bar-close:after{content:'×';display:block;font-family:helvetica,arial,sans-serif;font-size:1em;font-weight:100;line-height:2.7em;letter-spacing:normal;padding:0}.sqs-announcement-bar-hidden{height:0 !important}@media screen and (max-width:1024px){.sqs-announcement-bar-text,.sqs-announcement-bar-text p{font-size:13px}}@font-face{font-family:'social-icon-font';src:url('//static.squarespace.com/universal/fonts/social-20141119/social-icon-font.eot');src:url('//static.squarespace.com/universal/fonts/social-20141119/social-icon-font.eot?#iefix') format('embedded-opentype'),url('//static.squarespace.com/universal/fonts/social-20141119/social-icon-font.woff') format('woff'),url('//static.squarespace.com/universal/fonts/social-20141119/social-icon-font.ttf') format('truetype'),url('//static.squarespace.com/universal/fonts/social-20141119/social-icon-font.svg#social-icon-font') format('svg');font-weight:normal;font-style:normal}.social-smugmug:before,.social-dribbble:before,.social-youtube:before,.social-vimeo:before,.social-twitter:before,.social-tumblr:before,.social-pinterest:before,.social-linkedin:before,.social-instagram:before,.social-google:before,.social-foursquare:before,.social-flickr:before,.social-facebook:before,.social-fivehundredpix:before,.social-fivehundredpx:before,.social-email:before,.social-github:before,.social-rss:before,.social-spotify:before,.social-soundcloud:before,.social-itunes:before,.social-googleplay:before,.social-dropbox:before,.social-bandsintown:before,.social-behance:before,.social-codepen:before,.social-medium:before,.social-rdio:before,.social-squarespace:before,.social-vine:before,.social-yelp:before,.social-vevo:before,.social-meetup:before,.social-twitch:before,.social-vsco:before,.social-smugmug-square:before,.social-dribbble-square:before,.social-youtube-square:before,.social-vimeo-square:before,.social-twitter-square:before,.social-tumblr-square:before,.social-pinterest-square:before,.social-linkedin-square:before,.social-instagram-square:before,.social-google-square:before,.social-foursquare-square:before,.social-flickr-square:before,.social-facebook-square:before,.social-fivehundredpix-square:before,.social-fivehundredpx-square:before,.social-email-square:before,.social-github-square:before,.social-rss-square:before,.social-spotify-square:before,.social-soundcloud-square:before,.social-itunes-square:before,.social-googleplay-square:before,.social-dropbox-square:before,.social-bandsintown-square:before,.social-behance-square:before,.social-codepen-square:before,.social-medium-square:before,.social-rdio-square:before,.social-squarespace-square:before,.social-vine-square:before,.social-yelp-square:before,.social-vevo-square:before,.social-meetup-square:before,.social-twitch-square:before,.social-vsco-square:before,.social-smugmug-round:before,.social-dribbble-round:before,.social-youtube-round:before,.social-vimeo-round:before,.social-twitter-round:before,.social-tumblr-round:before,.social-pinterest-round:before,.social-linkedin-round:before,.social-instagram-round:before,.social-google-round:before,.social-foursquare-round:before,.social-flickr-round:before,.social-facebook-round:before,.social-fivehundredpix-round:before,.social-fivehundredpx-round:before,.social-email-round:before,.social-github-round:before,.social-rss-round:before,.social-spotify-round:before,.social-soundcloud-round:before,.social-itunes-round:before,.social-googleplay-round:before,.social-dropbox-round:before,.social-bandsintown-round:before,.social-behance-round:before,.social-codepen-round:before,.social-medium-round:before,.social-rdio-round:before,.social-squarespace-round:before,.social-vine-round:before,.social-yelp-round:before,.social-vevo-round:before,.social-meetup-round:before,.social-twitch-round:before,.social-vsco-round:before{font-family:'social-icon-font';speak:none;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.social-smugmug:before{content:\"\\e600\"}.social-icon-style-square .social-smugmug:before{content:\"\\e601\"}.social-icon-style-round .social-smugmug:before{content:\"\\e602\"}.social-dribbble:before{content:\"\\e603\"}.social-icon-style-square .social-dribbble:before{content:\"\\e604\"}.social-icon-style-round .social-dribbble:before{content:\"\\e605\"}.social-youtube:before{content:\"\\e606\"}.social-icon-style-square .social-youtube:before{content:\"\\e607\"}.social-icon-style-round .social-youtube:before{content:\"\\e608\"}.social-vimeo:before{content:\"\\e609\"}.social-icon-style-square .social-vimeo:before{content:\"\\e60a\"}.social-icon-style-round .social-vimeo:before{content:\"\\e60b\"}.social-twitter:before{content:\"\\e60c\"}.social-icon-style-square .social-twitter:before{content:\"\\e60d\"}.social-icon-style-round .social-twitter:before{content:\"\\e60e\"}.social-tumblr:before{content:\"\\e60f\"}.social-icon-style-square .social-tumblr:before{content:\"\\e610\"}.social-icon-style-round .social-tumblr:before{content:\"\\e611\"}.social-pinterest:before{content:\"\\e612\"}.social-icon-style-square .social-pinterest:before{content:\"\\e613\"}.social-icon-style-round .social-pinterest:before{content:\"\\e614\"}.social-linkedin:before{content:\"\\e615\"}.social-icon-style-square .social-linkedin:before{content:\"\\e616\"}.social-icon-style-round .social-linkedin:before{content:\"\\e617\"}.social-instagram:before{content:\"\\e618\"}.social-icon-style-square .social-instagram:before{content:\"\\e619\"}.social-icon-style-round .social-instagram:before{content:\"\\e61a\"}.social-google:before{content:\"\\e61b\"}.social-icon-style-square .social-google:before{content:\"\\e61c\"}.social-icon-style-round .social-google:before{content:\"\\e61d\"}.social-googleauth2:before{content:\"\\e61b\"}.social-foursquare:before{content:\"\\e61e\"}.social-icon-style-square .social-foursquare:before{content:\"\\e61f\"}.social-icon-style-round .social-foursquare:before{content:\"\\e620\"}.social-flickr:before{content:\"\\e621\"}.social-icon-style-square .social-flickr:before{content:\"\\e622\"}.social-icon-style-round .social-flickr:before{content:\"\\e623\"}.social-facebook:before{content:\"\\e624\"}.social-icon-style-square .social-facebook:before{content:\"\\e625\"}.social-icon-style-round .social-facebook:before{content:\"\\e626\"}.social-fivehundredpix:before{content:\"\\e627\"}.social-icon-style-square .social-fivehundredpix:before{content:\"\\e628\"}.social-icon-style-round .social-fivehundredpix:before{content:\"\\e629\"}.social-fivehundredpx:before{content:\"\\e627\"}.social-icon-style-square .social-fivehundredpx:before{content:\"\\e628\"}.social-icon-style-round .social-fivehundredpx:before{content:\"\\e629\"}.social-email:before{content:\"\\e62a\"}.social-icon-style-square .social-email:before{content:\"\\e62b\"}.social-icon-style-round .social-email:before{content:\"\\e62c\"}.social-github:before{content:\"\\e62d\"}.social-icon-style-square .social-github:before{content:\"\\e62e\"}.social-icon-style-round .social-github:before{content:\"\\e62f\"}.social-rss:before{content:\"\\e630\"}.social-icon-style-square .social-rss:before{content:\"\\e631\"}.social-icon-style-round .social-rss:before{content:\"\\e632\"}.social-spotify:before{content:\"\\e633\"}.social-icon-style-square .social-spotify:before{content:\"\\e634\"}.social-icon-style-round .social-spotify:before{content:\"\\e635\"}.social-soundcloud:before{content:\"\\e636\"}.social-icon-style-square .social-soundcloud:before{content:\"\\e637\"}.social-icon-style-round .social-soundcloud:before{content:\"\\e638\"}.social-itunes:before{content:\"\\e639\"}.social-icon-style-square .social-itunes:before{content:\"\\e63a\"}.social-icon-style-round .social-itunes:before{content:\"\\e63b\"}.social-googleplay:before{content:\"\\e63c\"}.social-icon-style-square .social-googleplay:before{content:\"\\e63d\"}.social-icon-style-round .social-googleplay:before{content:\"\\e63e\"}.social-dropbox:before{content:\"\\e63f\"}.social-icon-style-square .social-dropbox:before{content:\"\\e640\"}.social-icon-style-round .social-dropbox:before{content:\"\\e641\"}.social-bandsintown:before{content:\"\\e642\"}.social-icon-style-square .social-bandsintown:before{content:\"\\e643\"}.social-icon-style-round .social-bandsintown:before{content:\"\\e644\"}.social-behance:before{content:\"\\e645\"}.social-icon-style-square .social-behance:before{content:\"\\e646\"}.social-icon-style-round .social-behance:before{content:\"\\e647\"}.social-codepen:before{content:\"\\e648\"}.social-icon-style-square .social-codepen:before{content:\"\\e649\"}.social-icon-style-round .social-codepen:before{content:\"\\e64a\"}.social-medium:before{content:\"\\e64b\"}.social-icon-style-square .social-medium:before{content:\"\\e64c\"}.social-icon-style-round .social-medium:before{content:\"\\e64d\"}.social-rdio:before{content:\"\\e64e\"}.social-icon-style-square .social-rdio:before{content:\"\\e64f\"}.social-icon-style-round .social-rdio:before{content:\"\\e650\"}.social-squarespace:before{content:\"\\e651\"}.social-icon-style-square .social-squarespace:before{content:\"\\e652\"}.social-icon-style-round .social-squarespace:before{content:\"\\e653\"}.social-vine:before{content:\"\\e654\"}.social-icon-style-square .social-vine:before{content:\"\\e655\"}.social-icon-style-round .social-vine:before{content:\"\\e656\"}.social-yelp:before{content:\"\\e657\"}.social-icon-style-square .social-yelp:before{content:\"\\e658\"}.social-icon-style-round .social-yelp:before{content:\"\\e659\"}.social-meetup:before{content:\"\\e65a\"}.social-icon-style-square .social-meetup:before{content:\"\\e65b\"}.social-icon-style-round .social-meetup:before{content:\"\\e65c\"}.social-vevo:before{content:\"\\e65d\"}.social-icon-style-square .social-vevo:before{content:\"\\e65e\"}.social-icon-style-round .social-vevo:before{content:\"\\e65f\"}.social-twitch:before{content:\"\\e660\"}.social-icon-style-square .social-twitch:before{content:\"\\e661\"}.social-icon-style-round .social-twitch:before{content:\"\\e662\"}.social-vsco:before{content:\"\\e663\"}.social-icon-style-square .social-vsco:before{content:\"\\e664\"}.social-icon-style-round .social-vsco:before{content:\"\\e665\"}.sqs-product-quick-view-lightbox .sqs-product-quick-view-content{padding:60px}.sqs-product-quick-view-lightbox-next-button,.sqs-product-quick-view-lightbox-prev-button{position:fixed;top:50%;width:90%;max-width:900px;height:70px;margin-top:-35px;color:#fff;font-size:inherit;line-height:70px;cursor:pointer;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.sqs-product-quick-view-lightbox-next-button:before,.sqs-product-quick-view-lightbox-prev-button:before{font-weight:bold}.sqs-product-quick-view-lightbox-next-button{text-align:right;margin-left:50px;padding-right:23.333333333333332px}.sqs-product-quick-view-lightbox-next-button:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e02d\";text-align:center;display:inline-block;vertical-align:middle}.sqs-product-quick-view-lightbox-next-button:before{font-size:32px;width:32px;height:32px;line-height:32px}.sqs-product-quick-view-lightbox-next-button:before{font-size:30px;width:30px;height:30px;line-height:30px}.sqs-product-quick-view-lightbox-prev-button{margin-left:-73.33333333333333px;padding-left:23.333333333333332px}.sqs-product-quick-view-lightbox-prev-button:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e02c\";text-align:center;display:inline-block;vertical-align:middle}.sqs-product-quick-view-lightbox-prev-button:before{font-size:32px;width:32px;height:32px;line-height:32px}.sqs-product-quick-view-lightbox-prev-button:before{font-size:30px;width:30px;height:30px;line-height:30px}.sqs-product-quick-view-lightbox-element-hidden{opacity:0;visibility:hidden;cursor:default}.sqs-product-quick-view-lightbox #productDetails{width:47%}.sqs-product-quick-view-lightbox .sqs-add-to-cart-button{margin:20px 0}@media only screen and (max-width:960px){.sqs-product-quick-view-lightbox .sqs-product-quick-view-content{padding:40px}}@media only screen and (max-width:850px){.sqs-product-quick-view-lightbox #productSummary .product-title{display:none}.sqs-product-quick-view-lightbox #productSummary .product-title.mobile{display:block;margin-top:0}.sqs-product-quick-view-lightbox .product-meta{margin-top:0 !important}.sqs-product-quick-view-lightbox #productDetails,.sqs-product-quick-view-lightbox #productGallery{width:100%;float:none}}.sqs-product-quick-view-lightbox.sqs-modal-lightbox{visibility:visible}.sqs-product-quick-view-lightbox.sqs-modal-lightbox[hidden]{visibility:hidden;display:block !important}.sqs-product-quick-view-lightbox.sqs-modal-lightbox[hidden] .sqs-modal-lightbox-content{left:-9999px;opacity:0;transition:none}.sqs-product-quick-view-lightbox.sqs-modal-lightbox .sqs-modal-lightbox-content{transition:opacity .15s ease-out}.sqs-product-quick-view-lightbox.sqs-modal-lightbox .sqs-modal-lightbox-content .lightbox-inner .lightbox-content{width:90%;max-width:900px;padding:0px}.sqs-product-quick-view-lightbox.sqs-modal-lightbox .sqs-modal-lightbox-content .lightbox-inner .lightbox-content .lightbox-close{position:fixed;top:0;right:0;width:70px;height:70px;color:transparent;font-size:inherit;line-height:70px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.sqs-product-quick-view-lightbox.sqs-modal-lightbox .sqs-modal-lightbox-content .lightbox-inner .lightbox-content .lightbox-close:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e02e\";text-align:center;display:inline-block;vertical-align:middle}.sqs-product-quick-view-lightbox.sqs-modal-lightbox .sqs-modal-lightbox-content .lightbox-inner .lightbox-content .lightbox-close:before{font-size:32px;width:32px;height:32px;line-height:32px}.sqs-product-quick-view-lightbox.sqs-modal-lightbox .sqs-modal-lightbox-content .lightbox-inner .lightbox-content .lightbox-close:before{font-size:42px;width:42px;height:42px;line-height:42px}.sqs-product-quick-view-lightbox.sqs-modal-lightbox .sqs-modal-lightbox-content .lightbox-inner .lightbox-content .lightbox-close:before{color:#fff;font-weight:lighter}.sqs-product-quick-view-lightbox.sqs-modal-lightbox~.sqs-widgets-confirmation{z-index:100000001}.sqs-product-quick-view-button{display:inline-block;width:auto;height:auto;padding:1em 2.5em;color:#fff;background-color:#272727;border-width:0;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:12px;line-height:1em;font-weight:normal;font-style:normal;text-transform:uppercase;letter-spacing:0px;text-align:center;text-decoration:none;cursor:pointer;outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;font-size:14px}.site-title-font{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:600;font-style:normal;font-size:20px;letter-spacing:2px;text-transform:uppercase}.nav-font{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:600;font-style:normal;font-size:14px;letter-spacing:1px;text-transform:uppercase;text-decoration:none}.nav-button-font{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:700;font-style:normal;letter-spacing:1px;text-transform:uppercase;text-decoration:none}.banner-heading-font{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;font-size:48px;letter-spacing:0px;text-transform:none;line-height:1em}.banner-text-font{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;font-size:18px;letter-spacing:0px;text-transform:none;line-height:1.5em}.banner-button-font{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:700;font-style:normal;font-size:16px;letter-spacing:1px;text-transform:uppercase;text-decoration:none}.body-font{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;font-size:16px;letter-spacing:0px;line-height:1.6em}.heading1-font{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;font-size:48px;letter-spacing:0px;text-transform:none;line-height:1.2em}.heading2-font{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;font-size:32px;letter-spacing:0px;text-transform:none;line-height:1.2em}.heading3-font{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;font-size:21px;letter-spacing:0px;text-transform:none;line-height:1.2em}.quote-font{font-family:Georgia,\"Times New Roman\",serif;font-weight:400;font-style:italic;font-size:27px;letter-spacing:0px;line-height:1.65em}.summary-heading-font{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;letter-spacing:1px;text-transform:uppercase}.subnav-title-font{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:700;font-style:normal;font-size:14px;letter-spacing:1px;text-transform:uppercase;text-decoration:none}.subnav-link-font{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;font-size:14px;letter-spacing:1px;text-transform:uppercase;text-decoration:none}.footer-nav-font{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;font-size:14px;letter-spacing:1px;text-transform:uppercase;text-decoration:none}.site-info-font{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:600;font-style:normal;font-size:14px;letter-spacing:1px;text-transform:uppercase;text-decoration:none}html:not(.js) body[class^=collection-] img{max-width:100%}html:not(.js) body[class^=collection-] [href=\"#\"]{display:none !important;visibility:hidden}.hidden{display:none !important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}img[data-src]:not([src]){visibility:hidden}.full-image-float-left,.thumbnail-image-float-left{float:left;margin-right:1.5em}.full-image-float-right,.thumbnail-image-float-right{float:right;margin-left:1.5em}.full-image-block{display:block;margin-bottom:1.5em}.thumbnail-caption{display:block}.clearfix:before,.clearfix:after{content:\" \";display:table}.clearfix:after{clear:both}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:\" (\" attr(href) \")\"}abbr[title]:after{content:\" (\" attr(title) \")\"}a[href^=\"javascript:\"]:after,a[href^=\"#\"]:after{content:\"\"}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page {margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}.border-box,.border-box:before,.border-box:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.header-anim 0%{opacity:0}.header-anim 72%{opacity:0}.header-anim 100%{opacity:1}@-webkit-keyframes header-anim{0%{opacity:0}72%{opacity:0}100%{opacity:1}}@keyframes header-anim{0%{opacity:0}72%{opacity:0}100%{opacity:1}}.feature-bg-anim 0%{opacity:0}.feature-bg-anim 50%{opacity:0}.feature-bg-anim 100%{opacity:1}@-webkit-keyframes feature-bg-anim{0%{opacity:0}50%{opacity:0}100%{opacity:1}}@keyframes feature-bg-anim{0%{opacity:0}50%{opacity:0}100%{opacity:1}}.feature-text-anim 0%{opacity:0;-webkit-transform:translate3d(0,10px,0);-moz-transform:translate3d(0,10px,0);-ms-transform:translate3d(0,10px,0);-o-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}.feature-text-anim 75%{opacity:0;-webkit-transform:translate3d(0,10px,0);-moz-transform:translate3d(0,10px,0);-ms-transform:translate3d(0,10px,0);-o-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}.feature-text-anim 100%{opacity:1;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@-webkit-keyframes feature-text-anim{0%{opacity:0;-webkit-transform:translate3d(0,10px,0);-moz-transform:translate3d(0,10px,0);-ms-transform:translate3d(0,10px,0);-o-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}75%{opacity:0;-webkit-transform:translate3d(0,10px,0);-moz-transform:translate3d(0,10px,0);-ms-transform:translate3d(0,10px,0);-o-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}100%{opacity:1;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes feature-text-anim{0%{opacity:0;-webkit-transform:translate3d(0,10px,0);-moz-transform:translate3d(0,10px,0);-ms-transform:translate3d(0,10px,0);-o-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}75%{opacity:0;-webkit-transform:translate3d(0,10px,0);-moz-transform:translate3d(0,10px,0);-ms-transform:translate3d(0,10px,0);-o-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}100%{opacity:1;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.feature-text-anim-alt 0%{opacity:0;-webkit-transform:translate3d(-50%,-45%,0);-moz-transform:translate3d(-50%,-45%,0);-ms-transform:translate3d(-50%,-45%,0);-o-transform:translate3d(-50%,-45%,0);transform:translate3d(-50%,-45%,0)}.feature-text-anim-alt 67%{opacity:0;-webkit-transform:translate3d(-50%,-45%,0);-moz-transform:translate3d(-50%,-45%,0);-ms-transform:translate3d(-50%,-45%,0);-o-transform:translate3d(-50%,-45%,0);transform:translate3d(-50%,-45%,0)}.feature-text-anim-alt 100%{opacity:1;-webkit-transform:translate3d(-50%,-50%,0);-moz-transform:translate3d(-50%,-50%,0);-ms-transform:translate3d(-50%,-50%,0);-o-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0)}@-webkit-keyframes feature-text-anim-alt{0%{opacity:0;-webkit-transform:translate3d(-50%,-45%,0);-moz-transform:translate3d(-50%,-45%,0);-ms-transform:translate3d(-50%,-45%,0);-o-transform:translate3d(-50%,-45%,0);transform:translate3d(-50%,-45%,0)}67%{opacity:0;-webkit-transform:translate3d(-50%,-45%,0);-moz-transform:translate3d(-50%,-45%,0);-ms-transform:translate3d(-50%,-45%,0);-o-transform:translate3d(-50%,-45%,0);transform:translate3d(-50%,-45%,0)}100%{opacity:1;-webkit-transform:translate3d(-50%,-50%,0);-moz-transform:translate3d(-50%,-50%,0);-ms-transform:translate3d(-50%,-50%,0);-o-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0)}}@keyframes feature-text-anim-alt{0%{opacity:0;-webkit-transform:translate3d(-50%,-45%,0);-moz-transform:translate3d(-50%,-45%,0);-ms-transform:translate3d(-50%,-45%,0);-o-transform:translate3d(-50%,-45%,0);transform:translate3d(-50%,-45%,0)}67%{opacity:0;-webkit-transform:translate3d(-50%,-45%,0);-moz-transform:translate3d(-50%,-45%,0);-ms-transform:translate3d(-50%,-45%,0);-o-transform:translate3d(-50%,-45%,0);transform:translate3d(-50%,-45%,0)}100%{opacity:1;-webkit-transform:translate3d(-50%,-50%,0);-moz-transform:translate3d(-50%,-50%,0);-ms-transform:translate3d(-50%,-50%,0);-o-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0)}}*::selection{background-color:#000;color:#fff}body{background-color:#29292d}#siteWrapper{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;line-height:1.6em;font-family:\"adelle-sans\";font-size:16px;line-height:1.7em;letter-spacing:0px;font-weight:400;font-style:normal;color:rgba(13,13,13,.7)}.sqs-modal-lightbox-content .lightbox-inner .lightbox-content .form-wrapper{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;line-height:1.6em;font-family:\"adelle-sans\";font-size:16px;line-height:1.7em;letter-spacing:0px;font-weight:400;font-style:normal}.html-block a:not(.sqs-block-button-element),.markdown-block a:not(.sqs-block-button-element),.entry-more-link a:not(.sqs-block-button-element),.twitter-block a:not(.sqs-block-button-element),.foursquare-block a:not(.sqs-block-button-element),.rss-block a:not(.sqs-block-button-element),.layout-caption-below .image-caption a:not(.sqs-block-button-element),.summary-excerpt a:not(.sqs-block-button-element),.album-description a:not(.sqs-block-button-element),.product-excerpt a:not(.sqs-block-button-element),.product-description a:not(.sqs-block-button-element),.eventlist-excerpt a:not(.sqs-block-button-element),.html-block a:not(.sqs-block-button-element):visited,.markdown-block a:not(.sqs-block-button-element):visited,.entry-more-link a:not(.sqs-block-button-element):visited,.twitter-block a:not(.sqs-block-button-element):visited,.foursquare-block a:not(.sqs-block-button-element):visited,.rss-block a:not(.sqs-block-button-element):visited,.layout-caption-below .image-caption a:not(.sqs-block-button-element):visited,.summary-excerpt a:not(.sqs-block-button-element):visited,.album-description a:not(.sqs-block-button-element):visited,.product-excerpt a:not(.sqs-block-button-element):visited,.product-description a:not(.sqs-block-button-element):visited,.eventlist-excerpt a:not(.sqs-block-button-element):visited{color:#3d9991;text-decoration:none}a{text-decoration:none;color:rgba(13,13,13,.7)}.sqs-lightbox-meta a{color:inherit;text-decoration:underline}h1,h2,h3{text-rendering:optimizeLegibility}article header h1 a{color:rgba(26,26,26,.9)}h1,.entry-title{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:48px;font-family:\"adelle-sans\";font-size:32px;line-height:1.2em;text-transform:none;letter-spacing:0px;font-weight:400;font-style:normal}h1,.entry-title{color:rgba(26,26,26,.9)}h2{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:32px;letter-spacing:0px;text-transform:none;font-family:\"proxima-nova\";font-size:22px;line-height:1.2em;text-transform:uppercase;letter-spacing:2px;font-weight:400;font-style:normal}h2,.summary-title a{color:#4a4a4a}h3{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:400;font-size:21px;letter-spacing:0px;text-transform:none;line-height:1.2em;font-family:\"proxima-nova\";font-size:16px;line-height:1em;text-transform:uppercase;letter-spacing:1px;font-weight:600;font-style:normal}h3{color:rgba(26,26,26,.9)}h1,h2,h3,.entry-title{margin:1em 0 .5em}h1:first-child,h2:first-child,h3:first-child,.entry-title:first-child{margin-top:0}blockquote{margin:0;padding:.5em 2.5em;font-style:italic}.entry-actions,.entry-comments,.eventitem-addtocallinks,.album-info .engagement,.entry-dateline,.entry-byline,.entry-morefrom,.entry-tags,.entry-source,.eventitem-backlink,.sqs-audio-playlist .tracks .track-info .artist,.summary-info-item{color:rgba(26,26,26,.4)}.entry-actions a,.entry-comments a,.eventitem-addtocallinks a,.album-info .engagement a,.entry-dateline a,.entry-byline a,.entry-morefrom a,.entry-tags a,.entry-source a,.eventitem-backlink a,.sqs-audio-playlist .tracks .track-info .artist a,.summary-info-item a{color:rgba(26,26,26,.4)}.sqs-block-summary-v2 .summary-info-item{opacity:1}.comment-count{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;line-height:1.6em;font-family:\"adelle-sans\";font-size:16px;line-height:1.7em;letter-spacing:0px;font-weight:400;font-style:normal;color:rgba(13,13,13,.7)}.quote-block figure{font-family:Georgia,\"Times New Roman\",serif;font-style:italic;font-size:27px;font-family:\"adobe-garamond-pro\";font-size:20px;line-height:1.65em;letter-spacing:0px;font-weight:400;font-style:normal;color:rgba(26,26,26,.9);padding:32px 32px 0;text-align:center;margin:0}.quote-block blockquote{padding:0;border-left-width:0;font-style:inherit}.quote-block blockquote>span:first-child{font-size:4em;display:block;opacity:.3}.quote-block blockquote>span:last-child{display:none}.quote-block .source{font-size:.875em;padding-top:1em;opacity:.5;text-align:center}.sqs-block-horizontalrule hr{border-style:none;border-width:0;margin:32px 0;color:rgba(13,13,13,.15);background-color:rgba(13,13,13,.15)}#preFooter .sqs-block-horizontalrule hr{color:rgba(255,255,255,.15);background-color:rgba(255,255,255,.15)}#footer .sqs-block-horizontalrule hr{color:rgba(255,255,255,.15);background-color:rgba(255,255,255,.15)}#siteWrapper{position:relative;padding:0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#siteWrapper{background-color:#fff}.sqs-cart-dropzone .sqs-pill-shopping-cart{z-index:9999}@media screen and (min-width:641px){.sqs-cart-dropzone{position:absolute;top:100px;right:20px;width:auto;max-width:282px;z-index:999}}.category-nav .nav-section-label,.folder-nav .nav-section-label{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:700;font-size:14px;letter-spacing:1px;text-transform:uppercase;font-family:\"adobe-garamond-pro\";font-size:22px;text-transform:none;text-decoration:none;letter-spacing:0px;font-weight:400;font-style:normal;line-height:1.2em;color:#00746b;margin-bottom:.5em}.category-nav a,.folder-nav a,.category-nav a:visited,.folder-nav a:visited{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:400;letter-spacing:1px;font-family:\"proxima-nova\";font-size:14px;text-transform:uppercase;text-decoration:none;letter-spacing:2px;font-weight:600;font-style:normal;color:rgba(26,26,26,.4);line-height:1.25em;display:block;padding:0 0 .75em}.category-nav a:hover,.folder-nav a:hover,.category-nav a:visited:hover,.folder-nav a:visited:hover{color:#1a1a1a}.category-nav li.active-link:not(.all) a,.folder-nav li.active-link:not(.all) a,.category-nav li.active-link:not(.all) a:visited,.folder-nav li.active-link:not(.all) a:visited{color:#1a1a1a}.view-list #categoryNav ul li.active-link.all a,.view-list #categoryNav ul li.active-link.all a:visited{color:#1a1a1a}.header-inner,.footer-inner,.pre-footer-inner{width:auto;margin:auto;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.footer-inner,.pre-footer-inner{max-width:1020px}#header{padding:0 20px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;z-index:1000;top:0;left:0;width:100%;line-height:1em;background-color:#212121;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;position:relative}#header a{text-decoration:none}#header #siteTitle{position:relative;z-index:1000}.header-inner,.footer-inner,.pre-footer-inner .sqs-layout{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.header-inner{padding:20px 0;display:table;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-animation:header-anim 1s ease-in-out;animation:header-anim 1s ease-in-out}.footer-inner{padding:64px 32px}.pre-footer-inner .sqs-layout{padding:32px}.pre-footer-inner .sqs-layout.empty{padding:0 32px}body:not(.sqs-edit-mode) .pre-footer-inner .sqs-layout.empty{max-height:0}.transparent-header #header{background-color:transparent;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;position:absolute}body:not(.has-banner-image).transparent-header #header,.collection-type-gallery.has-banner-image.transparent-header #header{background-color:#212121;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;position:relative}#preFooter{background-color:#fff;-moz-osx-font-smoothing:auto;-webkit-font-smoothing:subpixel-antialiased}#preFooter{color:rgba(255,255,255,.7)}#preFooter h1,#preFooter h2,#preFooter h3{color:rgba(255,255,255,.7)}.pre-footer-inner{-webkit-transition:all .25s ease-in-out .1s;-moz-transition:all .25s ease-in-out .1s;-ms-transition:all .25s ease-in-out .1s;-o-transition:all .25s ease-in-out .1s;transition:all .25s ease-in-out .1s}.pre-footer-inner a:not(.sqs-block-button-element):not(.sqs-svg-icon--wrapper),.pre-footer-inner a:visited:not(.sqs-block-button-element):not(.sqs-svg-icon--wrapper){color:rgba(255,255,255,.7);border-bottom:1px solid rgba(255,255,255,.7)}.pre-footer-inner .social-account-list a,.pre-footer-inner .social-account-list a:visited{text-decoration:none;border:none}.unscrolled .pre-footer-inner{opacity:0;-webkit-transform:translate3d(0,12px,0);-moz-transform:translate3d(0,12px,0);-ms-transform:translate3d(0,12px,0);-o-transform:translate3d(0,12px,0);transform:translate3d(0,12px,0)}#footer{background-color:#29292d;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}#footer .html-block a,#footer .html-block a:visited{color:rgba(255,255,255,.8);border-bottom:1px solid rgba(255,255,255,.8)}#footer nav:not(.social-account-list){font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:14px;letter-spacing:1px;font-family:\"proxima-nova\";font-size:13px;text-transform:uppercase;text-decoration:none;letter-spacing:2px;font-weight:400;font-style:normal}#footer nav:not(.social-account-list) a,#footer nav:not(.social-account-list) a:visited,#footer nav:not(.social-account-list) label{text-decoration:none;line-height:1.25em;color:#fff;border:none}#footer nav:not(.social-account-list) a.active,#footer nav:not(.social-account-list) a:visited.active,#footer nav:not(.social-account-list) label.active,#footer nav:not(.social-account-list) a:hover,#footer nav:not(.social-account-list) a:visited:hover,#footer nav:not(.social-account-list) label:hover{color:#fff}#footer .folder .subnav{background-color:#29292d}#footer{color:rgba(255,255,255,.8)}#footer h1,#footer h2,#footer h3{color:rgba(255,255,255,.8)}#page{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;width:auto;margin:auto;max-width:1020px;padding:96px 32px;-moz-osx-font-smoothing:auto;-webkit-font-smoothing:subpixel-antialiased}#content{width:100%;display:block}.collection-type-page #content{margin:auto}#folderNav,#categoryNav,#rightSidebar{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;width:26.5625%;width:calc(255px - 0%);display:inline-block;vertical-align:top}#folderNav,#categoryNav{padding-right:64px}li.filter{display:none;visibility:hidden}#rightSidebar{padding-left:64px;font-size:.85em}.collection-type-blog #content{width:73.4375%;width:calc(100% - 255px);display:inline-block;vertical-align:top}.collection-type-page:not(.hide-page-sidebar) #folderNav+#content,.collection-type-products:not(.hide-products-sidebar) #folderNav+#content,.collection-type-page:not(.hide-page-sidebar) #categoryNav+#content,.collection-type-products:not(.hide-products-sidebar) #categoryNav+#content{width:73.4375%;width:calc(100% - 255px);display:inline-block;vertical-align:top}@media only screen and (min-width:641px){#header{width:100%}#header #logoWrapper,#header #siteTitleWrapper,#header #headerNav{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;display:table-cell;vertical-align:middle}#header #mainNavWrapper{position:relative;z-index:1000}#header #headerNav{text-align:right}#header #logoWrapper,#header #logoImage{width:140px}#header #siteTitleWrapper,#header #siteTitle{width:165px}#header.tweaking #logoWrapper,#header.tweaking #siteTitleWrapper,#header.tweaking #mainNavWrapper{border:1px solid #14aaff}}#logoImage{margin:0;font-size:0;max-width:100%}#logoImage a{display:block}#logoImage img{height:auto;max-height:100px;width:auto;max-width:100%}#siteTitle,#siteTitle a{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:600;font-size:20px;letter-spacing:2px;text-transform:uppercase;font-family:\"proxima-nova\";font-size:27px;text-transform:none;letter-spacing:0px;font-weight:300;font-style:normal;color:#1fd699;margin:0;padding-top:0;padding-bottom:0;line-height:1em}.hide-page-sidebar #folderNav{display:none}.hide-page-sidebar #folderNav+#content{display:block}.hide-products-sidebar #categoryNav{display:none}.hide-products-sidebar #categoryNav+#content{display:block}.hide-sidebar-title .category-nav .nav-section-label,.hide-sidebar-title .folder-nav .nav-section-label{display:none}.collection-type-page.has-promoted-gallery #promotedGalleryWrapper .sqs-block,.collection-type-index.has-promoted-gallery #promotedGalleryWrapper .sqs-block,.collection-type-page.has-promoted-gallery .promoted-gallery-wrapper .sqs-block,.collection-type-index.has-promoted-gallery .promoted-gallery-wrapper .sqs-block{padding:0 !important}.collection-type-page.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow,.collection-type-index.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow,.collection-type-page.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow,.collection-type-index.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow{width:100%;height:600px !important;max-width:100%;margin:0;padding:0;opacity:1}.collection-type-page.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-index.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-page.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-index.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .sqs-gallery{width:100%;height:600px !important;max-width:100%}.collection-type-page.has-promoted-gallery.transparent-header #promotedGalleryWrapper .sqs-gallery-block-slideshow,.collection-type-index.has-promoted-gallery.transparent-header #promotedGalleryWrapper .sqs-gallery-block-slideshow,.collection-type-page.has-promoted-gallery.transparent-header .promoted-gallery-wrapper .sqs-gallery-block-slideshow,.collection-type-index.has-promoted-gallery.transparent-header .promoted-gallery-wrapper .sqs-gallery-block-slideshow{height:700px !important}.collection-type-page.has-promoted-gallery.transparent-header #promotedGalleryWrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-index.has-promoted-gallery.transparent-header #promotedGalleryWrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-page.has-promoted-gallery.transparent-header .promoted-gallery-wrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-index.has-promoted-gallery.transparent-header .promoted-gallery-wrapper .sqs-gallery-block-slideshow .sqs-gallery{height:700px !important}.collection-type-page.has-promoted-gallery.collection-type-index.transparent-header .index-section:not(:first-of-type) #promotedGalleryWrapper .sqs-gallery-block-slideshow,.collection-type-index.has-promoted-gallery.collection-type-index.transparent-header .index-section:not(:first-of-type) #promotedGalleryWrapper .sqs-gallery-block-slideshow,.collection-type-page.has-promoted-gallery.collection-type-index.transparent-header .index-section:not(:first-of-type) .promoted-gallery-wrapper .sqs-gallery-block-slideshow,.collection-type-index.has-promoted-gallery.collection-type-index.transparent-header .index-section:not(:first-of-type) .promoted-gallery-wrapper .sqs-gallery-block-slideshow{height:600px !important}.collection-type-page.has-promoted-gallery.collection-type-index.transparent-header .index-section:not(:first-of-type) #promotedGalleryWrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-index.has-promoted-gallery.collection-type-index.transparent-header .index-section:not(:first-of-type) #promotedGalleryWrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-page.has-promoted-gallery.collection-type-index.transparent-header .index-section:not(:first-of-type) .promoted-gallery-wrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-index.has-promoted-gallery.collection-type-index.transparent-header .index-section:not(:first-of-type) .promoted-gallery-wrapper .sqs-gallery-block-slideshow .sqs-gallery{height:600px !important}.collection-type-page.has-promoted-gallery.loading #promotedGalleryWrapper .sqs-gallery-block-slideshow,.collection-type-index.has-promoted-gallery.loading #promotedGalleryWrapper .sqs-gallery-block-slideshow,.collection-type-page.has-promoted-gallery.loading .promoted-gallery-wrapper .sqs-gallery-block-slideshow,.collection-type-index.has-promoted-gallery.loading .promoted-gallery-wrapper .sqs-gallery-block-slideshow{opacity:0}.collection-type-page.has-promoted-gallery .banner-thumbnail-wrapper,.collection-type-index.has-promoted-gallery .promoted-full~.banner-thumbnail-wrapper{display:none}.collection-type-page.has-promoted-gallery .sqs-gallery-meta-container .sqs-gallery-controls .previous,.collection-type-index.has-promoted-gallery .sqs-gallery-meta-container .sqs-gallery-controls .previous,.collection-type-page.has-promoted-gallery .sqs-gallery-meta-container .sqs-gallery-controls .next,.collection-type-index.has-promoted-gallery .sqs-gallery-meta-container .sqs-gallery-controls .next{background-color:transparent}.collection-type-page.has-promoted-gallery .sqs-gallery-meta-container .sqs-gallery-controls .previous:hover,.collection-type-index.has-promoted-gallery .sqs-gallery-meta-container .sqs-gallery-controls .previous:hover,.collection-type-page.has-promoted-gallery .sqs-gallery-meta-container .sqs-gallery-controls .next:hover,.collection-type-index.has-promoted-gallery .sqs-gallery-meta-container .sqs-gallery-controls .next:hover{background-color:transparent}.banner-slideshow-controls-none .sqs-gallery-meta-container .sqs-gallery-controls .previous,.banner-slideshow-controls-none .sqs-gallery-meta-container .sqs-gallery-controls .next{display:none}.collection-type-page.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-thumbnails,.collection-type-index.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-thumbnails,.collection-type-page.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-thumbnails,.collection-type-index.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-thumbnails{display:none;height:0;padding:0;margin:0}.has-promoted-gallery .promoted-gallery-wrapper [data-type=\"video\"] .meta{display:none}.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-bottom .meta,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-bottom .meta,.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-top .meta,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-top .meta,.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-top-left .meta,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-top-left .meta,.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-center .meta,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-center .meta,.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-bottom-left .meta,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-bottom-left .meta,.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-bottom-right .meta,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-bottom-right .meta,.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-top-right .meta,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-top-right .meta{left:50% !important;top:50% !important;-webkit-transform:translate(-50%,-45%) !important;-moz-transform:translate(-50%,-45%) !important;-ms-transform:translate(-50%,-45%) !important;-o-transform:translate(-50%,-45%) !important;transform:translate(-50%,-45%) !important;-webkit-transition:all .25s ease-in-out .3s;-moz-transition:all .25s ease-in-out .3s;-ms-transition:all .25s ease-in-out .3s;-o-transition:all .25s ease-in-out .3s;transition:all .25s ease-in-out .3s;opacity:0;margin:0 !important}.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-bottom .sqs-active-slide.loaded .meta,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-bottom .sqs-active-slide.loaded .meta,.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-top .sqs-active-slide.loaded .meta,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-top .sqs-active-slide.loaded .meta,.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-top-left .sqs-active-slide.loaded .meta,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-top-left .sqs-active-slide.loaded .meta,.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-center .sqs-active-slide.loaded .meta,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-center .sqs-active-slide.loaded .meta,.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-bottom-left .sqs-active-slide.loaded .meta,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-bottom-left .sqs-active-slide.loaded .meta,.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-bottom-right .sqs-active-slide.loaded .meta,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-bottom-right .sqs-active-slide.loaded .meta,.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-top-right .sqs-active-slide.loaded .meta,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow.sqs-gallery-block-meta-position-top-right .sqs-active-slide.loaded .meta{-webkit-transform:translate(-50%,-50%) !important;-moz-transform:translate(-50%,-50%) !important;-ms-transform:translate(-50%,-50%) !important;-o-transform:translate(-50%,-50%) !important;transform:translate(-50%,-50%) !important;opacity:1}.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .hide-body-text .meta .meta-description p,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .hide-body-text .meta .meta-description p{width:100%;visibility:hidden;line-height:0 !important;margin:0 auto}.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .hide-body-text .meta .meta-description p:first-child>strong,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .hide-body-text .meta .meta-description p:first-child>strong{margin-top:0 !important}.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .hide-body-text .meta .meta-description p>strong,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .hide-body-text .meta .meta-description p>strong,.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .hide-body-text .meta .meta-description p>em>strong,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .hide-body-text .meta .meta-description p>em>strong{visibility:visible;line-height:1em !important;margin:20px auto}.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .hide-body-text .meta .meta-description p>em>strong,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .hide-body-text .meta .meta-description p>em>strong{font-style:italic}.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .hide-body-text .meta .meta-description p:last-child>a,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .hide-body-text .meta .meta-description p:last-child>a{visibility:visible;line-height:1em !important}.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta{text-align:center;background-color:transparent !important;background:none !important;margin:0;z-index:100;height:auto !important;overflow-y:visible !important;text-rendering:optimizeLegibility}.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta .meta-inside,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta .meta-inside{padding:0 32px}.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta .meta-title,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta .meta-title{display:none;margin:0;padding:0}.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta .meta-description p,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta .meta-description p{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:18px;letter-spacing:0px;line-height:1.5em;font-family:\"camingodos-web\";font-size:49px;line-height:1em;text-transform:none;letter-spacing:1px;font-weight:400;font-style:normal;color:#fff;margin:20px auto;width:700px !important}.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta .meta-description p>strong,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta .meta-description p>strong,.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta .meta-description p>em>strong,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta .meta-description p>em>strong{display:block;font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:400;font-size:48px;letter-spacing:0px;font-family:\"adelle-sans\";font-size:41px;line-height:1em;text-transform:none;letter-spacing:4px;font-weight:100;font-style:normal;color:#fff}.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta .meta-description p>em>strong,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta .meta-description p>em>strong{font-style:italic}.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta .meta-description p:last-child>a,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta .meta-description p:last-child>a{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:16px;letter-spacing:1px;font-family:\"proxima-nova\";font-size:20px;text-transform:uppercase;letter-spacing:2px;font-weight:700;font-style:normal;text-decoration:none;padding:1em 1.75em;display:inline-block;line-height:1em;margin:10px auto;color:#29292d}.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta .meta-description p:last-child>a,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta .meta-description p:last-child>a{background-color:#23c890;-webkit-transition:background-color .1s 0s ease-in-out,color .1s 0s ease-in-out;-moz-transition:background-color .1s 0s ease-in-out,color .1s 0s ease-in-out;-ms-transition:background-color .1s 0s ease-in-out,color .1s 0s ease-in-out;-o-transition:background-color .1s 0s ease-in-out,color .1s 0s ease-in-out;transition:background-color .1s 0s ease-in-out,color .1s 0s ease-in-out}.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta .meta-description p:last-child>a:hover,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta .meta-description p:last-child>a:hover{background-color:rgba(35,200,144,.8)}.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta .meta-description p:empty,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta .meta-description p:empty{display:none}.transparent-header.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta,.transparent-header.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta{padding-top:25px}.collection-type-index.transparent-header.has-promoted-gallery .index-section:not(:first-of-type) #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta,.collection-type-index.transparent-header.has-promoted-gallery .index-section:not(:first-of-type) .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta{padding-top:0}.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta{max-width:100% !important;width:1084px !important;bottom:auto}.sqs-featured-posts-gallery .title-desc-wrapper{max-width:100% !important;width:1084px !important;text-align:center}#promotedGalleryWrapper,.promoted-gallery-wrapper,.banner-thumbnail-wrapper,.sqs-featured-posts-gallery{background-color:#001a16;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}#promotedGalleryWrapper .color-overlay,.promoted-gallery-wrapper .color-overlay,.banner-thumbnail-wrapper .color-overlay,.sqs-featured-posts-gallery .color-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(0,26,22,.5);z-index:99}.collection-type-blog .no-main-image .color-overlay{background-color:#001a16}.banner-thumbnail-wrapper{position:relative;overflow:hidden;min-height:320px;width:100%}.view-list .banner-thumbnail-wrapper,.collection-type-page .banner-thumbnail-wrapper,.collection-type-index .banner-thumbnail-wrapper{min-height:0;padding:130px 0}.transparent-header.view-list .banner-thumbnail-wrapper,.transparent-header.collection-type-page .banner-thumbnail-wrapper{padding:180px 0 155px}.collection-type-index.transparent-header.view-list .index-section:not(:first-of-type) .banner-thumbnail-wrapper,.collection-type-index.transparent-header.collection-type-page .index-section:not(:first-of-type) .banner-thumbnail-wrapper{padding:130px 0}#thumbnail{position:absolute;top:0;left:0;bottom:0;right:0;-webkit-animation:feature-bg-anim .6s ease-in-out;animation:feature-bg-anim .6s ease-in-out}.desc-wrapper{-webkit-animation:feature-text-anim .75s ease-in-out;animation:feature-text-anim .75s ease-in-out;z-index:100;position:relative;width:100%;max-width:956px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0 auto;padding:32px;text-align:center;text-rendering:optimizeLegibility}.desc-wrapper p{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:18px;letter-spacing:0px;line-height:1.5em;font-family:\"camingodos-web\";font-size:49px;line-height:1em;text-transform:none;letter-spacing:1px;font-weight:400;font-style:normal;color:#fff;margin:20px auto;-webkit-transform:translatez(0)}.desc-wrapper p a{color:#fff;border-bottom:1px solid #fff}.desc-wrapper p>strong,.desc-wrapper p>em>strong{display:block;font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:400;font-size:48px;letter-spacing:0px;font-family:\"adelle-sans\";font-size:41px;line-height:1em;text-transform:none;letter-spacing:4px;font-weight:100;font-style:normal;color:#fff}.desc-wrapper p>em>strong{font-style:italic}.desc-wrapper p:last-child>a{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:16px;letter-spacing:1px;font-family:\"proxima-nova\";font-size:20px;text-transform:uppercase;letter-spacing:2px;font-weight:700;font-style:normal;text-decoration:none;padding:1em 1.75em;background-color:#23c890;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;line-height:1em;margin:10px 0;color:#29292d;border:none;-webkit-transition:background-color .1s 0s ease-in-out,color .1s 0s ease-in-out;-moz-transition:background-color .1s 0s ease-in-out,color .1s 0s ease-in-out;-ms-transition:background-color .1s 0s ease-in-out,color .1s 0s ease-in-out;-o-transition:background-color .1s 0s ease-in-out,color .1s 0s ease-in-out;transition:background-color .1s 0s ease-in-out,color .1s 0s ease-in-out}.desc-wrapper p:last-child>a:hover{background-color:rgba(35,200,144,.8)}.desc-wrapper p:last-child>a+a{margin-left:1em}.desc-wrapper p:empty{display:none}body:not(.collection-type-gallery).banner-button-style-outline .desc-wrapper p:last-child>a,body:not(.collection-type-gallery).banner-button-style-outline.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta-description p:last-child>a,body:not(.collection-type-gallery).banner-button-style-outline.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta-description p:last-child>a{background-color:transparent;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;border:2px solid #23c890 !important;color:#23c890}body:not(.collection-type-gallery).banner-button-style-outline .desc-wrapper p:last-child>a:hover,body:not(.collection-type-gallery).banner-button-style-outline.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta-description p:last-child>a:hover,body:not(.collection-type-gallery).banner-button-style-outline.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta-description p:last-child>a:hover{background-color:#23c890;color:#181818;color:#efefef}body:not(.collection-type-gallery).banner-button-style-raised .desc-wrapper p:last-child>a,body:not(.collection-type-gallery).banner-button-style-raised.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta-description p:last-child>a,body:not(.collection-type-gallery).banner-button-style-raised.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta-description p:last-child>a{-webkit-box-shadow:0px .2em 0px 0px #1da577;-moz-box-shadow:0px .2em 0px 0px #1da577;box-shadow:0px .2em 0px 0px #1da577}body:not(.collection-type-gallery).banner-button-style-raised .desc-wrapper p:last-child>a:hover,body:not(.collection-type-gallery).banner-button-style-raised.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta-description p:last-child>a:hover,body:not(.collection-type-gallery).banner-button-style-raised.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta-description p:last-child>a:hover{background-color:#25d599}body:not(.collection-type-gallery).banner-button-corner-style-rounded .desc-wrapper p:last-child>a,body:not(.collection-type-gallery).banner-button-corner-style-rounded.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta-description p:last-child>a,body:not(.collection-type-gallery).banner-button-corner-style-rounded.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta-description p:last-child>a{-webkit-border-radius:3px;border-radius:3px}body:not(.collection-type-gallery).banner-button-corner-style-pill .desc-wrapper p:last-child>a,body:not(.collection-type-gallery).banner-button-corner-style-pill.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta-description p:last-child>a,body:not(.collection-type-gallery).banner-button-corner-style-pill.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta-description p:last-child>a{-webkit-border-radius:300px;border-radius:300px}#headerNav nav a,#sidecarNav nav a,#headerNav nav a:visited,#sidecarNav nav a:visited,#headerNav nav label,#sidecarNav nav label{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:1px;font-family:\"proxima-nova\";font-size:14px;text-transform:uppercase;text-decoration:none;letter-spacing:2px;font-weight:700;font-style:normal;line-height:1em;color:#fff}#headerNav nav a:hover,#sidecarNav nav a:hover,#headerNav nav a:visited:hover,#sidecarNav nav a:visited:hover,#headerNav nav label:hover,#sidecarNav nav label:hover{color:#1fd699}#headerNav nav .active>a,#sidecarNav nav .active>a,#headerNav nav .active>a:visited,#sidecarNav nav .active>a:visited,#headerNav nav .active>label,#sidecarNav nav .active>label{color:#1fd699}#headerNav nav .subnav,#sidecarNav nav .subnav{background-color:#212121}@media only screen and (min-width:641px){.show-on-scroll-wrapper #header{position:fixed !important;top:-20px;left:0;width:100%;visibility:hidden;opacity:0;background-color:#212121;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition:opacity .14s ease-in-out,visibility 0s .14s linear,top .14s ease-in-out;-moz-transition:opacity .14s ease-in-out,visibility 0s .14s linear,top .14s ease-in-out;-ms-transition:opacity .14s ease-in-out,visibility 0s .14s linear,top .14s ease-in-out;-o-transition:opacity .14s ease-in-out,visibility 0s .14s linear,top .14s ease-in-out;transition:opacity .14s ease-in-out,visibility 0s .14s linear,top .14s ease-in-out}.show-on-scroll-wrapper.show #header{top:0;visibility:visible;opacity:1;-webkit-transition:opacity .14s ease-in-out,visibility 0s 0s linear,top .14s ease-in-out;-moz-transition:opacity .14s ease-in-out,visibility 0s 0s linear,top .14s ease-in-out;-ms-transition:opacity .14s ease-in-out,visibility 0s 0s linear,top .14s ease-in-out;-o-transition:opacity .14s ease-in-out,visibility 0s 0s linear,top .14s ease-in-out;transition:opacity .14s ease-in-out,visibility 0s 0s linear,top .14s ease-in-out}body:not(.force-mobile-nav) #headerNav{white-space:nowrap}body:not(.force-mobile-nav) .nav-wrapper{position:relative}body:not(.force-mobile-nav) .nav-wrapper nav>div{display:inline-block;vertical-align:middle;margin:0}body:not(.force-mobile-nav) .nav-wrapper nav>div a,body:not(.force-mobile-nav) .nav-wrapper nav>div label{-webkit-transition:color .1s 0s ease-in-out;-moz-transition:color .1s 0s ease-in-out;-ms-transition:color .1s 0s ease-in-out;-o-transition:color .1s 0s ease-in-out;transition:color .1s 0s ease-in-out}body:not(.force-mobile-nav) .nav-wrapper nav>div>a,body:not(.force-mobile-nav) .nav-wrapper nav>div label{display:block;padding:.75em 1em}body:not(.force-mobile-nav) .nav-wrapper nav>div:last-child>a,body:not(.force-mobile-nav) .nav-wrapper nav>div:last-child label{padding-right:0}body:not(.force-mobile-nav) .nav-wrapper#headerNav{text-align:right}body:not(.force-mobile-nav) #secondaryNavWrapper.nav-wrapper .folder .subnav{top:auto;bottom:100%;-webkit-transform-origin:0 100%;-moz-transform-origin:0 100%;-ms-transform-origin:0 100%;-o-transform-origin:0 100%;transform-origin:0 100%}html:not(.touch-styles) body:not(.force-mobile-nav) .nav-wrapper .folder .subnav{text-align:left;padding:1em 0;display:inline-block;position:absolute;top:100%;left:-.5em;z-index:1000;font-size:14px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;white-space:nowrap;-webkit-transform:scale(1,0);-moz-transform:scale(1,0);-ms-transform:scale(1,0);-o-transform:scale(1,0);transform:scale(1,0);-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;-o-transform-origin:0 0;transform-origin:0 0;-webkit-transition:-webkit-transform .14s 0s ease-in-out;-moz-transition:-moz-transform .14s 0s ease-in-out;-ms-transition:-ms-transform .14s 0s ease-in-out;-o-transition:-o-transform .14s 0s ease-in-out;transition:transform .14s 0s ease-in-out}html:not(.touch-styles) body:not(.force-mobile-nav) .nav-wrapper .folder .subnav>div{opacity:0;padding:0;-webkit-transition:opacity .05s 0s ease-in-out;-moz-transition:opacity .05s 0s ease-in-out;-ms-transition:opacity .05s 0s ease-in-out;-o-transition:opacity .05s 0s ease-in-out;transition:opacity .05s 0s ease-in-out}html:not(.touch-styles) body:not(.force-mobile-nav) .nav-wrapper .folder .subnav>div a{display:block;padding:.5em 1.5em;-webkit-transform:translatez(0);-moz-transform:translatez(0);-ms-transform:translatez(0);-o-transform:translatez(0);transform:translatez(0)}html:not(.touch-styles) body:not(.force-mobile-nav) .nav-wrapper .folder .subnav.right{left:auto;right:-.5em}html:not(.touch-styles) body:not(.force-mobile-nav) .nav-wrapper .folder:hover .subnav{-webkit-transform:scale(1,1);-moz-transform:scale(1,1);-ms-transform:scale(1,1);-o-transform:scale(1,1);transform:scale(1,1)}html:not(.touch-styles) body:not(.force-mobile-nav) .nav-wrapper .folder:hover .subnav>div{opacity:1;-webkit-transition:opacity .14s .14s ease-in-out;-moz-transition:opacity .14s .14s ease-in-out;-ms-transition:opacity .14s .14s ease-in-out;-o-transition:opacity .14s .14s ease-in-out;transition:opacity .14s .14s ease-in-out}html:not(.touch-styles) body:not(.force-mobile-nav) #siteWrapper .nav-wrapper .folder:last-child .subnav{text-align:right;right:-1.5em;left:auto}}#sidecarNav .folder label:before{content:'+';padding-right:.25em;width:.75em;display:inline-block}#sidecarNav .folder .folder-toggle-box:checked~label:before{content:'–'}.touch-styles .folder{position:relative}.touch-styles .folder-toggle-label~.subnav{height:0;max-height:0;overflow:hidden;padding:0 1.5em 0;font-size:14px;text-align:left}.touch-styles .folder-toggle-label~.subnav>div{padding:1em 0 0}.touch-styles .folder-toggle-box:checked~.subnav{height:auto;max-height:999px;padding:0 1em 1em}.touch-styles #header .folder-toggle-label~.subnav{position:absolute;left:0}.touch-styles #header .folder:last-child .subnav{text-align:right;right:-1em;left:auto}.force-mobile-nav #sidecarNav .folder-toggle-label~.subnav{height:0;max-height:0;overflow:hidden;padding:0 1.5em;font-size:14px}.force-mobile-nav #sidecarNav .folder-toggle-label~.subnav>div{padding:.5em 0}.force-mobile-nav #sidecarNav .folder-toggle-box:checked~.subnav{height:auto;max-height:999px;padding:0 1em 1em}.force-mobile-nav #secondaryNavWrapper.nav-wrapper{position:relative}.force-mobile-nav #secondaryNavWrapper.nav-wrapper nav>div{display:inline-block;vertical-align:middle;margin:0}.force-mobile-nav #secondaryNavWrapper.nav-wrapper nav>div>a,.force-mobile-nav #secondaryNavWrapper.nav-wrapper nav>div label{display:block;padding:.75em 1em}.force-mobile-nav #secondaryNavWrapper.nav-wrapper nav>div:first-child>a,.force-mobile-nav #secondaryNavWrapper.nav-wrapper nav>div:first-child label{padding-left:0}.force-mobile-nav #secondaryNavWrapper.nav-wrapper .folder .subnav{display:inline-block;position:absolute;top:auto;bottom:100%;left:-.5em;z-index:1000;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;white-space:nowrap;-webkit-transform-origin:0 100%;-moz-transform-origin:0 100%;-ms-transform-origin:0 100%;-o-transform-origin:0 100%;transform-origin:0 100%;text-align:left;padding:1em 0;-webkit-transform:scale(1,0);-moz-transform:scale(1,0);-ms-transform:scale(1,0);-o-transform:scale(1,0);transform:scale(1,0);-webkit-transition:-webkit-transform .14s 0s ease-in-out;-moz-transition:-moz-transform .14s 0s ease-in-out;-ms-transition:-ms-transform .14s 0s ease-in-out;-o-transition:-o-transform .14s 0s ease-in-out;transition:transform .14s 0s ease-in-out}.force-mobile-nav #secondaryNavWrapper.nav-wrapper .folder .subnav>div{opacity:0;padding:0;-webkit-transition:opacity .05s 0s ease-in-out;-moz-transition:opacity .05s 0s ease-in-out;-ms-transition:opacity .05s 0s ease-in-out;-o-transition:opacity .05s 0s ease-in-out;transition:opacity .05s 0s ease-in-out}.force-mobile-nav #secondaryNavWrapper.nav-wrapper .folder .subnav>div a{display:block;padding:.5em 1.5em;-webkit-transform:translatez(0);-moz-transform:translatez(0);-ms-transform:translatez(0);-o-transform:translatez(0);transform:translatez(0)}.force-mobile-nav #secondaryNavWrapper.nav-wrapper .folder:last-child .subnav{text-align:right;right:-.5em;left:auto}.force-mobile-nav #secondaryNavWrapper.nav-wrapper .folder:hover .subnav{-webkit-transform:scale(1,1);-moz-transform:scale(1,1);-ms-transform:scale(1,1);-o-transform:scale(1,1);transform:scale(1,1)}.force-mobile-nav #secondaryNavWrapper.nav-wrapper .folder:hover .subnav>div{opacity:1;-webkit-transition:opacity .14s .14s ease-in-out;-moz-transition:opacity .14s .14s ease-in-out;-ms-transition:opacity .14s .14s ease-in-out;-o-transition:opacity .14s .14s ease-in-out;transition:opacity .14s .14s ease-in-out}.folder{position:relative}.folder-toggle-label{cursor:pointer}body{-webkit-animation:bugfix infinite 1s}@-webkit-keyframes bugfix{from{padding:0}to{padding:0}}#mobileNavToggle:checked~.body-overlay{position:absolute;top:0;bottom:0;left:0;right:0;z-index:9999;cursor:e-resize;-webkit-transform:translatex(-260px) translatez(0);-moz-transform:translatex(-260px) translatez(0);-ms-transform:translatex(-260px) translatez(0);-o-transform:translatex(-260px) translatez(0);transform:translatex(-260px) translatez(0)}#sidecarNav{position:fixed;width:260px;z-index:-1;top:0;right:0;bottom:0;height:100%;line-height:1em;text-align:left;overflow:auto;visibility:hidden;background-color:#212121;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition:height 0s .14s linear,visibility 0s .14s linear;-moz-transition:height 0s .14s linear,visibility 0s .14s linear;-ms-transition:height 0s .14s linear,visibility 0s .14s linear;-o-transition:height 0s .14s linear,visibility 0s .14s linear;transition:height 0s .14s linear,visibility 0s .14s linear}#sidecarNav nav{padding:24px 36px 72px}#sidecarNav nav div{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#sidecarNav nav div a,#sidecarNav nav div label{display:block;padding:.75em 0}#sidecarNav nav div .subnav>div a{padding:0 0 .5em}#sidecarNav nav div .subnav>div:last-child a{padding-bottom:1em}.force-mobile-nav #header #headerNav{display:none}.force-mobile-nav #sidecarNav .site-title{vertical-align:middle}.force-mobile-nav .mobile-nav-toggle-label{display:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;z-index:100;width:10%;position:absolute;z-index:1002;top:50%;right:20px;margin-top:-8px;padding:0;vertical-align:middle;line-height:16px;text-align:right;cursor:pointer;user-select:none;color:#fff;width:22px;height:22px}.force-mobile-nav .mobile-nav-toggle-label .top-bar,.force-mobile-nav .mobile-nav-toggle-label .middle-bar,.force-mobile-nav .mobile-nav-toggle-label .bottom-bar{width:22px;height:2px;background-color:#fff;-webkit-transition:-webkit-transform .1s 0s ease-in-out,top .1s .1s ease-in-out;-moz-transition:-moz-transform .1s 0s ease-in-out,top .1s .1s ease-in-out;-ms-transition:-ms-transform .1s 0s ease-in-out,top .1s .1s ease-in-out;-o-transition:-o-transform .1s 0s ease-in-out,top .1s .1s ease-in-out;transition:transform .1s 0s ease-in-out,top .1s .1s ease-in-out;-webkit-transform-origin:50% 50%;-moz-transform-origin:50% 50%;-ms-transform-origin:50% 50%;-o-transform-origin:50% 50%;transform-origin:50% 50%;position:absolute;top:0;right:0}.force-mobile-nav .mobile-nav-toggle-label .middle-bar{-webkit-transition:opacity 0s .15s linear;-moz-transition:opacity 0s .15s linear;-ms-transition:opacity 0s .15s linear;-o-transition:opacity 0s .15s linear;transition:opacity 0s .15s linear;top:7px}.force-mobile-nav .mobile-nav-toggle-label .bottom-bar{top:14px}.force-mobile-nav #mainNavWrapper{display:block;position:fixed;width:260px;z-index:-1;top:0;right:0;bottom:0;height:100%;line-height:1em;text-align:left;overflow:auto;background-color:#212121;-webkit-overflow-scrolling:touch;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transform:translate3d(260px,0,0);-moz-transform:translate3d(260px,0,0);-ms-transform:translate3d(260px,0,0);-o-transform:translate3d(260px,0,0);transform:translate3d(260px,0,0);-webkit-transition:-webkit-transform 0s 0s ease-in-out;-moz-transition:-moz-transform 0s 0s ease-in-out;-ms-transition:-ms-transform 0s 0s ease-in-out;-o-transition:-o-transform 0s 0s ease-in-out;transition:transform 0s 0s ease-in-out}.force-mobile-nav #mainNavWrapper nav{padding:32px 40px;display:none}.force-mobile-nav #mainNavWrapper nav div{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.force-mobile-nav #mainNavWrapper nav div a,.force-mobile-nav #mainNavWrapper nav div label{display:block;padding:.75em 0}.force-mobile-nav #mainNavWrapper nav div .subnav>div a{padding:0 0 .5em}.force-mobile-nav #mainNavWrapper nav div .subnav>div:last-child a{padding-bottom:1em}.force-mobile-nav #siteWrapper{width:100%;-webkit-transition:-webkit-transform .2s ease-in-out;-moz-transition:-moz-transform .2s ease-in-out;-ms-transition:-ms-transform .2s ease-in-out;-o-transition:-o-transform .2s ease-in-out;transition:transform .2s ease-in-out}.force-mobile-nav #mobileNavToggle:checked~#siteWrapper{position:fixed;-webkit-transform:translatex(-260px);-webkit-transform:translate3d(-260px,0,0);-moz-transform:translatex(-260px) translatez(0);-moz-transform:translate3d(-260px,0,0);-ms-transform:translatex(-260px) translatez(0);-ms-transform:translate3d(-260px,0,0);-o-transform:translatex(-260px) translatez(0);-o-transform:translate3d(-260px,0,0);transform:translatex(-260px) translatez(0);transform:translate3d(-260px,0,0)}.force-mobile-nav #mobileNavToggle:checked~#siteWrapper .mobile-nav-toggle-label .top-bar,.force-mobile-nav #mobileNavToggle:checked~#siteWrapper .mobile-nav-toggle-label .bottom-bar{-webkit-transition:top .1s .1s ease-in-out,-webkit-transform .1s .2s ease-in-out;-moz-transition:top .1s .1s ease-in-out,-moz-transform .1s .2s ease-in-out;-ms-transition:top .1s .1s ease-in-out,-ms-transform .1s .2s ease-in-out;-o-transition:top .1s .1s ease-in-out,-o-transform .1s .2s ease-in-out;transition:top .1s .1s ease-in-out,transform .1s .2s ease-in-out}.force-mobile-nav #mobileNavToggle:checked~#siteWrapper .mobile-nav-toggle-label .top-bar{-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);top:7px}.force-mobile-nav #mobileNavToggle:checked~#siteWrapper .mobile-nav-toggle-label .middle-bar{opacity:0}.force-mobile-nav #mobileNavToggle:checked~#siteWrapper .mobile-nav-toggle-label .bottom-bar{-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg);top:7px}.force-mobile-nav #mobileNavToggle:checked~#sidecarNav{height:100%;visibility:visible;-webkit-transition:height 0s .14s linear,visibility 0s 0s linear;-moz-transition:height 0s .14s linear,visibility 0s 0s linear;-ms-transition:height 0s .14s linear,visibility 0s 0s linear;-o-transition:height 0s .14s linear,visibility 0s 0s linear;transition:height 0s .14s linear,visibility 0s 0s linear}.force-mobile-nav.enable-nav-button #sidecarNav nav>div:not(.folder):last-child a{display:inline-block;margin:1em 0 0 0;line-height:1;padding:1em 1.5em}.force-mobile-nav .folder-toggle-box:checked~.subnav{padding:.25em 0 .5em}@media only screen and (min-width:641px){.sqs-style-mode.dialog-open.force-mobile-nav #mobileNavToggle:checked~#siteWrapper{-webkit-transform:translate3d(-480px,0,0);-moz-transform:translate3d(-480px,0,0);-ms-transform:translate3d(-480px,0,0);-o-transform:translate3d(-480px,0,0);transform:translate3d(-480px,0,0)}}.mobile-nav-toggle-label{display:none}.enable-nav-button #headerNav nav>div:not(.folder):last-child a,.enable-nav-button #sidecarNav nav>div:not(.folder):last-child a{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-family:\"proxima-nova\";text-transform:uppercase;text-decoration:none;letter-spacing:1px;font-weight:700;font-style:normal;margin-left:1em;padding:1em 1.5em !important;display:block;background-color:#23c890;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:#fff;-webkit-transition:background-color .1s 0s ease-in-out,color .1s 0s ease-in-out;-moz-transition:background-color .1s 0s ease-in-out,color .1s 0s ease-in-out;-ms-transition:background-color .1s 0s ease-in-out,color .1s 0s ease-in-out;-o-transition:background-color .1s 0s ease-in-out,color .1s 0s ease-in-out;transition:background-color .1s 0s ease-in-out,color .1s 0s ease-in-out}.enable-nav-button #headerNav nav>div:not(.folder):last-child a:hover,.enable-nav-button #sidecarNav nav>div:not(.folder):last-child a:hover{background-color:rgba(35,200,144,.8)}.nav-button-style-outline.enable-nav-button #headerNav nav>div:not(.folder):last-child a,.nav-button-style-outline.enable-nav-button #sidecarNav nav>div:not(.folder):last-child a{background-color:transparent;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;border:2px solid #23c890;color:#23c890}.nav-button-style-outline.enable-nav-button #headerNav nav>div:not(.folder):last-child a:hover,.nav-button-style-outline.enable-nav-button #sidecarNav nav>div:not(.folder):last-child a:hover{background-color:#23c890;color:#181818;color:#efefef}.nav-button-style-raised.enable-nav-button #headerNav nav>div:not(.folder):last-child a,.nav-button-style-raised.enable-nav-button #sidecarNav nav>div:not(.folder):last-child a{-webkit-box-shadow:0px .2em 0px 0px #1da577;-moz-box-shadow:0px .2em 0px 0px #1da577;box-shadow:0px .2em 0px 0px #1da577}.nav-button-style-raised.enable-nav-button #headerNav nav>div:not(.folder):last-child a:hover,.nav-button-style-raised.enable-nav-button #sidecarNav nav>div:not(.folder):last-child a:hover{background-color:#25d599}.nav-button-corner-style-rounded.enable-nav-button #headerNav nav>div:not(.folder):last-child a,.nav-button-corner-style-rounded.enable-nav-button #sidecarNav nav>div:not(.folder):last-child a{-webkit-border-radius:3px;border-radius:3px}.nav-button-corner-style-pill.enable-nav-button #headerNav nav>div:not(.folder):last-child a,.nav-button-corner-style-pill.enable-nav-button #sidecarNav nav>div:not(.folder):last-child a{-webkit-border-radius:300px;border-radius:300px}.back-to-top-nav{display:none}#secondaryNavWrapper{padding:0 0 1.5em;z-index:3;position:relative;line-height:1.25em;right:auto}#secondaryNavWrapper nav>div:first-child>a,#secondaryNavWrapper nav>div:first-child label{padding-left:0}#siteInfo{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:1px;font-family:\"proxima-nova\";font-size:14px;text-transform:uppercase;text-decoration:none;letter-spacing:2px;font-weight:400;font-style:normal;color:rgba(255,255,255,.8)}#siteInfo a,#siteInfo a:visited{color:rgba(255,255,255,.8)}.site-phone,.site-email{white-space:nowrap}.site-address+.site-phone,.site-address+.site-email,.site-phone+.site-email{margin-left:1em}.center-navigation--info #secondaryNavWrapper{text-align:center;left:auto}.center-navigation--info #siteInfo{text-align:center}.hide-site-info #siteInfo{display:none}#footerBlocks:not(.empty){margin-top:1.5em}.folder-nav-toggle-label,.category-nav-toggle-label{display:none}.sqs-simple-like{line-height:inherit}.sqs-simple-like .like-count{margin-right:1.2em}.sqs-simple-like .like-count:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e012\";text-align:center;display:inline-block;vertical-align:middle}.sqs-simple-like .like-count:before{font-size:16px;width:16px;height:16px;line-height:16px}.sqs-simple-like .like-count:before{margin-right:.2em;position:relative;top:.13em;font-size:1.2em;width:auto;height:auto;line-height:inherit;text-align:left;vertical-align:initial}.sqs-simple-like .like-icon{display:none}.ss-social-button:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e02b\";text-align:center;display:inline-block;vertical-align:middle}.ss-social-button:before{font-size:16px;width:16px;height:16px;line-height:16px}.ss-social-button:before{margin-right:.4em;font-size:.85em;width:auto;height:auto;line-height:inherit;text-align:left;vertical-align:initial}.ss-social-button div{display:inline-block}.ss-social-button-icon{display:none !important}#indexList figure{width:100%}#indexList figure a{display:block}#indexList figure img{max-width:100%}.embed-block iframe,.embed-block img{max-width:100%}.sqs-block.image-block .image-caption-wrapper p{font-size:.875em;line-height:1.25em}html.touch .squarespace-comments .comments-content .comment-list .comment .comment-header .controls .squarespace-comment-buttons .comment-control{opacity:1}#productList .product .product-title,.no-touch .product-list-titles-overlay #productList .product .product-title{font-size:1.25em;line-height:1.25em;margin-bottom:.75em}#productList .product .product-price,.no-touch .product-list-titles-overlay #productList .product .product-price{font-size:1em;line-height:1.25em;margin-top:.5em;margin-bottom:.75em}.collection-type-gallery.full-width-gallery #page{max-width:100%;padding:32px}.banner-thumbnail-wrapper.sqs-frontend-edit-wrapper.sqs-frontend-outline{outline-offset:0px}.banner-thumbnail-wrapper .sqs-frontend-edit{top:auto !important;bottom:1px !important;right:1px}.sqs-layout:not(.sqs-editing)>.sqs-row:last-child>[class*=sqs-col]>.sqs-block:last-child{padding-bottom:0}.sqs-layout:not(.sqs-editing)>.sqs-row:last-child>[class*=sqs-col]:first-child>.sqs-block:last-child{padding-bottom:0}.sqs-layout:not(.sqs-editing)>.sqs-row:last-child>[class*=sqs-col]:last-child>.sqs-block:last-child{padding-bottom:0}.has-promoted-gallery #promotedGalleryWrapper .reduce-text-size .meta .meta-description p,.has-promoted-gallery .promoted-gallery-wrapper .reduce-text-size .meta .meta-description p{font-size:14px;letter-spacing:2px}.has-promoted-gallery #promotedGalleryWrapper .reduce-text-size .meta .meta-description p>strong,.has-promoted-gallery .promoted-gallery-wrapper .reduce-text-size .meta .meta-description p>strong,.has-promoted-gallery #promotedGalleryWrapper .reduce-text-size .meta .meta-description p>em>strong,.has-promoted-gallery .promoted-gallery-wrapper .reduce-text-size .meta .meta-description p>em>strong{font-size:22px;letter-spacing:2px}.has-promoted-gallery #promotedGalleryWrapper .reduce-text-size .meta .meta-description p:last-child>a,.has-promoted-gallery .promoted-gallery-wrapper .reduce-text-size .meta .meta-description p:last-child>a{font-size:13px;letter-spacing:2px}.sqs-block-summary-v2 .summary-title,.sqs-block-summary-v2 .summary-heading{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;text-transform:uppercase;letter-spacing:1px;font-weight:400;font-style:normal;color:#666}.sqs-block-summary-v2 .summary-title a,.sqs-block-summary-v2 .summary-heading a,.sqs-block-summary-v2 .summary-title a:link,.sqs-block-summary-v2 .summary-heading a:link,.sqs-block-summary-v2 .summary-title a:visited,.sqs-block-summary-v2 .summary-heading a:visited{color:#666}.sqs-block-summary-v2 .summary-title a:hover,.sqs-block-summary-v2 .summary-heading a:hover,.sqs-block-summary-v2 .summary-title a:link:hover,.sqs-block-summary-v2 .summary-heading a:link:hover,.sqs-block-summary-v2 .summary-title a:visited:hover,.sqs-block-summary-v2 .summary-heading a:visited:hover{color:#3d9991}.sqs-block-summary-v2 a,.sqs-block-summary-v2 a:link,.sqs-block-summary-v2 a:visited{color:#3d9991}.sqs-block-summary-v2 .summary-metadata-item{color:rgba(26,26,26,.4)}.sqs-block-summary-v2 .summary-metadata-item a,.sqs-block-summary-v2 .summary-metadata-item a:link,.sqs-block-summary-v2 .summary-metadata-item a:visited{color:rgba(26,26,26,.4)}.sqs-block-summary-v2 .summary-metadata-item a:hover,.sqs-block-summary-v2 .summary-metadata-item a:link:hover,.sqs-block-summary-v2 .summary-metadata-item a:visited:hover{color:#3d9991}#preFooter nav:not(.social-icons-style-border) a,#footer nav:not(.social-icons-style-border) a,#preFooter nav:not(.social-icons-style-border) a:visited,#footer nav:not(.social-icons-style-border) a:visited{border-bottom:none}#preFooter nav.sqs-svg-icon--list,#footer nav.sqs-svg-icon--list{text-decoration:none !important}#rightSidebar hr{margin:initial}.view-list .filter-heading{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;max-width:1020px;margin:0 auto -32px;padding:32px 32px 0}.view-list .filter-heading span:after{content:'\\00D7';padding-left:1em}.view-list .filter-heading a{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:1px;font-family:\"proxima-nova\";font-size:14px;text-transform:uppercase;letter-spacing:2px;font-weight:700;font-style:normal;color:#3d9991;text-decoration:none;padding:.5em 0;border-bottom:2px solid #3d9991}.view-list:not(.collection-type-blog) .filter-heading{display:none}.view-list .entry+.entry{margin-top:128px}.view-list .excerpt-thumb{display:none;height:12em;width:12em;margin:0 1em 2em 0;float:left;overflow:hidden}.view-list .excerpt-thumb a{display:block;height:100%}.view-list .p-summary p:first-child{margin-top:0}.view-item .blog-item article.has-main-image .meta-above-title,.view-item .blog-item article.has-main-image .entry-title,.view-item .blog-item article.has-main-image .entry-title-passthrough{display:none}.view-item .blog-item .entry-footer{margin-top:2em}.entry-header{margin-bottom:36px}.entry-dateline,.entry-byline,.entry-morefrom{display:inline}.entry-title{margin:12px 0}.entry-title-passthrough:after{content:\" \\279D\";font:normal .9em sans-serif}.entry-more-link{margin-bottom:0}.entry-more-link a{display:block;min-width:2em;min-height:1em}.entry-more-link a:before{content:\"Read More\"}.entry-more-link a:after{content:\" \\279D\";font:normal .9em sans-serif}.entry-footer{margin-top:1em;line-height:1.25em}.entry-tags,.entry-source{max-width:30em}.entry-source{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.entry-actions .entry-comments,.entry-actions .sqs-disqus-comment-link{display:inline-block;margin-right:1em;text-decoration:none}.entry-actions .entry-comments:before,.entry-actions .sqs-disqus-comment-link:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e010\";text-align:center;display:inline-block;vertical-align:middle}.entry-actions .entry-comments:before,.entry-actions .sqs-disqus-comment-link:before{font-size:16px;width:16px;height:16px;line-height:16px}.entry-actions .entry-comments:before,.entry-actions .sqs-disqus-comment-link:before{margin-right:.2em;position:relative;top:.12em;font-size:1.2em;width:auto;height:auto;line-height:inherit;text-align:left;vertical-align:initial}.pagination{margin-top:6em}.pagination>div{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;vertical-align:top;width:50%}.pagination>div a{display:block;color:#3d9991}.pagination .newer{padding-right:1em}.pagination .older{padding-left:1em;text-align:right}.center-entry-title--meta.hide-blog-sidebar .filter-heading,.center-entry-title--meta.hide-blog-sidebar .entry-header,.center-entry-title--meta.hide-blog-sidebar .entry-footer{text-align:center}.center-entry-title--meta.hide-blog-sidebar .entry-tags{margin-left:auto;margin-right:auto}.hide-entry-author:not(.meta-priority-author) .entry-author{display:none}.hide-blog-sidebar.collection-type-blog #page #rightSidebar{display:none}.hide-blog-sidebar.collection-type-blog #page #content{width:100%;max-width:700px;display:block;margin:0 auto}.hide-blog-sidebar.collection-type-blog.view-list .filter-heading{max-width:700px;padding-left:0}.hide-blog-recents #rightSidebar .recent-posts{display:none}.hide-blog-categories #rightSidebar .blog-categories{display:none}.hide-list-entry-footer.view-list .entry-footer{display:none}.meta-priority-date .meta-above-title .entry-morefrom{display:none}.meta-priority-date .meta-above-title .entry-author{display:none}.meta-priority-date .meta-below-title .entry-dateline{display:none}.meta-priority-date.hide-entry-author .no-categories{margin:0}.meta-priority-date:not(.hide-entry-author) .meta-below-title .entry-morefrom:before{content:'\\00B7';padding:0 .5em}.meta-priority-date .sqs-featured-posts-gallery .title-desc-wrapper .post-author,.meta-priority-date .blog-item-wrapper .post-author,.meta-priority-date .recent-posts .post-author{display:none}.meta-priority-date .sqs-featured-posts-gallery .title-desc-wrapper .post-category,.meta-priority-date .blog-item-wrapper .post-category,.meta-priority-date .recent-posts .post-category{display:none}.meta-priority-category .meta-above-title .entry-dateline{display:none}.meta-priority-category .meta-above-title .entry-author{display:none}.meta-priority-category .meta-below-title .entry-morefrom{display:none}.meta-priority-category:not(.hide-entry-author) .meta-below-title .entry-dateline:before{content:'\\00B7';padding:0 .5em}.meta-priority-category .sqs-featured-posts-gallery .title-desc-wrapper .post-author,.meta-priority-category .blog-item-wrapper .post-author,.meta-priority-category .recent-posts .post-author{display:none}.meta-priority-category .sqs-featured-posts-gallery .title-desc-wrapper .post-date,.meta-priority-category .blog-item-wrapper .post-date,.meta-priority-category .recent-posts .post-date{display:none}.meta-priority-author .meta-above-title .entry-dateline{display:none}.meta-priority-author .meta-above-title .entry-morefrom{display:none}.meta-priority-author .meta-below-title .entry-author{display:none}.meta-priority-author .meta-below-title .entry-morefrom:before{content:'\\00B7';padding:0 .5em}.meta-priority-author .sqs-featured-posts-gallery .title-desc-wrapper .post-date,.meta-priority-author .blog-item-wrapper .post-date,.meta-priority-author .recent-posts .post-date{display:none}.meta-priority-author .sqs-featured-posts-gallery .title-desc-wrapper .post-category,.meta-priority-author .blog-item-wrapper .post-category,.meta-priority-author .recent-posts .post-category{display:none}.meta-priority-none .meta-above-title .entry-dateline{display:none}.meta-priority-none .meta-above-title .entry-morefrom{display:none}.meta-priority-none .meta-above-title .entry-author{display:none}.meta-priority-none .entry-morefrom:before{content:'\\00B7';padding:0 .5em}.meta-priority-none:not(.hide-entry-author) .entry-dateline:before{content:'\\00B7';padding:0 .5em}.meta-priority-none .sqs-featured-posts-gallery .title-desc-wrapper .post-date,.meta-priority-none .blog-item-wrapper .post-date,.meta-priority-none .recent-posts .post-date{display:none}.meta-priority-none .sqs-featured-posts-gallery .title-desc-wrapper .post-category,.meta-priority-none .blog-item-wrapper .post-category,.meta-priority-none .recent-posts .post-category{display:none}.meta-priority-none .sqs-featured-posts-gallery .title-desc-wrapper .post-author,.meta-priority-none .blog-item-wrapper .post-author,.meta-priority-none .recent-posts .post-author{display:none}.collection-type-blog.view-item .banner-thumbnail-wrapper{min-height:0;padding:130px 0}.collection-type-blog.view-item.transparent-header .banner-thumbnail-wrapper{padding:180px 0 155px}.blog-item-wrapper{display:block;z-index:100;position:relative;width:100%;max-width:1084px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0 auto;padding:32px;text-align:center;text-rendering:optimizeLegibility}.blog-item-wrapper .title-desc-wrapper{-webkit-animation:feature-text-anim .75s ease-in-out;animation:feature-text-anim .75s ease-in-out}.blog-item-wrapper .post-title{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:400;font-size:48px;letter-spacing:0px;font-family:\"adelle-sans\";font-size:41px;line-height:1em;text-transform:none;letter-spacing:4px;font-weight:100;font-style:normal;-webkit-transform:translatez(0);text-decoration:none;color:#fff}.blog-item-wrapper .post-date,.blog-item-wrapper .post-author,.blog-item-wrapper .post-category{display:block;font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:18px;letter-spacing:0px;line-height:1.5em;font-family:\"camingodos-web\";font-size:49px;line-height:1em;text-transform:none;letter-spacing:1px;font-weight:400;font-style:normal;color:#fff;line-height:1.125em;margin-bottom:.75em;-webkit-transform:translatez(0)}.blog-item-wrapper .post-date a,.blog-item-wrapper .post-author a,.blog-item-wrapper .post-category a{color:#fff}.sqs-featured-posts-gallery .arrow.previous-slide:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e02c\";text-align:center;display:inline-block;vertical-align:middle}.sqs-featured-posts-gallery .arrow.previous-slide:before{font-size:32px;width:32px;height:32px;line-height:32px}.sqs-featured-posts-gallery .arrow.previous-slide:before{font-size:24px;width:24px;height:24px;line-height:24px}.sqs-featured-posts-gallery .arrow.next-slide:before{font-family:'squarespace-ui-font';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:\"\\e02d\";text-align:center;display:inline-block;vertical-align:middle}.sqs-featured-posts-gallery .arrow.next-slide:before{font-size:32px;width:32px;height:32px;line-height:32px}.sqs-featured-posts-gallery .arrow.next-slide:before{font-size:24px;width:24px;height:24px;line-height:24px}.sqs-featured-posts-gallery .arrow,.sqs-featured-posts-gallery .icons span{display:none;-moz-user-select:-moz-none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.sqs-featured-posts-gallery .gallery-wrapper{position:relative;width:100%}.sqs-featured-posts-gallery .gallery-wrapper .posts{display:block;width:100%;height:600px !important}.sqs-featured-posts-gallery .gallery-wrapper .posts .post{height:600px !important;width:100%;background-color:#001a16;-webkit-transform:translatez(0);-moz-transform:translatez(0);-ms-transform:translatez(0);-o-transform:translatez(0);transform:translatez(0)}.sqs-featured-posts-gallery .gallery-wrapper .posts .post:not(:first-of-type){opacity:0}.sqs-featured-posts-gallery .gallery-wrapper .posts .post:first-of-type img{-webkit-animation:feature-bg-anim .6s ease-in-out;animation:feature-bg-anim .6s ease-in-out}.sqs-featured-posts-gallery .gallery-wrapper .posts .post a{display:block}.sqs-featured-posts-gallery.loaded .gallery-wrapper .posts .post{opacity:1}.sqs-featured-posts-gallery .slides-controls{position:relative;z-index:991;overflow:hidden;cursor:pointer}.sqs-featured-posts-gallery .circles{display:none;margin:20px 0;cursor:pointer}.sqs-featured-posts-gallery .circles.sqs-gallery-controls-disabled{display:none}.sqs-featured-posts-gallery.sqs-featured-posts-gallery-interaction .arrow{opacity:0}.sqs-featured-posts-gallery.sqs-featured-posts-gallery-interaction.sqs-featured-posts-gallery-hover-slides-left .arrow.previous-slide:not(.sqs-disabled),.sqs-featured-posts-gallery.sqs-featured-posts-gallery-video-iframe .arrow.previous-slide:not(.sqs-disabled){opacity:1}.sqs-featured-posts-gallery.sqs-featured-posts-gallery-interaction.sqs-featured-posts-gallery-hover-slides-right .arrow.next-slide:not(.sqs-disabled),.sqs-featured-posts-gallery.sqs-featured-posts-gallery-video-iframe .arrow.next-slide:not(.sqs-disabled){opacity:1}.sqs-featured-posts-gallery .title-desc-wrapper{position:absolute;left:50%;top:50%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;padding:32px 0;-webkit-transform:translate(-50%,-45%) !important;-moz-transform:translate(-50%,-45%) !important;-ms-transform:translate(-50%,-45%) !important;-o-transform:translate(-50%,-45%) !important;transform:translate(-50%,-45%) !important;z-index:1000;opacity:0;-webkit-transition:all .25s ease-in-out .3s;-moz-transition:all .25s ease-in-out .3s;-ms-transition:all .25s ease-in-out .3s;-o-transition:all .25s ease-in-out .3s;transition:all .25s ease-in-out .3s;text-rendering:optimizeLegibility}.sqs-featured-posts-gallery .title-desc-wrapper .post-title{margin-bottom:.75em;-webkit-transform:translatez(0)}.sqs-featured-posts-gallery .title-desc-wrapper .post-title a{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:400;font-size:48px;letter-spacing:0px;font-family:\"adelle-sans\";font-size:41px;line-height:1em;text-transform:none;letter-spacing:4px;font-weight:100;font-style:normal;text-decoration:none;color:#fff;padding-left:4px}.sqs-featured-posts-gallery .title-desc-wrapper .post-date,.sqs-featured-posts-gallery .title-desc-wrapper .post-author,.sqs-featured-posts-gallery .title-desc-wrapper .post-category{display:block;font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:18px;letter-spacing:0px;line-height:1.5em;font-family:\"camingodos-web\";font-size:49px;line-height:1em;text-transform:none;letter-spacing:1px;font-weight:400;font-style:normal;color:#fff;line-height:1.125em;margin-bottom:.75em;-webkit-transform:translatez(0)}.sqs-featured-posts-gallery .title-desc-wrapper .post-date a,.sqs-featured-posts-gallery .title-desc-wrapper .post-author a,.sqs-featured-posts-gallery .title-desc-wrapper .post-category a{color:#fff}.sqs-featured-posts-gallery .title-desc-wrapper .post-excerpt{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:18px;letter-spacing:0px;line-height:1.5em;font-family:\"camingodos-web\";font-size:49px;line-height:1em;text-transform:none;letter-spacing:1px;font-weight:400;font-style:normal;color:#fff;margin-bottom:.75em;display:none}.sqs-featured-posts-gallery .title-desc-wrapper .post-excerpt p{margin:0}.sqs-featured-posts-gallery .title-desc-wrapper .post-excerpt p~p{margin-top:.75em}.sqs-featured-posts-gallery .title-desc-wrapper .view-post{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:600;letter-spacing:1px;font-family:\"proxima-nova\";font-size:14px;text-transform:uppercase;letter-spacing:2px;font-weight:700;font-style:normal;text-decoration:none;display:block;-webkit-transform:translatez(0);line-height:1em;margin-top:1.4em}.sqs-featured-posts-gallery .title-desc-wrapper .view-post:before{content:'View Post';display:inline-block;font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:18px;letter-spacing:0px;line-height:1.5em;font-family:\"camingodos-web\";font-size:49px;line-height:1em;text-transform:none;letter-spacing:1px;font-weight:400;font-style:normal;color:#fff;line-height:1.125em;vertical-align:middle}.sqs-featured-posts-gallery .title-desc-wrapper .view-post:after{display:inline-block;content:'\\279D';color:#fff;font:normal .9em sans-serif;margin-left:6px;vertical-align:middle}.sqs-featured-posts-gallery .loaded .title-desc-wrapper{-webkit-transform:translate(-50%,-50%) !important;-moz-transform:translate(-50%,-50%) !important;-ms-transform:translate(-50%,-50%) !important;-o-transform:translate(-50%,-50%) !important;transform:translate(-50%,-50%) !important;opacity:1}.transparent-header .sqs-featured-posts-gallery .gallery-wrapper .posts{height:700px !important}.transparent-header .sqs-featured-posts-gallery .gallery-wrapper .posts .post{height:100% !important}.transparent-header .sqs-featured-posts-gallery .title-desc-wrapper{padding:57px 0 32px}.banner-slideshow-controls-both .sqs-featured-posts-gallery .arrow,.banner-slideshow-controls-arrows .sqs-featured-posts-gallery .arrow{display:block;position:absolute;top:50%;outline:none;color:#fff !important;z-index:999;font-size:14px;line-height:40px;margin-top:-30px;display:inline-block;padding:10px;cursor:pointer}.banner-slideshow-controls-both .sqs-featured-posts-gallery .arrow.previous-slide,.banner-slideshow-controls-arrows .sqs-featured-posts-gallery .arrow.previous-slide{left:0}.banner-slideshow-controls-both .sqs-featured-posts-gallery .arrow.next-slide,.banner-slideshow-controls-arrows .sqs-featured-posts-gallery .arrow.next-slide{right:0;float:right}.banner-slideshow-controls-both .sqs-featured-posts-gallery .arrow.sqs-disabled,.banner-slideshow-controls-arrows .sqs-featured-posts-gallery .arrow.sqs-disabled{opacity:0}.collection-type-index #page{max-width:100%;padding:0}.collection-type-index .page-content{max-width:1020px;margin:0 auto;padding:96px 32px}.collection-type-index .promoted-gallery-wrapper .sqs-block{padding-top:0;padding-bottom:0}.index-section.empty .page-content{display:none}@media only screen and (max-width:1024px){.touch-styles a,.touch-styles label{-webkit-tap-highlight-color:rgba(0,0,0,0) !important;-moz-tap-highlight-color:rgba(0,0,0,0) !important;tap-highlight-color:rgba(0,0,0,0) !important}.sqs-block-horizontalrule hr{margin:32px 0}.sqs-featured-posts-gallery .title-desc-wrapper{max-width:90% !important;width:90% !important;text-align:center;padding:0 20px}.sqs-featured-posts-gallery .title-desc-wrapper .post-excerpt{max-width:90%}}@media only screen and (max-device-height:768px){.collection-type-page.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow,.collection-type-index.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow,.collection-type-page.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow,.collection-type-index.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow{height:600px !important}.collection-type-page.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-index.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-page.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-index.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .sqs-gallery{height:600px !important}.collection-type-page.has-promoted-gallery.transparent-header #promotedGalleryWrapper .sqs-gallery-block-slideshow,.collection-type-index.has-promoted-gallery.transparent-header #promotedGalleryWrapper .sqs-gallery-block-slideshow,.collection-type-page.has-promoted-gallery.transparent-header .promoted-gallery-wrapper .sqs-gallery-block-slideshow,.collection-type-index.has-promoted-gallery.transparent-header .promoted-gallery-wrapper .sqs-gallery-block-slideshow{height:640px !important}.collection-type-page.has-promoted-gallery.transparent-header #promotedGalleryWrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-index.has-promoted-gallery.transparent-header #promotedGalleryWrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-page.has-promoted-gallery.transparent-header .promoted-gallery-wrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-index.has-promoted-gallery.transparent-header .promoted-gallery-wrapper .sqs-gallery-block-slideshow .sqs-gallery{height:640px !important}.collection-type-page.has-promoted-gallery.transparent-header #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta .meta-inside,.collection-type-index.has-promoted-gallery.transparent-header #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta .meta-inside,.collection-type-page.has-promoted-gallery.transparent-header .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta .meta-inside,.collection-type-index.has-promoted-gallery.transparent-header .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta .meta-inside{padding-top:40px}.collection-type-page.has-promoted-gallery.transparent-header.collection-type-index .index-section:not(:first-of-type) #promotedGalleryWrapper .sqs-gallery-block-slideshow,.collection-type-index.has-promoted-gallery.transparent-header.collection-type-index .index-section:not(:first-of-type) #promotedGalleryWrapper .sqs-gallery-block-slideshow,.collection-type-page.has-promoted-gallery.transparent-header.collection-type-index .index-section:not(:first-of-type) .promoted-gallery-wrapper .sqs-gallery-block-slideshow,.collection-type-index.has-promoted-gallery.transparent-header.collection-type-index .index-section:not(:first-of-type) .promoted-gallery-wrapper .sqs-gallery-block-slideshow{height:600px !important}.collection-type-page.has-promoted-gallery.transparent-header.collection-type-index .index-section:not(:first-of-type) #promotedGalleryWrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-index.has-promoted-gallery.transparent-header.collection-type-index .index-section:not(:first-of-type) #promotedGalleryWrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-page.has-promoted-gallery.transparent-header.collection-type-index .index-section:not(:first-of-type) .promoted-gallery-wrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-index.has-promoted-gallery.transparent-header.collection-type-index .index-section:not(:first-of-type) .promoted-gallery-wrapper .sqs-gallery-block-slideshow .sqs-gallery{height:600px !important}.collection-type-page.has-promoted-gallery.transparent-header.collection-type-index .index-section:not(:first-of-type) #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta .meta-inside,.collection-type-index.has-promoted-gallery.transparent-header.collection-type-index .index-section:not(:first-of-type) #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta .meta-inside,.collection-type-page.has-promoted-gallery.transparent-header.collection-type-index .index-section:not(:first-of-type) .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta .meta-inside,.collection-type-index.has-promoted-gallery.transparent-header.collection-type-index .index-section:not(:first-of-type) .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta .meta-inside{padding-top:0}.sqs-featured-posts-gallery .gallery-wrapper .posts{height:600px !important}.sqs-featured-posts-gallery .gallery-wrapper .posts .post{height:600px !important}.transparent-header .sqs-featured-posts-gallery .gallery-wrapper .posts{height:640px !important}.transparent-header .sqs-featured-posts-gallery .gallery-wrapper .posts .post{height:640px !important}.transparent-header .sqs-featured-posts-gallery .title-desc-wrapper{padding:60px 20px 20px}.view-list .banner-thumbnail-wrapper,.collection-type-page .banner-thumbnail-wrapper,.collection-type-blog.view-item .banner-thumbnail-wrapper{padding-top:0;padding-bottom:0}.view-list .banner-thumbnail-wrapper:not(.has-description),.collection-type-page .banner-thumbnail-wrapper:not(.has-description),.collection-type-blog.view-item .banner-thumbnail-wrapper:not(.has-description){min-height:120px}.view-list.transparent-header .banner-thumbnail-wrapper,.collection-type-page.transparent-header .banner-thumbnail-wrapper,.collection-type-blog.view-item.transparent-header .banner-thumbnail-wrapper{padding:60px 0 20px}.collection-type-index.view-list.transparent-header .index-section:not(:first-of-type) .banner-thumbnail-wrapper{padding-top:0;padding-bottom:0}}@media only screen and (max-device-height:640px){.collection-type-page.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow,.collection-type-index.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow,.collection-type-page.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow,.collection-type-index.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow{height:300px !important}.collection-type-page.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-index.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-page.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-index.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .sqs-gallery{height:300px !important}.collection-type-page.has-promoted-gallery.transparent-header #promotedGalleryWrapper .sqs-gallery-block-slideshow,.collection-type-index.has-promoted-gallery.transparent-header #promotedGalleryWrapper .sqs-gallery-block-slideshow,.collection-type-page.has-promoted-gallery.transparent-header .promoted-gallery-wrapper .sqs-gallery-block-slideshow,.collection-type-index.has-promoted-gallery.transparent-header .promoted-gallery-wrapper .sqs-gallery-block-slideshow{height:340px !important}.collection-type-page.has-promoted-gallery.transparent-header #promotedGalleryWrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-index.has-promoted-gallery.transparent-header #promotedGalleryWrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-page.has-promoted-gallery.transparent-header .promoted-gallery-wrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-index.has-promoted-gallery.transparent-header .promoted-gallery-wrapper .sqs-gallery-block-slideshow .sqs-gallery{height:340px !important}.collection-type-page.has-promoted-gallery.transparent-header.collection-type-index .index-section:not(:first-of-type) #promotedGalleryWrapper .sqs-gallery-block-slideshow,.collection-type-index.has-promoted-gallery.transparent-header.collection-type-index .index-section:not(:first-of-type) #promotedGalleryWrapper .sqs-gallery-block-slideshow,.collection-type-page.has-promoted-gallery.transparent-header.collection-type-index .index-section:not(:first-of-type) .promoted-gallery-wrapper .sqs-gallery-block-slideshow,.collection-type-index.has-promoted-gallery.transparent-header.collection-type-index .index-section:not(:first-of-type) .promoted-gallery-wrapper .sqs-gallery-block-slideshow{height:300px !important}.collection-type-page.has-promoted-gallery.transparent-header.collection-type-index .index-section:not(:first-of-type) #promotedGalleryWrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-index.has-promoted-gallery.transparent-header.collection-type-index .index-section:not(:first-of-type) #promotedGalleryWrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-page.has-promoted-gallery.transparent-header.collection-type-index .index-section:not(:first-of-type) .promoted-gallery-wrapper .sqs-gallery-block-slideshow .sqs-gallery,.collection-type-index.has-promoted-gallery.transparent-header.collection-type-index .index-section:not(:first-of-type) .promoted-gallery-wrapper .sqs-gallery-block-slideshow .sqs-gallery{height:300px !important}.sqs-featured-posts-gallery .gallery-wrapper .posts{height:300px !important}.sqs-featured-posts-gallery .gallery-wrapper .posts .post{height:300px !important}.transparent-header .sqs-featured-posts-gallery .gallery-wrapper .posts{height:340px !important}.transparent-header .sqs-featured-posts-gallery .gallery-wrapper .posts .post{height:340px !important}.view-list .banner-thumbnail-wrapper:not(.has-description),.collection-type-page .banner-thumbnail-wrapper:not(.has-description),.collection-type-blog.view-item .banner-thumbnail-wrapper:not(.has-description){min-height:80px}}@media only screen and (max-width:767px){#page{padding:32px}.collection-type-blog:not(.hide-sidebar) #content,.collection-type-blog:not(.hide-sidebar) #rightSidebar{display:block;width:100%}.collection-type-blog:not(.hide-sidebar) #rightSidebar{padding-top:20px;padding-left:0}.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta{max-width:90% !important;width:90% !important}.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta .meta-inside,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta .meta-inside{padding:0 20px}.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta .meta-inside p,.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta .meta-inside p{width:90% !important}.sqs-featured-posts-gallery .title-desc-wrapper{max-width:90% !important;width:90% !important;text-align:center;padding:0 20px}.sqs-featured-posts-gallery .title-desc-wrapper .post-excerpt{max-width:90%}}@media only screen and (max-device-width:667px){.back-to-top-nav{display:block}.back-to-top{display:inline-block}.back-to-top a{display:block;padding:.75em 1em}}@media only screen and (max-width:640px){.sqs-layout [class*=sqs-col]{float:none !important;width:auto !important}.sqs-layout .spacer-block{display:none}.sqs-layout .sqs-row .sqs-block:first-child{padding-top:17px !important}.sqs-layout .sqs-row .sqs-block:last-child{padding-bottom:17px !important}.sqs-layout .sqs-row+.sqs-row,.sqs-layout .sqs-row+.sqs-block{margin-top:0 !important}.sqs-gallery-design-grid-slide{width:50% !important;margin:0 0 10px 0 !important}#page{padding:40px 20px}#header{padding:0 20px}h1,.entry-title{font-size:30px}.sqs-block-horizontalrule hr{margin:initial}blockquote{padding:.5em 20px}.quote-block figure{padding:20px}.entry-header{margin-bottom:12px}.view-list .filter-heading{margin:0 auto;padding:1em 1em 0}.view-list .entry+.entry{margin-top:80px}body:not(.collection-type-gallery) .desc-wrapper p,body:not(.collection-type-gallery).has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta-description p,body:not(.collection-type-gallery).has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta-description p{font-size:18px;margin:10px auto}body:not(.collection-type-gallery) .desc-wrapper p>strong,body:not(.collection-type-gallery).has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta-description p>strong,body:not(.collection-type-gallery).has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta-description p>strong,body:not(.collection-type-gallery) .desc-wrapper p>em>strong,body:not(.collection-type-gallery).has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta-description p>em>strong,body:not(.collection-type-gallery).has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta-description p>em>strong{font-size:30px;letter-spacing:2px}body:not(.collection-type-gallery) .desc-wrapper p:last-child>a,body:not(.collection-type-gallery).has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta-description p:last-child>a,body:not(.collection-type-gallery).has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta-description p:last-child>a{font-size:13px;margin:5px auto}.collection-type-page.has-promoted-gallery .main-content .sqs-layout>.sqs-row:first-child>.sqs-col-12:first-child{width:100% !important}.collection-type-page.has-promoted-gallery .main-content .sqs-layout>.sqs-row:first-child>.sqs-col-12:first-child>.gallery-block:first-child{padding-top:0 !important;padding-bottom:0 !important}.collection-type-page.has-promoted-gallery .main-content .sqs-layout>.sqs-row:first-child>.sqs-col-12:first-child>.gallery-block:first-child .sqs-gallery{height:300px !important}.collection-type-page.has-promoted-gallery #promotedGalleryWrapper .sqs-gallery-block-slideshow .meta .meta-inside,.collection-type-index.has-promoted-gallery .promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta .meta-inside{padding:20px}.collection-type-page.has-promoted-gallery #promotedGalleryWrapper .sqs-video-wrapper+.meta,.collection-type-index.has-promoted-gallery .promoted-gallery-wrapper .sqs-video-wrapper+.meta{display:none}.sqs-featured-posts-gallery .title-desc-wrapper{padding:20px 20px}.sqs-featured-posts-gallery .title-desc-wrapper .post-title,.sqs-featured-posts-gallery .title-desc-wrapper .post-title a{font-size:30px;letter-spacing:2px}.sqs-featured-posts-gallery .title-desc-wrapper .post-excerpt{display:none}.blog-item-wrapper .post-title,.blog-item-wrapper .post-title a{font-size:30px;letter-spacing:2px}.blog-item-wrapper .post-date,.blog-item-wrapper .post-author,.blog-item-wrapper .post-category,.blog-item-wrapper .post-date a,.blog-item-wrapper .post-author a,.blog-item-wrapper .post-category a{font-size:18px}.header-inner{padding:20px 0;display:block}.footer-inner,.pre-footer-inner .sqs-layout{padding:20px}#logoWrapper,#siteTitleWrapper{display:inline-block;vertical-align:middle;max-width:240px;padding:0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#logoWrapper #logoImage img,#siteTitleWrapper #logoImage img{max-height:50px;max-width:100%;width:auto;height:auto}#logoWrapper{width:140px}#productList .product{margin-bottom:40px}#productList .product .product-title{margin-top:.5em}.sqs-featured-posts-gallery .title-desc-wrapper .view-post{display:none}.sqs-featured-posts-gallery .title-desc-wrapper .view-post:before,.sqs-featured-posts-gallery .title-desc-wrapper .view-post:after{display:none}.sqs-featured-posts-gallery .title-desc-wrapper .post-date,.sqs-featured-posts-gallery .title-desc-wrapper .post-category,.sqs-featured-posts-gallery .title-desc-wrapper .post-author{font-size:16px}.index-section-wrapper.page-content{padding:20px}body{-webkit-animation:bugfix infinite 1s}@-webkit-keyframes bugfix{from{padding:0}to{padding:0}}#headerNav{display:none}#siteTitle,#siteTitle a{font-size:16px;line-height:1}#showOnScrollWrapper{display:none}.mobile-nav-toggle-label{display:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;z-index:100;width:10%;position:absolute;z-index:1002;top:50%;right:20px;margin-top:-8px;padding:0;vertical-align:middle;line-height:16px;text-align:right;cursor:pointer;user-select:none;color:#fff;width:22px;height:22px}.mobile-nav-toggle-label .top-bar,.mobile-nav-toggle-label .middle-bar,.mobile-nav-toggle-label .bottom-bar{width:22px;height:2px;background-color:#fff;-webkit-transition:-webkit-transform .15s 0s ease-in-out,top .15s .15s ease-in-out;-moz-transition:-moz-transform .15s 0s ease-in-out,top .15s .15s ease-in-out;-ms-transition:-ms-transform .15s 0s ease-in-out,top .15s .15s ease-in-out;-o-transition:-o-transform .15s 0s ease-in-out,top .15s .15s ease-in-out;transition:transform .15s 0s ease-in-out,top .15s .15s ease-in-out;-webkit-transform-origin:50% 50%;-moz-transform-origin:50% 50%;-ms-transform-origin:50% 50%;-o-transform-origin:50% 50%;transform-origin:50% 50%;position:absolute;top:0;right:0}.mobile-nav-toggle-label .middle-bar{-webkit-transition:opacity 0s .15s linear;-moz-transition:opacity 0s .15s linear;-ms-transition:opacity 0s .15s linear;-o-transition:opacity 0s .15s linear;transition:opacity 0s .15s linear;top:7px}.mobile-nav-toggle-label .bottom-bar{top:14px}.mobile-nav-toggle-label.fixed-nav-toggle-label{position:fixed;top:5px;right:5px;z-index:1001;visibility:hidden;opacity:0;padding:20px;margin-top:0;background-color:#212121;width:42px;height:36px;-webkit-transition:opacity .17s ease-in-out;-moz-transition:opacity .17s ease-in-out;-ms-transition:opacity .17s ease-in-out;-o-transition:opacity .17s ease-in-out;transition:opacity .17s ease-in-out}.mobile-nav-toggle-label.fixed-nav-toggle-label .top-bar,.mobile-nav-toggle-label.fixed-nav-toggle-label .middle-bar,.mobile-nav-toggle-label.fixed-nav-toggle-label .bottom-bar{margin-top:12px;margin-right:10px}.fix-header-nav .mobile-nav-toggle-label.fixed-nav-toggle-label{visibility:visible;opacity:1}#sidecarNav .folder-toggle-label~.subnav,#secondaryNavWrapper .folder-toggle-label~.subnav{height:0;max-height:0;overflow:hidden;padding:0 1.5em;font-size:14px}#sidecarNav .folder-toggle-label~.subnav>div,#secondaryNavWrapper .folder-toggle-label~.subnav>div{padding:.5em 0}#sidecarNav .folder-toggle-box:checked~.subnav,#secondaryNavWrapper .folder-toggle-box:checked~.subnav{height:auto;max-height:999px;padding:0 1em 1em}#siteWrapper{height:99.9%;width:100%;-webkit-transition:-webkit-transform .14s ease-in-out;-moz-transition:-moz-transform .14s ease-in-out;-ms-transition:-ms-transform .14s ease-in-out;-o-transition:-o-transform .14s ease-in-out;transition:transform .14s ease-in-out}#mobileNavToggle:checked~#sidecarNav{-webkit-overflow-scrolling:touch;visibility:visible;-webkit-transition:height 0s .14s linear,visibility 0s 0s linear;-moz-transition:height 0s .14s linear,visibility 0s 0s linear;-ms-transition:height 0s .14s linear,visibility 0s 0s linear;-o-transition:height 0s .14s linear,visibility 0s 0s linear;transition:height 0s .14s linear,visibility 0s 0s linear}#mobileNavToggle:checked~.sqs-announcement-bar-dropzone{display:none}#mobileNavToggle:checked~#siteWrapper{position:fixed;height:100%;-webkit-transform:translate3d(-260px,0,0);-moz-transform:translate3d(-260px,0,0);-ms-transform:translate3d(-260px,0,0);-o-transform:translate3d(-260px,0,0);transform:translate3d(-260px,0,0)}#mobileNavToggle:checked~#siteWrapper .mobile-nav-toggle-label .top-bar,#mobileNavToggle:checked~#siteWrapper .mobile-nav-toggle-label .bottom-bar{-webkit-transition:top .15s .15s ease-in-out,-webkit-transform .15s .3s ease-in-out;-moz-transition:top .15s .15s ease-in-out,-moz-transform .15s .3s ease-in-out;-ms-transition:top .15s .15s ease-in-out,-ms-transform .15s .3s ease-in-out;-o-transition:top .15s .15s ease-in-out,-o-transform .15s .3 ease-in-out;transition:top .15s .15s ease-in-out,transform .15s .3s ease-in-out}#mobileNavToggle:checked~#siteWrapper .mobile-nav-toggle-label .top-bar{-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);top:7px}#mobileNavToggle:checked~#siteWrapper .mobile-nav-toggle-label .middle-bar{opacity:0}#mobileNavToggle:checked~#siteWrapper .mobile-nav-toggle-label .bottom-bar{-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg);top:7px}.enable-nav-button #sidecarNav nav>div:not(.folder):last-child a{display:inline-block;margin:.75em 0 0 0;line-height:1;padding:1em 1.5em}.folder-toggle-box:checked~.subnav{padding:.25em 0 .5em}.pre-footer-inner,.footer-inner{text-align:center}.pre-footer-inner .socialaccountlinks-block .social-account-list,.footer-inner .socialaccountlinks-block .social-account-list,.pre-footer-inner .back-to-top,.footer-inner .back-to-top{text-align:center;margin:24px 0}.pre-footer-inner .sqs-block-button-container--right,.footer-inner .sqs-block-button-container--right,.pre-footer-inner .sqs-block-button-container--center,.footer-inner .sqs-block-button-container--center,.pre-footer-inner .sqs-block-button-container--left,.footer-inner .sqs-block-button-container--left{text-align:center}#secondaryNavWrapper #secondaryNavigation div{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;display:block}#secondaryNavWrapper #secondaryNavigation div a,#secondaryNavWrapper #secondaryNavigation div label{display:block;padding:.7em 0}#secondaryNavWrapper #secondaryNavigation>div{margin-right:0%}.site-phone,.site-email{display:block;margin-left:0 !important}.site-email>span{display:none}.site-email:before{content:'Email'}.folder-nav-toggle-label,.category-nav-toggle-label{display:block;width:100%;z-index:2;position:absolute;top:0;right:0;padding-top:12px;cursor:pointer;font-size:21px;line-height:14px;text-align:right}.folder-nav-toggle-label:after,.category-nav-toggle-label:after{content:\"+\";display:block;text-align:right}#folderNav,#categoryNav{display:block;width:100%;position:relative;padding-bottom:1.5em}#folderNav+#content,#categoryNav+#content{display:block;width:100%}#folderNav .folder-nav,#categoryNav .folder-nav{position:relative;z-index:1}#folderNav .category-nav,#categoryNav .category-nav{margin-bottom:1em;position:relative;z-index:1}#folderNav li,#categoryNav li{padding-top:.75em;padding-bottom:.75em}#folderNav li.nav-section-label,#categoryNav li.nav-section-label{display:none}#folderNav li.filter,#categoryNav li.filter{display:block;visibility:visible}#folderNav li a,#categoryNav li a,#folderNav li.nav-section-label,#categoryNav li.nav-section-label{font-size:14px;line-height:1}#folderNav li:not(.filter),#categoryNav li:not(.filter){display:none}.collection-type-page:not(.hide-page-sidebar) #folderNav+#content,.collection-type-products:not(.hide-products-sidebar) #folderNav+#content,.collection-type-page:not(.hide-page-sidebar) #categoryNav+#content,.collection-type-products:not(.hide-products-sidebar) #categoryNav+#content{display:block;width:100%}#folderNav #folderNavToggle:checked+.folder-nav-toggle-label{z-index:0}#folderNav #folderNavToggle:checked+.folder-nav-toggle-label:after{content:'–'}#folderNav #folderNavToggle:checked~.folder-nav li:not(.active-link){display:block}#folderNav #folderNavToggle:checked~.folder-nav li:not(.active-link).nav-section-label{display:none}#categoryNav #categoryNavToggle:checked+.category-nav-toggle-label{z-index:0}#categoryNav #categoryNavToggle:checked+.category-nav-toggle-label:after{content:'–'}#categoryNav #categoryNavToggle:checked~.category-nav li:not(.filter){display:block}#categoryNav #categoryNavToggle:checked~.category-nav li:not(.filter).nav-section-label{display:none}}@media only screen and (max-width:480px){#promotedGalleryWrapper .sqs-gallery-block-slideshow .meta,.promoted-gallery-wrapper .sqs-gallery-block-slideshow .meta{display:block !important}}.site-title-font{font-family:\"proxima-nova\";font-size:27px;text-transform:none;letter-spacing:0px;font-weight:300;font-style:normal}.nav-font{font-family:\"proxima-nova\";font-size:14px;text-transform:uppercase;text-decoration:none;letter-spacing:2px;font-weight:700;font-style:normal}.nav-button-font{font-family:\"proxima-nova\";text-transform:uppercase;text-decoration:none;letter-spacing:1px;font-weight:700;font-style:normal}.banner-heading-font{font-family:\"adelle-sans\";font-size:41px;line-height:1em;text-transform:none;letter-spacing:4px;font-weight:100;font-style:normal}.banner-text-font{font-family:\"camingodos-web\";font-size:49px;line-height:1em;text-transform:none;letter-spacing:1px;font-weight:400;font-style:normal}.banner-button-font{font-family:\"proxima-nova\";font-size:20px;text-transform:uppercase;text-decoration:none;letter-spacing:2px;font-weight:700;font-style:normal}.body-font{font-family:\"adelle-sans\";font-size:16px;line-height:1.7em;letter-spacing:0px;font-weight:400;font-style:normal}.heading1-font{font-family:\"adelle-sans\";font-size:32px;line-height:1.2em;text-transform:none;letter-spacing:0px;font-weight:400;font-style:normal}.heading2-font{font-family:\"proxima-nova\";font-size:22px;line-height:1.2em;text-transform:uppercase;letter-spacing:2px;font-weight:400;font-style:normal}.heading3-font{font-family:\"proxima-nova\";font-size:16px;line-height:1em;text-transform:uppercase;letter-spacing:1px;font-weight:600;font-style:normal}.quote-font{font-family:\"adobe-garamond-pro\";font-size:20px;line-height:1.65em;letter-spacing:0px;font-weight:400;font-style:normal}.summary-heading-font{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;text-transform:uppercase;letter-spacing:1px;font-weight:400;font-style:normal}.subnav-title-font{font-family:\"adobe-garamond-pro\";font-size:22px;text-transform:none;text-decoration:none;letter-spacing:0px;font-weight:400;font-style:normal}.subnav-link-font{font-family:\"proxima-nova\";font-size:14px;text-transform:uppercase;text-decoration:none;letter-spacing:2px;font-weight:600;font-style:normal}.footer-nav-font{font-family:\"proxima-nova\";font-size:13px;text-transform:uppercase;text-decoration:none;letter-spacing:2px;font-weight:400;font-style:normal}.site-info-font{font-family:\"proxima-nova\";font-size:14px;text-transform:uppercase;text-decoration:none;letter-spacing:2px;font-weight:400;font-style:normal}.small-button-block-font{font-family:\"proxima-nova\";text-transform:uppercase;letter-spacing:1px;font-weight:600;font-style:normal}.medium-button-block-font{font-family:\"proxima-nova\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;text-transform:uppercase;letter-spacing:1px;font-weight:600;font-style:normal}.large-button-block-font{font-family:\"proxima-nova\";text-transform:uppercase;letter-spacing:1px;font-weight:600;font-style:normal}.system-button-font{font-family:\"proxima-nova\";text-transform:uppercase;letter-spacing:.6px;font-weight:600;font-style:normal}.announcement-bar-font{font-family:\"proxima-nova\";font-size:19px;text-transform:none;letter-spacing:1px;font-weight:700;font-style:normal}\n/*! Squarespace LESS Compiler  (less.js language v1.3.3)  */\n#header{position:fixed !important;padding:5;height:5;background-color:rgba(41,41,45,.9) !important}#preFooter{display:none}\n"
  },
  {
    "path": "themes/prism.css",
    "content": "/* http://prismjs.com/download.html?themes=prism-okaidia&languages=markup+css+clike+javascript+c+csharp+cpp */\n/**\n * okaidia theme for JavaScript, CSS and HTML\n * Loosely based on Monokai textmate theme by http://www.monokai.nl/\n * @author ocodia\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: #f8f8f2;\n\ttext-shadow: 0 1px rgba(0, 0, 0, 0.3);\n\tfont-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n\tdirection: ltr;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tpadding: 1em;\n\tmargin: .5em 0;\n\toverflow: auto;\n\tborder-radius: 0.3em;\n}\n\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tbackground: #272822;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tpadding: .1em;\n\tborder-radius: .3em;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: slategray;\n}\n\n.token.punctuation {\n\tcolor: #f8f8f2;\n}\n\n.namespace {\n\topacity: .7;\n}\n\n.token.property,\n.token.tag,\n.token.constant,\n.token.symbol,\n.token.deleted {\n\tcolor: #f92672;\n}\n\n.token.boolean,\n.token.number {\n\tcolor: #ae81ff;\n}\n\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.builtin,\n.token.inserted {\n\tcolor: #a6e22e;\n}\n\n.token.operator,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.style .token.string,\n.token.variable {\n\tcolor: #f8f8f2;\n}\n\n.token.atrule,\n.token.attr-value,\n.token.function {\n\tcolor: #e6db74;\n}\n\n.token.keyword {\n\tcolor: #66d9ef;\n}\n\n.token.regex,\n.token.important {\n\tcolor: #fd971f;\n}\n\n.token.important,\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n\n"
  },
  {
    "path": "troubleshooting.md",
    "content": "# Troubleshooting\n\n## Connection\n\nIf you experience connection problems, follow these steps:\n\n1. Check that your hardware, wires, cables and power supply are good quality, not harmed or damaged, etc.  \n\n   Use high power USB cables and USB ports.\n\n2. Check your wiring using the examples \\(TCP/HTTP Client or similar\\) **provided with your shield and hardware**.\n   * Once you understand how to manage connection, it's much easier to use Blynk.\n3. Try running command `telnet blynk-cloud.com 80` from your PC, connected to the same network as your hardware.\n\n   You should see something like: `Connected to blynk-cloud.com.`.\n\n4. Try running Blynk default examples for your platform **without modifications** to see if it is working.\n   * Double-check that you have selected **the right example** for your connection type and hardware model.\n   * Our examples come with **comments and explanations**. **Read them carefully.**\n   * Check that your Auth Token is valid \\(copied from the App and **doesn't contain spaces, etc.**\\)\n   * If it doesn't work, try looking into [serial debug prints](./#enable-debug).\n5. Done! Add your modifications and functionality. Enjoy Blynk!\n\n_**Note:**_ when you have multiple devices connected to your network, they should all have different MAC and IP addresses. For example, when using 2 Arduino UNO with Ethernet shields, flashing default example to both of them will cause connection problems. You should use [manual ethernet configuration](https://github.com/blynkkk/blynk-library/blob/master/examples/Boards_Ethernet/Arduino_Ethernet_Manual/Arduino_Ethernet_Manual.ino) example.\n\n## WiFi network connection\n\nIf you encounter WiFi connection problems, please check these pitfalls:\n\n* You're trying to connect to \"WPA & WPA2 Enterprise\" network \\(often used in offices\\), and your shield does not support this security method\n* Your WiFi network has a login page that requests entering an access token \\(often used in restaurants\\)\n* Your WiFi network security disallows connecting alien devices completely \\(MAC filtering, etc\\)\n* There is a firewall running. Default port for hardware connections is 80.\n\n  Make sure it's open.\n\n## Delay\n\nIf you use long `delay()` or send your hardware to sleep inside of the `loop()` expect connection drops and downgraded performance.\n\n_**DON'T DO THAT:**_\n\n```cpp\nvoid loop()\n{\n  ...\n  delay(1000); // this is long delay, that should be avoided\n  other_long_operation();\n  ...\n  Blynk.run();\n}\n```\n\n_**Note:**_ This also applies to the BLYNK\\_READ & BLYNK\\_WRITE handlers!\n\n_**SOLUTION:**_ If you need to perform actions in time intervals - use timers, for example [BlynkTimer](./#blynk-firmware-blynktimer).\n\n## Flood Error\n\nIf your code frequently sends a lot of requests to our server, your hardware will be disconnected. Blynk App may show \"Your hardware is offline\"\n\nWhen `Blynk.virtualWrite` is in the `void loop`, it generates hundreds of \"writes\" per second\n\nHere is an example of what may cause flood. _**DON'T DO THAT:**_\n\n```cpp\nvoid loop()\n{\n  Blynk.virtualWrite(1, value); // This line sends hundreds of messages to Blynk server\n  Blynk.run();\n}\n```\n\n_**SOLUTION:**_ If you need to perform actions in time intervals - use timers, for example [BlynkTimer](./#blynk-firmware-blynktimer).\n\nUsing `delay()` will not solve the problem either. It may cause [another issue](./#delay). Use timers!\n\nIf sending hundreds of requests is what you need for your product you may increase flood limit on local server and within Blynk library. For local server you need to change `user.message.quota.limit` property within `server.properties` file :\n\n```text\n    #100 Req/sec rate limit per user.\n    user.message.quota.limit=100\n```\n\nFor library you need to change `BLYNK_MSG_LIMIT` property within `BlynkConfig.h` file :\n\n```text\n    //Limit the amount of outgoing commands.\n    #define BLYNK_MSG_LIMIT 20\n```\n\n## Enable debug\n\nTo enable debug prints on the default Serial, add this on the top of your sketch **\\(it should be the first line in your sketch\\)**:\n\n```cpp\n#define BLYNK_DEBUG // Optional, this enables lots of prints\n#define BLYNK_PRINT Serial\n```\n\nAnd enable serial in `void setup()`:\n\n```cpp\nSerial.begin(9600);\n```\n\nYou can also use spare Hardware serial ports or SoftwareSerial for debug output \\(you will need an adapter to connect to it with your PC\\).\n\n_**Note:**_ enabling debug mode will slow down your hardware processing speed up to 10 times.\n\n## Geo DNS problem\n\nGeo DNS issue is no longer a problem. It was solved in 2017.\n\n## Reset password\n\nOn login screen click on \"Forgot password?\" label and than type your email and `Send` button. You'll get instruction on your email.\n\n### Android reset password flow\n\n1. Open instruction email **from your smartphone or tablet**;\n2. Click on \"Reset now\" button in your email;\n3. Click on Blynk icon in below popup and reset the pass:\n\n![](.gitbook/assets/reset.png)\n\n"
  },
  {
    "path": "untitled/README.md",
    "content": "# blynkkk/blynkkk.github.io\n\n## Files <a id=\"files\"></a>\n\n [Permalink](tree/blynkkk-blynkkk.github.io.md)\n\n Failed to load latest commit information.\n\nType\n\nName\n\nLatest commit message\n\nCommit time\n\n## About\n\n GitHub pages\n\n### Resources\n\n### License\n\n You can’t perform that action at this time. \n\n"
  },
  {
    "path": "untitled/accelerometer.md",
    "content": "# Accelerometer\n\nAccelerometer is kind of [motion sensors](https://developer.android.com/guide/topics/sensors/sensors_motion.html) that allows you to detect motion of your smartphone. Useful for monitoring device movement, such as tilt, shake, rotation, or swing. Conceptually, an acceleration sensor determines the acceleration that is applied to a device by measuring the forces that are applied to the sensor. Measured in `m/s^2` applied to `x`, `y`, `z` axis.\n\nIn order to accept data from it you need to :\n\n```cpp\nBLYNK_WRITE(V1) {\n  //acceleration force applied to axis x\n  int x = param[0].asFloat(); \n  //acceleration force applied to axis y\n  int y = param[1].asFloat();\n  //acceleration force applied to axis z\n  int z = param[2].asFloat();\n}\n```\n\nAccelerometer doesn't work in background.\n\n"
  },
  {
    "path": "untitled/archive/README.md",
    "content": "# archive\n\n"
  },
  {
    "path": "untitled/archive/bad-request-github.md",
    "content": "# Bad request · GitHub\n\nYou have sent an invalid request.\n\n Please do not send this request again.\n\n"
  },
  {
    "path": "untitled/archive/joystick.md",
    "content": "# joystick\n\n## Джойстик \\(Joystick\\)\n\nУправление сервоприводом в 4 направлениях.\n\n### Параметры:\n\n* **Раздельный** \\(SPLIT\\):\n\n  Каждый из параметров отправляется непосредственно на пин вашего оборудования \\(например, D7 и D8\\). Вам не нужно писать код.\n\n**ПРИМЕЧАНИЕ:** В этом режиме вы отправляете несколько команд из одного виджета, что может снизить производительность вашего оборудования.\n\n**Пример:** Если у вас есть виджет Джойстика и он настроен на D3 и D4, он отправит две команды через Интернет:\n\n```cpp\ndigitalWrite(3, x);\ndigitalWrite(4, y);\n```\n\n* **Совмещенный** \\(MERGE\\):\n\n  Когда выбран режим MERGE, вы отправляете только 1 сообщение, состоящее из массива значений. Но вам нужно разобрать его на оборудовании устройства.\n\nЭтот режим можно использовать только с виртуальными пин-ами.\n\n**Пример:** добавьте виджет Джойстика и установите его в режим \"MERGE\". Выберите виртуальный пин V1\n\n```cpp\nBLYNK_WRITE(V1) // Joystick assigned to V1 \n{\n  // получить x \n  int x = param[0].asInt(); \n  // получить y\n  int y = param[1].asInt();\n}\n```\n\n* **Вращать при Наклоне** \\(Rotate on Tilt\\) Когда это параметр включен, Джойстик будет автоматически вращаться, если вы будете использовать смартфон в горизонтальной положении.\n* **Автовозврат** \\(Auto-Return\\) Когда это парамтер выключен, ручка джойстика не вернется в центральное положение. Она останется там, где вы ее оставили.\n\n## Отправка при Отжатии \\(Send On Release\\)\n\n**Send On Release** доступно для большинства виджетов контроллеров и позволяет уменьшить трафик данных на ваше оборудование. Например, когда вы перемещаете виджет джойстика, команды непрерывно передаются на аппаратное устройство, во время одного движения джойстика вы можете отправлять десятки команд. Есть случаи, когда это необходимо, однако создание такой нагрузки может привести к зависанию или сбросу оборудования. Мы рекомендуем включить функцию **Send On Release** для большинства случаев, если вам не требуется мгновенная обратная связь. Эта опция включена по умолчанию.\n\n## Интервал записи \\(Write interval\\)\n\nПохоже на вышеуказанный вариант. Однако, позволяет вам передавать значения на ваше оборудование в через определенные интервалы времени. Например, установка интервала записи на 100 мс означает, что при перемещении ползунка на аппаратное обеспечение будет отправлено только 1 значение в течение 100 мс. Эта опция также используется для уменьшения трафика данных на ваше оборудовании.\n\n**Пример кода:** [Джойстик две оси](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/JoystickTwoAxis/JoystickTwoAxis.ino)\n\n"
  },
  {
    "path": "untitled/archive/super_chart.md",
    "content": "# Диаграмма \\(SuperChart\\)\n\nДиаграмма используется для живой визуализации и хранения данных. Вы можете использовать виджет для логирования данных датчиков, бинарных событий и многого другого.\n\nЧтобы использовать виджет Диаграмма, вам нужно будет передать данные с оборудования с желаемым интервалом, используя таймеры. [Здесь приведен](https://examples.blynk.cc/?board=ESP8266&shield=ESP8266%20WiFi&example=GettingStarted%2FPushData) базовый пример передачи данных.\n\n## Взаимодействие:\n\n* **Переключение между режимами текущий и временной** Нажмите диапазоны времени в нижней части виджета, чтобы изменить масштаб Диаграммы по времени.\n* **Тап по легенде графиков** показать или скрыть поток данных.\n* **Долгий тап на графике** покажет метку времени и соответствующие значения.\n* **Быстро проведите пальцем влево или вправо, чтобы увидеть предыдущие данные** впоследствии вы можете прокручивать данные назад и вперед в пределах заданного временного диапазона.\n* **Полноэкранный режим** нажмите эту кнопку, чтобы открыть полноэкранный режим в альбомной ориентации.\n\nЧтобы выйти из режима полного экрана, просто поверните телефон обратно в портретный режим. График должен вращаться автоматически. В полноэкранном режиме вы увидите X \\(время\\) и несколько шкал Y. Полноэкранный режим можно отключить в настройках виджета.\n\n* **Кнопка меню**\n\n  Кнопка меню откроет дополнительные функции:\n\n  * Экспорт в CSV\n  * Стереть данные на сервере\n\n## Настройки диаграммы:\n\n* **Заголовок диаграммы \\(Chart Title\\)** общее наименование диаграммы.\n* **Размер шрифта заголовка \\(Title Font Size\\)** выберите из 3 размеров шрифта.\n* **Выравнивание заголовка \\(Title Alignment\\)** выберите выравнивание заголовка диаграммы. Этот параметр влияет на положение заголовка и легенды в виджете.\n* **Показать ось X \\(время\\) \\(Show x-axis \\(time\\)\\)** выберите настройку, если хотите показать шкалу времени внизу графика.\n* **Автоматическое масштабирование для всех потоков данных \\(Override Auto Scaling for All Datastreams\\)** отключение этой опции позволит выполнить ручную настройку для оси Y \\(см. ниже\\).\n* **Выбор масштаба времени \\(Time ranges picker\\)** Позволяет выбрать необходимые периоды \\(`15m`,`30m`, `1h`,`3h`, ...\\) и разрешение для вашего графика. Разрешение определяет, насколько подробные ваши данные. Прямо сейчас график поддерживает два типа разрешения: `standard` и `high`. Разрешение также зависит от выбранного периода. Например, `standard` разрешение для `1d` означает, что вы будете получать 24 значения в день \\(одно в час\\), а при `high` разрешении вы будете получать за`1d` 1440 значений в день \\(одно в минуту\\).\n* **Потоки данных \\(Datastreams\\)** добавить потоки данных \\(см. ниже, как настроить потоки данных\\).\n\n## Настройки потоков данных\n\nВиджет поддерживает до 4 потоков данных. Нажмите значок настроек потоков данных, чтобы открыть настройки.\n\n**Дизайн \\(Design\\)** выберите доступные типы диаграмм:\n\n* Линейная \\(Line\\)\n* С областями \\(Area\\)\n* Гистограмма \\(Bar\\)\n* Бинарная \\(Binary\\) \\(приведение данных к двоичному виду\\)\n\n**Цвет \\(Color\\)** выберите сплошные цвета или градиенты.\n\n**Источник и ввод \\(Source and input\\)** - Вы можете использовать три типа источника данных:\n\n**1. Виртуальный пин \\(Virtual Pin\\)** - выберите желаемое устройство и виртуальный пин для получения данных.\n\n**2. Теги \\(Tags\\)** - диаграмма может агрегировать данные с нескольких устройств, используя встроенные функции агрегирования. Например, если у вас есть 10 датчиков температуры, посылающих температуру с заданным интервалом, Вы можете отобразить среднее значение от 10 датчиков в виджете.\n\nИспользование тегов:\n\n* [**Добавить Тэг**](http://docs.blynk.cc/#blynk-main-operations-control-of-multiple-devices-tags) на каждое устройство, с которого вы хотите агрегировать данные. Это можно сделать в настройках проекта Blynk.\n* **Отправить данные в виртуальный пин \\(Push data to the same Virtual Pin\\)** на каждое устройство. \\(т.е. `Blynk.virtualWrite (V0, temperature);`\\)\n* **Выберите тег в качестве источника \\(Choose Tag as a source\\)** в виджете Диаграмма и используйте пин, куда поступают данные \\(т.е. V0\\)\n\n**Добступные функции:**\n\n* `SUM` будет суммировать все входящие значения в указанный виртуальный пин со всех устройств, помеченные выбранным тегом\n* `AVG` будет вычислять среднее значение\n* `MED` найдет среднее значение\n* `MIN` будет вычислять минимальное значение\n* `MAX` будет вычислять максимальное значение\n\n**ВАЖНО: Теги не работают в режиме реального времени.**\n\n**3.** [**Выбор устройства \\(Device Selector\\)**](https://github.com/blynkkk/blynkkk.github.io/tree/master/mobile/ru/%20device_selector.md) Если вы добавите виджет Выбор устройства в свой проект, вы можете использовать его в качестве источника данных для Диаграммы. В том случае, когда вы меняете устройство, диаграмма будет автоматически обновляться.\n\n## Настройки оси Y \\(Y-Axis Settings\\)\n\nCуществует 4 режима масштабирования данных вдоль оси Y, активируется после отключения общей настройки виджета \"Автоматическое масштабирование для всех потоков данных \\(Override Auto Scaling for All Datastreams\\)\".\n\n**1. Авто \\(Auto\\)** Данные будут автоматически масштабироваться на основе минимальных и максимальных значений заданного периода времени. Это лучший вариант для начинающих.\n\n**2. Минимальный/Максимальный \\(Min/Max\\)** Когда выбран этот режим, шкала Y будет установлена на выбранные вами границы значений. Например, если ваше оборудование отправляет данные со значениями от -100 до 100, вы можете установить эти границы и данные графика будут отображены полностью.\n\nВы также можете визуализировать данные в другом диапазоне. Допустим, входящие данные имеют значения в диапазоне 0-55, но вы хотели бы видеть только значения в диапазоне 30-50. Вы можете настроить диапазон, но если значения не соответствуют заданному масштабу оси Y, диаграмма будет обрезана.\n\n**3. Процент от высоты \\(% of Height\\)** Эта опция позволяет автоматически масштабировать входящие данные на виджете и размещать их так, как вы хотите. В этом режиме вы устанавливаете процент высоты виджета на экране от 0% до 100%.\n\nЕсли вы установите диапазон 0-100%, это будет полная автоматическая шкала. Независимо от того, в каком диапазоне поступают данные, он всегда будет масштабирован по всей высоте виджета.\n\nЕсли вы установите его на 0-25%, то график будет отображаться только на 1/4 высоты виджета.\n\nЭтот параметр очень полезен для **Бинарной диаграммы** или для визуализации нескольких потоков данных на одной и той же диаграмме разными способами.\n\n**4. Дельта \\(Delta\\)** Пока данные остаются в пределах заданного значения дельты, график будет автоматически масштабироваться в этом диапазоне. Если дельта превышает диапазон, график автоматически масштабируется до минимальных/максимальных значений указанного периода.\n\n**Суффикс \\(Suffix\\)** Здесь вы можете указать суффикс, который будет отображаться со значениями во время длительного тап на графике.\n\n**Разрядность \\(Decimals\\)** Определяет формат числовых значений, когда вы нажимаете и удерживаете палец на графике. Возможные варианты: \\#, \\#.\\#, \\#.\\#\\#, и т.д.\n\n**Соединиить отсуствующие точки графика \\(Connect Missing Data Points\\)** Если этот переключатель включен, то Диаграмма соединит все точки, даже если данные частично отсуствуют. Если для него установлено значение «ВЫКЛ», то вы увидите пропуски в случае отсутствия данных.\n\n**Настройки Бинарной диаграммы \\(Binary Chart Settings\\)** Этот тип диаграммы полезен для построения двоичных данных, например, когда устройство было включено или выключено, или когда было обнаружено движение или когда был достигнут определенный порог значений.\n\nВам необходимо указать точку **Перехода \\(FLIP\\)**, которая будет точкой, в которой входящие данные будут принимать состояние `ИСТИНА (TRUE)` или `ЛОЖЬ (FALSE)`.\n\nНапример, вы отправляете данные в диапазоне от 0 до 1023. Если вы установите `512` в качестве точки **Перехода \\(FLIP\\)**, то все, что выше `512` \\(исключая 512\\), будет записано как `ИСТИНА (TRUE)`, любое значение ниже `512` \\(включая 512\\) будет `ЛОЖЬ (FALSE)`.\n\nДругой пример: если вы отправляете `0 и 1` и устанавливаете `0` в качестве точки **Перехода FLIP**, то `1` будет `ИСТИНА`, а `0` будет `ЛОЖЬ`.\n\n**Маркеры состояния \\(State Labels\\):** Здесь вы можете указать, как `ИСТИНА/ЛОЖЬ` должны отображаться на графике когда вы нажимаете и удерживаете палец. Например, вы можете установить значение `ИСТИНА` как `Оборудование ВКЛ`, `ЛОЖЬ` как `Оборудование ВЫКЛ`.\n\n"
  },
  {
    "path": "untitled/barometer.md",
    "content": "# Barometer/pressure\n\nBarometer/pressure is kind of [environment sensors](https://developer.android.com/guide/topics/sensors/sensors_environment.html) that allows you to measure the ambient air pressure.\n\nMeasured in in `hPa` or `mbar`.\n\nIn oder to accept data from it you need to :\n\n```cpp\nBLYNK_WRITE(V1) {\n  //pressure in mbar\n  int pressure = param[0].asInt(); \n}\n```\n\nBarometer doesn't work in background.\n\n"
  },
  {
    "path": "untitled/ble.md",
    "content": "# BLE\n\nWidget for enabling Bluetooth Low Energy support. At the moment BLE widget requires internet connection in order to login and load your profile. However this will be fixed soon. Also some Blynk widgets not allowed with BLE.\n\nBlynk currently support bunch of different modules. Please check sketches below.\n\n**Sketches:** [BLE](https://github.com/blynkkk/blynk-library/tree/master/examples/Boards_Bluetooth)\n\n"
  },
  {
    "path": "untitled/blob/README.md",
    "content": "# blob\n\n"
  },
  {
    "path": "untitled/blob/master.md",
    "content": "# master\n\n"
  },
  {
    "path": "untitled/blob/menu/README.md",
    "content": "# Меню \\(Menu\\)\n\nВиджет Меню позволяет отправлять команды на ваше оборудование на основе выборного списка, сделанного вами в пользовательском интерфейсе. Меню отправляет индекс выбранного элемента спика, а не саму строку. Отправляемый индекс начинается с 1. Он работает так же, как типовой элемент \"Комбинированный список\" \\([ComboBox](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA)\\).\n\nПример кода:\n\n```cpp\nBLYNK_WRITE {\n  switch (param.asInt()) {\n    case 1: { // Пункт 1\n      Serial.println(\"Выбран Пункт 1\");\n      break;\n    }\n    case 2: { // Пункт 2\n      Serial.println(\"Выбран Пункт 2\");\n      break;\n    }    \n  }\n}\n```\n\nВы также можете назначить пункты меню со стороны оборудования с помощью кода:\n\n```cpp\nBlynk.setProperty(V1, \"labels\", \"label 1\", \"label 2\", \"label 3\");\n```\n\n**Пример кода:** [Меню](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Menu/Menu.ino)\n\n"
  },
  {
    "path": "untitled/blob/menu/blynkkk-blynkkk.github.io-1.md",
    "content": "# blynkkk/blynkkk.github.io\n\n[Permalink](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/Amendments.md)\n\nCannot retrieve contributors at this time\n\n 12 lines \\(12 sloc\\) 744 Bytes\n\n\\#Blynk Amendments \\#\\#\\#Tell every maker about Blynk No pressure. Just do it. Now. \\#\\#\\#Make your idea work without Blynk Blynk can be easily integrated in almost any project. But before that - make it work **without** it. After you are sure that you can get all the sensor data or can control things from the code – integrate Blynk and make it even more awesome. \\#\\#\\#Use search We are always happy to chat and help, but remember - every time you ask the question that was answered many many times before that, Blynk Team is not building a new widget or new cool feature. So:\n\n* google before asking\n* use search on our forum, it works really well\n* check Instructables \\#\\#\\#Always wrap your code Though shalt not post code without `wrapping it`\n\n"
  },
  {
    "path": "untitled/blob/proximity.md",
    "content": "# Близость \\(Proximity\\)\n\nБлизость - это своего рода [датчики положения](https://developer.android.com/guide/topics/sensors/sensors_position.html) это позволяет определить, насколько близко смартфон к лицу. Измеряется в `cm` \\(см\\) - расстояние от телефона до лица. Однако большинство этих датчиков возвращает только информацию FAR / NEAR. Поэтому, возвращаемое значение будет `0 / 1`. Где 0 / LOW = `FAR` \\(далеко\\), а 1 / HIGH = `NEAR` \\(рядом\\).\n\nДля того, чтобы принять данные из виджета, вам необходимо:\n\n```cpp\nBLYNK_WRITE(V1) {\n  //  расстояние до объекта\n  int proximity = param.asInt();\n  if (proximity) {\n     // РЯДОМ\n  } else {\n     // ДАЛЕКО\n  }\n}\n```\n\nВиджет близость не работает в фоновом режиме.\n\n"
  },
  {
    "path": "untitled/blob/styled_button/README.md",
    "content": "# Стилизованная кнопка \\(Styled Button\\)\n\nРаботает в режиме кнопки или выключателя. Позволяет отправить любое числовое значение при нажатии и отпускании кнопки. По умолчанию кнопка использует значения 0/1 \\(HIGH/LOW\\). Кнопка при нажатии отправляет 1 \\(HIGH\\) а при отпускании отправляет 0 \\(LOW\\).\n\nВы можете изменить состояние кнопки со стороны оборудования. Например, включить кнопку, назначенную виртуальному пин-у V1:\n\n```cpp\nBlynk.virtualWrite(V1, HIGH);\n```\n\nВы можете изменить надписи кнопок со стороны оборудования при помощи кода:\n\n```cpp\nBlynk.setProperty(V1, \"onLabel\", \"ВКЛ\");\nBlynk.setProperty(V1, \"offLabel\", \"ВЫКЛ\");\n```\n\nили изменить цвет кнопки во включенном и выключенном состоянии:\n\n```cpp\nBlynk.setProperty(V1, \"onColor\", \"#D3435C\");\nBlynk.setProperty(V1, \"offColor\", \"#D3435C\");\n```\n\nили изменить цвет фона кнопки:\n\n```cpp\nBlynk.setProperty(V1, \"onBackColor\", \"#00435C\");\nBlynk.setProperty(V1, \"offBackColor\", \"#00435C\");\n```\n\nВы также можете узнать состояние кнопки с сервера, если ваше оборудование внезапно отключилось, с помощью функции Blynk.Sync:\n\n```cpp\nBLYNK_CONNECTED() {\n  Blynk.syncVirtual(V1);\n}\n\nBLYNK_WRITE(V1) {\n  int buttonState = param.asInt();\n}\n```\n\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n**Пример кода:** [Синхронизация состояния с физической кнопкой через прерывания](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonInterrupt/ButtonInterrupt.ino)\n\n**Пример кода:** [Синхронизация состояния с физической кнопкой через поллинг](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonPoll/ButtonPoll.ino)\n\n**Пример кода:** [Синхронизация состояния с физической кнопкой](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/SyncPhysicalButton/SyncPhysicalButton.ino)\n\n"
  },
  {
    "path": "untitled/blob/styled_button/blynkkk-blynkkk.github.io.md",
    "content": "# blynkkk/blynkkk.github.io\n\n[Permalink](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/License.md)Branch: master\n\n###  [blynkkk.github.io]()/**License.md** <a id=\"blob-path\"></a>\n\n [Go to file](../../find/blynkkk-blynkkk.github.io.md) \n\n*  [Go to file T](../../find/blynkkk-blynkkk.github.io.md)\n* * *  Copy path\n\nCannot retrieve contributors at this time\n\n 2 lines \\(2 sloc\\) 63 Bytes\n\n[Raw](https://github.com/blynkkk/blynkkk.github.io/raw/master/License.md) [Blame](https://github.com/blynkkk/blynkkk.github.io/blame/master/License.md) \n\n## License\n\nThis project is released under The MIT License \\(MIT\\)\n\n"
  },
  {
    "path": "untitled/blob/textinput.md",
    "content": "# Текстовый ввод \\(Text Input\\)\n\nОтображается как строка текстового ввода, где вы можете напрямую изменять строковое значение. Также вы можете ограничить максимальное количество вводимых символов в настройках виджета.\n\n"
  },
  {
    "path": "untitled/blob/timeinput/README.md",
    "content": "# Ввод времени \\(Time Input\\)\n\nВиджет Ввода времени позволяет вам выбрать время начала/окончания, день недели, часовой пояс, значения в формате до полудня/после полудня и отправить их на ваше оборудование. В настоящее время поддерживаются следующие форматы: `ЧЧ:ММ` и `ЧЧ:ММ AM/PM`.\n\nАппаратное устройстов будет отсчитывать время пользовательского интерфейса в виде секунд дня \\(`3600 * часов + 60 * минут`\\) для запуска/остановки времения. Время, которое виджет отправляет оборудованию, является локальным временем пользователя. Индексы по выбранных дней:\n\n```text\nПонедельник - 1\nВторник - 2\n...\nСуббота - 6\nВоскресенье - 7\n```\n\nВы также можете изменить состояние виджета в интерфейсе пользователя. Смотрите ниже примеры кода.\n\n**Пример кода:** [Простой Ввод времени для времени начала](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/SimpleTimeInput/SimpleTimeInput.ino)\n\n**Пример кода:** [Расширенный Ввод времени](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/AdvancedTimeInput/AdvancedTimeInput.ino)\n\n**Пример кода:** [Обновление Ввода времени в пользовательском интерфейсе](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/UpdateTimeInputState/UpdateTimeInputState.ino)\n\n"
  },
  {
    "path": "untitled/blob/timeinput/blynkkk-blynkkk.github.io-2.md",
    "content": "# blynkkk/blynkkk.github.io\n\n[Permalink](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/AppExport.md)\n\nCannot retrieve contributors at this time\n\n 28 lines \\(23 sloc\\) 1.3 KB\n\n## App Export\n\n### Firmware for ESP8266, NodeMCU, BlynkBoard, etc.\n\n#### Prepare development environment\n\n1. Install [Arduino IDE](https://www.arduino.cc/en/Main/Software)\n2. Install [Blynk Library](https://github.com/blynkkk/blynk-library/releases/latest) and restart Arduino IDE\n3. Install [ESP8266 core for Arduino](https://github.com/esp8266/Arduino#installing-with-boards-manager)\n4. For Windows / OS X, you may need to install USB-Serial drivers according to your converter:\n\n* СP2102: [https://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx](https://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx)\n* FTDI \\(FT232, etc\\): [http://www.ftdichip.com/Drivers/VCP.htm](http://www.ftdichip.com/Drivers/VCP.htm)\n* _TODO: Link to drivers for CH340 and PL2303._\n\n1. If your board has a NeoPixel RGB LED, install [Adafruit NeoPixel](https://github.com/adafruit/Adafruit_NeoPixel) library from Library Manager\n\n#### Build your Firmware\n\n1. Open our example in Arduino IDE: `File -> Examples -> Blynk -> Provisioning -> Blynk_ESP8266`\n2. Open `Settings.h` tab.\n3. Configure your firmware:\n\n* `BOARD_NAME` - ...\n* `BOARD_VENDOR` - ...\n* `PRODUCT_WIFI_SSID` - ...\n\n#### Upload firmare\n\n1. Select your board type: `Tools -> Board -> [Your Board]`\n2. Select your port: `Tools -> Port -> [...]`\n3. Verify and Upload!\n\nNote that for Blynk Board, you can select board type `NodeMCU 1.0`.\n\n"
  },
  {
    "path": "untitled/bluetooth.md",
    "content": "# Bluetooth\n\nWidget for enabling Bluetooth support. At the moment Bluetooth widget supported only for Android and requires internet connection in order to login and load your profile. However this will be fixed soon. Also some Blynk widgets not allowed with Bluetooth.\n\nBlynk currently support bunch of different modules. Please check sketches below.\n\n**Sketches:** [Bluetooth](https://github.com/blynkkk/blynk-library/tree/master/examples/Boards_Bluetooth)\n\n"
  },
  {
    "path": "untitled/blynkkk-blynkkk.github.io/README.md",
    "content": "# blynkkk/blynkkk.github.io\n\n You can’t perform that action at this time.\n\n"
  },
  {
    "path": "untitled/blynkkk-blynkkk.github.io/gps_trigger.md",
    "content": "# Триггер GPS \\(GPS Trigger\\)\n\nВиджет Триггер GPS позволяет легко инициировать события, когда вы входите или выходите из географической зоны. Этот виджет будет работать в фоновом режиме и периодически будет проверять ваши координаты. Если ваше местоположение находится в пределах или вне указанной зоны \\(географическая зона выбирается на карте виджета\\), виджет отправит команду `HIGH`/`LOW` на аппаратное устройство. Например, Триггер GPS назначен для пина `V1`, и включена опция `Trigger When Enter`. В этом случае, когда вы окажитесь в указанной географической зоне виджет вызовет событие `HIGH`.\n\n```cpp\nBLYNK_WRITE(V1) {\n  int state = param.asInt();\n  if (state) {\n      //Вы вошли в зону\n  } else {\n      //Вы вышли из зоны\n  }\n}\n```\n\nПодробнее о том, как работает GPS-виджет, вы можете прочитать [здесь](https://developer.android.com/guide/topics/location/strategies.html).\n\n**ВНИМАНИЕ:** Виджет Триггер GPS работает в фоновом режиме.\n\n"
  },
  {
    "path": "untitled/blynkkk-blynkkk.github.io-1/README.md",
    "content": "# blynkkk/blynkkk.github.io\n\n You can’t perform that action at this time.\n\n"
  },
  {
    "path": "untitled/blynkkk-blynkkk.github.io-1/rtc.md",
    "content": "# Часы реального времени \\(RTC\\)\n\nЧасы реального времени позволяют получать время с сервера. Вы можете предварительно выбрать любой часовой пояс в пользовательском интерфейсе, чтобы получить время на оборудование из нужной локали.\n\n**Пример кода:** [Часы реального времени](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/RTC/RTC.ino)\n\n"
  },
  {
    "path": "untitled/blynkkk-blynkkk.github.io-2/README.md",
    "content": "# blynkkk/blynkkk.github.io\n\n [Labels 7](https://github.com/blynkkk/blynkkk.github.io/labels) [Milestones 0](https://github.com/blynkkk/blynkkk.github.io/milestones)\n\n New issue\n\n **Have a question about this project?** Sign up for a free GitHub account to open an issue and contact its maintainers and the community.\n\nBy clicking “Sign up for GitHub”, you agree to our [terms of service](https://help.github.com/terms) and [privacy statement](https://help.github.com/privacy). We’ll occasionally send you account related emails.\n\n Already on GitHub? [Sign in](https://github.com/login?return_to=%2Fblynkkk%2Fblynkkk.github.io%2Fissues%2Fnew) to your account\n\n**ProTip!** Type g p on any issue or pull request to go back to the pull request listing page.\n\n"
  },
  {
    "path": "untitled/blynkkk-blynkkk.github.io-2/eventor.md",
    "content": "# Обработчик событий \\(Eventor\\)\n\nВиджет Обработчик событий позволяет создавать простые правила поведения или **события**. Давайте рассмотрим типичный вариант использования: считывание температуры с датчика DHT и отправка push-уведомления, когда температура превышает определенный предел:\n\n```cpp\n  float t = dht.readTemperature();\n  if (isnan(t)) {\n    return;\n  }\n  if (t > 40) {\n    Blynk.notify(String(\"Температура слишком высокая: \") + t);\n  }\n```\n\nС Обработчиком событий вам не нужно писать этот код. Все, что вам нужно, это отправить значение с датчика на сервер Blynk:\n\n```cpp\n  float t = dht.readTemperature();\n  Blynk.virtualWrite(V0, t);\n```\n\nНе забывайте, что команды `virtualWrite` должны быть заключены в таймер и не должны использоваться в основном цикле `loop`.\n\n**ПРИМЕЧАНИЕ:** Не забудьте добавить виджет уведомлений в приложении.\n\nОбработчик событий пригодится вам, когда нужно изменить условия на лету без повторной загрузки нового скетча на аппаратное обеспечение. Вы можете создать столько **событий**, сколько вам нужно. Обработчик событий также может быть запущен со стороны приложения. Вам просто нужно назначить виджет на тот же контакт, что и ваше событие в Обработчике событий. Обработчик событий не постоянно отправляет события. Давайте рассмотрим простой пример, как показано выше `if (temperature > 40) send notification`. Когда температура превышает 40 пороговых значений - отправляется уведомление. Если температура продолжает оставаться выше 40 никакие повторные действия не будут инициированы. Но если `temperature` опускается ниже порогового значения, а затем проходит его снова уведомление будет отправлено повторно \\(для уведомлений Обработчика событий нет ограничения отправки в течение 5 секунд\\).\n\nОбработчик событий также поддерживает события таймера \\(Timer\\). Например, вы можете установить пин `V1` ON/HIGH в 21:00:00 каждую пятницу. В Обработчике событий вы можете назначить несколько таймеров на один и тот же пин, отправить любую строку/число, выбрать день и часовой пояс.\n\nЧтобы удалить созданное **событие**, пожалуйста, используйте сдвиг пальцем по экрану. Вы также можете перенести последний элемент самого события.\n\n**Пример кода:** [Обработчик событий](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Eventor/Eventor.ino)\n\n**ПРИМЕЧАНИЕ:** Виджет таймера зависит от времени сервера, а не вашего телефона. Иногда время телефона может не соответствовать времени сервера.\n\n**ПРИМЕЧАНИЕ:** события запускаются только один раз при выполнении условия. Это означитает что \\[цепочка событий\\] \\([https://community.blynk.cc/t/eventor-behavior-bug-feature/20962](https://community.blynk.cc/t/eventor-behavior-bug-feature/20962)\\) невозможна \\(однако она может быть включена в коммерческой версии\\).\n\n"
  },
  {
    "path": "untitled/blynkkk-blynkkk.github.io-3/README.md",
    "content": "# blynkkk/blynkkk.github.io\n\n**ProTip!** Adding [no:label](https://github.com/blynkkk/blynkkk.github.io/issues?q=is%3Apr+is%3Aopen+no%3Alabel) will show everything without a label.\n\n You can’t perform that action at this time. \n\n"
  },
  {
    "path": "untitled/blynkkk-blynkkk.github.io-3/email.md",
    "content": "# email\n\n## Электронная почта \\(Email\\)\n\nВиджет электронной почты позволяет отправлять электронные письма с вашего оборудования на любой адрес.\n\nПример кода:\n\n```cpp\nBlynk.email(\"my_email@example.com\", \"Тема\", \"Текст вашего сообщения\");\n```\n\nКод содержит первое поле `to`. С помощью этого поля вы можете определить получателей электронной почты в приложении. Вы можете пропустить поле `to`, если хотите отправить электронное письмо на адрес электронной почты используемый для входа в приложение Blynk:\n\n```cpp\n Blynk.email(\"Тема\", \"Текст вашего сообщения\");\n```\n\nВы можете отправить электронное писбом в форматах либо `text/html`, либо `text/plain` \\(помните что некоторые клиенты не поддерживают `text/html`\\). Вы можете изменить формат содержимого электронного письма в настройках виджета.\n\nДополнительно в письме вы можете использовать заполнители/переменные `{DEVICE_NAME}`, `{DEVICE_OWNER_EMAIL}` и `{VENDOR_EMAIL}` \\(для локального сервера\\) в полях `to` \\(кому\\),`subject` \\(тема\\) и `body` \\(текст сообщения\\):\n\n```cpp\nBlynk.email(\"{DEVICE_OWNER_EMAIL}\", \"{DEVICE_NAME} : Тревога\", \"Ваше устройство {DEVICE_NAME} имеет критическую ошибку!\");\n```\n\n**Недостатки:**\n\n* Максимально допустимые ограничения \\(почта + тема + длина сообщения\\) = 120 символов. Однако вы можете увеличить этот лимит при необходимости добавив `#define BLYNK_MAX_SENDBYTES XXX` к вашему коду. Где `XXX` - это максимальная длина вашего письма в символах.\n\n  Например, для ESP вы можете установить максимальную длину 1200 символов `#define BLYNK_MAX_SENDBYTES 1200`. Параметр  `#define BLYNK_MAX_SENDBYTES 1200` должен быть опредлен в коде до включения Blynk.\n\n* Разрешено отправлять 1 электронное письмо в течение 5 секунд;\n* Если вы используете Gmail сервис \\(Google\\), вы ограничены 500 письмами в день. Другие провайдеры могут иметь аналогичные ограничения, поэтому, пожалуйста, будьте внимательны;\n* Пользователи Blynk сервера ограничены 100 сообщениями в день;\n\n## Кодировка в электронной почте\n\nБиблиотека обрабатывает все строки в кодировке UTF-8. Если у вас возникли проблемы, попробуйте напечатать ваше сообщение в терминал COM порта и посмотрите на результат \\(терминал должен быть настроен на кодировку UTF-8\\). Если не работает, возможно, вам следует также прочитать о поддержке кодировок вашего компилятора. Если работает, но ваше сообщение обрезано - вам нужно увеличить ограничение длины сообщения \\(т.к. все символы кодировки UTF-8 потребляют как минимум вдвое больше байт информации если символы не Латинские\\).\n\n## Увеличение лимита длины сообщения\n\nВы можете увеличить максимальную длину сообщения, поместив в верхнюю часть своего кода строку \\(до опредления Blynk\\):\n\n```cpp\n#define BLYNK_MAX_SENDBYTES 256 // По умолчанию 128 байт\n```\n\n**Пример кода:** [Электронная почта](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Email/Email.ino)\n\n"
  },
  {
    "path": "untitled/blynkkk-blynkkk.github.io-4/README.md",
    "content": "# blynkkk/blynkkk.github.io\n\nAutomate your workflow from idea to production\n\nGitHub Actions makes it easy to automate all your software workflows, now with world-class CI/CD. Build, test, and deploy your code right from GitHub.\n\n![Operating systems and containers](https://github.githubassets.com/images/modules/actions/actions-linux-and-containers.svg)\n\n## Linux, macOS, Windows, ARM, and containers\n\nHosted runners for every major OS make it easy to build and test all your projects. Run directly on a VM or inside a container. Use your own VMs, in the cloud or on-prem, with self-hosted runners.\n\n![Matrix builds](https://github.githubassets.com/images/modules/actions/actions-matrix.svg)\n\n## Matrix builds\n\nSave time with matrix workflows that simultaneously test across multiple operating systems and versions of your runtime.\n\n![Any language](https://github.githubassets.com/images/modules/actions/actions-any-lang.svg)\n\n## Any language\n\nGitHub Actions supports Node.js, Python, Java, Ruby, PHP, Go, Rust, .NET, and more. Build, test, and deploy applications in your language of choice.\n\n![Live logs](https://github.githubassets.com/images/modules/actions/actions-live-logs.svg)\n\n## Live logs\n\nSee your workflow run in realtime with color and emoji. It’s one click to copy a link that highlights a specific line number to share a CI/CD failure.\n\n![Secret store](https://github.githubassets.com/images/modules/actions/actions-secret-store.svg)\n\n## Built-in secret store\n\nAutomate your software development practices with workflow files embracing the Git flow by codifying it in your repository.\n\n![Multi-container testing](https://github.githubassets.com/images/modules/actions/actions-multi-container-testing.svg)\n\n## Multi-container testing\n\nTest your web service and its DB in your workflow by simply adding some `docker-compose` to your workflow file.\n\n"
  },
  {
    "path": "untitled/blynkkk-blynkkk.github.io-4/tabs.md",
    "content": "# Вкладки \\(Tabs\\)\n\nЕдинственная цель виджета Вкладки - расширить пространство вашего проекта. Чтобы редактировать виджет Вкладок - просто нажмите на выбранную вкладку. Вы можете перетаскивать виджеты между вкладками. Из списка можно удалить только последнюю вкладку: чтобы удалить ее, проведите пальцем влево по ее названию в экране настроек виджета.\n\nМаксимальное количество вкладок на iOS составляет 4.\n\nМаксимальное количество вкладок на Android - 10.\n\nОставайтесь с нами для предстоящего редизайна виджета вкладок!\n\n"
  },
  {
    "path": "untitled/blynkkk-blynkkk.github.io-5/README.md",
    "content": "# blynkkk/blynkkk.github.io\n\nOrganize your issues with project boards\n\nDid you know you can manage projects in the same place you keep your code? Set up a project board on GitHub to streamline and automate your workflow.\n\n![get organized](https://github.githubassets.com/images/modules/projects/octicon-get-organized.svg)\n\nSort tasks\n\nAdd issues and pull requests to your board and prioritize them alongside note cards containing ideas or task lists.\n\n![plan project](https://github.githubassets.com/images/modules/projects/octicon-plan-project.svg)\n\nPlan your project\n\nSort tasks into columns by status. You can label columns with status indicators like \"To Do\", \"In Progress\", and \"Done\".\n\n![automate workflow](https://github.githubassets.com/images/modules/projects/octicon-automate-workflow.svg)\n\nAutomate your workflow\n\nSet up triggering events to save time on project management—we’ll move tasks into the right columns for you.\n\n![track progress](https://github.githubassets.com/images/modules/projects/octicon-track-progress.svg)\n\nTrack progress\n\nKeep track of everything happening in your project and see exactly what’s changed since the last time you looked.\n\n![share status](https://github.githubassets.com/images/modules/projects/octicon-share-status.svg)\n\nShare status\n\nEach card has a unique URL, making it easy to share and discuss individual tasks with your team.\n\n![finish project](https://github.githubassets.com/images/modules/projects/octicon-finish-project.svg)\n\nWrap up\n\nAfter you wrap up your work, close your project board to remove it from your active projects list. On to the next project!\n\n"
  },
  {
    "path": "untitled/blynkkk-blynkkk.github.io-5/map.md",
    "content": "# Карта \\(Map\\)\n\nВиджет Карты позволяет устанавливать точки/флажки на карте со стороны оборудования. Это очень полезный виджет, если у вас есть несколько устройств, и вы хотите отслеживать их позиции на карте.\n\nВы можете отправить точку на карту с помощью обычной команды виртуальной записи:\n\n```cpp\nBlynk.virtualWrite(V1, pointIndex, lat, lon, \"Название\");\n```\n\nМы также создали оболочку, чтобы вы могли упростить использование виджета Карты. Вы можете изменить метки флажков на оборудовании с помощью кода:\n\n```cpp\nWidgetMap myMap(V1);\n...\nint index = 1;\nfloat lat = 51.5074;\nfloat lon = 0.1278;\nmyMap.location(index, lat, lon, \"Название\");\n```\n\nИспользование уникальных `index` позволяет вам переопределить существующее значение точки.\n\n**Пример кода:** [Базовый пример Карты](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Map/Map.ino)\n\n"
  },
  {
    "path": "untitled/blynkkk-blynkkk.github.io-6/README.md",
    "content": "# blynkkk/blynkkk.github.io\n\n Period: 1 week\n\nFilter activity [24 hours](https://github.com/blynkkk/blynkkk.github.io/pulse/daily) [3 days](https://github.com/blynkkk/blynkkk.github.io/pulse/halfweekly) [1 week](./) [1 month](https://github.com/blynkkk/blynkkk.github.io/pulse/monthly)\n\n## Overview\n\n* 2 Active Pull Requests\n\n  8 Active Issues\n\n* *  [1 Merged Pull Request](./#merged-pull-requests)\n  *  [1 Proposed Pull Request](./#proposed-pull-requests)\n  *  [8 Closed Issues](./#closed-issues)\n  *  0 New Issues\n\n## Loading contribution data...\n\n![GitHub loading spinner](https://github.githubassets.com/images/spinners/octocat-spinner-128.gif)\n\n## Could not load contribution data\n\nPlease try again later\n\n![](https://github.githubassets.com/images/spinners/octocat-spinner-128.gif)\n\n##  1 Pull request merged by 1 person <a id=\"merged-pull-requests\"></a>\n\n*  Merged \\#41 [Change float to double](../pull/change-float-to-double-by-earlold-pull-request-41.md)Jul 1, 2020\n\n##  1 Pull request proposed by 1 person <a id=\"proposed-pull-requests\"></a>\n\n*  Proposed \\#42 [Create Template IDs, Categories and Hotspot prefix decription files.](https://github.com/blynkkk/blynkkk.github.io/pull/42)Jul 1, 2020\n\n##  8 Issues closed by 1 person <a id=\"closed-issues\"></a>\n\n*  Closed \\#29 [The Button “How can I build my own app?” leads to the same page](https://github.com/blynkkk/blynkkk.github.io/issues/29)Jun 30, 2020\n*  Closed \\#28 [Two identical instruction gifs on one page](https://github.com/blynkkk/blynkkk.github.io/issues/28)Jun 30, 2020\n*  Closed \\#24 [Add missing mobile help pages](https://github.com/blynkkk/blynkkk.github.io/issues/24)Jun 30, 2020\n*  Closed \\#21 [Add brew installation instruction for Mac](https://github.com/blynkkk/blynkkk.github.io/issues/21)Jun 30, 2020\n*  Closed \\#30 [Link doesn't work \\(no such anchor \"resetting the board\"\\)](https://github.com/blynkkk/blynkkk.github.io/issues/30)Jun 30, 2020\n*  Closed \\#31 [No picture zooming effect on some pictures](https://github.com/blynkkk/blynkkk.github.io/issues/31)Jun 30, 2020\n*  Closed \\#32 [Typos and grammar issues](https://github.com/blynkkk/blynkkk.github.io/issues/32)Jun 30, 2020\n*  Closed \\#40 [Joystick + servo not working, but it working with slider](https://github.com/blynkkk/blynkkk.github.io/issues/40)Jun 30, 2020\n\n"
  },
  {
    "path": "untitled/blynkkk-blynkkk.github.io-6/ble.md",
    "content": "# Bluetooth с низким энергопотреблением\n\nЭтот виджет позволяет включить блутзуз с низким энергопотреблением на вашем телефоне. На текущий момент виджет также требует наличия интернет соединения \\(постараемся пофиксить в ближайшем будущем\\). Некоторые типы виджетов нельзя использовать вместе с блутузом, например исторический граф, так как он требует чтобы данные отправлялись на сервер, чего блутуз виджет не делает.\n\n**Список поддерживаемых чипов и контроллеров:** [BLE](https://github.com/blynkkk/blynk-library/tree/master/examples/Boards_Bluetooth)\n\n"
  },
  {
    "path": "untitled/blynkkk-blynkkk.github.io-7/README.md",
    "content": "# blynkkk/blynkkk.github.io\n\n This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key.\n\n"
  },
  {
    "path": "untitled/blynkkk-blynkkk.github.io-7/device_tiles.md",
    "content": "# Плитка устройств \\(Device Tiles\\)\n\nПлитка устройств - это мощный виджет, очень похожий на виджет Селектора устройств \\(Device Selector\\), но с пользовательским интерфейсом. Позволяет отображать один пин с устройства на одну плитку. Этот виджет особенно полезен, когда у вас есть несколько устройств с аналогичной функциональностью. Теперь вы можете группировать похожие устройства на одном макете \\(шаблоне\\).\n\n"
  },
  {
    "path": "untitled/blynkkk-blynkkk.github.io-8/README.md",
    "content": "# blynkkk/blynkkk.github.io\n\n![](https://github.githubassets.com/images/spinners/octocat-spinner-128.gif)\n\n You can’t perform that action at this time. \n\n"
  },
  {
    "path": "untitled/blynkkk-blynkkk.github.io-8/temperature.md",
    "content": "# Температура \\(Temperature\\)\n\nТемпература является своего рода [датчиком окружающей среды](https://developer.android.com/guide/topics/sensors/sensors_environment.html) который позволяет измерять температуру окружающего воздуха. Измеряется в `°C` - градусах Цельсия.\n\nДля приема данных из виджета, необходимо использовать код:\n\n```cpp\nBLYNK_WRITE(V1) {\n  // температура в градусах цельсия\n  int celcius = param.asInt();\n}\n```\n\nВиджет Температуры не работает в фоновом режиме.\n\n"
  },
  {
    "path": "untitled/blynkkk-blynkkk.github.io-9/README.md",
    "content": "# blynkkk/blynkkk.github.io\n\nReleases are powered by [tagging specific points of history](https://git-scm.com/book/en/Git-Basics-Tagging) in a repository. They’re great for marking release points like `v1.0`.\n\n"
  },
  {
    "path": "untitled/blynkkk-blynkkk.github.io-9/value_display.md",
    "content": "# Отображение значений \\(Value Display\\)\n\nОтображает входящие данные с ваших датчиков или виртуальных пин-ов. Может работать в двух режимах:\n\n* режим PUSH \\(выберается в списке выбора частоты считывания\\);\n* режим частоты считываний;\n\nВ режиме PUSH вы обновляете значения виджета со стороны оборудования с помощью кода:\n\n```cpp\nBlynk.virtualWrite(V1, val);\n```\n\nВ этом режиме каждое сообщение, которое отправляет аппаратное устройство автоматически сохраняется на сервере. Режим PUSH не требует, чтобы приложение было онлайн или открыто.\n\nВ режиме частоты считывния вам необходимо выбрать интервал обновления данных, и приложение будет запускать события считывния с требуемой периодичностью. Ваше приложение должно быть открыто и запущено для отправки запросов на оборудование. Вам не нужен код для аналоговых и цифровых выводов в даном случае. Однако для виртуальных выводов вам необходимо использовать следующий код:\n\n```cpp\n//вызывать из приложения\nBLYNK_READ(V1)\n{\n  //отправить в приложение\n  Blynk.virtualWrite(V1, val);\n}\n```\n\n## Отображение значений на рабочем столе\n\nВы также можете добавить виджет отображение значения на рабочий стол Android. В этом случае отображение значений работает по протоколу HTTPS. Имейте в виду, что в режиме «Рабочий стол» отображение значений имеет несколько ограничений. Виджет будет обновлять свое состояние только один раз в 15 минут. Вы можете изменить это органичение через настройки виджета. Однако интервал обновления менее 15 минут не гарантируется. Вы также можете изменить размер отображаемого значения на рабочем столе - просто сделайте длинный тап на виджете и измените его размер на необходимый.\n\n**Примечание:** Добавление виджета на главный экран стоит 100 энергии. Эта энергия не возвращяется при удалении виджета.\n\n**Примечание:** Виджеты рабочего стола для локальных серверов Blynk требуют открытия порта 8080.\n\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n"
  },
  {
    "path": "untitled/bridge.md",
    "content": "# Bridge\n\nBridge can be used for Device-to-Device communication \\(no app. involved\\). You can send digital/analog/virtual write commands from one device to another, knowing it's auth token. At the moment Bridge widget is not required on application side \\(it is mostly used for indication that we have such feature\\).  \n**You can use multiple bridges to control multiple devices.**\n\nBridge widget takes a virtual pin, and turns it into a channel to control another device. It means you can control any virtual, digital or analog pins of the target device. Be careful not to use pins like `A0, A1, A2 ...` when communicating between different device types, as Arduino Core may refer to wrong pins in such cases.\n\nExample code for device A which will send values to device B :\n\n```cpp\n//Initiating Bridge Widget on V1 of Device A\nWidgetBridge bridge1(V1);\n...\nvoid setup() {\n    Blynk.begin(...);\n    while (Blynk.connect() == false) {\n        // Wait until Blynk is connected\n    }\n    bridge1.digitalWrite(9, HIGH); // will trigger D9 HIGH on Device B. No code on Device B required\n    bridge1.analogWrite(10, 123);\n    bridge1.virtualWrite(V1, \"hello\"); // you need to write code on Device B in order to receive this value. See below\n    bridge1.virtualWrite(V2, \"value1\", \"value2\", \"value3\");\n}\n\nBLYNK_CONNECTED() {\n  bridge1.setAuthToken(\"OtherAuthToken\"); // Token of the hardware B\n}\n```\n\nIMPORTANT: when performing `virtualWrite()` with Bridge Widget, Device B will need to process the incoming data from Device A. For example, if you are sending value from Device A to Device B using `bridge.virtualWrite(V5)` you would need to use this handler on Device B:\n\n```cpp\nBLYNK_WRITE(V5){\n    int pinData = param.asInt(); //pinData variable will store value that came via Bridge\n}\n```\n\nKeep in mind that `bridge.virtualWrite` doesn't send any value to mobile app. You need to call `Blynk.virtualWrite` for that.\n\n**Sketch:** [Bridge](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Bridge/Bridge.ino)\n\n"
  },
  {
    "path": "untitled/build-software-better-together/README.md",
    "content": "# Build software better, together\n\n## Security overview\n\n*  ![Code alert](https://github.githubassets.com/images/modules/site/icons/security-admin.svg)\n\n  View security details for this repository\n\n  See security announcements from this repository's maintainers\n\n* Security policy — Active\n\n   View how to securely report security vulnerabilities for this repository\n\n  [View security policy](https://github.com/blynkkk/blynkkk.github.io/security/policy)\n\n* \n You can’t perform that action at this time. \n\n"
  },
  {
    "path": "untitled/build-software-better-together/video.md",
    "content": "# Видео трансляция \\(Video Streaming\\)\n\nПростой виджет, который позволяет отображать прямой эфир и потокове видео. Виджет поддерживает протоколы RTSP \\(RP, SDP\\), HTTP/S прогрессивной потоковой передачи, HTTP/S прямого эфира. Для получения дополнительной информации, пожалуйста ознакомтесь с [официальной документацией Android](https://developer.android.com/guide/appendix/media-formats.html).\n\nНа данный момент команда Blynk не предоставляет потоковые серверы. Таким образом, вы можете осуществлять потоковую передачу непосредственно с ваше камеры или использовать сторонние сервисы, а также запустить собственны потоковый сервер \\(например, на оборудовании Raspberry\\).\n\nВы можете остановить/запустить видео поток, нажав на сам виджет.\n\nВы можете изменить URL-адрес видео потока с аппаратного устройства при помощи кода:\n\n```cpp\nBlynk.setProperty(V1, \"url\", \"http://my_new_video_url\");\n```\n\n"
  },
  {
    "path": "untitled/button.md",
    "content": "# Button\n\nWorks in push or switch modes. Allows to send any number value on button click and button release events. By default  \nbutton uses 0/1 \\(LOW/HIGH\\) values. Button sends 1 \\(HIGH\\) on press and sends 0 \\(LOW\\) on release.\n\nYou can change button state from hardware side. For example, turn on button assigned to virtual pin V1 :\n\n```cpp\nBlynk.virtualWrite(V1, HIGH);\n```\n\nYou can change button labels from hardware with :\n\n```cpp\nBlynk.setProperty(V1, \"onLabel\", \"ON\");\n```\n\n```cpp\nBlynk.setProperty(V1, \"offLabel\", \"OFF\");\n```\n\nor change color :\n\n```cpp\n//#D3435C - Blynk RED \nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\nYou can also get button state from server in case your hardware was disconnected with Blynk Sync feature :\n\n```cpp\nBLYNK_CONNECTED() {\n  Blynk.syncVirtual(V1);\n}\n\nBLYNK_WRITE(V1) {\n  int buttonState = param.asInt();\n}\n```\n\n## Home Screen Button\n\nYou can also add button to your Android Home Screen. Button works via HTTPS in that case. Have in mind that in \"Home Screen\" mode button has few limitations. It may not work instantly due to Android Widget limitations. Button will update it's state only once per 15 min.\n\n**Note :** Adding home screen widget costs 100 energy. This energy not rechargeable. **Note :** Home Screen Widgets for Local Blynk servers requires port 8080 to be opened.\n\n**Sketch:** [Basic Sketch](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n**Sketch:** [Physical Button Interrupt](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonInterrupt/ButtonInterrupt.ino)\n\n**Sketch:** [Physical Button Poll](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonPoll/ButtonPoll.ino)\n\n**Sketch:** [Physical Button State Sync](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/SyncPhysicalButton/SyncPhysicalButton.ino)\n\n"
  },
  {
    "path": "untitled/commit/README.md",
    "content": "# commit\n\n"
  },
  {
    "path": "untitled/commit/change-float-to-double-41-b1f1a43.md",
    "content": "# Change float to double \\(\\#41\\)@b1f1a43\n\n[Permalink](change-float-to-double-41-b1f1a43.md)\n\n Showing with **2 additions** and **2 deletions**.\n\n1.  +2 −2 [new/en/datastream\\_datatype.md](change-float-to-double-41-b1f1a43.md#diff-d66679912b8da08f2b80ec11fa273d90)\n\n|  | @@ -7,14 +7,14 @@ Make sure you choose a correct Data Type for your data. Currently, these Data Ty |  |\n| :--- | :--- | :--- |\n|  |  |  \\| Type \\| Min \\| Max \\| |\n|  |  |  \\|:--------------:\\|:---------------------------:\\|:----------------------------:\\| |\n|  |  |  \\| \\`\\`\\`Integer\\`\\`\\` \\| -2,147,483,648 \\| 2,147,483,647 \\| |\n|  |  |  \\| \\`\\`\\`Float\\`\\`\\` \\| -1.8 x 10^300 \\| 4.9 x 10^-324 \\| |\n|  |  |  \\| \\`\\`\\`Double\\`\\`\\` \\| -1.8 x 10^300 \\| 4.9 x 10^-324 \\| |\n|  |  |  \\| \\`\\`\\`String\\`\\`\\` \\| any value is accepted \\| |\n|  |  |  |\n|  |  |  |\n|  |  |  \\*\\*IMPORTANT:\\*\\* |\n|  |  |  |\n|  |  |  Blynk server will ignore values that don't match the Data Type |\n|  |  |  |\n|  |  |  Example: if Datastream has Data Type set to \\`\\`\\`Integer\\`\\`\\`, but Hardware sends \\`\\`\\`123.45\\`\\`\\`, this value will be skipped because it is \\`\\`\\`Float\\`\\`\\`, not \\`\\`\\`Integer\\`\\`\\`. |\n|  |  |  Example: if Datastream has Data Type set to \\`\\`\\`Integer\\`\\`\\`, but Hardware sends \\`\\`\\`123.45\\`\\`\\`, this value will be skipped because it is \\`\\`\\`Double\\`\\`\\`, not \\`\\`\\`Integer\\`\\`\\`. |\n|  |  |  |\n|  |  |  If the incoming value goes out of range of Min or Max setting, this value will be \"cropped\" to match this setting. |\n\n"
  },
  {
    "path": "untitled/commit/gauge.md",
    "content": "# Указатель \\(Gauge\\)\n\nОтличный визуальный способ отображения входящих числовых значений.\n\nМожет работать в 2 режимах:\n\n* режим PUSH \\(выберается в списке выбора частоты считывания\\);\n* режим частоты считываний;\n\nВ режиме PUSH вы обновляете значения указателя со стороны оборудования с помощью кода:\n\n```cpp\nBlynk.virtualWrite(V1, val);\n```\n\nВ этом режиме каждое сообщение, которое отправляет аппаратное устройство автоматически сохраняется на сервере. Режим PUSH не требует, чтобы приложение было онлайн или открыто.\n\nВ режиме частоты считывния вам необходимо выбрать интервал обновления данных, и приложение будет запускать события считывния с требуемым периодичностью. Ваше приложение должно быть открыто и запущено для отправки запросов на оборудование. Вам не нужен код для аналоговых и цифровых выводов в даном случае. Однако для виртуальных выводов вам необходимо использовать следующий код:\n\n```cpp\n//вызывать из приложения\nBLYNK_READ(V1)\n{\n  //отправить в приложение\n  Blynk.virtualWrite(V1, val);\n}\n```\n\n## Параметры форматирования\n\nУказатель также имеет поле «Label» \\(Метка\\), которое позволяет использовать форматирование. Предположим, ваш датчик отправляет число 12.6789 в приложение Blynk. Поддерживаются следующие параметры форматирования:\n\n`/pin/` - отображает значение без форматирования \\(12.6789\\)\n\n`/pin./` - отображает значение без десятичной части \\(13\\)\n\n`/pin.#/` - отображает значение с одним десятичным знаком \\(12.7\\)\n\n`/pin.##/` - отображает значение с двумя десятичными знаками \\(12.68\\)\n\n## Другие опции\n\nВы также можете изменить метку прибора с помощью:\n\n```cpp\nBlynk.setProperty(V1, \"label\", \"Мое значение метки\");\n```\n\nили изменить цвет \\(кодировка RGB\\):\n\n```cpp\n//#D3435C - Красный цвет\nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\n**Пример кода:** [Светодиод](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n"
  },
  {
    "path": "untitled/commit/music_player.md",
    "content": "# Музыкальный проигрыватель \\(Music Player\\)\n\nПростой элемент интерфейса с 3 кнопками - имитирует интерфейс музыкального проигрывателя. Каждая кнопка отправляет свою команду на аппаратное устройство: `play` \\(воспроизвести\\), `stop` \\(стоп\\), `prev` \\(предыдущий\\), `next` \\(следующий\\).\n\nВы можете изменить состояние виджета в приложении с аппаратной стороны с помощью следующих команд:\n\n```text\nBlynk.virtualWrite(Vx, \"play\");\nBlynk.virtualWrite(Vx, \"stop\");\n```\n\nВы также можете изменить состояние воспроизведение/остановка виджета с помощью следующего кода \\(эквивалент вышеупомянутых команд\\):\n\n`Blynk.setProperty(V1, \"isOnPlay\", \"false\");`\n\n**Пример кода:** [Музыкальный проигрыватель](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Player/Player.ino)\n\n"
  },
  {
    "path": "untitled/commits/README.md",
    "content": "# commits\n\n"
  },
  {
    "path": "untitled/commits/blynkkk-blynkkk.github.io.md",
    "content": "# blynkkk/blynkkk.github.io\n\n1.  Verified\n\n    This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n2.  Verified\n\n    This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n3.  Verified\n\n    This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n4.  Verified\n\n    This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n5. 6.  Verified\n\n    This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n7. 8. 9. 10.  Verified\n\n     This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n11. 12. 13.  Verified\n\n     This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n14.  Verified\n\n     This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n15.  Verified\n\n     This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n16.  Verified\n\n     This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n17.  Verified\n\n     This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n18.  Verified\n\n     This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n19.  Verified\n\n     This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n20.  Verified\n\n     This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n21.  Verified\n\n     This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n22.  Verified\n\n     This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n23.  Verified\n\n     This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n24.  Verified\n\n     This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n25.  Verified\n\n     This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n26.  Verified\n\n     This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n27.  Verified\n\n     This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n28.  Verified\n\n     This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n29.  Verified\n\n     This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n30.  Verified\n\n     This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n31.  Verified\n\n     This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n32.  Verified\n\n     This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n33.  Verified\n\n     This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n34.  Verified\n\n     This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n35.  Verified\n\n     This commit was created on GitHub.com and signed with a **verified signature** using GitHub’s key. \n\n"
  },
  {
    "path": "untitled/commits/light.md",
    "content": "# Свет \\(Light\\)\n\nСвет - это своего рода [датчики окружающей среды](https://developer.android.com/guide/topics/sensors/sensors_environment.html), который позволяет измерять уровень освещенности \\(уровень внешней освещенности измеряется в люксах\\). В телефонах чаще всего используется для управления яркостью экрана.\n\nДля того, чтобы принять данные этого виджета, вам необходимо:\n\n```cpp\nBLYNK_WRITE(V1) {\n  //уровень освещенности\n  int lx = param.asInt(); \n}\n```\n\nВиджет Свет не работает в фоновом режиме.\n\n"
  },
  {
    "path": "untitled/commits/time_input.md",
    "content": "# Ввод времени \\(Time Input\\)\n\nВиджет Ввода времени позволяет вам выбрать время начала/окончания, день недели, часовой пояс, значения в формате до полудня/после полудня и отправить их на ваше оборудование. В настоящее время поддерживаются следующие форматы: `ЧЧ:ММ` и `ЧЧ:ММ AM/PM`.\n\nАппаратное устройстов будет отсчитывать время пользовательского интерфейса в виде секунд дня \\(`3600 * часов + 60 * минут`\\) для запуска/остановки времения. Время, которое виджет отправляет оборудованию, является локальным временем пользователя. Индексы по выбранных дней:\n\n```text\nПонедельник - 1\nВторник - 2\n...\nСуббота - 6\nВоскресенье - 7\n```\n\nВы также можете изменить состояние виджета в интерфейсе пользователя. Смотрите ниже примеры кода.\n\n**Пример кода:** [Простой Ввод времени для времени начала](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/SimpleTimeInput/SimpleTimeInput.ino)\n\n**Пример кода:** [Расширенный Ввод времени](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/AdvancedTimeInput/AdvancedTimeInput.ino)\n\n**Пример кода:** [Обновление Ввода времени в пользовательском интерфейсе](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/UpdateTimeInputState/UpdateTimeInputState.ino)\n\n"
  },
  {
    "path": "untitled/device_selector.md",
    "content": "# Device Selector\n\nDevice selector is a powerful widget which allows you to update widgets based on one active device. This widget is particularly helpful when you have a fleet of devices with similar functionality.\n\nImagine you have 4 devices and every device has a Temperature & Humidity sensor connected to it. To display the data for all 4 devices you would need to add 8 widgets.\n\nWith Device Selector, you can use only 2 Widgets which will display Temperature and Humidity based on the active device chosen in Device Selector.\n\nAll you have to do is:\n\n1. Add Device Selector Widget to the project\n2. Add 2 widgets \\(for example Value Display Widget\\) to show Temperature and Humidity\n3. In Widgets Settings you will be able assign them to Device Selector \\(Source or Target section\\)\n4. Exit settings, Run the project. \n\nNow you can change the active device in Device Selector and you will see that Temperature and Humidity values are reflecting the data updates for the device you just picked.\n\n**NOTE :**  Webhook Widget will not work with Device Selector \\(yet\\).\n\n"
  },
  {
    "path": "untitled/device_tiles.md",
    "content": "# Device Tiles\n\nDevice tiles is a powerful widget and very similar to the device selector widget, but with UI. It allows you to display 1 pin per device per tile. This widget is particularly helpful when you have a fleet of devices with similar functionality. So you can group similar devices within one layout \\(template\\).\n\n"
  },
  {
    "path": "untitled/email.md",
    "content": "# email\n\n## Email\n\nEmail widget allows you to send email from your hardware to any address.\n\nExample code:\n\n```cpp\nBlynk.email(\"my_email@example.com\", \"Subject\", \"Your message goes here\");\n```\n\nIt also contains `to` field. With this field you may define receiver of email in the app. You may skip `to` field when you want to send email to your Blynk app login email:\n\n```cpp\n Blynk.email(\"Subject\", \"Your message goes here\");\n```\n\nYou can send either `text/html` or `text/plain` \\(some clients don't support `text/html`\\) email. You can change this content type of email in the Mail widget settings.\n\nAdditionally you may use `{DEVICE_NAME}`, `{DEVICE_OWNER_EMAIL}` and `{VENDOR_EMAIL}` \\(for the local server\\) placeholders in the mail for the `to`, `subject` and `body` fields:\n\n```cpp\nBlynk.email(\"{DEVICE_OWNER_EMAIL}\", \"{DEVICE_NAME} : Alarm\", \"Your {DEVICE_NAME} has critical error!\");\n```\n\nLimitations :\n\n* Maximum allowed email + subject + message length is 120 symbols. However you can increase this limit if necessary \n\n  by adding `#define BLYNK_MAX_SENDBYTES XXX` to you sketch. Where `XXX` is desired max length of your email. \n\n  For example for ESP you can set this to 1200 max length `#define BLYNK_MAX_SENDBYTES 1200`. The \n\n  `#define BLYNK_MAX_SENDBYTES 1200` must be included before any of the Blynk includes.\n\n* Only 1 email per 5 seconds is allowed;\n* In case you are using gmail you are limited with 500 mails per day \\(by google\\). Other providers may have similar\n\n  limitations, so please be careful;\n\n* User is limited with 100 messages per day;\n\n## Unicode in email\n\nThe library handles all strings as UTF8 Unicode. If you're facing problems, try to print your message to the Serial and see if it works \\(the terminal should be set to UTF-8 encoding\\). If it doesn't work, probably you should read about unicode support of your compiler. If it works, but your message is truncated - you need to increase message length limit \\(all Unicode symbols consume at least twice the size of Latin symbols\\).\n\n## Increasing message length limit\n\nYou can increase maximum message length by putting on the top of your sketch \\(before Blynk includes\\):\n\n```cpp\n#define BLYNK_MAX_SENDBYTES 256 // Default is 128\n```\n\n**Sketch:** [Email](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Email/Email.ino)\n\n"
  },
  {
    "path": "untitled/eventor.md",
    "content": "# Eventor\n\nEventor widget allows you to create simple behaviour rules or **events**. Let's look at a typical use case: read temperature from DHT sensor and send push notification when the temperature is over a certain limit :\n\n```cpp\n  float t = dht.readTemperature();\n  if (isnan(t)) {\n    return;\n  }\n  if (t > 40) {\n    Blynk.notify(String(\"Temperature is too high : \") + t);\n  }\n```\n\nWith Eventor you don't need to write this code. All you need is to send the value from the sensor to the server :\n\n```cpp\n  float t = dht.readTemperature();\n  Blynk.virtualWrite(V0, t);\n```\n\nDon't forget that `virtualWrite` commands should be wrapped in the timer and can't be used in the main loop.\n\n**NOTE** Don't forget to add notification widget.\n\nEventor comes handy when you need to change conditions on the fly without re-uploading new sketch on the hardware. You can create as many **events** as you need. Eventor also could be triggered from the application side. You just need to assign the widget to the same pin as your Event within Eventor. Eventor doesn't constantly sends events. Let's consider simple event as above `if (temperature > 40) send notification`. When temperature goes beyond 40 threshold - notification action is triggered. If temperature continues to stay above the 40 threshold no actions will be triggered. But if `temperature` goes below threshold and then passes it again - notification will be sent again \\(there is no 5 sec limit on Eventor notifications\\).\n\nEventor also supports Timer events. For example, you can set a pin `V1` ON/HIGH at 21:00:00 every Friday. With Eventor Time Event you can assign multiple timers on same pin, send any string/number, select days and timezone.\n\nIn order to remove created **event** please use swipe. You can also swipe out last element in the Event itself.\n\n**Sketch:** [Eventor](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Eventor/Eventor.ino)\n\n**NOTE:** The timer widget rely on the server time and not your phone time. Sometimes the phone time may not match the server time. **NOTE** : Events are triggered only once when the condition is met. That's mean [chaining of events](https://community.blynk.cc/t/eventor-behavior-bug-feature/20962) is not possible \\(however, could be enabled for commercials\\).\n\n"
  },
  {
    "path": "untitled/find/README.md",
    "content": "# find\n\n"
  },
  {
    "path": "untitled/find/blynkkk-blynkkk.github.io.md",
    "content": "# blynkkk/blynkkk.github.io\n\n You can’t perform that action at this time. \n\n"
  },
  {
    "path": "untitled/find/image.md",
    "content": "# Изображение \\(Image\\)\n\nВиджет изображений позволяет отображать любое изображение в вашем проекте. Вы должны предоставить http/s URL адрес. URL должен быть действительной конечной точкой для бинарных данных изображения. Укороченный URL робать не будет.\n\nСейчас виджет изображения поддерживает два варианта отображения:\n\n* **Fit** \\(Вписать\\): изображение будет масштабировано, в соответствовии с высотой или шириной виджета;\n* **Fill** \\(Заполнить\\): изображение будет масштабировано для заполнения области виджета. Может произойти обрезка изображения;\n\nВы можете сделать виджет Изображения интерактивным, предоставив несколько ссылок на разные изображения с разными состояниями и менять индекс отображаемого изображения с вашего оборудования или с помощью виджета [Обработчкий событий \\(Eventor\\)](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/eventor.md).\n\nНапример, выберите первый значок из списка:\n\n```cpp\nBlynk.virtualWrite(V1, 1); //индексация изображения начинается с 1\n```\n\nВы также можете изменить прозрачность, масштаб или поворот изображения:\n\n```cpp\nBlynk.setProperty(V1, \"opacity\", 50); // прозраочность 0-100%\n```\n\n```cpp\nBlynk.setProperty(V1, \"scale\", 30); // масштаб 0-100%\n```\n\n```cpp\nBlynk.setProperty(V1, \"rotation\", 10); // 0-360 градусы\n```\n\nтакже вы можете полностью заменить список изображений с аппаратного устройства:\n\n```cpp\nBlynk.setProperty(V1, \"urls\", \"https://image1.jpg\", \"https://image2.jpg\");\n```\n\nили вы можете изменить индивидуальное изображение по его индексу:\n\n```cpp\nBlynk.setProperty(V1, \"url\", 1, \"https://image1.jpg\");\n```\n\n"
  },
  {
    "path": "untitled/find/terminal.md",
    "content": "# Терминал \\(Terminal\\)\n\nОтображает данные с вашего оборудования. Позволяет отправить любую строку с вашего оборудования. Терминал всегда хранит последние 25 сообщений, которые ваше оборудование отправило в Blynk. Этот ограничение может быть увеличено в настройках локального сервера с помощью параметра `terminal.strings.pool.size`.\n\nС этим виджетом Вы можете использовать специальные команды:\n\n```cpp\n// Печатает значения, как Serial.print\nterminal.print();   \n// Печатает значения, как Serial.println()\nterminal.println();\n// Записать необработанные данные в буффер\nterminal.write();\n// Убедится, что все данные были отправлены с устройства в терминал\nterminal.flush();\n// Стереть все данные в терминале\nterminal.clear();\n```\n\n**Пример кода:** [Терминал](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Terminal/Terminal.ino)\n\n"
  },
  {
    "path": "untitled/gauge.md",
    "content": "# Gauge\n\nA great visual way to display incoming numeric values.\n\nCan work in 2 modes :\n\n* PUSH mode \\(select if from Frequency Reading picker\\);\n* Frequency Reading mode;\n\nIn PUSH mode you update gauge from hardware side with code :\n\n```cpp\nBlynk.virtualWrite(V1, val);\n```\n\nIn this mode every message that hardware sends to server is stored automatically on server. PUSH mode doesn't require application to be online or opened.\n\nWith Frequency Reading mode you need to select update interval and application will trigger events with required timing. Your application should be open and running in order to make requests to hardware. You don't need any code for Analog and Digital pins in that case. However for virtual pins you need to use next code :\n\n```cpp\n//triggered from app\nBLYNK_READ(V1)\n{\n  //send to app\n  Blynk.virtualWrite(V1, val);\n}\n```\n\n## Formatting options\n\nGauge also has \"Label\" field which allows use to use formatting. Let's assume, your sensor sends number 12.6789 to Blynk application. Next formatting options are supported:\n\n`/pin/` - displays the value without formatting \\(12.6789\\)\n\n`/pin./` - displays the value without decimal part \\(13\\)\n\n`/pin.#/` - displays the value with 1 decimal digit \\(12.7\\)\n\n`/pin.##/` - displays the value with two decimal places \\(12.68\\)\n\n## Other options\n\nYou can also change gauge label from hardware with :\n\n```cpp\nBlynk.setProperty(V1, \"label\", \"My Gauge Label\");\n```\n\nor change color :\n\n```cpp\n//#D3435C - Blynk RED\nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\n**Sketch:** [BlynkBlink](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n"
  },
  {
    "path": "untitled/gps_streaming.md",
    "content": "# GPS Streaming\n\nUseful for monitoring smartphone location data such as latitude, longitude, altitude and speed \\(speed could be often 0  \nin case smartphone doesn't support it\\).\n\nIn order to accept data from this widget you need to :\n\n```cpp\nBLYNK_WRITE(V1) {\n  float latitude = param[0].asFloat(); \n  float longitude = param[1].asFloat();\n  float altitude = param[2].asFloat();\n  float speed = param[3].asFloat();\n}\n```\n\nor you can use prepared wrapper `GpsParam` :\n\n```cpp\nBLYNK_WRITE(V1) {\n  GpsParam gps(param);\n  // Print 6 decimal places for Lat\n  Serial.println(gps.getLat(), 7);\n  Serial.println(gps.getLon(), 7);\n\n  Serial.println(gps.getAltitude(), 2);\n  Serial.println(gps.getSpeed(), 2);\n}\n```\n\nGPS Streaming works in background.\n\n**Sketch:** [GPS Stream](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/GPS_Stream/GPS_Stream.ino)\n\n"
  },
  {
    "path": "untitled/gps_trigger.md",
    "content": "# GPS Trigger\n\nGPS trigger widget allows easily trigger events when you arrive to or leave from some destination. This widget will work in background and periodically will check your coordinates. In case your location is within/out required radius \\(selected on widget map\\) widget will send `HIGH`/`LOW` command to hardware. For example, let's assume you have GPS Trigger widget assigned to pin `V1` and option `Trigger When Enter`. In that case when you'll arrive to destination point widget will trigger `HIGH` event.\n\n```cpp\nBLYNK_WRITE(V1) {\n  int state = param.asInt();\n  if (state) {\n      //You enter destination\n  } else {\n      //You leave destination\n  }\n}\n```\n\nMore details on how GPS widget works you can read [here](https://developer.android.com/guide/topics/location/strategies.html).\n\nGPS trigger widget works in background.\n\n"
  },
  {
    "path": "untitled/graph.md",
    "content": "# Graph\n\nEasily plot incoming data from your project in various designs. You can also scroll and zoom graph.\n\nCan work in 2 modes :\n\n* PUSH mode \\(select if from Frequency Reading picker\\);\n* Frequency Reading mode;\n\nIn PUSH mode you update gauge from hardware side with code :\n\n```cpp\nBlynk.virtualWrite(V1, val);\n```\n\nIn this mode every message that hardware sends to server is stored automatically on server. PUSH mode doesn't require application to be online or opened.\n\nWith Frequency Reading mode you need to select update interval and application will trigger events with required timing. Your application should be open and running in order to make requests to hardware. You don't need any code for Analog and Digital pins in that case. However for virtual pins you need to use next code :\n\n```cpp\n//triggered from app\nBLYNK_READ(V1)\n{\n  //send to app\n  Blynk.virtualWrite(V1, val);\n}\n```\n\n**Sketch:** [BlynkBlink](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n"
  },
  {
    "path": "untitled/gravity.md",
    "content": "# Gravity\n\nGravity is kind of [motion sensors](https://developer.android.com/guide/topics/sensors/sensors_motion.html) that allows you to detect motion of your smartphone. Useful for monitoring device movement, such as tilt, shake, rotation, or swing.\n\nThe gravity sensor provides a three dimensional vector indicating the direction and magnitude of gravity. Measured in `m/s^2` of gravity force applied to `x`, `y`, `z` axis.\n\nIn oder to accept data from it you need to :\n\n```cpp\nBLYNK_WRITE(V1) {\n  //force of gravity applied to axis x\n  int x = param[0].asFloat(); \n  //force of gravity applied to axis y\n  int y = param[1].asFloat();\n  //force of gravity applied to axis y\n  int z = param[2].asFloat();\n}\n```\n\nGravity doesn't work in background.\n\n"
  },
  {
    "path": "untitled/humidity.md",
    "content": "# Humidity\n\nHumidity is kind of [environment sensors](https://developer.android.com/guide/topics/sensors/sensors_environment.html) that allows you to measure ambient relative humidity.\n\nMeasured in `%` - actual relative humidity in percent.\n\nIn oder to accept data from it you need to :\n\n```cpp\nBLYNK_WRITE(V1) {\n  // humidity in %\n  int humidity = param.asInt();\n}\n```\n\nHumidity doesn't work in background.\n\n"
  },
  {
    "path": "untitled/image.md",
    "content": "# Image\n\nImage widget allows you to display any image within your project. You need to provide http/s url to it. Url should be valid endpoint to the binary data of the image. Url shortener will not work.\n\nRight now image widget supports 2 display options:\n\n* **Fit**: Image will be scaled to fit height or width of the widget size;\n* **Fill**: Image will be scaled to fill widget area. Cropping may occur;\n\nYou can make image widget interactive by providing multiple links to different images with different states and change displayed image index from your hardware or via Eventor widget.\n\nFor example, select the first icon from the list :\n\n```cpp\nBlynk.virtualWrite(V1, 1); //image indexing starts from 1\n```\n\nYou can also change opacity, scale or rotation of the displayed the image :\n\n```cpp\nBlynk.setProperty(V1, \"opacity\", 50); // 0-100%\n```\n\n```cpp\nBlynk.setProperty(V1, \"scale\", 30); // 0-100%\n```\n\n```cpp\nBlynk.setProperty(V1, \"rotation\", 10); //0-360 degrees\n```\n\nalso, you can fully replace the list of images from the hardware:\n\n```cpp\nBlynk.setProperty(V1, \"urls\", \"https://image1.jpg\", \"https://image2.jpg\");\n```\n\nor you can change individual image by it index:\n\n```cpp\nBlynk.setProperty(V1, \"url\", 1, \"https://image1.jpg\");\n```\n\n"
  },
  {
    "path": "untitled/joystick.md",
    "content": "# joystick\n\n## Joystick\n\nControl servo movements in 4 directions.\n\n### Settings:\n\n* **SPLIT**:\n\n  Each of the parameters is sent directly to the Pin on your hardware \\(e.g D7\\). You don't need to write any code.\n\n**NOTE:** In this mode you send multiple commands from one widget, which can reduce performance of your hardware.\n\nExample: If you have a Joystick Widget and it's set to D3 and D4, it will send 2 commands over the Internet:\n\n```cpp\ndigitalWrite(3, x);\ndigitalWrite(4, y);\n```\n\n* **MERGE**:\n\n  When MERGE mode is selected, you are sending just 1 message, consisting of array of values. But you'll need to parse it on the hardware. \n\nThis mode can be used with Virtual Pins only.\n\nExample: Add a Joystick Widget and set it to MERGE mode. Choose Virtual Pin V1\n\n```cpp\nBLYNK_WRITE(V1) // Joystick assigned to V1 \n{\n  // get x \n  int x = param[0].asInt(); \n  // get y\n  int y = param[1].asInt();\n}\n```\n\n* **Rotate on Tilt** When it's ON, Joystick will automatically rotate if you use your smartphone in landscape orientation.\n* **Auto-Return** When it's OFF, Joystick handle will not return back to center position. It will stay where you left it.\n\n## Send On Release\n\n**Send On Release** is available for most controller widgets and allows you to decrease data traffic on your hardware. For example, when you move joystick widget, commands are continuously streamed to the hardware, during a single joystick move you can send dozens of commands. There are use-cases where it's needed, however creating such a load may cause hardware reset. We recommend enabling **Send On Release** feature for most of the cases, unless you really need instant feedback. This option is enabled by default.\n\n## Write interval\n\nSimilar to above option. However, allows you to stream values to your hardware within certain interval. For example, setting write interval to 100 ms - means, that while you move slider only 1 value will be send to hardware within 100 ms. This option also used to decrease data traffic on your hardware.\n\n**Sketch:** [JoystickTwoAxis](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/JoystickTwoAxis/JoystickTwoAxis.ino)\n\n"
  },
  {
    "path": "untitled/labeled_value.md",
    "content": "# Labeled Value\n\nDisplays incoming data from your sensors or Virtual Pins. It is a better version of 'Value Display' as it has a formatting string, so you could format incoming value to any string you want.\n\nCan work in 2 modes :\n\n* PUSH mode \\(select if from Frequency Reading picker\\);\n* Frequency Reading mode;\n\nIn PUSH mode you update value display from hardware side with code :\n\n```cpp\nBlynk.virtualWrite(V1, val);\n```\n\nIn this mode every message that hardware sends to server is stored automatically on server. PUSH mode doesn't require application to be online or opened.\n\nWith Frequency Reading mode you need to select update interval and application will trigger events with required timing. Your application should be open and running in order to make requests to hardware. You don't need any code for Analog and digital pins in that case. However for virtual pins you need to use next code :\n\n```cpp\n//triggered from app\nBLYNK_READ(V1)\n{\n  //send to app\n  Blynk.virtualWrite(V1, val);\n}\n```\n\n## Formatting options\n\nLet's assume, your sensor sends number 12.6789 to Blynk application. Next formatting options are supported:\n\n`/pin/` - displays the value without formatting \\(12.6789\\)\n\n`/pin./` - displays the value without decimal part \\(13\\)\n\n`/pin.#/` - displays the value with 1 decimal digit \\(12.7\\)\n\n`/pin.##/` - displays the value with two decimal places \\(12.68\\)\n\n## Home Screen Labeled Value\n\nYou can also add Labeled Value to your Android Home Screen. Labeled Value works via HTTPS in that case. Have in mind that in \"Home Screen\" mode Labeled Value has few limitations. Labeled Value will update it's state only once per 15 min. You can change this via Widget Settings. However update interval less than 15 minutes is not guaranteed. You can also resize Labeled Value on Home Screen - just do long click on widget and resize it as you need.\n\n**Note :** Adding home screen widget costs 100 energy. This energy not rechargeable. **Note :** Home Screen Widgets for Local Blynk servers requires port 8080 to be opened.\n\n**Sketch:** [BlynkBlink](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n"
  },
  {
    "path": "untitled/labeled_value_display.md",
    "content": "# Labeled Value\n\nDisplays incoming data from your sensors or Virtual Pins. It is a better version of 'Value Display' as it has a formatting string, so you could format incoming value to any string you want.\n\nCan work in 2 modes :\n\n* PUSH mode \\(select if from Frequency Reading picker\\);\n* Frequency Reading mode;\n\nIn PUSH mode you update value display from hardware side with code :\n\n```cpp\nBlynk.virtualWrite(V1, val);\n```\n\nIn this mode every message that hardware sends to server is stored automatically on server. PUSH mode doesn't require application to be online or opened.\n\nWith Frequency Reading mode you need to select update interval and application will trigger events with required timing. Your application should be open and running in order to make requests to hardware. You don't need any code for Analog and digital pins in that case. However for virtual pins you need to use next code :\n\n```cpp\n//triggered from app\nBLYNK_READ(V1)\n{\n  //send to app\n  Blynk.virtualWrite(V1, val);\n}\n```\n\n## Formatting options\n\nLet's assume, your sensor sends number 12.6789 to Blynk application. Next formatting options are supported:\n\n`/pin/` - displays the value without formatting \\(12.6789\\)\n\n`/pin./` - displays the value without decimal part \\(13\\)\n\n`/pin.#/` - displays the value with 1 decimal digit \\(12.7\\)\n\n`/pin.##/` - displays the value with two decimal places \\(12.68\\)\n\n## Home Screen Labeled Value\n\nYou can also add Labeled Value to your Android Home Screen. Labeled Value works via HTTPS in that case. Have in mind that in \"Home Screen\" mode Labeled Value has few limitations. Labeled Value will update it's state only once per 15 min. You can change this via Widget Settings. However update interval less than 15 minutes is not guaranteed. You can also resize Labeled Value on Home Screen - just do long click on widget and resize it as you need.\n\n**Note :** Adding home screen widget costs 100 energy. This energy not rechargeable. **Note :** Home Screen Widgets for Local Blynk servers requires port 8080 to be opened.\n\n**Sketch:** [BlynkBlink](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n"
  },
  {
    "path": "untitled/lcd.md",
    "content": "# LCD\n\nThis is a regular 16x2 LCD display made in our secret facility in China. It can work in 2 modes :\n\n* Simple\n* Advanced\n\n## Simple mode\n\nIn simple mode your LCD widget performs as regular widget with Frequency reading.\n\nWith Frequency Reading mode you need to select update interval and application will trigger events with required timing. Your application should be open and running in order to make requests to hardware. You don't need any code for Analog and Digital pins in that case. However for virtual pins you need to use next code :\n\n```cpp\n//triggered from app\nBLYNK_READ(V1)\n{\n  //send to app\n  Blynk.virtualWrite(V1, val);\n}\n```\n\nIn Simple mode LCD also supports formatting options.\n\n### Formatting options\n\nLet's assume, your sensor sends number 12.6789 to Blynk application. Next formatting options supported:\n\n`/pin/` - displays the value without formatting \\(12.6789\\)\n\n`/pin./` - displays the value without decimal part \\(13\\)\n\n`/pin.#/` - displays the value with 1 decimal digit \\(12.7\\)\n\n`/pin.##/` - displays the value with two decimal places \\(12.68\\)\n\n**Sketch:** [LCD Simple Mode Pushing](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_SimpleModePushing/LCD_SimpleModePushing.ino)\n\n**Sketch:** [LCD Simple Mode Reading](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_SimpleModeReading/LCD_SimpleModeReading.ino)\n\n## Advanced mode\n\nAdvanced mode is for experienced users. Allows you to use special commands to control LCD.\n\n## Commands\n\nInit LCD variable :\n\n```cpp\nWidgetLCD lcd(V1);\n```\n\nSend message :\n\n```cpp\nlcd.print(x, y, \"Your Message\");\n```\n\nWhere `x` is a symbol position \\(0-15\\), `y` is a line number \\(0 or 1\\),\n\nClear LCD :\n\n```cpp\nlcd.clear();\n```\n\n**Sketch:** [LCD Advanced Mode](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_AdvancedMode/LCD_AdvancedMode.ino)\n\n"
  },
  {
    "path": "untitled/led.md",
    "content": "# LED\n\nA simple LED for indication. You need to send 0 in order to turn LED off. And 255 in order to turn LED on. Or just use Blynk API as described below :\n\n```cpp\n//register to virtual pin 1\nWidgetLED led1(V1);\nled1.off();\nled1.on();\n```\n\nAll values between 0 and 255 will change LED brightness :\n\n```cpp\nWidgetLED led2(V2);\n//set brightness of LED to 50%.\nled2.setValue(127);\n```\n\nYou can also change LED color with :\n\n```cpp\n//#D3435C - Blynk RED \nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\n## Home Screen LED\n\nYou can also add LED to your Android Home Screen. LED works via HTTPS in that case. Have in mind that in \"Home Screen\" mode LED has few limitations. LED will update it's state only once per 15 min. You can change this via Widget Settings. However update interval less than 15 minutes is not guaranteed.\n\n**Note :** Adding home screen widget costs 100 energy. This energy not rechargeable. **Note :** Home Screen Widgets for Local Blynk servers requires port 8080 to be opened.\n\n**Sketch:** [LED](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LED/LED_Blink/LED_Blink.ino)\n\n"
  },
  {
    "path": "untitled/level_display.md",
    "content": "# Level Display\n\nDisplays incoming data from your sensors or Virtual Pins. Level Display is very similar to progress bar, it is very nice and fancy view for indication of \"filled\" events, like \"level of battery\". You can update value display from hardware side with code :\n\n```cpp\nBlynk.virtualWrite(V1, val);\n```\n\nEvery message that hardware sends to server is stored automatically on server. PUSH mode doesn't require application to be online or opened.\n\n**Sketch:** [Push Example](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushData/PushData.ino)\n\n"
  },
  {
    "path": "untitled/light.md",
    "content": "# Light\n\nLight is kind of [environment sensors](https://developer.android.com/guide/topics/sensors/sensors_environment.html) that allows you to measure level of light \\(measures the ambient light level \\(illumination\\) in lx\\). In phones it is used to control screen brightness.\n\nIn order to accept data from it you need to :\n\n```cpp\nBLYNK_WRITE(V1) {\n  //light value\n  int lx = param.asInt(); \n}\n```\n\nLight doesn't work in background.\n\n"
  },
  {
    "path": "untitled/map.md",
    "content": "# Map\n\nMap widget allows you set points/pins on map from hardware side. This is very useful widget in case you have multiple devices and you want track their values on map.\n\nYou can send a point to map with regular virtual write command :\n\n```cpp\nBlynk.virtualWrite(V1, pointIndex, lat, lon, \"value\");\n```\n\nWe also created a wrapper for you to make usage of map simpler :\n\nYou can change button labels from hardware with :\n\n```cpp\nWidgetMap myMap(V1);\n...\nint index = 1;\nfloat lat = 51.5074;\nfloat lon = 0.1278;\nmyMap.location(index, lat, lon, \"value\");\n```\n\nUsing save `index` allows you to override existing point value.\n\n**Sketch:** [Basic Sketch](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Map/Map.ino)\n\n"
  },
  {
    "path": "untitled/menu.md",
    "content": "# Menu\n\nMenu widget allows you to send command to your hardware based on selection you made on UI. Menu sends index of element you selected and not label string. Sending index is starts from 1. It works same way as usual ComboBox element.\n\nExample code:\n\n```cpp\nBLYNK_WRITE {\n  switch (param.asInt()) {\n    case 1: { // Item 1\n      Serial.println(\"Item 1 selected\");\n      break;\n    }\n    case 2: { // Item 2\n      Serial.println(\"Item 2 selected\");\n      break;\n    }    \n  }\n}\n```\n\nYou can also set Menu items from hardware side with :\n\n```cpp\nBlynk.setProperty(V1, \"labels\", \"label 1\", \"label 2\", \"label 3\");\n```\n\n**Sketch:** [Menu](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Menu/Menu.ino)\n\n"
  },
  {
    "path": "untitled/music_player.md",
    "content": "# Music Player\n\nSimple UI element with 3 buttons - simulates music player interface. Every button sends it's own command to hardware : `play`, `stop`, `prev`, `next`.\n\nYou can change widget state within the app from hardware side with next commands:\n\n```text\nBlynk.virtualWrite(Vx, “play”);\nBlynk.virtualWrite(Vx, “stop”);\n```\n\nYou can also change widget play/stop state with next code \\(equivalent to above commands\\) :\n\n`Blynk.setProperty(V1, \"isOnPlay\", \"false\");`\n\n**Sketch:** [Music Player](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Player/Player.ino)\n\n"
  },
  {
    "path": "untitled/network/README.md",
    "content": "# network\n\n"
  },
  {
    "path": "untitled/network/blynkkk-blynkkk.github.io.md",
    "content": "# blynkkk/blynkkk.github.io\n\n[![@blynkkk](https://avatars3.githubusercontent.com/u/11541426?s=32&v=4)](https://github.com/blynkkk) [blynkkk](https://github.com/blynkkk) / [blynkkk.github.io]()\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@091500](https://avatars1.githubusercontent.com/u/418832?s=32&v=4)](https://github.com/091500) [091500](https://github.com/091500) / [blynkkk.github.io](https://github.com/091500/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@3mmar7amed](https://avatars1.githubusercontent.com/u/45490495?s=32&v=4)](https://github.com/3mmar7amed) [3mmar7amed](https://github.com/3mmar7amed) / [blynkkk.github.io](https://github.com/3mmar7amed/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@AlexArGC](https://avatars3.githubusercontent.com/u/48761297?s=32&v=4)](https://github.com/AlexArGC) [AlexArGC](https://github.com/AlexArGC) / [blynkkk.github.io](https://github.com/AlexArGC/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@alexkipar](https://avatars2.githubusercontent.com/u/107899?s=32&v=4)](https://github.com/alexkipar) [alexkipar](https://github.com/alexkipar) / [blynkkk.github.io](https://github.com/alexkipar/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@amonhk](https://avatars3.githubusercontent.com/u/23211255?s=32&v=4)](https://github.com/amonhk) [amonhk](https://github.com/amonhk) / [blynkkk.github.io](https://github.com/amonhk/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@AndrewDamz](https://avatars3.githubusercontent.com/u/46534689?s=32&v=4)](https://github.com/AndrewDamz) [AndrewDamz](https://github.com/AndrewDamz) / [blynkkk.github.io](https://github.com/AndrewDamz/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@anonGitHum](https://avatars1.githubusercontent.com/u/14102967?s=32&v=4)](https://github.com/anonGitHum) [anonGitHum](https://github.com/anonGitHum) / [blynkkk.github.io](https://github.com/anonGitHum/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@ArnieX](https://avatars0.githubusercontent.com/u/2325116?s=32&v=4)](https://github.com/ArnieX) [ArnieX](https://github.com/ArnieX) / [blynkkk.github.io](https://github.com/ArnieX/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@art-fm98](https://avatars2.githubusercontent.com/u/40850614?s=32&v=4)](https://github.com/art-fm98) [art-fm98](https://github.com/art-fm98) / [blynkkk.github.io](https://github.com/art-fm98/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@BillTheBest](https://avatars3.githubusercontent.com/u/1173938?s=32&v=4)](https://github.com/BillTheBest) [BillTheBest](https://github.com/BillTheBest) / [blynkkk.github.io](https://github.com/BillTheBest/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@bittercrow](https://avatars2.githubusercontent.com/u/12152088?s=32&v=4)](https://github.com/bittercrow) [bittercrow](https://github.com/bittercrow) / [blynkkk.github.io](https://github.com/bittercrow/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@Booteille](https://avatars0.githubusercontent.com/u/2203721?s=32&v=4)](https://github.com/Booteille) [Booteille](https://github.com/Booteille) / [blynk-docs-fr](https://github.com/Booteille/blynk-docs-fr)\n\n![](https://github.githubassets.com/images/modules/network/i.png) ![](https://github.githubassets.com/images/modules/network/l.png) [![@LibrEduc](https://avatars0.githubusercontent.com/u/33196220?s=32&v=4)](https://github.com/LibrEduc) [LibrEduc](https://github.com/LibrEduc) / [blynk-docs-fr](https://github.com/LibrEduc/blynk-docs-fr)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@ceviana](https://avatars3.githubusercontent.com/u/13856315?s=32&v=4)](https://github.com/ceviana) [ceviana](https://github.com/ceviana) / [blynkkk.github.io](https://github.com/ceviana/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@codeitbhanu](https://avatars3.githubusercontent.com/u/22428590?s=32&v=4)](https://github.com/codeitbhanu) [codeitbhanu](https://github.com/codeitbhanu) / [blynkkk.github.io](https://github.com/codeitbhanu/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@Crewin](https://avatars1.githubusercontent.com/u/25099719?s=32&v=4)](https://github.com/Crewin) [Crewin](https://github.com/Crewin) / [blynkkk.github.io](https://github.com/Crewin/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@DjElectron](https://avatars2.githubusercontent.com/u/58311735?s=32&v=4)](https://github.com/DjElectron) [DjElectron](https://github.com/DjElectron) / [blynkkk.github.io](https://github.com/DjElectron/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@EarlOld](https://avatars3.githubusercontent.com/u/24506752?s=32&v=4)](https://github.com/EarlOld) [EarlOld](https://github.com/EarlOld) / [blynkkk.github.io](https://github.com/EarlOld/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@EddieBogart](https://avatars3.githubusercontent.com/u/66404846?s=32&v=4)](https://github.com/EddieBogart) [EddieBogart](https://github.com/EddieBogart) / [blynkkk.github.io](https://github.com/EddieBogart/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@eledir](https://avatars1.githubusercontent.com/u/4344290?s=32&v=4)](https://github.com/eledir) [eledir](https://github.com/eledir) / [blynkkk.github.io](https://github.com/eledir/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@emil01](https://avatars2.githubusercontent.com/u/315038?s=32&v=4)](https://github.com/emil01) [emil01](https://github.com/emil01) / [blynkkk.github.io](https://github.com/emil01/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@emoritani](https://avatars3.githubusercontent.com/u/10086050?s=32&v=4)](https://github.com/emoritani) [emoritani](https://github.com/emoritani) / [blynkkk.github.io](https://github.com/emoritani/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@Fettkeewl](https://avatars1.githubusercontent.com/u/25577040?s=32&v=4)](https://github.com/Fettkeewl) [Fettkeewl](https://github.com/Fettkeewl) / [blynkkk.github.io](https://github.com/Fettkeewl/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@franksmicro](https://avatars3.githubusercontent.com/u/499151?s=32&v=4)](https://github.com/franksmicro) [franksmicro](https://github.com/franksmicro) / [blynkkk.github.io](https://github.com/franksmicro/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@Ganeshsh2244](https://avatars2.githubusercontent.com/u/52893635?s=32&v=4)](https://github.com/Ganeshsh2244) [Ganeshsh2244](https://github.com/Ganeshsh2244) / [blynkkk.github.io](https://github.com/Ganeshsh2244/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@HokoriXIII](https://avatars3.githubusercontent.com/u/3841066?s=32&v=4)](https://github.com/HokoriXIII) [HokoriXIII](https://github.com/HokoriXIII) / [blynkkk.github.io](https://github.com/HokoriXIII/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@houzhenggang](https://avatars2.githubusercontent.com/u/2803928?s=32&v=4)](https://github.com/houzhenggang) [houzhenggang](https://github.com/houzhenggang) / [blynkkk.github.io](https://github.com/houzhenggang/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@igaidai4uk](https://avatars3.githubusercontent.com/u/2185483?s=32&v=4)](https://github.com/igaidai4uk) [igaidai4uk](https://github.com/igaidai4uk) / [blynkkk.github.io](https://github.com/igaidai4uk/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@ingmiguelyepezcivil](https://avatars1.githubusercontent.com/u/61588404?s=32&v=4)](https://github.com/ingmiguelyepezcivil) [ingmiguelyepezcivil](https://github.com/ingmiguelyepezcivil) / [blynkkk.github.io](https://github.com/ingmiguelyepezcivil/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@jctecnum](https://avatars0.githubusercontent.com/u/48631580?s=32&v=4)](https://github.com/jctecnum) [jctecnum](https://github.com/jctecnum) / [blynkkk.github.io](https://github.com/jctecnum/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@Jwarni](https://avatars3.githubusercontent.com/u/3473622?s=32&v=4)](https://github.com/Jwarni) [Jwarni](https://github.com/Jwarni) / [blynkkk.github.io](https://github.com/Jwarni/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@langtupt](https://avatars3.githubusercontent.com/u/18097488?s=32&v=4)](https://github.com/langtupt) [langtupt](https://github.com/langtupt) / [blynkkk.github.io](https://github.com/langtupt/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@livelytech](https://avatars2.githubusercontent.com/u/58115111?s=32&v=4)](https://github.com/livelytech) [livelytech](https://github.com/livelytech) / [blynkkk.github.io](https://github.com/livelytech/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@Manoharsai](https://avatars1.githubusercontent.com/u/2752217?s=32&v=4)](https://github.com/Manoharsai) [Manoharsai](https://github.com/Manoharsai) / [blynkkk.github.io](https://github.com/Manoharsai/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@Mark-Pan](https://avatars3.githubusercontent.com/u/67413917?s=32&v=4)](https://github.com/Mark-Pan) [Mark-Pan](https://github.com/Mark-Pan) / [blynkkk.github.io](https://github.com/Mark-Pan/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@MarkAYoder](https://avatars3.githubusercontent.com/u/660054?s=32&v=4)](https://github.com/MarkAYoder) [MarkAYoder](https://github.com/MarkAYoder) / [blynkkk.github.io](https://github.com/MarkAYoder/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@mayankmaurya123](https://avatars1.githubusercontent.com/u/42763562?s=32&v=4)](https://github.com/mayankmaurya123) [mayankmaurya123](https://github.com/mayankmaurya123) / [blynkkk.github.io](https://github.com/mayankmaurya123/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@MD14](https://avatars2.githubusercontent.com/u/7752122?s=32&v=4)](https://github.com/MD14) [MD14](https://github.com/MD14) / [blynkkk.github.io](https://github.com/MD14/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@mopster81](https://avatars1.githubusercontent.com/u/60694641?s=32&v=4)](https://github.com/mopster81) [mopster81](https://github.com/mopster81) / [blynkkk.github.io](https://github.com/mopster81/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@mulengakatebe](https://avatars1.githubusercontent.com/u/517856?s=32&v=4)](https://github.com/mulengakatebe) [mulengakatebe](https://github.com/mulengakatebe) / [blynkkk.github.io](https://github.com/mulengakatebe/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@Noriffik](https://avatars3.githubusercontent.com/u/1632308?s=32&v=4)](https://github.com/Noriffik) [Noriffik](https://github.com/Noriffik) / [blynkkk.github.io](https://github.com/Noriffik/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@nucarbn](https://avatars1.githubusercontent.com/u/24677156?s=32&v=4)](https://github.com/nucarbn) [nucarbn](https://github.com/nucarbn) / [blynkkk.github.io](https://github.com/nucarbn/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@Olaclemmy](https://avatars1.githubusercontent.com/u/15816561?s=32&v=4)](https://github.com/Olaclemmy) [Olaclemmy](https://github.com/Olaclemmy) / [blynkkk.github.io](https://github.com/Olaclemmy/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@perrywarner](https://avatars2.githubusercontent.com/u/7812136?s=32&v=4)](https://github.com/perrywarner) [perrywarner](https://github.com/perrywarner) / [blynkkk.github.io](https://github.com/perrywarner/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@pganguly](https://avatars0.githubusercontent.com/u/12072626?s=32&v=4)](https://github.com/pganguly) [pganguly](https://github.com/pganguly) / [blynkkk.github.io](https://github.com/pganguly/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@quehanwei](https://avatars0.githubusercontent.com/u/1967943?s=32&v=4)](https://github.com/quehanwei) [quehanwei](https://github.com/quehanwei) / [blynkkk.github.io](https://github.com/quehanwei/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@Refenz](https://avatars2.githubusercontent.com/u/16590099?s=32&v=4)](https://github.com/Refenz) [Refenz](https://github.com/Refenz) / [blynkkk.github.io](https://github.com/Refenz/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@samanpiwpay](https://avatars0.githubusercontent.com/u/32676028?s=32&v=4)](https://github.com/samanpiwpay) [samanpiwpay](https://github.com/samanpiwpay) / [blynkkk.github.io](https://github.com/samanpiwpay/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@sanyaade-iot](https://avatars1.githubusercontent.com/u/7230207?s=32&v=4)](https://github.com/sanyaade-iot) [sanyaade-iot](https://github.com/sanyaade-iot) / [blynkkk.github.io](https://github.com/sanyaade-iot/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@SCKStef](https://avatars0.githubusercontent.com/u/3851625?s=32&v=4)](https://github.com/SCKStef) [SCKStef](https://github.com/SCKStef) / [blynkkk.github.io](https://github.com/SCKStef/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@seco](https://avatars2.githubusercontent.com/u/629386?s=32&v=4)](https://github.com/seco) [seco](https://github.com/seco) / [blynkkk.github.io](https://github.com/seco/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@shoorik007](https://avatars0.githubusercontent.com/u/31213414?s=32&v=4)](https://github.com/shoorik007) [shoorik007](https://github.com/shoorik007) / [blynkkk.github.io](https://github.com/shoorik007/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@skhshimul](https://avatars3.githubusercontent.com/u/54437831?s=32&v=4)](https://github.com/skhshimul) [skhshimul](https://github.com/skhshimul) / [blynkkk.github.io](https://github.com/skhshimul/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@slaith](https://avatars2.githubusercontent.com/u/1351947?s=32&v=4)](https://github.com/slaith) [slaith](https://github.com/slaith) / [blynkkk.github.io](https://github.com/slaith/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@Smol777](https://avatars1.githubusercontent.com/u/35020360?s=32&v=4)](https://github.com/Smol777) [Smol777](https://github.com/Smol777) / [blynkkk.github.io](https://github.com/Smol777/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@Songkran4](https://avatars3.githubusercontent.com/u/65441525?s=32&v=4)](https://github.com/Songkran4) [Songkran4](https://github.com/Songkran4) / [blynkkk.github.io](https://github.com/Songkran4/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@soulith](https://avatars2.githubusercontent.com/u/42127728?s=32&v=4)](https://github.com/soulith) [soulith](https://github.com/soulith) / [blynkkk.github.io](https://github.com/soulith/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@tech-rostand](https://avatars1.githubusercontent.com/u/30441214?s=32&v=4)](https://github.com/tech-rostand) [tech-rostand](https://github.com/tech-rostand) / [blynkkk.github.io](https://github.com/tech-rostand/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@tsanalytics](https://avatars1.githubusercontent.com/u/13785036?s=32&v=4)](https://github.com/tsanalytics) [tsanalytics](https://github.com/tsanalytics) / [blynkkk.github.io](https://github.com/tsanalytics/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@turikumana](https://avatars0.githubusercontent.com/u/57685029?s=32&v=4)](https://github.com/turikumana) [turikumana](https://github.com/turikumana) / [blynkkk.github.io](https://github.com/turikumana/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@vg9889](https://avatars3.githubusercontent.com/u/25285266?s=32&v=4)](https://github.com/vg9889) [vg9889](https://github.com/vg9889) / [blynkkk.github.io](https://github.com/vg9889/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@vipinkumardil5](https://avatars0.githubusercontent.com/u/62417657?s=32&v=4)](https://github.com/vipinkumardil5) [vipinkumardil5](https://github.com/vipinkumardil5) / [blynkkk.github.io](https://github.com/vipinkumardil5/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@vyacheslav-code](https://avatars2.githubusercontent.com/u/30864886?s=32&v=4)](https://github.com/vyacheslav-code) [vyacheslav-code](https://github.com/vyacheslav-code) / [blynkkk.github.io](https://github.com/vyacheslav-code/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@wahyusetiarno](https://avatars0.githubusercontent.com/u/49818005?s=32&v=4)](https://github.com/wahyusetiarno) [wahyusetiarno](https://github.com/wahyusetiarno) / [blynkkk.github.io](https://github.com/wahyusetiarno/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/t.png) [![@Whitebimmer](https://avatars2.githubusercontent.com/u/26184082?s=32&v=4)](https://github.com/Whitebimmer) [Whitebimmer](https://github.com/Whitebimmer) / [blynkkk.github.io](https://github.com/Whitebimmer/blynkkk.github.io)\n\n![](https://github.githubassets.com/images/modules/network/l.png) [![@WhizzCat](https://avatars0.githubusercontent.com/u/17166886?s=32&v=4)](https://github.com/WhizzCat) [WhizzCat](https://github.com/WhizzCat) / [blynkkk.github.io](https://github.com/WhizzCat/blynkkk.github.io)\n\n"
  },
  {
    "path": "untitled/network/numberinput.md",
    "content": "# Числовой ввод \\(Numeric Input\\)\n\nЧисловой ввод отображается и позволяет вам непосредственно ввести числовое значение. Как и в виджете [Шаг \\(Step\\)](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/step.md), он также имеет кнопки увеличения и уменьшения для более быстрого изменения значений, вы можете установить \\(шаг, цикл\\) \\(step, looping\\) в настройках виджета.\n\n"
  },
  {
    "path": "untitled/network/slider.md",
    "content": "# slider\n\n## Слайдер \\(Slider\\)\n\nСлайдер очень похож на потенциометр. Он позволяет посылать значения в диапазоне от минимального значения к максимальному. Диапазон допустимых максимального и минимального значений определяется в приложении.\n\nВы так же можете менять состояние слайдера с микроконтроллера. Например, Вы можете изменить положение ползунка в слайдере :\n\n```cpp\nBlynk.virtualWrite(V1, 55);\n```\n\nТак же можно поменять текст в слайдере :\n\n```cpp\nBlynk.setProperty(V1, \"label\", \"Мой слайдерок\");\n```\n\nили изменить цвет :\n\n```cpp\n//#D3435C - Карсный цвет в кодирвке RGB\nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\n## Отправка при отжатии \\(Send On Release\\)\n\n**Отправка при отжатии** эта функциональность позволяет снизить количество сообщений которые отправляет слайдер при смещении ползунка. Даже при незначительном перемещени ползунка - приложение шлет довольно много команд. Для некторых микроконтроллеров это может быть очень большой нагрузкой и они могут начать перегружатся. Тем не менее есть сценарии использования для которых это очень важно. По умолчанию, слайдер будет слать значения когда вы отпускаете ползунок. Мы рекомендуем исползовать этот подход, кроме случая когда Вам необходимо получать промежуточные значения при движении ползунка слайдера.\n\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n"
  },
  {
    "path": "untitled/notification.md",
    "content": "# notification\n\n## Push Notifications\n\nPush Notification widget allows you to send push notification from your hardware to your device. Currently it also contains 2 additional options :\n\n* **Notify when hardware offline** - you will get push notification in case your hardware went offline.\n* **Offline Ignore Period** - defines how long hardware could be offline \\(after it went offline\\) before sending notification. \n\n  In case period is exceeded - \"hardware offline\" notification will be send. You will get no notification in case hardware \n\n  was reconnected within specified period.\n\n* **Priority** high priority gives more chances that your message will be delivered without any delays. \n\n  See detailed explanation [here](https://firebase.google.com/docs/cloud-messaging/concept-options#setting-the-priority-of-a-message). \n\n**WARNING** : high priority contributes more to battery drain compared to normal priority messages.\n\nExample code:\n\n```cpp\nBlynk.notify(\"Hey, Blynkers! My hardware can push now!\");\n```\n\nYou can also use placeholder for device name, that will be replaced on the server with your device name:\n\n```cpp\nBlynk.notify(\"Hey, Blynkers! My {DEVICE_NAME} can push now!\");\n```\n\nLimitations :\n\n* Maximum allowed body length is 120 symbols;\n* Every device can send only 1 notification every 5 seconds;\n\n## Unicode in push notifications\n\nThe library handles all strings as UTF8 Unicode. If you're facing problems, try to print your message to the Serial and see if it works \\(the terminal should be set to UTF-8 encoding\\). If it doesn't work, probably you should read about unicode support of your compiler. If it works, but your message is truncated - you need to increase message length limit \\(all Unicode symbols consume at least twice the size of Latin symbols\\).\n\n## Increasing message length limit\n\nYou can increase maximum message length by putting on the top of your sketch \\(before Blynk includes\\):\n\n```cpp\n#define BLYNK_MAX_SENDBYTES 256 // Default is 128\n```\n\n**Sketch:** [PushNotification](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/PushNotification/PushNotification_Button/PushNotification_Button.ino)\n\n"
  },
  {
    "path": "untitled/number_input.md",
    "content": "# Numeric Input\n\nNumeric Input displays and let's you directly alter a number value. Similar to the Step widget, it has incrementing and decrementing buttons for quicker values changes, which you can setup \\(step, looping\\) in widget settings.\n\n"
  },
  {
    "path": "untitled/numberinput.md",
    "content": "# Numeric Input\n\nNumeric Input displays and let's you directly alter a number value. Similar to the Step widget, it has incrementing and decrementing buttons for quicker values changes, which you can setup \\(step, looping\\) in widget settings.\n\n"
  },
  {
    "path": "untitled/proximity.md",
    "content": "# Proximity\n\nProximity is kind of [position sensors](https://developer.android.com/guide/topics/sensors/sensors_position.html) that allows you to determine how close the face of a smartphone is to an object. Measured in `cm` - distance from phone face to object. However most of this sensors returns only FAR / NEAR information. So return value will be `0/1`. Where 0/LOW is `FAR` and 1/HIGH is `NEAR`.\n\nIn order to accept data from it you need to :\n\n```cpp\nBLYNK_WRITE(V1) {\n  // distance to object\n  int proximity = param.asInt();\n  if (proximity) {\n     //NEAR\n  } else {\n     //FAR\n  }\n}\n```\n\nProximity doesn't work in background.\n\n"
  },
  {
    "path": "untitled/pull/README.md",
    "content": "# pull\n\n"
  },
  {
    "path": "untitled/pull/change-float-to-double-by-earlold-pull-request-41.md",
    "content": "# Change float to double by EarlOld · Pull Request \\#41\n\n **Have a question about this project?** Sign up for a free GitHub account to open an issue and contact its maintainers and the community.Pick a usernameEmail AddressPassword\n\nBy clicking “Sign up for GitHub”, you agree to our [terms of service](https://help.github.com/terms) and [privacy statement](https://help.github.com/privacy). We’ll occasionally send you account related emails.\n\n Already on GitHub? [Sign in](https://github.com/login?return_to=%2Fblynkkk%2Fblynkkk.github.io%2Fissues%2Fnew) to your account\n\n"
  },
  {
    "path": "untitled/pull/text_input.md",
    "content": "# Текстовый ввод \\(Text Input\\)\n\nОтображается как строка текстового ввода, где вы можете напрямую изменять строковое значение. Также вы можете ограничить максимальное количество вводимых символов в настройках виджета.\n\n"
  },
  {
    "path": "untitled/pull/webhook.md",
    "content": "# Вебхук \\(Webhook\\)\n\nВебхук очень мощный виджет, который позволяет Вам легко интегрироватся с любыми сторонними сервисами. С его помощью Вы можете слать любые HTTP/S запросы на любой сервер или устройство, которое имеет HTTP/S API \\(например, лампы Philips Hue\\).\n\nВебхук вешается на вирутальный пин и любая команда, которая приходит на этот пин будет вызывать срабатывание HTTP/S запроса. Команды на такой виртуальный пин могут приходить как со стороны железа, так и со стороны приложения. То есть, Вы можете слать любой HTTP запрос при нажатии кнопки в приложении, если эта кнопка на том же пине что и вебхук.\n\nВот простой пример, представьте, что Вы хотите слать данные с микроконтроллера не только в Blynk, но и в какой-то другой сервис, например - Google Docs или в thingspeak.com. Раньше Вам для этого пришлось бы писать что-то вроде :\n\n```cpp\nWiFiClient client;\nif (client.connect(\"api.thingspeak.com\", 80)) {\n    client.print(\"POST /update HTTP/1.1\\n\");\n    client.print(\"Host: api.thingspeak.com\\n\");\n    client.print(\"Connection: close\\n\");\n    client.print(\"X-THINGSPEAKAPIKEY: \" + apiKeyThingspeak1 + \"\\n\");\n    client.print(\"Content-Type: application/x-www-form-urlencoded\\n\");\n    client.print(\"Content-Length: \");\n    client.print(postStr.length());\n    client.print(\"\\n\\n\");\n    client.print(postStr);\n}\n```\n\nС вебхуком этого больше делать не нужно. Достаточно лишь заполнить поля виджета в приложении и выполнить привычное:\n\n```cpp\nBlynk.virtualWrite(V0, value);\n```\n\nГде V0 - пин вебхук виджета.\n\nВ дополнение, Вы можете подставлять значение пина в URL:\n\n```cpp\nhttps://api.thingspeak.com/update?api_key=xxxxxx&field1=/pin/\n```\n\nили тело запроса :\n\n```cpp\n[\"/pin/\"]\n```\n\nТак же можно отправлять несколько значений внутри одного пина \\(до 5\\) :\n\n`/pin[0]/`,`/pin[1]/`, `/pin[2]/`\n\nЕще одна крутая штука - это возможность делать HTTP GET запросы на сервере и слать их результат на микроконтроллер. Прелесть тут в том, что Вам не нужно для этого писать сложный код на микроконтроллере. Представьте, что Вам нужно  \nполучить информацию о погоде от какого-то метио сервиса. Например, по такому запросу :\n\n```text\nВы можете вставить этот запрос в вебхук виджет, выбрать пин ```V0``` и написать :\n\n```cpp\nBLYNK_WRITE(V0){\n  String webhookdata = param.asStr();\n  Serial.println(webhookdata);\n}\n```\n\nТеперь, каждый раз когда вы дергаете `V0` с помощью `Blynk.virtualWrite(V0, 1)` будет вызвана функция `BLYNK_WRITE(V0)`.\n\n**Замечание:** обычно HTTP запросы довольно большие, поэтому Вам, вероятно, нужно будет увеличить лимит на максимальную длину сообщения на микроконтроллере `#define BLYNK_MAX_READBYTES 1024`.\n\n**Замечание:** наше облако так же имеет определенные лимиты для вебхука. Мы разрешаем слать только 1 запрос в секунду. Это поведение можно изменить на локальном сервер через свойство `webhooks.frequency.user.quota.limit`. Пожалуйста, используйте вебхуки с умом. Многие веб ресурсы не способны обрабатывать даже 1 запрос в секунду.\n\n**Замечание :** в случае если Ваш вебхук не выполнился 10 раз подряд - вебхук виджет будет остановлен. Чтобы восстановить его работу - нужно открыть и закрыть виджет в режиме редактирования. Не выполненными считаются запросы у которых код ответа не равен 200 или 302.\n\n"
  },
  {
    "path": "untitled/report.md",
    "content": "# report\n\n## Reports\n\nFunction of Reports widget is to configure and customize data reports in CSV format. You can choose between one-time or continuous scheduled reports.\n\nAlso, within the Reports you can clear all the data collected by your devices.\n\nYou need to configure initial inputs in Edit mode, and then, in Play mode you will be able to customize reports.\n\n### Edit mode. Data inputs configuration\n\nIn edit mode \\(when your project is stopped\\) you define the Datastreams you would like to later be included in reports. Reports widget is designed to work with the Device Tiles widget. If you don't use Device Tiles you can still select a single device or a group of devices as a source of data for reports.\n\nYou have to choose either Device Tiles or single / group of the devices for the report. You can't combine these 2 options.\n\n### Play mode.\n\nAfter you added source devices and their Datastreams click Play button and click on the Reports button.\n\n## Customizing Reports.\n\nEvery Report option supposes it's own settings:\n\n`Report name` - give your report a meaningful name.\n\n`Data source` - select the Datastreams you would like to be included in reports.\n\n`Report Frequency` - Defines how often reports will be sent. They can be one-time and scheduled. `one-time` - will instantly generate report and send it to the email addresses specified. Click on the right icon to send it.\n\nScheduled reports can be sent `daily`/`weekly`/`monthly`.\n\n`At Time` will set up a time of the day the report will be sent. `Start`/`End` specifies start and end date the reports will continue to be sent.\n\nFor Weekly Report you can select a day of the week when report should be sent. For Monthly report you can choose whether to send report on the first or last day of the month.\n\n`Recipients` - specify up to 5 email addresses.\n\n`Data resolution` defines granularity of your reports. Supported granularities are: `minute`, `hourly` and `daily`. For example, when you generate daily report with 1 minute granularity you'll get `24 * 60 * 60` points in your daily report for every selected Datastream.\n\n`Group data in reports by` - specify the output format of the CSV file\\(s\\).\n\n`Datastream` you will get 1 CSV file for each Datastream.\n\n`Device` you will get 1 CSV file per each device. Each file will contain all of the included Datastreams.\n\n`Report` you will get 1 CSV file for all your devices and all your Datastreams.\n\n`Timezone correction` - specify the time zone adjustment if you need to get report date and time adjusted to a specific time zone\n\n`Date and time format` - defines the format of the timestamp field of your data. You can select `2018-06-21 20:16:48`, `2018-06-21T20:16:48+03:00` or other supported formats.\n\nThere is one specific `Timestamp` format - which reflects the difference between the current time and midnight, January 1, 1970 UTC measured in milliseconds.\n\nAfter the report is set up - click on \"OK\" button at the right upper corner. Your report is ready.\n\nOnce you configured the report you will see when is the `Next` report scheduled and also a schedule for this report.\n\nAfter the report was sent at least once, you can see when the `Last` report was sent.\n\n`Last` label also contains the status regarding the report:\n\n* `OK`: the report was generated and sent to the Recipients successfully;\n* `No Data`: the report doesn't contain any data for the configured period;\n* `Error`: something went wrong. Please contact the Blynk Team support;\n\nReports will be generated even if your project is not in active \\(Play\\) mode. However, inactive projects don't generate any data.\n\n**NOTE:** all reports are encoded in UTF-16. Please, make sure you selected UTF-16 as required \"Character set\" for your csv reader.\n\n"
  },
  {
    "path": "untitled/rgb.md",
    "content": "# rgb\n\n## zeRGBa\n\nzeRGBa is usual RGB controller \\(color picker\\).\n\n### Settings:\n\n* **SPLIT**:\n\n  Each of the parameters is sent directly to the Pin on your hardware \\(e.g D7\\). You don't need to write any code.\n\n**NOTE:** In this mode you send multiple commands from one widget, which can reduce performance of your hardware.\n\nExample: If you have a zeRGBa Widget and it's set to D1, D2, D3 it will send 3 commands over the Internet:\n\n```cpp\ndigitalWrite(1, r);\ndigitalWrite(2, g);\ndigitalWrite(3, b);\n```\n\n* **MERGE**:\n\n  When MERGE mode is selected, you are sending just 1 message, consisting of array of values. But you'll need to parse it on the hardware. \n\nThis mode can be used with Virtual Pins only.\n\nExample: Add a zeRGBa Widget and set it to MERGE mode. Choose Virtual Pin V1.\n\n```cpp\nBLYNK_WRITE(V1) // zeRGBa assigned to V1 \n{\n    // get a RED channel value\n    int r = param[0].asInt();\n    // get a GREEN channel value\n    int g = param[1].asInt();\n    // get a BLUE channel value\n    int b = param[2].asInt();\n}\n```\n\n* **Send On Release** is available for most controller widgets and allows you to decrease data traffic on your hardware. \n\n  For example, when you move joystick widget, commands are continuously streamed to the hardware, during a single joystick move \n\n  you can send dozens of commands. There are use-cases where it's needed, however creating such a load may cause hardware reset. \n\n  We recommend enabling **Send On Release** feature for most of the cases, unless you really need instant feedback.\n\n  This option is enabled by default.\n\n## Write interval\n\nSimilar to above option. However, allows you to stream values to your hardware within certain interval. For example, setting write interval to 100 ms - means, that while you move slider only 1 value will be send to hardware within 100 ms. This option also used to decrease data traffic on your hardware.\n\n"
  },
  {
    "path": "untitled/rtc.md",
    "content": "# RTC\n\nReal-time clock allows you to get time from server. You can preselect any timezone on UI to get time on hardware in required locale.\n\n**Sketch:** [RTC](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/RTC/RTC.ino)\n\n"
  },
  {
    "path": "untitled/ru.md",
    "content": "# ru\n\n"
  },
  {
    "path": "untitled/segmented_control.md",
    "content": "# Segmented Switch\n\nSegmented Switch widget allows you to send command to your hardware based on selection you made on UI. Segmented Switch sends index of element you selected and not label string. Sending index starts from 1. It works same way as usual ComboBox or Menu element.\n\nExample code:\n\n```cpp\nBLYNK_WRITE {\n  switch (param.asInt()) {\n    case 1: { // Item 1\n      Serial.println(\"Item 1 selected\");\n      break;\n    }\n    case 2: { // Item 2\n      Serial.println(\"Item 2 selected\");\n      break;\n    }    \n  }\n}\n```\n\nYou can also set Menu items from hardware side with :\n\n```cpp\nBlynk.setProperty(V1, \"labels\", \"label 1\", \"label 2\", \"label 3\");\n```\n\n**Sketch:** [Menu](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Menu/Menu.ino)\n\n"
  },
  {
    "path": "untitled/segmentedswitch.md",
    "content": "# Segmented Switch\n\nSegmented Switch widget allows you to send command to your hardware based on selection you made on UI. Segmented Switch sends index of element you selected and not label string. Sending index starts from 1. It works same way as usual ComboBox or Menu element.\n\nExample code:\n\n```cpp\nBLYNK_WRITE {\n  switch (param.asInt()) {\n    case 1: { // Item 1\n      Serial.println(\"Item 1 selected\");\n      break;\n    }\n    case 2: { // Item 2\n      Serial.println(\"Item 2 selected\");\n      break;\n    }    \n  }\n}\n```\n\nYou can also set Menu items from hardware side with :\n\n```cpp\nBlynk.setProperty(V1, \"labels\", \"label 1\", \"label 2\", \"label 3\");\n```\n\n**Sketch:** [Menu](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Menu/Menu.ino)\n\n"
  },
  {
    "path": "untitled/slider.md",
    "content": "# slider\n\n## Slider\n\nSimilar to potentiometer. Allows to send values between MIN and MAX.\n\nYou can change slider state from hardware side. For example, set slider value assigned to virtual pin V1 to 55 :\n\n```cpp\nBlynk.virtualWrite(V1, 55);\n```\n\nYou can change slider label from hardware with :\n\n```cpp\nBlynk.setProperty(V1, \"label\", \"My Slider Label\");\n```\n\nor change color :\n\n```cpp\n//#D3435C - Blynk RED\nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\n## Fraction\n\nDefines how many digits after the point you would like to see when moving slider. When you have \"No Fraction\" that means slider will send only integer values without decimal point. \"1 digit\" means that values will look like 1.1, 1.2, ..., 2.0, etc.\n\n## Send On Release\n\n**Send On Release** is available for most controller widgets and allows you to decrease data traffic on your hardware. For example, when you move slider widget, commands are continuously streamed to the hardware, during a single slider move you can send dozens of commands. There are use-cases where it's needed, however creating such a load may cause hardware reset. We recommend enabling **Send On Release** feature for most of the cases, unless you really need instant feedback. This option is enabled by default.\n\n## Write interval\n\nSimilar to above option. However, allows you to stream values to your hardware within certain interval. For example, setting write interval to 100 ms - means, that while you move slider only 1 value will be send to hardware within 100 ms. This option also used to decrease data traffic on your hardware.\n\n**Sketch:** [Basic Sketch](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n"
  },
  {
    "path": "untitled/step.md",
    "content": "# step\n\n## Step Control\n\nStep control is like 2 buttons assigned to 1 pin. One button increments your value by desired step and another one decrements it. It is very useful for use cases where you need to change your values very precisely and you can't achieve this precision with slider widget.\n\n**Send Step** option allows you to send step to hardware instead of actual value of step widget. **Loop value** option allows you to reset step widget to start value when maximum value is reached.\n\nYou can change step state from hardware side. For example :\n\n```cpp\nBlynk.virtualWrite(V1, val);\n```\n\nYou can change step labels from hardware with :\n\n```cpp\nBlynk.setProperty(V1, \"label\", \"My Stepper\");\n```\n\nYou can change the step of the step widget from hardware with :\n\n```cpp\nBlynk.setProperty(V1, \"step\", 10);\n```\n\nor change color :\n\n```cpp\n//#D3435C - Blynk RED \nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\nYou can also get step control state from server in case your hardware was disconnected with Blynk Sync feature :\n\n```cpp\nBLYNK_CONNECTED() {\n  Blynk.syncVirtual(V1);\n}\n\nBLYNK_WRITE(V1) {\n  int stepperValue = param.asInt();\n}\n```\n\n## Write interval\n\nSimilar to above option. However, allows you to stream values to your hardware within certain interval. For example, setting write interval to 100 ms - means, that while you move slider only 1 value will be send to hardware within 100 ms. This option also used to decrease data traffic on your hardware.\n\n**Sketch:** [Basic Sketch](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n"
  },
  {
    "path": "untitled/styled_button.md",
    "content": "# Styled Button\n\nWorks in push or switch modes. Allows to send any number value on button click and button release events. By default button uses 0/1 \\(LOW/HIGH\\) values. Button sends 1 \\(HIGH\\) on press and sends 0 \\(LOW\\) on release.\n\nYou can change button state from hardware side. For example, turn on button assigned to virtual pin V1:\n\n```cpp\nBlynk.virtualWrite(V1, HIGH);\n```\n\nYou can change button labels from hardware with :\n\n```cpp\nBlynk.setProperty(V1, \"onLabel\", \"ON\");\n\nBlynk.setProperty(V1, \"offLabel\", \"OFF\");\n```\n\nor change color of the button :\n\n```cpp\nBlynk.setProperty(V1, \"onColor\", \"#D3435C\");\n\nBlynk.setProperty(V1, \"offColor\", \"#D3435C\");\n```\n\nor change background color of the button :\n\n```cpp\nBlynk.setProperty(V1, \"onBackColor\", \"#D3435C\");\n\nBlynk.setProperty(V1, \"offBackColor\", \"#D3435C\");\n```\n\nYou can also get button state from server in case your hardware was disconnected with Blynk Sync feature :\n\n```cpp\nBLYNK_CONNECTED() {\n  Blynk.syncVirtual(V1);\n}\n\nBLYNK_WRITE(V1) {\n  int buttonState = param.asInt();\n}\n```\n\n**Sketch:** [Basic Sketch](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n**Sketch:** [Physical Button Interrupt](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonInterrupt/ButtonInterrupt.ino)\n\n**Sketch:** [Physical Button Poll](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonPoll/ButtonPoll.ino)\n\n**Sketch:** [Physical Button State Sync](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/SyncPhysicalButton/SyncPhysicalButton.ino)\n\n"
  },
  {
    "path": "untitled/super_chart.md",
    "content": "# SuperChart\n\nSuperChart is used to visualise live and historical data. You can use it for sensor data, for binary event logging and more.\n\nTo use SuperChart widget you would need to push the data from the hardware with the desired interval by using timers. [Here is](https://examples.blynk.cc/?board=ESP8266&shield=ESP8266%20WiFi&example=GettingStarted%2FPushData) a basic example for data pushing.\n\n## Interactions:\n\n* **Switch between time ranges and Live mode** &lt;/br&gt;Tap time ranges at the bottom of the widget to change time ranges\n* **Tap Legend Elements** to show or hide datastreams &lt;/br&gt;\n* **Tap'n'hold to view timestamp and corresponding values**\n* **Quick swipe from left to right to reveal previous data**&lt;/br&gt; Then you can then scroll data back and forward within the given time range.\n* **Full Screen Mode**&lt;/br&gt; Press this button to open Full Screen view in landscape orientation.\n\nSimply rotate the phone back to portrait mode. Chart should rotate automagically. In full screen view you will see X \\(time\\) and multiple Y scales. Full Screen Mode can be disabled from widget Settings.\n\n* **Menu Button**&lt;/br&gt;\n\n  Menu button will open additional functions:\n\n  * Export to CSV\n  * Erase Data on the server \n\n## SuperChart Settings:\n\n* **Chart Title**\n* **Title Font Size**&lt;/br&gt;\n\n  You have a choice of 3 font sizes\n\n* **Title Alignment**&lt;/br&gt;\n\n  Choose chart title alignment. This setting also affects Title and Legend position on the Widget.\n\n* **Show x-axis \\(time\\)**&lt;/br&gt;\n\n  Select it if you want to show the time label at the bottom of your chart.\n\n* **Time ranges picker**&lt;/br&gt;\n\n  Allows you to select required periods \\(`15m`, `30m`, `1h`, `3h`, ...\\) and resolution for your chart. Resolution\n\n  defines how precise your data is. Right now chart supports 2 types of resolution `standard` and `high`. Resolution also\n\n  depends on the selected period. For example, `standard` resolution for `1d` means you'll get 24 points per day \\(1 per hour\\),\n\n  with `high` resolution you'll get for `1d` 1440 points per day \\(1 per minute\\).\n\n* **Datastreams**&lt;/br&gt;\n\n  Add datastreams \\(read below how to configure datastreams\\)\n\n## Datastream Settings\n\nWidget supports up to 4 Datastreams. Press Datastream Settings Icon to open Datastream Settings.\n\n**Design:** Choose available types of Chart:\n\n* Line\n* Area\n* Bar\n* Binary \\(anchor LINK to binary\\)\n\n**Color:** Choose solid colors or gradients\n\n**Source and input:** You can use 3 types of Data source:\n\n**1. Virtual Pin** Choose the desired Device and Virtual Pin to read the data from.\n\n**2. Tags** SuperChart can aggregate data from multiple devices using built-in aggregation functions. For example, if you have 10 Temperature sensors sending temperature with the given period, you can plot average value from 10 sensors on the widget.\n\nTo use Tags:\n\n* [**Add Tag**](../#blynk-main-operations-control-of-multiple-devices-tags) to every device you want to aggregate data from.\n* **Push data to the same Virtual Pin** on every device. \\(e.g. `Blynk.virtualWrite (V0, temperature);`\\)\n* **Choose Tag as a source** in SuperChart Widget and use the pin where the data is coming to \\(e.g V0\\) \n\n**Functions available:**\n\n* `SUM` will summarize all incoming values to the specified Virtual Pin across all devices tagged with the chosen tag\n* `AVG` will plot average value\n* `MED` will find a median value\n* `MIN` will plot minimum value\n* `MAX` will plot maximum value\n\n**☝️ IMPORTANT: Tags are not working in Live Mode.**\n\n1. [**Device Selector**](../#widgets-time-input-device-selector)\n\n   If you add Device Selector Widget to your project, you can use it as a source for SuperChart. \n\n   In this case, when you change the device in Device Selector, chart will be updated accordingly\n\n**Y-Axis Settings**   \nThere are 4 modes of how to scale data along the Y axis\n\n1. _Auto_  Data will be auto-scaled based on min and max values of the given time period. This is nice option to start with.\n2. **Min/Max**  When this mode is selected, Y scale will be set to the values you choose. For example, if your hardware sends data with values varying from -100 to 100, you can set the chart to this values and data will be rendered correctly.\n\nYou may also want to visualize the data within some specific range. Let's say incoming data has values in the range of 0-55, but you would like to see only values in the range 30-50. You can set it up and if values are out of Y scale you configured, chart will be cropped\n\n1. **% of Height**  \n\n\n   This option allows you to auto-scale incoming data on the widget and position it the way you want. \n\n   In this mode, you set up the percentage of widget height on the screen, from 0% to 100%. \n\nIf you set 0-100%, in fact it's a full auto-scale. No matter in which range the data is coming,  \nit will be always scaled to the whole height of the widget.\n\nIf you set it to 0-25%, then this chart will only be rendered on 1/4 of the widget height.\n\nThis setting is very valuable for **Binary Chart** or for visualizing a few datastreams on the same chart in a different way.\n\n1. _Delta_  \n\n\n   While data stays within the given Delta value, chart will be auto-scaled within this range.\n\n   If delta exceeds the range, chart will be auto-scaled to min/max values of the given period.\n\n**Suffix**  \n Here you can specify a suffix that will be shown during the Tap'n'hold.\n\n**Decimals**  \n Defines the formatting of the graph value when you Tap'n'hold the graph. Possible options are: \\#, \\#.\\#, \\#.\\#\\#, etc.\n\n**Connect Missing Data Points**  \n If this switch is ON, then SuperChart will connect all the dots even if there was no data.\n\nIf it's set to OFF, then you will see gaps in case there was no data.\n\n**Binary Chart Settings**  \n This type of chart is useful to plot binary data, for example when unit was ON or OFF, or when motion was detected or when certain threshold was reached.\n\nYou need to specify a **FLIP** point, which is the point where incoming data will be turned into TRUE or FALSE state.\n\nFor example, you send the data in the range of `0 to 1023`. If you set `512` as a **FLIP** point, then everything above `512` \\(excluding 512\\) will be recorded as `TRUE`, any value below `512` \\(including 512\\) will be `FALSE`.\n\nAnother example, if you send `0 and 1` and set `0` as a **FLIP** point, then `1` will be `TRUE`, `0` will be `FALSE`\n\n**State Labels:**  \n Here you can specify how `TRUE/FALSE` should be shown in Tap'n'Hold mode.\n\nFor example, you can set to `TRUE` to \"Equipment ON\" label, `FALSE` to \"Equipment OFF\".\n\n"
  },
  {
    "path": "untitled/table.md",
    "content": "# Table\n\nTable widget comes handy when you need to structure similar data within 1 graphical element. It works as a usual table.\n\nYou can add a row to the table with :\n\n```text\nBlynk.virtualWrite(V1, \"add\", id, \"Name\", \"Value\");\n```\n\nYou can update a row in the table with :\n\n```text\nBlynk.virtualWrite(V1, \"update\", id, \"UpdatedName\", \"UpdatedValue\");\n```\n\nTo highlight any item in a table by using it's id in a table :\n\n```text\nBlynk.virtualWrite(V1, \"pick\", 0);\n```\n\nTo select/deselect \\(make icon green/grey\\) item in a table by using it's row id in a table :\n\n```text\nBlynk.virtualWrite(V1, \"select\", 0);\nBlynk.virtualWrite(V1, \"deselect\", 0);\n```\n\nTo clear the table at any time with:\n\n```text\nBlynk.virtualWrite(V1, \"clr\");\n```\n\nYou can also handle other actions coming from table. For example, use row as a switch button.\n\n```text\nBLYNK_WRITE(V1) {\n   String cmd = param[0].asStr();\n   if (cmd == \"select\") {\n       //row in table was selected. \n       int rowId = param[1].asInt();\n   }\n   if (cmd == \"deselect\") {\n       //row in table was deselected. \n       int rowId = param[1].asInt();\n   }\n   if (cmd == \"order\") {\n       //rows in table where reodered\n       int oldRowIndex = param[1].asInt();\n       int newRowIndex = param[2].asInt();\n   }\n}\n```\n\n**Note :** Max number of rows in the table is 100. When you reach the limit, table will work as FIFO \\(First In First Out\\) list. This limit can be changed by configuring `table.rows.pool.size` property for Local Server.\n\n**Sketch:** [Simple Table usage](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Table/Table_Simple/Table_Simple.ino)\n\n**Sketch:** [Advanced Table usage](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Table/Table_Advanced/Table_Advanced.ino)\n\n"
  },
  {
    "path": "untitled/tabs.md",
    "content": "# Tabs\n\nThe only purpose of Tabs widget is to extend your project space. In order to edit tabs widget - just tap on the selected tab. You can drag widgets between tabs. Only the last tab can be removed: to remove it swipe left on its name in Settings screen.\n\nThe maximum number of tabs on iOS is 4 The maximum number of tabs on Android is 10\n\nStay tuned for an upcoming Tabs widget redesign!\n\n"
  },
  {
    "path": "untitled/temperature.md",
    "content": "# Temperature\n\nTemperature is kind of [environment sensors](https://developer.android.com/guide/topics/sensors/sensors_environment.html) that allows you to measure ambient air temperature. Measured in `°C` - celcius.\n\nIn order to accept data from it you need to :\n\n```cpp\nBLYNK_WRITE(V1) {\n  // temperature in celcius\n  int celcius = param.asInt();\n}\n```\n\nTemperature doesn't work in background.\n\n"
  },
  {
    "path": "untitled/terminal.md",
    "content": "# Terminal\n\nDisplays data from your hardware. Allows to send any string to your hardware. Terminal always stores last 25 messages your hardware had send to Blynk Cloud. This limit may be increased on Local Server with `terminal.strings.pool.size` property.\n\nYou can use special commands with this widget:\n\n```cpp\n// Print values, like Serial.print\nterminal.print();   \n// Print values, like Serial.println()\nterminal.println();\n // Write a raw data buffer\nterminal.write();\n// Ensure that data was sent out of device\nterminal.flush();\n// Erase all values in the terminal\nterminal.clear();\n```\n\n**Sketch:** [Terminal](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Terminal/Terminal.ino)\n\n"
  },
  {
    "path": "untitled/textinput.md",
    "content": "# Text Input\n\nText Input displays and let's you directly alter a string value. You can limit a maximum number of characters in widget settings.\n\n"
  },
  {
    "path": "untitled/timeinput.md",
    "content": "# Time Input\n\nTime input widget allows you to select start/stop time, day of week, timezone, sunrise/sunset formatted values and send them to your hardware. Supported formats for time now are `HH:MM` and `HH:MM AM/PM`.\n\nHardware will get selected on UI time as seconds of day \\(`3600 * hours + 60 * minutes`\\) for start/stop time. Time that widget sends to hardware is user local time. Selected days indexes :\n\n```text\nMonday - 1\nTuesday - 2\n...\nSaturday - 6\nSundays - 7\n```\n\nYou can also change state of widget on UI. See below sketches.\n\n**Sketch:** [Simple Time Input for start time](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/SimpleTimeInput/SimpleTimeInput.ino)\n\n**Sketch:** [Advanced Time Input](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/AdvancedTimeInput/AdvancedTimeInput.ino)\n\n**Sketch:** [Update Time Input State on UI](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/UpdateTimeInputState/UpdateTimeInputState.ino)\n\n"
  },
  {
    "path": "untitled/timer.md",
    "content": "# Timer\n\nTimer triggers actions at a specific time. Even if smartphone is offline. By default start time sends 1 \\(HIGH\\), stop time sends 0 \\(LOW\\). You can change this with any other values. You can change timer settings in \"run\" mode. Recent Android version also has improved Timer within Eventor widget. With Eventor Time Event you can assign multiple timers on same pin, send any string/number, select days and timezone. It is recommended to use Eventor over Timer widget. However Timer widget is still suitable for simple timer events.\n\n**NOTE:** The timer widget rely on the server time and not your phone time. Sometimes the phone time may not match the server time.\n\n**Sketch:** [Timer](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Timer/Timer.ino)\n\n"
  },
  {
    "path": "untitled/tree/README.md",
    "content": "# tree\n\n"
  },
  {
    "path": "untitled/tree/accelerometer/README.md",
    "content": "# Акселерометр \\(Accelerometer\\)\n\nАкселерометр один из [сенсоров движения](https://developer.android.com/guide/topics/sensors/sensors_motion.html), который позволяет определить движение Вашего телефона в пространстве. Он может пригодится для отслеживания таких событий как тряска, удар, поворот или наклон телефона. Концептуально, акселерометр определяет силу ускорения приложенную к вашему телефону. Единица измерения - м/c^2 приложенная к каждой из осей `x`, `y`, `z`.\n\nЧтобы получить данные с сенсора нужно использовать следующий код :\n\n```cpp\nBLYNK_WRITE(V1) {\n  //сила ускорения, приложенная к оси x\n  int x = param[0].asFloat(); \n  //сила ускорения, приложенная к оси y\n  int y = param[1].asFloat();\n  //сила ускорения, приложенная к оси z\n  int z = param[2].asFloat();\n}\n```\n\nАкселерометр не работает при свернутом приложении.\n\n"
  },
  {
    "path": "untitled/tree/accelerometer/new.md",
    "content": "# new\n\n"
  },
  {
    "path": "untitled/tree/barometer.md",
    "content": "# Барометр/Давление \\(Barometer/pressure\\)\n\nБарометр один из сенсоров [окружающей среды](https://developer.android.com/guide/topics/sensors/sensors_environment.html) и позволяет измерять атмосферное давление.\n\nИзмеряется в `hPa` \\(гПа\\) или `mbar` \\(мБар\\).\n\nЧтобы получить данные с сенсора нужно использовать следующий код :\n\n```cpp\nBLYNK_WRITE(V1) {\n  //Давление в мБар\n  int pressure = param[0].asInt(); \n}\n```\n\nБарометр не работает при свернутом приложении.\n\n"
  },
  {
    "path": "untitled/tree/bluetooth/README.md",
    "content": "# Блютуз \\(Bluetooth\\)\n\nЭтот виджет позволяет включить блютуз на вашем телефоне. На текущий момент виджет также требует наличия интернет соединения \\(постараемся пофиксить в ближайшем будущем\\) и поддерживается только на Android. Некоторые типы виджетов нельзя использовать вместе с блютузом, например исторический граф, так как он требует чтобы данные отправлялись на сервер, чего блютуз виджет не делает.\n\n**Список поддерживаемых чипов и контроллеров:** [BLE](https://github.com/blynkkk/blynk-library/tree/master/examples/Boards_Bluetooth)\n\n"
  },
  {
    "path": "untitled/tree/bluetooth/blynkkk-blynkkk.github.io-4.md",
    "content": "# blynkkk/blynkkk.github.io\n\n [Permalink](https://github.com/blynkkk/blynkkk.github.io/tree/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/ru)\n\n Failed to load latest commit information.\n\nType\n\nName\n\nLatest commit message\n\nCommit time\n\n You can’t perform that action at this time. \n\n"
  },
  {
    "path": "untitled/tree/blynkkk-blynkkk.github.io.md",
    "content": "# blynkkk/blynkkk.github.io\n\nTree: b1f1a43985\n\n [Go to file](https://github.com/blynkkk/blynkkk.github.io/find/b1f1a439851d4000d4d85ddab2f72db8d227d6cc)Code\n\n####  Clone with HTTPS \n\n Use Git or checkout with SVN using the web URL.\n\n*  [Open with GitHub Desktop](https://desktop.github.com/)\n*  [Download ZIP](https://github.com/blynkkk/blynkkk.github.io/archive/b1f1a439851d4000d4d85ddab2f72db8d227d6cc.zip)\n\n## Latest commit\n\n [![@EarlOld](https://avatars1.githubusercontent.com/u/24506752?s=60&u=ebee15703b94cc6d8af2807ba50979d376548c35&v=4)](https://github.com/EarlOld)\n\n[EarlOld](../blynkkk-blynkkk.github.io-7/) committed [b1f1a43](../commit/change-float-to-double-41-b1f1a43.md)Jul 1, 2020\n\n[Change float to double \\(](../commit/change-float-to-double-41-b1f1a43.md)[\\#41](../pull/change-float-to-double-by-earlold-pull-request-41.md)[\\)](../commit/change-float-to-double-41-b1f1a43.md)\n\n## Git stats\n\n*  [ **918** commits](https://github.com/blynkkk/blynkkk.github.io/commits/b1f1a439851d4000d4d85ddab2f72db8d227d6cc)\n*  [**10** branches](../blynkkk-blynkkk.github.io-8/)\n*  [**0** tags](../blynkkk-blynkkk.github.io-9/)\n\n## Files <a id=\"files\"></a>\n\n [Permalink](blynkkk-blynkkk.github.io.md)\n\n Failed to load latest commit information.\n\nType\n\nName\n\nLatest commit message\n\nCommit time\n\n[css](https://github.com/blynkkk/blynkkk.github.io/tree/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/css)\n\n[google-code-prettify](https://github.com/blynkkk/blynkkk.github.io/tree/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/google-code-prettify)\n\n[images](https://github.com/blynkkk/blynkkk.github.io/tree/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/images)\n\n[mobile](https://github.com/blynkkk/blynkkk.github.io/tree/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/mobile)\n\n[new/en](https://github.com/blynkkk/blynkkk.github.io/tree/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/new/en)\n\n[ru](https://github.com/blynkkk/blynkkk.github.io/tree/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/ru)\n\n[scripts](https://github.com/blynkkk/blynkkk.github.io/tree/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/scripts)\n\n[themes](https://github.com/blynkkk/blynkkk.github.io/tree/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/themes)\n\n[Amendments.md](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/Amendments.md)\n\n[AppExport.md](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/AppExport.md)\n\n[BlynkFirmware.md](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/BlynkFirmware.md)\n\n[BlynkMainOperations.md](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/BlynkMainOperations.md)\n\n[BlynkProtocol.md](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/BlynkProtocol.md)\n\n[BlynkServer.md](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/BlynkServer.md)\n\n[CNAME](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/CNAME)\n\n[FAQ.md](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/FAQ.md)\n\n[GettingStarted.md](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/GettingStarted.md)\n\n[HardwareSetUps.md](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/HardwareSetUps.md)\n\n[Implementing.md](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/Implementing.md)\n\n[IntroAndDownloads.md](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/IntroAndDownloads.md)\n\n[License.md](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/License.md)\n\n[Links.md](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/Links.md)\n\n[OTA.md](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/OTA.md)\n\n[README.md](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/README.md)\n\n[Roadmap.md](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/Roadmap.md)\n\n[Security.md](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/Security.md)\n\n[Sharing.md](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/Sharing.md)\n\n[SupportedHardware.md](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/SupportedHardware.md)\n\n[Troubleshooting.md](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/Troubleshooting.md)\n\n[Widgets-RU.md](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/Widgets-RU.md)\n\n[Widgets.md](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/Widgets.md)\n\n[favicon.ico](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/favicon.ico)\n\n[http.md](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/http.md)\n\n[index.html](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/index.html)\n\n[table.css](https://github.com/blynkkk/blynkkk.github.io/blob/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/table.css)\n\n##  README.md\n\n### [https://docs.blynk.cc/](https://docs.blynk.cc/)\n\n"
  },
  {
    "path": "untitled/tree/bridge.md",
    "content": "# Мост \\(Bridge\\)\n\nМост может быть использован для связи между устройствами \\(без участия приложения\\). Вы можете отправлять цифровые / аналоговые / виртуальные команды записи с одного устройства на другое, зная только токен авторизации. На данный момент виджет Мост не обязательно использовать в приложении \\(здесь он используется для указания того, что у нас есть такая функция\\). **Вы можете использовать несколько мостов для управления несколькими устройствами.**\n\nВиджет Мост использует виртуальный пин и превращает его в канал для управления другим устройством. Это означает, что вы можете контролировать любые виртуальные, цифровые или аналоговые пины целевого устройства. Будьте осторожны, не используйте пины типа `A0, A1, A2 ...` при обмене данными между различными типами устройств, так как в таких случаях Arduino Core может ссылаться на неверные пины.\n\nПример кода для устройства A, которое будет отправлять значения на устройство B:\n\n```cpp\n//Инициирует виджет Моста на V1 устройства A\nWidgetBridge bridge1(V1);\n...\nvoid setup() {\n    Blynk.begin(...);\n    while (Blynk.connect() == false) {\n        // Ждем пока Blynk подключится\n    }\n\n    bridge1.digitalWrite(9, HIGH); // выставим триггер HIGH на D9 \n                                   // устройства B. Код на устройстве\n                                   // B не требуется\n    bridge1.analogWrite(10, 123);\n    bridge1.virtualWrite(V1, \"hello\"); // вам нужно написать код на \n                                       // устройстве B, чтобы получить\n                                       // это значение. См. ниже\n    bridge1.virtualWrite(V2, \"value1\", \"value2\", \"value3\");\n}\n\nBLYNK_CONNECTED() {\n  bridge1.setAuthToken(\"OtherAuthToken\"); // токен с устройства B\n}\n```\n\n**ВАЖНО:** при выполнении `virtualWrite()` с виджета Мост, устройство B должно обрабатывать входящие данные с устройства A. Например, если вы отправляете значение с устройства A на устройство B, используя `bridge.virtualWrite (V5)`, вам необходимо использовать свой обработчик на устройстве B:\n\n```cpp\nBLYNK_WRITE(V5){\n    int pinData = param.asInt(); // переменная pinData будет хранить значение,\n                                 // полученное через Bridge\n}\n```\n\nИмейте в виду, что `bridge.virtualWrite` не отправляет никаких значений в мобильное приложение. Для этого вам нужно вызвать `Blynk.virtualWrite`.\n\n**Пример кода:** [Мост](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Bridge/Bridge.ino)\n\n"
  },
  {
    "path": "untitled/tree/button/README.md",
    "content": "# Кнопка \\(Button\\)\n\nКнопка может работать в двух режимах - в режиме переключателя \\(нажатие и отжатие посылает 1 сообщение\\) и в пуш режиме \\(нажатие посылает команду и отжатие посылает команду\\). Кнопка позволяет послать любое число. По умолчанию кнопка шлет 0/1 \\(LOW/HIGH\\). В пуш режиме кнопка шлет 1 \\(HIGH\\) на нажатие и 0 \\(LOW\\) при отжатии.\n\nВы так же можете менять состояние кнопки с микроконтроллера. Например, включить кнопку на пине V1 можно так :\n\n```cpp\nBlynk.virtualWrite(V1, HIGH);\n```\n\nТак же можно поменять тексты в кнопке :\n\n```cpp\nBlynk.setProperty(V1, \"onLabel\", \"Вкл\");\n```\n\n```cpp\nBlynk.setProperty(V1, \"offLabel\", \"Выкл\");\n```\n\nНазвание самой кнопки :\n\n```cpp\nBlynk.setProperty(V1, \"label\", \"Моя кнопочка\");\n```\n\nИли изменить ее цвет :\n\n```cpp\n//#D3435C - Blynk RED \nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\nВ случае если микроконтроллер был перегружен, Вы всегда можете получить последнее состояние кнопки с сервера с помощью фичи синхронизации состояния:\n\n```cpp\n//как только подключились\nBLYNK_CONNECTED() {\n  //запросить информацию у сервера о состоянии пина V1\n  Blynk.syncVirtual(V1);\n}\n\n//этот метод будет вызыван после ответа сервера \nBLYNK_WRITE(V1) {\n  int buttonState = param.asInt();\n}\n```\n\n## Кнопка на рабочем столе\n\nЕсли Вы используете Android, то Вы можете добавить Blynk кнопку на рабочий стол. В этом случае кнопка будет работать по протоколу HTTPS. Такого рода кнопки имеют определенные ограничения по функционалу в связи с ограничениями платформы Android. Например, Вы не можете получить мгновенную синхронизацию состояния кнопки на рабочем столе с состоянием на микроконтроллере. Так как состояние кнопки на рабочем столе обновляется раз в 15 мин.\n\n**Замечание:** Добавление виджета кнопки на рабочий стол стоит 100 энергии. Эта энергия не возвращается после удаления виджета. Также такая кнопка будет работать на локальном сервере только если открыть порт 8080.\n\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n**Пример кода:** [Синхронизация состояния с физической кнопкой через прерывания](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonInterrupt/ButtonInterrupt.ino)\n\n**Пример кода:** [Синхронизация состояния с физической кнопкой через поллинг](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonPoll/ButtonPoll.ino)\n\n**Пример кода:** [Синхронизация состояния с физической кнопкой](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/SyncPhysicalButton/SyncPhysicalButton.ino)\n\n"
  },
  {
    "path": "untitled/tree/button/blynkkk-blynkkk.github.io-3.md",
    "content": "# blynkkk/blynkkk.github.io\n\n [Permalink](https://github.com/blynkkk/blynkkk.github.io/tree/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/mobile)\n\n Failed to load latest commit information.\n\nType\n\nName\n\nLatest commit message\n\nCommit time\n\n"
  },
  {
    "path": "untitled/tree/device_selector.md",
    "content": "# Селектор устройств \\(Device Selector\\)\n\nСелектор устройств - это мощный виджет, который позволяет обновлять виджеты на основе одного активного устройства. Этот виджет особенно полезен, когда у вас есть несколько устройств с аналогичной функциональностью.\n\nПредставьте, что у вас есть 4 устройства, и к каждому устройству подключен датчик температуры и влажности. Для отображения данных по всем 4 устройствам вам необходимо добавить 8 виджетов.\n\nС помощью Селектора устройств вы можете использовать только 2 виджета, которые будут отображать температуру и влажность в зависимости от активного устройства, выбранного в Селекторе.\n\nВсе, что вам нужно сделать, это:\n\n1. Добавить виджет Селектора устройств в проект\n2. Добавить 2 виджета \\(например виджет отображения значений \\(Value Display Widget\\)\\), чтобы отобразить температуру и влажность\n3. В настройках виджетов вы сможете назначить их на Селектор устройств \\(в разделе источника или цели\\)\n4. Выйти из настроек, запустить проект \n\nТеперь вы можете изменить активное устройство в Селекторе устройств и увидите, что значения температуры и влажности отражают обновленные данные для только что выбранного вами устройства.\n\n**ПРИМЕЧАНИЕ:** Виджет вебхук \\([Webhook](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/WebHook/WebHook_GET/WebHook_GET.ino)\\) пока не работает с Селектором устройств.\n\n"
  },
  {
    "path": "untitled/tree/gps_streaming.md",
    "content": "# Поток GPS \\(GPS Streaming\\)\n\nПолезно для мониторинга местонахождения смартфона получать данные о широте, долготе, высоте и скорости \\(скорость часто может быть 0, если смартфон не поддерживает ее измерение\\).\n\nЧтобы принимать данные из этого виджета, вам необходимо:\n\n```cpp\nBLYNK_WRITE(V1) {\n  float latitude = param[0].asFloat(); \n  float longitude = param[1].asFloat();\n  float altitude = param[2].asFloat();\n  float speed = param[3].asFloat();\n}\n```\n\nили вы можете использовать подготовленную оболочку `GpsParam` :\n\n```cpp\nBLYNK_WRITE(V1) {\n  GpsParam gps(param);\n  //Печать лат/лон с 6 десятичными знаками\n  Serial.println(gps.getLat(), 7);\n  Serial.println(gps.getLon(), 7);\n\n  Serial.println(gps.getAltitude(), 2);\n  Serial.println(gps.getSpeed(), 2);\n}\n```\n\nПоток GPS работает в фоновом режиме.\n\n**Пример кода:** [Поток GPS](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/GPS_Stream/GPS_Stream.ino)\n\n"
  },
  {
    "path": "untitled/tree/graph/README.md",
    "content": "# График \\(Graph\\)\n\nЛегко отображать входящие данные из вашего проекта в графическом варинате. Вы также можете прокручивать и масштабировать график.\n\nВиджет может работать в двух режимах:\n\n* режим PUSH \\(выбирается из списка режимов частоты считывания\\);\n* режим частоты считывания;\n\nВ режиме PUSH вы обновляете датчик со стороны оборудования с помощью кода:\n\n```cpp\nBlynk.virtualWrite(V1, val);\n```\n\nВ этом режиме каждое сообщение, которое аппаратное устройство отправляет на сервер, автоматически сохраняется на сервере. Режим PUSH не требует, чтобы приложение было онлайн или запущенно.\n\nВ режиме частоты считывания вам нужно выбрать интервал обновления, и приложение будет запускать события с требуемым интервалом. Ваше приложение должно быть открыто и запущено для отправки запросов на оборудование. В данном случае вам не нужен код для аналоговых и цифровых пинов. Однако для виртуальных пинов вам необходимо использовать следующий код:\n\n```cpp\n//вызываем из приложения\nBLYNK_READ(V1)\n{\n  //отправляем в приложение\n  Blynk.virtualWrite(V1, val);\n}\n```\n\n**Пример кода:** [Светодиод](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n"
  },
  {
    "path": "untitled/tree/graph/blynkkk-blynkkk.github.io-6.md",
    "content": "# blynkkk/blynkkk.github.io\n\n [Permalink](https://github.com/blynkkk/blynkkk.github.io/tree/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/themes)\n\n Failed to load latest commit information.\n\nType\n\nName\n\nLatest commit message\n\nCommit time\n\n"
  },
  {
    "path": "untitled/tree/gravity/README.md",
    "content": "# Гравитация \\(Gravity\\)\n\nГравитация - это своего рода [датчики движения](https://developer.android.com/guide/topics/sensors/sensors_motion.html), который позволяет обнаруживать движение вашего смартфона. Полезно для мониторинга движения устройства, таких как наклон, встряхивание, вращение или качание.\n\nДатчик силы притяжения выдает трехмерный вектор, указывающий направление и величину силы притяжения. Измеряется в `m/s^2` силы притяжения, приложенной к оси `x`, `y`, `z`. Для того, чтобы принять данные от него, вам необходимо:\n\n```cpp\nBLYNK_WRITE(V1) {\n  //сила притяжения, приложенная к оси x\n  int x = param[0].asFloat(); \n  //сила притяжения, приложенная к оси y\n  int y = param[1].asFloat();\n  //сила притяжения, приложенная к оси y\n  int z = param[2].asFloat();\n}\n```\n\n**ВНИМАНИЕ:** Виджет гравитации не работает в фоновом режиме.\n\n"
  },
  {
    "path": "untitled/tree/gravity/blynkkk-blynkkk.github.io-5.md",
    "content": "# blynkkk/blynkkk.github.io\n\n [Permalink](https://github.com/blynkkk/blynkkk.github.io/tree/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/scripts)\n\n Failed to load latest commit information.\n\nType\n\nName\n\nLatest commit message\n\nCommit time\n\n"
  },
  {
    "path": "untitled/tree/humidity/README.md",
    "content": "# Влажность \\(Humidity\\)\n\nВлажность является своего рода [датчиком среды](https://developer.android.com/guide/topics/sensors/sensors_environment.html), который позволяет измерять относительную влажность окружающей среды.\n\nИзмеряется в `%` - фактически это относительная влажность в процентах.\n\nДля того, чтобы принять данные от датчика, вам необходимо:\n\n```cpp\nBLYNK_WRITE(V1) {\n  //Влажность в %\n  int humidity = param.asInt();\n}\n```\n\n**ВНИМАНИЕ:** Влажность не работает в фоновом режиме.\n\n"
  },
  {
    "path": "untitled/tree/humidity/blynkkk-blynkkk.github.io-1.md",
    "content": "# blynkkk/blynkkk.github.io\n\n```text\nhttp://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n\n\n  \n    Javascript code prettifier\n\n    \n\n    \n\n    \n  \n\n  \n    Languages : CH\n    Javascript code prettifier\n\n    Setup\n    \n      Downloadhttp://code.google.com/p/google-code-prettify/downloads/list\">Download> a distribution\n      Include the script tag below in your document\n        >script src=\"https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js></script>>      See Getting\" rel=\"nofollow\">http://code.google.com/p/google-code-prettify/wiki/GettingStarted\">Getting Started to configure that URL with options you need.      Look at the skin\" rel=\"nofollow\">http://google-code-prettify.googlecode.com/svn/trunk/styles/index.html\">skin gallery and pick styles that suit you.UsagePut code snippets in <pre class=\"prettyprint\">...</pre> or <code class=\"prettyprint\">...</code> and it will automatically be pretty printed.The originalPrettierclass Voila {public:  // Voila  static const string VOILA = \"Voila\";  // will not interfere with embedded tags.}class Voila {public:  // Voila  static const string VOILA = \"Voila\";  // will not interfere with embedded tags.}FAQFor which languages does it work?The comments in prettify.js are authoritative but the lexer should work on a number of languages including C and friends, Java, Python, Bash, SQL, HTML, XML, CSS, Javascript, Makefiles, and Rust. It works passably on Ruby, PHP, VB, and Awk and a decent subset of Perl and Ruby, but, because of commenting conventions, but doesn't work on Smalltalk.Other languages are supported via extensions:If you'd like to add an extension for your favorite language, please look at src/lang-lisp.js and file an http://code.google.com/p/google-code-prettify/issues/list\" >issue including your language extension, and a testcase.How do I specify the language of my code?You don't need to specify the language since prettyprint() will guess. You can specify a language by specifying the language extension along with the prettyprint class like so:<pre class=\"prettyprint lang-html\">  The lang-* class specifies the language file extensions.  File extensions supported by default include    \"bsh\", \"c\", \"cc\", \"cpp\", \"cs\", \"csh\", \"cyc\", \"cv\", \"htm\", \"html\",    \"java\", \"js\", \"m\", \"mxml\", \"perl\", \"pl\", \"pm\", \"py\", \"rb\", \"sh\",    \"xhtml\", \"xml\", \"xsl\".</pre>You may also use the http://dev.w3.org/html5/spec-author-view/the-code-element.html#the-code-element\" >HTML 5 convention of embedding a code element inside the PRE and using language-java style classes. E.g....It doesn't work on <obfuscated code sample>?Yes. Prettifying obfuscated code is like putting lipstick on a pig — i.e. outside the scope of this tool.Which browsers does it work with?It's been tested with IE 6, Firefox 1.5 & 2, and Safari 2.0.4. Look at the test page to see if it works in your browser.What's changed?See the change logWhy doesn't Prettyprinting of strings work on WordPress?Apparently wordpress does \"smart quoting\" which changes close quotes. This causes end quotes to not match up with open quotes.This breaks prettifying as well as copying and pasting of code samples. See http://wordpress.org/support/topic/125038\" >WordPress's help center for info on how to stop smart quoting of code snippets.How do I put line numbers in my code?You can use the linenums class to turn on line numbering. If your code doesn't start at line number 1, you can add a colon and a line number to the end of that class as in linenums:52.For example<pre class=\"prettyprint linenums:4\">// This is line 4.foo();bar();baz();boo();far();faz();<pre> produces// This is line 4.foo();bar();baz();boo();far();faz();How do I prevent a portion of markup from being marked as code?You can use the nocode class to identify a span of markup that is not code.<pre class=prettyprint>int x = foo();  /* This is a comment  <span class=\"nocode\">This is not code</span>  Continuation of comment */int y = bar();</pre> producesint x = foo();  /* This is a comment  This is not code  Continuation of comment */int y = bar();For a more complete example see the issue22 testcase.I get an error message \"a is not a function\" or \"opt_whenDone is not a function\"If you are calling prettyPrint via an event handler, wrap it in a function. Instead of doing addEventListener('load', prettyPrint, false); wrap it in a closure like addEventListener('load', function (event) { prettyPrint() }, false); so that the browser does not pass an event object to prettyPrint which will confuse it.How can I customize the colors and styles of my code? Prettify adds <span> with classes describing the kind of code. You can create CSS styles to matches these classes. See the http://google-code-prettify.googlecode.com/svn/trunk/styles/index.html\"> theme gallery for examples.I can't add classes to my code (because it comes from Markdown, etc.) Instead of <pre class=\"prettyprint ...\"> you can use a comment or processing instructions that survives processing instructions : <?prettify ...?> works as explained in Getting\" rel=\"nofollow\">http://code.google.com/p/google-code-prettify/wiki/GettingStarted\">Getting Started\n```\n\n"
  },
  {
    "path": "untitled/tree/labeled_value.md",
    "content": "# Значение переменной \\(Labeled Value\\)\n\nОтображает входящие данные с ваших датчиков или виртуальных пин-ов. Это лучшая версия «Отображения значений», так как в ней есть строка форматирования, где вы можете форматировать входящее значение в любую нужную вам строку.\n\nМожет работать в 2 режимах:\n\n* режим PUSH \\(выбирается из списка частоты считывания\\);\n* режим частоты считывания.\n\n  В режиме PUSH вы обновляете значения виджета со стороны аппаратного устройства с помощью кода:\n\n```cpp\nBlynk.virtualWrite(V1, val);\n```\n\nВ этом режиме каждое сообщение, которое аппаратное обеспечение отправляет на сервер, автоматически сохраняется на сервере. Режим PUSH не требует, чтобы приложение было онлайн или запущено.\n\nВ режиме частоты считывания вам нужно выбрать интервал обновления, и приложение будет запускать события с требуемым интервалом. Ваше приложение должно быть открыто и запущено для отправки запросов на оборудование. В данном случае вам не нужен код для аналоговых и цифровых пин-ов. Однако для виртуальных пин-ов вам необходимо использовать следующий код:\n\n```cpp\n//взызов из приложения\nBLYNK_READ(V1)\n{\n  //отправка в приложение\n  Blynk.virtualWrite(V1, val);\n}\n```\n\n## Параметры форматирования\n\nПредположим, ваш датчик отправляет число 12.6789 в приложение Blynk. Поддерживаются следующие параметры форматирования:\n\n`/pin/` - отображает значение без форматирования \\(12.6789\\)\n\n`/pin./` - отображает значение без десятичной части \\(13\\)\n\n`/pin.#/` - отображает значение с одним десятичным знаком \\(12.7\\)\n\n`/pin.##/` - отображает значение с двумя десятичными знаками \\(12.68\\)\n\n## Значение переменной на рабочем столе\n\nВы также можете добавить значение переменной на рабочий стол Android. В этом случае значение переменной работает через HTTPS протокол. Имейте в виду, что в режиме «Рабочий стол» обновление значений переменной имеет некоторые ограничения. Значение переменной будет обновлять свое состояние только один раз в 15 минут. Вы можете изменить этот параметр в настройках виджета. Однако интервал обновления менее 15 минут не гарантируется. Вы также можете изменить размер виджета Значение переменной на главном экране - просто сделайте долгий тап на виджете и измените его размер на необходимый.\n\n**Примечание:** Добавление виджета на домашний экран стоит 100 энергии. Энергия при удалении виджета не восстанавливается.\n\n**Примечание:** Виджеты рабочего стола для локальных серверов Blynk требуют открыть порт 8080.\n\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n"
  },
  {
    "path": "untitled/tree/labeled_value_display.md",
    "content": "# Значение переменной \\(Labeled Value\\)\n\nОтображает входящие данные с ваших датчиков или виртуальных пин-ов. Это лучшая версия «Отображения значений», так как в этом виджете есть строка форматирования, поэтому вы можете форматировать входящее значение в любую нужную вам строку.\n\nМожет работать в 2 режимах:\n\n* режим PUSH \\( выберитается из списка частоты считывания\\);\n* режим частоты считывания;\n\nВ режиме PUSH вы должны обновлять отображение значений на аппаратной устройстве с помощью кода:\n\n```cpp\nBlynk.virtualWrite(V1, val);\n```\n\nВ этом режиме каждое сообщение, которое аппаратное устройств отправляет на сервер, автоматически сохраняется на сервере. Режим PUSH не требует, чтобы приложение было онлайн или запущено.\n\nВ режиме частоты считывания вам нужно выбрать интервал обновления, и приложение будет запускать события с требуемым интервалом. Ваше приложение должно быть открыто и запущено для отправки запросов на оборудование. В данном случае вам не нужен код для аналоговых и цифровых пин-ов. Однако для виртуальных пин-ов вам необходимо использовать следующий код:\n\n```cpp\n//вызываем из приложения\nBLYNK_READ(V1)\n{\n  //отправляем в приложение\n  Blynk.virtualWrite(V1, val);\n}\n```\n\n## Параметры форматирования\n\nПредположим, ваш датчик отправляет число 12.6789 в приложение Blynk. Поддерживаются следующие параметры форматирования:\n\n`/pin/` - отображает значение без форматирования \\(12.6789\\)\n\n`/pin./` - отображает значение без десятичной части \\(13\\)\n\n`/pin.#/` - отображает значение с одним десятичным знаком \\(12.7\\)\n\n`/pin.##/` - отображает значение с двумя десятичными знаками \\(12.68\\)\n\n## Значение переменной на главном экране\n\nВы также можете добавить значение переменной на рабочий стол Android. В этом случае значение переменной работает через HTTPS протокол. Имейте в виду, что в режиме «Рабочий стол» значение переменной имеет некторые ограничения. Значение переменной будет обновлять свое состояние только один раз в 15 минут. Вы можете изменить этот параметр через настройки виджета. Однако интервал обновления менее 15 минут не гарантируется. Вы также можете изменить размер виджета Значение переменной на рабочем столе - просто сделайте длинный тап на виджете и измените его размер на необходимый.\n\n**Примечание:** Добавление виджета на домашний экран стоит 100 энергии. Эта энергия не восстанавливается.\n\n**Примечание:** Виджеты главного экрана для локальных серверов Blynk требуют открытия порта 8080.\n\n**Пример кода:** [Светодиод](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n"
  },
  {
    "path": "untitled/tree/lcd.md",
    "content": "# ЖК дисплей \\(LCD\\)\n\nЭто обычный ЖК-дисплей 16x2, \"сделанный\" на нашем секретном предприятии в Китае. Виджет может работать в двух режимах:\n\n* Простой \\(Simple\\)\n* Расширенный \\(Advanced\\)\n\n## Простой режим \\(Simple\\)\n\nВ простом режиме ваш ЖК-виджет работает как обычный виджет с частотой чтения.\n\nВ режиме частоты считывания вам нужно выбрать интервал обновления данных, и приложение будет запускать события с требуемым интервалом. Ваше приложение должно быть открыто и запущено для отправки запросов на оборудование. В данном случае вам не нужен код для аналоговых и цифровых пин-ов. Однако для виртуальных пин-ов вам необходимо использовать следующий код:\n\n```cpp\n//вызываем из приложения\nBLYNK_READ(V1)\n{\n  //отправляем в приложение\n  Blynk.virtualWrite(V1, val);\n}\n```\n\nВ простом режиме ЖК-дисплей также поддерживает параметры форматирования.\n\n## Параметры форматирования\n\nПредположим, ваш датчик отправляет число 12.6789 в приложение Blynk. Поддерживаются следующие параметры форматирования:\n\n`/pin/` - отображает значение без форматирования \\(12.6789\\)\n\n`/pin./` - отображает значение без десятичной части \\(13\\)\n\n`/pin.#/` - отображает значение с одним десятичным знаком \\(12.7\\)\n\n`/pin.##/` - отображает значение с двумя десятичными знаками \\(12.68\\)\n\n**Пример кода:** [ЖК дисплей простой режим - PUSH](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_SimpleModePushing/LCD_SimpleModePushing.ino)\n\n**Пример кода:** [ЖК дисплей простой режим - 1 сек](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_SimpleModeReading/LCD_SimpleModeReading.ino)\n\n## Расширенный режим \\(Advanced\\)\n\nРасширенный режим предназначен для опытных пользователей. Позволяет использовать специальные команды для управления ЖК-дисплеем.\n\n## Команды\n\nИнициируем переменную ЖК-дисплея:\n\n```cpp\nWidgetLCD lcd(V1);\n```\n\nОтправим сообщение:\n\n```cpp\nlcd.print(x, y, \"Ваше сообщение\");\n```\n\nГде `x` - позиция символа \\(0-15\\), `y` - номер строки \\(0 или 1\\),\n\nОчистка ЖК-дисплея:\n\n```cpp\nlcd.clear();\n```\n\n**Пример кода:** [ЖК-дисплей расширенный режим](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_AdvancedMode/LCD_AdvancedMode.ino)\n\n"
  },
  {
    "path": "untitled/tree/led.md",
    "content": "# Светодиод \\(LED\\)\n\nПростой светодиод для индикации. Вам нужно отправить 0, чтобы выключить светодиод. И 255 для того, чтобы включить светодиод. Или просто используйте Blynk API, как описано ниже:\n\n```cpp\n//регистрируемся на виртуальном пине 1\nWidgetLED led1(V1);\nled1.off();\nled1.on();\n```\n\nВсе значения от 0 до 255 изменяют яркость светодиода:\n\n```cpp\nWidgetLED led2(V2);\n//установить яркость светодиода на 50%.\nled2.setValue(127);\n```\n\nВы также можете изменить цвет светодиода с помощью кода:\n\n```cpp\n//#D3435C - Красный в RGB формате\nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\n## Светодиод на рабочем столе\n\nВы можете добавить виджет светодиод на рабочий стол Android. В этом случае светодиод работает через протокол HTTPS. Имейте в виду, что в режиме «Рабочий стол» виджет светодиода имеет некоторые ограничения. Светодиод будет обновлять свое состояние только один раз в 15 минут. Вы можете изменить этот интервал через настройки виджета. Однако интервал обновления менее 15 минут не гарантируется.\n\n**Примечание:** Добавление виджета на рабочий стол стоит 100 энергии. Эта энергия не возвращается при удалении виджета.\n\n**Примечание:** Виджеты рабочего стола для локальных серверов Blynk требуют открыть порт 8080.\n\n**Пример кода:** [Диод](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LED/LED_Blink/LED_Blink.ino)\n\n"
  },
  {
    "path": "untitled/tree/level_display.md",
    "content": "# Индикатор уровня \\(Level Display\\)\n\nОтображает входящие данные с ваших датчиков или виртуальных пин-ов. Отображение уровня очень похоже на индикатор выполнения процесса, это очень красивый и причудливый вид для индикации «выполненных» событий, например «уровня заряда батареи». Вы можете обновить отображение значения с аппаратной стороны с помощью кода:\n\n```cpp\nBlynk.virtualWrite(V1, val);\n```\n\nКаждое сообщение, которое аппаратное устройство отправляет на сервер, автоматически сохраняется на сервере. Режим PUSH не требует, чтобы приложение было онлайн или запущено.\n\n**Пример кода:** [Пример PUSH](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushData/PushData.ino)\n\n"
  },
  {
    "path": "untitled/tree/master.md",
    "content": "# master\n\n"
  },
  {
    "path": "untitled/tree/notification.md",
    "content": "# notification\n\n## Всплывающие уведомления \\(Push Notifications\\)\n\nВиджет Push-уведомлений позволяет отправлять уведомления с вашего оборудования на ваше Android/iOS устройство. В настоящее время он также содержит три дополнительные опции:\n\n* **Уведомлять, когда оборудование отключено** \\(Notify when hardware offline\\) - вы получите push-уведомление, если ваше оборудование отключилось.\n* **Автономный период игнорирования** \\(Offline Ignore Period\\) - определяет, как долго оборудование может находиться в режиме ожидания \\(после того, как оно отключилось\\) перед отправкой уведомления.\n\nВ случае превышения периода ожидания будет отправлено уведомление «Аппаратное отключение». Вы не получите уведомление, если оборудование переподключится в течение указанного периода.\n\n* **Приоритет** \\(Priority\\) - высокий \\(high\\) приоритет дает больше шансов, что ваше сообщение будет доставлено без задержек. См. более подробное объяснение [здесь](https://firebase.google.com/docs/cloud-messaging/concept-options#setting-the-priority-of-a-message).\n\n**ПРЕДУПРЕЖДЕНИЕ**: высокий приоритет способствует большей разрядке батареи, по сравнению с обычными приоритетом уведомлений.\n\nПример кода:\n\n```cpp\nBlynk.notify(\"Привет, Blynk-еры! Мое оборудование может отправлять уведомления!\");\n```\n\nВы также можете использовать переменные/заполнители для имени устройства, который будет заменен с сервера именем вашего устройства:\n\n```cpp\nBlynk.notify(\"Привет, Blynk-еры! Мой {DEVICE_NAME} может отправлять уведомления!\");\n```\n\nОграничения:\n\n* Максимально допустимая длина уведомления составляет 120 символов;\n* Каждое устройство может отправлять только 1 уведомление каждые 5 секунд;\n\n## Кодировка всплывающих уведомлений\n\nБиблиотека обрабатывает все строки как в кодировке UTF-8. Если вы столкнулись с проблемами, попробуйте отправить ваше сообщение на последовательный порт и посмотреть, работает ли оно \\(терминал должен быть настроен на кодировку UTF-8\\). Если так не работает, возможно, вам следует прочитать о поддержке кодировки UTF-8 вашего компилятора. Если работает, но ваше сообщение урезано - вам необходимо увеличить ограничение длины сообщения \\(все символы UTF-8 потребляют как минимум вдвое больше байт информации\\).\n\n## Увеличение лимита длины уведомления\n\nВы можете увеличить максимальную длину сообщения, поместив строку \\(до включения Blynk\\) в верхнюю часть своего кода:\n\n```cpp\n#define BLYNK_MAX_SENDBYTES 256 // По умолчанию 128 байт\n```\n\n**Пример кода:** [Всплывающие уведомления](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/PushNotification/PushNotification_Button/PushNotification_Button.ino)\n\n"
  },
  {
    "path": "untitled/tree/number_input/README.md",
    "content": "# Числовой ввод \\(Numeric Input\\)\n\nЧисловой ввод отображается и позволяет вам непосредственно изменить числовое значение. Как и в виджете [Шаг \\(Step\\)](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/step.md), он также имеет кнопки увеличения и уменьшения для более быстрого изменения значений, вы можете установить \\(шаг, цикл\\) \\(step, looping\\) в настройках виджета.\n\n"
  },
  {
    "path": "untitled/tree/number_input/blynkkk-blynkkk.github.io.md",
    "content": "# blynkkk/blynkkk.github.io\n\n [Permalink](https://github.com/blynkkk/blynkkk.github.io/tree/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/css)\n\n Failed to load latest commit information.\n\nType\n\nName\n\nLatest commit message\n\nCommit time\n\n You can’t perform that action at this time. \n\n"
  },
  {
    "path": "untitled/tree/report.md",
    "content": "# report\n\n## Отчеты \\(Reports\\)\n\nФункция виджета Отчеты заключается в настройке и разметке отчетов данных в формате CSV. Вы можете выбрать разовые или переодически запланированные отчеты.\n\nКроме того, в отчетах вы можете очистить все пользовательсике данные, собранные с ваших устройств.\n\nВам необходимо настроить начальные параметры в режиме редактирования, а затем уже в режиме воспроизведения вы сможете настроить сами отчеты.\n\n### Режим редактирования. Конфигурация ввода данных\n\nВ режиме редактирования \\(когда ваш проект остановлен\\) вы определяете потоки данных, которые вы хотели бы позже включить в отчет. Виджет Отчеты предназначен для работы с виджетом [Плитка устройств \\(Device Tiles\\)](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/device_tiles.md). Если вы не используете плитки устройств, вы все равно можете выбрать одно устройство или группу устройств в качестве источника данных для отчетов.\n\nВы должны выбрать либо [Плитку устройств](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/device_tiles.md), либо одино устройство, либо группу устройств для отчета. Вы не можете объединить эти оба варианта.\n\n### Режим воспроизведения\n\nПосле добавления исходных устройств и их потоков данных нажмите кнопку «Воспроизвести» и нажмите кнопку «Отчеты».\n\n## Настройка отчетов\n\nКаждый параметр отчета предполагает свои собственные настройки:\n\n`Report name` \\(Имя отчета\\) - дайте вашему отчету осмысленное имя.\n\n`Data source` \\(Источники данных\\) - выберите потоки данных, которые вы хотели бы включить в отчеты.\n\n`Report Frequency` \\(периодичность отчетов\\) - Определяет, как часто будут отправляться отчеты. Они могут быть разовыми и запланированными.\n\n`one-time` \\(Сейчас\\) - мгновенно сформирует отчет и отправит его на указанные адреса электронной почты. Нажмите на значок справа, чтобы отправить отчет.\n\nЗапланированные отчеты могут быть отправлены `daily`/`weekly`/`monthly` \\(ежедневно/еженедельно/ежемесячно\\).\n\n`At Time` \\(Время\\) установите время дня, когда отчет будет отправлен. `Start`/`End` \\(Качало/Конец\\) указывает дату начала и окончания оправки отчетов.\n\nДля еженедельного отчета вы можете выбрать день недели, когда отчет должен быть отправлен. Для ежемесячного отчета вы можете выбрать, отправку отчета в первый или последний день месяца.\n\n`Recipients` \\(Получатели\\) - укажите до 5 адресов электронной почты..\n\n`Data resolution` \\(Разрешение данных\\) определяет детализацию ваших отчетов. Поддерживаемые детализации: `minute` \\(ежеминутно\\), `hourly` \\(ежечасно\\) и `daily` \\(ежедневно\\). Например, когда вы генерируете ежедневный отчет с детализацией в 1 минуту, вы получаете `24 * 60 * 60` единиц данных в вашем ежедневном отчете за каждый выбранный поток.\n\n`Group data in reports by` \\(Группировка данных в отчетах\\) - укажите выходной формат файла-\\(ов\\) CSV:\n\n`Datastream` \\(Поток\\) - вы получите один CSV файл для каждого потока данных.\n\n`Device` \\(Устройство\\) - вы получите один CSV-файл на каждое устройство. Каждый файл будет содержать все включенные потоки данных.\n\n`Report` \\(Отчет\\) - вы получите один CSV-файл для всех ваших устройств и всех ваших потоков данных.\n\n`Timezone correction` \\(Времненная зона\\) - укажите корректировку часового пояса, если вам нужно настроить дату и время отчета на определенный часовой пояс.\n\n`Date and time format` \\(Формат даты и времени\\) - определяет формат поля временной метки ваших данных. Вы можете выбрать `2018-06-21 20:16:48`, `2018-06-21T20:16:48+03:00` или другой поддерживаемый формат.\n\nСуществует особый формат `Timestamp` \\(Временная метка\\), которая отражает разницу между текущим временем и полуночью 1 января 1970 года UTC, измеряемую в миллисекундах.\n\nПосле настройки отчета нажмите кнопку «ОК» в правом верхнем углу. Ваш отчет готов.\n\nПосле настройки отчета вы увидите, когда запланирован следущий отчет `Next`, а также увидите расписание для этого отчета.\n\nПосле отправки отчета хотя бы один раз, вы можете увидеть дату его последней отправки `Last`.\n\n`Last` \\(Последний\\) метка также содержит статус отправки отчета:\n\n* `OK` \\(Успешно\\):  отчет был сгенерирован и успешно отправлен Получателям;\n* `No Data` \\(Нет данных\\): отчет не содержит данных за указанный период;\n* `Error` \\(Ошибка\\):  что-то пошло не так. Пожалуйста, свяжитесь со службой поддержки Blynk.\n\nОтчеты будут генерироваться, даже если ваш проект не находится в активном \\(Play\\) режиме. Однако помните, неактивные проекты небудут генерировать данные.\n\n**ПРИМЕЧАНИЕ:** все отчеты формируются в кодировке UTF-16. Пожалуйста, убедитесь, что при открытии файла отчета вы выбрали кодировку UTF-16 в вашем CSV-редакторе.\n\n"
  },
  {
    "path": "untitled/tree/rgb.md",
    "content": "# rgb\n\n## ЗеБРа \\(zeRGBa\\)\n\nЗеБРа - это обычный RGB контроллер \\(палитры цветов\\).\n\n### Настройки:\n\n* **SPLIT** \\(Раздельный\\): Каждый из параметров отправляется непосредственно на пин вашего оборудования \\(например, D7\\). Вам не нужно писать код.\n\n**ПРИМЕЧАНИЕ:** В этом режиме вы отправляете одновременно несколько команд из одного виджета, что может снизить производительность вашего оборудования.\n\nПример: у вас есть виджет ЗеБРа и для него было установлено значение D1, D2, D3, он отправит 3 команды через Интернет:\n\n```cpp\ndigitalWrite(1, r);\ndigitalWrite(2, g);\ndigitalWrite(3, b);\n```\n\n* **MERGE** \\(Объединенный\\):\n\n  Когда выбран режим MERGE, вы отправляете только 1 сообщение, состоящее из массива значений. Но в последствии вам нужно разобрать сообщение на своем оборудовании.\n\nЭтот режим можно использовать только с виртуальными пин-ами.\n\nПример: добавьте виджет ЗеБРа и установите его в режим MERGE. Выберите виртуальный контакт V1.\n\n```cpp\nBLYNK_WRITE(V1) // ЗеБРа назначен на V1 \n{\n    // получим значение КРАСНОГО канала\n    int r = param[0].asInt();\n    // получим значение ЗЕЛЕНОГО канала\n    int g = param[1].asInt();\n    // получим значение СИНЕГО канала\n    int b = param[2].asInt();\n}\n```\n\n* **Отправка при Отжатии \\(Send On Release\\)** доступно для большинства виджетов контроллеров и позволяет уменьшить трафик данных на вашем оборудовании. Например, когда вы перемещаете виджет джойстика, команды непрерывно передаются на аппаратное устройство, во время одного движения джойстика вы можете отправлять десятки команд. Есть случаи, когда это необходимо, однако создание такой нагрузки может привести к сбросу оборудования. Мы рекомендуем включить функцию **Отправка при Отжатии** для большинства случаев, если вам не требуется мгновенная обратная связь. Эта опция включена по умолчанию.\n\n## Интервал записи \\(Write interval\\)\n\nПохоже на вышеуказанный вариант. Однако, позволяет вам передавать значения на ваше оборудование в через определенные интервалы времени. Например, установка интервала записи на 100 мс означает, что при перемещении ползунка на аппаратное обеспечение будет отправлено только 1 значение в течение 100 мс. Эта опция также используется для уменьшения трафика данных на ваше оборудовании.\n\n"
  },
  {
    "path": "untitled/tree/segmented_control/README.md",
    "content": "# Сегментированный переключатель \\(Segmented Switch\\)\n\nВиджет Сегментированный переключатель позволяет отправлять команды на ваше оборудование на основе выбора, сделанного вами в пользовательском интерфейсе. Сегментированный переключатель отправляет индекс выбранного вами элемента, а не строку метки. Отправленный индекс начинается с 1. Он работает так же, как типовой элемент [Комбинированный список \\(ComboBox\\)](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA) или [Меню \\(Menu\\)](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/menu.md).\n\nПример кода:\n\n```cpp\nBLYNK_WRITE {\n  switch (param.asInt()) {\n    case 1: { // Пункт 1\n      Serial.println(\"Выбран пункт 1\");\n      break;\n    }\n    case 2: { // Пункт 2\n      Serial.println(\"Выбран пункт 2\");\n      break;\n    }    \n  }\n}\n```\n\nВы также можете установить пункты меню со стороны оборудования с помощью кода:\n\n```cpp\nBlynk.setProperty(V1, \"labels\", \"label 1\", \"label 2\", \"label 3\");\n```\n\n**Пример кода:** [Меню](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Menu/Menu.ino)\n\n"
  },
  {
    "path": "untitled/tree/segmented_control/blynkkk-blynkkk.github.io-2.md",
    "content": "# blynkkk/blynkkk.github.io\n\n Failed to load latest commit information.\n\n"
  },
  {
    "path": "untitled/tree/segmentedswitch.md",
    "content": "# Сегментированный переключатель \\(Segmented Switch\\)\n\nВиджет Сегментированный переключатель позволяет отправлять команды на ваше оборудование на основе выбора, сделанного вами в пользовательском интерфейсе. Сегментированный переключатель отправляет индекс выбранного вами элемента, а не строку метки. Отправленный индекс начинается с 1. Он работает так же, как типовой элемент [Комбинированный список \\(ComboBox\\)](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA) или [Меню \\(Menu\\)](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/menu.md).\n\nПример кода:\n\n```cpp\nBLYNK_WRITE {\n  switch (param.asInt()) {\n    case 1: { // Пункт 1\n      Serial.println(\"Выбран пункт 1\");\n      break;\n    }\n    case 2: { // Пункт 2\n      Serial.println(\"Выбран пункт 2\");\n      break;\n    }    \n  }\n}\n```\n\nВы также можете установить пункты меню со стороны оборудования с помощью кода:\n\n```cpp\nBlynk.setProperty(V1, \"labels\", \"label 1\", \"label 2\", \"label 3\");\n```\n\n**Пример кода:** [Меню](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Menu/Menu.ino)\n\n"
  },
  {
    "path": "untitled/tree/step.md",
    "content": "# step\n\n## Шаговое управление \\(Step Control\\)\n\nШаговое управление похоже на две кнопки, назначенные одному пин-у. Одна кнопка увеличивает ваше значение на установленный шаг, а другая уменьшает его. Это очень полезно для случаев использования, когда вам нужно точно изменять ваши значения, но вы не можете достичь такой точности с помощью виджета [Cлайдера](https://github.com/blynkkk/blynkkk.github.io/tree/master/mobile/ru/slider.md).\n\n**Отправить шаг \\(Send Step\\)** опция позволяет вам отправлять на оборудование каждый шаг нвместо фактического значения виджета.\n\n**Зациклить значения \\(Loop value\\)** опция позволяет сбросить Шаговый виджет на начальное значение при достижении максимального.\n\nВы можете изменить значение Шагового виджета со стороны оборудования. Например:\n\n```cpp\nBlynk.virtualWrite(V1, val);\n```\n\nВы можете изменить описание виджета со стороны оборудования с помощью кода:\n\n```cpp\nBlynk.setProperty(V1, \"label\", \"Мой счетчик.\");\n```\n\nВы можете изменить шаг виджета со стороны оборудования:\n\n```cpp\nBlynk.setProperty(V1, \"step\", 10);\n```\n\nили изменить цвет:\n\n```cpp\n//#D3435C - Красный цвет в RGB кодировке\nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\nВы также можете получить состояние виджета Шагового управления с сервера в случае, если ваше оборудование отключилось, с помощью функции Blynk.Sync:\n\n```cpp\nBLYNK_CONNECTED() {\n  Blynk.syncVirtual(V1);\n}\n\nBLYNK_WRITE(V1) {\n  int stepperValue = param.asInt();\n}\n```\n\n## Интервал записи \\(Write interval\\)\n\nОпция позволяет вам передавать значения на ваше оборудование в через определенные интервалы времени. Например, установка интервала записи на 100 мс означает, что при перемещении ползунка на аппаратное обеспечение будет отправлено только 1 значение в течение 100 мс. Эта опция также используется для уменьшения трафика данных на ваше оборудовании.\n\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n"
  },
  {
    "path": "untitled/tree/table/README.md",
    "content": "# Таблица \\(Table\\)\n\nТабличный виджет удобен, когда вам нужно структурировать аналогичные данные в пределах одного графического элемента. Работает как обычная таблица.\n\nВы можете добавить строку в таблицу с помощью кода:\n\n```text\nBlynk.virtualWrite(V1, \"add\", id, \"Имя\", \"Значение\");\n```\n\nВы можете обновить строку в таблице с помощью кода:\n\n```text\nBlynk.virtualWrite(V1, \"update\", id, \"Новое имя\", \"Новое значение\");\n```\n\nЧтобы выделить любой элемент в таблице, используйте его идентификатор:\n\n```text\nBlynk.virtualWrite(V1, \"pick\", 0);\n```\n\nЧтобы выбрать/отменить выбор \\(сделать значок зеленым/серым\\) элемент в таблице, используйте его идентификатор:\n\n```text\nBlynk.virtualWrite(V1, \"select\", 0);\nBlynk.virtualWrite(V1, \"deselect\", 0);\n```\n\nЧтобы очистить таблицу используйте код:\n\n```text\nBlynk.virtualWrite(V1, \"clr\");\n```\n\nВы также можете обрабатывать другие действия из таблицы. Например, использовать строку таблицы в качестве кнопки переключения.\n\n```text\nBLYNK_WRITE(V1) {\n   String cmd = param[0].asStr();\n   if (cmd == \"select\") {\n       // строка в таблице была выбрана.\n       int rowId = param[1].asInt();\n   }\n   if (cmd == \"deselect\") {\n       // строка в таблице была отменена.\n       int rowId = param[1].asInt();\n   }\n   if (cmd == \"order\") {\n       // когда строки в таблице переупорядочиваются\n       int oldRowIndex = param[1].asInt();\n       int newRowIndex = param[2].asInt();\n   }\n}\n```\n\n**Примечание:** Максимальное количество строк в таблице равно 100. Когда вы достигнете предела, таблица будет работать как список FIFO \\(Первый пришел - первый ушел\\). Это ограничение можно изменить, настроив свойство `table.rows.pool.size` в параметрах локального сервера.\n\n**Пример кода:** [Простое использование таблицы](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Table/Table_Simple/Table_Simple.ino)\n\n**Пример кода:** [Расширенное использование таблицы](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Table/Table_Advanced/Table_Advanced.ino)\n\n"
  },
  {
    "path": "untitled/tree/table/blynkkk-blynkkk.github.io.md",
    "content": "# blynkkk/blynkkk.github.io\n\n [Permalink](https://github.com/blynkkk/blynkkk.github.io/tree/b1f1a439851d4000d4d85ddab2f72db8d227d6cc/new/en)\n\n Failed to load latest commit information.\n\nType\n\nName\n\nLatest commit message\n\nCommit time\n\n"
  },
  {
    "path": "untitled/tree/timer.md",
    "content": "# Таймер \\(Timer\\)\n\nТаймер запускает действия в определенное время. Даже если смартфон не в сети. По умолчанию время начала отправляет 1 \\(HIGH\\), время остановки отправляет 0 \\(LOW\\). Вы можете изменить это поведение на любые другие значения. Вы можете изменить настройки Таймера в режиме «Запуска». В последней версии Android также есть улучшенный таймер в виджете [Обработчик событий](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/eventor.md).\n\nC [Обработчиком](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/eventor.md) событий вы можете назначить несколько таймеров на один и тот же пин, отправить любую строку/число, выбирать дни и часовой пояс. Рекомендуется использовать виджет [Обработчик событий](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/eventor.md) поверх виджета Таймер. Однако виджет Таймер по-прежнему подходит и для простых событий таймера.\n\n**ПРИМЕЧАНИЕ:** Виджет таймера зависит от времени сервера, а не вашего телефона. Иногда время телефона может не соответствовать времени сервера.\n\n**Пример кода:** [Таймер](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Timer/Timer.ino)\n\n"
  },
  {
    "path": "untitled/tree/twitter.md",
    "content": "# twitter\n\n## Твиттер \\(Twitter\\)\n\nВиджет Твиттер соединяет вашу учетную запись сети Twitter с Blynk и позволяет отправлять \"твиты\" с вашего оборудования.\n\nПример кода:\n\n```cpp\nBlynk.tweet(\"Привет, Blynk-еры! Мой Arduino может слать твиты!\");\n```\n\nОграничения :\n\n* нельзя отправлять 2 твита с одним и тем же сообщением \\(это политика Твиттера\\)\n* разрешен только 1 твит за 5 секунд\n\n## Кодировка в Твиттере\n\nБиблиотека обрабатывает все строки в кодировке UTF-8. Если вы столкнулись с проблемами, попробуйте напечатать ваше сообщение на последовательный порт и проверить, работает ли оно \\(COM терминал должен быть настроен на кодировку UTF-8\\). Если не работает, вам следует проверить поддержку UTF-8 вашего компилятора. Если работает, но ваше сообщение обрезано - вам нужно увеличить длины сообщения \\(все символы UTF-8 потребляют как минимум вдвое больше байт информации\\).\n\n## Увеличение лимита длины сообщения\n\nВы можете увеличить максимальную длину сообщения, поместив \\(до включения Blynk\\) в верхнюю часть своего кода строку:\n\n```cpp\n#define BLYNK_MAX_SENDBYTES 256 // По умолчанию 128 байт\n```\n\n**Пример кода:** [Твиттер](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Twitter/Twitter.ino)\n\n"
  },
  {
    "path": "untitled/twitter.md",
    "content": "# twitter\n\n## Twitter\n\nTwitter widget connects your Twitter account to Blynk and allows you to send Tweets from your hardware.\n\nExample code:\n\n```cpp\nBlynk.tweet(\"Hey, Blynkers! My Arduino can tweet now!\");\n```\n\nLimitations :\n\n* you can't send 2 tweets with same message \\(it's Twitter policy\\)\n* only 1 tweet per 5 seconds is allowed\n\n## Unicode in Twitter\n\nThe library handles all strings as UTF8 Unicode. If you're facing problems, try to print your message to the Serial and see if it works \\(the terminal should be set to UTF-8 encoding\\). If it doesn't work, probably you should read about unicode support of your compiler. If it works, but your message is truncated - you need to increase message length limit \\(all Unicode symbols consume at least twice the size of Latin symbols\\).\n\n## Increasing message length limit\n\nYou can increase maximum message length by putting on the top of your sketch \\(before Blynk includes\\):\n\n```cpp\n#define BLYNK_MAX_SENDBYTES 256 // Default is 128\n```\n\n**Sketch:** [Twitter](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Twitter/Twitter.ino)\n\n"
  },
  {
    "path": "untitled/value_display.md",
    "content": "# Value Display\n\nDisplays incoming data from your sensors or Virtual Pins. Can work in 2 modes :\n\n* PUSH mode \\(select it from Frequency Reading picker\\);\n* Frequency Reading mode;\n\nIn PUSH mode you update value display from hardware side with code :\n\n```cpp\nBlynk.virtualWrite(V1, val);\n```\n\nIn this mode every message that hardware sends to server is stored automatically on server. PUSH mode doesn't require application to be online or opened.\n\nWith Frequency Reading mode you need to select update interval and application will trigger events with required timing. Your application should be open and running in order to make requests to hardware. You don't need any code for Analog and Digital pins in that case. However for virtual pins you need to use next code :\n\n```cpp\n//triggered from app\nBLYNK_READ(V1)\n{\n  //send to app\n  Blynk.virtualWrite(V1, val);\n}\n```\n\n## Home Screen Value Display\n\nYou can also add Value Display to your Android Home Screen. Value Display works via HTTPS in that case. Have in mind that in \"Home Screen\" mode Value Display has few limitations. Value Display will update it's state only once per 15 min. You can change this via Widget Settings. However update interval less than 15 minutes is not guaranteed.  \nYou can also resize Value Display on Home Screen - just do long click on widget and resize it as you need.\n\n**Note :** Adding home screen widget costs 100 energy. This energy not rechargeable. **Note :** Home Screen Widgets for Local Blynk servers requires port 8080 to be opened.\n\n**Sketch:** [BlynkBlink](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n"
  },
  {
    "path": "untitled/video.md",
    "content": "# Video Streaming\n\nSimple widget that allows you to display any live or video stream. Widget supports RTSP \\(RP, SDP\\), HTTP/S progressive streaming, HTTP/S live streaming. For more info please follow [official Android documentation](https://developer.android.com/guide/appendix/media-formats.html).\n\nAt the moment Blynk doesn't provide streaming servers. So you can either stream directly from camera, use 3-d party services or host streaming server on own server \\(on raspberry for example\\).\n\nYou can also stop/start video stream with click on widget.\n\nYou can also change video url from hardware with :\n\n```cpp\nBlynk.setProperty(V1, \"url\", \"http://my_new_video_url\");\n```\n\n"
  },
  {
    "path": "untitled/webhook.md",
    "content": "# Webhook\n\nWebhook is a widget for 3-d party integrations. With webhook widget you can send HTTP/S requests to any 3-d party server or device that has HTTP/S API \\(Philips Hue for instance\\).\n\nAny write operation from hardware side will trigger webhook widget \\(same way as for eventor\\). You can also trigger webhook from application side in case control widget assigned to same pin as webhook. You can trigger 3-d party service with single button click.\n\nFor example, imagine a case when you want to send data from your hardware not only to Blynk but also to Thingspeak server. In typical, classic use case you'll need to write code like this \\(this is minimal and not full sketch\\) :\n\n```cpp\nWiFiClient client;\nif (client.connect(\"api.thingspeak.com\", 80)) {\n    client.print(\"POST /update HTTP/1.1\\n\");\n    client.print(\"Host: api.thingspeak.com\\n\");\n    client.print(\"Connection: close\\n\");\n    client.print(\"X-THINGSPEAKAPIKEY: \" + apiKeyThingspeak1 + \"\\n\");\n    client.print(\"Content-Type: application/x-www-form-urlencoded\\n\");\n    client.print(\"Content-Length: \");\n    client.print(postStr.length());\n    client.print(\"\\n\\n\");\n    client.print(postStr);\n}\n```\n\nWith webhook widget this is not necessary anymore. All you need just fill few fields.\n\nAnd do usual :\n\n```cpp\nBlynk.virtualWrite(V0, value);\n```\n\nwhere V0 is pin assigned to webhook widget.\n\nAlso you can use usual Blynk placeholders for pin value in body or url, for example :\n\n```cpp\nhttps://api.thingspeak.com/update?api_key=xxxxxx&field1=/pin/\n```\n\nor for body\n\n```cpp\n[\"/pin/\"]\n```\n\nYou can also refer to specific index of multi value pin \\(multi pin supports up to 5 values\\) :\n\n`/pin[0]/`,`/pin[1]/`, `/pin[2]/`\n\nAnother cool thing about webhook is that you can make GET requests from Blynk Server side and return response directly to your hardware. The beauty here is that you don't need to code request to 3-d party service. Imagine a case when you want to get weather from some 3-d party service. For example, you have an url `http://api.sunrise-sunset.org/json?lat=33.3823&lng=35.1856&date=2016-10-01`, you can put it in widget, select `V0` pin, and do usual :\n\n```cpp\nBLYNK_WRITE(V0){\n  String webhookdata = param.asStr();\n  Serial.println(webhookdata);\n}\n```\n\nNow, every time you'll trigger `V0` pin \\(with `Blynk.virtualWrite(V0, 1)` from hardware side or with control widget assigned to `V0`\\) - `BLYNK_WRITE(V0)` will be triggered.\n\n**NOTE :** usually 3-d party servers returns big responses, so you have to increase hardware maximum allowed message size with `#define BLYNK_MAX_READBYTES 1024`. Where `1024` - is maximum allowed message size.\n\n**NOTE :** Blynk cloud has limitation for webhook widget - you are allowed to send only 1 request per second. You can change this on local server with `webhooks.frequency.user.quota.limit` property. Please be very careful using webhooks, as many resources not capable to handle even 1 req/sec, so you may be banned on some of them. For example thingspeak allows to send 1 request per 15 seconds.\n\n**NOTE :** In order to avoid spamming Blynk Webhook has one more limitation - in case your webhook requests were failed 10 times in row your webhook widget will be stopped. In order to resume it you need to open widget and save it again. Failed requests are requests that return status code that are not equal to 200 or 302.\n\n**NOTE :** Webhook widget may affect `Blynk.syncAll()` feature. As returned response from server may be big. So, please, be careful with it.\n\n"
  },
  {
    "path": "widgets-ru.md",
    "content": "<h2 id=\"intro-important\"> 🚨🚨🚨 ВАЖНО:</h2> \n\n<p class=\"banner\">\n  Эта документация предназначена для УСТАРЕВШЕЙ версии платформы Blynk, которая больше не поддерживается и будет закрыта.<br/>\n  Вы можете зарегестрироваться на текущей версии платформы Blynk <a href=\"http://blynk.cloud/dashboard/register\">здесь</a>.<br/>\n  Новые мобильные приложения можно скачать с <a href=\"https://apps.apple.com/us/app/blynk-iot/id1559317868\">App Store</a> и <a href=\"https://play.google.com/store/apps/details?id=cloud.blynk&hl=en&gl=US\">Google Play</a>.<br/>\n  Текущая документация Blynk <a href=\"https://docs.blynk.io/\">здесь</a>.\n</p>\n\n# Widgets\n\nWidgets are interface modules. Each of them performs a specific input/ output function when communicating with the hardware.\n\nThere are 4 types of Widgets:\n\n* **Controllers** - used to send commands that control your hardware\n* **Displays** - used for data visualization from sensors and other sources;\n* **Notifications** - send messages and notifications;\n* **Interface** - widgets to perform certain GUI functions;\n* **Other** - widgets that don't belong to any category;\n\nEach Widget has it's own settings. Some of the Widgets \\(e.g. Bridge\\) just enable functionality and they don't have any settings.\n\n## Common Widget Settings\n\n### Pin Selector\n\nThis is one of the main parameters you need to set. It defines which pin to control or to read from.\n\n![](.gitbook/assets/pin_selection.png)\n\n**Digital Pins** - represent physical Digital IO pins on your hardware. PWM-enabled pins are marked with the `~` symbol\n\n**Analog Pins** - represent physical Analog IO pins on your hardware\n\n**Virtual Pins** - have no physical representation. They are used to transfer any data between Blynk App and your hardware. Read more about Virtual Pins [here](./#blynk-main-operations-virtual-pins).\n\n### Data Mapping\n\nIn case you want to map incoming values to specific range you may use mapping button:\n\n![](.gitbook/assets/display_edit_mapping.png)\n\nLet's say your sensor sends values from 0 to 1023. But you want to display values in a range 0 to 100 in the app. When Data Mapping enabled, incoming value 1023 will be mapped to 100.\n\n### SPLIT/MERGE\n\nSome of the Widgets can send more than one value. And with this switch you can control how to send them.\n\n* **SPLIT**: Each of the parameters is sent directly to the Pin on your hardware \\(e.g D7\\). You don't need to write any code.\n\n  **NOTE:** In this mode you send multiple commands from one widget, which can reduce performance of your hardware.\n\n  Example: If you have a Joystick Widget and it's set to D3 and D4, it will send 2 commands over the Internet:\n\n  ```cpp\n    digitalWrite(3, value);\n    digitalWrite(4, value);\n  ```\n\n* **MERGE:** When MERGE mode is selected, you are sending just 1 message, consisting of array of values. But you'll need to parse it on the hardware.\n\n  This mode can be used with Virtual Pins only.\n\n  Example: Add a zeRGBa Widget and set it to MERGE mode. Choose Virtual Pin V1\n\n  ```cpp\n    BLYNK_WRITE(V1) // There is a Widget that WRITEs data to V1 \n    {\n      int r = param[0].asInt(); // get a RED channel value\n      int g = param[1].asInt(); // get a GREEN channel value\n      int b = param[2].asInt(); // get a BLUE channel value\n    }\n  ```\n\n### Decimals\n\nDefines how many decimals you would like to see when moving a Slider. When \"No Fraction\" is chosen, slider will only send integer values with no decimals. \"1 digit\" means that values will look like 1.1, 1.2, ..., 2.0, etc.\n\n### Send On Release\n\nThis option allows you to optimize data traffic on your hardware.\n\nFor example, when you move joystick widget, commands are streamed to the hardware, during a single joystick move you can send dozens of commands. There are use-cases where it's needed, however creating such a load may lead to hardware overload and reset. **Send On Release** is a recommended setting for majority of applications. This is also a default setting.\n\n### Write interval\n\nSimilar to \"Send on Release\" option. However, it allows you to stream values to your hardware within certain interval. For example, setting **write interval** to 100 ms means that while you move the slider, only 1 value will be sent to hardware within 100 ms period. This option is also used to optimize data traffic flow to your hardware.\n\n### Color gradient\n\nWhen you choose gradient, it affects the color of widget elements based on invoming values. For example: You set Gauge Widget with Min and Max parameters of 0-100, and choose green-yellow-red gradient. When hardware sends:\n\n* `10`, Gauge will change it's color to green color\n* `50` will change Gauge to yellow color\n* `80` will change Gauge to red color\n\nThere are 2 types of gradients you can choose from:\n\n* Warm: Green - Orange - Red;\n* Cold: Green - Blue - Violet;\n\n## Controllers\n\n### Кнопка \\(Button\\)\n\nКнопка может работать в двух режимах - в режиме переключателя \\(нажатие и отжатие посылает 1 сообщение\\) и в пуш режиме \\(нажатие посылает команду и отжатие посылает команду\\). Кнопка позволяет послать любое число. По умолчанию кнопка шлет 0/1 \\(LOW/HIGH\\). В пуш режиме кнопка шлет 1 \\(HIGH\\) на нажатие и 0 \\(LOW\\) при отжатии.\n\nВы так же можете менять состояние кнопки с микроконтроллера. Например, включить кнопку на пине V1 можно так :\n\n```cpp\nBlynk.virtualWrite(V1, HIGH);\n```\n\nТак же можно поменять тексты в кнопке :\n\n```cpp\nBlynk.setProperty(V1, \"onLabel\", \"Вкл\");\n```\n\n```cpp\nBlynk.setProperty(V1, \"offLabel\", \"Выкл\");\n```\n\nНазвание самой кнопки :\n\n```cpp\nBlynk.setProperty(V1, \"label\", \"Моя кнопочка\");\n```\n\nИли изменить ее цвет :\n\n```cpp\n//#D3435C - Blynk RED \nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\nВ случае если микроконтроллер был перегружен, Вы всегда можете получить последнее состояние кнопки с сервера с помощью фичи синхронизации состояния:\n\n```cpp\n//как только подключились\nBLYNK_CONNECTED() {\n  //запросить информацию у сервера о состоянии пина V1\n  Blynk.syncVirtual(V1);\n}\n\n//этот метод будет вызыван после ответа сервера \nBLYNK_WRITE(V1) {\n  int buttonState = param.asInt();\n}\n```\n\n#### Кнопка на рабочем столе\n\nЕсли Вы используете Android, то Вы можете добавить Blynk кнопку на рабочий стол. В этом случае кнопка будет работать по протоколу HTTPS. Такого рода кнопки имеют определенные ограничения по функционалу в связи с ограничениями платформы Android. Например, Вы не можете получить мгновенную синхронизацию состояния кнопки на рабочем столе с состоянием на микроконтроллере. Так как состояние кнопки на рабочем столе обновляется раз в 15 мин.\n\n**Замечание:** Добавление виджета кнопки на рабочий стол стоит 100 энергии. Эта энергия не возвращается после удаления виджета. Также такая кнопка будет работать на локальном сервере только если открыть порт 8080.\n\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n**Пример кода:** [Синхронизация состояния с физической кнопкой через прерывания](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonInterrupt/ButtonInterrupt.ino)\n\n**Пример кода:** [Синхронизация состояния с физической кнопкой через поллинг](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/ButtonPoll/ButtonPoll.ino)\n\n**Пример кода:** [Синхронизация состояния с физической кнопкой](https://github.com/blynkkk/blynk-library/blob/master/examples/More/Sync/SyncPhysicalButton/SyncPhysicalButton.ino)\n\n### Слайдер \\(Slider\\)\n\nСлайдер очень похож на потенциометр. Он позволяет посылать значения в диапазоне от минимального значения к максимальному. Диапазон допустимых максимального и минимального значений определяется в приложении.\n\nВы так же можете менять состояние слайдера с микроконтроллера. Например, Вы можете изменить положение ползунка в слайдере :\n\n```cpp\nBlynk.virtualWrite(V1, 55);\n```\n\nТак же можно поменять текст в слайдере :\n\n```cpp\nBlynk.setProperty(V1, \"label\", \"Мой слайдерок\");\n```\n\nили изменить цвет :\n\n```cpp\n//#D3435C - Карсный цвет в кодирвке RGB\nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\n### Таймер \\(Timer\\)\n\nТаймер запускает действия в определенное время. Даже если смартфон не в сети. По умолчанию время начала отправляет 1 \\(HIGH\\), время остановки отправляет 0 \\(LOW\\). Вы можете изменить это поведение на любые другие значения. Вы можете изменить настройки Таймера в режиме «Запуска». В последней версии Android также есть улучшенный таймер в виджете [Обработчик событий](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/eventor.md).\n\nC [Обработчиком](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/eventor.md) событий вы можете назначить несколько таймеров на один и тот же пин, отправить любую строку/число, выбирать дни и часовой пояс. Рекомендуется использовать виджет [Обработчик событий](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/eventor.md) поверх виджета Таймер. Однако виджет Таймер по-прежнему подходит и для простых событий таймера.\n\n**ПРИМЕЧАНИЕ:** Виджет таймера зависит от времени сервера, а не вашего телефона. Иногда время телефона может не соответствовать времени сервера.\n\n**Пример кода:** [Таймер](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Timer/Timer.ino)\n\n### Джойстик \\(Joystick\\)\n\nУправление сервоприводом в 4 направлениях.\n\n#### Параметры:\n\n* **Раздельный** \\(SPLIT\\):\n\n  Каждый из параметров отправляется непосредственно на пин вашего оборудования \\(например, D7 и D8\\). Вам не нужно писать код.\n\n**ПРИМЕЧАНИЕ:** В этом режиме вы отправляете несколько команд из одного виджета, что может снизить производительность вашего оборудования.\n\n**Пример:** Если у вас есть виджет Джойстика и он настроен на D3 и D4, он отправит две команды через Интернет:\n\n```cpp\ndigitalWrite(3, x);\ndigitalWrite(4, y);\n```\n\n* **Совмещенный** \\(MERGE\\):\n\n  Когда выбран режим MERGE, вы отправляете только 1 сообщение, состоящее из массива значений. Но вам нужно разобрать его на оборудовании устройства.\n\nЭтот режим можно использовать только с виртуальными пин-ами.\n\n**Пример:** добавьте виджет Джойстика и установите его в режим \"MERGE\". Выберите виртуальный пин V1\n\n```cpp\nBLYNK_WRITE(V1) // Joystick assigned to V1 \n{\n  // получить x \n  int x = param[0].asInt(); \n  // получить y\n  int y = param[1].asInt();\n}\n```\n\n* **Поворт/Наклон** \\(Rotate on Tilt\\) Когда это параметр включен, Джойстик будет автоматически вращаться, если вы будете использовать смартфон в горизонтальной положении.\n* **Автовозврат** \\(Auto-Return\\) Когда это парамтер выключен, ручка джойстика не вернется в центральное положение. Она останется там, где вы ее оставили.\n\n### Отправка при Отжатии \\(Send On Release\\)\n\n**Send On Release** доступно для большинства виджетов контроллеров и позволяет уменьшить трафик данных на ваше оборудование. Например, когда вы перемещаете виджет джойстика, команды непрерывно передаются на аппаратное устройство, во время одного движения джойстика вы можете отправлять десятки команд. Есть случаи, когда это необходимо, однако создание такой нагрузки может привести к зависанию или сбросу оборудования. Мы рекомендуем включить функцию **Send On Release** для большинства случаев, если вам не требуется мгновенная обратная связь. Эта опция включена по умолчанию.\n\n### Интервал записи \\(Write interval\\)\n\nПохоже на вышеуказанный вариант. Однако, позволяет вам передавать значения на ваше оборудование в через определенные интервалы времени. Например, установка интервала записи на 100 мс означает, что при перемещении ползунка на аппаратное обеспечение будет отправлено только 1 значение в течение 100 мс. Эта опция также используется для уменьшения трафика данных на ваше оборудовании.\n\n**Пример кода:** [Джойстик две оси](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/JoystickTwoAxis/JoystickTwoAxis.ino)\n\n### Шаговое управление \\(Step Control\\)\n\nШаговое управление похоже на две кнопки, назначенные одному пин-у. Одна кнопка увеличивает ваше значение на установленный шаг, а другая уменьшает его. Это очень полезно для случаев использования, когда вам нужно точно изменять ваши значения, но вы не можете достичь такой точности с помощью виджета [Cлайдера](https://github.com/blynkkk/blynkkk.github.io/tree/master/mobile/ru/slider.md).\n\n**Отправить шаг \\(Send Step\\)** опция позволяет вам отправлять на оборудование каждый шаг нвместо фактического значения виджета.\n\n**Зациклить значения \\(Loop value\\)** опция позволяет сбросить Шаговый виджет на начальное значение при достижении максимального.\n\nВы можете изменить значение Шагового виджета со стороны оборудования. Например:\n\n```cpp\nBlynk.virtualWrite(V1, val);\n```\n\nВы можете изменить описание виджета со стороны оборудования с помощью кода:\n\n```cpp\nBlynk.setProperty(V1, \"label\", \"Мой счетчик.\");\n```\n\nВы можете изменить шаг виджета со стороны оборудования:\n\n```cpp\nBlynk.setProperty(V1, \"step\", 10);\n```\n\nили изменить цвет:\n\n```cpp\n//#D3435C - Красный цвет в RGB кодировке\nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\nВы также можете получить состояние виджета Шагового управления с сервера в случае, если ваше оборудование отключилось, с помощью функции Blynk.Sync:\n\n```cpp\nBLYNK_CONNECTED() {\n  Blynk.syncVirtual(V1);\n}\n\nBLYNK_WRITE(V1) {\n  int stepperValue = param.asInt();\n}\n```\n\n## Displays\n\n### Отображение значений \\(Value Display\\)\n\nОтображает входящие данные с ваших датчиков или виртуальных пин-ов. Может работать в двух режимах:\n\n* режим PUSH \\(выберается в списке выбора частоты считывания\\);\n* режим частоты считываний;\n\nВ режиме PUSH вы обновляете значения виджета со стороны оборудования с помощью кода:\n\n```cpp\nBlynk.virtualWrite(V1, val);\n```\n\nВ этом режиме каждое сообщение, которое отправляет аппаратное устройство автоматически сохраняется на сервере. Режим PUSH не требует, чтобы приложение было онлайн или открыто.\n\nВ режиме частоты считывния вам необходимо выбрать интервал обновления данных, и приложение будет запускать события считывния с требуемой периодичностью. Ваше приложение должно быть открыто и запущено для отправки запросов на оборудование. Вам не нужен код для аналоговых и цифровых выводов в даном случае. Однако для виртуальных выводов вам необходимо использовать следующий код:\n\n```cpp\n//вызывать из приложения\nBLYNK_READ(V1)\n{\n  //отправить в приложение\n  Blynk.virtualWrite(V1, val);\n}\n```\n\n#### Отображение значений на рабочем столе\n\nВы также можете добавить виджет отображение значения на рабочий стол Android. В этом случае отображение значений работает по протоколу HTTPS. Имейте в виду, что в режиме «Рабочий стол» отображение значений имеет несколько ограничений. Виджет будет обновлять свое состояние только один раз в 15 минут. Вы можете изменить это органичение через настройки виджета. Однако интервал обновления менее 15 минут не гарантируется. Вы также можете изменить размер отображаемого значения на рабочем столе - просто сделайте длинный тап на виджете и измените его размер на необходимый.\n\n**Примечание:** Добавление виджета на главный экран стоит 100 энергии. Эта энергия не возвращяется при удалении виджета.\n\n**Примечание:** Виджеты рабочего стола для локальных серверов Blynk требуют открытия порта 8080.\n\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n### Интервал записи \\(Write interval\\)\n\nОпция позволяет вам передавать значения на ваше оборудование в через определенные интервалы времени. Например, установка интервала записи на 100 мс означает, что при перемещении ползунка на аппаратное обеспечение будет отправлено только 1 значение в течение 100 мс. Эта опция также используется для уменьшения трафика данных на ваше оборудовании.\n\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n### Светодиод \\(LED\\)\n\nПростой светодиод для индикации. Вам нужно отправить 0, чтобы выключить светодиод. И 255 для того, чтобы включить светодиод. Или просто используйте Blynk API, как описано ниже:\n\n```cpp\n//регистрируемся на виртуальном пине 1\nWidgetLED led1(V1);\nled1.off();\nled1.on();\n```\n\nВсе значения от 0 до 255 изменяют яркость светодиода:\n\n```cpp\nWidgetLED led2(V2);\n//установить яркость светодиода на 50%.\nled2.setValue(127);\n```\n\nВы также можете изменить цвет светодиода с помощью кода:\n\n```cpp\n//#D3435C - Красный в RGB формате\nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\n#### Светодиод на рабочем столе\n\nВы можете добавить виджет светодиод на рабочий стол Android. В этом случае светодиод работает через протокол HTTPS. Имейте в виду, что в режиме «Рабочий стол» виджет светодиода имеет некоторые ограничения. Светодиод будет обновлять свое состояние только один раз в 15 минут. Вы можете изменить этот интервал через настройки виджета. Однако интервал обновления менее 15 минут не гарантируется.\n\n**Примечание:** Добавление виджета на рабочий стол стоит 100 энергии. Эта энергия не возвращается при удалении виджета.\n\n**Примечание:** Виджеты рабочего стола для локальных серверов Blynk требуют открыть порт 8080.\n\n**Пример кода:** [Базовый пример](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LED/LED_Blink/LED_Blink.ino)\n\n### Указатель \\(Gauge\\)\n\nОтличный визуальный способ отображения входящих числовых значений.\n\nМожет работать в 2 режимах:\n\n* режим PUSH \\(выберается в списке выбора частоты считывания\\);\n* режим частоты считываний;\n\nВ режиме PUSH вы обновляете значения указателя со стороны оборудования с помощью кода:\n\n```cpp\nBlynk.virtualWrite(V1, val);\n```\n\nВ этом режиме каждое сообщение, которое отправляет аппаратное устройство автоматически сохраняется на сервере. Режим PUSH не требует, чтобы приложение было онлайн или открыто.\n\nВ режиме частоты считывния вам необходимо выбрать интервал обновления данных, и приложение будет запускать события считывния с требуемым периодичностью. Ваше приложение должно быть открыто и запущено для отправки запросов на оборудование. Вам не нужен код для аналоговых и цифровых выводов в даном случае. Однако для виртуальных выводов вам необходимо использовать следующий код:\n\n```cpp\n//вызывать из приложения\nBLYNK_READ(V1)\n{\n  //отправить в приложение\n  Blynk.virtualWrite(V1, val);\n}\n```\n\n#### Параметры форматирования\n\nУказатель также имеет поле «Label» \\(Метка\\), которое позволяет использовать форматирование. Предположим, ваш датчик отправляет число 12.6789 в приложение Blynk. Поддерживаются следующие параметры форматирования:\n\n`/pin/` - отображает значение без форматирования \\(12.6789\\)\n\n`/pin./` - отображает значение без десятичной части \\(13\\)\n\n`/pin.#/` - отображает значение с одним десятичным знаком \\(12.7\\)\n\n`/pin.##/` - отображает значение с двумя десятичными знаками \\(12.68\\)\n\n#### Другие опции\n\nВы также можете изменить метку прибора с помощью:\n\n```cpp\nBlynk.setProperty(V1, \"label\", \"Мое значение метки\");\n```\n\nили изменить цвет \\(кодировка RGB\\):\n\n```cpp\n//#D3435C - Красный цвет\nBlynk.setProperty(V1, \"color\", \"#D3435C\");\n```\n\n**Пример кода:** [Светодиод](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n### ЖК дисплей \\(LCD\\)\n\nЭто обычный ЖК-дисплей 16x2, \"сделанный\" на нашем секретном предприятии в Китае. Виджет может работать в двух режимах:\n\n* Простой \\(Simple\\)\n* Расширенный \\(Advanced\\)\n\n#### Простой режим \\(Simple\\)\n\nВ простом режиме ваш ЖК-виджет работает как обычный виджет с частотой чтения.\n\nВ режиме частоты считывания вам нужно выбрать интервал обновления данных, и приложение будет запускать события с требуемым интервалом. Ваше приложение должно быть открыто и запущено для отправки запросов на оборудование. В данном случае вам не нужен код для аналоговых и цифровых пин-ов. Однако для виртуальных пин-ов вам необходимо использовать следующий код:\n\n```cpp\n//вызываем из приложения\nBLYNK_READ(V1)\n{\n  //отправляем в приложение\n  Blynk.virtualWrite(V1, val);\n}\n```\n\nВ простом режиме ЖК-дисплей также поддерживает параметры форматирования.\n\n#### Параметры форматирования\n\nПредположим, ваш датчик отправляет число 12.6789 в приложение Blynk. Поддерживаются следующие параметры форматирования:\n\n`/pin/` - отображает значение без форматирования \\(12.6789\\)\n\n`/pin./` - отображает значение без десятичной части \\(13\\)\n\n`/pin.#/` - отображает значение с одним десятичным знаком \\(12.7\\)\n\n`/pin.##/` - отображает значение с двумя десятичными знаками \\(12.68\\)\n\n**Пример кода:** [ЖК дисплей простой режим - PUSH](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_SimpleModePushing/LCD_SimpleModePushing.ino)\n\n**Пример кода:** [ЖК дисплей простой режим - 1 сек](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_SimpleModeReading/LCD_SimpleModeReading.ino)\n\n#### Расширенный режим \\(Advanced\\)\n\nРасширенный режим предназначен для опытных пользователей. Позволяет использовать специальные команды для управления ЖК-дисплеем.\n\n#### Команды\n\nИнициируем переменную ЖК-дисплея:\n\n```cpp\nWidgetLCD lcd(V1);\n```\n\nОтправим сообщение:\n\n```cpp\nlcd.print(x, y, \"Ваше сообщение\");\n```\n\nГде `x` - позиция символа \\(0-15\\), `y` - номер строки \\(0 или 1\\),\n\nОчистка ЖК-дисплея:\n\n```cpp\nlcd.clear();\n```\n\n**Пример кода:** [ЖК-дисплей расширенный режим](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_AdvancedMode/LCD_AdvancedMode.ino)\n\n### Диаграмма \\(SuperChart\\)\n\nДиаграмма используется для живой визуализации и хранения данных. Вы можете использовать виджет для логирования данных датчиков, бинарных событий и многого другого.\n\nЧтобы использовать виджет Диаграмма, вам нужно будет передать данные с оборудования с желаемым интервалом, используя таймеры. [Здесь приведен](https://examples.blynk.cc/?board=ESP8266&shield=ESP8266%20WiFi&example=GettingStarted%2FPushData) базовый пример передачи данных.\n\n#### Взаимодействие:\n\n* **Переключение между режимами текущий и временной** Нажмите диапазоны времени в нижней части виджета, чтобы изменить масштаб Диаграммы по времени.\n* **Тап по легенде графиков** показать или скрыть поток данных.\n* **Долги тап на графике** покажет метку времени и соответствующие значения.\n* **Быстро проведите пальцем влево или вправо, чтобы увидеть предыдущие данные** впоследствии вы можете прокручивать данные назад и вперед в пределах заданного временного диапазона.\n* **Полноэкранный режим** нажмите эту кнопку, чтобы открыть полноэкранный режим в альбомной ориентации.\n\nЧтобы выйти из режима полного экрана, просто поверните телефон обратно в портретный режим. График должен вращаться автоматически. В полноэкранном режиме вы увидите X \\(время\\) и несколько шкал Y. Полноэкранный режим можно отключить в настройках виджета.\n\n* **Кнопка меню**\n\n  Кнопка меню откроет дополнительные функции:\n\n  * Экспорт в CSV\n  * Стереть данные на сервере\n\n#### Настройки диаграммы:\n\n* **Заголовок диаграммы \\(Chart Title\\)** общее наименование диаграммы.\n* **Размер шрифта заголовка \\(Title Font Size\\)** выберите из 3 размеров шрифта.\n* **Выравнивание заголовка \\(Title Alignment\\)** выберите выравнивание заголовка диаграммы. Этот параметр влияет на положение заголовка и легенды в виджете.\n* **Показать ось X \\(время\\) \\(Show x-axis \\(time\\)\\)** выберите настройку, если хотите показать шкалу времени внизу графика.\n* **Автоматическое масштабирование для всех потоков данных \\(Override Auto Scaling for All Datastreams\\)** отключение этой опции позволит выполнить ручную настройку для оси Y \\(см. ниже\\).\n* **Выбор масштаба времени \\(Time ranges picker\\)** Позволяет выбрать необходимые периоды \\(`15m`,`30m`, `1h`,`3h`, ...\\) и разрешение для вашего графика. Разрешение определяет, насколько подробные ваши данные. Прямо сейчас график поддерживает два типа разрешения: `standard` и `high`. Разрешение также зависит от выбранного периода. Например, `standard` разрешение для `1d` означает, что вы будете получать 24 значения в день \\(одно в час\\), а при `high` разрешении вы будете получать за`1d` 1440 значений в день \\(одно в минуту\\).\n* **Потоки данных \\(Datastreams\\)** добавить потоки данных \\(см. ниже, как настроить потоки данных\\).\n\n#### Настройки потоков данных\n\nВиджет поддерживает до 4 потоков данных. Нажмите значок настроек потоков данных, чтобы открыть настройки.\n\n**Дизайн \\(Design\\)** выберите доступные типы диаграмм:\n\n* Линейная \\(Line\\)\n* С областями \\(Area\\)\n* Гистограмма \\(Bar\\)\n* Бинарная \\(Binary\\) \\(приведение данных к двоичному виду\\)\n\n**Цвет \\(Color\\)** выберите сплошные цвета или градиенты.\n\n**Источник и ввод \\(Source and input\\)** - Вы можете использовать три типа источника данных:\n\n**1. Виртуальный пин \\(Virtual Pin\\)** - выберите желаемое устройство и виртуальный пин для получения данных.\n\n**2. Теги \\(Tags\\)** - диаграмма может агрегировать данные с нескольких устройств, используя встроенные функции агрегирования. Например, если у вас есть 10 датчиков температуры, посылающих температуру с заданным интервалом, Вы можете отобразить среднее значение от 10 датчиков в виджете.\n\nИспользование тегов:\n\n* [**Добавить Тэг**](http://docs.blynk.cc/#blynk-main-operations-control-of-multiple-devices-tags) на каждое устройство, с которого вы хотите агрегировать данные. Это можно сделать в настройках проекта Blynk.\n* **Отправить данные в виртуальный пин \\(Push data to the same Virtual Pin\\)** на каждое устройство. \\(т.е. `Blynk.virtualWrite (V0, temperature);`\\)\n* **Выберите тег в качестве источника \\(Choose Tag as a source\\)** в виджете Диаграмма и используйте пин, куда поступают данные \\(т.е. V0\\)\n\n**Добступные функции:**\n\n* `SUM` будет суммировать все входящие значения в указанный виртуальный пин со всех устройств, помеченные выбранным тегом\n* `AVG` будет вычислять среднее значение\n* `MED` найдет среднее значение\n* `MIN` будет вычислять минимальное значение\n* `MAX` будет вычислять максимальное значение\n\n**ВАЖНО: Теги не работают в режиме реального времени.**\n\n**3.** [**Выбор устройства \\(Device Selector\\)**](https://github.com/blynkkk/blynkkk.github.io/tree/master/mobile/ru/%20device_selector.md) Если вы добавите виджет Выбор устройства в свой проект, вы можете использовать его в качестве источника данных для Диаграммы. В том случае, когда вы меняете устройство, диаграмма будет автоматически обновляться.\n\n#### Настройки оси Y \\(Y-Axis Settings\\)\n\nCуществует 4 режима масштабирования данных вдоль оси Y, активируется после отключения общей настройки виджета \"Автоматическое масштабирование для всех потоков данных \\(Override Auto Scaling for All Datastreams\\)\".\n\n**1. Авто \\(Auto\\)** Данные будут автоматически масштабироваться на основе минимальных и максимальных значений заданного периода времени. Это лучший вариант для начинающих.\n\n**2. Минимальный/Максимальный \\(Min/Max\\)** Когда выбран этот режим, шкала Y будет установлена на выбранные вами границы значений. Например, если ваше оборудование отправляет данные со значениями от -100 до 100, вы можете установить эти границы и данные графика будут отображены полностью.\n\nВы также можете визуализировать данные в другом диапазоне. Допустим, входящие данные имеют значения в диапазоне 0-55, но вы хотели бы видеть только значения в диапазоне 30-50. Вы можете настроить диапазон, но если значения не соответствуют заданному масштабу оси Y, диаграмма будет обрезана.\n\n**3. Процент от высоты \\(% of Height\\)** Эта опция позволяет автоматически масштабировать входящие данные на виджете и размещать их так, как вы хотите. В этом режиме вы устанавливаете процент высоты виджета на экране от 0% до 100%.\n\nЕсли вы установите диапазон 0-100%, это будет полная автоматическая шкала. Независимо от того, в каком диапазоне поступают данные, он всегда будет масштабирован по всей высоте виджета.\n\nЕсли вы установите его на 0-25%, то график будет отображаться только на 1/4 высоты виджета.\n\nЭтот параметр очень полезен для **Бинарной диаграммы** или для визуализации нескольких потоков данных на одной и той же диаграмме разными способами.\n\n**4. Дельта \\(Delta\\)** Пока данные остаются в пределах заданного значения дельты, график будет автоматически масштабироваться в этом диапазоне. Если дельта превышает диапазон, график автоматически масштабируется до минимальных/максимальных значений указанного периода.\n\n**Суффикс \\(Suffix\\)** Здесь вы можете указать суффикс, который будет отображаться со значениями во время длительного тап на графике.\n\n**Разрядность \\(Decimals\\)** Определяет формат числовых значений, когда вы нажимаете и удерживаете палец на графике. Возможные варианты: \\#, \\#.\\#, \\#.\\#\\#, и т.д.\n\n**Соединиить отсуствующие точки графика \\(Connect Missing Data Points\\)** Если этот переключатель включен, то Диаграмма соединит все точки, даже если данные частично отсуствуют. Если для него установлено значение «ВЫКЛ», то вы увидите пропуски в случае отсутствия данных.\n\n**Настройки Бинарной диаграммы \\(Binary Chart Settings\\)** Этот тип диаграммы полезен для построения двоичных данных, например, когда устройство было включено или выключено, или когда было обнаружено движение или когда был достигнут определенный порог значений.\n\nВам необходимо указать точку **Перехода \\(FLIP\\)**, которая будет точкой, в которой входящие данные будут принимать состояние `ИСТИНА (TRUE)` или `ЛОЖЬ (FALSE)`.\n\nНапример, вы отправляете данные в диапазоне от 0 до 1023. Если вы установите `512` в качестве точки **Перехода \\(FLIP\\)**, то все, что выше `512` \\(исключая 512\\), будет записано как `ИСТИНА (TRUE)`, любое значение ниже `512` \\(включая 512\\) будет `ЛОЖЬ (FALSE)`.\n\nДругой пример: если вы отправляете `0 и 1` и устанавливаете `0` в качестве точки **Перехода FLIP**, то `1` будет `ИСТИНА`, а `0` будет `ЛОЖЬ`.\n\n**Маркеры состояния \\(State Labels\\):** Здесь вы можете указать, как `ИСТИНА/ЛОЖЬ` должны отображаться на графике когда вы нажимаете и удерживаете палец. Например, вы можете установить значение `ИСТИНА` как `Оборудование ВКЛ`, `ЛОЖЬ` как `Оборудование ВЫКЛ`.\n\n### Видео трансляция \\(Video Streaming\\)\n\nПростой виджет, который позволяет отображать прямой эфир и потокове видео. Виджет поддерживает протоколы RTSP \\(RP, SDP\\), HTTP/S прогрессивной потоковой передачи, HTTP/S прямого эфира. Для получения дополнительной информации, пожалуйста ознакомтесь с [официальной документацией Android](https://developer.android.com/guide/appendix/media-formats.html).\n\nНа данный момент команда Blynk не предоставляет потоковые серверы. Таким образом, вы можете осуществлять потоковую передачу непосредственно с ваше камеры или использовать сторонние сервисы, а также запустить собственны потоковый сервер \\(например, на оборудовании Raspberry\\).\n\nВы можете остановить/запустить видео поток, нажав на сам виджет.\n\nВы можете изменить URL-адрес видео потока с аппаратного устройства при помощи кода:\n\n```cpp\nBlynk.setProperty(V1, \"url\", \"http://my_new_video_url\");\n```\n\n### Индикатор уровня \\(Level Display\\)\n\nОтображает входящие данные с ваших датчиков или виртуальных пин-ов. Отображение уровня очень похоже на индикатор выполнения процесса, это очень красивый и причудливый вид для индикации «выполненных» событий, например «уровня заряда батареи». Вы можете обновить отображение значения с аппаратной стороны с помощью кода:\n\n```cpp\nBlynk.virtualWrite(V1, val);\n```\n\nКаждое сообщение, которое аппаратное устройство отправляет на сервер, автоматически сохраняется на сервере. Режим PUSH не требует, чтобы приложение было онлайн или запущено.\n\n**Пример кода:** [Пример PUSH](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushData/PushData.ino)\n\n## Interface\n\n### Вкладки \\(Tabs\\)\n\nЕдинственная цель виджета Вкладки - расширить пространство вашего проекта. Чтобы редактировать виджет Вкладок - просто нажмите на выбранную вкладку. Вы можете перетаскивать виджеты между вкладками. Из списка можно удалить только последнюю вкладку: чтобы удалить ее, проведите пальцем влево по ее названию в экране настроек виджета.\n\nМаксимальное количество вкладок на iOS составляет 4.\n\nМаксимальное количество вкладок на Android - 10.\n\nОставайтесь с нами для предстоящего редизайна виджета вкладок!\n\n### Меню \\(Menu\\)\n\nВиджет Меню позволяет отправлять команды на ваше оборудование на основе выборного списка, сделанного вами в пользовательском интерфейсе. Меню отправляет индекс выбранного элемента спика, а не саму строку. Отправляемый индекс начинается с 1. Он работает так же, как типовой элемент \"Комбинированный список\" \\([ComboBox](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA)\\).\n\nПример кода:\n\n```cpp\nBLYNK_WRITE {\n  switch (param.asInt()) {\n    case 1: { // Пункт 1\n      Serial.println(\"Выбран Пункт 1\");\n      break;\n    }\n    case 2: { // Пункт 2\n      Serial.println(\"Выбран Пункт 2\");\n      break;\n    }    \n  }\n}\n```\n\nВы также можете назначить пункты меню со стороны оборудования с помощью кода:\n\n```cpp\nBlynk.setProperty(V1, \"labels\", \"label 1\", \"label 2\", \"label 3\");\n```\n\n**Пример кода:** [Меню](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Menu/Menu.ino)\n\n### Ввод времени \\(Time Input\\)\n\nВиджет Ввода времени позволяет вам выбрать время начала/окончания, день недели, часовой пояс, значения в формате до полудня/после полудня и отправить их на ваше оборудование. В настоящее время поддерживаются следующие форматы: `ЧЧ:ММ` и `ЧЧ:ММ AM/PM`.\n\nАппаратное устройстов будет отсчитывать время пользовательского интерфейса в виде секунд дня \\(`3600 * часов + 60 * минут`\\) для запуска/остановки времения. Время, которое виджет отправляет оборудованию, является локальным временем пользователя. Индексы по выбранных дней:\n\n```text\nПонедельник - 1\nВторник - 2\n...\nСуббота - 6\nВоскресенье - 7\n```\n\nВы также можете изменить состояние виджета в интерфейсе пользователя. Смотрите ниже примеры кода.\n\n**Пример кода:** [Простой Ввод времени для времени начала](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/SimpleTimeInput/SimpleTimeInput.ino)\n\n**Пример кода:** [Расширенный Ввод времени](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/AdvancedTimeInput/AdvancedTimeInput.ino)\n\n**Пример кода:** [Обновление Ввода времени в пользовательском интерфейсе](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/UpdateTimeInputState/UpdateTimeInputState.ino)\n\n### Карта \\(Map\\)\n\nВиджет Карты позволяет устанавливать точки/флажки на карте со стороны оборудования. Это очень полезный виджет, если у вас есть несколько устройств, и вы хотите отслеживать их позиции на карте.\n\nВы можете отправить точку на карту с помощью обычной команды виртуальной записи:\n\n```cpp\nBlynk.virtualWrite(V1, pointIndex, lat, lon, \"Название\");\n```\n\nМы также создали оболочку, чтобы вы могли упростить использование виджета Карты. Вы можете изменить метки флажков на оборудовании с помощью кода:\n\n```cpp\nWidgetMap myMap(V1);\n...\nint index = 1;\nfloat lat = 51.5074;\nfloat lon = 0.1278;\nmyMap.location(index, lat, lon, \"Название\");\n```\n\nИспользование уникальных `index` позволяет вам переопределить существующее значение точки.\n\n**Пример кода:** [Базовый пример Карты](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Map/Map.ino)\n\n### Таблица \\(Table\\)\n\nТабличный виджет удобен, когда вам нужно структурировать аналогичные данные в пределах одного графического элемента. Работает как обычная таблица.\n\nВы можете добавить строку в таблицу с помощью кода:\n\n```text\nBlynk.virtualWrite(V1, \"add\", id, \"Имя\", \"Значение\");\n```\n\nВы можете обновить строку в таблице с помощью кода:\n\n```text\nBlynk.virtualWrite(V1, \"update\", id, \"Новое имя\", \"Новое значение\");\n```\n\nЧтобы выделить любой элемент в таблице, используйте его идентификатор:\n\n```text\nBlynk.virtualWrite(V1, \"pick\", 0);\n```\n\nЧтобы выбрать/отменить выбор \\(сделать значок зеленым/серым\\) элемент в таблице, используйте его идентификатор:\n\n```text\nBlynk.virtualWrite(V1, \"select\", 0);\nBlynk.virtualWrite(V1, \"deselect\", 0);\n```\n\nЧтобы очистить таблицу используйте код:\n\n```text\nBlynk.virtualWrite(V1, \"clr\");\n```\n\nВы также можете обрабатывать другие действия из таблицы. Например, использовать строку таблицы в качестве кнопки переключения.\n\n```text\nBLYNK_WRITE(V1) {\n   String cmd = param[0].asStr();\n   if (cmd == \"select\") {\n       // строка в таблице была выбрана.\n       int rowId = param[1].asInt();\n   }\n   if (cmd == \"deselect\") {\n       // строка в таблице была отменена.\n       int rowId = param[1].asInt();\n   }\n   if (cmd == \"order\") {\n       // когда строки в таблице переупорядочиваются\n       int oldRowIndex = param[1].asInt();\n       int newRowIndex = param[2].asInt();\n   }\n}\n```\n\n**Примечание:** Максимальное количество строк в таблице равно 100. Когда вы достигнете предела, таблица будет работать как список FIFO \\(Первый пришел - первый ушел\\). Это ограничение можно изменить, настроив свойство `table.rows.pool.size` в параметрах локального сервера.\n\n**Пример кода:** [Простое использование таблицы](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Table/Table_Simple/Table_Simple.ino)\n\n**Пример кода:** [Расширенное использование таблицы](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Table/Table_Advanced/Table_Advanced.ino)\n\n### Селектор устройств \\(Device Selector\\)\n\nСелектор устройств - это мощный виджет, который позволяет обновлять виджеты на основе одного активного устройства. Этот виджет особенно полезен, когда у вас есть несколько устройств с аналогичной функциональностью.\n\nПредставьте, что у вас есть 4 устройства, и к каждому устройству подключен датчик температуры и влажности. Для отображения данных по всем 4 устройствам вам необходимо добавить 8 виджетов.\n\nС помощью Селектора устройств вы можете использовать только 2 виджета, которые будут отображать температуру и влажность в зависимости от активного устройства, выбранного в Селекторе.\n\nВсе, что вам нужно сделать, это:\n\n1. Добавить виджет Селектора устройств в проект\n2. Добавить 2 виджета \\(например виджет отображения значений \\(Value Display Widget\\)\\), чтобы отобразить температуру и влажность\n3. В настройках виджетов вы сможете назначить их на Селектор устройств \\(в разделе источника или цели\\)\n4. Выйти из настроек, запустить проект \n\nТеперь вы можете изменить активное устройство в Селекторе устройств и увидите, что значения температуры и влажности отражают обновленные данные для только что выбранного вами устройства.\n\n**ПРИМЕЧАНИЕ:** Виджет вебхук \\([Webhook](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/WebHook/WebHook_GET/WebHook_GET.ino)\\) пока не работает с Селектором устройств.\n\n### Плитка устройств \\(Device Tiles\\)\n\nПлитка устройств - это мощный виджет, очень похожий на виджет Селектора устройств \\(Device Selector\\), но с пользовательским интерфейсом. Позволяет отображать один пин с устройства на одну плитку. Этот виджет особенно полезен, когда у вас есть несколько устройств с аналогичной функциональностью. Теперь вы можете группировать похожие устройства на одном макете \\(шаблоне\\).\n\n## Sensors\n\n### Акселерометр \\(Accelerometer\\)\n\nАкселерометр один из [сенсоров движения](https://developer.android.com/guide/topics/sensors/sensors_motion.html), который позволяет определить движение Вашего телефона в пространстве. Он может пригодится для отслеживания таких событий как тряска, удар, поворот или наклон телефона. Концептуально, акселерометр определяет силу ускорения приложенную к вашему телефону. Единица измерения - м/c^2 приложенная к каждой из осей `x`, `y`, `z`.\n\nЧтобы получить данные с сенсора нужно использовать следующий код :\n\n```cpp\nBLYNK_WRITE(V1) {\n  //сила ускорения, приложенная к оси x\n  int x = param[0].asFloat(); \n  //сила ускорения, приложенная к оси y\n  int y = param[1].asFloat();\n  //сила ускорения, приложенная к оси z\n  int z = param[2].asFloat();\n}\n```\n\nАкселерометр не работает при свернутом приложении.\n\n### Барометр/Давление \\(Barometer/pressure\\)\n\nБарометр один из сенсоров [окружающей среды](https://developer.android.com/guide/topics/sensors/sensors_environment.html) и позволяет измерять атмосферное давление.\n\nИзмеряется в `hPa` \\(гПа\\) или `mbar` \\(мБар\\).\n\nЧтобы получить данные с сенсора нужно использовать следующий код :\n\n```cpp\nBLYNK_WRITE(V1) {\n  //Давление в мБар\n  int pressure = param[0].asInt(); \n}\n```\n\nБарометр не работает при свернутом приложении.\n\n### Гравитация \\(Gravity\\)\n\nГравитация - это своего рода [датчики движения](https://developer.android.com/guide/topics/sensors/sensors_motion.html), который позволяет обнаруживать движение вашего смартфона. Полезно для мониторинга движения устройства, таких как наклон, встряхивание, вращение или качание.\n\nДатчик силы притяжения выдает трехмерный вектор, указывающий направление и величину силы притяжения. Измеряется в `m/s^2` силы притяжения, приложенной к оси `x`, `y`, `z`. Для того, чтобы принять данные от него, вам необходимо:\n\n```cpp\nBLYNK_WRITE(V1) {\n  //сила притяжения, приложенная к оси x\n  int x = param[0].asFloat(); \n  //сила притяжения, приложенная к оси y\n  int y = param[1].asFloat();\n  //сила притяжения, приложенная к оси y\n  int z = param[2].asFloat();\n}\n```\n\n**ВНИМАНИЕ:** Виджет гравитации не работает в фоновом режиме.\n\n### Влажность \\(Humidity\\)\n\nВлажность является своего рода [датчиком среды](https://developer.android.com/guide/topics/sensors/sensors_environment.html), который позволяет измерять относительную влажность окружающей среды.\n\nИзмеряется в `%` - фактически это относительная влажность в процентах.\n\nДля того, чтобы принять данные от датчика, вам необходимо:\n\n```cpp\nBLYNK_WRITE(V1) {\n  //Влажность в %\n  int humidity = param.asInt();\n}\n```\n\n**ВНИМАНИЕ:** Влажность не работает в фоновом режиме.\n\n### Свет \\(Light\\)\n\nСвет - это своего рода [датчики окружающей среды](https://developer.android.com/guide/topics/sensors/sensors_environment.html), который позволяет измерять уровень освещенности \\(уровень внешней освещенности измеряется в люксах\\). В телефонах чаще всего используется для управления яркостью экрана.\n\nДля того, чтобы принять данные этого виджета, вам необходимо:\n\n```cpp\nBLYNK_WRITE(V1) {\n  //уровень освещенности\n  int lx = param.asInt(); \n}\n```\n\nВиджет Свет не работает в фоновом режиме.\n\n### Близость \\(Proximity\\)\n\nБлизость - это своего рода [датчики положения](https://developer.android.com/guide/topics/sensors/sensors_position.html) это позволяет определить, насколько близко смартфон к лицу. Измеряется в `cm` \\(см\\) - расстояние от телефона до лица. Однако большинство этих датчиков возвращает только информацию FAR / NEAR. Поэтому, возвращаемое значение будет `0 / 1`. Где 0 / LOW = `FAR` \\(далеко\\), а 1 / HIGH = `NEAR` \\(рядом\\).\n\nДля того, чтобы принять данные из виджета, вам необходимо:\n\n```cpp\nBLYNK_WRITE(V1) {\n  //  расстояние до объекта\n  int proximity = param.asInt();\n  if (proximity) {\n     // РЯДОМ\n  } else {\n     // ДАЛЕКО\n  }\n}\n```\n\nВиджет близость не работает в фоновом режиме.\n\n### Температура \\(Temperature\\)\n\nТемпература является своего рода [датчиком окружающей среды](https://developer.android.com/guide/topics/sensors/sensors_environment.html) который позволяет измерять температуру окружающего воздуха. Измеряется в `°C` - градусах Цельсия.\n\nДля приема данных из виджета, необходимо использовать код:\n\n```cpp\nBLYNK_WRITE(V1) {\n  // температура в градусах цельсия\n  int celcius = param.asInt();\n}\n```\n\nВиджет Температуры не работает в фоновом режиме.\n\n### Триггер GPS \\(GPS Trigger\\)\n\nВиджет Триггер GPS позволяет легко инициировать события, когда вы входите или выходите из географической зоны. Этот виджет будет работать в фоновом режиме и периодически будет проверять ваши координаты. Если ваше местоположение находится в пределах или вне указанной зоны \\(географическая зона выбирается на карте виджета\\), виджет отправит команду `HIGH`/`LOW` на аппаратное устройство. Например, Триггер GPS назначен для пина `V1`, и включена опция `Trigger When Enter`. В этом случае, когда вы окажитесь в указанной географической зоне виджет вызовет событие `HIGH`.\n\n```cpp\nBLYNK_WRITE(V1) {\n  int state = param.asInt();\n  if (state) {\n      //Вы вошли в зону\n  } else {\n      //Вы вышли из зоны\n  }\n}\n```\n\nПодробнее о том, как работает GPS-виджет, вы можете прочитать [здесь](https://developer.android.com/guide/topics/location/strategies.html).\n\n**ВНИМАНИЕ:** Виджет Триггер GPS работает в фоновом режиме.\n\n### Поток GPS \\(GPS Streaming\\)\n\nПолезно для мониторинга местонахождения смартфона получать данные о широте, долготе, высоте и скорости \\(скорость часто может быть 0, если смартфон не поддерживает ее измерение\\).\n\nЧтобы принимать данные из этого виджета, вам необходимо:\n\n```cpp\nBLYNK_WRITE(V1) {\n  float latitude = param[0].asFloat(); \n  float longitude = param[1].asFloat();\n  float altitude = param[2].asFloat();\n  float speed = param[3].asFloat();\n}\n```\n\nили вы можете использовать подготовленную оболочку `GpsParam` :\n\n```cpp\nBLYNK_WRITE(V1) {\n  GpsParam gps(param);\n  //Печать лат/лон с 6 десятичными знаками\n  Serial.println(gps.getLat(), 7);\n  Serial.println(gps.getLon(), 7);\n\n  Serial.println(gps.getAltitude(), 2);\n  Serial.println(gps.getSpeed(), 2);\n}\n```\n\nПоток GPS работает в фоновом режиме.\n\n**Пример кода:** [Поток GPS](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/GPS_Stream/GPS_Stream.ino)\n\n## Other\n\n### Мост \\(Bridge\\)\n\nМост может быть использован для связи между устройствами \\(без участия приложения\\). Вы можете отправлять цифровые / аналоговые / виртуальные команды записи с одного устройства на другое, зная только токен авторизации. На данный момент виджет Мост не обязательно использовать в приложении \\(здесь он используется для указания того, что у нас есть такая функция\\). **Вы можете использовать несколько мостов для управления несколькими устройствами.**\n\nВиджет Мост использует виртуальный пин и превращает его в канал для управления другим устройством. Это означает, что вы можете контролировать любые виртуальные, цифровые или аналоговые пины целевого устройства. Будьте осторожны, не используйте пины типа `A0, A1, A2 ...` при обмене данными между различными типами устройств, так как в таких случаях Arduino Core может ссылаться на неверные пины.\n\nПример кода для устройства A, которое будет отправлять значения на устройство B:\n\n```cpp\n//Инициирует виджет Моста на V1 устройства A\nWidgetBridge bridge1(V1);\n...\nvoid setup() {\n    Blynk.begin(...);\n    while (Blynk.connect() == false) {\n        // Ждем пока Blynk подключится\n    }\n    bridge1.digitalWrite(9, HIGH); // выставим триггер HIGH на D9 устройства B. Код на устройстве B не требуется\n    bridge1.analogWrite(10, 123);\n    bridge1.virtualWrite(V1, \"hello\"); // вам нужно написать код на устройстве B, чтобы получить это значение. См. ниже\n    bridge1.virtualWrite(V2, \"value1\", \"value2\", \"value3\");\n}\n\nBLYNK_CONNECTED() {\n  bridge1.setAuthToken(\"OtherAuthToken\"); // токен с устройства B\n}\n```\n\n**ВАЖНО:** при выполнении `virtualWrite()` с виджета Мост, устройство B должно обрабатывать входящие данные с устройства A. Например, если вы отправляете значение с устройства A на устройство B, используя `bridge.virtualWrite (V5)`, вам необходимо использовать свой обработчик на устройстве B:\n\n```cpp\nBLYNK_WRITE(V5){\n    int pinData = param.asInt(); //pinData variable will store value that came via Bridge\n}\n```\n\nИмейте в виду, что `bridge.virtualWrite` не отправляет никаких значений в мобильное приложение. Для этого вам нужно вызвать `Blynk.virtualWrite`.\n\n**Пример кода:** [Мост](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Bridge/Bridge.ino)\n\n### Обработчик событий \\(Eventor\\)\n\nВиджет Обработчик событий позволяет создавать простые правила поведения или **события**. Давайте рассмотрим типичный вариант использования: считывание температуры с датчика DHT и отправка push-уведомления, когда температура превышает определенный предел:\n\n```cpp\n  float t = dht.readTemperature();\n  if (isnan(t)) {\n    return;\n  }\n  if (t > 40) {\n    Blynk.notify(String(\"Температура слишком высокая: \") + t);\n  }\n```\n\nС Обработчиком событий вам не нужно писать этот код. Все, что вам нужно, это отправить значение с датчика на сервер Blynk:\n\n```cpp\n  float t = dht.readTemperature();\n  Blynk.virtualWrite(V0, t);\n```\n\nНе забывайте, что команды `virtualWrite` должны быть заключены в таймер и не должны использоваться в основном цикле `loop`.\n\n**ПРИМЕЧАНИЕ:** Не забудьте добавить виджет уведомлений в приложении.\n\nОбработчик событий пригодится вам, когда нужно изменить условия на лету без повторной загрузки нового скетча на аппаратное обеспечение. Вы можете создать столько **событий**, сколько вам нужно. Обработчик событий также может быть запущен со стороны приложения. Вам просто нужно назначить виджет на тот же контакт, что и ваше событие в Обработчике событий. Обработчик событий не постоянно отправляет события. Давайте рассмотрим простой пример, как показано выше `if (temperature > 40) send notification`. Когда температура превышает 40 пороговых значений - отправляется уведомление. Если температура продолжает оставаться выше 40 никакие повторные действия не будут инициированы. Но если `temperature` опускается ниже порогового значения, а затем проходит его снова уведомление будет отправлено повторно \\(для уведомлений Обработчика событий нет ограничения отправки в течение 5 секунд\\).\n\nОбработчик событий также поддерживает события таймера \\(Timer\\). Например, вы можете установить пин `V1` ON/HIGH в 21:00:00 каждую пятницу. В Обработчике событий вы можете назначить несколько таймеров на один и тот же пин, отправить любую строку/число, выбрать день и часовой пояс.\n\nЧтобы удалить созданное **событие**, пожалуйста, используйте сдвиг пальцем по экрану. Вы также можете перенести последний элемент самого события.\n\n**Пример кода:** [Обработчик событий](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Eventor/Eventor.ino)\n\n**ПРИМЕЧАНИЕ:** Виджет таймера зависит от времени сервера, а не вашего телефона. Иногда время телефона может не соответствовать времени сервера.\n\n**ПРИМЕЧАНИЕ:** события запускаются только один раз при выполнении условия. Это означитает что \\[цепочка событий\\] \\([https://community.blynk.cc/t/eventor-behavior-bug-feature/20962](https://community.blynk.cc/t/eventor-behavior-bug-feature/20962)\\) невозможна \\(однако она может быть включена в коммерческой версии\\).\n\n### Часы реального времени \\(RTC\\)\n\nЧасы реального времени позволяют получать время с сервера. Вы можете предварительно выбрать любой часовой пояс в пользовательском интерфейсе, чтобы получить время на оборудование из нужной локали.\n\n**Пример кода:** [Часы реального времени](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/RTC/RTC.ino)\n\n### Bluetooth с низким энергопотреблением\n\nЭтот виджет позволяет включить блутзуз с низким энергопотреблением на вашем телефоне. На текущий момент виджет также требует наличия интернет соединения \\(постараемся пофиксить в ближайшем будущем\\). Некоторые типы виджетов нельзя использовать вместе с блутузом, например исторический граф, так как он требует чтобы данные отправлялись на сервер, чего блутуз виджет не делает.\n\n**Список поддерживаемых чипов и контроллеров:** [BLE](https://github.com/blynkkk/blynk-library/tree/master/examples/Boards_Bluetooth)\n\n### Блютуз \\(Bluetooth\\)\n\nЭтот виджет позволяет включить блютуз на вашем телефоне. На текущий момент виджет также требует наличия интернет соединения \\(постараемся пофиксить в ближайшем будущем\\) и поддерживается только на Android. Некоторые типы виджетов нельзя использовать вместе с блютузом, например исторический граф, так как он требует чтобы данные отправлялись на сервер, чего блютуз виджет не делает.\n\n**Список поддерживаемых чипов и контроллеров:** [BLE](https://github.com/blynkkk/blynk-library/tree/master/examples/Boards_Bluetooth)\n\n### Музыкальный проигрыватель \\(Music Player\\)\n\nПростой элемент интерфейса с 3 кнопками - имитирует интерфейс музыкального проигрывателя. Каждая кнопка отправляет свою команду на аппаратное устройство: `play` \\(воспроизвести\\), `stop` \\(стоп\\), `prev` \\(предыдущий\\), `next` \\(следующий\\).\n\nВы можете изменить состояние виджета в приложении с аппаратной стороны с помощью следующих команд:\n\n```text\nBlynk.virtualWrite(Vx, \"play\");\nBlynk.virtualWrite(Vx, \"stop\");\n```\n\nВы также можете изменить состояние воспроизведение/остановка виджета с помощью следующего кода \\(эквивалент вышеупомянутых команд\\):\n\n`Blynk.setProperty(V1, \"isOnPlay\", \"false\");`\n\n**Пример кода:** [Музыкальный проигрыватель](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Player/Player.ino)\n\n### Вебхук \\(Webhook\\)\n\nВебхук очень мощный виджет, который позволяет Вам легко интегрироватся с любыми сторонними сервисами. С его помощью Вы можете слать любые HTTP/S запросы на любой сервер или устройство, которое имеет HTTP/S API \\(например, лампы Philips Hue\\).\n\nВебхук вешается на вирутальный пин и любая команда, которая приходит на этот пин будет вызывать срабатывание HTTP/S запроса. Команды на такой виртуальный пин могут приходить как со стороны железа, так и со стороны приложения. То есть, Вы можете слать любой HTTP запрос при нажатии кнопки в приложении, если эта кнопка на том же пине что и вебхук.\n\nВот простой пример, представьте, что Вы хотите слать данные с микроконтроллера не только в Blynk, но и в какой-то другой сервис, например - Google Docs или в thingspeak.com. Раньше Вам для этого пришлось бы писать что-то вроде :\n\n```cpp\nWiFiClient client;\nif (client.connect(\"api.thingspeak.com\", 80)) {\n    client.print(\"POST /update HTTP/1.1\\n\");\n    client.print(\"Host: api.thingspeak.com\\n\");\n    client.print(\"Connection: close\\n\");\n    client.print(\"X-THINGSPEAKAPIKEY: \" + apiKeyThingspeak1 + \"\\n\");\n    client.print(\"Content-Type: application/x-www-form-urlencoded\\n\");\n    client.print(\"Content-Length: \");\n    client.print(postStr.length());\n    client.print(\"\\n\\n\");\n    client.print(postStr);\n}\n```\n\nС вебхуком этого больше делать не нужно. Достаточно лишь заполнить поля виджета в приложении и выполнить привычное:\n\n```cpp\nBlynk.virtualWrite(V0, value);\n```\n\nГде V0 - пин вебхук виджета.\n\nВ дополнение, Вы можете подставлять значение пина в URL:\n\n```cpp\nhttps://api.thingspeak.com/update?api_key=xxxxxx&field1=/pin/\n```\n\nили тело запроса :\n\n```cpp\n[\"/pin/\"]\n```\n\nТак же можно отправлять несколько значений внутри одного пина \\(до 5\\) :\n\n`/pin[0]/`,`/pin[1]/`, `/pin[2]/`\n\nЕще одна крутая штука - это возможность делать HTTP GET запросы на сервере и слать их результат на микроконтроллер. Прелесть тут в том, что Вам не нужно для этого писать сложный код на микроконтроллере. Представьте, что Вам нужно  \nполучить информацию о погоде от какого-то метио сервиса. Например, по такому запросу :\n\n```text\nВы можете вставить этот запрос в вебхук виджет, выбрать пин ```V0``` и написать :\n\n```cpp\nBLYNK_WRITE(V0){\n  String webhookdata = param.asStr();\n  Serial.println(webhookdata);\n}\n```\n\nТеперь, каждый раз когда вы дергаете `V0` с помощью `Blynk.virtualWrite(V0, 1)` будет вызвана функция `BLYNK_WRITE(V0)`.\n\n**Замечание:** обычно HTTP запросы довольно большие, поэтому Вам, вероятно, нужно будет увеличить лимит на максимальную длину сообщения на микроконтроллере `#define BLYNK_MAX_READBYTES 1024`.\n\n**Замечание:** наше облако так же имеет определенные лимиты для вебхука. Мы разрешаем слать только 1 запрос в секунду. Это поведение можно изменить на локальном сервер через свойство `webhooks.frequency.user.quota.limit`. Пожалуйста, используйте вебхуки с умом. Многие веб ресурсы не способны обрабатывать даже 1 запрос в секунду.\n\n**Замечание :** в случае если Ваш вебхук не выполнился 10 раз подряд - вебхук виджет будет остановлен. Чтобы восстановить его работу - нужно открыть и закрыть виджет в режиме редактирования. Не выполненными считаются запросы у которых код ответа не равен 200 или 302.\n\n### Отчеты \\(Reports\\)\n\nФункция виджета Отчеты заключается в настройке и разметке отчетов данных в формате CSV. Вы можете выбрать разовые или переодически запланированные отчеты.\n\nКроме того, в отчетах вы можете очистить все пользовательсике данные, собранные с ваших устройств.\n\nВам необходимо настроить начальные параметры в режиме редактирования, а затем уже в режиме воспроизведения вы сможете настроить сами отчеты.\n\n#### Режим редактирования. Конфигурация ввода данных\n\nВ режиме редактирования \\(когда ваш проект остановлен\\) вы определяете потоки данных, которые вы хотели бы позже включить в отчет. Виджет Отчеты предназначен для работы с виджетом [Плитка устройств \\(Device Tiles\\)](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/device_tiles.md). Если вы не используете плитки устройств, вы все равно можете выбрать одно устройство или группу устройств в качестве источника данных для отчетов.\n\nВы должны выбрать либо [Плитку устройств](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/device_tiles.md), либо одино устройство, либо группу устройств для отчета. Вы не можете объединить эти оба варианта.\n\n#### Режим воспроизведения\n\nПосле добавления исходных устройств и их потоков данных нажмите кнопку «Воспроизвести» и нажмите кнопку «Отчеты».\n\n### Настройка отчетов\n\nКаждый параметр отчета предполагает свои собственные настройки:\n\n`Report name` \\(Имя отчета\\) - дайте вашему отчету осмысленное имя.\n\n`Data source` \\(Источники данных\\) - выберите потоки данных, которые вы хотели бы включить в отчеты.\n\n`Report Frequency` \\(периодичность отчетов\\) - Определяет, как часто будут отправляться отчеты. Они могут быть разовыми и запланированными.\n\n`one-time` \\(Сейчас\\) - мгновенно сформирует отчет и отправит его на указанные адреса электронной почты. Нажмите на значок справа, чтобы отправить отчет.\n\nЗапланированные отчеты могут быть отправлены `daily`/`weekly`/`monthly` \\(ежедневно/еженедельно/ежемесячно\\).\n\n`At Time` \\(Время\\) установите время дня, когда отчет будет отправлен. `Start`/`End` \\(Качало/Конец\\) указывает дату начала и окончания оправки отчетов.\n\nДля еженедельного отчета вы можете выбрать день недели, когда отчет должен быть отправлен. Для ежемесячного отчета вы можете выбрать, отправку отчета в первый или последний день месяца.\n\n`Recipients` \\(Получатели\\) - укажите до 5 адресов электронной почты..\n\n`Data resolution` \\(Разрешение данных\\) определяет детализацию ваших отчетов. Поддерживаемые детализации: `minute` \\(ежеминутно\\), `hourly` \\(ежечасно\\) и `daily` \\(ежедневно\\). Например, когда вы генерируете ежедневный отчет с детализацией в 1 минуту, вы получаете `24 * 60 * 60` единиц данных в вашем ежедневном отчете за каждый выбранный поток.\n\n`Group data in reports by` \\(Группировка данных в отчетах\\) - укажите выходной формат файла-\\(ов\\) CSV:\n\n`Datastream` \\(Поток\\) - вы получите один CSV файл для каждого потока данных.\n\n`Device` \\(Устройство\\) - вы получите один CSV-файл на каждое устройство. Каждый файл будет содержать все включенные потоки данных.\n\n`Report` \\(Отчет\\) - вы получите один CSV-файл для всех ваших устройств и всех ваших потоков данных.\n\n`Timezone correction` \\(Времненная зона\\) - укажите корректировку часового пояса, если вам нужно настроить дату и время отчета на определенный часовой пояс.\n\n`Date and time format` \\(Формат даты и времени\\) - определяет формат поля временной метки ваших данных. Вы можете выбрать `2018-06-21 20:16:48`, `2018-06-21T20:16:48+03:00` или другой поддерживаемый формат.\n\nСуществует особый формат `Timestamp` \\(Временная метка\\), которая отражает разницу между текущим временем и полуночью 1 января 1970 года UTC, измеряемую в миллисекундах.\n\nПосле настройки отчета нажмите кнопку «ОК» в правом верхнем углу. Ваш отчет готов.\n\nПосле настройки отчета вы увидите, когда запланирован следущий отчет `Next`, а также увидите расписание для этого отчета.\n\nПосле отправки отчета хотя бы один раз, вы можете увидеть дату его последней отправки `Last`.\n\n`Last` \\(Последний\\) метка также содержит статус отправки отчета:\n\n* `OK` \\(Успешно\\):  отчет был сгенерирован и успешно отправлен Получателям;\n* `No Data` \\(Нет данных\\): отчет не содержит данных за указанный период;\n* `Error` \\(Ошибка\\):  что-то пошло не так. Пожалуйста, свяжитесь со службой поддержки Blynk.\n\nОтчеты будут генерироваться, даже если ваш проект не находится в активном \\(Play\\) режиме. Однако помните, неактивные проекты небудут генерировать данные.\n\n**ПРИМЕЧАНИЕ:** все отчеты формируются в кодировке UTF-16. Пожалуйста, убедитесь, что при открытии файла отчета вы выбрали кодировку UTF-16 в вашем CSV-редакторе.\n\n### Отчеты \\(Reports\\)\n\nФункция виджета Отчеты заключается в настройке и разметке отчетов данных в формате CSV. Вы можете выбрать разовые или переодически запланированные отчеты.\n\nКроме того, в отчетах вы можете очистить все пользовательсике данные, собранные с ваших устройств.\n\nВам необходимо настроить начальные параметры в режиме редактирования, а затем уже в режиме воспроизведения вы сможете настроить сами отчеты.\n\n#### Режим редактирования. Конфигурация ввода данных\n\nВ режиме редактирования \\(когда ваш проект остановлен\\) вы определяете потоки данных, которые вы хотели бы позже включить в отчет. Виджет Отчеты предназначен для работы с виджетом [Плитка устройств \\(Device Tiles\\)](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/device_tiles.md). Если вы не используете плитки устройств, вы все равно можете выбрать одно устройство или группу устройств в качестве источника данных для отчетов.\n\nВы должны выбрать либо [Плитку устройств](https://github.com/blynkkk/blynkkk.github.io/blob/master/mobile/ru/device_tiles.md), либо одино устройство, либо группу устройств для отчета. Вы не можете объединить эти оба варианта.\n\n#### Режим воспроизведения\n\nПосле добавления исходных устройств и их потоков данных нажмите кнопку «Воспроизвести» и нажмите кнопку «Отчеты».\n\n### Настройка отчетов\n\nКаждый параметр отчета предполагает свои собственные настройки:\n\n`Report name` \\(Имя отчета\\) - дайте вашему отчету осмысленное имя.\n\n`Data source` \\(Источники данных\\) - выберите потоки данных, которые вы хотели бы включить в отчеты.\n\n`Report Frequency` \\(периодичность отчетов\\) - Определяет, как часто будут отправляться отчеты. Они могут быть разовыми и запланированными.\n\n`one-time` \\(Сейчас\\) - мгновенно сформирует отчет и отправит его на указанные адреса электронной почты. Нажмите на значок справа, чтобы отправить отчет.\n\nЗапланированные отчеты могут быть отправлены `daily`/`weekly`/`monthly` \\(ежедневно/еженедельно/ежемесячно\\).\n\n`At Time` \\(Время\\) установите время дня, когда отчет будет отправлен. `Start`/`End` \\(Качало/Конец\\) указывает дату начала и окончания оправки отчетов.\n\nДля еженедельного отчета вы можете выбрать день недели, когда отчет должен быть отправлен. Для ежемесячного отчета вы можете выбрать, отправку отчета в первый или последний день месяца.\n\n`Recipients` \\(Получатели\\) - укажите до 5 адресов электронной почты..\n\n`Data resolution` \\(Разрешение данных\\) определяет детализацию ваших отчетов. Поддерживаемые детализации: `minute` \\(ежеминутно\\), `hourly` \\(ежечасно\\) и `daily` \\(ежедневно\\). Например, когда вы генерируете ежедневный отчет с детализацией в 1 минуту, вы получаете `24 * 60 * 60` единиц данных в вашем ежедневном отчете за каждый выбранный поток.\n\n`Group data in reports by` \\(Группировка данных в отчетах\\) - укажите выходной формат файла-\\(ов\\) CSV:\n\n`Datastream` \\(Поток\\) - вы получите один CSV файл для каждого потока данных.\n\n`Device` \\(Устройство\\) - вы получите один CSV-файл на каждое устройство. Каждый файл будет содержать все включенные потоки данных.\n\n`Report` \\(Отчет\\) - вы получите один CSV-файл для всех ваших устройств и всех ваших потоков данных.\n\n`Timezone correction` \\(Времненная зона\\) - укажите корректировку часового пояса, если вам нужно настроить дату и время отчета на определенный часовой пояс.\n\n`Date and time format` \\(Формат даты и времени\\) - определяет формат поля временной метки ваших данных. Вы можете выбрать `2018-06-21 20:16:48`, `2018-06-21T20:16:48+03:00` или другой поддерживаемый формат.\n\nСуществует особый формат `Timestamp` \\(Временная метка\\), которая отражает разницу между текущим временем и полуночью 1 января 1970 года UTC, измеряемую в миллисекундах.\n\nПосле настройки отчета нажмите кнопку «ОК» в правом верхнем углу. Ваш отчет готов.\n\nПосле настройки отчета вы увидите, когда запланирован следущий отчет `Next`, а также увидите расписание для этого отчета.\n\nПосле отправки отчета хотя бы один раз, вы можете увидеть дату его последней отправки `Last`.\n\n`Last` \\(Последний\\) метка также содержит статус отправки отчета:\n\n* `OK` \\(Успешно\\):  отчет был сгенерирован и успешно отправлен Получателям;\n* `No Data` \\(Нет данных\\): отчет не содержит данных за указанный период;\n* `Error` \\(Ошибка\\):  что-то пошло не так. Пожалуйста, свяжитесь со службой поддержки Blynk.\n\nОтчеты будут генерироваться, даже если ваш проект не находится в активном \\(Play\\) режиме. Однако помните, неактивные проекты небудут генерировать данные.\n\n**ПРИМЕЧАНИЕ:** все отчеты формируются в кодировке UTF-16. Пожалуйста, убедитесь, что при открытии файла отчета вы выбрали кодировку UTF-16 в вашем CSV-редакторе.\n\n"
  },
  {
    "path": "widgets.md",
    "content": "# Widgets\n\nWidgets are interface modules. Each of them performs a specific input/ output function when communicating with the hardware.\n\nThere are 4 types of Widgets:\n\n* **Controllers** - used to send commands that control your hardware\n* **Displays** - used for data visualization from sensors and other sources;\n* **Notifications** - send messages and notifications;\n* **Interface** - widgets to perform certain GUI functions;\n* **Other** - widgets that don't belong to any category;\n\nEach Widget has it's own settings. Some of the Widgets \\(e.g. Bridge\\) just enable functionality and they don't have any settings.\n\n## Common Widget Settings\n\n### Pin Selector\n\nThis is one of the main parameters you need to set. It defines which pin to control or to read from.\n\n![](.gitbook/assets/pin_selection.png)\n\n**Digital Pins** - represent physical Digital IO pins on your hardware. PWM-enabled pins are marked with the `~` symbol\n\n**Analog Pins** - represent physical Analog IO pins on your hardware\n\n**Virtual Pins** - have no physical representation. They are used to transfer any data between Blynk App and your hardware. Read more about Virtual Pins [here](./#blynk-main-operations-virtual-pins).\n\n### Data Mapping\n\nIn case you want to map incoming values to specific range you may use mapping button:\n\n![](.gitbook/assets/display_edit_mapping.png)\n\nLet's say your sensor sends values from 0 to 1023. But you want to display values in a range 0 to 100 in the app. When Data Mapping enabled, incoming value 1023 will be mapped to 100.\n\n### SPLIT/MERGE\n\nSome of the Widgets can send more than one value. And with this switch you can control how to send them.\n\n* **SPLIT**: Each of the parameters is sent directly to the Pin on your hardware \\(e.g D7\\). You don't need to write any code.\n\n  **NOTE:** In this mode you send multiple commands from one widget, which can reduce performance of your hardware.\n\n  Example: If you have a Joystick Widget and it's set to D3 and D4, it will send 2 commands over the Internet:\n\n  ```cpp\n    digitalWrite(3, value);\n    digitalWrite(4, value);\n  ```\n\n* **MERGE:** When MERGE mode is selected, you are sending just 1 message, consisting of array of values. But you'll need to parse it on the hardware.\n\n  This mode can be used with Virtual Pins only.\n\n  Example: Add a zeRGBa Widget and set it to MERGE mode. Choose Virtual Pin V1\n\n  ```cpp\n    BLYNK_WRITE(V1) // There is a Widget that WRITEs data to V1 \n    {\n      int r = param[0].asInt(); // get a RED channel value\n      int g = param[1].asInt(); // get a GREEN channel value\n      int b = param[2].asInt(); // get a BLUE channel value\n    }\n  ```\n\n### Decimals\n\nDefines how many decimals you would like to see when moving a Slider. When \"No Fraction\" is chosen, slider will only send integer values with no decimals. \"1 digit\" means that values will look like 1.1, 1.2, ..., 2.0, etc.\n\n### Send On Release\n\nThis option allows you to optimize data traffic on your hardware.\n\nFor example, when you move joystick widget, commands are streamed to the hardware, during a single joystick move you can send dozens of commands. There are use-cases where it's needed, however creating such a load may lead to hardware overload and reset. **Send On Release** is a recommended setting for majority of applications. This is also a default setting.\n\n### Write interval\n\nSimilar to \"Send on Release\" option. However, it allows you to stream values to your hardware within certain interval. For example, setting **write interval** to 100 ms means that while you move the slider, only 1 value will be sent to hardware within 100 ms period. This option is also used to optimize data traffic flow to your hardware.\n\n### Color gradient\n\nWhen you choose gradient, it affects the color of widget elements based on invoming values. For example: You set Gauge Widget with Min and Max parameters of 0-100, and choose green-yellow-red gradient. When hardware sends:\n\n* `10`, Gauge will change it's color to green color\n* `50` will change Gauge to yellow color\n* `80` will change Gauge to red color\n\nThere are 2 types of gradients you can choose from:\n\n* Warm: Green - Orange - Red;\n* Cold: Green - Blue - Violet;\n\n## Controllers\n\n### Button\n\nWorks in push or switch modes. Allows to send ON and OFF \\(LOW/HIGH\\) values. Button sends 1 \\(HIGH\\) on press and sends 0 \\(LOW\\) on release.\n\n![](.gitbook/assets/button.png)\n\n![](.gitbook/assets/button_edit.png)\n\n**Sketch:** [BlynkBlink](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n### Slider\n\nSimilar to potentiometer. Allows to send values between in a given MIN/MAX range.\n\n![](.gitbook/assets/slider.png)\n\n![](.gitbook/assets/slider_edit.png)\n\n**Sketch:** [BlynkBlink](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n### Timer\n\nTimer triggers actions at a specified time. Even if smartphone and app is offline. Start time sends 1 \\(HIGH\\). Stop time sends 0 \\(LOW\\).\n\nRecent Android version also has improved Timer within Eventor widget. With Eventor Time Event you can assign multiple timers on same pin, send any string/value, select days and timezone. It is recommended to use Eventor over Timer widget. However Timer widget is still suitable for simple timer events.\n\n![](.gitbook/assets/timer.png)\n\n![](.gitbook/assets/timer_edit.png)\n\n**NOTE:** The timer widget rely on the server time and not your phone time. Sometimes the phone time may not match the server time.\n\n**Sketch:** [Timer](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Timer/Timer.ino)\n\n### Joystick\n\nControl servo movements in 4 directions\n\n#### Settings:\n\n* SPLIT/MERGE modes - read [here](./#widgets-common-widget-settings-splitmerge)\n* **Rotate on Tilt**\n\nWhen it's ON, Joystck will automatically rotate if you use your smartphone in landscape orientation\n\n* **Auto-Return**\n* When it's OFF, Joystick handle will not return back to center position. It will stay where you left it. \n\n![](.gitbook/assets/joystick.png)\n\n![](.gitbook/assets/joystick_edit.png)\n\n**Sketch:** [JoystickTwoAxis](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/JoystickTwoAxis/JoystickTwoAxis.ino)\n\n### zeRGBa\n\nzeRGBa is a usual RGB color picker + brightness picker\n\n#### Settings:\n\n* **SPLIT**:\n\n  Each of the parameters is sent directly to the Pin on your hardware \\(e.g D7\\). You don't need to write any code.\n\n**NOTE:** In this mode you send multiple commands from one widget, which can reduce performance of your hardware.\n\nExample: If you have a zeRGBa Widget and it's set to D1, D2, D3 it will send 3 commands over the Internet:\n\n```cpp\ndigitalWrite(1, r);\ndigitalWrite(2, g);\ndigitalWrite(3, b);\n```\n\n* **MERGE**:\n\n  When MERGE mode is selected, you send 1 message with an array of values inside. You would need to parse the message on the hardware. \n\nThis mode can be used with Virtual Pins only.\n\nExample: Add a zeRGBa Widget and set it to MERGE mode. Choose Virtual Pin V1.\n\n```cpp\nBLYNK_WRITE(V1) // zeRGBa assigned to V1 \n{\n    // get a RED channel value\n    int r = param[0].asInt();\n    // get a GREEN channel value\n    int g = param[1].asInt();\n    // get a BLUE channel value\n    int b = param[2].asInt();\n}\n```\n\n### Step Control\n\nStep Control is used to set granular values with a given step\n\n2 buttons are assigned to 1 pin. One button increments the value, another one decrements it.\n\n**Send Step** option allows you to send step value to hardware instead of actual value of step widget. **Loop value** option allows you to reset step widget to start value when maximum value is reached.\n\n**Sketch:** [Basic Sketch](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n## Displays\n\n### Value Display\n\nDisplays incoming data.\n\n![](.gitbook/assets/display.png)\n\n![](.gitbook/assets/display_edit.png)\n\n**Sketch:** [BlynkBlink](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n### Labeled Value\n\nDisplays incoming data in a formatted wayt. It is a better version of 'Value Display' where you can add suffixes and prefixes on the app side, with no coding on the hardware.\n\n![](.gitbook/assets/display.png)\n\n![](.gitbook/assets/labeled_value_edit.png)\n\n**Sketch:** [BlynkBlink](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n#### Formatting options\n\nFor example: your sensor sends vaule of 12.6789 to Blynk application. Next formatting options are supported:\n\n`/pin/` - displays the value without formatting \\(12.6789\\)\n\n`/pin./` - displays the rounded value without decimal part \\(13\\)\n\n`/pin.#/` - displays the value with 1 decimal digit \\(12.7\\)\n\n`/pin.##/` - displays the value with two decimal places \\(12.68\\)\n\n![](.gitbook/assets/labeled_value_format_edit.png)\n\n### LED\n\nA simple LED for indication. You need to send 0 in order to turn LED off. And 255 in order to turn LED on. Or just use Blynk API as described below:\n\n```cpp\nWidgetLED led1(V1); //register to virtual pin 1\nled1.off();\nled1.on();\n```\n\nAll values between 0 and 255 will change LED brightness:\n\n```cpp\nWidgetLED led2(V2);\nled2.setValue(127); //set brightness of LED to 50%.\n```\n\n![](.gitbook/assets/led.png)\n\n**Sketch:** [LED](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LED/LED_Blink/LED_Blink.ino)\n\n### Gauge\n\nVisual display of numeric values.\n\n![](.gitbook/assets/gauge.png)\n\n![](.gitbook/assets/gauge_edit.png)\n\n**Sketch:** [BlynkBlink](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/BlynkBlink/BlynkBlink.ino)\n\n#### Formatting options\n\nFor example: your sensor sends vaule of 12.6789 to Blynk application. Next formatting options are supported:\n\n`/pin/` - displays the value without formatting \\(12.6789\\)\n\n`/pin./` - displays the rounded value without decimal part \\(13\\)\n\n`/pin.#/` - displays the value with 1 decimal digit \\(12.7\\)\n\n`/pin.##/` - displays the value with two decimal places \\(12.68\\)\n\n### LCD\n\nThis is a regular 16x2 LCD display made in our secret facility in China.\n\n#### SIMPLE / ADVANCED MODE\n\n#### Commands\n\nYou need to use special commands with this widget:\n\n```text\nlcd.print(x, y, \"Your Message\");\n```\n\nWhere x is a symbol position \\(0-15\\), y is a line id \\(0 or 1\\),\n\n```text\nlcd.clear();\n```\n\n![](.gitbook/assets/lcd.png)\n\n![](.gitbook/assets/lcd_edit.png)\n\n**Sketch:** [LCD Advanced Mode](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_AdvancedMode/LCD_AdvancedMode.ino) **Sketch:** [LCD Simple Mode Pushing](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_SimpleModePushing/LCD_SimpleModePushing.ino) **Sketch:** [LCD Simple Mode Reading](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/LCD/LCD_SimpleModeReading/LCD_SimpleModeReading.ino)\n\n#### Formatting options\n\nFor example: your sensor sends vaule of 12.6789 to Blynk application. Next formatting options are supported:\n\n`/pin/` - displays the value without formatting \\(12.6789\\)\n\n`/pin./` - displays the rounded value without decimal part \\(13\\)\n\n`/pin.#/` - displays the value with 1 decimal digit \\(12.7\\)\n\n`/pin.##/` - displays the value with two decimal places \\(12.68\\)\n\n![](.gitbook/assets/lcd_format_edit.png)\n\n### SuperChart\n\nSuperChart is used to visualise live and historical data. You can use it for sensor data, for binary event logging and more.\n\nTo use SuperChart widget you would need to push the data from the hardware with the desired interval by using timers.  \n[Here is](https://examples.blynk.cc/?board=ESP8266&shield=ESP8266%20WiFi&example=GettingStarted%2FPushData) a basic example for data pushing.\n\n#### Interactions:\n\n* **Switch between time ranges and Live mode** &lt;/br&gt;Tap time ranges at the bottom of the widget to change time ranges\n* **Tap Legend Elements** to show or hide datastreams &lt;/br&gt;\n* **Tap'n'hold to view timestamp and corresponding values**\n\n![](.gitbook/assets/tapnhold_charts.png)\n\n* **Quick swipe from left to right to reveal previous data** \n\n![](.gitbook/assets/swipe_charts.png)\n\nThen you can then scroll data back and forward within the given time range.\n\n* **Full Screen Mode**&lt;/br&gt;\n\n  Press this button to open Full Screen view in landscape orientation:\n\n![](.gitbook/assets/fullscreen_charts.png)\n\nSimply rotate the phone back to portrait mode. Chart should rotate automagically. In full screen view you will see X \\(time\\) and multiple Y scales. Full Screen Mode can be disabled from widget Settings.\n\n* **Menu Button**&lt;/br&gt;\n\n  Menu button will open additional functions:\n\n  * Export to CSV\n  * Erase Data on the server \n\n![](.gitbook/assets/menu_charts.png)\n\n#### SuperChart Settings:\n\n* Chart Title\n* Title Font Size\n\n  You have a choice of 3 font sizes\n\n* Title Alignment\n\n  Choose chart title alignment. This setting also affects Title and Legend position on the Widget.\n\n* Show x-axis \\(time\\)\n\n  Select it if you want to show the time label at the bottom of your chart.\n\n* Time ranges picker Allows you to select required periods \\(`15m`, `30m`, `1h`, `3h`, ...\\) and resolution for your chart. Resolution defines how precise your data is. Right now chart supports 2 types of resolution `standard` and `high`. Resolution also depends on the selected period. For example, `standard` resolution for `1d` means you'll get 24 points per day \\(1 per hour\\), with `high` resolution you'll get for `1d` 1440 points per day \\(1 per minute\\).\n* Datastreams - add datastreams \\(read below how to configure datastreams\\)\n\n#### Datastream Settings\n\nWidget supports up to 4 Datastreams. Press Datastream Settings Icon to open Datastream Settings.\n\n![](.gitbook/assets/datastream_charts.png)\n\n**Design:** Choose available types of Chart:\n\n* Line\n* Area\n* Bar\n* Binary \\(anchor LINK to binary\\)\n\n**Color:** Choose solid colors or gradients\n\n**Source and input:** You can use 3 types of Data source:\n\n**1. Virtual Pin** Choose the desired Device and Virtual Pin to read the data from.\n\n**2. Tags** SuperChart can aggregate data from multiple devices using built-in aggregation functions. For example, if you have 10 Temperature sensors sending temperature with the given period, you can plot average value from 10 sensors on the widget.\n\nTo use Tags:\n\n* [**Add Tag**](./#blynk-main-operations-control-of-multiple-devices-tags) to every device you want to aggregate data from.\n* **Push data to the same Virtual Pin** on every device. \\(e.g. `Blynk.virtualWrite (V0, temperature);`\\)\n* **Choose Tag as a source** in SuperChart Widget and use the pin where the data is coming to \\(e.g V0\\) \n\n**Functions available:**\n\n* **SUM**, will summarize all incoming values to the specified Virtual Pin across all devices tagged with the chosen tag\n* **AVG**, will plot average value \n* **MED**, will find a median value\n* **MIN**, will plot minimum value \n* **MAX** will plot maximum value \n\n**☝️ IMPORTANT: Tags are not working in Live Mode.**\n\n1. [**Device Selector**](./#widgets-time-input-device-selector)\n\n   If you add Device Selector Widget to your project, you can use it as a source for SuperChart. \n\n   In this case, when you change the device in Device Selector, chart will be updated accordingly\n\n**Y-Axis Settings**   \nThere are 4 modes of how to scale data along the Y axis\n\n1. _Auto_  Data will be auto-scaled based on min and max values of the given time period. This is nice option to start with.\n2. **Values**  When this mode is selected, Y scale will be set to the values you choose. For example, if your hardware sends data with values varying from -100 to 100, you can set the chart to this values and data will be rendered correctly.\n\n![](.gitbook/assets/yScale_manual_charts.png)\n\nYou may also want to visualize the data within some specific range. Let's say incoming data has values in the range of 0-55, but you would like to see only values in the range 30-50. You can set it up and if values are out of Y scale you configured, chart will be cropped\n\n1. **% of Height**  \n\n\n   This option allows you to auto-scale incoming data on the widget and position it the way you want. \n\n   In this mode, you set up the percentage of widget height on the screen, from 0% to 100%. \n\n![](.gitbook/assets/yheight2_charts.png)\n\nIf you set 0-100%, in fact it's a full auto-scale. No matter in which range the data is coming,  \nit will be always scaled to the whole height of the widget.\n\nIf you set it to 0-25%, then this chart will only be rendered on 1/4 of the widget height: ![](.gitbook/assets/yheight2_manual_charts.png)\n\nThis setting is very valuable for **Binary Chart** or for visualizing a few datastreams on the same chart in a different way.\n\n![](.gitbook/assets/binary_charts.png)\n\n1. _Delta_  \n\n\n   While data stays within the given Delta value, chart will be auto-scaled within this range.\n\n   If delta exceeds the range, chart will be auto-scaled to min/max values of the given period.\n\n**Suffix:**  \n Here you can specify a suffix that will be shown during the Tap'n'hold\n\n**Decimals**  \n Defines the formatting of the graph value when you Tap'n'hold the graph. Possible options are: \\#, \\#.\\#, \\#.\\#\\#, etc.\n\n**Connect Missing Data Points**  \n If this switch is ON, then SuperChart will connect all the dots even if there was no data\n\n![](.gitbook/assets/datapoints1_charts.png)\n\nIf it's set to OFF, then you will see gaps in case there was no data.\n\n![](.gitbook/assets/datapoints2_charts.png)\n\n**Binary Chart Settings**  \n This type of chart is useful to plot binary data, for example when unit was ON or OFF, or when motion was detected or when certain threshold was reached.\n\nYou need to specify a **FLIP** point, which is the point where incoming data will be turned into TRUE or FALSE state.\n\nFor example, you send the data in the range of `0 to 1023`. If you set `512` as a **FLIP** point, then everything above `512` \\(excluding 512\\) will be recorded as `TRUE`, any value below `512` \\(including 512\\) will be `FALSE`.\n\nAnother example, if you send `0 and 1` and set `0` as a **FLIP** point, then `1` will be `TRUE`, `0` will be `FALSE`\n\n**State Labels:**  \n Here you can specify how `TRUE/FALSE` should be shown in Tap'n'Hold mode.\n\nFor example, you can set to `TRUE` to \"Equipment ON\" label, `FALSE` to \"Equipment OFF\".\n\n![](.gitbook/assets/binarylabel_charts.png)\n\nSuperchart supports currently 2 types of granularity:\n\n* Minute granularity - `1h`, `6h`, `1d`;\n* Hour granularity - `1w`, `1m`, `3m`;\n\nThis means that minimum chart update interval is 1 minute for `1h`, `6h`, `1d` periods. 1 hour for `1w`, `1m` and `3m` periods. As Blynk Cloud is free to use we have a limit on how many data you can store. At the moment Blynk Cloud accepts 1 message per minute per pin. In case you send your data more frequently your values will be averaged. For example, in case you send value `10` at 12:12:05 and than again `12` at 12:12:45 as result in chart you'll see value `11` for 12:12.\n\nIn order to see data in chart you need to use either widgets with \"Frequency reading\" interval \\(in that case your app should be open and running\\) or you can use `Blynk.virtualWrite` on hardware side. Every `Blynk.virtualWrite` command is stored on server automatically. In that case you don't need application to be up and running.\n\n### Terminal\n\nDisplays data from your hardware. Allows to send any string to your hardware. Terminal always stores last 25 messages your hardware had send to Blynk Cloud. This limit may be increased on Local Server with `terminal.strings.pool.size` property.\n\nYou need to use special commands with this widget:\n\n```cpp\nterminal.print();   // Print values, like Serial.print\nterminal.println(); // Print values, like Serial.println()\nterminal.write();   // Write a raw data buffer\nterminal.flush();   // Ensure that data was sent out of device\nterminal.clear();   // Erase all values in the terminal\n```\n\n![](.gitbook/assets/terminal.png)\n\n![](.gitbook/assets/terminal_edit.png)\n\n**Sketch:** [Terminal](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Terminal/Terminal.ino)\n\n### Video Streaming\n\nSimple widget that allows you to display any live stream. Widget supports RTSP \\(RP, SDP\\), HTTP/S progressive streaming, HTTP/S live streaming. For more info please follow [official Android documentation](https://developer.android.com/guide/appendix/media-formats.html).\n\nAt the moment Blynk doesn't provide streaming servers. So you can either stream directly from camera, use 3-d party services or host streaming server on own server \\(on raspberry for example\\).\n\nYou can also change video url from hardware with:\n\n```cpp\nBlynk.setProperty(V1, \"url\", \"http://my_new_video_url\");\n```\n\n### Level Display\n\nLevel Display is very similar to progress bar, when you need to visualize a level betwen min/max value To update Level Display from hardware side with code:\n\n```cpp\nBlynk.virtualWrite(V1, val);\n```\n\nEvery message that hardware sends to server is stored automatically on server. PUSH mode doesn't require application to be online or opened.\n\n**Sketch:** [Push Example](https://github.com/blynkkk/blynk-library/blob/master/examples/GettingStarted/PushData/PushData.ino)\n\n## Notifications\n\n### Twitter\n\nTwitter widget connects your Twitter account to Blynk and allows you to send Tweets from your hardware.\n\n![](.gitbook/assets/TwitterON.png)\n\nExample code:\n\n```cpp\nBlynk.tweet(\"Hey, Blynkers! My Arduino can tweet now!\");\n```\n\nLimitations:\n\n* you cant' send 2 tweets with same message \\(it's Twitter policy\\)\n* only 1 tweet per 5 seconds is allowed\n\n**Sketch:** [Twitter](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Twitter/Twitter.ino)\n\n### Email\n\nEmail widget allows you to send email from your hardware to any address.\n\nExample code:\n\n```cpp\nBlynk.email(\"my_email@example.com\", \"Subject\", \"Your message goes here\");\n```\n\nIt also contains `to` field. With this field you may define receiver of email in the app. You may skip `to` field when you want to send email to your Blynk app login email:\n\n```cpp\n Blynk.email(\"Subject\", \"Your message goes here\");\n```\n\nYou can send either `text/html` or `text/plain` \\(some clients don't support `text/html`\\) email. You can change this content type of email in the Mail widget settings.\n\nAdditionally you may use `{DEVICE_NAME}`, `{DEVICE_OWNER_EMAIL}` and `{VENDOR_EMAIL}` \\(for the local server\\) placeholders in the mail for the `to`, `subject` and `body` fields:\n\n```cpp\nBlynk.email(\"{DEVICE_OWNER_EMAIL}\", \"{DEVICE_NAME} : Alarm\", \"Your {DEVICE_NAME} has critical error!\");\n```\n\n![](.gitbook/assets/mail.png)\n\nLimitations:\n\n* Maximum allowed email + subject + message length is 120 symbols. However you can increase this limit if necessary \n\n  by adding `#define BLYNK_MAX_SENDBYTES XXX` to you sketch. Where `XXX` is desired max length of your email. \n\n  For example for ESP you can set this to 1200 max length `#define BLYNK_MAX_SENDBYTES 1200`. The \n\n  `#define BLYNK_MAX_SENDBYTES 1200` must be included before any of the Blynk includes.\n\n* Only 1 email per 5 seconds is allowed\n* In case you are using gmail on the Local Server you are limited with 500 mails per day \\(by google\\). Other providers may have similar\n\n  limitations, so please be careful.\n\n* User is limited with 100 messages per day in the Blynk Cloud;\n\n**Sketch:** [Email](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Email/Email.ino)\n\n### Push Notifications\n\nPush Notification widget allows you to send push notification from your hardware to your device. Currently it also contains 2 additional options:\n\n* **Notify when hardware offline** - you will get push notification in case your hardware went offline.\n* **Offline Ignore Period** - defines how long hardware could be offline \\(after it went offline\\) before sending notification. \n\n  In case period is exceeded - \"hardware offline\" notification will be send. You will get no notification in case hardware \n\n  was reconnected within specified period.\n\n* **Priority** high priority gives more chances that your message will be delivered without any delays. \n\n  See detailed explanation [here](https://developers.google.com/cloud-messaging/concept-options#setting-the-priority-of-a-message). \n\n**WARNING**: high priority contributes more to battery drain compared to normal priority messages.\n\n![](.gitbook/assets/push.png)\n\nExample code:\n\n```cpp\nBlynk.notify(\"Hey, Blynkers! My hardware can push now!\");\n```\n\nYou can also use placeholder for device name, that will be replaced on the server with your device name:\n\n```cpp\nBlynk.notify(\"Hey, Blynkers! My {DEVICE_NAME} can push now!\");\n```\n\nLimitations:\n\n* Maximum allowed body length is 120 symbols;\n* Every device can send only 1 notification every 5 seconds;\n\n**Sketch:** [PushNotification](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/PushNotification/PushNotification_Button/PushNotification_Button.ino)\n\n### Unicode in notify, email, push, ...\n\nThe library handles all strings as UTF8 Unicode. If you're facing problems, try to print your message to the Serial and see if it works \\(the terminal should be set to UTF-8 encoding\\). If it doesn't work, probably you should read about unicode support of your compiler.  \nIf it works, but your message is truncated - you need to increase message length limit \\(all Unicode symbols consume at least twice the size of Latin symbols\\).\n\n### Increasing message length limit\n\nYou can increase maximum message length by putting on the top of your sketch \\(before Blynk includes\\):\n\n```cpp\n#define BLYNK_MAX_SENDBYTES 256 // Default is 128\n```\n\n## Interface\n\n### Tabs\n\nThe only purpose of Tabs widget is to extend your project space. You can have up to 4 tabs. Also you can drag widgets between tabs. Just drag widget on the label of required tab of tabs widget.\n\n![](.gitbook/assets/tabs_settings.png)\n\n### Menu\n\nMenu widget allows you to send command to your hardware based on selection you made on UI. Menu sends index of element you selected and not label string. Sending index is starts from 1. It works same way as usual ComboBox element. You can also set Menu items [from hardware side](./#blynk-main-operations-change-widget-properties).\n\n![](.gitbook/assets/menu_edit.png)\n\nExample code:\n\n```text\nswitch (param.asInt())\n  {\n    case 1: { // Item 1\n      Serial.println(\"Item 1 selected\");\n      break;\n    }\n    case 2: { // Item 2\n      Serial.println(\"Item 2 selected\");\n      break;\n    }    \n  }\n```\n\n**Sketch:** [Menu](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Menu/Menu.ino)\n\n### Time Input\n\nTime input widget allows you to select start/stop time, day of week, timezone, sunrise/sunset formatted values and send them to your hardware. Supported formats for time now are `HH:MM` and `HH:MM AM/PM`.\n\nHardware will get selected on UI time as seconds of day \\(`3600 * hours + 60 * minutes`\\) for start/stop time. Time that widget sends to hardware is user local time. Selected days indexes:\n\n```text\nMonday - 1\nTuesday - 2\n...\nSaturday - 6\nSundays - 7\n```\n\nYou can also change state of widget on UI. See below sketches.\n\n**Sketch:** [Simple Time Input for start time](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/SimpleTimeInput/SimpleTimeInput.ino)\n\n**Sketch:** [Advanced Time Input](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/AdvancedTimeInput/AdvancedTimeInput.ino)\n\n**Sketch:** [Update Time Input State on UI](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/TimeInput/UpdateTimeInputState/UpdateTimeInputState.ino)\n\n### Map\n\nMap widget allows you set points/pins on map from hardware side. This is very useful widget in case you have multiple devices and you want track their values on map.\n\nYou can send a point to map with regular virtual wrtei command:\n\n```cpp\nBlynk.virtualWrite(V1, pointIndex, lat, lon, \"value\");\n```\n\nWe also created wrapper for you to make suage of map simpler:\n\nYou can change button labels from hardware with:\n\n```cpp\nWidgetMap myMap(V1);\n...\nint index = 1;\nfloat lat = 51.5074;\nfloat lon = 0.1278;\nmyMap.location(index, lat, lon, \"value\");\n```\n\nUsing save `index` allows you to override existing point value.\n\n**Sketch:** [Basic Sketch](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Map/Map.ino)\n\n### Table\n\nTable widget comes handy when you need to structure similar data within 1 graphical element. It works as a usual table.\n\nYou can add a row to the table with:\n\n```text\nBlynk.virtualWrite(V1, \"add\", id, \"Name\", \"Value\");\n```\n\nYou can update a row in the table with:\n\n```text\nBlynk.virtualWrite(V1, \"update\", id, \"UpdatedName\", \"UpdatedValue\");\n```\n\nTo highlight any item in a table by using it's id in a table:\n\n```text\nBlynk.virtualWrite(V1, \"pick\", 0);\n```\n\nTo select/deselect \\(make icon green/grey\\) item in a table by using it's row id in a table:\n\n```text\nBlynk.virtualWrite(V1, \"select\", 0);\nBlynk.virtualWrite(V1, \"deselect\", 0);\n```\n\nTo clear the table at any time with:\n\n```text\nBlynk.virtualWrite(V1, \"clr\");\n```\n\nYou can also handle other actions coming from table. For example, use row as a switch button.\n\n```text\nBLYNK_WRITE(V1) {\n   String cmd = param[0].asStr();\n   if (cmd == \"select\") {\n       //row in table was selected. \n       int rowId = param[1].asInt();\n   }\n   if (cmd == \"deselect\") {\n       //row in table was deselected. \n       int rowId = param[1].asInt();\n   }\n   if (cmd == \"order\") {\n       //rows in table where reodered\n       int oldRowIndex = param[1].asInt();\n       int newRowIndex = param[2].asInt();\n   }\n}\n```\n\n**Note:** Max number of rows in the table is 100. When you reach the limit, table will work as FIFO \\(First In First Out\\) list. This limit can be changed by configuring `table.rows.pool.size` property for Local Server.\n\n**Sketch:** [Simple Table usage](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Table/Table_Simple/Table_Simple.ino)\n\n**Sketch:** [Advanced Table usage](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Table/Table_Advanced/Table_Advanced.ino)\n\n### Device Selector\n\nDevice selector is a powerful widget which allows you to update widgets based on one active device. This widget is particlularly helpful when you have a fleet of devices with similar functionality.\n\nImagine you have 4 devices and every device has a Temperature & Humidity sensor connected to it. To display the data for all 4 devices you would need to add 8 widgets.\n\nWith Device Selector, you can use only 2 Widgets which will display Temperature and Humidity based on the active device chosen in Device Selector.\n\nAll you have to do is:\n\n1. Add Device Selector Widget to the project\n2. Add 2 widgets \\(for example Value Display Widget\\) to show Temperature and Humidity\n3. In Widgets Settings you will be able assign them to Device Selector \\(Source or Target section\\)\n4. Exit settings, Run the project. \n\nNow you can change the active device in Device Selector and you will see that Temperature and Humidity values are reflecting the data updates for the device you just picked.\n\n**NOTE:** Webhook Widget will not work with Device Selector \\(yet\\).\n\n### Device Tiles\n\nDevice tiles is a powerful widget and very similar to the device selector widget, but with UI. It allows you to display 1 pin per device per tile. This widget is particularly helpful when you have a fleet of devices with similar functionality. So you can group similar devices within one layout \\(template\\).\n\n## Sensors\n\n### Accelerometer\n\nAccelerometer is kind of [motion sensors](https://developer.android.com/guide/topics/sensors/sensors_motion.html) that allows you to detect motion of your smartphone. Useful for monitoring device movement, such as tilt, shake, rotation, or swing. Conceptually, an acceleration sensor determines the acceleration that is applied to a device by measuring the forces that are applied to the sensor. Measured in `m/s^2` applied to `x`, `y`, `z` axis.\n\nIn order to accept data from it you need to:\n\n```cpp\nBLYNK_WRITE(V1) {\n  //acceleration force applied to axis x\n  int x = param[0].asFloat(); \n  //acceleration force applied to axis y\n  int y = param[1].asFloat();\n  //acceleration force applied to axis y\n  int z = param[2].asFloat();\n}\n```\n\nAccelerometer doesn't work in background.\n\n### Barometer/pressure\n\nBarometer/pressure is kind of [environment sensors](https://developer.android.com/guide/topics/sensors/sensors_environment.html) that allows you to measure the ambient air pressure.\n\nMeasured in in `hPa` or `mbar`.\n\nIn oder to accept data from it you need to:\n\n```cpp\nBLYNK_WRITE(V1) {\n  //pressure in mbar\n  int pressure = param[0].asInt(); \n}\n```\n\nBarometer doesn't work in background.\n\n### Gravity\n\nGravity is kind of [motion sensors](https://developer.android.com/guide/topics/sensors/sensors_motion.html) that allows you to detect motion of your smartphone. Useful for monitoring device movement, such as tilt, shake, rotation, or swing.\n\nThe gravity sensor provides a three dimensional vector indicating the direction and magnitude of gravity. Measured in `m/s^2` of gravity force applied to `x`, `y`, `z` axis.\n\nIn oder to accept data from it you need to:\n\n```cpp\nBLYNK_WRITE(V1) {\n  //force of gravity applied to axis x\n  int x = param[0].asFloat(); \n  //force of gravity applied to axis y\n  int y = param[1].asFloat();\n  //force of gravity applied to axis y\n  int z = param[2].asFloat();\n}\n```\n\nGravity doesn't work in background.\n\n### Humidity\n\nHumidity is kind of [environment sensors](https://developer.android.com/guide/topics/sensors/sensors_environment.html) that allows you to measure ambient relative humidity.\n\nMeasured in `%` - actual relative humidity in percent.\n\nIn oder to accept data from it you need to:\n\n```cpp\nBLYNK_WRITE(V1) {\n  // humidity in %\n  int humidity = param.asInt();\n}\n```\n\nHumidity doesn't work in background.\n\n### Light\n\nLight is kind of [environment sensors](https://developer.android.com/guide/topics/sensors/sensors_environment.html) that allows you to measure level of light \\(measures the ambient light level \\(illumination\\) in lx\\). In phones it is used to control screen brightness.\n\nIn order to accept data from it you need to:\n\n```cpp\nBLYNK_WRITE(V1) {\n  //light value\n  int lx = param.asInt(); \n}\n```\n\nLight doesn't work in background.\n\n### Proximity\n\nProximity is kind of [position sensors](https://developer.android.com/guide/topics/sensors/sensors_position.html) that allows you to determine how close the face of a smartphone is to an object. Measured in `cm` - distance from phone face to object. However most of this sensors returns only FAR / NEAR information. So return value will be `0/1`. Where 0/LOW is `FAR` and 1/HIGH is `NEAR`.\n\nIn order to accept data from it you need to:\n\n```cpp\nBLYNK_WRITE(V1) {\n  // distance to object\n  int proximity = param.asInt();\n  if (proximity) {\n     //NEAR\n  } else {\n     //FAR\n  }\n}\n```\n\nProximity doesn't work in background.\n\n### Temperature\n\nTemperature is kind of [environment sensors](https://developer.android.com/guide/topics/sensors/sensors_environment.html) that allows you to measure ambient air temperature. Measured in `°C` - celcius.\n\nIn order to accept data from it you need to:\n\n```cpp\nBLYNK_WRITE(V1) {\n  // temperature in celcius\n  int celcius = param.asInt();\n}\n```\n\nTemperature doesn't work in background.\n\n### GPS Trigger\n\nGPS trigger widget allows easily trigger events when you arrive to or leave from some destination. This widget will work in background and periodically will check your coordinates. In case your location is within/out required radius \\(selected on widget map\\) widget will send `HIGH`/`LOW` command to hardware. For example, let's assume you have GPS Trigger widget assigned to pin `V1` and option `Trigger When Enter`. In that case when you'll arrive to destination point widget will trigger `HIGH` event.\n\n```cpp\nBLYNK_WRITE(V1) {\n  int state = param.asInt();\n  if (state) {\n      //You enter destination\n  } else {\n      //You leave destination\n  }\n}\n```\n\nMore details on how GPS widget works you can read [here](https://developer.android.com/guide/topics/location/strategies.html).\n\nGPS trigger widget works in background.\n\n### GPS Streaming\n\nUseful for monitoring smartphone location data such as latitude, longitude, altitude and speed \\(speed could be often 0  \nin case smartphone doesn't support it\\).\n\nIn order to accept data from this widget you need to:\n\n```cpp\nBLYNK_WRITE(V1) {\n  float latitude = param[0].asFloat(); \n  float longitude = param[1].asFloat();\n  float altitude = param[2].asFloat();\n  float speed = param[3].asFloat();\n}\n```\n\nor you can use prepared wrapper `GpsParam`:\n\n```cpp\nBLYNK_WRITE(V1) {\n  GpsParam gps(param);\n  // Print 6 decimal places for Lat\n  Serial.println(gps.getLat(), 7);\n  Serial.println(gps.getLon(), 7);\n\n  Serial.println(gps.getAltitude(), 2);\n  Serial.println(gps.getSpeed(), 2);\n}\n```\n\nGPS Streaming works in background.\n\n**Sketch:** [GPS Stream](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/GPS_Stream/GPS_Stream.ino)\n\n## Other\n\n### Bridge\n\nBridge can be used for Device-to-Device communication \\(no app. involved\\). You can send digital/analog/virtual write commands from one device to another, knowing it's auth token. At the moment Bridge widget is not required on application side \\(it is mostly used for indication that we have such feature\\).  \n**You can use multiple bridges to control multiple devices.**\n\n![](.gitbook/assets/bridge.png)\n\nBridge widget takes a virtual pin, and turns it into a channel to control another device. It means you can control any virtual, digital or analog pins of the target device. Be careful not to use pins like `A0, A1, A2 ...` when communicating between different device types, as Arduino Core may refer to wrong pins in such cases.\n\nExample code for device A which will send values to device B:\n\n```cpp\nWidgetBridge bridge1(V1); //Initiating Bridge Widget on V1 of Device A\n...\nvoid setup() {\n    Blynk.begin(...);\n    while (Blynk.connect() == false) {\n        // Wait until Blynk is connected\n    }\n    bridge1.digitalWrite(9, HIGH); // will trigger D9 HIGH on Device B. No code on Device B required\n    bridge1.analogWrite(10, 123);\n    bridge1.virtualWrite(V1, \"hello\"); // you need to write code on Device B in order to receive this value. See below\n    bridge1.virtualWrite(V2, \"value1\", \"value2\", \"value3\");\n}\n\nBLYNK_CONNECTED() {\n  bridge1.setAuthToken(\"OtherAuthToken\"); // Token of the hardware B\n}\n```\n\n**IMPORTANT:** when performing `virtualWrite()` with Bridge Widget, Device B would need to process the incoming data from Device A. For example, if you are sending value from Device A to Device B using `bridge.virtualWrite(V5)` you would need to use this handler on Device B:\n\n```cpp\nBLYNK_WRITE(V5){\n    int pinData = param.asInt(); //pinData variable will store value that came via Bridge\n}\n```\n\nKeep in mind that `bridge.virtualWrite` doesn't send any value to mobile app. You need to call `Blynk.virtualWrite` for that.\n\n**Sketch:** [Bridge](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Bridge/Bridge.ino)\n\n### Eventor\n\nEventor widget allows you to create simple behaviour rules or **events**. Let's look at a typical use case: read temperature from DHT sensor and send push notification when the temperature is over a certain limit:\n\n```cpp\n  float t = dht.readTemperature();\n  if (isnan(t)) {\n    return;\n  }\n  if (t > 40) {\n    Blynk.notify(String(\"Temperature is too high: \") + t);\n  }\n```\n\nWith Eventor you don't need to write this code. All you need is to send the value from the sensor to the server:\n\n```cpp\n  float t = dht.readTemperature();\n  Blynk.virtualWrite(V0, t);\n```\n\nDon't forget that `virtualWrite` commands should be wrapped in the timer and can't be used in the main loop.\n\nNow configure new **Event** in Eventor widget:\n\n![](.gitbook/assets/eventor_for_temp_example.png)\n\n**NOTE** Don't forget to add notification widget.\n\nEventor comes handy when you need to change conditions on the fly without re-uploading new sketch on the hardware. You can create as many **events** as you need. Eventor also could be triggered from the application side. You just need to assign the widget to the same pin as your Event within Eventor. Eventor doesn't constantly sends events. Let's consider simple event as above `if (temperature > 40) send notification`. When temperature goes beyond 40 threshold - notification action is triggered. If temperature continues to stay above the 40 threshold no actions will be triggered. But if `temperature` goes below threshold and then passes it again - notification will be sent again \\(there is no 5 sec limit on Eventor notifications\\).\n\nEventor also supports Timer events. For example, you can set a pin `V1` ON/HIGH at 21:00:00 every Friday. With Eventor Time Event you can assign multiple timers on same pin, send any string/number, select days and timezone.\n\nIn order to remove created **event** please use swipe. You can also swipe out last element in the Event itself.\n\n**NOTE:** The timer widget rely on the server time and not your phone time. Sometimes the phone time may not match the server time. **NOTE:** Events are triggered only once when the condition is met. That's mean [chaining of events](https://community.blynk.cc/t/eventor-behavior-bug-feature/20962) is not possible \\(however, could be enabled for commercials\\).\n\n![](.gitbook/assets/eventor_edit.png)\n\n**Sketch:** [Eventor](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Eventor/Eventor.ino)\n\n**NOTE:**: Events are triggered only once when the condition is met. Exception: Let's consider simple event as above `if (temperature > 40) send notification`. When temperature goes beyond 40 threshold - notification action is triggered. If temperature continues to stay above the 40 threshold no actions will be triggered. But if `temperature` goes below threshold and then passes it again - notification will be sent again \\(there is no 5 sec limit on Eventor notifications\\).\n\n### RTC\n\nReal-time clock allows you to get time from server. You can preselect any timezone on UI to get time on hardware in required locale. No pin required for RTC widget.\n\n![](.gitbook/assets/rtc_edit.png)\n\n**Sketch:** [RTC](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/RTC/RTC.ino)\n\n### BLE\n\nWidget to enable Bluetooth Low Energy support. At the moment BLE widget requires internet connection in order to login and load your profile. However this will be fixed soon. Also some Blynk widgets are not supported within the BLE connection.\n\nBlynk currently supports a handful of different BLE modules. Please check sketches below.\n\n**Sketches:** [BLE](https://github.com/blynkkk/blynk-library/tree/master/examples/Boards_Bluetooth)\n\n### Bluetooth\n\nWidget to enable Bluetooth support. At the moment Bluetooth widget is supported only on Android and requires internet connection to login and to load your profile. This will be fixed soon. Alsom some Blynk widgets do not work within the Bluetooth connection.\n\nBlynk currently supports bunch of different modules. Please check sketches below.\n\n**Sketches:** [Bluetooth](https://github.com/blynkkk/blynk-library/tree/master/examples/Boards_Bluetooth)\n\n### Music Player\n\nSimple UI element with 3 buttons with common music player controls. Every button sends it's own command to hardware: `play`, `stop`, `prev`, `next`.\n\nYou can change widget state within the app from hardware side with next commands:\n\n```text\nBlynk.virtualWrite(Vx, “play”);\nBlynk.virtualWrite(Vx, “stop”);\n```\n\nYou can also change widget play/stop state with next code \\(equivalent to above commands\\):\n\n`Blynk.setProperty(V1, \"isOnPlay\", \"false\");`\n\n**Sketch:** [Music Player](https://github.com/blynkkk/blynk-library/blob/master/examples/Widgets/Player/Player.ino)\n\n### Webhook\n\nWebhook is a widget designed to communicate with 3rd party services. With Webhook widget you can send HTTP\\(S\\) requests to any 3rd party service or device that has HTTP\\(S\\) API \\(e.g. Philips Hue bulb\\). You can trigger 3-d party service with a single click of a button.\n\nAny `write` operation from hardware side will trigger Webhook Widget. You can also trigger webhook from Blynk app when a app widget is assigned to the same pin as Webhook.\n\nFor example, when you need to send data from your hardware not only to Blynk, but also to Thingspeak, you would need to write a long http request code like this \\(this is just an example, not a full sketch\\):\n\n```text\nWiFiClient client;\nif (client.connect(\"api.thingspeak.com\", 80)) {\n    client.print(\"POST /update HTTP/1.1\\n\");\n    client.print(\"Host: api.thingspeak.com\\n\");\n    client.print(\"Connection: close\\n\");\n    client.print(\"X-THINGSPEAKAPIKEY: \" + apiKeyThingspeak1 + \"\\n\");\n    client.print(\"Content-Type: application/x-www-form-urlencoded\\n\");\n    client.print(\"Content-Length: \");\n    client.print(postStr.length());\n    client.print(\"\\n\\n\");\n    client.print(postStr);\n}\n```\n\nInstead, with Webhook widget you would only need to fill in these fields:\n\n![](.gitbook/assets/webhook_settings.png)\n\nAnd add this code on hardware side:\n\n```text\nBlynk.virtualWrite(V0, value);\n```\n\nwhere `V0` is pin assigned to the Webhook widget.\n\nUse standard Blynk placeholders for Pin Value in the body or URL, for example:\n\n```text\nhttps://api.thingspeak.com/update?api_key=xxxxxx&field1=/pin/\n```\n\nor for the body\n\n```text\n[\"/pin/\"]\n```\n\nWhen you need to send an array of values, you can refer to a specific index of the array value. Blynk Pin can hold an array of max 10 values:\n\n`/pin[0]/`,`/pin[1]/`, `/pin[2]/`\n\nYou can also make GET requests from Blynk Server and get responses directly to your hardware.\n\nFor example, to get current weather from a 3rd party Weather service that uses an URL similar to this: `http://api.sunrise-sunset.org/json?lat=33.3823&lng=35.1856&date=2016-10-01`, you would need to put this URL in Webhook widget and assign it to `V0` pin.\n\nTo parse the response on the hardware side:\n\n```text\nBLYNK_WRITE(V0){\n  String webhookdata = param.asStr();\n  Serial.println(webhookdata);\n}\n```\n\nNow, every time there is a \"write\" command to `V0` pin \\(e.g. with `Blynk.virtualWrite(V0, 1)` from hardware or from app widget assigned to `V0`\\), `BLYNK_WRITE(V0)` construction will be triggered and processed.\n\n**NOTE:** Usually, 3rd party servers return long responses. You have to increase the maximum allowed message size your hardware can process. Modify this line in your firmware code:\n\n`#define BLYNK_MAX_READBYTES 1024`. Where `1024` - is maximum allowed message size.\n\n**NOTE:** Blynk Cloud has limitation for Webhook Widget - you can only send 1 request per second. This can be changed on a Local Server by changing `webhooks.frequency.user.quota.limit`. Be careful with Webhooks, as many 3rd party services can't handle 1 req/sec, and you can be banned on some of them. For example, Thingspeak allows only 1 request per 15 seconds.\n\n**NOTE:** To avoid spamming, Blynk Webhook feature has another limitation - if your Webhook requests fail 10 times in a row, Webhook Widget will be stopped. To resume it, you would need to open Widget Settings and re-save it. Failed request is a request that doesn't return `200` or `302`.\n\n**NOTE:** Webhook widget may affect `Blynk.syncAll()` function when a returned response is large.\n\n### Reports Widget\n\nFunction of Reports is to configure and customize data reports in CSV format. You can choose between one-time or continuous scheduled reports.\n\nAlso, within the Reports you can clear all the data collected by your devices.\n\nYou need to configure initial inputs in Edit mode, and then, in Play mode you will be able to customize reports.\n\n#### Edit mode. Data inputs configuration\n\nIn edit mode \\(when your project is stopped\\) you define the Datastreams you would like to later be included in reports. Reports widget is designed to work with the Device Tiles widget. If you don't use Device Tiles you can still select a single device or a group of devices as a source of data for reports.\n\nYou have to choose either Device Tiles or single / group of the devices for the report. You can't combine these 2 options.\n\n#### Play mode.\n\nAfter you added source devices and their Datastreams click Play button and click on the Reports button.\n\n### Customizing Reports.\n\nEvery Report option supposes it's own settings:\n\n`Report name` - give your report a meaningful name.\n\n`Data source` - select the Datastreams you would like to be included in reports.\n\n`Report Frequency` - Defines how often reports will be sent. They can be one-time and scheduled. `one-time` - will instantly generate report and send it to the email addresses specified. Click on the right icon to send it.\n\nScheduled reports can be sent `daily`/`weekly`/`monthly`.\n\n`At Time` will set up a time of the day the report will be sent. `Start`/`End` specifies start and end date the reports will continue to be sent.\n\nFor Weekly Report you can select a day of the week when report should be sent. For Monthly report you can choose whether to send report on the first or last day of the month.\n\n`Recipients` - specify up to 5 email addresses.\n\n`Data resolution` defines granularity of your reports. Supported granularities are: `minute`, `hourly` and `daily`. For example, when you generate daily report with 1 minute granularity you'll get `24 * 60 * 60` points in your daily report for every selected Datastream.\n\n`Group data in reports by` - specify the output format of the CSV file\\(s\\).\n\n`Datastream` you will get 1 CSV file for each Datastream.\n\n`Device` you will get 1 CSV file per each device. Each file will contain all of the included Datastreams.\n\n`Report` you will get 1 CSV file for all your devices and all your Datastreams.\n\n`Timezone correction` - specify the time zone adjustment if you need to get report date and time adjusted to a specific time zone\n\n`Date and time format` - defines the format of the timestamp field of your data. You can select `2018-06-21 20:16:48`, `2018-06-21T20:16:48+03:00` or other supported formats.\n\nThere is one specific `Timestamp` format - which reflects the difference between the current time and midnight, January 1, 1970 UTC measured in milliseconds.\n\nAfter the report is set up - click on \"OK\" button at the right upper corner. Your report is ready.\n\nOnce you configured the report you will see when is the `Next` report scheduled and also a schedule for this report.\n\nAfter the report was sent at least once, you can see when the `Last` report was sent.\n\n`Last` label also contains the status regarding the report:\n\n* `OK`: the report was generated and sent to the Recipients successfully;\n* `No Data`: the report doesn't contain any data for the configured period;\n* `Error`: something went wrong. Please contact the Blynk Team support;\n\nReports will be generated even if your project is not in active \\(Play\\) mode. However, inactive projects don't generate any data.\n\n**NOTE:** all reports are encoded in UTF-16. Please, make sure you selected UTF-16 as required \"Character set\" for your csv reader.\n\n"
  }
]