diff --git a/.travis.yml b/.travis.yml index ae3839b..c2af5ca 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,15 +3,15 @@ before_install: - "/sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_1.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :1 -ac -screen 0 1280x1024x16" - sleep 3 - export DISPLAY=:1.0 - - wget http://downloads.arduino.cc/arduino-1.8.10-linux64.tar.xz + - wget http://downloads.arduino.cc/arduino-1.8.12-linux64.tar.xz - wget https://github.com/me-no-dev/ESPAsyncWebServer/archive/master.zip - unzip master.zip - sudo rm master.zip - wget https://github.com/me-no-dev/ESPAsyncTCP/archive/master.zip - unzip master.zip - rm master.zip - - tar xf arduino-1.8.10-linux64.tar.xz - - sudo mv arduino-1.8.10 /usr/local/share/arduino + - tar xf arduino-1.8.12-linux64.tar.xz + - sudo mv arduino-1.8.12 /usr/local/share/arduino - sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino install: - ls -l @@ -19,7 +19,7 @@ install: - mv ESPAsyncTCP-master/ /usr/local/share/arduino/libraries/ - ln -s $PWD /usr/local/share/arduino/libraries/ - arduino --pref "boardsmanager.additional.urls=http://arduino.esp8266.com/stable/package_esp8266com_index.json" --save-prefs - - arduino --install-library "ArduinoJson","Adafruit BMP280 Library","DHT sensor library","ThingSpeak","Adafruit Unified Sensor","PubSubClient" + - arduino --install-library "ArduinoJson","Adafruit BMP280 Library","DHT sensor library","ThingSpeak","Adafruit Unified Sensor","OneWire","DallasTemperature","PubSubClient" - arduino --install-boards esp8266:esp8266 script: - "echo $PWD" diff --git a/README.md b/README.md index 975441d..6110603 100644 --- a/README.md +++ b/README.md @@ -38,3 +38,12 @@ Gotowe zestawy części potrzebnych do zbudowania własnego Smogly, dostępne s [Instrukcja instalacji oprogramowania wymaganego do kompilacji oprogramowania z repozytorium](https://github.com/hackerspace-silesia/Smogomierz/blob/master/instrukcje/software.md) + +## Roadmap + +Główne zmiany planowane w kolejnych aktualizacjach. Poza wymienionymi poniżej zmianami, przy każdej aktualizacji staram się aktualizować wsyzstkie biblioteki i eliminować znalezione błędy. + ++ [x] 2.7.6 - Aktualizacja bibliotek, drobne poprawki w działaniu, ekstremalna optymalizacja wykorzystywanej pamięci oraz dodanie wsparcia dla miernika temperatury - DS18b20 ++ [x] 2.7.8 - Dodanie możliwości zmiany pinów dla mierników temperatury oraz poziomu pyłu ++ [ ] 2.8.0 - Jednoczesna obsługa dla dwóch mierników temperatury/wilgotności/ciśneinia oraz możliwość wyboru które dane mają być wykorzystywane ++ [ ] 2.8.5 - Możliwość wysyłania wszystkich danych z obu mierników temperatury/wilgotności/ciśneinia do zewnętrznych baz danych \ No newline at end of file diff --git a/Smogomierz.ino b/Smogomierz.ino index 2a11122..20a7c77 100644 --- a/Smogomierz.ino +++ b/Smogomierz.ino @@ -1,3 +1,8 @@ +/* + ESP8266 core for Arduino - 2.6.3 + Arduino core for the ESP32 - 1.0.4 +*/ + // ****** CHOOSE(uncomment) ONLY ONE!!! ****** #define DUSTSENSOR_PMS5003_7003_BME280_0x76 // PMS5003 / PMS7003 - BME280_0x76 @@ -21,6 +26,7 @@ SHT1x: VIN - 3V; GND - G; SCL - D5; DATA/SDA - D6 wymaga rezystora 10k podłaczonego do VCC SHT21/HTU21D: VIN - 3V; GND - G; SCL - D5; SDA - D6 DHT22: VIN - 3V; GND - G; D7 + DS18B20: VIN - 3V; GND - G; D5 - 4.7k Ohm resistor! PMS5003/7003: VIN - VIN/5V; GND - G; Zielony/TX - D1; Niebieski/RX - D2 HPMA115S0: VIN - VIN/5V; GND - G; TX - D1; RX - D2 SDS011/21: VIN - 5V; GND - G; TX - D1; RX - D2 @@ -31,6 +37,7 @@ SHT1x: VIN - 3V; GND - G; SCL - D5; DATA/SDA - D6 required pull-up resistor 10k to VCC SHT21/HTU21D: VIN - 3V; GND - G; SCL - D5; SDA - D6 DHT22: VIN - 3V; GND - G; D7 + DS18B20: VIN - 3V; GND - G; D5 - 4.7k Ohm resistor! PMS5003/7003: VIN - VIN/5V; GND - G; Green/TX - D1; Blue/RX - D2 HPMA115S0: VIN - VIN/5V; GND - G; TX - D1; RX - D2 SDS011/21: VIN - 5V; GND - G; TX - D1; RX - D2 @@ -44,6 +51,7 @@ SHT1x: VIN - 3V; GND - G; SCL - D5; DATA/SDA - D6 wymaga rezystora 10k podłaczonego do VCC SHT21/HTU21D: VIN - 3V; GND - G; SCL - D5; SDA - D6 DHT22: VIN - 3V; GND - G; D7 + DS18B20: VIN - 3V; GND - G; D5 - 4.7k Ohm resistor! PMS5003/7003: VIN - VIN/5V; GND - G; TX - D5; RX - D4 HPMA115S0: VIN - VIN/5V; GND - G; TX - D1; RX - D2 SDS011/21: VIN - 5V; GND - G; TX - D5; RX - D4 @@ -54,6 +62,7 @@ SHT1x: VIN - 3V; GND - G; SCL - D5; DATA/SDA - D6 required pull-up resistor 10k to VCC SHT21/HTU21D: VIN - 3V; GND - G; SCL - D5; SDA - D6 DHT22: VIN - 3V; GND - G; D7 + DS18B20: VIN - 3V; GND - G; D5 - 4.7k Ohm resistor! PMS5003/7003: VIN - VIN/5V; GND - G; TX - D5; RX - D4 HPMA115S0: VIN - VIN/5V; GND - G; TX - D1; RX - D2 SDS011/21: VIN - 5V; GND - G; TX - D5; RX - D4 @@ -63,20 +72,17 @@ /* ESP8266 PMS7003/BME280_0x76 - NodeMCU 1.0 - 1M SPIFFS --- FS:1MB OTA: ~1019KB - Szkic używa 541500 bajtów (51%) pamięci programu. Maksimum to 1044464 bajtów. - Zmienne globalne używają 56072 bajtów (68%) pamięci dynamicznej, pozostawiając 25848 bajtów dla zmiennych lokalnych. Maksimum to 81920 bajtów. - - Szkic używa 550524 bajtów (52%) pamięci programu. Maksimum to 1044464 bajtów. - Zmienne globalne używają 57168 bajtów (69%) pamięci dynamicznej, pozostawiając 24752 bajtów dla zmiennych lokalnych. Maksimum to 81920 bajtów. - Szkic używa 558756 bajtów (53%) pamięci programu. Maksimum to 1044464 bajtów. Zmienne globalne używają 56176 bajtów (68%) pamięci dynamicznej, pozostawiając 25744 bajtów dla zmiennych lokalnych. Maksimum to 81920 bajtów. + Szkic używa 572208 bajtów (54%) pamięci programu. Maksimum to 1044464 bajtów. + Zmienne globalne używają 58404 bajtów (71%) pamięci dynamicznej, pozostawiając 23516 bajtów dla zmiennych lokalnych. Maksimum to 81920 bajtów. + + Szkic używa 576496 bajtów (55%) pamięci programu. Maksimum to 1044464 bajtów. + Zmienne globalne używają 46608 bajtów (56%) pamięci dynamicznej, pozostawiając 35312 bajtów dla zmiennych lokalnych. Maksimum to 81920 bajtów. - ESP32 Dev Module PMS7003/BME280_0x76 - 1.9MB APP with OTA - 190KB SPIFFS - Szkic używa 1315258 bajtów (66%) pamięci programu. Maksimum to 1966080 bajtów. - Zmienne globalne używają 60296 bajtów (18%) pamięci dynamicznej, pozostawiając 267384 bajtów dla zmiennych lokalnych. Maksimum to 327680 bajtów. + ESP32 Dev Module PMS7003/BME280_0x76 - 1.9MB APP with OTA - 190KB SPIFFS Szkic używa 1322374 bajtów (67%) pamięci programu. Maksimum to 1966080 bajtów. Zmienne globalne używają 60752 bajtów (18%) pamięci dynamicznej, pozostawiając 266928 bajtów dla zmiennych lokalnych. Maksimum to 327680 bajtów. @@ -84,6 +90,9 @@ Szkic używa 1322374 bajtów (67%) pamięci programu. Maksimum to 1966080 bajtów. Zmienne globalne używają 60752 bajtów (18%) pamięci dynamicznej, pozostawiając 266928 bajtów dla zmiennych lokalnych. Maksimum to 327680 bajtów. + Szkic używa 1375786 bajtów (69%) pamięci programu. Maksimum to 1966080 bajtów. + Zmienne globalne używają 58664 bajtów (17%) pamięci dynamicznej, pozostawiając 269016 bajtów dla zmiennych lokalnych. Maksimum to 327680 bajtów. + */ #include "FS.h" @@ -166,6 +175,8 @@ #include #include +#include +#include // TEMP/HUMI/PRESS Sensor config - START // BME280 config @@ -174,9 +185,9 @@ char bufout[10]; BME280<> BMESensor; #elif defined ARDUINO_ARCH_ESP32 // VIN - 3V; GND - G; SCL - D17; SDA - D16 -#define I2C_SDA 16 -#define I2C_SCL 17 -Adafruit_BME280 bme(I2C_SDA, I2C_SCL); // I2C +//#define I2C_SDA = FIRST_THP_SDA +//#define I2C_SCL = FIRST_THP_SCL +Adafruit_BME280 bme(FIRST_THP_SDA, FIRST_THP_SCL); // I2C #endif // BMP280 config @@ -186,14 +197,19 @@ Adafruit_BMP280 bmp; //I2C HTU21D myHTU21D(HTU21D_RES_RH12_TEMP14); // DHT22 config -#define DHTPIN 13 // D7 on NodeMCU/WeMos board +//#define DHTPIN 13 // D7 on NodeMCU/WeMos board #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 -DHT dht(DHTPIN, DHTTYPE); +DHT dht(FIRST_THP_SDA, DHTTYPE); // SHT1x – Config -#define dataPin 14 //D5 -#define clockPin 12 //D6 -SHT1x sht1x(dataPin, clockPin); +//#define dataPin 14 //D5 +//#define clockPin 12 //D6 +SHT1x sht1x(FIRST_THP_SDA, FIRST_THP_SCL); + +// DS18B20 – Config +//const int DS18B20_WireBus = 14; //D5 +OneWire oneWire(FIRST_THP_SDA); +DallasTemperature DS18B20(&oneWire); // TEMP/HUMI/PRESS Sensor config - END // DUST Sensor config - START @@ -201,8 +217,11 @@ SHT1x sht1x(dataPin, clockPin); #ifdef DUSTSENSOR_PMS5003_7003_BME280_0x76 or DUSTSENSOR_PMS5003_7003_BME280_0x77 //***PMSx003 - START*** #ifdef ARDUINO_ARCH_ESP8266 -// SoftwareSerial PMS_Serial; -- only for esp8266 core 2.6.0 -SoftwareSerial PMS_Serial(5, 4); // Change TX - D1 and RX - D2 pins -- esp8266 core 2.6.1 or later +#ifdef ARDUINO_ESP8266_RELEASE_2_6_0 +SoftwareSerial PMS_Serial; // only for esp8266 core 2.6.0 +#else +SoftwareSerial PMS_Serial(DUST_TX, DUST_RX); // Change TX - D1 and RX - D2 pins -- esp8266 core 2.6.1 or later +#endif PMS pms(PMS_Serial); PMS::DATA data; #elif defined ARDUINO_ARCH_ESP32 @@ -215,7 +234,7 @@ PMS::DATA data; //***SDS0x1 - START*** #ifdef ARDUINO_ARCH_ESP8266 // SDS011/21 config -SdsDustSensor sds(5, 4); // Change TX - D1 and RX - D2 pins +SdsDustSensor sds(DUST_TX, DUST_RX); // Change TX - D1 and RX - D2 pins #elif defined ARDUINO_ARCH_ESP32 // SDS011/21 config HardwareSerial sds_port(2); // Change TX - D5 and RX - D4 pins @@ -227,7 +246,7 @@ float SDSpm25, SDSpm10; #elif defined DUSTSENSOR_HPMA115S0 //***HPMA115S0 - START*** #ifdef ARDUINO_ARCH_ESP8266 -SoftwareSerial hpmaSerial(5, 4); // TX/RX – D1/D2 +SoftwareSerial hpmaSerial(DUST_TX, DUST_RX); // TX/RX – D1/D2 HPMA115S0 hpma115S0(hpmaSerial); #elif defined ARDUINO_ARCH_ESP32 HardwareSerial hpmaSerial(1); // Change TX - D5 and RX - D4 pins @@ -237,13 +256,6 @@ unsigned int hpma115S0_pm25, hpma115S0_pm10; //***HPMA115S0 - END*** #elif defined DUSTSENSOR_SPS30 //***SPS30 - START*** -#ifdef ARDUINO_ARCH_ESP32 -#define SPS30_RX_PIN 4 // D4 -#define SPS30_TX_PIN 5 // D5 -#else -#define SPS30_RX_PIN 4 // D2 -#define SPS30_TX_PIN 5 // D1 -#endif #define SP30_COMMS SERIALPORT1 #define SPS30_AUTOCLEANINTERVAL -1 #define SPS30_PERFORMCLEANNOW 1 @@ -255,8 +267,11 @@ float SPS30_PM1, SPS30_PM25, SPS30_PM4, SPS30_PM10; #else // If no dust sensor has been defined - use DUSTSENSOR_PMS5003_7003_BME280_0x76 //***PMSx003 - START*** #ifdef ARDUINO_ARCH_ESP8266 -// SoftwareSerial PMS_Serial; -- only for esp8266 core 2.6.0 -SoftwareSerial PMS_Serial(5, 4); // Change TX - D1 and RX - D2 pins -- esp8266 core 2.6.1 or later +#ifdef ARDUINO_ESP8266_RELEASE_2_6_0 +SoftwareSerial PMS_Serial; // only for esp8266 core 2.6.0 +#else +SoftwareSerial PMS_Serial(DUST_TX, DUST_RX); // Change TX - D1 and RX - D2 pins -- esp8266 core 2.6.1 or later +#endif PMS pms(PMS_Serial); PMS::DATA data; #elif defined ARDUINO_ARCH_ESP32 @@ -272,19 +287,19 @@ PMS::DATA data; char device_name[20]; unsigned int DUST_interval = 60 * 1000; // 1 minute -unsigned long previous_DUST_Millis = 0; +unsigned int previous_DUST_Millis = 0; unsigned int SENDING_FREQUENCY_interval = 60 * 1000; // 1 minute -unsigned long previous_SENDING_FREQUENCY_Millis = 0; +unsigned int previous_SENDING_FREQUENCY_Millis = 0; -unsigned long SENDING_DB_FREQUENCY_interval = 60 * 1000; // 1 minute -unsigned long previous_SENDING_DB_FREQUENCY_Millis = 0; +unsigned int SENDING_DB_FREQUENCY_interval = 60 * 1000; // 1 minute +unsigned int previous_SENDING_DB_FREQUENCY_Millis = 0; -unsigned long previous_2sec_Millis = 0; unsigned int TwoSec_interval = 2 * 1000; // 2 second +unsigned int previous_2sec_Millis = 0; unsigned int REBOOT_interval = 24 * 60 * 60 * 1000; // 24 hours -unsigned long previous_REBOOT_Millis = 0; +unsigned int previous_REBOOT_Millis = 0; #ifdef DUSTSENSOR_SPS30 int pmMeasurements[10][4]; @@ -323,7 +338,7 @@ bool checkHTU21DStatus() { int humidity_HTU21D_Int = int(myHTU21D.readHumidity()); if ((temperature_HTU21D_Int == 0 && humidity_HTU21D_Int == 0) || (temperature_HTU21D_Int == 255 && humidity_HTU21D_Int == 255)) { if (DEBUG) { - Serial.println("No data from HTU21D sensor!\n"); + Serial.println(F("No data from HTU21D sensor!\n")); } return false; } else { @@ -343,7 +358,7 @@ bool checkBmeStatus() { #endif if (temperature_BME280_Int == 0 && pressure_BME280_Int == 0 && humidity_BME280_Int == 0) { if (DEBUG) { - Serial.println("No data from BME280 sensor!\n"); + Serial.println(F("No data from BME280 sensor!\n")); } return false; } else { @@ -356,7 +371,7 @@ bool checkBmpStatus() { int pressure_BMP_Int = bmp.readPressure(); if (temperature_BMP_Int == 0 && pressure_BMP_Int == 0) { if (DEBUG) { - Serial.println("No data from BMP280 sensor!\n"); + Serial.println(F("No data from BMP280 sensor!\n")); } return false; } else { @@ -369,7 +384,7 @@ bool checkDHT22Status() { int temperature_DHT_Int = dht.readTemperature(); if (humidity_DHT_Int == 0 && temperature_DHT_Int == 0) { if (DEBUG) { - Serial.println("No data from DHT22 sensor!\n"); + Serial.println(F("No data from DHT22 sensor!\n")); } return false; } else { @@ -382,13 +397,29 @@ bool checkSHT1xStatus() { int temperature_SHT1x_Int = sht1x.readTemperatureC(); if (humidity_SHT1x_Int == 0 && temperature_SHT1x_Int == 0) { if (DEBUG) { - Serial.println("No data from SHT1x sensor!\n"); + Serial.println(F("No data from SHT1x sensor!\n")); } return false; } else { return true; } } + +bool checkDS18B20Status() { + /* + DS18B20.requestTemperatures(); + int temperature_DS18B20_Int = DS18B20.getTempCByIndex(0); + if (temperature_DS18B20_Int == 0) { + if (DEBUG) { + Serial.println(F("No data from DS18B20 sensor!\n"); + } + return false; + } else { + return true; + } + */ + return true; +} // check TEMP/HUMI/PRESS Sensor - END void minutesToSeconds() { @@ -400,14 +431,155 @@ void minutesToSeconds() { void MQTTreconnect() { // Loop until we're reconnected if (!mqttclient.connected()) { - Serial.print("Attempting MQTT connection..."); + Serial.print(F("Attempting MQTT connection...")); // Attempt to connect if (mqttclient.connect("ESP8266Client", MQTT_USER, MQTT_PASSWORD)) { - Serial.println("connected"); + Serial.println(F("connected")); } else { - Serial.print("failed, rc="); + Serial.print(F("failed, rc=")); Serial.print(mqttclient.state()); - Serial.println("\n"); + Serial.println(F("\n")); + } + } +} + +void set_I2C_PINS(String THP_PIN, int i) { + if (i == 1) { + if (THP_PIN == "D1") { + FIRST_THP_SDA = 5; + } else if (THP_PIN == "D2") { + FIRST_THP_SDA = 4; + } else if (THP_PIN == "D3") { + FIRST_THP_SDA = 0; + } else if (THP_PIN == "D4") { + FIRST_THP_SDA = 2; + } else if (THP_PIN == "D5") { + FIRST_THP_SDA = 14; + } else if (THP_PIN == "D6") { + FIRST_THP_SDA = 12; + } else if (THP_PIN == "D7") { + FIRST_THP_SDA = 13; + } else if (THP_PIN == "D8") { + FIRST_THP_SDA = 15; + } else if (THP_PIN == "D16") { + FIRST_THP_SDA = 16; + } else if (THP_PIN == "D17") { + FIRST_THP_SDA = 17; + } + } else if (i == 2) { + if (THP_PIN == "D1") { + FIRST_THP_SCL = 5; + } else if (THP_PIN == "D2") { + FIRST_THP_SCL = 4; + } else if (THP_PIN == "D3") { + FIRST_THP_SCL = 0; + } else if (THP_PIN == "D4") { + FIRST_THP_SCL = 2; + } else if (THP_PIN == "D5") { + FIRST_THP_SCL = 14; + } else if (THP_PIN == "D6") { + FIRST_THP_SCL = 12; + } else if (THP_PIN == "D7") { + FIRST_THP_SCL = 13; + } else if (THP_PIN == "D8") { + FIRST_THP_SCL = 15; + } else if (THP_PIN == "D16") { + FIRST_THP_SCL = 16; + } else if (THP_PIN == "D17") { + FIRST_THP_SCL = 17; + } + } else if (i == 3) { + if (THP_PIN == "D1") { + SECOND_THP_SDA = 5; + } else if (THP_PIN == "D2") { + SECOND_THP_SDA = 4; + } else if (THP_PIN == "D3") { + SECOND_THP_SDA = 0; + } else if (THP_PIN == "D4") { + SECOND_THP_SDA = 2; + } else if (THP_PIN == "D5") { + SECOND_THP_SDA = 14; + } else if (THP_PIN == "D6") { + SECOND_THP_SDA = 12; + } else if (THP_PIN == "D7") { + SECOND_THP_SDA = 13; + } else if (THP_PIN == "D8") { + SECOND_THP_SDA = 15; + } else if (THP_PIN == "D16") { + SECOND_THP_SDA = 16; + } else if (THP_PIN == "D17") { + SECOND_THP_SDA = 17; + } + } else if (i == 4) { + if (THP_PIN == "D1") { + SECOND_THP_SCL = 5; + } else if (THP_PIN == "D2") { + SECOND_THP_SCL = 4; + } else if (THP_PIN == "D3") { + SECOND_THP_SCL = 0; + } else if (THP_PIN == "D4") { + SECOND_THP_SCL = 2; + } else if (THP_PIN == "D5") { + SECOND_THP_SCL = 14; + } else if (THP_PIN == "D6") { + SECOND_THP_SCL = 12; + } else if (THP_PIN == "D7") { + SECOND_THP_SCL = 13; + } else if (THP_PIN == "D8") { + SECOND_THP_SCL = 15; + } else if (THP_PIN == "D16") { + SECOND_THP_SCL = 16; + } else if (THP_PIN == "D17") { + SECOND_THP_SCL = 17; + } + } + +} + +void set_SERIAL_PINS(String DUST_PIN, int i) { + if (i == 1) { + if (DUST_PIN == "D1") { + DUST_TX = 5; + } else if (DUST_PIN == "D2") { + DUST_TX = 4; + } else if (DUST_PIN == "D3") { + DUST_TX = 0; + } else if (DUST_PIN == "D4") { + DUST_TX = 2; + } else if (DUST_PIN == "D5") { + DUST_TX = 14; + } else if (DUST_PIN == "D6") { + DUST_TX = 12; + } else if (DUST_PIN == "D7") { + DUST_TX = 13; + } else if (DUST_PIN == "D8") { + DUST_TX = 15; + } else if (DUST_PIN == "D16") { + DUST_TX = 16; + } else if (DUST_PIN == "D17") { + DUST_TX = 17; + } + } else if (i == 2) { + if (DUST_PIN == "D1") { + DUST_RX = 5; + } else if (DUST_PIN == "D2") { + DUST_RX = 4; + } else if (DUST_PIN == "D3") { + DUST_RX = 0; + } else if (DUST_PIN == "D4") { + DUST_RX = 2; + } else if (DUST_PIN == "D5") { + DUST_RX = 14; + } else if (DUST_PIN == "D6") { + DUST_RX = 12; + } else if (DUST_PIN == "D7") { + DUST_RX = 13; + } else if (DUST_PIN == "D8") { + DUST_RX = 15; + } else if (DUST_PIN == "D16") { + DUST_RX = 16; + } else if (DUST_PIN == "D17") { + DUST_RX = 17; } } } @@ -436,20 +608,32 @@ void setup() { #ifdef ARDUINO_ARCH_ESP32 disableCore0WDT(); - //disableCore1WDT(); // ESP32-solo-1 so only CORE0! + // disableCore1WDT(); // ESP32-solo-1 so only CORE0! #endif loadtranslation(SELECTED_LANGUAGE); yield(); + set_I2C_PINS(CONFIG_FIRST_THP_SDA, 1); + set_I2C_PINS(CONFIG_FIRST_THP_SCL, 2); + + set_I2C_PINS(CONFIG_SECOND_THP_SDA, 3); + set_I2C_PINS(CONFIG_SECOND_THP_SCL, 4); + + set_SERIAL_PINS(CONFIG_DUST_TX, 1); + set_SERIAL_PINS(CONFIG_DUST_RX, 2); + // DUST SENSOR setup - START #ifdef DUSTSENSOR_PMS5003_7003_BME280_0x76 or DUSTSENSOR_PMS5003_7003_BME280_0x77 if (!strcmp(DUST_MODEL, "PMS7003")) { #ifdef ARDUINO_ARCH_ESP8266 +#ifdef ARDUINO_ESP8266_RELEASE_2_6_0 + PMS_Serial.begin(9600, DUST_TX, DUST_RX); // Change TX - D1 and RX - D2 pins -- only for esp8266 core 2.6.0 +#else PMS_Serial.begin(9600); //PMSx003 serial -- esp8266 core 2.6.1 or later - //PMS_Serial.begin(9600, 5, 4); // Change TX - D1 and RX - D2 pins -- only for esp8266 core 2.6.0 +#endif #elif defined ARDUINO_ARCH_ESP32 - PMS_Serial.begin(9600, SERIAL_8N1, 5, 4); //PMSx003 serial + PMS_Serial.begin(9600, SERIAL_8N1, DUST_TX, DUST_RX); //PMSx003 serial #endif if (FREQUENTMEASUREMENT == true) { pms.wakeUp(); @@ -466,7 +650,7 @@ void setup() { #ifdef ARDUINO_ARCH_ESP8266 sds.begin(); //SDS011/21 sensor begin #elif defined ARDUINO_ARCH_ESP32 - sds_port.begin(9600, SERIAL_8N1, 5, 4); //SDS011/21 sensor begin + sds_port.begin(9600, SERIAL_8N1, DUST_TX, DUST_RX); //SDS011/21 sensor begin my_sds.begin(&sds_port); #endif if (FREQUENTMEASUREMENT == true) { @@ -477,7 +661,7 @@ void setup() { #elif defined ARDUINO_ARCH_ESP32 err = my_sds.read(&SDSpm25, &SDSpm10); if (!err) { - Serial.println("Data from SDS011!\n"); + Serial.println(F("Data from SDS011!\n")); } #endif } else { @@ -487,7 +671,7 @@ void setup() { #elif defined ARDUINO_ARCH_ESP32 err = my_sds.read(&SDSpm25, &SDSpm10); if (!err) { - Serial.println("Data from SDS011!\n"); + Serial.println(F("Data from SDS011!\n")); } #endif } @@ -498,7 +682,7 @@ void setup() { #ifdef ARDUINO_ARCH_ESP8266 hpmaSerial.begin(9600); //HPMA115S0 serial #elif defined ARDUINO_ARCH_ESP32 - hpmaSerial.begin(9600, SERIAL_8N1, 5, 4); //HPMA115S0 serial + hpmaSerial.begin(9600, SERIAL_8N1, DUST_TX, DUST_RX); //HPMA115S0 serial #endif delay(100); if (FREQUENTMEASUREMENT == true) { @@ -521,7 +705,7 @@ void setup() { sps30.EnableDebugging(SPS30_DEBUG); // set pins to use for softserial and Serial1 on ESP32 - if (SPS30_TX_PIN != 0 && SPS30_RX_PIN != 0) sps30.SetSerialPin(SPS30_RX_PIN, SPS30_TX_PIN); + if (DUST_TX != 0 && DUST_RX != 0) sps30.SetSerialPin(DUST_RX, DUST_TX); // Begin communication channel; if (sps30.begin(SP30_COMMS) == false) { @@ -569,10 +753,13 @@ void setup() { #else // If no dust sensor has been defined - use DUSTSENSOR_PMS5003_7003_BME280_0x76 if (!strcmp(DUST_MODEL, "PMS7003")) { #ifdef ARDUINO_ARCH_ESP8266 +#ifdef ARDUINO_ESP8266_RELEASE_2_6_0 + PMS_Serial.begin(9600, DUST_TX, DUST_RX); // Change TX - D1 and RX - D2 pins -- only for esp8266 core 2.6.0 +#else PMS_Serial.begin(9600); //PMSx003 serial -- esp8266 core 2.6.1 or later - //PMS_Serial.begin(9600, 5, 4); // Change TX - D1 and RX - D2 pins -- only for esp8266 core 2.6.0 +#endif #elif defined ARDUINO_ARCH_ESP32 - PMS_Serial.begin(9600, SERIAL_8N1, 5, 4); //PMSx003 serial + PMS_Serial.begin(9600, SERIAL_8N1, DUST_TX, DUST_RX); //PMSx003 serial #endif if (FREQUENTMEASUREMENT == true) { pms.wakeUp(); @@ -626,19 +813,23 @@ void setup() { // TEMP/HUMI/PRESS Sensor seturp - START if (!strcmp(THP_MODEL, "BME280")) { #ifdef ARDUINO_ARCH_ESP8266 - Wire.begin(0, 2); + //Wire.begin(0, 2); + Wire.begin(FIRST_THP_SDA, FIRST_THP_SCL); BMESensor.begin(); #elif defined ARDUINO_ARCH_ESP32 bme.begin(); #endif } else if (!strcmp(THP_MODEL, "BMP280")) { - Wire.begin(0, 2); + //Wire.begin(0, 2); + Wire.begin(FIRST_THP_SDA, FIRST_THP_SCL); bmp.begin(); } else if (!strcmp(THP_MODEL, "HTU21")) { myHTU21D.begin(); } else if (!strcmp(THP_MODEL, "DHT22")) { dht.begin(); } else if (!strcmp(THP_MODEL, "SHT1x")) { + } else if (!strcmp(THP_MODEL, "DS18B20")) { + DS18B20.begin(); } yield(); // TEMP/HUMI/PRESS Sensor setup - END @@ -654,7 +845,7 @@ void setup() { strncpy(device_name, DEVICENAME, 20); } - Serial.print("Device name: "); + Serial.print(F("Device name: ")); Serial.println(device_name); #ifdef ASYNC_WEBSERVER_ON @@ -667,14 +858,14 @@ void setup() { #endif if (wifiManager.autoConnect(device_name)) { - Serial.println("connected...yeey :)"); + Serial.println(F("connected...yeey :)")); //wifiManager.setConfigPortalBlocking(false); WiFi.mode(WIFI_STA); // https://github.com/hackerspace-silesia/Smogomierz/issues/47#issue-496810438 #ifdef ARDUINO_ARCH_ESP32 WiFi.setSleep(false); // https://github.com/espressif/arduino-esp32/issues/962#issuecomment-522899519 #endif } else { - Serial.println("Configportal running"); + Serial.println(F("Configportal running")); #ifdef ASYNC_WEBSERVER_ON wifiManager.startConfigPortal(device_name); #else @@ -684,7 +875,7 @@ void setup() { delay(250); #ifdef ASYNC_WEBSERVER_ON - Serial.println("\nIP Address: " + String(WiFi.localIP().toString()) + "\n"); + Serial.println(F("\nIP Address: " + String(WiFi.localIP().toString()) + "\n")); #endif // check update @@ -824,7 +1015,7 @@ void loop() { #endif if (strcmp(DUST_MODEL, "Non")) { - unsigned long current_DUST_Millis = millis(); + unsigned int current_DUST_Millis = millis(); if (FREQUENTMEASUREMENT == true ) { if (current_DUST_Millis - previous_DUST_Millis >= DUST_interval) { takeNormalnPMMeasurements(); @@ -832,7 +1023,7 @@ void loop() { } } if (DEEPSLEEP_ON == true) { - Serial.println("\nDeepSleep Mode!\n"); + Serial.println(F("\nDeepSleep Mode!\n")); takeSleepPMMeasurements(); yield(); @@ -852,7 +1043,7 @@ void loop() { ESP.deepSleep(SENDING_FREQUENCY * 60 * 1000000); // *1000000 - secunds yield(); #elif defined ARDUINO_ARCH_ESP32 - Serial.println("Going to sleep now"); + Serial.println(F("Going to sleep now")); Serial.flush(); esp_deep_sleep_start(); #endif @@ -865,8 +1056,8 @@ void loop() { } } else { if (DEEPSLEEP_ON == true) { - Serial.println("\nDeepSleep Mode!\n"); - unsigned long current_2sec_Millis = millis(); + Serial.println(F("\nDeepSleep Mode!\n")); + unsigned int current_2sec_Millis = millis(); previous_2sec_Millis = millis(); while (previous_2sec_Millis - current_2sec_Millis <= TwoSec_interval * 10) { #ifndef ASYNC_WEBSERVER_ON @@ -890,7 +1081,7 @@ void loop() { ESP.deepSleep(SENDING_FREQUENCY * 60 * 1000000); // *1000000 - secunds yield(); #elif defined ARDUINO_ARCH_ESP32 - Serial.println("Going to sleep now"); + Serial.println(F("Going to sleep now")); Serial.flush(); esp_deep_sleep_start(); #endif @@ -899,7 +1090,7 @@ void loop() { } if (LUFTDATEN_ON or AQI_ECO_ON or AIRMONITOR_ON or SMOGLIST_ON) { - unsigned long current_SENDING_FREQUENCY_Millis = millis(); + unsigned int current_SENDING_FREQUENCY_Millis = millis(); if (current_SENDING_FREQUENCY_Millis - previous_SENDING_FREQUENCY_Millis >= SENDING_FREQUENCY_interval) { takeTHPMeasurements(); sendDataToExternalServices(); @@ -908,7 +1099,7 @@ void loop() { } if (THINGSPEAK_ON or INFLUXDB_ON or MQTT_ON) { - unsigned long current_SENDING_DB_FREQUENCY_Millis = millis(); + unsigned int current_SENDING_DB_FREQUENCY_Millis = millis(); if (current_SENDING_DB_FREQUENCY_Millis - previous_SENDING_DB_FREQUENCY_Millis >= SENDING_DB_FREQUENCY_interval) { takeTHPMeasurements(); sendDataToExternalDBs(); @@ -916,9 +1107,9 @@ void loop() { } } - unsigned long current_REBOOT_Millis = millis(); + unsigned int current_REBOOT_Millis = millis(); if (current_REBOOT_Millis - previous_REBOOT_Millis >= REBOOT_interval) { - Serial.println("autoreboot..."); + Serial.println(F("autoreboot...")); delay(1000); previous_REBOOT_Millis = millis(); #ifdef ARDUINO_ARCH_ESP8266 @@ -936,28 +1127,28 @@ void sendDataToExternalServices() { if (LUFTDATEN_ON) { sendDataToLuftdaten(currentTemperature, currentPressure, currentHumidity, averagePM1, averagePM25, averagePM4, averagePM10); if (DEBUG) { - Serial.println("Sending measurement data to the LuftDaten service!\n"); + Serial.println(F("Sending measurement data to the LuftDaten service!\n")); } } if (AIRMONITOR_ON) { sendDataToAirMonitor(currentTemperature, currentPressure, currentHumidity, averagePM1, averagePM25, averagePM4, averagePM10); if (DEBUG) { - Serial.println("Sending measurement data to the AirMonitor service!\n"); + Serial.println(F("Sending measurement data to the AirMonitor service!\n")); } } if (SMOGLIST_ON) { sendDataToSmoglist(currentTemperature, currentPressure, currentHumidity, averagePM1, averagePM25, averagePM4, averagePM10); if (DEBUG) { - Serial.println("Sending measurement data to the Smoglist service!\n"); + Serial.println(F("Sending measurement data to the Smoglist service!\n")); } } if (AQI_ECO_ON) { sendDataToAqiEco(currentTemperature, currentPressure, currentHumidity, averagePM1, averagePM25, averagePM4, averagePM10); if (DEBUG) { - Serial.println("Sending measurement data to the aqi.eco service!\n"); + Serial.println(F("Sending measurement data to the aqi.eco service!\n")); } } @@ -975,7 +1166,7 @@ void sendDataToExternalDBs() { if (THINGSPEAK_ON) { sendDataToThingSpeak(currentTemperature, currentPressure, currentHumidity, averagePM1, averagePM25, averagePM4, averagePM10); if (DEBUG) { - Serial.println("Sending measurement data to the Thingspeak service!\n"); + Serial.println(F("Sending measurement data to the Thingspeak service!\n")); } } @@ -995,28 +1186,28 @@ void sendDataToExternalDBs() { InfluxDataV2 row(device_name); if (!strcmp(DUST_MODEL, "PMS7003")) { if (DEBUG) { - Serial.println("\nMeasurements from PMSx003!\n"); + Serial.println(F("\nMeasurements from PMSx003!\n")); } row.addValue("pm1", averagePM1); row.addValue("pm25", averagePM25); row.addValue("pm10", averagePM10); } else if (!strcmp(DUST_MODEL, "SDS011/21")) { if (DEBUG) { - Serial.println("\nMeasurements from SDS0x1!\n"); + Serial.println(F("\nMeasurements from SDS0x1!\n")); } row.addValue("pm1", averagePM1); row.addValue("pm25", averagePM25); row.addValue("pm10", averagePM10); } else if (!strcmp(DUST_MODEL, "HPMA115S0")) { if (DEBUG) { - Serial.println("\nMeasurements from SDS!\n"); + Serial.println(F("\nMeasurements from SDS!\n")); } row.addValue("pm1", averagePM1); row.addValue("pm25", averagePM25); row.addValue("pm10", averagePM10); } else if (!strcmp(DUST_MODEL, "SPS30")) { if (DEBUG) { - Serial.println("\nMeasurements from SPS30!\n"); + Serial.println(F("\nMeasurements from SPS30!\n")); } row.addValue("pm1", averagePM1); row.addValue("pm25", averagePM25); @@ -1024,7 +1215,7 @@ void sendDataToExternalDBs() { row.addValue("pm10", averagePM10); } else { if (DEBUG) { - Serial.println("\nNo measurements from Dust Sensor!\n"); + Serial.println(F("\nNo measurements from Dust Sensor!\n")); } } if (!strcmp(THP_MODEL, "BME280")) { @@ -1034,7 +1225,7 @@ void sendDataToExternalDBs() { row.addValue("humidity", (currentHumidity)); } else { if (DEBUG) { - Serial.println("No measurements from BME280!\n"); + Serial.println(F("No measurements from BME280!\n")); } } } else if (!strcmp(THP_MODEL, "HTU21")) { @@ -1043,7 +1234,7 @@ void sendDataToExternalDBs() { row.addValue("humidity", (currentHumidity)); } else { if (DEBUG) { - Serial.println("No measurements from HTU21D!\n"); + Serial.println(F("No measurements from HTU21D!\n")); } } } else if (!strcmp(THP_MODEL, "BMP280")) { @@ -1052,7 +1243,7 @@ void sendDataToExternalDBs() { row.addValue("pressure", (currentPressure)); } else { if (DEBUG) { - Serial.println("No measurements from BMP280!\n"); + Serial.println(F("No measurements from BMP280!\n")); } } } else if (!strcmp(THP_MODEL, "DHT22")) { @@ -1061,7 +1252,7 @@ void sendDataToExternalDBs() { row.addValue("humidity", (currentHumidity)); } else { if (DEBUG) { - Serial.println("No measurements from DHT22!\n"); + Serial.println(F("No measurements from DHT22!\n")); } } } else if (!strcmp(THP_MODEL, "SHT1x")) { @@ -1070,17 +1261,25 @@ void sendDataToExternalDBs() { row.addValue("humidity", (currentHumidity)); } else { if (DEBUG) { - Serial.println("No measurements from SHT1x!\n"); + Serial.println(F("No measurements from SHT1x!\n")); + } + } + } else if (!strcmp(THP_MODEL, "DS18B20")) { + if (checkDS18B20Status() == true) { + row.addValue("temperature", (currentTemperature)); + } else { + if (DEBUG) { + Serial.println(F("No measurements from DS18B20!\n")); } } } if (influx.write(row)) { if (DEBUG) { - Serial.println("Data sent to InfluxDB\n"); + Serial.println(F("Data sent to InfluxDB\n")); } } else { if (DEBUG) { - Serial.println("Error sending data to InfluxDB\n"); + Serial.println(F("Error sending data to InfluxDB\n")); } } } @@ -1118,13 +1317,33 @@ void sendDataToExternalDBs() { MQTT_FINAL_PM10 = String(MQTT_DEVICE_IPADRESS) + "/" + String(MQTT_FINAL_PM10); MQTT_FINAL_AIRQUALITY = String(MQTT_DEVICE_IPADRESS) + "/" + String(MQTT_FINAL_AIRQUALITY); } - MQTT_FINAL_TEMP = "/" + MQTT_FINAL_TEMP + "/"; - MQTT_FINAL_HUMI = "/" + MQTT_FINAL_HUMI + "/"; - MQTT_FINAL_PRESS = "/" + MQTT_FINAL_PRESS + "/"; - MQTT_FINAL_PM1 = "/" + MQTT_FINAL_PM1 + "/"; - MQTT_FINAL_PM25 = "/" + MQTT_FINAL_PM25 + "/"; - MQTT_FINAL_PM10 = "/" + MQTT_FINAL_PM10 + "/"; - MQTT_FINAL_AIRQUALITY = "/" + MQTT_FINAL_AIRQUALITY + "/"; + if (MQTT_SLASH_AT_THE_BEGINNING) { + MQTT_FINAL_TEMP = "/" + MQTT_FINAL_TEMP; + MQTT_FINAL_HUMI = "/" + MQTT_FINAL_HUMI; + MQTT_FINAL_PRESS = "/" + MQTT_FINAL_PRESS; + MQTT_FINAL_PM1 = "/" + MQTT_FINAL_PM1; + MQTT_FINAL_PM25 = "/" + MQTT_FINAL_PM25; + MQTT_FINAL_PM10 = "/" + MQTT_FINAL_PM10; + MQTT_FINAL_AIRQUALITY = "/" + MQTT_FINAL_AIRQUALITY; + } else { + MQTT_FINAL_TEMP = MQTT_FINAL_TEMP; + MQTT_FINAL_HUMI = MQTT_FINAL_HUMI; + MQTT_FINAL_PRESS = MQTT_FINAL_PRESS; + MQTT_FINAL_PM1 = MQTT_FINAL_PM1; + MQTT_FINAL_PM25 = MQTT_FINAL_PM25; + MQTT_FINAL_PM10 = MQTT_FINAL_PM10; + MQTT_FINAL_AIRQUALITY = MQTT_FINAL_AIRQUALITY; + } + + if (MQTT_SLASH_AT_THE_END) { + MQTT_FINAL_TEMP = MQTT_FINAL_TEMP + "/"; + MQTT_FINAL_HUMI = MQTT_FINAL_HUMI + "/"; + MQTT_FINAL_PRESS = MQTT_FINAL_PRESS + "/"; + MQTT_FINAL_PM1 = MQTT_FINAL_PM1 + "/"; + MQTT_FINAL_PM25 = MQTT_FINAL_PM25 + "/"; + MQTT_FINAL_PM10 = MQTT_FINAL_PM10 + "/"; + MQTT_FINAL_AIRQUALITY = MQTT_FINAL_AIRQUALITY + "/"; + } if (strcmp(DUST_MODEL, "Non")) { @@ -1154,7 +1373,7 @@ void sendDataToExternalDBs() { mqttclient.publish((MQTT_FINAL_PRESS).c_str(), String(currentPressure).c_str(), true); } else { if (DEBUG) { - Serial.println("No measurements from BME280!\n"); + Serial.println(F("No measurements from BME280!\n")); } } } @@ -1166,7 +1385,7 @@ void sendDataToExternalDBs() { } else { if (DEBUG) { - Serial.println("No measurements from BMP280!\n"); + Serial.println(F("No measurements from BMP280!\n")); } } } @@ -1177,7 +1396,7 @@ void sendDataToExternalDBs() { mqttclient.publish((MQTT_FINAL_HUMI).c_str(), String(currentHumidity).c_str(), true); } else { if (DEBUG) { - Serial.println("No measurements from HTU21!\n"); + Serial.println(F("No measurements from HTU21!\n")); } } } @@ -1188,7 +1407,7 @@ void sendDataToExternalDBs() { mqttclient.publish((MQTT_FINAL_HUMI).c_str(), String(currentHumidity).c_str(), true); } else { if (DEBUG) { - Serial.println("No measurements from DHT22!\n"); + Serial.println(F("No measurements from DHT22!\n")); } } } @@ -1199,7 +1418,17 @@ void sendDataToExternalDBs() { mqttclient.publish((MQTT_FINAL_HUMI).c_str(), String(currentHumidity).c_str(), true); } else { if (DEBUG) { - Serial.println("No measurements from SHT1x!\n"); + Serial.println(F("No measurements from SHT1x!\n")); + } + } + } + + if (!strcmp(THP_MODEL, "DS18B20")) { + if (checkDS18B20Status() == true) { + mqttclient.publish((MQTT_FINAL_TEMP).c_str(), String(currentTemperature).c_str(), true); + } else { + if (DEBUG) { + Serial.println(F("No measurements from DS18B20!\n")); } } } @@ -1234,7 +1463,7 @@ void takeTHPMeasurements() { #endif if (checkBmeStatus() == true) { if (DEBUG) { - Serial.println("Measurements from BME280!\n"); + Serial.println(F("Measurements from BME280!\n")); } #ifdef ARDUINO_ARCH_ESP8266 currentTemperature = BMESensor.temperature; @@ -1248,55 +1477,67 @@ void takeTHPMeasurements() { } else { if (DEBUG) { - Serial.println("No measurements from BME280!\n"); + Serial.println(F("No measurements from BME280!\n")); } } } else if (!strcmp(THP_MODEL, "HTU21")) { if (checkHTU21DStatus() == true) { if (DEBUG) { - Serial.println("Measurements from HTU21!\n"); + Serial.println(F("Measurements from HTU21!\n")); } currentTemperature = myHTU21D.readTemperature(); currentHumidity = myHTU21D.readHumidity(); } else { if (DEBUG) { - Serial.println("No measurements from HTU21D!\n"); + Serial.println(F("No measurements from HTU21D!\n")); } } } else if (!strcmp(THP_MODEL, "BMP280")) { if (checkBmpStatus() == true) { if (DEBUG) { - Serial.println("Measurements from BMP280!\n"); + Serial.println(F("Measurements from BMP280!\n")); } currentTemperature = bmp.readTemperature(); currentPressure = (bmp.readPressure()) / 100; } else { if (DEBUG) { - Serial.println("No measurements from BMP280!\n"); + Serial.println(F("No measurements from BMP280!\n")); } } } else if (!strcmp(THP_MODEL, "DHT22")) { if (checkDHT22Status() == true) { if (DEBUG) { - Serial.println("Measurements from DHT22!\n"); + Serial.println(F("Measurements from DHT22!\n")); } currentTemperature = dht.readTemperature(); currentHumidity = dht.readHumidity(); } else { if (DEBUG) { - Serial.println("No measurements from DHT22!\n"); + Serial.println(F("No measurements from DHT22!\n")); } } } else if (!strcmp(THP_MODEL, "SHT1x")) { if (checkSHT1xStatus() == true) { if (DEBUG) { - Serial.println("Measurements from SHT1x!\n"); + Serial.println(F("Measurements from SHT1x!\n")); } currentTemperature = sht1x.readTemperatureC(); currentHumidity = sht1x.readHumidity(); } else { if (DEBUG) { - Serial.println("No measurements from SHT1x!\n"); + Serial.println(F("No measurements from SHT1x!\n")); + } + } + } else if (!strcmp(THP_MODEL, "DS18B20")) { + if (checkDS18B20Status() == true) { + if (DEBUG) { + Serial.println(F("Measurements from DS18B20!\n")); + } + DS18B20.requestTemperatures(); + currentTemperature = DS18B20.getTempCByIndex(0); + } else { + if (DEBUG) { + Serial.println(F("No measurements from DS18B20!\n")); } } } @@ -1317,7 +1558,7 @@ void takeNormalnPMMeasurements() { pmMeasurements[iPM][1] = int(calib * SDSdata.pm25); pmMeasurements[iPM][2] = int(calib * SDSdata.pm10); } else { - Serial.println("\nCould not read values from SDS sensor :( "); + Serial.println(F("\nCould not read values from SDS sensor :( ")); } #elif defined ARDUINO_ARCH_ESP32 err = my_sds.read(&SDSpm25, &SDSpm10); @@ -1326,7 +1567,7 @@ void takeNormalnPMMeasurements() { pmMeasurements[iPM][1] = int(calib * SDSpm25); pmMeasurements[iPM][2] = int(calib * SDSpm10); } else { - Serial.println("\nCould not read values from SDS sensor :( "); + Serial.println(F("\nCould not read values from SDS sensor :( ")); } #endif #elif defined DUSTSENSOR_HPMA115S0 @@ -1357,17 +1598,17 @@ void takeNormalnPMMeasurements() { #endif if (DEBUG) { - Serial.print("\n\nPM measurement number: "); + Serial.print(F("\n\nPM measurement number: ")); Serial.print(iPM); - Serial.print("\nValue of PM1: "); + Serial.print(F("\nValue of PM1: ")); Serial.print(pmMeasurements[iPM][0]); - Serial.print("\nValue of PM2.5: "); + Serial.print(F("\nValue of PM2.5: ")); Serial.print(pmMeasurements[iPM][1]); #ifdef DUSTSENSOR_SPS30 - Serial.print("\nValue of PM4: "); + Serial.print(F("\nValue of PM4: ")); Serial.print(pmMeasurements[iPM][3]); #endif - Serial.print("\nValue of PM10: "); + Serial.print(F("\nValue of PM10: ")); Serial.print(pmMeasurements[iPM][2]); } if (++iPM == NUMBEROFMEASUREMENTS) { @@ -1378,13 +1619,13 @@ void takeNormalnPMMeasurements() { void takeSleepPMMeasurements() { if (DEBUG) { - Serial.print("\nTurning ON PM sensor..."); + Serial.print(F("\nTurning ON PM sensor...")); } #ifdef DUSTSENSOR_PMS5003_7003_BME280_0x76 or DUSTSENSOR_PMS5003_7003_BME280_0x77 if (!strcmp(DUST_MODEL, "PMS7003")) { pms.wakeUp(); - unsigned long current_2sec_Millis = millis(); + unsigned int current_2sec_Millis = millis(); previous_2sec_Millis = millis(); while (previous_2sec_Millis - current_2sec_Millis <= TwoSec_interval * 5) { #ifndef ASYNC_WEBSERVER_ON @@ -1398,7 +1639,7 @@ void takeSleepPMMeasurements() { int counterNM1 = 0; while (counterNM1 < NUMBEROFMEASUREMENTS) { - unsigned long current_2sec_Millis = millis(); + unsigned int current_2sec_Millis = millis(); if (current_2sec_Millis - previous_2sec_Millis >= TwoSec_interval) { if (pms.readUntil(data)) { @@ -1413,7 +1654,7 @@ void takeSleepPMMeasurements() { #endif } if (DEBUG) { - Serial.print("\nTurning OFF PM sensor...\n"); + Serial.print(F("\nTurning OFF PM sensor...\n")); } if (!strcmp(DUST_MODEL, "PMS7003")) { @@ -1429,7 +1670,7 @@ void takeSleepPMMeasurements() { #endif - unsigned long current_2sec_Millis = millis(); + unsigned int current_2sec_Millis = millis(); previous_2sec_Millis = millis(); while (previous_2sec_Millis - current_2sec_Millis <= TwoSec_interval * 10) { #ifndef ASYNC_WEBSERVER_ON @@ -1443,7 +1684,7 @@ void takeSleepPMMeasurements() { int counterNM1 = 0; while (counterNM1 < NUMBEROFMEASUREMENTS) { - unsigned long current_2sec_Millis = millis(); + unsigned int current_2sec_Millis = millis(); if (current_2sec_Millis - previous_2sec_Millis >= TwoSec_interval) { #ifdef ARDUINO_ARCH_ESP8266 PmResult SDSdata = sds.queryPm(); @@ -1462,7 +1703,7 @@ void takeSleepPMMeasurements() { delay(10); } if (DEBUG) { - Serial.print("\nTurning OFF PM sensor...\n"); + Serial.print(F("\nTurning OFF PM sensor...\n")); } if (!strcmp(DUST_MODEL, "SDS011/21")) { @@ -1481,7 +1722,7 @@ void takeSleepPMMeasurements() { delay(10); hpma115S0.StartParticleMeasurement(); - unsigned long current_2sec_Millis = millis(); + unsigned int current_2sec_Millis = millis(); previous_2sec_Millis = millis(); while (previous_2sec_Millis - current_2sec_Millis <= TwoSec_interval * 8) { #ifndef ASYNC_WEBSERVER_ON @@ -1495,7 +1736,7 @@ void takeSleepPMMeasurements() { } int counterNM1 = 0; while (counterNM1 < NUMBEROFMEASUREMENTS) { - unsigned long current_2sec_Millis = millis(); + unsigned int current_2sec_Millis = millis(); if (current_2sec_Millis - previous_2sec_Millis >= TwoSec_interval) { if (hpma115S0.ReadParticleMeasurement(&hpma115S0_pm25, &hpma115S0_pm10)) { takeNormalnPMMeasurements(); @@ -1510,7 +1751,7 @@ void takeSleepPMMeasurements() { delay(10); } if (DEBUG) { - Serial.print("\nTurning OFF PM sensor...\n"); + Serial.print(F("\nTurning OFF PM sensor...\n")); } if (!strcmp(DUST_MODEL, "HPMA115S0")) { @@ -1523,7 +1764,7 @@ void takeSleepPMMeasurements() { // WAKE UP SPS30!! - unsigned long current_2sec_Millis = millis(); + unsigned int current_2sec_Millis = millis(); previous_2sec_Millis = millis(); while (previous_2sec_Millis - current_2sec_Millis <= TwoSec_interval * 8) { #ifndef ASYNC_WEBSERVER_ON @@ -1537,7 +1778,7 @@ void takeSleepPMMeasurements() { } int counterNM1 = 0; while (counterNM1 < NUMBEROFMEASUREMENTS) { - unsigned long current_2sec_Millis = millis(); + unsigned int current_2sec_Millis = millis(); if (current_2sec_Millis - previous_2sec_Millis >= TwoSec_interval) { read_sps30_data(); @@ -1553,7 +1794,7 @@ void takeSleepPMMeasurements() { delay(10); } if (DEBUG) { - Serial.print("\nTurning OFF PM sensor...\n"); + Serial.print(F("\nTurning OFF PM sensor...\n")); } if (!strcmp(DUST_MODEL, "SPS30")) { @@ -1562,7 +1803,7 @@ void takeSleepPMMeasurements() { #else // If no dust sensor has been defined - use DUSTSENSOR_PMS5003_7003_BME280_0x76 if (!strcmp(DUST_MODEL, "PMS7003")) { pms.wakeUp(); - unsigned long current_2sec_Millis = millis(); + unsigned int current_2sec_Millis = millis(); previous_2sec_Millis = millis(); while (previous_2sec_Millis - current_2sec_Millis <= TwoSec_interval * 5) { #ifndef ASYNC_WEBSERVER_ON @@ -1576,7 +1817,7 @@ void takeSleepPMMeasurements() { int counterNM1 = 0; while (counterNM1 < NUMBEROFMEASUREMENTS) { - unsigned long current_2sec_Millis = millis(); + unsigned int current_2sec_Millis = millis(); if (current_2sec_Millis - previous_2sec_Millis >= TwoSec_interval) { if (pms.readUntil(data)) { @@ -1591,7 +1832,7 @@ void takeSleepPMMeasurements() { #endif } if (DEBUG) { - Serial.print("\nTurning OFF PM sensor...\n"); + Serial.print(F("\nTurning OFF PM sensor...\n")); } if (!strcmp(DUST_MODEL, "PMS7003")) { @@ -1649,6 +1890,7 @@ void pm_calibration() { calib = calib1; } } + } // Automatic calibration - END @@ -1662,6 +1904,8 @@ void pm_calibration() { calib = calib1; } else if (!strcmp(THP_MODEL, "BMP280")) { calib = calib1; + } else if (!strcmp(THP_MODEL, "DS18B20")) { + calib = calib1; } } @@ -1688,15 +1932,15 @@ void averagePM() { averagePM4 = averagePM4 / NUMBEROFMEASUREMENTS; #endif if (DEBUG) { - Serial.print("\n\nAverage PM1: "); + Serial.print(F("\n\nAverage PM1: ")); Serial.print(averagePM1); - Serial.print("\nAverage PM2.5: "); + Serial.print(F("\nAverage PM2.5: ")); Serial.print(averagePM25); #ifdef DUSTSENSOR_SPS30 - Serial.print("\nAverage PM4: "); + Serial.print(F("\nAverage PM4: ")); Serial.print(averagePM4); #endif - Serial.print("\nAverage PM10: "); + Serial.print(F("\nAverage PM10: ")); Serial.print(averagePM10); } } diff --git a/defaultConfig.h b/defaultConfig.h index 94b4257..963e6ce 100644 --- a/defaultConfig.h +++ b/defaultConfig.h @@ -10,6 +10,36 @@ char THP_MODEL[32] = "Non"; char DUST_MODEL[32] = "Non"; bool FREQUENTMEASUREMENT = false; +bool SECOND_THP = false; + +#ifdef ARDUINO_ARCH_ESP8266 +char CONFIG_FIRST_THP_SDA[8] = "D3"; +char CONFIG_FIRST_THP_SCL[8] = "D4"; +int FIRST_THP_SDA = 0; // D3 +int FIRST_THP_SCL = 2; // D4 +#elif defined ARDUINO_ARCH_ESP32 +char CONFIG_FIRST_THP_SDA[8] = "D16"; +char CONFIG_FIRST_THP_SCL[8] = "D17"; +int FIRST_THP_SDA = 16; // D16 +int FIRST_THP_SCL = 17; // D17 +#endif + +char CONFIG_SECOND_THP_SDA[8] = "D5"; +char CONFIG_SECOND_THP_SCL[8] = "D6"; +int SECOND_THP_SDA = 14; // D5 +int SECOND_THP_SCL = 12; // D6 + +char CONFIG_DUST_TX[8] = "D1"; +char CONFIG_DUST_RX[8] = "D2"; +int DUST_TX = 5; // D1 +int DUST_RX = 4; // D2 + +/* + ESP8266 + 13 - D7 + 15 - D8 +*/ + int DUST_TIME = 1; int NUMBEROFMEASUREMENTS = 10; @@ -46,11 +76,13 @@ char MQTT_USER[64] = "username"; char MQTT_PASSWORD[64] = "password"; bool MQTT_IP_IN_TOPIC = false; -bool MQTT_DEVICENAME_IN_TOPIC = true; +bool MQTT_DEVICENAME_IN_TOPIC = true; +bool MQTT_SLASH_AT_THE_BEGINNING = true; +bool MQTT_SLASH_AT_THE_END = true; char MQTT_TOPIC_TEMP[128] = "sensor/temperature"; -char MQTT_TOPIC_HUMI[128] = "sensor/pressure"; -char MQTT_TOPIC_PRESS[128] = "sensor/humidity"; +char MQTT_TOPIC_HUMI[128] = "sensor/humidity"; +char MQTT_TOPIC_PRESS[128] = "sensor/pressure"; char MQTT_TOPIC_PM1[128] = "sensor/PM1"; char MQTT_TOPIC_PM25[128] = "sensor/PM2.5"; char MQTT_TOPIC_PM10[128] = "sensor/PM10"; @@ -72,7 +104,7 @@ bool AUTOUPDATE_ON = true; #endif bool CONFIG_AUTH = false; -char CONFIG_USERNAME[256] = "admin"; +char CONFIG_USERNAME[64] = "admin"; char CONFIG_PASSWORD[256] = "password"; char MODEL[32] = "white"; diff --git a/firmware/ESP32/ESP32_Smogomierz_2.7.8_HPMA115S0_build_26.04.2020.bin b/firmware/ESP32/ESP32_Smogomierz_2.7.8_HPMA115S0_build_26.04.2020.bin new file mode 100644 index 0000000..b5ab678 Binary files /dev/null and b/firmware/ESP32/ESP32_Smogomierz_2.7.8_HPMA115S0_build_26.04.2020.bin differ diff --git a/firmware/ESP32/ESP32_Smogomierz_2.7.8_PMS-SparkFunBME280_build_26.04.2020.bin b/firmware/ESP32/ESP32_Smogomierz_2.7.8_PMS-SparkFunBME280_build_26.04.2020.bin new file mode 100644 index 0000000..ab79c07 Binary files /dev/null and b/firmware/ESP32/ESP32_Smogomierz_2.7.8_PMS-SparkFunBME280_build_26.04.2020.bin differ diff --git a/firmware/ESP32/ESP32_Smogomierz_2.7.8_PMS_build_26.04.2020.bin b/firmware/ESP32/ESP32_Smogomierz_2.7.8_PMS_build_26.04.2020.bin new file mode 100644 index 0000000..aa39067 Binary files /dev/null and b/firmware/ESP32/ESP32_Smogomierz_2.7.8_PMS_build_26.04.2020.bin differ diff --git a/firmware/ESP32/ESP32_Smogomierz_2.7.8_SDS011_build_26.04.2020.bin b/firmware/ESP32/ESP32_Smogomierz_2.7.8_SDS011_build_26.04.2020.bin new file mode 100644 index 0000000..0af3766 Binary files /dev/null and b/firmware/ESP32/ESP32_Smogomierz_2.7.8_SDS011_build_26.04.2020.bin differ diff --git a/firmware/ESP32/ESP32_Smogomierz_2.7.8_SPS30_build_26.04.2020.bin b/firmware/ESP32/ESP32_Smogomierz_2.7.8_SPS30_build_26.04.2020.bin new file mode 100644 index 0000000..24da31c Binary files /dev/null and b/firmware/ESP32/ESP32_Smogomierz_2.7.8_SPS30_build_26.04.2020.bin differ diff --git a/firmware/ESP8266/ESP8266_Smogomierz_2.7.8_HPMA115S0_build_26.04.2020.bin b/firmware/ESP8266/ESP8266_Smogomierz_2.7.8_HPMA115S0_build_26.04.2020.bin new file mode 100644 index 0000000..0adcc85 Binary files /dev/null and b/firmware/ESP8266/ESP8266_Smogomierz_2.7.8_HPMA115S0_build_26.04.2020.bin differ diff --git a/firmware/ESP8266/ESP8266_Smogomierz_2.7.8_PMS-SparkFunBME280_build_26.04.2020.bin b/firmware/ESP8266/ESP8266_Smogomierz_2.7.8_PMS-SparkFunBME280_build_26.04.2020.bin new file mode 100644 index 0000000..59f6111 Binary files /dev/null and b/firmware/ESP8266/ESP8266_Smogomierz_2.7.8_PMS-SparkFunBME280_build_26.04.2020.bin differ diff --git a/firmware/ESP8266/ESP8266_Smogomierz_2.7.8_PMS_build_26.04.2020.bin b/firmware/ESP8266/ESP8266_Smogomierz_2.7.8_PMS_build_26.04.2020.bin new file mode 100644 index 0000000..e1f7a26 Binary files /dev/null and b/firmware/ESP8266/ESP8266_Smogomierz_2.7.8_PMS_build_26.04.2020.bin differ diff --git a/firmware/ESP8266/ESP8266_Smogomierz_2.7.8_SDS011_build_26.04.2020.bin b/firmware/ESP8266/ESP8266_Smogomierz_2.7.8_SDS011_build_26.04.2020.bin new file mode 100644 index 0000000..4a3b013 Binary files /dev/null and b/firmware/ESP8266/ESP8266_Smogomierz_2.7.8_SDS011_build_26.04.2020.bin differ diff --git a/firmware/ESP8266/ESP8266_Smogomierz_2.7.8_SPS30_build_26.04.2020.bin b/firmware/ESP8266/ESP8266_Smogomierz_2.7.8_SPS30_build_26.04.2020.bin new file mode 100644 index 0000000..707b4a5 Binary files /dev/null and b/firmware/ESP8266/ESP8266_Smogomierz_2.7.8_SPS30_build_26.04.2020.bin differ diff --git a/instrukcje/software.md b/instrukcje/software.md index 6f95a36..5be837a 100644 --- a/instrukcje/software.md +++ b/instrukcje/software.md @@ -42,7 +42,7 @@ Po zainstalowaniu ArduinoIDE, musisz dodać w nim obsługę płytek ESP. 8. Kod, który będziemy wgrywać na płytki ESP wymaga do poprawnego działania, dwóch zewnętrznych bibliotek. Aby je dodać wystarczy wybrać z menu ArduinoIDE "Szkic > Dołącz bibliotekę > Zarządzaj bibliotekami...". ![ArduinoIDE8](https://raw.githubusercontent.com/hackerspace-silesia/Smogomierz/master/instrukcje/screens/ArduinoIDE8.jpg) -9. W wyszukiwarce wpisujemy nazwę biblioteki i następnie ją instalujemy. Biblioteki, które musimy doinstalować to: **ArduinoJson(w wersji 6.5.0 lub nowszej)** oraz najnowsze wersje bibliotek: **Adafruit BMP280 Library**, **DHT sensor library by Adafruit**, **ThingSpeak**, **Adafruit Unified Sensor** oraz **PubSubClient**. +9. W wyszukiwarce wpisujemy nazwę biblioteki i następnie ją instalujemy. Biblioteki, które musimy doinstalować to: **ArduinoJson(w wersji 6.5.0 lub nowszej)** oraz najnowsze wersje bibliotek: **Adafruit BMP280 Library**, **DHT sensor library by Adafruit**, **ThingSpeak**, **Adafruit Unified Sensor**, **DallasTemperature**, **OneWire**(by Jim Studt, tom Pollard…) oraz **PubSubClient**. ![ArduinoIDE10](https://raw.githubusercontent.com/hackerspace-silesia/Smogomierz/master/instrukcje/screens/ArduinoIDE10.jpg) 10. Musimy jeszcze doinstalować kilka bibliotek, poprzed dodanie plików .zip. Tymi bibliotekami są: [ESPAsyncWebServer](https://github.com/me-no-dev/ESPAsyncWebServer) oraz [ESPAsyncTCP](https://github.com/me-no-dev/ESPAsyncTCP). W przypadku ESP32 musimy doinstalować jeszcze [AsyncTCP](https://github.com/me-no-dev/AsyncTCP). W przypadku ESP32 musimy również doinstalować Pythona3 oraz [pyserial](https://pypi.org/project/pyserial/). diff --git a/src/WiFiManager.cpp b/src/WiFiManager.cpp index a61fba6..ba12863 100644 --- a/src/WiFiManager.cpp +++ b/src/WiFiManager.cpp @@ -1,9 +1,9 @@ /** * WiFiManager.cpp - * + * * WiFiManager, a library for the ESP8266/Arduino platform * for configuration of WiFi credentials using a Captive Portal - * + * * @author Creator tzapu * @author tablatronix * @version 0.0.0 @@ -76,16 +76,16 @@ void WiFiManagerParameter::setValue(const char *defaultValue, int length) { // Serial.println("cannot set value of this parameter"); return; } - + // if(strlen(defaultValue) > length){ // // Serial.println("defaultValue length mismatch"); - // // return false; //@todo bail + // // return false; //@todo bail // } _length = length; - _value = new char[_length + 1]; + _value = new char[_length + 1]; memset(_value, 0, _length + 1); // explicit null - + if (defaultValue != NULL) { strncpy(_value, defaultValue, _length); } @@ -131,7 +131,7 @@ bool WiFiManager::addParameter(WiFiManagerParameter *p) { // init params if never malloc if(_params == NULL){ - DEBUG_WM(DEBUG_DEV,"allocating params bytes:",_max_params * sizeof(WiFiManagerParameter*)); + DEBUG_WM(DEBUG_DEV,"allocating params bytes:",_max_params * sizeof(WiFiManagerParameter*)); _params = (WiFiManagerParameter**)malloc(_max_params * sizeof(WiFiManagerParameter*)); } @@ -139,7 +139,7 @@ bool WiFiManager::addParameter(WiFiManagerParameter *p) { if(_paramsCount == _max_params){ _max_params += WIFI_MANAGER_MAX_PARAMS; DEBUG_WM(DEBUG_DEV,F("Updated _max_params:"),_max_params); - DEBUG_WM(DEBUG_DEV,"re-allocating params bytes:",_max_params * sizeof(WiFiManagerParameter*)); + DEBUG_WM(DEBUG_DEV,"re-allocating params bytes:",_max_params * sizeof(WiFiManagerParameter*)); WiFiManagerParameter** new_params = (WiFiManagerParameter**)realloc(_params, _max_params * sizeof(WiFiManagerParameter*)); // DEBUG_WM(WIFI_MANAGER_MAX_PARAMS); // DEBUG_WM(_paramsCount); @@ -154,7 +154,7 @@ bool WiFiManager::addParameter(WiFiManagerParameter *p) { _params[_paramsCount] = p; _paramsCount++; - + DEBUG_WM(DEBUG_VERBOSE,"Added Parameter:",p->getID()); return true; } @@ -177,7 +177,7 @@ int WiFiManager::getParametersCount() { /** * -------------------------------------------------------------------------------- - * WiFiManager + * WiFiManager * -------------------------------------------------------------------------------- **/ @@ -187,7 +187,7 @@ WiFiManager::WiFiManager(Stream& consolePort):_debugPort(consolePort){ } WiFiManager::WiFiManager() { - WiFiManagerInit(); + WiFiManagerInit(); } void WiFiManager::WiFiManagerInit(){ @@ -255,7 +255,7 @@ boolean WiFiManager::autoConnect(char const *apName, char const *apPassword) { DEBUG_WM(DEBUG_ERROR,"[FATAL] Unable to enable wifi!"); return false; } - + WiFiSetCountry(); #ifdef ESP32 @@ -292,9 +292,9 @@ boolean WiFiManager::autoConnect(char const *apName, char const *apPassword) { } #endif #endif - + if(!res)DEBUG_WM(DEBUG_ERROR,F("[ERROR] hostname: set failed!")); - + if(WiFi.status() == WL_CONNECTED){ DEBUG_WM(DEBUG_VERBOSE,F("reconnecting to set new hostname")); // WiFi.reconnect(); // This does not reset dhcp @@ -303,7 +303,7 @@ boolean WiFiManager::autoConnect(char const *apName, char const *apPassword) { } } - // if already connected, or try stored connect + // if already connected, or try stored connect // @note @todo ESP32 has no autoconnect, so connectwifi will always be called unless user called begin etc before // @todo check if correct ssid == saved ssid when already connected bool connected = false; @@ -364,7 +364,7 @@ bool WiFiManager::startAP(){ //@todo add callback here if needed to modify ap but cannot use setAPStaticIPConfig //@todo rework wifi channelsync as it will work unpredictably when not connected in sta - + int32_t channel = 0; if(_channelSync) channel = WiFi.channel(); else channel = _apChannel; @@ -378,25 +378,25 @@ bool WiFiManager::startAP(){ if (_apPassword != "") { if(channel>0){ ret = WiFi.softAP(_apName.c_str(), _apPassword.c_str(),channel,_apHidden); - } + } else{ ret = WiFi.softAP(_apName.c_str(), _apPassword.c_str(),1,_apHidden);//password option } } else { - DEBUG_WM(DEBUG_VERBOSE,F("AP has anonymous access!")); + DEBUG_WM(DEBUG_VERBOSE,F("AP has anonymous access!")); if(channel>0){ ret = WiFi.softAP(_apName.c_str(),"",channel,_apHidden); - } + } else{ ret = WiFi.softAP(_apName.c_str(),"",1,_apHidden); - } + } } if(_debugLevel >= DEBUG_DEV) debugSoftAPConfig(); if(!ret) DEBUG_WM(DEBUG_ERROR,"[ERROR] There was a problem starting the AP"); // @todo add softAP retry here - + delay(500); // slight delay to make sure we get an AP IP DEBUG_WM(F("AP IP address:"),WiFi.softAPIP()); @@ -431,7 +431,7 @@ void WiFiManager::startWebPortal() { */ void WiFiManager::stopWebPortal() { if(!configPortalActive && !webPortalActive) return; - DEBUG_WM(DEBUG_VERBOSE,F("Stopping Web Portal")); + DEBUG_WM(DEBUG_VERBOSE,F("Stopping Web Portal")); webPortalActive = false; shutdownConfigPortal(); } @@ -506,8 +506,9 @@ void WiFiManager::setupConfigPortal() { server->on(String(FPSTR(R_close)).c_str(), std::bind(&WiFiManager::handleClose, this)); server->on(String(FPSTR(R_erase)).c_str(), std::bind(&WiFiManager::handleErase, this, false)); server->on(String(FPSTR(R_status)).c_str(), std::bind(&WiFiManager::handleWiFiStatus, this)); + server->on(String(FPSTR(R_delete)).c_str(), std::bind(&WiFiManager::handleDelete, this)); server->onNotFound (std::bind(&WiFiManager::handleNotFound, this)); - + server->begin(); // Web server start DEBUG_WM(DEBUG_VERBOSE,F("HTTP server started")); @@ -532,17 +533,17 @@ boolean WiFiManager::startConfigPortal(char const *apName, char const *apPasswo //setup AP _apName = apName; // @todo check valid apname ? _apPassword = apPassword; - + DEBUG_WM(DEBUG_VERBOSE,F("Starting Config Portal")); if(_apName == "") _apName = getDefaultAPName(); if(!validApPassword()) return false; - + // HANDLE issues with STA connections, shutdown sta if not connected, or else this will hang channel scanning and softap will not respond // @todo sometimes still cannot connect to AP for no known reason, no events in log either if(_disableSTA || (!WiFi.isConnected() && _disableSTAConn)){ - // this fixes most ap problems, however, simply doing mode(WIFI_AP) does not work if sta connection is hanging, must `wifi_station_disconnect` + // this fixes most ap problems, however, simply doing mode(WIFI_AP) does not work if sta connection is hanging, must `wifi_station_disconnect` WiFi_Disconnect(); WiFi_enableSTA(false); DEBUG_WM(DEBUG_VERBOSE,F("Disabling STA")); @@ -638,7 +639,7 @@ uint8_t WiFiManager::processConfigPortal(){ else{ // attempt sta connection to submitted _ssid, _pass if (connectWifi(_ssid, _pass) == WL_CONNECTED) { - + DEBUG_WM(F("Connect to new AP [SUCCESS]")); DEBUG_WM(F("Got IP Address:")); DEBUG_WM(WiFi.localIP()); @@ -651,7 +652,7 @@ uint8_t WiFiManager::processConfigPortal(){ } DEBUG_WM(DEBUG_ERROR,F("[ERROR] Connect to new AP Failed")); } - + if (_shouldBreakAfterConfig) { // do save callback // @todo this is more of an exiting callback than a save, clarify when this should actually occur @@ -727,12 +728,12 @@ bool WiFiManager::shutdownConfigPortal(){ // clean up, flow is convoluted, and causes bugs uint8_t WiFiManager::connectWifi(String ssid, String pass) { DEBUG_WM(DEBUG_VERBOSE,F("Connecting as wifi client...")); - + uint8_t connRes = (uint8_t)WL_NO_SSID_AVAIL; setSTAConfig(); //@todo catch failures in set_config - + // make sure sta is on before `begin` so it does not call enablesta->mode while persistent is ON ( which would save WM AP state to eeprom !) if(_cleanConnect) WiFi_Disconnect(); // disconnect before begin, in case anything is hung, this causes a 2 seconds delay for connect // @todo find out what status is when this is needed, can we detect it and handle it, say in between states or idle_status @@ -742,7 +743,7 @@ uint8_t WiFiManager::connectWifi(String ssid, String pass) { wifiConnectNew(ssid,pass); if(_saveTimeout > 0){ connRes = waitForConnectResult(_saveTimeout); // use default save timeout for saves to prevent bugs in esp->waitforconnectresult loop - } + } else { connRes = waitForConnectResult(0); } @@ -759,6 +760,45 @@ uint8_t WiFiManager::connectWifi(String ssid, String pass) { } DEBUG_WM(DEBUG_VERBOSE,F("Connection result:"),getWLStatusString(connRes)); + //not connected, test known APs + if (waitForConnectResult(_connectTimeout ? 10000 : _connectTimeout) != WL_CONNECTED && _apList_size) { + DEBUG_WM(F("Scan for known APs")); + int n = WiFi.scanNetworks(); + if (n == 0) { + DEBUG_WM(F("No networks found")); + } else { + // search for strongest networks + int8_t best = -1; + int32_t best_rssi = -100000; + for (int i = 0; i < n; i++) { + for (int j = 0; j < _apList_size; j++) { + if (WiFi.SSID(i) == _apList[j].ssid && WiFi.RSSI(i) > best_rssi) { + best = j; + best_rssi = WiFi.RSSI(i); + } + } + } + // connect to known AP + if (best >= 0) { + DEBUG_WM ("Connecting to: "); + DEBUG_WM (_apList[best].ssid); + WiFi.begin(_apList[best].ssid.c_str(), _apList[best].pass.c_str()); + } + } + } + + connRes = waitForConnectResult(); + DEBUG_WM ("Connection result: "); + DEBUG_WM ( connRes ); + if (ssid != "" && connRes == WL_CONNECTED ) { + // add to known APs + addAP(ssid.c_str(), pass.c_str()); + // notify application about adding a new network + if ( _savewificallback != NULL) { + _savewificallback(); + } + + } // WPS enabled? https://github.com/esp8266/Arduino/pull/4889 #ifdef NO_EXTRA_4K_HEAP @@ -781,8 +821,8 @@ uint8_t WiFiManager::connectWifi(String ssid, String pass) { /** * connect to a new wifi ap * @since $dev - * @param String ssid - * @param String pass + * @param String ssid + * @param String pass * @return bool success */ bool WiFiManager::wifiConnectNew(String ssid, String pass){ @@ -821,7 +861,7 @@ bool WiFiManager::wifiConnectDefault(){ * @return bool success */ bool WiFiManager::setSTAConfig(){ - DEBUG_WM(F("STA static IP:"),_sta_static_ip); + DEBUG_WM(F("STA static IP:"),_sta_static_ip); bool ret = true; if (_sta_static_ip) { DEBUG_WM(DEBUG_VERBOSE,F("Custom static IP/GW/Subnet/DNS")); @@ -855,7 +895,7 @@ void WiFiManager::updateConxResult(uint8_t status){ #elif defined(ESP32) // if(_lastconxresult == WL_CONNECT_FAILED){ if(_lastconxresult == WL_CONNECT_FAILED || _lastconxresult == WL_DISCONNECTED){ - DEBUG_WM(DEBUG_DEV,"lastconxresulttmp:",getWLStatusString(_lastconxresulttmp)); + DEBUG_WM(DEBUG_DEV,"lastconxresulttmp:",getWLStatusString(_lastconxresulttmp)); if(_lastconxresulttmp != WL_IDLE_STATUS){ _lastconxresult = _lastconxresulttmp; // _lastconxresulttmp = WL_IDLE_STATUS; @@ -865,9 +905,9 @@ void WiFiManager::updateConxResult(uint8_t status){ DEBUG_WM(DEBUG_DEV,"lastconxresult:",getWLStatusString(_lastconxresult)); } - + uint8_t WiFiManager::waitForConnectResult() { - if(_connectTimeout > 0) DEBUG_WM(DEBUG_VERBOSE,_connectTimeout,F("ms connectTimeout set")); + if(_connectTimeout > 0) DEBUG_WM(DEBUG_VERBOSE,_connectTimeout,F("ms connectTimeout set")); return waitForConnectResult(_connectTimeout); } @@ -885,7 +925,7 @@ uint8_t WiFiManager::waitForConnectResult(uint16_t timeout) { unsigned long timeoutmillis = millis() + timeout; DEBUG_WM(DEBUG_VERBOSE,timeout,F("ms timeout, waiting for connect...")); uint8_t status = WiFi.status(); - + while(millis() < timeoutmillis) { status = WiFi.status(); // @todo detect additional states, connect happens, then dhcp then get ip, there is some delay here, make sure not to timeout if waiting on IP @@ -902,7 +942,7 @@ uint8_t WiFiManager::waitForConnectResult(uint16_t timeout) { #ifdef NO_EXTRA_4K_HEAP void WiFiManager::startWPS() { DEBUG_WM(F("START WPS")); - #ifdef ESP8266 + #ifdef ESP8266 WiFi.beginWPSConfig(); #else // @todo @@ -926,19 +966,41 @@ String WiFiManager::getHTTPHead(String title){ } else { page += FPSTR(HTTP_HEAD_END); - } + } return page; } -/** +boolean WiFiManager::addAP(char const *ssid, char const *password) { + if ( _apList_size < WIFI_MANAGER_MAX_NETWORKS ) { + _apList[_apList_size].ssid = ssid; + if ( password ) + _apList[_apList_size].pass = password; + else + _apList[_apList_size].pass = ""; + _apList_size++; + } else { + return false; + } + return true; +} + +const WiFiManagerCredentials *WiFiManager::getAP(uint8_t index) const { + if ( index < _apList_size ) { + return &_apList[index]; + } else { + return NULL; + } +} + +/** * HTTPD handler for page requests */ void WiFiManager::handleRequest() { _webPortalAccessed = millis(); } -/** +/** * HTTPD CALLBACK root or redirect to captive portal */ void WiFiManager::handleRoot() { @@ -957,7 +1019,7 @@ void WiFiManager::handleRoot() { server->sendHeader(FPSTR(HTTP_HEAD_CL), String(page.length())); server->send(200, FPSTR(HTTP_HEAD_CT), page); - // server->close(); // testing reliability fix for content length mismatches during mutiple flood hits WiFi_scanNetworks(); // preload wifiscan + // server->close(); // testing reliability fix for content length mismatches during mutiple flood hits WiFi_scanNetworks(); // preload wifiscan if(_preloadwifiscan) WiFi_scanNetworks(_scancachetime,true); // preload wifiscan throttled, async // @todo buggy, captive portals make a query on every page load, causing this to run every time in addition to the real page load // I dont understand why, when you are already in the captive portal, I guess they want to know that its still up and not done or gone @@ -990,7 +1052,7 @@ void WiFiManager::handleWifi(boolean scan) { pitem.replace(FPSTR(T_p), WiFi_psk()); } else { - pitem.replace(FPSTR(T_p),FPSTR(S_passph)); + pitem.replace(FPSTR(T_p),FPSTR(S_passph)); } page += pitem; @@ -1039,7 +1101,7 @@ void WiFiManager::handleParam(){ String WiFiManager::getMenuOut(){ - String page; + String page; for(auto menuId :_menuIds ){ if(((String)menuId == "param") && (_paramsCount == 0)) continue; // no params set, omit params from menu, @todo this may be undesired by someone @@ -1057,7 +1119,7 @@ String WiFiManager::getMenuOut(){ void WiFiManager::WiFi_scanComplete(int networksFound){ _lastscan = millis(); _numNetworks = networksFound; - DEBUG_WM(DEBUG_VERBOSE,F("WiFi Scan ASYNC completed"), "in "+(String)(_lastscan - _startscan)+" ms"); + DEBUG_WM(DEBUG_VERBOSE,F("WiFi Scan ASYNC completed"), "in "+(String)(_lastscan - _startscan)+" ms"); DEBUG_WM(DEBUG_VERBOSE,F("WiFi Scan ASYNC found:"),_numNetworks); } @@ -1122,7 +1184,7 @@ String WiFiManager::WiFiManager::getScanItemOut(){ if (n == 0) { DEBUG_WM(F("No networks found")); page += FPSTR(S_nonetworks); // @token nonetworks - } + } else { DEBUG_WM(n,F("networks found")); //sort networks @@ -1170,14 +1232,14 @@ String WiFiManager::WiFiManager::getScanItemOut(){ HTTP_ITEM_STR.replace("{h}",_scanDispOptions ? "" : "h"); HTTP_ITEM_STR.replace("{qi}", FPSTR(HTTP_ITEM_QI)); HTTP_ITEM_STR.replace("{h}",_scanDispOptions ? "h" : ""); - + // set token precheck flags bool tok_r = HTTP_ITEM_STR.indexOf(FPSTR(T_r)) > 0; bool tok_R = HTTP_ITEM_STR.indexOf(FPSTR(T_R)) > 0; bool tok_e = HTTP_ITEM_STR.indexOf(FPSTR(T_e)) > 0; bool tok_q = HTTP_ITEM_STR.indexOf(FPSTR(T_q)) > 0; bool tok_i = HTTP_ITEM_STR.indexOf(FPSTR(T_i)) > 0; - + //display networks in page for (int i = 0; i < n; i++) { if (indices[i] == -1) continue; // skip dups @@ -1210,6 +1272,23 @@ String WiFiManager::WiFiManager::getScanItemOut(){ } page += FPSTR(HTTP_BR); + + // show saved networks + for (int j = 0; j < _apList_size; j++) { + String item = FPSTR(HTTP_ITEM); + item.replace(FPSTR(T_v), _apList[j].ssid); + item.replace(FPSTR(T_r), "X"); + if ( _apList[j].pass.length() ) { + item.replace(FPSTR(T_i), "l"); + } else { + item.replace(FPSTR(T_i), ""); + } + page += item; + delay(0); + } + + page += "
"; + } return page; @@ -1226,7 +1305,7 @@ String WiFiManager::getIpForm(String id, String title, String value){ item.replace(FPSTR(T_l), F("15")); item.replace(FPSTR(T_v), value); item.replace(FPSTR(T_c), ""); - return item; + return item; } String WiFiManager::getStaticOut(){ @@ -1247,7 +1326,7 @@ String WiFiManager::getStaticOut(){ page += getIpForm(FPSTR(S_dns),FPSTR(S_staticdns),(_sta_static_dns ? _sta_static_dns.toString() : "")); // @token dns } - if(page!="") page += FPSTR(HTTP_BR); // @todo remove these, use css + if(page!="") // @todo remove these, use css return page; } @@ -1329,7 +1408,7 @@ void WiFiManager::handleWiFiStatus(){ server->send(200, FPSTR(HTTP_HEAD_CT), page); } -/** +/** * HTTPD CALLBACK save form and redirect to WLAN config page again */ void WiFiManager::handleWifiSave() { @@ -1377,7 +1456,7 @@ void WiFiManager::handleWifiSave() { page += FPSTR(HTTP_SCRIPT); page += FPSTR(HTTP_STYLE); page += FPSTR(HTTP_SAVED); - + if(_ssid == ""){ page = getHTTPHead(FPSTR(S_titlewifisettings)); // @token titleparamsaved page += FPSTR(HTTP_PARAMSAVED); @@ -1448,10 +1527,10 @@ void WiFiManager::doParamSave(){ if ( _saveparamscallback != NULL) { _saveparamscallback(); } - + } -/** +/** * HTTPD CALLBACK info page */ void WiFiManager::handleInfo() { @@ -1594,14 +1673,14 @@ String WiFiManager::getInfoData(String id){ #ifdef ESP8266 p = FPSTR(HTTP_INFO_corever); p.replace(FPSTR(T_1),(String)ESP.getCoreVersion()); - #endif + #endif } #ifdef ESP8266 else if(id==F("bootver")){ p = FPSTR(HTTP_INFO_bootver); p.replace(FPSTR(T_1),(String)system_get_boot_version()); } - #endif + #endif else if(id==F("cpufreq")){ p = FPSTR(HTTP_INFO_cpufreq); p.replace(FPSTR(T_1),(String)ESP.getCpuFreqMHz()); @@ -1616,14 +1695,14 @@ String WiFiManager::getInfoData(String id){ p.replace(FPSTR(T_1),(String)(ESP.getSketchSize())); p.replace(FPSTR(T_2),(String)(ESP.getSketchSize()+ESP.getFreeSketchSpace())); } - #endif + #endif #ifdef ESP8266 else if(id==F("memsmeter")){ p = FPSTR(HTTP_INFO_memsmeter); p.replace(FPSTR(T_1),(String)(ESP.getSketchSize())); p.replace(FPSTR(T_2),(String)(ESP.getSketchSize()+ESP.getFreeSketchSpace())); } - #endif + #endif else if(id==F("lastreset")){ #ifdef ESP8266 p = FPSTR(HTTP_INFO_lastreset); @@ -1728,7 +1807,7 @@ String WiFiManager::getInfoData(String id){ return p; } -/** +/** * HTTPD CALLBACK root or redirect to captive portal */ void WiFiManager::handleExit() { @@ -1741,7 +1820,7 @@ void WiFiManager::handleExit() { abort = true; } -/** +/** * HTTPD CALLBACK reset page */ void WiFiManager::handleReset() { @@ -1759,7 +1838,7 @@ void WiFiManager::handleReset() { reboot(); } -/** +/** * HTTPD CALLBACK erase page */ @@ -1787,10 +1866,33 @@ void WiFiManager::handleErase(boolean opt) { delay(2000); DEBUG_WM(F("RESETTING ESP")); reboot(); - } + } } -/** +/* Handle the removal of a known AP */ +void WiFiManager::handleDelete() { + DEBUG_WM(F("WiFi delete")); + + String ssid = server->arg("s"); + + // search SSID + int j; + for (j = 0; j < _apList_size; j++) { + if ( ssid == _apList[j].ssid) + break; + } + if ( j < _apList_size ) { + // shift list + _apList_size--; + for (; j < _apList_size; j++) { + _apList[j].ssid = _apList[j+1].ssid; + _apList[j].pass = _apList[j+1].pass; + } + } + + handleWifi(true); +} +/** * HTTPD CALLBACK 404 */ void WiFiManager::handleNotFound() { @@ -1817,12 +1919,12 @@ void WiFiManager::handleNotFound() { /** * HTTPD redirector - * Redirect to captive portal if we got a request for another domain. - * Return true in that case so the page handler do not try to handle the request again. + * Redirect to captive portal if we got a request for another domain. + * Return true in that case so the page handler do not try to handle the request again. */ boolean WiFiManager::captivePortal() { DEBUG_WM(DEBUG_DEV,"-> " + server->hostHeader()); - + if(!_enableCaptivePortal) return false; // skip redirections if (!isIp(server->hostHeader())) { @@ -1880,7 +1982,7 @@ void WiFiManager::reportStatus(String &page){ else{ str.replace(FPSTR(T_c),""); str.replace(FPSTR(T_r),""); - } + } } } else { @@ -1906,7 +2008,7 @@ bool WiFiManager::stopConfigPortal(){ abort = true; return true; } - return shutdownConfigPortal(); + return shutdownConfigPortal(); } /** @@ -1919,7 +2021,7 @@ bool WiFiManager::disconnect(){ if(WiFi.status() != WL_CONNECTED){ DEBUG_WM(DEBUG_VERBOSE,"Disconnecting: Not connected"); return false; - } + } DEBUG_WM("Disconnecting"); return WiFi_Disconnect(); } @@ -1982,17 +2084,17 @@ bool WiFiManager::erase(bool opt){ void WiFiManager::resetSettings() { DEBUG_WM(F("SETTINGS ERASED")); WiFi_enableSTA(true,true); // must be sta to disconnect erase - + if (_resetcallback != NULL) _resetcallback(); - + #ifdef ESP32 WiFi.disconnect(true,true); #else WiFi.persistent(true); WiFi.disconnect(true); WiFi.persistent(false); - #endif + #endif } // SETTERS @@ -2103,7 +2205,7 @@ void WiFiManager::setBreakAfterConfig(boolean shouldBreak) { /** * setAPCallback, set a callback when softap is started - * @access public + * @access public * @param {[type]} void (*func)(WiFiManager* wminstance) */ void WiFiManager::setAPCallback( std::function func ) { @@ -2114,7 +2216,7 @@ void WiFiManager::setAPCallback( std::function func ) { * setWebServerCallback, set a callback after webserver is reset, and before routes are setup * if we set webserver handlers before wm, they are used and wm is not by esp webserver * on events cannot be overrided once set, and are not mutiples - * @access public + * @access public * @param {[type]} void (*func)(void) */ void WiFiManager::setWebServerCallback( std::function func ) { @@ -2397,7 +2499,7 @@ void WiFiManager::setMenu(std::vector& menu){ /** * set params as sperate page not in wifi * NOT COMPATIBLE WITH setMenu! @todo scan menuids and insert param after wifi or something - * @param bool enable + * @param bool enable * @since $dev */ void WiFiManager::setParamsPage(bool enable){ @@ -2443,7 +2545,7 @@ String WiFiManager::getDefaultAPName(){ String hostString = String(WIFI_getChipId(),HEX); hostString.toUpperCase(); // char hostString[16] = {0}; - // sprintf(hostString, "%06X", ESP.getChipId()); + // sprintf(hostString, "%06X", ESP.getChipId()); return _wifissidprefix + "_" + hostString; } @@ -2484,7 +2586,7 @@ String WiFiManager::getWiFiSSID(bool persistent){ */ String WiFiManager::getWiFiPass(bool persistent){ return WiFi_psk(persistent); -} +} // DEBUG // @todo fix DEBUG_WM(0,0); @@ -2527,7 +2629,7 @@ void WiFiManager::DEBUG_WM(wm_debuglevel_t level,Generic text,Genericb textb) { free = info.total_free_bytes; max = info.largest_free_block; frag = 100 - (max * 100) / free; - _debugPort.printf("[MEM] free: %5d | max: %5d | frag: %3d%% \n", free, max, frag); + _debugPort.printf("[MEM] free: %5d | max: %5d | frag: %3d%% \n", free, max, frag); #endif } _debugPort.print("*WM: "); @@ -2547,7 +2649,7 @@ void WiFiManager::DEBUG_WM(wm_debuglevel_t level,Generic text,Genericb textb) { */ void WiFiManager::debugSoftAPConfig(){ wifi_country_t country; - + #ifdef ESP8266 softap_config config; wifi_softap_get_config(&config); @@ -2690,7 +2792,7 @@ bool WiFiManager::WiFiSetCountry(){ else if(_wificountry == "JP") ret = esp_wifi_set_country(&WM_COUNTRY_JP) == ESP_OK; else if(_wificountry == "CN") ret = esp_wifi_set_country(&WM_COUNTRY_CN) == ESP_OK; else DEBUG_WM(DEBUG_ERROR,"[ERROR] country code not found"); - + #elif defined(ESP8266) // if(WiFi.getMode() == WIFI_OFF); // exception if wifi not init! if(_wificountry == "US") ret = wifi_set_country((wifi_country_t*)&WM_COUNTRY_US); @@ -2698,13 +2800,13 @@ bool WiFiManager::WiFiSetCountry(){ else if(_wificountry == "CN") ret = wifi_set_country((wifi_country_t*)&WM_COUNTRY_CN); else DEBUG_WM(DEBUG_ERROR,"[ERROR] country code not found"); #endif - + if(ret) DEBUG_WM(DEBUG_VERBOSE,"esp_wifi_set_country: " + _wificountry); - else DEBUG_WM(DEBUG_ERROR,"[ERROR] esp_wifi_set_country failed"); + else DEBUG_WM(DEBUG_ERROR,"[ERROR] esp_wifi_set_country failed"); return ret; } -// set mode ignores WiFi.persistent +// set mode ignores WiFi.persistent bool WiFiManager::WiFi_Mode(WiFiMode_t m,bool persistent) { bool ret; #ifdef ESP8266 @@ -2735,7 +2837,7 @@ bool WiFiManager::WiFi_Disconnect() { DEBUG_WM(DEBUG_DEV,F("WIFI station disconnect")); ETS_UART_INTR_DISABLE(); // @todo probably not needed ret = wifi_station_disconnect(); - ETS_UART_INTR_ENABLE(); + ETS_UART_INTR_ENABLE(); return ret; } #elif defined(ESP32) @@ -2780,7 +2882,7 @@ bool WiFiManager::WiFi_enableSTA(bool enable) { bool WiFiManager::WiFi_eraseConfig() { #ifdef ESP8266 - #ifndef WM_FIXERASECONFIG + #ifndef WM_FIXERASECONFIG return ESP.eraseConfig(); #else // erase config BUG replacement @@ -2828,7 +2930,7 @@ String WiFiManager::WiFi_SSID(bool persistent) const{ memcpy(tmp, conf.ssid, sizeof(conf.ssid)); tmp[32] = 0; //nullterm in case of 32 char ssid return String(reinterpret_cast(tmp)); - + #elif defined(ESP32) if(persistent){ wifi_config_t conf; @@ -2859,7 +2961,7 @@ String WiFiManager::WiFi_psk(bool persistent) const { memcpy(tmp, conf.password, sizeof(conf.password)); tmp[64] = 0; //null term in case of 64 byte psk return String(reinterpret_cast(tmp)); - + #elif defined(ESP32) // only if wifi is init if(WiFiGenericClass::getMode() == WIFI_MODE_NULL){ @@ -2876,7 +2978,7 @@ void WiFiManager::WiFiEvent(WiFiEvent_t event,system_event_info_t info){ if(!_hasBegun){ // DEBUG_WM(DEBUG_VERBOSE,"[ERROR] WiFiEvent, not ready"); return; - } + } // DEBUG_WM(DEBUG_VERBOSE,"[EVENT]",event); if(event == SYSTEM_EVENT_STA_DISCONNECTED){ DEBUG_WM(DEBUG_VERBOSE,"[EVENT] WIFI_REASON:",info.disconnected.reason); diff --git a/src/WiFiManager.h b/src/WiFiManager.h index 97f6784..c2a0efd 100644 --- a/src/WiFiManager.h +++ b/src/WiFiManager.h @@ -1,9 +1,9 @@ /** * WiFiManager.h - * + * * WiFiManager, a library for the ESP8266/Arduino platform * for configuration of WiFi credentials using a Captive Portal - * + * * @author Creator tzapu * @author tablatronix * @version 0.0.0 @@ -24,11 +24,11 @@ // #define WM_MDNS // also set MDNS with sethostname // #define WM_FIXERASECONFIG // use erase flash fix -// #define WM_ERASE_NVS // esp32 erase(true) will erase NVS +// #define WM_ERASE_NVS // esp32 erase(true) will erase NVS // #define WM_RTC // esp32 info page will include reset reasons #ifdef ARDUINO_ESP8266_RELEASE_2_3_0 -#warning "ARDUINO_ESP8266_RELEASE_2_3_0, some WM features disabled" +#warning "ARDUINO_ESP8266_RELEASE_2_3_0, some WM features disabled" #define WM_NOASYNC // esp8266 no async scan wifi #endif @@ -57,8 +57,8 @@ #elif defined(ESP32) #include - #include - + #include + #define WIFI_getChipId() (uint32_t)ESP.getEfuseMac() #define WM_WIFIOPEN WIFI_AUTH_OPEN @@ -96,6 +96,9 @@ #ifndef WIFI_MANAGER_MAX_PARAMS #define WIFI_MANAGER_MAX_PARAMS 5 // params will autoincrement and realloc by this amount when max is reached #endif +#ifndef WIFI_MANAGER_MAX_NETWORKS + #define WIFI_MANAGER_MAX_NETWORKS 5 // maximal number of network credentials to be stored +#endif #define WFM_LABEL_BEFORE 1 #define WFM_LABEL_AFTER 2 @@ -103,7 +106,7 @@ class WiFiManagerParameter { public: - /** + /** Create custom parameters that can be added to the WiFiManager setup web page @id is used for HTTP queries and must not contain spaces nor other special characters */ @@ -138,6 +141,10 @@ class WiFiManagerParameter { friend class WiFiManager; }; +struct WiFiManagerCredentials { + String ssid; + String pass; +}; class WiFiManager { @@ -157,14 +164,21 @@ class WiFiManager //manually stop the config portal if started manually, stop immediatly if non blocking, flag abort if blocking bool stopConfigPortal(); - - //manually start the web portal, autoconnect does this automatically on connect failure + + //manually start the web portal, autoconnect does this automatically on connect failure void startWebPortal(); //manually stop the web portal if started manually void stopWebPortal(); // Run webserver processing, if setConfigPortalBlocking(false) boolean process(); + //add an AP to the list of known access points to be connected to + boolean addAP(char const *ssid, char const *password = NULL); + //returns the SSID and password for a pre-configured access point + //or NULL if no access point was found for the given index + //the returned values are read-only! + const WiFiManagerCredentials *getAP(uint8_t index) const; + // get the AP name of the config portal, so it can be used in the callback String getConfigPortalSSID(); int getRSSIasQuality(int RSSI); @@ -225,7 +239,7 @@ class WiFiManager void setSTAStaticIPConfig(IPAddress ip, IPAddress gw, IPAddress sn, IPAddress dns); //if this is set, it will exit after config, even if connection is unsuccessful. void setBreakAfterConfig(boolean shouldBreak); - // if this is set, portal will be blocking and wait until save or exit, + // if this is set, portal will be blocking and wait until save or exit, // is false user must manually `process()` to handle config portal, // setConfigPortalTimeout is ignored in this mode, user is responsible for closing configportal void setConfigPortalBlocking(boolean shouldBlock); @@ -245,7 +259,7 @@ class WiFiManager void setCaptivePortalEnable(boolean enabled); //if false, timeout captive portal even if a STA client connected to softAP (false), suggest disabling if captiveportal is open void setAPClientCheck(boolean enabled); - //if true, reset timeout when webclient connects (true), suggest disabling if captiveportal is open + //if true, reset timeout when webclient connects (true), suggest disabling if captiveportal is open void setWebPortalClientCheck(boolean enabled); // if true, enable autoreconnecting void setWiFiAutoReconnect(boolean enabled); @@ -266,14 +280,14 @@ class WiFiManager // set custom menu items and order void setMenu(std::vector& menu); void setMenu(const char* menu[], uint8_t size); - + // add params to its own menu page and remove from wifi, NOT TO BE COMBINED WITH setMenu! void setParamsPage(bool enable); // get last connection result, includes autoconnect and wifisave uint8_t getLastConxResult(); // get a status as string - String getWLStatusString(uint8_t status); + String getWLStatusString(uint8_t status); String getModeString(uint8_t mode); // check if the module has a saved ap to connect to bool getWiFiIsSaved(); @@ -288,13 +302,13 @@ class WiFiManager // debug output platform info and versioning void debugPlatformInfo(); String htmlEntities(String str); - + // set the country code for wifi settings void setCountry(String cc); // set body class (invert) void setClass(String str); String getDefaultAPName(); - + std::unique_ptr dnsServer; #if defined(ESP32) && defined(WM_WEBSERVERSHIM) @@ -302,7 +316,7 @@ class WiFiManager #else using WM_WebServer = ESP8266WebServer; #endif - + std::unique_ptr server; private: @@ -326,7 +340,7 @@ class WiFiManager String _apPassword = ""; String _ssid = ""; String _pass = ""; - + // options flags unsigned long _configPortalTimeout = 0; // ms close config portal loop if set (depending on _cp/webClientCheck options) unsigned long _connectTimeout = 0; // ms stop trying to connect to ap if set @@ -341,7 +355,7 @@ class WiFiManager unsigned long _startscan = 0; // ms for timing wifi scans int _cpclosedelay = 2000; // delay before wifisave, prevents captive portal from closing to fast. bool _cleanConnect = true; // disconnect before connect in connectwifi, increases stability on connects - + bool _disableSTA = false; // disable sta when starting ap, always bool _disableSTAConn = true; // disable sta when starting ap, if sta is not connected ( stability ) bool _channelSync = false; // use same wifi sta channel when starting ap @@ -363,7 +377,7 @@ class WiFiManager boolean _removeDuplicateAPs = true; // remove dup aps from wifiscan boolean _showPassword = false; // show or hide saved password on wifi form, might be a security issue! boolean _shouldBreakAfterConfig = false; // stop configportal on save failure - boolean _configPortalIsBlocking = true; // configportal enters blocking loop + boolean _configPortalIsBlocking = true; // configportal enters blocking loop boolean _enableCaptivePortal = true; // enable captive portal redirection boolean _userpersistent = true; // users preffered persistence to restore boolean _wifiAutoReconnect = true; // there is no platform getter for this, we must assume its true and make it so @@ -417,6 +431,7 @@ class WiFiManager void handleWifiSave(); void handleInfo(); void handleReset(); + void handleDelete(); void handleNotFound(); void handleExit(); void handleClose(); @@ -479,9 +494,9 @@ class WiFiManager boolean webPortalActive = false; boolean portalTimeoutResult = false; boolean portalAbortResult = false; - boolean storeSTAmode = true; // option store persistent STA mode in connectwifi + boolean storeSTAmode = true; // option store persistent STA mode in connectwifi int timer = 0; - + // WiFiManagerParameter int _paramsCount = 0; int _max_params; @@ -497,12 +512,12 @@ class WiFiManager } wm_debuglevel_t; boolean _debug = true; - + // build debuglevel support // @todo use DEBUG_ESP_x? #ifdef WM_DEBUG_LEVEL uint8_t _debugLevel = (uint8_t)WM_DEBUG_LEVEL; - #else + #else uint8_t _debugLevel = DEBUG_DEV; // default debug level #endif @@ -516,6 +531,9 @@ class WiFiManager template void DEBUG_WM(Generic text); + uint8_t _apList_size = 0; + WiFiManagerCredentials _apList[WIFI_MANAGER_MAX_NETWORKS]; + template void DEBUG_WM(wm_debuglevel_t level,Generic text); template @@ -544,4 +562,4 @@ class WiFiManager #endif -#endif \ No newline at end of file +#endif diff --git a/src/airmonitor.cpp b/src/airmonitor.cpp index 575a051..8c8022d 100644 --- a/src/airmonitor.cpp +++ b/src/airmonitor.cpp @@ -8,17 +8,17 @@ #include #include "config.h" -const char *airMonitorServerName = "api.airmonitor.pl"; +const char *airMonitorServerName PROGMEM = "api.airmonitor.pl"; const uint16_t airMonitorPort = 5000; void sendJson(JsonObject& json) { WiFiClient client; - Serial.print("\nconnecting to "); + Serial.print(F("\nconnecting to ")); Serial.println(airMonitorServerName); if (!client.connect(airMonitorServerName, airMonitorPort)) { - Serial.println("connection failed"); - Serial.println("wait 1 sec...\n"); + Serial.println(F("connection failed")); + Serial.println(F("wait 1 sec...\n")); delay(1000); return; } @@ -36,7 +36,7 @@ void sendJson(JsonObject& json) { // TODO: Support wrong error (!= 200) if (DEBUG) { - Serial.print("Length:"); + Serial.print(F("Length:")); Serial.println(measureJson(json)); serializeJsonPretty(json, Serial); Serial.println(line); @@ -96,6 +96,9 @@ void sendTHPData(float currentTemperature, float currentPressure, float currentH json["temperature"] = currentTemperature; json["humidity"] = currentHumidity; json["sensor"] = "SHT1x"; + } else if (!strcmp(THP_MODEL, "DS18B20")) { + json["temperature"] = currentTemperature; + json["sensor"] = "DS18B20"; } sendJson(json); } diff --git a/src/aqieco.cpp b/src/aqieco.cpp index 8184afb..37725d0 100644 --- a/src/aqieco.cpp +++ b/src/aqieco.cpp @@ -89,15 +89,19 @@ void sendDataToAqiEco(float currentTemperature, float currentPressure, float cur JsonObject humidity = sensordatavalues.createNestedObject(); humidity["value_type"] = "SHT1x_humidity"; humidity["value"] = String(currentHumidity); + } else if (!strcmp(THP_MODEL, "DS18B20")) { + JsonObject temperature = sensordatavalues.createNestedObject(); + temperature["value_type"] = "DS18B20_temperature"; + temperature["value"] = String(currentTemperature); } WiFiClient client; - Serial.print("\nconnecting to "); + Serial.print(F("\nconnecting to ")); Serial.println(AQI_ECO_HOST); if (!client.connect(AQI_ECO_HOST, 80)) { - Serial.println("connection failed"); + Serial.println(F("connection failed")); delay(1000); return; } @@ -124,18 +128,18 @@ void sendDataToAqiEco(float currentTemperature, float currentPressure, float cur if (DEBUG) { Serial.println(); - Serial.print("POST /u/"); + Serial.print(F("POST /u/")); Serial.print(AQI_ECO_PATH); - Serial.println(" HTTP/1.1"); - Serial.print("Host: "); + Serial.println(F(" HTTP/1.1")); + Serial.print(F("Host: ")); Serial.println(AQI_ECO_HOST); - Serial.println("Content-Type: application/json"); - Serial.println("X-PIN: 1"); - Serial.print("X-Sensor: smogly-"); + Serial.println(F("Content-Type: application/json")); + Serial.println(F("X-PIN: 1")); + Serial.print(F("X-Sensor: smogly-")); Serial.println(aqiEcoChipId); - Serial.print("Content-Length: "); + Serial.print(F("Content-Length: ")); Serial.println(measureJson(json)); - Serial.println("Connection: close"); + Serial.println(F("Connection: close")); Serial.println(); serializeJsonPretty(json, Serial); Serial.println("\n"); diff --git a/src/autoupdate.cpp b/src/autoupdate.cpp index 22cfa0e..7904f50 100644 --- a/src/autoupdate.cpp +++ b/src/autoupdate.cpp @@ -3,6 +3,8 @@ #include #include #include +#include +#include #elif defined(ARDUINO_ARCH_ESP32) #include #include @@ -21,7 +23,7 @@ const int httpsPort = 443; // Last update: 21.03.2019 const char GitHubfingerprint[] PROGMEM = "5F F1 60 31 09 04 3E F2 90 D2 B0 8A 50 38 04 E8 37 9F BC 76"; // api.github.com -const char HSfingerprint[] PROGMEM = "28 8B CC 29 1B 76 4B 93 45 F6 B2 36 A4 10 EF CE DF 0B D1 72"; // https://smogomierz.hs-silesia.pl +const char HSfingerprint[] PROGMEM = "10 ED 27 F6 39 5E 46 F0 90 8B 10 D2 6B 96 8A EF 43 7C FB 4F"; // https://smogomierz.hs-silesia.pl // ******************** Config End ******************** @@ -29,7 +31,7 @@ const char HSfingerprint[] PROGMEM = "28 8B CC 29 1B 76 4B 93 45 F6 B2 36 A4 10 /** * This is lets-encrypt-x3-cross-signed.pem */ -const char* rootCACertificate = \ +const char* rootCACertificate PROGMEM = \ "-----BEGIN CERTIFICATE-----\n" \ "MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/\n" \ "MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT\n" \ @@ -59,7 +61,6 @@ const char* rootCACertificate = \ "-----END CERTIFICATE-----\n"; #endif -#if defined(ARDUINO_ARCH_ESP32) // Set time via NTP, as required for x.509 validation void setUpdateClock() { configTime(0, 0, "pool.ntp.org", "time.nist.gov"); // UTC @@ -79,7 +80,6 @@ void setUpdateClock() { Serial.print(F("Current time: ")); Serial.print(asctime(&timeinfo)); } -#endif bool checkUpdate(int checkUpdateSW) { const char* ServerSW; @@ -87,6 +87,15 @@ bool checkUpdate(int checkUpdateSW) { #if defined(ARDUINO_ARCH_ESP8266) WiFiClient client; + // setUpdateClock(); + // WiFiClientSecure client; + // BearSSL::WiFiClientSecure client; + // client.setCACert_P(rootCACertificate, strlen(rootCACertificate)); + // Reading data over SSL may be slow, use an adequate timeout + // client.setInsecure(); + // client.setFingerprint(HSfingerprint); + // client.setTimeout(12000); // 12 Seconds + #elif defined(ARDUINO_ARCH_ESP32) setUpdateClock(); WiFiClientSecure client; @@ -95,23 +104,24 @@ bool checkUpdate(int checkUpdateSW) { client.setTimeout(12000); #endif - HTTPClient http; + HTTPClient https; #if defined(ARDUINO_ARCH_ESP8266) String latestJSONlink = "http://smogomierz.hs-silesia.pl/firmware/latest_esp8266.json"; #elif defined(ARDUINO_ARCH_ESP32) String latestJSONlink = "https://smogomierz.hs-silesia.pl/firmware/latest_esp32.json"; #endif - - if (http.begin(client, latestJSONlink)) { + + if (https.begin(client, latestJSONlink)) { delay(50); - int httpCode = http.GET(); + int httpCode = https.GET(); + //Serial.printf("GET... code: %d\n", httpCode); if (httpCode > 0) { // header has been send and Server response header has been handled //Serial.printf("GET... code: %d\n", httpCode); // file found at server if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) { - String payload = http.getString(); + String payload = https.getString(); delay(10); /* @@ -142,15 +152,15 @@ bool checkUpdate(int checkUpdateSW) { } } else { if (DEBUG) { - Serial.printf("GET... failed, error: %s\n", http.errorToString(httpCode).c_str()); + Serial.printf("GET... failed, error: %s\n", https.errorToString(httpCode).c_str()); } } } else { if (DEBUG) { - Serial.printf("Unable to connect\n"); + Serial.print(F("Unable to connect\n")); } } - http.end(); + https.end(); strncpy(SERVERSOFTWAREVERSION, ServerSW, 32); Data[0] = SERVERSOFTWAREVERSION; @@ -178,19 +188,19 @@ bool checkUpdate(int checkUpdateSW) { if (RepoSoftVer.toInt() > CurrentSoftVer.toInt()) { if (DEBUG) { - Serial.println("\nFirmware upgrade required!\n"); + Serial.println(F("\nFirmware upgrade required!\n")); } return true; } if (RepoSoftVer.toInt() == CurrentSoftVer.toInt()) { if (DEBUG) { - Serial.println("\nYou have the current version of the firmware!\n"); + Serial.println(F("\nYou have the current version of the firmware!\n")); } return false; } if (RepoSoftVer.toInt() < CurrentSoftVer.toInt()) { if (DEBUG) { - Serial.println("\nYou have newer firmware installed than it is available in the official repository!\n"); + Serial.println(F("\nYou have newer firmware installed than it is available in the official repository!\n")); } return false; } @@ -210,7 +220,7 @@ void doUpdate(int doUpdateSW) { if (checkUpdate(doUpdateSW)) { if (DEBUG) { - Serial.println("Starting firmware upgrade...\n"); + Serial.println(F("Starting firmware upgrade...\n")); #if defined(ARDUINO_ARCH_ESP8266) Serial.println("Free Heap: " + String(ESP.getFreeHeap())); delay(10); @@ -279,10 +289,10 @@ void doUpdate(int doUpdateSW) { #endif break; case HTTP_UPDATE_NO_UPDATES: - Serial.println("No update needed!"); + Serial.println(F("No update needed!")); break; case HTTP_UPDATE_OK: - Serial.println("Update OK!"); + Serial.println(F("Update OK!")); break; default: Serial.printf("Unexpected response code %d from ESPhttpUpdate.update\n", (int)ret); diff --git a/src/config.h b/src/config.h index b81253f..431a357 100644 --- a/src/config.h +++ b/src/config.h @@ -10,6 +10,23 @@ extern char THP_MODEL[32]; extern char DUST_MODEL[32]; extern bool FREQUENTMEASUREMENT; +extern bool SECOND_THP; + +extern char CONFIG_FIRST_THP_SDA[8]; +extern char CONFIG_FIRST_THP_SCL[8]; +extern int FIRST_THP_SDA; +extern int FIRST_THP_SCL; + +extern char CONFIG_SECOND_THP_SDA[8]; +extern char CONFIG_SECOND_THP_SCL[8]; +extern int SECOND_THP_SDA; +extern int SECOND_THP_SCL; + +extern char CONFIG_DUST_TX[8]; +extern char CONFIG_DUST_RX[8]; +extern int DUST_TX; +extern int DUST_RX; + extern int DUST_TIME; extern int NUMBEROFMEASUREMENTS; @@ -45,8 +62,10 @@ extern uint16_t MQTT_PORT; extern char MQTT_USER[64]; extern char MQTT_PASSWORD[64]; -extern bool MQTT_IP_IN_TOPIC; -extern bool MQTT_DEVICENAME_IN_TOPIC; +extern bool MQTT_IP_IN_TOPIC; +extern bool MQTT_DEVICENAME_IN_TOPIC; +extern bool MQTT_SLASH_AT_THE_BEGINNING; +extern bool MQTT_SLASH_AT_THE_END; extern char MQTT_TOPIC_TEMP[128]; extern char MQTT_TOPIC_HUMI[128]; @@ -68,7 +87,7 @@ extern bool DEBUG; extern bool AUTOUPDATE_ON; extern bool CONFIG_AUTH; -extern char CONFIG_USERNAME[256]; +extern char CONFIG_USERNAME[64]; extern char CONFIG_PASSWORD[256]; extern char MODEL[32]; @@ -88,9 +107,10 @@ const char PMSENSORVERSION[] = "PMS"; extern char SERVERSOFTWAREVERSION[32]; extern char CURRENTSOFTWAREVERSION[32]; #if defined(ARDUINO_ARCH_ESP8266) -const char SOFTWAREVERSION[] = "2.7.5 build " __TIME__ " " __DATE__; +const char SOFTWAREVERSION[] = "2.7.8 build " __TIME__ " " __DATE__; const char HARDWAREVERSION[] = "1.0 - ESP8266"; #elif defined(ARDUINO_ARCH_ESP32) -const char SOFTWAREVERSION[] = "2.7.5 build " __TIME__ " " __DATE__; +const char SOFTWAREVERSION[] = "2.7.8 build " __TIME__ " " __DATE__; const char HARDWAREVERSION[] = "2.0 - ESP32"; -#endif \ No newline at end of file + +#endif diff --git a/src/css/smogly.css b/src/css/smogly.css index b2ac911..ccbc1ca 100644 --- a/src/css/smogly.css +++ b/src/css/smogly.css @@ -9,4 +9,5 @@ * Copyright 2011-2019 The Bootstrap Authors * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */@import url("https://fonts.googleapis.com/css?family=Noto+Sans:400,700&display=swap&subset=latin-ext");:root{--blue: #05668D;--indigo: #6610f2;--purple: #6f42c1;--pink: #e83e8c;--red: #E74C3C;--orange: #fd7e14;--yellow: #F39C12;--green: #A3C635;--teal: #20c997;--cyan: #3498DB;--white: #fff;--gray: #95a5a6;--gray-dark: #343a40;--primary: #20BF55;--secondary: #95a5a6;--success: #A3C635;--info: #3498DB;--warning: #F39C12;--danger: #E74C3C;--light: #ecf0f1;--dark: #7b8a8b;--breakpoint-xs: 0;--breakpoint-sm: 576px;--breakpoint-md: 768px;--breakpoint-lg: 992px;--breakpoint-xl: 1200px;--font-family-sans-serif: "Noto Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}*,*::before,*::after{-webkit-box-sizing:border-box;box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:"Noto Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";font-size:0.9375rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0 !important}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:0.5rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#20BF55;text-decoration:none;background-color:transparent}a:hover{color:#20BF55;text-decoration:underline}a:not([href]){color:inherit;text-decoration:none}a:not([href]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:0.75rem;padding-bottom:0.75rem;color:#95a5a6;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:0.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button:not(:disabled),[type="button"]:not(:disabled),[type="reset"]:not(:disabled),[type="submit"]:not(:disabled){cursor:pointer}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{padding:0;border-style:none}input[type="radio"],input[type="checkbox"]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{outline-offset:-2px;-webkit-appearance:none}[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none !important}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{margin-bottom:0.5rem;font-weight:500;line-height:1.2}h1,.h1{font-size:3rem}h2,.h2{font-size:2.5rem}h3,.h3{font-size:2rem}h4,.h4{font-size:1.40625rem}h5,.h5{font-size:1.171875rem}h6,.h6{font-size:0.9375rem}.lead{font-size:1.171875rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,0.1)}small,.small{font-size:80%;font-weight:400}mark,.mark{padding:0.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:0.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.171875rem}.blockquote-footer{display:block;font-size:80%;color:#95a5a6}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:0.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:0.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:0.5rem;line-height:1}.figure-caption{font-size:90%;color:#95a5a6}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:0.2rem 0.4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:0.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width: 576px){.container{max-width:540px}}@media (min-width: 768px){.container{max-width:720px}}@media (min-width: 992px){.container{max-width:960px}}@media (min-width: 1200px){.container{max-width:1140px}}.container-fluid,.container-sm,.container-md,.container-lg,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width: 576px){.container,.container-sm{max-width:540px}}@media (min-width: 768px){.container,.container-sm,.container-md{max-width:720px}}@media (min-width: 992px){.container,.container-sm,.container-md,.container-lg{max-width:960px}}@media (min-width: 1200px){.container,.container-sm,.container-md,.container-lg,.container-xl{max-width:1140px}}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*="col-"]{padding-right:0;padding-left:0}.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col,.col-auto,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm,.col-sm-auto,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md,.col-md-auto,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg,.col-lg-auto,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-1>*{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-4>*{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-5>*{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-6>*{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.3333333333%}.offset-2{margin-left:16.6666666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333333333%}.offset-5{margin-left:41.6666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333333333%}.offset-8{margin-left:66.6666666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333333333%}.offset-11{margin-left:91.6666666667%}@media (min-width: 576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-sm-1>*{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-sm-4>*{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.3333333333%}.offset-sm-2{margin-left:16.6666666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333333333%}.offset-sm-5{margin-left:41.6666666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333333333%}.offset-sm-8{margin-left:66.6666666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333333333%}.offset-sm-11{margin-left:91.6666666667%}}@media (min-width: 768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-md-1>*{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-md-4>*{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-md-5>*{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-md-6>*{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.3333333333%}.offset-md-2{margin-left:16.6666666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333333333%}.offset-md-5{margin-left:41.6666666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333333333%}.offset-md-8{margin-left:66.6666666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333333333%}.offset-md-11{margin-left:91.6666666667%}}@media (min-width: 992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-lg-1>*{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-lg-4>*{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.3333333333%}.offset-lg-2{margin-left:16.6666666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333333333%}.offset-lg-5{margin-left:41.6666666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333333333%}.offset-lg-8{margin-left:66.6666666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333333333%}.offset-lg-11{margin-left:91.6666666667%}}@media (min-width: 1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-xl-1>*{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xl-4>*{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.3333333333%}.offset-xl-2{margin-left:16.6666666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333333333%}.offset-xl-5{margin-left:41.6666666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333333333%}.offset-xl-8{margin-left:66.6666666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333333333%}.offset-xl-11{margin-left:91.6666666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table th,.table td{padding:0.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm th,.table-sm td{padding:0.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered th,.table-bordered td{border:1px solid #dee2e6}.table-bordered thead th,.table-bordered thead td{border-bottom-width:2px}.table-borderless th,.table-borderless td,.table-borderless thead th,.table-borderless tbody+tbody{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:#ecf0f1}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,0.075)}.table-primary,.table-primary>th,.table-primary>td{background-color:#c4c9ce}.table-primary th,.table-primary td,.table-primary thead th,.table-primary tbody+tbody{border-color:#919ba4}.table-hover .table-primary:hover{background-color:#b6bcc2}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#b6bcc2}.table-secondary,.table-secondary>th,.table-secondary>td{background-color:#e1e6e6}.table-secondary th,.table-secondary td,.table-secondary thead th,.table-secondary tbody+tbody{border-color:#c8d0d1}.table-hover .table-secondary:hover{background-color:#d3dada}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#d3dada}.table-success,.table-success>th,.table-success>td{background-color:#beece3}.table-success th,.table-success td,.table-success thead th,.table-success tbody+tbody{border-color:#87dccc}.table-hover .table-success:hover{background-color:#aae6db}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#aae6db}.table-info,.table-info>th,.table-info>td{background-color:#c6e2f5}.table-info th,.table-info td,.table-info thead th,.table-info tbody+tbody{border-color:#95c9ec}.table-hover .table-info:hover{background-color:#b0d7f1}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#b0d7f1}.table-warning,.table-warning>th,.table-warning>td{background-color:#fce3bd}.table-warning th,.table-warning td,.table-warning thead th,.table-warning tbody+tbody{border-color:#f9cc84}.table-hover .table-warning:hover{background-color:#fbd9a5}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#fbd9a5}.table-danger,.table-danger>th,.table-danger>td{background-color:#f8cdc8}.table-danger th,.table-danger td,.table-danger thead th,.table-danger tbody+tbody{border-color:#f3a29a}.table-hover .table-danger:hover{background-color:#f5b8b1}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f5b8b1}.table-light,.table-light>th,.table-light>td{background-color:#fafbfb}.table-light th,.table-light td,.table-light thead th,.table-light tbody+tbody{border-color:#f5f7f8}.table-hover .table-light:hover{background-color:#ecf0f0}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ecf0f0}.table-dark,.table-dark>th,.table-dark>td{background-color:#dadedf}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#bac2c3}.table-hover .table-dark:hover{background-color:#ccd2d3}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#ccd2d3}.table-active,.table-active>th,.table-active>td{background-color:rgba(0,0,0,0.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,0.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,0.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#7b8a8b;background-color:#ecf0f1;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark th,.table-dark td,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,0.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,0.075)}@media (max-width: 575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width: 767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width: 991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width: 1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + 0.75rem + 2px);padding:0.375rem 0.75rem;font-size:0.9375rem;font-weight:400;line-height:1.5;color:#7b8a8b;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:0.25rem;-webkit-transition:border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control{-webkit-transition:none;transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #7b8a8b}.form-control:focus{color:#7b8a8b;background-color:#fff;border-color:#597ea2;outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(44,62,80,0.25);box-shadow:0 0 0 0.2rem rgba(44,62,80,0.25)}.form-control::-webkit-input-placeholder{color:#95a5a6;opacity:1}.form-control::-ms-input-placeholder{color:#95a5a6;opacity:1}.form-control::placeholder{color:#95a5a6;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#ecf0f1;opacity:1}select.form-control:focus::-ms-value{color:#7b8a8b;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.171875rem;line-height:1.5}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.8203125rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:0.375rem 0;margin-bottom:0;font-size:0.9375rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + 0.5rem + 2px);padding:0.25rem 0.5rem;font-size:0.8203125rem;line-height:1.5;border-radius:0.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:0.5rem 1rem;font-size:1.171875rem;line-height:1.5;border-radius:0.3rem}select.form-control[size],select.form-control[multiple]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:0.25rem}.form-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*="col-"]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:0.3rem;margin-left:-1.25rem}.form-check-input[disabled] ~ .form-check-label,.form-check-input:disabled ~ .form-check-label{color:#95a5a6}.form-check-label{margin-bottom:0}.form-check-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:0.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:0.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:0.25rem;font-size:80%;color:#20BF55}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:0.25rem 0.5rem;margin-top:.1rem;font-size:0.8203125rem;line-height:1.5;color:#fff;background-color:rgba(24,188,156,0.9);border-radius:0.25rem}.was-validated :valid ~ .valid-feedback,.was-validated :valid ~ .valid-tooltip,.is-valid ~ .valid-feedback,.is-valid ~ .valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#20BF55;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2320BF55' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#20BF55;-webkit-box-shadow:0 0 0 0.2rem rgba(24,188,156,0.25);box-shadow:0 0 0 0.2rem rgba(24,188,156,0.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .custom-select:valid,.custom-select.is-valid{border-color:#20BF55;padding-right:calc(0.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2320BF55' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .custom-select:valid:focus,.custom-select.is-valid:focus{border-color:#20BF55;-webkit-box-shadow:0 0 0 0.2rem rgba(24,188,156,0.25);box-shadow:0 0 0 0.2rem rgba(24,188,156,0.25)}.was-validated .form-check-input:valid ~ .form-check-label,.form-check-input.is-valid ~ .form-check-label{color:#20BF55}.was-validated .form-check-input:valid ~ .valid-feedback,.was-validated .form-check-input:valid ~ .valid-tooltip,.form-check-input.is-valid ~ .valid-feedback,.form-check-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-control-input:valid ~ .custom-control-label,.custom-control-input.is-valid ~ .custom-control-label{color:#20BF55}.was-validated .custom-control-input:valid ~ .custom-control-label::before,.custom-control-input.is-valid ~ .custom-control-label::before{border-color:#20BF55}.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before,.custom-control-input.is-valid:checked ~ .custom-control-label::before{border-color:#24e3be;background-color:#24e3be}.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before,.custom-control-input.is-valid:focus ~ .custom-control-label::before{-webkit-box-shadow:0 0 0 0.2rem rgba(24,188,156,0.25);box-shadow:0 0 0 0.2rem rgba(24,188,156,0.25)}.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before,.custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before{border-color:#20BF55}.was-validated .custom-file-input:valid ~ .custom-file-label,.custom-file-input.is-valid ~ .custom-file-label{border-color:#20BF55}.was-validated .custom-file-input:valid:focus ~ .custom-file-label,.custom-file-input.is-valid:focus ~ .custom-file-label{border-color:#20BF55;-webkit-box-shadow:0 0 0 0.2rem rgba(24,188,156,0.25);box-shadow:0 0 0 0.2rem rgba(24,188,156,0.25)}.invalid-feedback{display:none;width:100%;margin-top:0.25rem;font-size:80%;color:#E74C3C}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:0.25rem 0.5rem;margin-top:.1rem;font-size:0.8203125rem;line-height:1.5;color:#fff;background-color:rgba(231,76,60,0.9);border-radius:0.25rem}.was-validated :invalid ~ .invalid-feedback,.was-validated :invalid ~ .invalid-tooltip,.is-invalid ~ .invalid-feedback,.is-invalid ~ .invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#E74C3C;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23E74C3C' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23E74C3C' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#E74C3C;-webkit-box-shadow:0 0 0 0.2rem rgba(231,76,60,0.25);box-shadow:0 0 0 0.2rem rgba(231,76,60,0.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .custom-select:invalid,.custom-select.is-invalid{border-color:#E74C3C;padding-right:calc(0.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23E74C3C' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23E74C3C' stroke='none'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .custom-select:invalid:focus,.custom-select.is-invalid:focus{border-color:#E74C3C;-webkit-box-shadow:0 0 0 0.2rem rgba(231,76,60,0.25);box-shadow:0 0 0 0.2rem rgba(231,76,60,0.25)}.was-validated .form-check-input:invalid ~ .form-check-label,.form-check-input.is-invalid ~ .form-check-label{color:#E74C3C}.was-validated .form-check-input:invalid ~ .invalid-feedback,.was-validated .form-check-input:invalid ~ .invalid-tooltip,.form-check-input.is-invalid ~ .invalid-feedback,.form-check-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-control-input:invalid ~ .custom-control-label,.custom-control-input.is-invalid ~ .custom-control-label{color:#E74C3C}.was-validated .custom-control-input:invalid ~ .custom-control-label::before,.custom-control-input.is-invalid ~ .custom-control-label::before{border-color:#E74C3C}.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before,.custom-control-input.is-invalid:checked ~ .custom-control-label::before{border-color:#ed7669;background-color:#ed7669}.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before,.custom-control-input.is-invalid:focus ~ .custom-control-label::before{-webkit-box-shadow:0 0 0 0.2rem rgba(231,76,60,0.25);box-shadow:0 0 0 0.2rem rgba(231,76,60,0.25)}.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before,.custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before{border-color:#E74C3C}.was-validated .custom-file-input:invalid ~ .custom-file-label,.custom-file-input.is-invalid ~ .custom-file-label{border-color:#E74C3C}.was-validated .custom-file-input:invalid:focus ~ .custom-file-label,.custom-file-input.is-invalid:focus ~ .custom-file-label{border-color:#E74C3C;-webkit-box-shadow:0 0 0 0.2rem rgba(231,76,60,0.25);box-shadow:0 0 0 0.2rem rgba(231,76,60,0.25)}.form-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width: 576px){.form-inline label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group,.form-inline .custom-select{width:auto}.form-inline .form-check{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:0.25rem;margin-left:0}.form-inline .custom-control{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:0.375rem 0.75rem;font-size:0.9375rem;line-height:1.5;border-radius:0.25rem;-webkit-transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.btn{-webkit-transition:none;transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn:focus,.btn.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(44,62,80,0.25);box-shadow:0 0 0 0.2rem rgba(44,62,80,0.25)}.btn.disabled,.btn:disabled{opacity:0.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#20BF55;border-color:#20BF55}.btn-primary:hover{color:#fff;background-color:#1e2b37;border-color:#1a252f}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#1e2b37;border-color:#1a252f;-webkit-box-shadow:0 0 0 0.2rem rgba(76,91,106,0.5);box-shadow:0 0 0 0.2rem rgba(76,91,106,0.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#20BF55;border-color:#20BF55}.btn-primary:not(:disabled):not(.disabled):active,.btn-primary:not(:disabled):not(.disabled).active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#1a252f;border-color:#151e27}.btn-primary:not(:disabled):not(.disabled):active:focus,.btn-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(76,91,106,0.5);box-shadow:0 0 0 0.2rem rgba(76,91,106,0.5)}.btn-secondary{color:#fff;background-color:#95a5a6;border-color:#95a5a6}.btn-secondary:hover{color:#fff;background-color:#809395;border-color:#798d8f}.btn-secondary:focus,.btn-secondary.focus{color:#fff;background-color:#809395;border-color:#798d8f;-webkit-box-shadow:0 0 0 0.2rem rgba(165,179,179,0.5);box-shadow:0 0 0 0.2rem rgba(165,179,179,0.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#95a5a6;border-color:#95a5a6}.btn-secondary:not(:disabled):not(.disabled):active,.btn-secondary:not(:disabled):not(.disabled).active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#798d8f;border-color:#738789}.btn-secondary:not(:disabled):not(.disabled):active:focus,.btn-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(165,179,179,0.5);box-shadow:0 0 0 0.2rem rgba(165,179,179,0.5)}.btn-success{color:#fff;background-color:#20BF55;border-color:#20BF55}.btn-success:hover{color:#fff;background-color:#149a80;border-color:#128f76}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#149a80;border-color:#128f76;-webkit-box-shadow:0 0 0 0.2rem rgba(59,198,171,0.5);box-shadow:0 0 0 0.2rem rgba(59,198,171,0.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#20BF55;border-color:#20BF55}.btn-success:not(:disabled):not(.disabled):active,.btn-success:not(:disabled):not(.disabled).active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#128f76;border-color:#11836d}.btn-success:not(:disabled):not(.disabled):active:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.show>.btn-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(59,198,171,0.5);box-shadow:0 0 0 0.2rem rgba(59,198,171,0.5)}.btn-info{color:#fff;background-color:#3498DB;border-color:#3498DB}.btn-info:hover{color:#fff;background-color:#2384c6;border-color:#217dbb}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#2384c6;border-color:#217dbb;-webkit-box-shadow:0 0 0 0.2rem rgba(82,167,224,0.5);box-shadow:0 0 0 0.2rem rgba(82,167,224,0.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#3498DB;border-color:#3498DB}.btn-info:not(:disabled):not(.disabled):active,.btn-info:not(:disabled):not(.disabled).active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#217dbb;border-color:#1f76b0}.btn-info:not(:disabled):not(.disabled):active:focus,.btn-info:not(:disabled):not(.disabled).active:focus,.show>.btn-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(82,167,224,0.5);box-shadow:0 0 0 0.2rem rgba(82,167,224,0.5)}.btn-warning{color:#fff;background-color:#F39C12;border-color:#F39C12}.btn-warning:hover{color:#fff;background-color:#d4860b;border-color:#c87f0a}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#d4860b;border-color:#c87f0a;-webkit-box-shadow:0 0 0 0.2rem rgba(245,171,54,0.5);box-shadow:0 0 0 0.2rem rgba(245,171,54,0.5)}.btn-warning.disabled,.btn-warning:disabled{color:#fff;background-color:#F39C12;border-color:#F39C12}.btn-warning:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled).active,.show>.btn-warning.dropdown-toggle{color:#fff;background-color:#c87f0a;border-color:#bc770a}.btn-warning:not(:disabled):not(.disabled):active:focus,.btn-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(245,171,54,0.5);box-shadow:0 0 0 0.2rem rgba(245,171,54,0.5)}.btn-danger{color:#fff;background-color:#E74C3C;border-color:#E74C3C}.btn-danger:hover{color:#fff;background-color:#e12e1c;border-color:#d62c1a}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#e12e1c;border-color:#d62c1a;-webkit-box-shadow:0 0 0 0.2rem rgba(235,103,89,0.5);box-shadow:0 0 0 0.2rem rgba(235,103,89,0.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#E74C3C;border-color:#E74C3C}.btn-danger:not(:disabled):not(.disabled):active,.btn-danger:not(:disabled):not(.disabled).active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#d62c1a;border-color:#ca2a19}.btn-danger:not(:disabled):not(.disabled):active:focus,.btn-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(235,103,89,0.5);box-shadow:0 0 0 0.2rem rgba(235,103,89,0.5)}.btn-light{color:#212529;background-color:#ecf0f1;border-color:#ecf0f1}.btn-light:hover{color:#212529;background-color:#d6dfe1;border-color:#cfd9db}.btn-light:focus,.btn-light.focus{color:#212529;background-color:#d6dfe1;border-color:#cfd9db;-webkit-box-shadow:0 0 0 0.2rem rgba(206,210,211,0.5);box-shadow:0 0 0 0.2rem rgba(206,210,211,0.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#ecf0f1;border-color:#ecf0f1}.btn-light:not(:disabled):not(.disabled):active,.btn-light:not(:disabled):not(.disabled).active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#cfd9db;border-color:#c7d3d6}.btn-light:not(:disabled):not(.disabled):active:focus,.btn-light:not(:disabled):not(.disabled).active:focus,.show>.btn-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(206,210,211,0.5);box-shadow:0 0 0 0.2rem rgba(206,210,211,0.5)}.btn-dark{color:#fff;background-color:#7b8a8b;border-color:#7b8a8b}.btn-dark:hover{color:#fff;background-color:#697677;border-color:#636f70}.btn-dark:focus,.btn-dark.focus{color:#fff;background-color:#697677;border-color:#636f70;-webkit-box-shadow:0 0 0 0.2rem rgba(143,156,156,0.5);box-shadow:0 0 0 0.2rem rgba(143,156,156,0.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#7b8a8b;border-color:#7b8a8b}.btn-dark:not(:disabled):not(.disabled):active,.btn-dark:not(:disabled):not(.disabled).active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#636f70;border-color:#5d696a}.btn-dark:not(:disabled):not(.disabled):active:focus,.btn-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(143,156,156,0.5);box-shadow:0 0 0 0.2rem rgba(143,156,156,0.5)}.btn-outline-primary{color:#20BF55;border-color:#20BF55}.btn-outline-primary:hover{color:#fff;background-color:#20BF55;border-color:#20BF55}.btn-outline-primary:focus,.btn-outline-primary.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(44,62,80,0.5);box-shadow:0 0 0 0.2rem rgba(44,62,80,0.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#20BF55;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled):active,.btn-outline-primary:not(:disabled):not(.disabled).active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#20BF55;border-color:#20BF55}.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(44,62,80,0.5);box-shadow:0 0 0 0.2rem rgba(44,62,80,0.5)}.btn-outline-secondary{color:#95a5a6;border-color:#95a5a6}.btn-outline-secondary:hover{color:#fff;background-color:#95a5a6;border-color:#95a5a6}.btn-outline-secondary:focus,.btn-outline-secondary.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(149,165,166,0.5);box-shadow:0 0 0 0.2rem rgba(149,165,166,0.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#95a5a6;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled):active,.btn-outline-secondary:not(:disabled):not(.disabled).active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#95a5a6;border-color:#95a5a6}.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(149,165,166,0.5);box-shadow:0 0 0 0.2rem rgba(149,165,166,0.5)}.btn-outline-success{color:#20BF55;border-color:#20BF55}.btn-outline-success:hover{color:#fff;background-color:#20BF55;border-color:#20BF55}.btn-outline-success:focus,.btn-outline-success.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(24,188,156,0.5);box-shadow:0 0 0 0.2rem rgba(24,188,156,0.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#20BF55;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled):active,.btn-outline-success:not(:disabled):not(.disabled).active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#20BF55;border-color:#20BF55}.btn-outline-success:not(:disabled):not(.disabled):active:focus,.btn-outline-success:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(24,188,156,0.5);box-shadow:0 0 0 0.2rem rgba(24,188,156,0.5)}.btn-outline-info{color:#3498DB;border-color:#3498DB}.btn-outline-info:hover{color:#fff;background-color:#3498DB;border-color:#3498DB}.btn-outline-info:focus,.btn-outline-info.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(52,152,219,0.5);box-shadow:0 0 0 0.2rem rgba(52,152,219,0.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#3498DB;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled):active,.btn-outline-info:not(:disabled):not(.disabled).active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#3498DB;border-color:#3498DB}.btn-outline-info:not(:disabled):not(.disabled):active:focus,.btn-outline-info:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(52,152,219,0.5);box-shadow:0 0 0 0.2rem rgba(52,152,219,0.5)}.btn-outline-warning{color:#F39C12;border-color:#F39C12}.btn-outline-warning:hover{color:#fff;background-color:#F39C12;border-color:#F39C12}.btn-outline-warning:focus,.btn-outline-warning.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(243,156,18,0.5);box-shadow:0 0 0 0.2rem rgba(243,156,18,0.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#F39C12;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled):active,.btn-outline-warning:not(:disabled):not(.disabled).active,.show>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#F39C12;border-color:#F39C12}.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(243,156,18,0.5);box-shadow:0 0 0 0.2rem rgba(243,156,18,0.5)}.btn-outline-danger{color:#E74C3C;border-color:#E74C3C}.btn-outline-danger:hover{color:#fff;background-color:#E74C3C;border-color:#E74C3C}.btn-outline-danger:focus,.btn-outline-danger.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(231,76,60,0.5);box-shadow:0 0 0 0.2rem rgba(231,76,60,0.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#E74C3C;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled):active,.btn-outline-danger:not(:disabled):not(.disabled).active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#E74C3C;border-color:#E74C3C}.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(231,76,60,0.5);box-shadow:0 0 0 0.2rem rgba(231,76,60,0.5)}.btn-outline-light{color:#ecf0f1;border-color:#ecf0f1}.btn-outline-light:hover{color:#212529;background-color:#ecf0f1;border-color:#ecf0f1}.btn-outline-light:focus,.btn-outline-light.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(236,240,241,0.5);box-shadow:0 0 0 0.2rem rgba(236,240,241,0.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#ecf0f1;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled):active,.btn-outline-light:not(:disabled):not(.disabled).active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#ecf0f1;border-color:#ecf0f1}.btn-outline-light:not(:disabled):not(.disabled):active:focus,.btn-outline-light:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(236,240,241,0.5);box-shadow:0 0 0 0.2rem rgba(236,240,241,0.5)}.btn-outline-dark{color:#7b8a8b;border-color:#7b8a8b}.btn-outline-dark:hover{color:#fff;background-color:#7b8a8b;border-color:#7b8a8b}.btn-outline-dark:focus,.btn-outline-dark.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(123,138,139,0.5);box-shadow:0 0 0 0.2rem rgba(123,138,139,0.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#7b8a8b;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled):active,.btn-outline-dark:not(:disabled):not(.disabled).active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#7b8a8b;border-color:#7b8a8b}.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(123,138,139,0.5);box-shadow:0 0 0 0.2rem rgba(123,138,139,0.5)}.btn-link{font-weight:400;color:#20BF55;text-decoration:none}.btn-link:hover{color:#00A896;text-decoration:underline}.btn-link:focus,.btn-link.focus{text-decoration:underline;-webkit-box-shadow:none;box-shadow:none}.btn-link:disabled,.btn-link.disabled{color:#95a5a6;pointer-events:none}.btn-lg,.btn-group-lg>.btn{padding:0.5rem 1rem;font-size:1.171875rem;line-height:1.5;border-radius:0.3rem}.btn-sm,.btn-group-sm>.btn{padding:0.25rem 0.5rem;font-size:0.8203125rem;line-height:1.5;border-radius:0.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:0.5rem}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{-webkit-transition:opacity 0.15s linear;transition:opacity 0.15s linear}@media (prefers-reduced-motion: reduce){.fade{-webkit-transition:none;transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height 0.35s ease;transition:height 0.35s ease}@media (prefers-reduced-motion: reduce){.collapsing{-webkit-transition:none;transition:none}}.dropup,.dropright,.dropdown,.dropleft{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:0.255em;vertical-align:0.255em;content:"";border-top:0.3em solid;border-right:0.3em solid transparent;border-bottom:0;border-left:0.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:0.5rem 0;margin:0.125rem 0 0;font-size:0.9375rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.15);border-radius:0.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width: 576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width: 768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width: 992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width: 1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:0.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:0.255em;vertical-align:0.255em;content:"";border-top:0;border-right:0.3em solid transparent;border-bottom:0.3em solid;border-left:0.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:0.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:0.255em;vertical-align:0.255em;content:"";border-top:0.3em solid transparent;border-right:0;border-bottom:0.3em solid transparent;border-left:0.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:0.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:0.255em;vertical-align:0.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:0.255em;vertical-align:0.255em;content:"";border-top:0.3em solid transparent;border-right:0.3em solid;border-bottom:0.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^="top"],.dropdown-menu[x-placement^="right"],.dropdown-menu[x-placement^="bottom"],.dropdown-menu[x-placement^="left"]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:0.5rem 0;overflow:hidden;border-top:1px solid #ecf0f1}.dropdown-item{display:block;width:100%;padding:0.25rem 1.5rem;clear:both;font-weight:400;color:#7b8a8b;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:hover,.dropdown-item:focus{color:#fff;text-decoration:none;background-color:#20BF55}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#20BF55}.dropdown-item.disabled,.dropdown-item:disabled{color:#95a5a6;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:0.5rem 1.5rem;margin-bottom:0;font-size:0.8203125rem;color:#95a5a6;white-space:nowrap}.dropdown-item-text{display:block;padding:0.25rem 1.5rem;color:#7b8a8b}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover{z-index:1}.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child){margin-left:-1px}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:0.5625rem;padding-left:0.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:0.375rem;padding-left:0.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:0.75rem;padding-left:0.75rem}.btn-group-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type="radio"],.btn-group-toggle>.btn input[type="checkbox"],.btn-group-toggle>.btn-group>.btn input[type="radio"],.btn-group-toggle>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-control-plaintext,.input-group>.custom-select,.input-group>.custom-file{position:relative;-webkit-box-flex:1;-ms-flex:1 1 0%;flex:1 1 0%;min-width:0;margin-bottom:0}.input-group>.form-control+.form-control,.input-group>.form-control+.custom-select,.input-group>.form-control+.custom-file,.input-group>.form-control-plaintext+.form-control,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.custom-file,.input-group>.custom-select+.form-control,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.custom-file,.input-group>.custom-file+.form-control,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.custom-file{margin-left:-1px}.input-group>.form-control:focus,.input-group>.custom-select:focus,.input-group>.custom-file .custom-file-input:focus ~ .custom-file-label{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.form-control:not(:last-child),.input-group>.custom-select:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.form-control:not(:first-child),.input-group>.custom-select:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-prepend,.input-group-append{display:-webkit-box;display:-ms-flexbox;display:flex}.input-group-prepend .btn,.input-group-append .btn{position:relative;z-index:2}.input-group-prepend .btn:focus,.input-group-append .btn:focus{z-index:3}.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.input-group-text,.input-group-append .input-group-text+.btn{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0.375rem 0.75rem;margin-bottom:0;font-size:0.9375rem;font-weight:400;line-height:1.5;color:#7b8a8b;text-align:center;white-space:nowrap;background-color:#ecf0f1;border:1px solid #ced4da;border-radius:0.25rem}.input-group-text input[type="radio"],.input-group-text input[type="checkbox"]{margin-top:0}.input-group-lg>.form-control:not(textarea),.input-group-lg>.custom-select{height:calc(1.5em + 1rem + 2px)}.input-group-lg>.form-control,.input-group-lg>.custom-select,.input-group-lg>.input-group-prepend>.input-group-text,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-append>.btn{padding:0.5rem 1rem;font-size:1.171875rem;line-height:1.5;border-radius:0.3rem}.input-group-sm>.form-control:not(textarea),.input-group-sm>.custom-select{height:calc(1.5em + 0.5rem + 2px)}.input-group-sm>.form-control,.input-group-sm>.custom-select,.input-group-sm>.input-group-prepend>.input-group-text,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-append>.btn{padding:0.25rem 0.5rem;font-size:0.8203125rem;line-height:1.5;border-radius:0.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text,.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.40625rem;padding-left:1.5rem}.custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.203125rem;opacity:0}.custom-control-input:checked ~ .custom-control-label::before{color:#fff;border-color:#20BF55;background-color:#20BF55}.custom-control-input:focus ~ .custom-control-label::before{-webkit-box-shadow:0 0 0 0.2rem rgba(44,62,80,0.25);box-shadow:0 0 0 0.2rem rgba(44,62,80,0.25)}.custom-control-input:focus:not(:checked) ~ .custom-control-label::before{border-color:#597ea2}.custom-control-input:not(:disabled):active ~ .custom-control-label::before{color:#fff;background-color:#7997b5;border-color:#7997b5}.custom-control-input[disabled] ~ .custom-control-label,.custom-control-input:disabled ~ .custom-control-label{color:#95a5a6}.custom-control-input[disabled] ~ .custom-control-label::before,.custom-control-input:disabled ~ .custom-control-label::before{background-color:#ecf0f1}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:0.203125rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#b4bcc2 solid 1px}.custom-control-label::after{position:absolute;top:0.203125rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50% / 50% 50%}.custom-checkbox .custom-control-label::before{border-radius:0.25rem}.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before{border-color:#20BF55;background-color:#20BF55}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(44,62,80,0.5)}.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before{background-color:rgba(44,62,80,0.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(44,62,80,0.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:0.5rem}.custom-switch .custom-control-label::after{top:calc(0.203125rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#b4bcc2;border-radius:0.5rem;-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.custom-switch .custom-control-label::after{-webkit-transition:none;transition:none}}.custom-switch .custom-control-input:checked ~ .custom-control-label::after{background-color:#fff;-webkit-transform:translateX(0.75rem);transform:translateX(0.75rem)}.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(44,62,80,0.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + 0.75rem + 2px);padding:0.375rem 1.75rem 0.375rem 0.75rem;font-size:0.9375rem;font-weight:400;line-height:1.5;color:#7b8a8b;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px;border:1px solid #ced4da;border-radius:0.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#597ea2;outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(44,62,80,0.25);box-shadow:0 0 0 0.2rem rgba(44,62,80,0.25)}.custom-select:focus::-ms-value{color:#7b8a8b;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:0.75rem;background-image:none}.custom-select:disabled{color:#95a5a6;background-color:#ecf0f1}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #7b8a8b}.custom-select-sm{height:calc(1.5em + 0.5rem + 2px);padding-top:0.25rem;padding-bottom:0.25rem;padding-left:0.5rem;font-size:0.8203125rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:0.5rem;padding-bottom:0.5rem;padding-left:1rem;font-size:1.171875rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + 0.75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + 0.75rem + 2px);margin:0;opacity:0}.custom-file-input:focus ~ .custom-file-label{border-color:#597ea2;-webkit-box-shadow:0 0 0 0.2rem rgba(44,62,80,0.25);box-shadow:0 0 0 0.2rem rgba(44,62,80,0.25)}.custom-file-input[disabled] ~ .custom-file-label,.custom-file-input:disabled ~ .custom-file-label{background-color:#ecf0f1}.custom-file-input:lang(en) ~ .custom-file-label::after{content:"Browse"}.custom-file-input ~ .custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + 0.75rem + 2px);padding:0.375rem 0.75rem;font-weight:400;line-height:1.5;color:#7b8a8b;background-color:#fff;border:1px solid #ced4da;border-radius:0.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + 0.75rem);padding:0.375rem 0.75rem;line-height:1.5;color:#7b8a8b;content:"Browse";background-color:#ecf0f1;border-left:inherit;border-radius:0 0.25rem 0.25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:none}.custom-range:focus::-webkit-slider-thumb{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(44,62,80,0.25);box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(44,62,80,0.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(44,62,80,0.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(44,62,80,0.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;background-color:#20BF55;border:0;border-radius:1rem;-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion: reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#7997b5}.custom-range::-webkit-slider-runnable-track{width:100%;height:0.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#20BF55;border:0;border-radius:1rem;-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion: reduce){.custom-range::-moz-range-thumb{-webkit-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#7997b5}.custom-range::-moz-range-track{width:100%;height:0.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:0.2rem;margin-left:0.2rem;background-color:#20BF55;border:0;border-radius:1rem;-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){.custom-range::-ms-thumb{-webkit-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#7997b5}.custom-range::-ms-track{width:100%;height:0.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:0.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#b4bcc2}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#b4bcc2}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#b4bcc2}.custom-control-label::before,.custom-file-label,.custom-select{-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.custom-control-label::before,.custom-file-label,.custom-select{-webkit-transition:none;transition:none}}.nav{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:0.5rem 2rem}.nav-link:hover,.nav-link:focus{text-decoration:none}.nav-link.disabled{color:#95a5a6;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #ecf0f1}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:0.25rem;border-top-right-radius:0.25rem}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#ecf0f1 #ecf0f1 #ecf0f1}.nav-tabs .nav-link.disabled{color:#95a5a6;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#7b8a8b;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:0.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#20BF55}.nav-fill .nav-item{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-sm,.navbar .container-md,.navbar .container-lg,.navbar .container-xl{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:0.1rem;padding-bottom:0.1rem;margin-right:1rem;font-size:1.171875rem;line-height:inherit;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:0.5rem;padding-bottom:0.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:0.25rem 0.75rem;font-size:1.171875rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:0.25rem}.navbar-toggler:hover,.navbar-toggler:focus{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width: 575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width: 576px){.navbar-expand-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width: 767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-md,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width: 768px){.navbar-expand-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-md,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width: 991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width: 992px){.navbar-expand-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width: 1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width: 1200px){.navbar-expand-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-sm,.navbar-expand>.container-md,.navbar-expand>.container-lg,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-sm,.navbar-expand>.container-md,.navbar-expand>.container-lg,.navbar-expand>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,0.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,0.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,0.5)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,0.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,0.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,0.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,0.5);border-color:rgba(0,0,0,0.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,0.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,0.9)}.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,0,0,0.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fff}.navbar-dark .navbar-nav .nav-link{color:#fff}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:#757575}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,0.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:#fff;border-color:rgba(255,255,255,0.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='%23fff' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:#fff}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,0.125);border-radius:0.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:0.25rem;border-top-right-radius:0.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:0.25rem;border-bottom-left-radius:0.25rem}.card-body{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:0.75rem}.card-subtitle{margin-top:-0.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:0.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,0.03);border-bottom:1px solid rgba(0,0,0,0.125)}.card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:0.75rem 1.25rem;background-color:rgba(0,0,0,0.03);border-top:1px solid rgba(0,0,0,0.125)}.card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.card-header-tabs{margin-right:-0.625rem;margin-bottom:-0.75rem;margin-left:-0.625rem;border-bottom:0}.card-header-pills{margin-right:-0.625rem;margin-left:-0.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img,.card-img-top,.card-img-bottom{-ms-flex-negative:0;flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(0.25rem - 1px);border-bottom-left-radius:calc(0.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width: 576px){.card-deck{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width: 576px){.card-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:0.75rem}@media (min-width: 576px){.card-columns{-webkit-column-count:3;column-count:3;-webkit-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:0.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#ecf0f1;border-radius:0.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:0.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:0.5rem;color:#95a5a6;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#95a5a6}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:0.25rem}.page-link{position:relative;display:block;padding:0.5rem 0.75rem;margin-left:0;line-height:1.25;color:#fff;background-color:#20BF55;border:0 solid transparent}.page-link:hover{z-index:2;color:#fff;text-decoration:none;background-color:#00A896;border-color:transparent}.page-link:focus{z-index:3;outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(44,62,80,0.25);box-shadow:0 0 0 0.2rem rgba(44,62,80,0.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:0.25rem;border-bottom-left-radius:0.25rem}.page-item:last-child .page-link{border-top-right-radius:0.25rem;border-bottom-right-radius:0.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#00A896;border-color:transparent}.page-item.disabled .page-link{color:#ecf0f1;pointer-events:none;cursor:auto;background-color:#3be6c4;border-color:transparent}.pagination-lg .page-link{padding:0.75rem 1.5rem;font-size:1.171875rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:0.3rem;border-bottom-left-radius:0.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:0.3rem;border-bottom-right-radius:0.3rem}.pagination-sm .page-link{padding:0.25rem 0.5rem;font-size:0.8203125rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:0.2rem;border-bottom-left-radius:0.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:0.2rem;border-bottom-right-radius:0.2rem}.badge{display:inline-block;padding:0.25em 0.4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:0.25rem;-webkit-transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.badge{-webkit-transition:none;transition:none}}a.badge:hover,a.badge:focus{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:0.6em;padding-left:0.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#20BF55}a.badge-primary:hover,a.badge-primary:focus{color:#fff;background-color:#1a252f}a.badge-primary:focus,a.badge-primary.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(44,62,80,0.5);box-shadow:0 0 0 0.2rem rgba(44,62,80,0.5)}.badge-secondary{color:#fff;background-color:#95a5a6}a.badge-secondary:hover,a.badge-secondary:focus{color:#fff;background-color:#798d8f}a.badge-secondary:focus,a.badge-secondary.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(149,165,166,0.5);box-shadow:0 0 0 0.2rem rgba(149,165,166,0.5)}.badge-success{color:#fff;background-color:#20BF55}a.badge-success:hover,a.badge-success:focus{color:#fff;background-color:#128f76}a.badge-success:focus,a.badge-success.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(24,188,156,0.5);box-shadow:0 0 0 0.2rem rgba(24,188,156,0.5)}.badge-info{color:#fff;background-color:#3498DB}a.badge-info:hover,a.badge-info:focus{color:#fff;background-color:#217dbb}a.badge-info:focus,a.badge-info.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(52,152,219,0.5);box-shadow:0 0 0 0.2rem rgba(52,152,219,0.5)}.badge-warning{color:#fff;background-color:#F39C12}a.badge-warning:hover,a.badge-warning:focus{color:#fff;background-color:#c87f0a}a.badge-warning:focus,a.badge-warning.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(243,156,18,0.5);box-shadow:0 0 0 0.2rem rgba(243,156,18,0.5)}.badge-danger{color:#fff;background-color:#E74C3C}a.badge-danger:hover,a.badge-danger:focus{color:#fff;background-color:#d62c1a}a.badge-danger:focus,a.badge-danger.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(231,76,60,0.5);box-shadow:0 0 0 0.2rem rgba(231,76,60,0.5)}.badge-light{color:#212529;background-color:#ecf0f1}a.badge-light:hover,a.badge-light:focus{color:#212529;background-color:#cfd9db}a.badge-light:focus,a.badge-light.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(236,240,241,0.5);box-shadow:0 0 0 0.2rem rgba(236,240,241,0.5)}.badge-dark{color:#fff;background-color:#7b8a8b}a.badge-dark:hover,a.badge-dark:focus{color:#fff;background-color:#636f70}a.badge-dark:focus,a.badge-dark.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(123,138,139,0.5);box-shadow:0 0 0 0.2rem rgba(123,138,139,0.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#ecf0f1;border-radius:0.3rem}@media (min-width: 576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:0.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:0.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3.90625rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:0.75rem 1.25rem;color:inherit}.alert-primary{color:#17202a;background-color:#d5d8dc;border-color:#c4c9ce}.alert-primary hr{border-top-color:#b6bcc2}.alert-primary .alert-link{color:#050709}.alert-secondary{color:#4d5656;background-color:#eaeded;border-color:#e1e6e6}.alert-secondary hr{border-top-color:#d3dada}.alert-secondary .alert-link{color:#353b3b}.alert-success{color:#0c6251;background-color:#d1f2eb;border-color:#beece3}.alert-success hr{border-top-color:#aae6db}.alert-success .alert-link{color:#06352b}.alert-info{color:#1b4f72;background-color:#d6eaf8;border-color:#c6e2f5}.alert-info hr{border-top-color:#b0d7f1}.alert-info .alert-link{color:#113249}.alert-warning{color:#7e5109;background-color:#fdebd0;border-color:#fce3bd}.alert-warning hr{border-top-color:#fbd9a5}.alert-warning .alert-link{color:#4e3206}.alert-danger{color:#78281f;background-color:#fadbd8;border-color:#f8cdc8}.alert-danger hr{border-top-color:#f5b8b1}.alert-danger .alert-link{color:#4f1a15}.alert-light{color:#7b7d7d;background-color:#fbfcfc;border-color:#fafbfb}.alert-light hr{border-top-color:#ecf0f0}.alert-light .alert-link{color:#626363}.alert-dark{color:#404848;background-color:#e5e8e8;border-color:#dadedf}.alert-dark hr{border-top-color:#ccd2d3}.alert-dark .alert-link{color:#282d2d}@-webkit-keyframes progress-bar-stripes{from{background-position:0.625rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:0.625rem 0}to{background-position:0 0}}.progress{display:-webkit-box;display:-ms-flexbox;display:flex;height:0.625rem;overflow:hidden;font-size:0.625rem;background-color:#ecf0f1;border-radius:0.25rem}.progress-bar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#20BF55;-webkit-transition:width 0.6s ease;transition:width 0.6s ease}@media (prefers-reduced-motion: reduce){.progress-bar{-webkit-transition:none;transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:0.625rem 0.625rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion: reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-ms-flex:1;flex:1}.list-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#7b8a8b;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:#7b8a8b;text-decoration:none;background-color:#ecf0f1}.list-group-item-action:active{color:#212529;background-color:#ecf0f1}.list-group-item{position:relative;display:block;padding:0.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,0.125)}.list-group-item:first-child{border-top-left-radius:0.25rem;border-top-right-radius:0.25rem}.list-group-item:last-child{border-bottom-right-radius:0.25rem;border-bottom-left-radius:0.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#95a5a6;pointer-events:none;background-color:#ecf0f1}.list-group-item.active{z-index:2;color:#fff;background-color:#20BF55;border-color:#20BF55}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item:first-child{border-bottom-left-radius:0.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{border-top-right-radius:0.25rem;border-bottom-left-radius:0}.list-group-horizontal .list-group-item.active{margin-top:0}.list-group-horizontal .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width: 576px){.list-group-horizontal-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item:first-child{border-bottom-left-radius:0.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{border-top-right-radius:0.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm .list-group-item.active{margin-top:0}.list-group-horizontal-sm .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 768px){.list-group-horizontal-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item:first-child{border-bottom-left-radius:0.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{border-top-right-radius:0.25rem;border-bottom-left-radius:0}.list-group-horizontal-md .list-group-item.active{margin-top:0}.list-group-horizontal-md .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 992px){.list-group-horizontal-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item:first-child{border-bottom-left-radius:0.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{border-top-right-radius:0.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg .list-group-item.active{margin-top:0}.list-group-horizontal-lg .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 1200px){.list-group-horizontal-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item:first-child{border-bottom-left-radius:0.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{border-top-right-radius:0.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl .list-group-item.active{margin-top:0}.list-group-horizontal-xl .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush .list-group-item{border-right-width:0;border-left-width:0;border-radius:0}.list-group-flush .list-group-item:first-child{border-top-width:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#17202a;background-color:#c4c9ce}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#17202a;background-color:#b6bcc2}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#17202a;border-color:#17202a}.list-group-item-secondary{color:#4d5656;background-color:#e1e6e6}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#4d5656;background-color:#d3dada}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#4d5656;border-color:#4d5656}.list-group-item-success{color:#0c6251;background-color:#beece3}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#0c6251;background-color:#aae6db}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0c6251;border-color:#0c6251}.list-group-item-info{color:#1b4f72;background-color:#c6e2f5}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#1b4f72;background-color:#b0d7f1}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#1b4f72;border-color:#1b4f72}.list-group-item-warning{color:#7e5109;background-color:#fce3bd}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#7e5109;background-color:#fbd9a5}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#7e5109;border-color:#7e5109}.list-group-item-danger{color:#78281f;background-color:#f8cdc8}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#78281f;background-color:#f5b8b1}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#78281f;border-color:#78281f}.list-group-item-light{color:#7b7d7d;background-color:#fafbfb}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#7b7d7d;background-color:#ecf0f0}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#7b7d7d;border-color:#7b7d7d}.list-group-item-dark{color:#404848;background-color:#dadedf}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#404848;background-color:#ccd2d3}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#404848;border-color:#404848}.close{float:right;font-size:1.40625rem;font-weight:700;line-height:1;color:#fff;text-shadow:none;opacity:.5}.close:hover{color:#fff;text-decoration:none}.close:not(:disabled):not(.disabled):hover,.close:not(:disabled):not(.disabled):focus{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:0.875rem;background-color:rgba(255,255,255,0.85);background-clip:padding-box;border:1px solid rgba(0,0,0,0.1);-webkit-box-shadow:0 0.25rem 0.75rem rgba(0,0,0,0.1);box-shadow:0 0.25rem 0.75rem rgba(0,0,0,0.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:0.25rem}.toast:not(:last-child){margin-bottom:0.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0.25rem 0.75rem;color:#95a5a6;background-color:rgba(255,255,255,0.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,0.05)}.toast-body{padding:0.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:0.5rem;pointer-events:none}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform 0.3s ease-out;transition:-webkit-transform 0.3s ease-out;transition:transform 0.3s ease-out;transition:transform 0.3s ease-out, -webkit-transform 0.3s ease-out;-webkit-transform:translate(0, -50px);transform:translate(0, -50px)}@media (prefers-reduced-motion: reduce){.modal.fade .modal-dialog{-webkit-transition:none;transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static .modal-dialog{-webkit-transform:scale(1.02);transform:scale(1.02)}.modal-dialog-scrollable{display:-webkit-box;display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-header,.modal-dialog-scrollable .modal-footer{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:0.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:0.5}.modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(0.3rem - 1px);border-top-right-radius:calc(0.3rem - 1px)}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding:0.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(0.3rem - 1px);border-bottom-left-radius:calc(0.3rem - 1px)}.modal-footer>*{margin:0.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width: 576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width: 992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width: 1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:"Noto Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:0.8203125rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:0.9}.tooltip .arrow{position:absolute;display:block;width:0.8rem;height:0.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[x-placement^="top"]{padding:0.4rem 0}.bs-tooltip-top .arrow,.bs-tooltip-auto[x-placement^="top"] .arrow{bottom:0}.bs-tooltip-top .arrow::before,.bs-tooltip-auto[x-placement^="top"] .arrow::before{top:0;border-width:0.4rem 0.4rem 0;border-top-color:#000}.bs-tooltip-right,.bs-tooltip-auto[x-placement^="right"]{padding:0 0.4rem}.bs-tooltip-right .arrow,.bs-tooltip-auto[x-placement^="right"] .arrow{left:0;width:0.4rem;height:0.8rem}.bs-tooltip-right .arrow::before,.bs-tooltip-auto[x-placement^="right"] .arrow::before{right:0;border-width:0.4rem 0.4rem 0.4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[x-placement^="bottom"]{padding:0.4rem 0}.bs-tooltip-bottom .arrow,.bs-tooltip-auto[x-placement^="bottom"] .arrow{top:0}.bs-tooltip-bottom .arrow::before,.bs-tooltip-auto[x-placement^="bottom"] .arrow::before{bottom:0;border-width:0 0.4rem 0.4rem;border-bottom-color:#000}.bs-tooltip-left,.bs-tooltip-auto[x-placement^="left"]{padding:0 0.4rem}.bs-tooltip-left .arrow,.bs-tooltip-auto[x-placement^="left"] .arrow{right:0;width:0.4rem;height:0.8rem}.bs-tooltip-left .arrow::before,.bs-tooltip-auto[x-placement^="left"] .arrow::before{left:0;border-width:0.4rem 0 0.4rem 0.4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:0.25rem 0.5rem;color:#fff;text-align:center;background-color:#000;border-radius:0.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:"Noto Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:0.8203125rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:0.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:0.5rem;margin:0 0.3rem}.popover .arrow::before,.popover .arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-top,.bs-popover-auto[x-placement^="top"]{margin-bottom:0.5rem}.bs-popover-top>.arrow,.bs-popover-auto[x-placement^="top"]>.arrow{bottom:calc(-0.5rem - 1px)}.bs-popover-top>.arrow::before,.bs-popover-auto[x-placement^="top"]>.arrow::before{bottom:0;border-width:0.5rem 0.5rem 0;border-top-color:rgba(0,0,0,0.25)}.bs-popover-top>.arrow::after,.bs-popover-auto[x-placement^="top"]>.arrow::after{bottom:1px;border-width:0.5rem 0.5rem 0;border-top-color:#fff}.bs-popover-right,.bs-popover-auto[x-placement^="right"]{margin-left:0.5rem}.bs-popover-right>.arrow,.bs-popover-auto[x-placement^="right"]>.arrow{left:calc(-0.5rem - 1px);width:0.5rem;height:1rem;margin:0.3rem 0}.bs-popover-right>.arrow::before,.bs-popover-auto[x-placement^="right"]>.arrow::before{left:0;border-width:0.5rem 0.5rem 0.5rem 0;border-right-color:rgba(0,0,0,0.25)}.bs-popover-right>.arrow::after,.bs-popover-auto[x-placement^="right"]>.arrow::after{left:1px;border-width:0.5rem 0.5rem 0.5rem 0;border-right-color:#fff}.bs-popover-bottom,.bs-popover-auto[x-placement^="bottom"]{margin-top:0.5rem}.bs-popover-bottom>.arrow,.bs-popover-auto[x-placement^="bottom"]>.arrow{top:calc(-0.5rem - 1px)}.bs-popover-bottom>.arrow::before,.bs-popover-auto[x-placement^="bottom"]>.arrow::before{top:0;border-width:0 0.5rem 0.5rem 0.5rem;border-bottom-color:rgba(0,0,0,0.25)}.bs-popover-bottom>.arrow::after,.bs-popover-auto[x-placement^="bottom"]>.arrow::after{top:1px;border-width:0 0.5rem 0.5rem 0.5rem;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[x-placement^="bottom"] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-0.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-left,.bs-popover-auto[x-placement^="left"]{margin-right:0.5rem}.bs-popover-left>.arrow,.bs-popover-auto[x-placement^="left"]>.arrow{right:calc(-0.5rem - 1px);width:0.5rem;height:1rem;margin:0.3rem 0}.bs-popover-left>.arrow::before,.bs-popover-auto[x-placement^="left"]>.arrow::before{right:0;border-width:0.5rem 0 0.5rem 0.5rem;border-left-color:rgba(0,0,0,0.25)}.bs-popover-left>.arrow::after,.bs-popover-auto[x-placement^="left"]>.arrow::after{right:1px;border-width:0.5rem 0 0.5rem 0.5rem;border-left-color:#fff}.popover-header{padding:0.5rem 0.75rem;margin-bottom:0;font-size:0.9375rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(0.3rem - 1px);border-top-right-radius:calc(0.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:0.5rem 0.75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:-webkit-transform 0.6s ease-in-out;transition:-webkit-transform 0.6s ease-in-out;transition:transform 0.6s ease-in-out;transition:transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out}@media (prefers-reduced-motion: reduce){.carousel-item{-webkit-transition:none;transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-left),.active.carousel-item-right{-webkit-transform:translateX(100%);transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-right),.active.carousel-item-left{-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;-webkit-transition-property:opacity;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;-webkit-transition:opacity 0s 0.6s;transition:opacity 0s 0.6s}@media (prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{-webkit-transition:none;transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:0.5;-webkit-transition:opacity 0.15s ease;transition:opacity 0.15s ease}@media (prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{-webkit-transition:none;transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:0.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50% / 100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{-webkit-box-sizing:content-box;box-sizing:content-box;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;-webkit-transition:opacity 0.6s ease;transition:opacity 0.6s ease}@media (prefers-reduced-motion: reduce){.carousel-indicators li{-webkit-transition:none;transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:0.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:0.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.bg-primary{background-color:#20BF55 !important}a.bg-primary:hover,a.bg-primary:focus,button.bg-primary:hover,button.bg-primary:focus{background-color:#1a252f !important}.bg-secondary{background-color:#95a5a6 !important}a.bg-secondary:hover,a.bg-secondary:focus,button.bg-secondary:hover,button.bg-secondary:focus{background-color:#798d8f !important}.bg-success{background-color:#20BF55 !important}a.bg-success:hover,a.bg-success:focus,button.bg-success:hover,button.bg-success:focus{background-color:#128f76 !important}.bg-info{background-color:#3498DB !important}a.bg-info:hover,a.bg-info:focus,button.bg-info:hover,button.bg-info:focus{background-color:#217dbb !important}.bg-warning{background-color:#F39C12 !important}a.bg-warning:hover,a.bg-warning:focus,button.bg-warning:hover,button.bg-warning:focus{background-color:#c87f0a !important}.bg-danger{background-color:#E74C3C !important}a.bg-danger:hover,a.bg-danger:focus,button.bg-danger:hover,button.bg-danger:focus{background-color:#d62c1a !important}.bg-light{background-color:#ecf0f1 !important}a.bg-light:hover,a.bg-light:focus,button.bg-light:hover,button.bg-light:focus{background-color:#cfd9db !important}.bg-dark{background-color:#7b8a8b !important}a.bg-dark:hover,a.bg-dark:focus,button.bg-dark:hover,button.bg-dark:focus{background-color:#636f70 !important}.bg-white{background-color:#fff !important}.bg-transparent{background-color:transparent !important}.border{border:1px solid #dee2e6 !important}.border-top{border-top:1px solid #dee2e6 !important}.border-right{border-right:1px solid #dee2e6 !important}.border-bottom{border-bottom:1px solid #dee2e6 !important}.border-left{border-left:1px solid #dee2e6 !important}.border-0{border:0 !important}.border-top-0{border-top:0 !important}.border-right-0{border-right:0 !important}.border-bottom-0{border-bottom:0 !important}.border-left-0{border-left:0 !important}.border-primary{border-color:#20BF55 !important}.border-secondary{border-color:#95a5a6 !important}.border-success{border-color:#20BF55 !important}.border-info{border-color:#3498DB !important}.border-warning{border-color:#F39C12 !important}.border-danger{border-color:#E74C3C !important}.border-light{border-color:#ecf0f1 !important}.border-dark{border-color:#7b8a8b !important}.border-white{border-color:#fff !important}.rounded-sm{border-radius:0.2rem !important}.rounded{border-radius:0.25rem !important}.rounded-top{border-top-left-radius:0.25rem !important;border-top-right-radius:0.25rem !important}.rounded-right{border-top-right-radius:0.25rem !important;border-bottom-right-radius:0.25rem !important}.rounded-bottom{border-bottom-right-radius:0.25rem !important;border-bottom-left-radius:0.25rem !important}.rounded-left{border-top-left-radius:0.25rem !important;border-bottom-left-radius:0.25rem !important}.rounded-lg{border-radius:0.3rem !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:50rem !important}.rounded-0{border-radius:0 !important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}@media (min-width: 576px){.d-sm-none{display:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-sm-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media (min-width: 768px){.d-md-none{display:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-md-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media (min-width: 992px){.d-lg-none{display:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-lg-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media (min-width: 1200px){.d-xl-none{display:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-xl-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media print{.d-print-none{display:none !important}.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-print-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.8571428571%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.flex-fill{-webkit-box-flex:1 !important;-ms-flex:1 1 auto !important;flex:1 1 auto !important}.flex-grow-0{-webkit-box-flex:0 !important;-ms-flex-positive:0 !important;flex-grow:0 !important}.flex-grow-1{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important}.flex-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.flex-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.justify-content-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}@media (min-width: 576px){.flex-sm-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-sm-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-sm-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-sm-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-sm-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-sm-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.flex-sm-fill{-webkit-box-flex:1 !important;-ms-flex:1 1 auto !important;flex:1 1 auto !important}.flex-sm-grow-0{-webkit-box-flex:0 !important;-ms-flex-positive:0 !important;flex-grow:0 !important}.flex-sm-grow-1{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important}.flex-sm-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.flex-sm-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.justify-content-sm-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-sm-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-sm-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-sm-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-sm-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-sm-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-sm-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-sm-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-sm-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-sm-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-sm-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-sm-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-sm-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-sm-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-sm-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-sm-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-sm-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-sm-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-sm-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-sm-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-sm-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-sm-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media (min-width: 768px){.flex-md-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-md-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-md-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-md-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-md-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-md-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.flex-md-fill{-webkit-box-flex:1 !important;-ms-flex:1 1 auto !important;flex:1 1 auto !important}.flex-md-grow-0{-webkit-box-flex:0 !important;-ms-flex-positive:0 !important;flex-grow:0 !important}.flex-md-grow-1{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important}.flex-md-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.flex-md-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.justify-content-md-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-md-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-md-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-md-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-md-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-md-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-md-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-md-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-md-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-md-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-md-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-md-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-md-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-md-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-md-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-md-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-md-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-md-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-md-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-md-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-md-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-md-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media (min-width: 992px){.flex-lg-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-lg-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-lg-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-lg-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-lg-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-lg-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.flex-lg-fill{-webkit-box-flex:1 !important;-ms-flex:1 1 auto !important;flex:1 1 auto !important}.flex-lg-grow-0{-webkit-box-flex:0 !important;-ms-flex-positive:0 !important;flex-grow:0 !important}.flex-lg-grow-1{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important}.flex-lg-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.flex-lg-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.justify-content-lg-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-lg-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-lg-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-lg-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-lg-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-lg-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-lg-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-lg-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-lg-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-lg-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-lg-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-lg-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-lg-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-lg-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-lg-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-lg-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-lg-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-lg-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-lg-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-lg-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-lg-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-lg-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media (min-width: 1200px){.flex-xl-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-xl-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-xl-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-xl-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-xl-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-xl-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.flex-xl-fill{-webkit-box-flex:1 !important;-ms-flex:1 1 auto !important;flex:1 1 auto !important}.flex-xl-grow-0{-webkit-box-flex:0 !important;-ms-flex-positive:0 !important;flex-grow:0 !important}.flex-xl-grow-1{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important}.flex-xl-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.flex-xl-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.justify-content-xl-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-xl-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-xl-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-xl-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-xl-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-xl-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-xl-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-xl-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-xl-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-xl-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-xl-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-xl-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-xl-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-xl-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-xl-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-xl-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-xl-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-xl-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-xl-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-xl-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-xl-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-xl-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}.float-left{float:left !important}.float-right{float:right !important}.float-none{float:none !important}@media (min-width: 576px){.float-sm-left{float:left !important}.float-sm-right{float:right !important}.float-sm-none{float:none !important}}@media (min-width: 768px){.float-md-left{float:left !important}.float-md-right{float:right !important}.float-md-none{float:none !important}}@media (min-width: 992px){.float-lg-left{float:left !important}.float-lg-right{float:right !important}.float-lg-none{float:none !important}}@media (min-width: 1200px){.float-xl-left{float:left !important}.float-xl-right{float:right !important}.float-xl-none{float:none !important}}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:-webkit-sticky !important;position:sticky !important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports (position: -webkit-sticky) or (position: sticky){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{-webkit-box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.075) !important;box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.075) !important}.shadow{-webkit-box-shadow:0 0.5rem 1rem rgba(0,0,0,0.15) !important;box-shadow:0 0.5rem 1rem rgba(0,0,0,0.15) !important}.shadow-lg{-webkit-box-shadow:0 1rem 3rem rgba(0,0,0,0.175) !important;box-shadow:0 1rem 3rem rgba(0,0,0,0.175) !important}.shadow-none{-webkit-box-shadow:none !important;box-shadow:none !important}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mw-100{max-width:100% !important}.mh-100{max-height:100% !important}.min-vw-100{min-width:100vw !important}.min-vh-100{min-height:100vh !important}.vw-100{width:100vw !important}.vh-100{height:100vh !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0 !important}.mt-0,.my-0{margin-top:0 !important}.mr-0,.mx-0{margin-right:0 !important}.mb-0,.my-0{margin-bottom:0 !important}.ml-0,.mx-0{margin-left:0 !important}.m-1{margin:0.25rem !important}.mt-1,.my-1{margin-top:0.25rem !important}.mr-1,.mx-1{margin-right:0.25rem !important}.mb-1,.my-1{margin-bottom:0.25rem !important}.ml-1,.mx-1{margin-left:0.25rem !important}.m-2{margin:0.5rem !important}.mt-2,.my-2{margin-top:0.5rem !important}.mr-2,.mx-2{margin-right:0.5rem !important}.mb-2,.my-2{margin-bottom:0.5rem !important}.ml-2,.mx-2{margin-left:0.5rem !important}.m-3{margin:1rem !important}.mt-3,.my-3{margin-top:1rem !important}.mr-3,.mx-3{margin-right:1rem !important}.mb-3,.my-3{margin-bottom:1rem !important}.ml-3,.mx-3{margin-left:1rem !important}.m-4{margin:1.5rem !important}.mt-4,.my-4{margin-top:1.5rem !important}.mr-4,.mx-4{margin-right:1.5rem !important}.mb-4,.my-4{margin-bottom:1.5rem !important}.ml-4,.mx-4{margin-left:1.5rem !important}.m-5{margin:3rem !important}.mt-5,.my-5{margin-top:3rem !important}.mr-5,.mx-5{margin-right:3rem !important}.mb-5,.my-5{margin-bottom:3rem !important}.ml-5,.mx-5{margin-left:3rem !important}.p-0{padding:0 !important}.pt-0,.py-0{padding-top:0 !important}.pr-0,.px-0{padding-right:0 !important}.pb-0,.py-0{padding-bottom:0 !important}.pl-0,.px-0{padding-left:0 !important}.p-1{padding:0.25rem !important}.pt-1,.py-1{padding-top:0.25rem !important}.pr-1,.px-1{padding-right:0.25rem !important}.pb-1,.py-1{padding-bottom:0.25rem !important}.pl-1,.px-1{padding-left:0.25rem !important}.p-2{padding:0.5rem !important}.pt-2,.py-2{padding-top:0.5rem !important}.pr-2,.px-2{padding-right:0.5rem !important}.pb-2,.py-2{padding-bottom:0.5rem !important}.pl-2,.px-2{padding-left:0.5rem !important}.p-3{padding:1rem !important}.pt-3,.py-3{padding-top:1rem !important}.pr-3,.px-3{padding-right:1rem !important}.pb-3,.py-3{padding-bottom:1rem !important}.pl-3,.px-3{padding-left:1rem !important}.p-4{padding:1.5rem !important}.pt-4,.py-4{padding-top:1.5rem !important}.pr-4,.px-4{padding-right:1.5rem !important}.pb-4,.py-4{padding-bottom:1.5rem !important}.pl-4,.px-4{padding-left:1.5rem !important}.p-5{padding:3rem !important}.pt-5,.py-5{padding-top:3rem !important}.pr-5,.px-5{padding-right:3rem !important}.pb-5,.py-5{padding-bottom:3rem !important}.pl-5,.px-5{padding-left:3rem !important}.m-n1{margin:-0.25rem !important}.mt-n1,.my-n1{margin-top:-0.25rem !important}.mr-n1,.mx-n1{margin-right:-0.25rem !important}.mb-n1,.my-n1{margin-bottom:-0.25rem !important}.ml-n1,.mx-n1{margin-left:-0.25rem !important}.m-n2{margin:-0.5rem !important}.mt-n2,.my-n2{margin-top:-0.5rem !important}.mr-n2,.mx-n2{margin-right:-0.5rem !important}.mb-n2,.my-n2{margin-bottom:-0.5rem !important}.ml-n2,.mx-n2{margin-left:-0.5rem !important}.m-n3{margin:-1rem !important}.mt-n3,.my-n3{margin-top:-1rem !important}.mr-n3,.mx-n3{margin-right:-1rem !important}.mb-n3,.my-n3{margin-bottom:-1rem !important}.ml-n3,.mx-n3{margin-left:-1rem !important}.m-n4{margin:-1.5rem !important}.mt-n4,.my-n4{margin-top:-1.5rem !important}.mr-n4,.mx-n4{margin-right:-1.5rem !important}.mb-n4,.my-n4{margin-bottom:-1.5rem !important}.ml-n4,.mx-n4{margin-left:-1.5rem !important}.m-n5{margin:-3rem !important}.mt-n5,.my-n5{margin-top:-3rem !important}.mr-n5,.mx-n5{margin-right:-3rem !important}.mb-n5,.my-n5{margin-bottom:-3rem !important}.ml-n5,.mx-n5{margin-left:-3rem !important}.m-auto{margin:auto !important}.mt-auto,.my-auto{margin-top:auto !important}.mr-auto,.mx-auto{margin-right:auto !important}.mb-auto,.my-auto{margin-bottom:auto !important}.ml-auto,.mx-auto{margin-left:auto !important}@media (min-width: 576px){.m-sm-0{margin:0 !important}.mt-sm-0,.my-sm-0{margin-top:0 !important}.mr-sm-0,.mx-sm-0{margin-right:0 !important}.mb-sm-0,.my-sm-0{margin-bottom:0 !important}.ml-sm-0,.mx-sm-0{margin-left:0 !important}.m-sm-1{margin:0.25rem !important}.mt-sm-1,.my-sm-1{margin-top:0.25rem !important}.mr-sm-1,.mx-sm-1{margin-right:0.25rem !important}.mb-sm-1,.my-sm-1{margin-bottom:0.25rem !important}.ml-sm-1,.mx-sm-1{margin-left:0.25rem !important}.m-sm-2{margin:0.5rem !important}.mt-sm-2,.my-sm-2{margin-top:0.5rem !important}.mr-sm-2,.mx-sm-2{margin-right:0.5rem !important}.mb-sm-2,.my-sm-2{margin-bottom:0.5rem !important}.ml-sm-2,.mx-sm-2{margin-left:0.5rem !important}.m-sm-3{margin:1rem !important}.mt-sm-3,.my-sm-3{margin-top:1rem !important}.mr-sm-3,.mx-sm-3{margin-right:1rem !important}.mb-sm-3,.my-sm-3{margin-bottom:1rem !important}.ml-sm-3,.mx-sm-3{margin-left:1rem !important}.m-sm-4{margin:1.5rem !important}.mt-sm-4,.my-sm-4{margin-top:1.5rem !important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem !important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem !important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem !important}.m-sm-5{margin:3rem !important}.mt-sm-5,.my-sm-5{margin-top:3rem !important}.mr-sm-5,.mx-sm-5{margin-right:3rem !important}.mb-sm-5,.my-sm-5{margin-bottom:3rem !important}.ml-sm-5,.mx-sm-5{margin-left:3rem !important}.p-sm-0{padding:0 !important}.pt-sm-0,.py-sm-0{padding-top:0 !important}.pr-sm-0,.px-sm-0{padding-right:0 !important}.pb-sm-0,.py-sm-0{padding-bottom:0 !important}.pl-sm-0,.px-sm-0{padding-left:0 !important}.p-sm-1{padding:0.25rem !important}.pt-sm-1,.py-sm-1{padding-top:0.25rem !important}.pr-sm-1,.px-sm-1{padding-right:0.25rem !important}.pb-sm-1,.py-sm-1{padding-bottom:0.25rem !important}.pl-sm-1,.px-sm-1{padding-left:0.25rem !important}.p-sm-2{padding:0.5rem !important}.pt-sm-2,.py-sm-2{padding-top:0.5rem !important}.pr-sm-2,.px-sm-2{padding-right:0.5rem !important}.pb-sm-2,.py-sm-2{padding-bottom:0.5rem !important}.pl-sm-2,.px-sm-2{padding-left:0.5rem !important}.p-sm-3{padding:1rem !important}.pt-sm-3,.py-sm-3{padding-top:1rem !important}.pr-sm-3,.px-sm-3{padding-right:1rem !important}.pb-sm-3,.py-sm-3{padding-bottom:1rem !important}.pl-sm-3,.px-sm-3{padding-left:1rem !important}.p-sm-4{padding:1.5rem !important}.pt-sm-4,.py-sm-4{padding-top:1.5rem !important}.pr-sm-4,.px-sm-4{padding-right:1.5rem !important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem !important}.pl-sm-4,.px-sm-4{padding-left:1.5rem !important}.p-sm-5{padding:3rem !important}.pt-sm-5,.py-sm-5{padding-top:3rem !important}.pr-sm-5,.px-sm-5{padding-right:3rem !important}.pb-sm-5,.py-sm-5{padding-bottom:3rem !important}.pl-sm-5,.px-sm-5{padding-left:3rem !important}.m-sm-n1{margin:-0.25rem !important}.mt-sm-n1,.my-sm-n1{margin-top:-0.25rem !important}.mr-sm-n1,.mx-sm-n1{margin-right:-0.25rem !important}.mb-sm-n1,.my-sm-n1{margin-bottom:-0.25rem !important}.ml-sm-n1,.mx-sm-n1{margin-left:-0.25rem !important}.m-sm-n2{margin:-0.5rem !important}.mt-sm-n2,.my-sm-n2{margin-top:-0.5rem !important}.mr-sm-n2,.mx-sm-n2{margin-right:-0.5rem !important}.mb-sm-n2,.my-sm-n2{margin-bottom:-0.5rem !important}.ml-sm-n2,.mx-sm-n2{margin-left:-0.5rem !important}.m-sm-n3{margin:-1rem !important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem !important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem !important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem !important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem !important}.m-sm-n4{margin:-1.5rem !important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem !important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem !important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem !important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem !important}.m-sm-n5{margin:-3rem !important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem !important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem !important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem !important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem !important}.m-sm-auto{margin:auto !important}.mt-sm-auto,.my-sm-auto{margin-top:auto !important}.mr-sm-auto,.mx-sm-auto{margin-right:auto !important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto !important}.ml-sm-auto,.mx-sm-auto{margin-left:auto !important}}@media (min-width: 768px){.m-md-0{margin:0 !important}.mt-md-0,.my-md-0{margin-top:0 !important}.mr-md-0,.mx-md-0{margin-right:0 !important}.mb-md-0,.my-md-0{margin-bottom:0 !important}.ml-md-0,.mx-md-0{margin-left:0 !important}.m-md-1{margin:0.25rem !important}.mt-md-1,.my-md-1{margin-top:0.25rem !important}.mr-md-1,.mx-md-1{margin-right:0.25rem !important}.mb-md-1,.my-md-1{margin-bottom:0.25rem !important}.ml-md-1,.mx-md-1{margin-left:0.25rem !important}.m-md-2{margin:0.5rem !important}.mt-md-2,.my-md-2{margin-top:0.5rem !important}.mr-md-2,.mx-md-2{margin-right:0.5rem !important}.mb-md-2,.my-md-2{margin-bottom:0.5rem !important}.ml-md-2,.mx-md-2{margin-left:0.5rem !important}.m-md-3{margin:1rem !important}.mt-md-3,.my-md-3{margin-top:1rem !important}.mr-md-3,.mx-md-3{margin-right:1rem !important}.mb-md-3,.my-md-3{margin-bottom:1rem !important}.ml-md-3,.mx-md-3{margin-left:1rem !important}.m-md-4{margin:1.5rem !important}.mt-md-4,.my-md-4{margin-top:1.5rem !important}.mr-md-4,.mx-md-4{margin-right:1.5rem !important}.mb-md-4,.my-md-4{margin-bottom:1.5rem !important}.ml-md-4,.mx-md-4{margin-left:1.5rem !important}.m-md-5{margin:3rem !important}.mt-md-5,.my-md-5{margin-top:3rem !important}.mr-md-5,.mx-md-5{margin-right:3rem !important}.mb-md-5,.my-md-5{margin-bottom:3rem !important}.ml-md-5,.mx-md-5{margin-left:3rem !important}.p-md-0{padding:0 !important}.pt-md-0,.py-md-0{padding-top:0 !important}.pr-md-0,.px-md-0{padding-right:0 !important}.pb-md-0,.py-md-0{padding-bottom:0 !important}.pl-md-0,.px-md-0{padding-left:0 !important}.p-md-1{padding:0.25rem !important}.pt-md-1,.py-md-1{padding-top:0.25rem !important}.pr-md-1,.px-md-1{padding-right:0.25rem !important}.pb-md-1,.py-md-1{padding-bottom:0.25rem !important}.pl-md-1,.px-md-1{padding-left:0.25rem !important}.p-md-2{padding:0.5rem !important}.pt-md-2,.py-md-2{padding-top:0.5rem !important}.pr-md-2,.px-md-2{padding-right:0.5rem !important}.pb-md-2,.py-md-2{padding-bottom:0.5rem !important}.pl-md-2,.px-md-2{padding-left:0.5rem !important}.p-md-3{padding:1rem !important}.pt-md-3,.py-md-3{padding-top:1rem !important}.pr-md-3,.px-md-3{padding-right:1rem !important}.pb-md-3,.py-md-3{padding-bottom:1rem !important}.pl-md-3,.px-md-3{padding-left:1rem !important}.p-md-4{padding:1.5rem !important}.pt-md-4,.py-md-4{padding-top:1.5rem !important}.pr-md-4,.px-md-4{padding-right:1.5rem !important}.pb-md-4,.py-md-4{padding-bottom:1.5rem !important}.pl-md-4,.px-md-4{padding-left:1.5rem !important}.p-md-5{padding:3rem !important}.pt-md-5,.py-md-5{padding-top:3rem !important}.pr-md-5,.px-md-5{padding-right:3rem !important}.pb-md-5,.py-md-5{padding-bottom:3rem !important}.pl-md-5,.px-md-5{padding-left:3rem !important}.m-md-n1{margin:-0.25rem !important}.mt-md-n1,.my-md-n1{margin-top:-0.25rem !important}.mr-md-n1,.mx-md-n1{margin-right:-0.25rem !important}.mb-md-n1,.my-md-n1{margin-bottom:-0.25rem !important}.ml-md-n1,.mx-md-n1{margin-left:-0.25rem !important}.m-md-n2{margin:-0.5rem !important}.mt-md-n2,.my-md-n2{margin-top:-0.5rem !important}.mr-md-n2,.mx-md-n2{margin-right:-0.5rem !important}.mb-md-n2,.my-md-n2{margin-bottom:-0.5rem !important}.ml-md-n2,.mx-md-n2{margin-left:-0.5rem !important}.m-md-n3{margin:-1rem !important}.mt-md-n3,.my-md-n3{margin-top:-1rem !important}.mr-md-n3,.mx-md-n3{margin-right:-1rem !important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem !important}.ml-md-n3,.mx-md-n3{margin-left:-1rem !important}.m-md-n4{margin:-1.5rem !important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem !important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem !important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem !important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem !important}.m-md-n5{margin:-3rem !important}.mt-md-n5,.my-md-n5{margin-top:-3rem !important}.mr-md-n5,.mx-md-n5{margin-right:-3rem !important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem !important}.ml-md-n5,.mx-md-n5{margin-left:-3rem !important}.m-md-auto{margin:auto !important}.mt-md-auto,.my-md-auto{margin-top:auto !important}.mr-md-auto,.mx-md-auto{margin-right:auto !important}.mb-md-auto,.my-md-auto{margin-bottom:auto !important}.ml-md-auto,.mx-md-auto{margin-left:auto !important}}@media (min-width: 992px){.m-lg-0{margin:0 !important}.mt-lg-0,.my-lg-0{margin-top:0 !important}.mr-lg-0,.mx-lg-0{margin-right:0 !important}.mb-lg-0,.my-lg-0{margin-bottom:0 !important}.ml-lg-0,.mx-lg-0{margin-left:0 !important}.m-lg-1{margin:0.25rem !important}.mt-lg-1,.my-lg-1{margin-top:0.25rem !important}.mr-lg-1,.mx-lg-1{margin-right:0.25rem !important}.mb-lg-1,.my-lg-1{margin-bottom:0.25rem !important}.ml-lg-1,.mx-lg-1{margin-left:0.25rem !important}.m-lg-2{margin:0.5rem !important}.mt-lg-2,.my-lg-2{margin-top:0.5rem !important}.mr-lg-2,.mx-lg-2{margin-right:0.5rem !important}.mb-lg-2,.my-lg-2{margin-bottom:0.5rem !important}.ml-lg-2,.mx-lg-2{margin-left:0.5rem !important}.m-lg-3{margin:1rem !important}.mt-lg-3,.my-lg-3{margin-top:1rem !important}.mr-lg-3,.mx-lg-3{margin-right:1rem !important}.mb-lg-3,.my-lg-3{margin-bottom:1rem !important}.ml-lg-3,.mx-lg-3{margin-left:1rem !important}.m-lg-4{margin:1.5rem !important}.mt-lg-4,.my-lg-4{margin-top:1.5rem !important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem !important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem !important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem !important}.m-lg-5{margin:3rem !important}.mt-lg-5,.my-lg-5{margin-top:3rem !important}.mr-lg-5,.mx-lg-5{margin-right:3rem !important}.mb-lg-5,.my-lg-5{margin-bottom:3rem !important}.ml-lg-5,.mx-lg-5{margin-left:3rem !important}.p-lg-0{padding:0 !important}.pt-lg-0,.py-lg-0{padding-top:0 !important}.pr-lg-0,.px-lg-0{padding-right:0 !important}.pb-lg-0,.py-lg-0{padding-bottom:0 !important}.pl-lg-0,.px-lg-0{padding-left:0 !important}.p-lg-1{padding:0.25rem !important}.pt-lg-1,.py-lg-1{padding-top:0.25rem !important}.pr-lg-1,.px-lg-1{padding-right:0.25rem !important}.pb-lg-1,.py-lg-1{padding-bottom:0.25rem !important}.pl-lg-1,.px-lg-1{padding-left:0.25rem !important}.p-lg-2{padding:0.5rem !important}.pt-lg-2,.py-lg-2{padding-top:0.5rem !important}.pr-lg-2,.px-lg-2{padding-right:0.5rem !important}.pb-lg-2,.py-lg-2{padding-bottom:0.5rem !important}.pl-lg-2,.px-lg-2{padding-left:0.5rem !important}.p-lg-3{padding:1rem !important}.pt-lg-3,.py-lg-3{padding-top:1rem !important}.pr-lg-3,.px-lg-3{padding-right:1rem !important}.pb-lg-3,.py-lg-3{padding-bottom:1rem !important}.pl-lg-3,.px-lg-3{padding-left:1rem !important}.p-lg-4{padding:1.5rem !important}.pt-lg-4,.py-lg-4{padding-top:1.5rem !important}.pr-lg-4,.px-lg-4{padding-right:1.5rem !important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem !important}.pl-lg-4,.px-lg-4{padding-left:1.5rem !important}.p-lg-5{padding:3rem !important}.pt-lg-5,.py-lg-5{padding-top:3rem !important}.pr-lg-5,.px-lg-5{padding-right:3rem !important}.pb-lg-5,.py-lg-5{padding-bottom:3rem !important}.pl-lg-5,.px-lg-5{padding-left:3rem !important}.m-lg-n1{margin:-0.25rem !important}.mt-lg-n1,.my-lg-n1{margin-top:-0.25rem !important}.mr-lg-n1,.mx-lg-n1{margin-right:-0.25rem !important}.mb-lg-n1,.my-lg-n1{margin-bottom:-0.25rem !important}.ml-lg-n1,.mx-lg-n1{margin-left:-0.25rem !important}.m-lg-n2{margin:-0.5rem !important}.mt-lg-n2,.my-lg-n2{margin-top:-0.5rem !important}.mr-lg-n2,.mx-lg-n2{margin-right:-0.5rem !important}.mb-lg-n2,.my-lg-n2{margin-bottom:-0.5rem !important}.ml-lg-n2,.mx-lg-n2{margin-left:-0.5rem !important}.m-lg-n3{margin:-1rem !important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem !important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem !important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem !important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem !important}.m-lg-n4{margin:-1.5rem !important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem !important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem !important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem !important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem !important}.m-lg-n5{margin:-3rem !important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem !important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem !important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem !important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem !important}.m-lg-auto{margin:auto !important}.mt-lg-auto,.my-lg-auto{margin-top:auto !important}.mr-lg-auto,.mx-lg-auto{margin-right:auto !important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto !important}.ml-lg-auto,.mx-lg-auto{margin-left:auto !important}}@media (min-width: 1200px){.m-xl-0{margin:0 !important}.mt-xl-0,.my-xl-0{margin-top:0 !important}.mr-xl-0,.mx-xl-0{margin-right:0 !important}.mb-xl-0,.my-xl-0{margin-bottom:0 !important}.ml-xl-0,.mx-xl-0{margin-left:0 !important}.m-xl-1{margin:0.25rem !important}.mt-xl-1,.my-xl-1{margin-top:0.25rem !important}.mr-xl-1,.mx-xl-1{margin-right:0.25rem !important}.mb-xl-1,.my-xl-1{margin-bottom:0.25rem !important}.ml-xl-1,.mx-xl-1{margin-left:0.25rem !important}.m-xl-2{margin:0.5rem !important}.mt-xl-2,.my-xl-2{margin-top:0.5rem !important}.mr-xl-2,.mx-xl-2{margin-right:0.5rem !important}.mb-xl-2,.my-xl-2{margin-bottom:0.5rem !important}.ml-xl-2,.mx-xl-2{margin-left:0.5rem !important}.m-xl-3{margin:1rem !important}.mt-xl-3,.my-xl-3{margin-top:1rem !important}.mr-xl-3,.mx-xl-3{margin-right:1rem !important}.mb-xl-3,.my-xl-3{margin-bottom:1rem !important}.ml-xl-3,.mx-xl-3{margin-left:1rem !important}.m-xl-4{margin:1.5rem !important}.mt-xl-4,.my-xl-4{margin-top:1.5rem !important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem !important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem !important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem !important}.m-xl-5{margin:3rem !important}.mt-xl-5,.my-xl-5{margin-top:3rem !important}.mr-xl-5,.mx-xl-5{margin-right:3rem !important}.mb-xl-5,.my-xl-5{margin-bottom:3rem !important}.ml-xl-5,.mx-xl-5{margin-left:3rem !important}.p-xl-0{padding:0 !important}.pt-xl-0,.py-xl-0{padding-top:0 !important}.pr-xl-0,.px-xl-0{padding-right:0 !important}.pb-xl-0,.py-xl-0{padding-bottom:0 !important}.pl-xl-0,.px-xl-0{padding-left:0 !important}.p-xl-1{padding:0.25rem !important}.pt-xl-1,.py-xl-1{padding-top:0.25rem !important}.pr-xl-1,.px-xl-1{padding-right:0.25rem !important}.pb-xl-1,.py-xl-1{padding-bottom:0.25rem !important}.pl-xl-1,.px-xl-1{padding-left:0.25rem !important}.p-xl-2{padding:0.5rem !important}.pt-xl-2,.py-xl-2{padding-top:0.5rem !important}.pr-xl-2,.px-xl-2{padding-right:0.5rem !important}.pb-xl-2,.py-xl-2{padding-bottom:0.5rem !important}.pl-xl-2,.px-xl-2{padding-left:0.5rem !important}.p-xl-3{padding:1rem !important}.pt-xl-3,.py-xl-3{padding-top:1rem !important}.pr-xl-3,.px-xl-3{padding-right:1rem !important}.pb-xl-3,.py-xl-3{padding-bottom:1rem !important}.pl-xl-3,.px-xl-3{padding-left:1rem !important}.p-xl-4{padding:1.5rem !important}.pt-xl-4,.py-xl-4{padding-top:1.5rem !important}.pr-xl-4,.px-xl-4{padding-right:1.5rem !important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem !important}.pl-xl-4,.px-xl-4{padding-left:1.5rem !important}.p-xl-5{padding:3rem !important}.pt-xl-5,.py-xl-5{padding-top:3rem !important}.pr-xl-5,.px-xl-5{padding-right:3rem !important}.pb-xl-5,.py-xl-5{padding-bottom:3rem !important}.pl-xl-5,.px-xl-5{padding-left:3rem !important}.m-xl-n1{margin:-0.25rem !important}.mt-xl-n1,.my-xl-n1{margin-top:-0.25rem !important}.mr-xl-n1,.mx-xl-n1{margin-right:-0.25rem !important}.mb-xl-n1,.my-xl-n1{margin-bottom:-0.25rem !important}.ml-xl-n1,.mx-xl-n1{margin-left:-0.25rem !important}.m-xl-n2{margin:-0.5rem !important}.mt-xl-n2,.my-xl-n2{margin-top:-0.5rem !important}.mr-xl-n2,.mx-xl-n2{margin-right:-0.5rem !important}.mb-xl-n2,.my-xl-n2{margin-bottom:-0.5rem !important}.ml-xl-n2,.mx-xl-n2{margin-left:-0.5rem !important}.m-xl-n3{margin:-1rem !important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem !important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem !important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem !important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem !important}.m-xl-n4{margin:-1.5rem !important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem !important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem !important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem !important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem !important}.m-xl-n5{margin:-3rem !important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem !important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem !important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem !important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem !important}.m-xl-auto{margin:auto !important}.mt-xl-auto,.my-xl-auto{margin-top:auto !important}.mr-xl-auto,.mx-xl-auto{margin-right:auto !important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto !important}.ml-xl-auto,.mx-xl-auto{margin-left:auto !important}}.text-monospace{font-family:SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important}.text-justify{text-align:justify !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}@media (min-width: 576px){.text-sm-left{text-align:left !important}.text-sm-right{text-align:right !important}.text-sm-center{text-align:center !important}}@media (min-width: 768px){.text-md-left{text-align:left !important}.text-md-right{text-align:right !important}.text-md-center{text-align:center !important}}@media (min-width: 992px){.text-lg-left{text-align:left !important}.text-lg-right{text-align:right !important}.text-lg-center{text-align:center !important}}@media (min-width: 1200px){.text-xl-left{text-align:left !important}.text-xl-right{text-align:right !important}.text-xl-center{text-align:center !important}}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.font-weight-light{font-weight:300 !important}.font-weight-lighter{font-weight:lighter !important}.font-weight-normal{font-weight:400 !important}.font-weight-bold{font-weight:700 !important}.font-weight-bolder{font-weight:bolder !important}.font-italic{font-style:italic !important}.text-white{color:#fff !important}.text-primary{color:#20BF55 !important}a.text-primary:hover,a.text-primary:focus{color:#11181f !important}.text-secondary{color:#95a5a6 !important}a.text-secondary:hover,a.text-secondary:focus{color:#6d8082 !important}.text-success{color:#20BF55 !important}a.text-success:hover,a.text-success:focus{color:#00A896 !important}.text-info{color:#3498DB !important}a.text-info:hover,a.text-info:focus{color:#1d6fa5 !important}.text-warning{color:#F39C12 !important}a.text-warning:hover,a.text-warning:focus{color:#b06f09 !important}.text-danger{color:#E74C3C !important}a.text-danger:hover,a.text-danger:focus{color:#bf2718 !important}.text-light{color:#ecf0f1 !important}a.text-light:hover,a.text-light:focus{color:#c0cdd1 !important}.text-dark{color:#7b8a8b !important}a.text-dark:hover,a.text-dark:focus{color:#576263 !important}.text-body{color:#212529 !important}.text-muted{color:#95a5a6 !important}.text-black-50{color:rgba(0,0,0,0.5) !important}.text-white-50{color:rgba(255,255,255,0.5) !important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none !important}.text-break{word-break:break-word !important;overflow-wrap:break-word !important}.text-reset{color:inherit !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}@media print{*,*::before,*::after{text-shadow:none !important;-webkit-box-shadow:none !important;box-shadow:none !important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap !important}pre,blockquote{border:1px solid #b4bcc2;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px !important}.container{min-width:992px !important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #dee2e6 !important}.table-dark{color:inherit}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}.bg-primary .navbar-nav .active>.nav-link{color:#757575 !important}.bg-dark{background-color:#20BF55 !important}.bg-dark.navbar-dark .navbar-nav .nav-link:focus,.bg-dark.navbar-dark .navbar-nav .nav-link:hover,.bg-dark.navbar-dark .navbar-nav .active>.nav-link{color:#757575 !important}.btn-secondary,.btn-secondary:hover,.btn-warning,.btn-warning:hover{color:#fff}.table-primary,.table-secondary,.table-success,.table-info,.table-warning,.table-danger{color:#fff}.table-primary,.table-primary>th,.table-primary>td{background-color:#20BF55}.table-secondary,.table-secondary>th,.table-secondary>td{background-color:#95a5a6}.table-light,.table-light>th,.table-light>td{background-color:#ecf0f1}.table-dark,.table-dark>th,.table-dark>td{background-color:#7b8a8b}.table-success,.table-success>th,.table-success>td{background-color:#20BF55}.table-info,.table-info>th,.table-info>td{background-color:#3498DB}.table-danger,.table-danger>th,.table-danger>td{background-color:#E74C3C}.table-warning,.table-warning>th,.table-warning>td{background-color:#F39C12}.table-active,.table-active>th,.table-active>td{background-color:rgba(0,0,0,0.075)}.table-hover .table-primary:hover,.table-hover .table-primary:hover>th,.table-hover .table-primary:hover>td{background-color:#233140}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>th,.table-hover .table-secondary:hover>td{background-color:#87999a}.table-hover .table-light:hover,.table-hover .table-light:hover>th,.table-hover .table-light:hover>td{background-color:#dde4e6}.table-hover .table-dark:hover,.table-hover .table-dark:hover>th,.table-hover .table-dark:hover>td{background-color:#6f7d7e}.table-hover .table-success:hover,.table-hover .table-success:hover>th,.table-hover .table-success:hover>td{background-color:#15a589}.table-hover .table-info:hover,.table-hover .table-info:hover>th,.table-hover .table-info:hover>td{background-color:#258cd1}.table-hover .table-danger:hover,.table-hover .table-danger:hover>th,.table-hover .table-danger:hover>td{background-color:#e43725}.table-hover .table-warning:hover,.table-hover .table-warning:hover>th,.table-hover .table-warning:hover>td{background-color:#e08e0b}.table-hover .table-active:hover,.table-hover .table-active:hover>th,.table-hover .table-active:hover>td{background-color:rgba(0,0,0,0.075)}.nav-tabs .nav-link.active,.nav-tabs .nav-link.active:focus,.nav-tabs .nav-link.active:hover,.nav-tabs .nav-item.open .nav-link,.nav-tabs .nav-item.open .nav-link:focus,.nav-tabs .nav-item.open .nav-link:hover{color:#757575}.pagination a:hover{text-decoration:none}.close{text-decoration:none;opacity:0.4}.close:hover,.close:focus{opacity:1}.badge-secondary,.badge-warning{color:#fff}.alert{border:none;color:#fff}.alert a,.alert .alert-link{color:#fff;text-decoration:underline}.alert-primary{background-color:#20BF55}.alert-secondary{background-color:#95a5a6}.alert-success{background-color:#20BF55}.alert-info{background-color:#3498DB}.alert-warning{background-color:#F39C12}.alert-danger{background-color:#E74C3C}.alert-light{background-color:#ecf0f1}.alert-dark{background-color:#7b8a8b}.alert-light,.alert-light a,.alert-light .alert-link{color:#212529}.modal .close{color:#000}.modal .close:not(:disabled):not(.disabled):hover,.modal .close:not(:disabled):not(.disabled):focus{color:#000}{font-size:5px} + */ + @import url("https://fonts.googleapis.com/css?family=Noto+Sans:400,700&display=swap&subset=latin-ext");:root{--blue: #05668D;--indigo: #6610f2;--purple: #6f42c1;--pink: #e83e8c;--red: #E74C3C;--orange: #fd7e14;--yellow: #F39C12;--green: #A3C635;--teal: #20c997;--cyan: #3498DB;--white: #fff;--gray: #95a5a6;--gray-dark: #343a40;--primary: #20BF55;--secondary: #95a5a6;--success: #A3C635;--info: #3498DB;--warning: #F39C12;--danger: #E74C3C;--light: #ecf0f1;--dark: #7b8a8b;--breakpoint-xs: 0;--breakpoint-sm: 576px;--breakpoint-md: 768px;--breakpoint-lg: 992px;--breakpoint-xl: 1200px;--font-family-sans-serif: "Noto Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}*,*::before,*::after{-webkit-box-sizing:border-box;box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:"Noto Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";font-size:0.9375rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0 !important}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:0.5rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#20BF55;text-decoration:none;background-color:transparent}a:hover{color:#20BF55;text-decoration:underline}a:not([href]){color:inherit;text-decoration:none}a:not([href]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:0.75rem;padding-bottom:0.75rem;color:#95a5a6;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:0.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button:not(:disabled),[type="button"]:not(:disabled),[type="reset"]:not(:disabled),[type="submit"]:not(:disabled){cursor:pointer}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{padding:0;border-style:none}input[type="radio"],input[type="checkbox"]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{outline-offset:-2px;-webkit-appearance:none}[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none !important}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{margin-bottom:0.5rem;font-weight:500;line-height:1.2}h1,.h1{font-size:3rem}h2,.h2{font-size:2.5rem}h3,.h3{font-size:2rem}h4,.h4{font-size:1.40625rem}h5,.h5{font-size:1.171875rem}h6,.h6{font-size:0.9375rem}.lead{font-size:1.171875rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,0.1)}small,.small{font-size:80%;font-weight:400}mark,.mark{padding:0.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:0.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.171875rem}.blockquote-footer{display:block;font-size:80%;color:#95a5a6}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:0.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:0.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:0.5rem;line-height:1}.figure-caption{font-size:90%;color:#95a5a6}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:0.2rem 0.4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:0.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width: 576px){.container{max-width:540px}}@media (min-width: 768px){.container{max-width:720px}}@media (min-width: 992px){.container{max-width:960px}}@media (min-width: 1200px){.container{max-width:1140px}}.container-fluid,.container-sm,.container-md,.container-lg,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width: 576px){.container,.container-sm{max-width:540px}}@media (min-width: 768px){.container,.container-sm,.container-md{max-width:720px}}@media (min-width: 992px){.container,.container-sm,.container-md,.container-lg{max-width:960px}}@media (min-width: 1200px){.container,.container-sm,.container-md,.container-lg,.container-xl{max-width:1140px}}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*="col-"]{padding-right:0;padding-left:0}.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col,.col-auto,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm,.col-sm-auto,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md,.col-md-auto,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg,.col-lg-auto,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-1>*{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-4>*{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-5>*{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-6>*{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.3333333333%}.offset-2{margin-left:16.6666666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333333333%}.offset-5{margin-left:41.6666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333333333%}.offset-8{margin-left:66.6666666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333333333%}.offset-11{margin-left:91.6666666667%}@media (min-width: 576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-sm-1>*{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-sm-4>*{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.3333333333%}.offset-sm-2{margin-left:16.6666666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333333333%}.offset-sm-5{margin-left:41.6666666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333333333%}.offset-sm-8{margin-left:66.6666666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333333333%}.offset-sm-11{margin-left:91.6666666667%}}@media (min-width: 768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-md-1>*{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-md-4>*{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-md-5>*{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-md-6>*{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.3333333333%}.offset-md-2{margin-left:16.6666666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333333333%}.offset-md-5{margin-left:41.6666666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333333333%}.offset-md-8{margin-left:66.6666666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333333333%}.offset-md-11{margin-left:91.6666666667%}}@media (min-width: 992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-lg-1>*{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-lg-4>*{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.3333333333%}.offset-lg-2{margin-left:16.6666666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333333333%}.offset-lg-5{margin-left:41.6666666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333333333%}.offset-lg-8{margin-left:66.6666666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333333333%}.offset-lg-11{margin-left:91.6666666667%}}@media (min-width: 1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-xl-1>*{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xl-4>*{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.3333333333%}.offset-xl-2{margin-left:16.6666666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333333333%}.offset-xl-5{margin-left:41.6666666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333333333%}.offset-xl-8{margin-left:66.6666666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333333333%}.offset-xl-11{margin-left:91.6666666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table th,.table td{padding:0.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm th,.table-sm td{padding:0.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered th,.table-bordered td{border:1px solid #dee2e6}.table-bordered thead th,.table-bordered thead td{border-bottom-width:2px}.table-borderless th,.table-borderless td,.table-borderless thead th,.table-borderless tbody+tbody{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:#ecf0f1}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,0.075)}.table-primary,.table-primary>th,.table-primary>td{background-color:#c4c9ce}.table-primary th,.table-primary td,.table-primary thead th,.table-primary tbody+tbody{border-color:#919ba4}.table-hover .table-primary:hover{background-color:#b6bcc2}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#b6bcc2}.table-secondary,.table-secondary>th,.table-secondary>td{background-color:#e1e6e6}.table-secondary th,.table-secondary td,.table-secondary thead th,.table-secondary tbody+tbody{border-color:#c8d0d1}.table-hover .table-secondary:hover{background-color:#d3dada}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#d3dada}.table-success,.table-success>th,.table-success>td{background-color:#beece3}.table-success th,.table-success td,.table-success thead th,.table-success tbody+tbody{border-color:#87dccc}.table-hover .table-success:hover{background-color:#aae6db}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#aae6db}.table-info,.table-info>th,.table-info>td{background-color:#c6e2f5}.table-info th,.table-info td,.table-info thead th,.table-info tbody+tbody{border-color:#95c9ec}.table-hover .table-info:hover{background-color:#b0d7f1}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#b0d7f1}.table-warning,.table-warning>th,.table-warning>td{background-color:#fce3bd}.table-warning th,.table-warning td,.table-warning thead th,.table-warning tbody+tbody{border-color:#f9cc84}.table-hover .table-warning:hover{background-color:#fbd9a5}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#fbd9a5}.table-danger,.table-danger>th,.table-danger>td{background-color:#f8cdc8}.table-danger th,.table-danger td,.table-danger thead th,.table-danger tbody+tbody{border-color:#f3a29a}.table-hover .table-danger:hover{background-color:#f5b8b1}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f5b8b1}.table-light,.table-light>th,.table-light>td{background-color:#fafbfb}.table-light th,.table-light td,.table-light thead th,.table-light tbody+tbody{border-color:#f5f7f8}.table-hover .table-light:hover{background-color:#ecf0f0}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ecf0f0}.table-dark,.table-dark>th,.table-dark>td{background-color:#dadedf}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#bac2c3}.table-hover .table-dark:hover{background-color:#ccd2d3}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#ccd2d3}.table-active,.table-active>th,.table-active>td{background-color:rgba(0,0,0,0.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,0.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,0.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#7b8a8b;background-color:#ecf0f1;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark th,.table-dark td,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,0.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,0.075)}@media (max-width: 575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width: 767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width: 991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width: 1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + 0.75rem + 2px);padding:0.375rem 0.75rem;font-size:0.9375rem;font-weight:400;line-height:1.5;color:#7b8a8b;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:0.25rem;-webkit-transition:border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control{-webkit-transition:none;transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #7b8a8b}.form-control:focus{color:#7b8a8b;background-color:#fff;border-color:#597ea2;outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(44,62,80,0.25);box-shadow:0 0 0 0.2rem rgba(44,62,80,0.25)}.form-control::-webkit-input-placeholder{color:#95a5a6;opacity:1}.form-control::-ms-input-placeholder{color:#95a5a6;opacity:1}.form-control::placeholder{color:#95a5a6;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#ecf0f1;opacity:1}select.form-control:focus::-ms-value{color:#7b8a8b;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.171875rem;line-height:1.5}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.8203125rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:0.375rem 0;margin-bottom:0;font-size:0.9375rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + 0.5rem + 2px);padding:0.25rem 0.5rem;font-size:0.8203125rem;line-height:1.5;border-radius:0.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:0.5rem 1rem;font-size:1.171875rem;line-height:1.5;border-radius:0.3rem}select.form-control[size],select.form-control[multiple]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:0.25rem}.form-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*="col-"]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:0.3rem;margin-left:-1.25rem}.form-check-input[disabled] ~ .form-check-label,.form-check-input:disabled ~ .form-check-label{color:#95a5a6}.form-check-label{margin-bottom:0}.form-check-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:0.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:0.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:0.25rem;font-size:80%;color:#20BF55}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:0.25rem 0.5rem;margin-top:.1rem;font-size:0.8203125rem;line-height:1.5;color:#fff;background-color:rgba(24,188,156,0.9);border-radius:0.25rem}.was-validated :valid ~ .valid-feedback,.was-validated :valid ~ .valid-tooltip,.is-valid ~ .valid-feedback,.is-valid ~ .valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#20BF55;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2320BF55' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#20BF55;-webkit-box-shadow:0 0 0 0.2rem rgba(24,188,156,0.25);box-shadow:0 0 0 0.2rem rgba(24,188,156,0.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .custom-select:valid,.custom-select.is-valid{border-color:#20BF55;padding-right:calc(0.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2320BF55' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .custom-select:valid:focus,.custom-select.is-valid:focus{border-color:#20BF55;-webkit-box-shadow:0 0 0 0.2rem rgba(24,188,156,0.25);box-shadow:0 0 0 0.2rem rgba(24,188,156,0.25)}.was-validated .form-check-input:valid ~ .form-check-label,.form-check-input.is-valid ~ .form-check-label{color:#20BF55}.was-validated .form-check-input:valid ~ .valid-feedback,.was-validated .form-check-input:valid ~ .valid-tooltip,.form-check-input.is-valid ~ .valid-feedback,.form-check-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-control-input:valid ~ .custom-control-label,.custom-control-input.is-valid ~ .custom-control-label{color:#20BF55}.was-validated .custom-control-input:valid ~ .custom-control-label::before,.custom-control-input.is-valid ~ .custom-control-label::before{border-color:#20BF55}.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before,.custom-control-input.is-valid:checked ~ .custom-control-label::before{border-color:#24e3be;background-color:#24e3be}.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before,.custom-control-input.is-valid:focus ~ .custom-control-label::before{-webkit-box-shadow:0 0 0 0.2rem rgba(24,188,156,0.25);box-shadow:0 0 0 0.2rem rgba(24,188,156,0.25)}.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before,.custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before{border-color:#20BF55}.was-validated .custom-file-input:valid ~ .custom-file-label,.custom-file-input.is-valid ~ .custom-file-label{border-color:#20BF55}.was-validated .custom-file-input:valid:focus ~ .custom-file-label,.custom-file-input.is-valid:focus ~ .custom-file-label{border-color:#20BF55;-webkit-box-shadow:0 0 0 0.2rem rgba(24,188,156,0.25);box-shadow:0 0 0 0.2rem rgba(24,188,156,0.25)}.invalid-feedback{display:none;width:100%;margin-top:0.25rem;font-size:80%;color:#E74C3C}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:0.25rem 0.5rem;margin-top:.1rem;font-size:0.8203125rem;line-height:1.5;color:#fff;background-color:rgba(231,76,60,0.9);border-radius:0.25rem}.was-validated :invalid ~ .invalid-feedback,.was-validated :invalid ~ .invalid-tooltip,.is-invalid ~ .invalid-feedback,.is-invalid ~ .invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#E74C3C;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23E74C3C' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23E74C3C' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#E74C3C;-webkit-box-shadow:0 0 0 0.2rem rgba(231,76,60,0.25);box-shadow:0 0 0 0.2rem rgba(231,76,60,0.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .custom-select:invalid,.custom-select.is-invalid{border-color:#E74C3C;padding-right:calc(0.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23E74C3C' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23E74C3C' stroke='none'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .custom-select:invalid:focus,.custom-select.is-invalid:focus{border-color:#E74C3C;-webkit-box-shadow:0 0 0 0.2rem rgba(231,76,60,0.25);box-shadow:0 0 0 0.2rem rgba(231,76,60,0.25)}.was-validated .form-check-input:invalid ~ .form-check-label,.form-check-input.is-invalid ~ .form-check-label{color:#E74C3C}.was-validated .form-check-input:invalid ~ .invalid-feedback,.was-validated .form-check-input:invalid ~ .invalid-tooltip,.form-check-input.is-invalid ~ .invalid-feedback,.form-check-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-control-input:invalid ~ .custom-control-label,.custom-control-input.is-invalid ~ .custom-control-label{color:#E74C3C}.was-validated .custom-control-input:invalid ~ .custom-control-label::before,.custom-control-input.is-invalid ~ .custom-control-label::before{border-color:#E74C3C}.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before,.custom-control-input.is-invalid:checked ~ .custom-control-label::before{border-color:#ed7669;background-color:#ed7669}.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before,.custom-control-input.is-invalid:focus ~ .custom-control-label::before{-webkit-box-shadow:0 0 0 0.2rem rgba(231,76,60,0.25);box-shadow:0 0 0 0.2rem rgba(231,76,60,0.25)}.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before,.custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before{border-color:#E74C3C}.was-validated .custom-file-input:invalid ~ .custom-file-label,.custom-file-input.is-invalid ~ .custom-file-label{border-color:#E74C3C}.was-validated .custom-file-input:invalid:focus ~ .custom-file-label,.custom-file-input.is-invalid:focus ~ .custom-file-label{border-color:#E74C3C;-webkit-box-shadow:0 0 0 0.2rem rgba(231,76,60,0.25);box-shadow:0 0 0 0.2rem rgba(231,76,60,0.25)}.form-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width: 576px){.form-inline label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group,.form-inline .custom-select{width:auto}.form-inline .form-check{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:0.25rem;margin-left:0}.form-inline .custom-control{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:0.375rem 0.75rem;font-size:0.9375rem;line-height:1.5;border-radius:0.25rem;-webkit-transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.btn{-webkit-transition:none;transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn:focus,.btn.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(44,62,80,0.25);box-shadow:0 0 0 0.2rem rgba(44,62,80,0.25)}.btn.disabled,.btn:disabled{opacity:0.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#20BF55;border-color:#20BF55}.btn-primary:hover{color:#fff;background-color:#1e2b37;border-color:#1a252f}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#1e2b37;border-color:#1a252f;-webkit-box-shadow:0 0 0 0.2rem rgba(76,91,106,0.5);box-shadow:0 0 0 0.2rem rgba(76,91,106,0.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#20BF55;border-color:#20BF55}.btn-primary:not(:disabled):not(.disabled):active,.btn-primary:not(:disabled):not(.disabled).active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#1a252f;border-color:#151e27}.btn-primary:not(:disabled):not(.disabled):active:focus,.btn-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(76,91,106,0.5);box-shadow:0 0 0 0.2rem rgba(76,91,106,0.5)}.btn-secondary{color:#fff;background-color:#95a5a6;border-color:#95a5a6}.btn-secondary:hover{color:#fff;background-color:#809395;border-color:#798d8f}.btn-secondary:focus,.btn-secondary.focus{color:#fff;background-color:#809395;border-color:#798d8f;-webkit-box-shadow:0 0 0 0.2rem rgba(165,179,179,0.5);box-shadow:0 0 0 0.2rem rgba(165,179,179,0.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#95a5a6;border-color:#95a5a6}.btn-secondary:not(:disabled):not(.disabled):active,.btn-secondary:not(:disabled):not(.disabled).active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#798d8f;border-color:#738789}.btn-secondary:not(:disabled):not(.disabled):active:focus,.btn-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(165,179,179,0.5);box-shadow:0 0 0 0.2rem rgba(165,179,179,0.5)}.btn-success{color:#fff;background-color:#20BF55;border-color:#20BF55}.btn-success:hover{color:#fff;background-color:#149a80;border-color:#128f76}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#149a80;border-color:#128f76;-webkit-box-shadow:0 0 0 0.2rem rgba(59,198,171,0.5);box-shadow:0 0 0 0.2rem rgba(59,198,171,0.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#20BF55;border-color:#20BF55}.btn-success:not(:disabled):not(.disabled):active,.btn-success:not(:disabled):not(.disabled).active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#128f76;border-color:#11836d}.btn-success:not(:disabled):not(.disabled):active:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.show>.btn-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(59,198,171,0.5);box-shadow:0 0 0 0.2rem rgba(59,198,171,0.5)}.btn-info{color:#fff;background-color:#3498DB;border-color:#3498DB}.btn-info:hover{color:#fff;background-color:#2384c6;border-color:#217dbb}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#2384c6;border-color:#217dbb;-webkit-box-shadow:0 0 0 0.2rem rgba(82,167,224,0.5);box-shadow:0 0 0 0.2rem rgba(82,167,224,0.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#3498DB;border-color:#3498DB}.btn-info:not(:disabled):not(.disabled):active,.btn-info:not(:disabled):not(.disabled).active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#217dbb;border-color:#1f76b0}.btn-info:not(:disabled):not(.disabled):active:focus,.btn-info:not(:disabled):not(.disabled).active:focus,.show>.btn-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(82,167,224,0.5);box-shadow:0 0 0 0.2rem rgba(82,167,224,0.5)}.btn-warning{color:#fff;background-color:#F39C12;border-color:#F39C12}.btn-warning:hover{color:#fff;background-color:#d4860b;border-color:#c87f0a}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#d4860b;border-color:#c87f0a;-webkit-box-shadow:0 0 0 0.2rem rgba(245,171,54,0.5);box-shadow:0 0 0 0.2rem rgba(245,171,54,0.5)}.btn-warning.disabled,.btn-warning:disabled{color:#fff;background-color:#F39C12;border-color:#F39C12}.btn-warning:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled).active,.show>.btn-warning.dropdown-toggle{color:#fff;background-color:#c87f0a;border-color:#bc770a}.btn-warning:not(:disabled):not(.disabled):active:focus,.btn-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(245,171,54,0.5);box-shadow:0 0 0 0.2rem rgba(245,171,54,0.5)}.btn-danger{color:#fff;background-color:#E74C3C;border-color:#E74C3C}.btn-danger:hover{color:#fff;background-color:#e12e1c;border-color:#d62c1a}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#e12e1c;border-color:#d62c1a;-webkit-box-shadow:0 0 0 0.2rem rgba(235,103,89,0.5);box-shadow:0 0 0 0.2rem rgba(235,103,89,0.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#E74C3C;border-color:#E74C3C}.btn-danger:not(:disabled):not(.disabled):active,.btn-danger:not(:disabled):not(.disabled).active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#d62c1a;border-color:#ca2a19}.btn-danger:not(:disabled):not(.disabled):active:focus,.btn-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(235,103,89,0.5);box-shadow:0 0 0 0.2rem rgba(235,103,89,0.5)}.btn-light{color:#212529;background-color:#ecf0f1;border-color:#ecf0f1}.btn-light:hover{color:#212529;background-color:#d6dfe1;border-color:#cfd9db}.btn-light:focus,.btn-light.focus{color:#212529;background-color:#d6dfe1;border-color:#cfd9db;-webkit-box-shadow:0 0 0 0.2rem rgba(206,210,211,0.5);box-shadow:0 0 0 0.2rem rgba(206,210,211,0.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#ecf0f1;border-color:#ecf0f1}.btn-light:not(:disabled):not(.disabled):active,.btn-light:not(:disabled):not(.disabled).active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#cfd9db;border-color:#c7d3d6}.btn-light:not(:disabled):not(.disabled):active:focus,.btn-light:not(:disabled):not(.disabled).active:focus,.show>.btn-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(206,210,211,0.5);box-shadow:0 0 0 0.2rem rgba(206,210,211,0.5)}.btn-dark{color:#fff;background-color:#7b8a8b;border-color:#7b8a8b}.btn-dark:hover{color:#fff;background-color:#697677;border-color:#636f70}.btn-dark:focus,.btn-dark.focus{color:#fff;background-color:#697677;border-color:#636f70;-webkit-box-shadow:0 0 0 0.2rem rgba(143,156,156,0.5);box-shadow:0 0 0 0.2rem rgba(143,156,156,0.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#7b8a8b;border-color:#7b8a8b}.btn-dark:not(:disabled):not(.disabled):active,.btn-dark:not(:disabled):not(.disabled).active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#636f70;border-color:#5d696a}.btn-dark:not(:disabled):not(.disabled):active:focus,.btn-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(143,156,156,0.5);box-shadow:0 0 0 0.2rem rgba(143,156,156,0.5)}.btn-outline-primary{color:#20BF55;border-color:#20BF55}.btn-outline-primary:hover{color:#fff;background-color:#20BF55;border-color:#20BF55}.btn-outline-primary:focus,.btn-outline-primary.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(44,62,80,0.5);box-shadow:0 0 0 0.2rem rgba(44,62,80,0.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#20BF55;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled):active,.btn-outline-primary:not(:disabled):not(.disabled).active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#20BF55;border-color:#20BF55}.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(44,62,80,0.5);box-shadow:0 0 0 0.2rem rgba(44,62,80,0.5)}.btn-outline-secondary{color:#95a5a6;border-color:#95a5a6}.btn-outline-secondary:hover{color:#fff;background-color:#95a5a6;border-color:#95a5a6}.btn-outline-secondary:focus,.btn-outline-secondary.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(149,165,166,0.5);box-shadow:0 0 0 0.2rem rgba(149,165,166,0.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#95a5a6;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled):active,.btn-outline-secondary:not(:disabled):not(.disabled).active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#95a5a6;border-color:#95a5a6}.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(149,165,166,0.5);box-shadow:0 0 0 0.2rem rgba(149,165,166,0.5)}.btn-outline-success{color:#20BF55;border-color:#20BF55}.btn-outline-success:hover{color:#fff;background-color:#20BF55;border-color:#20BF55}.btn-outline-success:focus,.btn-outline-success.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(24,188,156,0.5);box-shadow:0 0 0 0.2rem rgba(24,188,156,0.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#20BF55;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled):active,.btn-outline-success:not(:disabled):not(.disabled).active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#20BF55;border-color:#20BF55}.btn-outline-success:not(:disabled):not(.disabled):active:focus,.btn-outline-success:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(24,188,156,0.5);box-shadow:0 0 0 0.2rem rgba(24,188,156,0.5)}.btn-outline-info{color:#3498DB;border-color:#3498DB}.btn-outline-info:hover{color:#fff;background-color:#3498DB;border-color:#3498DB}.btn-outline-info:focus,.btn-outline-info.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(52,152,219,0.5);box-shadow:0 0 0 0.2rem rgba(52,152,219,0.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#3498DB;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled):active,.btn-outline-info:not(:disabled):not(.disabled).active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#3498DB;border-color:#3498DB}.btn-outline-info:not(:disabled):not(.disabled):active:focus,.btn-outline-info:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(52,152,219,0.5);box-shadow:0 0 0 0.2rem rgba(52,152,219,0.5)}.btn-outline-warning{color:#F39C12;border-color:#F39C12}.btn-outline-warning:hover{color:#fff;background-color:#F39C12;border-color:#F39C12}.btn-outline-warning:focus,.btn-outline-warning.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(243,156,18,0.5);box-shadow:0 0 0 0.2rem rgba(243,156,18,0.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#F39C12;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled):active,.btn-outline-warning:not(:disabled):not(.disabled).active,.show>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#F39C12;border-color:#F39C12}.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(243,156,18,0.5);box-shadow:0 0 0 0.2rem rgba(243,156,18,0.5)}.btn-outline-danger{color:#E74C3C;border-color:#E74C3C}.btn-outline-danger:hover{color:#fff;background-color:#E74C3C;border-color:#E74C3C}.btn-outline-danger:focus,.btn-outline-danger.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(231,76,60,0.5);box-shadow:0 0 0 0.2rem rgba(231,76,60,0.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#E74C3C;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled):active,.btn-outline-danger:not(:disabled):not(.disabled).active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#E74C3C;border-color:#E74C3C}.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(231,76,60,0.5);box-shadow:0 0 0 0.2rem rgba(231,76,60,0.5)}.btn-outline-light{color:#ecf0f1;border-color:#ecf0f1}.btn-outline-light:hover{color:#212529;background-color:#ecf0f1;border-color:#ecf0f1}.btn-outline-light:focus,.btn-outline-light.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(236,240,241,0.5);box-shadow:0 0 0 0.2rem rgba(236,240,241,0.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#ecf0f1;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled):active,.btn-outline-light:not(:disabled):not(.disabled).active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#ecf0f1;border-color:#ecf0f1}.btn-outline-light:not(:disabled):not(.disabled):active:focus,.btn-outline-light:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(236,240,241,0.5);box-shadow:0 0 0 0.2rem rgba(236,240,241,0.5)}.btn-outline-dark{color:#7b8a8b;border-color:#7b8a8b}.btn-outline-dark:hover{color:#fff;background-color:#7b8a8b;border-color:#7b8a8b}.btn-outline-dark:focus,.btn-outline-dark.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(123,138,139,0.5);box-shadow:0 0 0 0.2rem rgba(123,138,139,0.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#7b8a8b;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled):active,.btn-outline-dark:not(:disabled):not(.disabled).active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#7b8a8b;border-color:#7b8a8b}.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(123,138,139,0.5);box-shadow:0 0 0 0.2rem rgba(123,138,139,0.5)}.btn-link{font-weight:400;color:#20BF55;text-decoration:none}.btn-link:hover{color:#00A896;text-decoration:underline}.btn-link:focus,.btn-link.focus{text-decoration:underline;-webkit-box-shadow:none;box-shadow:none}.btn-link:disabled,.btn-link.disabled{color:#95a5a6;pointer-events:none}.btn-lg,.btn-group-lg>.btn{padding:0.5rem 1rem;font-size:1.171875rem;line-height:1.5;border-radius:0.3rem}.btn-sm,.btn-group-sm>.btn{padding:0.25rem 0.5rem;font-size:0.8203125rem;line-height:1.5;border-radius:0.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:0.5rem}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{-webkit-transition:opacity 0.15s linear;transition:opacity 0.15s linear}@media (prefers-reduced-motion: reduce){.fade{-webkit-transition:none;transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height 0.35s ease;transition:height 0.35s ease}@media (prefers-reduced-motion: reduce){.collapsing{-webkit-transition:none;transition:none}}.dropup,.dropright,.dropdown,.dropleft{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:0.255em;vertical-align:0.255em;content:"";border-top:0.3em solid;border-right:0.3em solid transparent;border-bottom:0;border-left:0.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:0.5rem 0;margin:0.125rem 0 0;font-size:0.9375rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.15);border-radius:0.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width: 576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width: 768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width: 992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width: 1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:0.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:0.255em;vertical-align:0.255em;content:"";border-top:0;border-right:0.3em solid transparent;border-bottom:0.3em solid;border-left:0.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:0.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:0.255em;vertical-align:0.255em;content:"";border-top:0.3em solid transparent;border-right:0;border-bottom:0.3em solid transparent;border-left:0.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:0.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:0.255em;vertical-align:0.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:0.255em;vertical-align:0.255em;content:"";border-top:0.3em solid transparent;border-right:0.3em solid;border-bottom:0.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^="top"],.dropdown-menu[x-placement^="right"],.dropdown-menu[x-placement^="bottom"],.dropdown-menu[x-placement^="left"]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:0.5rem 0;overflow:hidden;border-top:1px solid #ecf0f1}.dropdown-item{display:block;width:100%;padding:0.25rem 1.5rem;clear:both;font-weight:400;color:#7b8a8b;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:hover,.dropdown-item:focus{color:#fff;text-decoration:none;background-color:#20BF55}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#20BF55}.dropdown-item.disabled,.dropdown-item:disabled{color:#95a5a6;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:0.5rem 1.5rem;margin-bottom:0;font-size:0.8203125rem;color:#95a5a6;white-space:nowrap}.dropdown-item-text{display:block;padding:0.25rem 1.5rem;color:#7b8a8b}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover{z-index:1}.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child){margin-left:-1px}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:0.5625rem;padding-left:0.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:0.375rem;padding-left:0.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:0.75rem;padding-left:0.75rem}.btn-group-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type="radio"],.btn-group-toggle>.btn input[type="checkbox"],.btn-group-toggle>.btn-group>.btn input[type="radio"],.btn-group-toggle>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-control-plaintext,.input-group>.custom-select,.input-group>.custom-file{position:relative;-webkit-box-flex:1;-ms-flex:1 1 0%;flex:1 1 0%;min-width:0;margin-bottom:0}.input-group>.form-control+.form-control,.input-group>.form-control+.custom-select,.input-group>.form-control+.custom-file,.input-group>.form-control-plaintext+.form-control,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.custom-file,.input-group>.custom-select+.form-control,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.custom-file,.input-group>.custom-file+.form-control,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.custom-file{margin-left:-1px}.input-group>.form-control:focus,.input-group>.custom-select:focus,.input-group>.custom-file .custom-file-input:focus ~ .custom-file-label{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.form-control:not(:last-child),.input-group>.custom-select:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.form-control:not(:first-child),.input-group>.custom-select:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-prepend,.input-group-append{display:-webkit-box;display:-ms-flexbox;display:flex}.input-group-prepend .btn,.input-group-append .btn{position:relative;z-index:2}.input-group-prepend .btn:focus,.input-group-append .btn:focus{z-index:3}.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.input-group-text,.input-group-append .input-group-text+.btn{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0.375rem 0.75rem;margin-bottom:0;font-size:0.9375rem;font-weight:400;line-height:1.5;color:#7b8a8b;text-align:center;white-space:nowrap;background-color:#ecf0f1;border:1px solid #ced4da;border-radius:0.25rem}.input-group-text input[type="radio"],.input-group-text input[type="checkbox"]{margin-top:0}.input-group-lg>.form-control:not(textarea),.input-group-lg>.custom-select{height:calc(1.5em + 1rem + 2px)}.input-group-lg>.form-control,.input-group-lg>.custom-select,.input-group-lg>.input-group-prepend>.input-group-text,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-append>.btn{padding:0.5rem 1rem;font-size:1.171875rem;line-height:1.5;border-radius:0.3rem}.input-group-sm>.form-control:not(textarea),.input-group-sm>.custom-select{height:calc(1.5em + 0.5rem + 2px)}.input-group-sm>.form-control,.input-group-sm>.custom-select,.input-group-sm>.input-group-prepend>.input-group-text,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-append>.btn{padding:0.25rem 0.5rem;font-size:0.8203125rem;line-height:1.5;border-radius:0.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text,.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.40625rem;padding-left:1.5rem}.custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.203125rem;opacity:0}.custom-control-input:checked ~ .custom-control-label::before{color:#fff;border-color:#20BF55;background-color:#20BF55}.custom-control-input:focus ~ .custom-control-label::before{-webkit-box-shadow:0 0 0 0.2rem rgba(44,62,80,0.25);box-shadow:0 0 0 0.2rem rgba(44,62,80,0.25)}.custom-control-input:focus:not(:checked) ~ .custom-control-label::before{border-color:#597ea2}.custom-control-input:not(:disabled):active ~ .custom-control-label::before{color:#fff;background-color:#7997b5;border-color:#7997b5}.custom-control-input[disabled] ~ .custom-control-label,.custom-control-input:disabled ~ .custom-control-label{color:#95a5a6}.custom-control-input[disabled] ~ .custom-control-label::before,.custom-control-input:disabled ~ .custom-control-label::before{background-color:#ecf0f1}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:0.203125rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#b4bcc2 solid 1px}.custom-control-label::after{position:absolute;top:0.203125rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50% / 50% 50%}.custom-checkbox .custom-control-label::before{border-radius:0.25rem}.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before{border-color:#20BF55;background-color:#20BF55}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(44,62,80,0.5)}.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before{background-color:rgba(44,62,80,0.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(44,62,80,0.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:0.5rem}.custom-switch .custom-control-label::after{top:calc(0.203125rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#b4bcc2;border-radius:0.5rem;-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.custom-switch .custom-control-label::after{-webkit-transition:none;transition:none}}.custom-switch .custom-control-input:checked ~ .custom-control-label::after{background-color:#fff;-webkit-transform:translateX(0.75rem);transform:translateX(0.75rem)}.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(44,62,80,0.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + 0.75rem + 2px);padding:0.375rem 1.75rem 0.375rem 0.75rem;font-size:0.9375rem;font-weight:400;line-height:1.5;color:#7b8a8b;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px;border:1px solid #ced4da;border-radius:0.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#597ea2;outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(44,62,80,0.25);box-shadow:0 0 0 0.2rem rgba(44,62,80,0.25)}.custom-select:focus::-ms-value{color:#7b8a8b;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:0.75rem;background-image:none}.custom-select:disabled{color:#95a5a6;background-color:#ecf0f1}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #7b8a8b}.custom-select-sm{height:calc(1.5em + 0.5rem + 2px);padding-top:0.25rem;padding-bottom:0.25rem;padding-left:0.5rem;font-size:0.8203125rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:0.5rem;padding-bottom:0.5rem;padding-left:1rem;font-size:1.171875rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + 0.75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + 0.75rem + 2px);margin:0;opacity:0}.custom-file-input:focus ~ .custom-file-label{border-color:#597ea2;-webkit-box-shadow:0 0 0 0.2rem rgba(44,62,80,0.25);box-shadow:0 0 0 0.2rem rgba(44,62,80,0.25)}.custom-file-input[disabled] ~ .custom-file-label,.custom-file-input:disabled ~ .custom-file-label{background-color:#ecf0f1}.custom-file-input:lang(en) ~ .custom-file-label::after{content:"Browse"}.custom-file-input ~ .custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + 0.75rem + 2px);padding:0.375rem 0.75rem;font-weight:400;line-height:1.5;color:#7b8a8b;background-color:#fff;border:1px solid #ced4da;border-radius:0.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + 0.75rem);padding:0.375rem 0.75rem;line-height:1.5;color:#7b8a8b;content:"Browse";background-color:#ecf0f1;border-left:inherit;border-radius:0 0.25rem 0.25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:none}.custom-range:focus::-webkit-slider-thumb{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(44,62,80,0.25);box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(44,62,80,0.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(44,62,80,0.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(44,62,80,0.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;background-color:#20BF55;border:0;border-radius:1rem;-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion: reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#7997b5}.custom-range::-webkit-slider-runnable-track{width:100%;height:0.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#20BF55;border:0;border-radius:1rem;-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion: reduce){.custom-range::-moz-range-thumb{-webkit-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#7997b5}.custom-range::-moz-range-track{width:100%;height:0.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:0.2rem;margin-left:0.2rem;background-color:#20BF55;border:0;border-radius:1rem;-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){.custom-range::-ms-thumb{-webkit-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#7997b5}.custom-range::-ms-track{width:100%;height:0.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:0.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#b4bcc2}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#b4bcc2}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#b4bcc2}.custom-control-label::before,.custom-file-label,.custom-select{-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.custom-control-label::before,.custom-file-label,.custom-select{-webkit-transition:none;transition:none}}.nav{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:0.5rem 2rem}.nav-link:hover,.nav-link:focus{text-decoration:none}.nav-link.disabled{color:#95a5a6;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #ecf0f1}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:0.25rem;border-top-right-radius:0.25rem}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#ecf0f1 #ecf0f1 #ecf0f1}.nav-tabs .nav-link.disabled{color:#95a5a6;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#7b8a8b;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:0.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#20BF55}.nav-fill .nav-item{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-sm,.navbar .container-md,.navbar .container-lg,.navbar .container-xl{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:0.1rem;padding-bottom:0.1rem;margin-right:1rem;font-size:1.171875rem;line-height:inherit;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:0.5rem;padding-bottom:0.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:0.25rem 0.75rem;font-size:1.171875rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:0.25rem}.navbar-toggler:hover,.navbar-toggler:focus{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width: 575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width: 576px){.navbar-expand-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width: 767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-md,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width: 768px){.navbar-expand-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-md,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width: 991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width: 992px){.navbar-expand-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width: 1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width: 1200px){.navbar-expand-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-sm,.navbar-expand>.container-md,.navbar-expand>.container-lg,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-sm,.navbar-expand>.container-md,.navbar-expand>.container-lg,.navbar-expand>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,0.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,0.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,0.5)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,0.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,0.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,0.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,0.5);border-color:rgba(0,0,0,0.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,0.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,0.9)}.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,0,0,0.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fff}.navbar-dark .navbar-nav .nav-link{color:#fff}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:#757575}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,0.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:#fff;border-color:rgba(255,255,255,0.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='%23fff' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:#fff}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,0.125);border-radius:0.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:0.25rem;border-top-right-radius:0.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:0.25rem;border-bottom-left-radius:0.25rem}.card-body{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:0.75rem}.card-subtitle{margin-top:-0.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:0.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,0.03);border-bottom:1px solid rgba(0,0,0,0.125)}.card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:0.75rem 1.25rem;background-color:rgba(0,0,0,0.03);border-top:1px solid rgba(0,0,0,0.125)}.card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.card-header-tabs{margin-right:-0.625rem;margin-bottom:-0.75rem;margin-left:-0.625rem;border-bottom:0}.card-header-pills{margin-right:-0.625rem;margin-left:-0.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img,.card-img-top,.card-img-bottom{-ms-flex-negative:0;flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(0.25rem - 1px);border-bottom-left-radius:calc(0.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width: 576px){.card-deck{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width: 576px){.card-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:0.75rem}@media (min-width: 576px){.card-columns{-webkit-column-count:3;column-count:3;-webkit-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:0.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#ecf0f1;border-radius:0.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:0.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:0.5rem;color:#95a5a6;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#95a5a6}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:0.25rem}.page-link{position:relative;display:block;padding:0.5rem 0.75rem;margin-left:0;line-height:1.25;color:#fff;background-color:#20BF55;border:0 solid transparent}.page-link:hover{z-index:2;color:#fff;text-decoration:none;background-color:#00A896;border-color:transparent}.page-link:focus{z-index:3;outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(44,62,80,0.25);box-shadow:0 0 0 0.2rem rgba(44,62,80,0.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:0.25rem;border-bottom-left-radius:0.25rem}.page-item:last-child .page-link{border-top-right-radius:0.25rem;border-bottom-right-radius:0.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#00A896;border-color:transparent}.page-item.disabled .page-link{color:#ecf0f1;pointer-events:none;cursor:auto;background-color:#3be6c4;border-color:transparent}.pagination-lg .page-link{padding:0.75rem 1.5rem;font-size:1.171875rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:0.3rem;border-bottom-left-radius:0.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:0.3rem;border-bottom-right-radius:0.3rem}.pagination-sm .page-link{padding:0.25rem 0.5rem;font-size:0.8203125rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:0.2rem;border-bottom-left-radius:0.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:0.2rem;border-bottom-right-radius:0.2rem}.badge{display:inline-block;padding:0.25em 0.4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:0.25rem;-webkit-transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.badge{-webkit-transition:none;transition:none}}a.badge:hover,a.badge:focus{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:0.6em;padding-left:0.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#20BF55}a.badge-primary:hover,a.badge-primary:focus{color:#fff;background-color:#1a252f}a.badge-primary:focus,a.badge-primary.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(44,62,80,0.5);box-shadow:0 0 0 0.2rem rgba(44,62,80,0.5)}.badge-secondary{color:#fff;background-color:#95a5a6}a.badge-secondary:hover,a.badge-secondary:focus{color:#fff;background-color:#798d8f}a.badge-secondary:focus,a.badge-secondary.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(149,165,166,0.5);box-shadow:0 0 0 0.2rem rgba(149,165,166,0.5)}.badge-success{color:#fff;background-color:#20BF55}a.badge-success:hover,a.badge-success:focus{color:#fff;background-color:#128f76}a.badge-success:focus,a.badge-success.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(24,188,156,0.5);box-shadow:0 0 0 0.2rem rgba(24,188,156,0.5)}.badge-info{color:#fff;background-color:#3498DB}a.badge-info:hover,a.badge-info:focus{color:#fff;background-color:#217dbb}a.badge-info:focus,a.badge-info.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(52,152,219,0.5);box-shadow:0 0 0 0.2rem rgba(52,152,219,0.5)}.badge-warning{color:#fff;background-color:#F39C12}a.badge-warning:hover,a.badge-warning:focus{color:#fff;background-color:#c87f0a}a.badge-warning:focus,a.badge-warning.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(243,156,18,0.5);box-shadow:0 0 0 0.2rem rgba(243,156,18,0.5)}.badge-danger{color:#fff;background-color:#E74C3C}a.badge-danger:hover,a.badge-danger:focus{color:#fff;background-color:#d62c1a}a.badge-danger:focus,a.badge-danger.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(231,76,60,0.5);box-shadow:0 0 0 0.2rem rgba(231,76,60,0.5)}.badge-light{color:#212529;background-color:#ecf0f1}a.badge-light:hover,a.badge-light:focus{color:#212529;background-color:#cfd9db}a.badge-light:focus,a.badge-light.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(236,240,241,0.5);box-shadow:0 0 0 0.2rem rgba(236,240,241,0.5)}.badge-dark{color:#fff;background-color:#7b8a8b}a.badge-dark:hover,a.badge-dark:focus{color:#fff;background-color:#636f70}a.badge-dark:focus,a.badge-dark.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(123,138,139,0.5);box-shadow:0 0 0 0.2rem rgba(123,138,139,0.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#ecf0f1;border-radius:0.3rem}@media (min-width: 576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:0.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:0.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3.90625rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:0.75rem 1.25rem;color:inherit}.alert-primary{color:#17202a;background-color:#d5d8dc;border-color:#c4c9ce}.alert-primary hr{border-top-color:#b6bcc2}.alert-primary .alert-link{color:#050709}.alert-secondary{color:#4d5656;background-color:#eaeded;border-color:#e1e6e6}.alert-secondary hr{border-top-color:#d3dada}.alert-secondary .alert-link{color:#353b3b}.alert-success{color:#0c6251;background-color:#d1f2eb;border-color:#beece3}.alert-success hr{border-top-color:#aae6db}.alert-success .alert-link{color:#06352b}.alert-info{color:#1b4f72;background-color:#d6eaf8;border-color:#c6e2f5}.alert-info hr{border-top-color:#b0d7f1}.alert-info .alert-link{color:#113249}.alert-warning{color:#7e5109;background-color:#fdebd0;border-color:#fce3bd}.alert-warning hr{border-top-color:#fbd9a5}.alert-warning .alert-link{color:#4e3206}.alert-danger{color:#78281f;background-color:#fadbd8;border-color:#f8cdc8}.alert-danger hr{border-top-color:#f5b8b1}.alert-danger .alert-link{color:#4f1a15}.alert-light{color:#7b7d7d;background-color:#fbfcfc;border-color:#fafbfb}.alert-light hr{border-top-color:#ecf0f0}.alert-light .alert-link{color:#626363}.alert-dark{color:#404848;background-color:#e5e8e8;border-color:#dadedf}.alert-dark hr{border-top-color:#ccd2d3}.alert-dark .alert-link{color:#282d2d}@-webkit-keyframes progress-bar-stripes{from{background-position:0.625rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:0.625rem 0}to{background-position:0 0}}.progress{display:-webkit-box;display:-ms-flexbox;display:flex;height:0.625rem;overflow:hidden;font-size:0.625rem;background-color:#ecf0f1;border-radius:0.25rem}.progress-bar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#20BF55;-webkit-transition:width 0.6s ease;transition:width 0.6s ease}@media (prefers-reduced-motion: reduce){.progress-bar{-webkit-transition:none;transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:0.625rem 0.625rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion: reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-ms-flex:1;flex:1}.list-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#7b8a8b;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:#7b8a8b;text-decoration:none;background-color:#ecf0f1}.list-group-item-action:active{color:#212529;background-color:#ecf0f1}.list-group-item{position:relative;display:block;padding:0.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,0.125)}.list-group-item:first-child{border-top-left-radius:0.25rem;border-top-right-radius:0.25rem}.list-group-item:last-child{border-bottom-right-radius:0.25rem;border-bottom-left-radius:0.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#95a5a6;pointer-events:none;background-color:#ecf0f1}.list-group-item.active{z-index:2;color:#fff;background-color:#20BF55;border-color:#20BF55}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item:first-child{border-bottom-left-radius:0.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{border-top-right-radius:0.25rem;border-bottom-left-radius:0}.list-group-horizontal .list-group-item.active{margin-top:0}.list-group-horizontal .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width: 576px){.list-group-horizontal-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item:first-child{border-bottom-left-radius:0.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{border-top-right-radius:0.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm .list-group-item.active{margin-top:0}.list-group-horizontal-sm .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 768px){.list-group-horizontal-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item:first-child{border-bottom-left-radius:0.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{border-top-right-radius:0.25rem;border-bottom-left-radius:0}.list-group-horizontal-md .list-group-item.active{margin-top:0}.list-group-horizontal-md .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 992px){.list-group-horizontal-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item:first-child{border-bottom-left-radius:0.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{border-top-right-radius:0.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg .list-group-item.active{margin-top:0}.list-group-horizontal-lg .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 1200px){.list-group-horizontal-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item:first-child{border-bottom-left-radius:0.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{border-top-right-radius:0.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl .list-group-item.active{margin-top:0}.list-group-horizontal-xl .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush .list-group-item{border-right-width:0;border-left-width:0;border-radius:0}.list-group-flush .list-group-item:first-child{border-top-width:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#17202a;background-color:#c4c9ce}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#17202a;background-color:#b6bcc2}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#17202a;border-color:#17202a}.list-group-item-secondary{color:#4d5656;background-color:#e1e6e6}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#4d5656;background-color:#d3dada}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#4d5656;border-color:#4d5656}.list-group-item-success{color:#0c6251;background-color:#beece3}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#0c6251;background-color:#aae6db}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0c6251;border-color:#0c6251}.list-group-item-info{color:#1b4f72;background-color:#c6e2f5}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#1b4f72;background-color:#b0d7f1}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#1b4f72;border-color:#1b4f72}.list-group-item-warning{color:#7e5109;background-color:#fce3bd}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#7e5109;background-color:#fbd9a5}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#7e5109;border-color:#7e5109}.list-group-item-danger{color:#78281f;background-color:#f8cdc8}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#78281f;background-color:#f5b8b1}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#78281f;border-color:#78281f}.list-group-item-light{color:#7b7d7d;background-color:#fafbfb}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#7b7d7d;background-color:#ecf0f0}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#7b7d7d;border-color:#7b7d7d}.list-group-item-dark{color:#404848;background-color:#dadedf}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#404848;background-color:#ccd2d3}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#404848;border-color:#404848}.close{float:right;font-size:1.40625rem;font-weight:700;line-height:1;color:#fff;text-shadow:none;opacity:.5}.close:hover{color:#fff;text-decoration:none}.close:not(:disabled):not(.disabled):hover,.close:not(:disabled):not(.disabled):focus{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:0.875rem;background-color:rgba(255,255,255,0.85);background-clip:padding-box;border:1px solid rgba(0,0,0,0.1);-webkit-box-shadow:0 0.25rem 0.75rem rgba(0,0,0,0.1);box-shadow:0 0.25rem 0.75rem rgba(0,0,0,0.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:0.25rem}.toast:not(:last-child){margin-bottom:0.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0.25rem 0.75rem;color:#95a5a6;background-color:rgba(255,255,255,0.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,0.05)}.toast-body{padding:0.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:0.5rem;pointer-events:none}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform 0.3s ease-out;transition:-webkit-transform 0.3s ease-out;transition:transform 0.3s ease-out;transition:transform 0.3s ease-out, -webkit-transform 0.3s ease-out;-webkit-transform:translate(0, -50px);transform:translate(0, -50px)}@media (prefers-reduced-motion: reduce){.modal.fade .modal-dialog{-webkit-transition:none;transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static .modal-dialog{-webkit-transform:scale(1.02);transform:scale(1.02)}.modal-dialog-scrollable{display:-webkit-box;display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-header,.modal-dialog-scrollable .modal-footer{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:0.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:0.5}.modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(0.3rem - 1px);border-top-right-radius:calc(0.3rem - 1px)}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding:0.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(0.3rem - 1px);border-bottom-left-radius:calc(0.3rem - 1px)}.modal-footer>*{margin:0.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width: 576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width: 992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width: 1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:"Noto Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:0.8203125rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:0.9}.tooltip .arrow{position:absolute;display:block;width:0.8rem;height:0.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[x-placement^="top"]{padding:0.4rem 0}.bs-tooltip-top .arrow,.bs-tooltip-auto[x-placement^="top"] .arrow{bottom:0}.bs-tooltip-top .arrow::before,.bs-tooltip-auto[x-placement^="top"] .arrow::before{top:0;border-width:0.4rem 0.4rem 0;border-top-color:#000}.bs-tooltip-right,.bs-tooltip-auto[x-placement^="right"]{padding:0 0.4rem}.bs-tooltip-right .arrow,.bs-tooltip-auto[x-placement^="right"] .arrow{left:0;width:0.4rem;height:0.8rem}.bs-tooltip-right .arrow::before,.bs-tooltip-auto[x-placement^="right"] .arrow::before{right:0;border-width:0.4rem 0.4rem 0.4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[x-placement^="bottom"]{padding:0.4rem 0}.bs-tooltip-bottom .arrow,.bs-tooltip-auto[x-placement^="bottom"] .arrow{top:0}.bs-tooltip-bottom .arrow::before,.bs-tooltip-auto[x-placement^="bottom"] .arrow::before{bottom:0;border-width:0 0.4rem 0.4rem;border-bottom-color:#000}.bs-tooltip-left,.bs-tooltip-auto[x-placement^="left"]{padding:0 0.4rem}.bs-tooltip-left .arrow,.bs-tooltip-auto[x-placement^="left"] .arrow{right:0;width:0.4rem;height:0.8rem}.bs-tooltip-left .arrow::before,.bs-tooltip-auto[x-placement^="left"] .arrow::before{left:0;border-width:0.4rem 0 0.4rem 0.4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:0.25rem 0.5rem;color:#fff;text-align:center;background-color:#000;border-radius:0.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:"Noto Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:0.8203125rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:0.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:0.5rem;margin:0 0.3rem}.popover .arrow::before,.popover .arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-top,.bs-popover-auto[x-placement^="top"]{margin-bottom:0.5rem}.bs-popover-top>.arrow,.bs-popover-auto[x-placement^="top"]>.arrow{bottom:calc(-0.5rem - 1px)}.bs-popover-top>.arrow::before,.bs-popover-auto[x-placement^="top"]>.arrow::before{bottom:0;border-width:0.5rem 0.5rem 0;border-top-color:rgba(0,0,0,0.25)}.bs-popover-top>.arrow::after,.bs-popover-auto[x-placement^="top"]>.arrow::after{bottom:1px;border-width:0.5rem 0.5rem 0;border-top-color:#fff}.bs-popover-right,.bs-popover-auto[x-placement^="right"]{margin-left:0.5rem}.bs-popover-right>.arrow,.bs-popover-auto[x-placement^="right"]>.arrow{left:calc(-0.5rem - 1px);width:0.5rem;height:1rem;margin:0.3rem 0}.bs-popover-right>.arrow::before,.bs-popover-auto[x-placement^="right"]>.arrow::before{left:0;border-width:0.5rem 0.5rem 0.5rem 0;border-right-color:rgba(0,0,0,0.25)}.bs-popover-right>.arrow::after,.bs-popover-auto[x-placement^="right"]>.arrow::after{left:1px;border-width:0.5rem 0.5rem 0.5rem 0;border-right-color:#fff}.bs-popover-bottom,.bs-popover-auto[x-placement^="bottom"]{margin-top:0.5rem}.bs-popover-bottom>.arrow,.bs-popover-auto[x-placement^="bottom"]>.arrow{top:calc(-0.5rem - 1px)}.bs-popover-bottom>.arrow::before,.bs-popover-auto[x-placement^="bottom"]>.arrow::before{top:0;border-width:0 0.5rem 0.5rem 0.5rem;border-bottom-color:rgba(0,0,0,0.25)}.bs-popover-bottom>.arrow::after,.bs-popover-auto[x-placement^="bottom"]>.arrow::after{top:1px;border-width:0 0.5rem 0.5rem 0.5rem;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[x-placement^="bottom"] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-0.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-left,.bs-popover-auto[x-placement^="left"]{margin-right:0.5rem}.bs-popover-left>.arrow,.bs-popover-auto[x-placement^="left"]>.arrow{right:calc(-0.5rem - 1px);width:0.5rem;height:1rem;margin:0.3rem 0}.bs-popover-left>.arrow::before,.bs-popover-auto[x-placement^="left"]>.arrow::before{right:0;border-width:0.5rem 0 0.5rem 0.5rem;border-left-color:rgba(0,0,0,0.25)}.bs-popover-left>.arrow::after,.bs-popover-auto[x-placement^="left"]>.arrow::after{right:1px;border-width:0.5rem 0 0.5rem 0.5rem;border-left-color:#fff}.popover-header{padding:0.5rem 0.75rem;margin-bottom:0;font-size:0.9375rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(0.3rem - 1px);border-top-right-radius:calc(0.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:0.5rem 0.75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:-webkit-transform 0.6s ease-in-out;transition:-webkit-transform 0.6s ease-in-out;transition:transform 0.6s ease-in-out;transition:transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out}@media (prefers-reduced-motion: reduce){.carousel-item{-webkit-transition:none;transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-left),.active.carousel-item-right{-webkit-transform:translateX(100%);transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-right),.active.carousel-item-left{-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;-webkit-transition-property:opacity;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;-webkit-transition:opacity 0s 0.6s;transition:opacity 0s 0.6s}@media (prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{-webkit-transition:none;transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:0.5;-webkit-transition:opacity 0.15s ease;transition:opacity 0.15s ease}@media (prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{-webkit-transition:none;transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:0.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50% / 100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{-webkit-box-sizing:content-box;box-sizing:content-box;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;-webkit-transition:opacity 0.6s ease;transition:opacity 0.6s ease}@media (prefers-reduced-motion: reduce){.carousel-indicators li{-webkit-transition:none;transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:0.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:0.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.bg-primary{background-color:#20BF55 !important}a.bg-primary:hover,a.bg-primary:focus,button.bg-primary:hover,button.bg-primary:focus{background-color:#1a252f !important}.bg-secondary{background-color:#95a5a6 !important}a.bg-secondary:hover,a.bg-secondary:focus,button.bg-secondary:hover,button.bg-secondary:focus{background-color:#798d8f !important}.bg-success{background-color:#20BF55 !important}a.bg-success:hover,a.bg-success:focus,button.bg-success:hover,button.bg-success:focus{background-color:#128f76 !important}.bg-info{background-color:#3498DB !important}a.bg-info:hover,a.bg-info:focus,button.bg-info:hover,button.bg-info:focus{background-color:#217dbb !important}.bg-warning{background-color:#F39C12 !important}a.bg-warning:hover,a.bg-warning:focus,button.bg-warning:hover,button.bg-warning:focus{background-color:#c87f0a !important}.bg-danger{background-color:#E74C3C !important}a.bg-danger:hover,a.bg-danger:focus,button.bg-danger:hover,button.bg-danger:focus{background-color:#d62c1a !important}.bg-light{background-color:#ecf0f1 !important}a.bg-light:hover,a.bg-light:focus,button.bg-light:hover,button.bg-light:focus{background-color:#cfd9db !important}.bg-dark{background-color:#7b8a8b !important}a.bg-dark:hover,a.bg-dark:focus,button.bg-dark:hover,button.bg-dark:focus{background-color:#636f70 !important}.bg-white{background-color:#fff !important}.bg-transparent{background-color:transparent !important}.border{border:1px solid #dee2e6 !important}.border-top{border-top:1px solid #dee2e6 !important}.border-right{border-right:1px solid #dee2e6 !important}.border-bottom{border-bottom:1px solid #dee2e6 !important}.border-left{border-left:1px solid #dee2e6 !important}.border-0{border:0 !important}.border-top-0{border-top:0 !important}.border-right-0{border-right:0 !important}.border-bottom-0{border-bottom:0 !important}.border-left-0{border-left:0 !important}.border-primary{border-color:#20BF55 !important}.border-secondary{border-color:#95a5a6 !important}.border-success{border-color:#20BF55 !important}.border-info{border-color:#3498DB !important}.border-warning{border-color:#F39C12 !important}.border-danger{border-color:#E74C3C !important}.border-light{border-color:#ecf0f1 !important}.border-dark{border-color:#7b8a8b !important}.border-white{border-color:#fff !important}.rounded-sm{border-radius:0.2rem !important}.rounded{border-radius:0.25rem !important}.rounded-top{border-top-left-radius:0.25rem !important;border-top-right-radius:0.25rem !important}.rounded-right{border-top-right-radius:0.25rem !important;border-bottom-right-radius:0.25rem !important}.rounded-bottom{border-bottom-right-radius:0.25rem !important;border-bottom-left-radius:0.25rem !important}.rounded-left{border-top-left-radius:0.25rem !important;border-bottom-left-radius:0.25rem !important}.rounded-lg{border-radius:0.3rem !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:50rem !important}.rounded-0{border-radius:0 !important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}@media (min-width: 576px){.d-sm-none{display:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-sm-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media (min-width: 768px){.d-md-none{display:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-md-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media (min-width: 992px){.d-lg-none{display:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-lg-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media (min-width: 1200px){.d-xl-none{display:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-xl-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media print{.d-print-none{display:none !important}.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-print-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.8571428571%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.flex-fill{-webkit-box-flex:1 !important;-ms-flex:1 1 auto !important;flex:1 1 auto !important}.flex-grow-0{-webkit-box-flex:0 !important;-ms-flex-positive:0 !important;flex-grow:0 !important}.flex-grow-1{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important}.flex-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.flex-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.justify-content-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}@media (min-width: 576px){.flex-sm-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-sm-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-sm-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-sm-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-sm-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-sm-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.flex-sm-fill{-webkit-box-flex:1 !important;-ms-flex:1 1 auto !important;flex:1 1 auto !important}.flex-sm-grow-0{-webkit-box-flex:0 !important;-ms-flex-positive:0 !important;flex-grow:0 !important}.flex-sm-grow-1{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important}.flex-sm-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.flex-sm-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.justify-content-sm-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-sm-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-sm-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-sm-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-sm-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-sm-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-sm-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-sm-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-sm-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-sm-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-sm-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-sm-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-sm-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-sm-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-sm-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-sm-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-sm-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-sm-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-sm-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-sm-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-sm-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-sm-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media (min-width: 768px){.flex-md-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-md-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-md-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-md-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-md-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-md-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.flex-md-fill{-webkit-box-flex:1 !important;-ms-flex:1 1 auto !important;flex:1 1 auto !important}.flex-md-grow-0{-webkit-box-flex:0 !important;-ms-flex-positive:0 !important;flex-grow:0 !important}.flex-md-grow-1{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important}.flex-md-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.flex-md-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.justify-content-md-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-md-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-md-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-md-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-md-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-md-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-md-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-md-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-md-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-md-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-md-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-md-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-md-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-md-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-md-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-md-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-md-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-md-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-md-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-md-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-md-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-md-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media (min-width: 992px){.flex-lg-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-lg-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-lg-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-lg-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-lg-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-lg-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.flex-lg-fill{-webkit-box-flex:1 !important;-ms-flex:1 1 auto !important;flex:1 1 auto !important}.flex-lg-grow-0{-webkit-box-flex:0 !important;-ms-flex-positive:0 !important;flex-grow:0 !important}.flex-lg-grow-1{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important}.flex-lg-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.flex-lg-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.justify-content-lg-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-lg-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-lg-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-lg-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-lg-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-lg-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-lg-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-lg-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-lg-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-lg-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-lg-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-lg-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-lg-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-lg-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-lg-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-lg-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-lg-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-lg-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-lg-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-lg-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-lg-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-lg-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media (min-width: 1200px){.flex-xl-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-xl-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-xl-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-xl-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-xl-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-xl-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.flex-xl-fill{-webkit-box-flex:1 !important;-ms-flex:1 1 auto !important;flex:1 1 auto !important}.flex-xl-grow-0{-webkit-box-flex:0 !important;-ms-flex-positive:0 !important;flex-grow:0 !important}.flex-xl-grow-1{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important}.flex-xl-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.flex-xl-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.justify-content-xl-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-xl-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-xl-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-xl-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-xl-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-xl-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-xl-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-xl-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-xl-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-xl-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-xl-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-xl-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-xl-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-xl-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-xl-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-xl-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-xl-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-xl-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-xl-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-xl-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-xl-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-xl-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}.float-left{float:left !important}.float-right{float:right !important}.float-none{float:none !important}@media (min-width: 576px){.float-sm-left{float:left !important}.float-sm-right{float:right !important}.float-sm-none{float:none !important}}@media (min-width: 768px){.float-md-left{float:left !important}.float-md-right{float:right !important}.float-md-none{float:none !important}}@media (min-width: 992px){.float-lg-left{float:left !important}.float-lg-right{float:right !important}.float-lg-none{float:none !important}}@media (min-width: 1200px){.float-xl-left{float:left !important}.float-xl-right{float:right !important}.float-xl-none{float:none !important}}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:-webkit-sticky !important;position:sticky !important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports (position: -webkit-sticky) or (position: sticky){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{-webkit-box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.075) !important;box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.075) !important}.shadow{-webkit-box-shadow:0 0.5rem 1rem rgba(0,0,0,0.15) !important;box-shadow:0 0.5rem 1rem rgba(0,0,0,0.15) !important}.shadow-lg{-webkit-box-shadow:0 1rem 3rem rgba(0,0,0,0.175) !important;box-shadow:0 1rem 3rem rgba(0,0,0,0.175) !important}.shadow-none{-webkit-box-shadow:none !important;box-shadow:none !important}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mw-100{max-width:100% !important}.mh-100{max-height:100% !important}.min-vw-100{min-width:100vw !important}.min-vh-100{min-height:100vh !important}.vw-100{width:100vw !important}.vh-100{height:100vh !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0 !important}.mt-0,.my-0{margin-top:0 !important}.mr-0,.mx-0{margin-right:0 !important}.mb-0,.my-0{margin-bottom:0 !important}.ml-0,.mx-0{margin-left:0 !important}.m-1{margin:0.25rem !important}.mt-1,.my-1{margin-top:0.25rem !important}.mr-1,.mx-1{margin-right:0.25rem !important}.mb-1,.my-1{margin-bottom:0.25rem !important}.ml-1,.mx-1{margin-left:0.25rem !important}.m-2{margin:0.5rem !important}.mt-2,.my-2{margin-top:0.5rem !important}.mr-2,.mx-2{margin-right:0.5rem !important}.mb-2,.my-2{margin-bottom:0.5rem !important}.ml-2,.mx-2{margin-left:0.5rem !important}.m-3{margin:1rem !important}.mt-3,.my-3{margin-top:1rem !important}.mr-3,.mx-3{margin-right:1rem !important}.mb-3,.my-3{margin-bottom:1rem !important}.ml-3,.mx-3{margin-left:1rem !important}.m-4{margin:1.5rem !important}.mt-4,.my-4{margin-top:1.5rem !important}.mr-4,.mx-4{margin-right:1.5rem !important}.mb-4,.my-4{margin-bottom:1.5rem !important}.ml-4,.mx-4{margin-left:1.5rem !important}.m-5{margin:3rem !important}.mt-5,.my-5{margin-top:3rem !important}.mr-5,.mx-5{margin-right:3rem !important}.mb-5,.my-5{margin-bottom:3rem !important}.ml-5,.mx-5{margin-left:3rem !important}.p-0{padding:0 !important}.pt-0,.py-0{padding-top:0 !important}.pr-0,.px-0{padding-right:0 !important}.pb-0,.py-0{padding-bottom:0 !important}.pl-0,.px-0{padding-left:0 !important}.p-1{padding:0.25rem !important}.pt-1,.py-1{padding-top:0.25rem !important}.pr-1,.px-1{padding-right:0.25rem !important}.pb-1,.py-1{padding-bottom:0.25rem !important}.pl-1,.px-1{padding-left:0.25rem !important}.p-2{padding:0.5rem !important}.pt-2,.py-2{padding-top:0.5rem !important}.pr-2,.px-2{padding-right:0.5rem !important}.pb-2,.py-2{padding-bottom:0.5rem !important}.pl-2,.px-2{padding-left:0.5rem !important}.p-3{padding:1rem !important}.pt-3,.py-3{padding-top:1rem !important}.pr-3,.px-3{padding-right:1rem !important}.pb-3,.py-3{padding-bottom:1rem !important}.pl-3,.px-3{padding-left:1rem !important}.p-4{padding:1.5rem !important}.pt-4,.py-4{padding-top:1.5rem !important}.pr-4,.px-4{padding-right:1.5rem !important}.pb-4,.py-4{padding-bottom:1.5rem !important}.pl-4,.px-4{padding-left:1.5rem !important}.p-5{padding:3rem !important}.pt-5,.py-5{padding-top:3rem !important}.pr-5,.px-5{padding-right:3rem !important}.pb-5,.py-5{padding-bottom:3rem !important}.pl-5,.px-5{padding-left:3rem !important}.m-n1{margin:-0.25rem !important}.mt-n1,.my-n1{margin-top:-0.25rem !important}.mr-n1,.mx-n1{margin-right:-0.25rem !important}.mb-n1,.my-n1{margin-bottom:-0.25rem !important}.ml-n1,.mx-n1{margin-left:-0.25rem !important}.m-n2{margin:-0.5rem !important}.mt-n2,.my-n2{margin-top:-0.5rem !important}.mr-n2,.mx-n2{margin-right:-0.5rem !important}.mb-n2,.my-n2{margin-bottom:-0.5rem !important}.ml-n2,.mx-n2{margin-left:-0.5rem !important}.m-n3{margin:-1rem !important}.mt-n3,.my-n3{margin-top:-1rem !important}.mr-n3,.mx-n3{margin-right:-1rem !important}.mb-n3,.my-n3{margin-bottom:-1rem !important}.ml-n3,.mx-n3{margin-left:-1rem !important}.m-n4{margin:-1.5rem !important}.mt-n4,.my-n4{margin-top:-1.5rem !important}.mr-n4,.mx-n4{margin-right:-1.5rem !important}.mb-n4,.my-n4{margin-bottom:-1.5rem !important}.ml-n4,.mx-n4{margin-left:-1.5rem !important}.m-n5{margin:-3rem !important}.mt-n5,.my-n5{margin-top:-3rem !important}.mr-n5,.mx-n5{margin-right:-3rem !important}.mb-n5,.my-n5{margin-bottom:-3rem !important}.ml-n5,.mx-n5{margin-left:-3rem !important}.m-auto{margin:auto !important}.mt-auto,.my-auto{margin-top:auto !important}.mr-auto,.mx-auto{margin-right:auto !important}.mb-auto,.my-auto{margin-bottom:auto !important}.ml-auto,.mx-auto{margin-left:auto !important}@media (min-width: 576px){.m-sm-0{margin:0 !important}.mt-sm-0,.my-sm-0{margin-top:0 !important}.mr-sm-0,.mx-sm-0{margin-right:0 !important}.mb-sm-0,.my-sm-0{margin-bottom:0 !important}.ml-sm-0,.mx-sm-0{margin-left:0 !important}.m-sm-1{margin:0.25rem !important}.mt-sm-1,.my-sm-1{margin-top:0.25rem !important}.mr-sm-1,.mx-sm-1{margin-right:0.25rem !important}.mb-sm-1,.my-sm-1{margin-bottom:0.25rem !important}.ml-sm-1,.mx-sm-1{margin-left:0.25rem !important}.m-sm-2{margin:0.5rem !important}.mt-sm-2,.my-sm-2{margin-top:0.5rem !important}.mr-sm-2,.mx-sm-2{margin-right:0.5rem !important}.mb-sm-2,.my-sm-2{margin-bottom:0.5rem !important}.ml-sm-2,.mx-sm-2{margin-left:0.5rem !important}.m-sm-3{margin:1rem !important}.mt-sm-3,.my-sm-3{margin-top:1rem !important}.mr-sm-3,.mx-sm-3{margin-right:1rem !important}.mb-sm-3,.my-sm-3{margin-bottom:1rem !important}.ml-sm-3,.mx-sm-3{margin-left:1rem !important}.m-sm-4{margin:1.5rem !important}.mt-sm-4,.my-sm-4{margin-top:1.5rem !important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem !important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem !important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem !important}.m-sm-5{margin:3rem !important}.mt-sm-5,.my-sm-5{margin-top:3rem !important}.mr-sm-5,.mx-sm-5{margin-right:3rem !important}.mb-sm-5,.my-sm-5{margin-bottom:3rem !important}.ml-sm-5,.mx-sm-5{margin-left:3rem !important}.p-sm-0{padding:0 !important}.pt-sm-0,.py-sm-0{padding-top:0 !important}.pr-sm-0,.px-sm-0{padding-right:0 !important}.pb-sm-0,.py-sm-0{padding-bottom:0 !important}.pl-sm-0,.px-sm-0{padding-left:0 !important}.p-sm-1{padding:0.25rem !important}.pt-sm-1,.py-sm-1{padding-top:0.25rem !important}.pr-sm-1,.px-sm-1{padding-right:0.25rem !important}.pb-sm-1,.py-sm-1{padding-bottom:0.25rem !important}.pl-sm-1,.px-sm-1{padding-left:0.25rem !important}.p-sm-2{padding:0.5rem !important}.pt-sm-2,.py-sm-2{padding-top:0.5rem !important}.pr-sm-2,.px-sm-2{padding-right:0.5rem !important}.pb-sm-2,.py-sm-2{padding-bottom:0.5rem !important}.pl-sm-2,.px-sm-2{padding-left:0.5rem !important}.p-sm-3{padding:1rem !important}.pt-sm-3,.py-sm-3{padding-top:1rem !important}.pr-sm-3,.px-sm-3{padding-right:1rem !important}.pb-sm-3,.py-sm-3{padding-bottom:1rem !important}.pl-sm-3,.px-sm-3{padding-left:1rem !important}.p-sm-4{padding:1.5rem !important}.pt-sm-4,.py-sm-4{padding-top:1.5rem !important}.pr-sm-4,.px-sm-4{padding-right:1.5rem !important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem !important}.pl-sm-4,.px-sm-4{padding-left:1.5rem !important}.p-sm-5{padding:3rem !important}.pt-sm-5,.py-sm-5{padding-top:3rem !important}.pr-sm-5,.px-sm-5{padding-right:3rem !important}.pb-sm-5,.py-sm-5{padding-bottom:3rem !important}.pl-sm-5,.px-sm-5{padding-left:3rem !important}.m-sm-n1{margin:-0.25rem !important}.mt-sm-n1,.my-sm-n1{margin-top:-0.25rem !important}.mr-sm-n1,.mx-sm-n1{margin-right:-0.25rem !important}.mb-sm-n1,.my-sm-n1{margin-bottom:-0.25rem !important}.ml-sm-n1,.mx-sm-n1{margin-left:-0.25rem !important}.m-sm-n2{margin:-0.5rem !important}.mt-sm-n2,.my-sm-n2{margin-top:-0.5rem !important}.mr-sm-n2,.mx-sm-n2{margin-right:-0.5rem !important}.mb-sm-n2,.my-sm-n2{margin-bottom:-0.5rem !important}.ml-sm-n2,.mx-sm-n2{margin-left:-0.5rem !important}.m-sm-n3{margin:-1rem !important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem !important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem !important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem !important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem !important}.m-sm-n4{margin:-1.5rem !important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem !important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem !important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem !important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem !important}.m-sm-n5{margin:-3rem !important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem !important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem !important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem !important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem !important}.m-sm-auto{margin:auto !important}.mt-sm-auto,.my-sm-auto{margin-top:auto !important}.mr-sm-auto,.mx-sm-auto{margin-right:auto !important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto !important}.ml-sm-auto,.mx-sm-auto{margin-left:auto !important}}@media (min-width: 768px){.m-md-0{margin:0 !important}.mt-md-0,.my-md-0{margin-top:0 !important}.mr-md-0,.mx-md-0{margin-right:0 !important}.mb-md-0,.my-md-0{margin-bottom:0 !important}.ml-md-0,.mx-md-0{margin-left:0 !important}.m-md-1{margin:0.25rem !important}.mt-md-1,.my-md-1{margin-top:0.25rem !important}.mr-md-1,.mx-md-1{margin-right:0.25rem !important}.mb-md-1,.my-md-1{margin-bottom:0.25rem !important}.ml-md-1,.mx-md-1{margin-left:0.25rem !important}.m-md-2{margin:0.5rem !important}.mt-md-2,.my-md-2{margin-top:0.5rem !important}.mr-md-2,.mx-md-2{margin-right:0.5rem !important}.mb-md-2,.my-md-2{margin-bottom:0.5rem !important}.ml-md-2,.mx-md-2{margin-left:0.5rem !important}.m-md-3{margin:1rem !important}.mt-md-3,.my-md-3{margin-top:1rem !important}.mr-md-3,.mx-md-3{margin-right:1rem !important}.mb-md-3,.my-md-3{margin-bottom:1rem !important}.ml-md-3,.mx-md-3{margin-left:1rem !important}.m-md-4{margin:1.5rem !important}.mt-md-4,.my-md-4{margin-top:1.5rem !important}.mr-md-4,.mx-md-4{margin-right:1.5rem !important}.mb-md-4,.my-md-4{margin-bottom:1.5rem !important}.ml-md-4,.mx-md-4{margin-left:1.5rem !important}.m-md-5{margin:3rem !important}.mt-md-5,.my-md-5{margin-top:3rem !important}.mr-md-5,.mx-md-5{margin-right:3rem !important}.mb-md-5,.my-md-5{margin-bottom:3rem !important}.ml-md-5,.mx-md-5{margin-left:3rem !important}.p-md-0{padding:0 !important}.pt-md-0,.py-md-0{padding-top:0 !important}.pr-md-0,.px-md-0{padding-right:0 !important}.pb-md-0,.py-md-0{padding-bottom:0 !important}.pl-md-0,.px-md-0{padding-left:0 !important}.p-md-1{padding:0.25rem !important}.pt-md-1,.py-md-1{padding-top:0.25rem !important}.pr-md-1,.px-md-1{padding-right:0.25rem !important}.pb-md-1,.py-md-1{padding-bottom:0.25rem !important}.pl-md-1,.px-md-1{padding-left:0.25rem !important}.p-md-2{padding:0.5rem !important}.pt-md-2,.py-md-2{padding-top:0.5rem !important}.pr-md-2,.px-md-2{padding-right:0.5rem !important}.pb-md-2,.py-md-2{padding-bottom:0.5rem !important}.pl-md-2,.px-md-2{padding-left:0.5rem !important}.p-md-3{padding:1rem !important}.pt-md-3,.py-md-3{padding-top:1rem !important}.pr-md-3,.px-md-3{padding-right:1rem !important}.pb-md-3,.py-md-3{padding-bottom:1rem !important}.pl-md-3,.px-md-3{padding-left:1rem !important}.p-md-4{padding:1.5rem !important}.pt-md-4,.py-md-4{padding-top:1.5rem !important}.pr-md-4,.px-md-4{padding-right:1.5rem !important}.pb-md-4,.py-md-4{padding-bottom:1.5rem !important}.pl-md-4,.px-md-4{padding-left:1.5rem !important}.p-md-5{padding:3rem !important}.pt-md-5,.py-md-5{padding-top:3rem !important}.pr-md-5,.px-md-5{padding-right:3rem !important}.pb-md-5,.py-md-5{padding-bottom:3rem !important}.pl-md-5,.px-md-5{padding-left:3rem !important}.m-md-n1{margin:-0.25rem !important}.mt-md-n1,.my-md-n1{margin-top:-0.25rem !important}.mr-md-n1,.mx-md-n1{margin-right:-0.25rem !important}.mb-md-n1,.my-md-n1{margin-bottom:-0.25rem !important}.ml-md-n1,.mx-md-n1{margin-left:-0.25rem !important}.m-md-n2{margin:-0.5rem !important}.mt-md-n2,.my-md-n2{margin-top:-0.5rem !important}.mr-md-n2,.mx-md-n2{margin-right:-0.5rem !important}.mb-md-n2,.my-md-n2{margin-bottom:-0.5rem !important}.ml-md-n2,.mx-md-n2{margin-left:-0.5rem !important}.m-md-n3{margin:-1rem !important}.mt-md-n3,.my-md-n3{margin-top:-1rem !important}.mr-md-n3,.mx-md-n3{margin-right:-1rem !important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem !important}.ml-md-n3,.mx-md-n3{margin-left:-1rem !important}.m-md-n4{margin:-1.5rem !important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem !important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem !important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem !important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem !important}.m-md-n5{margin:-3rem !important}.mt-md-n5,.my-md-n5{margin-top:-3rem !important}.mr-md-n5,.mx-md-n5{margin-right:-3rem !important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem !important}.ml-md-n5,.mx-md-n5{margin-left:-3rem !important}.m-md-auto{margin:auto !important}.mt-md-auto,.my-md-auto{margin-top:auto !important}.mr-md-auto,.mx-md-auto{margin-right:auto !important}.mb-md-auto,.my-md-auto{margin-bottom:auto !important}.ml-md-auto,.mx-md-auto{margin-left:auto !important}}@media (min-width: 992px){.m-lg-0{margin:0 !important}.mt-lg-0,.my-lg-0{margin-top:0 !important}.mr-lg-0,.mx-lg-0{margin-right:0 !important}.mb-lg-0,.my-lg-0{margin-bottom:0 !important}.ml-lg-0,.mx-lg-0{margin-left:0 !important}.m-lg-1{margin:0.25rem !important}.mt-lg-1,.my-lg-1{margin-top:0.25rem !important}.mr-lg-1,.mx-lg-1{margin-right:0.25rem !important}.mb-lg-1,.my-lg-1{margin-bottom:0.25rem !important}.ml-lg-1,.mx-lg-1{margin-left:0.25rem !important}.m-lg-2{margin:0.5rem !important}.mt-lg-2,.my-lg-2{margin-top:0.5rem !important}.mr-lg-2,.mx-lg-2{margin-right:0.5rem !important}.mb-lg-2,.my-lg-2{margin-bottom:0.5rem !important}.ml-lg-2,.mx-lg-2{margin-left:0.5rem !important}.m-lg-3{margin:1rem !important}.mt-lg-3,.my-lg-3{margin-top:1rem !important}.mr-lg-3,.mx-lg-3{margin-right:1rem !important}.mb-lg-3,.my-lg-3{margin-bottom:1rem !important}.ml-lg-3,.mx-lg-3{margin-left:1rem !important}.m-lg-4{margin:1.5rem !important}.mt-lg-4,.my-lg-4{margin-top:1.5rem !important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem !important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem !important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem !important}.m-lg-5{margin:3rem !important}.mt-lg-5,.my-lg-5{margin-top:3rem !important}.mr-lg-5,.mx-lg-5{margin-right:3rem !important}.mb-lg-5,.my-lg-5{margin-bottom:3rem !important}.ml-lg-5,.mx-lg-5{margin-left:3rem !important}.p-lg-0{padding:0 !important}.pt-lg-0,.py-lg-0{padding-top:0 !important}.pr-lg-0,.px-lg-0{padding-right:0 !important}.pb-lg-0,.py-lg-0{padding-bottom:0 !important}.pl-lg-0,.px-lg-0{padding-left:0 !important}.p-lg-1{padding:0.25rem !important}.pt-lg-1,.py-lg-1{padding-top:0.25rem !important}.pr-lg-1,.px-lg-1{padding-right:0.25rem !important}.pb-lg-1,.py-lg-1{padding-bottom:0.25rem !important}.pl-lg-1,.px-lg-1{padding-left:0.25rem !important}.p-lg-2{padding:0.5rem !important}.pt-lg-2,.py-lg-2{padding-top:0.5rem !important}.pr-lg-2,.px-lg-2{padding-right:0.5rem !important}.pb-lg-2,.py-lg-2{padding-bottom:0.5rem !important}.pl-lg-2,.px-lg-2{padding-left:0.5rem !important}.p-lg-3{padding:1rem !important}.pt-lg-3,.py-lg-3{padding-top:1rem !important}.pr-lg-3,.px-lg-3{padding-right:1rem !important}.pb-lg-3,.py-lg-3{padding-bottom:1rem !important}.pl-lg-3,.px-lg-3{padding-left:1rem !important}.p-lg-4{padding:1.5rem !important}.pt-lg-4,.py-lg-4{padding-top:1.5rem !important}.pr-lg-4,.px-lg-4{padding-right:1.5rem !important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem !important}.pl-lg-4,.px-lg-4{padding-left:1.5rem !important}.p-lg-5{padding:3rem !important}.pt-lg-5,.py-lg-5{padding-top:3rem !important}.pr-lg-5,.px-lg-5{padding-right:3rem !important}.pb-lg-5,.py-lg-5{padding-bottom:3rem !important}.pl-lg-5,.px-lg-5{padding-left:3rem !important}.m-lg-n1{margin:-0.25rem !important}.mt-lg-n1,.my-lg-n1{margin-top:-0.25rem !important}.mr-lg-n1,.mx-lg-n1{margin-right:-0.25rem !important}.mb-lg-n1,.my-lg-n1{margin-bottom:-0.25rem !important}.ml-lg-n1,.mx-lg-n1{margin-left:-0.25rem !important}.m-lg-n2{margin:-0.5rem !important}.mt-lg-n2,.my-lg-n2{margin-top:-0.5rem !important}.mr-lg-n2,.mx-lg-n2{margin-right:-0.5rem !important}.mb-lg-n2,.my-lg-n2{margin-bottom:-0.5rem !important}.ml-lg-n2,.mx-lg-n2{margin-left:-0.5rem !important}.m-lg-n3{margin:-1rem !important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem !important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem !important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem !important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem !important}.m-lg-n4{margin:-1.5rem !important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem !important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem !important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem !important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem !important}.m-lg-n5{margin:-3rem !important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem !important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem !important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem !important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem !important}.m-lg-auto{margin:auto !important}.mt-lg-auto,.my-lg-auto{margin-top:auto !important}.mr-lg-auto,.mx-lg-auto{margin-right:auto !important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto !important}.ml-lg-auto,.mx-lg-auto{margin-left:auto !important}}@media (min-width: 1200px){.m-xl-0{margin:0 !important}.mt-xl-0,.my-xl-0{margin-top:0 !important}.mr-xl-0,.mx-xl-0{margin-right:0 !important}.mb-xl-0,.my-xl-0{margin-bottom:0 !important}.ml-xl-0,.mx-xl-0{margin-left:0 !important}.m-xl-1{margin:0.25rem !important}.mt-xl-1,.my-xl-1{margin-top:0.25rem !important}.mr-xl-1,.mx-xl-1{margin-right:0.25rem !important}.mb-xl-1,.my-xl-1{margin-bottom:0.25rem !important}.ml-xl-1,.mx-xl-1{margin-left:0.25rem !important}.m-xl-2{margin:0.5rem !important}.mt-xl-2,.my-xl-2{margin-top:0.5rem !important}.mr-xl-2,.mx-xl-2{margin-right:0.5rem !important}.mb-xl-2,.my-xl-2{margin-bottom:0.5rem !important}.ml-xl-2,.mx-xl-2{margin-left:0.5rem !important}.m-xl-3{margin:1rem !important}.mt-xl-3,.my-xl-3{margin-top:1rem !important}.mr-xl-3,.mx-xl-3{margin-right:1rem !important}.mb-xl-3,.my-xl-3{margin-bottom:1rem !important}.ml-xl-3,.mx-xl-3{margin-left:1rem !important}.m-xl-4{margin:1.5rem !important}.mt-xl-4,.my-xl-4{margin-top:1.5rem !important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem !important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem !important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem !important}.m-xl-5{margin:3rem !important}.mt-xl-5,.my-xl-5{margin-top:3rem !important}.mr-xl-5,.mx-xl-5{margin-right:3rem !important}.mb-xl-5,.my-xl-5{margin-bottom:3rem !important}.ml-xl-5,.mx-xl-5{margin-left:3rem !important}.p-xl-0{padding:0 !important}.pt-xl-0,.py-xl-0{padding-top:0 !important}.pr-xl-0,.px-xl-0{padding-right:0 !important}.pb-xl-0,.py-xl-0{padding-bottom:0 !important}.pl-xl-0,.px-xl-0{padding-left:0 !important}.p-xl-1{padding:0.25rem !important}.pt-xl-1,.py-xl-1{padding-top:0.25rem !important}.pr-xl-1,.px-xl-1{padding-right:0.25rem !important}.pb-xl-1,.py-xl-1{padding-bottom:0.25rem !important}.pl-xl-1,.px-xl-1{padding-left:0.25rem !important}.p-xl-2{padding:0.5rem !important}.pt-xl-2,.py-xl-2{padding-top:0.5rem !important}.pr-xl-2,.px-xl-2{padding-right:0.5rem !important}.pb-xl-2,.py-xl-2{padding-bottom:0.5rem !important}.pl-xl-2,.px-xl-2{padding-left:0.5rem !important}.p-xl-3{padding:1rem !important}.pt-xl-3,.py-xl-3{padding-top:1rem !important}.pr-xl-3,.px-xl-3{padding-right:1rem !important}.pb-xl-3,.py-xl-3{padding-bottom:1rem !important}.pl-xl-3,.px-xl-3{padding-left:1rem !important}.p-xl-4{padding:1.5rem !important}.pt-xl-4,.py-xl-4{padding-top:1.5rem !important}.pr-xl-4,.px-xl-4{padding-right:1.5rem !important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem !important}.pl-xl-4,.px-xl-4{padding-left:1.5rem !important}.p-xl-5{padding:3rem !important}.pt-xl-5,.py-xl-5{padding-top:3rem !important}.pr-xl-5,.px-xl-5{padding-right:3rem !important}.pb-xl-5,.py-xl-5{padding-bottom:3rem !important}.pl-xl-5,.px-xl-5{padding-left:3rem !important}.m-xl-n1{margin:-0.25rem !important}.mt-xl-n1,.my-xl-n1{margin-top:-0.25rem !important}.mr-xl-n1,.mx-xl-n1{margin-right:-0.25rem !important}.mb-xl-n1,.my-xl-n1{margin-bottom:-0.25rem !important}.ml-xl-n1,.mx-xl-n1{margin-left:-0.25rem !important}.m-xl-n2{margin:-0.5rem !important}.mt-xl-n2,.my-xl-n2{margin-top:-0.5rem !important}.mr-xl-n2,.mx-xl-n2{margin-right:-0.5rem !important}.mb-xl-n2,.my-xl-n2{margin-bottom:-0.5rem !important}.ml-xl-n2,.mx-xl-n2{margin-left:-0.5rem !important}.m-xl-n3{margin:-1rem !important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem !important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem !important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem !important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem !important}.m-xl-n4{margin:-1.5rem !important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem !important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem !important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem !important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem !important}.m-xl-n5{margin:-3rem !important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem !important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem !important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem !important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem !important}.m-xl-auto{margin:auto !important}.mt-xl-auto,.my-xl-auto{margin-top:auto !important}.mr-xl-auto,.mx-xl-auto{margin-right:auto !important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto !important}.ml-xl-auto,.mx-xl-auto{margin-left:auto !important}}.text-monospace{font-family:SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important}.text-justify{text-align:justify !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}@media (min-width: 576px){.text-sm-left{text-align:left !important}.text-sm-right{text-align:right !important}.text-sm-center{text-align:center !important}}@media (min-width: 768px){.text-md-left{text-align:left !important}.text-md-right{text-align:right !important}.text-md-center{text-align:center !important}}@media (min-width: 992px){.text-lg-left{text-align:left !important}.text-lg-right{text-align:right !important}.text-lg-center{text-align:center !important}}@media (min-width: 1200px){.text-xl-left{text-align:left !important}.text-xl-right{text-align:right !important}.text-xl-center{text-align:center !important}}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.font-weight-light{font-weight:300 !important}.font-weight-lighter{font-weight:lighter !important}.font-weight-normal{font-weight:400 !important}.font-weight-bold{font-weight:700 !important}.font-weight-bolder{font-weight:bolder !important}.font-italic{font-style:italic !important}.text-white{color:#fff !important}.text-primary{color:#20BF55 !important}a.text-primary:hover,a.text-primary:focus{color:#11181f !important}.text-secondary{color:#95a5a6 !important}a.text-secondary:hover,a.text-secondary:focus{color:#6d8082 !important}.text-success{color:#20BF55 !important}a.text-success:hover,a.text-success:focus{color:#00A896 !important}.text-info{color:#3498DB !important}a.text-info:hover,a.text-info:focus{color:#1d6fa5 !important}.text-warning{color:#F39C12 !important}a.text-warning:hover,a.text-warning:focus{color:#b06f09 !important}.text-danger{color:#E74C3C !important}a.text-danger:hover,a.text-danger:focus{color:#bf2718 !important}.text-light{color:#ecf0f1 !important}a.text-light:hover,a.text-light:focus{color:#c0cdd1 !important}.text-dark{color:#7b8a8b !important}a.text-dark:hover,a.text-dark:focus{color:#576263 !important}.text-body{color:#212529 !important}.text-muted{color:#95a5a6 !important}.text-black-50{color:rgba(0,0,0,0.5) !important}.text-white-50{color:rgba(255,255,255,0.5) !important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none !important}.text-break{word-break:break-word !important;overflow-wrap:break-word !important}.text-reset{color:inherit !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}@media print{*,*::before,*::after{text-shadow:none !important;-webkit-box-shadow:none !important;box-shadow:none !important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap !important}pre,blockquote{border:1px solid #b4bcc2;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px !important}.container{min-width:992px !important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #dee2e6 !important}.table-dark{color:inherit}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}.bg-primary .navbar-nav .active>.nav-link{color:#757575 !important}.bg-dark{background-color:#20BF55 !important}.bg-dark.navbar-dark .navbar-nav .nav-link:focus,.bg-dark.navbar-dark .navbar-nav .nav-link:hover,.bg-dark.navbar-dark .navbar-nav .active>.nav-link{color:#757575 !important}.btn-secondary,.btn-secondary:hover,.btn-warning,.btn-warning:hover{color:#fff}.table-primary,.table-secondary,.table-success,.table-info,.table-warning,.table-danger{color:#fff}.table-primary,.table-primary>th,.table-primary>td{background-color:#20BF55}.table-secondary,.table-secondary>th,.table-secondary>td{background-color:#95a5a6}.table-light,.table-light>th,.table-light>td{background-color:#ecf0f1}.table-dark,.table-dark>th,.table-dark>td{background-color:#7b8a8b}.table-success,.table-success>th,.table-success>td{background-color:#20BF55}.table-info,.table-info>th,.table-info>td{background-color:#3498DB}.table-danger,.table-danger>th,.table-danger>td{background-color:#E74C3C}.table-warning,.table-warning>th,.table-warning>td{background-color:#F39C12}.table-active,.table-active>th,.table-active>td{background-color:rgba(0,0,0,0.075)}.table-hover .table-primary:hover,.table-hover .table-primary:hover>th,.table-hover .table-primary:hover>td{background-color:#233140}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>th,.table-hover .table-secondary:hover>td{background-color:#87999a}.table-hover .table-light:hover,.table-hover .table-light:hover>th,.table-hover .table-light:hover>td{background-color:#dde4e6}.table-hover .table-dark:hover,.table-hover .table-dark:hover>th,.table-hover .table-dark:hover>td{background-color:#6f7d7e}.table-hover .table-success:hover,.table-hover .table-success:hover>th,.table-hover .table-success:hover>td{background-color:#15a589}.table-hover .table-info:hover,.table-hover .table-info:hover>th,.table-hover .table-info:hover>td{background-color:#258cd1}.table-hover .table-danger:hover,.table-hover .table-danger:hover>th,.table-hover .table-danger:hover>td{background-color:#e43725}.table-hover .table-warning:hover,.table-hover .table-warning:hover>th,.table-hover .table-warning:hover>td{background-color:#e08e0b}.table-hover .table-active:hover,.table-hover .table-active:hover>th,.table-hover .table-active:hover>td{background-color:rgba(0,0,0,0.075)}.nav-tabs .nav-link.active,.nav-tabs .nav-link.active:focus,.nav-tabs .nav-link.active:hover,.nav-tabs .nav-item.open .nav-link,.nav-tabs .nav-item.open .nav-link:focus,.nav-tabs .nav-item.open .nav-link:hover{color:#757575}.pagination a:hover{text-decoration:none}.close{text-decoration:none;opacity:0.4}.close:hover,.close:focus{opacity:1}.badge-secondary,.badge-warning{color:#fff}.alert{border:none;color:#fff}.alert a,.alert .alert-link{color:#fff;text-decoration:underline}.alert-primary{background-color:#20BF55}.alert-secondary{background-color:#95a5a6}.alert-success{background-color:#20BF55}.alert-info{background-color:#3498DB}.alert-warning{background-color:#F39C12}.alert-danger{background-color:#E74C3C}.alert-light{background-color:#ecf0f1}.alert-dark{background-color:#7b8a8b}.alert-light,.alert-light a,.alert-light .alert-link{color:#212529}.modal .close{color:#000}.modal .close:not(:disabled):not(.disabled):hover,.modal .close:not(:disabled):not(.disabled):focus{color:#000}{font-size:5px} diff --git a/src/default_intl.h b/src/default_intl.h index d6b5bde..b88f27e 100644 --- a/src/default_intl.h +++ b/src/default_intl.h @@ -1,144 +1,160 @@ /* - * + * * default translation file - english translation - * + * */ #pragma once -extern char TEXT_LANG[16] = "en"; +extern char TEXT_LANG[6] = "en"; extern char TEXT_INDEX_PAGE[16] = "Measurements"; -extern char TEXT_CONFIG_PAGE[16] = "Settings"; +extern char TEXT_CONFIG_PAGE[14] = "Settings"; -extern char TEXT_CONFIG_DEVICE_PAGE[32] = "Device Settings"; -extern char TEXT_CONFIG_INFO_DEVICE_PAGE[256] = "The choice of sensors connected to Smogly, the frequency of measurements, or the language of the web interface can be changed in the section"; -extern char TEXT_CONFIG_SERVICES_PAGE[32] = "Services Settings"; -extern char TEXT_CONFIG_INFO_SERVICES_PAGE[265] = "Settings of such services as Luftdaten, aqi.eco, Smoglist, AirMonitor, ThingSpeak or InfluxDB or MQTT services can be changed in the section"; +extern char TEXT_CONFIG_DEVICE_PAGE[24] = "Device Settings"; +extern char TEXT_CONFIG_INFO_DEVICE_PAGE[144] = "The choice of sensors connected to Smogly, the frequency of measurements, or the language of the web interface can be changed in the section"; +extern char TEXT_CONFIG_SERVICES_PAGE[24] = "Services Settings"; +extern char TEXT_CONFIG_INFO_SERVICES_PAGE[144] = "Settings of such services as Luftdaten, aqi.eco, Smoglist, AirMonitor, ThingSpeak or InfluxDB or MQTT services can be changed in the section"; -extern char TEXT_UPDATE_PAGE[16] = "Update"; +extern char TEXT_UPDATE_PAGE[14] = "Update"; -extern char TEXT_WEATHER[16] = "Weather"; -extern char TEXT_TEMPERATURE[16] = "Temperature"; -extern char TEXT_HUMIDITY[16] = "Humidity"; -extern char TEXT_PRESSURE[16] = "Pressure"; -extern char TEXT_DEWPOINT[16] = "Dewpoint"; +extern char TEXT_WEATHER[10] = "Weather"; +extern char TEXT_TEMPERATURE[14] = "Temperature"; +extern char TEXT_HUMIDITY[14] = "Humidity"; +extern char TEXT_PRESSURE[14] = "Pressure"; +extern char TEXT_DEWPOINT[14] = "Dewpoint"; -extern char TEXT_AIRPOLLUTION[32] = "Air pollution"; -extern char TEXT_SAVED[16] = "SAVED!"; +extern char TEXT_AIRPOLLUTION[26] = "Air pollution"; +extern char TEXT_SAVED[10] = "SAVED!"; -extern char TEXT_POSTCONFIG_INFO[64] = "everything looks OK, in a moment the Smogly will restart"; -extern char TEXT_INSTRUCIONSLINK[80] = "All instructions and descriptions[in polish] are available {GITHUB_LINK}."; -extern char TEXT_DEVICENAME[32] = "Device Name"; +extern char TEXT_POSTCONFIG_INFO[60] = "everything looks OK, in a moment the Smogly will restart"; +extern char TEXT_INSTRUCIONSLINK[76] = "All instructions and descriptions[in polish] are available {GITHUB_LINK}."; +extern char TEXT_DEVICENAME[20] = "Device Name"; extern char TEXT_DEVICENAMEAUTO[32] = "Automatic name generation"; -extern char TEXT_SELECTEDLANGUAGE[16] = "Language"; -extern char TEXT_TEMPHUMIPRESSSENSOR[64] = "Temp/Humi/Press Sensor"; -extern char TEXT_PMSENSOR[32] = "PM2.5/PM10 Sensor"; +extern char TEXT_SELECTEDLANGUAGE[10] = "Language"; +extern char TEXT_TEMPHUMIPRESSSENSOR[40] = "Temp/Humi/Press Sensor"; +extern char TEXT_PMSENSOR[20] = "PM2.5/PM10 Sensor"; -extern char TEXT_FREQUENTMEASUREMENTONOFF[32] = "Continuous measurements"; -extern char TEXT_FREQUENTMEASUREMENTINFO[96] = "Continuous measurements significantly shorten the life span of the PM sensor."; -extern char TEXT_MEASUREMENTFREQUENCY[32] = "Make PM measurements every"; -extern char TEXT_AVERAGELASTRESULT[32] = "Average result from last"; -extern char TEXT_PMMEASUREMENTS[32] = "PM measurements"; -extern char TEXT_SENDINGINTERVAL[64] = "Sending data to external services every"; -extern char TEXT_SERVICESSENDINGINTERVAL[128] = "Sending data to AirMonitor/Luftdaten/Smoglist/aqi.eco every"; -extern char TEXT_DBSENDINGINTERVAL[64] = "Sending data to ThingSpeak/InfluxDB/MQTT every"; -extern char TEXT_SECONDS[16] = "seconds"; -extern char TEXT_MINUTES[16] = "minutes"; +extern char TEXT_FIRST_THP_SDA_SCL[40] = "First Temp/Humi Sensor SDA/SCL config"; +extern char TEXT_FIRST_THP_SDA[8] = "Pin SDA"; +extern char TEXT_FIRST_THP_SCL[8] = "Pin SCL"; -extern char TEXT_DEEPSLEEPINFO[544] = "DeepSleep put the device into deep sleep between a series of measurements - significantly lower energy consumption (the possibility of working on the battery for several weeks), but lack of continuous access to the web interface. The web interface will only be available for about {INTERFACEWWWONTIME} seconds every {SENDING_FREQUENCY} minutes (and right after the device reboots). Sleep time will be the same as the period for sending measurements to external services. DeepSleep requires connection of D0 and RST pins on ESP8266!"; -extern char TEXT_DEEPSLEEPINFO_ESP32[544] = "DeepSleep put the device into deep sleep between a series of measurements - significantly lower energy consumption (the possibility of working on the battery for several weeks), but lack of continuous access to the web interface. The web interface will only be available for about {INTERFACEWWWONTIME} seconds every {SENDING_FREQUENCY} minutes (and right after the device reboots). Sleep time will be the same as the period for sending measurements to external services."; +extern char TEXT_SECOND_THP[40] = "Enable Second Temp/Humi Sensor"; -extern char TEXT_DISPLAYPM1[32] = "Display of PM1 measurements"; -extern char TEXT_ALTITUDEINFO[128] = "Altitude above sea level (required for correct pressure measurements. You can check it {WSPOLRZEDNE_GPS_LINK})"; +extern char TEXT_SECOND_THP_SDA_SCL[48] = "Second Temp/Humi Sensor SDA/SCL config"; +extern char TEXT_SECOND_THP_SDA[8] = "Pin SDA"; +extern char TEXT_SECOND_THP_SCL[8] = "Pin SCL"; -extern char TEXT_SECURECONFIGUPDATEPAGE[96] = "Secure the Configuration and Update pages(default: admin/password)"; -extern char TEXT_SECURELOGIN[16] = "Login"; -extern char TEXT_SECUREPASSWD[16] = "Password"; -extern char TEXT_SECURELOGOUTINFO[64] = "Restart your web browser to log out!"; +extern char TEXT_DUST_TX_RX[32] = "PM2.5/PM10 Sensor TX/RX config"; +extern char TEXT_DUST_TX[8] = "Pin TX"; +extern char TEXT_DUST_RX[8] = "Pin RX"; -extern char TEXT_LUFTDATENSENDING[96] = "Sending data to the {LUFTDATEN_LINK} service(requires registration at {LUFTDATENFORM_LINK})"; +extern char TEXT_FREQUENTMEASUREMENTONOFF[26] = "Continuous measurements"; +extern char TEXT_FREQUENTMEASUREMENTINFO[80] = "Continuous measurements significantly shorten the life span of the PM sensor."; +extern char TEXT_MEASUREMENTFREQUENCY[30] = "Make PM measurements every"; +extern char TEXT_AVERAGELASTRESULT[30] = "Average result from last"; +extern char TEXT_PMMEASUREMENTS[18] = "PM measurements"; +extern char TEXT_SENDINGINTERVAL[50] = "Sending data to external services every"; +extern char TEXT_SERVICESSENDINGINTERVAL[64] = "Sending data to AirMonitor/Luftdaten/Smoglist/aqi.eco every"; +extern char TEXT_DBSENDINGINTERVAL[50] = "Sending data to ThingSpeak/InfluxDB/MQTT every"; +extern char TEXT_SECONDS[10] = "seconds"; +extern char TEXT_MINUTES[10] = "minutes"; -extern char TEXT_SMOGLISTSENDING[64] = "Sending data to the {SMOGLIST_LINK} service"; -extern char TEXT_SMOGLISTINFO[256] = "Smoglist is a service that collects Smogly usage statistics(we do not collect logins and passwords). It will allow us to improve the most commonly used functions in the future and generate our own charts."; +extern char TEXT_DEEPSLEEPINFO[540] = "DeepSleep put the device into deep sleep between a series of measurements - significantly lower energy consumption (the possibility of working on the battery for several weeks), but lack of continuous access to the web interface. The web interface will only be available for about {INTERFACEWWWONTIME} seconds every {SENDING_FREQUENCY} minutes (and right after the device reboots). Sleep time will be the same as the period for sending measurements to external services. DeepSleep requires connection of D0 and RST pins on ESP8266!"; +extern char TEXT_DEEPSLEEPINFO_ESP32[476] = "DeepSleep put the device into deep sleep between a series of measurements - significantly lower energy consumption (the possibility of working on the battery for several weeks), but lack of continuous access to the web interface. The web interface will only be available for about {INTERFACEWWWONTIME} seconds every {SENDING_FREQUENCY} minutes (and right after the device reboots). Sleep time will be the same as the period for sending measurements to external services."; + +extern char TEXT_DISPLAYPM1[30] = "Display of PM1 measurements"; +extern char TEXT_ALTITUDEINFO[116] = "Altitude above sea level (required for correct pressure measurements. You can check it {WSPOLRZEDNE_GPS_LINK})"; + +extern char TEXT_SECURECONFIGUPDATEPAGE[84] = "Secure the Configuration and Update pages(default: admin/password)"; +extern char TEXT_SECURELOGIN[8] = "Login"; +extern char TEXT_SECUREPASSWD[10] = "Password"; +extern char TEXT_SECURELOGOUTINFO[48] = "Restart your web browser to log out!"; + +extern char TEXT_LUFTDATENSENDING[96] = "Sending data to the {LUFTDATEN_LINK} service(requires registration at {LUFTDATENFORM_LINK})"; + +extern char TEXT_SMOGLISTSENDING[48] = "Sending data to the {SMOGLIST_LINK} service"; +extern char TEXT_SMOGLISTINFO[242] = "Smoglist is a service that collects Smogly usage statistics(we do not collect logins and passwords). It will allow us to improve the most commonly used functions in the future and generate our own charts."; extern char TEXT_AIRMONITORSENDING[128] = "Sending data to the {AIRMONITOR_LINK} service(requires filling out {AIRMONITORFORM_LINK}; Sensor: e.g. {PMSENSORMODEL})"; -extern char TEXT_AIRMONITORCHARTS[64] = "Displaying charts from the AirMonitor site"; -extern char TEXT_AIRMONITORCOORDINATESINFO[80] = "Geographical coordinates(you can check it {LATLONG_LINK})"; -extern char TEXT_AIRMONITORLATITUDE[32] = "Latitude"; -extern char TEXT_AIRMONITORLONGITUDE[32] = "Longitude"; - -extern char TEXT_THINGSPEAKSENDING[64] = "Sending data to the {THINGSPEAK_LINK} service:"; -extern char TEXT_THINGSPEAKCHARTS[64] = "Displaying charts from the ThingSpeak site"; -extern char TEXT_THINGSPEAK_WRITE_API_KEY[32] = "ThingSpeak Write API Key"; -extern char TEXT_THINGSPEAKCHANNELID[32] = "ThingSpeak Channel ID"; -extern char TEXT_THINGSPEAK_READ_API_KEY[32] = "ThingSpeak Read API Key"; - -extern char TEXT_INFLUXDBSENDING[64] = "Sending data to the InfluxDB"; -extern char TEXT_INFLUXDBVERSION[32] = "InfluxDB version"; -extern char TEXT_INFLUXDBSERVER[64] = "InfluxDB database address"; -extern char TEXT_INFLUXDBPORT[32] = "InfluxDB port"; -extern char TEXT_INFLUXDBNAME[32] = "Name of the database"; -extern char TEXT_INFLUXDBUSER[32] = "Database user"; -extern char TEXT_INFLUXDBPASSWD[32] = "Database password"; -extern char TEXT_INFLUXDBORG[32] = "Organization"; -extern char TEXT_INFLUXDBBUCKET[32] = "Bucket"; -extern char TEXT_INFLUXDBTOKEN[32] = "Token"; - -extern char TEXT_CONFIG_ADV_MQTT[32] = "Advanced MQTT Configuration"; -extern char TEXT_MQTTSENDING[64] = "Sending data to the MQTT server"; -extern char TEXT_MQTTSERVER[32] = "MQTT server address"; -extern char TEXT_MQTTPORT[32] = "MQTT port"; -extern char TEXT_MQTTUSER[32] = "MQTT user"; -extern char TEXT_MQTTPASSWD[32] = "MQTT password"; - -extern char TEXT_MQTT_IP_IN_TOPIC[32] = "IP address in topic"; -extern char TEXT_MQTT_DEVICENAME_IN_TOPIC[32] = "Device name in topic"; +extern char TEXT_AIRMONITORCHARTS[48] = "Displaying charts from the AirMonitor site"; +extern char TEXT_AIRMONITORCOORDINATESINFO[74] = "Geographical coordinates(you can check it {LATLONG_LINK})"; +extern char TEXT_AIRMONITORLATITUDE[24] = "Latitude"; +extern char TEXT_AIRMONITORLONGITUDE[24] = "Longitude"; + +extern char TEXT_THINGSPEAKSENDING[50] = "Sending data to the {THINGSPEAK_LINK} service:"; +extern char TEXT_THINGSPEAKCHARTS[48] = "Displaying charts from the ThingSpeak site"; +extern char TEXT_THINGSPEAK_WRITE_API_KEY[28] = "ThingSpeak Write API Key"; +extern char TEXT_THINGSPEAKCHANNELID[24] = "ThingSpeak Channel ID"; +extern char TEXT_THINGSPEAK_READ_API_KEY[28] = "ThingSpeak Read API Key"; + +extern char TEXT_INFLUXDBSENDING[32] = "Sending data to the InfluxDB"; +extern char TEXT_INFLUXDBVERSION[18] = "InfluxDB version"; +extern char TEXT_INFLUXDBSERVER[30] = "InfluxDB database address"; +extern char TEXT_INFLUXDBPORT[16] = "InfluxDB port"; +extern char TEXT_INFLUXDBNAME[24] = "Name of the database"; +extern char TEXT_INFLUXDBUSER[28] = "Database user"; +extern char TEXT_INFLUXDBPASSWD[24] = "Database password"; +extern char TEXT_INFLUXDBORG[16] = "Organization"; +extern char TEXT_INFLUXDBBUCKET[10] = "Bucket"; +extern char TEXT_INFLUXDBTOKEN[8] = "Token"; + +extern char TEXT_CONFIG_ADV_MQTT[22] = "MQTT Configuration"; +extern char TEXT_MQTTSENDING[34] = "Sending data to the MQTT server"; +extern char TEXT_MQTTSERVER[22] = "MQTT server address"; +extern char TEXT_MQTTPORT[12] = "MQTT port"; +extern char TEXT_MQTTUSER[20] = "MQTT user"; +extern char TEXT_MQTTPASSWD[16] = "MQTT password"; + +extern char TEXT_MQTT_IP_IN_TOPIC[22] = "IP address in topic"; +extern char TEXT_MQTT_DEVICENAME_IN_TOPIC[30] = "Device name in topic"; extern char TEXT_MQTT_TOPIC_INFO[256] = "Below you can format the way you want to send MQTT data. You can add the 'IP address' and 'Device name' at the beginning. You can specify the middle part yourself for each of the values measured by the device."; -extern char TEXT_AIRQUALITY_TOPIC[16] = "Airquality"; -extern char TEXT_AQIECOSENDING[128] = "Sending data to the aqi.eco service"; +extern char TEXT_MQTT_SLASH_AT_THE_BEGINNING[40] = "Add '/' at the beginning of the topic"; +extern char TEXT_MQTT_SLASH_AT_THE_END[36] = "Add '/' at the end of the topic"; -extern char TEXT_AQIECOSERVER[32] = "aqi.eco server"; -extern char TEXT_AQIECOPATH[32] = "aqi.eco path"; +extern char TEXT_AQIECOSENDING[100] = "Sending data to the aqi.eco service"; +extern char TEXT_AQIECOSERVER[26] = "aqi.eco server"; +extern char TEXT_AQIECOPATH[20] = "aqi.eco path"; -extern char TEXT_CALIBMETHOD[32] = "Calibration method"; -extern char TEXT_CALIB1[32] = "calib1"; -extern char TEXT_CALIB2[32] = "calib2"; -extern char TEXT_SOFTWATEVERSION[32] = "Software version"; +extern char TEXT_CALIBMETHOD[22] = "Calibration method"; +extern char TEXT_CALIB1[30] = "calib1"; +extern char TEXT_CALIB2[30] = "calib2"; +extern char TEXT_SOFTWATEVERSION[24] = "Software version"; -extern char TEXT_ERASEWIFICONFIG[32] = "Erase WiFi Config"; +extern char TEXT_ERASEWIFICONFIG[22] = "Erase WiFi Config"; extern char TEXT_RESTORESETTINGS[32] = "Restore default settings"; -extern char TEXT_SAVE[16] = "Save"; -extern char TEXT_YES[16] = "Yes"; -extern char TEXT_NO[16] = "No"; -extern char TEXT_WITHOUTSENSOR[32] = "Without sensor"; -extern char TEXT_WITHOUTCALIBRATION[32] = "Without calibration"; -extern char TEXT_AUTOMATICCALIBRATION[32] = "Automatic calibration"; - -extern char TEXT_INTL_EN[16] = "english"; -extern char TEXT_INTL_PL[16] = "polish"; - -extern char TEXT_FWUPDATEAVALIBLE[64] = "Firmware update available!"; -extern char TEXT_AUTOUPDATEON[32] = "Autoupdate"; -extern char TEXT_MANUALUPDATEBUTTON[32] = "Manual Upgrade"; +extern char TEXT_SAVE[8] = "Save"; +extern char TEXT_YES[6] = "Yes"; +extern char TEXT_NO[6] = "No"; +extern char TEXT_WITHOUTSENSOR[16] = "Without sensor"; +extern char TEXT_WITHOUTCALIBRATION[22] = "Without calibration"; +extern char TEXT_AUTOMATICCALIBRATION[26] = "Automatic calibration"; + +extern char TEXT_INTL_EN[12] = "english"; +extern char TEXT_INTL_PL[8] = "polish"; + +extern char TEXT_FWUPDATEAVALIBLE[42] = "Firmware update available!"; +extern char TEXT_AUTOUPDATEON[28] = "Autoupdate"; +extern char TEXT_MANUALUPDATEBUTTON[22] = "Manual Upgrade"; extern char TEXT_FWUPDATEBUTTON[32] = "Firmware Upgrade"; -extern char TEXT_AUTOUPDATEONBUTTON[64] = "Autoupdate On"; -extern char TEXT_AUTOUPDATEWARNING[672] = "Automatic updates are performed via an unencrypted connection (HTTP, not HTTPS). It can be dangerous and allow interception of packets and hacking the device. You can use the Autoupdate once by clicking the \"{TEXT_FWUPDATEBUTTON}\" button or turn on Autoupdate permanently. You can change your mind at any time and disable Autoupdate in the Configuration. After selecting \"{TEXT_FWUPDATEBUTTON}\" or turning on Autoupdate, the device will save the current configuration and restart. It may take several seconds."; +extern char TEXT_AUTOUPDATEONBUTTON[36] = "Autoupdate On"; +extern char TEXT_AUTOUPDATEWARNING[650] = "Automatic updates are performed via an unencrypted connection (HTTP, not HTTPS). It can be dangerous and allow interception of packets and hacking the device. You can use the Autoupdate once by clicking the \"{TEXT_FWUPDATEBUTTON}\" button or turn on Autoupdate permanently. You can change your mind at any time and disable Autoupdate in the Configuration. After selecting \"{TEXT_FWUPDATEBUTTON}\" or turning on Autoupdate, the device will save the current configuration and restart. It may take several seconds."; extern char TEXT_UPDATEPAGEAUTOUPDATEWARNING[192] = "Automatic updates are performed via an unencrypted connection (HTTP, not HTTPS). It can be dangerous and allow interception of packets and hacking the device."; -extern char TEXT_SELECTUPDATEFILE[32] = "Select .bin file"; -extern char TEXT_SUBMITUPDATE[16] = "Update!"; -extern char TEXT_CURRENTSOFTVERSION[64] = "Currently used version of the firmware"; -extern char TEXT_SERVERSOFTWAREVERSION[64] = "The latest available firmware version"; -extern char TEXT_LATESTAVAILABLESOFT[96] = "Latest version of the software available {SMOGOMIERZRELEASES_LINK}."; +extern char TEXT_SELECTUPDATEFILE[20] = "Select .bin file"; +extern char TEXT_SUBMITUPDATE[10] = "Update!"; +extern char TEXT_CURRENTSOFTVERSION[40] = "Currently used version of the firmware"; +extern char TEXT_SERVERSOFTWAREVERSION[46] = "The latest available firmware version"; +extern char TEXT_LATESTAVAILABLESOFT[82] = "Latest version of the software available {SMOGOMIERZRELEASES_LINK}."; -extern char TEXT_HERE[16] = "here"; -extern char TEXT_THEFORM[16] = "the form"; +extern char TEXT_HERE[8] = "here"; +extern char TEXT_THEFORM[12] = "the form"; -extern char TEXT_CONNECTEDWIFI[32] = "Connected to a WiFi(SSID)"; -extern char TEXT_WIFIRSSI[32] = "WiFi Signal Strength(RSSI)"; -extern char TEXT_WIFIQUALITY[32] = "WiFi Signal Quality"; +extern char TEXT_CONNECTEDWIFI[28] = "Connected to a WiFi(SSID)"; +extern char TEXT_WIFIRSSI[28] = "WiFi Signal Strength(RSSI)"; +extern char TEXT_WIFIQUALITY[26] = "WiFi Signal Quality"; +extern char TEXT_AIRQUALITY_TOPIC[12] = "Airquality"; #ifdef ARDUINO_ARCH_ESP8266 static char GITHUB_LINK[] = "{TEXT_HERE}"; static char WSPOLRZEDNE_GPS_LINK[] = "{TEXT_HERE}"; @@ -163,4 +179,4 @@ static char LATLONG_LINK[] = "ThingSpeak"; static char SMOGOMIERZRELEASES_LINK[] = "{TEXT_HERE}"; static char MADAVI_LINK[] = "{TEXT_HERE}"; -#endif \ No newline at end of file +#endif diff --git a/src/html-content.h b/src/html-content.h index 1478bcd..2ad2281 100644 --- a/src/html-content.h +++ b/src/html-content.h @@ -1,4 +1,9 @@ -const char WEB_PAGE_HEADER_CSS[] PROGMEM = " +#endif + +const char WEB_PAGE_HEADER_CSS[] PROGMEM = "
SmoglyHackerspace Silesia ♦ +const char WEB_PAGE_FOOTER[] PROGMEM = R"rawliteral(

SmoglyHackerspace Silesia @@ -62,7 +67,7 @@ const char WEB_PAGE_FOOTER[] PROGMEM = R"rawliteral(

SmoglyHackerspace Silesia ♦ +const char WEB_PAGE_FOOTER[] PROGMEM = R"rawliteral(

SmoglyHackerspace Silesia @@ -93,7 +98,7 @@ const char WEB_ROOT_PAGE_AIRMONITOR_GRAPH[] PROGMEM = R"rawliteral(
)rawliteral"; - + const char WEB_ROOT_PAGE_THINGSPEAK_GRAPH[] PROGMEM = R"rawliteral(
@@ -108,7 +113,7 @@ const char WEB_ROOT_PAGE_THINGSPEAK_GRAPH[] PROGMEM = R"rawliteral(

Smogly - {TEXT_CONFIG_PAGE}



)rawliteral"; - const char WEB_CONFIG_PAGE_CONFIG[] PROGMEM = R"rawliteral(
+ const char WEB_CONFIG_PAGE_CONFIG[] PROGMEM = R"rawliteral(
@@ -118,7 +123,7 @@ const char WEB_ROOT_PAGE_THINGSPEAK_GRAPH[] PROGMEM = R"rawliteral(
- + @@ -126,18 +131,18 @@ const char WEB_ROOT_PAGE_THINGSPEAK_GRAPH[] PROGMEM = R"rawliteral(
- +


{TEXT_CONFIG_INFO_DEVICE_PAGE}
{TEXT_CONFIG_INFO_SERVICES_PAGE}
{ConfigDeviceButton} {ConfigServicesButton}


{WiFiEraseButton} {RestoreConfigButton}
)rawliteral"; - - const char WEB_CONFIG_PAGE_SUBMIT_DEVICE_BUTTON[] PROGMEM = ""; + + const char WEB_CONFIG_PAGE_SUBMIT_DEVICE_BUTTON[] PROGMEM = ""; const char WEB_CONFIG_PAGE_SUBMIT_SERVICES_BUTTON[] PROGMEM = ""; - + const char WEB_CONFIG_ADVANCED_MQTT_PAGE_SUBMIT_SERVICES_BUTTON[] PROGMEM = ""; const char WEB_CONFIG_PAGE_SELECT[] PROGMEM = " {postfix}
"; - + const char WEB_CONFIG_PAGE_MQTT_TEXTIMPUT[] PROGMEM = "{postfix}"; const char WEB_CONFIG_PAGE_PASSWDINPUT[] = " {postfix}
"; @@ -155,32 +160,32 @@ const char WEB_ROOT_PAGE_THINGSPEAK_GRAPH[] PROGMEM = R"rawliteral(
const char WEB_CONFIG_PAGE_INTINPUT[] PROGMEM = " {postfix}
"; const char WEB_CONFIG_PAGE_FLOATINPUT[] = " {postfix}
"; - + const char WEB_CONFIG_DEVICE_PAGE_BUTTON[] PROGMEM = "{TEXT_CONFIG_DEVICE_PAGE}"; - + const char WEB_CONFIG_SERVICES_PAGE_BUTTON[] PROGMEM = "{TEXT_CONFIG_SERVICES_PAGE}"; const char WEB_CONFIG_PAGE_WIFIERASE[] PROGMEM = "{TEXT_ERASEWIFICONFIG}"; const char WEB_CONFIG_PAGE_RESTORECONFIG[] PROGMEM = "{TEXT_RESTORESETTINGS}"; - + const char WEB_CONFIG_TOP_PAGE_INFO[] PROGMEM = R"rawliteral(

{TEXT_SAVED}!

{TEXT_POSTCONFIG_INFO}

)rawliteral"; - + // CONFIG PAGE - END // CONFIG DEVICE PAGE - Start #ifdef ASYNC_WEBSERVER_ON -const char WEB_CONFIG_DEVICE_PAGE_TOP[] PROGMEM = R"rawliteral(
+const char WEB_CONFIG_DEVICE_PAGE_TOP[] PROGMEM = R"rawliteral(

Smogly - {TEXT_CONFIG_DEVICE_PAGE}


{TEXT_SAVED}! - {TEXT_POSTCONFIG_INFO}



{TEXT_INSTRUCIONSLINK}

)rawliteral"; #else -const char WEB_CONFIG_DEVICE_PAGE_TOP[] PROGMEM = R"rawliteral( +const char WEB_CONFIG_DEVICE_PAGE_TOP[] PROGMEM = R"rawliteral(

Smogly - {TEXT_CONFIG_DEVICE_PAGE}


{WEB_CONFIG_TOP_PAGE_INFO} @@ -188,12 +193,28 @@ const char WEB_CONFIG_DEVICE_PAGE_TOP[] PROGMEM = R"rawliteral( +const char WEB_CONFIG_SERVICES_PAGE_TOP[] PROGMEM = R"rawliteral(

Smogly - {TEXT_CONFIG_SERVICES_PAGE}


{TEXT_SAVED}! - {TEXT_POSTCONFIG_INFO}



@@ -235,7 +256,7 @@ const char WEB_CONFIG_SERVICES_PAGE_CONFIG[] PROGMEM = R"rawliteral({TEXT_SEN {TEXT_DBSENDINGINTERVAL}: {SENDING_DB_FREQUENCY}
{TEXT_SMOGLISTSENDING}: {SMOGLIST_ON} {TEXT_SMOGLISTINFO} -
+
{TEXT_LUFTDATENSENDING}: {LUFTDATEN_ON} ChipID: {LUFTDATEN_ChipID}
{THPSENSOR} Sensor PIN: {THPXPIN} @@ -278,6 +299,8 @@ const char WEB_CONFIG_SERVICES_PAGE_CONFIG[] PROGMEM = R"rawliteral({TEXT_SEN

{TEXT_MQTT_IP_IN_TOPIC}: {MQTT_IP_IN_TOPIC} {TEXT_MQTT_DEVICENAME_IN_TOPIC}: {MQTT_DEVICENAME_IN_TOPIC} + {TEXT_MQTT_SLASH_AT_THE_BEGINNING}: {MQTT_SLASH_AT_THE_BEGINNING} + {TEXT_MQTT_SLASH_AT_THE_END}: {MQTT_SLASH_AT_THE_END}
{TEXT_TEMP_TOPIC}: /{MQTT_IP}{MQTT_DEVICENAME}{MQTT_TOPIC_TEMP}/{MQTT_TEMP}
{TEXT_HUMI_TOPIC}: /{MQTT_IP}{MQTT_DEVICENAME}{MQTT_TOPIC_HUMI}/{MQTT_HUMI}
@@ -295,7 +318,7 @@ const char WEB_CONFIG_SERVICES_PAGE_CONFIG[] PROGMEM = R"rawliteral({TEXT_SEN
)rawliteral"; #else -const char WEB_CONFIG_SERVICES_PAGE_TOP[] PROGMEM = R"rawliteral( +const char WEB_CONFIG_SERVICES_PAGE_TOP[] PROGMEM = R"rawliteral(

Smogly - {TEXT_CONFIG_SERVICES_PAGE}


{WEB_CONFIG_TOP_PAGE_INFO} @@ -307,7 +330,7 @@ const char WEB_CONFIG_SERVICES_PAGE_TOP[] PROGMEM = R"rawliteral( + const char WEB_CONFIG_ADVANCED_MQTT_PAGE_TOP[] PROGMEM = R"rawliteral(

Smogly - {TEXT_ADVANCED_MQTT_PAGE}


{WEB_CONFIG_TOP_PAGE_INFO} @@ -369,6 +392,8 @@ const char WEB_CONFIG_SERVICES_PAGE_TOP[] PROGMEM = R"rawliteral({TEXT_WIFIRSSI}: {WiFiRSSI}
{TEXT_WIFIQUALITY}: {WiFiQuality} )rawliteral"; -#else +#else const char WEB_UPDATE_PAGE_UPDATE[] PROGMEM = R"rawliteral(

Smogly - {TEXT_UPDATE_PAGE}



{WEB_UPDATE_INFO_WARNING} @@ -435,4 +460,4 @@ const char WEB_UPDATE_PAGE_UPDATE[] PROGMEM = R"rawliteral(
{TEXT_WIFIQUALITY}: {WiFiQuality} )rawliteral"; #endif -// UPDATE PAGE - END \ No newline at end of file +// UPDATE PAGE - END diff --git a/src/intl/intl_en.h b/src/intl/intl_en.h index 47adcad..d779ce7 100644 --- a/src/intl/intl_en.h +++ b/src/intl/intl_en.h @@ -5,135 +5,154 @@ */ #pragma once +#ifdef ARDUINO_ARCH_ESP8266 +#include +#endif -char EN_INTL_LANG[16] PROGMEM = "en"; +char EN_INTL_LANG[6] PROGMEM = "en"; char EN_INTL_INDEX_PAGE[16] PROGMEM = "Measurements"; -char EN_INTL_CONFIG_PAGE[16] PROGMEM = "Settings"; +char EN_INTL_CONFIG_PAGE[14] PROGMEM = "Settings"; -char EN_INTL_CONFIG_DEVICE_PAGE[32] PROGMEM = "Device Settings"; -char EN_INTL_CONFIG_INFO_DEVICE_PAGE[256] PROGMEM = "The choice of sensors connected to Smogly, the frequency of measurements, or the language of the web interface can be changed in the section"; -char EN_INTL_CONFIG_SERVICES_PAGE[32] PROGMEM = "Services Settings"; -char EN_INTL_CONFIG_INFO_SERVICES_PAGE[256] PROGMEM = "Settings of such services as Luftdaten, aqi.eco, Smoglist, AirMonitor, ThingSpeak or InfluxDB or MQTT services can be changed in the section"; +char EN_INTL_CONFIG_DEVICE_PAGE[24] PROGMEM = "Device Settings"; +char EN_INTL_CONFIG_INFO_DEVICE_PAGE[144] PROGMEM = "The choice of sensors connected to Smogly, the frequency of measurements, or the language of the web interface can be changed in the section"; +char EN_INTL_CONFIG_SERVICES_PAGE[24] PROGMEM = "Services Settings"; +char EN_INTL_CONFIG_INFO_SERVICES_PAGE[144] PROGMEM = "Settings of such services as Luftdaten, aqi.eco, Smoglist, AirMonitor, ThingSpeak or InfluxDB or MQTT services can be changed in the section"; -char EN_INTL_UPDATE_PAGE[16] PROGMEM = "Update"; +char EN_INTL_UPDATE_PAGE[14] PROGMEM = "Update"; -char EN_INTL_WEATHER[16] PROGMEM = "Weather"; -char EN_INTL_TEMPERATURE[16] PROGMEM = "Temperature"; -char EN_INTL_HUMIDITY[16] PROGMEM = "Humidity"; -char EN_INTL_PRESSURE[16] PROGMEM = "Pressure"; -char EN_INTL_DEWPOINT[16] PROGMEM = "Dewpoint"; +char EN_INTL_WEATHER[10] PROGMEM = "Weather"; +char EN_INTL_TEMPERATURE[14] PROGMEM = "Temperature"; +char EN_INTL_HUMIDITY[14] PROGMEM = "Humidity"; +char EN_INTL_PRESSURE[14] PROGMEM = "Pressure"; +char EN_INTL_DEWPOINT[14] PROGMEM = "Dewpoint"; -char EN_INTL_AIRPOLLUTION[32] PROGMEM = "Air pollution"; -char EN_INTL_SAVED[16] PROGMEM = "SAVED!"; +char EN_INTL_AIRPOLLUTION[26] PROGMEM = "Air pollution"; +char EN_INTL_SAVED[10] PROGMEM = "SAVED!"; -char EN_INTL_POSTCONFIG_INFO[64] PROGMEM = "everything looks OK, in a moment the Smogly will restart"; -char EN_INTL_INSTRUCIONSLINK[80] PROGMEM = "All instructions and descriptions[in polish] are available {GITHUB_LINK}."; -char EN_INTL_DEVICENAME[32] PROGMEM = "Device Name"; +char EN_INTL_POSTCONFIG_INFO[60] PROGMEM = "everything looks OK, in a moment the Smogly will restart"; +char EN_INTL_INSTRUCIONSLINK[76] PROGMEM = "All instructions and descriptions[in polish] are available {GITHUB_LINK}."; +char EN_INTL_DEVICENAME[20] PROGMEM = "Device Name"; char EN_INTL_DEVICENAMEAUTO[32] PROGMEM = "Automatic name generation"; -char EN_INTL_SELECTEDLANGUAGE[16] PROGMEM = "Language"; -char EN_INTL_TEMPHUMIPRESSSENSOR[64] PROGMEM = "Temp/Humi/Press Sensor"; -char EN_INTL_PMSENSOR[32] PROGMEM = "PM2.5/PM10 Sensor"; - -char EN_INTL_FREQUENTMEASUREMENTONOFF[32] PROGMEM = "Continuous measurements"; -char EN_INTL_FREQUENTMEASUREMENTINFO[96] PROGMEM = "Continuous measurements significantly shorten the life span of the PM sensor."; -char EN_INTL_MEASUREMENTFREQUENCY[32] PROGMEM = "Make PM measurements every"; -char EN_INTL_AVERAGELASTRESULT[32] PROGMEM = "Average result from last"; -char EN_INTL_PMMEASUREMENTS[32] PROGMEM = "PM measurements"; -char EN_INTL_SENDINGINTERVAL[64] PROGMEM = "Sending data to external services every"; -char EN_INTL_SERVICESSENDINGINTERVAL[128] PROGMEM = "Sending data to AirMonitor/Luftdaten/Smoglist/aqi.eco every"; -char EN_INTL_DBSENDINGINTERVAL[64] PROGMEM = "Sending data to ThingSpeak/InfluxDB/MQTT every"; -char EN_INTL_SECONDS[16] PROGMEM = "seconds"; -char EN_INTL_MINUTES[16] PROGMEM = "minutes"; - -char EN_INTL_DEEPSLEEPINFO[544] PROGMEM = "DeepSleep put the device into deep sleep between a series of measurements - significantly lower energy consumption (the possibility of working on the battery for several weeks), but lack of continuous access to the web interface. The web interface will only be available for about {INTERFACEWWWONTIME} seconds every {SENDING_FREQUENCY} minutes (and right after the device reboots). Sleep time will be the same as the period for sending measurements to external services. DeepSleep requires connection of D0 and RST pins on ESP8266!"; -char EN_INTL_DEEPSLEEPINFO_ESP32[544] PROGMEM = "DeepSleep put the device into deep sleep between a series of measurements - significantly lower energy consumption (the possibility of working on the battery for several weeks), but lack of continuous access to the web interface. The web interface will only be available for about {INTERFACEWWWONTIME} seconds every {SENDING_FREQUENCY} minutes (and right after the device reboots). Sleep time will be the same as the period for sending measurements to external services."; - -char EN_INTL_DISPLAYPM1[32] PROGMEM = "Display of PM1 measurements"; -char EN_INTL_ALTITUDEINFO[128] PROGMEM = "Altitude above sea level (required for correct pressure measurements. You can check it {WSPOLRZEDNE_GPS_LINK})"; - -char EN_INTL_SECURECONFIGUPDATEPAGE[96] PROGMEM = "Secure the Configuration and Update pages(default: admin/password)"; -char EN_INTL_SECURELOGIN[16] PROGMEM = "Login"; -char EN_INTL_SECUREPASSWD[16] PROGMEM = "Password"; -char EN_INTL_SECURELOGOUTINFO[64] PROGMEM = "Restart your web browser to log out!"; +char EN_INTL_SELECTEDLANGUAGE[10] PROGMEM = "Language"; +char EN_INTL_TEMPHUMIPRESSSENSOR[40] PROGMEM = "Temp/Humi/Press Sensor"; +char EN_INTL_PMSENSOR[20] PROGMEM = "PM2.5/PM10 Sensor"; + +char EN_INTL_FIRST_THP_SDA_SCL[40] PROGMEM = "First Temp/Humi Sensor SDA/SCL config"; +char EN_INTL_FIRST_THP_SDA[8] PROGMEM = "Pin SDA"; +char EN_INTL_FIRST_THP_SCL[8] PROGMEM = "Pin SCL"; + +char EN_INTL_SECOND_THP[40] PROGMEM = "Enable Second Temp/Humi Sensor"; + +char EN_INTL_SECOND_THP_SDA_SCL[48] PROGMEM = "Second Temp/Humi Sensor SDA/SCL config"; +char EN_INTL_SECOND_THP_SDA[8] PROGMEM = "Pin SDA"; +char EN_INTL_SECOND_THP_SCL[8] PROGMEM = "Pin SCL"; + +char EN_INTL_DUST_TX_RX[32] PROGMEM = "PM2.5/PM10 Sensor TX/RX config"; +char EN_INTL_DUST_TX[8] PROGMEM = "Pin TX"; +char EN_INTL_DUST_RX[8] PROGMEM = "Pin RX"; + +char EN_INTL_FREQUENTMEASUREMENTONOFF[26] PROGMEM = "Continuous measurements"; +char EN_INTL_FREQUENTMEASUREMENTINFO[80] PROGMEM = "Continuous measurements significantly shorten the life span of the PM sensor."; +char EN_INTL_MEASUREMENTFREQUENCY[30] PROGMEM = "Make PM measurements every"; +char EN_INTL_AVERAGELASTRESULT[30] PROGMEM = "Average result from last"; +char EN_INTL_PMMEASUREMENTS[18] PROGMEM = "PM measurements"; +char EN_INTL_SENDINGINTERVAL[50] PROGMEM = "Sending data to external services every"; +char EN_INTL_SERVICESSENDINGINTERVAL[64] PROGMEM = "Sending data to AirMonitor/Luftdaten/Smoglist/aqi.eco every"; +char EN_INTL_DBSENDINGINTERVAL[50] PROGMEM = "Sending data to ThingSpeak/InfluxDB/MQTT every"; +char EN_INTL_SECONDS[10] PROGMEM = "seconds"; +char EN_INTL_MINUTES[10] PROGMEM = "minutes"; + +char EN_INTL_DEEPSLEEPINFO[540] PROGMEM = "DeepSleep put the device into deep sleep between a series of measurements - significantly lower energy consumption (the possibility of working on the battery for several weeks), but lack of continuous access to the web interface. The web interface will only be available for about {INTERFACEWWWONTIME} seconds every {SENDING_FREQUENCY} minutes (and right after the device reboots). Sleep time will be the same as the period for sending measurements to external services. DeepSleep requires connection of D0 and RST pins on ESP8266!"; +char EN_INTL_DEEPSLEEPINFO_ESP32[476] PROGMEM = "DeepSleep put the device into deep sleep between a series of measurements - significantly lower energy consumption (the possibility of working on the battery for several weeks), but lack of continuous access to the web interface. The web interface will only be available for about {INTERFACEWWWONTIME} seconds every {SENDING_FREQUENCY} minutes (and right after the device reboots). Sleep time will be the same as the period for sending measurements to external services."; + +char EN_INTL_DISPLAYPM1[30] PROGMEM = "Display of PM1 measurements"; +char EN_INTL_ALTITUDEINFO[116] PROGMEM = "Altitude above sea level (required for correct pressure measurements. You can check it {WSPOLRZEDNE_GPS_LINK})"; + +char EN_INTL_SECURECONFIGUPDATEPAGE[84] PROGMEM = "Secure the Configuration and Update pages(default: admin/password)"; +char EN_INTL_SECURELOGIN[8] PROGMEM = "Login"; +char EN_INTL_SECUREPASSWD[10] PROGMEM = "Password"; +char EN_INTL_SECURELOGOUTINFO[48] PROGMEM = "Restart your web browser to log out!"; char EN_INTL_LUFTDATENSENDING[96] PROGMEM = "Sending data to the {LUFTDATEN_LINK} service(requires registration at {LUFTDATENFORM_LINK})"; -char EN_INTL_SMOGLISTSENDING[64] PROGMEM = "Sending data to the {SMOGLIST_LINK} service"; -char EN_INTL_SMOGLISTINFO[256] = "Smoglist is a service that collects Smogly usage statistics(we do not collect logins and passwords). It will allow us to improve the most commonly used functions in the future and generate our own charts."; +char EN_INTL_SMOGLISTSENDING[48] PROGMEM = "Sending data to the {SMOGLIST_LINK} service"; +char EN_INTL_SMOGLISTINFO[242] = "Smoglist is a service that collects Smogly usage statistics(we do not collect logins and passwords). It will allow us to improve the most commonly used functions in the future and generate our own charts."; char EN_INTL_AIRMONITORSENDING[128] PROGMEM = "Sending data to the {AIRMONITOR_LINK} service(requires filling out {AIRMONITORFORM_LINK}; Sensor: e.g. {PMSENSORMODEL})"; -char EN_INTL_AIRMONITORCHARTS[64] PROGMEM = "Displaying charts from the AirMonitor site"; -char EN_INTL_AIRMONITORCOORDINATESINFO[80] PROGMEM = "Geographical coordinates(you can check it {LATLONG_LINK})"; -char EN_INTL_AIRMONITORLATITUDE[32] PROGMEM = "Latitude"; -char EN_INTL_AIRMONITORLONGITUDE[32] PROGMEM = "Longitude"; - -char EN_INTL_THINGSPEAKSENDING[64] PROGMEM = "Sending data to the {THINGSPEAK_LINK} service:"; -char EN_INTL_THINGSPEAKCHARTS[64] PROGMEM = "Displaying charts from the ThingSpeak site"; -char EN_INTL_THINGSPEAK_WRITE_API_KEY[32] PROGMEM = "ThingSpeak Write API Key"; -char EN_INTL_THINGSPEAKCHANNELID[32] PROGMEM = "ThingSpeak Channel ID"; -char EN_INTL_THINGSPEAK_READ_API_KEY[32] PROGMEM = "ThingSpeak Read API Key"; - -char EN_INTL_INFLUXDBSENDING[64] PROGMEM = "Sending data to the InfluxDB"; -char EN_INTL_INFLUXDBVERSION[32] PROGMEM = "InfluxDB version"; -char EN_INTL_INFLUXDBSERVER[64] PROGMEM = "InfluxDB database address"; -char EN_INTL_INFLUXDBPORT[32] PROGMEM = "InfluxDB port"; -char EN_INTL_INFLUXDBNAME[32] PROGMEM = "Name of the database"; -char EN_INTL_INFLUXDBUSER[32] PROGMEM = "Database user"; -char EN_INTL_INFLUXDBPASSWD[32] PROGMEM = "Database password"; -char EN_INTL_INFLUXDBORG[32] PROGMEM = "Organization"; -char EN_INTL_INFLUXDBBUCKET[32] PROGMEM = "Bucket"; -char EN_INTL_INFLUXDBTOKEN[32] PROGMEM = "Token"; - -char EN_INTL_CONFIG_ADV_MQTT[32] PROGMEM = "Advanced MQTT Configuration"; -char EN_INTL_MQTTSENDING[64] PROGMEM = "Sending data to the MQTT server"; -char EN_INTL_MQTTSERVER[32] PROGMEM = "MQTT server address"; -char EN_INTL_MQTTPORT[32] PROGMEM = "MQTT port"; -char EN_INTL_MQTTUSER[32] PROGMEM = "MQTT user"; -char EN_INTL_MQTTPASSWD[32] PROGMEM = "MQTT password"; - -char EN_INTL_MQTT_IP_IN_TOPIC[32] PROGMEM = "IP address in topic"; -char EN_INTL_MQTT_DEVICENAME_IN_TOPIC[32] PROGMEM = "Device name in topic"; +char EN_INTL_AIRMONITORCHARTS[48] PROGMEM = "Displaying charts from the AirMonitor site"; +char EN_INTL_AIRMONITORCOORDINATESINFO[74] PROGMEM = "Geographical coordinates(you can check it {LATLONG_LINK})"; +char EN_INTL_AIRMONITORLATITUDE[24] PROGMEM = "Latitude"; +char EN_INTL_AIRMONITORLONGITUDE[24] PROGMEM = "Longitude"; + +char EN_INTL_THINGSPEAKSENDING[50] PROGMEM = "Sending data to the {THINGSPEAK_LINK} service:"; +char EN_INTL_THINGSPEAKCHARTS[48] PROGMEM = "Displaying charts from the ThingSpeak site"; +char EN_INTL_THINGSPEAK_WRITE_API_KEY[28] PROGMEM = "ThingSpeak Write API Key"; +char EN_INTL_THINGSPEAKCHANNELID[24] PROGMEM = "ThingSpeak Channel ID"; +char EN_INTL_THINGSPEAK_READ_API_KEY[28] PROGMEM = "ThingSpeak Read API Key"; + +char EN_INTL_INFLUXDBSENDING[32] PROGMEM = "Sending data to the InfluxDB"; +char EN_INTL_INFLUXDBVERSION[18] PROGMEM = "InfluxDB version"; +char EN_INTL_INFLUXDBSERVER[30] PROGMEM = "InfluxDB database address"; +char EN_INTL_INFLUXDBPORT[16] PROGMEM = "InfluxDB port"; +char EN_INTL_INFLUXDBNAME[24] PROGMEM = "Name of the database"; +char EN_INTL_INFLUXDBUSER[28] PROGMEM = "Database user"; +char EN_INTL_INFLUXDBPASSWD[24] PROGMEM = "Database password"; +char EN_INTL_INFLUXDBORG[16] PROGMEM = "Organization"; +char EN_INTL_INFLUXDBBUCKET[10] PROGMEM = "Bucket"; +char EN_INTL_INFLUXDBTOKEN[8] PROGMEM = "Token"; + +char EN_INTL_CONFIG_ADV_MQTT[22] PROGMEM = "MQTT Configuration"; +char EN_INTL_MQTTSENDING[34] PROGMEM = "Sending data to the MQTT server"; +char EN_INTL_MQTTSERVER[22] PROGMEM = "MQTT server address"; +char EN_INTL_MQTTPORT[12] PROGMEM = "MQTT port"; +char EN_INTL_MQTTUSER[20] PROGMEM = "MQTT user"; +char EN_INTL_MQTTPASSWD[16] PROGMEM = "MQTT password"; + +char EN_INTL_MQTT_IP_IN_TOPIC[22] PROGMEM = "IP address in topic"; +char EN_INTL_MQTT_DEVICENAME_IN_TOPIC[30] PROGMEM = "Device name in topic"; char EN_INTL_MQTT_TOPIC_INFO[256] PROGMEM = "Below you can format the way you want to send MQTT data. You can add the 'IP address' and 'Device name' at the beginning. You can specify the middle part yourself for each of the values measured by the device."; +char EN_INTL_MQTT_SLASH_AT_THE_BEGINNING[40] PROGMEM = "Add '/' at the beginning of the topic"; +char EN_INTL_MQTT_SLASH_AT_THE_END[36] PROGMEM = "Add '/' at the end of the topic"; -char EN_INTL_AQIECOSENDING[128] PROGMEM = "Sending data to the aqi.eco service"; -char EN_INTL_AQIECOSERVER[32] PROGMEM = "aqi.eco server"; -char EN_INTL_AQIECOPATH[32] PROGMEM = "aqi.eco path"; +char EN_INTL_AQIECOSENDING[100] PROGMEM = "Sending data to the aqi.eco service"; +char EN_INTL_AQIECOSERVER[26] PROGMEM = "aqi.eco server"; +char EN_INTL_AQIECOPATH[20] PROGMEM = "aqi.eco path"; -char EN_INTL_CALIBMETHOD[32] PROGMEM = "Calibration method"; -char EN_INTL_CALIB1[32] PROGMEM = "calib1"; -char EN_INTL_CALIB2[32] PROGMEM = "calib2"; -char EN_INTL_SOFTWATEVERSION[32] PROGMEM = "Software version"; +char EN_INTL_CALIBMETHOD[22] PROGMEM = "Calibration method"; +char EN_INTL_CALIB1[30] PROGMEM = "calib1"; +char EN_INTL_CALIB2[30] PROGMEM = "calib2"; +char EN_INTL_SOFTWATEVERSION[24] PROGMEM = "Software version"; -char EN_INTL_ERASEWIFICONFIG[32] PROGMEM = "Erase WiFi Config"; +char EN_INTL_ERASEWIFICONFIG[22] PROGMEM = "Erase WiFi Config"; char EN_INTL_RESTORESETTINGS[32] PROGMEM = "Restore default settings"; -char EN_INTL_SAVE[16] PROGMEM = "Save"; -char EN_INTL_YES[16] PROGMEM = "Yes"; -char EN_INTL_NO[16] PROGMEM = "No"; -char EN_INTL_WITHOUTSENSOR[32] PROGMEM = "Without sensor"; -char EN_INTL_WITHOUTCALIBRATION[32] PROGMEM = "Without calibration"; -char EN_INTL_AUTOMATICCALIBRATION[32] PROGMEM = "Automatic calibration"; - -char EN_INTL_INTL_EN[16] PROGMEM = "english"; -char EN_INTL_INTL_PL[16] PROGMEM = "polish"; - -char EN_INTL_FWUPDATEAVALIBLE[64] PROGMEM = "Firmware update available!"; -char EN_INTL_AUTOUPDATEON[32] PROGMEM = "Autoupdate"; -char EN_INTL_MANUALUPDATEBUTTON[32] PROGMEM = "Manual Upgrade"; +char EN_INTL_SAVE[8] PROGMEM = "Save"; +char EN_INTL_YES[6] PROGMEM = "Yes"; +char EN_INTL_NO[6] PROGMEM = "No"; +char EN_INTL_WITHOUTSENSOR[16] PROGMEM = "Without sensor"; +char EN_INTL_WITHOUTCALIBRATION[22] PROGMEM = "Without calibration"; +char EN_INTL_AUTOMATICCALIBRATION[26] PROGMEM = "Automatic calibration"; + +char EN_INTL_INTL_EN[12] PROGMEM = "english"; +char EN_INTL_INTL_PL[8] PROGMEM = "polish"; + +char EN_INTL_FWUPDATEAVALIBLE[42] PROGMEM = "Firmware update available!"; +char EN_INTL_AUTOUPDATEON[28] PROGMEM = "Autoupdate"; +char EN_INTL_MANUALUPDATEBUTTON[22] PROGMEM = "Manual Upgrade"; char EN_INTL_FWUPDATEBUTTON[32] PROGMEM = "Firmware Upgrade"; -char EN_INTL_AUTOUPDATEONBUTTON[64] PROGMEM = "Autoupdate On"; -char EN_INTL_AUTOUPDATEWARNING[672] PROGMEM = "Automatic updates are performed via an unencrypted connection (HTTP, not HTTPS). It can be dangerous and allow interception of packets and hacking the device. You can use the Autoupdate once by clicking the \"{TEXT_FWUPDATEBUTTON}\" button or turn on Autoupdate permanently. You can change your mind at any time and disable Autoupdate in the Configuration. After selecting \"{TEXT_FWUPDATEBUTTON}\" or turning on Autoupdate, the device will save the current configuration and restart. It may take several seconds."; +char EN_INTL_AUTOUPDATEONBUTTON[36] PROGMEM = "Autoupdate On"; +char EN_INTL_AUTOUPDATEWARNING[650] PROGMEM = "Automatic updates are performed via an unencrypted connection (HTTP, not HTTPS). It can be dangerous and allow interception of packets and hacking the device. You can use the Autoupdate once by clicking the \"{TEXT_FWUPDATEBUTTON}\" button or turn on Autoupdate permanently. You can change your mind at any time and disable Autoupdate in the Configuration. After selecting \"{TEXT_FWUPDATEBUTTON}\" or turning on Autoupdate, the device will save the current configuration and restart. It may take several seconds."; char EN_INTL_UPDATEPAGEAUTOUPDATEWARNING[192] PROGMEM = "Automatic updates are performed via an unencrypted connection (HTTP, not HTTPS). It can be dangerous and allow interception of packets and hacking the device."; -char EN_INTL_SELECTUPDATEFILE[32] PROGMEM = "Select .bin file"; -char EN_INTL_SUBMITUPDATE[16] PROGMEM = "Update!"; -char EN_INTL_CURRENTSOFTVERSION[64] PROGMEM = "Currently used version of the firmware"; -char EN_INTL_SERVERSOFTWAREVERSION[64] PROGMEM = "The latest available firmware version"; -char EN_INTL_LATESTAVAILABLESOFT[96] PROGMEM = "Latest version of the software available {SMOGOMIERZRELEASES_LINK}."; +char EN_INTL_SELECTUPDATEFILE[20] PROGMEM = "Select .bin file"; +char EN_INTL_SUBMITUPDATE[10] PROGMEM = "Update!"; +char EN_INTL_CURRENTSOFTVERSION[40] PROGMEM = "Currently used version of the firmware"; +char EN_INTL_SERVERSOFTWAREVERSION[46] PROGMEM = "The latest available firmware version"; +char EN_INTL_LATESTAVAILABLESOFT[82] PROGMEM = "Latest version of the software available {SMOGOMIERZRELEASES_LINK}."; -char EN_INTL_HERE[16] PROGMEM = "here"; -char EN_INTL_THEFORM[16] PROGMEM = "the form"; +char EN_INTL_HERE[8] PROGMEM = "here"; +char EN_INTL_THEFORM[12] PROGMEM = "the form"; -char EN_INTL_CONNECTEDWIFI[32] PROGMEM = "Connected to a WiFi(SSID)"; -char EN_INTL_WIFIRSSI[32] PROGMEM = "WiFi Signal Strength(RSSI)"; -char EN_INTL_WIFIQUALITY[32] PROGMEM = "WiFi Signal Quality"; \ No newline at end of file +char EN_INTL_CONNECTEDWIFI[28] PROGMEM = "Connected to a WiFi(SSID)"; +char EN_INTL_WIFIRSSI[28] PROGMEM = "WiFi Signal Strength(RSSI)"; +char EN_INTL_WIFIQUALITY[26] PROGMEM = "WiFi Signal Quality"; \ No newline at end of file diff --git a/src/intl/intl_pl.h b/src/intl/intl_pl.h index 07cb3fc..ffaeef0 100644 --- a/src/intl/intl_pl.h +++ b/src/intl/intl_pl.h @@ -5,136 +5,154 @@ */ #pragma once +#ifdef ARDUINO_ARCH_ESP8266 +#include +#endif -char PL_INTL_LANG[16] PROGMEM = "pl"; +char PL_INTL_LANG[6] PROGMEM = "pl"; char PL_INTL_INDEX_PAGE[16] PROGMEM = "Pomiary"; -char PL_INTL_CONFIG_PAGE[16] PROGMEM = "Ustawienia"; +char PL_INTL_CONFIG_PAGE[14] PROGMEM = "Ustawienia"; -char PL_INTL_CONFIG_DEVICE_PAGE[32] PROGMEM = "Ustawienia Urządzenia"; -char PL_INTL_CONFIG_INFO_DEVICE_PAGE[256] PROGMEM = "Wybór czujników podłączonych do Smogly, częstotliwość wykonywania pomiarów, czy język interfejsu można zmienić w sekcji"; -char PL_INTL_CONFIG_SERVICES_PAGE[32] PROGMEM = "Ustawienia Serwisów"; -char PL_INTL_CONFIG_INFO_SERVICES_PAGE[256] PROGMEM = "Ustawienia takich serwisów jak Luftdaten, aqi.eco, Smoglist, AirMonitor, ThingSpeak czy usług InfluxDB lub MQTT można zmienić w sekcji"; +char PL_INTL_CONFIG_DEVICE_PAGE[24] PROGMEM = "Ustawienia Urządzenia"; +char PL_INTL_CONFIG_INFO_DEVICE_PAGE[144] PROGMEM = "Wybór czujników podłączonych do Smogly, częstotliwość wykonywania pomiarów, czy język interfejsu można zmienić w sekcji"; +char PL_INTL_CONFIG_SERVICES_PAGE[24] PROGMEM = "Ustawienia Serwisów"; +char PL_INTL_CONFIG_INFO_SERVICES_PAGE[144] PROGMEM = "Ustawienia takich serwisów jak Luftdaten, aqi.eco, Smoglist, AirMonitor, ThingSpeak czy usług InfluxDB lub MQTT można zmienić w sekcji"; -char PL_INTL_UPDATE_PAGE[16] PROGMEM = "Aktualizacje"; +char PL_INTL_UPDATE_PAGE[14] PROGMEM = "Aktualizacje"; -char PL_INTL_WEATHER[16] PROGMEM = "Pogoda"; -char PL_INTL_TEMPERATURE[16] PROGMEM = "Temperatura"; -char PL_INTL_HUMIDITY[16] PROGMEM = "Wilgotność"; -char PL_INTL_PRESSURE[16] PROGMEM = "Ciśnienie"; -char PL_INTL_DEWPOINT[16] PROGMEM = "Punkt rosy"; +char PL_INTL_WEATHER[10] PROGMEM = "Pogoda"; +char PL_INTL_TEMPERATURE[14] PROGMEM = "Temperatura"; +char PL_INTL_HUMIDITY[14] PROGMEM = "Wilgotność"; +char PL_INTL_PRESSURE[14] PROGMEM = "Ciśnienie"; +char PL_INTL_DEWPOINT[14] PROGMEM = "Punkt rosy"; -char PL_INTL_AIRPOLLUTION[32] PROGMEM = "Pomiary zanieczyszczeń"; -char PL_INTL_SAVED[16] PROGMEM = "ZAPISANO"; +char PL_INTL_AIRPOLLUTION[26] PROGMEM = "Pomiary zanieczyszczeń"; +char PL_INTL_SAVED[10] PROGMEM = "ZAPISANO"; -char PL_INTL_POSTCONFIG_INFO[64] PROGMEM = "wszystko wygląda OK, za chwilę nastąpi restart Smogly"; -char PL_INTL_INSTRUCIONSLINK[80] PROGMEM = "Wszystkie instrukcje i opisy dostępne są {GITHUB_LINK}."; -char PL_INTL_DEVICENAME[32] PROGMEM = "Nazwa urządzenia"; +char PL_INTL_POSTCONFIG_INFO[60] PROGMEM = "wszystko wygląda OK, za chwilę nastąpi restart Smogly"; +char PL_INTL_INSTRUCIONSLINK[76] PROGMEM = "Wszystkie instrukcje i opisy dostępne są {GITHUB_LINK}."; +char PL_INTL_DEVICENAME[20] PROGMEM = "Nazwa urządzenia"; char PL_INTL_DEVICENAMEAUTO[32] PROGMEM = "Automatyczne generowanie nazwy"; -char PL_INTL_SELECTEDLANGUAGE[16] PROGMEM = "Język"; -char PL_INTL_TEMPHUMIPRESSSENSOR[64] PROGMEM = "Miernik Temp/Wilgotności/Ciśnienia"; -char PL_INTL_PMSENSOR[32] PROGMEM = "Miernik PM2.5/PM10"; - -char PL_INTL_FREQUENTMEASUREMENTONOFF[32] PROGMEM = "Ciągłe pomiary PM"; -char PL_INTL_FREQUENTMEASUREMENTINFO[96] PROGMEM = "Ciągłe pomiary znacznie skracają żywotność miernika PM."; -char PL_INTL_MEASUREMENTFREQUENCY[32] PROGMEM = "Wykonywanie pomiarów PM co"; -char PL_INTL_AVERAGELASTRESULT[32] PROGMEM = "Uśredniaj wynik z ostatnich"; -char PL_INTL_PMMEASUREMENTS[32] PROGMEM = "pomiarów PM"; -char PL_INTL_SENDINGINTERVAL[64] PROGMEM = "Wysyłanie danych do serwisów zewnętrznych co"; -char PL_INTL_SERVICESSENDINGINTERVAL[128] PROGMEM = "Wysyłanie danych do AirMonitor/Luftdaten/Smoglist/aqi.eco co"; -char PL_INTL_DBSENDINGINTERVAL[64] PROGMEM = "Wysyłanie danych do ThingSpeak/InfluxDB/MQTT co"; -char PL_INTL_SECONDS[16] PROGMEM = "sekund"; -char PL_INTL_MINUTES[16] PROGMEM = "minut"; - -char PL_INTL_DEEPSLEEPINFO[544] PROGMEM = "DeepSleep wprowadza urządzenie w głębokie uśpienie pomiędzy seriami pomiarów - znacznie niższe zużycie energii(możliwość pracy na baterii przez kilka tygodni), ale brak ciągłego dostępu do interfejsu WWW. Interfejs WWW będzie dostępny tylko przez około {INTERFACEWWWONTIME} sekund co {SENDING_FREQUENCY} minut(oraz zaraz po restarcie urządzenia). Czas uśpienia będzie taki sam jak okres wysyłania pomiarów do serwisów zewnętrznych. Wymaga połączenia pinów D0 oraz RST na ESP8266!"; -char PL_INTL_DEEPSLEEPINFO_ESP32[544] PROGMEM = "DeepSleep wprowadza urządzenie w głębokie uśpienie pomiędzy seriami pomiarów - znacznie niższe zużycie energii(możliwość pracy na baterii przez kilka tygodni), ale brak ciągłego dostępu do interfejsu WWW. Interfejs WWW będzie dostępny tylko przez około {INTERFACEWWWONTIME} sekund co {SENDING_FREQUENCY} minut(oraz zaraz po restarcie urządzenia). Czas uśpienia będzie taki sam jak okres wysyłania pomiarów do serwisów zewnętrznych."; - -char PL_INTL_DISPLAYPM1[32] PROGMEM = "Wyświetlanie pomiarów PM1"; -char PL_INTL_ALTITUDEINFO[128] PROGMEM = "Wysokość(wymagana do poprawnych pomiarów ciśnienia. Można sprawdzić {WSPOLRZEDNE_GPS_LINK})"; - -char PL_INTL_SECURECONFIGUPDATEPAGE[96] PROGMEM = "Wymagaj hasła dla strony Konfiguracyjnej oraz Update(domyślne: admin/password)"; -char PL_INTL_SECURELOGIN[16] PROGMEM = "Login"; -char PL_INTL_SECUREPASSWD[16] PROGMEM = "Hasło"; -char PL_INTL_SECURELOGOUTINFO[64] PROGMEM = "Zrestartuj przeglądarkę w celu wylogowania!"; +char PL_INTL_SELECTEDLANGUAGE[10] PROGMEM = "Język"; +char PL_INTL_TEMPHUMIPRESSSENSOR[40] PROGMEM = "Miernik Temp/Wilgotności/Ciśnienia"; +char PL_INTL_PMSENSOR[20] PROGMEM = "Miernik PM2.5/PM10"; + +char PL_INTL_FIRST_THP_SDA_SCL[40] PROGMEM = "Piny miernika Temp/Wilgotności"; +char PL_INTL_FIRST_THP_SDA[8] PROGMEM = "Pin SDA"; +char PL_INTL_FIRST_THP_SCL[8] PROGMEM = "Pin SCL"; + +char PL_INTL_SECOND_THP[40] PROGMEM = "Włacz drugi miernik Temp/Wilgotności"; + +char PL_INTL_SECOND_THP_SDA_SCL[48] PROGMEM = "Piny drugiego miernika Temp/Wilgotności"; +char PL_INTL_SECOND_THP_SDA[8] PROGMEM = "Pin SDA"; +char PL_INTL_SECOND_THP_SCL[8] PROGMEM = "Pin SCL"; + +char PL_INTL_DUST_TX_RX[32] PROGMEM = "Piny miernika PM2.5/PM10"; +char PL_INTL_DUST_TX[8] PROGMEM = "Pin TX"; +char PL_INTL_DUST_RX[8] PROGMEM = "Pin RX"; + +char PL_INTL_FREQUENTMEASUREMENTONOFF[26] PROGMEM = "Ciągłe pomiary PM"; +char PL_INTL_FREQUENTMEASUREMENTINFO[80] PROGMEM = "Ciągłe pomiary znacznie skracają żywotność miernika PM."; +char PL_INTL_MEASUREMENTFREQUENCY[30] PROGMEM = "Wykonywanie pomiarów PM co"; +char PL_INTL_AVERAGELASTRESULT[30] PROGMEM = "Uśredniaj wynik z ostatnich"; +char PL_INTL_PMMEASUREMENTS[18] PROGMEM = "pomiarów PM"; +char PL_INTL_SENDINGINTERVAL[50] PROGMEM = "Wysyłanie danych do serwisów zewnętrznych co"; +char PL_INTL_SERVICESSENDINGINTERVAL[64] PROGMEM = "Wysyłanie danych do AirMonitor/Luftdaten/Smoglist/aqi.eco co"; +char PL_INTL_DBSENDINGINTERVAL[50] PROGMEM = "Wysyłanie danych do ThingSpeak/InfluxDB/MQTT co"; +char PL_INTL_SECONDS[10] PROGMEM = "sekund"; +char PL_INTL_MINUTES[10] PROGMEM = "minut"; + +char PL_INTL_DEEPSLEEPINFO[540] PROGMEM = "DeepSleep wprowadza urządzenie w głębokie uśpienie pomiędzy seriami pomiarów - znacznie niższe zużycie energii(możliwość pracy na baterii przez kilka tygodni), ale brak ciągłego dostępu do interfejsu WWW. Interfejs WWW będzie dostępny tylko przez około {INTERFACEWWWONTIME} sekund co {SENDING_FREQUENCY} minut(oraz zaraz po restarcie urządzenia). Czas uśpienia będzie taki sam jak okres wysyłania pomiarów do serwisów zewnętrznych. Wymaga połączenia pinów D0 oraz RST na ESP8266!"; +char PL_INTL_DEEPSLEEPINFO_ESP32[476] PROGMEM = "DeepSleep wprowadza urządzenie w głębokie uśpienie pomiędzy seriami pomiarów - znacznie niższe zużycie energii(możliwość pracy na baterii przez kilka tygodni), ale brak ciągłego dostępu do interfejsu WWW. Interfejs WWW będzie dostępny tylko przez około {INTERFACEWWWONTIME} sekund co {SENDING_FREQUENCY} minut(oraz zaraz po restarcie urządzenia). Czas uśpienia będzie taki sam jak okres wysyłania pomiarów do serwisów zewnętrznych."; + +char PL_INTL_DISPLAYPM1[30] PROGMEM = "Wyświetlanie pomiarów PM1"; +char PL_INTL_ALTITUDEINFO[116] PROGMEM = "Wysokość(wymagana do poprawnych pomiarów ciśnienia. Można sprawdzić {WSPOLRZEDNE_GPS_LINK})"; + +char PL_INTL_SECURECONFIGUPDATEPAGE[84] PROGMEM = "Wymagaj hasła dla strony Konfiguracyjnej oraz Update(domyślne: admin/password)"; +char PL_INTL_SECURELOGIN[8] PROGMEM = "Login"; +char PL_INTL_SECUREPASSWD[10] PROGMEM = "Hasło"; +char PL_INTL_SECURELOGOUTINFO[48] PROGMEM = "Zrestartuj przeglądarkę w celu wylogowania!"; char PL_INTL_LUFTDATENSENDING[96] PROGMEM = "Wysyłanie danych do serwisu {LUFTDATEN_LINK} (wymaga rejestracji {LUFTDATENFORM_LINK})"; -char PL_INTL_SMOGLISTSENDING[64] PROGMEM = "Wysyłanie danych do serwisu {SMOGLIST_LINK}"; -char PL_INTL_SMOGLISTINFO[256] PROGMEM = "Smoglist to serwis zbierający statystyki użytkowania Smogly(nie zbieramy loginów i haseł). Smoglist pozwoli nam w przyszłości ulepszyć najcześciej używane funkcje i generować własne wykresy."; +char PL_INTL_SMOGLISTSENDING[48] PROGMEM = "Wysyłanie danych do serwisu {SMOGLIST_LINK}"; +char PL_INTL_SMOGLISTINFO[242] PROGMEM = "Smoglist to serwis zbierający statystyki użytkowania Smogly(nie zbieramy loginów i haseł). Smoglist pozwoli nam w przyszłości ulepszyć najcześciej używane funkcje i generować własne wykresy."; char PL_INTL_AIRMONITORSENDING[128] PROGMEM = "Wysyłanie danych do serwisu {AIRMONITOR_LINK} (wymaga wypełnienia {AIRMONITORFORM_LINK}; Sensor: np. {PMSENSORMODEL})"; -char PL_INTL_AIRMONITORCHARTS[64] PROGMEM = "Wyświetlanie wykresów z serwisu AirMonitor"; -char PL_INTL_AIRMONITORCOORDINATESINFO[80] PROGMEM = "Współrzędne geograficzne miernika(można sprawdzić {LATLONG_LINK})"; -char PL_INTL_AIRMONITORLATITUDE[32] PROGMEM = "Szerokość(latitude)"; -char PL_INTL_AIRMONITORLONGITUDE[32] PROGMEM = "Długość(longitude)"; - -char PL_INTL_THINGSPEAKSENDING[64] PROGMEM = "Wysyłanie danych do serwisu {THINGSPEAK_LINK}"; -char PL_INTL_THINGSPEAKCHARTS[64] PROGMEM = "Wyświetlanie wykresów z serwisu ThingSpeak"; -char PL_INTL_THINGSPEAK_WRITE_API_KEY[32] PROGMEM = "ThingSpeak Write API Key"; -char PL_INTL_THINGSPEAKCHANNELID[32] PROGMEM = "ThingSpeak Channel ID"; -char PL_INTL_THINGSPEAK_READ_API_KEY[32] PROGMEM = "ThingSpeak Read API Key"; - -char PL_INTL_INFLUXDBSENDING[64] PROGMEM = "Wysyłanie danych do InfluxDB"; -char PL_INTL_INFLUXDBVERSION[32] PROGMEM = "Wersja InfluxDB"; -char PL_INTL_INFLUXDBSERVER[64] PROGMEM = "Adres bazy danych InfluxDB"; -char PL_INTL_INFLUXDBPORT[32] PROGMEM = "Port InfluxDB"; -char PL_INTL_INFLUXDBNAME[32] PROGMEM = "Nazwa bazy danych"; -char PL_INTL_INFLUXDBUSER[32] PROGMEM = "Użytkownik bazy danych"; -char PL_INTL_INFLUXDBPASSWD[32] PROGMEM = "Hasło do bazy danych"; -char PL_INTL_INFLUXDBORG[32] PROGMEM = "Organizacja"; -char PL_INTL_INFLUXDBBUCKET[32] PROGMEM = "Bucket"; -char PL_INTL_INFLUXDBTOKEN[32] PROGMEM = "Token"; - -char PL_INTL_CONFIG_ADV_MQTT[32] PROGMEM = "Ustawienia MQTT"; -char PL_INTL_MQTTSENDING[64] PROGMEM = "Wysyłanie danych poprzez MQTT"; -char PL_INTL_MQTTSERVER[32] PROGMEM = "Adres serwera MQTT"; -char PL_INTL_MQTTPORT[32] PROGMEM = "Port MQTT"; -char PL_INTL_MQTTUSER[32] PROGMEM = "Użytkownik MQTT"; -char PL_INTL_MQTTPASSWD[32] PROGMEM = "Hasło MQTT"; - -char PL_INTL_MQTT_IP_IN_TOPIC[32] PROGMEM = "Dodać Adres IP"; -char PL_INTL_MQTT_DEVICENAME_IN_TOPIC[32] PROGMEM = "Dodać Nazwę urządzenia"; +char PL_INTL_AIRMONITORCHARTS[48] PROGMEM = "Wyświetlanie wykresów z serwisu AirMonitor"; +char PL_INTL_AIRMONITORCOORDINATESINFO[74] PROGMEM = "Współrzędne geograficzne miernika(można sprawdzić {LATLONG_LINK})"; +char PL_INTL_AIRMONITORLATITUDE[24] PROGMEM = "Szerokość(latitude)"; +char PL_INTL_AIRMONITORLONGITUDE[24] PROGMEM = "Długość(longitude)"; + +char PL_INTL_THINGSPEAKSENDING[50] PROGMEM = "Wysyłanie danych do serwisu {THINGSPEAK_LINK}"; +char PL_INTL_THINGSPEAKCHARTS[48] PROGMEM = "Wyświetlanie wykresów z serwisu ThingSpeak"; +char PL_INTL_THINGSPEAK_WRITE_API_KEY[28] PROGMEM = "ThingSpeak Write API Key"; +char PL_INTL_THINGSPEAKCHANNELID[24] PROGMEM = "ThingSpeak Channel ID"; +char PL_INTL_THINGSPEAK_READ_API_KEY[28] PROGMEM = "ThingSpeak Read API Key"; + +char PL_INTL_INFLUXDBSENDING[32] PROGMEM = "Wysyłanie danych do InfluxDB"; +char PL_INTL_INFLUXDBVERSION[18] PROGMEM = "Wersja InfluxDB"; +char PL_INTL_INFLUXDBSERVER[30] PROGMEM = "Adres bazy danych InfluxDB"; +char PL_INTL_INFLUXDBPORT[16] PROGMEM = "Port InfluxDB"; +char PL_INTL_INFLUXDBNAME[24] PROGMEM = "Nazwa bazy danych"; +char PL_INTL_INFLUXDBUSER[28] PROGMEM = "Użytkownik bazy danych"; +char PL_INTL_INFLUXDBPASSWD[24] PROGMEM = "Hasło do bazy danych"; +char PL_INTL_INFLUXDBORG[16] PROGMEM = "Organizacja"; +char PL_INTL_INFLUXDBBUCKET[10] PROGMEM = "Bucket"; +char PL_INTL_INFLUXDBTOKEN[8] PROGMEM = "Token"; + +char PL_INTL_CONFIG_ADV_MQTT[22] PROGMEM = "Ustawienia MQTT"; +char PL_INTL_MQTTSENDING[34] PROGMEM = "Wysyłanie danych poprzez MQTT"; +char PL_INTL_MQTTSERVER[22] PROGMEM = "Adres serwera MQTT"; +char PL_INTL_MQTTPORT[12] PROGMEM = "Port MQTT"; +char PL_INTL_MQTTUSER[20] PROGMEM = "Użytkownik MQTT"; +char PL_INTL_MQTTPASSWD[16] PROGMEM = "Hasło MQTT"; + +char PL_INTL_MQTT_IP_IN_TOPIC[22] PROGMEM = "Dodać Adres IP"; +char PL_INTL_MQTT_DEVICENAME_IN_TOPIC[30] PROGMEM = "Dodać Nazwę urządzenia"; char PL_INTL_MQTT_TOPIC_INFO[256] PROGMEM = "Poniżej możesz sformatować sposób w jaki będą wysyłane dane MQTT. Masz możliwość dodania 'Adresu IP' oraz 'Nazwy urządzenia' na początku. Środkową część możesz zdefiniować samemu dla każdej z wartości mierzonych przez urządzenie."; +char PL_INTL_MQTT_SLASH_AT_THE_BEGINNING[40] PROGMEM = "Dodać '/' na początku"; +char PL_INTL_MQTT_SLASH_AT_THE_END[36] PROGMEM = "Dodać '/' na końcu"; -char PL_INTL_AQIECOSENDING[128] PROGMEM = "Wysyłanie danych do aqi.eco"; +char PL_INTL_AQIECOSENDING[100] PROGMEM = "Wysyłanie danych do aqi.eco"; +char PL_INTL_AQIECOSERVER[26] PROGMEM = "Adres serwera aqi.eco"; +char PL_INTL_AQIECOPATH[20] PROGMEM = "Ścieżka aqi.eco"; -char PL_INTL_AQIECOSERVER[32] PROGMEM = "Adres serwera aqi.eco"; -char PL_INTL_AQIECOPATH[32] PROGMEM = "Ścieżka aqi.eco"; +char PL_INTL_CALIBMETHOD[22] PROGMEM = "Sposób kalibracji"; +char PL_INTL_CALIB1[30] PROGMEM = "Zmienna kalibracyjna calib1"; +char PL_INTL_CALIB2[30] PROGMEM = "Zmienna kalibracyjna calib2"; +char PL_INTL_SOFTWATEVERSION[24] PROGMEM = "Wersja oprogramowania"; -char PL_INTL_CALIBMETHOD[32] PROGMEM = "Sposób kalibracji"; -char PL_INTL_CALIB1[32] PROGMEM = "Zmienna kalibracyjna calib1"; -char PL_INTL_CALIB2[32] PROGMEM = "Zmienna kalibracyjna calib2"; -char PL_INTL_SOFTWATEVERSION[32] PROGMEM = "Wersja oprogramowania"; - -char PL_INTL_ERASEWIFICONFIG[32] PROGMEM = "Zapomnij sieć WiFi"; +char PL_INTL_ERASEWIFICONFIG[22] PROGMEM = "Zapomnij sieć WiFi"; char PL_INTL_RESTORESETTINGS[32] PROGMEM = "Przywróć ustawienia domyślne"; -char PL_INTL_SAVE[16] PROGMEM = "Zapisz"; -char PL_INTL_YES[16] PROGMEM = "Tak"; -char PL_INTL_NO[16] PROGMEM = "Nie"; -char PL_INTL_WITHOUTSENSOR[32] PROGMEM = "Bez miernika"; -char PL_INTL_WITHOUTCALIBRATION[32] PROGMEM = "Bez kalibracji"; -char PL_INTL_AUTOMATICCALIBRATION[32] PROGMEM = "Automatyczna kalibracja"; - -char PL_INTL_INTL_EN[16] PROGMEM = "angielski"; -char PL_INTL_INTL_PL[16] PROGMEM = "polski"; - -char PL_INTL_FWUPDATEAVALIBLE[64] PROGMEM = "Dostępna aktualizacja oprogramowania!"; -char PL_INTL_AUTOUPDATEON[32] PROGMEM = "Automatyczne Aktualizacje"; -char PL_INTL_MANUALUPDATEBUTTON[32] PROGMEM = "Ręczna Aktualizacja"; +char PL_INTL_SAVE[8] PROGMEM = "Zapisz"; +char PL_INTL_YES[6] PROGMEM = "Tak"; +char PL_INTL_NO[6] PROGMEM = "Nie"; +char PL_INTL_WITHOUTSENSOR[16] PROGMEM = "Bez miernika"; +char PL_INTL_WITHOUTCALIBRATION[22] PROGMEM = "Bez kalibracji"; +char PL_INTL_AUTOMATICCALIBRATION[26] PROGMEM = "Automatyczna kalibracja"; + +char PL_INTL_INTL_EN[12] PROGMEM = "angielski"; +char PL_INTL_INTL_PL[8] PROGMEM = "polski"; + +char PL_INTL_FWUPDATEAVALIBLE[42] PROGMEM = "Dostępna aktualizacja oprogramowania!"; +char PL_INTL_AUTOUPDATEON[28] PROGMEM = "Automatyczne Aktualizacje"; +char PL_INTL_MANUALUPDATEBUTTON[22] PROGMEM = "Ręczna Aktualizacja"; char PL_INTL_FWUPDATEBUTTON[32] PROGMEM = "Automatycznie - tylko tym razem"; -char PL_INTL_AUTOUPDATEONBUTTON[64] PROGMEM = "Automatycznie - zapamiętaj wybór"; -char PL_INTL_AUTOUPDATEWARNING[672] PROGMEM = "Automatyczne aktualizacje wykonywane są przez nieszyfrowane połaczenie(HTTP, a nie HTTPS). Może to być niebezpieczne i umożliwić przechwycenie pakietów oraz włamanie na urządzenie. Możesz skorzystać z Automatycznej aktualizacji jednorazowo, klikając przycisk \"{TEXT_FWUPDATEBUTTON}\", lub włączyć Automatyczne aktualizacje na stałe. W każdej chwili możesz zmienić swoje zdanie i wyłączyć Automatyczne Aktualizacje w Konfiguracji. Po wybraniu \"{TEXT_FWUPDATEBUTTON}\" lub włączeniu automatycznych aktualizacji urządzenie zapisze bieżącą konfigurację i uruchomi się ponownie. Może to potrwać kilkanaście sekund."; +char PL_INTL_AUTOUPDATEONBUTTON[36] PROGMEM = "Automatycznie - zapamiętaj wybór"; +char PL_INTL_AUTOUPDATEWARNING[650] PROGMEM = "Automatyczne aktualizacje wykonywane są przez nieszyfrowane połaczenie(HTTP, a nie HTTPS). Może to być niebezpieczne i umożliwić przechwycenie pakietów oraz włamanie na urządzenie. Możesz skorzystać z Automatycznej aktualizacji jednorazowo, klikając przycisk \"{TEXT_FWUPDATEBUTTON}\", lub włączyć Automatyczne aktualizacje na stałe. W każdej chwili możesz zmienić swoje zdanie i wyłączyć Automatyczne Aktualizacje w Konfiguracji. Po wybraniu \"{TEXT_FWUPDATEBUTTON}\" lub włączeniu automatycznych aktualizacji urządzenie zapisze bieżącą konfigurację i uruchomi się ponownie. Może to potrwać kilkanaście sekund."; char PL_INTL_UPDATEPAGEAUTOUPDATEWARNING[192] PROGMEM = "Automatyczne aktualizacje wykonywane są przez nieszyfrowane połaczenie(HTTP, a nie HTTPS). Może to być niebezpieczne i umożliwić przechwycenie pakietów oraz włamanie na urządzenie."; -char PL_INTL_SELECTUPDATEFILE[32] PROGMEM = "Wybierz plik .bin"; -char PL_INTL_SUBMITUPDATE[16] PROGMEM = "Update!"; -char PL_INTL_CURRENTSOFTVERSION[64] PROGMEM = "Używana wersja oprogramowania"; -char PL_INTL_SERVERSOFTWAREVERSION[64] PROGMEM = "Najnowsza dostępna wersja oprogramowania"; -char PL_INTL_LATESTAVAILABLESOFT[96] PROGMEM = "Najnowszą wersję oprogramowania znajdziesz zawsze {SMOGOMIERZRELEASES_LINK}."; +char PL_INTL_SELECTUPDATEFILE[20] PROGMEM = "Wybierz plik .bin"; +char PL_INTL_SUBMITUPDATE[10] PROGMEM = "Update!"; +char PL_INTL_CURRENTSOFTVERSION[40] PROGMEM = "Używana wersja oprogramowania"; +char PL_INTL_SERVERSOFTWAREVERSION[46] PROGMEM = "Najnowsza dostępna wersja oprogramowania"; +char PL_INTL_LATESTAVAILABLESOFT[82] PROGMEM = "Najnowszą wersję oprogramowania znajdziesz zawsze {SMOGOMIERZRELEASES_LINK}."; -char PL_INTL_HERE[16] PROGMEM = "tutaj"; -char PL_INTL_THEFORM[16] PROGMEM = "formularz"; +char PL_INTL_HERE[8] PROGMEM = "tutaj"; +char PL_INTL_THEFORM[12] PROGMEM = "formularz"; -char PL_INTL_CONNECTEDWIFI[32] PROGMEM = "Połączony z WiFi(SSID)"; -char PL_INTL_WIFIRSSI[32] PROGMEM = "Siła sygnału WiFi(RSSI)"; -char PL_INTL_WIFIQUALITY[32] PROGMEM = "Jakość sygnału WiFi"; \ No newline at end of file +char PL_INTL_CONNECTEDWIFI[28] PROGMEM = "Połączony z WiFi(SSID)"; +char PL_INTL_WIFIRSSI[28] PROGMEM = "Siła sygnału WiFi(RSSI)"; +char PL_INTL_WIFIQUALITY[26] PROGMEM = "Jakość sygnału WiFi"; \ No newline at end of file diff --git a/src/luftdaten.cpp b/src/luftdaten.cpp index 39b3e8a..50b0613 100644 --- a/src/luftdaten.cpp +++ b/src/luftdaten.cpp @@ -14,22 +14,22 @@ String luftdatenChipId = String(ESP.getChipId()); String luftdatenChipId = String((uint32_t)(ESP.getEfuseMac())); #endif -const char *luftdatenAPIHOST = "api.luftdaten.info"; -const char *luftdatenAPIURL = "/v1/push-sensor-data/"; +const char *luftdatenAPIHOST PROGMEM = "api.luftdaten.info"; +const char *luftdatenAPIURL PROGMEM = "/v1/push-sensor-data/"; const uint16_t luftdatenAPIPort = 80; -const char *madavideAPIHOST = "api-rrd.madavi.de"; -const char *madavideAPIURL = "/data.php"; +const char *madavideAPIHOST PROGMEM = "api-rrd.madavi.de"; +const char *madavideAPIURL PROGMEM = "/data.php"; const uint16_t madavideAPIPort = 80; // Luftdaten.info - https://luftdaten.info void sendDUSTLuftdatenJson(JsonObject& json) { WiFiClient client; - Serial.print("\nconnecting to "); + Serial.print(F("\nconnecting to ")); Serial.println(luftdatenAPIHOST); if (!client.connect(luftdatenAPIHOST, luftdatenAPIPort)) { - Serial.println("connection failed"); + Serial.println(F("connection failed")); delay(1000); return; } @@ -52,12 +52,12 @@ void sendDUSTLuftdatenJson(JsonObject& json) { Serial.println(); Serial.println("POST " + String(luftdatenAPIURL) + " HTTP/1.1"); Serial.println("Host: " + String(luftdatenAPIHOST)); - Serial.println("Content-Type: application/json"); - Serial.println("X-PIN: 1"); + Serial.println(F("Content-Type: application/json")); + Serial.println(F("X-PIN: 1")); Serial.println("X-Sensor: smogomierz-" + luftdatenChipId); - Serial.print("Content-Length: "); + Serial.print(F("Content-Length: ")); Serial.println(measureJson(json)); - Serial.println("Connection: close"); + Serial.println(F("Connection: close")); Serial.println(); serializeJsonPretty(json, Serial); Serial.println("\n"); @@ -68,11 +68,11 @@ void sendDUSTLuftdatenJson(JsonObject& json) { void sendTHPLuftdatenJson(JsonObject& json) { WiFiClient client; - Serial.print("\nconnecting to "); + Serial.print(F("\nconnecting to ")); Serial.println(luftdatenAPIHOST); if (!client.connect(luftdatenAPIHOST, luftdatenAPIPort)) { - Serial.println("connection failed"); + Serial.println(F("connection failed")); delay(1000); return; } @@ -90,7 +90,10 @@ void sendTHPLuftdatenJson(JsonObject& json) { client.println("X-PIN: 7"); } else if (!strcmp(THP_MODEL, "SHT1x")) { client.println("X-PIN: 12"); + } else if (!strcmp(THP_MODEL, "DS18B20")) { + client.println("X-PIN: 13"); } + client.println("X-Sensor: smogomierz-" + luftdatenChipId); client.print("Content-Length: "); client.println(measureJson(json)); @@ -106,22 +109,24 @@ void sendTHPLuftdatenJson(JsonObject& json) { Serial.println(); Serial.println("POST " + String(luftdatenAPIURL) + " HTTP/1.1"); Serial.println("Host: " + String(luftdatenAPIHOST)); - Serial.println("Content-Type: application/json"); + Serial.println(F("Content-Type: application/json")); if (!strcmp(THP_MODEL, "BME280")) { - Serial.println("X-PIN: 11"); + Serial.println(F("X-PIN: 11")); } else if (!strcmp(THP_MODEL, "BMP280")) { - Serial.println("X-PIN: 3"); + Serial.println(F("X-PIN: 3")); } else if (!strcmp(THP_MODEL, "HTU21")) { - Serial.println("X-PIN: 7"); + Serial.println(F("X-PIN: 7")); } else if (!strcmp(THP_MODEL, "DHT22")) { - Serial.println("X-PIN: 7"); + Serial.println(F("X-PIN: 7")); } else if (!strcmp(THP_MODEL, "SHT1x")) { - Serial.println("X-PIN: 12"); + Serial.println(F("X-PIN: 12")); + } else if (!strcmp(THP_MODEL, "DS18B20")) { + Serial.println(F("X-PIN: 13")); } Serial.println("X-Sensor: smogomierz-" + luftdatenChipId); - Serial.print("Content-Length: "); + Serial.print(F("Content-Length: ")); Serial.println(measureJson(json)); - Serial.println("Connection: close"); + Serial.println(F("Connection: close")); Serial.println(); serializeJsonPretty(json, Serial); Serial.println("\n"); @@ -202,6 +207,10 @@ void sendTHPDatatoLuftdaten(float currentTemperature, float currentPressure, flo JsonObject humidity = sensordatavalues.createNestedObject(); humidity["value_type"] = "humidity"; humidity["value"] = String(currentHumidity); + } else if (!strcmp(THP_MODEL, "DS18B20")) { + JsonObject temperature = sensordatavalues.createNestedObject(); + temperature["value_type"] = "temperature"; + temperature["value"] = String(currentTemperature); } sendTHPLuftdatenJson(json); } @@ -210,11 +219,11 @@ void sendTHPDatatoLuftdaten(float currentTemperature, float currentPressure, flo // Madavi.de - https://www.madavi.de/sensor/graph.php void sendDUSTMadavideJson(JsonObject& json) { WiFiClient client; - Serial.print("\nconnecting to "); + Serial.print(F("\nconnecting to ")); Serial.println(madavideAPIHOST); if (!client.connect(madavideAPIHOST, madavideAPIPort)) { - Serial.println("connection failed"); + Serial.println(F("connection failed")); delay(1000); return; } @@ -238,12 +247,12 @@ void sendDUSTMadavideJson(JsonObject& json) { Serial.println(); Serial.println("POST " + String(madavideAPIURL) + " HTTP/1.1"); Serial.println("Host: " + String(madavideAPIHOST)); - Serial.println("Content-Type: application/json"); - Serial.println("X-PIN: 1"); + Serial.println(F("Content-Type: application/json")); + Serial.println(F("X-PIN: 1")); Serial.println("X-Sensor: smogomierz-" + luftdatenChipId); - Serial.print("Content-Length: "); + Serial.print(F("Content-Length: ")); Serial.println(measureJson(json)); - Serial.println("Connection: close"); + Serial.println(F("Connection: close")); Serial.println(); serializeJsonPretty(json, Serial); Serial.println("\n"); @@ -254,7 +263,7 @@ void sendDUSTMadavideJson(JsonObject& json) { void sendTHPMadavideJson(JsonObject& json) { WiFiClient client; - Serial.print("\nconnecting to "); + Serial.print(F("\nconnecting to ")); Serial.println(madavideAPIHOST); if (!client.connect(madavideAPIHOST, madavideAPIPort)) { @@ -276,6 +285,8 @@ void sendTHPMadavideJson(JsonObject& json) { client.println("X-PIN: 7"); } else if (!strcmp(THP_MODEL, "SHT1x")) { client.println("X-PIN: 12"); + } else if (!strcmp(THP_MODEL, "DS18B20")) { + client.println("X-PIN: 13"); } client.println("X-Sensor: smogomierz-" + luftdatenChipId); client.print("Content-Length: "); @@ -292,22 +303,24 @@ void sendTHPMadavideJson(JsonObject& json) { Serial.println(); Serial.println("POST " + String(madavideAPIURL) + " HTTP/1.1"); Serial.println("Host: " + String(madavideAPIHOST)); - Serial.println("Content-Type: application/json"); + Serial.println(F("Content-Type: application/json")); if (!strcmp(THP_MODEL, "BME280")) { - Serial.println("X-PIN: 11"); + Serial.println(F("X-PIN: 11")); } else if (!strcmp(THP_MODEL, "BMP280")) { - Serial.println("X-PIN: 3"); + Serial.println(F("X-PIN: 3")); } else if (!strcmp(THP_MODEL, "HTU21")) { - Serial.println("X-PIN: 7"); + Serial.println(F("X-PIN: 7")); } else if (!strcmp(THP_MODEL, "DHT22")) { - Serial.println("X-PIN: 7"); + Serial.println(F("X-PIN: 7")); } else if (!strcmp(THP_MODEL, "SHT1x")) { - Serial.println("X-PIN: 12"); + Serial.println(F("X-PIN: 12")); + } else if (!strcmp(THP_MODEL, "DS18B20")) { + Serial.println(F("X-PIN: 13")); } Serial.println("X-Sensor: smogomierz-" + luftdatenChipId); - Serial.print("Content-Length: "); + Serial.print(F("Content-Length: ")); Serial.println(measureJson(json)); - Serial.println("Connection: close"); + Serial.println(F("Connection: close")); Serial.println(); serializeJsonPretty(json, Serial); Serial.println("\n"); @@ -395,6 +408,10 @@ void sendTHPDatatoMadavide(float currentTemperature, float currentPressure, floa JsonObject humidity = sensordatavalues.createNestedObject(); humidity["value_type"] = "humidity"; humidity["value"] = String(currentHumidity); + } else if (!strcmp(THP_MODEL, "DS18B20")) { + JsonObject temperature = sensordatavalues.createNestedObject(); + temperature["value_type"] = "temperature"; + temperature["value"] = String(currentTemperature); } sendTHPMadavideJson(json); } diff --git a/src/smoglist.cpp b/src/smoglist.cpp index eeb60d9..11ec1f2 100755 --- a/src/smoglist.cpp +++ b/src/smoglist.cpp @@ -15,11 +15,11 @@ void sendSmoglistJson(JsonObject& json) { if(WiFi.status()== WL_CONNECTED){ //Check WiFi connection status WiFiClient client; client.setTimeout(12000); - Serial.print("\nconnecting to "); + Serial.print(F("\nconnecting to ")); Serial.println(SmoglistServerName); if (!client.connect(SmoglistServerName, SmoglistPort)) { - Serial.println("connection failed"); + Serial.println(F("connection failed")); //Serial.println("wait 3 sec...\n"); //delay(3000); return; @@ -38,7 +38,7 @@ void sendSmoglistJson(JsonObject& json) { unsigned long timeout = millis(); while (client.available() == 0) { if (millis() - timeout > 5000) { - Serial.println("\n\t>>> Client Timeout!\n"); + Serial.println(F("\n\t>>> Client Timeout!\n")); client.stop(); return; } @@ -63,38 +63,38 @@ void sendSmoglistData(float currentTemperature, float currentPressure, float cur #elif defined ARDUINO_ARCH_ESP32 json["CHIPID"] = "Smogly-" + String((uint32_t)(ESP.getEfuseMac())); #endif - json["SOFTWAREVERSION"] = SOFTWAREVERSION; - json["HARDWAREVERSION"] = HARDWAREVERSION; // "1.0 - ESP8266" or "2.0 - ESP32" - json["PMSENSORVERSION"] = PMSENSORVERSION; // PMS, SDS, HPMA115S0 ora SPS30 + json["SOFTWAREVERSION"] = String(SOFTWAREVERSION); + json["HARDWAREVERSION"] = String(HARDWAREVERSION); // "1.0 - ESP8266" or "2.0 - ESP32" + json["PMSENSORVERSION"] = String(PMSENSORVERSION); // PMS, SDS, HPMA115S0 ora SPS30 - json["FREQUENTMEASUREMENT"] = FREQUENTMEASUREMENT; // frequent measurements - True or False - json["DISPLAY_PM1"] = DISPLAY_PM1; // True or False + json["FREQUENTMEASUREMENT"] = int(FREQUENTMEASUREMENT); // frequent measurements - True or False + json["DISPLAY_PM1"] = bool(DISPLAY_PM1); // True or False - json["DUST_TIME"] = DUST_TIME; // frequency of PM measurements; default - 1 - json["NUMBEROFMEASUREMENTS"] = NUMBEROFMEASUREMENTS; // default - 10 + json["DUST_TIME"] = int(DUST_TIME); // frequency of PM measurements; default - 1 + json["NUMBEROFMEASUREMENTS"] = int(NUMBEROFMEASUREMENTS); // default - 10 - json["SENDING_FREQUENCY"] = SENDING_FREQUENCY; // default - 2 - json["SENDING_DB_FREQUENCY"] = SENDING_DB_FREQUENCY; // default - 2 + json["SENDING_FREQUENCY"] = int(SENDING_FREQUENCY); // default - 2 + json["SENDING_DB_FREQUENCY"] = int(SENDING_DB_FREQUENCY); // default - 2 - json["LUFTDATEN_ON"] = LUFTDATEN_ON; // True or False + json["LUFTDATEN_ON"] = bool(LUFTDATEN_ON); // True or False - json["AIRMONITOR_ON"] = AIRMONITOR_ON; // True or False - json["AIRMONITOR_GRAPH_ON"] = AIRMONITOR_GRAPH_ON; // True or False + json["AIRMONITOR_ON"] = bool(AIRMONITOR_ON); // True or False + json["AIRMONITOR_GRAPH_ON"] = bool(AIRMONITOR_GRAPH_ON); // True or False - json["THINGSPEAK_ON"] = THINGSPEAK_ON; // True or False - json["THINGSPEAK_GRAPH_ON"] = THINGSPEAK_GRAPH_ON; // True or False + json["THINGSPEAK_ON"] = bool(THINGSPEAK_ON); // True or False + json["THINGSPEAK_GRAPH_ON"] = bool(THINGSPEAK_GRAPH_ON); // True or False - json["INFLUXDB_ON"] = INFLUXDB_ON; // True or False - json["MQTT_ON"] = MQTT_ON; // True or False + json["INFLUXDB_ON"] = bool(INFLUXDB_ON); // True or False + json["MQTT_ON"] = bool(MQTT_ON); // True or False - json["DEEPSLEEP_ON"] = DEEPSLEEP_ON; // True or False - json["AUTOUPDATE_ON"] = AUTOUPDATE_ON; // True or False - json["MODEL"] = MODEL; // default "white" - automatic calibration, "red" - without calibration + json["DEEPSLEEP_ON"] = bool(DEEPSLEEP_ON); // True or False + json["AUTOUPDATE_ON"] = bool(AUTOUPDATE_ON); // True or False + json["MODEL"] = String(MODEL); // default "white" - automatic calibration, "red" - without calibration json["LATITUDE"] = String(LATITUDE); // default - 50.2639 json["LONGITUDE"] = String(LONGITUDE); // default - 18.9957 - json["MYALTITUDE"] = MYALTITUDE; // int; default - 271.00 + json["MYALTITUDE"] = int(MYALTITUDE); // int; default - 271.00 //PM data if (!strcmp(DUST_MODEL, "PMS7003")) { @@ -112,10 +112,10 @@ void sendSmoglistData(float currentTemperature, float currentPressure, float cur if (!strcmp(DUST_MODEL, "Non")) { json["DUST_MODEL"] = "Non"; } - json["PM1"] = averagePM1; - json["PM25"] = averagePM25; - json["PM4"] = averagePM4; - json["PM10"] = averagePM10; + json["PM1"] = int(averagePM1); + json["PM25"] = int(averagePM25); + json["PM4"] = int(averagePM4); + json["PM10"] = int(averagePM10); // Temp/Humi/Pressure data if (strcmp(THP_MODEL, "Non")) { @@ -129,10 +129,12 @@ void sendSmoglistData(float currentTemperature, float currentPressure, float cur json["THP_MODEL"] = "DHT22"; } else if (!strcmp(THP_MODEL, "SHT1x")) { json["THP_MODEL"] = "SHT1x"; + } else if (!strcmp(THP_MODEL, "DS18B20")) { + json["THP_MODEL"] = "DS18B20"; } - json["Temperature"] = currentTemperature; - json["Humidity"] = currentHumidity; - json["Pressure"] = currentPressure; + json["Temperature"] = float(currentTemperature); + json["Humidity"] = float(currentHumidity); + json["Pressure"] = float(currentPressure); } else { json["THP_MODEL"] = "Non"; json["Temperature"] = 0; diff --git a/src/spiffs.cpp b/src/spiffs.cpp index f98f8e4..c825c50 100644 --- a/src/spiffs.cpp +++ b/src/spiffs.cpp @@ -11,9 +11,9 @@ #ifdef ARDUINO_ARCH_ESP8266 const int capacity = 6144; #elif defined ARDUINO_ARCH_ESP32 - const int capacity = 4096; + const int capacity = 4608; #endif - + void _safeCpy(char* dest, const JsonVariant &obj, const char* dflt = "", int CharSize = 255) { const char* val = obj.as(); if (val) { @@ -29,15 +29,15 @@ bool loadConfig() { #elif defined ARDUINO_ARCH_ESP32 File configFile = SPIFFS.open("/config.json"); #endif - + if (!configFile) { - Serial.println("Failed to open config file"); + Serial.println(F("Failed to open config file")); return false; } size_t size = configFile.size(); if (size > 2048) { - Serial.println("Config file size is too large"); + Serial.println(F("Config file size is too large")); return false; } @@ -49,12 +49,18 @@ bool loadConfig() { // use configFile.readString instead. configFile.readBytes(buf.get(), size); +#ifdef ARDUINO_ARCH_ESP8266 StaticJsonDocument jsonBuffer; + //DynamicJsonDocument jsonBuffer(ESP.getMaxFreeBlockSize()); +#elif defined ARDUINO_ARCH_ESP32 + //StaticJsonDocument jsonBuffer; + DynamicJsonDocument jsonBuffer(ESP.getMaxAllocHeap()); +#endif deserializeJson(jsonBuffer, buf.get()); JsonObject json = jsonBuffer.as(); if (json.isNull()) { - Serial.println("Failed to parse config file"); + Serial.println(F("Failed to parse config file")); return false; } @@ -70,6 +76,26 @@ bool loadConfig() { DISPLAY_PM1 = json["DISPLAY_PM1"]; FREQUENTMEASUREMENT = json["FREQUENTMEASUREMENT"]; + SECOND_THP = json["SECOND_THP"]; + + FIRST_THP_SDA = json["FIRST_THP_SDA"]; + FIRST_THP_SCL = json["FIRST_THP_SCL"]; + + SECOND_THP_SDA = json["SECOND_THP_SDA"]; + SECOND_THP_SCL = json["SECOND_THP_SCL"]; + + DUST_TX = json["DUST_TX"]; + DUST_RX = json["DUST_RX"]; + + _safeCpy(CONFIG_FIRST_THP_SDA, json["CONFIG_FIRST_THP_SDA"], "D3", 8); + _safeCpy(CONFIG_FIRST_THP_SCL, json["CONFIG_FIRST_THP_SCL"], "D4", 8); + + _safeCpy(CONFIG_SECOND_THP_SDA, json["CONFIG_SECOND_THP_SDA"], "D5", 8); + _safeCpy(CONFIG_SECOND_THP_SCL, json["CONFIG_SECOND_THP_SCL"], "D6", 8); + + _safeCpy(CONFIG_DUST_TX, json["CONFIG_DUST_TX"], "D1", 8); + _safeCpy(CONFIG_DUST_RX, json["CONFIG_DUST_RX"], "D2", 8); + DUST_TIME = json["DUST_TIME"]; NUMBEROFMEASUREMENTS = json["NUMBEROFMEASUREMENTS"]; @@ -91,24 +117,25 @@ bool loadConfig() { INFLUXDB_ON = json["INFLUXDB_ON"]; _safeCpy(INFLUXDB_VERSION, json["INFLUXDB_VERSION"], "1", 16); _safeCpy(INFLUXDB_HOST, json["INFLUXDB_HOST"], "host", 128); - INFLUXDB_PORT = json["INFLUXDB_PORT"]; + INFLUXDB_PORT = json["INFLUXDB_PORT"]; _safeCpy(INFLUXDB_DATABASE, json["INFLUXDB_DATABASE"], "mydb", 64); _safeCpy(INFLUXDB_USER, json["INFLUXDB_USER"], "user", 64); _safeCpy(INFLUXDB_PASSWORD, json["INFLUXDB_PASSWORD"], "password", 64); - _safeCpy(INFLUXDB_ORG, json["INFLUXDB_ORG"], "myOrg", 64); _safeCpy(INFLUXDB_BUCKET, json["INFLUXDB_BUCKET"], "myBucket", 64); _safeCpy(INFLUXDB_TOKEN, json["INFLUXDB_TOKEN"], "myToken", 64); - + MQTT_ON = json["MQTT_ON"]; _safeCpy(MQTT_HOST, json["MQTT_HOST"], "host", 128); - MQTT_PORT = json["MQTT_PORT"]; + MQTT_PORT = json["MQTT_PORT"]; _safeCpy(MQTT_USER, json["MQTT_USER"], "user", 64); _safeCpy(MQTT_PASSWORD, json["MQTT_PASSWORD"], "password", 64); - + MQTT_IP_IN_TOPIC = json["MQTT_IP_IN_TOPIC"]; MQTT_DEVICENAME_IN_TOPIC = json["MQTT_DEVICENAME_IN_TOPIC"]; - + MQTT_SLASH_AT_THE_BEGINNING = json["MQTT_SLASH_AT_THE_BEGINNING"]; + MQTT_SLASH_AT_THE_END = json["MQTT_SLASH_AT_THE_END"]; + _safeCpy(MQTT_TOPIC_TEMP, json["MQTT_TOPIC_TEMP"], "MQTT_TOPIC_TEMP", 128); _safeCpy(MQTT_TOPIC_HUMI, json["MQTT_TOPIC_HUMI"], "MQTT_TOPIC_HUMI", 128); _safeCpy(MQTT_TOPIC_PRESS, json["MQTT_TOPIC_PRESS"], "MQTT_TOPIC_PRESS", 128); @@ -116,269 +143,324 @@ bool loadConfig() { _safeCpy(MQTT_TOPIC_PM25, json["MQTT_TOPIC_PM25"], "MQTT_TOPIC_PM25", 128); _safeCpy(MQTT_TOPIC_PM10, json["MQTT_TOPIC_PM10"], "MQTT_TOPIC_PM10", 128); _safeCpy(MQTT_TOPIC_AIRQUALITY, json["MQTT_TOPIC_AIRQUALITY"], "MQTT_TOPIC_AIRQUALITY", 128); - + AQI_ECO_ON = json["AQI_ECO_ON"]; _safeCpy(AQI_ECO_HOST, json["AQI_ECO_HOST"], "host", 128); _safeCpy(AQI_ECO_PATH, json["AQI_ECO_PATH"], "path", 64); - - AQI_ECO_ON = json["AQI_ECO_ON"]; - _safeCpy(AQI_ECO_HOST, json["AQI_ECO_HOST"], "host"); - _safeCpy(AQI_ECO_PATH, json["AQI_ECO_PATH"], "path"); - + SENDING_FREQUENCY = json["SENDING_FREQUENCY"]; SENDING_DB_FREQUENCY = json["SENDING_DB_FREQUENCY"]; DEEPSLEEP_ON = json["DEEPSLEEP_ON"]; DEBUG = json["DEBUG"]; AUTOUPDATE_ON = json["AUTOUPDATE_ON"]; - + CONFIG_AUTH = json["CONFIG_AUTH"]; - _safeCpy(CONFIG_USERNAME, json["CONFIG_USERNAME"], "admin", 256); + _safeCpy(CONFIG_USERNAME, json["CONFIG_USERNAME"], "admin", 64); _safeCpy(CONFIG_PASSWORD, json["CONFIG_PASSWORD"], "password", 256); - + _safeCpy(MODEL, json["MODEL"], "black", 32); // Real world application would store these values in some variables for // later use. if (DEBUG) { - Serial.print("Loaded DEVICENAME_AUTO: "); + Serial.print(F("Loaded DEVICENAME_AUTO: ")); Serial.println(DEVICENAME_AUTO); - Serial.print("Loaded DEVICENAME: "); + Serial.print(F("Loaded DEVICENAME: ")); Serial.println(DEVICENAME); - Serial.print("Loaded LANGUAGE: "); + Serial.print(F("Loaded LANGUAGE: ")); Serial.println(LANGUAGE); - Serial.print("Loaded SELECTED_LANGUAGE: "); + Serial.print(F("Loaded SELECTED_LANGUAGE: ")); Serial.println(SELECTED_LANGUAGE); - Serial.print("Loaded THP_MODEL: "); + Serial.print(F("Loaded THP_MODEL: ")); Serial.println(THP_MODEL); - Serial.print("Loaded DUST_MODEL: "); + Serial.print(F("Loaded DUST_MODEL: ")); Serial.println(DUST_MODEL); - Serial.print("Loaded DISPLAY_PM1: "); + Serial.print(F("Loaded DISPLAY_PM1: ")); Serial.println(DISPLAY_PM1); - Serial.print("Loaded FREQUENTMEASUREMENT: "); + Serial.print(F("Loaded FREQUENTMEASUREMENT: ")); Serial.println(FREQUENTMEASUREMENT); + + Serial.print(F("Loaded SECOND_THP: ")); + Serial.println(SECOND_THP); - Serial.print("Loaded DUST_TIME: "); + Serial.print(F("Loaded FIRST_THP_SDA: ")); + Serial.println(FIRST_THP_SDA); + Serial.print(F("Loaded FIRST_THP_SCL: ")); + Serial.println(FIRST_THP_SCL); + + Serial.print(F("Loaded SECOND_THP_SDA: ")); + Serial.println(SECOND_THP_SDA); + Serial.print(F("Loaded SECOND_THP_SCL: ")); + Serial.println(SECOND_THP_SCL); + + Serial.print(F("Loaded DUST_TX: ")); + Serial.println(DUST_TX); + Serial.print(F("Loaded DUST_RX: ")); + Serial.println(DUST_RX); + + Serial.print(F("Loaded CONFIG_FIRST_THP_SDA: ")); + Serial.println(CONFIG_FIRST_THP_SDA); + Serial.print(F("Loaded CONFIG_FIRST_THP_SCL: ")); + Serial.println(CONFIG_FIRST_THP_SCL); + + Serial.print(F("Loaded CONFIG_SECOND_THP_SDA: ")); + Serial.println(CONFIG_SECOND_THP_SDA); + Serial.print(F("Loaded CONFIG_SECOND_THP_SCL: ")); + Serial.println(CONFIG_SECOND_THP_SCL); + + Serial.print(F("Loaded CONFIG_DUST_TX: ")); + Serial.println(CONFIG_DUST_TX); + Serial.print(F("Loaded CONFIG_DUST_RX: ")); + Serial.println(CONFIG_DUST_RX); + + Serial.print(F("Loaded DUST_TIME: ")); Serial.println(DUST_TIME); - Serial.print("Loaded NUMBEROFMEASUREMENTS: "); + Serial.print(F("Loaded NUMBEROFMEASUREMENTS: ")); Serial.println(NUMBEROFMEASUREMENTS); - - Serial.print("Loaded LUFTDATEN_ON: "); + + Serial.print(F("Loaded LUFTDATEN_ON: ")); Serial.println(LUFTDATEN_ON); - Serial.print("Loaded SMOGLIST_ON: "); + Serial.print(F("Loaded SMOGLIST_ON: ")); Serial.println(SMOGLIST_ON); - - Serial.print("Loaded AIRMONITOR_ON: "); + + Serial.print(F("Loaded AIRMONITOR_ON: ")); Serial.println(AIRMONITOR_ON); - Serial.print("Loaded AIRMONITOR_GRAPH_ON: "); + Serial.print(F("Loaded AIRMONITOR_GRAPH_ON: ")); Serial.println(AIRMONITOR_GRAPH_ON); - Serial.print("Loaded LATITUDE: "); + Serial.print(F("Loaded LATITUDE: ")); Serial.println(LATITUDE); - Serial.print("Loaded LONGITUDE: "); + Serial.print(F("Loaded LONGITUDE: ")); Serial.println(LONGITUDE); - Serial.print("Loaded MYALTITUDE: "); + Serial.print(F("Loaded MYALTITUDE: ")); Serial.println(MYALTITUDE); - Serial.print("Loaded THINGSPEAK_ON: "); + Serial.print(F("Loaded THINGSPEAK_ON: ")); Serial.println(THINGSPEAK_ON); - Serial.print("Loaded THINGSPEAK_GRAPH_ON: "); + Serial.print(F("Loaded THINGSPEAK_GRAPH_ON: ")); Serial.println(THINGSPEAK_GRAPH_ON); - Serial.print("Loaded THINGSPEAK_API_KEY: "); + Serial.print(F("Loaded THINGSPEAK_API_KEY: ")); Serial.println(THINGSPEAK_API_KEY); - Serial.print("Loaded THINGSPEAK_CHANNEL_ID: "); + Serial.print(F("Loaded THINGSPEAK_CHANNEL_ID: ")); Serial.println(THINGSPEAK_CHANNEL_ID); - Serial.print("Loaded THINGSPEAK_READ_API_KEY: "); + Serial.print(F("Loaded THINGSPEAK_READ_API_KEY: ")); Serial.println(THINGSPEAK_READ_API_KEY); - Serial.print("Loaded INFLUXDB_ON: "); + Serial.print(F("Loaded INFLUXDB_ON: ")); Serial.println(INFLUXDB_ON); - Serial.print("Loaded INFLUXDB_VERSION: "); + Serial.print(F("Loaded INFLUXDB_VERSION: ")); Serial.println(INFLUXDB_VERSION); - Serial.print("Loaded INFLUXDB_HOST: "); + Serial.print(F("Loaded INFLUXDB_HOST: ")); Serial.println(INFLUXDB_HOST); - Serial.print("Loaded INFLUXDB_PORT: "); + Serial.print(F("Loaded INFLUXDB_PORT: ")); Serial.println(INFLUXDB_PORT); - Serial.print("Loaded INFLUXDB_DATABASE: "); + Serial.print(F("Loaded INFLUXDB_DATABASE: ")); Serial.println(INFLUXDB_DATABASE); - Serial.print("Loaded INFLUXDB_USER: "); + Serial.print(F("Loaded INFLUXDB_USER: ")); Serial.println(INFLUXDB_USER); - Serial.print("Loaded INFLUXDB_PASSWORD: "); + Serial.print(F("Loaded INFLUXDB_PASSWORD: ")); Serial.println(INFLUXDB_PASSWORD); - Serial.print("Loaded INFLUXDB_ORG: "); + Serial.print(F("Loaded INFLUXDB_ORG: ")); Serial.println(INFLUXDB_ORG); - Serial.print("Loaded INFLUXDB_BUCKET: "); + Serial.print(F("Loaded INFLUXDB_BUCKET: ")); Serial.println(INFLUXDB_BUCKET); - Serial.print("Loaded INFLUXDB_TOKEN: "); + Serial.print(F("Loaded INFLUXDB_TOKEN: ")); Serial.println(INFLUXDB_TOKEN); - - Serial.print("Loaded MQTT_ON: "); + + Serial.print(F("Loaded MQTT_ON: ")); Serial.println(MQTT_ON); - Serial.print("Loaded MQTT_HOST: "); + Serial.print(F("Loaded MQTT_HOST: ")); Serial.println(MQTT_HOST); - Serial.print("Loaded MQTT_PORT: "); + Serial.print(F("Loaded MQTT_PORT: ")); Serial.println(MQTT_PORT); - Serial.print("Loaded MQTT_USER: "); + Serial.print(F("Loaded MQTT_USER: ")); Serial.println(MQTT_USER); - Serial.print("Loaded MQTT_PASSWORD: "); + Serial.print(F("Loaded MQTT_PASSWORD: ")); Serial.println(MQTT_PASSWORD); - - Serial.print("Loaded MQTT_IP_IN_TOPIC: "); + + Serial.print(F("Loaded MQTT_IP_IN_TOPIC: ")); Serial.println(MQTT_IP_IN_TOPIC); - - Serial.print("Loaded MQTT_DEVICENAME_IN_TOPIC: "); + Serial.print(F("Loaded MQTT_DEVICENAME_IN_TOPIC: ")); Serial.println(MQTT_DEVICENAME_IN_TOPIC); - - Serial.print("Loaded MQTT_TOPIC_TEMP: "); + Serial.print(F("Loaded MQTT_SLASH_AT_THE_BEGINNING: ")); + Serial.println(MQTT_SLASH_AT_THE_BEGINNING); + Serial.print(F("Loaded MQTT_SLASH_AT_THE_END: ")); + Serial.println(MQTT_SLASH_AT_THE_END); + + Serial.print(F("Loaded MQTT_TOPIC_TEMP: ")); Serial.println(MQTT_TOPIC_TEMP); - Serial.print("Loaded MQTT_TOPIC_HUMI: "); + Serial.print(F("Loaded MQTT_TOPIC_HUMI: ")); Serial.println(MQTT_TOPIC_HUMI); - Serial.print("Loaded MQTT_TOPIC_PRESS: "); + Serial.print(F("Loaded MQTT_TOPIC_PRESS: ")); Serial.println(MQTT_TOPIC_PRESS); - Serial.print("Loaded MQTT_TOPIC_PM1: "); + Serial.print(F("Loaded MQTT_TOPIC_PM1: ")); Serial.println(MQTT_TOPIC_PM1); - Serial.print("Loaded MQTT_TOPIC_PM25: "); + Serial.print(F("Loaded MQTT_TOPIC_PM25: ")); Serial.println(MQTT_TOPIC_PM25); - Serial.print("Loaded MQTT_TOPIC_PM10: "); + Serial.print(F("Loaded MQTT_TOPIC_PM10: ")); Serial.println(MQTT_TOPIC_PM10); - Serial.print("Loaded MQTT_TOPIC_AIRQUALITY: "); + Serial.print(F("Loaded MQTT_TOPIC_AIRQUALITY: ")); Serial.println(MQTT_TOPIC_AIRQUALITY); - Serial.print("Loaded AQI_ECO_ON: "); + Serial.print(F("Loaded AQI_ECO_ON: ")); Serial.println(AQI_ECO_ON); - Serial.print("Loaded AQI_ECO_HOST: "); + Serial.print(F("Loaded AQI_ECO_HOST: ")); Serial.println(AQI_ECO_HOST); - Serial.print("Loaded AQI_ECO_PATH: "); + Serial.print(F("Loaded AQI_ECO_PATH: ")); Serial.println(AQI_ECO_PATH); - - Serial.print("Loaded SENDING_FREQUENCY: "); + + Serial.print(F("Loaded SENDING_FREQUENCY: ")); Serial.println(SENDING_FREQUENCY); - Serial.print("Loaded SENDING_DB_FREQUENCY: "); + Serial.print(F("Loaded SENDING_DB_FREQUENCY: ")); Serial.println(SENDING_DB_FREQUENCY); - Serial.print("Loaded DEEPSLEEP_ON: "); + Serial.print(F("Loaded DEEPSLEEP_ON: ")); Serial.println(DEEPSLEEP_ON); - - Serial.print("Loaded DEBUG: "); + + Serial.print(F("Loaded DEBUG: ")); Serial.println(DEBUG); - Serial.print("Loaded AUTOUPDATE_ON: "); + Serial.print(F("Loaded AUTOUPDATE_ON: ")); Serial.println(AUTOUPDATE_ON); - - Serial.print("Loaded CONFIG_AUTH: "); + + Serial.print(F("Loaded CONFIG_AUTH: ")); Serial.println(CONFIG_AUTH); - Serial.print("Loaded CONFIG_USERNAME: "); + Serial.print(F("Loaded CONFIG_USERNAME: ")); Serial.println(CONFIG_USERNAME); - Serial.print("Loaded CONFIG_PASSWORD: "); + Serial.print(F("Loaded CONFIG_PASSWORD: ")); Serial.println(CONFIG_PASSWORD); - - Serial.print("Loaded MODEL: "); + + Serial.print(F("Loaded MODEL: ")); Serial.println(MODEL); - - Serial.print("Loaded PMSENSORVERSION: "); + + Serial.print(F("Loaded PMSENSORVERSION: ")); Serial.println(PMSENSORVERSION); - - Serial.print("Loaded SOFTWAREVERSION: "); + + Serial.print(F("Loaded SOFTWAREVERSION: ")); Serial.println(SOFTWAREVERSION); - - Serial.println("\n"); + + Serial.println(F("\n")); } return true; } bool saveConfig() { +#ifdef ARDUINO_ARCH_ESP8266 StaticJsonDocument jsonBuffer; + //DynamicJsonDocument jsonBuffer(ESP.getMaxFreeBlockSize()); +#elif defined ARDUINO_ARCH_ESP32 + //StaticJsonDocument jsonBuffer; + DynamicJsonDocument jsonBuffer(ESP.getMaxAllocHeap()); +#endif JsonObject json = jsonBuffer.to(); - json["DEVICENAME_AUTO"] = DEVICENAME_AUTO; - json["DEVICENAME"] = DEVICENAME; - json["LANGUAGE"] = LANGUAGE; - json["SELECTED_LANGUAGE"] = SELECTED_LANGUAGE; - - json["THP_MODEL"] = THP_MODEL; - json["DUST_MODEL"] = DUST_MODEL; - json["DISPLAY_PM1"] = DISPLAY_PM1; - json["FREQUENTMEASUREMENT"] = FREQUENTMEASUREMENT; + json["DEVICENAME_AUTO"] = bool(DEVICENAME_AUTO); + json["DEVICENAME"] = String(DEVICENAME); + json["LANGUAGE"] = String(LANGUAGE); + json["SELECTED_LANGUAGE"] = int(SELECTED_LANGUAGE); + + json["THP_MODEL"] = String(THP_MODEL); + json["DUST_MODEL"] = String(DUST_MODEL); + json["DISPLAY_PM1"] = bool(DISPLAY_PM1); + json["FREQUENTMEASUREMENT"] = bool(FREQUENTMEASUREMENT); + + json["SECOND_THP"] = bool(SECOND_THP); + + json["FIRST_THP_SDA"] = int(FIRST_THP_SDA); + json["FIRST_THP_SCL"] = int(FIRST_THP_SCL); + + json["SECOND_THP_SDA"] = int(SECOND_THP_SDA); + json["SECOND_THP_SCL"] = int(SECOND_THP_SCL); + + json["DUST_TX"] = int(DUST_TX); + json["DUST_RX"] = int(DUST_RX); - json["DUST_TIME"] = DUST_TIME; - json["NUMBEROFMEASUREMENTS"] = NUMBEROFMEASUREMENTS; - - json["LUFTDATEN_ON"] = LUFTDATEN_ON; - json["SMOGLIST_ON"] = SMOGLIST_ON; - - json["AIRMONITOR_ON"] = AIRMONITOR_ON; - json["AIRMONITOR_GRAPH_ON"] = AIRMONITOR_GRAPH_ON; - json["LATITUDE"] = LATITUDE; - json["LONGITUDE"] = LONGITUDE; - json["MYALTITUDE"] = MYALTITUDE; - - json["THINGSPEAK_ON"] = THINGSPEAK_ON; - json["THINGSPEAK_GRAPH_ON"] = THINGSPEAK_GRAPH_ON; - json["THINGSPEAK_API_KEY"] = THINGSPEAK_API_KEY; - json["THINGSPEAK_CHANNEL_ID"] = THINGSPEAK_CHANNEL_ID; - json["THINGSPEAK_READ_API_KEY"] = THINGSPEAK_READ_API_KEY; - - json["INFLUXDB_ON"] = INFLUXDB_ON; - json["INFLUXDB_VERSION"] = INFLUXDB_VERSION; - json["INFLUXDB_HOST"] = INFLUXDB_HOST; - json["INFLUXDB_PORT"] = INFLUXDB_PORT; - json["INFLUXDB_DATABASE"] = INFLUXDB_DATABASE; - json["INFLUXDB_USER"] = INFLUXDB_USER; - json["INFLUXDB_PASSWORD"] = INFLUXDB_PASSWORD; + json["CONFIG_FIRST_THP_SDA"] = String(CONFIG_FIRST_THP_SDA); + json["CONFIG_FIRST_THP_SCL"] = String(CONFIG_FIRST_THP_SCL); + + json["CONFIG_SECOND_THP_SDA"] = String(CONFIG_SECOND_THP_SDA); + json["CONFIG_SECOND_THP_SCL"] = String(CONFIG_SECOND_THP_SCL); + + json["CONFIG_DUST_TX"] = String(CONFIG_DUST_TX); + json["CONFIG_DUST_RX"] = String(CONFIG_DUST_RX); + + json["DUST_TIME"] = int(DUST_TIME); + json["NUMBEROFMEASUREMENTS"] = int(NUMBEROFMEASUREMENTS); + + json["LUFTDATEN_ON"] = bool(LUFTDATEN_ON); + json["SMOGLIST_ON"] = bool(SMOGLIST_ON); + + json["AIRMONITOR_ON"] = bool(AIRMONITOR_ON); + json["AIRMONITOR_GRAPH_ON"] = bool(AIRMONITOR_GRAPH_ON); + json["LATITUDE"] = String(LATITUDE); + json["LONGITUDE"] = String(LONGITUDE); + json["MYALTITUDE"] = int(MYALTITUDE); + + json["THINGSPEAK_ON"] = bool(THINGSPEAK_ON); + json["THINGSPEAK_GRAPH_ON"] = bool(THINGSPEAK_GRAPH_ON); + json["THINGSPEAK_API_KEY"] = String(THINGSPEAK_API_KEY); + json["THINGSPEAK_CHANNEL_ID"] = int(THINGSPEAK_CHANNEL_ID); + json["THINGSPEAK_READ_API_KEY"] = String(THINGSPEAK_READ_API_KEY); + + json["INFLUXDB_ON"] = bool(INFLUXDB_ON); + json["INFLUXDB_VERSION"] = String(INFLUXDB_VERSION); + json["INFLUXDB_HOST"] = String(INFLUXDB_HOST); + json["INFLUXDB_PORT"] = uint16_t(INFLUXDB_PORT); + json["INFLUXDB_DATABASE"] = String(INFLUXDB_DATABASE); + json["INFLUXDB_USER"] = String(INFLUXDB_USER); json["INFLUXDB_PASSWORD"] = String(INFLUXDB_PASSWORD); - json["INFLUXDB_ORG"] = INFLUXDB_ORG; - json["INFLUXDB_BUCKET"] = INFLUXDB_BUCKET; - json["INFLUXDB_TOKEN"] = INFLUXDB_TOKEN; - - json["MQTT_ON"] = MQTT_ON; - json["MQTT_HOST"] = MQTT_HOST; - json["MQTT_PORT"] = MQTT_PORT; - json["MQTT_USER"] = MQTT_USER; - json["MQTT_PASSWORD"] = MQTT_PASSWORD; + json["INFLUXDB_ORG"] = String(INFLUXDB_ORG); + json["INFLUXDB_BUCKET"] = String(INFLUXDB_BUCKET); + json["INFLUXDB_TOKEN"] = String(INFLUXDB_TOKEN); + + json["MQTT_ON"] = bool(MQTT_ON); + json["MQTT_HOST"] = String(MQTT_HOST); + json["MQTT_PORT"] = uint16_t(MQTT_PORT); + json["MQTT_USER"] = String(MQTT_USER); json["MQTT_PASSWORD"] = String(MQTT_PASSWORD); - json["MQTT_IP_IN_TOPIC"] = MQTT_IP_IN_TOPIC; - json["MQTT_DEVICENAME_IN_TOPIC"] = MQTT_DEVICENAME_IN_TOPIC; - - json["MQTT_TOPIC_TEMP"] = MQTT_TOPIC_TEMP; - json["MQTT_TOPIC_HUMI"] = MQTT_TOPIC_HUMI; - json["MQTT_TOPIC_PRESS"] = MQTT_TOPIC_PRESS; - json["MQTT_TOPIC_PM1"] = MQTT_TOPIC_PM1; - json["MQTT_TOPIC_PM25"] = MQTT_TOPIC_PM25; - json["MQTT_TOPIC_PM10"] = MQTT_TOPIC_PM10; - json["MQTT_TOPIC_AIRQUALITY"] = MQTT_TOPIC_AIRQUALITY; - - json["AQI_ECO_ON"] = AQI_ECO_ON; - json["AQI_ECO_HOST"] = AQI_ECO_HOST; - json["AQI_ECO_PATH"] = AQI_ECO_PATH; + json["MQTT_IP_IN_TOPIC"] = bool(MQTT_IP_IN_TOPIC); + json["MQTT_DEVICENAME_IN_TOPIC"] = bool(MQTT_DEVICENAME_IN_TOPIC); + json["MQTT_SLASH_AT_THE_BEGINNING"] = bool(MQTT_SLASH_AT_THE_BEGINNING); + json["MQTT_SLASH_AT_THE_END"] = bool(MQTT_SLASH_AT_THE_END); + + json["MQTT_TOPIC_TEMP"] = String(MQTT_TOPIC_TEMP); + json["MQTT_TOPIC_HUMI"] = String(MQTT_TOPIC_HUMI); + json["MQTT_TOPIC_PRESS"] = String(MQTT_TOPIC_PRESS); + json["MQTT_TOPIC_PM1"] = String(MQTT_TOPIC_PM1); + json["MQTT_TOPIC_PM25"] = String(MQTT_TOPIC_PM25); + json["MQTT_TOPIC_PM10"] = String(MQTT_TOPIC_PM10); + json["MQTT_TOPIC_AIRQUALITY"] = String(MQTT_TOPIC_AIRQUALITY); + + json["AQI_ECO_ON"] = bool(AQI_ECO_ON); + json["AQI_ECO_HOST"] = String(AQI_ECO_HOST); json["AQI_ECO_PATH"] = String(AQI_ECO_PATH); - json["SENDING_FREQUENCY"] = SENDING_FREQUENCY; - json["SENDING_DB_FREQUENCY"] = SENDING_DB_FREQUENCY; - - json["DEEPSLEEP_ON"] = DEEPSLEEP_ON; + json["SENDING_FREQUENCY"] = int(SENDING_FREQUENCY); + json["SENDING_DB_FREQUENCY"] = int(SENDING_DB_FREQUENCY); + json["DEEPSLEEP_ON"] = bool(DEEPSLEEP_ON); - json["DEBUG"] = DEBUG; - json["AUTOUPDATE_ON"] = AUTOUPDATE_ON; - - json["CONFIG_AUTH"] = CONFIG_AUTH; - json["CONFIG_USERNAME"] = CONFIG_USERNAME; - json["CONFIG_PASSWORD"] = CONFIG_PASSWORD; + json["DEBUG"] = bool(DEBUG); + json["AUTOUPDATE_ON"] = bool(AUTOUPDATE_ON); + + json["CONFIG_AUTH"] = bool(CONFIG_AUTH); + json["CONFIG_USERNAME"] = String(CONFIG_USERNAME); json["CONFIG_PASSWORD"] = String(CONFIG_PASSWORD); - - json["MODEL"] = MODEL; - + + json["MODEL"] = String(MODEL); + #ifdef ARDUINO_ARCH_ESP8266 File configFile = SPIFFS.open("/config.json", "w"); #elif defined ARDUINO_ARCH_ESP32 File configFile = SPIFFS.open("/config.json", FILE_WRITE); #endif - + if (!configFile) { - Serial.println("Failed to open config file for writing"); + Serial.println(F("Failed to open config file for writing")); return false; } serializeJson(json, configFile); if (DEBUG) { - Serial.println("config saved"); + Serial.println(F("config saved")); } return true; } @@ -386,32 +468,32 @@ bool saveConfig() { void fs_setup() { #ifdef ARDUINO_ARCH_ESP32 delay(10); -#endif +#endif - Serial.println("Mounting FS..."); + Serial.println(F("Mounting FS...")); #ifdef ARDUINO_ARCH_ESP8266 if (!SPIFFS.begin()) { - Serial.println("Failed to mount file system"); + Serial.println(F("Failed to mount file system")); return; } #elif defined ARDUINO_ARCH_ESP32 if (!SPIFFS.begin(FORMAT_SPIFFS_IF_FAILED)) { - Serial.println("SPIFFS Mount Failed"); + Serial.println(F("SPIFFS Mount Failed")); return; } #endif if (!loadConfig()) { - Serial.println("Failed to load config"); - Serial.println("Saving the current config..."); + Serial.println(F("Failed to load config")); + Serial.println(F("Saving the current config...")); saveConfig(); } else { - Serial.println("Config loaded"); + Serial.println(F("Config loaded")); } - + } void deleteConfig() { SPIFFS.remove("/config.json"); -} \ No newline at end of file +} diff --git a/src/strings_en.h b/src/strings_en.h index 9d2b438..7ae8b97 100644 --- a/src/strings_en.h +++ b/src/strings_en.h @@ -3,7 +3,7 @@ * engligh strings for * WiFiManager, a library for the ESP8266/Arduino platform * for configuration of WiFi credentials using a Captive Portal - * + * * @author Creator tzapu * @author tablatronix * @version 0.0.0 @@ -130,7 +130,7 @@ const char HTTP_HELP[] PROGMEM = "

More information about WiFiManager at https://github.com/tzapu/WiFiManager."; #ifdef JSTEST -const char HTTP_JS[] PROGMEM = +const char HTTP_JS[] PROGMEM = "