From 6fa531c08d2427cd1786eb0479a67e3b476f702a Mon Sep 17 00:00:00 2001 From: Cellie Date: Tue, 9 Jul 2019 10:54:33 +0200 Subject: [PATCH] Sensors to class sensorState. Sensors are now in class sensorState. --- README.md | 4 +- Task.cpp | 130 +++ Task.h | 67 ++ aquacontrol32.ino | 99 +- compile.sh | 9 +- deviceSetup.h | 13 - dimmertask.ino | 2 + flash.sh | 9 +- ledState.h | 26 +- loggertask.ino | 26 +- moonSimtask.ino | 1 - ntptask.ino | 12 +- oledtask.ino | 13 +- sensorState.cpp | 234 +++++ sensorState.h | 60 ++ temptask.ino | 119 --- tfttask.ino | 132 ++- webif/index.htm | 86 +- webif/index_htm.h | 449 +++++---- webif/setup.htm | 193 ++-- webif/setup_htm.h | 2344 ++++++++++++++++++++++++--------------------- webservertask.ino | 141 +-- 22 files changed, 2343 insertions(+), 1826 deletions(-) create mode 100644 Task.cpp create mode 100644 Task.h create mode 100644 sensorState.cpp create mode 100644 sensorState.h delete mode 100644 temptask.ino diff --git a/README.md b/README.md index 81f2192..d179b4c 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,8 @@ The [moon phase library](https://github.com/CelliesProjects/MoonPhase) is adapte By default log files are not generated.
That is because log files saved on FFat could reduce the lifetime of the flash memory. -
To log the temperature sensor values enable `LOG_FILES` (set it to `true`) in `deviceSetup.h`. +
Sensor logging can be enabled in the web interface. +
`Task.h` and `Task.cpp` used in the sensor code are written by Neil Kolban, can be found [here](https://github.com/nkolban/esp32-snippets) and are released under the [Apache 2.0 license](https://github.com/nkolban/esp32-snippets/blob/master/LICENSE). #### Known issues: @@ -123,7 +124,6 @@ By default log files are not generated. I develop Aquacontrol32 in my spare time for fun. Although I like to code, my afk time is equally important. -A beer in a bar is around €2 where I live. If you like the project, you could buy me a beer for some moral support. [![paypal](https://www.paypalobjects.com/en_US/NL/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=MSP53ANQ3VV6J) diff --git a/Task.cpp b/Task.cpp new file mode 100644 index 0000000..977b1a5 --- /dev/null +++ b/Task.cpp @@ -0,0 +1,130 @@ +/* + * Task.cpp + * + * Created on: Mar 4, 2017 + * Author: kolban + */ + + +#include +#include +#include +#include + +#include "Task.h" +#include "sdkconfig.h" + +static const char* LOG_TAG = "Task"; + + +/** + * @brief Create an instance of the task class. + * + * @param [in] taskName The name of the task to create. + * @param [in] stackSize The size of the stack. + * @return N/A. + */ +Task::Task(std::string taskName, uint16_t stackSize, uint8_t priority) { + m_taskName = taskName; + m_stackSize = stackSize; + m_priority = priority; + m_taskData = nullptr; + m_handle = nullptr; + m_coreId = tskNO_AFFINITY; +} // Task + +Task::~Task() { +} // ~Task + +/** + * @brief Suspend the task for the specified milliseconds. + * + * @param [in] ms The delay time in milliseconds. + * @return N/A. + */ + +/* static */ void Task::delay(int ms) { + ::vTaskDelay(ms / portTICK_PERIOD_MS); +} // delay + +/** + * Static class member that actually runs the target task. + * + * The code here will run on the task thread. + * @param [in] pTaskInstance The task to run. + */ +void Task::runTask(void* pTaskInstance) { + Task* pTask = (Task*) pTaskInstance; + ESP_LOGD(LOG_TAG, ">> runTask: taskName=%s", pTask->m_taskName.c_str()); + pTask->run(pTask->m_taskData); + //ESP_LOGD(LOG_TAG, "<< runTask: taskName=%s", pTask->m_taskName.c_str()); + //pTask->stop(); +} // runTask + +/** + * @brief Start an instance of the task. + * + * @param [in] taskData Data to be passed into the task. + * @return N/A. + */ +void Task::start(void* taskData) { + if (m_handle != nullptr) { + ESP_LOGW(LOG_TAG, "Task::start - There might be a task already running!"); + } + m_taskData = taskData; + ::xTaskCreatePinnedToCore(&runTask, m_taskName.c_str(), m_stackSize, this, m_priority, &m_handle, m_coreId); +} // start + + +/** + * @brief Stop the task. + * + * @return N/A. + */ +void Task::stop() { + if (m_handle == nullptr) return; + xTaskHandle temp = m_handle; + m_handle = nullptr; + ::vTaskDelete(temp); +} // stop + +/** + * @brief Set the stack size of the task. + * + * @param [in] stackSize The size of the stack for the task. + * @return N/A. + */ +void Task::setStackSize(uint16_t stackSize) { + m_stackSize = stackSize; +} // setStackSize + +/** + * @brief Set the priority of the task. + * + * @param [in] priority The priority for the task. + * @return N/A. + */ +void Task::setPriority(uint8_t priority) { + m_priority = priority; +} // setPriority + +/** + * @brief Set the name of the task. + * + * @param [in] name The name for the task. + * @return N/A. + */ +void Task::setName(std::string name) { + m_taskName = name; +} // setName + +/** + * @brief Set the core number the task has to be executed on. + * If the core number is not set, tskNO_AFFINITY will be used + * + * @param [in] coreId The id of the core. + * @return N/A. + */ +void Task::setCore(BaseType_t coreId) { + m_coreId = coreId; +} diff --git a/Task.h b/Task.h new file mode 100644 index 0000000..5eb4966 --- /dev/null +++ b/Task.h @@ -0,0 +1,67 @@ +/* + * Task.h + * + * Created on: Mar 4, 2017 + * Author: kolban + */ + +#ifndef COMPONENTS_CPP_UTILS_TASK_H_ +#define COMPONENTS_CPP_UTILS_TASK_H_ +#include +#include +#include +/** + * @brief Encapsulate a runnable task. + * + * This class is designed to be subclassed with the method: + * + * @code{.cpp} + * void run(void *data) { ... } + * @endcode + * + * For example: + * + * @code{.cpp} + * class CurlTestTask : public Task { + * void run(void *data) { + * // Do something + * } + * }; + * @endcode + * + * implemented. + */ +class Task { +public: + Task(std::string taskName = "Task", uint16_t stackSize = 10000, uint8_t priority = 5); + virtual ~Task(); + void setStackSize(uint16_t stackSize); + void setPriority(uint8_t priority); + void setName(std::string name); + void setCore(BaseType_t coreId); + void start(void* taskData = nullptr); + void stop(); + /** + * @brief Body of the task to execute. + * + * This function must be implemented in the subclass that represents the actual task to run. + * When a task is started by calling start(), this is the code that is executed in the + * newly created task. + * + * @param [in] data The data passed in to the newly started task. + */ + virtual void run(void* data) = 0; // Make run pure virtual + static void delay(int ms); + +private: + xTaskHandle m_handle; + void* m_taskData; + static void runTask(void* data); + std::string m_taskName; + uint16_t m_stackSize; + uint8_t m_priority; + BaseType_t m_coreId; + +}; + +#endif /* COMPONENTS_CPP_UTILS_TASK_H_ */ diff --git a/aquacontrol32.ino b/aquacontrol32.ino index 5d747e0..78c0df9 100644 --- a/aquacontrol32.ino +++ b/aquacontrol32.ino @@ -1,21 +1,21 @@ #include /* should be installed together with ESP32 Arduino install */ #include /* should be installed together with ESP32 Arduino install */ #include /* should be installed together with ESP32 Arduino install */ +#include /* should be installed together with ESP32 Arduino install */ #include /* should be installed together with ESP32 Arduino install */ #include /* should be installed together with ESP32 Arduino install */ #include /* should be installed together with ESP32 Arduino install */ #include /* should be installed together with ESP32 Arduino install */ #include /* should be installed together with ESP32 Arduino install */ -#include /* should be installed together with ESP32 Arduino install */ -#include /* Install 1.3.6 via 'Manage Libraries' in Arduino IDE */ -#include /* Install 1.4.11 via 'Manage Libraries' in Arduino IDE */ +#include /* Install 1.5.1 via 'Manage Libraries' in Arduino IDE */ +#include /* Install 1.5.6 via 'Manage Libraries' in Arduino IDE */ #include /* Install 4.0.0 via 'Manage Libraries' in Arduino IDE -> https://github.com/ThingPulse/esp8266-oled-ssd1306 */ -#include /* Install 1.3.0 via 'Manage Libraries' in Arduino IDE */ -#include /* https://github.com/stickbreaker/OneWire */ -#include /* https://github.com/me-no-dev/AsyncTCP */ -#include /* https://github.com/me-no-dev/ESPAsyncWebServer */ +#include /* Install 1.3 via 'Manage Libraries' in Arduino IDE */ +#include /* Reports as 1.0.3 https://github.com/me-no-dev/AsyncTCP */ +#include /* Reports as 1.2.2 https://github.com/me-no-dev/ESPAsyncWebServer */ #include /* https://github.com/CelliesProjects/MoonPhase */ +#include "sensorState.h" #include "ledState.h" #include "deviceSetup.h" @@ -85,12 +85,6 @@ const char * sketchVersion = "ARDUINO IDE"; #define MAX_TIMERS 50 -/************************************************************************** - maximum number of Dallas sensors -**************************************************************************/ -#define MAX_NUMBER_OF_SENSORS 3 - - /************************************************************************** default hostname if no hostname is set **************************************************************************/ @@ -106,17 +100,19 @@ const char * sketchVersion = "ARDUINO IDE"; /************************************************************************** Setup included libraries *************************************************************************/ -ledState leds; +ledState leds; -XPT2046_Touchscreen touch( TOUCH_CS_PIN, TOUCH_IRQ_PIN ); +sensorState sensor; -Adafruit_ILI9341 tft = Adafruit_ILI9341( SPI_TFT_CS_PIN, SPI_TFT_DC_PIN, SPI_TFT_RST_PIN ); +MoonPhase MoonPhase; -Preferences preferences; +XPT2046_Touchscreen touch( TOUCH_CS_PIN, TOUCH_IRQ_PIN ); -SSD1306 OLED( OLED_ADDRESS, I2C_SDA_PIN, I2C_SCL_PIN ); +Adafruit_ILI9341 tft = Adafruit_ILI9341( SPI_TFT_CS_PIN, SPI_TFT_DC_PIN, SPI_TFT_RST_PIN ); -MoonPhase MoonPhase; +SSD1306 OLED( OLED_ADDRESS, I2C_SDA_PIN, I2C_SCL_PIN ); + +Preferences preferences; /************************************************************************** type definitions @@ -139,26 +135,17 @@ struct channelData_t float minimumLevel; /* never dim this channel below this percentage */ }; -struct sensorData_t /* struct to keep track of Dallas DS18B20 sensors */ -{ - byte addr[8]; - float tempCelcius; - char name[15]; - bool error = false; -}; - /* const */ const char* defaultTimerFile = "/default.aqu"; /* task priorities */ const uint8_t dimmerTaskPriority = 8; -const uint8_t tempTaskPriority = 7; -const uint8_t webserverTaskPriority = 6; -const uint8_t tftTaskPriority = 5; -const uint8_t ntpTaskPriority = 4; -const uint8_t oledTaskPriority = 3; -const uint8_t wifiTaskPriority = 2; -const uint8_t loggerTaskPriority = 1; +const uint8_t tftTaskPriority = 6; +const uint8_t ntpTaskPriority = 5; +const uint8_t oledTaskPriority = 4; +const uint8_t wifiTaskPriority = 3; +const uint8_t loggerTaskPriority = 2; +const uint8_t webserverTaskPriority = 1; const uint8_t moonSimtaskPriority = 0; /************************************************************************** @@ -166,8 +153,6 @@ const uint8_t moonSimtaskPriority = 0; **************************************************************************/ channelData_t channel[NUMBER_OF_CHANNELS]; -sensorData_t sensor[MAX_NUMBER_OF_SENSORS]; - MoonPhase::moonData moonData; TaskHandle_t xDimmerTaskHandle = NULL; @@ -184,22 +169,31 @@ double ledcActualFrequency; uint16_t ledcMaxValue; uint8_t ledcNumberOfBits; -uint8_t numberOfFoundSensors; - float tftBrightness = 80; /* in percent */ uint8_t tftOrientation = TFT_ORIENTATION_NORMAL; uint8_t oledContrast; /* 0 .. 15 */ uint8_t oledOrientation = OLED_ORIENTATION_NORMAL; -bool LOG_SENSOR_ERRORS = false; /***************************************************************************************** end of global variables *****************************************************************************************/ void tftTask( void * pvParameters ); void oledTask( void * pvParameters ); -void tempTask( void * pvParameters ); void wifiTask( void * pvParameters ); +void loggerTask( void * pvParameters ); + +BaseType_t startLogger() +{ + return xTaskCreatePinnedToCore( + loggerTask, /* Function to implement the task */ + "loggerTask", /* Name of the task */ + 3000, /* Stack size in words */ + NULL, /* Task input parameter */ + loggerTaskPriority, /* Priority of the task */ + &xLoggerTaskHandle, /* Task handle. */ + 1); +} void setup() { @@ -219,13 +213,17 @@ void setup() gpio_set_drive_capability( (gpio_num_t)LED3_PIN, GPIO_DRIVE_CAP_3 ); gpio_set_drive_capability( (gpio_num_t)LED4_PIN, GPIO_DRIVE_CAP_3 ); - preferences.begin( "aquacontrol32", false ); + gpio_set_drive_capability( (gpio_num_t)ONEWIRE_PIN, GPIO_DRIVE_CAP_3 ); btStop(); ESP_LOGI( TAG, "aquacontrol32 %s", sketchVersion ); ESP_LOGI( TAG, "ESP32 SDK: %s", ESP.getSdkVersion() ); + sensor.startSensors(); + + preferences.begin( "aquacontrol32", false ); + SPI.begin( SPI_SCK_PIN, SPI_MISO_PIN, SPI_MOSI_PIN ); tft.begin( TFT_SPI_CLOCK ); @@ -234,25 +232,23 @@ void setup() if ( !FFat.begin( true ) ) { - ESP_LOGE( TAG, "Error starting FFat." ); + ESP_LOGE( TAG, "FATAL ERROR! Could not mount FFat. Did you select the right partition scheme? (something with ffat)" ); } else { - ESP_LOGI( TAG, "FFat started." ); - ESP_LOGI( TAG, "Total space: %10lu", FFat.totalBytes()); - ESP_LOGI( TAG, "Free space: %10lu", FFat.freeBytes()); + ESP_LOGI( TAG, "FFat started. Total space: %lu kB. Free space: %lu kB.", FFat.totalBytes() / 1024, FFat.freeBytes() / 1024 ); } if ( TFT_HAS_NO_MISO || tft.readcommand8( ILI9341_RDSELFDIAG ) == 0xE0 ) { touch.begin(); - ESP_LOGI( TAG, "ILI9341 display %s.", TFT_HAS_NO_MISO ? "forced" : "found" ); + ESP_LOGI( TAG, "%s an ILI9341 display on SPI.", TFT_HAS_NO_MISO ? "Forced" : "Found" ); xTaskCreatePinnedToCore( tftTask, /* Function to implement the task */ "tftTask", /* Name of the task */ - 3000, /* Stack size in words */ + 4000, /* Stack size in words */ NULL, /* Task input parameter */ tftTaskPriority, /* Priority of the task */ &xTftTaskHandle, /* Task handle. */ @@ -292,15 +288,6 @@ void setup() wifiTaskPriority, /* Priority of the task */ NULL, /* Task handle. */ 1); - - xTaskCreatePinnedToCore( - tempTask, /* Function to implement the task */ - "tempTask", /* Name of the task */ - 4000, /* Stack size in words */ - NULL, /* Task input parameter */ - tempTaskPriority, /* Priority of the task */ - NULL, /* Task handle. */ - 1); /* Core where the task should run */ } void loop() diff --git a/compile.sh b/compile.sh index 16265d6..de0bfda 100755 --- a/compile.sh +++ b/compile.sh @@ -1,3 +1,8 @@ +if [ $(grep GIT_TAG deviceSetup.h | grep -ic TRUE) != "1" ] +then + echo -e '\e[31m'ERROR'\e[0m' GIT_TAG not set to true in deviceSetup.h. + exit 1 +fi currentVersion="" if [ $(git branch | grep \* | cut -d ' ' -f2) == "master" ] then @@ -6,6 +11,6 @@ else currentVersion=$(git branch | grep \* | cut -d ' ' -f2):$(git rev-parse --short HEAD) fi echo "const char * sketchVersion = \"$currentVersion\";" > gitTagVersion.h -echo Compiling aquacontrol32 version: $currentVersion -~/arduino-1.8.9/arduino --board espressif:esp32:mhetesp32minikit --verify test.ino --pref custom_DebugLevel=esp32_none --port /dev/ttyUSB0 --pref upload.speed=921600 --pref build.path=temp --preserve-temp-files --pref build.partition=default_ffat +echo -e Compiling aquacontrol32 version: '\e[36m'$currentVersion'\e[0m' +~/arduino-1.8.9/arduino --board espressif:esp32:mhetesp32minikit --pref custom_DebugLevel=esp32_none --port /dev/ttyUSB0 --pref upload.speed=921600 --preserve-temp-files --pref build.path=temp --pref build.partition=default_ffat --pref build.flash_freq=80m -v --verify aquacontrol32.ino | grep -e 'Using core' -e 'Using board' -e ' uses ' -e 'Using library' -e 'Compiling' -e 'Global' rm gitTagVersion.h diff --git a/deviceSetup.h b/deviceSetup.h index 324ff33..d2d300b 100644 --- a/deviceSetup.h +++ b/deviceSetup.h @@ -5,19 +5,6 @@ #define COUNTRY_CODE_ISO_3166 "nl" -/************************************************************************** - set to false to produce no log files - set to true to produce log files -**************************************************************************/ -#define LOG_FILES false - - -/************************************************************************** - how many log files are kept -**************************************************************************/ -#define SAVED_LOGFILES 30 - - /************************************************************************** OLED I2C address **************************************************************************/ diff --git a/dimmertask.ino b/dimmertask.ino index a5e4081..a594777 100644 --- a/dimmertask.ino +++ b/dimmertask.ino @@ -43,6 +43,8 @@ void IRAM_ATTR dimmerTask ( void * pvParameters ) xLastWakeTime = xTaskGetTickCount(); + ESP_LOGI( TAG, "Lights running after %.1f seconds.", millis() / 1000.0 ); + while (1) { if ( leds.state() != LIGHTS_AUTO ) diff --git a/flash.sh b/flash.sh index 8375738..8b9f709 100755 --- a/flash.sh +++ b/flash.sh @@ -1,3 +1,8 @@ +if [ $(grep GIT_TAG deviceSetup.h | grep -ic TRUE) != "1" ] +then + echo -e '\e[31m'ERROR'\e[0m' GIT_TAG not set to true in deviceSetup.h. + exit 1 +fi currentVersion="" if [ $(git branch | grep \* | cut -d ' ' -f2) == "master" ] then @@ -6,6 +11,6 @@ else currentVersion=$(git branch | grep \* | cut -d ' ' -f2):$(git rev-parse --short HEAD) fi echo "const char * sketchVersion = \"$currentVersion\";" > gitTagVersion.h -echo Compiling and flashing aquacontrol32 version: $currentVersion -~/arduino-1.8.9/arduino --board espressif:esp32:mhetesp32minikit --upload test.ino --pref custom_DebugLevel=esp32_none --port /dev/ttyUSB0 --pref upload.speed=921600 --preserve-temp-files --pref build.path=temp --pref build.partition=default_ffat --pref build.flash_freq=80m +echo -e Compiling and flashing aquacontrol32 version: '\e[36m'$currentVersion'\e[0m' +~/arduino-1.8.9/arduino --board espressif:esp32:mhetesp32minikit --pref custom_DebugLevel=esp32_none --port /dev/ttyUSB0 --pref upload.speed=921600 --preserve-temp-files --pref build.path=temp --pref build.partition=default_ffat --pref build.flash_freq=80m -v --upload aquacontrol32.ino | grep -e 'Using core' -e 'Using board' -e ' uses ' -e 'Using library' -e 'Compiling' -e 'Global' rm gitTagVersion.h diff --git a/ledState.h b/ledState.h index f4f79bc..70b4d90 100644 --- a/ledState.h +++ b/ledState.h @@ -1,8 +1,7 @@ #ifndef LEDSTATE_H #define LEDSTATE_H -enum lightState_t -{ +enum lightState_t { LIGHTS_OFF, LIGHTS_ON, LIGHTS_AUTO }; @@ -10,27 +9,16 @@ class ledState { public: - ledState() { - _lightState = LIGHTS_OFF; - }; - - const char * stateString() { - return _lightStr[_lightState]; - } + ledState() { _lightState = LIGHTS_OFF; } - void setState( lightState_t state ) { - _lightState = state; - }; - - const lightState_t state() { - return _lightState; - }; + const char * stateString() { return _lightStr[_lightState]; } + void setState( lightState_t state ) { _lightState = state; } + const lightState_t state() { return _lightState; } private: - const char * _lightStr[3] = { "LIGHTS OFF", "LIGHTS ON", "LIGHTS AUTO" }; - - lightState_t _lightState; + const char * _lightStr[ sizeof( lightState_t ) ] = { "LIGHTS OFF", "LIGHTS ON", "LIGHTS AUTO" }; + lightState_t _lightState; }; #endif diff --git a/loggertask.ino b/loggertask.ino index 26dd09c..4af2fb1 100644 --- a/loggertask.ino +++ b/loggertask.ino @@ -6,7 +6,6 @@ void IRAM_ATTR loggerTask ( void * pvParameters ) { const char * appendError = "Failed to write to log file."; char content[60]; - uint8_t charCount = 0; static bool systemHasBooted = true; time_t now; struct tm timeinfo; @@ -36,14 +35,15 @@ void IRAM_ATTR loggerTask ( void * pvParameters ) } } - if ( numberOfFoundSensors ) + uint8_t charCount = 0; + if ( sensor.count() ) { charCount += snprintf( content, sizeof( content ), "%i,", now ); - charCount += snprintf( content + charCount, sizeof( content ) - charCount, "%3.2f", sensor[ 0 ].tempCelcius); + charCount += snprintf( content + charCount, sizeof( content ) - charCount, "%3.2f", sensor.temp( 0 ) ); - for ( uint8_t sensorNumber = 1; sensorNumber < numberOfFoundSensors; sensorNumber++ ) + for ( uint8_t sensorNumber = 1; sensorNumber < sensor.count(); sensorNumber++ ) { - charCount += snprintf( content + charCount, sizeof( content ) - charCount, ",%3.2f", sensor[ sensorNumber ].tempCelcius ); + charCount += snprintf( content + charCount, sizeof( content ) - charCount, ",%3.2f", sensor.temp( sensorNumber ) ); } if ( !writelnFile( FFat, fileName, content ) ) { @@ -157,19 +157,3 @@ const char * resetString( const RESET_REASON reason ) }; return resetStr[reason]; } - -void writeSensorErrorLog( const uint8_t &whichSensor, const char * errorStr, const byte data[9] ) -{ - time_t rawtime; - struct tm * timeinfo; - time ( &rawtime ); - timeinfo = localtime ( &rawtime ); - char timeBuff[20]; - strftime ( timeBuff, sizeof(timeBuff), "%x %X", timeinfo ); - char buffer[100]; - snprintf( buffer, sizeof( buffer ), "%s - sensor: '%s' %s %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", timeBuff, sensor[whichSensor].name, errorStr, - data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8] ); - - writelnFile( FFat, "/sensor_error.txt", buffer ); - ESP_LOGE( TAG, "%s", buffer ); -} diff --git a/moonSimtask.ino b/moonSimtask.ino index 21bddb2..37a131a 100644 --- a/moonSimtask.ino +++ b/moonSimtask.ino @@ -18,4 +18,3 @@ void IRAM_ATTR moonSimtask ( void * pvParameters ) vTaskDelay( moonSimdelayTime / portTICK_PERIOD_MS ); } } - diff --git a/ntptask.ino b/ntptask.ino index be70cd7..6ff132c 100644 --- a/ntptask.ino +++ b/ntptask.ino @@ -44,17 +44,9 @@ void ntpTask( void * pvParameters ) ESP_LOGI( TAG, "DimmerTask %s.", ( xReturned == pdPASS ) ? "started" : "failed" ); - if ( LOG_FILES ) + if ( sensor.logging() ) { - xReturned = xTaskCreatePinnedToCore( - loggerTask, /* Function to implement the task */ - "loggerTask", /* Name of the task */ - 3000, /* Stack size in words */ - NULL, /* Task input parameter */ - loggerTaskPriority, /* Priority of the task */ - &xLoggerTaskHandle, /* Task handle. */ - 1); /* Core where the task should run */ - + xReturned = startLogger(); ESP_LOGI( TAG, "LoggerTask %s.", ( xReturned == pdPASS ) ? "started" : "failed" ); } diff --git a/oledtask.ino b/oledtask.ino index d2ea951..2f65426 100644 --- a/oledtask.ino +++ b/oledtask.ino @@ -46,7 +46,7 @@ void IRAM_ATTR oledTask( void * pvParameters ) OLED.drawString( 64, 20, "IP: " + WiFi.localIP().toString() ); - snprintf( content, sizeof( content ), "%i Dallas sensors", numberOfFoundSensors ); + snprintf( content, sizeof( content ), "%i Dallas sensors", sensor.count() ); OLED.drawString( 64, 30, content ); snprintf( content, sizeof( content ), "%s", sketchVersion ); @@ -74,16 +74,11 @@ void IRAM_ATTR oledTask( void * pvParameters ) OLED.drawString( x1 + ( BARS_WIDTH / 2 ) - 1, y1 - 11, content ); } - if ( numberOfFoundSensors ) + if ( sensor.count() ) { uint8_t charCount = 0; - for ( uint8_t sensorNumber = 0; sensorNumber < numberOfFoundSensors; sensorNumber++ ) - { - if ( !sensor[sensorNumber].error ) - charCount += snprintf( content + charCount, sizeof( content ) - charCount, "%.1f°C " , sensor[sensorNumber].tempCelcius ); - else - charCount += snprintf( content + charCount, sizeof( content ) - charCount, "ERROR " , sensor[sensorNumber].tempCelcius ); - } + for ( uint8_t sensorNumber = 0; sensorNumber < sensor.count(); sensorNumber++ ) + charCount += snprintf( content + charCount, sizeof( content ) - charCount, "%.1f°C " , sensor.temp( sensorNumber ) ); } else { diff --git a/sensorState.cpp b/sensorState.cpp new file mode 100644 index 0000000..0aad462 --- /dev/null +++ b/sensorState.cpp @@ -0,0 +1,234 @@ +#include +#include +#include + +#include "sensorState.h" + +static const char * ERROR_LOG_NAME = "/sensor_error.txt"; +static const char * UNKNOWN_SENSOR = "unknown sensor"; + +OneWire ds( SENSOR_PIN ); +Preferences sensorPreferences; + +sensorState::sensorState() {} +sensorState::~sensorState() {} + +bool sensorState::startSensors() { + if ( nullptr != _pSensorState ) { + ESP_LOGE( TAG, "Sensors already running. Exiting." ); + return false; + } + _pSensorState = new sensorState(); + if ( nullptr == _pSensorState ) { + ESP_LOGE( TAG, "Sensors not created. (low mem?) Exiting." ); + return false; + } + sensorPreferences.begin( "sensors", false ); + _pSensorState->setStackSize(3500); + _pSensorState->setCore(1); + _pSensorState->setPriority(0); + _pSensorState->start(); + return true; +} + +void sensorState::rescan() { + _pSensorState->_rescan = true; +} + +uint8_t sensorState::count() { + return ( nullptr == _pSensorState ) ? 0 : _pSensorState->_count; +}; + +float sensorState::temp( const uint8_t num ) { + return ( nullptr == _pSensorState ) ? NAN : _pSensorState->_state[num].tempCelsius; +}; + +bool sensorState::error( const uint8_t num ) { + return ( nullptr == _pSensorState ) ? true : _pSensorState->_state[num].error; +}; + +const char * sensorState::getName( const uint8_t num, sensorName_t &name ) { + if ( nullptr == _pSensorState ) return name; + sensorId_t id; + getId( num, id ); + return getName( id, name ); +} + +const char * sensorState::getName( const sensorName_t &id, sensorName_t &name ){ + if ( nullptr == _pSensorState ) return name; + String result = sensorPreferences.getString( id, UNKNOWN_SENSOR ); + if ( result ) strncpy( name, result.c_str(), sizeof( sensorName_t ) ); + return name; +} + +const char * sensorState::getId( const uint8_t num, sensorId_t &id ) { + if ( nullptr == _pSensorState ) return id; + snprintf( id, sizeof( sensorId_t ), "%02x%02x%02x%02x%02x%02x%02x", + _pSensorState->_state[num].addr[1], _pSensorState->_state[num].addr[2], _pSensorState->_state[num].addr[3], _pSensorState->_state[num].addr[4], + _pSensorState->_state[num].addr[5], _pSensorState->_state[num].addr[6], _pSensorState->_state[num].addr[7] ); + return id; +} + +bool sensorState::setName( const sensorId_t &id, const char * name ) { + if ( 0 == strlen( name ) ) return sensorPreferences.remove( id ); + if ( strlen( name ) > sizeof( sensorName_t ) ) return false; + return sensorPreferences.putString( id, name ); +} + +bool sensorState::logging() { + return ( nullptr == _pSensorState ) ? false : sensorPreferences.getBool( "logging", false ); +} + +bool sensorState::setLogging( const bool state ) { + return ( nullptr == _pSensorState ) ? false : sensorPreferences.putBool( "logging", state ); +}; + +bool sensorState::errorLogging() { + return ( nullptr == _pSensorState ) ? false : _pSensorState->_errorlogging; +}; + +void sensorState::setErrorLogging( const bool state ) { + if ( nullptr != _pSensorState ) _pSensorState->_errorlogging = state; +}; + +void sensorState::run( void * data ) { + uint8_t loopCounter = _scanSensors(); + ESP_LOGI( TAG, "Sensors scanned: %i found.", loopCounter ); + while (1) + { + ESP_LOGD( TAG, "Stack watermark: %i", uxTaskGetStackHighWaterMark( NULL ) ); + if ( _rescan ) loopCounter = _scanSensors(); + + ds.reset(); + ds.write( 0xCC, 0); /* Skip ROM - All sensors */ + ds.write( 0x44, 0); /* start conversion, with parasite power off at the end */ + + vTaskDelay( 750 ); //wait for conversion ready + + uint8_t num = 0; + while ( num < loopCounter ) + { + byte data[12]; + + _tempState[num].error = true; /* we start with an error, which will be cleared if the CRC checks out. */ + ds.reset(); + ds.select( _tempState[num].addr ); + ds.write( 0xBE ); /* Read Scratchpad */ + for ( byte i = 0; i < 9; i++ ) data[i] = ds.read(); // we need 9 bytes + + ESP_LOGD( TAG, "Sensor %i '%s' data=%02x%02x%02x%02x%02x%02x%02x%02x%02x", num, _tempState[num].name, + data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8] ); + + byte type_s; + // the first ROM byte indicates which chip + switch ( _tempState[num].addr[0] ) + { + case 0x10: + ESP_LOGD( TAG, "Dallas sensor type : DS18S20" ); /* or old DS1820 */ + type_s = 1; + break; + case 0x28: + ESP_LOGD( TAG, "Dallas sensor type : DS18B20"); + type_s = 0; + break; + case 0x22: + ESP_LOGD( TAG, "Dallas sensor type : DS1822"); + type_s = 0; + break; + default: + ESP_LOGE( TAG, "OneWire device is not a DS18x20 family device."); + } + + if ( OneWire::crc8( data, 8 ) != data[8] ) + { + _tempState[num].error = true; + _tempState[num].tempCelsius = NAN; + if ( _errorlogging && !_logError( num, ERROR_LOG_NAME, "BAD_CRC", data ) ) + ESP_LOGE( TAG, "%s", "Error writing errorlog.(disk full?)" ); + } + else + { + int16_t raw = (data[1] << 8) | data[0]; + if (type_s) + { + raw = raw << 3; // 9 bit resolution default + if (data[7] == 0x10) + { + // "count remain" gives full 12 bit resolution + raw = (raw & 0xFFF0) + 12 - data[6]; + } + } + else + { + byte cfg = (data[4] & 0x60); + // at lower res, the low bits are undefined, so let's zero them + if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms + else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms + else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms + //// default is 12 bit resolution, 750 ms conversion time + } + _tempState[num].tempCelsius = raw / 16.0; + + if ( _tempState[num].tempCelsius > -55.0 && _tempState[num].tempCelsius < 85.0 ) + { + _tempState[num].error = false; + } + else + { + _tempState[num].error = true; + _tempState[num].tempCelsius = NAN; + if ( _errorlogging && !_logError( num, ERROR_LOG_NAME, "BAD_TMP", data ) ) + ESP_LOGE( TAG, "%s", "Error writing errorlog.(disk full?)" ); + } + } + ESP_LOGD( TAG, "sensor %i: %.1f %s", num, _tempState[num].tempCelsius, _tempState[num].error ? "invalid" : "valid" ); + num++; + } + memcpy( &_state, &_tempState, sizeof( sensorState_t[ MAX_NUMBER_OF_SENSORS ] ) ); + _count = loopCounter; + } +} + +uint8_t sensorState::_scanSensors() { + uint8_t num = 0; + byte currentAddr[ sizeof( sensorState_t::addr ) ]; + + ds.reset_search(); + ds.target_search(0x28); + vTaskPrioritySet( NULL, 10); + while ( ds.search( currentAddr ) && ( num < MAX_NUMBER_OF_SENSORS ) ) + { + _tempState[num].error = true; + _tempState[num].tempCelsius = NAN; + memcpy( _tempState[num].addr, currentAddr, sizeof( sensorState_t::addr ) ); + num++; + } + vTaskPrioritySet( NULL, 0); + _rescan = false; + return num; +} + +bool sensorState::_logError( const uint8_t num, const char * path, const char * message, const byte data[9] ) +{ + File file = FFat.open( path, FILE_APPEND ); + if ( !file ) return false; + + time_t rawtime; + struct tm * timeinfo; + time ( &rawtime ); + timeinfo = localtime ( &rawtime ); + char timeBuff[20]; + strftime ( timeBuff, sizeof( timeBuff ), "%x %X", timeinfo ); + char buffer[100]; + snprintf( buffer, sizeof( buffer ), "%s - sensor:%i %s %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", timeBuff, num, message, + data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8] ); + ESP_LOGD( TAG, "%s", buffer ); + + if ( !file.println( buffer ) ) + { + file.close(); + return false; + } + file.close(); + return true; +} diff --git a/sensorState.h b/sensorState.h new file mode 100644 index 0000000..832fe14 --- /dev/null +++ b/sensorState.h @@ -0,0 +1,60 @@ +#ifndef SENSORSTATE_H +#define SENSORSTATE_H + +#ifndef ESP32 +#warning sensorState will only work on ESP32 MCUs +#endif + +#include "Task.h" + +#define SAVED_LOGFILES 30 +#define SENSOR_PIN 5 +#define MAX_NUMBER_OF_SENSORS 3 + +#define VALID_ID_LENGTH 14 + +typedef char sensorId_t[VALID_ID_LENGTH + 1]; +typedef char sensorName_t[15]; + +class sensorState: public Task { + + public: + + struct sensorState_t /* struct to keep track of Dallas DS18B20 sensors */ + { + byte addr[8] = {}; + float tempCelsius = NAN; + bool error = true; + }; + + sensorState(); + virtual ~sensorState(); + + bool startSensors(); + void rescan(); + uint8_t count(); + float temp( const uint8_t num ); + bool error( const uint8_t num ); + const char * getName( const uint8_t num, sensorName_t &name ); + const char * getName( const sensorName_t &id, sensorName_t &name ); + const char * getId( const uint8_t num, sensorId_t &id ); + bool setName( const sensorId_t &id, const char * name ); + bool logging(); + bool setLogging( const bool state ); + bool errorLogging(); + void setErrorLogging( const bool state ); + + private: + + void run( void * data ); + uint8_t _count = 0; + uint8_t _scanSensors(); + sensorState_t _state[MAX_NUMBER_OF_SENSORS]; + sensorState_t _tempState[MAX_NUMBER_OF_SENSORS]; + sensorState * _pSensorState = nullptr; + bool _errorlogging = false; + bool _logError( const uint8_t num, const char * path, const char * message, const byte data[9] ); + bool _rescan = false; +}; + +#endif //SENSORSTATE_H diff --git a/temptask.ino b/temptask.ino deleted file mode 100644 index 91d1119..0000000 --- a/temptask.ino +++ /dev/null @@ -1,119 +0,0 @@ -void IRAM_ATTR tempTask( void * pvParameters ) -{ - OneWire ds( ONEWIRE_PIN ); /* a 4.7K pull-up resistor is necessary */ - - numberOfFoundSensors = 0; - byte currentAddr[8]; - - while ( ds.search( currentAddr ) && numberOfFoundSensors < MAX_NUMBER_OF_SENSORS ) - { - for ( uint8_t i = 0; i < sizeof( currentAddr ); i++) - { - sensor[numberOfFoundSensors].addr[i] = currentAddr[i]; - } - /* make a key field -in sensorUniqueId- for NVS */ - char sensorUniqueId[17]; - snprintf( sensorUniqueId, sizeof( sensorUniqueId ), "%02x%02x%02x%02x%02x%02x%02x", - currentAddr[1], currentAddr[2], currentAddr[3], currentAddr[4], currentAddr[5], currentAddr[6], currentAddr[7] ); - - ESP_LOGI( TAG, "Finding saved name for sensor ID: %s", sensorUniqueId ); - - /* and read value from NVS or use default name */ - snprintf( sensor[numberOfFoundSensors].name, sizeof( sensor[numberOfFoundSensors].name ), - preferences.getString( sensorUniqueId, "temp sensor" ).c_str(), numberOfFoundSensors ); - - ESP_LOGD( TAG, "Sensor %i ID: %s - Name: '%s'", numberOfFoundSensors, sensorUniqueId, sensor[numberOfFoundSensors].name ); - - numberOfFoundSensors++; - } - ESP_LOGI( TAG, "%i Dallas sensors found.", numberOfFoundSensors ); - - if ( !numberOfFoundSensors ) - { - vTaskDelete( NULL ); - } - - /* main temptask loop */ - - while (1) - { - ds.reset(); - ds.write( 0xCC, 0); /* Skip ROM - All sensors */ - ds.write( 0x44, 0); /* start conversion, with parasite power off at the end */ - - vTaskDelay( 750 / portTICK_PERIOD_MS); //wait for conversion ready - - - for ( byte thisSensor = 0; thisSensor < numberOfFoundSensors; thisSensor++) - { - byte data[12]; - - ds.reset(); - ds.select( sensor[thisSensor].addr ); - ds.write( 0xBE ); /* Read Scratchpad */ - for ( byte i = 0; i < 9; i++) - { // we need 9 bytes - data[i] = ds.read( ); - } - - - ESP_LOGD( TAG, "Sensor %i '%s' data=%02x%02x%02x%02x%02x%02x%02x%02x%02x", thisSensor, sensor[thisSensor].name, - data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8] ); - - byte type_s; - // the first ROM byte indicates which chip - switch ( sensor[thisSensor].addr[0] ) - { - case 0x10: - ESP_LOGD( TAG, "Dallas sensor type : DS18S20" ); /* or old DS1820 */ - type_s = 1; - break; - case 0x28: - ESP_LOGD( TAG, "Dallas sensor type : DS18B20"); - type_s = 0; - break; - case 0x22: - ESP_LOGD( TAG, "Dallas sensor type : DS1822"); - type_s = 0; - break; - default: - ESP_LOGE( TAG, "OneWire device is not a DS18x20 family device."); - } - - int16_t raw; - if ( data[8] == 0xFF || OneWire::crc8(data, 8) != data[8]) - { - - // CRC of temperature reading indicates an error, so we print a error message and discard this reading - sensor[thisSensor].error = true; - if ( LOG_SENSOR_ERRORS ) writeSensorErrorLog( thisSensor, "BAD_CRC", data ); - ESP_LOGE( TAG, "Sensor %i error. data: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", thisSensor, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8] ); - } - else - { - raw = (data[1] << 8) | data[0]; - if (type_s) - { - raw = raw << 3; // 9 bit resolution default - if (data[7] == 0x10) - { - // "count remain" gives full 12 bit resolution - raw = (raw & 0xFFF0) + 12 - data[6]; - } - } - else - { - byte cfg = (data[4] & 0x60); - // at lower res, the low bits are undefined, so let's zero them - if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms - else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms - else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms - //// default is 12 bit resolution, 750 ms conversion time - - } - sensor[thisSensor].tempCelcius = raw / 16.0; - sensor[thisSensor].error = false; - } - } - } -} diff --git a/tfttask.ino b/tfttask.ino index 5ec804e..e6833f1 100644 --- a/tfttask.ino +++ b/tfttask.ino @@ -108,6 +108,8 @@ displayState tftState = normal; bool tftClearScreen = true; +void drawSensors(); + void IRAM_ATTR tftTask( void * pvParameters ) { const TickType_t tftTaskdelayTime = ( 1000 / UPDATE_FREQ_TFT) / portTICK_PERIOD_MS; @@ -222,6 +224,33 @@ static inline __attribute__((always_inline)) void showMenu() } } +void newSensors() +{ + tft.startWrite(); + tft.writeFillRect( 210, 60, TFT_BUTTON_WIDTH, 120, TFT_BACK_COLOR ); + tft.endWrite(); + + sensorName_t sensorName; + for ( uint8_t num = 0; num < sensor.count(); num++ ) + { + tempArea[num].x = 220; + tempArea[num].y = 70 + num * 40; + tempArea[num].w = TFT_BUTTON_WIDTH - 20; + tempArea[num].h = 30; + tempArea[num].color = TFT_BACK_COLOR; + tempArea[num].labelcolor = ILI9341_WHITE; + tempArea[num].fontsize = size2; + button.updateSensorLabel( tempArea[num], (char *)sensor.getName( num, sensorName ) ); + } +} + +void updateSensorLabels( ) +{ + sensorName_t sensorName; + for ( uint8_t thisSensor = 0; thisSensor < sensor.count(); thisSensor++ ) + button.updateSensorLabel( tempArea[thisSensor], (char *)sensor.getName( thisSensor, sensorName ) ); +} + static inline __attribute__((always_inline)) void showStatus() { const uint16_t BARS_BOTTOM = 190; @@ -235,50 +264,12 @@ static inline __attribute__((always_inline)) void showStatus() uint16_t channelColor565[NUMBER_OF_CHANNELS]; - if ( tftClearScreen ) { tft.fillScreen( TFT_BACK_COLOR ); button.draw( MENU_BUTTON ); - showIPAddress( ); displayedWiFiStatus = WiFi.status(); - - tft.setTextSize( 0 ); - for ( uint8_t thisSensor = 0; thisSensor < numberOfFoundSensors; thisSensor++ ) - { - tempArea[thisSensor].x = 220; - tempArea[thisSensor].y = 70 + thisSensor * 50; - tempArea[thisSensor].w = TFT_BUTTON_WIDTH - 20; - tempArea[thisSensor].h = 30; - tempArea[thisSensor].color = TFT_BACK_COLOR; - tempArea[thisSensor].labelcolor = ILI9341_WHITE; - tempArea[thisSensor].fontsize = size2; - button.updateSensorLabel( tempArea[thisSensor], sensor[thisSensor].name ); - } - drawSensors( true ); - } - - if ( numberOfFoundSensors && !tftClearScreen ) - { - struct savedSensor_t - { - char name[ sizeof( sensor->name ) ]; - }; - - static savedSensor_t savedSensor[MAX_NUMBER_OF_SENSORS]; - - for ( auto thisSensor = 0; thisSensor < numberOfFoundSensors; thisSensor++ ) - { - if ( strcmp( sensor[thisSensor].name, savedSensor[thisSensor].name ) != 0 ) - { - ESP_LOGI( TAG, "Updating sensor %i label from '%s' to '%s'.", thisSensor, savedSensor[thisSensor].name, sensor[thisSensor].name ); - - button.updateSensorLabel( tempArea[thisSensor], sensor[thisSensor].name ); - - strncpy( savedSensor[thisSensor].name, sensor[thisSensor].name, sizeof( sensor->name ) ); - } - } } static float oldPercentage[NUMBER_OF_CHANNELS]; @@ -356,7 +347,6 @@ static inline __attribute__((always_inline)) void showStatus() oldPercentage[ channelNumber ] = channel[channelNumber].currentPercentage; averageLedBrightness += ledcRead( channelNumber ); } - tftClearScreen = false; averageLedBrightness = averageLedBrightness / NUMBER_OF_CHANNELS; @@ -364,7 +354,38 @@ static inline __attribute__((always_inline)) void showStatus() ledcWrite( TFT_BACKLIGHT_CHANNEL, ( averageLedBrightness > rawBrightness ) ? rawBrightness : averageLedBrightness ); - drawSensors( false ); + static uint8_t lastCount{0}; + static sensorName_t displayedName[MAX_NUMBER_OF_SENSORS]; + static float displayedTemp[MAX_NUMBER_OF_SENSORS]; + + if ( tftClearScreen || sensor.count() != lastCount ) + { + memset( displayedName, 0, sizeof( displayedName ) ); + newSensors(); + lastCount = sensor.count(); + } + + for ( uint8_t num = 0; num < sensor.count(); num++ ) + { + //if the name changed update the display + sensorName_t name; + sensor.getName( num, name ); + if ( tftClearScreen || strcmp( displayedName[num], name ) ) + { + button.updateSensorLabel( tempArea[num], name ); + memcpy( displayedName[num], name, sizeof( sensorName_t ) ); + } + + // if the temperature changed update the display + if ( tftClearScreen || displayedTemp[num] != sensor.temp( num ) ) + { + snprintf( tempArea[num].text, sizeof( tempArea[num].text ), " %.1f%c ", sensor.temp( num ), char(247) ); + button.updateText( tempArea[num] ); + displayedTemp[num] = sensor.temp( num ); + } + } + + tftClearScreen = false; struct tm timeinfo; @@ -435,7 +456,6 @@ static inline __attribute__((always_inline)) void drawMenuButtons() button.draw( EXIT_BUTTON ); } - static inline __attribute__((always_inline)) uint16_t mapUint16( const uint16_t &x, const uint16_t &in_min, const uint16_t &in_max, const uint16_t &out_min, const uint16_t &out_max) { return ( x - in_min ) * ( out_max - out_min ) / ( in_max - in_min ) + out_min; @@ -491,33 +511,11 @@ static inline __attribute__((always_inline)) void showIPAddress( ) tft.print( buff ); } -void drawSensors( const bool &forceDraw ) +void drawSensors() { - if ( numberOfFoundSensors ) - { - static float currentTemp[MAX_NUMBER_OF_SENSORS]; - - for ( uint8_t thisSensor = 0; thisSensor < numberOfFoundSensors; thisSensor++ ) - { - if ( sensor[ thisSensor ].tempCelcius != currentTemp[ thisSensor ] || sensor[thisSensor].error || forceDraw ) /* only update temp if changed */ - { - if ( sensor[ thisSensor ].error ) - { - tempArea[thisSensor].labelcolor = ILI9341_YELLOW; /* show temp as in error */ - snprintf( tempArea[thisSensor].text, sizeof( tempArea[thisSensor].text ), " ERROR " ); - button.updateText( tempArea[thisSensor] ); - currentTemp[thisSensor] = -273; - return; - } - else - { - snprintf( tempArea[thisSensor].text, sizeof( tempArea[thisSensor].text ), " %.1f%c ", sensor[thisSensor].tempCelcius, char(247) ); - button.updateText( tempArea[thisSensor] ); - } - } - currentTemp[ thisSensor ] = sensor[ thisSensor ].tempCelcius; - } - } + sensorName_t sensorName; + for ( uint8_t thisSensor = 0; thisSensor < sensor.count(); thisSensor++ ) + button.updateSensorLabel( tempArea[thisSensor], (char *)sensor.getName( thisSensor, sensorName ) ); } //tftButton:: functions diff --git a/webif/index.htm b/webif/index.htm index 82a2857..4f92f6a 100644 --- a/webif/index.htm +++ b/webif/index.htm @@ -133,25 +133,22 @@ while ( channelValue[sensorNumber + 7].length > 0 ) { var temp = channelValue[sensorNumber + 7].split(","); - console.log(temp); - if ( temp[1] != "ERROR" ) - str += String( '

' + temp[0].toLowerCase() + "
" + temp[1].substring( 0, temp[1].indexOf( "." ) + 2 ) + "°

" ); - else - str += String( '

' + temp[0].toLowerCase() + "
ERROR

" ); + console.log(temp); + str += String( '

' + temp[0].toLowerCase() + "
" + temp[1].substring( 0, temp[1].indexOf( "." ) + 2 ) + "°

" ); sensorNumber++; } - if (str.length) + if (sensorNumber) { - $( "#tempBox" ).show(); $( "#tempStats" ).html( str ); + $( "#tempBox" ).show(); } + else + $( "#tempBox" ).hide(); }); }

HOMECHANNELSSETUPEDITOR LOGS FILE MANAGER

-
-

Loading...

-
+

Loading...

Loading...
 

Loading...
 

@@ -175,50 +172,47 @@

Loading...

$( document ).ready( function() { // get the hostname, then the channelcolors and finally the channelnames $.get( "/api/getdevice?hostname=") - .done(function( data ){ - $( "#hostName" ).html( data ); - document.title = data.toUpperCase(); - }) - .fail(function(){ - console.log("failed getting hostname"); - }) - .always(function(){ - getChannelColors(); - }); + .done(function( data ){ + $( "#hostName" ).html( data ); + document.title = data.toUpperCase(); + }) + .fail(function(){ + console.log("failed getting hostname"); + }) + .always(function(){ + getChannelColors(); + }); }); - -//functions function getChannelColors(){ $.get( "/api/getdevice?channelcolors=" ) - .done(function( data ){ - channelColor = data.split("\n"); - channelColor.forEach( function( item, index ){ - $('.bar').eq(index).css( { 'background-color': item, 'box-shadow': "0px 0px 43px 0px " + item } ); - }) - }) - .fail(function(){ - console.log("failed getting channelcolors"); + .done(function( data ){ + channelColor = data.split("\n"); + channelColor.forEach( function( item, index ){ + $('.bar').eq(index).css( { 'background-color': item, 'box-shadow': "0px 0px 43px 0px " + item } ); }) - .always(function(){ - getChannelNames(); - }); + }) + .fail(function(){ + console.log("failed getting channelcolors"); + }) + .always(function(){ + getChannelNames(); + }); } - function getChannelNames(){ $.get( "/api/getdevice?channelnames=" ) - .done(function( data ){ - var channelNames = data.split("\n"); - channelNames.forEach( function( item, index ){ - $('.name p').eq(index).html( item.trim() ); - }) - }) - .fail(function(){ - console.log("failed getting channelnames"); + .done(function( data ){ + var channelNames = data.split("\n"); + channelNames.forEach( function( item, index ){ + $('.name p').eq(index).html( item.trim() ); }) - .always(function(){ - updateBargraph(); - repeatTimer = setInterval( updateBargraph, 1000 ); //done with getting stuff - }); + }) + .fail(function(){ + console.log("failed getting channelnames"); + }) + .always(function(){ + updateBargraph(); + repeatTimer = setInterval( updateBargraph, 1000 ); //done with getting stuff + }); } diff --git a/webif/index_htm.h b/webif/index_htm.h index 6ed06ac..678cfae 100644 --- a/webif/index_htm.h +++ b/webif/index_htm.h @@ -243,12 +243,9 @@ const uint8_t index_htm[] = { 0x6e, 0x6e, 0x65, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x5b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x2b, 0x20, 0x37, 0x5d, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x22, 0x2c, - 0x22, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, - 0x74, 0x65, 0x6d, 0x70, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x5b, 0x31, - 0x5d, 0x20, 0x21, 0x3d, 0x20, 0x22, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x22, - 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x22, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x74, 0x65, + 0x6d, 0x70, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x20, 0x2b, 0x3d, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x20, 0x27, 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x65, 0x6d, 0x70, 0x53, 0x74, 0x72, 0x22, 0x3e, 0x27, 0x20, @@ -260,26 +257,21 @@ const uint8_t index_htm[] = { 0x6d, 0x70, 0x5b, 0x31, 0x5d, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x20, 0x22, 0x2e, 0x22, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x22, 0xc2, 0xb0, 0x3c, 0x2f, 0x70, 0x3e, - 0x22, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x73, 0x74, 0x72, 0x20, 0x2b, 0x3d, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x28, 0x20, 0x27, 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x3d, 0x22, 0x74, 0x65, 0x6d, 0x70, 0x53, 0x74, 0x72, 0x22, 0x3e, 0x27, - 0x20, 0x2b, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x5b, 0x30, 0x5d, 0x2e, 0x74, - 0x6f, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, 0x28, 0x29, - 0x20, 0x2b, 0x20, 0x22, 0x3c, 0x62, 0x72, 0x3e, 0x45, 0x52, 0x52, 0x4f, - 0x52, 0x3c, 0x2f, 0x70, 0x3e, 0x22, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x2b, 0x2b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, - 0x72, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, - 0x20, 0x22, 0x23, 0x74, 0x65, 0x6d, 0x70, 0x42, 0x6f, 0x78, 0x22, 0x20, - 0x29, 0x2e, 0x73, 0x68, 0x6f, 0x77, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x20, 0x22, 0x23, 0x74, 0x65, 0x6d, - 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x20, 0x29, 0x2e, 0x68, 0x74, - 0x6d, 0x6c, 0x28, 0x20, 0x73, 0x74, 0x72, 0x20, 0x29, 0x3b, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, + 0x22, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2b, + 0x2b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x20, 0x22, 0x23, + 0x74, 0x65, 0x6d, 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x20, 0x29, + 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x73, 0x74, 0x72, 0x20, 0x29, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x20, 0x22, + 0x23, 0x74, 0x65, 0x6d, 0x70, 0x42, 0x6f, 0x78, 0x22, 0x20, 0x29, 0x2e, + 0x73, 0x68, 0x6f, 0x77, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x20, 0x22, 0x23, 0x74, 0x65, + 0x6d, 0x70, 0x42, 0x6f, 0x78, 0x22, 0x20, 0x29, 0x2e, 0x68, 0x69, 0x64, + 0x65, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x65, 0x64, 0x42, 0x6f, 0x78, 0x22, 0x20, 0x73, 0x74, @@ -312,227 +304,220 @@ const uint8_t index_htm[] = { 0x70, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x42, 0x6f, 0x78, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x65, - 0x64, 0x42, 0x6f, 0x78, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x68, 0x33, - 0x20, 0x69, 0x64, 0x3d, 0x22, 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x22, 0x3e, 0x4c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x2e, 0x2e, - 0x2e, 0x3c, 0x2f, 0x68, 0x33, 0x3e, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, - 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x6f, 0x78, 0x22, 0x20, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x65, - 0x64, 0x42, 0x6f, 0x78, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, - 0x22, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x62, 0x65, 0x69, 0x67, 0x65, 0x3b, - 0x22, 0x3e, 0x3c, 0x70, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x79, 0x73, - 0x54, 0x69, 0x6d, 0x65, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, - 0x22, 0x74, 0x65, 0x6d, 0x70, 0x53, 0x74, 0x72, 0x22, 0x3e, 0x4c, 0x6f, - 0x61, 0x64, 0x69, 0x6e, 0x67, 0x2e, 0x2e, 0x2e, 0x3c, 0x62, 0x72, 0x3e, - 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x70, - 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x65, 0x6d, 0x70, - 0x53, 0x74, 0x72, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x69, 0x67, - 0x68, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3e, 0x4c, 0x6f, - 0x61, 0x64, 0x69, 0x6e, 0x67, 0x2e, 0x2e, 0x2e, 0x3c, 0x62, 0x72, 0x3e, - 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, - 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, - 0x3d, 0x22, 0x62, 0x61, 0x72, 0x73, 0x42, 0x6f, 0x78, 0x22, 0x20, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, - 0x65, 0x64, 0x42, 0x6f, 0x78, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x64, - 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x62, 0x61, - 0x72, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6c, 0x65, - 0x66, 0x74, 0x3a, 0x30, 0x25, 0x3b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x3a, 0x30, 0x25, 0x3b, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, - 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x3d, 0x22, 0x62, 0x61, 0x72, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, - 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x32, 0x30, 0x25, 0x3b, - 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x30, 0x25, 0x3b, 0x22, 0x3e, - 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x69, - 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x62, 0x61, 0x72, - 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, - 0x74, 0x3a, 0x34, 0x30, 0x25, 0x3b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x3a, 0x30, 0x25, 0x3b, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, - 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x3d, 0x22, 0x62, 0x61, 0x72, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, - 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x36, 0x30, 0x25, 0x3b, - 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x30, 0x25, 0x3b, 0x22, 0x3e, - 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x69, - 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x62, 0x61, 0x72, - 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, - 0x74, 0x3a, 0x38, 0x30, 0x25, 0x3b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x3a, 0x30, 0x25, 0x3b, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, - 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x3d, 0x22, 0x70, 0x63, 0x74, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, - 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x30, 0x3b, 0x62, 0x6f, + 0x64, 0x42, 0x6f, 0x78, 0x22, 0x3e, 0x3c, 0x68, 0x33, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, + 0x4c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x2e, 0x2e, 0x2e, 0x3c, 0x2f, + 0x68, 0x33, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x64, + 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x42, 0x6f, 0x78, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x65, 0x64, 0x42, 0x6f, 0x78, + 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x62, 0x65, 0x69, 0x67, 0x65, 0x3b, 0x22, 0x3e, 0x3c, 0x70, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x79, 0x73, 0x54, 0x69, 0x6d, 0x65, + 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x65, 0x6d, + 0x70, 0x53, 0x74, 0x72, 0x22, 0x3e, 0x4c, 0x6f, 0x61, 0x64, 0x69, 0x6e, + 0x67, 0x2e, 0x2e, 0x2e, 0x3c, 0x62, 0x72, 0x3e, 0x26, 0x6e, 0x62, 0x73, + 0x70, 0x3b, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x74, 0x65, 0x6d, 0x70, 0x53, 0x74, 0x72, 0x22, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x22, 0x3e, 0x4c, 0x6f, 0x61, 0x64, 0x69, 0x6e, + 0x67, 0x2e, 0x2e, 0x2e, 0x3c, 0x62, 0x72, 0x3e, 0x26, 0x6e, 0x62, 0x73, + 0x70, 0x3b, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x62, 0x61, + 0x72, 0x73, 0x42, 0x6f, 0x78, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x65, 0x64, 0x42, 0x6f, + 0x78, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x62, 0x61, 0x72, 0x22, 0x20, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x30, + 0x25, 0x3b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x30, 0x25, 0x3b, + 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x62, + 0x61, 0x72, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6c, + 0x65, 0x66, 0x74, 0x3a, 0x32, 0x30, 0x25, 0x3b, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x30, 0x25, 0x3b, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x62, 0x61, 0x72, 0x22, 0x20, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x34, 0x30, + 0x25, 0x3b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x30, 0x25, 0x3b, + 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x62, + 0x61, 0x72, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6c, + 0x65, 0x66, 0x74, 0x3a, 0x36, 0x30, 0x25, 0x3b, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x30, 0x25, 0x3b, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x62, 0x61, 0x72, 0x22, 0x20, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x38, 0x30, + 0x25, 0x3b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x30, 0x25, 0x3b, + 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x70, + 0x63, 0x74, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6c, + 0x65, 0x66, 0x74, 0x3a, 0x30, 0x3b, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, + 0x3a, 0x30, 0x3b, 0x22, 0x3e, 0x3c, 0x70, 0x3e, 0x30, 0x25, 0x3c, 0x2f, + 0x70, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x70, + 0x63, 0x74, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6c, + 0x65, 0x66, 0x74, 0x3a, 0x32, 0x30, 0x25, 0x3b, 0x62, 0x6f, 0x74, 0x74, + 0x6f, 0x6d, 0x3a, 0x30, 0x3b, 0x22, 0x3e, 0x3c, 0x70, 0x3e, 0x30, 0x25, + 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x70, 0x63, 0x74, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, + 0x22, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x34, 0x30, 0x25, 0x3b, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x30, 0x3b, 0x22, 0x3e, 0x3c, 0x70, 0x3e, 0x30, 0x25, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x70, 0x63, 0x74, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, - 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x32, 0x30, 0x25, 0x3b, + 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x36, 0x30, 0x25, 0x3b, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x30, 0x3b, 0x22, 0x3e, 0x3c, 0x70, 0x3e, 0x30, 0x25, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x70, 0x63, 0x74, 0x22, 0x20, 0x73, 0x74, - 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x34, 0x30, + 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x38, 0x30, 0x25, 0x3b, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x30, 0x3b, 0x22, 0x3e, 0x3c, 0x70, 0x3e, 0x30, 0x25, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x70, 0x63, 0x74, 0x22, 0x20, - 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x3a, - 0x36, 0x30, 0x25, 0x3b, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x30, - 0x3b, 0x22, 0x3e, 0x3c, 0x70, 0x3e, 0x30, 0x25, 0x3c, 0x2f, 0x70, 0x3e, - 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x69, - 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x70, 0x63, 0x74, - 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, - 0x74, 0x3a, 0x38, 0x30, 0x25, 0x3b, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, - 0x3a, 0x30, 0x3b, 0x22, 0x3e, 0x3c, 0x70, 0x3e, 0x30, 0x25, 0x3c, 0x2f, - 0x70, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x3c, - 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, - 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x30, 0x3b, 0x74, 0x6f, 0x70, 0x3a, 0x30, - 0x3b, 0x22, 0x3e, 0x3c, 0x70, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, - 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, - 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, - 0x74, 0x3a, 0x32, 0x30, 0x25, 0x3b, 0x74, 0x6f, 0x70, 0x3a, 0x30, 0x3b, - 0x22, 0x3e, 0x3c, 0x70, 0x3e, 0x32, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, - 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, - 0x3a, 0x34, 0x30, 0x25, 0x3b, 0x74, 0x6f, 0x70, 0x3a, 0x30, 0x3b, 0x22, - 0x3e, 0x3c, 0x70, 0x3e, 0x33, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x64, - 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, - 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x3a, - 0x36, 0x30, 0x25, 0x3b, 0x74, 0x6f, 0x70, 0x3a, 0x30, 0x3b, 0x22, 0x3e, - 0x3c, 0x70, 0x3e, 0x34, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x64, 0x69, - 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x73, - 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x38, - 0x30, 0x25, 0x3b, 0x74, 0x6f, 0x70, 0x3a, 0x30, 0x3b, 0x22, 0x3e, 0x3c, - 0x70, 0x3e, 0x35, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, - 0x3e, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x64, 0x69, - 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 0x65, 0x6d, 0x70, 0x42, 0x6f, - 0x78, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x68, - 0x61, 0x64, 0x6f, 0x77, 0x65, 0x64, 0x42, 0x6f, 0x78, 0x22, 0x20, 0x73, - 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, - 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x62, - 0x65, 0x69, 0x67, 0x65, 0x3b, 0x22, 0x3e, 0x3c, 0x70, 0x20, 0x69, 0x64, - 0x3d, 0x22, 0x74, 0x65, 0x6d, 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, - 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x65, 0x6d, 0x70, - 0x53, 0x74, 0x72, 0x22, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x64, - 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, - 0x0a, 0x24, 0x28, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x20, 0x29, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x79, 0x28, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, - 0x20, 0x2f, 0x2f, 0x20, 0x67, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x20, 0x22, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x3f, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x3d, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, - 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, - 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x24, 0x28, 0x20, 0x22, 0x23, 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, - 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x74, - 0x69, 0x74, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x74, 0x6f, 0x55, 0x70, 0x70, 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, 0x28, - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, - 0x67, 0x28, 0x22, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x67, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, - 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x28, - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, - 0x29, 0x3b, 0x0a, 0x0a, 0x2f, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x67, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x43, - 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x24, - 0x2e, 0x67, 0x65, 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x67, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x3f, 0x63, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x3d, - 0x22, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, - 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, - 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6c, - 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x70, - 0x6c, 0x69, 0x74, 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x3b, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, - 0x68, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, - 0x20, 0x69, 0x74, 0x65, 0x6d, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x24, 0x28, 0x27, 0x2e, 0x62, 0x61, 0x72, 0x27, 0x29, 0x2e, 0x65, 0x71, - 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x2e, 0x63, 0x73, 0x73, 0x28, - 0x20, 0x7b, 0x20, 0x27, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, - 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x27, 0x3a, 0x20, 0x69, - 0x74, 0x65, 0x6d, 0x2c, 0x20, 0x27, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x68, - 0x61, 0x64, 0x6f, 0x77, 0x27, 0x3a, 0x20, 0x22, 0x30, 0x70, 0x78, 0x20, - 0x30, 0x70, 0x78, 0x20, 0x34, 0x33, 0x70, 0x78, 0x20, 0x30, 0x70, 0x78, - 0x20, 0x22, 0x20, 0x2b, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x7d, 0x20, - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2e, - 0x66, 0x61, 0x69, 0x6c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x3a, 0x30, 0x3b, 0x74, 0x6f, 0x70, 0x3a, 0x30, 0x3b, 0x22, 0x3e, 0x3c, + 0x70, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x32, 0x30, + 0x25, 0x3b, 0x74, 0x6f, 0x70, 0x3a, 0x30, 0x3b, 0x22, 0x3e, 0x3c, 0x70, + 0x3e, 0x32, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x34, 0x30, 0x25, + 0x3b, 0x74, 0x6f, 0x70, 0x3a, 0x30, 0x3b, 0x22, 0x3e, 0x3c, 0x70, 0x3e, + 0x33, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, + 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, + 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x36, 0x30, 0x25, 0x3b, + 0x74, 0x6f, 0x70, 0x3a, 0x30, 0x3b, 0x22, 0x3e, 0x3c, 0x70, 0x3e, 0x34, + 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x38, 0x30, 0x25, 0x3b, 0x74, + 0x6f, 0x70, 0x3a, 0x30, 0x3b, 0x22, 0x3e, 0x3c, 0x70, 0x3e, 0x35, 0x3c, + 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x74, 0x65, 0x6d, 0x70, 0x42, 0x6f, 0x78, 0x22, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, + 0x65, 0x64, 0x42, 0x6f, 0x78, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x3d, 0x22, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x62, 0x65, 0x69, 0x67, 0x65, + 0x3b, 0x22, 0x3e, 0x3c, 0x70, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 0x65, + 0x6d, 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x74, 0x65, 0x6d, 0x70, 0x53, 0x74, 0x72, 0x22, + 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, + 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x24, 0x28, 0x20, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x29, 0x2e, 0x72, + 0x65, 0x61, 0x64, 0x79, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x2f, 0x2f, 0x20, + 0x67, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x6f, 0x73, 0x74, + 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x69, 0x6e, + 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x0a, 0x20, 0x20, + 0x24, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x67, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x3f, 0x68, + 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x20, 0x22, 0x23, 0x68, 0x6f, + 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x29, 0x2e, 0x68, 0x74, + 0x6d, 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x74, 0x6f, 0x55, 0x70, 0x70, 0x65, 0x72, 0x43, 0x61, 0x73, + 0x65, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, + 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x22, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x29, + 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x61, 0x6c, + 0x77, 0x61, 0x79, 0x73, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, + 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6c, 0x6f, 0x72, + 0x73, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, + 0x29, 0x3b, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x67, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, + 0x6c, 0x6f, 0x72, 0x73, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, + 0x67, 0x65, 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, + 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x3f, 0x63, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x3d, 0x22, + 0x20, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x22, + 0x5c, 0x6e, 0x22, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x66, + 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x2c, 0x20, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x2e, 0x62, 0x61, 0x72, 0x27, 0x29, + 0x2e, 0x65, 0x71, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x2e, 0x63, + 0x73, 0x73, 0x28, 0x20, 0x7b, 0x20, 0x27, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x27, + 0x3a, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x2c, 0x20, 0x27, 0x62, 0x6f, 0x78, + 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x27, 0x3a, 0x20, 0x22, 0x30, + 0x70, 0x78, 0x20, 0x30, 0x70, 0x78, 0x20, 0x34, 0x33, 0x70, 0x78, 0x20, + 0x30, 0x70, 0x78, 0x20, 0x22, 0x20, 0x2b, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x20, 0x7d, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, + 0x6c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, + 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x22, 0x66, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x20, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x22, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x61, + 0x6c, 0x77, 0x61, 0x79, 0x73, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, + 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, + 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, + 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x67, 0x65, 0x74, + 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x74, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x3f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x3d, 0x22, 0x20, 0x29, 0x0a, 0x20, + 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x63, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x22, + 0x5c, 0x6e, 0x22, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x66, + 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x2c, 0x20, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x70, 0x27, 0x29, 0x2e, 0x65, 0x71, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x2e, 0x74, 0x72, 0x69, 0x6d, 0x28, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x22, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x67, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x63, 0x6f, - 0x6c, 0x6f, 0x72, 0x73, 0x22, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x61, 0x6c, 0x77, 0x61, - 0x79, 0x73, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, - 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, - 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, - 0x7d, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x67, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x67, - 0x65, 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, - 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x3f, 0x63, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x3d, 0x22, 0x20, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, - 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, - 0x61, 0x72, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, - 0x70, 0x6c, 0x69, 0x74, 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x3b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, - 0x63, 0x68, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x28, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x24, 0x28, 0x27, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x70, 0x27, - 0x29, 0x2e, 0x65, 0x71, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x2e, - 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x74, - 0x72, 0x69, 0x6d, 0x28, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, - 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x22, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, - 0x20, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x29, 0x3b, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x28, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6e, 0x67, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x22, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x28, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x61, 0x72, 0x67, 0x72, 0x61, 0x70, 0x68, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x54, 0x69, 0x6d, 0x65, - 0x72, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x28, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, - 0x61, 0x72, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2c, 0x20, 0x31, 0x30, 0x30, - 0x30, 0x20, 0x29, 0x3b, 0x20, 0x20, 0x2f, 0x2f, 0x64, 0x6f, 0x6e, 0x65, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x20, 0x73, 0x74, 0x75, 0x66, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x3e, 0x0a, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, - 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a + 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, + 0x3d, 0x20, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x28, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x61, 0x72, + 0x67, 0x72, 0x61, 0x70, 0x68, 0x2c, 0x20, 0x31, 0x30, 0x30, 0x30, 0x20, + 0x29, 0x3b, 0x20, 0x20, 0x2f, 0x2f, 0x64, 0x6f, 0x6e, 0x65, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x20, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x73, 0x74, 0x75, 0x66, 0x66, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, + 0x7d, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, + 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x2f, 0x68, 0x74, + 0x6d, 0x6c, 0x3e, 0x0a }; -const unsigned int index_htm_len = 6416; +const unsigned int index_htm_len = 6232; diff --git a/webif/setup.htm b/webif/setup.htm index ecd9c99..e73b00b 100644 --- a/webif/setup.htm +++ b/webif/setup.htm @@ -112,12 +112,16 @@ input#timeZoneTextBox{ width:450px; } -.sensorBar{ +.sensorname, .sensorbutton{ display:none; } input.sensorNameInput, input#hostNameInput, input#passwordInput{ width:250px; } +.collapsable{ + height:45px; + overflow:hidden; +} @@ -128,39 +132,45 @@

 

Light and device setup.

-

LIGHT SETUP

+

+
+
+

DEVICE SETUP

+
+

TIME ZONE(EXAMPLES)

+

HOST NAME

+

CHANGE ADMIN PASSWORD

+
+
+
+

LIGHTS

-
-

SETUP WARNINGS/MESSAGES

-

Only authorized users can change settings.

-
-
-

DEVICE SETUP

+
+

SENSORS

-

TIME ZONE (EXAMPLES)

-

HOST NAME

-

SENSOR 1 NAME

-

SENSOR 2 NAME

-

SENSOR 3 NAME

+

SEARCH FOR SENSORS

+

TEMPERATURE LOGGING

+

SENSOR ERROR LOGGING

+

 

+

 

+

 

+
+
+
+

DISPLAYS

+

TFT ORIENTATION 

TFT MAX BRIGHTNESS 

OLED ORIENTATION 

OLED CONTRAST 

-
-

ADMIN SETUP

-
-

CHANGE ADMIN PASSWORD

-

LOG SENSOR ERRORS

-
-
-
-

DEVICE STATUS

+
+

STATUS

SYSTEM START:  

@@ -247,25 +257,34 @@

DEVICE STATUS

if ( data.status != 501 ) $( '#deviceStatus' ).html( "Error getting tft orientation." ); }) .always( function( data ){ - if ( getAllValues ) - { - getSensorLoggingStatus(); - } + if ( getAllValues ) getSensorLoggingStatus(); }); } function getSensorLoggingStatus(){ $.get("/api/getdevice?sensorlogging=") .done( function( data ){ $('#sensorLogging').prop('value', data); + $('.sensorbutton').show(); }) .fail( function( data ){ + if ( data.status != 501 ) $( '#deviceStatus' ).html( "Error getting sensor status." ); console.log(data); }) .always( function( data ){ - if ( getAllValues ) - { - getTftMaxBrightness(); - } + if ( getAllValues ) getSensorErrorLoggingStatus(); + }); +} +function getSensorErrorLoggingStatus(){ + $.get("/api/getdevice?sensorerrorlogging=") + .done( function( data ){ + $('#sensorErrorLogging').prop('value', data); + }) + .fail( function( data ){ + if ( data.status != 501 ) $( '#deviceStatus' ).html( "Error getting sensor status." ); + console.log(data); + }) + .always( function( data ){ + if ( getAllValues ) getTftMaxBrightness(); }); } function getTftMaxBrightness(){ @@ -278,10 +297,7 @@

DEVICE STATUS

if ( data.status != 501 ) $( '#deviceStatus' ).html( "Error getting tft brightness."); }) .always( function( data ){ - if ( getAllValues ) - { - getTimeZone(); - } + if ( getAllValues ) getTimeZone(); }); } function getTimeZone(){ @@ -293,10 +309,7 @@

DEVICE STATUS

$( '#deviceStatus' ).html( data.statusText ); }) .always( function( data ){ - if ( getAllValues ) - { - getLightStatus(); - } + if ( getAllValues ) getLightStatus(); }); } function getLightStatus(){ @@ -304,22 +317,37 @@

DEVICE STATUS

.done( function( data ){ var item = data.split('\n'); $('#lightStatus').html( item[6] ); - var sensor = 0; - while ( item[7 + sensor] ){ - $('.sensorBar').eq( sensor ).show(); - var temp = item[7 + sensor].split(','); - $('.sensorBar .itemName').eq( sensor ).prepend( temp[1].substring( 0, temp[1].indexOf( "." ) + 2 ) + "°C - " ); - $('.sensorNameInput').eq( sensor ).val( temp[0] ); - sensor++; - } }) .fail( function( data ){ $( '#deviceStatus' ).html( "Error getting lightstatus." ); }) .always( function( data ){ - if ( getAllValues ) getWifiSSID(); + if ( getAllValues ) getSensors(); }); } +function getSensors(){ + $.get( "/api/getdevice?sensors") + .done( function(data){ + var item=data.split('\n'); + var sensor=0; + while(item[sensor]){ + var tempArray=item[sensor].split(','); + var name=tempArray[0];var temp=tempArray[1];var sensorid=tempArray[2]; + if(temp!="nan")temp+="°C"; //TODO: round of temp + else{ + $('.sensorname .itemName').eq(sensor).css("background-color","red"); + temp = "ERROR!"; + } + $('.sensorname .itemName').eq(sensor).html(String(sensorid).toUpperCase()+" - "+temp); + $('.sensorNameInput').eq(sensor).val(name); + $('.sensorname').eq(sensor).show(); + sensor++; + } + $('#deviceStatus').html(""); + }) + .fail(function(){$('#deviceStatus').html("Error getting sensors.");}) + .always(function(){if(getAllValues)getWifiSSID()}); +} function getWifiSSID(){ $.get( "/api/getdevice?wifissid=") .done( function( data ){ @@ -328,9 +356,7 @@

DEVICE STATUS

.fail( function( data ){ $( '#wifissid' ).html( "Error getting wifi SSID: " + data.statusText ); }) - .always( function( data ){ - if ( getAllValues ) getBootTime(); - }); + .always( function( data ){if(getAllValues)getBootTime();}); } function getBootTime(){ $.get( "/api/getdevice?boottime=") @@ -340,9 +366,7 @@

DEVICE STATUS

.fail( function( data ){ $( '#deviceStatus' ).html( "Error getting boottime: " + data.statusText ); }) - .always( function( data ){ - if ( getAllValues ) getDiskSpace(); - }); + .always( function( data ){if ( getAllValues ) getDiskSpace();}); } function getDiskSpace(){ $.get( "/api/getdevice?diskspace=") @@ -353,9 +377,7 @@

DEVICE STATUS

.fail( function( data ){ if ( data.status != 501 ) $( '#deviceStatus' ).html( "Error getting diskspace: " + data.responseText ); }) - .always( function( data ){ - if ( getAllValues ) getPwmDepth(); - }); + .always( function( data ){if ( getAllValues ) getPwmDepth();}); } function getPwmDepth(){ @@ -366,9 +388,7 @@

DEVICE STATUS

.fail( function( data ){ $( '#deviceStatus' ).html( "Error getting pwmdepth " + data.responseText ); }) - .always( function( data ){ - if ( getAllValues ) getVersion(); - }); + .always( function( data ){if ( getAllValues ) getVersion();}); } function getVersion() { @@ -385,9 +405,7 @@

DEVICE STATUS

.fail( function( data ){ $( '#deviceStatus' ).html( "Error getting version: " + data.responseText ); }) - .always( function( data ){ - if ( getAllValues ) getPwmFrequency(); - }); + .always( function( data ){if ( getAllValues ) getPwmFrequency();}); } function getPwmFrequency(){ $.get( "/api/getdevice?pwmfrequency=") @@ -403,21 +421,16 @@

DEVICE STATUS

$('body').css('opacity','1'); /* and show the page */ }); } - /* event handlers */ - $('#timeZoneTextBox, #hostNameInput, #passwordInput, .sensorNameInput').on('input', function() { $( this ).css({'background':'yellow'}); }); - $('input').on( 'input', function() { $('#deviceStatus').html(''); }); - $('input[type="button"]').on( 'click', function() { $('#deviceStatus').html(''); }); - $('#passwordInput').on('change', function( event ) { if (!confirm("You are about to change the admin password.\nAre you sure?") ) { return; @@ -433,7 +446,6 @@

DEVICE STATUS

$('#passwordInput').css({'background':'red'}); }); }); - $('#oledOrientationSlider').on('change', function( event ) { $(this).val() == 1 ? $('#oledOrientationValue').html( 'upsidedown' ): $('#oledOrientationValue').html( 'normal' ); $.post( "/api/setdevice", @@ -449,7 +461,6 @@

DEVICE STATUS

getOledOrientation(); }); }); - $('#tftOrientationSlider').on('change', function( event ) { if ( $(this).val() == 0 ) $('#tftOrientation').html('normal'); if ( $(this).val() == 1 ) $('#tftOrientation').html('upsidedown'); @@ -464,7 +475,6 @@

DEVICE STATUS

getTftOrientation(); }); }); - $('#lightsOn').on('click', function() { $.post( "/api/setdevice", { @@ -477,7 +487,6 @@

DEVICE STATUS

$( '#deviceStatus' ).html( data.statusText ); }); }); - $('#lightsOff').on('click', function() { $.post( "/api/setdevice", { @@ -490,7 +499,6 @@

DEVICE STATUS

$( '#deviceStatus' ).html( data.statusText ); }); }); - $('#lightsProgram').on('click', function() { $.post( "/api/setdevice", { @@ -503,7 +511,6 @@

DEVICE STATUS

$( '#deviceStatus' ).html( data.statusText ); }); }); - $('#hostNameInput').on('change', function( data ) { $('#deviceStatus').html("Checking network for hostname " + $(this).val() + "..." ); $.post( "/api/setdevice", @@ -520,11 +527,9 @@

DEVICE STATUS

$( '#hostNameInput' ).css({'background':'red'}); }); }); - $('#oledContrastSlider').on('input', function() { $('#oledContrastValue').html( $(this).val() ); }); - $('#oledContrastSlider').on('change', function() { $.post( "/api/setdevice", { @@ -538,11 +543,9 @@

DEVICE STATUS

getOledContrast(); }); }); - $('#tftBrightnessSlider').on('input', function() { $('#tftBrightnessValue').html( parseInt( $(this).val() ) + "%" ); }); - $('#tftBrightnessSlider').on('change', function() { $.post( "/api/setdevice", { @@ -555,7 +558,6 @@

DEVICE STATUS

getTftMaxBrightness(); }); }); - $('#timeZoneTextBox').on('change', function( data ) { $.post( '/api/setdevice', { @@ -569,7 +571,19 @@

DEVICE STATUS

$('#timeZoneTextBox').css( {'background':'red'} ); }); }); /* last in chain setup */ - +$('#sensorErrorLogging').on('click',function(data){ + $.post("/api/setdevice", + { + sensorerrorlogging : $(this).val() === "OFF" ? "ON" : "OFF" + }) + .done( function(data){ + $('#sensorErrorLogging').prop('value',data); + $('#deviceStatus').html('SENSOR ERROR LOGGING IS NOW '+data); + }) + .fail( function(data){ + $('#deviceStatus').html(data.statusText); + }); +}); $('#sensorLogging').on('click',function(data){ $.post("/api/setdevice", { @@ -583,7 +597,6 @@

DEVICE STATUS

$('#deviceStatus').html(data.statusText); }); }); - $('.sensorNameInput').on('change', function( data ) { var sensor = $(this).index('.sensorNameInput'); $.post( "/api/setdevice", @@ -599,6 +612,26 @@

DEVICE STATUS

$( '.sensorNameInput' ).eq( sensor ).css({'background':'red'}); }); }); +$('#sensorScan').on('click', function( data ) { + $( '#deviceStatus' ).html( "Scanning..." ); + $.post("/api/setdevice", + { + sensorscan:true + }) + .done(function(data){ + var updateSensors = setTimeout( getSensors, 3000 ); + $('p.item.sensorname').hide(); + }) + .fail(function(data){ + console.log(data); + }); +}); + + +$('.collapsable').on('click', function() { + $('.collapsable').css('height','45px').css('cursor','pointer'); + $(this).css('height','auto').css('cursor',''); +}); diff --git a/webif/setup_htm.h b/webif/setup_htm.h index 4510b8f..c2c8ac7 100644 --- a/webif/setup_htm.h +++ b/webif/setup_htm.h @@ -139,436 +139,500 @@ const uint8_t setup_htm[] = { 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x54, 0x65, 0x78, 0x74, 0x42, 0x6f, 0x78, 0x7b, 0x0a, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x34, 0x35, 0x30, 0x70, 0x78, 0x3b, 0x0a, 0x7d, 0x0a, 0x2e, 0x73, 0x65, 0x6e, 0x73, - 0x6f, 0x72, 0x42, 0x61, 0x72, 0x7b, 0x0a, 0x20, 0x20, 0x64, 0x69, 0x73, - 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x0a, 0x7d, - 0x0a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2c, 0x20, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x23, 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x70, - 0x75, 0x74, 0x23, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x7b, 0x0a, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, - 0x68, 0x3a, 0x32, 0x35, 0x30, 0x70, 0x78, 0x3b, 0x0a, 0x7d, 0x0a, 0x3c, - 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x0a, 0x3c, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, - 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x6a, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6a, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x2d, 0x33, 0x2e, 0x32, 0x2e, 0x31, 0x2e, 0x6a, 0x73, - 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, - 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x62, 0x6f, 0x64, - 0x79, 0x3e, 0x0a, 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, - 0x22, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x65, 0x64, 0x42, 0x6f, 0x78, - 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x62, 0x61, 0x63, - 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, - 0x72, 0x3a, 0x62, 0x65, 0x69, 0x67, 0x65, 0x3b, 0x22, 0x3e, 0x3c, 0x61, - 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x4c, 0x69, 0x6e, 0x6b, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, - 0x3d, 0x22, 0x2f, 0x22, 0x3e, 0x48, 0x4f, 0x4d, 0x45, 0x3c, 0x2f, 0x61, - 0x3e, 0x3c, 0x61, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, - 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x69, 0x6e, 0x6b, 0x22, 0x20, 0x68, - 0x72, 0x65, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x73, 0x22, 0x3e, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x53, 0x3c, - 0x2f, 0x61, 0x3e, 0x3c, 0x61, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, - 0x22, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x69, 0x6e, 0x6b, 0x22, - 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x73, 0x65, 0x74, 0x75, 0x70, - 0x22, 0x3e, 0x53, 0x45, 0x54, 0x55, 0x50, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, + 0x6f, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x7b, 0x0a, 0x20, + 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, + 0x65, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x73, + 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x23, 0x68, 0x6f, + 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2c, + 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x23, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x7b, 0x0a, 0x20, 0x20, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x32, 0x35, 0x30, 0x70, 0x78, 0x3b, + 0x0a, 0x7d, 0x0a, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x7b, 0x0a, 0x20, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x3a, 0x34, 0x35, 0x70, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x6f, 0x76, + 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x68, 0x69, 0x64, 0x64, 0x65, + 0x6e, 0x3b, 0x0a, 0x7d, 0x0a, 0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x3e, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x73, 0x72, + 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x63, + 0x6f, 0x64, 0x65, 0x2e, 0x6a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x6a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2d, 0x33, 0x2e, + 0x32, 0x2e, 0x31, 0x2e, 0x6a, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, + 0x3e, 0x0a, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x70, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x68, 0x61, 0x64, 0x6f, + 0x77, 0x65, 0x64, 0x42, 0x6f, 0x78, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, + 0x65, 0x3d, 0x22, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x62, 0x65, 0x69, 0x67, + 0x65, 0x3b, 0x22, 0x3e, 0x3c, 0x61, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x69, 0x6e, 0x6b, + 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x22, 0x3e, 0x48, + 0x4f, 0x4d, 0x45, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x61, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, + 0x69, 0x6e, 0x6b, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x63, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x22, 0x3e, 0x43, 0x48, 0x41, + 0x4e, 0x4e, 0x45, 0x4c, 0x53, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x61, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x4c, 0x69, 0x6e, 0x6b, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x73, 0x65, 0x74, 0x75, 0x70, 0x22, 0x3e, 0x53, 0x45, 0x54, 0x55, + 0x50, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x61, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x69, 0x6e, + 0x6b, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x65, 0x64, 0x69, + 0x74, 0x6f, 0x72, 0x22, 0x3e, 0x45, 0x44, 0x49, 0x54, 0x4f, 0x52, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x69, 0x6e, 0x6b, + 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x6c, 0x6f, 0x67, 0x73, + 0x22, 0x3e, 0x4c, 0x4f, 0x47, 0x53, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x69, 0x6e, 0x6b, 0x22, 0x20, 0x68, 0x72, 0x65, - 0x66, 0x3d, 0x22, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x22, 0x3e, 0x45, - 0x44, 0x49, 0x54, 0x4f, 0x52, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x61, - 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x4c, 0x69, 0x6e, 0x6b, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, - 0x3d, 0x22, 0x6c, 0x6f, 0x67, 0x73, 0x22, 0x3e, 0x4c, 0x4f, 0x47, 0x53, - 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x3d, 0x22, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x69, 0x6e, - 0x6b, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x66, 0x69, 0x6c, - 0x65, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x22, 0x3e, 0x46, 0x49, - 0x4c, 0x45, 0x20, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x52, 0x3c, 0x2f, - 0x61, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, - 0x69, 0x64, 0x3d, 0x22, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x42, 0x6f, 0x78, - 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x68, 0x61, - 0x64, 0x6f, 0x77, 0x65, 0x64, 0x42, 0x6f, 0x78, 0x22, 0x3e, 0x0a, 0x20, - 0x20, 0x3c, 0x68, 0x32, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x68, 0x6f, 0x73, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x26, 0x6e, 0x62, 0x73, 0x70, - 0x3b, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x70, 0x20, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x22, - 0x3e, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x73, 0x65, 0x74, 0x75, 0x70, 0x2e, - 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, - 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, - 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x65, 0x64, 0x42, 0x6f, 0x78, 0x22, - 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x68, 0x33, 0x3e, 0x4c, 0x49, 0x47, 0x48, - 0x54, 0x20, 0x53, 0x45, 0x54, 0x55, 0x50, 0x3c, 0x2f, 0x68, 0x33, 0x3e, + 0x66, 0x3d, 0x22, 0x66, 0x69, 0x6c, 0x65, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x22, 0x3e, 0x46, 0x49, 0x4c, 0x45, 0x20, 0x4d, 0x41, 0x4e, + 0x41, 0x47, 0x45, 0x52, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, + 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x42, 0x6f, 0x78, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x65, 0x64, 0x42, + 0x6f, 0x78, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x68, 0x32, 0x20, 0x69, + 0x64, 0x3d, 0x22, 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, + 0x3e, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, - 0x22, 0x69, 0x74, 0x65, 0x6d, 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, - 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, - 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x22, 0x3e, - 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c, - 0x69, 0x67, 0x68, 0x74, 0x73, 0x4f, 0x6e, 0x22, 0x20, 0x74, 0x79, 0x70, - 0x65, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x20, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x4c, 0x49, 0x47, 0x48, 0x54, 0x53, - 0x20, 0x4f, 0x4e, 0x22, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x2f, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x69, 0x64, - 0x3d, 0x22, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x4f, 0x66, 0x66, 0x22, - 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, - 0x6e, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x4c, 0x49, - 0x47, 0x48, 0x54, 0x53, 0x20, 0x4f, 0x46, 0x46, 0x22, 0x20, 0x64, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x2f, 0x3e, 0x3c, 0x69, 0x6e, 0x70, - 0x75, 0x74, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x69, 0x67, 0x68, 0x74, - 0x73, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x22, 0x20, 0x74, 0x79, - 0x70, 0x65, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x20, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x4c, 0x49, 0x47, 0x48, 0x54, - 0x53, 0x20, 0x41, 0x55, 0x54, 0x4f, 0x22, 0x20, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x2f, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x3c, + 0x22, 0x69, 0x74, 0x65, 0x6d, 0x22, 0x3e, 0x4c, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, + 0x73, 0x65, 0x74, 0x75, 0x70, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, - 0x65, 0x64, 0x42, 0x6f, 0x78, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x68, - 0x33, 0x3e, 0x53, 0x45, 0x54, 0x55, 0x50, 0x20, 0x57, 0x41, 0x52, 0x4e, - 0x49, 0x4e, 0x47, 0x53, 0x2f, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, - 0x53, 0x3c, 0x2f, 0x68, 0x33, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x70, 0x20, + 0x65, 0x64, 0x42, 0x6f, 0x78, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x70, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, + 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x3d, 0x22, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x70, + 0x3e, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x64, 0x69, + 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x68, 0x61, + 0x64, 0x6f, 0x77, 0x65, 0x64, 0x42, 0x6f, 0x78, 0x20, 0x63, 0x6f, 0x6c, + 0x6c, 0x61, 0x70, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x68, 0x33, 0x3e, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x20, + 0x53, 0x45, 0x54, 0x55, 0x50, 0x3c, 0x2f, 0x68, 0x33, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, + 0x6f, 0x78, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x22, - 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, - 0x3e, 0x4f, 0x6e, 0x6c, 0x79, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x20, 0x63, - 0x61, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x73, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x3c, 0x2f, 0x73, 0x70, 0x61, - 0x6e, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, - 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x3d, 0x22, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x65, 0x64, 0x42, 0x6f, - 0x78, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x68, 0x33, 0x3e, 0x44, 0x45, - 0x56, 0x49, 0x43, 0x45, 0x20, 0x53, 0x45, 0x54, 0x55, 0x50, 0x3c, 0x2f, - 0x68, 0x33, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x42, 0x6f, 0x78, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, - 0x65, 0x6d, 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x4e, 0x61, 0x6d, - 0x65, 0x22, 0x3e, 0x54, 0x49, 0x4d, 0x45, 0x20, 0x5a, 0x4f, 0x4e, 0x45, - 0x20, 0x3c, 0x61, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x77, - 0x65, 0x62, 0x4c, 0x69, 0x6e, 0x6b, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, - 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, - 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x6d, 0x6f, 0x6e, 0x69, 0x74, - 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, - 0x2e, 0x63, 0x61, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x2d, 0x7a, 0x6f, 0x6e, - 0x65, 0x2d, 0x61, 0x62, 0x62, 0x72, 0x65, 0x76, 0x69, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x68, 0x70, 0x22, 0x20, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x22, - 0x3e, 0x28, 0x45, 0x58, 0x41, 0x4d, 0x50, 0x4c, 0x45, 0x53, 0x29, 0x3c, - 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x69, - 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, - 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 0x69, 0x6d, - 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x54, 0x65, 0x78, 0x74, 0x42, 0x6f, 0x78, + 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, + 0x54, 0x49, 0x4d, 0x45, 0x20, 0x5a, 0x4f, 0x4e, 0x45, 0x3c, 0x61, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x77, 0x65, 0x62, 0x4c, 0x69, + 0x6e, 0x6b, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x72, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, + 0x67, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x63, 0x61, 0x2f, + 0x74, 0x69, 0x6d, 0x65, 0x2d, 0x7a, 0x6f, 0x6e, 0x65, 0x2d, 0x61, 0x62, + 0x62, 0x72, 0x65, 0x76, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x70, 0x68, 0x70, 0x22, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, + 0x22, 0x5f, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x22, 0x3e, 0x28, 0x45, 0x58, + 0x41, 0x4d, 0x50, 0x4c, 0x45, 0x53, 0x29, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, + 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, + 0x65, 0x54, 0x65, 0x78, 0x74, 0x42, 0x6f, 0x78, 0x22, 0x3e, 0x3c, 0x2f, + 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x69, 0x74, 0x65, 0x6d, 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x48, 0x4f, 0x53, 0x54, 0x20, 0x4e, 0x41, + 0x4d, 0x45, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x73, 0x70, + 0x61, 0x6e, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, - 0x74, 0x65, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x48, 0x4f, 0x53, - 0x54, 0x20, 0x4e, 0x41, 0x4d, 0x45, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, + 0x74, 0x65, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x43, 0x48, 0x41, + 0x4e, 0x47, 0x45, 0x20, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x20, 0x50, 0x41, + 0x53, 0x53, 0x57, 0x4f, 0x52, 0x44, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, - 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, - 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x20, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3d, 0x22, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, - 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, + 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x22, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x22, 0x3e, 0x3c, 0x2f, + 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x2f, 0x64, + 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x65, 0x64, + 0x42, 0x6f, 0x78, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x68, 0x33, 0x3e, + 0x4c, 0x49, 0x47, 0x48, 0x54, 0x53, 0x3c, 0x2f, 0x68, 0x33, 0x3e, 0x0a, + 0x20, 0x20, 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x69, 0x74, 0x65, 0x6d, 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, + 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x22, 0x3e, 0x3c, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x69, + 0x67, 0x68, 0x74, 0x73, 0x4f, 0x6e, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x4c, 0x49, 0x47, 0x48, 0x54, 0x53, 0x20, + 0x4f, 0x4e, 0x22, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x2f, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x69, 0x64, 0x3d, + 0x22, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x4f, 0x66, 0x66, 0x22, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, + 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x4c, 0x49, 0x47, + 0x48, 0x54, 0x53, 0x20, 0x4f, 0x46, 0x46, 0x22, 0x20, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x2f, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x22, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x4c, 0x49, 0x47, 0x48, 0x54, 0x53, + 0x20, 0x41, 0x55, 0x54, 0x4f, 0x22, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x2f, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x65, + 0x64, 0x42, 0x6f, 0x78, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x68, 0x33, + 0x3e, 0x53, 0x45, 0x4e, 0x53, 0x4f, 0x52, 0x53, 0x3c, 0x2f, 0x68, 0x33, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x42, 0x6f, 0x78, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, - 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x42, 0x61, 0x72, 0x22, 0x3e, - 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, - 0x22, 0x69, 0x74, 0x65, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x53, - 0x45, 0x4e, 0x53, 0x4f, 0x52, 0x20, 0x31, 0x20, 0x4e, 0x41, 0x4d, 0x45, - 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, - 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, - 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x3d, 0x22, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3d, 0x22, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, - 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x20, - 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x42, 0x61, 0x72, 0x22, 0x3e, 0x3c, - 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, - 0x69, 0x74, 0x65, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x53, 0x45, - 0x4e, 0x53, 0x4f, 0x52, 0x20, 0x32, 0x20, 0x4e, 0x41, 0x4d, 0x45, 0x3c, - 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x3e, - 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, - 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x3d, 0x22, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3d, 0x22, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, + 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x22, + 0x3e, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x20, 0x46, 0x4f, 0x52, 0x20, + 0x53, 0x45, 0x4e, 0x53, 0x4f, 0x52, 0x53, 0x3c, 0x2f, 0x73, 0x70, 0x61, + 0x6e, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x20, 0x69, + 0x64, 0x3d, 0x22, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x53, 0x63, 0x61, + 0x6e, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x53, 0x43, + 0x41, 0x4e, 0x22, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, + 0x74, 0x65, 0x6d, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x62, 0x75, + 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x54, 0x45, 0x4d, 0x50, 0x45, 0x52, 0x41, + 0x54, 0x55, 0x52, 0x45, 0x20, 0x4c, 0x4f, 0x47, 0x47, 0x49, 0x4e, 0x47, + 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, + 0x6f, 0x6e, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x22, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x73, - 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x42, 0x61, 0x72, 0x22, 0x3e, 0x3c, 0x73, - 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, - 0x74, 0x65, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x53, 0x45, 0x4e, - 0x53, 0x4f, 0x52, 0x20, 0x33, 0x20, 0x4e, 0x41, 0x4d, 0x45, 0x3c, 0x2f, + 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, + 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, + 0x53, 0x45, 0x4e, 0x53, 0x4f, 0x52, 0x20, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x20, 0x4c, 0x4f, 0x47, 0x47, 0x49, 0x4e, 0x47, 0x3c, 0x2f, 0x73, 0x70, + 0x61, 0x6e, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x22, 0x3e, + 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x20, + 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3e, + 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x69, 0x74, 0x65, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x26, + 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, + 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x22, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x22, 0x3e, 0x3c, 0x2f, + 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x69, 0x74, 0x65, 0x6d, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x4e, 0x61, + 0x6d, 0x65, 0x22, 0x3e, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, - 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x3c, - 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, - 0x6d, 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x4e, 0x61, 0x6d, 0x65, - 0x22, 0x3e, 0x50, 0x57, 0x4d, 0x20, 0x46, 0x52, 0x45, 0x51, 0x55, 0x45, - 0x4e, 0x43, 0x59, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x73, - 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70, 0x77, 0x6d, 0x46, - 0x72, 0x65, 0x71, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x20, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x22, 0x3e, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x2f, - 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, - 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, - 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70, 0x77, 0x6d, 0x46, 0x72, 0x65, 0x71, - 0x53, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3d, 0x22, 0x31, 0x30, 0x30, 0x22, 0x20, 0x6d, 0x69, 0x6e, 0x3d, - 0x22, 0x31, 0x30, 0x30, 0x22, 0x20, 0x6d, 0x61, 0x78, 0x3d, 0x22, 0x31, - 0x30, 0x30, 0x30, 0x30, 0x22, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x2d, 0x2d, - 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x3c, 0x70, + 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x73, 0x65, + 0x6e, 0x73, 0x6f, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x3c, 0x73, + 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, + 0x74, 0x65, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x26, 0x6e, 0x62, + 0x73, 0x70, 0x3b, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x73, + 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x70, + 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x21, 0x2d, 0x2d, 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, + 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, + 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x50, 0x57, 0x4d, 0x20, 0x46, + 0x52, 0x45, 0x51, 0x55, 0x45, 0x4e, 0x43, 0x59, 0x3c, 0x2f, 0x73, 0x70, + 0x61, 0x6e, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x3d, + 0x22, 0x70, 0x77, 0x6d, 0x46, 0x72, 0x65, 0x71, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, + 0x65, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x26, 0x6e, 0x62, + 0x73, 0x70, 0x3b, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x72, + 0x61, 0x6e, 0x67, 0x65, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70, 0x77, + 0x6d, 0x46, 0x72, 0x65, 0x71, 0x53, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x22, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x31, 0x30, 0x30, 0x22, + 0x20, 0x6d, 0x69, 0x6e, 0x3d, 0x22, 0x31, 0x30, 0x30, 0x22, 0x20, 0x6d, + 0x61, 0x78, 0x3d, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x22, 0x3e, 0x3c, + 0x2f, 0x70, 0x3e, 0x2d, 0x2d, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x21, 0x2d, 0x2d, 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x69, 0x74, 0x65, 0x6d, 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, - 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x22, - 0x3e, 0x50, 0x57, 0x4d, 0x20, 0x44, 0x45, 0x50, 0x54, 0x48, 0x3c, 0x2f, - 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, - 0x64, 0x3d, 0x22, 0x70, 0x77, 0x6d, 0x44, 0x65, 0x70, 0x74, 0x68, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x50, 0x57, 0x4d, 0x20, 0x44, 0x45, + 0x50, 0x54, 0x48, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x73, + 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70, 0x77, 0x6d, 0x44, + 0x65, 0x70, 0x74, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, + 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70, 0x77, 0x6d, 0x44, 0x65, 0x70, + 0x74, 0x68, 0x53, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x22, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x31, 0x31, 0x22, 0x20, 0x6d, 0x69, 0x6e, + 0x3d, 0x22, 0x31, 0x31, 0x22, 0x20, 0x6d, 0x61, 0x78, 0x3d, 0x22, 0x31, + 0x36, 0x22, 0x20, 0x73, 0x74, 0x65, 0x70, 0x3d, 0x22, 0x31, 0x22, 0x3e, + 0x3c, 0x2f, 0x70, 0x3e, 0x2d, 0x2d, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, + 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x65, 0x64, 0x42, 0x6f, 0x78, 0x20, + 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x68, 0x33, 0x3e, 0x44, 0x49, 0x53, 0x50, + 0x4c, 0x41, 0x59, 0x53, 0x3c, 0x2f, 0x68, 0x33, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x6f, + 0x78, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x74, + 0x66, 0x74, 0x42, 0x61, 0x72, 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x54, 0x46, 0x54, 0x20, 0x4f, 0x52, + 0x49, 0x45, 0x4e, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x3c, 0x2f, 0x73, + 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x74, 0x66, 0x74, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x20, 0x69, 0x64, 0x3d, - 0x22, 0x70, 0x77, 0x6d, 0x44, 0x65, 0x70, 0x74, 0x68, 0x53, 0x6c, 0x69, - 0x64, 0x65, 0x72, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, - 0x31, 0x31, 0x22, 0x20, 0x6d, 0x69, 0x6e, 0x3d, 0x22, 0x31, 0x31, 0x22, - 0x20, 0x6d, 0x61, 0x78, 0x3d, 0x22, 0x31, 0x36, 0x22, 0x20, 0x73, 0x74, - 0x65, 0x70, 0x3d, 0x22, 0x31, 0x22, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x2d, - 0x2d, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x74, 0x66, - 0x74, 0x42, 0x61, 0x72, 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x54, 0x46, 0x54, 0x20, 0x4f, 0x52, 0x49, - 0x45, 0x4e, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x3c, 0x2f, 0x73, 0x70, - 0x61, 0x6e, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 0x66, 0x74, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x69, 0x6f, 0x6e, 0x53, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x22, 0x20, 0x6d, + 0x69, 0x6e, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x6d, 0x61, 0x78, 0x3d, 0x22, + 0x31, 0x22, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, + 0x65, 0x6d, 0x20, 0x74, 0x66, 0x74, 0x42, 0x61, 0x72, 0x22, 0x3e, 0x3c, + 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x69, 0x74, 0x65, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x54, 0x46, + 0x54, 0x20, 0x4d, 0x41, 0x58, 0x20, 0x42, 0x52, 0x49, 0x47, 0x48, 0x54, + 0x4e, 0x45, 0x53, 0x53, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, + 0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 0x66, 0x74, + 0x42, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, - 0x74, 0x66, 0x74, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x22, 0x20, 0x6d, 0x69, - 0x6e, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x6d, 0x61, 0x78, 0x3d, 0x22, 0x31, - 0x22, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, - 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, - 0x6d, 0x20, 0x74, 0x66, 0x74, 0x42, 0x61, 0x72, 0x22, 0x3e, 0x3c, 0x73, - 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, - 0x74, 0x65, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x54, 0x46, 0x54, - 0x20, 0x4d, 0x41, 0x58, 0x20, 0x42, 0x52, 0x49, 0x47, 0x48, 0x54, 0x4e, - 0x45, 0x53, 0x53, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x73, - 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 0x66, 0x74, 0x42, - 0x72, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, - 0x74, 0x65, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x26, 0x6e, - 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, - 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, - 0x66, 0x74, 0x42, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x65, 0x73, 0x73, - 0x53, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3d, 0x22, 0x31, 0x31, 0x22, 0x20, 0x6d, 0x69, 0x6e, 0x3d, 0x22, - 0x30, 0x22, 0x20, 0x6d, 0x61, 0x78, 0x3d, 0x22, 0x31, 0x30, 0x30, 0x22, - 0x20, 0x73, 0x74, 0x65, 0x70, 0x3d, 0x22, 0x31, 0x22, 0x3e, 0x3c, 0x2f, - 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x6f, 0x6c, - 0x65, 0x64, 0x42, 0x61, 0x72, 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, - 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4f, 0x4c, 0x45, 0x44, 0x20, 0x4f, - 0x52, 0x49, 0x45, 0x4e, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x3c, 0x2f, - 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, - 0x64, 0x3d, 0x22, 0x6f, 0x6c, 0x65, 0x64, 0x4f, 0x72, 0x69, 0x65, 0x6e, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, - 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x26, 0x6e, 0x62, 0x73, 0x70, - 0x3b, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x69, 0x6e, 0x70, - 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x72, 0x61, 0x6e, - 0x67, 0x65, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6f, 0x6c, 0x65, 0x64, - 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x6c, 0x69, 0x64, 0x65, 0x72, 0x22, 0x20, 0x6d, 0x69, 0x6e, 0x3d, 0x22, - 0x30, 0x22, 0x20, 0x6d, 0x61, 0x78, 0x3d, 0x22, 0x31, 0x22, 0x3e, 0x3c, + 0x74, 0x66, 0x74, 0x42, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x65, 0x73, + 0x73, 0x53, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x22, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3d, 0x22, 0x31, 0x31, 0x22, 0x20, 0x6d, 0x69, 0x6e, 0x3d, + 0x22, 0x30, 0x22, 0x20, 0x6d, 0x61, 0x78, 0x3d, 0x22, 0x31, 0x30, 0x30, + 0x22, 0x20, 0x73, 0x74, 0x65, 0x70, 0x3d, 0x22, 0x31, 0x22, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x6f, 0x6c, 0x65, 0x64, 0x42, 0x61, 0x72, 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4f, 0x4c, 0x45, 0x44, 0x20, - 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x53, 0x54, 0x3c, 0x2f, 0x73, 0x70, - 0x61, 0x6e, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x3d, - 0x22, 0x6f, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, - 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x22, 0x3e, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x2f, 0x73, 0x70, - 0x61, 0x6e, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, - 0x70, 0x65, 0x3d, 0x22, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x20, 0x69, - 0x64, 0x3d, 0x22, 0x6f, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x61, 0x73, 0x74, 0x53, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x22, 0x20, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x31, 0x31, 0x22, 0x20, 0x6d, 0x69, - 0x6e, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x6d, 0x61, 0x78, 0x3d, 0x22, 0x31, - 0x35, 0x22, 0x20, 0x73, 0x74, 0x65, 0x70, 0x3d, 0x22, 0x31, 0x22, 0x3e, - 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, - 0x3e, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x64, 0x69, - 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x68, 0x61, - 0x64, 0x6f, 0x77, 0x65, 0x64, 0x42, 0x6f, 0x78, 0x22, 0x3e, 0x0a, 0x20, - 0x20, 0x3c, 0x68, 0x33, 0x3e, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x20, 0x53, - 0x45, 0x54, 0x55, 0x50, 0x3c, 0x2f, 0x68, 0x33, 0x3e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x3d, 0x22, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x6f, - 0x78, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x22, 0x3e, - 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, - 0x22, 0x69, 0x74, 0x65, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x43, - 0x48, 0x41, 0x4e, 0x47, 0x45, 0x20, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x20, - 0x50, 0x41, 0x53, 0x53, 0x57, 0x4f, 0x52, 0x44, 0x3c, 0x2f, 0x73, 0x70, - 0x61, 0x6e, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x69, 0x6e, - 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x70, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, - 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x22, 0x3e, - 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, - 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, - 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4c, 0x4f, 0x47, 0x20, 0x53, - 0x45, 0x4e, 0x53, 0x4f, 0x52, 0x20, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x53, - 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, - 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, - 0x6f, 0x6e, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65, 0x6e, 0x73, - 0x6f, 0x72, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x22, 0x3e, 0x3c, - 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, + 0x4f, 0x52, 0x49, 0x45, 0x4e, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x3c, + 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x6f, 0x6c, 0x65, 0x64, 0x4f, 0x72, 0x69, 0x65, + 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, + 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x26, 0x6e, 0x62, 0x73, + 0x70, 0x3b, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6f, 0x6c, 0x65, + 0x64, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x22, 0x20, 0x6d, 0x69, 0x6e, 0x3d, + 0x22, 0x30, 0x22, 0x20, 0x6d, 0x61, 0x78, 0x3d, 0x22, 0x31, 0x22, 0x3e, + 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x20, + 0x6f, 0x6c, 0x65, 0x64, 0x42, 0x61, 0x72, 0x22, 0x3e, 0x3c, 0x73, 0x70, + 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, + 0x65, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4f, 0x4c, 0x45, 0x44, + 0x20, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x53, 0x54, 0x3c, 0x2f, 0x73, + 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x6f, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, + 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x3e, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x2f, 0x73, + 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x3d, 0x22, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x6f, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x61, 0x73, 0x74, 0x53, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x22, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x31, 0x31, 0x22, 0x20, 0x6d, + 0x69, 0x6e, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x6d, 0x61, 0x78, 0x3d, 0x22, + 0x31, 0x35, 0x22, 0x20, 0x73, 0x74, 0x65, 0x70, 0x3d, 0x22, 0x31, 0x22, + 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x68, - 0x61, 0x64, 0x6f, 0x77, 0x65, 0x64, 0x42, 0x6f, 0x78, 0x22, 0x3e, 0x0a, - 0x20, 0x20, 0x3c, 0x68, 0x33, 0x3e, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, - 0x20, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x3c, 0x2f, 0x68, 0x33, 0x3e, - 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x3d, 0x22, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, - 0x6f, 0x78, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, + 0x61, 0x64, 0x6f, 0x77, 0x65, 0x64, 0x42, 0x6f, 0x78, 0x20, 0x63, 0x6f, + 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x0a, + 0x20, 0x20, 0x3c, 0x68, 0x33, 0x3e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x3c, 0x2f, 0x68, 0x33, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x42, 0x6f, 0x78, 0x22, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x69, 0x74, 0x65, 0x6d, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x22, 0x3e, 0x53, 0x59, 0x53, 0x54, + 0x45, 0x4d, 0x20, 0x53, 0x54, 0x41, 0x52, 0x54, 0x3a, 0x26, 0x6e, 0x62, + 0x73, 0x70, 0x3b, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x73, 0x70, + 0x61, 0x6e, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x62, 0x6f, 0x6f, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, + 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x22, - 0x20, 0x69, 0x64, 0x3d, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, - 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, - 0x6d, 0x22, 0x3e, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x20, 0x53, 0x54, - 0x41, 0x52, 0x54, 0x3a, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x26, 0x6e, - 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, - 0x3d, 0x22, 0x62, 0x6f, 0x6f, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x3e, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x69, 0x73, 0x6b, 0x53, 0x70, 0x61, + 0x63, 0x65, 0x42, 0x61, 0x72, 0x22, 0x3e, 0x46, 0x52, 0x45, 0x45, 0x20, + 0x44, 0x49, 0x53, 0x4b, 0x20, 0x53, 0x50, 0x41, 0x43, 0x45, 0x3a, 0x26, + 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, + 0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x66, 0x72, 0x65, + 0x65, 0x44, 0x69, 0x73, 0x6b, 0x53, 0x70, 0x61, 0x63, 0x65, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, - 0x64, 0x69, 0x73, 0x6b, 0x53, 0x70, 0x61, 0x63, 0x65, 0x42, 0x61, 0x72, - 0x22, 0x3e, 0x46, 0x52, 0x45, 0x45, 0x20, 0x44, 0x49, 0x53, 0x4b, 0x20, - 0x53, 0x50, 0x41, 0x43, 0x45, 0x3a, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, - 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, - 0x69, 0x64, 0x3d, 0x22, 0x66, 0x72, 0x65, 0x65, 0x44, 0x69, 0x73, 0x6b, - 0x53, 0x70, 0x61, 0x63, 0x65, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61, - 0x6e, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, - 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, - 0x6d, 0x22, 0x3e, 0x50, 0x57, 0x4d, 0x20, 0x53, 0x54, 0x41, 0x54, 0x55, - 0x53, 0x3a, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x26, 0x6e, 0x62, 0x73, - 0x70, 0x3b, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x3d, 0x22, - 0x70, 0x77, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3e, 0x3c, - 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, - 0x22, 0x69, 0x74, 0x65, 0x6d, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x77, - 0x69, 0x66, 0x69, 0x73, 0x73, 0x69, 0x64, 0x22, 0x3e, 0x3c, 0x2f, 0x70, - 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, - 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x3e, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x28, - 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x2c, 0x20, 0x64, 0x65, 0x63, 0x69, - 0x6d, 0x61, 0x6c, 0x73, 0x20, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x69, - 0x66, 0x28, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x3d, 0x20, - 0x30, 0x20, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, - 0x30, 0x20, 0x42, 0x79, 0x74, 0x65, 0x73, 0x27, 0x3b, 0x0a, 0x20, 0x20, - 0x76, 0x61, 0x72, 0x20, 0x6b, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x30, 0x30, - 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6d, 0x20, 0x3d, 0x20, 0x64, - 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x20, 0x2b, 0x20, 0x31, 0x20, - 0x7c, 0x7c, 0x20, 0x33, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x69, - 0x7a, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x20, 0x27, 0x42, 0x79, 0x74, - 0x65, 0x73, 0x27, 0x2c, 0x20, 0x27, 0x4b, 0x42, 0x27, 0x2c, 0x20, 0x27, - 0x4d, 0x42, 0x27, 0x2c, 0x20, 0x27, 0x47, 0x42, 0x27, 0x2c, 0x20, 0x27, - 0x54, 0x42, 0x27, 0x2c, 0x20, 0x27, 0x50, 0x42, 0x27, 0x2c, 0x20, 0x27, - 0x45, 0x42, 0x27, 0x2c, 0x20, 0x27, 0x5a, 0x42, 0x27, 0x2c, 0x20, 0x27, - 0x59, 0x42, 0x27, 0x20, 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, - 0x72, 0x28, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x29, 0x20, 0x2f, 0x20, 0x4d, 0x61, 0x74, 0x68, - 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6b, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, - 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x20, 0x28, 0x20, 0x62, 0x79, 0x74, - 0x65, 0x73, 0x20, 0x2f, 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x6f, - 0x77, 0x28, 0x20, 0x6b, 0x2c, 0x20, 0x69, 0x20, 0x29, 0x20, 0x29, 0x2e, - 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x20, 0x64, 0x6d, 0x20, - 0x29, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x27, 0x20, 0x27, 0x20, 0x2b, 0x20, - 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5b, 0x69, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, - 0x76, 0x61, 0x72, 0x20, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x3b, 0x0a, 0x24, 0x28, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x79, 0x28, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, - 0x7b, 0x0a, 0x20, 0x20, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, - 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x20, 0x22, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x3f, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, - 0x20, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, - 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, - 0x23, 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x27, 0x20, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x20, 0x64, - 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, - 0x28, 0x20, 0x27, 0x23, 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x27, 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x64, 0x61, - 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x74, 0x6c, 0x65, - 0x20, 0x3d, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x2b, 0x20, 0x22, 0x20, - 0x73, 0x65, 0x74, 0x75, 0x70, 0x22, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, - 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x66, 0x75, 0x6e, + 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x22, 0x3e, 0x50, 0x57, 0x4d, 0x20, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x3a, 0x26, 0x6e, 0x62, 0x73, 0x70, + 0x3b, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x73, 0x70, 0x61, 0x6e, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70, 0x77, 0x6d, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, + 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x22, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x77, 0x69, 0x66, 0x69, 0x73, 0x73, 0x69, 0x64, + 0x22, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x64, + 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x28, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x2c, + 0x20, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x20, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x28, 0x20, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x29, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x27, 0x30, 0x20, 0x42, 0x79, 0x74, 0x65, 0x73, + 0x27, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x6b, 0x20, 0x3d, + 0x20, 0x31, 0x30, 0x30, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, + 0x6d, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, + 0x20, 0x2b, 0x20, 0x31, 0x20, 0x7c, 0x7c, 0x20, 0x33, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x5b, + 0x20, 0x27, 0x42, 0x79, 0x74, 0x65, 0x73, 0x27, 0x2c, 0x20, 0x27, 0x4b, + 0x42, 0x27, 0x2c, 0x20, 0x27, 0x4d, 0x42, 0x27, 0x2c, 0x20, 0x27, 0x47, + 0x42, 0x27, 0x2c, 0x20, 0x27, 0x54, 0x42, 0x27, 0x2c, 0x20, 0x27, 0x50, + 0x42, 0x27, 0x2c, 0x20, 0x27, 0x45, 0x42, 0x27, 0x2c, 0x20, 0x27, 0x5a, + 0x42, 0x27, 0x2c, 0x20, 0x27, 0x59, 0x42, 0x27, 0x20, 0x5d, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x6c, 0x6f, 0x67, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x29, 0x20, 0x2f, + 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6b, 0x29, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x20, + 0x28, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x2f, 0x20, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x70, 0x6f, 0x77, 0x28, 0x20, 0x6b, 0x2c, 0x20, 0x69, + 0x20, 0x29, 0x20, 0x29, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, + 0x28, 0x20, 0x64, 0x6d, 0x20, 0x29, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x27, + 0x20, 0x27, 0x20, 0x2b, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5b, 0x69, + 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x76, 0x61, 0x72, 0x20, 0x67, 0x65, 0x74, + 0x41, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x3b, 0x0a, 0x24, + 0x28, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x2e, 0x72, + 0x65, 0x61, 0x64, 0x79, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x67, 0x65, 0x74, + 0x41, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x3d, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x67, 0x65, + 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x74, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x3f, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, + 0x6f, 0x6e, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, + 0x6d, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x27, 0x20, 0x29, 0x2e, 0x76, + 0x61, 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x20, 0x27, 0x23, 0x68, 0x6f, 0x73, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x27, 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, + 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x2b, 0x20, 0x22, 0x20, 0x73, 0x65, 0x74, 0x75, 0x70, 0x22, 0x3b, + 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, + 0x6c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x24, 0x28, 0x20, 0x27, 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, + 0x6c, 0x28, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x20, + 0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x6f, 0x73, 0x74, + 0x6e, 0x61, 0x6d, 0x65, 0x2e, 0x22, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x28, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x20, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x4f, 0x6c, + 0x65, 0x64, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x0a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x4f, 0x6c, 0x65, + 0x64, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x67, 0x65, 0x74, 0x28, + 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x74, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x3f, 0x6f, 0x6c, 0x65, 0x64, 0x6f, 0x72, 0x69, + 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, - 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x20, 0x27, 0x23, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x27, 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x22, 0x50, - 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x20, 0x67, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x2e, - 0x22, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, - 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, - 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, 0x67, - 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x67, 0x65, 0x74, 0x4f, 0x6c, 0x65, 0x64, 0x4f, 0x72, 0x69, - 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x3b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, - 0x7d, 0x29, 0x3b, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x67, 0x65, 0x74, 0x4f, 0x6c, 0x65, 0x64, 0x4f, 0x72, 0x69, 0x65, - 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x0a, 0x20, - 0x20, 0x24, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x67, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x3f, - 0x6f, 0x6c, 0x65, 0x64, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, + 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x2e, 0x6f, + 0x6c, 0x65, 0x64, 0x42, 0x61, 0x72, 0x27, 0x20, 0x29, 0x2e, 0x73, 0x68, + 0x6f, 0x77, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, + 0x27, 0x23, 0x6f, 0x6c, 0x65, 0x64, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x29, + 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x6e, 0x6f, 0x72, + 0x6d, 0x61, 0x6c, 0x27, 0x20, 0x29, 0x20, 0x24, 0x28, 0x27, 0x23, 0x6f, + 0x6c, 0x65, 0x64, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x27, 0x29, 0x2e, 0x76, + 0x61, 0x6c, 0x28, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x3d, 0x20, + 0x27, 0x75, 0x70, 0x73, 0x69, 0x64, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x27, + 0x20, 0x29, 0x20, 0x24, 0x28, 0x27, 0x23, 0x6f, 0x6c, 0x65, 0x64, 0x4f, + 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6c, + 0x69, 0x64, 0x65, 0x72, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x31, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, + 0x61, 0x69, 0x6c, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x35, + 0x30, 0x31, 0x20, 0x29, 0x20, 0x24, 0x28, 0x20, 0x27, 0x23, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x20, + 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x65, 0x78, 0x74, 0x20, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x61, + 0x6c, 0x77, 0x61, 0x79, 0x73, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, 0x67, 0x65, + 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x67, 0x65, 0x74, 0x4f, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x61, 0x73, 0x74, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x4f, 0x6c, + 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x28, 0x29, + 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x20, 0x22, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x3f, 0x6f, 0x6c, 0x65, 0x64, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x61, 0x73, 0x74, 0x3d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x24, 0x28, 0x27, 0x2e, 0x6f, 0x6c, 0x65, 0x64, 0x42, 0x61, - 0x72, 0x27, 0x20, 0x29, 0x2e, 0x73, 0x68, 0x6f, 0x77, 0x28, 0x29, 0x3b, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x6f, 0x6c, 0x65, - 0x64, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, + 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x6f, 0x6c, 0x65, 0x64, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x27, + 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, + 0x6f, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, + 0x53, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, - 0x3d, 0x3d, 0x20, 0x27, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x27, 0x20, - 0x29, 0x20, 0x24, 0x28, 0x27, 0x23, 0x6f, 0x6c, 0x65, 0x64, 0x4f, 0x72, - 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6c, 0x69, - 0x64, 0x65, 0x72, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x30, 0x29, - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, 0x64, - 0x61, 0x74, 0x61, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x70, 0x73, 0x69, - 0x64, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x27, 0x20, 0x29, 0x20, 0x24, 0x28, - 0x27, 0x23, 0x6f, 0x6c, 0x65, 0x64, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x27, - 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, @@ -583,69 +647,140 @@ const uint8_t setup_htm[] = { 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x4f, - 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x28, - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, - 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x67, 0x65, 0x74, 0x4f, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x61, 0x73, 0x74, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x24, - 0x2e, 0x67, 0x65, 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x67, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x3f, 0x6f, 0x6c, - 0x65, 0x64, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x3d, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, - 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, - 0x23, 0x6f, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, - 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, - 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x6f, 0x6c, 0x65, 0x64, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x53, 0x6c, 0x69, 0x64, 0x65, - 0x72, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, - 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, - 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x21, 0x3d, - 0x20, 0x35, 0x30, 0x31, 0x20, 0x29, 0x20, 0x24, 0x28, 0x20, 0x27, 0x23, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x27, 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x65, 0x78, - 0x74, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, - 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x28, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, - 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, - 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x54, 0x66, 0x74, 0x4f, 0x72, 0x69, - 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x3b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, - 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, - 0x65, 0x74, 0x54, 0x66, 0x74, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, - 0x67, 0x65, 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, - 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x3f, 0x74, 0x66, 0x74, - 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3d, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x54, + 0x66, 0x74, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x54, 0x66, 0x74, 0x4f, 0x72, + 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, + 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x20, 0x22, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x3f, 0x74, 0x66, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, + 0x6f, 0x6e, 0x65, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x2e, 0x74, 0x66, 0x74, 0x42, 0x61, + 0x72, 0x27, 0x20, 0x29, 0x2e, 0x73, 0x68, 0x6f, 0x77, 0x28, 0x29, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x74, 0x66, 0x74, + 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x27, + 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x6e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x27, 0x20, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x74, 0x66, 0x74, 0x4f, + 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6c, + 0x69, 0x64, 0x65, 0x72, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x30, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, + 0x3d, 0x20, 0x27, 0x75, 0x70, 0x73, 0x69, 0x64, 0x65, 0x64, 0x6f, 0x77, + 0x6e, 0x27, 0x20, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x24, 0x28, 0x27, 0x23, 0x74, 0x66, 0x74, 0x4f, 0x72, 0x69, 0x65, + 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6c, 0x69, 0x64, 0x65, + 0x72, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x31, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x21, + 0x3d, 0x20, 0x35, 0x30, 0x31, 0x20, 0x29, 0x20, 0x24, 0x28, 0x20, 0x27, + 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x27, 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x22, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x66, 0x74, 0x20, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x20, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, + 0x73, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x29, 0x20, 0x67, 0x65, 0x74, + 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, + 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x28, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x67, 0x65, + 0x74, 0x28, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x74, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x3f, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x6c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x73, 0x65, + 0x6e, 0x73, 0x6f, 0x72, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x27, + 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x28, 0x27, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x27, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x27, 0x29, 0x2e, 0x73, 0x68, + 0x6f, 0x77, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x21, + 0x3d, 0x20, 0x35, 0x30, 0x31, 0x20, 0x29, 0x20, 0x24, 0x28, 0x20, 0x27, + 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x27, 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x22, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x2e, 0x22, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, + 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, - 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, - 0x27, 0x2e, 0x74, 0x66, 0x74, 0x42, 0x61, 0x72, 0x27, 0x20, 0x29, 0x2e, - 0x73, 0x68, 0x6f, 0x77, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x24, 0x28, 0x27, 0x23, 0x74, 0x66, 0x74, 0x4f, 0x72, 0x69, 0x65, 0x6e, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, - 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, - 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x27, - 0x20, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, - 0x28, 0x27, 0x23, 0x74, 0x66, 0x74, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x27, - 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x70, - 0x73, 0x69, 0x64, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x27, 0x20, 0x29, 0x20, - 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, - 0x74, 0x66, 0x74, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x27, 0x29, 0x2e, 0x76, - 0x61, 0x6c, 0x28, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x20, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x20, 0x29, 0x20, 0x67, 0x65, 0x74, 0x53, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x4c, 0x6f, 0x67, 0x67, + 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x28, 0x29, 0x3b, + 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x53, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x4c, 0x6f, 0x67, 0x67, + 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x28, 0x29, 0x7b, + 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x22, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x67, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x3f, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x6c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x73, 0x65, + 0x6e, 0x73, 0x6f, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x4c, 0x6f, 0x67, + 0x67, 0x69, 0x6e, 0x67, 0x27, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x28, + 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x2c, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, + 0x66, 0x61, 0x69, 0x6c, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x21, 0x3d, 0x20, + 0x35, 0x30, 0x31, 0x20, 0x29, 0x20, 0x24, 0x28, 0x20, 0x27, 0x23, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, + 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x22, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x20, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x2e, 0x22, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x64, + 0x61, 0x74, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x28, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x20, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x20, 0x29, 0x20, 0x67, 0x65, 0x74, 0x54, 0x66, 0x74, 0x4d, 0x61, + 0x78, 0x42, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x28, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x54, + 0x66, 0x74, 0x4d, 0x61, 0x78, 0x42, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6e, + 0x65, 0x73, 0x73, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x67, + 0x65, 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, + 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x3f, 0x74, 0x66, 0x74, 0x62, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x3d, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, + 0x74, 0x66, 0x74, 0x42, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x65, 0x73, + 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, + 0x6c, 0x28, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x22, 0x25, + 0x22, 0x20, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, + 0x27, 0x23, 0x74, 0x66, 0x74, 0x42, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6e, + 0x65, 0x73, 0x73, 0x53, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x27, 0x29, 0x2e, + 0x76, 0x61, 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, @@ -655,214 +790,188 @@ const uint8_t setup_htm[] = { 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x66, 0x74, - 0x20, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x22, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x62, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x2e, + 0x22, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, + 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, 0x67, + 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, + 0x29, 0x20, 0x67, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, + 0x65, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, + 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x28, 0x29, 0x7b, + 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x20, 0x22, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x3f, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x3d, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, + 0x23, 0x74, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x54, 0x65, 0x78, + 0x74, 0x42, 0x6f, 0x78, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x20, 0x27, + 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x27, 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x65, + 0x78, 0x74, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, - 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x73, - 0x6f, 0x72, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x67, - 0x65, 0x74, 0x28, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x74, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x3f, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x6c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, - 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x73, - 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, - 0x27, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x28, 0x27, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x27, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x0a, - 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, - 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, - 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, - 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, - 0x20, 0x20, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x28, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, - 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x20, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x54, 0x66, 0x74, 0x4d, - 0x61, 0x78, 0x42, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x65, 0x73, 0x73, - 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x73, 0x20, 0x29, 0x20, 0x67, 0x65, 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x54, 0x66, 0x74, 0x4d, 0x61, 0x78, - 0x42, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x28, 0x29, - 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x20, 0x22, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x3f, 0x74, 0x66, 0x74, 0x62, 0x72, 0x69, 0x67, 0x68, 0x74, - 0x6e, 0x65, 0x73, 0x73, 0x3d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, + 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x24, + 0x2e, 0x67, 0x65, 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x67, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x3f, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x3d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x74, 0x66, 0x74, 0x42, 0x72, - 0x69, 0x67, 0x68, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x70, 0x61, - 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, - 0x20, 0x29, 0x20, 0x2b, 0x20, 0x22, 0x25, 0x22, 0x20, 0x20, 0x29, 0x3b, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x74, 0x66, 0x74, - 0x42, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x53, 0x6c, - 0x69, 0x64, 0x65, 0x72, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x20, - 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, - 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, - 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x20, 0x21, 0x3d, 0x20, 0x35, 0x30, 0x31, 0x20, 0x29, 0x20, 0x24, 0x28, - 0x20, 0x27, 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x27, 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, - 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x67, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x20, 0x74, 0x66, 0x74, 0x20, 0x62, 0x72, 0x69, 0x67, - 0x68, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x29, 0x3b, 0x0a, 0x20, - 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, - 0x73, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, - 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, - 0x54, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x28, 0x29, 0x3b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x20, + 0x3d, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, + 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x24, 0x28, 0x27, 0x23, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, + 0x69, 0x74, 0x65, 0x6d, 0x5b, 0x36, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, + 0x28, 0x20, 0x27, 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x27, 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, + 0x28, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x67, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x2e, 0x22, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, + 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x20, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x29, 0x20, 0x67, 0x65, 0x74, 0x53, + 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x73, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x67, 0x65, 0x74, + 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x74, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x3f, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x64, 0x61, + 0x74, 0x61, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, + 0x20, 0x69, 0x74, 0x65, 0x6d, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, + 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x73, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x3d, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, + 0x69, 0x6c, 0x65, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x5b, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x5d, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x76, 0x61, 0x72, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x41, 0x72, 0x72, + 0x61, 0x79, 0x3d, 0x69, 0x74, 0x65, 0x6d, 0x5b, 0x73, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x5d, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x2c, + 0x27, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, + 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x74, 0x65, 0x6d, 0x70, 0x41, + 0x72, 0x72, 0x61, 0x79, 0x5b, 0x30, 0x5d, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x74, 0x65, 0x6d, 0x70, 0x3d, 0x74, 0x65, 0x6d, 0x70, 0x41, 0x72, 0x72, + 0x61, 0x79, 0x5b, 0x31, 0x5d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x73, 0x65, + 0x6e, 0x73, 0x6f, 0x72, 0x69, 0x64, 0x3d, 0x74, 0x65, 0x6d, 0x70, 0x41, + 0x72, 0x72, 0x61, 0x79, 0x5b, 0x32, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x74, 0x65, 0x6d, 0x70, 0x21, 0x3d, + 0x22, 0x6e, 0x61, 0x6e, 0x22, 0x29, 0x74, 0x65, 0x6d, 0x70, 0x2b, 0x3d, + 0x22, 0xc2, 0xb0, 0x43, 0x22, 0x3b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x2f, 0x2f, 0x54, 0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x2e, 0x73, + 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x69, + 0x74, 0x65, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x27, 0x29, 0x2e, 0x65, 0x71, + 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x29, 0x2e, 0x63, 0x73, 0x73, + 0x28, 0x22, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x22, 0x2c, 0x22, 0x72, 0x65, 0x64, + 0x22, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x65, 0x6d, 0x70, 0x20, 0x3d, 0x20, 0x22, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x21, 0x22, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x2e, 0x73, + 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x69, + 0x74, 0x65, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x27, 0x29, 0x2e, 0x65, 0x71, + 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x29, 0x2e, 0x68, 0x74, 0x6d, + 0x6c, 0x28, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x69, 0x64, 0x29, 0x2e, 0x74, 0x6f, 0x55, 0x70, 0x70, + 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, 0x28, 0x29, 0x2b, 0x22, 0x20, 0x2d, + 0x20, 0x22, 0x2b, 0x74, 0x65, 0x6d, 0x70, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x2e, 0x73, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x27, + 0x29, 0x2e, 0x65, 0x71, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x29, + 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x2e, 0x73, 0x65, + 0x6e, 0x73, 0x6f, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x27, 0x29, 0x2e, 0x65, + 0x71, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x29, 0x2e, 0x73, 0x68, + 0x6f, 0x77, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2b, 0x2b, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x22, 0x22, 0x29, 0x3b, + 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, + 0x6c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x24, 0x28, 0x27, 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, + 0x28, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x67, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2e, + 0x22, 0x29, 0x3b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x61, 0x6c, 0x77, + 0x61, 0x79, 0x73, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x29, 0x67, 0x65, 0x74, 0x57, 0x69, + 0x66, 0x69, 0x53, 0x53, 0x49, 0x44, 0x28, 0x29, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, - 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x28, 0x29, + 0x65, 0x74, 0x57, 0x69, 0x66, 0x69, 0x53, 0x53, 0x49, 0x44, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x3f, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x3d, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, - 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, - 0x27, 0x23, 0x74, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x54, 0x65, - 0x78, 0x74, 0x42, 0x6f, 0x78, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, - 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, - 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, - 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x20, - 0x27, 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x27, 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, - 0x65, 0x78, 0x74, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, - 0x20, 0x20, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x28, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, - 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x20, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x4c, 0x69, 0x67, 0x68, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x28, 0x29, 0x3b, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, - 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, - 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x67, 0x65, 0x74, 0x28, - 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x74, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x3f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3d, + 0x63, 0x65, 0x3f, 0x77, 0x69, 0x66, 0x69, 0x73, 0x73, 0x69, 0x64, 0x3d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, - 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, - 0x72, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x6c, - 0x69, 0x67, 0x68, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x29, - 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x5b, - 0x36, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, - 0x72, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x30, - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, - 0x28, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x5b, 0x37, 0x20, 0x2b, 0x20, 0x73, - 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x5d, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x2e, 0x73, 0x65, 0x6e, 0x73, - 0x6f, 0x72, 0x42, 0x61, 0x72, 0x27, 0x29, 0x2e, 0x65, 0x71, 0x28, 0x20, - 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x20, 0x29, 0x2e, 0x73, 0x68, 0x6f, - 0x77, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, - 0x61, 0x72, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x20, 0x3d, 0x20, 0x69, 0x74, - 0x65, 0x6d, 0x5b, 0x37, 0x20, 0x2b, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x5d, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x2c, 0x27, - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, - 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x42, 0x61, 0x72, 0x20, 0x2e, - 0x69, 0x74, 0x65, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x27, 0x29, 0x2e, 0x65, - 0x71, 0x28, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x20, 0x29, 0x2e, - 0x70, 0x72, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x20, 0x74, 0x65, 0x6d, - 0x70, 0x5b, 0x31, 0x5d, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, - 0x5b, 0x31, 0x5d, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, - 0x20, 0x22, 0x2e, 0x22, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x29, - 0x20, 0x2b, 0x20, 0x22, 0xc2, 0xb0, 0x43, 0x20, 0x2d, 0x20, 0x22, 0x20, - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, - 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x27, 0x29, 0x2e, 0x65, 0x71, 0x28, 0x20, 0x73, - 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x20, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, - 0x20, 0x74, 0x65, 0x6d, 0x70, 0x5b, 0x30, 0x5d, 0x20, 0x29, 0x3b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, - 0x2b, 0x2b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, - 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, - 0x20, 0x27, 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x27, 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, - 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x67, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x2e, 0x22, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, - 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x28, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, - 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x20, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x20, 0x29, 0x20, 0x67, 0x65, 0x74, 0x57, 0x69, - 0x66, 0x69, 0x53, 0x53, 0x49, 0x44, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, - 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x57, 0x69, 0x66, 0x69, 0x53, 0x53, - 0x49, 0x44, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x67, 0x65, - 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x74, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x3f, 0x77, 0x69, 0x66, 0x69, 0x73, - 0x73, 0x69, 0x64, 0x3d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, - 0x6e, 0x65, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x77, 0x69, 0x66, 0x69, 0x73, 0x73, - 0x69, 0x64, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x22, - 0x57, 0x49, 0x46, 0x49, 0x20, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, - 0x3a, 0x20, 0x22, 0x20, 0x2b, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, - 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, - 0x69, 0x6c, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x24, 0x28, 0x20, 0x27, 0x23, 0x77, 0x69, 0x66, 0x69, 0x73, - 0x73, 0x69, 0x64, 0x27, 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, - 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x67, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x66, 0x69, 0x20, 0x53, 0x53, 0x49, - 0x44, 0x3a, 0x20, 0x22, 0x20, 0x2b, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x65, 0x78, 0x74, 0x20, 0x29, - 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x61, 0x6c, - 0x77, 0x61, 0x79, 0x73, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, 0x67, 0x65, 0x74, - 0x41, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x29, 0x20, - 0x67, 0x65, 0x74, 0x42, 0x6f, 0x6f, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x28, - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x42, - 0x6f, 0x6f, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x28, 0x29, 0x7b, 0x0a, 0x20, - 0x20, 0x24, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x67, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x3f, - 0x62, 0x6f, 0x6f, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x3d, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, - 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x62, - 0x6f, 0x6f, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x27, 0x29, 0x2e, 0x68, 0x74, - 0x6d, 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, - 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, - 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, - 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x24, 0x28, 0x20, 0x27, 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, - 0x6c, 0x28, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x67, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x6f, 0x6f, 0x74, 0x74, 0x69, - 0x6d, 0x65, 0x3a, 0x20, 0x22, 0x20, 0x2b, 0x20, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x65, 0x78, 0x74, 0x20, - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x61, - 0x6c, 0x77, 0x61, 0x79, 0x73, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, 0x67, 0x65, - 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x29, - 0x20, 0x67, 0x65, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x53, 0x70, 0x61, 0x63, - 0x65, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, + 0x27, 0x23, 0x77, 0x69, 0x66, 0x69, 0x73, 0x73, 0x69, 0x64, 0x27, 0x29, + 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x22, 0x57, 0x49, 0x46, 0x49, + 0x20, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x3a, 0x20, 0x22, 0x20, + 0x2b, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, + 0x20, 0x27, 0x23, 0x77, 0x69, 0x66, 0x69, 0x73, 0x73, 0x69, 0x64, 0x27, + 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x22, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x20, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x77, 0x69, 0x66, 0x69, 0x20, 0x53, 0x53, 0x49, 0x44, 0x3a, 0x20, 0x22, + 0x20, 0x2b, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x54, 0x65, 0x78, 0x74, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, + 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x67, 0x65, + 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x29, 0x67, + 0x65, 0x74, 0x42, 0x6f, 0x6f, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x28, 0x29, + 0x3b, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x42, 0x6f, 0x6f, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x67, + 0x65, 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, + 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x3f, 0x62, 0x6f, 0x6f, 0x74, + 0x74, 0x69, 0x6d, 0x65, 0x3d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, + 0x6f, 0x6e, 0x65, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x62, 0x6f, 0x6f, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x20, 0x27, + 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x27, 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x22, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x20, 0x62, 0x6f, 0x6f, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x3a, 0x20, + 0x22, 0x20, 0x2b, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x54, 0x65, 0x78, 0x74, 0x20, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, + 0x73, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x69, 0x66, 0x20, 0x28, + 0x20, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x20, 0x29, 0x20, 0x67, 0x65, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x53, + 0x70, 0x61, 0x63, 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x53, 0x70, 0x61, 0x63, 0x65, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x20, 0x22, @@ -892,107 +1001,105 @@ const uint8_t setup_htm[] = { 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, 0x67, 0x65, - 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x29, - 0x20, 0x67, 0x65, 0x74, 0x50, 0x77, 0x6d, 0x44, 0x65, 0x70, 0x74, 0x68, - 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, - 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, - 0x74, 0x50, 0x77, 0x6d, 0x44, 0x65, 0x70, 0x74, 0x68, 0x28, 0x29, 0x7b, - 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x20, 0x22, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x3f, 0x70, 0x77, 0x6d, 0x64, 0x65, 0x70, 0x74, 0x68, 0x3d, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, - 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, - 0x23, 0x70, 0x77, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x29, - 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, - 0x2b, 0x20, 0x22, 0x62, 0x69, 0x74, 0x20, 0x2d, 0x20, 0x22, 0x29, 0x3b, - 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, - 0x6c, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, - 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x24, 0x28, 0x20, 0x27, 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x20, 0x29, 0x2e, 0x68, 0x74, - 0x6d, 0x6c, 0x28, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x67, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x77, 0x6d, 0x64, 0x65, - 0x70, 0x74, 0x68, 0x20, 0x22, 0x20, 0x2b, 0x20, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x65, 0x78, - 0x74, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, - 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x28, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, - 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, - 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x20, 0x29, 0x20, 0x67, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, - 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, - 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x7b, - 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x20, 0x22, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x3f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, - 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x27, 0x29, 0x2e, 0x68, 0x74, - 0x6d, 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x73, 0x6b, 0x65, 0x74, - 0x63, 0x68, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, 0x21, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x74, 0x72, 0x28, 0x20, 0x30, 0x2c, - 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x28, 0x22, 0x2d, 0x22, 0x29, 0x20, 0x29, 0x20, 0x29, 0x20, 0x73, 0x6b, - 0x65, 0x74, 0x63, 0x68, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, - 0x3d, 0x20, 0x64, 0x61, 0x74, 0x61, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x20, 0x73, 0x6b, 0x65, 0x74, 0x63, 0x68, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x74, 0x72, 0x28, 0x20, 0x30, 0x2c, - 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x28, 0x22, 0x2d, 0x22, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x24, 0x2e, 0x67, 0x65, 0x74, 0x4a, 0x53, 0x4f, 0x4e, 0x28, 0x22, - 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x61, 0x70, 0x69, 0x2e, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, - 0x65, 0x70, 0x6f, 0x73, 0x2f, 0x43, 0x65, 0x6c, 0x6c, 0x69, 0x65, 0x73, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x61, 0x71, 0x75, - 0x61, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x33, 0x32, 0x2f, 0x72, - 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x74, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x22, 0x20, 0x26, 0x26, 0x20, 0x73, 0x6b, 0x65, 0x74, 0x63, 0x68, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x21, 0x3d, 0x20, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x74, 0x61, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x20, 0x29, 0x20, 0x24, 0x28, 0x20, 0x27, 0x23, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x27, 0x20, 0x29, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, - 0x64, 0x28, 0x20, 0x27, 0x20, 0x2d, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, - 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x65, - 0x6c, 0x6c, 0x69, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x2f, 0x61, 0x71, 0x75, 0x61, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x33, 0x32, 0x2f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x73, - 0x2f, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x22, 0x20, 0x20, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, 0x62, 0x6c, 0x61, 0x6e, 0x6b, - 0x22, 0x3e, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x72, 0x65, 0x6c, - 0x65, 0x61, 0x73, 0x65, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x74, 0x61, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2b, - 0x20, 0x22, 0x20, 0x6f, 0x6e, 0x20, 0x47, 0x69, 0x74, 0x48, 0x75, 0x62, - 0x2e, 0x3c, 0x2f, 0x61, 0x3e, 0x22, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, - 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, - 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x20, 0x27, 0x23, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, - 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x22, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x20, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x22, 0x20, 0x2b, - 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x54, 0x65, 0x78, 0x74, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, - 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, - 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, - 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x29, 0x20, 0x67, 0x65, 0x74, 0x50, - 0x77, 0x6d, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x28, - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, + 0x77, 0x6d, 0x44, 0x65, 0x70, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x7d, 0x29, + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x67, 0x65, 0x74, 0x50, 0x77, 0x6d, 0x44, 0x65, 0x70, 0x74, + 0x68, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x67, 0x65, 0x74, + 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x74, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x3f, 0x70, 0x77, 0x6d, 0x64, 0x65, 0x70, + 0x74, 0x68, 0x3d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, + 0x65, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x24, 0x28, 0x27, 0x23, 0x70, 0x77, 0x6d, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x2b, 0x20, 0x22, 0x62, 0x69, 0x74, 0x20, 0x2d, + 0x20, 0x22, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, + 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x20, 0x27, 0x23, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x20, + 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x22, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x20, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x70, + 0x77, 0x6d, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x22, 0x20, 0x2b, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x54, 0x65, 0x78, 0x74, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x28, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x20, 0x67, + 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, + 0x29, 0x20, 0x67, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x24, + 0x2e, 0x67, 0x65, 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x67, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x3f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x2e, + 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x76, 0x61, 0x72, 0x20, 0x73, 0x6b, 0x65, 0x74, 0x63, 0x68, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x20, 0x21, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x75, + 0x62, 0x73, 0x74, 0x72, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x28, 0x22, 0x2d, 0x22, + 0x29, 0x20, 0x29, 0x20, 0x29, 0x20, 0x73, 0x6b, 0x65, 0x74, 0x63, 0x68, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x20, 0x73, 0x6b, 0x65, 0x74, 0x63, 0x68, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x75, + 0x62, 0x73, 0x74, 0x72, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x28, 0x22, 0x2d, 0x22, + 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x2e, 0x67, + 0x65, 0x74, 0x4a, 0x53, 0x4f, 0x4e, 0x28, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x73, 0x3a, 0x2f, 0x2f, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, + 0x2f, 0x43, 0x65, 0x6c, 0x6c, 0x69, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x73, 0x2f, 0x61, 0x71, 0x75, 0x61, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x33, 0x32, 0x2f, 0x72, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x73, 0x2f, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x22, 0x2c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x64, 0x61, + 0x74, 0x61, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x3d, 0x3d, + 0x20, 0x22, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x26, + 0x26, 0x20, 0x73, 0x6b, 0x65, 0x74, 0x63, 0x68, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x20, 0x21, 0x3d, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x74, 0x61, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x29, 0x20, 0x24, + 0x28, 0x20, 0x27, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x27, + 0x20, 0x29, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x20, 0x27, + 0x20, 0x2d, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x65, 0x6c, 0x6c, 0x69, 0x65, + 0x73, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x61, 0x71, + 0x75, 0x61, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x33, 0x32, 0x2f, + 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x74, 0x22, 0x20, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x3d, 0x22, 0x5f, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x22, 0x3e, 0x4c, 0x61, + 0x74, 0x65, 0x73, 0x74, 0x20, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x20, 0x27, 0x20, 0x2b, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x61, + 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2b, 0x20, 0x22, 0x20, 0x6f, + 0x6e, 0x20, 0x47, 0x69, 0x74, 0x48, 0x75, 0x62, 0x2e, 0x3c, 0x2f, 0x61, + 0x3e, 0x22, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, + 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, + 0x69, 0x6c, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x24, 0x28, 0x20, 0x27, 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x20, 0x29, 0x2e, 0x68, + 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, + 0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x22, 0x20, 0x2b, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x65, + 0x78, 0x74, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x2e, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x28, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x29, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x20, 0x67, 0x65, 0x74, 0x41, + 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x29, 0x20, 0x67, + 0x65, 0x74, 0x50, 0x77, 0x6d, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, + 0x63, 0x79, 0x28, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x50, 0x77, 0x6d, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x20, @@ -1033,249 +1140,248 @@ const uint8_t setup_htm[] = { 0x27, 0x31, 0x27, 0x29, 0x3b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2a, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, 0x20, 0x2a, 0x2f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x20, - 0x20, 0x2f, 0x2a, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x68, 0x61, - 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x73, 0x20, 0x2a, 0x2f, 0x0a, 0x0a, 0x24, - 0x28, 0x27, 0x23, 0x74, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x54, - 0x65, 0x78, 0x74, 0x42, 0x6f, 0x78, 0x2c, 0x20, 0x23, 0x68, 0x6f, 0x73, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2c, 0x20, - 0x23, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x2c, 0x20, 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x27, 0x29, 0x2e, 0x6f, - 0x6e, 0x28, 0x27, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x27, 0x2c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, - 0x20, 0x20, 0x24, 0x28, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x29, 0x2e, - 0x63, 0x73, 0x73, 0x28, 0x7b, 0x27, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, - 0x6f, 0x75, 0x6e, 0x64, 0x27, 0x3a, 0x27, 0x79, 0x65, 0x6c, 0x6c, 0x6f, - 0x77, 0x27, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x0a, 0x0a, 0x24, - 0x28, 0x27, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x27, 0x29, 0x2e, 0x6f, 0x6e, - 0x28, 0x20, 0x27, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x27, 0x2c, 0x20, 0x66, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x20, 0x20, + 0x2f, 0x2a, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x68, 0x61, 0x6e, + 0x64, 0x6c, 0x65, 0x72, 0x73, 0x20, 0x2a, 0x2f, 0x0a, 0x24, 0x28, 0x27, + 0x23, 0x74, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x54, 0x65, 0x78, + 0x74, 0x42, 0x6f, 0x78, 0x2c, 0x20, 0x23, 0x68, 0x6f, 0x73, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2c, 0x20, 0x23, 0x70, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x2c, 0x20, 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, + 0x27, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x24, 0x28, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x29, 0x2e, 0x63, 0x73, + 0x73, 0x28, 0x7b, 0x27, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x27, 0x3a, 0x27, 0x79, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x27, + 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x0a, 0x24, 0x28, 0x27, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x20, 0x27, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x24, + 0x28, 0x27, 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x27, + 0x27, 0x29, 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x0a, 0x24, 0x28, 0x27, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x62, + 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x5d, 0x27, 0x29, 0x2e, 0x6f, 0x6e, + 0x28, 0x20, 0x27, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, - 0x6c, 0x28, 0x27, 0x27, 0x29, 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x0a, 0x0a, - 0x24, 0x28, 0x27, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, - 0x65, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x5d, 0x27, - 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x20, 0x27, 0x63, 0x6c, 0x69, 0x63, 0x6b, - 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, - 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x29, - 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x27, 0x27, 0x29, 0x3b, 0x0a, 0x7d, - 0x29, 0x3b, 0x0a, 0x0a, 0x24, 0x28, 0x27, 0x23, 0x70, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x27, 0x29, 0x2e, + 0x6c, 0x28, 0x27, 0x27, 0x29, 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x0a, 0x24, + 0x28, 0x27, 0x23, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x28, 0x22, 0x59, 0x6f, 0x75, 0x20, + 0x61, 0x72, 0x65, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x6f, + 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x2e, 0x5c, 0x6e, 0x41, 0x72, 0x65, 0x20, 0x79, 0x6f, 0x75, + 0x20, 0x73, 0x75, 0x72, 0x65, 0x3f, 0x22, 0x29, 0x20, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, + 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x70, 0x6f, 0x73, + 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x65, 0x74, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x20, 0x3a, 0x20, 0x24, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x2e, + 0x76, 0x61, 0x6c, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x20, 0x27, 0x23, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x20, + 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, + 0x66, 0x61, 0x69, 0x6c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x27, 0x29, 0x2e, 0x63, + 0x73, 0x73, 0x28, 0x7b, 0x27, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x27, 0x3a, 0x27, 0x72, 0x65, 0x64, 0x27, 0x7d, 0x29, + 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x0a, + 0x24, 0x28, 0x27, 0x23, 0x6f, 0x6c, 0x65, 0x64, 0x4f, 0x72, 0x69, 0x65, + 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6c, 0x69, 0x64, 0x65, + 0x72, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x24, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x2e, 0x76, + 0x61, 0x6c, 0x28, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x20, 0x3f, + 0x20, 0x24, 0x28, 0x27, 0x23, 0x6f, 0x6c, 0x65, 0x64, 0x4f, 0x72, 0x69, + 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x27, 0x75, + 0x70, 0x73, 0x69, 0x64, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x27, 0x20, 0x29, + 0x3a, 0x20, 0x24, 0x28, 0x27, 0x23, 0x6f, 0x6c, 0x65, 0x64, 0x4f, 0x72, + 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x27, + 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x27, 0x20, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x24, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x73, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, + 0x6c, 0x65, 0x64, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x3a, 0x20, 0x24, 0x28, 0x27, 0x23, 0x6f, 0x6c, 0x65, + 0x64, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, + 0x28, 0x29, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, + 0x6f, 0x6e, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x24, 0x28, 0x27, 0x23, 0x6f, 0x6c, 0x65, 0x64, 0x4f, 0x72, 0x69, + 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, + 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x4f, 0x6c, + 0x65, 0x64, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, + 0x29, 0x3b, 0x0a, 0x24, 0x28, 0x27, 0x23, 0x74, 0x66, 0x74, 0x4f, 0x72, + 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6c, 0x69, + 0x64, 0x65, 0x72, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x29, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, 0x24, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x29, 0x20, + 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x29, 0x20, 0x24, 0x28, 0x27, 0x23, 0x74, + 0x66, 0x74, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x27, 0x6e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x27, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x20, 0x24, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x2e, 0x76, + 0x61, 0x6c, 0x28, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x29, 0x20, + 0x24, 0x28, 0x27, 0x23, 0x74, 0x66, 0x74, 0x4f, 0x72, 0x69, 0x65, 0x6e, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, + 0x6c, 0x28, 0x27, 0x75, 0x70, 0x73, 0x69, 0x64, 0x65, 0x64, 0x6f, 0x77, + 0x6e, 0x27, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x70, 0x6f, 0x73, + 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x65, 0x74, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x66, 0x74, 0x6f, 0x72, 0x69, 0x65, + 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3a, 0x20, 0x24, 0x28, + 0x27, 0x23, 0x74, 0x66, 0x74, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, + 0x29, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, + 0x6e, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x24, 0x28, 0x27, 0x23, 0x74, 0x66, 0x74, 0x4f, 0x72, 0x69, 0x65, 0x6e, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, + 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x0a, 0x20, 0x20, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, + 0x54, 0x66, 0x74, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, + 0x7d, 0x29, 0x3b, 0x0a, 0x24, 0x28, 0x27, 0x23, 0x6c, 0x69, 0x67, 0x68, + 0x74, 0x73, 0x4f, 0x6e, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x63, + 0x6c, 0x69, 0x63, 0x6b, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, + 0x70, 0x6f, 0x73, 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x73, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0x2c, 0x0a, + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x67, 0x68, + 0x74, 0x73, 0x6f, 0x6e, 0x20, 0x3a, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x64, 0x61, 0x74, 0x61, + 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, + 0x6c, 0x69, 0x67, 0x68, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, + 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, + 0x66, 0x61, 0x69, 0x6c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x24, 0x28, 0x20, 0x27, 0x23, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x20, 0x29, 0x2e, + 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x65, 0x78, 0x74, 0x20, 0x20, 0x29, + 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x0a, + 0x24, 0x28, 0x27, 0x23, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x4f, 0x66, + 0x66, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x63, 0x6c, 0x69, 0x63, + 0x6b, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x70, 0x6f, 0x73, + 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x65, 0x74, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x6f, + 0x66, 0x66, 0x20, 0x3a, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x6c, 0x69, + 0x67, 0x68, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x29, 0x2e, + 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, + 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, + 0x69, 0x6c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x24, 0x28, 0x20, 0x27, 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x20, 0x29, 0x2e, 0x68, 0x74, + 0x6d, 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x54, 0x65, 0x78, 0x74, 0x20, 0x20, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x0a, 0x24, 0x28, + 0x27, 0x23, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x50, 0x72, 0x6f, 0x67, + 0x72, 0x61, 0x6d, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x63, 0x6c, + 0x69, 0x63, 0x6b, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x70, + 0x6f, 0x73, 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, + 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0x2c, 0x0a, 0x20, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, + 0x73, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x3a, 0x20, 0x22, + 0x22, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, + 0x6e, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x24, 0x28, 0x27, 0x23, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x20, 0x27, 0x23, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x27, 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x65, 0x78, + 0x74, 0x20, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, + 0x7d, 0x29, 0x3b, 0x0a, 0x24, 0x28, 0x27, 0x23, 0x68, 0x6f, 0x73, 0x74, + 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x27, 0x2c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x20, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x21, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x28, - 0x22, 0x59, 0x6f, 0x75, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x62, 0x6f, - 0x75, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x70, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2e, 0x5c, 0x6e, 0x41, 0x72, - 0x65, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x73, 0x75, 0x72, 0x65, 0x3f, 0x22, - 0x29, 0x20, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x28, + 0x27, 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x22, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x68, 0x6f, 0x73, 0x74, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x22, 0x20, 0x2b, 0x20, 0x24, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x29, 0x20, 0x2b, + 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, - 0x2c, 0x0a, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x3a, 0x20, 0x24, 0x28, 0x74, + 0x2c, 0x0a, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x6f, + 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3a, 0x20, 0x24, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x20, 0x27, 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, - 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, - 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, - 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, - 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x27, 0x29, 0x2e, 0x63, 0x73, 0x73, 0x28, 0x7b, 0x27, 0x62, 0x61, - 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x27, 0x3a, 0x27, 0x72, - 0x65, 0x64, 0x27, 0x7d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, - 0x0a, 0x7d, 0x29, 0x3b, 0x0a, 0x0a, 0x24, 0x28, 0x27, 0x23, 0x6f, 0x6c, - 0x65, 0x64, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x27, 0x29, 0x2e, 0x6f, 0x6e, - 0x28, 0x27, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x27, 0x2c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x20, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x28, 0x74, - 0x68, 0x69, 0x73, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x29, 0x20, 0x3d, - 0x3d, 0x20, 0x31, 0x20, 0x20, 0x3f, 0x20, 0x24, 0x28, 0x27, 0x23, 0x6f, - 0x6c, 0x65, 0x64, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x29, 0x2e, 0x68, 0x74, - 0x6d, 0x6c, 0x28, 0x20, 0x27, 0x75, 0x70, 0x73, 0x69, 0x64, 0x65, 0x64, - 0x6f, 0x77, 0x6e, 0x27, 0x20, 0x29, 0x3a, 0x20, 0x24, 0x28, 0x27, 0x23, - 0x6f, 0x6c, 0x65, 0x64, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x29, 0x2e, 0x68, - 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x27, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, - 0x27, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x70, 0x6f, 0x73, - 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x65, 0x74, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x7b, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x6c, 0x65, 0x64, 0x6f, 0x72, 0x69, - 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3a, 0x20, 0x24, - 0x28, 0x27, 0x23, 0x6f, 0x6c, 0x65, 0x64, 0x4f, 0x72, 0x69, 0x65, 0x6e, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x27, - 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x7d, - 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, - 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x6f, - 0x6c, 0x65, 0x64, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x29, 0x2e, 0x68, 0x74, - 0x6d, 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, - 0x6c, 0x6f, 0x67, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, - 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, - 0x6c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, - 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, - 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x67, 0x65, 0x74, 0x4f, 0x6c, 0x65, 0x64, 0x4f, 0x72, 0x69, 0x65, - 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x3b, 0x0a, 0x20, - 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x0a, 0x0a, 0x24, 0x28, - 0x27, 0x23, 0x74, 0x66, 0x74, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x27, 0x29, - 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x27, - 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x20, 0x24, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, - 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, - 0x29, 0x20, 0x24, 0x28, 0x27, 0x23, 0x74, 0x66, 0x74, 0x4f, 0x72, 0x69, - 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x29, 0x2e, 0x68, - 0x74, 0x6d, 0x6c, 0x28, 0x27, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x27, - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, 0x24, 0x28, - 0x74, 0x68, 0x69, 0x73, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x29, 0x20, - 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x29, 0x20, 0x24, 0x28, 0x27, 0x23, 0x74, - 0x66, 0x74, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x27, 0x75, 0x70, - 0x73, 0x69, 0x64, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x27, 0x29, 0x3b, 0x0a, - 0x20, 0x20, 0x24, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x28, 0x20, 0x22, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x73, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x74, 0x66, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x3a, 0x20, 0x24, 0x28, 0x27, 0x23, 0x74, 0x66, 0x74, - 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x27, - 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x7d, - 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, - 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x74, - 0x66, 0x74, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x64, 0x61, - 0x74, 0x61, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, - 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x54, 0x66, 0x74, 0x4f, 0x72, - 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x3b, - 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x0a, 0x0a, - 0x24, 0x28, 0x27, 0x23, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x4f, 0x6e, - 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x63, 0x6c, 0x69, 0x63, 0x6b, - 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, - 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x70, 0x6f, 0x73, 0x74, - 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x65, 0x74, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x7b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x6f, 0x6e, - 0x20, 0x3a, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, - 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, 0x7b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x6c, 0x69, 0x67, 0x68, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x29, 0x2e, 0x68, 0x74, + 0x20, 0x22, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x2e, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x5c, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x22, 0x20, 0x2b, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x2b, 0x20, + 0x22, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5c, 0x22, 0x3e, 0x43, 0x6c, + 0x69, 0x63, 0x6b, 0x20, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x6f, 0x20, + 0x67, 0x6f, 0x20, 0x74, 0x6f, 0x20, 0x22, 0x20, 0x2b, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x2b, 0x20, 0x22, 0x3c, 0x2f, 0x61, 0x3e, 0x22, 0x29, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x20, 0x27, 0x23, 0x68, + 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x27, 0x20, 0x29, 0x2e, 0x63, 0x73, 0x73, 0x28, 0x7b, 0x27, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x27, 0x3a, 0x27, 0x6c, + 0x69, 0x67, 0x68, 0x74, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x27, 0x7d, 0x29, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x20, 0x27, 0x23, 0x68, + 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, - 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, - 0x28, 0x20, 0x27, 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x27, 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, - 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x54, 0x65, 0x78, 0x74, 0x20, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, - 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x0a, 0x0a, 0x24, 0x28, 0x27, - 0x23, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x4f, 0x66, 0x66, 0x27, 0x29, - 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x27, 0x2c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, - 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x28, 0x20, - 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x65, 0x74, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x6f, 0x66, 0x66, 0x20, - 0x3a, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, - 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, 0x7b, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x6c, 0x69, 0x67, 0x68, 0x74, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, - 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, - 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, - 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, - 0x20, 0x27, 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x27, 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, - 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x54, 0x65, 0x78, 0x74, 0x20, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, - 0x29, 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x0a, 0x0a, 0x24, 0x28, 0x27, 0x23, - 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, - 0x6d, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x63, 0x6c, 0x69, 0x63, - 0x6b, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x70, 0x6f, 0x73, - 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x65, 0x74, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x7b, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x70, - 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x3a, 0x20, 0x22, 0x22, 0x0a, - 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, - 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x64, 0x61, - 0x74, 0x61, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, - 0x27, 0x23, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x64, 0x61, - 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, - 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x20, 0x27, 0x23, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x20, - 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x65, 0x78, 0x74, 0x20, - 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x29, - 0x3b, 0x0a, 0x0a, 0x24, 0x28, 0x27, 0x23, 0x68, 0x6f, 0x73, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x27, 0x29, 0x2e, 0x6f, - 0x6e, 0x28, 0x27, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x27, 0x2c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, - 0x74, 0x61, 0x20, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x28, 0x27, - 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x22, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x20, 0x22, 0x20, 0x2b, 0x20, 0x24, 0x28, 0x74, 0x68, - 0x69, 0x73, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x29, 0x20, 0x2b, 0x20, - 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x24, - 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x73, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0x2c, - 0x0a, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x6f, 0x73, - 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3a, 0x20, 0x24, 0x28, 0x74, 0x68, - 0x69, 0x73, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x29, 0x0a, 0x20, 0x20, - 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, - 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x20, - 0x27, 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x27, 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, - 0x22, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x64, 0x2e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, - 0x65, 0x66, 0x3d, 0x5c, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, - 0x22, 0x20, 0x2b, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x2b, 0x20, 0x22, - 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5c, 0x22, 0x3e, 0x43, 0x6c, 0x69, - 0x63, 0x6b, 0x20, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x67, - 0x6f, 0x20, 0x74, 0x6f, 0x20, 0x22, 0x20, 0x2b, 0x20, 0x64, 0x61, 0x74, - 0x61, 0x20, 0x2b, 0x20, 0x22, 0x3c, 0x2f, 0x61, 0x3e, 0x22, 0x29, 0x3b, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x20, 0x27, 0x23, 0x68, 0x6f, - 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x27, - 0x20, 0x29, 0x2e, 0x63, 0x73, 0x73, 0x28, 0x7b, 0x27, 0x62, 0x61, 0x63, - 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x27, 0x3a, 0x27, 0x6c, 0x69, - 0x67, 0x68, 0x74, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x27, 0x7d, 0x29, 0x3b, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x20, 0x27, 0x23, 0x68, 0x6f, - 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, - 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, - 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, - 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x20, 0x64, - 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, - 0x28, 0x20, 0x27, 0x23, 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x27, 0x20, 0x29, 0x2e, 0x63, 0x73, 0x73, - 0x28, 0x7b, 0x27, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, - 0x64, 0x27, 0x3a, 0x27, 0x72, 0x65, 0x64, 0x27, 0x7d, 0x29, 0x3b, 0x0a, - 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x0a, 0x0a, 0x24, + 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x24, 0x28, 0x20, 0x27, 0x23, 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x27, 0x20, 0x29, 0x2e, 0x63, 0x73, + 0x73, 0x28, 0x7b, 0x27, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x27, 0x3a, 0x27, 0x72, 0x65, 0x64, 0x27, 0x7d, 0x29, 0x3b, + 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x0a, 0x24, 0x28, 0x27, 0x23, 0x6f, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x53, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x27, 0x2c, 0x20, @@ -1284,128 +1390,159 @@ const uint8_t setup_htm[] = { 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x24, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x29, 0x20, 0x29, - 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x0a, 0x0a, 0x24, 0x28, 0x27, 0x23, 0x6f, + 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x0a, 0x24, 0x28, 0x27, 0x23, 0x6f, 0x6c, + 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x53, 0x6c, + 0x69, 0x64, 0x65, 0x72, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x24, + 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x73, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0x2c, + 0x0a, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x6c, 0x65, + 0x64, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x20, 0x3a, 0x20, + 0x24, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, + 0x29, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, + 0x6e, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x24, 0x28, 0x27, 0x23, 0x6f, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x61, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x29, + 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x6f, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x53, - 0x6c, 0x69, 0x64, 0x65, 0x72, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, - 0x24, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x73, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, - 0x2c, 0x0a, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x6c, - 0x65, 0x64, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x20, 0x3a, - 0x20, 0x24, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x2e, 0x76, 0x61, 0x6c, - 0x28, 0x29, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, - 0x6f, 0x6e, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x6f, 0x6c, 0x65, 0x64, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x27, - 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, - 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, - 0x6f, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, - 0x53, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, - 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, - 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, - 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, - 0x4f, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, - 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x29, - 0x3b, 0x0a, 0x0a, 0x24, 0x28, 0x27, 0x23, 0x74, 0x66, 0x74, 0x42, 0x72, - 0x69, 0x67, 0x68, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x53, 0x6c, 0x69, 0x64, - 0x65, 0x72, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x69, 0x6e, 0x70, - 0x75, 0x74, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, - 0x74, 0x66, 0x74, 0x42, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x65, 0x73, - 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, - 0x6c, 0x28, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, - 0x20, 0x24, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x2e, 0x76, 0x61, 0x6c, - 0x28, 0x29, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x22, 0x25, 0x22, 0x20, 0x29, - 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x0a, 0x0a, 0x24, 0x28, 0x27, 0x23, 0x74, - 0x66, 0x74, 0x42, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x65, 0x73, 0x73, - 0x53, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, - 0x27, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x27, 0x2c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, - 0x20, 0x24, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x73, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, - 0x66, 0x74, 0x62, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x65, 0x73, 0x73, - 0x20, 0x3a, 0x20, 0x24, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x2e, 0x76, - 0x61, 0x6c, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, - 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x74, 0x66, 0x74, 0x42, - 0x72, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x53, 0x6c, 0x69, - 0x64, 0x65, 0x72, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x20, 0x64, - 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, - 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, - 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x54, 0x66, 0x74, - 0x4d, 0x61, 0x78, 0x42, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x65, 0x73, - 0x73, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, - 0x29, 0x3b, 0x0a, 0x0a, 0x24, 0x28, 0x27, 0x23, 0x74, 0x69, 0x6d, 0x65, - 0x5a, 0x6f, 0x6e, 0x65, 0x54, 0x65, 0x78, 0x74, 0x42, 0x6f, 0x78, 0x27, - 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x6c, 0x69, 0x64, 0x65, 0x72, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x4f, + 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x28, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x29, 0x3b, + 0x0a, 0x24, 0x28, 0x27, 0x23, 0x74, 0x66, 0x74, 0x42, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x53, 0x6c, 0x69, 0x64, 0x65, 0x72, + 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, - 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, - 0x24, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x28, 0x20, 0x27, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x73, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x27, - 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x3a, 0x20, + 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x74, 0x66, + 0x74, 0x42, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, + 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, 0x20, 0x24, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x29, + 0x20, 0x29, 0x20, 0x2b, 0x20, 0x22, 0x25, 0x22, 0x20, 0x29, 0x3b, 0x0a, + 0x7d, 0x29, 0x3b, 0x0a, 0x24, 0x28, 0x27, 0x23, 0x74, 0x66, 0x74, 0x42, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x53, 0x6c, 0x69, + 0x64, 0x65, 0x72, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, + 0x70, 0x6f, 0x73, 0x74, 0x28, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x73, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0x2c, 0x0a, + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x66, 0x74, 0x62, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x3a, 0x20, 0x24, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, - 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, + 0x29, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, + 0x6e, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x24, 0x28, 0x27, 0x23, 0x74, 0x66, 0x74, 0x42, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x53, 0x6c, 0x69, 0x64, 0x65, 0x72, + 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, + 0x66, 0x61, 0x69, 0x6c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x54, 0x66, 0x74, 0x4d, 0x61, 0x78, + 0x42, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x28, 0x29, + 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x0a, + 0x24, 0x28, 0x27, 0x23, 0x74, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, + 0x54, 0x65, 0x78, 0x74, 0x42, 0x6f, 0x78, 0x27, 0x29, 0x2e, 0x6f, 0x6e, + 0x28, 0x27, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x27, 0x2c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x70, 0x6f, + 0x73, 0x74, 0x28, 0x20, 0x27, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x65, + 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x27, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x69, + 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x3a, 0x20, 0x24, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x29, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x64, + 0x6f, 0x6e, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x74, 0x69, 0x6d, + 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x54, 0x65, 0x78, 0x74, 0x42, 0x6f, 0x78, + 0x27, 0x29, 0x2e, 0x63, 0x73, 0x73, 0x28, 0x20, 0x7b, 0x27, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x27, 0x3a, 0x27, 0x6c, + 0x69, 0x67, 0x68, 0x74, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x27, 0x7d, 0x20, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, + 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x27, 0x54, + 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, + 0x74, 0x6f, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x74, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x54, 0x65, 0x78, 0x74, 0x42, 0x6f, 0x78, 0x27, 0x29, 0x2e, 0x63, 0x73, 0x73, 0x28, 0x20, 0x7b, 0x27, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, - 0x27, 0x3a, 0x27, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x67, 0x72, 0x65, 0x65, - 0x6e, 0x27, 0x7d, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x24, 0x28, 0x27, 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, - 0x28, 0x20, 0x27, 0x54, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x20, - 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x64, - 0x61, 0x74, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, - 0x74, 0x61, 0x20, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x24, 0x28, 0x27, 0x23, 0x74, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, - 0x65, 0x54, 0x65, 0x78, 0x74, 0x42, 0x6f, 0x78, 0x27, 0x29, 0x2e, 0x63, - 0x73, 0x73, 0x28, 0x20, 0x7b, 0x27, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, - 0x6f, 0x75, 0x6e, 0x64, 0x27, 0x3a, 0x27, 0x72, 0x65, 0x64, 0x27, 0x7d, - 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, - 0x7d, 0x29, 0x3b, 0x20, 0x2f, 0x2a, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, - 0x69, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x73, 0x65, 0x74, - 0x75, 0x70, 0x20, 0x2a, 0x2f, 0x0a, 0x0a, 0x24, 0x28, 0x27, 0x23, 0x73, - 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, + 0x27, 0x3a, 0x27, 0x72, 0x65, 0x64, 0x27, 0x7d, 0x20, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x20, + 0x2f, 0x2a, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x75, 0x70, 0x20, 0x2a, + 0x2f, 0x0a, 0x24, 0x28, 0x27, 0x23, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x27, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x28, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x65, 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x7b, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x6c, - 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x3a, 0x20, 0x24, 0x28, 0x74, - 0x68, 0x69, 0x73, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x29, 0x20, 0x3d, - 0x3d, 0x3d, 0x20, 0x22, 0x4f, 0x46, 0x46, 0x22, 0x20, 0x3f, 0x20, 0x22, - 0x4f, 0x4e, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x4f, 0x46, 0x46, 0x22, 0x0a, - 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, - 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x64, - 0x61, 0x74, 0x61, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, - 0x27, 0x23, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4c, 0x6f, 0x67, 0x67, - 0x69, 0x6e, 0x67, 0x27, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x28, 0x27, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x29, - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x29, - 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x27, 0x53, 0x45, 0x4e, 0x53, 0x4f, - 0x52, 0x20, 0x4c, 0x4f, 0x47, 0x47, 0x49, 0x4e, 0x47, 0x20, 0x49, 0x53, - 0x20, 0x4e, 0x4f, 0x57, 0x20, 0x27, 0x2b, 0x64, 0x61, 0x74, 0x61, 0x29, - 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, 0x61, - 0x69, 0x6c, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x24, 0x28, 0x27, 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, - 0x65, 0x78, 0x74, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0a, - 0x7d, 0x29, 0x3b, 0x0a, 0x0a, 0x24, 0x28, 0x27, 0x2e, 0x73, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x6c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x20, + 0x3a, 0x20, 0x24, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x2e, 0x76, 0x61, + 0x6c, 0x28, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x22, 0x4f, 0x46, 0x46, + 0x22, 0x20, 0x3f, 0x20, 0x22, 0x4f, 0x4e, 0x22, 0x20, 0x3a, 0x20, 0x22, + 0x4f, 0x46, 0x46, 0x22, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, + 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x73, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, + 0x67, 0x27, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x28, 0x27, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x27, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x29, 0x2e, 0x68, + 0x74, 0x6d, 0x6c, 0x28, 0x27, 0x53, 0x45, 0x4e, 0x53, 0x4f, 0x52, 0x20, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x20, 0x4c, 0x4f, 0x47, 0x47, 0x49, 0x4e, + 0x47, 0x20, 0x49, 0x53, 0x20, 0x4e, 0x4f, 0x57, 0x20, 0x27, 0x2b, 0x64, + 0x61, 0x74, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x29, 0x2e, 0x68, + 0x74, 0x6d, 0x6c, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x54, 0x65, 0x78, 0x74, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x0a, 0x24, 0x28, 0x27, 0x23, + 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, + 0x67, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x63, 0x6c, 0x69, 0x63, + 0x6b, 0x27, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x64, 0x61, 0x74, 0x61, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x70, + 0x6f, 0x73, 0x74, 0x28, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x65, + 0x74, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x6c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x3a, 0x20, 0x24, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x29, 0x20, + 0x3d, 0x3d, 0x3d, 0x20, 0x22, 0x4f, 0x46, 0x46, 0x22, 0x20, 0x3f, 0x20, + 0x22, 0x4f, 0x4e, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x4f, 0x46, 0x46, 0x22, + 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x64, 0x6f, 0x6e, + 0x65, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x64, 0x61, 0x74, 0x61, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, + 0x28, 0x27, 0x23, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4c, 0x6f, 0x67, + 0x67, 0x69, 0x6e, 0x67, 0x27, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x28, + 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x2c, 0x64, 0x61, 0x74, 0x61, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, 0x28, 0x27, 0x23, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, + 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x27, 0x53, 0x45, 0x4e, 0x53, + 0x4f, 0x52, 0x20, 0x4c, 0x4f, 0x47, 0x47, 0x49, 0x4e, 0x47, 0x20, 0x49, + 0x53, 0x20, 0x4e, 0x4f, 0x57, 0x20, 0x27, 0x2b, 0x64, 0x61, 0x74, 0x61, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x2e, 0x66, + 0x61, 0x69, 0x6c, 0x28, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x24, 0x28, 0x27, 0x23, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, + 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x54, 0x65, 0x78, 0x74, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, + 0x0a, 0x7d, 0x29, 0x3b, 0x0a, 0x24, 0x28, 0x27, 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, @@ -1445,8 +1582,49 @@ const uint8_t setup_htm[] = { 0x72, 0x20, 0x29, 0x2e, 0x63, 0x73, 0x73, 0x28, 0x7b, 0x27, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x27, 0x3a, 0x27, 0x72, 0x65, 0x64, 0x27, 0x7d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x3b, - 0x0a, 0x7d, 0x29, 0x3b, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x3e, 0x0a, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, - 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a + 0x0a, 0x7d, 0x29, 0x3b, 0x0a, 0x24, 0x28, 0x27, 0x23, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x53, 0x63, 0x61, 0x6e, 0x27, 0x29, 0x2e, 0x6f, 0x6e, + 0x28, 0x27, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x27, 0x2c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x28, 0x20, 0x27, 0x23, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x27, 0x20, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x20, 0x22, 0x53, + 0x63, 0x61, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x2e, 0x2e, 0x22, 0x20, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x24, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x28, + 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x65, 0x74, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x63, 0x61, 0x6e, + 0x3a, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x73, + 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x20, 0x67, + 0x65, 0x74, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2c, 0x20, 0x33, + 0x30, 0x30, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, + 0x28, 0x27, 0x70, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x27, 0x29, 0x2e, 0x68, 0x69, + 0x64, 0x65, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, + 0x6f, 0x67, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x7d, 0x29, 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x0a, 0x0a, 0x0a, 0x24, 0x28, + 0x27, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x63, 0x6c, 0x69, 0x63, + 0x6b, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x24, 0x28, 0x27, 0x2e, 0x63, + 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x27, 0x29, + 0x2e, 0x63, 0x73, 0x73, 0x28, 0x27, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x27, 0x2c, 0x27, 0x34, 0x35, 0x70, 0x78, 0x27, 0x29, 0x2e, 0x63, 0x73, + 0x73, 0x28, 0x27, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x27, 0x2c, 0x27, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x27, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x24, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x2e, 0x63, 0x73, 0x73, + 0x28, 0x27, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x27, 0x2c, 0x27, 0x61, + 0x75, 0x74, 0x6f, 0x27, 0x29, 0x2e, 0x63, 0x73, 0x73, 0x28, 0x27, 0x63, + 0x75, 0x72, 0x73, 0x6f, 0x72, 0x27, 0x2c, 0x27, 0x27, 0x29, 0x3b, 0x0a, + 0x7d, 0x29, 0x3b, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x3e, 0x0a, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x2f, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a }; -const unsigned int setup_htm_len = 17383; +const unsigned int setup_htm_len = 19518; diff --git a/webservertask.ino b/webservertask.ino index f2da897..9b82ea8 100644 --- a/webservertask.ino +++ b/webservertask.ino @@ -163,7 +163,6 @@ void webServerTask ( void * pvParameters ) { response = request->beginResponseStream( HEADER_HTML ); response->printf( "%lu", FFat.freeBytes() ); - //response->print( String(FFat.totalBytes() - FFat.freeBytes()) ); return request->send( response ); } @@ -257,48 +256,49 @@ void webServerTask ( void * pvParameters ) else if ( request->hasArg( "sensor" ) ) { - if ( !numberOfFoundSensors ) - { - return request->send( 501, HEADER_HTML, NOT_PRESENT_ERROR_501 ); - } - if ( !request->hasArg( "number" ) ) - { - return request->send( 400, HEADER_HTML, "No sensornumber" ); - } - uint8_t sensorNumber = request->arg( "number" ).toInt(); - if ( sensorNumber >= numberOfFoundSensors ) - { - return request->send( 400, HEADER_HTML, "Invalid sensornumber" ); - } + if ( !sensor.count() ) return request->send( 501, HEADER_HTML, NOT_PRESENT_ERROR_501 ); + if ( !request->hasArg( "number" ) ) return request->send( 400, HEADER_HTML, "No sensornumber" ); + uint8_t num = request->arg( "number" ).toInt(); + if ( num >= sensor.count() ) return request->send( 400, HEADER_HTML, "Invalid sensornumber" ); response = request->beginResponseStream( HEADER_HTML ); - response->printf( "%s\n%.3f\n%x\n", - sensor[sensorNumber].name, - sensor[sensorNumber].tempCelcius, - sensor[sensorNumber].addr ); + sensorName_t name; + sensorId_t id; + response->printf( "%s\n%.3f\n%s\n", sensor.getName( num, name ), sensor.temp( num ), sensor.getId( num, id ) ); + return request->send( response ); + } + + else if ( request->hasArg( "sensors" ) ) + { + if ( !sensor.count() ) return request->send( 501, HEADER_HTML, NOT_PRESENT_ERROR_501 ); + sensorName_t name; + sensorId_t id; + response = request->beginResponseStream( HEADER_HTML ); + for ( uint8_t num = 0; num < sensor.count(); num++ ) + response->printf( "%s,%.3f,%s\n", sensor.getName( num, name ), sensor.temp( num ), sensor.getId( num, id ) ); + return request->send( response ); } else if ( request->hasArg( "sensorlogging" ) ) { - return request->send( 200, HEADER_HTML, LOG_SENSOR_ERRORS ? "ON" : "OFF" ); + if ( !sensor.count() ) return request->send( 501, HEADER_HTML, NOT_PRESENT_ERROR_501 ); + return request->send( 200, HEADER_HTML, sensor.logging() ? "ON" : "OFF" ); + } + + else if ( request->hasArg( "sensorerrorlogging" ) ) + { + if ( !sensor.count() ) return request->send( 501, HEADER_HTML, NOT_PRESENT_ERROR_501 ); + return request->send( 200, HEADER_HTML, sensor.errorLogging() ? "ON" : "OFF" ); } else if ( request->hasArg( "sensorname" ) ) { - if ( !numberOfFoundSensors ) - { - return request->send( 501, HEADER_HTML, "No sensors present." ); - } - if ( !request->hasArg( "number" ) ) - { - return request->send( 400, HEADER_HTML, "No sensornumber" ); - } - uint8_t sensorNumber = request->arg( "number" ).toInt(); - if ( sensorNumber >= numberOfFoundSensors ) - { - return request->send( 400, HEADER_HTML, "Invalid sensornumber" ); - } - return request->send( 200, HEADER_HTML, sensor[sensorNumber].name ); + if ( !sensor.count() ) return request->send( 501, HEADER_HTML, NOT_PRESENT_ERROR_501 ); + if ( !request->hasArg( "number" ) ) return request->send( 400, HEADER_HTML, "No sensornumber" ); + uint8_t num = request->arg( "number" ).toInt(); + if ( num >= sensor.count() ) return request->send( 400, HEADER_HTML, "Invalid sensornumber" ); + sensorName_t name; + return request->send( 200, HEADER_HTML, sensor.getName( num, name ) ); } else if ( request->hasArg( "status" ) ) @@ -319,16 +319,11 @@ void webServerTask ( void * pvParameters ) then = now; } response->printf( "%s\n%s\n", timeStr, leds.stateString() ); - if ( numberOfFoundSensors ) - { - for ( uint8_t sensorNumber = 0; sensorNumber < numberOfFoundSensors; sensorNumber++ ) - { - if ( !sensor[sensorNumber].error ) - response->printf( "%s,%.3f\n", sensor[sensorNumber].name, sensor[sensorNumber].tempCelcius ); - else - response->printf( "%s,ERROR\n", sensor[sensorNumber].name ); - } - } + + sensorName_t name; + for ( uint8_t num = 0; num < sensor.count(); num++ ) + response->printf( "%s,%.3f\n", sensor.getName( num, name ), sensor.temp( num ) ); + return request->send( response ); } @@ -596,49 +591,67 @@ void webServerTask ( void * pvParameters ) else if ( request->hasArg( "sensorlogging" ) ) { + if ( !sensor.count() ) return request->send( 501, HEADER_HTML, NOT_PRESENT_ERROR_501 ); + if ( request->arg( "sensorlogging").equalsIgnoreCase( "on" ) ) { - LOG_SENSOR_ERRORS = true; + sensor.setLogging( true ); + if ( !xLoggerTaskHandle ) + { + BaseType_t xReturned = startLogger(); + ESP_LOGI( TAG, "LoggerTask %s.", ( xReturned == pdPASS ) ? "started" : "failed" ); + } return request->send( 200, HEADER_HTML, "ON" ); } else if ( request->arg( "sensorlogging" ).equalsIgnoreCase( "off" ) ) { - LOG_SENSOR_ERRORS = false; + sensor.setLogging( false ); return request->send( 200, HEADER_HTML, "OFF" ); } else return request->send( 400, HEADER_HTML, "Invalid option." ); } - else if ( request->hasArg( "sensorname" ) ) + else if ( request->hasArg( "sensorerrorlogging" ) ) { - if ( request->arg( "sensorname" ).length() >= sizeof( sensor->name ) ) + if ( !sensor.count() ) return request->send( 501, HEADER_HTML, NOT_PRESENT_ERROR_501 ); + + if ( request->arg( "sensorerrorlogging").equalsIgnoreCase( "on" ) ) { - return request->send( 400, HEADER_HTML, "Sensorname too long" ); + sensor.setErrorLogging( true ); + return request->send( 200, HEADER_HTML, "ON" ); } - if ( !request->hasArg( "number" ) ) + else if ( request->arg( "sensorerrorlogging" ).equalsIgnoreCase( "off" ) ) { - return request->send( 400, HEADER_HTML, "No sensornumber" ); - } - - uint8_t sensorNumber = request->arg( "number" ).toInt(); - - if ( sensorNumber > numberOfFoundSensors ) - { - return request->send( 400, HEADER_HTML, "Invalid sensornumber" ); + sensor.setErrorLogging( false ); + return request->send( 200, HEADER_HTML, "OFF" ); } - snprintf( sensor[sensorNumber].name, sizeof( sensor->name ), "%s", request->arg( "sensorname" ).c_str() ); - - //get the sensor id and save under that key - char nvsKeyname[16]; + else return request->send( 400, HEADER_HTML, "Invalid option." ); + } - snprintf( nvsKeyname, sizeof( nvsKeyname ), "%02x%02x%02x%02x%02x%02x%02x", sensor[sensorNumber].addr[1], sensor[sensorNumber].addr[2], sensor[sensorNumber].addr[3], sensor[sensorNumber].addr[4], sensor[sensorNumber].addr[5], sensor[sensorNumber].addr[6], sensor[sensorNumber].addr[7] ); - preferences.putString( nvsKeyname, request->arg( "sensorname" ).c_str() ); + else if ( request->hasArg( "sensorname" ) ) + { + if ( request->arg( "sensorname" ).length() > sizeof( sensorName_t ) ) + return request->send( 400, HEADER_HTML, "Sensorname too long" ); - ESP_LOGI( TAG, " Saved name '%s' for DS18B20 sensor id: '%s' in NVS.", request->arg( "sensorname" ).c_str(), nvsKeyname ); + if ( !request->hasArg( "number" ) ) return request->send( 400, HEADER_HTML, "No sensornumber" ); + uint8_t num = request->arg( "number" ).toInt(); + if ( num > sensor.count() ) return request->send( 400, HEADER_HTML, "Invalid sensornumber" ); + sensorId_t id; + sensor.getId( num, id ); + if ( !sensor.setName( id, request->arg( "sensorname" ).c_str() ) ) + ESP_LOGE( TAG, " Error saving name '%s' for DS18B20 sensor id: '%s' in NVS.", request->arg( "sensorname" ).c_str(), id ); + else + ESP_LOGD( TAG, " Saved name '%s' for DS18B20 sensor id: '%s' in NVS.", request->arg( "sensorname" ).c_str(), id ); return request->send( 200, HEADER_HTML, request->arg( "sensorname" ).c_str() ); } + else if ( request->hasArg( "sensorscan" ) ) + { + sensor.rescan(); + return request->send( 200, HEADER_HTML ); + } + else if ( request->hasArg( "tftorientation" ) ) { if ( request->arg( "tftorientation" ) == "normal" )