From 665972893213f060651c2fbb363b210cb96801e4 Mon Sep 17 00:00:00 2001 From: Chris Mullins Date: Mon, 15 Apr 2019 10:39:21 -0700 Subject: [PATCH] Use single topic for MQTT client status (LWT, birth, etc.) (#435) * Update test for new MQTT client status approach * Refactor About helper to support outputing JSON * Use single topic for client status * Web UI: Use single topic for client status * Add platformio autogenerated file * increase MQTT buffer from 200 -> 250 to make room for larger LWT messages --- .gitignore | 1 + dist/index.html.gz.h | 4 +- lib/MQTT/MqttClient.cpp | 40 +++++++++---- lib/MQTT/MqttClient.h | 2 + lib/Settings/AboutHelper.cpp | 29 ++++++++++ .../{AboutStringHelper.h => AboutHelper.h} | 4 +- lib/Settings/AboutStringHelper.cpp | 25 -------- lib/Settings/Settings.cpp | 8 +-- lib/Settings/Settings.h | 4 +- lib/WebServer/MiLightHttpServer.cpp | 16 +---- platformio.ini | 2 +- test/remote/spec/mqtt_spec.rb | 28 ++++----- web/src/js/script.js | 58 ++++++++----------- 13 files changed, 111 insertions(+), 110 deletions(-) create mode 100644 lib/Settings/AboutHelper.cpp rename lib/Settings/{AboutStringHelper.h => AboutHelper.h} (57%) delete mode 100644 lib/Settings/AboutStringHelper.cpp diff --git a/.gitignore b/.gitignore index 9f3d45c9..b0197bde 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ .piolibdeps .clang_complete .gcc-flags.json +.sconsign.dblite /web/node_modules /web/build /dist/*.bin diff --git a/dist/index.html.gz.h b/dist/index.html.gz.h index 93aa7a2e..9712f1dc 100644 --- a/dist/index.html.gz.h +++ b/dist/index.html.gz.h @@ -1,2 +1,2 @@ -#define index_html_gz_len 10500 -static const char index_html_gz[] PROGMEM = {31,139,8,0,0,0,0,0,0,3,237,125,107,119,219,54,147,240,247,247,87,32,76,159,88,170,41,74,182,99,39,145,44,101,211,216,105,178,155,139,55,118,218,221,227,199,175,15,36,65,22,19,138,212,146,148,47,235,234,191,239,92,0,18,188,200,86,210,180,219,211,179,189,88,36,46,131,193,96,48,152,25,12,192,253,7,227,104,148,222,204,149,152,166,179,96,176,143,127,69,32,195,139,190,163,66,7,222,149,28,15,246,103,42,149,98,52,149,113,162,210,190,179,72,39,173,167,144,151,250,105,160,6,239,252,183,254,197,52,21,175,23,195,253,54,39,237,7,126,248,69,196,42,232,59,73,122,19,168,100,170,84,234,136,105,172,38,125,103,154,166,243,164,219,110,207,228,245,104,28,122,195,40,74,147,52,150,115,124,25,69,179,118,150,208,222,241,118,188,39,237,81,146,228,105,222,204,135,82,73,226,232,54,138,32,47,252,20,161,192,207,116,49,244,252,40,175,215,74,163,139,139,64,181,183,61,248,183,8,82,103,101,144,43,120,215,54,5,237,124,78,188,81,16,45,198,147,64,198,138,80,151,159,229,117,59,240,135,54,244,36,240,199,42,110,63,243,158,120,157,82,195,156,245,125,27,78,84,160,70,169,255,223,202,251,156,180,59,222,214,182,183,71,173,230,233,89,251,59,127,88,151,169,173,246,22,182,254,184,220,103,202,187,171,101,226,181,80,206,84,223,185,244,213,213,60,138,129,117,70,81,152,170,16,120,239,202,31,167,211,254,88,93,250,35,213,162,23,215,15,253,212,151,65,43,25,201,64,245,183,0,196,131,86,235,212,159,136,32,21,111,14,197,179,179,193,255,19,240,207,126,50,138,253,121,42,146,120,180,118,159,112,54,236,38,83,255,18,120,241,137,183,147,191,3,117,161,157,54,131,68,248,251,15,78,85,56,246,39,103,173,214,96,159,250,51,240,112,238,168,184,21,71,87,183,195,40,198,199,97,148,166,209,172,187,53,191,22,73,4,163,47,30,142,70,163,101,32,135,42,184,29,251,201,60,144,55,221,97,16,141,190,44,189,88,142,253,168,21,205,83,63,10,111,231,114,60,246,195,139,110,71,236,206,175,123,163,69,156,68,113,119,30,249,64,148,120,137,56,207,100,56,110,13,23,0,61,76,110,3,63,73,91,132,67,55,140,66,213,155,201,248,194,15,187,157,94,6,166,82,71,4,126,134,128,31,194,224,171,22,225,161,235,182,98,156,226,221,45,53,235,69,151,42,158,4,209,85,87,46,210,104,233,77,162,120,214,130,145,137,111,110,77,51,162,35,182,59,208,195,142,157,43,248,25,199,49,142,130,91,26,185,238,118,71,205,10,133,138,148,176,17,97,34,65,127,210,134,167,226,56,138,155,130,127,91,126,56,137,178,42,216,223,165,157,49,138,2,32,85,172,198,189,9,52,221,74,96,6,116,189,39,216,108,94,168,59,84,128,131,186,213,76,214,221,104,108,20,178,229,4,200,156,231,54,33,87,15,237,48,13,77,183,177,203,75,239,66,166,234,74,222,180,128,208,148,9,148,146,105,151,168,183,124,168,33,8,111,28,71,243,113,116,5,227,26,37,62,14,112,87,243,112,137,186,213,26,173,153,10,23,246,96,49,113,30,194,220,154,76,252,81,43,9,253,201,164,72,141,135,148,166,198,45,93,6,16,190,110,77,21,13,232,110,199,26,209,214,141,30,83,211,216,93,195,225,133,242,114,40,227,219,161,28,125,185,136,163,5,176,146,38,245,197,80,54,30,111,185,248,223,174,235,61,107,62,240,103,56,135,101,152,246,244,44,64,214,94,36,200,133,12,164,53,140,129,21,221,194,91,119,138,104,233,225,123,56,153,76,150,30,208,19,196,7,144,100,44,129,219,42,13,99,33,221,66,121,130,121,140,250,138,158,92,77,253,84,181,82,53,155,183,230,254,232,11,180,170,169,179,13,196,201,155,233,98,29,64,239,2,209,135,65,105,164,145,160,129,117,31,202,189,241,214,100,34,58,46,226,32,118,59,255,192,7,217,233,116,196,86,167,243,143,102,175,118,102,153,201,184,195,83,101,186,80,53,205,243,60,65,40,189,146,124,200,203,3,147,134,117,181,64,28,142,26,88,85,180,196,142,154,173,64,163,40,76,214,234,47,204,38,238,43,244,111,207,219,219,219,123,2,29,238,192,219,14,172,216,240,15,189,105,58,116,58,19,177,151,21,154,192,219,83,83,8,193,16,125,184,51,151,50,128,191,26,199,219,234,64,2,57,141,52,10,212,36,237,122,187,89,79,177,207,86,247,235,135,121,30,44,146,22,172,59,240,23,59,56,191,45,204,53,155,210,163,0,250,221,5,89,61,45,19,189,12,67,176,248,236,78,252,24,68,110,52,105,161,38,85,20,246,44,58,51,158,55,115,32,141,230,229,28,150,21,216,183,117,155,13,228,202,86,17,76,109,163,197,140,251,26,242,72,161,51,176,53,141,144,97,13,72,61,247,96,150,153,20,94,120,104,208,50,30,135,85,75,152,255,159,192,10,150,173,72,122,212,118,30,67,34,13,150,78,216,242,30,63,187,131,32,19,95,5,99,40,27,204,235,87,173,92,214,111,121,219,200,39,101,198,1,73,29,220,204,167,62,72,19,47,153,195,4,2,44,111,101,232,207,36,137,99,76,18,91,137,0,241,143,146,89,9,158,11,189,214,149,26,126,241,211,86,177,228,118,77,209,37,170,10,185,124,7,53,7,202,95,194,90,12,88,152,62,2,175,45,135,209,216,172,156,70,59,216,238,224,82,50,1,149,201,154,213,148,246,47,51,53,246,165,136,194,224,70,128,234,161,84,40,64,84,138,6,2,165,177,17,221,29,92,135,154,183,117,96,119,17,196,58,48,30,63,93,9,163,179,46,140,39,123,79,87,192,216,218,125,186,38,140,103,207,182,87,193,216,218,67,24,222,44,26,131,226,135,5,132,151,160,126,27,133,173,2,199,86,21,46,165,148,97,75,147,235,129,208,208,203,164,200,249,162,69,114,72,243,247,222,100,175,166,68,2,19,42,91,162,246,246,150,139,192,147,140,196,42,85,204,210,192,138,37,87,41,96,53,229,72,9,210,34,103,52,245,131,113,243,182,194,222,255,242,69,221,76,98,80,162,19,129,28,122,59,137,163,217,45,40,0,97,130,218,86,151,84,229,198,86,83,196,81,10,26,75,163,211,92,166,209,29,249,59,123,157,177,186,104,194,168,153,25,80,132,191,205,13,152,204,28,80,1,254,202,236,12,188,151,153,41,173,49,60,165,170,160,64,121,163,86,158,15,83,109,150,171,156,160,153,46,65,29,39,189,123,191,205,70,43,178,197,160,86,235,71,5,223,187,136,34,48,251,228,220,79,74,74,255,231,255,90,168,248,6,52,126,48,96,244,11,217,43,5,149,191,22,238,186,38,237,231,178,69,123,63,232,117,77,219,207,43,44,219,251,91,184,199,20,2,141,64,197,201,8,244,100,180,44,183,188,167,96,14,229,105,173,239,210,198,10,171,185,214,98,254,221,141,213,89,202,240,148,128,166,10,66,5,38,171,85,226,123,247,174,96,32,127,94,97,31,215,54,200,174,153,84,93,167,237,207,242,82,114,170,51,152,44,66,18,19,2,212,239,147,232,117,18,52,164,171,220,184,121,43,219,253,237,221,93,87,241,79,76,63,189,75,25,139,196,77,221,81,255,157,76,167,30,176,173,46,238,78,117,138,31,154,148,176,223,24,109,78,155,237,237,158,63,105,140,250,253,105,51,233,167,253,78,79,5,137,186,69,64,195,254,168,53,237,37,87,192,160,211,70,218,15,7,222,238,243,97,187,177,221,130,228,102,23,158,176,186,59,106,222,142,100,162,132,236,38,253,134,106,197,205,246,112,179,161,246,227,231,123,221,78,179,55,140,149,4,85,20,11,40,44,16,183,36,22,216,182,51,98,204,144,45,133,25,143,151,73,187,191,183,140,85,186,136,195,219,105,55,113,147,110,234,130,121,184,92,102,148,248,248,243,79,105,244,250,248,23,67,137,173,126,191,15,226,98,1,22,84,154,120,129,10,47,210,233,163,71,13,213,151,222,133,27,195,223,161,43,225,111,220,52,228,169,16,103,84,33,206,180,15,34,24,72,212,1,216,233,243,78,119,218,78,221,97,63,109,35,145,13,69,116,199,71,128,126,199,238,15,82,2,8,177,57,253,49,163,131,139,189,250,113,90,38,7,80,99,115,251,199,105,77,46,210,4,72,178,249,56,203,45,210,36,116,47,187,195,229,114,93,46,250,161,97,168,215,104,222,254,208,24,71,35,162,86,211,131,4,103,52,133,74,202,113,29,88,122,2,248,181,138,34,193,84,255,135,70,58,245,147,38,16,78,121,160,204,55,154,94,172,96,61,27,169,70,251,159,255,108,95,184,78,219,177,146,188,31,255,217,110,187,142,211,236,41,47,5,249,126,161,226,134,131,144,121,6,56,238,105,122,214,92,54,93,27,13,232,248,248,166,136,163,198,134,81,180,171,103,165,148,155,50,134,210,96,232,205,97,114,2,19,52,28,48,12,231,139,148,117,93,128,1,26,220,24,32,34,93,156,166,235,247,211,158,204,24,69,82,159,124,64,9,255,37,30,249,244,254,205,201,249,209,139,143,47,222,29,247,111,129,43,222,249,96,210,36,160,224,236,184,192,53,250,109,231,73,7,223,126,162,37,44,84,73,2,138,216,238,210,253,244,230,252,228,197,79,199,253,211,219,84,94,116,157,84,14,65,235,153,248,128,119,12,198,214,56,184,233,58,191,226,251,210,205,11,36,48,180,115,187,196,49,37,216,69,2,53,182,11,188,61,60,40,100,147,83,201,46,240,145,18,236,34,179,255,74,83,187,196,187,127,63,57,113,150,103,136,240,171,55,135,111,15,50,148,229,24,186,124,190,72,84,140,206,58,187,202,11,204,17,121,14,234,233,93,231,147,126,23,176,242,139,0,86,38,208,131,64,107,6,171,18,7,69,128,110,48,151,200,95,104,204,116,29,144,134,144,15,111,114,104,81,199,32,202,109,207,101,146,92,129,158,103,183,125,148,165,113,171,230,253,123,180,58,141,146,180,220,215,215,89,26,183,119,172,130,73,11,152,60,138,83,48,111,77,13,1,237,37,80,67,224,194,114,33,64,50,76,197,193,203,215,71,34,86,160,95,36,233,122,237,227,203,57,172,79,169,63,58,247,139,140,64,137,226,205,145,120,49,30,199,192,100,25,58,89,134,228,12,209,0,157,231,82,137,33,136,128,47,136,22,12,147,56,120,253,242,168,249,45,56,156,135,42,157,201,228,75,61,46,239,77,38,227,162,95,77,163,68,132,172,240,55,181,174,189,109,245,173,255,204,153,101,138,88,164,208,136,200,68,104,64,226,106,138,102,72,142,149,240,81,191,85,254,200,159,224,196,90,7,197,145,58,7,133,216,70,233,229,161,104,139,163,127,59,17,148,174,217,18,38,8,172,81,135,199,71,79,183,247,246,16,13,230,208,141,151,135,27,162,129,79,239,63,190,218,126,252,182,179,37,200,47,51,1,153,217,20,88,0,0,233,18,27,71,111,193,14,122,210,126,123,242,244,89,167,179,97,21,92,137,105,82,16,24,163,36,172,224,122,252,126,61,52,143,223,111,172,217,10,144,90,165,229,118,62,30,30,31,174,71,16,42,185,110,91,32,254,202,45,129,8,44,183,163,199,29,193,99,46,242,211,34,17,218,250,18,141,78,31,30,229,16,96,53,123,34,84,23,100,184,3,117,47,65,215,69,123,199,191,8,101,32,26,177,66,31,58,78,234,214,54,193,66,35,45,146,32,106,0,232,186,67,48,151,163,47,64,29,16,24,74,166,73,81,144,97,142,200,114,24,253,147,169,18,225,98,54,84,208,220,68,164,62,26,96,232,151,163,82,226,227,43,193,0,19,148,54,41,230,12,23,193,48,89,137,76,92,16,255,168,199,106,84,206,129,143,210,40,46,72,186,147,147,35,211,144,201,101,164,222,45,130,212,159,7,254,136,41,197,153,56,154,197,222,17,145,180,192,67,127,9,122,188,81,72,14,111,64,22,43,65,240,95,28,189,241,196,167,3,122,16,128,52,192,12,130,27,168,53,82,0,26,6,105,193,237,40,211,81,23,236,122,49,3,11,196,80,74,36,211,104,17,0,84,149,51,17,130,94,115,97,89,164,17,224,11,44,17,3,207,170,216,143,10,171,203,11,200,110,233,108,97,178,153,8,152,133,62,33,131,48,151,193,142,241,102,149,80,192,63,55,214,224,161,155,45,37,251,89,129,120,241,213,24,58,14,92,217,33,140,13,7,174,201,70,80,124,132,238,204,155,115,218,46,179,48,62,48,57,130,115,244,90,12,20,198,119,228,16,116,81,128,212,211,173,154,194,154,141,162,208,19,7,106,34,97,132,137,209,176,63,9,46,104,84,155,8,12,195,103,182,128,185,167,48,38,143,159,62,125,246,204,244,7,170,233,238,172,55,6,168,129,156,131,178,0,136,148,21,17,97,146,185,27,7,64,113,148,27,177,189,192,1,105,169,232,48,142,190,128,173,40,62,208,22,26,141,10,147,250,6,36,60,161,79,43,80,67,93,203,217,60,0,233,58,187,193,122,186,218,8,189,70,79,159,62,94,137,50,233,73,5,148,211,8,216,21,148,146,20,196,112,88,193,156,114,69,150,107,180,19,122,37,226,231,165,18,107,88,112,0,14,25,195,46,164,1,149,147,118,151,233,124,238,143,179,71,68,178,221,37,61,22,146,61,113,172,148,248,120,248,226,224,221,33,193,158,44,98,24,57,24,96,149,74,63,88,45,15,170,157,90,204,199,48,219,238,233,27,23,186,187,139,208,165,249,98,8,189,154,10,171,78,226,137,35,205,106,233,20,4,139,164,137,76,147,29,166,110,28,205,68,164,17,215,156,133,62,194,121,185,6,9,59,42,77,74,157,158,112,87,126,16,224,68,4,222,21,168,143,114,131,32,24,80,5,196,42,95,65,6,92,35,238,163,2,149,249,154,113,182,105,98,42,123,226,87,214,65,216,255,206,70,87,194,217,46,77,191,201,2,186,245,37,196,253,57,174,132,11,1,164,115,5,234,52,200,62,13,23,168,104,84,221,18,98,235,115,64,141,134,207,35,8,25,162,172,225,11,163,238,130,174,45,120,173,45,76,220,181,155,173,83,238,9,210,124,149,134,159,53,250,205,109,6,87,122,22,87,26,125,251,235,137,56,225,28,189,16,155,1,204,52,9,40,1,171,113,2,214,68,69,199,214,226,15,203,172,86,12,234,209,209,32,107,17,122,103,242,24,37,43,73,180,120,78,144,62,59,10,112,251,142,133,123,24,130,113,156,8,176,141,1,197,48,184,249,10,108,134,62,200,144,21,228,249,9,243,138,4,178,146,0,155,127,61,254,240,30,232,17,13,89,232,38,55,32,220,102,70,28,101,76,107,148,22,139,95,23,115,208,35,52,222,32,198,215,195,151,212,154,243,76,31,38,233,88,177,122,115,125,89,112,62,227,189,237,61,22,63,191,254,111,65,48,64,179,24,171,0,214,16,220,165,224,185,200,200,249,19,113,19,45,104,26,226,195,6,8,161,48,194,5,17,101,139,12,51,237,253,129,65,152,3,57,206,181,23,223,113,249,61,233,222,134,88,178,235,208,143,227,178,46,15,76,109,171,246,208,175,21,26,91,60,217,126,12,75,254,149,138,207,3,208,47,2,187,147,4,81,28,97,166,120,203,153,122,194,80,18,149,39,206,13,53,174,247,162,250,238,205,123,24,111,212,165,223,126,248,21,248,45,186,114,220,215,111,126,126,13,186,33,44,76,142,251,238,197,127,64,190,188,190,7,95,94,217,206,145,156,97,29,202,111,121,229,123,105,242,25,235,95,167,254,104,42,116,165,164,164,184,232,89,130,250,10,201,66,77,205,123,250,67,189,160,254,188,123,115,128,79,227,66,127,238,238,133,193,164,138,255,49,218,4,47,179,236,85,232,147,63,192,70,28,59,146,33,239,9,208,158,144,153,38,10,71,43,171,8,42,140,26,195,4,158,83,253,196,91,213,73,208,15,83,168,14,189,156,177,118,174,186,15,58,203,223,223,119,61,120,53,6,139,30,182,146,193,242,38,28,197,74,82,79,120,226,240,59,154,45,208,85,57,139,22,48,229,181,41,131,157,131,55,110,130,250,14,20,209,139,61,170,52,36,27,108,125,50,47,154,105,169,104,177,239,120,235,41,154,188,168,79,130,69,50,101,97,113,41,131,178,47,1,132,59,230,139,60,95,219,60,96,191,204,22,179,130,62,31,0,58,20,159,130,74,70,122,133,91,154,84,153,244,13,189,190,67,138,76,166,245,189,1,81,3,246,39,106,56,254,140,118,71,83,5,98,7,204,140,4,186,89,130,176,166,97,96,41,47,49,254,9,252,153,95,113,239,105,208,88,64,232,2,95,213,73,91,159,195,66,104,115,106,152,141,177,101,60,236,118,58,107,46,127,5,195,241,60,157,198,81,154,6,10,31,20,152,119,193,120,165,161,44,76,89,97,149,229,206,188,228,208,179,68,76,65,102,207,11,214,53,41,145,166,38,104,207,153,78,202,139,40,174,88,1,57,140,144,73,77,175,129,127,81,223,148,33,51,54,133,175,136,6,168,60,54,141,154,188,182,141,36,170,9,165,70,209,58,183,154,21,24,114,5,109,191,139,8,153,34,92,130,2,83,197,244,110,49,135,146,182,97,182,221,233,204,214,181,243,87,80,23,58,139,209,10,151,126,122,179,6,125,11,165,191,154,194,40,100,128,163,168,115,73,129,60,85,186,128,172,195,57,65,17,105,19,9,19,62,46,178,85,199,21,51,121,77,140,202,196,218,234,116,32,173,99,230,85,178,154,233,238,162,203,140,153,127,53,41,178,2,53,189,159,200,216,244,0,103,255,8,70,115,172,88,242,177,140,207,102,20,3,83,185,85,83,232,219,206,186,184,179,233,167,37,26,70,199,20,100,243,207,100,27,240,148,52,185,153,191,154,52,194,43,90,159,56,207,114,161,128,184,14,22,99,192,206,215,211,156,97,152,201,142,227,242,241,240,248,4,205,44,80,212,80,172,163,204,206,5,128,193,190,14,189,250,169,175,66,28,179,115,105,220,41,231,168,130,157,243,102,26,17,32,239,213,33,21,21,89,81,210,214,132,85,148,187,248,10,48,250,248,243,79,191,254,202,206,48,209,96,45,13,146,54,95,190,60,65,239,193,171,79,39,157,167,207,154,174,224,198,19,11,100,6,45,155,247,216,8,174,99,130,34,76,112,144,228,100,2,52,204,108,53,84,96,213,12,196,182,76,23,192,245,72,163,4,31,41,96,136,85,114,50,106,175,64,72,8,31,228,11,17,27,213,71,48,99,190,220,171,181,56,105,188,80,142,233,189,227,58,19,25,36,152,112,160,157,44,171,215,110,53,102,106,146,27,29,228,211,196,191,40,187,74,137,132,227,5,242,154,192,98,194,20,211,54,134,41,66,221,176,188,91,180,180,139,23,163,17,202,201,35,12,38,212,229,164,159,210,226,31,105,72,72,18,218,217,210,253,52,72,89,252,128,126,175,122,156,39,96,46,84,118,184,44,132,8,99,46,164,91,12,105,51,240,30,228,167,50,169,214,50,238,46,130,25,194,224,91,131,179,46,210,17,113,65,137,109,139,104,88,69,214,34,113,178,32,26,163,23,224,70,196,11,138,92,251,90,180,88,212,212,226,148,121,109,147,117,240,65,29,20,71,151,28,187,232,181,193,151,172,254,183,32,5,108,185,8,11,168,189,66,117,71,140,88,81,172,96,247,190,236,12,7,252,16,99,90,48,73,83,98,188,141,116,197,117,136,38,170,69,182,138,104,37,252,206,220,159,63,126,248,116,116,126,124,242,226,228,240,252,223,14,255,243,184,127,234,104,161,230,240,158,1,60,12,179,125,93,120,209,54,152,51,93,80,153,108,210,195,11,69,137,193,47,83,194,249,162,130,75,63,75,63,71,121,129,192,64,62,105,90,65,198,108,190,128,117,225,220,212,84,36,101,224,33,243,254,193,179,241,248,229,201,108,203,58,209,84,87,60,115,129,28,231,239,62,28,28,34,254,31,38,19,200,60,14,96,137,226,224,32,120,123,5,107,106,254,70,121,195,0,247,23,57,199,60,7,20,108,12,79,31,66,0,250,233,224,232,252,232,227,135,147,15,47,63,188,61,255,229,240,227,241,155,15,239,161,129,93,119,239,204,61,56,124,245,226,211,219,147,243,188,76,86,164,191,235,102,81,53,46,197,211,1,229,251,15,182,220,32,146,200,73,199,218,108,129,36,140,55,113,156,7,253,32,26,17,17,61,179,153,202,187,249,87,106,120,28,225,152,246,67,117,37,126,53,111,13,231,10,67,113,156,205,74,181,77,167,251,116,203,105,246,178,138,94,20,106,243,171,159,7,11,52,111,161,89,131,24,183,132,241,12,176,220,201,222,15,13,167,28,76,239,52,189,57,174,224,24,55,176,15,79,3,103,51,221,116,246,219,244,216,92,46,151,4,32,122,173,174,11,109,112,144,134,211,185,118,54,149,151,70,199,196,128,141,173,189,38,188,124,154,131,68,120,9,138,66,163,185,116,49,248,239,82,125,138,131,126,77,184,133,243,144,199,252,205,88,240,234,208,101,218,2,247,54,57,2,195,77,169,24,113,9,148,242,24,156,160,168,7,40,131,189,106,56,164,52,57,77,87,246,47,84,250,114,17,99,108,196,59,96,194,70,147,135,160,223,87,77,212,101,174,156,119,11,224,7,133,150,144,145,1,111,14,28,44,148,53,162,15,172,100,176,65,27,128,231,100,30,248,48,50,46,60,106,133,34,105,200,230,111,191,53,210,126,167,233,58,24,70,6,228,6,180,251,125,100,95,156,204,213,22,217,191,137,13,106,234,181,245,174,109,2,163,13,163,11,127,37,253,77,151,110,177,35,54,237,184,174,64,132,73,168,5,190,38,74,153,28,75,151,149,28,82,157,250,231,158,209,71,27,246,56,226,177,151,31,60,12,241,106,220,46,226,160,155,13,23,144,126,166,210,105,52,6,165,241,211,137,227,34,232,46,58,193,60,22,54,254,228,6,234,187,250,124,199,9,137,33,57,215,123,104,81,216,254,156,160,212,208,178,190,107,55,9,178,107,28,40,50,77,63,17,130,144,184,92,54,151,80,145,163,141,100,160,226,20,30,150,75,119,75,237,52,93,148,209,47,249,180,207,170,110,232,46,56,109,246,203,57,238,109,134,252,135,227,111,197,30,112,98,4,244,48,29,147,55,246,99,116,213,183,67,115,92,201,252,236,247,157,253,52,30,0,55,109,226,211,120,224,184,240,180,177,79,172,170,143,131,25,110,79,78,207,28,49,2,217,158,244,29,251,84,145,195,250,127,223,217,0,126,216,112,218,131,13,151,160,181,13,184,85,128,113,55,104,13,160,233,189,64,199,254,165,129,129,167,85,56,174,72,32,249,116,44,38,164,107,133,110,176,209,131,102,26,216,247,176,223,233,133,251,181,18,85,135,31,245,194,205,77,166,83,212,175,45,119,26,158,185,73,95,246,251,209,111,191,69,253,254,29,18,248,209,163,7,245,45,89,51,179,71,157,161,211,63,86,119,68,225,0,206,198,102,35,121,238,8,61,121,186,142,211,4,234,48,113,12,113,113,46,247,217,25,235,152,19,125,232,204,128,238,35,177,81,201,198,85,14,227,124,251,78,4,43,19,83,42,163,119,4,16,5,183,51,154,42,16,217,99,110,199,25,8,103,51,210,195,64,88,14,28,29,247,38,56,17,198,97,80,63,66,76,254,114,175,198,168,185,163,14,51,139,46,85,203,28,226,210,251,7,89,167,76,173,44,0,92,228,161,224,92,21,3,54,253,140,67,184,45,131,131,133,78,27,57,125,73,107,94,182,224,21,163,218,116,24,40,255,180,112,175,28,197,40,189,241,161,31,16,48,181,139,227,163,71,63,120,32,253,112,178,226,124,214,208,237,112,56,90,225,42,203,109,199,253,48,252,140,77,126,81,55,9,20,194,83,121,135,18,36,74,86,209,138,162,219,120,104,0,243,82,114,202,131,203,51,228,108,3,67,231,236,246,164,55,241,3,16,225,141,141,211,194,4,133,146,222,8,213,10,88,233,178,72,187,65,231,209,163,134,102,26,140,216,244,100,154,198,13,135,212,26,88,50,152,19,134,209,117,53,243,249,139,56,150,55,158,159,208,111,67,97,0,225,115,252,91,237,11,18,1,229,102,179,235,115,185,46,135,247,209,51,70,29,194,138,111,180,172,4,240,201,35,129,233,108,16,111,41,39,141,98,185,218,102,242,154,114,60,230,122,141,91,12,48,236,146,86,128,98,148,104,210,85,24,86,152,43,71,94,172,38,232,192,202,154,194,182,170,86,180,209,80,96,76,184,170,30,138,26,123,27,168,221,75,139,60,228,144,67,179,22,238,18,152,68,121,117,22,227,170,38,107,173,203,59,26,173,133,93,215,44,91,102,235,53,171,13,196,181,155,213,176,75,205,102,54,217,189,141,230,214,219,58,77,230,112,75,13,178,117,114,111,107,218,110,91,167,41,13,113,105,166,44,232,103,5,169,214,98,130,39,32,86,240,164,82,131,3,113,117,25,61,26,192,249,149,164,90,38,135,121,56,39,29,184,188,212,55,52,147,159,118,206,128,127,79,183,206,224,207,54,207,176,170,194,143,10,67,34,47,149,14,220,123,201,13,214,43,190,104,165,45,198,115,35,170,161,27,160,234,130,205,0,121,172,220,186,10,195,133,81,38,191,68,161,221,112,232,60,175,195,129,187,36,195,108,201,101,107,22,103,27,88,119,38,231,86,23,115,45,229,7,88,30,89,183,238,153,21,39,121,47,223,55,252,230,115,208,102,65,140,82,1,152,235,197,102,221,16,236,117,144,54,75,148,141,165,198,141,246,241,71,55,28,98,195,5,19,224,180,178,40,215,226,144,90,106,115,90,86,147,201,72,120,0,69,140,54,19,245,79,81,23,233,244,146,125,35,211,123,9,168,47,209,105,114,214,63,149,240,215,245,241,79,8,127,206,122,185,234,153,45,85,153,242,73,227,120,143,138,92,167,154,222,150,120,182,27,81,208,54,115,215,129,25,106,155,177,176,11,37,134,52,220,118,78,212,176,141,45,167,9,236,156,159,84,242,180,103,206,173,26,120,130,2,225,23,32,218,255,152,126,230,107,15,47,31,208,69,62,54,101,58,105,247,209,94,90,112,94,232,197,200,196,196,23,70,245,174,133,168,72,69,52,82,13,97,14,145,229,10,43,191,122,110,81,174,229,143,91,164,173,57,117,124,90,83,206,62,225,111,228,148,106,54,187,245,32,235,102,187,49,226,208,10,212,29,168,202,147,178,213,75,70,243,134,49,15,79,139,58,41,233,45,66,110,104,116,154,40,113,24,3,215,216,148,14,106,53,81,162,18,48,121,179,179,244,64,83,174,145,82,87,241,228,162,202,141,229,194,132,67,5,208,30,147,213,54,180,106,62,55,69,147,41,72,91,36,13,191,22,136,145,25,184,83,31,251,135,114,118,142,87,185,252,194,243,190,48,98,198,225,49,35,115,178,221,248,231,120,179,249,79,207,254,105,180,26,222,143,205,230,243,182,17,68,183,51,249,57,138,187,41,138,247,153,31,210,227,246,25,52,1,16,224,113,231,204,141,97,176,176,37,120,219,197,12,144,119,221,83,42,79,37,169,12,102,157,1,3,131,84,195,29,239,42,110,249,49,14,27,121,84,160,252,98,74,154,73,72,233,81,91,3,159,127,151,46,27,207,47,81,133,124,21,197,108,63,215,112,4,202,76,224,2,250,145,37,57,129,137,15,250,168,103,195,112,143,152,111,90,90,130,102,76,234,233,132,77,71,52,208,197,3,96,125,25,166,155,78,83,75,228,7,253,148,33,4,136,65,6,64,120,200,235,120,184,18,64,169,194,50,107,112,75,79,139,220,65,101,207,220,252,112,11,39,207,129,239,96,181,147,25,131,96,2,30,91,202,121,68,207,167,165,193,8,250,164,81,35,19,164,130,154,246,121,230,10,131,91,45,101,230,42,179,35,47,182,61,217,47,14,106,35,245,82,121,113,142,139,143,155,145,170,249,220,129,50,194,180,38,47,65,51,195,237,140,7,96,243,253,39,71,216,232,224,142,25,152,58,228,110,14,83,83,220,227,217,103,144,72,22,179,25,152,168,6,85,201,136,248,253,212,131,249,128,193,4,218,30,177,109,27,205,50,169,135,104,193,48,140,213,245,7,212,209,244,208,53,31,244,91,91,184,216,89,102,10,54,57,241,227,217,149,140,85,11,47,204,113,52,153,29,188,56,7,108,61,92,39,134,113,116,5,42,215,57,10,1,92,98,206,23,113,128,130,218,47,177,54,200,255,36,10,64,131,139,46,180,111,37,123,5,53,174,87,195,109,238,61,35,100,89,172,230,136,187,168,55,93,73,192,107,219,181,121,23,37,239,30,116,22,47,110,182,212,201,97,132,43,219,109,197,141,5,221,5,70,118,37,46,30,168,129,47,98,69,26,138,169,153,157,211,157,251,230,196,43,30,165,196,99,53,73,59,241,199,209,180,173,146,57,30,20,56,159,249,20,20,123,14,101,32,63,160,208,146,54,163,87,215,50,250,236,250,170,210,178,145,12,150,91,173,236,19,86,68,93,154,247,5,237,77,211,28,109,89,30,123,227,170,112,157,15,239,209,119,202,245,154,249,169,224,19,242,4,53,64,233,132,215,8,105,91,206,66,91,143,188,247,70,30,103,167,58,117,186,23,155,18,222,69,246,52,68,23,110,118,234,241,238,146,189,114,47,242,189,10,236,9,159,179,69,55,68,250,11,105,4,238,86,167,243,163,244,146,166,94,80,143,80,164,171,171,151,8,14,143,111,255,152,122,83,42,3,118,137,254,13,180,145,147,239,112,24,85,22,243,11,25,45,235,36,157,151,29,164,107,182,27,133,116,115,164,110,69,233,114,151,172,61,216,21,125,242,53,134,249,30,14,99,24,246,237,180,31,241,14,149,118,9,147,252,56,95,165,93,222,4,170,111,49,196,153,95,165,96,197,35,154,146,111,28,218,133,33,133,71,217,223,237,176,218,80,185,40,5,149,13,88,227,173,235,112,8,98,215,153,2,183,144,95,220,165,45,137,127,184,228,30,255,71,147,252,178,120,113,193,177,217,125,169,53,176,104,159,3,22,16,123,143,6,141,171,170,97,85,188,14,161,160,219,21,239,82,96,217,145,204,101,72,64,88,160,28,211,49,9,131,139,67,184,65,202,215,34,215,185,23,57,77,172,58,228,24,239,90,228,162,185,133,27,137,190,194,77,75,217,74,135,91,14,33,114,155,58,208,10,223,43,244,163,172,112,117,175,114,20,251,99,163,98,174,242,25,131,17,39,61,19,209,247,60,119,134,233,152,87,179,55,34,108,103,94,90,227,204,147,198,155,156,158,202,179,117,220,189,176,58,216,78,221,141,205,16,177,180,16,54,46,64,122,169,113,237,102,26,180,196,2,237,129,64,255,174,229,191,109,186,185,235,214,193,245,174,232,16,45,220,135,230,24,191,97,141,206,60,135,121,213,168,200,226,7,29,115,104,87,33,39,167,181,58,47,158,4,253,143,150,1,4,88,195,196,5,80,120,171,6,72,214,180,221,216,250,209,100,210,13,37,232,148,243,249,76,56,205,60,18,132,160,108,212,136,72,191,105,111,39,53,110,97,30,211,186,211,51,147,218,190,202,9,13,130,8,207,214,0,27,21,134,76,33,163,167,30,30,49,34,60,128,163,150,186,236,98,222,40,46,175,232,79,225,44,88,132,87,230,225,84,41,54,241,232,81,185,1,18,60,44,203,156,76,168,113,106,44,175,90,220,47,28,18,138,127,169,106,172,183,75,160,183,237,183,53,68,44,56,111,77,162,15,83,179,107,198,45,87,86,217,243,161,78,139,117,233,244,65,243,12,116,9,155,186,202,32,157,93,114,151,214,178,76,97,68,116,217,110,81,141,214,169,14,29,250,102,66,208,22,217,42,144,214,102,219,218,32,141,56,43,67,67,251,153,216,25,116,62,29,234,135,214,183,22,71,207,109,25,14,150,95,65,108,54,12,232,130,180,106,145,89,90,139,118,1,86,173,156,51,182,35,102,226,205,42,250,200,61,129,130,53,230,33,222,120,167,93,139,72,27,247,158,110,220,233,145,92,229,77,116,28,188,48,192,244,77,27,232,235,18,14,13,117,31,237,4,251,14,0,152,194,245,182,114,86,46,95,48,178,172,138,79,193,27,226,197,1,84,254,14,18,121,245,219,75,110,141,16,203,252,7,105,156,121,54,16,114,182,101,40,251,157,158,220,127,214,147,155,155,205,204,157,144,251,26,12,5,65,170,251,131,125,169,47,242,124,168,151,21,42,92,144,199,3,252,1,225,43,193,6,128,26,14,185,53,234,186,80,104,7,136,47,164,83,231,247,42,204,44,172,83,154,3,57,6,14,239,182,84,70,11,69,148,91,210,172,200,185,114,230,218,73,218,247,6,169,153,123,110,163,42,137,178,157,122,179,51,102,239,211,223,187,185,110,246,214,33,127,105,111,209,20,34,48,178,237,57,200,128,153,31,99,76,103,23,164,117,18,197,41,169,2,93,237,91,115,65,182,70,87,135,179,121,122,195,220,131,165,128,21,241,182,187,91,29,198,81,127,119,197,198,62,170,39,153,73,87,186,41,201,177,199,121,112,247,102,37,204,109,99,239,241,152,35,96,48,253,234,150,29,219,153,89,59,74,53,179,79,87,40,250,34,121,85,169,112,120,229,82,39,167,185,154,33,200,119,110,43,79,149,202,3,214,32,54,114,47,185,153,11,14,145,111,64,17,55,234,154,162,116,56,1,192,154,50,18,158,65,67,143,66,30,154,23,227,113,237,88,164,236,214,237,233,95,118,63,189,1,105,34,109,199,41,79,2,237,102,149,80,219,45,108,6,190,1,116,27,26,66,141,83,149,89,232,21,57,42,186,181,163,161,93,116,255,191,209,185,62,149,173,201,139,214,171,78,235,217,217,237,150,251,120,249,219,169,126,220,93,54,127,104,55,159,55,50,12,161,169,206,62,186,122,212,126,127,111,119,119,103,247,121,163,224,190,109,60,216,106,162,182,212,45,37,115,36,206,16,195,89,233,44,4,110,151,155,136,216,206,117,7,239,186,196,64,215,206,245,43,248,199,193,225,106,126,15,24,197,9,151,61,21,28,240,61,163,84,47,50,245,53,148,151,160,144,94,182,82,57,76,88,75,165,99,17,39,248,74,74,180,17,230,61,125,15,75,253,22,49,169,197,217,76,98,157,215,154,102,27,200,74,242,162,162,174,67,171,40,81,149,103,130,24,109,209,138,141,107,109,183,36,157,43,123,90,53,80,63,29,28,101,160,76,152,193,34,168,9,63,65,96,122,75,161,208,99,129,81,135,247,118,186,4,8,166,9,30,235,135,229,182,168,247,235,222,51,124,39,191,34,166,54,120,0,76,109,244,251,13,209,37,2,245,204,92,42,52,150,95,5,140,241,49,18,187,71,246,128,43,115,11,5,202,80,168,65,214,56,60,218,132,214,6,5,232,201,24,33,250,232,81,67,150,122,148,95,30,169,41,140,143,45,148,9,12,23,95,105,160,181,36,113,101,110,152,184,117,59,235,125,16,8,168,197,62,231,166,152,49,139,114,154,213,123,97,199,115,136,149,59,245,194,24,120,64,216,114,12,106,253,254,43,34,200,107,199,128,108,254,253,182,121,91,26,244,185,105,144,118,86,68,238,239,66,220,30,130,60,198,244,59,224,135,239,165,232,247,12,209,90,43,155,253,201,48,224,102,39,14,55,199,121,151,237,183,223,110,151,205,110,49,32,137,174,119,170,15,245,42,247,12,163,189,236,209,135,201,33,151,37,83,181,89,59,247,106,167,76,101,134,243,28,174,234,194,73,139,110,182,20,214,5,151,150,30,168,183,158,108,44,10,207,100,83,152,109,198,60,64,213,111,150,115,146,197,112,230,167,197,233,143,14,177,90,109,189,186,229,238,77,101,82,210,141,155,213,13,124,52,219,204,93,113,28,142,106,99,160,98,95,6,32,196,57,102,167,217,75,97,164,99,53,94,140,84,163,110,229,85,167,236,160,63,203,182,120,74,81,63,178,249,92,122,243,69,50,205,150,214,110,86,167,127,10,171,48,167,158,89,169,58,201,85,75,247,182,112,180,179,123,122,182,164,221,64,15,56,6,41,120,91,157,172,88,6,151,246,63,98,127,55,69,221,211,10,88,53,160,153,57,200,75,0,191,13,7,77,51,39,83,153,43,118,21,178,120,253,96,107,216,117,99,86,167,130,173,228,211,149,168,88,23,245,174,220,208,130,98,251,62,233,162,245,238,57,75,111,165,171,99,104,91,194,191,64,43,39,141,34,20,148,141,91,186,83,14,239,136,235,58,232,203,115,233,14,216,146,205,145,73,121,135,35,87,165,15,162,164,203,86,14,110,208,27,123,143,53,65,227,67,120,168,143,58,21,12,254,218,109,196,102,33,158,175,81,99,38,106,219,240,255,238,216,91,239,142,189,252,214,66,84,231,114,205,110,136,46,122,190,42,94,95,202,4,107,181,109,19,152,193,45,38,235,42,124,115,63,100,233,72,80,94,19,248,197,41,149,213,135,34,138,122,216,40,10,2,57,79,178,100,25,95,224,71,81,204,237,245,89,246,160,104,174,197,45,188,234,216,25,240,22,15,118,192,191,32,1,160,205,16,81,40,78,236,14,224,156,193,119,201,206,98,81,5,168,155,197,62,210,109,251,230,219,44,109,167,248,57,23,169,149,160,34,121,185,131,162,218,225,138,2,142,249,240,67,223,19,177,52,221,76,70,22,41,203,178,164,72,214,178,208,27,152,9,150,169,193,37,208,228,174,98,149,159,30,239,49,133,105,91,128,164,15,147,112,80,220,144,200,232,151,55,102,160,101,222,22,171,117,186,151,208,41,151,168,231,163,172,190,0,213,195,98,65,220,111,110,193,202,58,143,230,139,121,159,79,251,113,162,186,6,92,198,10,186,198,71,254,6,124,209,98,97,232,71,48,237,82,107,220,165,61,42,133,175,72,148,7,133,112,111,241,109,211,107,141,76,161,130,25,158,23,252,90,32,24,247,47,81,32,18,36,94,27,150,161,227,95,250,60,23,171,227,72,30,96,237,91,214,38,156,45,137,215,64,207,20,215,136,145,180,166,211,169,90,94,175,96,160,172,201,117,91,104,101,33,0,186,37,134,47,94,233,228,21,237,224,134,93,229,112,64,109,51,92,178,85,158,8,63,81,114,14,29,237,64,251,137,99,224,249,47,204,193,21,34,146,40,155,25,138,118,25,60,126,83,158,248,173,100,214,218,65,198,201,45,177,204,1,70,144,202,97,89,131,3,125,78,104,92,100,83,43,176,43,231,85,182,220,140,25,146,131,67,224,180,162,225,113,126,5,109,30,210,129,160,233,98,136,199,129,6,153,237,80,43,171,16,229,199,197,142,216,177,87,212,76,225,232,18,83,159,250,54,26,165,110,124,49,188,194,63,231,248,50,89,164,157,167,207,232,231,217,86,145,14,250,140,149,51,32,175,103,214,153,213,27,125,166,194,138,173,190,123,246,227,204,193,139,193,234,179,22,198,55,122,223,65,139,45,152,144,188,223,210,207,54,204,6,98,43,235,194,87,109,12,126,19,6,219,208,222,246,159,216,30,176,176,216,249,19,219,3,254,19,143,215,108,79,20,184,51,231,69,102,189,239,129,205,46,96,179,251,151,193,102,15,176,217,251,203,96,243,4,176,121,242,151,193,230,41,96,243,244,79,228,211,14,180,247,34,8,178,22,11,107,200,29,178,213,18,131,228,87,26,124,84,179,8,150,64,52,118,235,36,161,165,58,173,56,143,165,47,243,169,104,80,69,109,189,94,159,210,248,12,208,242,202,23,149,59,116,36,173,27,175,84,148,72,92,115,199,80,157,177,41,134,171,67,113,231,5,111,154,40,104,63,118,113,88,67,138,165,95,190,60,89,89,88,47,58,153,186,148,73,252,98,107,155,247,192,168,84,88,89,56,99,92,171,60,95,141,33,218,226,167,167,119,214,163,229,176,84,239,217,22,214,219,46,171,40,119,49,213,42,165,99,107,251,142,37,60,159,122,133,197,26,126,221,172,75,235,182,49,221,29,188,94,0,219,192,239,215,226,184,87,50,249,242,176,142,149,25,58,222,163,222,138,171,198,122,229,44,171,127,42,164,92,129,242,106,114,89,106,205,215,81,233,56,139,24,252,102,98,177,188,50,6,50,197,149,8,43,162,68,84,66,19,25,117,46,137,95,28,65,137,85,76,147,215,160,207,116,74,169,70,207,129,244,111,163,147,230,166,90,21,240,43,72,70,161,64,226,36,143,75,252,102,202,89,169,149,175,215,173,77,88,59,64,242,143,161,236,215,77,111,160,69,30,86,249,77,164,33,48,235,117,158,163,52,191,119,183,191,138,25,40,12,232,119,116,52,95,174,74,31,243,212,150,189,173,14,100,209,87,162,16,181,156,181,99,209,167,184,233,168,215,221,170,129,192,18,189,126,238,8,254,130,213,74,201,156,201,27,4,113,151,31,174,170,115,217,33,93,12,94,167,208,22,239,57,205,6,103,240,43,254,228,11,59,47,62,68,220,117,91,68,211,244,174,198,66,138,58,103,165,224,61,62,151,90,91,187,103,28,161,126,87,83,115,233,199,247,187,177,22,137,118,99,29,65,241,111,68,70,31,131,191,3,151,69,184,14,54,246,97,120,241,137,170,148,7,3,53,129,57,252,206,239,230,227,175,225,47,205,79,86,149,242,231,12,239,241,250,150,181,79,124,214,23,181,221,53,60,24,231,25,45,18,205,12,133,37,188,142,56,132,79,157,103,214,174,72,27,24,142,86,97,181,110,240,251,81,23,116,122,125,226,95,87,184,89,93,167,235,226,111,88,173,164,60,219,66,202,180,82,90,13,242,89,248,29,196,198,159,103,78,224,32,220,237,100,189,199,128,16,197,232,188,162,30,252,109,68,169,115,75,253,47,241,63,223,207,135,215,210,158,235,238,125,207,25,112,140,128,191,227,20,184,3,123,162,207,159,193,253,21,51,8,107,147,75,176,118,115,213,98,10,25,80,76,129,217,50,24,251,50,136,46,42,98,82,6,173,213,57,181,190,94,206,90,107,107,140,99,136,153,138,96,151,204,252,172,190,51,120,68,119,176,245,114,178,76,183,139,45,232,65,53,159,230,225,200,94,84,129,182,235,39,129,137,125,184,87,41,18,182,98,132,27,222,53,244,228,141,240,193,126,74,183,70,230,177,26,136,209,126,202,223,140,76,99,124,204,188,214,7,251,109,120,195,20,252,98,198,81,20,167,89,194,81,28,161,47,37,16,250,80,99,150,145,239,176,149,215,248,210,199,193,217,175,80,138,155,94,123,157,103,171,26,219,195,219,100,240,137,59,64,31,67,173,233,188,137,174,198,162,252,101,204,54,245,29,126,145,46,247,25,147,217,232,12,30,133,195,100,222,43,113,110,105,115,226,239,199,178,249,182,227,90,188,90,165,210,58,26,61,49,46,111,168,81,180,182,77,217,146,127,143,163,57,86,169,147,217,113,155,99,46,246,181,131,156,185,156,240,46,49,65,127,91,87,50,166,35,164,252,70,31,167,213,81,77,133,147,2,107,13,69,165,154,62,154,80,51,28,143,7,39,92,80,232,171,247,68,131,110,101,198,72,81,243,165,144,38,140,202,99,139,25,75,119,244,173,234,100,190,169,88,222,195,251,251,241,111,101,83,242,171,68,110,13,31,56,168,191,31,232,67,205,194,208,79,12,253,80,198,62,222,3,204,159,99,81,34,243,10,90,159,178,53,39,122,239,63,203,11,139,133,159,190,94,12,133,73,16,120,74,11,133,159,39,242,45,93,41,66,235,236,248,16,204,68,140,211,161,155,73,249,204,184,83,217,254,117,244,71,212,61,178,65,224,191,225,224,157,252,162,68,178,136,249,138,102,234,201,141,249,186,195,98,174,239,7,17,87,146,172,181,57,93,23,139,0,161,68,44,232,203,95,15,96,24,6,25,141,249,226,112,63,196,194,50,245,135,116,105,182,190,54,107,68,119,254,234,8,43,65,231,127,61,241,102,194,87,126,79,41,6,41,113,161,207,124,131,41,161,67,159,22,35,144,159,142,127,98,172,121,252,10,82,163,109,70,194,17,28,126,134,247,203,36,32,40,84,56,98,230,226,224,82,25,167,36,18,90,200,85,197,193,182,227,117,74,187,14,86,150,94,173,108,125,201,8,161,121,236,211,161,241,193,79,116,246,93,20,4,23,133,18,105,47,4,63,211,87,155,113,102,241,215,175,241,59,217,213,77,225,53,3,56,49,122,9,227,108,64,208,234,167,111,235,130,145,163,48,111,136,191,179,49,173,21,194,107,245,64,75,31,91,14,87,102,30,127,244,253,235,212,244,21,130,225,37,10,13,203,234,190,67,216,219,193,21,127,111,249,183,174,216,67,138,148,175,64,48,245,166,49,173,74,250,202,152,92,253,179,87,160,242,189,32,101,106,23,239,79,112,8,224,91,74,171,194,51,158,76,246,216,221,13,201,68,84,48,203,101,160,170,59,112,217,53,35,76,85,120,66,85,152,239,228,200,218,224,106,31,89,240,138,3,162,223,122,160,178,175,79,157,203,116,5,184,247,17,197,224,104,120,243,88,221,5,79,15,13,93,171,75,234,85,174,100,151,138,227,185,223,62,223,191,97,213,199,128,105,188,120,195,25,252,226,195,66,1,140,198,171,74,49,194,173,22,42,18,185,120,201,71,190,234,21,67,124,238,87,167,254,183,39,121,125,36,209,223,111,178,115,104,148,120,36,62,194,220,192,207,105,124,173,246,190,63,221,201,230,29,127,120,170,4,218,2,184,147,239,123,182,173,192,70,205,35,185,2,239,81,160,247,234,181,178,12,184,200,153,43,17,170,233,226,78,89,39,200,209,250,63,157,224,251,233,4,223,85,21,248,203,201,138,186,232,206,191,159,164,224,8,218,44,104,245,126,233,144,187,120,153,52,165,61,183,59,175,23,38,38,154,9,235,6,129,146,51,82,127,53,150,39,181,140,239,216,83,250,198,6,200,55,89,184,160,21,216,2,146,232,139,28,130,15,127,212,237,212,252,101,184,179,173,93,87,184,160,15,254,7,147,222,229,108,188,148,0,0}; \ No newline at end of file +#define index_html_gz_len 10441 +static const char index_html_gz[] PROGMEM = {31,139,8,0,0,0,0,0,0,3,237,61,249,119,219,70,115,191,247,175,88,195,249,44,194,2,65,74,178,100,155,20,233,207,145,228,216,173,15,213,146,147,246,41,42,223,146,92,138,176,65,128,5,64,29,85,248,191,119,102,246,192,226,160,68,59,78,154,151,215,28,34,176,231,236,236,236,92,59,187,216,127,48,142,71,217,205,92,176,105,54,11,251,251,248,151,133,60,186,232,57,34,114,224,93,240,113,127,127,38,50,206,70,83,158,164,34,235,57,139,108,210,124,6,121,89,144,133,162,255,46,120,27,92,76,51,246,122,49,220,111,201,164,253,48,136,190,176,68,132,61,39,205,110,66,145,78,133,200,28,54,77,196,164,231,76,179,108,158,118,90,173,25,191,30,141,35,127,24,199,89,154,37,124,142,47,163,120,214,50,9,173,29,127,199,127,218,26,165,105,158,230,207,2,40,149,166,142,234,163,216,228,69,144,97,43,240,51,93,12,253,32,206,235,53,179,248,226,34,20,173,109,31,254,45,54,169,178,76,203,21,184,107,187,130,126,62,167,254,40,140,23,227,73,200,19,65,160,243,207,252,186,21,6,67,187,245,52,12,198,34,105,61,247,159,250,237,82,199,50,235,251,118,156,138,80,140,178,224,127,132,255,57,109,181,253,173,109,127,143,122,205,211,77,255,59,127,216,144,169,175,214,22,246,254,164,60,102,202,187,171,103,162,181,136,207,68,207,185,12,196,213,60,78,128,116,70,113,148,137,8,104,239,42,24,103,211,222,88,92,6,35,209,164,23,47,136,130,44,224,97,51,29,241,80,244,182,160,137,7,205,230,89,48,97,97,198,222,28,177,231,231,253,127,97,240,207,126,58,74,130,121,198,210,100,180,246,152,112,53,236,166,211,224,18,104,241,169,191,147,191,3,118,161,159,150,108,18,219,223,127,112,38,162,113,48,57,111,54,251,251,52,158,190,143,107,71,36,205,36,190,186,29,198,9,62,14,227,44,139,103,157,173,249,53,75,99,152,125,246,112,52,26,45,67,62,20,225,237,56,72,231,33,191,233,12,195,120,244,101,233,39,124,28,196,205,120,158,5,113,116,59,231,227,113,16,93,116,218,108,119,126,221,29,45,146,52,78,58,243,56,0,164,36,75,132,121,198,163,113,115,184,128,214,163,244,54,12,210,172,73,48,116,162,56,18,221,25,79,46,130,168,211,238,154,102,42,117,88,24,24,0,130,8,38,95,52,9,14,85,183,153,224,18,239,108,137,89,55,190,20,201,36,140,175,58,124,145,197,75,127,18,39,179,38,204,76,114,115,171,187,97,109,182,221,134,17,182,237,92,38,159,113,30,147,56,188,165,153,235,108,183,197,172,80,168,136,9,27,16,137,36,24,79,214,240,69,146,196,137,203,228,111,51,136,38,177,169,130,227,93,218,25,163,56,4,84,37,98,220,157,64,215,205,20,86,64,199,127,138,221,230,133,58,67,1,48,136,91,69,100,157,141,198,70,33,155,79,0,205,121,174,11,185,106,106,135,89,164,135,141,67,94,250,23,60,19,87,252,166,9,136,166,76,192,20,207,58,132,189,229,67,213,2,243,199,73,60,31,199,87,48,175,113,26,224,4,119,20,13,151,176,91,173,209,156,137,104,97,79,150,68,206,67,88,91,147,73,48,106,166,81,48,153,20,177,241,144,210,196,184,169,202,0,192,215,205,169,160,9,221,109,91,51,218,188,81,115,170,59,187,107,58,252,136,95,14,121,114,59,228,163,47,23,73,188,0,82,82,168,190,24,242,198,147,45,15,255,219,245,252,231,238,131,96,134,107,152,71,89,87,173,2,36,237,69,138,84,40,27,105,14,19,32,69,175,240,214,153,34,88,106,250,30,78,38,147,165,15,248,4,246,1,40,25,115,160,182,74,199,88,72,245,80,94,96,190,4,125,197,72,174,166,65,38,154,153,152,205,155,243,96,244,5,122,85,216,217,6,228,228,221,116,176,14,128,119,129,224,195,164,52,178,152,209,196,122,15,249,222,120,107,50,97,109,15,97,96,187,237,127,224,3,111,183,219,108,171,221,254,135,219,173,93,89,122,49,238,200,165,50,93,136,154,238,229,58,193,86,186,37,254,144,151,7,34,141,234,106,1,59,28,53,176,42,107,178,29,49,91,1,70,145,153,172,53,94,88,77,114,172,48,190,61,127,111,111,239,41,12,184,13,111,59,32,177,225,31,122,83,120,104,183,39,108,207,20,154,192,219,51,93,8,155,33,252,200,193,92,242,16,254,42,24,111,171,19,9,232,212,220,40,20,147,172,227,239,154,145,226,152,173,225,215,79,243,60,92,164,77,144,59,240,23,7,56,191,45,172,53,27,211,163,16,198,221,1,94,61,45,35,189,220,6,147,236,179,51,9,18,96,185,241,164,137,154,84,145,217,75,214,105,104,94,175,129,44,158,151,115,36,175,192,177,173,219,109,200,87,246,138,205,212,118,90,204,184,175,35,159,20,58,221,182,194,17,18,172,110,82,173,61,88,101,58,69,10,30,154,52,67,227,32,181,152,254,255,41,72,48,35,145,212,172,237,60,129,68,154,44,149,176,229,63,121,126,7,66,38,129,8,199,80,54,156,215,75,173,156,215,111,249,219,72,39,101,194,1,78,29,222,204,167,1,112,19,63,157,195,2,2,40,111,121,20,204,56,177,99,76,98,91,41,3,246,143,156,89,48,185,22,186,205,43,49,252,18,100,205,98,201,237,154,162,75,84,21,114,254,14,106,14,148,191,4,89,12,80,232,49,2,173,45,135,241,88,75,78,173,29,108,183,81,148,76,64,101,178,86,53,165,253,115,38,198,1,103,113,20,222,48,80,61,132,136,24,176,74,214,192,70,105,110,88,103,7,229,144,123,91,215,236,46,54,177,78,27,79,158,173,108,163,189,110,27,79,247,158,173,104,99,107,247,217,154,109,60,127,190,189,170,141,173,61,108,195,159,197,99,80,252,176,0,243,83,212,111,227,168,89,160,216,170,194,37,132,208,100,169,115,125,96,26,74,76,178,156,46,154,196,135,20,125,239,77,246,106,74,164,176,160,140,136,218,219,91,46,66,159,75,32,86,169,98,150,6,86,44,185,74,1,171,41,71,74,144,98,57,163,105,16,142,221,219,10,121,255,243,139,184,153,36,160,68,167,12,41,244,118,146,196,179,91,80,0,162,20,181,173,14,169,202,141,45,151,37,113,6,26,75,163,237,46,179,248,142,252,157,189,246,88,92,184,48,107,122,5,20,219,223,150,29,232,204,188,161,66,251,43,179,77,243,190,49,83,154,99,120,202,68,65,129,242,71,205,60,31,150,218,44,87,57,65,51,93,130,58,78,122,247,126,75,26,173,72,22,253,90,173,31,21,124,255,34,142,193,236,227,243,32,45,41,253,159,255,123,33,146,27,208,248,193,128,81,47,100,175,20,84,254,218,118,215,53,105,63,151,45,218,251,155,94,215,180,253,188,194,178,189,191,135,123,76,33,208,8,68,146,142,64,79,70,203,114,203,127,6,230,80,158,214,252,46,125,172,176,154,107,45,230,223,221,89,157,165,12,79,41,104,170,192,84,96,177,90,37,190,247,232,10,6,242,231,21,246,113,109,135,210,53,147,137,235,172,245,153,95,114,153,234,244,39,139,136,216,4,3,245,251,52,126,157,134,13,238,9,47,113,111,121,171,183,189,187,235,9,249,147,208,79,247,146,39,44,245,50,111,212,123,199,179,169,15,100,171,138,123,83,149,18,68,58,37,234,53,70,155,83,183,181,221,13,38,141,81,175,55,117,211,94,214,107,119,69,152,138,91,108,104,216,27,53,167,221,244,10,8,116,218,200,122,81,223,223,125,49,108,53,182,155,144,236,118,224,9,171,123,35,247,118,196,83,193,120,39,237,53,68,51,113,91,195,205,134,216,79,94,236,117,218,110,119,152,8,14,170,40,22,16,88,32,105,114,44,176,109,103,36,152,193,155,2,51,158,44,211,86,111,111,153,136,108,145,68,183,211,78,234,165,157,204,3,243,112,185,52,152,248,248,211,143,89,252,250,228,103,141,137,173,94,175,7,236,98,1,22,84,150,250,161,136,46,178,233,163,71,13,209,227,254,133,151,192,223,161,199,225,111,226,106,244,84,144,51,170,32,103,218,3,22,12,40,106,67,219,217,139,118,103,218,202,188,97,47,107,33,146,53,70,212,192,71,0,126,219,30,15,98,2,16,177,57,125,108,240,224,225,168,30,79,203,232,0,108,108,110,63,158,214,228,34,78,0,37,155,79,76,110,17,39,145,119,217,25,46,151,235,82,209,15,13,141,189,134,123,251,67,99,28,143,8,91,174,15,9,206,104,10,149,132,227,57,32,122,66,248,181,138,34,194,68,239,135,70,54,13,82,23,16,39,124,80,230,27,174,159,8,144,103,35,209,104,253,250,107,235,194,115,90,142,149,228,63,254,181,213,242,28,199,237,10,63,3,254,126,33,146,134,131,45,203,21,224,120,103,217,185,187,116,61,27,12,24,248,248,166,8,163,130,70,130,104,87,55,165,132,151,73,8,185,134,208,159,195,226,4,34,104,56,96,24,206,23,153,212,117,161,13,208,224,198,208,34,226,197,113,189,160,151,117,185,33,20,78,99,10,0,36,252,151,104,228,211,251,55,167,131,227,151,31,95,190,59,233,221,2,85,188,11,192,164,73,65,193,217,241,128,106,212,219,206,211,54,190,253,72,34,44,18,105,10,138,216,238,210,251,244,102,112,250,242,199,147,222,217,109,198,47,58,78,198,135,160,245,76,2,128,59,1,99,107,28,222,116,156,95,240,125,233,229,5,82,152,218,185,93,226,132,18,236,34,161,24,219,5,222,30,29,22,178,201,169,100,23,248,72,9,118,145,217,127,103,153,93,226,221,191,159,158,58,203,115,4,248,213,155,163,183,135,6,100,62,134,33,15,22,169,72,208,89,103,87,121,137,57,44,207,65,61,189,227,124,82,239,12,36,63,11,65,50,129,30,4,90,51,88,149,56,41,12,116,131,57,71,250,66,99,166,227,0,55,132,124,120,227,67,11,59,26,80,217,247,156,167,233,21,232,121,118,223,199,38,77,246,170,223,191,71,175,211,56,205,202,99,125,109,210,100,127,39,34,156,52,129,200,227,36,3,243,86,215,96,208,95,10,53,24,10,150,11,6,156,97,202,14,15,94,31,179,68,128,126,145,102,235,245,143,47,3,144,79,89,48,26,4,69,66,160,68,246,230,152,189,28,143,19,32,50,3,142,201,224,50,131,53,64,231,185,20,108,8,44,224,11,130,5,211,196,14,95,31,28,187,223,2,195,32,18,217,140,167,95,234,97,121,175,51,37,44,234,85,119,74,72,48,133,191,169,119,229,109,171,239,253,39,153,89,198,136,133,10,5,8,79,153,106,136,93,77,209,12,201,161,98,1,234,183,34,24,5,19,92,88,235,128,56,18,3,80,136,109,144,14,142,88,139,29,255,219,41,163,116,69,150,176,64,64,70,29,157,28,63,219,222,219,67,48,36,133,110,28,28,109,176,6,62,189,255,248,106,251,201,219,246,22,35,191,204,4,120,166,203,176,0,52,164,74,108,28,191,5,59,232,105,235,237,233,179,231,237,246,134,85,112,37,164,105,129,97,140,210,168,2,235,201,251,245,192,60,121,191,177,102,47,128,106,145,149,251,249,120,116,114,180,30,66,168,228,186,125,1,251,43,247,4,44,176,220,143,154,119,108,30,115,145,158,22,41,83,214,23,107,180,123,240,200,135,208,150,219,101,145,184,32,195,29,176,123,9,186,46,218,59,193,69,196,67,214,72,4,250,208,113,81,55,183,169,45,52,210,98,14,172,6,26,93,119,10,230,124,244,5,176,3,12,67,240,44,45,50,50,204,97,38,71,130,127,58,21,44,90,204,134,2,186,155,176,44,64,3,12,253,114,84,138,125,124,197,100,131,41,114,155,12,115,134,139,112,152,174,4,38,41,176,127,212,99,21,40,3,160,163,44,78,10,156,238,244,244,88,119,164,115,37,80,239,22,97,22,204,195,96,36,49,37,51,113,54,139,163,35,36,41,134,135,254,18,244,120,35,147,28,222,0,47,22,140,218,127,121,252,198,103,159,14,233,129,1,208,208,102,24,222,64,173,145,128,166,97,146,22,178,31,161,7,234,129,93,207,102,96,129,104,76,177,116,26,47,66,104,85,228,68,132,77,175,41,88,22,89,12,240,2,73,36,64,179,34,9,226,130,116,121,9,217,77,149,205,116,182,68,2,102,161,79,72,3,44,203,224,192,228,102,21,19,64,63,55,214,228,161,155,45,35,251,89,0,123,9,196,24,6,14,84,217,38,136,53,5,174,73,70,80,124,132,238,204,155,1,109,151,89,16,31,234,28,38,115,148,44,6,12,227,59,82,8,186,40,128,235,169,94,117,97,69,70,113,228,179,67,49,225,48,195,68,104,56,158,20,5,26,213,38,4,195,244,233,45,96,57,82,152,147,39,207,158,61,127,174,199,3,213,212,112,214,155,3,212,64,6,160,44,0,32,101,69,132,233,100,57,140,67,192,56,242,141,196,22,112,128,90,42,58,76,226,47,96,43,178,15,180,133,70,179,34,81,125,3,28,158,192,39,9,212,16,215,124,54,15,129,187,206,110,176,158,170,54,66,175,209,179,103,79,86,130,76,122,82,1,228,44,6,114,5,165,36,3,54,28,85,32,167,92,102,114,181,118,66,175,132,252,188,84,106,77,11,78,192,145,132,176,3,105,128,229,180,213,145,120,30,4,99,243,136,64,182,58,164,199,66,178,207,78,132,96,31,143,94,30,190,59,162,182,39,139,4,102,14,38,88,100,60,8,87,243,131,234,160,22,243,49,172,182,123,198,38,11,221,61,68,24,210,124,49,132,81,77,153,85,39,245,217,177,34,181,108,10,140,133,211,66,166,197,14,75,55,137,103,44,86,128,43,202,66,31,225,188,92,131,152,29,149,38,165,78,45,184,171,32,12,113,33,2,237,50,212,71,101,135,192,24,80,5,196,42,95,129,6,148,17,247,97,129,202,124,205,60,219,56,209,149,125,246,139,212,65,164,255,93,26,93,169,204,246,104,249,77,22,48,172,47,17,238,207,201,74,40,8,32,93,86,160,65,3,239,83,237,2,22,181,170,91,2,108,125,10,168,209,240,229,12,66,6,43,107,248,76,171,187,160,107,51,41,107,11,11,119,237,110,235,148,123,106,105,190,74,195,55,157,126,115,159,163,16,55,186,6,82,33,144,179,93,233,254,128,202,144,138,8,74,195,169,44,35,33,57,136,163,72,58,161,181,78,1,226,57,229,56,127,247,76,139,207,216,41,190,4,209,40,92,140,161,252,219,95,78,137,212,135,1,44,92,200,189,115,61,251,235,13,145,132,253,192,104,137,196,51,42,182,96,174,69,50,153,47,135,182,237,63,97,63,189,254,31,70,109,128,188,29,139,16,56,43,250,238,37,133,202,177,4,19,118,19,47,136,56,241,97,3,150,102,20,163,152,192,21,199,35,163,211,62,208,0,203,240,134,129,242,109,59,158,124,79,59,183,17,150,236,56,244,227,120,82,195,133,169,182,21,94,24,215,10,61,38,153,108,63,1,65,120,37,146,65,8,82,55,180,7,73,45,178,99,204,100,111,101,166,34,35,74,162,242,132,226,72,193,122,47,168,239,222,188,7,210,64,13,243,237,135,95,64,223,140,175,28,239,245,155,159,94,131,198,4,236,218,241,222,189,252,15,200,231,215,247,192,43,249,253,0,209,25,213,129,252,86,202,131,3,157,47,161,254,101,26,140,166,76,85,74,75,226,220,80,31,16,36,114,8,133,205,123,198,67,163,160,241,188,123,115,136,79,227,194,120,238,30,133,134,164,10,255,9,106,202,7,38,123,21,248,100,37,219,128,227,64,12,240,176,18,62,17,49,77,4,206,150,169,8,130,93,140,83,96,241,84,63,245,87,13,18,180,166,12,170,195,40,103,82,103,21,157,7,237,229,239,31,187,154,188,26,53,94,77,91,73,141,127,19,141,18,193,105,36,153,90,247,248,142,202,60,12,149,207,226,5,176,24,165,224,227,224,224,77,118,65,99,7,140,40,17,136,130,158,148,56,91,203,202,139,26,221,13,237,216,157,213,108,162,160,126,73,81,55,9,23,233,84,50,139,75,30,150,45,108,144,66,152,207,242,124,101,9,128,86,63,91,204,10,90,110,8,224,80,212,6,138,222,236,10,55,250,168,50,73,97,37,245,32,133,167,211,250,209,0,171,1,171,12,153,97,48,163,61,195,76,0,219,1,229,59,133,97,150,90,88,83,93,182,68,122,130,127,194,96,22,84,156,94,170,105,44,192,84,129,175,26,164,173,229,96,33,180,196,84,155,141,177,165,82,239,182,219,171,173,197,2,3,47,152,83,131,108,154,196,89,22,10,124,16,96,244,132,227,149,230,35,211,101,153,85,214,200,44,12,200,74,217,20,120,246,188,96,115,146,106,165,107,130,78,105,52,53,82,183,72,121,14,201,141,130,68,170,71,13,244,139,90,24,143,36,97,83,80,7,107,128,34,96,227,200,149,242,112,196,209,12,47,117,138,54,171,213,45,195,64,36,232,251,93,76,192,20,219,165,86,96,169,232,209,45,230,80,210,54,87,182,219,237,217,186,214,239,10,236,194,96,113,15,255,50,200,110,214,192,111,161,244,87,99,24,153,12,80,20,13,46,45,160,167,138,23,224,117,184,38,40,78,107,194,97,193,39,69,178,106,123,108,198,175,137,80,37,178,182,218,109,72,107,235,117,149,174,38,186,187,240,50,147,196,191,26,21,166,64,205,232,39,60,209,35,192,213,63,130,217,28,11,201,249,36,143,55,43,74,54,38,114,93,191,48,182,157,117,97,151,6,145,226,104,24,51,82,224,205,63,145,198,44,151,164,206,53,94,92,80,228,64,109,35,249,36,243,44,199,130,82,211,198,168,224,90,172,66,47,118,156,151,143,71,39,167,104,124,204,65,174,8,233,250,200,25,128,134,190,14,188,250,165,47,34,156,179,1,215,78,134,1,170,96,3,185,197,68,8,200,71,117,68,69,153,41,74,218,26,179,138,202,33,190,2,136,62,254,244,227,47,191,72,23,17,107,72,45,13,146,54,15,14,78,209,166,126,245,233,180,253,236,185,235,49,217,121,106,53,105,90,51,235,30,59,65,57,198,40,238,2,39,137,79,38,128,67,99,193,160,190,43,102,192,182,65,49,6,170,71,28,165,248,72,97,52,210,241,74,166,222,21,48,9,22,0,127,33,100,163,250,8,202,253,151,123,181,22,39,75,22,194,209,163,119,60,103,194,195,20,19,14,149,235,97,181,236,22,99,137,77,114,46,3,127,154,4,23,101,7,34,161,112,188,64,90,99,88,140,233,98,18,151,166,8,13,195,242,249,144,104,103,47,71,35,228,147,199,24,98,167,202,241,32,35,225,31,171,150,16,37,180,223,163,198,169,129,178,232,1,189,65,245,48,79,192,6,168,236,251,88,0,17,196,178,144,234,49,162,45,178,123,128,159,242,180,90,75,59,129,168,205,8,38,223,154,156,117,129,142,137,10,74,100,91,4,195,42,178,22,138,211,5,225,24,109,227,27,150,44,40,158,235,107,193,146,172,166,22,38,227,203,76,215,129,7,117,80,156,93,114,119,162,47,3,95,76,253,111,1,10,200,114,17,21,64,123,133,234,14,27,73,69,177,2,221,251,178,139,24,224,67,136,73,96,146,166,36,225,214,220,21,229,16,45,84,11,109,21,214,74,240,157,123,63,125,252,240,233,120,112,114,250,242,244,104,240,111,71,255,121,210,59,115,20,83,115,164,213,11,15,67,179,219,9,47,202,6,115,166,11,42,99,22,61,188,80,236,20,252,74,76,56,95,68,120,25,152,244,1,242,11,108,12,248,147,194,21,100,204,230,11,144,11,3,93,83,16,151,129,7,227,19,131,103,237,7,203,147,165,45,235,196,83,85,241,220,3,116,12,222,125,56,60,66,248,63,76,38,144,121,18,130,136,146,33,51,240,246,10,100,106,254,70,121,96,186,207,117,142,126,14,41,4,23,158,62,68,208,232,167,195,227,193,241,199,15,167,31,14,62,188,29,252,124,244,241,228,205,135,247,208,193,174,183,119,238,29,30,189,122,249,233,237,233,32,47,99,138,244,118,61,19,107,226,81,148,25,96,190,247,96,203,11,99,142,148,116,162,204,22,72,194,40,12,199,121,208,11,227,17,33,209,215,91,140,114,143,251,74,12,79,98,156,211,94,36,174,216,47,250,173,225,92,97,128,138,179,89,169,182,233,116,158,109,57,110,215,84,244,227,72,153,95,189,124,11,221,189,133,110,53,96,178,39,220,229,7,113,199,187,63,52,156,114,136,185,227,250,115,148,224,184,155,190,15,79,125,103,51,219,116,246,91,244,232,46,151,75,106,32,126,45,174,11,125,200,208,5,167,125,237,108,10,63,139,79,136,0,27,91,123,46,188,124,154,3,71,56,0,69,161,225,46,61,12,137,187,20,159,146,176,87,19,132,224,60,148,115,254,102,204,164,116,232,72,220,2,245,186,50,46,193,203,168,24,81,9,148,242,101,115,140,98,1,160,12,142,170,225,144,210,228,184,30,239,93,136,236,96,145,96,196,192,59,32,194,134,43,167,160,215,19,46,234,50,87,206,187,5,208,131,64,75,72,243,128,55,135,14,22,50,157,168,99,28,166,109,208,6,224,57,157,135,1,204,140,7,143,218,239,211,224,238,111,191,53,178,94,219,245,28,12,174,2,116,3,216,189,30,146,47,46,230,106,143,210,235,135,29,42,236,181,212,94,102,10,179,13,179,11,127,57,253,205,150,94,113,32,54,238,100,93,134,0,19,83,11,3,133,148,50,58,150,158,84,114,72,117,234,13,124,173,143,54,236,121,196,195,32,63,248,24,248,212,184,93,36,97,199,76,23,160,126,38,178,105,60,6,165,241,211,169,227,97,211,157,127,61,249,240,222,151,204,38,152,220,64,125,79,157,122,56,37,54,196,231,106,103,41,142,90,159,83,228,26,138,215,119,236,46,129,119,141,67,65,166,233,39,2,16,18,151,75,119,9,21,101,12,14,15,69,146,193,195,114,233,109,137,29,215,67,30,125,32,207,192,172,26,134,26,130,211,74,111,64,189,6,141,246,214,0,255,225,228,91,161,7,152,36,0,106,154,78,200,71,249,49,190,234,217,1,43,30,151,244,28,244,156,253,44,233,3,53,109,226,211,184,239,120,240,180,177,79,164,170,14,73,105,106,79,207,206,29,54,2,222,158,246,28,251,172,141,35,245,255,158,179,1,244,176,225,180,250,27,30,181,214,210,205,173,106,24,247,72,214,104,52,187,183,209,113,112,169,219,192,51,28,50,218,134,33,250,84,132,34,164,43,133,174,191,209,133,110,26,56,246,168,215,238,70,251,181,28,85,5,229,116,163,205,77,137,167,184,87,91,238,44,58,247,210,30,239,245,226,223,126,139,123,189,59,56,240,163,71,15,234,123,178,86,102,151,6,67,103,98,172,225,176,194,177,148,141,205,70,250,194,97,106,241,116,28,199,5,236,72,228,104,228,226,90,238,73,103,172,163,207,185,161,51,3,134,143,200,70,37,27,165,28,70,191,246,156,24,36,147,196,148,193,119,12,45,50,217,207,104,42,128,101,143,101,63,78,159,57,155,177,154,6,130,178,239,168,104,48,38,19,97,30,250,245,51,36,209,95,30,213,24,53,119,212,97,102,241,165,104,234,163,77,202,171,110,6,165,107,153,176,104,150,7,72,203,170,24,198,24,24,10,145,125,105,24,44,112,90,72,233,75,146,121,70,224,21,99,189,84,112,164,252,105,226,14,50,178,81,122,147,71,97,128,193,212,10,199,71,143,126,240,129,251,225,98,197,245,172,90,183,131,196,72,194,85,196,109,219,251,48,252,140,93,126,17,55,41,20,194,179,106,71,28,56,138,169,104,197,150,109,60,212,13,75,81,114,38,39,87,174,144,243,13,12,40,179,251,227,254,36,8,129,133,55,54,206,10,11,20,74,250,35,84,43,64,210,153,248,179,126,251,209,163,134,34,26,140,99,244,121,150,37,13,135,212,26,16,25,146,18,134,241,117,53,243,197,203,36,225,55,126,144,210,111,67,96,88,221,11,252,91,29,11,34,1,249,166,219,9,100,185,142,12,122,163,103,140,197,3,137,175,181,172,20,224,201,227,99,233,196,140,220,104,77,27,197,114,181,221,228,53,249,120,44,235,53,110,49,236,174,67,90,1,178,81,194,73,71,96,176,93,174,28,249,137,152,160,3,203,116,133,125,85,173,104,173,161,192,156,200,170,106,42,106,236,109,192,118,55,43,210,144,67,14,205,218,118,151,64,36,194,175,179,24,87,117,89,107,93,222,209,105,109,219,117,221,74,203,108,189,110,149,129,184,118,183,170,237,82,183,198,38,187,183,211,220,122,91,167,203,188,221,82,135,210,58,185,183,55,101,183,173,211,149,106,113,169,151,44,232,103,5,174,214,148,8,79,129,173,224,249,157,134,12,79,85,101,212,108,0,229,87,146,106,137,28,214,225,156,116,224,178,168,111,40,34,63,107,159,3,253,158,109,157,195,159,109,185,194,170,10,63,42,12,41,191,20,42,156,237,64,118,88,175,248,162,149,182,24,207,53,171,134,97,128,170,11,54,3,228,73,229,214,19,24,68,139,60,249,0,153,118,195,161,83,174,142,12,103,37,30,102,115,46,91,179,56,223,192,186,51,62,183,134,152,107,41,63,128,120,148,186,117,87,75,156,244,61,127,223,8,220,23,160,205,2,27,165,2,176,214,139,221,122,17,216,235,192,109,150,200,27,75,157,107,237,227,143,238,56,194,142,11,38,192,89,69,40,215,194,144,89,106,115,86,86,147,201,72,120,0,69,180,54,19,247,206,80,23,105,119,211,125,205,211,187,41,168,47,241,89,122,222,59,227,240,215,11,240,79,4,127,206,187,185,234,105,68,149,81,62,105,30,239,81,145,235,84,211,219,18,205,118,98,10,101,150,212,117,168,167,218,38,44,28,66,137,32,53,181,13,8,27,182,177,229,184,64,206,249,249,29,95,121,230,188,170,129,199,40,60,124,1,172,253,143,25,103,46,123,164,248,128,33,202,195,68,122,144,246,24,109,209,130,235,66,9,35,29,41,94,152,213,187,4,81,17,139,104,164,106,196,28,33,201,21,36,191,120,97,97,174,25,140,155,164,173,57,117,116,90,83,206,62,247,174,249,148,112,221,78,125,147,117,171,93,27,113,104,5,170,1,84,249,73,217,234,37,163,121,67,155,135,103,69,157,148,244,22,198,55,20,56,46,114,28,9,129,167,109,74,7,181,154,56,21,41,152,188,230,132,57,224,84,214,200,104,168,120,158,79,228,198,114,97,193,161,2,104,207,201,106,27,90,184,47,116,209,116,10,220,22,81,35,95,11,200,48,6,238,52,192,241,33,159,157,227,5,39,63,203,117,95,152,49,237,240,152,145,57,217,106,252,58,222,116,127,245,237,159,70,179,225,63,118,221,23,45,205,136,110,103,252,115,156,116,50,100,239,179,32,162,199,237,115,232,2,90,128,199,157,115,47,129,201,194,158,224,109,23,51,128,223,117,206,168,60,149,164,50,152,117,14,4,12,92,13,119,188,171,176,229,135,27,108,224,81,129,10,138,41,153,225,144,220,167,190,250,129,252,93,122,210,120,62,64,21,242,85,156,72,251,185,134,34,144,103,2,21,208,15,47,241,9,76,124,208,67,61,27,166,123,36,233,166,169,56,168,33,82,95,37,108,58,172,129,46,30,104,54,224,81,182,233,184,138,35,63,232,101,178,133,16,33,48,13,48,31,105,29,143,28,66,83,162,32,102,53,108,217,89,145,58,168,236,185,151,31,249,144,201,115,160,59,144,118,220,16,8,38,224,97,158,156,70,212,122,90,106,136,96,76,10,52,50,65,42,160,41,159,103,174,48,120,213,82,122,173,74,114,148,194,182,203,123,197,73,109,100,126,198,47,6,40,124,60,131,42,247,133,3,101,152,238,141,95,130,102,134,219,25,15,192,230,251,79,25,97,163,130,59,102,96,234,144,187,57,202,116,113,95,174,62,13,68,186,152,205,192,68,213,160,114,9,72,208,203,124,88,15,24,76,160,236,17,219,182,81,36,147,249,8,22,76,195,88,92,127,64,29,77,77,157,251,160,215,220,66,97,103,153,41,216,229,36,72,102,87,60,17,77,188,70,198,81,104,118,240,58,25,176,245,80,78,12,147,248,10,84,174,1,50,1,20,49,131,69,18,34,163,14,74,164,13,252,63,141,67,208,224,226,11,229,91,49,175,160,198,117,107,168,205,187,103,134,44,139,85,31,252,102,245,166,43,49,120,101,187,186,119,97,242,238,73,151,236,197,51,162,142,15,99,148,108,183,21,55,22,12,23,8,217,227,40,60,80,3,95,36,130,52,20,93,211,156,94,157,7,250,28,40,30,48,196,195,38,105,43,13,198,241,180,37,210,57,134,207,15,102,1,133,138,14,160,12,228,135,20,90,210,146,224,213,245,140,62,187,158,168,244,172,57,131,229,86,43,251,132,5,97,151,214,125,65,123,83,56,71,91,86,206,189,118,85,120,206,135,247,232,59,149,245,220,252,172,236,41,121,130,26,160,116,194,107,140,184,45,103,161,173,71,222,123,205,143,205,89,71,149,238,39,186,132,127,97,158,134,232,194,53,103,1,239,46,217,45,143,34,223,171,192,145,200,211,167,232,134,200,126,38,141,192,219,106,183,31,115,63,117,149,64,61,70,150,46,174,14,176,57,60,212,252,56,243,167,84,6,236,18,245,27,42,35,39,223,225,208,170,44,230,23,50,154,214,249,50,223,28,47,115,91,141,66,186,62,104,182,162,116,121,72,214,30,236,138,49,5,10,194,124,15,71,66,24,245,236,180,199,120,179,72,171,4,73,126,200,173,210,175,220,4,170,239,49,194,149,95,197,96,197,35,154,145,111,28,250,133,41,133,71,222,219,109,75,181,161,114,125,8,42,27,32,227,173,75,98,168,197,142,51,5,106,33,191,184,71,91,18,255,240,200,61,254,15,151,252,178,120,156,255,68,239,190,212,26,88,180,207,1,2,196,222,163,65,227,170,106,88,21,47,9,40,232,118,197,27,6,36,239,72,231,60,162,70,36,67,57,161,195,3,26,22,135,96,131,148,175,5,174,125,47,112,10,89,117,192,73,184,107,129,139,231,22,108,196,250,10,247,15,25,73,135,91,14,17,82,155,56,84,10,223,43,244,163,172,112,117,175,114,20,7,99,173,98,174,242,25,131,17,199,125,29,209,247,34,119,134,169,152,87,189,55,194,108,103,94,86,227,204,227,218,155,156,157,241,243,117,220,189,32,29,108,167,238,198,102,132,80,90,0,107,23,32,189,212,184,118,141,6,205,177,64,171,207,208,191,107,249,111,93,47,119,221,58,40,239,138,14,209,194,45,97,142,246,27,214,232,204,115,88,87,141,10,47,126,208,214,71,89,5,82,114,86,171,243,226,249,200,255,104,234,134,0,106,88,184,208,20,222,53,1,156,53,107,53,182,30,235,76,186,183,3,157,114,129,60,41,77,43,143,24,33,40,27,53,44,50,112,237,237,164,198,45,172,99,146,59,93,189,168,237,11,142,208,32,136,241,196,9,144,81,97,202,4,18,122,230,227,193,27,130,3,40,106,169,202,46,230,141,162,120,69,127,138,204,2,33,188,50,15,151,74,177,139,71,143,202,29,16,227,145,188,204,49,76,77,166,38,252,170,41,199,133,83,66,241,47,85,141,245,118,9,248,182,253,182,26,137,5,231,173,78,12,96,105,118,244,188,229,202,170,244,124,136,179,98,93,138,201,119,207,65,151,176,177,43,52,208,230,234,183,172,150,100,10,51,162,202,118,138,106,180,74,117,232,40,180,68,4,109,145,173,106,210,218,108,91,187,73,205,206,202,173,161,253,76,228,12,58,159,10,245,67,235,91,177,163,23,54,15,7,203,175,192,54,27,186,233,2,183,106,146,89,90,11,118,161,173,90,62,167,109,71,204,196,251,70,212,65,116,106,10,100,204,67,188,7,78,185,22,17,55,222,61,195,184,211,35,185,202,155,232,56,120,140,94,143,77,25,232,235,34,14,13,245,0,237,4,251,100,60,44,225,122,91,217,148,203,5,134,201,170,248,20,252,33,30,167,167,242,119,160,200,175,223,94,242,106,152,152,241,31,100,137,241,108,96,203,102,203,144,247,218,93,190,255,188,203,55,55,93,227,78,200,125,13,26,131,192,213,131,254,62,87,215,91,62,84,98,133,10,23,248,113,31,127,128,249,114,176,1,160,134,67,110,141,186,33,20,250,1,228,51,238,212,249,189,10,43,11,235,148,214,64,14,129,35,119,91,42,179,133,44,202,43,105,86,228,92,57,247,236,36,229,123,131,84,227,158,219,168,114,34,179,83,175,119,198,236,125,250,123,55,215,245,222,58,228,47,237,45,154,66,4,134,217,158,131,12,88,249,9,198,116,118,128,91,167,113,146,145,42,208,81,190,53,15,120,107,124,117,52,155,103,55,146,122,176,20,144,34,222,1,119,171,194,56,234,111,116,216,216,71,245,196,152,116,165,251,131,28,123,158,251,119,111,86,194,218,214,246,158,156,115,108,24,76,191,58,177,99,59,51,107,103,169,102,245,169,10,69,95,164,148,42,21,10,175,92,117,228,184,171,9,130,124,231,182,242,84,169,220,151,26,196,70,238,37,215,107,193,33,244,245,41,226,70,92,83,148,142,76,128,102,117,25,14,207,160,161,199,145,156,154,151,227,113,237,92,100,210,173,219,85,191,210,253,244,6,184,9,183,29,167,114,17,40,55,43,135,218,94,97,51,240,13,128,219,80,45,212,56,85,37,9,189,34,71,69,167,118,54,148,139,238,191,26,237,235,51,222,156,188,108,190,106,55,159,159,223,110,121,79,150,191,157,169,199,221,165,251,67,203,125,209,48,16,66,87,237,125,116,245,136,253,222,222,238,238,206,238,139,70,193,125,219,120,176,229,162,182,212,41,37,203,72,156,33,134,179,210,89,8,220,46,215,17,177,237,235,54,222,0,137,129,174,237,235,87,240,143,131,211,229,126,143,54,138,11,206,60,21,28,240,93,173,84,47,140,250,26,241,75,80,72,47,155,25,31,166,82,75,165,99,17,167,248,74,74,180,102,230,93,117,59,73,253,22,49,169,197,102,37,73,157,215,90,102,27,72,74,252,162,162,174,67,175,200,81,133,175,131,24,109,214,138,157,43,109,183,196,157,43,123,90,53,173,126,58,60,54,77,233,48,131,69,88,19,126,130,141,169,45,133,194,136,25,70,29,222,59,232,82,67,176,76,240,176,59,136,219,162,222,175,70,47,219,119,242,139,83,106,131,7,192,212,70,191,223,16,93,34,80,79,175,165,66,103,249,5,185,24,31,195,113,120,100,15,120,60,183,80,160,12,133,26,152,206,225,209,70,180,50,40,64,79,198,8,209,71,143,26,188,52,162,252,74,69,133,97,124,108,34,79,144,237,226,43,77,180,226,36,30,207,13,19,175,110,103,189,7,12,1,181,216,23,178,43,73,152,69,62,45,213,123,102,199,115,176,149,59,245,76,27,120,128,216,114,12,106,253,254,43,2,40,101,71,159,108,254,253,150,126,91,106,240,101,215,192,237,172,136,220,223,5,184,61,5,121,140,233,119,128,15,223,75,209,239,6,208,90,43,91,250,147,97,194,245,78,28,110,142,203,93,182,223,126,187,93,186,157,98,64,18,93,122,84,31,234,85,30,25,70,123,217,179,15,139,131,47,75,166,170,91,187,246,106,151,76,101,133,203,53,92,213,133,211,38,221,247,200,172,107,31,45,61,80,109,61,217,80,20,158,201,166,208,219,140,121,128,106,224,150,115,210,197,112,22,100,197,229,143,14,177,90,109,189,186,229,238,79,121,90,210,141,221,234,6,62,154,109,250,6,53,25,142,106,67,32,146,128,135,192,196,101,204,142,219,205,96,166,19,49,94,140,68,163,78,242,138,51,233,160,63,55,91,60,165,168,31,238,190,224,254,124,145,78,141,104,237,152,58,189,51,144,194,50,245,220,74,85,73,158,88,122,183,133,163,157,157,179,243,37,237,6,250,64,49,136,193,219,234,98,197,50,40,218,255,136,253,221,12,117,79,43,96,85,55,45,137,131,188,4,240,219,112,208,52,115,140,202,92,177,171,144,196,235,39,91,181,93,55,103,117,42,216,74,58,93,9,138,117,125,237,202,13,45,40,182,31,144,46,90,239,158,179,244,86,186,80,133,182,37,130,11,180,114,178,56,70,70,217,184,165,155,214,240,230,180,142,131,190,60,143,110,70,45,217,28,134,203,59,50,114,149,7,192,74,58,210,202,193,13,122,109,239,73,77,80,251,16,30,170,163,78,5,131,191,118,27,209,45,196,243,53,106,204,68,101,27,254,255,205,115,235,221,60,151,223,229,135,234,92,174,217,13,209,69,47,47,80,87,87,21,129,172,182,109,2,61,185,197,100,85,69,222,103,15,89,42,18,84,202,4,249,226,148,202,170,67,17,69,61,108,20,135,33,159,167,38,153,39,23,248,169,16,125,167,187,201,238,23,205,181,164,137,23,0,59,125,185,197,131,3,8,46,136,1,40,51,132,21,138,19,185,67,115,78,255,187,100,155,88,84,6,234,102,113,140,116,7,189,254,98,73,203,41,126,228,132,43,37,168,136,94,57,64,86,29,112,69,1,199,124,248,161,175,108,88,154,174,225,145,69,204,74,94,82,68,107,153,233,245,245,2,51,106,112,169,105,114,87,73,149,159,30,239,49,133,105,91,128,184,143,68,97,191,184,33,97,240,151,119,166,91,51,222,22,171,119,186,173,207,41,151,168,167,35,83,159,129,234,97,145,32,238,55,55,65,178,206,227,249,98,222,147,167,253,100,162,184,6,88,198,2,134,38,143,252,245,229,245,131,133,169,31,193,178,203,172,121,231,246,172,20,190,173,80,158,20,130,189,41,239,96,94,107,102,10,21,244,244,188,148,175,5,132,201,241,165,2,88,2,199,203,180,12,56,193,101,32,215,98,117,30,201,3,172,124,203,202,132,179,57,241,26,224,233,226,10,48,226,214,116,58,85,241,235,21,4,100,186,92,183,135,166,9,1,80,61,201,246,217,43,149,188,162,31,220,176,171,28,14,168,237,70,150,108,150,23,194,143,148,156,183,142,118,160,253,36,99,224,229,95,88,131,43,88,36,97,214,24,138,118,25,60,126,83,94,248,205,116,214,220,65,194,201,45,49,227,0,163,150,202,97,89,253,67,117,78,104,92,36,83,43,176,43,167,85,105,185,105,51,36,111,14,27,39,137,134,199,249,5,244,121,68,7,130,166,139,33,30,7,234,27,219,161,150,87,33,200,79,138,3,177,99,175,168,155,194,209,37,137,125,26,219,104,148,121,201,197,240,10,255,12,240,101,178,200,218,207,158,211,207,243,173,34,30,212,25,43,167,79,94,79,51,152,213,27,125,186,194,138,173,190,123,246,227,244,193,139,254,234,179,22,218,55,122,223,65,139,45,88,144,114,191,165,103,54,204,250,108,203,12,225,171,54,6,191,9,130,109,232,111,251,79,236,15,72,152,237,252,137,253,1,253,177,39,107,246,199,10,212,153,211,162,36,189,239,1,205,46,64,179,251,151,129,102,15,160,217,251,203,64,243,20,160,121,250,151,129,230,25,64,243,236,79,164,211,54,244,247,50,12,77,143,5,25,114,7,111,181,216,32,249,149,250,31,197,44,6,17,136,198,110,29,39,180,84,167,21,231,177,212,101,62,21,13,170,168,173,215,235,83,10,158,62,90,94,185,80,185,67,71,82,186,241,74,69,137,216,181,28,24,170,51,54,198,80,58,20,119,94,240,166,137,130,246,99,23,7,25,82,44,125,112,112,186,178,176,18,58,70,93,50,28,191,216,219,230,61,109,84,42,172,44,108,8,215,42,47,175,198,96,45,246,227,179,59,235,145,56,44,213,123,190,133,245,182,203,42,202,93,68,181,74,233,216,218,190,67,132,231,75,175,32,172,225,215,51,67,90,183,143,233,110,255,245,2,200,6,126,191,22,198,189,146,201,151,135,117,172,204,80,241,30,245,86,92,53,214,43,39,89,245,83,65,229,10,144,87,163,203,82,107,190,14,75,39,38,98,240,155,145,37,249,149,54,144,41,174,132,89,17,37,172,18,154,40,65,151,37,241,59,28,200,177,138,105,252,26,244,153,118,41,85,235,57,144,254,109,120,82,212,84,171,2,126,5,202,40,20,136,157,230,113,137,223,140,57,43,181,242,77,183,181,17,107,7,72,254,49,152,253,186,229,13,184,200,195,42,191,9,53,212,204,122,131,151,81,154,223,123,216,95,69,12,20,6,244,59,6,154,139,171,210,39,46,149,101,111,171,3,38,250,138,21,162,150,77,63,22,126,138,155,142,74,238,86,13,4,201,209,235,215,14,147,223,117,90,201,153,13,191,193,38,238,242,195,85,117,46,59,164,75,54,175,82,104,139,119,64,171,193,233,255,130,63,185,96,151,194,135,144,187,110,143,104,154,222,213,89,68,81,231,82,41,120,143,207,165,222,214,30,153,140,80,191,171,171,57,15,146,251,221,88,139,84,185,177,142,161,248,55,2,163,142,193,223,1,203,34,90,7,26,251,48,60,251,68,85,202,147,129,154,192,28,126,231,119,211,241,215,208,151,162,39,171,74,249,35,127,247,120,125,203,218,39,62,171,139,218,238,154,30,140,243,140,23,169,34,134,130,8,175,67,14,193,83,231,153,181,43,210,6,134,163,84,88,165,27,252,126,208,25,157,94,159,4,215,21,106,22,215,217,186,240,107,82,43,41,207,54,147,210,189,148,164,65,190,10,191,3,219,248,243,204,9,156,132,187,157,172,247,24,16,172,24,157,87,212,131,191,13,41,117,110,169,255,35,250,151,247,243,225,181,180,3,53,188,239,185,2,78,176,225,239,184,4,238,128,158,240,243,103,80,127,197,12,194,218,228,18,172,221,92,181,136,130,135,20,83,160,183,12,198,1,15,227,139,10,155,228,97,115,117,78,173,175,87,102,173,181,53,38,99,136,37,22,193,46,153,5,166,190,211,127,68,119,176,117,115,180,76,183,139,61,168,73,213,31,172,145,145,189,168,2,109,215,47,2,29,251,112,175,82,196,108,197,8,55,188,107,240,41,55,194,251,251,25,221,26,153,199,106,32,68,251,153,252,146,98,150,224,163,241,90,31,238,183,224,13,83,240,59,18,199,113,146,153,132,227,36,70,95,74,200,212,161,70,147,145,239,176,149,101,124,233,147,217,210,175,80,138,155,94,91,206,75,171,26,251,195,219,100,240,73,14,128,62,17,90,51,120,29,93,141,69,229,247,34,91,52,118,248,69,188,220,103,76,154,217,233,63,138,134,233,188,91,162,220,210,230,196,223,143,100,243,109,199,181,104,181,138,165,117,52,122,34,92,185,161,70,209,218,54,102,75,254,61,25,205,177,74,157,52,199,109,78,100,177,175,157,100,227,114,194,187,196,24,253,109,94,241,132,142,144,202,55,250,100,171,138,106,42,156,20,88,107,42,42,213,212,209,132,154,233,120,210,63,149,5,153,186,122,143,53,232,86,102,140,20,213,223,207,112,97,86,158,88,196,88,186,163,111,213,32,243,77,197,242,30,222,223,143,126,43,155,146,95,197,114,107,232,192,65,253,253,80,29,106,102,26,127,108,24,68,60,9,240,30,96,249,145,18,193,140,87,208,250,192,171,62,209,123,255,89,94,16,22,65,246,122,49,100,58,129,225,41,45,100,126,62,203,183,116,57,139,172,179,227,67,48,19,49,78,135,110,38,149,103,198,157,202,246,175,163,62,45,238,147,13,2,255,13,251,239,248,23,193,210,69,34,175,104,166,145,220,232,175,59,44,230,234,126,16,118,197,201,90,155,211,117,177,216,32,148,72,24,125,15,235,1,76,67,223,224,88,94,28,30,68,88,152,103,193,144,46,205,86,215,102,141,232,206,95,21,97,197,232,252,175,207,222,76,228,149,223,83,138,65,74,61,24,179,188,193,148,192,161,15,110,81,147,159,78,126,148,80,203,249,43,112,141,150,158,9,135,201,240,51,188,95,38,5,70,33,162,145,36,46,25,92,202,147,140,88,66,19,169,170,56,217,118,188,78,105,215,193,202,82,210,202,214,151,52,19,154,39,1,29,26,239,255,72,103,223,89,129,113,81,40,145,242,66,200,103,250,150,49,174,44,249,77,104,252,122,116,117,83,120,205,0,78,140,94,194,56,27,96,180,234,233,219,134,160,249,40,172,27,162,111,51,167,181,76,120,173,17,40,238,99,243,225,202,202,147,159,66,255,58,53,125,5,99,56,64,166,97,89,221,119,48,123,59,184,226,239,205,255,214,101,123,136,145,242,21,8,186,222,52,33,169,164,174,140,201,213,63,91,2,149,239,5,41,99,187,120,127,130,67,13,190,165,180,106,123,218,147,41,61,118,119,183,164,35,42,36,201,153,166,170,59,112,230,154,17,137,85,120,66,85,88,222,201,97,250,144,213,62,74,198,203,14,9,127,235,53,101,62,254,51,224,217,138,230,222,199,20,131,163,218,155,39,226,174,246,212,212,208,181,186,164,94,229,74,118,169,56,158,251,237,201,251,55,172,250,24,48,141,23,111,56,253,159,3,16,20,64,104,82,170,20,35,220,106,91,69,36,23,47,249,200,165,94,49,196,231,126,117,234,255,122,145,215,71,18,253,253,22,187,12,141,98,143,216,71,88,27,248,57,141,175,213,222,247,167,59,102,221,201,239,92,149,154,182,26,220,201,247,61,91,86,96,163,162,145,92,129,247,41,208,123,181,172,44,55,92,164,204,149,0,213,12,113,167,172,19,228,96,253,191,78,240,253,116,130,239,170,10,252,229,120,69,93,116,231,223,143,83,200,8,90,19,180,122,63,119,200,93,188,18,53,165,61,183,59,175,23,38,34,154,49,235,6,129,146,51,82,125,75,85,46,106,158,220,177,167,244,141,29,144,111,178,112,65,43,144,5,36,209,23,57,152,60,252,81,183,83,243,151,161,206,150,114,93,161,64,239,255,47,242,151,59,179,210,147,0,0}; \ No newline at end of file diff --git a/lib/MQTT/MqttClient.cpp b/lib/MQTT/MqttClient.cpp index 9e0d24ad..083ea405 100644 --- a/lib/MQTT/MqttClient.cpp +++ b/lib/MQTT/MqttClient.cpp @@ -6,7 +6,11 @@ #include #include #include -#include +#include + +static const char* STATUS_CONNECTED = "connected"; +static const char* STATUS_DISCONNECTED = "disconnected_clean"; +static const char* STATUS_LWT_DISCONNECTED = "disconnected_unclean"; MqttClient::MqttClient(Settings& settings, MiLightClient*& milightClient) : milightClient(milightClient), @@ -21,6 +25,8 @@ MqttClient::MqttClient(Settings& settings, MiLightClient*& milightClient) } MqttClient::~MqttClient() { + String aboutStr = generateConnectionStatusMessage(STATUS_DISCONNECTED); + mqttClient->publish(settings.mqttClientStatusTopic.c_str(), aboutStr.c_str(), true); mqttClient->disconnect(); delete this->domain; } @@ -52,15 +58,15 @@ bool MqttClient::connect() { Serial.println(F("MqttClient - connecting")); #endif - if (settings.mqttUsername.length() > 0 && settings.mqttLwtTopic.length() > 0) { + if (settings.mqttUsername.length() > 0 && settings.mqttClientStatusTopic.length() > 0) { return mqttClient->connect( nameBuffer, settings.mqttUsername.c_str(), settings.mqttPassword.c_str(), - settings.mqttLwtTopic.c_str(), + settings.mqttClientStatusTopic.c_str(), 2, true, - settings.mqttLwtMessage.c_str() + generateConnectionStatusMessage(STATUS_LWT_DISCONNECTED).c_str() ); } else if (settings.mqttUsername.length() > 0) { return mqttClient->connect( @@ -68,13 +74,13 @@ bool MqttClient::connect() { settings.mqttUsername.c_str(), settings.mqttPassword.c_str() ); - } else if (settings.mqttLwtTopic.length() > 0) { + } else if (settings.mqttClientStatusTopic.length() > 0) { return mqttClient->connect( nameBuffer, - settings.mqttLwtTopic.c_str(), + settings.mqttClientStatusTopic.c_str(), 2, true, - settings.mqttLwtMessage.c_str() + generateConnectionStatusMessage(STATUS_LWT_DISCONNECTED).c_str() ); } else { return mqttClient->connect(nameBuffer); @@ -82,9 +88,9 @@ bool MqttClient::connect() { } void MqttClient::sendBirthMessage() { - if (settings.mqttBirthTopic.length() > 0) { - String aboutStr = AboutStringHelper::generateAboutString(true); - mqttClient->publish(settings.mqttBirthTopic.c_str(), aboutStr.c_str()); + if (settings.mqttClientStatusTopic.length() > 0) { + String aboutStr = generateConnectionStatusMessage(STATUS_CONNECTED); + mqttClient->publish(settings.mqttClientStatusTopic.c_str(), aboutStr.c_str(), true); } } @@ -229,3 +235,17 @@ inline void MqttClient::bindTopicString( topicPattern.replace(":group_id", String(groupId)); topicPattern.replace(":device_type", remoteConfig.name); } + +String MqttClient::generateConnectionStatusMessage(const char* connectionStatus) { + DynamicJsonBuffer buffer; + JsonObject& status = buffer.createObject(); + status["status"] = connectionStatus; + + // Fill other fields + AboutHelper::generateAboutObject(status, true); + + String response; + status.printTo(response); + + return response; +} \ No newline at end of file diff --git a/lib/MQTT/MqttClient.h b/lib/MQTT/MqttClient.h index 455f6672..9dadf04b 100644 --- a/lib/MQTT/MqttClient.h +++ b/lib/MQTT/MqttClient.h @@ -49,6 +49,8 @@ class MqttClient { const uint16_t deviceId, const uint16_t groupId ); + + static String generateConnectionStatusMessage(const char* status); }; #endif diff --git a/lib/Settings/AboutHelper.cpp b/lib/Settings/AboutHelper.cpp new file mode 100644 index 00000000..7e2adeed --- /dev/null +++ b/lib/Settings/AboutHelper.cpp @@ -0,0 +1,29 @@ +#include +#include +#include +#include + +String AboutHelper::generateAboutString(bool abbreviated) { + DynamicJsonBuffer buffer; + JsonObject& response = buffer.createObject(); + + generateAboutObject(response, abbreviated); + + String body; + response.printTo(body); + + return body; +} + +void AboutHelper::generateAboutObject(JsonObject& obj, bool abbreviated) { + obj["firmware"] = QUOTE(FIRMWARE_NAME); + obj["version"] = QUOTE(MILIGHT_HUB_VERSION); + obj["ip_address"] = WiFi.localIP().toString(); + obj["reset_reason"] = ESP.getResetReason(); + + if (! abbreviated) { + obj["variant"] = QUOTE(FIRMWARE_VARIANT); + obj["free_heap"] = ESP.getFreeHeap(); + obj["arduino_version"] = ESP.getCoreVersion(); + } +} \ No newline at end of file diff --git a/lib/Settings/AboutStringHelper.h b/lib/Settings/AboutHelper.h similarity index 57% rename from lib/Settings/AboutStringHelper.h rename to lib/Settings/AboutHelper.h index 9cc9cb8e..1c8934fa 100644 --- a/lib/Settings/AboutStringHelper.h +++ b/lib/Settings/AboutHelper.h @@ -1,11 +1,13 @@ #include +#include #ifndef _ABOUT_STRING_HELPER_H #define _ABOUT_STRING_HELPER_H -class AboutStringHelper { +class AboutHelper { public: static String generateAboutString(bool abbreviated = false); + static void generateAboutObject(JsonObject& obj, bool abbreviated = false); }; #endif \ No newline at end of file diff --git a/lib/Settings/AboutStringHelper.cpp b/lib/Settings/AboutStringHelper.cpp deleted file mode 100644 index 851d9660..00000000 --- a/lib/Settings/AboutStringHelper.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include -#include -#include - -String AboutStringHelper::generateAboutString(bool abbreviated) { - DynamicJsonBuffer buffer; - JsonObject& response = buffer.createObject(); - - response["firmware"] = QUOTE(FIRMWARE_NAME); - response["version"] = QUOTE(MILIGHT_HUB_VERSION); - response["ip_address"] = WiFi.localIP().toString(); - response["reset_reason"] = ESP.getResetReason(); - - if (! abbreviated) { - response["variant"] = QUOTE(FIRMWARE_VARIANT); - response["free_heap"] = ESP.getFreeHeap(); - response["arduino_version"] = ESP.getCoreVersion(); - } - - String body; - response.printTo(body); - - return body; -} \ No newline at end of file diff --git a/lib/Settings/Settings.cpp b/lib/Settings/Settings.cpp index 9883a807..7d371a73 100644 --- a/lib/Settings/Settings.cpp +++ b/lib/Settings/Settings.cpp @@ -98,9 +98,7 @@ void Settings::patch(JsonObject& parsedSettings) { this->setIfPresent(parsedSettings, "mqtt_topic_pattern", mqttTopicPattern); this->setIfPresent(parsedSettings, "mqtt_update_topic_pattern", mqttUpdateTopicPattern); this->setIfPresent(parsedSettings, "mqtt_state_topic_pattern", mqttStateTopicPattern); - this->setIfPresent(parsedSettings, "mqtt_lwt_topic", mqttLwtTopic); - this->setIfPresent(parsedSettings, "mqtt_lwt_message", mqttLwtMessage); - this->setIfPresent(parsedSettings, "mqtt_birth_topic", mqttBirthTopic); + this->setIfPresent(parsedSettings, "mqtt_client_status_topic", mqttClientStatusTopic); this->setIfPresent(parsedSettings, "discovery_port", discoveryPort); this->setIfPresent(parsedSettings, "listen_repeats", listenRepeats); this->setIfPresent(parsedSettings, "state_flush_interval", stateFlushInterval); @@ -216,9 +214,7 @@ void Settings::serialize(Stream& stream, const bool prettyPrint) { root["mqtt_topic_pattern"] = this->mqttTopicPattern; root["mqtt_update_topic_pattern"] = this->mqttUpdateTopicPattern; root["mqtt_state_topic_pattern"] = this->mqttStateTopicPattern; - root["mqtt_lwt_topic"] = this->mqttLwtTopic; - root["mqtt_lwt_message"] = this->mqttLwtMessage; - root["mqtt_birth_topic"] = this->mqttBirthTopic; + root["mqtt_client_status_topic"] = this->mqttClientStatusTopic; root["discovery_port"] = this->discoveryPort; root["listen_repeats"] = this->listenRepeats; root["state_flush_interval"] = this->stateFlushInterval; diff --git a/lib/Settings/Settings.h b/lib/Settings/Settings.h index d08134e2..8d658cad 100644 --- a/lib/Settings/Settings.h +++ b/lib/Settings/Settings.h @@ -167,9 +167,7 @@ class Settings { String mqttTopicPattern; String mqttUpdateTopicPattern; String mqttStateTopicPattern; - String mqttLwtTopic; - String mqttLwtMessage; - String mqttBirthTopic; + String mqttClientStatusTopic; size_t stateFlushInterval; size_t mqttStateRateLimit; size_t packetRepeatThrottleThreshold; diff --git a/lib/WebServer/MiLightHttpServer.cpp b/lib/WebServer/MiLightHttpServer.cpp index 18f3d9d4..adf4309d 100644 --- a/lib/WebServer/MiLightHttpServer.cpp +++ b/lib/WebServer/MiLightHttpServer.cpp @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include void MiLightHttpServer::begin() { @@ -120,19 +120,7 @@ void MiLightHttpServer::onGroupDeleted(GroupDeletedHandler handler) { } void MiLightHttpServer::handleAbout() { - // DynamicJsonBuffer buffer; - // JsonObject& response = buffer.createObject(); - - // response["version"] = QUOTE(MILIGHT_HUB_VERSION); - // response["variant"] = QUOTE(FIRMWARE_VARIANT); - // response["free_heap"] = ESP.getFreeHeap(); - // response["arduino_version"] = ESP.getCoreVersion(); - // response["reset_reason"] = ESP.getResetReason(); - - // String body; - // response.printTo(body); - - server.send(200, APPLICATION_JSON, AboutStringHelper::generateAboutString()); + server.send(200, APPLICATION_JSON, AboutHelper::generateAboutString()); } void MiLightHttpServer::handleGetRadioConfigs() { diff --git a/platformio.ini b/platformio.ini index 62ae75ef..ce8c0c00 100644 --- a/platformio.ini +++ b/platformio.ini @@ -24,7 +24,7 @@ lib_deps_external = CircularBuffer@~1.2.0 extra_scripts = pre:.build_web.py -build_flags = !python .get_version.py -DMQTT_MAX_PACKET_SIZE=200 -DHTTP_UPLOAD_BUFLEN=128 -D FIRMWARE_NAME=milight-hub -Idist -Ilib/DataStructures +build_flags = !python .get_version.py -DMQTT_MAX_PACKET_SIZE=250 -DHTTP_UPLOAD_BUFLEN=128 -D FIRMWARE_NAME=milight-hub -Idist -Ilib/DataStructures # -D STATE_DEBUG # -D DEBUG_PRINTF # -D MQTT_DEBUG diff --git a/test/remote/spec/mqtt_spec.rb b/test/remote/spec/mqtt_spec.rb index 49a2f7d8..eeeb0233 100644 --- a/test/remote/spec/mqtt_spec.rb +++ b/test/remote/spec/mqtt_spec.rb @@ -50,20 +50,27 @@ end end - context 'birth and LWT' do + context 'client status topic' do # Unfortunately, no way to easily simulate an unclean disconnect, so only test birth - it 'should send birth message when configured' do - birth_topic = "#{@topic_prefix}birth" + it 'should send client status messages when configured' do + status_topic = "#{@topic_prefix}client_status" @client.put( '/settings', - mqtt_birth_topic: birth_topic + mqtt_client_status_topic: status_topic ) - seen_birth = false + # Clear any retained messages + @mqtt_client.publish(status_topic, nil) - @mqtt_client.on_message(birth_topic) do |topic, message| - seen_birth = true + seen_statuses = Set.new + required_statuses = %w(connected disconnected_clean) + + @mqtt_client.on_message(status_topic, 20) do |topic, message| + message = JSON.parse(message) + + seen_statuses << message['status'] + required_statuses.all? { |x| seen_statuses.include?(x) } end # Force MQTT reconnect by updating settings @@ -71,7 +78,7 @@ @mqtt_client.wait_for_listeners - expect(seen_birth).to be(true) + expect(seen_statuses).to include(*required_statuses) end end @@ -128,9 +135,6 @@ end it 'should respect the state update interval' do - # Wait for MQTT to reconnect - @mqtt_client.on_message("#{@topic_prefix}birth") { |x, y| true } - # Disable updates to prevent the negative effects of spamming commands @client.put( '/settings', @@ -139,8 +143,6 @@ packet_repeats: 1 ) - @mqtt_client.wait_for_listeners - # Set initial state @client.patch_state({status: 'ON', level: 0}, @id_params) diff --git a/web/src/js/script.js b/web/src/js/script.js index 96af7058..d97d5d61 100644 --- a/web/src/js/script.js +++ b/web/src/js/script.js @@ -15,7 +15,7 @@ $(function() { input.val(log); } }); - }); + }); }); var UNIT_PARAMS = { @@ -134,13 +134,13 @@ var UI_FIELDS = [ { type: "string", tab: "tab-mqtt" }, { - tag: "mqtt_topic_pattern", + tag: "mqtt_topic_pattern", friendly: "MQTT topic pattern", help: "Pattern for MQTT topics to listen on. Example: lights/:device_id/:device_type/:group_id. See README for further details", type: "string", tab: "tab-mqtt" }, { - tag: "mqtt_update_topic_pattern", + tag: "mqtt_update_topic_pattern", friendly: "MQTT update topic pattern", help: "Pattern to publish MQTT updates. Packets that are received from other devices, and packets that are sent from this device will " + "result in updates being sent", @@ -153,37 +153,25 @@ var UI_FIELDS = [ { type: "string", tab: "tab-mqtt" }, { - tag: "mqtt_username", + tag: "mqtt_username", friendly: "MQTT user name", help: "User name to log in to MQTT server", type: "string", tab: "tab-mqtt" }, { - tag: "mqtt_password", + tag: "mqtt_password", friendly: "MQTT password", help: "Password to log into MQTT server", type: "string", tab: "tab-mqtt" }, { - tag: "mqtt_lwt_topic", - friendly: "MQTT LWT Topic", - help: "Topic to use for LWT message (leave blank to disable LWT)", - type: "string", - tab: "tab-mqtt" - }, { - tag: "mqtt_lwt_message", - friendly: "MQTT LWT Message", - help: "LWT Message - sent when client disconnects uncleanly", + tag: "mqtt_client_status_topic", + friendly: "MQTT Client Status Topic", + help: "Connection status messages will be published to this topic. This includes LWT and birth. See README for further detail.", type: "string", tab: "tab-mqtt" }, { - tag: "mqtt_birth_topic", - friendly: "MQTT Birth Topic", - help: "Birth Topic - JSON blob with system details will be sent to this topic upon connection", - type: "string", - tab: "tab-mqtt" - }, { - tag: "radio_interface_type", + tag: "radio_interface_type", friendly: "Radio interface type", help: "2.4 GHz radio model. Only change this if you know you're not using an NRF24L01!", type: "option_buttons", @@ -193,7 +181,7 @@ var UI_FIELDS = [ { }, tab: "tab-radio" }, { - tag: "rf24_power_level", + tag: "rf24_power_level", friendly: "nRF24 Power Level", help: "Power level for nRF24L01", type: "option_buttons", @@ -205,7 +193,7 @@ var UI_FIELDS = [ { }, tab: "tab-radio" }, { - tag: "rf24_listen_channel", + tag: "rf24_listen_channel", friendly: "nRF24 Listen Channel", help: "Which channels to listen for messages on the nRF24", type: "option_buttons", @@ -216,7 +204,7 @@ var UI_FIELDS = [ { }, tab: "tab-radio" }, { - tag: "rf24_channels", + tag: "rf24_channels", friendly: "nRF24 Send Channels", help: "Which channels to send messages on for the nRF24. Using fewer channels speeds up sends.", type: "option_buttons", @@ -237,14 +225,14 @@ var UI_FIELDS = [ { type: "string", tab: "tab-wifi" }, { - tag: "state_flush_interval", + tag: "state_flush_interval", friendly: "State flush interval", help: "Minimum number of milliseconds between flushing state to flash. " + "Set to 0 to disable delay and immediately persist state to flash", type: "string", tab: "tab-setup" }, { - tag: "mqtt_state_rate_limit", + tag: "mqtt_state_rate_limit", friendly: "MQTT state rate limit", help: "Minimum number of milliseconds between MQTT updates of bulb state (defaults to 500)", type: "string", @@ -259,7 +247,7 @@ var UI_FIELDS = [ { type: "string", tab: "tab-radio" }, { - tag: "packet_repeat_throttle_sensitivity", + tag: "packet_repeat_throttle_sensitivity", friendly: "Packet repeat throttle sensitivity", help: "Controls how packet repeats are throttled. " + "Higher values cause packets to be throttled up and down faster " + @@ -267,7 +255,7 @@ var UI_FIELDS = [ { type: "string", tab: "tab-radio" }, { - tag: "packet_repeat_minimum", + tag: "packet_repeat_minimum", friendly: "Packet repeat minimum", help: "Controls how far throttling can decrease the number " + "of repeated packets (defaults to 3)", @@ -280,7 +268,7 @@ var UI_FIELDS = [ { type: "group_state_fields", tab: "tab-mqtt" }, { - tag: "enable_automatic_mode_switching", + tag: "enable_automatic_mode_switching", friendly: "Enable automatic mode switching", help: "For RGBWW bulbs (using RGB+CCT or FUT089), enables automatic switching between modes in order to affect changes to " + "temperature and saturation when otherwise it would not work", @@ -319,7 +307,7 @@ var UI_FIELDS = [ { friendly: "Flash count on packets", help: "Number of times the LED will flash when packets are changing", type: "string", - tab: "tab-led" + tab: "tab-led" } ]; @@ -928,7 +916,7 @@ $(function() { allowEmptyOption: true, render: { option: function(data, escape) { - // Mousedown selects an option -- prevent event from bubbling up to select option + // Mousedown selects an option -- prevent event from bubbling up to select option // when delete button is clicked. var deleteBtn = $('') .mousedown(function(e) { @@ -1028,7 +1016,7 @@ $(function() { }); settings += ""; }); - + // UDP gateways tab settings += '
'; settings += $('#gateway-servers-modal .modal-body').remove().html(); @@ -1060,7 +1048,7 @@ $(function() { } return a; - }, + }, { // Make sure the value is always an array, even if a single item is selected rf24_channels: [] @@ -1081,7 +1069,7 @@ $(function() { } $('#settings-modal').modal('hide'); - + return false; }); @@ -1126,5 +1114,5 @@ $(function() { input.val(log); } }); - }); + }); }); \ No newline at end of file