From de10e340b660a2f936cc55a52042411ca0c23e9f Mon Sep 17 00:00:00 2001 From: cpq Date: Sat, 13 Aug 2022 14:52:10 +0100 Subject: [PATCH] Update examples to use mg_http_reply --- examples/device-dashboard/net.c | 46 +- examples/device-dashboard/packed_fs.c | 1536 ++++++++++---------- examples/device-dashboard/web_root/main.js | 6 +- examples/webui-login/main.c | 2 +- examples/webui-plain/main.c | 2 +- 5 files changed, 795 insertions(+), 797 deletions(-) diff --git a/examples/device-dashboard/net.c b/examples/device-dashboard/net.c index 9f07d8d9..ec6068b0 100644 --- a/examples/device-dashboard/net.c +++ b/examples/device-dashboard/net.c @@ -63,22 +63,23 @@ static struct user *getuser(struct mg_http_message *hm) { } // Notify all config watchers about the config change -static void send_notification(struct mg_mgr *mgr, const char *name, - const char *data) { +static void send_notification(struct mg_mgr *mgr, const char *fmt, ...) { struct mg_connection *c; for (c = mgr->conns; c != NULL; c = c->next) { - if (c->label[0] != 'W') continue; - mg_ws_printf(c, WEBSOCKET_OP_TEXT, "{%Q:%Q,%Q:%s}", "name", name, "data", - data); + if (c->label[0] == 'W') { + va_list ap; + va_start(ap, fmt); + mg_ws_vprintf(c, WEBSOCKET_OP_TEXT, fmt, &ap); + va_end(ap); + } } } // Send simulated metrics data to the dashboard, for chart rendering static void timer_metrics_fn(void *param) { - char buf[50]; - mg_snprintf(buf, sizeof(buf), "[%lu, %d]", (unsigned long) time(NULL), - 10 + (int) ((double) rand() * 10 / RAND_MAX)); - send_notification(param, "metrics", buf); + send_notification(param, "{%Q:%Q,%Q:[%lu, %d]}", "name", "metrics", "data", + (unsigned long) time(NULL), + 10 + (int) ((double) rand() * 10 / RAND_MAX)); } // MQTT event handler function @@ -87,15 +88,13 @@ static void mqtt_fn(struct mg_connection *c, int ev, void *ev_data, void *fnd) { s_connected = true; c->is_hexdumping = 1; mg_mqtt_sub(s_mqtt, mg_str(s_config.sub), 2); - send_notification(c->mgr, "config", "null"); + send_notification(c->mgr, "{%Q:%Q,%Q:null}", "name", "config", "data"); } else if (ev == MG_EV_MQTT_MSG) { struct mg_mqtt_message *mm = ev_data; - char buf[100], *p = buf; - mg_asprintf(&p, sizeof(buf), "{%Q: %.*Q, %Q: %.*Q, %Q: %d}", "topic", - (int) mm->topic.len, mm->topic.ptr, "data", (int) mm->data.len, - mm->data.ptr, "qos", (int) mm->qos); - send_notification(c->mgr, "message", p); - if (p != buf) free(p); + send_notification(c->mgr, "{%Q:%Q,%Q:{%Q: %.*Q, %Q: %.*Q, %Q: %d}}", "name", + "message", "data", "topic", (int) mm->topic.len, + mm->topic.ptr, "data", (int) mm->data.len, mm->data.ptr, + "qos", (int) mm->qos); } else if (ev == MG_EV_MQTT_CMD) { struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data; MG_DEBUG(("cmd %d qos %d", mm->cmd, mm->qos)); @@ -103,7 +102,7 @@ static void mqtt_fn(struct mg_connection *c, int ev, void *ev_data, void *fnd) { s_mqtt = NULL; if (s_connected) { s_connected = false; - send_notification(c->mgr, "config", "null"); + send_notification(c->mgr, "{%Q:%Q,%Q:null}", "name", "config", "data"); } } (void) fnd; @@ -113,7 +112,7 @@ static void mqtt_fn(struct mg_connection *c, int ev, void *ev_data, void *fnd) { static void timer_mqtt_fn(void *param) { struct mg_mgr *mgr = (struct mg_mgr *) param; if (s_mqtt == NULL) { - struct mg_mqtt_opts opts = { 0 }; + struct mg_mqtt_opts opts = {0}; s_mqtt = mg_mqtt_connect(mgr, s_config.url, &opts, mqtt_fn, NULL); } } @@ -136,7 +135,7 @@ void device_dashboard_fn(struct mg_connection *c, int ev, void *ev_data, mg_http_reply(c, 200, "", "hi\n"); // Testing endpoint } else if (u == NULL && mg_http_match_uri(hm, "/api/#")) { // All URIs starting with /api/ must be authenticated - mg_printf(c, "%s", "HTTP/1.1 403 Denied\r\nContent-Length: 0\r\n\r\n"); + mg_http_reply(c, 403, "", "Denied\n"); } else if (mg_http_match_uri(hm, "/api/config/get")) { mg_http_reply(c, 200, NULL, "{%Q:%Q,%Q:%Q,%Q:%Q,%Q:%s}\n", "url", s_config.url, "pub", s_config.pub, "sub", s_config.sub, @@ -148,10 +147,10 @@ void device_dashboard_fn(struct mg_connection *c, int ev, void *ev_data, update_config(&hm->body, "pub", &s_config.pub); update_config(&hm->body, "sub", &s_config.sub); if (s_mqtt) s_mqtt->is_closing = 1; // Ask to disconnect from MQTT - send_notification(fn_data, "config", "null"); - mg_printf(c, "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"); + send_notification(fn_data, "{%Q:%Q,%Q:null}", "name", "config", "data"); + mg_http_reply(c, 200, "", "ok\n"); } else { - mg_printf(c, "%s", "HTTP/1.1 403 Denied\r\nContent-Length: 0\r\n\r\n"); + mg_http_reply(c, 403, "", "Denied\n"); } } else if (mg_http_match_uri(hm, "/api/message/send")) { char buf[256]; @@ -159,11 +158,10 @@ void device_dashboard_fn(struct mg_connection *c, int ev, void *ev_data, mg_http_get_var(&hm->body, "message", buf, sizeof(buf)) > 0) { mg_mqtt_pub(s_mqtt, mg_str(s_config.pub), mg_str(buf), 1, false); } - mg_printf(c, "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"); + mg_http_reply(c, 200, "", "ok\n"); } else if (mg_http_match_uri(hm, "/api/watch")) { c->label[0] = 'W'; // Mark ourselves as a event listener mg_ws_upgrade(c, hm, NULL); - // mg_printf(c, "HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n"); } else if (mg_http_match_uri(hm, "/api/login")) { mg_http_reply(c, 200, NULL, "{%Q:%Q,%Q:%Q}\n", "user", u->name, "token", u->token); diff --git a/examples/device-dashboard/packed_fs.c b/examples/device-dashboard/packed_fs.c index 2590f3d0..8ba8c6a7 100644 --- a/examples/device-dashboard/packed_fs.c +++ b/examples/device-dashboard/packed_fs.c @@ -408,46 +408,78 @@ static const unsigned char v2[] = { 100, 97, 116, 101, 115, 117, 98, 32, 61, 32, 101, 118, // datesub = ev 32, 61, 62, 32, 117, 112, 100, 97, 116, 101, 40, 39, // => update(' 115, 117, 98, 39, 44, 32, 115, 117, 98, 41, 59, 10, // sub', sub);. - 10, 32, 32, 99, 111, 110, 115, 111, 108, 101, 46, 108, // . console.l - 111, 103, 40, 112, 114, 111, 112, 115, 44, 32, 91, 117, // og(props, [u - 114, 108, 44, 32, 112, 117, 98, 44, 32, 115, 117, 98, // rl, pub, sub - 93, 41, 59, 10, 32, 32, 114, 101, 116, 117, 114, 110, // ]);. return - 32, 104, 116, 109, 108, 96, 10, 60, 100, 105, 118, 32, // html`.
.

. - 32, 32, 68, 101, 118, 105, 99, 101, 32, 67, 111, 110, // Device Con - 102, 105, 103, 117, 114, 97, 116, 105, 111, 110, 60, 47, // figuration.
. . + 10, 32, 32, 32, 32, 68, 101, 118, 105, 99, 101, 32, // . Device + 67, 111, 110, 102, 105, 103, 117, 114, 97, 116, 105, 111, // Configuratio + 110, 60, 47, 104, 51, 62, 10, 32, 32, 60, 100, 105, // n

. . < + 115, 112, 97, 110, 32, 99, 108, 97, 115, 115, 61, 34, // span class=" + 97, 100, 100, 111, 110, 32, 110, 111, 119, 114, 97, 112, // addon nowrap + 34, 62, 77, 81, 84, 84, 32, 115, 101, 114, 118, 101, // ">MQTT serve + 114, 58, 60, 47, 115, 112, 97, 110, 62, 10, 32, 32, // r:. + 32, 32, 60, 105, 110, 112, 117, 116, 32, 116, 121, 112, // setUrl + 40, 101, 118, 46, 116, 97, 114, 103, 101, 116, 46, 118, // (ev.target.v + 97, 108, 117, 101, 41, 125, 32, 47, 62, 10, 32, 32, // alue)} />. + 32, 32, 60, 98, 117, 116, 116, 111, 110, 32, 99, 108, // + 10, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, // .
. + 60, 100, 105, 118, 62, 10, 32, 32, 32, 32, 89, 111, //
. Yo + 117, 32, 99, 97, 110, 32, 117, 115, 101, 32, 60, 97, // u can use . H + 105, 118, 101, 77, 81, 32, 87, 101, 98, 115, 111, 99, // iveMQ Websoc + 107, 101, 116, 32, 119, 101, 98, 32, 99, 108, 105, 101, // ket web clie + 110, 116, 60, 47, 97, 62, 32, 116, 111, 32, 115, 101, // nt to se + 110, 100, 32, 109, 101, 115, 115, 97, 103, 101, 115, 32, // nd messages + 116, 111, 32, 116, 104, 105, 115, 32, 99, 111, 110, 115, // to this cons + 111, 108, 101, 46, 10, 32, 32, 60, 47, 100, 105, 118, // ole..
.
. + 32, 32, 84, 104, 101, 32, 100, 101, 118, 105, 99, 101, // The device + 32, 107, 101, 101, 112, 115, 32, 97, 32, 112, 101, 114, // keeps a per + 115, 105, 115, 116, 101, 110, 116, 32, 99, 111, 110, 110, // sistent conn + 101, 99, 116, 105, 111, 110, 32, 116, 111, 32, 116, 104, // ection to th + 101, 32, 99, 111, 110, 102, 105, 103, 117, 114, 101, 100, // e configured + 32, 77, 81, 84, 84, 32, 115, 101, 114, 118, 101, 114, // MQTT server + 46, 10, 32, 32, 32, 32, 67, 104, 97, 110, 103, 101, // .. Change + 115, 32, 116, 111, 32, 116, 104, 105, 115, 32, 99, 111, // s to this co + 110, 102, 105, 103, 117, 114, 97, 116, 105, 111, 110, 32, // nfiguration + 97, 114, 101, 32, 112, 114, 111, 112, 97, 103, 97, 116, // are propagat + 101, 100, 32, 116, 111, 32, 97, 108, 108, 32, 100, 97, // ed to all da + 115, 104, 98, 111, 97, 114, 100, 115, 58, 32, 116, 114, // shboards: tr + 121, 10, 32, 32, 32, 32, 99, 104, 97, 110, 103, 105, // y. changi + 110, 103, 32, 116, 104, 101, 109, 32, 105, 110, 32, 116, // ng them in t + 104, 105, 115, 32, 100, 97, 115, 104, 98, 111, 97, 114, // his dashboar + 100, 32, 97, 110, 100, 32, 111, 98, 115, 101, 114, 118, // d and observ + 101, 32, 99, 104, 97, 110, 103, 101, 115, 32, 105, 110, // e changes in + 32, 111, 116, 104, 101, 114, 32, 111, 112, 101, 110, 101, // other opene + 100, 10, 32, 32, 32, 32, 100, 97, 115, 104, 98, 111, // d. dashbo + 97, 114, 100, 115, 46, 10, 32, 32, 60, 47, 100, 105, // ards..
. + 78, 111, 116, 101, 58, 32, 97, 100, 109, 105, 110, 105, // Note: admini + 115, 116, 114, 97, 116, 111, 114, 115, 32, 99, 97, 110, // strators can + 32, 115, 101, 101, 32, 116, 104, 105, 115, 32, 115, 101, // see this se + 99, 116, 105, 111, 110, 32, 97, 110, 100, 32, 99, 97, // ction and ca + 110, 32, 99, 104, 97, 110, 103, 101, 32, 100, 101, 118, // n change dev + 105, 99, 101, 10, 32, 32, 32, 32, 99, 111, 110, 102, // ice. conf + 105, 103, 117, 114, 97, 116, 105, 111, 110, 44, 32, 119, // iguration, w + 104, 105, 108, 115, 116, 32, 117, 115, 101, 114, 115, 32, // hilst users + 99, 97, 110, 110, 111, 116, 46, 10, 32, 32, 60, 47, // cannot.. .
` + 59, 10, 125, 59, 10, 10, 10, 99, 111, 110, 115, 116, // ;.};...const + 32, 77, 101, 115, 115, 97, 103, 101, 32, 61, 32, 109, // Message = m + 32, 61, 62, 32, 104, 116, 109, 108, 96, 60, 100, 105, // => html`. + 113, 111, 115, 58, 32, 36, 123, 109, 46, 109, 101, 115, // qos: ${m.mes + 115, 97, 103, 101, 46, 113, 111, 115, 125, 32, 60, 47, // sage.qos} . topic: $ + 123, 109, 46, 109, 101, 115, 115, 97, 103, 101, 46, 116, // {m.message.t + 111, 112, 105, 99, 125, 32, 60, 47, 115, 112, 97, 110, // opic} . d + 97, 116, 97, 58, 32, 36, 123, 109, 46, 109, 101, 115, // ata: ${m.mes + 115, 97, 103, 101, 46, 100, 97, 116, 97, 125, 60, 47, // sage.data}.
+ 96, 59, 10, 10, 99, 111, 110, 115, 116, 32, 77, 101, // `;..const Me + 115, 115, 97, 103, 101, 115, 32, 61, 32, 102, 117, 110, // ssages = fun + 99, 116, 105, 111, 110, 40, 112, 114, 111, 112, 115, 41, // ction(props) + 32, 123, 10, 32, 32, 99, 111, 110, 115, 116, 32, 91, // {. const [ + 109, 101, 115, 115, 97, 103, 101, 115, 44, 32, 115, 101, // messages, se + 116, 77, 101, 115, 115, 97, 103, 101, 115, 93, 32, 61, // tMessages] = + 32, 117, 115, 101, 83, 116, 97, 116, 101, 40, 91, 93, // useState([] + 41, 59, 10, 32, 32, 99, 111, 110, 115, 116, 32, 91, // );. const [ + 116, 120, 116, 44, 32, 115, 101, 116, 84, 120, 116, 93, // txt, setTxt] + 32, 61, 32, 117, 115, 101, 83, 116, 97, 116, 101, 40, // = useState( + 39, 39, 41, 59, 10, 10, 32, 32, 117, 115, 101, 69, // '');.. useE + 102, 102, 101, 99, 116, 40, 40, 41, 32, 61, 62, 32, // ffect(() => + 123, 10, 32, 32, 32, 32, 99, 111, 110, 115, 116, 32, // {. const + 105, 100, 32, 61, 32, 80, 117, 98, 83, 117, 98, 46, // id = PubSub. + 115, 117, 98, 115, 99, 114, 105, 98, 101, 40, 102, 117, // subscribe(fu + 110, 99, 116, 105, 111, 110, 40, 109, 115, 103, 41, 32, // nction(msg) + 123, 10, 32, 32, 32, 32, 32, 32, 105, 102, 32, 40, // {. if ( + 109, 115, 103, 46, 110, 97, 109, 101, 32, 61, 61, 32, // msg.name == + 39, 109, 101, 115, 115, 97, 103, 101, 39, 41, 32, 115, // 'message') s + 101, 116, 77, 101, 115, 115, 97, 103, 101, 115, 40, 120, // etMessages(x + 32, 61, 62, 32, 120, 46, 99, 111, 110, 99, 97, 116, // => x.concat + 40, 91, 109, 115, 103, 46, 100, 97, 116, 97, 93, 41, // ([msg.data]) + 41, 59, 10, 32, 32, 32, 32, 125, 41, 59, 10, 32, // );. });. + 32, 32, 32, 114, 101, 116, 117, 114, 110, 32, 80, 117, // return Pu + 98, 83, 117, 98, 46, 117, 110, 115, 117, 98, 115, 99, // bSub.unsubsc + 114, 105, 98, 101, 40, 105, 100, 41, 59, 10, 32, 32, // ribe(id);. + 125, 44, 32, 91, 93, 41, 59, 10, 10, 32, 32, 99, // }, []);.. c + 111, 110, 115, 116, 32, 115, 101, 110, 100, 109, 101, 115, // onst sendmes + 115, 97, 103, 101, 32, 61, 32, 101, 118, 32, 61, 62, // sage = ev => + 32, 102, 101, 116, 99, 104, 40, 39, 47, 97, 112, 105, // fetch('/api + 47, 109, 101, 115, 115, 97, 103, 101, 47, 115, 101, 110, // /message/sen + 100, 39, 44, 32, 123, 10, 32, 32, 32, 32, 32, 32, // d', {. + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // + 109, 101, 116, 104, 111, 100, 58, 32, 39, 112, 111, 115, // method: 'pos + 116, 39, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, // t',. + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 98, 111, // bo + 100, 121, 58, 32, 96, 109, 101, 115, 115, 97, 103, 101, // dy: `message + 61, 36, 123, 101, 110, 99, 111, 100, 101, 85, 82, 73, // =${encodeURI + 67, 111, 109, 112, 111, 110, 101, 110, 116, 40, 116, 120, // Component(tx + 116, 41, 125, 96, 10, 32, 32, 32, 32, 32, 32, 32, // t)}`. + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // + 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 41, 46, // }). + 116, 104, 101, 110, 40, 114, 32, 61, 62, 32, 115, 101, // then(r => se + 116, 84, 120, 116, 40, 39, 39, 41, 41, 59, 10, 32, // tTxt(''));. + 32, 99, 111, 110, 115, 116, 32, 99, 111, 110, 110, 115, // const conns + 116, 97, 116, 117, 115, 32, 61, 32, 112, 114, 111, 112, // tatus = prop + 115, 46, 99, 111, 110, 102, 105, 103, 46, 99, 111, 110, // s.config.con + 110, 101, 99, 116, 101, 100, 32, 63, 32, 39, 99, 111, // nected ? 'co + 110, 110, 101, 99, 116, 101, 100, 39, 32, 58, 32, 39, // nnected' : ' + 100, 105, 115, 99, 111, 110, 110, 101, 99, 116, 101, 100, // disconnected + 39, 59, 10, 32, 32, 114, 101, 116, 117, 114, 110, 32, // ';. return + 104, 116, 109, 108, 96, 10, 60, 100, 105, 118, 32, 99, // html`.
.

MQTT + 32, 109, 101, 115, 115, 97, 103, 101, 115, 60, 47, 104, // messages.
. + 32, 32, 32, 77, 81, 84, 84, 32, 115, 101, 114, 118, // MQTT serv + 101, 114, 32, 115, 116, 97, 116, 117, 115, 58, 32, 60, // er status: < + 98, 62, 36, 123, 99, 111, 110, 110, 115, 116, 97, 116, // b>${connstat + 117, 115, 125, 60, 47, 98, 62, 10, 32, 32, 60, 47, // us}. .
. + 32, 32, 32, 36, 123, 109, 101, 115, 115, 97, 103, 101, // ${message + 115, 46, 109, 97, 112, 40, 109, 101, 115, 115, 97, 103, // s.map(messag + 101, 32, 61, 62, 32, 104, 40, 77, 101, 115, 115, 97, // e => h(Messa + 103, 101, 44, 32, 123, 109, 101, 115, 115, 97, 103, 101, // ge, {message + 125, 41, 41, 125, 10, 32, 32, 60, 47, 100, 105, 118, // }))}.
.
10, 32, 32, 32, 32, 60, 115, 112, 97, 110, 32, 99, // . Subs - 99, 114, 105, 98, 101, 32, 116, 111, 112, 105, 99, 58, // cribe topic: + 110, 111, 119, 114, 97, 112, 34, 62, 80, 117, 98, 108, // nowrap">Publ + 105, 115, 104, 32, 109, 101, 115, 115, 97, 103, 101, 58, // ish message: 60, 47, 115, 112, 97, 110, 62, 10, 32, 32, 32, 32, // . - 60, 105, 110, 112, 117, 116, 32, 116, 121, 112, 101, 61, // - 115, 101, 116, 83, 117, 98, 40, 101, 118, 46, 116, 97, // setSub(ev.ta + 115, 101, 116, 84, 120, 116, 40, 101, 118, 46, 116, 97, // setTxt(ev.ta 114, 103, 101, 116, 46, 118, 97, 108, 117, 101, 41, 125, // rget.value)} - 32, 47, 62, 10, 32, 32, 32, 32, 60, 98, 117, 116, // />. Upda - 116, 101, 60, 47, 98, 117, 116, 116, 111, 110, 62, 10, // te. - 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, //
. < - 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, 34, 109, // div style="m - 97, 114, 103, 105, 110, 58, 32, 48, 46, 53, 101, 109, // argin: 0.5em - 32, 48, 59, 32, 100, 105, 115, 112, 108, 97, 121, 58, // 0; display: - 32, 102, 108, 101, 120, 59, 34, 62, 10, 32, 32, 32, // flex;">. - 32, 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, 115, // Publish - 116, 111, 112, 105, 99, 58, 60, 47, 115, 112, 97, 110, // topic:. se - 116, 80, 117, 98, 40, 101, 118, 46, 116, 97, 114, 103, // tPub(ev.targ - 101, 116, 46, 118, 97, 108, 117, 101, 41, 125, 32, 47, // et.value)} / - 62, 10, 32, 32, 32, 32, 60, 98, 117, 116, 116, 111, // >. Update - 60, 47, 98, 117, 116, 116, 111, 110, 62, 10, 32, 32, // . - 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, 100, 105, //
. . You c - 97, 110, 32, 117, 115, 101, 32, 60, 97, 32, 104, 114, // an use . Hive - 77, 81, 32, 87, 101, 98, 115, 111, 99, 107, 101, 116, // MQ Websocket - 32, 119, 101, 98, 32, 99, 108, 105, 101, 110, 116, 60, // web client< - 47, 97, 62, 32, 116, 111, 32, 115, 101, 110, 100, 32, // /a> to send - 109, 101, 115, 115, 97, 103, 101, 115, 32, 116, 111, 32, // messages to - 116, 104, 105, 115, 32, 99, 111, 110, 115, 111, 108, 101, // this console - 46, 10, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, // ..

. - 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, //
. T - 104, 101, 32, 100, 101, 118, 105, 99, 101, 32, 107, 101, // he device ke - 101, 112, 115, 32, 97, 32, 112, 101, 114, 115, 105, 115, // eps a persis - 116, 101, 110, 116, 32, 99, 111, 110, 110, 101, 99, 116, // tent connect - 105, 111, 110, 32, 116, 111, 32, 116, 104, 101, 32, 99, // ion to the c - 111, 110, 102, 105, 103, 117, 114, 101, 100, 32, 77, 81, // onfigured MQ - 84, 84, 32, 115, 101, 114, 118, 101, 114, 46, 10, 32, // TT server.. - 32, 32, 32, 67, 104, 97, 110, 103, 101, 115, 32, 116, // Changes t - 111, 32, 116, 104, 105, 115, 32, 99, 111, 110, 102, 105, // o this confi - 103, 117, 114, 97, 116, 105, 111, 110, 32, 97, 114, 101, // guration are - 32, 112, 114, 111, 112, 97, 103, 97, 116, 101, 100, 32, // propagated - 116, 111, 32, 97, 108, 108, 32, 100, 97, 115, 104, 98, // to all dashb - 111, 97, 114, 100, 115, 58, 32, 116, 114, 121, 10, 32, // oards: try. - 32, 32, 32, 99, 104, 97, 110, 103, 105, 110, 103, 32, // changing - 116, 104, 101, 109, 32, 105, 110, 32, 116, 104, 105, 115, // them in this - 32, 100, 97, 115, 104, 98, 111, 97, 114, 100, 32, 97, // dashboard a - 110, 100, 32, 111, 98, 115, 101, 114, 118, 101, 32, 99, // nd observe c - 104, 97, 110, 103, 101, 115, 32, 105, 110, 32, 111, 116, // hanges in ot - 104, 101, 114, 32, 111, 112, 101, 110, 101, 100, 10, 32, // her opened. - 32, 32, 32, 100, 97, 115, 104, 98, 111, 97, 114, 100, // dashboard - 115, 46, 10, 32, 32, 60, 47, 100, 105, 118, 62, 60, // s..
< - 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 109, // div class="m - 115, 103, 34, 62, 10, 32, 32, 32, 32, 78, 111, 116, // sg">. Not - 101, 58, 32, 97, 100, 109, 105, 110, 105, 115, 116, 114, // e: administr - 97, 116, 111, 114, 115, 32, 99, 97, 110, 32, 115, 101, // ators can se - 101, 32, 116, 104, 105, 115, 32, 115, 101, 99, 116, 105, // e this secti - 111, 110, 32, 97, 110, 100, 32, 99, 97, 110, 32, 99, // on and can c - 104, 97, 110, 103, 101, 32, 100, 101, 118, 105, 99, 101, // hange device - 10, 32, 32, 32, 32, 99, 111, 110, 102, 105, 103, 117, // . configu - 114, 97, 116, 105, 111, 110, 44, 32, 119, 104, 105, 108, // ration, whil - 115, 116, 32, 117, 115, 101, 114, 115, 32, 99, 97, 110, // st users can - 110, 111, 116, 46, 10, 32, 32, 60, 47, 100, 105, 118, // not.. .`;.} - 59, 10, 10, 10, 99, 111, 110, 115, 116, 32, 77, 101, // ;...const Me - 115, 115, 97, 103, 101, 32, 61, 32, 109, 32, 61, 62, // ssage = m => - 32, 104, 116, 109, 108, 96, 60, 100, 105, 118, 32, 115, // html`
- 10, 32, 32, 60, 115, 112, 97, 110, 32, 99, 108, 97, // . qos - 58, 32, 36, 123, 109, 46, 109, 101, 115, 115, 97, 103, // : ${m.messag - 101, 46, 113, 111, 115, 125, 32, 60, 47, 115, 112, 97, // e.qos} . topic: ${m. - 109, 101, 115, 115, 97, 103, 101, 46, 116, 111, 112, 105, // message.topi - 99, 125, 32, 60, 47, 115, 112, 97, 110, 62, 10, 32, // c} . - 32, 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, 115, // data - 58, 32, 36, 123, 109, 46, 109, 101, 115, 115, 97, 103, // : ${m.messag - 101, 46, 100, 97, 116, 97, 125, 60, 47, 115, 112, 97, // e.data}.
`;. - 10, 99, 111, 110, 115, 116, 32, 77, 101, 115, 115, 97, // .const Messa - 103, 101, 115, 32, 61, 32, 102, 117, 110, 99, 116, 105, // ges = functi - 111, 110, 40, 112, 114, 111, 112, 115, 41, 32, 123, 10, // on(props) {. - 32, 32, 99, 111, 110, 115, 116, 32, 91, 109, 101, 115, // const [mes - 115, 97, 103, 101, 115, 44, 32, 115, 101, 116, 77, 101, // sages, setMe - 115, 115, 97, 103, 101, 115, 93, 32, 61, 32, 117, 115, // ssages] = us - 101, 83, 116, 97, 116, 101, 40, 91, 93, 41, 59, 10, // eState([]);. - 32, 32, 99, 111, 110, 115, 116, 32, 91, 116, 120, 116, // const [txt - 44, 32, 115, 101, 116, 84, 120, 116, 93, 32, 61, 32, // , setTxt] = - 117, 115, 101, 83, 116, 97, 116, 101, 40, 39, 39, 41, // useState('') - 59, 10, 10, 32, 32, 117, 115, 101, 69, 102, 102, 101, // ;.. useEffe + 32, 47, 62, 10, 32, 32, 60, 47, 100, 105, 118, 62, // />. + 10, 32, 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, // .
. + 32, 84, 104, 101, 32, 109, 101, 115, 115, 97, 103, 101, // The message + 32, 103, 101, 116, 115, 32, 112, 97, 115, 115, 101, 100, // gets passed + 32, 116, 111, 32, 116, 104, 101, 32, 100, 101, 118, 105, // to the devi + 99, 101, 32, 118, 105, 97, 32, 82, 69, 83, 84, 46, // ce via REST. + 32, 84, 104, 101, 110, 32, 116, 104, 101, 32, 100, 101, // Then the de + 118, 105, 99, 101, 32, 115, 101, 110, 100, 115, 32, 105, // vice sends i + 116, 32, 116, 111, 10, 32, 32, 32, 32, 116, 104, 101, // t to. the + 32, 77, 81, 84, 84, 32, 115, 101, 114, 118, 101, 114, // MQTT server + 32, 111, 118, 101, 114, 32, 77, 81, 84, 84, 46, 32, // over MQTT. + 65, 108, 108, 32, 77, 81, 84, 84, 32, 109, 101, 115, // All MQTT mes + 115, 97, 103, 101, 115, 32, 111, 110, 32, 97, 32, 115, // sages on a s + 117, 98, 115, 99, 114, 105, 98, 101, 100, 32, 116, 111, // ubscribed to + 112, 105, 99, 10, 32, 32, 32, 32, 114, 101, 99, 101, // pic. rece + 105, 118, 101, 100, 32, 98, 121, 32, 116, 104, 101, 32, // ived by the + 100, 101, 118, 105, 99, 101, 44, 32, 97, 114, 101, 32, // device, are + 112, 114, 111, 112, 97, 103, 97, 116, 101, 100, 32, 116, // propagated t + 111, 32, 116, 104, 105, 115, 32, 100, 97, 115, 104, 98, // o this dashb + 111, 97, 114, 100, 32, 118, 105, 97, 32, 47, 97, 112, // oard via /ap + 105, 47, 119, 97, 116, 99, 104, 46, 10, 32, 32, 60, // i/watch.. < + 47, 100, 105, 118, 62, 10, 60, 47, 100, 105, 118, 62, // /div>.
+ 96, 59, 10, 125, 59, 10, 10, 47, 47, 32, 69, 120, // `;.};..// Ex + 112, 101, 99, 116, 101, 100, 32, 97, 114, 103, 117, 109, // pected argum + 101, 110, 116, 115, 58, 10, 47, 47, 32, 100, 97, 116, // ents:.// dat + 97, 58, 32, 116, 105, 109, 101, 115, 101, 114, 105, 101, // a: timeserie + 115, 44, 32, 101, 46, 103, 46, 32, 91, 32, 91, 49, // s, e.g. [ [1 + 54, 53, 52, 51, 54, 49, 51, 53, 50, 44, 32, 49, // 654361352, 1 + 57, 93, 44, 32, 91, 49, 54, 53, 52, 51, 54, 49, // 9], [1654361 + 51, 53, 51, 44, 32, 49, 56, 93, 44, 32, 46, 46, // 353, 18], .. + 46, 32, 93, 10, 47, 47, 32, 119, 105, 100, 116, 104, // . ].// width + 44, 32, 104, 101, 105, 103, 104, 116, 44, 32, 121, 116, // , height, yt + 105, 99, 107, 115, 44, 32, 120, 116, 105, 99, 107, 115, // icks, xticks + 44, 32, 121, 109, 105, 110, 44, 32, 121, 109, 97, 120, // , ymin, ymax + 44, 32, 120, 109, 105, 110, 44, 32, 120, 109, 97, 120, // , xmin, xmax + 10, 99, 111, 110, 115, 116, 32, 83, 86, 71, 32, 61, // .const SVG = + 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 112, 114, // function(pr + 111, 112, 115, 41, 32, 123, 10, 32, 32, 47, 47, 32, // ops) {. // + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 119, // w + 10, 32, 32, 47, 47, 32, 32, 32, 43, 45, 45, 45, // . // +--- + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, // ------------ + 45, 45, 45, 45, 45, 45, 43, 10, 32, 32, 47, 47, // ------+. // + 32, 32, 32, 124, 32, 32, 32, 32, 32, 32, 32, 32, // | + 104, 49, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // h1 + 32, 124, 10, 32, 32, 47, 47, 32, 32, 32, 124, 32, // |. // | + 32, 32, 32, 43, 45, 45, 45, 45, 45, 45, 45, 45, // +-------- + 45, 45, 45, 43, 32, 32, 32, 32, 124, 10, 32, 32, // ---+ |. + 47, 47, 32, 32, 32, 124, 32, 32, 32, 32, 124, 32, // // | | + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 124, 32, // | + 32, 32, 32, 124, 32, 32, 104, 10, 32, 32, 47, 47, // | h. // + 32, 32, 32, 124, 32, 119, 49, 32, 124, 32, 32, 32, // | w1 | + 32, 32, 32, 32, 32, 32, 32, 32, 124, 32, 119, 50, // | w2 + 32, 124, 10, 32, 32, 47, 47, 32, 32, 32, 124, 32, // |. // | + 32, 32, 32, 43, 45, 45, 45, 45, 45, 45, 45, 45, // +-------- + 45, 45, 45, 43, 32, 32, 32, 32, 124, 10, 32, 32, // ---+ |. + 47, 47, 32, 32, 32, 124, 32, 32, 32, 32, 32, 32, // // | + 32, 32, 32, 104, 50, 32, 32, 32, 32, 32, 32, 32, // h2 + 32, 32, 32, 124, 10, 32, 32, 47, 47, 32, 32, 32, // |. // + 43, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, // +----------- + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 43, 10, // ----------+. + 32, 32, 47, 47, 10, 32, 32, 108, 101, 116, 32, 119, // //. let w + 32, 61, 32, 112, 114, 111, 112, 115, 46, 119, 105, 100, // = props.wid + 116, 104, 44, 32, 104, 32, 61, 32, 112, 114, 111, 112, // th, h = prop + 115, 46, 104, 101, 105, 103, 104, 116, 44, 32, 119, 49, // s.height, w1 + 32, 61, 32, 51, 48, 44, 32, 119, 50, 32, 61, 32, // = 30, w2 = + 48, 44, 32, 104, 49, 32, 61, 32, 56, 44, 32, 104, // 0, h1 = 8, h + 50, 32, 61, 32, 49, 56, 59, 10, 32, 32, 108, 101, // 2 = 18;. le + 116, 32, 121, 116, 105, 99, 107, 115, 32, 61, 32, 112, // t yticks = p + 114, 111, 112, 115, 46, 121, 116, 105, 99, 107, 115, 32, // rops.yticks + 124, 124, 32, 52, 44, 32, 120, 116, 105, 99, 107, 115, // || 4, xticks + 32, 61, 32, 112, 114, 111, 112, 115, 46, 120, 116, 105, // = props.xti + 99, 107, 115, 32, 124, 124, 32, 53, 59, 10, 32, 32, // cks || 5;. + 108, 101, 116, 32, 100, 97, 116, 97, 32, 61, 32, 112, // let data = p + 114, 111, 112, 115, 46, 100, 97, 116, 97, 32, 124, 124, // rops.data || + 32, 91, 93, 59, 10, 32, 32, 108, 101, 116, 32, 121, // [];. let y + 109, 105, 110, 32, 61, 32, 112, 114, 111, 112, 115, 46, // min = props. + 121, 109, 105, 110, 32, 124, 124, 32, 48, 59, 10, 32, // ymin || 0;. + 32, 108, 101, 116, 32, 121, 109, 97, 120, 32, 61, 32, // let ymax = + 112, 114, 111, 112, 115, 46, 121, 109, 97, 120, 32, 124, // props.ymax | + 124, 32, 77, 97, 116, 104, 46, 109, 97, 120, 46, 97, // | Math.max.a + 112, 112, 108, 121, 40, 110, 117, 108, 108, 44, 32, 100, // pply(null, d + 97, 116, 97, 46, 109, 97, 112, 40, 112, 32, 61, 62, // ata.map(p => + 32, 112, 91, 49, 93, 41, 41, 59, 10, 32, 32, 108, // p[1]));. l + 101, 116, 32, 120, 109, 105, 110, 32, 61, 32, 112, 114, // et xmin = pr + 111, 112, 115, 46, 120, 109, 105, 110, 32, 124, 124, 32, // ops.xmin || + 77, 97, 116, 104, 46, 109, 105, 110, 46, 97, 112, 112, // Math.min.app + 108, 121, 40, 110, 117, 108, 108, 44, 32, 100, 97, 116, // ly(null, dat + 97, 46, 109, 97, 112, 40, 112, 32, 61, 62, 32, 112, // a.map(p => p + 91, 48, 93, 41, 41, 59, 10, 32, 32, 108, 101, 116, // [0]));. let + 32, 120, 109, 97, 120, 32, 61, 32, 112, 114, 111, 112, // xmax = prop + 115, 46, 120, 109, 97, 120, 32, 124, 124, 32, 77, 97, // s.xmax || Ma + 116, 104, 46, 109, 97, 120, 46, 97, 112, 112, 108, 121, // th.max.apply + 40, 110, 117, 108, 108, 44, 32, 100, 97, 116, 97, 46, // (null, data. + 109, 97, 112, 40, 112, 32, 61, 62, 32, 112, 91, 48, // map(p => p[0 + 93, 41, 41, 59, 10, 10, 32, 32, 47, 47, 32, 89, // ]));.. // Y + 45, 97, 120, 105, 115, 32, 116, 105, 99, 107, 32, 108, // -axis tick l + 105, 110, 101, 115, 32, 97, 110, 100, 32, 108, 97, 98, // ines and lab + 101, 108, 115, 10, 32, 32, 108, 101, 116, 32, 121, 116, // els. let yt + 97, 32, 61, 32, 40, 110, 101, 119, 32, 65, 114, 114, // a = (new Arr + 97, 121, 40, 121, 116, 105, 99, 107, 115, 32, 43, 32, // ay(yticks + + 49, 41, 41, 46, 102, 105, 108, 108, 40, 48, 41, 46, // 1)).fill(0). + 109, 97, 112, 40, 40, 95, 44, 32, 105, 41, 32, 61, // map((_, i) = + 62, 32, 105, 41, 59, 32, 32, 47, 47, 32, 105, 110, // > i); // in + 100, 105, 99, 101, 115, 10, 32, 32, 108, 101, 116, 32, // dices. let + 121, 116, 105, 32, 61, 32, 105, 32, 61, 62, 32, 104, // yti = i => h + 32, 45, 32, 104, 50, 32, 45, 32, 40, 104, 32, 45, // - h2 - (h - + 32, 104, 49, 32, 45, 32, 104, 50, 41, 32, 42, 32, // h1 - h2) * + 105, 32, 47, 32, 121, 116, 105, 99, 107, 115, 59, 32, // i / yticks; + 32, 32, 32, 32, 32, 32, 32, 32, 32, 47, 47, 32, // // + 105, 110, 100, 101, 120, 39, 115, 32, 89, 10, 32, 32, // index's Y. + 108, 101, 116, 32, 121, 116, 118, 32, 61, 32, 105, 32, // let ytv = i + 61, 62, 32, 40, 121, 109, 97, 120, 32, 45, 32, 121, // => (ymax - y + 109, 105, 110, 41, 32, 42, 32, 105, 32, 47, 32, 121, // min) * i / y + 116, 105, 99, 107, 115, 59, 10, 32, 32, 108, 101, 116, // ticks;. let + 32, 121, 116, 108, 32, 61, 32, 121, 32, 61, 62, 32, // ytl = y => + 104, 116, 109, 108, 96, 60, 108, 105, 110, 101, 32, 120, // html``; + 10, 32, 32, 108, 101, 116, 32, 121, 116, 116, 32, 61, // . let ytt = + 32, 40, 121, 44, 32, 118, 41, 32, 61, 62, 32, 104, // (y, v) => h + 116, 109, 108, 96, 60, 116, 101, 120, 116, 32, 120, 61, // tml`${v}`;.. // X + 45, 97, 120, 105, 115, 32, 116, 105, 99, 107, 32, 108, // -axis tick l + 105, 110, 101, 115, 32, 97, 110, 100, 32, 108, 97, 98, // ines and lab + 101, 108, 115, 10, 32, 32, 108, 101, 116, 32, 100, 97, // els. let da + 116, 101, 102, 109, 116, 32, 61, 32, 117, 110, 105, 120, // tefmt = unix + 32, 61, 62, 32, 40, 110, 101, 119, 32, 68, 97, 116, // => (new Dat + 101, 40, 117, 110, 105, 120, 32, 42, 32, 49, 48, 48, // e(unix * 100 + 48, 41, 41, 46, 116, 111, 73, 83, 79, 83, 116, 114, // 0)).toISOStr + 105, 110, 103, 40, 41, 46, 115, 117, 98, 115, 116, 114, // ing().substr + 40, 49, 52, 44, 32, 53, 41, 59, 10, 32, 32, 108, // (14, 5);. l + 101, 116, 32, 120, 116, 97, 32, 61, 32, 40, 110, 101, // et xta = (ne + 119, 32, 65, 114, 114, 97, 121, 40, 120, 116, 105, 99, // w Array(xtic + 107, 115, 32, 43, 32, 49, 41, 41, 46, 102, 105, 108, // ks + 1)).fil + 108, 40, 48, 41, 46, 109, 97, 112, 40, 40, 95, 44, // l(0).map((_, + 32, 105, 41, 32, 61, 62, 32, 105, 41, 59, 32, 32, // i) => i); + 47, 47, 32, 105, 110, 100, 105, 99, 101, 115, 10, 32, // // indices. + 32, 108, 101, 116, 32, 120, 116, 105, 32, 61, 32, 105, // let xti = i + 32, 61, 62, 32, 119, 49, 32, 43, 32, 40, 119, 32, // => w1 + (w + 45, 32, 119, 49, 32, 45, 32, 119, 50, 41, 32, 42, // - w1 - w2) * + 32, 105, 32, 47, 32, 120, 116, 105, 99, 107, 115, 59, // i / xticks; + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // + 32, 32, 47, 47, 32, 105, 110, 100, 101, 120, 39, 115, // // index's + 32, 88, 10, 32, 32, 108, 101, 116, 32, 120, 116, 118, // X. let xtv + 32, 61, 32, 105, 32, 61, 62, 32, 100, 97, 116, 101, // = i => date + 102, 109, 116, 40, 120, 109, 105, 110, 32, 43, 32, 40, // fmt(xmin + ( + 120, 109, 97, 120, 32, 45, 32, 120, 109, 105, 110, 41, // xmax - xmin) + 32, 42, 32, 105, 32, 47, 32, 120, 116, 105, 99, 107, // * i / xtick + 115, 41, 59, 10, 32, 32, 108, 101, 116, 32, 120, 116, // s);. let xt + 108, 32, 61, 32, 120, 32, 61, 62, 32, 104, 116, 109, // l = x => htm + 108, 96, 60, 112, 97, 116, 104, 32, 100, 61, 34, 77, // l``;. + 32, 108, 101, 116, 32, 120, 116, 116, 32, 61, 32, 40, // let xtt = ( + 120, 44, 32, 118, 41, 32, 61, 62, 10, 32, 32, 32, // x, v) =>. + 32, 32, 32, 104, 116, 109, 108, 96, 60, 116, 101, 120, // html`${v}`;.. // T + 114, 97, 110, 115, 102, 111, 114, 109, 32, 100, 97, 116, // ransform dat + 97, 32, 112, 111, 105, 110, 116, 115, 32, 97, 114, 114, // a points arr + 97, 121, 32, 105, 110, 116, 111, 32, 99, 111, 111, 114, // ay into coor + 100, 105, 110, 97, 116, 101, 10, 32, 32, 108, 101, 116, // dinate. let + 32, 100, 120, 32, 61, 32, 118, 32, 61, 62, 32, 119, // dx = v => w + 49, 32, 43, 32, 40, 118, 32, 45, 32, 120, 109, 105, // 1 + (v - xmi + 110, 41, 32, 47, 32, 40, 40, 120, 109, 97, 120, 32, // n) / ((xmax + 45, 32, 120, 109, 105, 110, 41, 32, 124, 124, 32, 49, // - xmin) || 1 + 41, 32, 42, 32, 40, 119, 32, 45, 32, 119, 49, 32, // ) * (w - w1 + 45, 32, 119, 50, 41, 59, 10, 32, 32, 108, 101, 116, // - w2);. let + 32, 100, 121, 32, 61, 32, 118, 32, 61, 62, 32, 104, // dy = v => h + 32, 45, 32, 104, 50, 32, 45, 32, 40, 118, 32, 45, // - h2 - (v - + 32, 121, 109, 105, 110, 41, 32, 47, 32, 40, 40, 121, // ymin) / ((y + 109, 97, 120, 32, 45, 32, 121, 109, 105, 110, 41, 32, // max - ymin) + 124, 124, 32, 49, 41, 32, 42, 32, 40, 104, 32, 45, // || 1) * (h - + 32, 104, 49, 32, 45, 32, 104, 50, 41, 59, 10, 32, // h1 - h2);. + 32, 108, 101, 116, 32, 100, 100, 32, 61, 32, 100, 97, // let dd = da + 116, 97, 46, 109, 97, 112, 40, 112, 32, 61, 62, 32, // ta.map(p => + 91, 77, 97, 116, 104, 46, 114, 111, 117, 110, 100, 40, // [Math.round( + 100, 120, 40, 112, 91, 48, 93, 41, 41, 44, 32, 77, // dx(p[0])), M + 97, 116, 104, 46, 114, 111, 117, 110, 100, 40, 100, 121, // ath.round(dy + 40, 112, 91, 49, 93, 41, 41, 93, 41, 59, 10, 32, // (p[1]))]);. + 32, 108, 101, 116, 32, 100, 100, 108, 32, 61, 32, 100, // let ddl = d + 100, 46, 108, 101, 110, 103, 116, 104, 59, 10, 32, 32, // d.length;. + 47, 47, 32, 65, 110, 100, 32, 112, 108, 111, 116, 32, // // And plot + 116, 104, 101, 32, 100, 97, 116, 97, 32, 97, 115, 32, // the data as + 60, 112, 97, 116, 104, 62, 32, 101, 108, 101, 109, 101, // eleme + 110, 116, 10, 32, 32, 108, 101, 116, 32, 98, 101, 103, // nt. let beg + 105, 110, 48, 32, 61, 32, 100, 100, 108, 32, 63, 32, // in0 = ddl ? + 96, 77, 32, 36, 123, 100, 100, 91, 48, 93, 91, 48, // `M ${dd[0][0 + 93, 125, 44, 36, 123, 100, 100, 91, 48, 93, 91, 49, // ]},${dd[0][1 + 93, 125, 96, 32, 58, 32, 96, 77, 32, 48, 44, 48, // ]}` : `M 0,0 + 96, 59, 10, 32, 32, 108, 101, 116, 32, 98, 101, 103, // `;. let beg + 105, 110, 32, 61, 32, 96, 77, 32, 36, 123, 119, 49, // in = `M ${w1 + 125, 44, 36, 123, 104, 32, 45, 32, 104, 50, 125, 96, // },${h - h2}` + 59, 32, 32, 47, 47, 32, 73, 110, 105, 116, 105, 97, // ; // Initia + 108, 32, 112, 111, 105, 110, 116, 10, 32, 32, 108, 101, // l point. le + 116, 32, 101, 110, 100, 32, 61, 32, 100, 100, 108, 32, // t end = ddl + 63, 32, 96, 76, 32, 36, 123, 100, 100, 91, 100, 100, // ? `L ${dd[dd + 108, 32, 45, 32, 49, 93, 91, 48, 93, 125, 44, 36, // l - 1][0]},$ + 123, 104, 32, 45, 32, 104, 50, 125, 96, 32, 58, 32, // {h - h2}` : + 96, 76, 32, 36, 123, 119, 49, 125, 44, 36, 123, 104, // `L ${w1},${h + 32, 45, 32, 104, 50, 125, 96, 59, 10, 32, 32, 108, // - h2}`;. l + 101, 116, 32, 115, 101, 114, 105, 101, 115, 32, 61, 32, // et series = + 100, 100, 108, 32, 63, 32, 100, 100, 46, 109, 97, 112, // ddl ? dd.map + 40, 112, 32, 61, 62, 32, 96, 76, 32, 36, 123, 112, // (p => `L ${p + 91, 48, 93, 125, 32, 36, 123, 112, 91, 49, 93, 125, // [0]} ${p[1]} + 96, 41, 32, 58, 32, 91, 93, 59, 10, 10, 32, 32, // `) : [];.. + 114, 101, 116, 117, 114, 110, 32, 104, 116, 109, 108, 96, // return html` + 10, 60, 115, 118, 103, 32, 118, 105, 101, 119, 66, 111, // .. . .ax + 105, 115, 32, 123, 32, 115, 116, 114, 111, 107, 101, 58, // is { stroke: + 32, 35, 97, 97, 97, 59, 32, 102, 105, 108, 108, 58, // #aaa; fill: + 32, 110, 111, 110, 101, 59, 32, 125, 10, 32, 32, 32, // none; }. + 32, 46, 108, 97, 98, 101, 108, 32, 123, 32, 115, 116, // .label { st + 114, 111, 107, 101, 58, 32, 35, 97, 97, 97, 59, 32, // roke: #aaa; + 102, 111, 110, 116, 45, 115, 105, 122, 101, 58, 32, 49, // font-size: 1 + 51, 112, 120, 59, 32, 125, 10, 32, 32, 32, 32, 46, // 3px; }. . + 116, 105, 99, 107, 32, 123, 32, 115, 116, 114, 111, 107, // tick { strok + 101, 58, 32, 35, 99, 99, 99, 59, 32, 102, 105, 108, // e: #ccc; fil + 108, 58, 32, 110, 111, 110, 101, 59, 32, 115, 116, 114, // l: none; str + 111, 107, 101, 45, 100, 97, 115, 104, 97, 114, 114, 97, // oke-dasharra + 121, 58, 32, 53, 59, 32, 125, 10, 32, 32, 32, 32, // y: 5; }. + 46, 115, 101, 114, 105, 101, 115, 98, 103, 32, 123, 32, // .seriesbg { + 115, 116, 114, 111, 107, 101, 58, 32, 110, 111, 110, 101, // stroke: none + 59, 32, 102, 105, 108, 108, 58, 32, 114, 103, 98, 97, // ; fill: rgba + 40, 50, 48, 48, 44, 50, 50, 53, 44, 50, 53, 53, // (200,225,255 + 44, 32, 48, 46, 50, 53, 41, 125, 10, 32, 32, 32, // , 0.25)}. + 32, 46, 115, 101, 114, 105, 101, 115, 32, 123, 32, 115, // .series { s + 116, 114, 111, 107, 101, 58, 32, 35, 50, 53, 97, 59, // troke: #25a; + 32, 102, 105, 108, 108, 58, 32, 110, 111, 110, 101, 59, // fill: none; + 32, 125, 10, 32, 32, 60, 47, 115, 116, 121, 108, 101, // }. . ${yta.ma + 112, 40, 105, 32, 61, 62, 32, 121, 116, 108, 40, 121, // p(i => ytl(y + 116, 105, 40, 105, 41, 41, 41, 125, 10, 32, 32, 36, // ti(i)))}. $ + 123, 121, 116, 97, 46, 109, 97, 112, 40, 105, 32, 61, // {yta.map(i = + 62, 32, 121, 116, 116, 40, 121, 116, 105, 40, 105, 41, // > ytt(yti(i) + 44, 32, 121, 116, 118, 40, 105, 41, 41, 41, 125, 10, // , ytv(i)))}. + 32, 32, 36, 123, 120, 116, 97, 46, 109, 97, 112, 40, // ${xta.map( + 105, 32, 61, 62, 32, 120, 116, 108, 40, 120, 116, 105, // i => xtl(xti + 40, 105, 41, 41, 41, 125, 10, 32, 32, 36, 123, 100, // (i)))}. ${d + 97, 116, 97, 46, 108, 101, 110, 103, 116, 104, 32, 63, // ata.length ? + 32, 120, 116, 97, 46, 109, 97, 112, 40, 105, 32, 61, // xta.map(i = + 62, 32, 120, 116, 116, 40, 120, 116, 105, 40, 105, 41, // > xtt(xti(i) + 44, 32, 120, 116, 118, 40, 105, 41, 41, 41, 32, 58, // , xtv(i))) : + 32, 39, 39, 125, 10, 32, 32, 60, 112, 97, 116, 104, // ''}. + 10, 32, 32, 60, 112, 97, 116, 104, 32, 100, 61, 34, // . + 10, 60, 47, 115, 118, 103, 62, 96, 59, 10, 125, 59, // .`;.}; + 10, 10, 10, 99, 111, 110, 115, 116, 32, 67, 104, 97, // ...const Cha + 114, 116, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, // rt = functio + 110, 40, 112, 114, 111, 112, 115, 41, 32, 123, 10, 32, // n(props) {. + 32, 99, 111, 110, 115, 116, 32, 91, 100, 97, 116, 97, // const [data + 44, 32, 115, 101, 116, 68, 97, 116, 97, 93, 32, 61, // , setData] = + 32, 117, 115, 101, 83, 116, 97, 116, 101, 40, 91, 93, // useState([] + 41, 59, 10, 32, 32, 117, 115, 101, 69, 102, 102, 101, // );. useEffe 99, 116, 40, 40, 41, 32, 61, 62, 32, 123, 10, 32, // ct(() => {. 32, 32, 32, 99, 111, 110, 115, 116, 32, 105, 100, 32, // const id 61, 32, 80, 117, 98, 83, 117, 98, 46, 115, 117, 98, // = PubSub.sub 115, 99, 114, 105, 98, 101, 40, 102, 117, 110, 99, 116, // scribe(funct 105, 111, 110, 40, 109, 115, 103, 41, 32, 123, 10, 32, // ion(msg) {. 32, 32, 32, 32, 32, 105, 102, 32, 40, 109, 115, 103, // if (msg - 46, 110, 97, 109, 101, 32, 61, 61, 32, 39, 109, 101, // .name == 'me - 115, 115, 97, 103, 101, 39, 41, 32, 115, 101, 116, 77, // ssage') setM - 101, 115, 115, 97, 103, 101, 115, 40, 120, 32, 61, 62, // essages(x => - 32, 120, 46, 99, 111, 110, 99, 97, 116, 40, 91, 109, // x.concat([m - 115, 103, 46, 100, 97, 116, 97, 93, 41, 41, 59, 10, // sg.data]));. - 32, 32, 32, 32, 125, 41, 59, 10, 32, 32, 32, 32, // });. - 114, 101, 116, 117, 114, 110, 32, 80, 117, 98, 83, 117, // return PubSu - 98, 46, 117, 110, 115, 117, 98, 115, 99, 114, 105, 98, // b.unsubscrib - 101, 40, 105, 100, 41, 59, 10, 32, 32, 125, 44, 32, // e(id);. }, - 91, 93, 41, 59, 10, 10, 32, 32, 99, 111, 110, 115, // []);.. cons - 116, 32, 115, 101, 110, 100, 109, 101, 115, 115, 97, 103, // t sendmessag - 101, 32, 61, 32, 101, 118, 32, 61, 62, 32, 102, 101, // e = ev => fe - 116, 99, 104, 40, 39, 47, 97, 112, 105, 47, 109, 101, // tch('/api/me - 115, 115, 97, 103, 101, 47, 115, 101, 110, 100, 39, 44, // ssage/send', - 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, // {. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 32, 32, 32, 32, 32, 32, 109, 101, 116, // met - 104, 111, 100, 58, 32, 39, 112, 111, 115, 116, 39, 44, // hod: 'post', - 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // . - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 32, 32, 32, 32, 98, 111, 100, 121, 58, // body: - 32, 96, 109, 101, 115, 115, 97, 103, 101, 61, 36, 123, // `message=${ - 101, 110, 99, 111, 100, 101, 85, 82, 73, 67, 111, 109, // encodeURICom - 112, 111, 110, 101, 110, 116, 40, 116, 120, 116, 41, 125, // ponent(txt)} - 96, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // `. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 32, 32, 32, 125, 41, 46, 116, 104, 101, // }).the - 110, 40, 114, 32, 61, 62, 32, 115, 101, 116, 84, 120, // n(r => setTx - 116, 40, 39, 39, 41, 41, 59, 10, 32, 32, 99, 111, // t(''));. co - 110, 115, 116, 32, 99, 111, 110, 110, 115, 116, 97, 116, // nst connstat - 117, 115, 32, 61, 32, 112, 114, 111, 112, 115, 46, 99, // us = props.c - 111, 110, 102, 105, 103, 46, 99, 111, 110, 110, 101, 99, // onfig.connec - 116, 101, 100, 32, 63, 32, 39, 99, 111, 110, 110, 101, // ted ? 'conne - 99, 116, 101, 100, 39, 32, 58, 32, 39, 100, 105, 115, // cted' : 'dis - 99, 111, 110, 110, 101, 99, 116, 101, 100, 39, 59, 10, // connected';. - 32, 32, 114, 101, 116, 117, 114, 110, 32, 104, 116, 109, // return htm - 108, 96, 10, 60, 100, 105, 118, 32, 99, 108, 97, 115, // l`.
- 10, 32, 32, 60, 104, 51, 32, 115, 116, 121, 108, 101, // .

MQTT me - 115, 115, 97, 103, 101, 115, 60, 47, 104, 51, 62, 10, // ssages

. - 32, 32, 60, 100, 105, 118, 62, 10, 32, 32, 32, 32, //
. - 77, 81, 84, 84, 32, 115, 101, 114, 118, 101, 114, 32, // MQTT server - 115, 116, 97, 116, 117, 115, 58, 32, 60, 98, 62, 36, // status: $ - 123, 99, 111, 110, 110, 115, 116, 97, 116, 117, 115, 125, // {connstatus} - 60, 47, 98, 62, 10, 32, 32, 60, 47, 100, 105, 118, // .
.
. - 36, 123, 109, 101, 115, 115, 97, 103, 101, 115, 46, 109, // ${messages.m - 97, 112, 40, 109, 101, 115, 115, 97, 103, 101, 32, 61, // ap(message = - 62, 32, 104, 40, 77, 101, 115, 115, 97, 103, 101, 44, // > h(Message, - 32, 123, 109, 101, 115, 115, 97, 103, 101, 125, 41, 41, // {message})) - 125, 10, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, // }.
. - 32, 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, //
. - 32, 32, 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, // Publish - 32, 109, 101, 115, 115, 97, 103, 101, 58, 60, 47, 115, // message:. set - 84, 120, 116, 40, 101, 118, 46, 116, 97, 114, 103, 101, // Txt(ev.targe - 116, 46, 118, 97, 108, 117, 101, 41, 125, 32, 47, 62, // t.value)} /> - 10, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, // .
. - 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, //
. Th - 101, 32, 109, 101, 115, 115, 97, 103, 101, 32, 103, 101, // e message ge - 116, 115, 32, 112, 97, 115, 115, 101, 100, 32, 116, 111, // ts passed to - 32, 116, 104, 101, 32, 100, 101, 118, 105, 99, 101, 32, // the device - 118, 105, 97, 32, 82, 69, 83, 84, 46, 32, 84, 104, // via REST. Th - 101, 110, 32, 116, 104, 101, 32, 100, 101, 118, 105, 99, // en the devic - 101, 32, 115, 101, 110, 100, 115, 32, 105, 116, 32, 116, // e sends it t - 111, 10, 32, 32, 32, 32, 116, 104, 101, 32, 77, 81, // o. the MQ - 84, 84, 32, 115, 101, 114, 118, 101, 114, 32, 111, 118, // TT server ov - 101, 114, 32, 77, 81, 84, 84, 46, 32, 65, 108, 108, // er MQTT. All - 32, 77, 81, 84, 84, 32, 109, 101, 115, 115, 97, 103, // MQTT messag - 101, 115, 32, 111, 110, 32, 97, 32, 115, 117, 98, 115, // es on a subs - 99, 114, 105, 98, 101, 100, 32, 116, 111, 112, 105, 99, // cribed topic - 10, 32, 32, 32, 32, 114, 101, 99, 101, 105, 118, 101, // . receive - 100, 32, 98, 121, 32, 116, 104, 101, 32, 100, 101, 118, // d by the dev - 105, 99, 101, 44, 32, 97, 114, 101, 32, 112, 114, 111, // ice, are pro - 112, 97, 103, 97, 116, 101, 100, 32, 116, 111, 32, 116, // pagated to t - 104, 105, 115, 32, 100, 97, 115, 104, 98, 111, 97, 114, // his dashboar - 100, 32, 118, 105, 97, 32, 47, 97, 112, 105, 47, 119, // d via /api/w - 97, 116, 99, 104, 46, 10, 32, 32, 60, 47, 100, 105, // atch.. .
`;. - 125, 59, 10, 10, 47, 47, 32, 69, 120, 112, 101, 99, // };..// Expec - 116, 101, 100, 32, 97, 114, 103, 117, 109, 101, 110, 116, // ted argument - 115, 58, 10, 47, 47, 32, 100, 97, 116, 97, 58, 32, // s:.// data: - 116, 105, 109, 101, 115, 101, 114, 105, 101, 115, 44, 32, // timeseries, - 101, 46, 103, 46, 32, 91, 32, 91, 49, 54, 53, 52, // e.g. [ [1654 - 51, 54, 49, 51, 53, 50, 44, 32, 49, 57, 93, 44, // 361352, 19], - 32, 91, 49, 54, 53, 52, 51, 54, 49, 51, 53, 51, // [1654361353 - 44, 32, 49, 56, 93, 44, 32, 46, 46, 46, 32, 93, // , 18], ... ] - 10, 47, 47, 32, 119, 105, 100, 116, 104, 44, 32, 104, // .// width, h - 101, 105, 103, 104, 116, 44, 32, 121, 116, 105, 99, 107, // eight, ytick - 115, 44, 32, 120, 116, 105, 99, 107, 115, 44, 32, 121, // s, xticks, y - 109, 105, 110, 44, 32, 121, 109, 97, 120, 44, 32, 120, // min, ymax, x - 109, 105, 110, 44, 32, 120, 109, 97, 120, 10, 99, 111, // min, xmax.co - 110, 115, 116, 32, 83, 86, 71, 32, 61, 32, 102, 117, // nst SVG = fu - 110, 99, 116, 105, 111, 110, 40, 112, 114, 111, 112, 115, // nction(props - 41, 32, 123, 10, 32, 32, 47, 47, 32, 32, 32, 32, // ) {. // - 32, 32, 32, 32, 32, 32, 32, 32, 119, 10, 32, 32, // w. - 47, 47, 32, 32, 32, 43, 45, 45, 45, 45, 45, 45, // // +------ - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, // ------------ - 45, 45, 45, 43, 10, 32, 32, 47, 47, 32, 32, 32, // ---+. // - 124, 32, 32, 32, 32, 32, 32, 32, 32, 104, 49, 32, // | h1 - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 124, 10, // |. - 32, 32, 47, 47, 32, 32, 32, 124, 32, 32, 32, 32, // // | - 43, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, // +----------- - 43, 32, 32, 32, 32, 124, 10, 32, 32, 47, 47, 32, // + |. // - 32, 32, 124, 32, 32, 32, 32, 124, 32, 32, 32, 32, // | | - 32, 32, 32, 32, 32, 32, 32, 124, 32, 32, 32, 32, // | - 124, 32, 32, 104, 10, 32, 32, 47, 47, 32, 32, 32, // | h. // - 124, 32, 119, 49, 32, 124, 32, 32, 32, 32, 32, 32, // | w1 | - 32, 32, 32, 32, 32, 124, 32, 119, 50, 32, 124, 10, // | w2 |. - 32, 32, 47, 47, 32, 32, 32, 124, 32, 32, 32, 32, // // | - 43, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, // +----------- - 43, 32, 32, 32, 32, 124, 10, 32, 32, 47, 47, 32, // + |. // - 32, 32, 124, 32, 32, 32, 32, 32, 32, 32, 32, 32, // | - 104, 50, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // h2 - 124, 10, 32, 32, 47, 47, 32, 32, 32, 43, 45, 45, // |. // +-- - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, // ------------ - 45, 45, 45, 45, 45, 45, 45, 43, 10, 32, 32, 47, // -------+. / - 47, 10, 32, 32, 108, 101, 116, 32, 119, 32, 61, 32, // /. let w = - 112, 114, 111, 112, 115, 46, 119, 105, 100, 116, 104, 44, // props.width, - 32, 104, 32, 61, 32, 112, 114, 111, 112, 115, 46, 104, // h = props.h - 101, 105, 103, 104, 116, 44, 32, 119, 49, 32, 61, 32, // eight, w1 = - 51, 48, 44, 32, 119, 50, 32, 61, 32, 48, 44, 32, // 30, w2 = 0, - 104, 49, 32, 61, 32, 56, 44, 32, 104, 50, 32, 61, // h1 = 8, h2 = - 32, 49, 56, 59, 10, 32, 32, 108, 101, 116, 32, 121, // 18;. let y - 116, 105, 99, 107, 115, 32, 61, 32, 112, 114, 111, 112, // ticks = prop - 115, 46, 121, 116, 105, 99, 107, 115, 32, 124, 124, 32, // s.yticks || - 52, 44, 32, 120, 116, 105, 99, 107, 115, 32, 61, 32, // 4, xticks = - 112, 114, 111, 112, 115, 46, 120, 116, 105, 99, 107, 115, // props.xticks - 32, 124, 124, 32, 53, 59, 10, 32, 32, 108, 101, 116, // || 5;. let - 32, 100, 97, 116, 97, 32, 61, 32, 112, 114, 111, 112, // data = prop - 115, 46, 100, 97, 116, 97, 32, 124, 124, 32, 91, 93, // s.data || [] - 59, 10, 32, 32, 108, 101, 116, 32, 121, 109, 105, 110, // ;. let ymin - 32, 61, 32, 112, 114, 111, 112, 115, 46, 121, 109, 105, // = props.ymi - 110, 32, 124, 124, 32, 48, 59, 10, 32, 32, 108, 101, // n || 0;. le - 116, 32, 121, 109, 97, 120, 32, 61, 32, 112, 114, 111, // t ymax = pro - 112, 115, 46, 121, 109, 97, 120, 32, 124, 124, 32, 77, // ps.ymax || M - 97, 116, 104, 46, 109, 97, 120, 46, 97, 112, 112, 108, // ath.max.appl - 121, 40, 110, 117, 108, 108, 44, 32, 100, 97, 116, 97, // y(null, data - 46, 109, 97, 112, 40, 112, 32, 61, 62, 32, 112, 91, // .map(p => p[ - 49, 93, 41, 41, 59, 10, 32, 32, 108, 101, 116, 32, // 1]));. let - 120, 109, 105, 110, 32, 61, 32, 112, 114, 111, 112, 115, // xmin = props - 46, 120, 109, 105, 110, 32, 124, 124, 32, 77, 97, 116, // .xmin || Mat - 104, 46, 109, 105, 110, 46, 97, 112, 112, 108, 121, 40, // h.min.apply( - 110, 117, 108, 108, 44, 32, 100, 97, 116, 97, 46, 109, // null, data.m - 97, 112, 40, 112, 32, 61, 62, 32, 112, 91, 48, 93, // ap(p => p[0] - 41, 41, 59, 10, 32, 32, 108, 101, 116, 32, 120, 109, // ));. let xm - 97, 120, 32, 61, 32, 112, 114, 111, 112, 115, 46, 120, // ax = props.x - 109, 97, 120, 32, 124, 124, 32, 77, 97, 116, 104, 46, // max || Math. - 109, 97, 120, 46, 97, 112, 112, 108, 121, 40, 110, 117, // max.apply(nu - 108, 108, 44, 32, 100, 97, 116, 97, 46, 109, 97, 112, // ll, data.map - 40, 112, 32, 61, 62, 32, 112, 91, 48, 93, 41, 41, // (p => p[0])) - 59, 10, 10, 32, 32, 47, 47, 32, 89, 45, 97, 120, // ;.. // Y-ax - 105, 115, 32, 116, 105, 99, 107, 32, 108, 105, 110, 101, // is tick line - 115, 32, 97, 110, 100, 32, 108, 97, 98, 101, 108, 115, // s and labels - 10, 32, 32, 108, 101, 116, 32, 121, 116, 97, 32, 61, // . let yta = - 32, 40, 110, 101, 119, 32, 65, 114, 114, 97, 121, 40, // (new Array( - 121, 116, 105, 99, 107, 115, 32, 43, 32, 49, 41, 41, // yticks + 1)) - 46, 102, 105, 108, 108, 40, 48, 41, 46, 109, 97, 112, // .fill(0).map - 40, 40, 95, 44, 32, 105, 41, 32, 61, 62, 32, 105, // ((_, i) => i - 41, 59, 32, 32, 47, 47, 32, 105, 110, 100, 105, 99, // ); // indic - 101, 115, 10, 32, 32, 108, 101, 116, 32, 121, 116, 105, // es. let yti - 32, 61, 32, 105, 32, 61, 62, 32, 104, 32, 45, 32, // = i => h - - 104, 50, 32, 45, 32, 40, 104, 32, 45, 32, 104, 49, // h2 - (h - h1 - 32, 45, 32, 104, 50, 41, 32, 42, 32, 105, 32, 47, // - h2) * i / - 32, 121, 116, 105, 99, 107, 115, 59, 32, 32, 32, 32, // yticks; - 32, 32, 32, 32, 32, 32, 47, 47, 32, 105, 110, 100, // // ind - 101, 120, 39, 115, 32, 89, 10, 32, 32, 108, 101, 116, // ex's Y. let - 32, 121, 116, 118, 32, 61, 32, 105, 32, 61, 62, 32, // ytv = i => - 40, 121, 109, 97, 120, 32, 45, 32, 121, 109, 105, 110, // (ymax - ymin - 41, 32, 42, 32, 105, 32, 47, 32, 121, 116, 105, 99, // ) * i / ytic - 107, 115, 59, 10, 32, 32, 108, 101, 116, 32, 121, 116, // ks;. let yt - 108, 32, 61, 32, 121, 32, 61, 62, 32, 104, 116, 109, // l = y => htm - 108, 96, 60, 108, 105, 110, 101, 32, 120, 49, 61, 36, // l``;. - 108, 101, 116, 32, 121, 116, 116, 32, 61, 32, 40, 121, // let ytt = (y - 44, 32, 118, 41, 32, 61, 62, 32, 104, 116, 109, 108, // , v) => html - 96, 60, 116, 101, 120, 116, 32, 120, 61, 48, 32, 121, // ` - 36, 123, 118, 125, 60, 47, 116, 101, 120, 116, 62, 96, // ${v}` - 59, 10, 10, 32, 32, 47, 47, 32, 88, 45, 97, 120, // ;.. // X-ax - 105, 115, 32, 116, 105, 99, 107, 32, 108, 105, 110, 101, // is tick line - 115, 32, 97, 110, 100, 32, 108, 97, 98, 101, 108, 115, // s and labels - 10, 32, 32, 108, 101, 116, 32, 100, 97, 116, 101, 102, // . let datef - 109, 116, 32, 61, 32, 117, 110, 105, 120, 32, 61, 62, // mt = unix => - 32, 40, 110, 101, 119, 32, 68, 97, 116, 101, 40, 117, // (new Date(u - 110, 105, 120, 32, 42, 32, 49, 48, 48, 48, 41, 41, // nix * 1000)) - 46, 116, 111, 73, 83, 79, 83, 116, 114, 105, 110, 103, // .toISOString - 40, 41, 46, 115, 117, 98, 115, 116, 114, 40, 49, 52, // ().substr(14 - 44, 32, 53, 41, 59, 10, 32, 32, 108, 101, 116, 32, // , 5);. let - 120, 116, 97, 32, 61, 32, 40, 110, 101, 119, 32, 65, // xta = (new A - 114, 114, 97, 121, 40, 120, 116, 105, 99, 107, 115, 32, // rray(xticks - 43, 32, 49, 41, 41, 46, 102, 105, 108, 108, 40, 48, // + 1)).fill(0 - 41, 46, 109, 97, 112, 40, 40, 95, 44, 32, 105, 41, // ).map((_, i) - 32, 61, 62, 32, 105, 41, 59, 32, 32, 47, 47, 32, // => i); // - 105, 110, 100, 105, 99, 101, 115, 10, 32, 32, 108, 101, // indices. le - 116, 32, 120, 116, 105, 32, 61, 32, 105, 32, 61, 62, // t xti = i => - 32, 119, 49, 32, 43, 32, 40, 119, 32, 45, 32, 119, // w1 + (w - w - 49, 32, 45, 32, 119, 50, 41, 32, 42, 32, 105, 32, // 1 - w2) * i - 47, 32, 120, 116, 105, 99, 107, 115, 59, 32, 32, 32, // / xticks; - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 47, // / - 47, 32, 105, 110, 100, 101, 120, 39, 115, 32, 88, 10, // / index's X. - 32, 32, 108, 101, 116, 32, 120, 116, 118, 32, 61, 32, // let xtv = - 105, 32, 61, 62, 32, 100, 97, 116, 101, 102, 109, 116, // i => datefmt - 40, 120, 109, 105, 110, 32, 43, 32, 40, 120, 109, 97, // (xmin + (xma - 120, 32, 45, 32, 120, 109, 105, 110, 41, 32, 42, 32, // x - xmin) * - 105, 32, 47, 32, 120, 116, 105, 99, 107, 115, 41, 59, // i / xticks); - 10, 32, 32, 108, 101, 116, 32, 120, 116, 108, 32, 61, // . let xtl = - 32, 120, 32, 61, 62, 32, 104, 116, 109, 108, 96, 60, // x => html`< - 112, 97, 116, 104, 32, 100, 61, 34, 77, 32, 36, 123, // path d="M ${ - 120, 125, 44, 36, 123, 104, 49, 125, 32, 76, 32, 36, // x},${h1} L $ - 123, 120, 125, 44, 36, 123, 104, 32, 45, 32, 104, 50, // {x},${h - h2 - 125, 34, 32, 99, 108, 97, 115, 115, 61, 34, 116, 105, // }" class="ti - 99, 107, 34, 47, 62, 96, 59, 10, 32, 32, 108, 101, // ck"/>`;. le - 116, 32, 120, 116, 116, 32, 61, 32, 40, 120, 44, 32, // t xtt = (x, - 118, 41, 32, 61, 62, 10, 32, 32, 32, 32, 32, 32, // v) =>. - 104, 116, 109, 108, 96, 60, 116, 101, 120, 116, 32, 120, // html` - 36, 123, 118, 125, 60, 47, 116, 101, 120, 116, 62, 96, // ${v}` - 59, 10, 10, 32, 32, 47, 47, 32, 84, 114, 97, 110, // ;.. // Tran - 115, 102, 111, 114, 109, 32, 100, 97, 116, 97, 32, 112, // sform data p - 111, 105, 110, 116, 115, 32, 97, 114, 114, 97, 121, 32, // oints array - 105, 110, 116, 111, 32, 99, 111, 111, 114, 100, 105, 110, // into coordin - 97, 116, 101, 10, 32, 32, 108, 101, 116, 32, 100, 120, // ate. let dx - 32, 61, 32, 118, 32, 61, 62, 32, 119, 49, 32, 43, // = v => w1 + - 32, 40, 118, 32, 45, 32, 120, 109, 105, 110, 41, 32, // (v - xmin) - 47, 32, 40, 40, 120, 109, 97, 120, 32, 45, 32, 120, // / ((xmax - x - 109, 105, 110, 41, 32, 124, 124, 32, 49, 41, 32, 42, // min) || 1) * - 32, 40, 119, 32, 45, 32, 119, 49, 32, 45, 32, 119, // (w - w1 - w - 50, 41, 59, 10, 32, 32, 108, 101, 116, 32, 100, 121, // 2);. let dy - 32, 61, 32, 118, 32, 61, 62, 32, 104, 32, 45, 32, // = v => h - - 104, 50, 32, 45, 32, 40, 118, 32, 45, 32, 121, 109, // h2 - (v - ym - 105, 110, 41, 32, 47, 32, 40, 40, 121, 109, 97, 120, // in) / ((ymax - 32, 45, 32, 121, 109, 105, 110, 41, 32, 124, 124, 32, // - ymin) || - 49, 41, 32, 42, 32, 40, 104, 32, 45, 32, 104, 49, // 1) * (h - h1 - 32, 45, 32, 104, 50, 41, 59, 10, 32, 32, 108, 101, // - h2);. le - 116, 32, 100, 100, 32, 61, 32, 100, 97, 116, 97, 46, // t dd = data. - 109, 97, 112, 40, 112, 32, 61, 62, 32, 91, 77, 97, // map(p => [Ma - 116, 104, 46, 114, 111, 117, 110, 100, 40, 100, 120, 40, // th.round(dx( - 112, 91, 48, 93, 41, 41, 44, 32, 77, 97, 116, 104, // p[0])), Math - 46, 114, 111, 117, 110, 100, 40, 100, 121, 40, 112, 91, // .round(dy(p[ - 49, 93, 41, 41, 93, 41, 59, 10, 32, 32, 108, 101, // 1]))]);. le - 116, 32, 100, 100, 108, 32, 61, 32, 100, 100, 46, 108, // t ddl = dd.l - 101, 110, 103, 116, 104, 59, 10, 32, 32, 47, 47, 32, // ength;. // - 65, 110, 100, 32, 112, 108, 111, 116, 32, 116, 104, 101, // And plot the - 32, 100, 97, 116, 97, 32, 97, 115, 32, 60, 112, 97, // data as element. - 32, 32, 108, 101, 116, 32, 98, 101, 103, 105, 110, 48, // let begin0 - 32, 61, 32, 100, 100, 108, 32, 63, 32, 96, 77, 32, // = ddl ? `M - 36, 123, 100, 100, 91, 48, 93, 91, 48, 93, 125, 44, // ${dd[0][0]}, - 36, 123, 100, 100, 91, 48, 93, 91, 49, 93, 125, 96, // ${dd[0][1]}` - 32, 58, 32, 96, 77, 32, 48, 44, 48, 96, 59, 10, // : `M 0,0`;. - 32, 32, 108, 101, 116, 32, 98, 101, 103, 105, 110, 32, // let begin - 61, 32, 96, 77, 32, 36, 123, 119, 49, 125, 44, 36, // = `M ${w1},$ - 123, 104, 32, 45, 32, 104, 50, 125, 96, 59, 32, 32, // {h - h2}`; - 47, 47, 32, 73, 110, 105, 116, 105, 97, 108, 32, 112, // // Initial p - 111, 105, 110, 116, 10, 32, 32, 108, 101, 116, 32, 101, // oint. let e - 110, 100, 32, 61, 32, 100, 100, 108, 32, 63, 32, 96, // nd = ddl ? ` - 76, 32, 36, 123, 100, 100, 91, 100, 100, 108, 32, 45, // L ${dd[ddl - - 32, 49, 93, 91, 48, 93, 125, 44, 36, 123, 104, 32, // 1][0]},${h - 45, 32, 104, 50, 125, 96, 32, 58, 32, 96, 76, 32, // - h2}` : `L - 36, 123, 119, 49, 125, 44, 36, 123, 104, 32, 45, 32, // ${w1},${h - - 104, 50, 125, 96, 59, 10, 32, 32, 108, 101, 116, 32, // h2}`;. let - 115, 101, 114, 105, 101, 115, 32, 61, 32, 100, 100, 108, // series = ddl - 32, 63, 32, 100, 100, 46, 109, 97, 112, 40, 112, 32, // ? dd.map(p - 61, 62, 32, 96, 76, 32, 36, 123, 112, 91, 48, 93, // => `L ${p[0] - 125, 32, 36, 123, 112, 91, 49, 93, 125, 96, 41, 32, // } ${p[1]}`) - 58, 32, 91, 93, 59, 10, 10, 32, 32, 114, 101, 116, // : [];.. ret - 117, 114, 110, 32, 104, 116, 109, 108, 96, 10, 60, 115, // urn html`.. . - 32, 36, 123, 121, 116, 97, 46, 109, 97, 112, 40, 105, // ${yta.map(i - 32, 61, 62, 32, 121, 116, 108, 40, 121, 116, 105, 40, // => ytl(yti( - 105, 41, 41, 41, 125, 10, 32, 32, 36, 123, 121, 116, // i)))}. ${yt - 97, 46, 109, 97, 112, 40, 105, 32, 61, 62, 32, 121, // a.map(i => y - 116, 116, 40, 121, 116, 105, 40, 105, 41, 44, 32, 121, // tt(yti(i), y - 116, 118, 40, 105, 41, 41, 41, 125, 10, 32, 32, 36, // tv(i)))}. $ - 123, 120, 116, 97, 46, 109, 97, 112, 40, 105, 32, 61, // {xta.map(i = - 62, 32, 120, 116, 108, 40, 120, 116, 105, 40, 105, 41, // > xtl(xti(i) - 41, 41, 125, 10, 32, 32, 36, 123, 100, 97, 116, 97, // ))}. ${data - 46, 108, 101, 110, 103, 116, 104, 32, 63, 32, 120, 116, // .length ? xt - 97, 46, 109, 97, 112, 40, 105, 32, 61, 62, 32, 120, // a.map(i => x - 116, 116, 40, 120, 116, 105, 40, 105, 41, 44, 32, 120, // tt(xti(i), x - 116, 118, 40, 105, 41, 41, 41, 32, 58, 32, 39, 39, // tv(i))) : '' - 125, 10, 32, 32, 60, 112, 97, 116, 104, 32, 100, 61, // }. . - 60, 112, 97, 116, 104, 32, 100, 61, 34, 36, 123, 98, // .`;.};... - 99, 111, 110, 115, 116, 32, 67, 104, 97, 114, 116, 32, // const Chart - 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 112, // = function(p - 114, 111, 112, 115, 41, 32, 123, 10, 32, 32, 99, 111, // rops) {. co - 110, 115, 116, 32, 91, 100, 97, 116, 97, 44, 32, 115, // nst [data, s - 101, 116, 68, 97, 116, 97, 93, 32, 61, 32, 117, 115, // etData] = us - 101, 83, 116, 97, 116, 101, 40, 91, 93, 41, 59, 10, // eState([]);. - 32, 32, 117, 115, 101, 69, 102, 102, 101, 99, 116, 40, // useEffect( - 40, 41, 32, 61, 62, 32, 123, 10, 32, 32, 32, 32, // () => {. - 99, 111, 110, 115, 116, 32, 105, 100, 32, 61, 32, 80, // const id = P - 117, 98, 83, 117, 98, 46, 115, 117, 98, 115, 99, 114, // ubSub.subscr - 105, 98, 101, 40, 102, 117, 110, 99, 116, 105, 111, 110, // ibe(function - 40, 109, 115, 103, 41, 32, 123, 10, 32, 32, 32, 32, // (msg) {. - 32, 32, 105, 102, 32, 40, 109, 115, 103, 46, 110, 97, // if (msg.na - 109, 101, 32, 33, 61, 32, 39, 109, 101, 116, 114, 105, // me != 'metri - 99, 115, 39, 41, 32, 114, 101, 116, 117, 114, 110, 59, // cs') return; - 10, 32, 32, 32, 32, 32, 32, 115, 101, 116, 68, 97, // . setDa - 116, 97, 40, 120, 32, 61, 62, 32, 120, 46, 99, 111, // ta(x => x.co - 110, 99, 97, 116, 40, 91, 109, 115, 103, 46, 100, 97, // ncat([msg.da - 116, 97, 93, 41, 46, 115, 112, 108, 105, 99, 101, 40, // ta]).splice( - 45, 77, 97, 120, 77, 101, 116, 114, 105, 99, 115, 68, // -MaxMetricsD - 97, 116, 97, 80, 111, 105, 110, 116, 115, 41, 41, 59, // ataPoints)); - 10, 32, 32, 32, 32, 125, 41, 59, 10, 32, 32, 32, // . });. - 32, 114, 101, 116, 117, 114, 110, 32, 80, 117, 98, 83, // return PubS - 117, 98, 46, 117, 110, 115, 117, 98, 115, 99, 114, 105, // ub.unsubscri - 98, 101, 40, 105, 100, 41, 59, 10, 32, 32, 125, 44, // be(id);. }, - 32, 91, 93, 41, 59, 10, 10, 32, 32, 108, 101, 116, // []);.. let - 32, 120, 109, 97, 120, 32, 61, 32, 48, 44, 32, 109, // xmax = 0, m - 105, 115, 115, 105, 110, 103, 32, 61, 32, 77, 97, 120, // issing = Max - 77, 101, 116, 114, 105, 99, 115, 68, 97, 116, 97, 80, // MetricsDataP - 111, 105, 110, 116, 115, 32, 45, 32, 100, 97, 116, 97, // oints - data - 46, 108, 101, 110, 103, 116, 104, 59, 10, 32, 32, 105, // .length;. i - 102, 32, 40, 109, 105, 115, 115, 105, 110, 103, 32, 62, // f (missing > - 32, 48, 41, 32, 120, 109, 97, 120, 32, 61, 32, 77, // 0) xmax = M - 97, 116, 104, 46, 114, 111, 117, 110, 100, 40, 68, 97, // ath.round(Da - 116, 101, 46, 110, 111, 119, 40, 41, 32, 47, 32, 49, // te.now() / 1 - 48, 48, 48, 41, 32, 43, 32, 109, 105, 115, 115, 105, // 000) + missi - 110, 103, 59, 10, 32, 32, 114, 101, 116, 117, 114, 110, // ng;. return - 32, 104, 116, 109, 108, 96, 10, 60, 100, 105, 118, 32, // html`.
.

Data C - 104, 97, 114, 116, 60, 47, 104, 51, 62, 10, 32, 32, // hart

. - 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, 34, //
. < - 36, 123, 83, 86, 71, 125, 32, 104, 101, 105, 103, 104, // ${SVG} heigh - 116, 61, 50, 52, 48, 32, 119, 105, 100, 116, 104, 61, // t=240 width= - 54, 48, 48, 32, 121, 109, 105, 110, 61, 48, 32, 121, // 600 ymin=0 y - 109, 97, 120, 61, 50, 48, 32, 120, 109, 97, 120, 61, // max=20 xmax= - 36, 123, 120, 109, 97, 120, 125, 32, 100, 97, 116, 97, // ${xmax} data - 61, 36, 123, 100, 97, 116, 97, 125, 32, 47, 62, 10, // =${data} />. - 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, //
. < - 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 109, // div class="m - 115, 103, 34, 62, 10, 32, 32, 32, 32, 84, 104, 105, // sg">. Thi - 115, 32, 99, 104, 97, 114, 116, 32, 112, 108, 111, 116, // s chart plot - 115, 32, 108, 105, 118, 101, 32, 115, 101, 110, 115, 111, // s live senso - 114, 32, 100, 97, 116, 97, 44, 32, 115, 101, 110, 116, // r data, sent - 32, 98, 121, 32, 116, 104, 101, 32, 100, 101, 118, 105, // by the devi - 99, 101, 32, 118, 105, 97, 32, 47, 97, 112, 105, 47, // ce via /api/ - 119, 97, 116, 99, 104, 46, 10, 32, 32, 60, 47, 100, // watch.. .
`; - 10, 125, 59, 10, 10, 99, 111, 110, 115, 116, 32, 65, // .};..const A - 112, 112, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, // pp = functio - 110, 40, 112, 114, 111, 112, 115, 41, 32, 123, 10, 32, // n(props) {. - 32, 99, 111, 110, 115, 116, 32, 91, 117, 115, 101, 114, // const [user - 44, 32, 115, 101, 116, 85, 115, 101, 114, 93, 32, 61, // , setUser] = - 32, 117, 115, 101, 83, 116, 97, 116, 101, 40, 39, 39, // useState('' - 41, 59, 10, 32, 32, 99, 111, 110, 115, 116, 32, 91, // );. const [ - 99, 111, 110, 102, 105, 103, 44, 32, 115, 101, 116, 67, // config, setC - 111, 110, 102, 105, 103, 93, 32, 61, 32, 117, 115, 101, // onfig] = use - 83, 116, 97, 116, 101, 40, 123, 125, 41, 59, 10, 10, // State({});.. - 32, 32, 99, 111, 110, 115, 116, 32, 103, 101, 116, 99, // const getc - 111, 110, 102, 105, 103, 32, 61, 32, 40, 41, 32, 61, // onfig = () = - 62, 10, 32, 32, 32, 32, 32, 32, 102, 101, 116, 99, // >. fetc - 104, 40, 39, 47, 97, 112, 105, 47, 99, 111, 110, 102, // h('/api/conf - 105, 103, 47, 103, 101, 116, 39, 44, 32, 123, 104, 101, // ig/get', {he - 97, 100, 101, 114, 115, 58, 32, 123, 65, 117, 116, 104, // aders: {Auth - 111, 114, 105, 122, 97, 116, 105, 111, 110, 58, 32, 39, // orization: ' - 39, 125, 125, 41, 10, 32, 32, 32, 32, 32, 32, 32, // '}}). - 32, 32, 32, 46, 116, 104, 101, 110, 40, 114, 32, 61, // .then(r = - 62, 32, 114, 46, 106, 115, 111, 110, 40, 41, 41, 10, // > r.json()). - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 116, // .t - 104, 101, 110, 40, 114, 32, 61, 62, 32, 115, 101, 116, // hen(r => set - 67, 111, 110, 102, 105, 103, 40, 114, 41, 41, 10, 32, // Config(r)). - 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 99, 97, // .ca - 116, 99, 104, 40, 101, 114, 114, 32, 61, 62, 32, 99, // tch(err => c - 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 40, 101, // onsole.log(e - 114, 114, 41, 41, 59, 10, 10, 32, 32, 47, 47, 32, // rr));.. // - 87, 97, 116, 99, 104, 32, 102, 111, 114, 32, 110, 111, // Watch for no - 116, 105, 102, 105, 99, 97, 116, 105, 111, 110, 115, 46, // tifications. - 32, 65, 115, 32, 115, 111, 111, 110, 32, 97, 115, 32, // As soon as - 97, 32, 110, 111, 116, 105, 102, 105, 99, 97, 116, 105, // a notificati - 111, 110, 32, 97, 114, 114, 105, 118, 101, 115, 44, 32, // on arrives, - 112, 97, 115, 115, 32, 105, 116, 32, 111, 110, 10, 32, // pass it on. - 32, 47, 47, 32, 116, 111, 32, 97, 108, 108, 32, 115, // // to all s - 117, 98, 115, 99, 114, 105, 98, 101, 100, 32, 99, 111, // ubscribed co - 109, 112, 111, 110, 101, 110, 116, 115, 10, 32, 32, 99, // mponents. c - 111, 110, 115, 116, 32, 119, 97, 116, 99, 104, 32, 61, // onst watch = - 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, 32, // function() - 123, 10, 32, 32, 32, 32, 118, 97, 114, 32, 108, 32, // {. var l - 61, 32, 119, 105, 110, 100, 111, 119, 46, 108, 111, 99, // = window.loc - 97, 116, 105, 111, 110, 44, 32, 112, 114, 111, 116, 111, // ation, proto - 32, 61, 32, 108, 46, 112, 114, 111, 116, 111, 99, 111, // = l.protoco - 108, 46, 114, 101, 112, 108, 97, 99, 101, 40, 39, 104, // l.replace('h - 116, 116, 112, 39, 44, 32, 39, 119, 115, 39, 41, 59, // ttp', 'ws'); - 10, 32, 32, 32, 32, 118, 97, 114, 32, 116, 105, 100, // . var tid - 44, 32, 119, 115, 85, 82, 73, 32, 61, 32, 112, 114, // , wsURI = pr - 111, 116, 111, 32, 43, 32, 39, 47, 47, 39, 32, 43, // oto + '//' + - 32, 108, 46, 104, 111, 115, 116, 32, 43, 32, 39, 47, // l.host + '/ - 97, 112, 105, 47, 119, 97, 116, 99, 104, 39, 10, 32, // api/watch'. - 32, 32, 32, 118, 97, 114, 32, 114, 101, 99, 111, 110, // var recon - 110, 101, 99, 116, 32, 61, 32, 102, 117, 110, 99, 116, // nect = funct - 105, 111, 110, 40, 41, 32, 123, 10, 32, 32, 32, 32, // ion() {. - 32, 32, 118, 97, 114, 32, 119, 115, 32, 61, 32, 110, // var ws = n - 101, 119, 32, 87, 101, 98, 83, 111, 99, 107, 101, 116, // ew WebSocket - 40, 119, 115, 85, 82, 73, 41, 59, 10, 32, 32, 32, // (wsURI);. - 32, 32, 32, 119, 115, 46, 111, 110, 111, 112, 101, 110, // ws.onopen - 32, 61, 32, 40, 41, 32, 61, 62, 32, 99, 111, 110, // = () => con - 115, 111, 108, 101, 46, 108, 111, 103, 40, 39, 119, 115, // sole.log('ws - 32, 99, 111, 110, 110, 101, 99, 116, 101, 100, 39, 41, // connected') - 59, 10, 32, 32, 32, 32, 32, 32, 119, 115, 46, 111, // ;. ws.o - 110, 109, 101, 115, 115, 97, 103, 101, 32, 61, 32, 102, // nmessage = f - 117, 110, 99, 116, 105, 111, 110, 40, 101, 118, 41, 32, // unction(ev) - 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 116, 114, // {. tr - 121, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, // y {. - 32, 32, 118, 97, 114, 32, 109, 115, 103, 32, 61, 32, // var msg = - 74, 83, 79, 78, 46, 112, 97, 114, 115, 101, 40, 101, // JSON.parse(e - 118, 46, 100, 97, 116, 97, 41, 59, 10, 32, 32, 32, // v.data);. - 32, 32, 32, 32, 32, 32, 32, 80, 117, 98, 83, 117, // PubSu - 98, 46, 112, 117, 98, 108, 105, 115, 104, 40, 109, 115, // b.publish(ms + 46, 110, 97, 109, 101, 32, 33, 61, 32, 39, 109, 101, // .name != 'me + 116, 114, 105, 99, 115, 39, 41, 32, 114, 101, 116, 117, // trics') retu + 114, 110, 59, 10, 32, 32, 32, 32, 32, 32, 115, 101, // rn;. se + 116, 68, 97, 116, 97, 40, 120, 32, 61, 62, 32, 120, // tData(x => x + 46, 99, 111, 110, 99, 97, 116, 40, 91, 109, 115, 103, // .concat([msg + 46, 100, 97, 116, 97, 93, 41, 46, 115, 112, 108, 105, // .data]).spli + 99, 101, 40, 45, 77, 97, 120, 77, 101, 116, 114, 105, // ce(-MaxMetri + 99, 115, 68, 97, 116, 97, 80, 111, 105, 110, 116, 115, // csDataPoints + 41, 41, 59, 10, 32, 32, 32, 32, 125, 41, 59, 10, // ));. });. + 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, 32, 80, // return P + 117, 98, 83, 117, 98, 46, 117, 110, 115, 117, 98, 115, // ubSub.unsubs + 99, 114, 105, 98, 101, 40, 105, 100, 41, 59, 10, 32, // cribe(id);. + 32, 125, 44, 32, 91, 93, 41, 59, 10, 10, 32, 32, // }, []);.. + 108, 101, 116, 32, 120, 109, 97, 120, 32, 61, 32, 48, // let xmax = 0 + 44, 32, 109, 105, 115, 115, 105, 110, 103, 32, 61, 32, // , missing = + 77, 97, 120, 77, 101, 116, 114, 105, 99, 115, 68, 97, // MaxMetricsDa + 116, 97, 80, 111, 105, 110, 116, 115, 32, 45, 32, 100, // taPoints - d + 97, 116, 97, 46, 108, 101, 110, 103, 116, 104, 59, 10, // ata.length;. + 32, 32, 105, 102, 32, 40, 109, 105, 115, 115, 105, 110, // if (missin + 103, 32, 62, 32, 48, 41, 32, 120, 109, 97, 120, 32, // g > 0) xmax + 61, 32, 77, 97, 116, 104, 46, 114, 111, 117, 110, 100, // = Math.round + 40, 68, 97, 116, 101, 46, 110, 111, 119, 40, 41, 32, // (Date.now() + 47, 32, 49, 48, 48, 48, 41, 32, 43, 32, 109, 105, // / 1000) + mi + 115, 115, 105, 110, 103, 59, 10, 32, 32, 114, 101, 116, // ssing;. ret + 117, 114, 110, 32, 104, 116, 109, 108, 96, 10, 60, 100, // urn html`.. Dat + 97, 32, 67, 104, 97, 114, 116, 60, 47, 104, 51, 62, // a Chart + 10, 32, 32, 60, 100, 105, 118, 32, 115, 116, 121, 108, // .
. + 32, 32, 60, 36, 123, 83, 86, 71, 125, 32, 104, 101, // <${SVG} he + 105, 103, 104, 116, 61, 50, 52, 48, 32, 119, 105, 100, // ight=240 wid + 116, 104, 61, 54, 48, 48, 32, 121, 109, 105, 110, 61, // th=600 ymin= + 48, 32, 121, 109, 97, 120, 61, 50, 48, 32, 120, 109, // 0 ymax=20 xm + 97, 120, 61, 36, 123, 120, 109, 97, 120, 125, 32, 100, // ax=${xmax} d + 97, 116, 97, 61, 36, 123, 100, 97, 116, 97, 125, 32, // ata=${data} + 47, 62, 10, 32, 32, 60, 47, 100, 105, 118, 62, 10, // />.
. + 32, 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, //
. + 84, 104, 105, 115, 32, 99, 104, 97, 114, 116, 32, 112, // This chart p + 108, 111, 116, 115, 32, 108, 105, 118, 101, 32, 115, 101, // lots live se + 110, 115, 111, 114, 32, 100, 97, 116, 97, 44, 32, 115, // nsor data, s + 101, 110, 116, 32, 98, 121, 32, 116, 104, 101, 32, 100, // ent by the d + 101, 118, 105, 99, 101, 32, 118, 105, 97, 32, 47, 97, // evice via /a + 112, 105, 47, 119, 97, 116, 99, 104, 46, 10, 32, 32, // pi/watch.. + 60, 47, 100, 105, 118, 62, 10, 60, 47, 100, 105, 118, //
.
`;.};..cons + 116, 32, 65, 112, 112, 32, 61, 32, 102, 117, 110, 99, // t App = func + 116, 105, 111, 110, 40, 112, 114, 111, 112, 115, 41, 32, // tion(props) + 123, 10, 32, 32, 99, 111, 110, 115, 116, 32, 91, 117, // {. const [u + 115, 101, 114, 44, 32, 115, 101, 116, 85, 115, 101, 114, // ser, setUser + 93, 32, 61, 32, 117, 115, 101, 83, 116, 97, 116, 101, // ] = useState + 40, 39, 39, 41, 59, 10, 32, 32, 99, 111, 110, 115, // ('');. cons + 116, 32, 91, 99, 111, 110, 102, 105, 103, 44, 32, 115, // t [config, s + 101, 116, 67, 111, 110, 102, 105, 103, 93, 32, 61, 32, // etConfig] = + 117, 115, 101, 83, 116, 97, 116, 101, 40, 123, 125, 41, // useState({}) + 59, 10, 10, 32, 32, 99, 111, 110, 115, 116, 32, 103, // ;.. const g + 101, 116, 99, 111, 110, 102, 105, 103, 32, 61, 32, 40, // etconfig = ( + 41, 32, 61, 62, 10, 32, 32, 32, 32, 32, 32, 102, // ) =>. f + 101, 116, 99, 104, 40, 39, 47, 97, 112, 105, 47, 99, // etch('/api/c + 111, 110, 102, 105, 103, 47, 103, 101, 116, 39, 44, 32, // onfig/get', + 123, 104, 101, 97, 100, 101, 114, 115, 58, 32, 123, 65, // {headers: {A + 117, 116, 104, 111, 114, 105, 122, 97, 116, 105, 111, 110, // uthorization + 58, 32, 39, 39, 125, 125, 41, 10, 32, 32, 32, 32, // : ''}}). + 32, 32, 32, 32, 32, 32, 46, 116, 104, 101, 110, 40, // .then( + 114, 32, 61, 62, 32, 114, 46, 106, 115, 111, 110, 40, // r => r.json( + 41, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, // )). + 32, 46, 116, 104, 101, 110, 40, 114, 32, 61, 62, 32, // .then(r => + 115, 101, 116, 67, 111, 110, 102, 105, 103, 40, 114, 41, // setConfig(r) + 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // ). + 46, 99, 97, 116, 99, 104, 40, 101, 114, 114, 32, 61, // .catch(err = + 62, 32, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, // > console.lo + 103, 40, 101, 114, 114, 41, 41, 59, 10, 10, 32, 32, // g(err));.. + 47, 47, 32, 87, 97, 116, 99, 104, 32, 102, 111, 114, // // Watch for + 32, 110, 111, 116, 105, 102, 105, 99, 97, 116, 105, 111, // notificatio + 110, 115, 46, 32, 65, 115, 32, 115, 111, 111, 110, 32, // ns. As soon + 97, 115, 32, 97, 32, 110, 111, 116, 105, 102, 105, 99, // as a notific + 97, 116, 105, 111, 110, 32, 97, 114, 114, 105, 118, 101, // ation arrive + 115, 44, 32, 112, 97, 115, 115, 32, 105, 116, 32, 111, // s, pass it o + 110, 10, 32, 32, 47, 47, 32, 116, 111, 32, 97, 108, // n. // to al + 108, 32, 115, 117, 98, 115, 99, 114, 105, 98, 101, 100, // l subscribed + 32, 99, 111, 109, 112, 111, 110, 101, 110, 116, 115, 10, // components. + 32, 32, 99, 111, 110, 115, 116, 32, 119, 97, 116, 99, // const watc + 104, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, // h = function + 40, 41, 32, 123, 10, 32, 32, 32, 32, 118, 97, 114, // () {. var + 32, 108, 32, 61, 32, 119, 105, 110, 100, 111, 119, 46, // l = window. + 108, 111, 99, 97, 116, 105, 111, 110, 44, 32, 112, 114, // location, pr + 111, 116, 111, 32, 61, 32, 108, 46, 112, 114, 111, 116, // oto = l.prot + 111, 99, 111, 108, 46, 114, 101, 112, 108, 97, 99, 101, // ocol.replace + 40, 39, 104, 116, 116, 112, 39, 44, 32, 39, 119, 115, // ('http', 'ws + 39, 41, 59, 10, 32, 32, 32, 32, 118, 97, 114, 32, // ');. var + 116, 105, 100, 44, 32, 119, 115, 85, 82, 73, 32, 61, // tid, wsURI = + 32, 112, 114, 111, 116, 111, 32, 43, 32, 39, 47, 47, // proto + '// + 39, 32, 43, 32, 108, 46, 104, 111, 115, 116, 32, 43, // ' + l.host + + 32, 39, 47, 97, 112, 105, 47, 119, 97, 116, 99, 104, // '/api/watch + 39, 10, 32, 32, 32, 32, 118, 97, 114, 32, 114, 101, // '. var re + 99, 111, 110, 110, 101, 99, 116, 32, 61, 32, 102, 117, // connect = fu + 110, 99, 116, 105, 111, 110, 40, 41, 32, 123, 10, 32, // nction() {. + 32, 32, 32, 32, 32, 118, 97, 114, 32, 119, 115, 32, // var ws + 61, 32, 110, 101, 119, 32, 87, 101, 98, 83, 111, 99, // = new WebSoc + 107, 101, 116, 40, 119, 115, 85, 82, 73, 41, 59, 10, // ket(wsURI);. + 32, 32, 32, 32, 32, 32, 47, 47, 32, 119, 115, 46, // // ws. + 111, 110, 111, 112, 101, 110, 32, 61, 32, 40, 41, 32, // onopen = () + 61, 62, 32, 99, 111, 110, 115, 111, 108, 101, 46, 108, // => console.l + 111, 103, 40, 39, 119, 115, 32, 99, 111, 110, 110, 101, // og('ws conne + 99, 116, 101, 100, 39, 41, 59, 10, 32, 32, 32, 32, // cted');. + 32, 32, 119, 115, 46, 111, 110, 109, 101, 115, 115, 97, // ws.onmessa + 103, 101, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, // ge = functio + 110, 40, 101, 118, 41, 32, 123, 10, 32, 32, 32, 32, // n(ev) {. + 32, 32, 32, 32, 116, 114, 121, 32, 123, 10, 32, 32, // try {. + 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, // var + 109, 115, 103, 32, 61, 32, 74, 83, 79, 78, 46, 112, // msg = JSON.p + 97, 114, 115, 101, 40, 101, 118, 46, 100, 97, 116, 97, // arse(ev.data + 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, // );. + 32, 80, 117, 98, 83, 117, 98, 46, 112, 117, 98, 108, // PubSub.publ + 105, 115, 104, 40, 109, 115, 103, 41, 59, 10, 32, 32, // ish(msg);. + 32, 32, 32, 32, 32, 32, 32, 32, 47, 47, 32, 105, // // i + 102, 32, 40, 109, 115, 103, 46, 110, 97, 109, 101, 32, // f (msg.name + 33, 61, 32, 39, 109, 101, 116, 114, 105, 99, 115, 39, // != 'metrics' + 41, 32, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, // ) console.lo + 103, 40, 39, 119, 115, 45, 62, 39, 44, 32, 109, 115, // g('ws->', ms 103, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, // g);. - 32, 32, 105, 102, 32, 40, 109, 115, 103, 46, 110, 97, // if (msg.na - 109, 101, 32, 33, 61, 32, 39, 109, 101, 116, 114, 105, // me != 'metri - 99, 115, 39, 41, 32, 99, 111, 110, 115, 111, 108, 101, // cs') console - 46, 108, 111, 103, 40, 39, 119, 115, 45, 62, 39, 44, // .log('ws->', - 32, 109, 115, 103, 41, 59, 10, 32, 32, 32, 32, 32, // msg);. - 32, 32, 32, 125, 32, 99, 97, 116, 99, 104, 32, 40, // } catch ( - 101, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, // e) {. - 32, 32, 32, 99, 111, 110, 115, 111, 108, 101, 46, 108, // console.l - 111, 103, 40, 39, 73, 110, 118, 97, 108, 105, 100, 32, // og('Invalid - 119, 115, 32, 102, 114, 97, 109, 101, 58, 39, 44, 32, // ws frame:', - 101, 118, 46, 100, 97, 116, 97, 41, 59, 32, 32, 47, // ev.data); / - 47, 32, 101, 115, 108, 105, 110, 116, 45, 100, 105, 115, // / eslint-dis - 97, 98, 108, 101, 45, 108, 105, 110, 101, 10, 32, 32, // able-line. - 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, // }. - 32, 32, 125, 59, 10, 32, 32, 32, 32, 32, 32, 119, // };. w - 115, 46, 111, 110, 99, 108, 111, 115, 101, 32, 61, 32, // s.onclose = - 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, 32, 123, // function() { - 10, 32, 32, 32, 32, 32, 32, 32, 32, 99, 108, 101, // . cle - 97, 114, 84, 105, 109, 101, 111, 117, 116, 40, 116, 105, // arTimeout(ti - 100, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, // d);. - 116, 105, 100, 32, 61, 32, 115, 101, 116, 84, 105, 109, // tid = setTim - 101, 111, 117, 116, 40, 114, 101, 99, 111, 110, 110, 101, // eout(reconne - 99, 116, 44, 32, 49, 48, 48, 48, 41, 59, 10, 32, // ct, 1000);. - 32, 32, 32, 32, 32, 32, 32, 99, 111, 110, 115, 111, // conso - 108, 101, 46, 108, 111, 103, 40, 39, 119, 115, 32, 100, // le.log('ws d - 105, 115, 99, 111, 110, 110, 101, 99, 116, 101, 100, 39, // isconnected' - 41, 59, 10, 32, 32, 32, 32, 32, 32, 125, 59, 10, // );. };. - 32, 32, 32, 32, 125, 59, 10, 32, 32, 32, 32, 114, // };. r - 101, 99, 111, 110, 110, 101, 99, 116, 40, 41, 59, 10, // econnect();. - 32, 32, 125, 59, 10, 10, 32, 32, 99, 111, 110, 115, // };.. cons - 116, 32, 108, 111, 103, 105, 110, 32, 61, 32, 102, 117, // t login = fu - 110, 99, 116, 105, 111, 110, 40, 117, 41, 32, 123, 10, // nction(u) {. - 32, 32, 32, 32, 100, 111, 99, 117, 109, 101, 110, 116, // document - 46, 99, 111, 111, 107, 105, 101, 32, 61, 32, 96, 97, // .cookie = `a - 99, 99, 101, 115, 115, 95, 116, 111, 107, 101, 110, 61, // ccess_token= - 36, 123, 117, 46, 116, 111, 107, 101, 110, 125, 59, 112, // ${u.token};p - 97, 116, 104, 61, 47, 59, 109, 97, 120, 45, 97, 103, // ath=/;max-ag - 101, 61, 51, 54, 48, 48, 96, 59, 10, 32, 32, 32, // e=3600`;. - 32, 115, 101, 116, 85, 115, 101, 114, 40, 117, 46, 117, // setUser(u.u - 115, 101, 114, 41, 59, 10, 32, 32, 32, 32, 119, 97, // ser);. wa - 116, 99, 104, 40, 41, 59, 10, 32, 32, 32, 32, 114, // tch();. r - 101, 116, 117, 114, 110, 32, 103, 101, 116, 99, 111, 110, // eturn getcon - 102, 105, 103, 40, 41, 59, 10, 32, 32, 125, 59, 10, // fig();. };. - 10, 32, 32, 99, 111, 110, 115, 116, 32, 108, 111, 103, // . const log - 111, 117, 116, 32, 61, 32, 101, 118, 32, 61, 62, 32, // out = ev => - 123, 10, 32, 32, 32, 32, 100, 111, 99, 117, 109, 101, // {. docume - 110, 116, 46, 99, 111, 111, 107, 105, 101, 32, 61, 32, // nt.cookie = - 96, 97, 99, 99, 101, 115, 115, 95, 116, 111, 107, 101, // `access_toke - 110, 61, 59, 112, 97, 116, 104, 61, 47, 59, 109, 97, // n=;path=/;ma - 120, 45, 97, 103, 101, 61, 48, 96, 59, 10, 32, 32, // x-age=0`;. - 32, 32, 115, 101, 116, 85, 115, 101, 114, 40, 39, 39, // setUser('' - 41, 59, 10, 32, 32, 125, 59, 10, 10, 32, 32, 117, // );. };.. u - 115, 101, 69, 102, 102, 101, 99, 116, 40, 40, 41, 32, // seEffect(() - 61, 62, 32, 123, 10, 32, 32, 32, 32, 47, 47, 32, // => {. // - 67, 97, 108, 108, 101, 100, 32, 111, 110, 99, 101, 32, // Called once - 97, 116, 32, 105, 110, 105, 116, 32, 116, 105, 109, 101, // at init time - 10, 32, 32, 32, 32, 80, 117, 98, 83, 117, 98, 46, // . PubSub. - 115, 117, 98, 115, 99, 114, 105, 98, 101, 40, 109, 115, // subscribe(ms - 103, 32, 61, 62, 32, 109, 115, 103, 46, 110, 97, 109, // g => msg.nam - 101, 32, 61, 61, 32, 39, 99, 111, 110, 102, 105, 103, // e == 'config - 39, 32, 38, 38, 32, 103, 101, 116, 99, 111, 110, 102, // ' && getconf - 105, 103, 40, 41, 41, 59, 10, 32, 32, 32, 32, 102, // ig());. f - 101, 116, 99, 104, 40, 39, 47, 97, 112, 105, 47, 108, // etch('/api/l - 111, 103, 105, 110, 39, 44, 32, 123, 104, 101, 97, 100, // ogin', {head - 101, 114, 115, 58, 32, 123, 65, 117, 116, 104, 111, 114, // ers: {Author - 105, 122, 97, 116, 105, 111, 110, 58, 32, 39, 39, 125, // ization: ''} - 125, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 46, // }). . - 116, 104, 101, 110, 40, 114, 32, 61, 62, 32, 114, 46, // then(r => r. - 106, 115, 111, 110, 40, 41, 41, 10, 32, 32, 32, 32, // json()). - 32, 32, 32, 32, 46, 116, 104, 101, 110, 40, 114, 32, // .then(r - 61, 62, 32, 108, 111, 103, 105, 110, 40, 114, 41, 41, // => login(r)) - 10, 32, 32, 32, 32, 32, 32, 32, 32, 46, 99, 97, // . .ca - 116, 99, 104, 40, 101, 114, 114, 32, 61, 62, 32, 115, // tch(err => s - 101, 116, 85, 115, 101, 114, 40, 39, 39, 41, 41, 59, // etUser('')); - 10, 32, 32, 125, 44, 32, 91, 93, 41, 59, 10, 10, // . }, []);.. - 32, 32, 105, 102, 32, 40, 33, 117, 115, 101, 114, 41, // if (!user) - 32, 114, 101, 116, 117, 114, 110, 32, 104, 116, 109, 108, // return html - 96, 60, 36, 123, 76, 111, 103, 105, 110, 125, 32, 108, // `<${Login} l - 111, 103, 105, 110, 61, 36, 123, 108, 111, 103, 105, 110, // ogin=${login - 125, 32, 47, 62, 96, 59, 10, 10, 32, 32, 114, 101, // } />`;.. re - 116, 117, 114, 110, 32, 104, 116, 109, 108, 96, 10, 60, // turn html`.< - 36, 123, 78, 97, 118, 125, 32, 117, 115, 101, 114, 61, // ${Nav} user= - 36, 123, 117, 115, 101, 114, 125, 32, 108, 111, 103, 111, // ${user} logo - 117, 116, 61, 36, 123, 108, 111, 103, 111, 117, 116, 125, // ut=${logout} - 32, 47, 62, 10, 60, 100, 105, 118, 32, 99, 108, 97, // />.
.
. - 32, 32, 32, 32, 60, 100, 105, 118, 32, 99, 108, 97, //
<${Hero} - 47, 62, 60, 47, 100, 105, 118, 62, 10, 32, 32, 32, // />
. + 125, 32, 99, 97, 116, 99, 104, 32, 40, 101, 41, 32, // } catch (e) + 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // {. + 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 40, // console.log( + 39, 73, 110, 118, 97, 108, 105, 100, 32, 119, 115, 32, // 'Invalid ws + 102, 114, 97, 109, 101, 58, 39, 44, 32, 101, 118, 46, // frame:', ev. + 100, 97, 116, 97, 41, 59, 32, 32, 47, 47, 32, 101, // data); // e + 115, 108, 105, 110, 116, 45, 100, 105, 115, 97, 98, 108, // slint-disabl + 101, 45, 108, 105, 110, 101, 10, 32, 32, 32, 32, 32, // e-line. + 32, 32, 32, 125, 10, 32, 32, 32, 32, 32, 32, 125, // }. } + 59, 10, 32, 32, 32, 32, 32, 32, 119, 115, 46, 111, // ;. ws.o + 110, 99, 108, 111, 115, 101, 32, 61, 32, 102, 117, 110, // nclose = fun + 99, 116, 105, 111, 110, 40, 41, 32, 123, 10, 32, 32, // ction() {. + 32, 32, 32, 32, 32, 32, 99, 108, 101, 97, 114, 84, // clearT + 105, 109, 101, 111, 117, 116, 40, 116, 105, 100, 41, 59, // imeout(tid); + 10, 32, 32, 32, 32, 32, 32, 32, 32, 116, 105, 100, // . tid + 32, 61, 32, 115, 101, 116, 84, 105, 109, 101, 111, 117, // = setTimeou + 116, 40, 114, 101, 99, 111, 110, 110, 101, 99, 116, 44, // t(reconnect, + 32, 49, 48, 48, 48, 41, 59, 10, 32, 32, 32, 32, // 1000);. + 32, 32, 32, 32, 99, 111, 110, 115, 111, 108, 101, 46, // console. + 108, 111, 103, 40, 39, 119, 115, 32, 100, 105, 115, 99, // log('ws disc + 111, 110, 110, 101, 99, 116, 101, 100, 39, 41, 59, 10, // onnected');. + 32, 32, 32, 32, 32, 32, 125, 59, 10, 32, 32, 32, // };. + 32, 125, 59, 10, 32, 32, 32, 32, 114, 101, 99, 111, // };. reco + 110, 110, 101, 99, 116, 40, 41, 59, 10, 32, 32, 125, // nnect();. } + 59, 10, 10, 32, 32, 99, 111, 110, 115, 116, 32, 108, // ;.. const l + 111, 103, 105, 110, 32, 61, 32, 102, 117, 110, 99, 116, // ogin = funct + 105, 111, 110, 40, 117, 41, 32, 123, 10, 32, 32, 32, // ion(u) {. + 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 99, 111, // document.co + 111, 107, 105, 101, 32, 61, 32, 96, 97, 99, 99, 101, // okie = `acce + 115, 115, 95, 116, 111, 107, 101, 110, 61, 36, 123, 117, // ss_token=${u + 46, 116, 111, 107, 101, 110, 125, 59, 112, 97, 116, 104, // .token};path + 61, 47, 59, 109, 97, 120, 45, 97, 103, 101, 61, 51, // =/;max-age=3 + 54, 48, 48, 96, 59, 10, 32, 32, 32, 32, 115, 101, // 600`;. se + 116, 85, 115, 101, 114, 40, 117, 46, 117, 115, 101, 114, // tUser(u.user + 41, 59, 10, 32, 32, 32, 32, 119, 97, 116, 99, 104, // );. watch + 40, 41, 59, 10, 32, 32, 32, 32, 114, 101, 116, 117, // ();. retu + 114, 110, 32, 103, 101, 116, 99, 111, 110, 102, 105, 103, // rn getconfig + 40, 41, 59, 10, 32, 32, 125, 59, 10, 10, 32, 32, // ();. };.. + 99, 111, 110, 115, 116, 32, 108, 111, 103, 111, 117, 116, // const logout + 32, 61, 32, 101, 118, 32, 61, 62, 32, 123, 10, 32, // = ev => {. + 32, 32, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, // document. + 99, 111, 111, 107, 105, 101, 32, 61, 32, 96, 97, 99, // cookie = `ac + 99, 101, 115, 115, 95, 116, 111, 107, 101, 110, 61, 59, // cess_token=; + 112, 97, 116, 104, 61, 47, 59, 109, 97, 120, 45, 97, // path=/;max-a + 103, 101, 61, 48, 96, 59, 10, 32, 32, 32, 32, 115, // ge=0`;. s + 101, 116, 85, 115, 101, 114, 40, 39, 39, 41, 59, 10, // etUser('');. + 32, 32, 125, 59, 10, 10, 32, 32, 117, 115, 101, 69, // };.. useE + 102, 102, 101, 99, 116, 40, 40, 41, 32, 61, 62, 32, // ffect(() => + 123, 10, 32, 32, 32, 32, 47, 47, 32, 67, 97, 108, // {. // Cal + 108, 101, 100, 32, 111, 110, 99, 101, 32, 97, 116, 32, // led once at + 105, 110, 105, 116, 32, 116, 105, 109, 101, 10, 32, 32, // init time. + 32, 32, 80, 117, 98, 83, 117, 98, 46, 115, 117, 98, // PubSub.sub + 115, 99, 114, 105, 98, 101, 40, 109, 115, 103, 32, 61, // scribe(msg = + 62, 32, 109, 115, 103, 46, 110, 97, 109, 101, 32, 61, // > msg.name = + 61, 32, 39, 99, 111, 110, 102, 105, 103, 39, 32, 38, // = 'config' & + 38, 32, 103, 101, 116, 99, 111, 110, 102, 105, 103, 40, // & getconfig( + 41, 41, 59, 10, 32, 32, 32, 32, 102, 101, 116, 99, // ));. fetc + 104, 40, 39, 47, 97, 112, 105, 47, 108, 111, 103, 105, // h('/api/logi + 110, 39, 44, 32, 123, 104, 101, 97, 100, 101, 114, 115, // n', {headers + 58, 32, 123, 65, 117, 116, 104, 111, 114, 105, 122, 97, // : {Authoriza + 116, 105, 111, 110, 58, 32, 39, 39, 125, 125, 41, 10, // tion: ''}}). + 32, 32, 32, 32, 32, 32, 32, 32, 46, 116, 104, 101, // .the + 110, 40, 114, 32, 61, 62, 32, 114, 46, 106, 115, 111, // n(r => r.jso + 110, 40, 41, 41, 10, 32, 32, 32, 32, 32, 32, 32, // n()). + 32, 46, 116, 104, 101, 110, 40, 114, 32, 61, 62, 32, // .then(r => + 108, 111, 103, 105, 110, 40, 114, 41, 41, 10, 32, 32, // login(r)). + 32, 32, 32, 32, 32, 32, 46, 99, 97, 116, 99, 104, // .catch + 40, 101, 114, 114, 32, 61, 62, 32, 115, 101, 116, 85, // (err => setU + 115, 101, 114, 40, 39, 39, 41, 41, 59, 10, 32, 32, // ser(''));. + 125, 44, 32, 91, 93, 41, 59, 10, 10, 32, 32, 105, // }, []);.. i + 102, 32, 40, 33, 117, 115, 101, 114, 41, 32, 114, 101, // f (!user) re + 116, 117, 114, 110, 32, 104, 116, 109, 108, 96, 60, 36, // turn html`<$ + 123, 76, 111, 103, 105, 110, 125, 32, 108, 111, 103, 105, // {Login} logi + 110, 61, 36, 123, 108, 111, 103, 105, 110, 125, 32, 47, // n=${login} / + 62, 96, 59, 10, 10, 32, 32, 114, 101, 116, 117, 114, // >`;.. retur + 110, 32, 104, 116, 109, 108, 96, 10, 60, 36, 123, 78, // n html`.<${N + 97, 118, 125, 32, 117, 115, 101, 114, 61, 36, 123, 117, // av} user=${u + 115, 101, 114, 125, 32, 108, 111, 103, 111, 117, 116, 61, // ser} logout= + 36, 123, 108, 111, 103, 111, 117, 116, 125, 32, 47, 62, // ${logout} /> + 10, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, // .
+ 10, 32, 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, // .
. 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, //
- 60, 36, 123, 67, 104, 97, 114, 116, 125, 32, 47, 62, // <${Chart} /> - 60, 47, 100, 105, 118, 62, 10, 32, 32, 32, 32, 60, //
. < - 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 99, // div class="c - 111, 108, 32, 99, 111, 108, 45, 54, 34, 62, 10, 32, // ol col-6">. - 32, 32, 32, 32, 32, 36, 123, 117, 115, 101, 114, 32, // ${user - 61, 61, 32, 39, 97, 100, 109, 105, 110, 39, 32, 38, // == 'admin' & - 38, 32, 104, 40, 67, 111, 110, 102, 105, 103, 117, 114, // & h(Configur - 97, 116, 105, 111, 110, 44, 32, 123, 99, 111, 110, 102, // ation, {conf - 105, 103, 125, 41, 125, 10, 32, 32, 32, 32, 60, 47, // ig})}. . <${M - 101, 115, 115, 97, 103, 101, 115, 125, 32, 99, 111, 110, // essages} con - 102, 105, 103, 61, 36, 123, 99, 111, 110, 102, 105, 103, // fig=${config - 125, 32, 47, 62, 60, 47, 100, 105, 118, 62, 10, 32, // } />
. - 32, 60, 47, 100, 105, 118, 62, 10, 60, 47, 100, 105, //
.`;.};..win - 100, 111, 119, 46, 111, 110, 108, 111, 97, 100, 32, 61, // dow.onload = - 32, 40, 41, 32, 61, 62, 32, 114, 101, 110, 100, 101, // () => rende - 114, 40, 104, 40, 65, 112, 112, 41, 44, 32, 100, 111, // r(h(App), do - 99, 117, 109, 101, 110, 116, 46, 98, 111, 100, 121, 41, // cument.body) - 59, 10, 0 // ;. + 60, 36, 123, 72, 101, 114, 111, 125, 32, 47, 62, 60, // <${Hero} />< + 47, 100, 105, 118, 62, 10, 32, 32, 32, 32, 60, 100, // /div>. <${ + 67, 104, 97, 114, 116, 125, 32, 47, 62, 60, 47, 100, // Chart} />.
. + 32, 32, 36, 123, 117, 115, 101, 114, 32, 61, 61, 32, // ${user == + 39, 97, 100, 109, 105, 110, 39, 32, 38, 38, 32, 104, // 'admin' && h + 40, 67, 111, 110, 102, 105, 103, 117, 114, 97, 116, 105, // (Configurati + 111, 110, 44, 32, 123, 99, 111, 110, 102, 105, 103, 125, // on, {config} + 41, 125, 10, 32, 32, 32, 32, 60, 47, 100, 105, 118, // )}.
.
<${Mess + 97, 103, 101, 115, 125, 32, 99, 111, 110, 102, 105, 103, // ages} config + 61, 36, 123, 99, 111, 110, 102, 105, 103, 125, 32, 47, // =${config} / + 62, 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, 47, // >
. .
` + 59, 10, 125, 59, 10, 10, 119, 105, 110, 100, 111, 119, // ;.};..window + 46, 111, 110, 108, 111, 97, 100, 32, 61, 32, 40, 41, // .onload = () + 32, 61, 62, 32, 114, 101, 110, 100, 101, 114, 40, 104, // => render(h + 40, 65, 112, 112, 41, 44, 32, 100, 111, 99, 117, 109, // (App), docum + 101, 110, 116, 46, 98, 111, 100, 121, 41, 59, 10, 0 // ent.body);. }; static const unsigned char v3[] = { 118, 97, 114, 32, 101, 44, 110, 44, 95, 44, 116, 44, // var e,n,_,t, @@ -2796,7 +2796,7 @@ static const struct packed_file { time_t mtime; } packed_files[] = { {"/web_root/index.html", v1, sizeof(v1), 1659483223}, - {"/web_root/main.js", v2, sizeof(v2), 1659483223}, + {"/web_root/main.js", v2, sizeof(v2), 1660395584}, {"/web_root/preact.min.js", v3, sizeof(v3), 1659483223}, {"/web_root/style.css", v4, sizeof(v4), 1659483223}, {"/web_root/user.png", v5, sizeof(v5), 1659483223}, diff --git a/examples/device-dashboard/web_root/main.js b/examples/device-dashboard/web_root/main.js index 5ec6ed37..010bb7ae 100644 --- a/examples/device-dashboard/web_root/main.js +++ b/examples/device-dashboard/web_root/main.js @@ -119,7 +119,7 @@ const Configuration = function(props) { const updatepub = ev => update('pub', pub); const updatesub = ev => update('sub', sub); - console.log(props, [url, pub, sub]); + // console.log(props, [url, pub, sub]); return html`

@@ -319,12 +319,12 @@ const App = function(props) { var tid, wsURI = proto + '//' + l.host + '/api/watch' var reconnect = function() { var ws = new WebSocket(wsURI); - ws.onopen = () => console.log('ws connected'); + // ws.onopen = () => console.log('ws connected'); ws.onmessage = function(ev) { try { var msg = JSON.parse(ev.data); PubSub.publish(msg); - if (msg.name != 'metrics') console.log('ws->', msg); + // if (msg.name != 'metrics') console.log('ws->', msg); } catch (e) { console.log('Invalid ws frame:', ev.data); // eslint-disable-line } diff --git a/examples/webui-login/main.c b/examples/webui-login/main.c index e651eadf..bf6dd838 100644 --- a/examples/webui-login/main.c +++ b/examples/webui-login/main.c @@ -49,7 +49,7 @@ void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { struct user *u = getuser(hm); if (u == NULL && mg_http_match_uri(hm, "/api/#")) { // All URIs starting with /api/ must be authenticated - mg_printf(c, "%s", "HTTP/1.1 403 Denied\r\nContent-Length: 0\r\n\r\n"); + mg_http_reply(c, 403, "", "Denied\n"); } else if (mg_http_match_uri(hm, "/api/data")) { mg_http_reply(c, 200, "Content-Type: application/json\r\n", "{%Q:%Q,%Q:%Q}\n", "text", "Hello!", "data", "somedata"); diff --git a/examples/webui-plain/main.c b/examples/webui-plain/main.c index cc91674a..a80cf330 100644 --- a/examples/webui-plain/main.c +++ b/examples/webui-plain/main.c @@ -43,7 +43,7 @@ static void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { update_config(json, "$.url", &s_config.url); update_config(json, "$.pub", &s_config.pub); update_config(json, "$.sub", &s_config.sub); - mg_printf(c, "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"); + mg_http_reply(c, 200, "", "ok\n"); } else { struct mg_http_serve_opts opts = {.root_dir = s_root_dir}; mg_http_serve_dir(c, ev_data, &opts);