From 376e5ccaae7f802b6066360289c6183100dbd8ca Mon Sep 17 00:00:00 2001 From: cpq Date: Thu, 2 Nov 2023 09:25:38 +0000 Subject: [PATCH] Single bank OTA --- examples/device-dashboard/net.c | 10 + examples/device-dashboard/packed_fs.c | 3033 +++++++++-------- .../device-dashboard/web_root/components.js | 34 +- examples/device-dashboard/web_root/main.css | 2 +- examples/device-dashboard/web_root/main.js | 41 +- .../main.c | 18 +- .../Makefile | 1 + .../hal.h | 20 +- .../link.ld | 14 +- .../main.c | 19 +- .../mongoose_custom.h | 2 + .../main.c | 19 +- mongoose.c | 262 +- mongoose.h | 65 +- src/arch.h | 30 +- src/arch_win32.h | 1 + src/device.h | 2 +- src/device_flash.c | 68 +- src/device_stm32h5.c | 11 +- src/device_stm32h7.c | 59 +- src/log.c | 32 +- src/log.h | 17 +- src/ota.h | 11 +- src/ota_dummy.c | 2 + src/ota_flash.c | 96 +- src/util.h | 4 +- 26 files changed, 2065 insertions(+), 1808 deletions(-) diff --git a/examples/device-dashboard/net.c b/examples/device-dashboard/net.c index 9155964ed7..484ee6fba5 100644 --- a/examples/device-dashboard/net.c +++ b/examples/device-dashboard/net.c @@ -255,6 +255,14 @@ static void handle_device_reset(struct mg_connection *c) { mg_timer_add(c->mgr, 500, 0, (void (*)(void *)) mg_device_reset, NULL); } +static void handle_device_eraselast(struct mg_connection *c) { + size_t ss = mg_flash_sector_size(), size = mg_flash_size(); + char *base = (char *) mg_flash_start(), *last = base + size - ss; + if (mg_flash_bank() == 2) last -= size / 2; + mg_flash_erase(last); + mg_http_reply(c, 200, s_json_header, "true\n"); +} + // HTTP request handler function static void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { if (ev == MG_EV_ACCEPT) { @@ -294,6 +302,8 @@ static void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { handle_firmware_status(c); } else if (mg_http_match_uri(hm, "/api/device/reset")) { handle_device_reset(c); + } else if (mg_http_match_uri(hm, "/api/device/eraselast")) { + handle_device_eraselast(c); } else { struct mg_http_serve_opts opts; memset(&opts, 0, sizeof(opts)); diff --git a/examples/device-dashboard/packed_fs.c b/examples/device-dashboard/packed_fs.c index 8d84454818..bbc9809c00 100644 --- a/examples/device-dashboard/packed_fs.c +++ b/examples/device-dashboard/packed_fs.c @@ -652,657 +652,675 @@ static const unsigned char v1[] = { 0, 0 // . }; static const unsigned char v2[] = { - 31, 139, 8, 8, 150, 240, 25, 101, 0, 3, 99, 111, // .......e..co + 31, 139, 8, 8, 239, 54, 65, 101, 0, 3, 99, 111, // .....6Ae..co 109, 112, 111, 110, 101, 110, 116, 115, 46, 106, 115, 0, // mponents.js. - 237, 61, 107, 115, 219, 70, 146, 223, 253, 43, 38, 44, // .=ks.F...+&, - 223, 146, 220, 16, 16, 222, 4, 36, 75, 41, 199, 217, // .......$K).. - 148, 83, 37, 239, 165, 226, 68, 95, 82, 169, 51, 72, // .S%...D_R.3H - 130, 2, 98, 60, 120, 0, 72, 73, 86, 248, 223, 175, // ..b - 59, 59, 99, 175, 163, 116, 3, 61, 214, 219, 124, 89, // ;;c..t.=..|Y - 39, 69, 206, 234, 56, 172, 97, 133, 122, 91, 230, 21, // 'E..8.a.z[.. - 11, 217, 6, 198, 37, 176, 17, 81, 93, 21, 233, 46, // ....%..Q]... - 130, 250, 53, 206, 186, 138, 210, 240, 225, 217, 178, 200, // ..5......... - 171, 154, 125, 131, 101, 118, 201, 38, 89, 53, 99, 187, // ..}.ev.&Y5c. - 48, 157, 178, 203, 43, 150, 71, 119, 236, 123, 62, 193, // 0...+.Gw.{>. - 68, 140, 197, 234, 42, 170, 127, 76, 178, 8, 182, 38, // D...*..L...& - 107, 103, 76, 14, 155, 194, 174, 162, 123, 58, 43, 159, // kgL.....{:+. - 248, 59, 252, 129, 137, 31, 159, 49, 22, 71, 97, 89, // .;.....1.GaY - 159, 227, 158, 54, 21, 78, 132, 103, 124, 247, 162, 218, // ...6.N.g|... - 221, 178, 101, 26, 86, 213, 229, 243, 71, 106, 210, 233, // ..e.V...Gj.. - 109, 207, 238, 179, 52, 175, 46, 71, 113, 93, 111, 206, // m...4..Gq]o. - 207, 206, 238, 238, 238, 244, 59, 91, 47, 202, 219, 51, // ......;[/..3 - 203, 48, 140, 51, 24, 54, 98, 235, 36, 77, 47, 71, // .0.3.6b.$M/G - 121, 145, 71, 35, 182, 75, 162, 187, 175, 139, 251, 203, // y.G#.K...... - 145, 193, 12, 102, 57, 240, 255, 209, 213, 139, 77, 88, // ...f9.....MX - 199, 136, 133, 226, 125, 164, 165, 73, 30, 45, 195, 205, // ....}..I.-.. - 229, 168, 44, 0, 136, 35, 181, 250, 215, 34, 201, 251, // ..,..#...".. - 245, 119, 201, 170, 142, 47, 71, 214, 136, 173, 46, 71, // .w.../G....G - 111, 28, 221, 54, 125, 230, 225, 51, 116, 116, 151, 225, // o..6}..3tt.. - 127, 176, 144, 97, 96, 157, 231, 92, 155, 22, 179, 12, // ...a`....... - 44, 165, 115, 221, 243, 45, 141, 158, 157, 158, 26, 117, // ,.s..-.....u - 212, 154, 238, 208, 195, 246, 82, 205, 196, 41, 249, 243, // ......R..).. - 64, 119, 102, 124, 128, 83, 156, 225, 49, 224, 7, 206, // @wf|.S..1... - 124, 245, 110, 6, 144, 92, 21, 119, 249, 203, 178, 44, // |.n....w..., - 240, 192, 127, 37, 64, 123, 176, 49, 117, 87, 86, 93, // ...%@{.1uWV] - 142, 150, 219, 18, 40, 187, 126, 85, 164, 69, 57, 186, // ....(.~U.E9. - 98, 127, 8, 244, 8, 233, 128, 249, 186, 229, 190, 158, // b........... - 235, 110, 104, 65, 129, 209, 131, 32, 210, 188, 238, 130, // .nhA... .... - 94, 83, 243, 22, 31, 106, 161, 129, 59, 173, 223, 164, // ^S...j..;... - 53, 109, 175, 77, 23, 150, 53, 173, 212, 102, 118, 6, // 5m.M..5..fv. - 77, 169, 173, 217, 153, 6, 47, 55, 216, 58, 98, 103, // M...../7.:bg - 112, 156, 22, 248, 219, 205, 191, 65, 255, 57, 65, 159, // p......A.9A. - 25, 154, 157, 106, 8, 114, 4, 61, 130, 61, 131, 151, // ...j.r.=.=.. - 27, 115, 0, 248, 101, 113, 123, 114, 16, 215, 221, 192, // .s..eq{r.... - 97, 182, 30, 56, 75, 221, 8, 52, 221, 117, 44, 221, // a..8K..4.u,. - 245, 52, 120, 103, 166, 110, 154, 88, 136, 161, 38, 176, // .4xg.n.X..&. - 151, 186, 139, 160, 51, 117, 0, 171, 29, 248, 212, 10, // ....3u...... - 141, 169, 110, 153, 54, 188, 88, 190, 9, 19, 120, 182, // ..n.6.X...x. - 110, 207, 81, 82, 217, 32, 125, 60, 221, 115, 92, 221, // n.QR. }<.s.. - 159, 235, 6, 84, 25, 142, 110, 58, 80, 244, 109, 221, // ...T..n:P.m. - 178, 116, 211, 154, 235, 182, 5, 85, 129, 167, 207, 17, // .t.....U.... - 11, 115, 156, 120, 238, 66, 131, 147, 194, 100, 230, 92, // .s.x.B...d.. - 211, 29, 215, 11, 97, 17, 64, 24, 127, 2, 92, 96, // ....a.@....` - 69, 123, 174, 59, 1, 118, 9, 60, 196, 166, 51, 31, // E{.;.v.<..3. - 244, 209, 116, 203, 131, 87, 199, 54, 81, 182, 25, 134, // ..t..W.6Q... - 173, 251, 214, 124, 9, 181, 1, 44, 237, 192, 188, 182, // ...|...,.... - 175, 123, 166, 141, 5, 56, 64, 96, 133, 176, 5, 55, // .{...8@`...7 - 96, 252, 137, 19, 24, 12, 54, 228, 194, 8, 195, 128, // `.....6..... - 93, 206, 125, 221, 132, 17, 176, 55, 7, 160, 132, 75, // ].}....7...K - 27, 6, 156, 202, 242, 151, 186, 3, 39, 176, 93, 221, // ........'.]. - 181, 29, 61, 112, 29, 185, 44, 174, 106, 1, 128, 142, // ..=p..,.j... - 236, 14, 142, 224, 5, 112, 6, 218, 157, 60, 40, 44, // .....p...<(, - 102, 187, 174, 6, 43, 193, 190, 230, 80, 48, 230, 22, // f...+...P0.. - 110, 126, 238, 33, 68, 96, 135, 0, 32, 122, 136, 3, // n~.!D`.. z.. - 34, 4, 125, 28, 4, 71, 48, 125, 24, 227, 250, 176, // ".}..G0}.... - 116, 0, 3, 61, 199, 209, 125, 47, 72, 181, 6, 47, // t..=..}/H../ - 120, 16, 192, 178, 131, 189, 60, 192, 24, 110, 129, 80, // x.....<..n.P - 103, 198, 26, 98, 214, 129, 14, 136, 90, 92, 207, 210, // g..b....Z... - 16, 183, 154, 196, 60, 159, 69, 227, 216, 133, 105, 60, // ....<.E...i< - 108, 159, 3, 12, 109, 19, 74, 128, 97, 90, 79, 3, // l...m.J.aZO. - 28, 227, 22, 45, 70, 15, 185, 69, 13, 177, 140, 123, // ...-F..E...{ - 180, 240, 96, 1, 244, 133, 51, 33, 170, 249, 193, 52, // ..`...3!...4 - 194, 53, 135, 193, 65, 92, 115, 72, 105, 136, 110, 130, // .5..A.sHi.n. - 232, 92, 59, 12, 81, 128, 187, 198, 209, 141, 168, 193, // ..;.Q....... - 221, 192, 178, 208, 31, 23, 115, 160, 30, 32, 12, 232, // ......s.. .. - 214, 241, 252, 28, 219, 129, 141, 59, 197, 39, 97, 91, // .......;.'a[ - 35, 108, 35, 178, 241, 112, 62, 34, 193, 231, 72, 224, // #l#..p>"..H. - 67, 56, 21, 209, 188, 254, 65, 98, 163, 213, 211, 167, // C8....Ab.... - 182, 136, 100, 171, 17, 206, 241, 184, 30, 97, 28, 16, // ..d......a.. - 238, 33, 190, 97, 37, 132, 135, 197, 90, 168, 16, 246, // .!.a%...Z... - 129, 99, 144, 101, 160, 198, 0, 22, 226, 224, 244, 1, // .c.e........ - 225, 88, 0, 38, 114, 65, 197, 35, 198, 5, 2, 0, // .X.&rA.#.... - 227, 48, 179, 195, 81, 245, 129, 203, 173, 63, 42, 18, // .0..Q....?*. - 76, 216, 186, 21, 130, 20, 68, 118, 55, 53, 15, 126, // L.....Dv75.~ - 248, 139, 97, 122, 104, 14, 244, 132, 34, 88, 99, 117, // ..azh..."Xcu - 146, 223, 86, 175, 79, 77, 52, 154, 6, 88, 66, 94, // ..V.OM4..XB^ - 28, 0, 134, 68, 25, 16, 139, 104, 117, 57, 96, 0, // ...D...hu9`. - 36, 25, 252, 167, 86, 26, 88, 249, 6, 113, 202, 60, // $...V.X..q.< - 212, 98, 208, 110, 90, 52, 67, 166, 225, 179, 211, 219, // .b.nZ4C..... - 56, 52, 133, 65, 83, 128, 238, 167, 222, 52, 71, 160, // 84.AS....4G. - 121, 177, 77, 83, 216, 191, 107, 10, 190, 32, 173, 126, // y.MS..k.. .~ - 12, 103, 55, 167, 134, 51, 16, 193, 192, 27, 55, 4, // .g7..3....7. - 46, 131, 225, 209, 59, 208, 50, 208, 188, 210, 236, 14, // ....;.2..... - 176, 168, 142, 225, 136, 27, 96, 77, 55, 3, 209, 102, // ......`M7..f - 255, 169, 9, 52, 79, 11, 228, 4, 246, 167, 79, 16, // ...4O.....O. - 208, 4, 134, 62, 68, 214, 50, 204, 79, 13, 79, 64, // ...>D.2.O.O@ - 215, 4, 155, 215, 222, 203, 174, 97, 198, 121, 103, 7, // .......a.yg. - 139, 190, 65, 96, 242, 78, 166, 223, 237, 101, 130, 167, // ..A`.N...e.. - 99, 137, 110, 8, 185, 155, 65, 7, 112, 149, 168, 79, // c.n...A.p..O - 172, 97, 23, 13, 20, 123, 127, 37, 147, 86, 50, 253, // .a...{.%.V2. - 157, 70, 107, 125, 178, 204, 99, 220, 255, 137, 170, 247, // .Fk}..c..... - 117, 177, 57, 53, 180, 128, 15, 50, 71, 123, 25, 53, // u.95...2G{.5 - 222, 60, 148, 16, 64, 5, 31, 48, 180, 57, 172, 107, // .<..@..0.9.k - 68, 156, 101, 198, 104, 96, 120, 150, 73, 143, 151, 178, // D.e.h`x.I... - 31, 2, 17, 237, 247, 249, 13, 205, 146, 129, 102, 180, // ..........f. - 192, 138, 238, 154, 222, 102, 107, 202, 191, 118, 225, 209, // .....fk..v.. - 199, 10, 51, 221, 27, 172, 207, 0, 133, 70, 143, 56, // ..3......F.8 - 76, 180, 195, 152, 125, 96, 156, 97, 179, 102, 208, 13, // L...}`.a.f.. - 96, 242, 119, 46, 105, 209, 146, 125, 198, 11, 211, 232, // `.w.i..}.... - 175, 13, 23, 252, 37, 90, 13, 236, 67, 52, 183, 209, // ....%Z..C4.. - 22, 7, 56, 129, 117, 236, 0, 175, 240, 31, 4, 36, // ..8.u......$ - 216, 185, 174, 67, 225, 128, 151, 190, 30, 120, 115, 198, // ...C.....xs. - 159, 130, 169, 80, 72, 237, 192, 58, 186, 9, 94, 122, // ...PH..:..^z - 204, 163, 1, 30, 11, 118, 40, 229, 250, 189, 1, 232, // .....v(..... - 96, 38, 130, 165, 101, 88, 214, 210, 212, 231, 96, 234, // `&..eX....`. - 120, 232, 105, 184, 104, 38, 27, 190, 203, 112, 37, 20, // x.i.h&...p%. - 130, 182, 153, 185, 250, 220, 116, 64, 137, 129, 237, 3, // ......t@.... - 198, 24, 19, 63, 52, 139, 104, 106, 186, 52, 60, 42, // ...?4.hj.4<* - 42, 64, 219, 130, 201, 196, 128, 46, 105, 191, 1, 227, // *@......i... - 79, 28, 235, 162, 21, 8, 178, 21, 173, 63, 100, 227, // O........?d. - 176, 223, 1, 72, 218, 243, 49, 224, 209, 199, 252, 34, // ...H..1...." - 74, 211, 127, 35, 254, 255, 33, 226, 203, 104, 93, 70, // J..#..!..h]F - 85, 124, 114, 184, 71, 100, 216, 128, 68, 219, 241, 99, // U|r.Gd..D..c - 7, 253, 160, 29, 186, 183, 230, 27, 75, 15, 0, 33, // ........K..! - 102, 128, 110, 196, 78, 163, 22, 12, 130, 240, 62, 25, // f.n.N.....>. - 85, 216, 24, 142, 2, 159, 195, 100, 248, 180, 67, 148, // U......d..C. - 240, 20, 166, 225, 34, 25, 8, 200, 176, 209, 50, 125, // ....".....2} - 3, 126, 139, 109, 194, 26, 190, 231, 118, 59, 153, 109, // .~.m....v;.m - 39, 101, 38, 88, 136, 230, 55, 119, 248, 28, 104, 216, // 'e&X..7w..h. - 69, 88, 86, 206, 169, 225, 129, 108, 14, 84, 53, 49, // EXV....l.T51 - 183, 20, 201, 196, 1, 50, 252, 132, 215, 129, 136, 2, // .....2...... - 248, 216, 39, 9, 31, 140, 196, 208, 145, 249, 43, 56, // ..'.......+8 - 80, 10, 56, 26, 224, 245, 225, 145, 22, 183, 197, 246, // P.8......... - 244, 180, 181, 69, 32, 112, 211, 54, 58, 9, 5, 16, // ...E p.6:... - 133, 177, 6, 130, 239, 141, 101, 162, 217, 26, 176, 128, // ......e..... - 75, 70, 180, 126, 24, 127, 35, 161, 125, 192, 89, 15, // KF.~..#.}.Y. - 119, 209, 201, 193, 72, 250, 9, 228, 126, 225, 205, 134, // w...H...~... - 137, 106, 4, 53, 3, 195, 26, 238, 139, 161, 11, 112, // .j.5.......p - 220, 143, 176, 142, 248, 15, 199, 188, 134, 155, 126, 189, // ..........~. - 71, 59, 136, 209, 219, 128, 149, 98, 45, 232, 67, 62, // G;.....b-.C> - 202, 194, 228, 228, 108, 10, 203, 148, 12, 187, 67, 207, // ....l.....C. - 245, 168, 217, 13, 110, 216, 193, 70, 122, 220, 224, 248, // ....n..Fz... - 12, 116, 144, 59, 52, 248, 3, 33, 1, 7, 227, 149, // .t.;4..!.... - 27, 1, 49, 116, 167, 91, 142, 221, 95, 4, 131, 106, // ..1t.[.._..j - 96, 105, 4, 166, 151, 34, 195, 192, 92, 222, 161, 157, // `i..."...... - 216, 96, 36, 92, 219, 186, 109, 161, 141, 96, 30, 154, // .`$...m..`.. - 68, 163, 73, 104, 171, 3, 204, 222, 111, 194, 124, 117, // D.Ih....o.|u - 106, 168, 37, 66, 199, 7, 168, 103, 151, 84, 181, 27, // j.%B...g.T.. - 99, 73, 163, 251, 193, 107, 144, 50, 188, 11, 177, 9, // cI...k.2.... - 154, 14, 232, 137, 15, 58, 153, 32, 163, 136, 199, 136, // .....:. .... - 59, 168, 23, 53, 181, 147, 94, 131, 215, 24, 100, 40, // ;..5..^...d( - 214, 65, 130, 17, 169, 180, 157, 218, 89, 177, 215, 240, // .A......Y... - 62, 166, 138, 203, 36, 127, 127, 106, 144, 7, 208, 222, // >...$..j.... - 192, 145, 241, 247, 181, 248, 189, 110, 176, 129, 46, 58, // .......n...: - 161, 132, 10, 175, 101, 33, 213, 8, 130, 248, 192, 88, // ....e!.....X - 70, 128, 88, 160, 194, 141, 44, 164, 216, 166, 201, 14, // F.X...,..... - 166, 43, 123, 152, 10, 130, 211, 102, 146, 62, 164, 139, // .+{....f.>.. - 223, 1, 229, 207, 5, 66, 22, 150, 73, 168, 197, 201, // .....B..I... - 106, 21, 1, 128, 234, 114, 27, 253, 201, 208, 6, 234, // j....r...... - 210, 107, 34, 50, 70, 7, 39, 167, 230, 247, 235, 208, // .k"2F.'..... - 245, 9, 10, 114, 138, 21, 227, 35, 21, 41, 0, 130, // ...r...#.).. - 32, 52, 241, 250, 251, 161, 180, 221, 164, 69, 120, 122, // 4.......Exz - 82, 145, 44, 138, 157, 53, 12, 64, 17, 235, 88, 102, // R.,..5.@..Xf - 140, 241, 231, 94, 19, 194, 206, 111, 195, 195, 216, 67, // ...^...o...C - 11, 208, 78, 225, 38, 157, 4, 49, 86, 236, 176, 113, // ..N.&..1V..q - 24, 109, 44, 238, 242, 127, 67, 243, 16, 52, 185, 241, // .m,...C..4.. - 103, 90, 100, 245, 121, 164, 45, 12, 138, 81, 154, 86, // gZd.y.-..Q.V - 38, 224, 122, 99, 15, 125, 203, 34, 61, 57, 79, 129, // &.zc.}."=9O. - 27, 166, 0, 174, 20, 45, 49, 141, 196, 28, 65, 5, // .....-1...A. - 222, 98, 244, 196, 175, 137, 199, 185, 197, 134, 245, 208, // .b.......... - 245, 53, 14, 26, 112, 110, 92, 100, 39, 231, 35, 16, // .5..pn.d'.#. - 245, 152, 86, 234, 227, 77, 189, 134, 79, 119, 169, 59, // ..V..M..Ow.; - 148, 13, 16, 224, 69, 173, 107, 201, 162, 27, 152, 64, // ....E.k....@ - 66, 18, 76, 111, 144, 136, 2, 97, 223, 154, 150, 187, // B.Lo...a.... - 52, 24, 134, 188, 117, 215, 112, 152, 122, 203, 75, 207, // 4...u.p.z.K. - 215, 60, 72, 230, 232, 254, 28, 58, 106, 178, 163, 166, // ...tO...}J. - 243, 101, 39, 141, 58, 93, 155, 152, 161, 25, 208, 8, // .e'.:]...... - 159, 207, 136, 105, 11, 208, 104, 216, 150, 40, 249, 32, // ...i..h..(. - 85, 193, 112, 209, 189, 96, 142, 166, 176, 105, 121, 31, // U.p..`...iy. - 8, 67, 46, 70, 94, 240, 62, 127, 7, 15, 255, 181, // .C.F^.>..... - 201, 175, 126, 252, 129, 217, 151, 228, 235, 226, 228, 80, // ..~........P - 98, 54, 113, 165, 84, 55, 28, 80, 9, 134, 21, 98, // b6q.T7.P...b - 46, 231, 92, 26, 12, 152, 178, 234, 187, 86, 170, 233, // .........V.. - 115, 3, 115, 54, 125, 219, 83, 58, 24, 178, 131, 221, // s.s6}.S:.... - 12, 55, 63, 238, 10, 3, 254, 73, 90, 34, 212, 125, // .7?....IZ".} - 9, 245, 27, 212, 52, 3, 160, 71, 247, 0, 207, 44, // ....4..G..., - 196, 47, 39, 126, 44, 147, 48, 191, 77, 79, 206, 244, // ./'~,.0.MO.. - 254, 63, 206, 22, 117, 188, 205, 22, 63, 157, 156, 236, // .?..u...?... - 246, 116, 207, 182, 201, 57, 92, 234, 190, 225, 145, 135, // .t...9...... - 225, 98, 246, 177, 227, 96, 98, 181, 97, 83, 216, 219, // .b...`b.aS.. - 15, 3, 164, 123, 198, 159, 252, 230, 220, 247, 208, 190, // ...{........ - 114, 150, 250, 220, 130, 238, 182, 143, 24, 65, 219, 57, // r........A.9 - 160, 251, 125, 207, 69, 60, 205, 77, 180, 140, 157, 0, // ..}.E<.M.... - 239, 216, 241, 137, 172, 164, 219, 22, 226, 196, 155, 91, // ...........[ - 55, 182, 202, 131, 148, 106, 59, 239, 39, 229, 200, 187, // 7....j;.'... - 207, 165, 33, 221, 51, 139, 39, 124, 99, 130, 180, 133, // ..!.3.'|c... - 68, 100, 153, 62, 86, 66, 63, 215, 215, 77, 10, 243, // Dd.>VB?..M.. - 91, 62, 88, 163, 228, 66, 65, 41, 198, 252, 0, 111, // [>X..BA)...o - 137, 89, 205, 252, 120, 129, 227, 2, 21, 56, 120, 58, // .Y..x....8x: - 23, 55, 13, 155, 132, 99, 185, 186, 99, 65, 141, 231, // .7...c..cA.. - 3, 151, 227, 15, 13, 118, 67, 50, 88, 185, 217, 42, // .....vC2X..* - 47, 9, 60, 160, 180, 185, 238, 90, 152, 10, 109, 251, // /.<....Z..m. - 190, 238, 96, 10, 110, 224, 207, 97, 201, 0, 15, 102, // ..`.n..a...f - 184, 88, 122, 141, 73, 7, 72, 140, 142, 15, 148, 11, // .Xz.I.H..... - 29, 192, 103, 208, 141, 57, 38, 85, 59, 8, 48, 11, // ..g..9&U;.0. - 63, 53, 208, 77, 202, 213, 53, 28, 244, 31, 12, 147, // ?5.M..5..... - 241, 39, 121, 25, 77, 183, 215, 174, 30, 24, 206, 27, // .'y.M....... - 126, 151, 21, 144, 203, 248, 134, 170, 120, 248, 99, 201, // ~.......x.c. - 115, 233, 13, 180, 136, 97, 69, 140, 152, 204, 97, 15, // s....aE...a. - 22, 88, 184, 115, 157, 47, 137, 180, 15, 70, 176, 69, // .X.s./...F.E - 76, 0, 38, 112, 96, 16, 147, 248, 1, 153, 202, 115, // L.&p`......s - 204, 129, 119, 233, 211, 159, 128, 178, 205, 109, 207, 15, // ..w......m.. - 145, 51, 100, 10, 55, 156, 20, 118, 234, 26, 243, 37, // .3d.7..v...% - 118, 119, 93, 88, 45, 224, 188, 229, 129, 152, 52, 193, // vw]X-.....4. - 66, 180, 3, 255, 21, 240, 158, 63, 39, 51, 221, 64, // B......?'3.@ - 187, 210, 244, 230, 228, 1, 48, 238, 8, 196, 112, 72, // ......0...pH - 215, 6, 87, 123, 142, 179, 130, 125, 15, 182, 189, 11, // ..W{...}.... - 40, 3, 176, 96, 82, 134, 235, 51, 254, 20, 71, 183, // (..`R..3..G. - 13, 180, 27, 60, 79, 160, 61, 128, 179, 131, 161, 111, // ..... - 147, 147, 147, 187, 20, 171, 177, 41, 191, 21, 195, 6, // .......).... - 244, 185, 147, 77, 105, 139, 148, 170, 74, 149, 166, 165, // ...Mi...J... - 86, 101, 96, 94, 243, 52, 88, 181, 31, 205, 131, 214, // Ve`^.4X..... - 247, 13, 88, 36, 60, 114, 76, 209, 79, 19, 43, 50, // ..X$.c^......? - 250, 53, 156, 57, 12, 156, 139, 220, 5, 26, 74, 66, // .5.9......JB - 221, 240, 230, 244, 169, 11, 6, 97, 80, 33, 249, 134, // .......aP!.. - 165, 97, 110, 92, 16, 58, 115, 204, 227, 98, 226, 71, // .an..:s..b.G - 136, 103, 216, 150, 134, 251, 98, 221, 195, 160, 72, 32, // .g....b...H - 117, 230, 130, 23, 12, 71, 38, 101, 98, 122, 33, 234, // u....G&ebz!. - 34, 148, 222, 248, 20, 51, 204, 109, 180, 208, 12, 59, // "....3.m...; - 96, 14, 40, 49, 176, 230, 196, 15, 53, 187, 36, 237, // `.(1....5.$. - 13, 118, 120, 28, 163, 113, 180, 128, 73, 201, 131, 222, // .vx..q..I... - 159, 253, 206, 133, 95, 29, 32, 201, 183, 81, 60, 48, // ...._. ..Q<0 - 232, 209, 146, 87, 131, 134, 240, 14, 66, 145, 82, 143, // ...W....B.R. - 41, 152, 222, 88, 245, 49, 89, 140, 148, 179, 63, 32, // )..X.1Y...? - 104, 114, 249, 171, 83, 35, 104, 158, 253, 125, 109, 247, // hr..S#h..}m. - 239, 90, 196, 77, 14, 93, 215, 100, 6, 221, 112, 97, // .Z.M.].d..pa - 132, 104, 46, 58, 9, 72, 191, 225, 85, 248, 81, 75, // .h.:.H..U.QK - 23, 92, 251, 254, 71, 219, 117, 178, 161, 189, 202, 15, // ....G.u..... - 183, 111, 203, 40, 202, 207, 217, 120, 113, 171, 81, 81, // .o.(...xq.QQ - 51, 13, 131, 213, 209, 125, 45, 94, 3, 120, 45, 147, // 3....}-^.x-. - 92, 182, 218, 134, 49, 70, 36, 60, 68, 105, 90, 220, // ....1F$y..:.f...i. - 124, 63, 99, 171, 164, 10, 23, 105, 180, 154, 1, 29, // |?c....i.... - 84, 51, 150, 192, 129, 241, 139, 252, 53, 188, 211, 137, // T3......5... - 103, 44, 46, 118, 81, 73, 47, 109, 111, 122, 221, 79, // g,.vQI/moz.O - 9, 24, 28, 68, 63, 87, 155, 4, 70, 86, 81, 253, // ...D?W..FVQ. - 22, 10, 191, 0, 160, 228, 231, 252, 147, 117, 152, 86, // .........u.V - 209, 244, 162, 233, 186, 92, 64, 171, 220, 216, 36, 218, // ......@...$. - 241, 105, 100, 107, 25, 33, 148, 197, 254, 216, 87, 178, // .idk.!....W. - 52, 153, 178, 115, 150, 111, 211, 244, 130, 250, 38, 107, // 4..s.o....&k - 134, 31, 219, 179, 191, 253, 141, 213, 15, 155, 168, 224, // ............ - 175, 250, 50, 172, 151, 241, 148, 93, 94, 94, 178, 177, // ..2....]^^.. - 92, 97, 44, 231, 103, 114, 119, 19, 188, 188, 159, 94, // .a,.grw....^ - 136, 202, 102, 220, 100, 66, 95, 249, 243, 237, 234, 117, // ..f.dB_....u - 28, 229, 162, 70, 14, 227, 45, 98, 224, 30, 158, 123, // ...F..-b...{ - 44, 226, 86, 190, 224, 192, 154, 10, 160, 193, 1, 16, // ,.V......... - 87, 139, 116, 27, 105, 30, 224, 135, 64, 120, 46, 107, // W.t.i...@x.k - 92, 168, 145, 128, 108, 42, 29, 192, 220, 5, 33, 26, // ....l*....!. - 255, 84, 1, 103, 207, 103, 47, 22, 132, 53, 58, 226, // .T.g.g/..5:. - 229, 136, 191, 140, 4, 195, 142, 146, 28, 121, 66, 91, // .........yB[ - 167, 209, 61, 251, 117, 91, 213, 201, 250, 65, 91, 2, // ..=.u[...A[. - 87, 69, 37, 75, 234, 40, 171, 228, 203, 109, 184, 209, // WE%K.(...m.. - 44, 70, 92, 19, 173, 216, 230, 30, 163, 209, 108, 243, // ,F........l. - 128, 218, 151, 83, 81, 149, 177, 117, 145, 195, 111, 148, // ...SQ..u..o. - 37, 139, 34, 93, 241, 218, 187, 24, 102, 97, 85, 28, // %."]....faU. - 174, 128, 12, 161, 203, 243, 71, 126, 182, 61, 150, 210, // ......G~.=.. - 106, 63, 226, 233, 201, 32, 56, 224, 185, 151, 104, 130, // j?... 8...h. - 215, 229, 98, 223, 28, 15, 94, 101, 145, 253, 246, 27, // ..b...^e.... - 67, 26, 217, 179, 43, 24, 249, 156, 19, 34, 2, 241, // C...+....".. - 197, 243, 71, 172, 7, 84, 211, 223, 70, 208, 69, 206, // ..G..T..F.E. - 51, 160, 27, 137, 113, 47, 143, 123, 167, 57, 172, 233, // 3...q/.{.9.. - 57, 14, 243, 36, 3, 218, 210, 240, 125, 12, 93, 199, // 9..$....}.]. - 227, 61, 242, 240, 179, 23, 103, 103, 87, 239, 14, 50, // .=....ggW..2 - 192, 63, 11, 128, 80, 178, 164, 216, 198, 228, 177, 0, // .?..P....... - 210, 199, 99, 34, 217, 23, 85, 212, 33, 101, 170, 89, // ..c"..U.!e.Y - 212, 57, 167, 225, 31, 162, 245, 4, 233, 78, 33, 96, // .9.......N!` - 250, 227, 19, 128, 226, 186, 12, 243, 42, 197, 109, 60, // ........*.m< - 0, 132, 139, 77, 184, 76, 234, 7, 205, 96, 85, 118, // ...M.L...`Uv - 174, 54, 245, 42, 0, 1, 227, 118, 174, 186, 232, 207, // .6.*...v.... - 100, 52, 51, 33, 159, 247, 134, 26, 202, 208, 159, 235, // d43!........ - 146, 24, 238, 199, 178, 203, 110, 176, 59, 218, 108, 243, // ......n.;.l. - 87, 52, 38, 13, 179, 73, 86, 160, 81, 147, 186, 152, // W4&..IV.Q... - 94, 176, 230, 93, 252, 9, 139, 104, 135, 36, 223, 192, // ^..]...h.$.. - 0, 24, 76, 150, 117, 33, 182, 117, 206, 154, 71, 91, // ..L.u!.u..G[ - 38, 211, 25, 216, 120, 134, 65, 155, 216, 207, 216, 207, // &...x.A..... - 191, 40, 176, 67, 58, 129, 65, 176, 97, 190, 208, 163, // .(.C:.A.a... - 216, 11, 223, 181, 186, 17, 234, 55, 99, 54, 78, 196, // .......7c6N. - 57, 173, 203, 27, 171, 100, 199, 83, 114, 210, 100, 7, // 9....d.Sr.d. - 220, 1, 68, 18, 149, 53, 20, 27, 6, 249, 0, 0, // ..D..5...... - 100, 27, 208, 25, 192, 5, 90, 180, 131, 253, 85, 26, // d.....Z...U. - 170, 43, 22, 46, 170, 34, 221, 2, 117, 39, 57, 172, // .+..."..u'9. - 7, 0, 39, 30, 226, 76, 19, 229, 196, 35, 14, 114, // ..'..L...#.r - 136, 135, 208, 231, 213, 85, 29, 2, 49, 193, 235, 70, // .....U..1..F - 243, 70, 72, 192, 180, 188, 88, 136, 134, 223, 105, 107, // .FH...X...ik - 160, 18, 154, 74, 3, 78, 233, 242, 96, 5, 24, 69, // ...J.N..`..E - 220, 58, 237, 140, 176, 16, 77, 212, 157, 170, 183, 221, // .:....M..... - 112, 11, 244, 33, 102, 206, 194, 123, 141, 56, 17, 133, // p..!f..{.8.. - 201, 26, 149, 3, 207, 69, 146, 172, 173, 165, 183, 12, // .....E...... - 164, 73, 135, 111, 161, 138, 116, 131, 201, 127, 22, 41, // .I.o..t....) - 184, 166, 188, 40, 105, 12, 100, 0, 146, 215, 186, 40, // ...(i.d....( - 51, 22, 133, 85, 164, 1, 232, 217, 106, 91, 18, 159, // 3..U....j[.. - 160, 62, 225, 237, 9, 241, 16, 112, 109, 185, 23, 187, // .>.....pm... - 238, 237, 91, 115, 154, 250, 3, 192, 81, 128, 168, 116, // ..[s....Q..t - 27, 118, 212, 120, 10, 157, 102, 116, 122, 145, 140, 40, // .v.x..ftz..( - 222, 55, 18, 2, 138, 231, 162, 136, 201, 79, 209, 170, // .7.......O.. - 17, 18, 49, 224, 236, 14, 254, 19, 221, 199, 138, 78, // ..1........N - 70, 1, 139, 130, 162, 81, 156, 88, 193, 133, 134, 178, // F....Q.X.... - 206, 217, 217, 177, 237, 101, 248, 151, 24, 238, 4, 177, // .....e...... - 0, 64, 55, 64, 56, 96, 56, 244, 246, 185, 145, 221, // .@7@8`8..... - 59, 146, 53, 139, 86, 201, 54, 147, 22, 66, 248, 128, // ;.5.V.6..B.. - 74, 123, 116, 5, 208, 132, 138, 253, 139, 179, 205, 177, // J{t......... - 73, 4, 130, 179, 26, 214, 147, 19, 182, 147, 184, 56, // I..........8 - 201, 203, 252, 1, 73, 250, 46, 1, 11, 42, 164, 219, // ....I....*.. - 117, 112, 94, 114, 150, 23, 119, 100, 148, 177, 58, 78, // up^r..wd..:N - 42, 52, 213, 34, 189, 183, 206, 211, 71, 117, 56, 79, // *4."....Gu8O - 60, 137, 147, 131, 202, 137, 171, 4, 41, 24, 84, 189, // <.......).T. - 32, 56, 127, 127, 72, 127, 73, 18, 206, 86, 45, 9, // 8..H.I..V-. - 183, 7, 117, 26, 21, 218, 57, 60, 192, 118, 185, 173, // ..u...9<.v.. - 206, 129, 96, 105, 34, 178, 68, 187, 91, 132, 77, 2, // ..`i".D.[.M. - 231, 229, 114, 197, 170, 212, 138, 60, 125, 24, 93, 189, // ..r....<}.]. - 194, 141, 128, 185, 7, 109, 195, 1, 141, 73, 12, 212, // .....m...I.. - 228, 2, 198, 221, 190, 121, 139, 255, 151, 230, 239, 71, // .....y.....G - 51, 4, 123, 211, 51, 97, 236, 114, 119, 204, 242, 49, // 3.{.3a.rw..1 - 187, 81, 189, 2, 224, 94, 16, 250, 22, 222, 181, 79, // .Q...^.....O - 127, 245, 130, 223, 119, 226, 253, 243, 92, 233, 104, 26, // ....w.....h. - 109, 63, 19, 221, 4, 40, 164, 71, 251, 105, 188, 31, // m?...(.G.i.. - 31, 98, 80, 63, 173, 219, 79, 44, 172, 201, 9, 105, // .bP?..O,...i - 237, 102, 131, 31, 122, 108, 114, 128, 126, 134, 4, 165, // .f..zlr.~... - 190, 42, 47, 77, 81, 20, 232, 135, 212, 246, 197, 65, // .*/MQ......A - 189, 125, 93, 220, 130, 233, 245, 152, 226, 207, 183, 96, // .}]........` - 97, 226, 135, 21, 223, 145, 149, 42, 76, 89, 48, 206, // a......*LY0. - 127, 68, 62, 234, 88, 163, 160, 251, 184, 114, 252, 9, // .D>.X....r.. - 10, 29, 245, 56, 30, 43, 218, 232, 231, 13, 32, 154, // ...8.+.... . - 250, 125, 15, 133, 227, 253, 224, 177, 93, 100, 73, 253, // .}......]dI. - 148, 225, 10, 178, 58, 142, 87, 37, 170, 243, 175, 195, // ....:.W%.... - 42, 89, 178, 49, 251, 146, 45, 234, 34, 156, 224, 102, // *Y.1..-."..f - 160, 60, 62, 199, 26, 92, 81, 152, 144, 124, 92, 28, // .<>...Q..|.. - 133, 171, 136, 187, 22, 47, 97, 138, 162, 76, 62, 144, // ...../a..L>. - 240, 61, 151, 51, 238, 121, 111, 161, 253, 214, 17, 154, // .=.3.yo..... - 170, 227, 112, 147, 156, 17, 76, 198, 51, 246, 40, 166, // ..p...L.3.(. - 216, 11, 171, 85, 192, 106, 170, 175, 147, 60, 76, 211, // ...U.j...2....). - 111, 68, 159, 99, 4, 208, 182, 255, 11, 136, 224, 143, // oD.c........ - 227, 254, 51, 225, 252, 179, 225, 154, 228, 225, 0, 215, // ..3......... - 205, 8, 137, 243, 13, 133, 196, 192, 126, 137, 195, 252, // ........~... - 54, 34, 83, 134, 171, 131, 253, 211, 116, 80, 107, 115, // 6"S.....tPks - 85, 56, 241, 16, 204, 158, 235, 173, 203, 209, 219, 228, // U8.......... - 54, 103, 223, 129, 201, 132, 110, 46, 76, 202, 13, 90, // 6g....n.L..Z - 254, 221, 96, 215, 110, 146, 139, 129, 219, 221, 117, 54, // ..`.n.....u6 - 186, 2, 113, 244, 177, 221, 72, 127, 159, 228, 181, 35, // ..q...H....# - 131, 72, 247, 21, 23, 112, 92, 139, 126, 162, 86, 38, // .H...p..~.V& - 131, 39, 90, 77, 30, 121, 192, 72, 184, 210, 60, 64, // .'ZM.y.H..<@ - 32, 21, 49, 69, 66, 126, 251, 141, 199, 66, 248, 162, // .1EB~...B.. - 77, 228, 138, 191, 6, 7, 131, 30, 170, 201, 166, 26, // M........... - 137, 131, 168, 134, 201, 3, 25, 210, 12, 127, 78, 155, // ..........N. - 65, 191, 148, 7, 55, 249, 187, 18, 64, 112, 89, 172, // A...7...@pY. - 81, 168, 239, 29, 197, 29, 14, 172, 195, 249, 83, 181, // Q.........S. - 217, 21, 203, 148, 40, 29, 3, 39, 18, 110, 29, 223, // ....(..'.n.. - 138, 124, 201, 54, 74, 162, 152, 247, 79, 67, 18, 173, // .|.6J...OC.. - 141, 38, 44, 199, 225, 40, 112, 65, 5, 105, 234, 136, // .&,..(pA.i.. - 0, 100, 15, 200, 71, 213, 119, 107, 189, 163, 47, 218, // .d..G.wk../. - 48, 184, 96, 236, 54, 170, 35, 143, 119, 159, 114, 65, // 0.`.6.#.w.rA - 212, 96, 10, 249, 152, 215, 40, 66, 192, 63, 160, 227, // .`....(B.?.. - 27, 111, 148, 124, 213, 67, 190, 168, 116, 167, 45, 177, // .o.|.C..t.-. - 238, 1, 173, 127, 24, 191, 0, 239, 150, 127, 6, 158, // ............ - 21, 216, 215, 249, 50, 236, 56, 10, 220, 41, 104, 144, // ....2.8..)h. - 55, 186, 106, 226, 76, 172, 241, 126, 142, 49, 135, 121, // 7.j.L..~.1.y - 192, 224, 24, 108, 34, 182, 59, 187, 0, 168, 53, 187, // ...l".;...5. - 232, 133, 208, 74, 240, 180, 145, 44, 234, 228, 54, 110, // ...J...,..6n - 201, 130, 44, 136, 118, 191, 190, 4, 114, 91, 101, 145, // ..,.v...r[e. - 87, 218, 90, 206, 130, 138, 250, 198, 115, 143, 124, 135, // W.Z.....s.|. - 91, 111, 56, 154, 150, 228, 62, 73, 103, 98, 96, 15, // [o8...>Igb`. - 193, 196, 123, 130, 224, 101, 43, 3, 164, 68, 18, 228, // ..{..e+..D.. - 183, 23, 52, 199, 107, 94, 137, 40, 224, 31, 54, 232, // ..4.k^.(..6. - 113, 137, 27, 148, 172, 147, 71, 18, 176, 100, 126, 175, // q.....G..d~. - 115, 53, 20, 173, 40, 144, 25, 105, 188, 25, 11, 87, // s5..(..i...W - 171, 34, 255, 1, 129, 41, 202, 215, 209, 26, 139, 53, // ."...).....5 - 6, 193, 50, 12, 61, 103, 225, 61, 76, 85, 71, 155, // ..2.=g.=LUG. - 174, 39, 176, 184, 165, 5, 190, 190, 237, 90, 247, 146, // .'.......Z.. - 58, 199, 189, 80, 25, 143, 248, 62, 178, 101, 28, 45, // :..P...>.e.- - 223, 195, 254, 38, 92, 41, 92, 12, 2, 89, 178, 131, // ...&.)...Y.. - 234, 18, 236, 148, 248, 218, 215, 183, 253, 69, 120, 168, // .........Ex. - 24, 246, 138, 34, 106, 199, 94, 224, 182, 167, 74, 87, // ..."j.^...JW - 25, 218, 23, 28, 135, 175, 72, 13, 234, 216, 240, 158, // ......H..... - 143, 189, 194, 211, 126, 234, 216, 189, 234, 199, 112, 43, // ....~.....p+ - 162, 137, 190, 209, 212, 96, 59, 192, 156, 88, 215, 209, // .....`;..X.. - 132, 237, 186, 136, 2, 134, 49, 245, 124, 155, 45, 162, // ......1.|.-. - 114, 60, 165, 238, 155, 176, 172, 162, 239, 242, 26, 142, // r<.......... - 125, 33, 79, 189, 206, 155, 183, 22, 130, 159, 224, 110, // }!O........n - 168, 90, 173, 67, 199, 61, 147, 68, 141, 71, 47, 110, // .Z.C.=.D.G/n - 247, 66, 238, 183, 20, 209, 74, 255, 99, 90, 68, 53, // .B....J.cZD5 - 124, 26, 230, 37, 169, 46, 97, 199, 58, 234, 170, 179, // |..%..a.:... - 155, 190, 69, 212, 51, 126, 220, 174, 78, 109, 118, 69, // ..E.3~..NmvE - 74, 224, 29, 93, 25, 168, 102, 28, 240, 19, 2, 86, // J..]..f....V - 202, 132, 241, 193, 184, 249, 158, 27, 221, 173, 245, 34, // ..........." - 74, 123, 166, 235, 58, 172, 1, 12, 192, 165, 131, 56, // J{..:......8 - 43, 193, 165, 123, 74, 33, 48, 37, 40, 63, 197, 140, // +..{J!0%(?.. - 155, 255, 94, 51, 238, 115, 153, 107, 234, 170, 104, 122, // ..^3.s.k..hz - 181, 111, 173, 13, 78, 191, 66, 2, 73, 228, 147, 104, // .o..N.B.I..h - 248, 12, 216, 79, 63, 11, 246, 219, 24, 109, 181, 44, // ...O?....m., - 139, 52, 197, 107, 204, 7, 52, 250, 128, 229, 249, 141, // .4.k..4..... - 232, 57, 115, 141, 255, 184, 104, 168, 132, 182, 223, 144, // .9s...h..... - 201, 83, 230, 66, 148, 130, 152, 58, 40, 63, 139, 13, // .S.B...:(?.. - 246, 168, 90, 65, 218, 17, 132, 117, 1, 172, 10, 92, // ..ZA...u.... - 123, 143, 124, 127, 143, 220, 220, 240, 47, 72, 146, 175, // {.|...../H.. - 58, 111, 231, 236, 190, 19, 177, 39, 187, 183, 17, 26, // :o.....'.... - 156, 205, 105, 190, 129, 241, 60, 61, 96, 206, 209, 142, // ..i...<=`... - 187, 230, 51, 47, 42, 166, 25, 81, 164, 36, 208, 142, // ..3/*..Q.$.. - 111, 194, 249, 190, 165, 82, 83, 129, 184, 119, 152, 22, // o....RS..w.. - 37, 193, 63, 65, 147, 163, 131, 172, 198, 9, 74, 192, // %.?A......J. - 81, 207, 194, 205, 100, 215, 222, 149, 243, 234, 150, 8, // Q...d....... - 127, 54, 126, 217, 51, 126, 56, 154, 5, 43, 16, 172, // .6~.3~8..+.. - 156, 58, 175, 176, 194, 252, 133, 163, 116, 250, 17, 156, // .:......t... - 222, 37, 245, 50, 62, 128, 211, 14, 2, 229, 149, 104, // .%.2>......h - 23, 13, 95, 8, 253, 212, 116, 91, 220, 66, 143, 47, // .._...t[.B./ - 120, 53, 134, 192, 149, 123, 72, 138, 127, 75, 30, 180, // x5...{H..K.. - 12, 245, 46, 169, 46, 187, 163, 212, 59, 39, 151, 199, // ........;'.. - 205, 7, 183, 80, 159, 112, 85, 217, 141, 254, 66, 105, // ...P.pU...Bi - 223, 21, 83, 42, 107, 242, 216, 189, 105, 118, 131, 206, // ..S*k...iv.. - 76, 224, 78, 92, 140, 52, 6, 38, 17, 140, 96, 72, // L.N..4.&..`H - 75, 22, 104, 143, 64, 200, 192, 174, 202, 181, 133, 38, // K.h.@......& - 108, 175, 230, 86, 3, 142, 206, 239, 58, 128, 25, 241, // l..V....:... - 186, 227, 0, 9, 241, 42, 50, 236, 197, 245, 58, 136, // .....*2...:. - 38, 224, 100, 56, 91, 69, 216, 18, 193, 94, 82, 114, // &.d8[E...^Rr - 132, 126, 1, 60, 162, 33, 46, 126, 134, 209, 224, 246, // .~.<.!.~.... - 240, 32, 180, 15, 94, 77, 117, 252, 16, 17, 127, 86, // . ..^Mu....V - 110, 104, 186, 167, 239, 94, 246, 136, 109, 118, 183, 174, // nh...^..mv.. - 92, 222, 28, 59, 62, 254, 61, 117, 30, 9, 127, 113, // ...;>.=u...q - 198, 241, 118, 92, 246, 208, 159, 233, 156, 80, 166, 8, // ..v......P.. - 39, 77, 52, 29, 164, 73, 209, 24, 118, 242, 86, 156, // 'M4..I..v.V. - 103, 148, 52, 198, 3, 7, 28, 24, 15, 114, 128, 66, // g.4......r.B - 247, 199, 134, 16, 123, 169, 67, 90, 241, 247, 148, 61, // ....{.CZ...= - 209, 102, 179, 112, 147, 251, 182, 76, 86, 12, 31, 72, // .f.p...LV..H - 11, 21, 16, 12, 191, 20, 207, 64, 240, 143, 57, 198, // .......@..9. - 58, 97, 154, 161, 57, 61, 188, 125, 65, 13, 153, 33, // :a..9=.}A..! - 237, 117, 28, 14, 185, 48, 247, 58, 164, 69, 252, 148, // .u...0.:.E.. - 167, 131, 99, 226, 9, 157, 111, 198, 211, 115, 166, 31, // ..c...o..s.. - 245, 25, 191, 15, 111, 147, 92, 220, 100, 131, 96, 175, // ....o...d.`. - 195, 244, 59, 156, 113, 198, 39, 254, 62, 42, 161, 3, // ..;.q.'.>*.. - 200, 16, 17, 13, 226, 47, 20, 238, 184, 141, 48, 132, // ...../....0. - 46, 248, 161, 167, 30, 96, 22, 236, 128, 129, 232, 55, // .....`.....7 - 97, 29, 235, 203, 40, 73, 39, 237, 228, 236, 172, 51, // a...(I'....3 - 187, 34, 113, 192, 20, 197, 154, 31, 132, 146, 176, 218, // ."q......... - 150, 52, 170, 170, 31, 65, 212, 191, 125, 200, 192, 43, // .4...A..}..+ - 130, 182, 209, 139, 81, 219, 122, 91, 70, 32, 78, 202, // ....Q.z[F N. - 110, 135, 43, 165, 3, 81, 247, 91, 188, 58, 197, 22, // n.+..Q.[.:.. - 166, 180, 224, 78, 16, 183, 64, 34, 101, 4, 66, 41, // ...N..@"e.B) - 217, 69, 236, 104, 168, 0, 148, 134, 173, 248, 237, 116, // .E.h.......t - 41, 135, 44, 242, 1, 56, 129, 23, 181, 93, 82, 37, // ).,..8...]R% - 160, 1, 164, 12, 56, 92, 75, 184, 62, 84, 95, 172, // ....8.K.>T_. - 215, 226, 30, 249, 96, 115, 35, 126, 47, 134, 97, 17, // ....`s#~/.a. - 165, 173, 57, 28, 2, 19, 65, 142, 255, 252, 196, 35, // ..9...A....# - 232, 101, 196, 94, 82, 189, 92, 210, 41, 247, 228, 159, // .e.^R...)... - 76, 200, 226, 227, 122, 41, 124, 38, 227, 91, 175, 132, // L...z)|&.[.. - 172, 109, 178, 86, 56, 194, 39, 56, 69, 19, 214, 106, // .m.V8.'8E..j - 68, 144, 128, 33, 230, 115, 52, 179, 127, 197, 222, 181, // D..!.s4..... - 121, 30, 109, 80, 242, 29, 42, 128, 158, 32, 238, 114, // y.mP..*.. .r - 194, 48, 18, 34, 242, 159, 132, 169, 212, 100, 192, 8, // .0.".....d.. - 75, 105, 188, 231, 129, 57, 233, 68, 98, 144, 237, 54, // Ki...9.Db..6 - 218, 11, 63, 50, 188, 122, 7, 165, 41, 193, 164, 195, // ..?2.z..)... - 226, 31, 143, 27, 200, 144, 216, 34, 170, 239, 162, 40, // ......."...( - 239, 68, 33, 136, 10, 172, 131, 247, 215, 85, 118, 78, // .D!......UvN - 115, 137, 95, 56, 74, 115, 81, 47, 175, 240, 179, 243, // s._8JsQ/.... - 254, 220, 252, 86, 31, 163, 27, 180, 4, 127, 205, 139, // ...V........ - 187, 50, 220, 8, 195, 96, 120, 41, 121, 32, 142, 209, // .2...`x)y .. - 198, 195, 6, 241, 139, 206, 5, 91, 21, 23, 119, 0, // .......[..w. - 212, 158, 231, 223, 189, 173, 224, 243, 204, 249, 245, 242, // ............ - 68, 17, 0, 76, 99, 230, 148, 253, 189, 195, 195, 236, // D..Lc....... - 75, 102, 238, 133, 240, 135, 246, 225, 188, 173, 84, 35, // Kf........T# - 137, 0, 198, 107, 103, 202, 191, 247, 228, 77, 43, 44, // ...kg....M+, - 166, 205, 180, 197, 26, 112, 219, 50, 242, 190, 115, 162, // .....p.2..s. - 79, 62, 73, 59, 115, 51, 113, 25, 85, 219, 180, 174, // O>I;s3q.U... - 58, 55, 142, 202, 5, 55, 34, 183, 3, 247, 60, 108, // :7...7"...2....d - 19, 42, 118, 2, 205, 60, 117, 148, 177, 179, 51, 49, // .*v....e.._C - 127, 208, 21, 13, 233, 3, 103, 81, 246, 197, 19, 195, // ......gQ.... - 4, 156, 40, 26, 92, 77, 149, 185, 57, 141, 169, 236, // ..(..M..9... - 214, 165, 204, 134, 170, 49, 189, 22, 115, 187, 149, 29, // .....1..s... - 128, 98, 52, 166, 45, 161, 28, 217, 230, 69, 103, 54, // .b4.-....Eg6 - 228, 83, 198, 167, 235, 54, 8, 33, 128, 77, 168, 119, // .S...6.!.M.w - 38, 157, 113, 251, 39, 182, 140, 189, 15, 237, 249, 139, // &.q.'....... - 226, 253, 84, 197, 194, 63, 202, 178, 40, 207, 9, 90, // ..T..?..(..Z - 52, 100, 38, 132, 7, 112, 57, 136, 82, 144, 120, 223, // 4d&..p9.R.x. - 134, 73, 58, 152, 101, 120, 94, 190, 81, 26, 241, 166, // .I:.ex^.Q... - 40, 133, 88, 172, 48, 99, 31, 33, 209, 117, 205, 154, // (.X.0c.!.u.. - 213, 69, 120, 29, 145, 203, 190, 1, 26, 66, 121, 38, // .Ex......By& - 254, 121, 27, 182, 138, 118, 201, 50, 2, 123, 100, 220, // .y...v.2.{d. - 131, 85, 111, 127, 47, 211, 84, 46, 6, 43, 213, 29, // .Uo./.T..+.. - 240, 92, 244, 153, 248, 236, 12, 166, 255, 150, 210, 160, // ............ - 149, 47, 109, 248, 166, 36, 190, 12, 249, 205, 138, 188, // ./m..$...... - 137, 59, 20, 220, 63, 144, 216, 72, 208, 109, 67, 252, // .;..?..H.mC. - 72, 123, 213, 207, 198, 47, 13, 104, 154, 219, 67, 140, // H{.../.h..C. - 30, 163, 84, 71, 245, 240, 3, 37, 35, 226, 71, 0, // ..TG...%#.G. - 235, 206, 157, 162, 28, 45, 178, 25, 117, 208, 229, 171, // .....-..u... - 151, 21, 217, 196, 95, 111, 215, 107, 24, 178, 158, 202, // ...._o.k.... - 182, 130, 254, 190, 160, 186, 169, 206, 71, 60, 66, 224, // ........G# - 236, 204, 50, 28, 191, 21, 168, 189, 75, 12, 140, 42, // ..2.....K..* - 141, 149, 182, 77, 73, 17, 218, 111, 162, 117, 8, 163, // ...MI..o.u.. - 91, 122, 21, 159, 71, 168, 223, 63, 44, 194, 42, 146, // [z..G..?,.*. - 31, 65, 8, 144, 31, 128, 184, 8, 227, 31, 0, 56, // .A.........8 - 194, 114, 157, 95, 40, 103, 36, 122, 90, 163, 102, 191, // .r._(g$zZ.f. - 87, 46, 130, 191, 88, 231, 34, 38, 218, 255, 244, 130, // W...X."&.... - 155, 26, 255, 44, 164, 145, 144, 228, 168, 235, 192, 112, // ...,.......p - 162, 60, 215, 184, 184, 227, 42, 126, 149, 132, 105, 113, // .<....*~..iq - 171, 42, 229, 117, 222, 238, 244, 232, 53, 109, 231, 42, // .*.u....5m.* - 77, 102, 151, 116, 63, 29, 228, 9, 34, 220, 224, 232, // Mf.t?..."... - 164, 177, 143, 196, 221, 0, 174, 47, 243, 196, 197, 77, // ......./...M - 230, 193, 187, 161, 112, 185, 140, 54, 117, 19, 202, 229, // ....p..6u... - 175, 194, 199, 27, 100, 83, 117, 227, 174, 221, 148, 42, // ....dSu....* - 249, 231, 42, 251, 201, 232, 116, 29, 193, 247, 65, 169, // ..*...t...A. - 234, 77, 150, 131, 56, 142, 154, 232, 208, 249, 214, 225, // .M..8....... - 65, 94, 251, 117, 163, 55, 104, 59, 63, 127, 228, 86, // A^.u.7h;?..V - 89, 47, 235, 66, 86, 247, 35, 187, 255, 3, 10, 166, // Y/.BV.#..... - 118, 24, 21, 119, 0, 0, 0 // v..w.. + 237, 93, 235, 115, 219, 70, 146, 255, 238, 191, 98, 162, // .].s.F....b. + 202, 45, 169, 181, 0, 225, 77, 64, 182, 148, 114, 156, // .-....M@..r. + 77, 57, 85, 246, 94, 42, 78, 244, 37, 151, 59, 67, // M9U.^*N.%.;C + 36, 40, 34, 198, 131, 7, 64, 148, 100, 133, 255, 251, // $("...@.d... + 245, 175, 103, 0, 12, 64, 74, 118, 18, 239, 214, 157, // ..g..@Jv.... + 110, 83, 49, 48, 24, 204, 179, 223, 221, 211, 160, 38, // nS10.......& + 87, 117, 34, 234, 166, 74, 231, 205, 228, 217, 147, 52, // Wu"..J.....4 + 95, 151, 85, 35, 238, 196, 234, 72, 84, 73, 177, 72, // _.U#...HTI.H + 170, 35, 65, 13, 222, 54, 113, 147, 112, 233, 111, 203, // .#A..6q.p.o. + 101, 50, 111, 184, 248, 67, 178, 60, 18, 171, 38, 207, // e2o..C.<..&. + 142, 196, 15, 229, 85, 147, 84, 98, 43, 150, 85, 153, // ....U.Tb+.U. + 11, 49, 49, 143, 47, 174, 138, 69, 150, 152, 191, 214, // .11./..E.... + 52, 232, 147, 227, 99, 241, 42, 201, 214, 212, 98, 121, // 4...c.*...by + 85, 204, 155, 180, 44, 68, 179, 138, 27, 154, 161, 185, // U...,D...... + 170, 138, 90, 196, 98, 77, 253, 82, 90, 136, 170, 174, // ..Z.bM.RZ... + 203, 108, 147, 80, 253, 18, 163, 46, 146, 44, 190, 125, // .l.P.....,.} + 50, 47, 139, 186, 17, 223, 160, 44, 78, 197, 52, 175, // 2/.....,N.4. + 143, 196, 38, 206, 14, 197, 233, 153, 40, 146, 107, 241, // ..&.....(.k. + 189, 28, 96, 170, 250, 162, 186, 78, 154, 31, 211, 60, // ..`....N...< + 161, 165, 181, 181, 71, 162, 237, 118, 72, 171, 74, 110, // ....G..vH.Jn + 120, 175, 114, 224, 239, 112, 163, 129, 239, 158, 8, 177, // x.r..p...... + 74, 226, 170, 57, 193, 154, 214, 53, 6, 194, 30, 223, // J..9...5.... + 61, 175, 55, 151, 98, 158, 197, 117, 125, 250, 229, 29, // =.7.b..u}... + 191, 50, 249, 105, 43, 110, 242, 172, 168, 79, 15, 86, // .2.i+n...O.V + 77, 179, 62, 57, 62, 190, 190, 190, 54, 175, 93, 179, // M.>9>...6.]. + 172, 46, 143, 29, 203, 178, 142, 169, 219, 129, 88, 166, // ..........X. + 89, 118, 122, 80, 148, 69, 114, 32, 54, 105, 114, 253, // YvzP.Er 6ir. + 117, 121, 115, 122, 96, 9, 75, 56, 30, 253, 127, 112, // uysz`.K8...p + 246, 124, 29, 55, 43, 96, 161, 124, 159, 24, 89, 90, // .|.7+`.|..YZ + 36, 243, 120, 125, 122, 80, 149, 4, 196, 3, 189, 250, // $.x}zP...... + 215, 50, 45, 198, 245, 215, 233, 162, 89, 157, 30, 56, // .2-.....Y..8 + 7, 98, 113, 122, 240, 198, 51, 93, 59, 20, 1, 174, // .bqz..3];... + 177, 103, 250, 2, 255, 104, 34, 203, 66, 93, 224, 189, // .g...h".B].. + 182, 29, 225, 88, 40, 101, 51, 51, 8, 29, 131, 175, // ...X(e33.... + 131, 150, 6, 55, 52, 186, 230, 212, 194, 13, 50, 195, // ...74.....2. + 198, 144, 242, 186, 167, 185, 176, 62, 208, 46, 142, 177, // .......>.... + 13, 186, 209, 158, 207, 222, 29, 17, 36, 23, 229, 117, // ........$..u + 241, 162, 170, 74, 108, 248, 159, 9, 208, 17, 108, 108, // ...Jl.....ll + 211, 111, 171, 78, 15, 230, 87, 21, 81, 118, 243, 178, // .o.N..W.Qv.. + 204, 202, 234, 224, 76, 252, 33, 208, 3, 210, 145, 8, // ....L.!..... + 77, 199, 127, 53, 51, 253, 216, 161, 130, 224, 11, 67, // M..53......C + 164, 123, 220, 68, 163, 87, 221, 211, 106, 223, 27, 238, // .{.D.W..j... + 184, 49, 198, 175, 140, 238, 221, 43, 219, 167, 105, 109, // .1.....+..im + 39, 115, 133, 155, 211, 171, 204, 53, 220, 220, 160, 135, // 's.....5.... + 115, 188, 61, 16, 199, 180, 157, 30, 248, 87, 235, 127, // s.=......W.. + 129, 254, 115, 130, 62, 183, 12, 55, 51, 0, 114, 128, // ..s.>..73.r. + 30, 96, 207, 233, 225, 220, 222, 1, 252, 188, 188, 124, // .`.........| + 116, 16, 55, 253, 200, 19, 174, 25, 121, 115, 211, 138, // t.7.....ys.. + 12, 211, 247, 28, 211, 15, 12, 122, 22, 182, 105, 219, // .......z..i. + 40, 172, 168, 38, 114, 231, 166, 15, 208, 217, 38, 129, // (..&r.....&. + 213, 141, 66, 126, 75, 47, 51, 211, 177, 93, 122, 112, // ..B~K/3..]zp + 66, 155, 6, 8, 92, 211, 157, 65, 82, 185, 36, 125, // B......AR.$} + 2, 51, 240, 124, 51, 156, 153, 22, 85, 89, 158, 105, // .3.|3...UY.i + 123, 84, 12, 93, 211, 113, 76, 219, 153, 153, 174, 67, // {T.].qL....C + 85, 81, 96, 206, 128, 133, 25, 6, 158, 249, 244, 194, // UQ`......... + 203, 104, 48, 123, 102, 152, 158, 31, 196, 52, 9, 33, // .h0{f....4.! + 76, 94, 9, 46, 52, 163, 59, 51, 189, 8, 77, 162, // L^..4.;3..M. + 0, 216, 244, 102, 59, 109, 12, 211, 9, 232, 209, 115, // ...f;m.....s + 109, 200, 54, 203, 114, 205, 208, 153, 205, 169, 54, 162, // m.6.r.....6. + 169, 61, 26, 215, 13, 205, 192, 118, 81, 160, 13, 68, // .=.....vQ..D + 78, 76, 75, 240, 35, 33, 175, 24, 192, 18, 180, 32, // NLK.#!..... + 159, 122, 88, 22, 173, 114, 22, 154, 54, 245, 160, 181, // .zX..r..6... + 121, 4, 37, 76, 109, 89, 180, 43, 39, 156, 155, 30, // y.%LmY.+'... + 237, 192, 245, 77, 223, 245, 204, 200, 247, 218, 105, 49, // ...M......i1 + 171, 67, 0, 186, 103, 117, 180, 133, 32, 162, 61, 240, // .C..gu.. .=. + 234, 218, 141, 210, 100, 174, 239, 27, 52, 19, 173, 107, // ....d...4..k + 70, 5, 107, 230, 96, 241, 179, 0, 16, 161, 21, 18, // F.k.`....... + 128, 248, 162, 54, 8, 8, 134, 232, 68, 91, 176, 67, // ...6....D[.C + 234, 227, 135, 52, 117, 68, 29, 3, 207, 51, 195, 32, // ...4uD...3. + 202, 140, 14, 47, 216, 8, 97, 217, 67, 171, 128, 48, // .../..a.C..0 + 134, 37, 48, 234, 236, 149, 1, 204, 122, 212, 0, 168, // .%0.....z... + 197, 124, 142, 1, 220, 26, 45, 230, 229, 40, 134, 196, // .|....-..(.. + 46, 13, 19, 224, 253, 140, 96, 232, 218, 84, 34, 12, // ......`..T". + 243, 124, 6, 225, 24, 75, 116, 4, 95, 218, 37, 26, // .|...Kt._.%. + 192, 50, 214, 232, 96, 99, 17, 181, 165, 61, 1, 213, // .2..`c...=.. + 114, 99, 6, 227, 90, 194, 96, 47, 174, 37, 164, 12, // rc..Z.`/.%.. + 160, 155, 33, 58, 51, 246, 67, 148, 224, 110, 72, 116, // ..!:3.C..nHt + 3, 53, 88, 13, 77, 75, 237, 49, 153, 71, 245, 4, // .5X.MK.1.G.. + 97, 66, 183, 137, 253, 75, 108, 71, 46, 86, 138, 43, // aB...KlG.V.+ + 99, 219, 96, 108, 3, 217, 216, 92, 8, 36, 132, 18, // c.`l.....$.. + 9, 178, 139, 164, 34, 30, 55, 220, 75, 108, 60, 123, // ....".7.Kl<{ + 246, 208, 18, 65, 182, 6, 227, 28, 219, 13, 24, 227, // ...A........ + 132, 240, 0, 248, 166, 153, 0, 15, 71, 244, 80, 97, // ........G.Pa + 236, 19, 199, 128, 101, 168, 198, 34, 22, 146, 224, 12, // ....e..".... + 9, 225, 40, 16, 19, 249, 164, 226, 129, 113, 133, 0, // ..(......q.. + 194, 56, 141, 236, 73, 84, 125, 144, 114, 235, 143, 138, // .8..IT}.r... + 4, 155, 150, 238, 196, 36, 5, 193, 238, 182, 17, 208, // .....$...... + 77, 62, 88, 118, 0, 115, 96, 36, 20, 201, 26, 107, // M>Xv.s`$...k + 210, 226, 178, 126, 245, 216, 68, 163, 109, 145, 37, 20, // ...~..D.m.%. + 172, 34, 194, 144, 42, 19, 98, 129, 86, 95, 2, 134, // ."..*.b.V_.. + 64, 146, 211, 63, 189, 210, 66, 229, 27, 224, 84, 4, // @..?..B...T. + 208, 98, 244, 222, 118, 120, 132, 220, 192, 117, 208, 218, // .b..vx...u.. + 218, 55, 132, 197, 67, 144, 238, 231, 214, 60, 70, 100, // .7..C......?6...&.8g + 112, 89, 2, 91, 31, 64, 203, 130, 121, 101, 184, 3, // pY.[.@..ye.. + 96, 113, 157, 64, 143, 115, 98, 77, 63, 39, 209, 230, // `q.@.sbM?'.. + 254, 169, 1, 140, 192, 136, 218, 1, 220, 79, 31, 32, // .........O. + 226, 1, 44, 115, 23, 89, 243, 184, 120, 108, 120, 34, // ..,s.Y..xlx" + 186, 102, 216, 188, 10, 94, 12, 13, 51, 201, 59, 27, // .f...^..3.;. + 154, 244, 13, 128, 41, 27, 217, 225, 176, 149, 77, 158, // ....).....M. + 142, 163, 154, 1, 114, 231, 59, 13, 200, 85, 226, 54, // ....r.;..U.6 + 43, 3, 77, 12, 82, 236, 227, 153, 108, 158, 201, 14, // +.M.R...l... + 55, 6, 207, 245, 201, 50, 79, 72, 255, 39, 169, 223, // 7....2OH.'.. + 55, 229, 250, 177, 161, 133, 124, 144, 25, 236, 101, 104, // 7.....|...eh + 188, 89, 220, 66, 0, 10, 62, 18, 176, 57, 156, 215, // .Y.B..>..9.. + 64, 156, 99, 175, 96, 96, 4, 142, 205, 151, 23, 109, // @.c.``.....m + 59, 0, 17, 246, 251, 236, 156, 71, 201, 73, 51, 58, // ;......G.I3: + 100, 69, 15, 77, 111, 187, 55, 229, 95, 249, 116, 25, // dE.Mo.7._.t. + 99, 69, 216, 254, 57, 234, 115, 66, 161, 53, 34, 14, // cE..9.sB.5". + 27, 118, 152, 112, 247, 244, 179, 92, 209, 117, 58, 39, // .v.p.....u:' + 76, 254, 206, 41, 29, 158, 114, 204, 120, 113, 150, 252, // L..)..r.xq.. + 115, 195, 5, 255, 20, 173, 70, 246, 33, 204, 109, 216, // s.....F.!.m. + 226, 4, 39, 178, 142, 61, 226, 21, 121, 3, 32, 201, // ..'..=..y. . + 206, 245, 61, 14, 7, 188, 8, 205, 40, 152, 9, 121, // ..=.....(..y + 85, 76, 5, 33, 181, 33, 235, 232, 60, 122, 17, 136, // UL.!.!...@........ + 1, 145, 116, 16, 34, 224, 49, 198, 252, 69, 146, 101, // ..t.".1..E.e + 255, 66, 252, 255, 67, 196, 87, 201, 178, 74, 234, 213, // .B..C.W..J.. + 163, 195, 61, 144, 225, 18, 18, 93, 47, 92, 121, 240, // ..=....]/.y. + 131, 54, 112, 111, 237, 55, 142, 25, 17, 66, 236, 8, // .6po.7...B.. + 110, 196, 198, 224, 55, 8, 130, 200, 54, 57, 87, 184, // n...7...69W. + 8, 71, 145, 207, 97, 11, 92, 221, 24, 18, 158, 195, // .G..a....... + 52, 82, 36, 19, 1, 89, 46, 44, 211, 55, 228, 183, // 4R$..Y.,.7.. + 184, 54, 205, 17, 6, 254, 176, 145, 221, 55, 210, 70, // .6.......7.F + 162, 137, 120, 124, 123, 131, 235, 142, 134, 189, 136, 171, // ..x|{....... + 218, 123, 108, 120, 96, 155, 3, 170, 102, 37, 45, 69, // .{lx`...f%-E + 54, 113, 136, 12, 63, 225, 113, 71, 68, 17, 124, 220, // 6q..?.qGD.|. + 71, 9, 31, 68, 98, 120, 203, 242, 145, 28, 40, 13, // G..Dbx....(. + 28, 29, 240, 198, 240, 200, 202, 203, 242, 234, 241, 105, // ...........i + 107, 135, 65, 224, 103, 125, 116, 146, 10, 36, 10, 87, // k.A.g}t..$.W + 6, 9, 190, 55, 142, 13, 179, 53, 18, 145, 148, 140, // ...7...5.... + 176, 126, 132, 124, 98, 161, 189, 199, 89, 143, 55, 201, // .~.|b...Y.7. + 163, 131, 81, 235, 39, 176, 251, 133, 147, 13, 27, 106, // ..Q.'......j + 4, 154, 65, 160, 70, 250, 98, 112, 1, 238, 247, 35, // ..A.F.bp...# + 156, 123, 252, 135, 251, 188, 134, 243, 113, 125, 192, 43, // .{......q}.+ + 88, 193, 219, 160, 153, 86, 70, 52, 134, 124, 146, 199, // X....VF4.|.. + 233, 163, 179, 41, 28, 187, 101, 216, 13, 60, 215, 123, // ...)..e..<.{ + 205, 110, 114, 195, 246, 190, 228, 203, 57, 250, 231, 164, // .nr.....9... + 131, 252, 93, 131, 63, 82, 18, 112, 167, 191, 118, 34, // ..].?R.p..v" + 160, 186, 110, 76, 199, 115, 199, 147, 32, 168, 70, 150, // ..nL.s.. .F. + 70, 100, 7, 25, 24, 134, 198, 10, 246, 173, 196, 37, // Fd.........% + 35, 225, 181, 107, 186, 14, 108, 4, 123, 223, 32, 6, // #..k..l.{. . + 15, 194, 75, 221, 193, 236, 205, 58, 46, 22, 143, 13, // ..K....:.... + 181, 76, 232, 184, 144, 122, 246, 89, 85, 251, 43, 148, // .L...z.YU.+. + 12, 62, 31, 124, 77, 82, 70, 54, 97, 54, 129, 233, // .>.|MRF6a6.. + 0, 79, 124, 167, 145, 77, 50, 138, 121, 140, 185, 131, // .O|..M2.y... + 91, 241, 171, 126, 208, 215, 228, 53, 70, 57, 196, 58, // [..~...5F9.: + 73, 48, 38, 149, 190, 81, 63, 42, 90, 237, 158, 199, // I0&..Q?*Z... + 212, 171, 42, 45, 222, 63, 54, 200, 19, 104, 207, 105, // ..*-.?6..h.i + 203, 184, 191, 82, 247, 215, 29, 54, 224, 162, 51, 74, // ...R...6..3J + 184, 240, 170, 45, 100, 6, 67, 16, 23, 196, 50, 34, // ...-d.C...2" + 96, 129, 11, 231, 109, 33, 195, 59, 163, 109, 96, 251, // `...m!.;.m`. + 109, 11, 91, 67, 112, 214, 13, 50, 134, 116, 249, 59, // m.[Cp..2.t.; + 160, 252, 185, 64, 40, 226, 42, 141, 141, 85, 186, 88, // ...@(.*..U.X + 36, 4, 160, 166, 186, 74, 254, 100, 104, 3, 186, 244, // $....J.dh... + 53, 19, 153, 224, 141, 179, 83, 243, 251, 117, 232, 242, // 5.....S..u.. + 17, 10, 114, 142, 21, 227, 146, 169, 20, 0, 69, 16, // ..r.......E. + 134, 122, 252, 253, 80, 186, 90, 103, 101, 252, 248, 164, // .z..P.Zge... + 34, 91, 20, 27, 103, 55, 0, 197, 172, 227, 216, 43, // "[..g7.....+ + 196, 159, 71, 175, 0, 187, 176, 15, 15, 163, 133, 17, // ..G......... + 193, 78, 145, 38, 93, 11, 98, 84, 108, 240, 114, 55, // .N.&].bTl.r7 + 218, 88, 94, 23, 255, 130, 230, 62, 104, 74, 227, 207, // .X^....>hJ.. + 118, 216, 234, 11, 88, 91, 88, 28, 163, 180, 157, 92, // v...X[X..... + 193, 245, 220, 221, 245, 45, 203, 236, 209, 121, 10, 210, // .....-...y.. + 48, 37, 112, 101, 176, 196, 12, 22, 115, 12, 21, 122, // 0%pe....s..z + 90, 193, 19, 127, 205, 60, 46, 45, 54, 212, 83, 211, // Z....<.-6.S. + 87, 232, 180, 195, 185, 171, 50, 127, 116, 62, 2, 83, // W.....2.t>.S + 143, 237, 100, 33, 78, 234, 13, 92, 253, 185, 233, 113, // ..d!N......q + 54, 64, 132, 131, 90, 223, 105, 139, 126, 100, 19, 9, // 6@..Z.i.~d.. + 181, 96, 122, 3, 34, 138, 148, 125, 107, 59, 254, 220, // .`z."..}k;.. + 18, 8, 121, 155, 190, 229, 9, 253, 148, 151, 175, 175, // ..y......... + 100, 144, 204, 51, 195, 25, 53, 52, 218, 134, 134, 214, // d..3..54.... + 68, 150, 87, 88, 206, 28, 239, 57, 163, 130, 106, 198, // D.WX...9..j. + 3, 158, 19, 237, 123, 60, 161, 222, 202, 232, 155, 201, // ....{<...... + 129, 206, 89, 131, 133, 138, 89, 194, 161, 226, 150, 180, // ..Y...Y..... + 158, 61, 66, 11, 137, 104, 215, 70, 56, 47, 8, 7, // .=B..h.F8/.. + 41, 107, 160, 121, 15, 121, 109, 142, 231, 117, 154, 107, // )k.y.ym..u.k + 208, 64, 79, 129, 203, 128, 98, 216, 245, 116, 69, 164, // .@O...b..tE. + 208, 69, 246, 132, 227, 232, 213, 247, 166, 207, 237, 29, // .E.......... + 221, 210, 166, 223, 65, 67, 189, 74, 147, 236, 209, 9, // ....AC.J.... + 240, 251, 140, 170, 220, 112, 201, 221, 178, 220, 224, 5, // .....p...... + 50, 77, 252, 72, 168, 155, 244, 160, 253, 40, 20, 1, // 2M.H.....(.. + 87, 69, 234, 42, 79, 112, 168, 167, 23, 17, 135, 17, // WE.*Op...... + 55, 32, 124, 107, 134, 180, 17, 98, 59, 7, 118, 6, // 7 |k...b;.v. + 181, 11, 28, 28, 242, 216, 51, 36, 92, 184, 228, 170, // ......3$.... + 69, 132, 11, 244, 50, 248, 157, 195, 25, 44, 46, 50, // E...2....,.2 + 50, 224, 209, 249, 51, 42, 209, 68, 124, 102, 110, 175, // 2...3*.D|fn. + 12, 176, 248, 220, 0, 221, 144, 171, 71, 29, 225, 213, // ........G... + 57, 94, 104, 128, 103, 168, 218, 9, 253, 221, 67, 62, // 9^h.g.....C> + 132, 216, 160, 122, 31, 27, 214, 92, 25, 84, 68, 144, // ...z.....TD. + 132, 202, 145, 204, 112, 112, 89, 35, 200, 92, 5, 122, // ....ppY#...z + 13, 2, 223, 216, 142, 138, 57, 33, 29, 134, 189, 15, // ......9!.... + 62, 216, 35, 89, 243, 26, 90, 120, 182, 79, 222, 196, // >.#Y..Zx.O.. + 72, 77, 124, 140, 80, 35, 157, 201, 48, 97, 27, 35, // HM|.P#..0a.# + 67, 32, 192, 8, 24, 36, 14, 226, 231, 100, 42, 119, // C ...$...d*w + 85, 251, 97, 114, 245, 232, 78, 139, 213, 206, 55, 134, // U.ar..N...7. + 130, 9, 111, 94, 180, 64, 129, 251, 208, 85, 140, 109, // ..o^.@...U.m + 140, 235, 184, 122, 140, 4, 18, 109, 92, 149, 235, 227, // ...z...m.... + 146, 100, 66, 50, 36, 82, 251, 194, 0, 39, 95, 62, // .dB2$R...'_> + 50, 221, 184, 14, 42, 60, 242, 66, 89, 6, 31, 206, // 2...*<.BY... + 108, 62, 39, 195, 106, 205, 144, 19, 238, 194, 182, 145, // l>'.j....... + 193, 141, 94, 219, 200, 208, 140, 184, 71, 40, 71, 68, // ..^.....G(GD + 218, 2, 189, 180, 92, 71, 149, 66, 146, 170, 100, 184, // .....G.B..d. + 152, 65, 52, 131, 41, 108, 59, 193, 7, 198, 144, 143, // .A4.)l;..... + 200, 11, 206, 243, 55, 116, 9, 95, 217, 242, 232, 39, // ....7t._...' + 220, 49, 251, 210, 98, 89, 62, 58, 148, 216, 93, 92, // .1..bY>:..]. + 41, 51, 45, 143, 84, 130, 229, 196, 200, 229, 156, 181, // )3-.T....... + 6, 3, 82, 86, 67, 223, 201, 12, 115, 102, 33, 103, // ..RVC...sf!g + 51, 116, 3, 173, 129, 213, 54, 112, 187, 238, 246, 199, // 3t....6p.... + 93, 97, 194, 63, 75, 75, 64, 61, 108, 161, 126, 14, // ]a.?KK@=l.~. + 77, 179, 3, 244, 228, 134, 224, 153, 199, 248, 114, 226, // M.........r. + 199, 42, 141, 139, 203, 236, 209, 153, 222, 255, 199, 217, // .*.......... + 162, 89, 93, 229, 23, 63, 61, 58, 217, 29, 152, 129, // .Y]..?=:.... + 235, 178, 115, 56, 55, 67, 43, 96, 15, 195, 71, 246, // ..s87C+`..G. + 177, 231, 33, 177, 218, 114, 57, 236, 29, 198, 17, 232, // ..!..r9..... + 94, 200, 171, 60, 57, 15, 3, 216, 87, 222, 220, 156, // ^..<9...W... + 57, 212, 220, 13, 129, 17, 216, 206, 17, 159, 239, 7, // 9........... + 62, 240, 52, 179, 97, 25, 123, 17, 206, 216, 113, 5, // >.4.a.{...q. + 43, 153, 174, 3, 156, 4, 51, 231, 220, 213, 121, 144, // +.....3...y. + 83, 109, 103, 227, 164, 156, 246, 236, 115, 110, 181, 238, // Smg.....sn.. + 153, 35, 19, 190, 145, 32, 237, 128, 136, 28, 59, 68, // .#... ....;D + 37, 181, 243, 67, 211, 230, 48, 191, 19, 146, 53, 202, // %..C..0...5. + 46, 20, 149, 86, 200, 15, 8, 230, 200, 106, 150, 219, // ...V.....j.. + 139, 60, 159, 168, 192, 195, 238, 124, 44, 154, 22, 73, // .<.....|,..I + 219, 242, 77, 207, 161, 154, 32, 36, 46, 199, 141, 59, // ..M... $...; + 251, 49, 27, 172, 210, 108, 109, 15, 9, 2, 162, 180, // .1...lm..... + 153, 233, 59, 72, 133, 118, 195, 208, 244, 144, 130, 27, // ..;H.v...... + 133, 51, 154, 50, 194, 198, 44, 31, 165, 87, 72, 58, // .3.2..,..WH: + 0, 49, 122, 33, 81, 46, 53, 32, 159, 193, 180, 102, // .1z!Q.5 ...f + 72, 170, 246, 0, 48, 7, 159, 26, 152, 54, 231, 234, // H...0....6.. + 90, 30, 252, 7, 203, 22, 242, 202, 94, 70, 215, 236, // Z.......^F.. + 149, 111, 70, 150, 247, 70, 158, 101, 69, 236, 50, 190, // .oF..F.eE.2. + 225, 42, 25, 254, 152, 203, 92, 122, 11, 22, 49, 205, // .*.....z..1. + 136, 136, 201, 140, 214, 224, 144, 133, 59, 51, 229, 148, // ........;3.. + 160, 125, 50, 130, 29, 102, 2, 50, 129, 35, 139, 153, // .}2..f.2.#.. + 36, 140, 216, 84, 158, 33, 7, 222, 231, 79, 127, 34, // $..T.!...O." + 206, 54, 119, 131, 48, 6, 103, 180, 41, 220, 180, 83, // .6w.0.g.)..S + 90, 169, 111, 205, 230, 104, 238, 251, 52, 91, 36, 121, // Z.o..h..4[$y + 43, 32, 49, 105, 147, 133, 232, 70, 225, 75, 226, 189, // + 1i...F.K.. + 112, 198, 102, 186, 5, 187, 210, 14, 102, 236, 1, 8, // p.f.....f... + 233, 8, 172, 104, 147, 190, 75, 174, 246, 12, 163, 146, // ...h..K..... + 125, 79, 182, 189, 79, 40, 35, 176, 32, 41, 195, 15, // }O..O(#. ).. + 133, 188, 170, 173, 187, 22, 236, 134, 32, 80, 104, 143, // ........ Ph. + 104, 239, 100, 232, 59, 100, 238, 187, 68, 89, 30, 51, // h.d.;d..DY.3 + 250, 174, 16, 189, 136, 231, 239, 201, 160, 120, 116, 222, // .........xt. + 21, 20, 13, 129, 218, 182, 17, 117, 8, 65, 71, 17, // .......u.AG. + 120, 22, 200, 6, 189, 17, 250, 163, 217, 12, 231, 90, // x..........Z + 182, 21, 18, 54, 172, 192, 217, 201, 60, 7, 80, 35, // ...6....<.P# + 210, 94, 90, 155, 23, 227, 54, 52, 13, 187, 210, 27, // .^Z...64.... + 98, 35, 199, 253, 208, 42, 205, 207, 51, 243, 107, 50, // b#...*..3.k2 + 16, 137, 36, 136, 73, 236, 61, 105, 241, 106, 36, 53, // ..$.I.=i.j$5 + 243, 206, 231, 54, 171, 244, 209, 201, 93, 142, 213, 184, // ...6....]... + 156, 223, 138, 176, 1, 127, 238, 228, 114, 218, 34, 167, // ........r.". + 170, 114, 165, 237, 232, 85, 57, 153, 215, 50, 13, 86, // .r...U9..2.V + 111, 199, 227, 192, 250, 62, 39, 139, 68, 70, 142, 57, // o....>'.DF.9 + 250, 105, 163, 34, 103, 135, 205, 14, 7, 117, 6, 132, // .i."g....u.. + 20, 49, 228, 206, 57, 173, 53, 60, 137, 189, 255, 75, // .1..9.5<...K + 169, 96, 71, 76, 91, 88, 238, 61, 199, 191, 253, 135, // .`GL[X.=.... + 89, 31, 114, 94, 142, 179, 138, 54, 209, 202, 136, 54, // Y.r^...6...6 + 70, 180, 139, 234, 56, 79, 170, 248, 177, 33, 59, 192, // F...8O...!;. + 183, 40, 4, 31, 155, 225, 230, 218, 130, 47, 50, 67, // .(......./2C + 205, 14, 3, 132, 138, 92, 86, 38, 208, 72, 80, 130, // ......V&.HP. + 196, 80, 54, 68, 177, 237, 122, 232, 244, 210, 49, 163, // .P6D..z...1. + 136, 149, 78, 40, 193, 26, 66, 28, 203, 34, 161, 126, // ..N(..B..".~ + 230, 157, 219, 225, 189, 95, 195, 217, 187, 129, 115, 149, // ....._....s. + 187, 192, 93, 89, 168, 91, 193, 140, 63, 117, 65, 16, // ..]Y.[..?uA. + 6, 10, 41, 180, 28, 3, 185, 113, 81, 236, 205, 144, // ..)....qQ... + 199, 37, 212, 77, 137, 103, 90, 150, 129, 117, 137, 225, // .%.M.gZ..u.. + 102, 32, 18, 88, 157, 249, 228, 5, 211, 150, 89, 153, // f .X......Y. + 216, 65, 12, 93, 4, 233, 141, 171, 26, 97, 230, 194, // .A.].....a.. + 66, 179, 220, 72, 120, 164, 196, 200, 154, 83, 55, 126, // B..Hx....S7~ + 237, 179, 180, 183, 196, 254, 126, 130, 251, 241, 4, 54, // ......~....6 + 39, 15, 6, 127, 246, 59, 23, 121, 116, 0, 146, 239, // '....;.yt... + 163, 120, 100, 208, 195, 146, 215, 131, 134, 244, 76, 66, // .xd.......LB + 145, 83, 143, 57, 152, 222, 89, 245, 43, 182, 24, 57, // .S.9..Y.+..9 + 103, 127, 135, 160, 217, 229, 175, 31, 27, 65, 203, 236, // g........A.. + 239, 215, 238, 248, 172, 69, 157, 228, 240, 113, 77, 110, // .....E...qMn + 241, 9, 23, 34, 68, 51, 213, 72, 65, 250, 141, 172, // ..."D3.HA... + 194, 71, 45, 99, 112, 45, 202, 249, 99, 131, 21, 103, // .G-cp-..c..g + 165, 176, 245, 182, 129, 241, 232, 248, 49, 91, 47, 210, // ........1[/. + 134, 145, 116, 205, 69, 121, 101, 169, 190, 163, 154, 1, // ..t.Eye..... + 72, 2, 153, 141, 49, 232, 253, 131, 35, 188, 130, 74, // H...1...#..J + 200, 37, 183, 147, 237, 72, 19, 206, 13, 121, 120, 96, // .%...H...yx` + 116, 71, 12, 250, 81, 196, 134, 227, 119, 15, 30, 104, // tG..Q...w..h + 172, 152, 59, 62, 114, 4, 193, 230, 130, 114, 135, 105, // ..;>r....r.i + 69, 145, 146, 238, 29, 114, 183, 227, 47, 242, 155, 116, // E....r../..t + 205, 192, 109, 191, 202, 191, 172, 146, 164, 56, 17, 147, // ..m......8.. + 139, 75, 131, 139, 134, 109, 89, 162, 73, 110, 26, 245, // .K...mY.In.. + 24, 209, 99, 149, 22, 237, 91, 215, 178, 38, 32, 153, // ..c...[..& . + 219, 36, 203, 202, 107, 217, 79, 150, 251, 142, 234, 185, // .$..k.O..... + 235, 169, 158, 219, 174, 85, 178, 144, 253, 168, 208, 119, // .....U.....w + 194, 67, 215, 3, 15, 178, 185, 182, 254, 238, 71, 14, // .C........G. + 190, 190, 106, 154, 178, 152, 222, 53, 105, 147, 37, 71, // ..j....5i.%G + 162, 44, 230, 89, 58, 127, 127, 36, 22, 105, 29, 95, // .,.Y:..$.i._ + 100, 201, 226, 136, 8, 183, 62, 18, 41, 109, 24, 63, // d.....>.)m.? + 183, 176, 164, 103, 222, 241, 145, 88, 149, 155, 164, 226, // ...g...X.... + 135, 190, 53, 63, 110, 15, 25, 24, 18, 68, 63, 215, // ..5?n....D?. + 235, 148, 122, 214, 73, 243, 150, 10, 191, 16, 160, 218, // ..z.I....... + 223, 106, 152, 46, 227, 172, 78, 14, 159, 117, 77, 231, // .j....N..uM. + 23, 244, 182, 93, 216, 52, 217, 200, 97, 218, 183, 85, // ...].4..a..U + 2, 40, 171, 245, 137, 175, 218, 210, 244, 80, 156, 136, // .(.......P.. + 226, 42, 203, 158, 113, 219, 116, 41, 240, 75, 10, 226, // .*..q.t).K.. + 47, 127, 17, 205, 237, 58, 41, 229, 163, 57, 143, 155, // /....:)..9.. + 249, 234, 80, 156, 158, 158, 138, 73, 59, 195, 164, 29, // ..P....I;... + 95, 180, 171, 155, 34, 51, 227, 240, 153, 170, 236, 250, // _..."3...... + 77, 167, 252, 19, 14, 114, 185, 102, 179, 74, 10, 85, // M....r.f.J.U + 211, 118, 147, 111, 84, 199, 45, 93, 183, 40, 98, 41, // .v.oT.-].(b) + 95, 72, 96, 29, 42, 160, 209, 6, 128, 171, 139, 236, // _H`.*....... + 42, 49, 2, 194, 15, 131, 240, 164, 173, 241, 169, 166, // *1.......... + 5, 100, 87, 233, 17, 230, 158, 49, 162, 241, 59, 20, // .dW....1..;. + 82, 158, 60, 121, 126, 193, 88, 227, 45, 158, 30, 200, // R.I...w0 . + 107, 203, 166, 210, 51, 166, 100, 205, 123, 223, 76, 15, // k...3.d.{.L. + 143, 200, 128, 183, 44, 94, 196, 246, 72, 252, 252, 139, // ....,^..H... + 6, 59, 208, 9, 117, 162, 5, 203, 137, 238, 212, 90, // .;..u......Z + 228, 170, 245, 133, 112, 187, 35, 225, 98, 32, 201, 105, // ....p.#.b .i + 67, 222, 88, 164, 27, 153, 111, 149, 165, 27, 226, 14, // C.X...o..... + 34, 146, 164, 106, 168, 216, 49, 200, 7, 2, 160, 88, // "..j..1....X + 147, 146, 35, 46, 48, 146, 13, 173, 175, 54, 160, 95, // ..#.0....6._ + 69, 124, 81, 151, 217, 21, 81, 119, 90, 208, 124, 4, // E|Q...QwZ.|. + 112, 230, 33, 201, 52, 73, 193, 60, 226, 129, 67, 2, // p.!.4I.<..C. + 64, 95, 86, 215, 77, 76, 196, 68, 143, 107, 35, 56, // @_V.ML.D.k#8 + 0, 1, 243, 244, 106, 34, 238, 126, 109, 44, 137, 74, // ....j".~m,.J + 120, 40, 131, 56, 101, 200, 131, 53, 97, 20, 184, 245, // x(.8e..5a... + 250, 17, 105, 34, 30, 104, 56, 212, 104, 185, 241, 21, // ..i".h8.h... + 209, 135, 26, 57, 143, 111, 12, 230, 68, 8, 147, 37, // ...9.o..D..% + 148, 131, 76, 52, 107, 89, 219, 200, 46, 5, 73, 147, // ..L4kY....I. + 1, 223, 82, 21, 235, 6, 91, 222, 46, 178, 152, 16, // ..R...[..... + 199, 197, 150, 198, 72, 6, 128, 188, 150, 101, 149, 139, // ....H....e.. + 36, 174, 19, 131, 64, 47, 22, 87, 21, 243, 9, 244, // $...@/.W.... + 137, 124, 159, 50, 15, 17, 215, 86, 91, 181, 234, 209, // .|.2...V[... + 186, 13, 175, 171, 223, 3, 28, 13, 136, 90, 179, 221, // .........Z.. + 134, 134, 204, 143, 52, 172, 65, 43, 150, 17, 229, 251, // ....4.A+.... + 78, 66, 80, 241, 68, 21, 145, 217, 150, 44, 58, 33, // NBP.D....,:! + 177, 34, 156, 93, 211, 63, 213, 124, 162, 233, 100, 8, // .".].?.|..d. + 88, 8, 138, 78, 113, 162, 66, 10, 13, 109, 158, 227, // X..Nq.B..m.. + 227, 251, 150, 151, 227, 103, 54, 174, 21, 177, 16, 64, // .....g6....@ + 215, 68, 56, 100, 132, 141, 214, 185, 110, 155, 15, 36, // .D8d....n..$ + 107, 158, 44, 210, 171, 188, 181, 16, 226, 91, 40, 237, // k.,......[(. + 131, 51, 130, 38, 85, 108, 159, 31, 175, 239, 27, 68, // .3.&Ul.....D + 33, 56, 111, 104, 190, 118, 192, 126, 16, 31, 131, 188, // !8oh.v.~.... + 40, 110, 65, 210, 215, 41, 153, 124, 49, 167, 78, 144, // (nA..).|1.N. + 103, 90, 136, 162, 188, 102, 43, 82, 52, 171, 180, 134, // gZ...f+R4... + 109, 153, 152, 163, 121, 30, 222, 170, 39, 121, 226, 65, // m...y...'y.A + 156, 236, 85, 78, 82, 37, 180, 130, 65, 215, 11, 138, // ..UNR%..A... + 243, 183, 251, 244, 87, 75, 194, 249, 162, 39, 225, 126, // ....WK...'.~ + 163, 94, 167, 66, 7, 155, 39, 216, 206, 175, 234, 19, // .^.B..'..... + 34, 88, 30, 136, 77, 231, 225, 18, 105, 145, 196, 121, // "X..M...i..y + 69, 59, 99, 93, 25, 101, 145, 221, 30, 156, 189, 196, // E;c].e...... + 66, 200, 220, 163, 119, 187, 29, 58, 27, 158, 168, 201, // B...w..:.... + 39, 140, 251, 99, 123, 28, 255, 183, 246, 250, 71, 211, // '..c{.....G. + 63, 71, 195, 11, 101, 157, 75, 95, 219, 9, 145, 186, // ?G..e.K_.... + 170, 159, 239, 72, 23, 23, 142, 99, 240, 58, 228, 159, // ...H...c.:.. + 52, 145, 135, 217, 72, 46, 152, 105, 13, 109, 171, 111, // 4...H..i.m.o + 103, 195, 7, 164, 66, 118, 111, 59, 67, 182, 147, 93, // g...Bvo;C..] + 44, 110, 103, 12, 219, 169, 137, 141, 118, 64, 158, 187, // ,ng.....v@.. + 91, 224, 135, 17, 155, 236, 161, 159, 93, 130, 210, 31, // [.......]... + 181, 135, 174, 168, 10, 124, 99, 181, 253, 108, 175, 222, // .....|c..l.. + 126, 93, 94, 146, 233, 117, 151, 225, 246, 45, 89, 152, // ~]^..u...-Y. + 248, 106, 230, 59, 182, 82, 149, 41, 75, 198, 249, 143, // .j.;.R.)K... + 224, 163, 129, 53, 74, 186, 79, 42, 199, 159, 168, 48, // ...5J.O*...0 + 80, 143, 147, 137, 166, 141, 126, 94, 19, 162, 185, 221, // P.....~^.... + 247, 84, 184, 191, 29, 93, 174, 46, 242, 180, 121, 200, // .T...]....y. + 112, 37, 89, 189, 90, 45, 42, 168, 243, 175, 227, 58, // p%Y.Z-*....: + 157, 139, 137, 120, 42, 46, 154, 50, 158, 98, 49, 84, // ...x*..2.b1T + 158, 156, 160, 6, 51, 42, 19, 82, 246, 91, 37, 241, // ....3*.R.[%. + 34, 145, 174, 197, 11, 26, 162, 172, 210, 15, 44, 124, // ".........,| + 79, 218, 17, 183, 178, 181, 210, 126, 203, 4, 166, 234, // O......~.... + 36, 94, 167, 199, 12, 147, 201, 145, 184, 83, 67, 108, // $^.......SCl + 149, 213, 170, 96, 117, 104, 46, 211, 34, 206, 178, 219, // ...`uh.."... + 105, 165, 172, 88, 108, 18, 27, 147, 154, 121, 191, 74, // i..Xl....y.J + 237, 104, 191, 83, 103, 67, 85, 54, 50, 53, 137, 93, // .h.SgCU625.] + 165, 109, 226, 88, 214, 142, 98, 188, 40, 43, 90, 87, // .m.X..b.(+ZW + 103, 123, 118, 172, 77, 126, 78, 32, 214, 134, 191, 71, // g{v.M~N ...G + 1, 230, 80, 73, 107, 216, 83, 31, 157, 26, 134, 237, // ..PIk.S..... + 141, 166, 119, 72, 73, 180, 196, 161, 41, 4, 219, 105, // ..wHI...)..i + 125, 222, 249, 109, 92, 176, 57, 174, 158, 109, 141, 170, // }..m..9..m.. + 159, 175, 236, 78, 15, 65, 98, 247, 118, 240, 77, 198, // ...N.Ab.v.M. + 146, 26, 180, 6, 19, 118, 194, 244, 56, 217, 142, 201, // .....v..8... + 120, 103, 23, 110, 191, 174, 44, 190, 72, 178, 14, 38, // xg.n..,.H..& + 89, 73, 58, 184, 149, 230, 249, 5, 137, 246, 69, 92, // YI:.......E. + 189, 63, 233, 141, 238, 131, 51, 16, 109, 17, 231, 36, // .?....3.m..$ + 162, 184, 107, 55, 80, 90, 172, 73, 59, 75, 129, 139, // ..k7PZ.I;K.. + 246, 7, 32, 145, 114, 94, 230, 235, 44, 105, 250, 64, // .. .r^..,i.@ + 128, 1, 130, 131, 40, 254, 239, 171, 148, 52, 93, 199, // ....(....4]. + 133, 250, 6, 11, 82, 248, 113, 214, 163, 164, 195, 145, // ....R.q..... + 68, 153, 188, 73, 81, 11, 35, 64, 217, 32, 221, 80, // D..IQ.#@. .P + 173, 18, 188, 133, 18, 100, 167, 98, 168, 221, 196, 154, // .....d.b.... + 76, 141, 100, 69, 80, 28, 72, 109, 146, 228, 253, 16, // L.dEP.Hm.... + 59, 210, 155, 141, 93, 5, 24, 42, 102, 68, 213, 48, // ;...]..*fD.0 + 85, 130, 222, 91, 162, 13, 214, 101, 69, 141, 27, 35, // U..[...eE..# + 134, 127, 172, 109, 78, 247, 168, 120, 46, 91, 119, 179, // ...mN..x.[w. + 134, 90, 179, 235, 84, 22, 12, 82, 210, 78, 210, 26, // .Z..T..R.N.. + 85, 2, 131, 120, 219, 36, 91, 229, 50, 105, 204, 77, // U..x.$[.2i.M + 76, 222, 217, 225, 86, 240, 157, 218, 1, 180, 91, 33, // L...V.....[! + 254, 129, 200, 7, 147, 94, 19, 248, 31, 66, 254, 90, // .....^...B.Z + 181, 185, 143, 0, 250, 247, 255, 0, 34, 248, 227, 184, // ........"... + 255, 76, 56, 255, 108, 184, 102, 121, 184, 131, 235, 174, // .L8.l.fy.... + 71, 139, 243, 53, 199, 240, 200, 126, 89, 197, 197, 101, // G..5...~Y..e + 194, 166, 140, 84, 7, 219, 135, 233, 160, 49, 102, 186, // ...T.....1f. + 112, 146, 33, 152, 173, 212, 91, 167, 7, 111, 211, 203, // p.!...[..o.. + 66, 124, 71, 38, 19, 220, 92, 26, 84, 26, 180, 242, // B|G&....T... + 163, 208, 161, 221, 212, 78, 70, 110, 247, 208, 217, 24, // .....NFn.... + 10, 196, 131, 143, 173, 166, 245, 247, 89, 94, 123, 109, // ........Y^{m + 16, 233, 166, 150, 2, 78, 106, 209, 79, 212, 202, 108, // .....Nj.O..l + 240, 36, 139, 233, 157, 12, 24, 41, 87, 90, 6, 8, // .$.....)WZ.. + 90, 69, 204, 145, 144, 223, 126, 147, 177, 16, 57, 105, // ZE....~...9i + 23, 185, 146, 143, 209, 222, 160, 135, 110, 178, 233, 70, // ........n..F + 226, 78, 84, 195, 150, 129, 140, 214, 12, 255, 146, 23, // .NT......... + 3, 191, 84, 70, 99, 229, 179, 22, 64, 240, 197, 202, // ..TFc...@... + 224, 56, 238, 59, 142, 59, 236, 153, 71, 242, 167, 110, // .8.;.;..G..n + 179, 107, 150, 41, 83, 58, 2, 39, 45, 220, 6, 190, // .k.)S:.'-... + 21, 251, 146, 125, 148, 68, 51, 239, 31, 134, 36, 172, // ...}.D3...$. + 141, 46, 44, 39, 225, 168, 112, 193, 133, 214, 212, 81, // ..,'..p....Q + 1, 200, 17, 144, 239, 85, 223, 189, 245, 14, 95, 180, // .....U...._. + 99, 112, 197, 216, 125, 84, 167, 221, 222, 77, 38, 5, // cp..}T...M&. + 81, 135, 41, 240, 177, 172, 209, 132, 64, 184, 71, 199, // Q.).....@.G. + 119, 222, 40, 251, 170, 251, 124, 209, 214, 157, 118, 196, // w.(...|...v. + 30, 125, 191, 31, 179, 4, 233, 158, 115, 118, 124, 42, // .}......sv|* + 178, 172, 139, 121, 60, 112, 17, 164, 59, 208, 161, 237, // ...y6..I/W= + 65, 176, 237, 208, 175, 55, 108, 193, 219, 87, 57, 236, // A....7l..W9. + 143, 246, 54, 179, 162, 159, 177, 217, 60, 34, 220, 221, // ..6.....<".. + 165, 119, 188, 204, 83, 74, 111, 100, 48, 48, 49, 134, // .w..SJod001. + 98, 223, 45, 67, 240, 180, 231, 254, 86, 22, 41, 194, // b.-C....V.). + 219, 42, 106, 147, 53, 47, 85, 252, 239, 15, 155, 242, // .*j.5/U..... + 152, 226, 28, 50, 117, 122, 199, 162, 149, 13, 239, 101, // ...2uz.....e + 161, 7, 161, 53, 213, 113, 196, 186, 238, 72, 196, 139, // ...5.q...H.. + 69, 89, 252, 0, 96, 170, 242, 235, 100, 137, 98, 131, // EY..`...d.b. + 240, 87, 142, 160, 115, 30, 223, 208, 80, 77, 178, 166, // .W..s...PM.. + 226, 85, 54, 242, 4, 46, 46, 121, 154, 175, 47, 135, // .U6....y../. + 214, 125, 75, 157, 147, 81, 168, 76, 70, 124, 239, 56, // .}K..Q.LF|.8 + 170, 139, 249, 5, 66, 201, 197, 85, 126, 145, 84, 147, // ....B..U~.T. + 67, 49, 95, 37, 243, 247, 180, 246, 233, 83, 158, 248, // C1_%.....S.. + 41, 207, 252, 84, 234, 141, 103, 90, 172, 11, 139, 145, // )..T..gZ.... + 162, 207, 158, 200, 69, 241, 147, 173, 5, 193, 213, 72, // ....E......H + 186, 71, 209, 111, 102, 163, 5, 234, 190, 190, 28, 175, // .G.of....... + 86, 198, 156, 169, 53, 100, 221, 70, 60, 7, 20, 14, // V...5d.F<... + 181, 166, 237, 25, 129, 98, 93, 60, 130, 184, 244, 190, // .....b]<.... + 241, 141, 236, 123, 134, 249, 62, 181, 239, 182, 95, 62, // ...{..>..._> + 226, 159, 216, 164, 153, 115, 228, 252, 248, 63, 205, 167, // .....s...?.. + 255, 97, 78, 205, 167, 135, 199, 154, 215, 180, 72, 47, // .aN.......H/ + 211, 6, 142, 77, 46, 190, 18, 249, 207, 246, 47, 102, // ...M....../f + 150, 20, 151, 13, 66, 187, 214, 32, 34, 200, 122, 181, // ....B.. ".z. + 15, 9, 242, 50, 201, 160, 161, 245, 161, 110, 160, 158, // ...2.....n.. + 251, 61, 236, 98, 167, 13, 243, 223, 131, 165, 46, 226, // .=.b........ + 143, 97, 159, 78, 215, 113, 85, 39, 223, 102, 37, 137, // .a.N.qU'.f%. + 95, 2, 247, 49, 99, 137, 28, 168, 242, 219, 244, 134, // _..1c....... + 20, 155, 92, 187, 22, 235, 23, 146, 88, 167, 155, 30, // ........X... + 20, 251, 87, 193, 203, 228, 25, 100, 233, 175, 247, 143, // ..W....d.... + 252, 176, 248, 86, 74, 126, 192, 220, 35, 11, 77, 15, // ...VJ~..#.M. + 207, 95, 92, 110, 149, 26, 236, 184, 164, 215, 133, 247, // ._.n........ + 233, 84, 221, 12, 236, 4, 26, 235, 184, 150, 0, 196, // .T.......... + 64, 121, 15, 22, 51, 182, 15, 71, 166, 160, 63, 180, // @y..3..G..?. + 48, 186, 85, 177, 74, 124, 199, 64, 213, 141, 90, 146, // 0.U.J|.@..Z. + 49, 128, 101, 43, 39, 39, 123, 79, 17, 122, 67, 156, // 1.e+''{O.zC. + 239, 10, 49, 68, 136, 84, 131, 219, 22, 188, 64, 229, // ..1D.T....@. + 28, 7, 13, 132, 119, 20, 227, 155, 173, 116, 92, 6, // ....w....t.. + 22, 156, 44, 110, 133, 105, 154, 180, 54, 18, 38, 114, // ..,n.i..6.&r + 44, 5, 35, 6, 231, 16, 58, 74, 249, 180, 24, 248, // ,.#...:J.... + 20, 99, 120, 246, 123, 141, 225, 207, 101, 244, 234, 179, // .cx.{...e... + 194, 128, 237, 159, 148, 248, 86, 232, 96, 177, 250, 25, // ......V.`... + 168, 36, 251, 44, 84, 210, 71, 182, 235, 121, 85, 102, // .$.,T.G..yUf + 25, 78, 171, 111, 97, 42, 19, 54, 229, 193, 247, 137, // .N.oa*.6.... + 240, 173, 127, 123, 214, 81, 19, 47, 191, 35, 167, 135, // ...{.Q./.#.. + 140, 172, 36, 35, 225, 190, 87, 247, 148, 107, 180, 168, // ..$#..W..k.. + 123, 37, 52, 80, 31, 77, 249, 93, 129, 168, 207, 13, // {%4P.M.].... + 4, 211, 13, 24, 157, 197, 6, 85, 78, 73, 108, 126, // .......UNIl~ + 53, 120, 58, 17, 55, 15, 72, 53, 41, 61, 120, 188, // 5x:.7.H5)=x. + 29, 151, 99, 143, 48, 168, 121, 197, 251, 73, 182, 51, // ..c.0.y..I.3 + 104, 153, 2, 91, 130, 28, 120, 116, 82, 60, 244, 84, // h..[..xtR<.T + 105, 107, 16, 15, 246, 211, 94, 75, 224, 15, 208, 224, // ik....^K.... + 193, 94, 150, 148, 244, 164, 224, 72, 10, 97, 61, 221, // .^.....H.a=. + 244, 41, 17, 178, 186, 231, 218, 159, 173, 95, 182, 66, // .)......._.B + 110, 142, 71, 65, 5, 192, 42, 217, 249, 12, 21, 246, // n.GA..*..... + 47, 18, 165, 135, 31, 193, 233, 117, 74, 170, 103, 15, // /......uJ.g. + 78, 7, 8, 108, 15, 146, 135, 104, 248, 66, 169, 236, // N..l...h.B.. + 174, 217, 197, 37, 181, 248, 66, 86, 227, 224, 64, 59, // ...%..BV..@; + 189, 229, 83, 131, 150, 231, 28, 75, 63, 129, 107, 170, // ..S....K?.k. + 97, 47, 253, 164, 206, 151, 167, 13, 59, 103, 119, 159, // a/......;gw. + 112, 192, 59, 140, 153, 83, 105, 59, 20, 75, 58, 107, // p.;..Si;.K:k + 202, 19, 15, 219, 30, 134, 234, 133, 194, 157, 58, 78, // ..........:N + 234, 204, 114, 38, 24, 197, 144, 78, 91, 224, 53, 18, // ..r&...N[.5. + 33, 19, 187, 106, 135, 61, 134, 178, 91, 187, 179, 32, // !..j.=..[.. + 218, 186, 60, 33, 34, 102, 196, 33, 209, 30, 18, 146, // ....>...:..{ + 214, 251, 201, 36, 124, 233, 148, 149, 133, 130, 220, 87, // ...$|......W + 163, 138, 41, 146, 168, 119, 119, 160, 130, 252, 195, 124, // ..)..ww....| + 125, 252, 247, 199, 114, 246, 37, 4, 62, 150, 162, 207, // }...r.%.>... + 233, 158, 10, 24, 252, 169, 128, 132, 199, 244, 80, 219, // ..........P. + 218, 86, 36, 212, 109, 48, 240, 189, 221, 180, 94, 170, // .V$.m0....^. + 180, 125, 54, 128, 44, 208, 250, 146, 49, 174, 225, 84, // .}6.,...1..T + 50, 161, 190, 246, 77, 92, 41, 194, 56, 237, 1, 84, // 2...M.).8..T + 95, 93, 196, 80, 106, 170, 253, 145, 144, 119, 146, 79, // _].Pj....w.O + 26, 238, 225, 128, 79, 158, 13, 6, 42, 215, 124, 154, // ....O...*.|. + 114, 151, 39, 205, 170, 196, 247, 32, 223, 255, 251, 219, // r.'.... .... + 31, 39, 71, 226, 162, 92, 220, 158, 200, 190, 219, 97, // .'G........a + 15, 68, 60, 126, 170, 224, 34, 18, 185, 33, 5, 237, // .D<~.."..!.. + 43, 57, 213, 41, 50, 209, 218, 89, 53, 120, 76, 254, // +9.)2..Y5xL. + 194, 66, 136, 95, 143, 240, 41, 70, 13, 145, 159, 196, // .B._..)F.... + 237, 146, 98, 94, 46, 146, 159, 126, 248, 238, 101, 153, // ..b^...~..e. + 175, 201, 112, 47, 154, 105, 75, 20, 135, 163, 245, 191, // ..p/.iK..... + 127, 166, 19, 160, 100, 219, 233, 68, 18, 34, 108, 244, // ....d..D."l. + 118, 90, 244, 197, 106, 105, 107, 183, 228, 33, 8, 125, // vZ..jik..!.} + 181, 98, 98, 154, 147, 193, 90, 166, 67, 240, 117, 244, // .bb...Z.C.u. + 71, 77, 97, 72, 239, 217, 139, 182, 46, 153, 78, 167, // GMaH......N. + 224, 196, 209, 224, 250, 80, 27, 91, 210, 152, 206, 110, // .....P.[...n + 67, 202, 236, 168, 26, 73, 201, 200, 136, 215, 86, 64, // C....I....V@ + 138, 209, 58, 236, 9, 229, 158, 101, 62, 27, 140, 6, // ..:....e>... + 62, 21, 114, 184, 225, 11, 37, 4, 240, 10, 122, 103, // >.r...%...zg + 58, 232, 183, 125, 96, 201, 104, 189, 111, 205, 95, 148, // :..}`.h.o._. + 239, 15, 117, 44, 252, 173, 170, 202, 234, 132, 161, 197, // ..u,........ + 93, 142, 148, 240, 32, 46, 39, 81, 74, 18, 239, 219, // ]... .'QJ... + 56, 205, 118, 70, 217, 221, 175, 92, 40, 247, 120, 83, // 8.vF....(.xS + 86, 74, 44, 214, 248, 206, 1, 144, 24, 186, 102, 221, // VJ,.......f. + 236, 42, 188, 14, 228, 138, 111, 136, 134, 32, 207, 212, // .*....o.. .. + 95, 124, 18, 139, 100, 147, 206, 19, 178, 71, 38, 35, // _|..d....G&# + 88, 141, 214, 247, 34, 203, 218, 201, 104, 166, 102, 0, // X..."...h.f. + 158, 103, 99, 38, 62, 62, 166, 225, 191, 229, 228, 113, // .gc&>>.....q + 237, 251, 36, 185, 168, 22, 95, 86, 123, 250, 215, 158, // ..$..._V{... + 248, 237, 11, 238, 239, 73, 7, 101, 232, 246, 33, 126, // .....I.e..!~ + 208, 94, 253, 179, 245, 75, 7, 154, 238, 120, 19, 209, // .^...K...x.. + 99, 72, 117, 168, 135, 31, 56, 133, 19, 159, 78, 44, // cHu...8...N, + 7, 135, 158, 109, 111, 149, 3, 106, 146, 46, 95, 188, // ...mo..j.._. + 168, 217, 38, 254, 250, 106, 185, 164, 46, 203, 195, 246, // ..&..j...... + 93, 201, 63, 185, 169, 47, 106, 240, 233, 147, 18, 248, // ].?../j..... + 186, 66, 82, 145, 67, 169, 139, 204, 130, 229, 56, 86, // .BR.C.....8V + 244, 19, 25, 29, 33, 79, 50, 197, 148, 240, 25, 105, // ....!O2....i + 101, 142, 229, 133, 189, 64, 29, 29, 98, 32, 170, 52, // e....@..b .4 + 209, 222, 173, 43, 142, 208, 126, 147, 44, 99, 234, 221, // ...+..~.,c.. + 211, 171, 250, 168, 68, 255, 106, 228, 34, 174, 147, 246, // ....D.j."... + 211, 17, 5, 242, 61, 16, 87, 97, 252, 61, 0, 7, // ....=.Wa.=.. + 44, 151, 197, 51, 109, 143, 76, 79, 75, 104, 246, 27, // ,..3m.LOKh.. + 237, 212, 251, 139, 101, 161, 98, 162, 227, 15, 86, 164, // ....e.b...V. + 169, 241, 247, 178, 53, 18, 210, 2, 186, 142, 12, 39, // ....5......' + 206, 14, 94, 149, 215, 82, 197, 47, 210, 56, 43, 47, // ..^..R./.8+/ + 117, 165, 188, 44, 250, 149, 222, 123, 154, 59, 56, 74, // u..,...{.;8J + 107, 115, 114, 134, 95, 136, 202, 180, 26, 105, 112, 12, // ksr._....ip. + 146, 255, 15, 212, 217, 0, 230, 111, 179, 235, 185, 217, // .......o.... + 118, 255, 217, 80, 60, 159, 39, 235, 166, 11, 229, 202, // v..P<.'..... + 71, 229, 227, 237, 228, 160, 13, 227, 174, 195, 68, 180, // G.........D. + 246, 23, 92, 199, 41, 252, 124, 28, 33, 215, 193, 9, // ....).|.!... + 254, 93, 134, 136, 218, 142, 158, 36, 50, 248, 66, 164, // .].....$2.B. + 105, 143, 253, 134, 209, 27, 216, 206, 56, 187, 133, 28, // i.......8... + 24, 101, 172, 180, 213, 227, 200, 238, 255, 0, 220, 152, // .e.......... + 4, 43, 40, 122, 0, 0, 0 // .+(z.. }; static const unsigned char v3[] = { 31, 139, 8, 8, 229, 145, 21, 101, 0, 3, 104, 105, // .......e..hi @@ -1722,869 +1740,868 @@ static const unsigned char v4[] = { 199, 3, 0, 0, 0 // .... }; static const unsigned char v5[] = { - 31, 139, 8, 8, 151, 240, 25, 101, 0, 3, 109, 97, // .......e..ma + 31, 139, 8, 8, 249, 54, 65, 101, 0, 3, 109, 97, // .....6Ae..ma 105, 110, 46, 99, 115, 115, 0, 237, 60, 107, 143, 227, // in.css...`...% - 181, 25, 68, 100, 91, 214, 164, 143, 202, 119, 171, 73, // ..Dd[....w.I - 63, 210, 98, 23, 68, 101, 157, 144, 218, 2, 200, 134, // ?.b.De...... - 253, 12, 28, 163, 41, 179, 52, 49, 190, 35, 75, 178, // ....).41.#K. - 38, 209, 73, 235, 107, 89, 237, 193, 138, 203, 162, 37, // &.I.kY.....% - 69, 27, 124, 250, 116, 218, 183, 121, 214, 103, 105, 65, // E.|.t..y.giA - 172, 61, 73, 119, 251, 54, 112, 237, 229, 198, 58, 144, // .=Iw.6p...:. + 39, 201, 237, 118, 43, 202, 111, 15, 89, 47, 149, 74, // '..v+.o.Y/.J + 242, 107, 119, 246, 110, 19, 220, 12, 60, 118, 145, 44, // .kw.n...../F + 27, 166, 217, 49, 45, 146, 184, 105, 140, 183, 133, 189, // ...1-..i.... + 176, 61, 227, 175, 198, 143, 191, 253, 147, 241, 187, 52, // .=.........4 + 38, 69, 67, 160, 181, 111, 219, 170, 9, 62, 127, 86, // &EC..o...>.V + 72, 237, 184, 204, 127, 248, 252, 131, 25, 132, 219, 150, // H........... + 212, 102, 16, 145, 109, 89, 147, 46, 42, 223, 173, 38, // .f..mY..*..& + 253, 72, 139, 93, 16, 149, 117, 66, 106, 11, 32, 27, // .H.]..uBj. . + 246, 51, 112, 140, 166, 204, 210, 196, 248, 142, 44, 201, // .3p.......,. + 154, 68, 189, 214, 215, 178, 218, 163, 21, 151, 69, 75, // .D........EK + 138, 54, 248, 244, 169, 223, 183, 121, 214, 101, 105, 65, // .6.....y.eiA + 172, 61, 73, 119, 251, 54, 112, 237, 229, 198, 58, 146, // .=Iw.6p...:. 232, 53, 109, 173, 150, 188, 183, 56, 18, 177, 194, 228, // .5m....8.... - 47, 93, 3, 72, 199, 249, 126, 99, 229, 229, 135, 213, // /].H..~c.... - 134, 17, 197, 4, 254, 198, 42, 213, 150, 242, 115, 11, // ......*...s. - 195, 88, 219, 48, 79, 179, 99, 240, 91, 24, 177, 54, // .X.0O.c.[..6 - 222, 194, 218, 252, 47, 146, 189, 145, 54, 141, 67, 179, // ..../...6.C. - 9, 139, 198, 106, 72, 157, 110, 57, 41, 9, 219, 174, // ...jH.n9)... - 38, 0, 106, 91, 152, 92, 19, 124, 138, 223, 92, 247, // &.j[...|.... - 147, 249, 169, 105, 28, 247, 19, 163, 1, 14, 105, 216, // ...i......i. - 166, 101, 161, 80, 149, 85, 243, 241, 201, 88, 120, 167, // .e.P.U...Xx. - 168, 76, 142, 125, 30, 214, 187, 180, 8, 156, 141, 58, // .L.}.......: - 171, 180, 216, 195, 56, 237, 105, 95, 247, 28, 226, 108, // ....8.i_...l - 226, 50, 43, 107, 129, 225, 234, 179, 218, 178, 178, 14, // .2+k........ - 105, 210, 238, 3, 183, 122, 63, 133, 81, 84, 7, 7, // i....z?.QT.. - 32, 32, 15, 95, 218, 180, 205, 200, 215, 199, 126, 164, // ._......~. - 156, 132, 196, 101, 77, 229, 9, 186, 2, 250, 227, 152, // ...eM....... - 70, 82, 182, 45, 73, 54, 215, 8, 78, 123, 215, 220, // FR.-I6..N{.. - 123, 230, 126, 97, 238, 125, 115, 191, 52, 247, 171, 158, // {.~a.}s.4... - 78, 145, 106, 79, 136, 69, 33, 135, 241, 36, 194, 126, // N.jO.E!..$.~ - 44, 186, 62, 144, 160, 139, 204, 166, 173, 203, 98, 215, // ,.>.......b. - 171, 76, 162, 50, 3, 49, 78, 113, 153, 16, 243, 53, // .L.2.1Nq...5 - 74, 204, 170, 38, 96, 136, 188, 234, 85, 107, 117, 41, // J..&`...Uku) - 24, 185, 40, 155, 42, 140, 137, 249, 199, 255, 252, 17, // ..(.*....... - 126, 91, 127, 32, 187, 46, 3, 251, 253, 72, 138, 172, // ~[. .....H.. + 47, 135, 6, 144, 142, 243, 253, 198, 202, 203, 15, 171, // /........... + 13, 35, 138, 9, 252, 141, 85, 170, 45, 229, 231, 22, // .#....U.-... + 134, 177, 182, 97, 158, 102, 167, 224, 183, 48, 98, 109, // ...a.f...0bm + 188, 133, 181, 249, 95, 36, 123, 35, 109, 26, 135, 102, // ...._${#m..f + 19, 22, 141, 213, 144, 58, 221, 114, 82, 18, 182, 135, // .....:.rR... + 154, 0, 168, 109, 97, 114, 77, 240, 41, 126, 115, 221, // ...marM.)~s. + 79, 230, 167, 166, 113, 220, 79, 140, 6, 56, 164, 97, // O...q.O..8.a + 155, 150, 133, 66, 85, 86, 205, 199, 39, 99, 225, 245, // ...BUV..'c.. + 81, 153, 156, 186, 60, 172, 119, 105, 17, 56, 27, 117, // Q...<.wi.8.u + 86, 105, 177, 135, 113, 218, 126, 95, 119, 28, 226, 108, // Vi..q.~_w..l + 226, 50, 43, 107, 129, 225, 234, 179, 218, 178, 178, 142, // .2+k........ + 105, 210, 238, 3, 183, 122, 239, 195, 40, 170, 131, 35, // i....z..(..# + 16, 144, 135, 47, 109, 218, 102, 228, 235, 99, 55, 82, // .../m.f..c7R + 78, 66, 226, 178, 166, 242, 4, 135, 2, 250, 227, 152, // NB.......... + 70, 82, 182, 45, 73, 54, 215, 8, 250, 189, 107, 238, // FR.-I6....k. + 61, 115, 191, 48, 247, 190, 185, 95, 154, 251, 85, 71, // =s.0..._..UG + 167, 72, 181, 39, 196, 162, 144, 227, 120, 18, 97, 55, // .H.'....x.a7 + 22, 93, 31, 72, 208, 69, 102, 211, 214, 101, 177, 235, // .].H.Ef..e.. + 84, 38, 81, 153, 129, 24, 125, 92, 38, 196, 124, 141, // T&Q...}.&.|. + 18, 179, 170, 9, 24, 34, 175, 58, 213, 90, 135, 20, // .....".:.Z.. + 140, 92, 148, 77, 21, 198, 196, 252, 227, 127, 254, 8, // ...M........ + 191, 173, 63, 144, 221, 33, 3, 251, 253, 72, 138, 172, // ..?..!...H.. 52, 1, 20, 198, 165, 249, 31, 101, 1, 203, 45, 108, // 4......e..-l - 204, 223, 165, 17, 97, 195, 27, 72, 13, 136, 174, 78, // ....a..H...N - 193, 226, 191, 39, 7, 83, 178, 218, 12, 243, 115, 73, // ...'.S....sI - 126, 106, 242, 48, 203, 148, 57, 63, 57, 223, 159, 154, // ~j.0..9?9... - 14, 164, 238, 42, 5, 186, 94, 126, 63, 50, 165, 179, // ...*..^~?2.. - 169, 202, 38, 165, 19, 173, 73, 6, 67, 190, 145, 205, // ..&...I.C... - 27, 169, 113, 69, 101, 86, 152, 165, 59, 84, 0, 224, // ..qEeV..;T.. - 195, 12, 153, 193, 102, 105, 219, 50, 15, 44, 219, 91, // ....fi.2.,.[ - 226, 144, 192, 26, 76, 12, 77, 108, 193, 90, 205, 72, // ....L.Ml.Z.H - 79, 213, 7, 27, 14, 119, 132, 35, 214, 193, 236, 226, // O....w.#.... - 0, 96, 22, 86, 13, 9, 196, 143, 83, 212, 1, 247, // .`.V....S... - 194, 76, 139, 170, 107, 205, 178, 106, 119, 117, 217, 85, // .L..k..jwu.U - 102, 67, 50, 18, 183, 38, 50, 14, 107, 18, 142, 84, // fC2..&2.k..T - 59, 50, 44, 83, 5, 110, 170, 25, 59, 207, 45, 96, // ;2,S.n..;.-` - 109, 209, 202, 181, 94, 133, 73, 130, 254, 192, 17, 18, // m...^.I..... - 49, 17, 216, 220, 218, 26, 54, 26, 236, 254, 60, 40, // 1.....6...<( - 202, 130, 156, 190, 180, 199, 138, 252, 27, 163, 251, 106, // ...........j - 178, 86, 77, 96, 59, 137, 6, 168, 45, 79, 161, 197, // .VM`;...-O.. - 72, 228, 130, 15, 171, 138, 132, 192, 42, 38, 1, 195, // H.......*&.. - 108, 162, 48, 126, 197, 25, 23, 137, 212, 23, 85, 188, // l.0~......U. - 138, 72, 243, 112, 71, 216, 192, 1, 245, 28, 219, 50, // .H.pG......2 - 238, 154, 26, 132, 237, 203, 174, 197, 41, 6, 97, 215, // ........).a. - 150, 28, 9, 11, 47, 45, 222, 192, 138, 9, 243, 114, // ..../-.....r - 251, 48, 41, 15, 172, 119, 85, 151, 59, 16, 179, 233, // .0)..wU.;... - 207, 24, 59, 8, 132, 160, 105, 81, 128, 177, 154, 42, // ..;...iQ...* - 45, 44, 174, 141, 1, 7, 99, 142, 113, 194, 31, 80, // -,....c.q..P - 33, 248, 252, 97, 154, 241, 254, 235, 220, 196, 81, 159, // !..a......Q. - 219, 148, 100, 201, 134, 11, 111, 149, 219, 45, 168, 46, // ..d...o..-.. - 176, 60, 112, 23, 195, 48, 140, 133, 178, 41, 231, 152, // ..4#VWee. - 88, 87, 85, 143, 235, 69, 110, 244, 166, 203, 97, 37, // XWU..En...a% - 28, 251, 36, 109, 170, 44, 60, 6, 89, 218, 128, 22, // ..$m.,<.Y... - 90, 88, 225, 81, 86, 198, 175, 255, 211, 149, 45, 49, // ZX.QV.....-1 - 147, 196, 76, 50, 115, 155, 238, 192, 197, 154, 19, 215, // ..L2s....... - 99, 238, 107, 179, 66, 103, 32, 253, 231, 137, 206, 19, // c.k.Bg ..... - 230, 54, 133, 152, 25, 217, 145, 34, 233, 135, 85, 151, // .6....."..U. - 147, 162, 51, 203, 204, 236, 240, 97, 2, 131, 55, 237, // ..3....a..7. - 49, 99, 19, 156, 91, 163, 114, 99, 128, 61, 113, 7, // 1c..[.rc.=q. - 8, 139, 158, 232, 62, 10, 216, 82, 128, 153, 196, 100, // ....>..R...d - 79, 189, 149, 220, 73, 83, 84, 95, 130, 99, 73, 219, // O...IST_.cI. - 99, 224, 242, 173, 241, 221, 115, 28, 46, 194, 173, 96, // c.....s....` - 53, 207, 229, 22, 6, 95, 234, 50, 27, 182, 9, 55, // 5...._.2...7 - 72, 220, 213, 13, 208, 84, 101, 138, 207, 179, 83, 0, // H....Te...S. - 26, 71, 31, 146, 8, 68, 66, 182, 97, 151, 129, 139, // .G...DB.a... - 238, 146, 180, 52, 227, 16, 214, 114, 99, 146, 60, 34, // ...4...rc.<" - 137, 153, 110, 235, 48, 39, 102, 154, 239, 204, 50, 250, // ..n.0'f...2. - 11, 250, 135, 230, 109, 103, 190, 165, 9, 41, 165, 225, // ....mg...).. - 168, 185, 116, 111, 150, 167, 73, 146, 145, 19, 118, 100, // ..to..I...vd - 212, 121, 248, 46, 158, 81, 232, 58, 70, 11, 120, 15, // .y...Q.:F.x. - 196, 164, 248, 42, 57, 210, 53, 6, 17, 68, 128, 91, // ...*9.5..D.[ - 50, 169, 203, 74, 15, 38, 104, 64, 192, 253, 27, 58, // 2..J.&h@...: - 105, 176, 144, 245, 14, 214, 154, 131, 31, 5, 156, 122, // i..........z - 20, 240, 189, 100, 32, 29, 64, 146, 170, 46, 91, 104, // ...d .@...[h - 139, 86, 243, 74, 14, 3, 57, 109, 73, 202, 6, 102, // .V.J..9mI..f - 139, 188, 92, 181, 121, 20, 205, 42, 44, 0, 103, 12, // ....y..*,.g. - 141, 163, 108, 164, 5, 236, 178, 143, 18, 28, 188, 33, // ..l........! - 186, 130, 217, 50, 171, 41, 194, 10, 22, 97, 157, 198, // ...2.)...a.. - 109, 1, 62, 35, 0, 231, 241, 158, 130, 83, 59, 50, // m.>#.....S;2 - 170, 93, 29, 38, 41, 65, 167, 92, 151, 185, 37, 159, // .].&)A....%. - 39, 134, 134, 125, 75, 195, 243, 200, 182, 156, 224, 64, // '..}K......@ - 91, 105, 17, 102, 82, 22, 120, 48, 238, 73, 98, 125, // [i.fR.x0.Ib} - 144, 186, 20, 176, 162, 203, 97, 203, 198, 22, 219, 135, // ......a..... - 58, 148, 43, 122, 66, 92, 135, 177, 58, 14, 122, 79, // :.+zB...:.zO - 240, 114, 232, 119, 84, 8, 115, 69, 124, 105, 56, 213, // .r.wT.sE|i8. - 251, 20, 197, 87, 248, 118, 187, 85, 112, 28, 184, 136, // ...W.v.Up... - 158, 188, 237, 234, 201, 153, 246, 226, 94, 216, 49, 28, // ........^.1. - 227, 59, 7, 254, 40, 20, 243, 168, 75, 80, 54, 28, // .;..(...KP6. - 73, 116, 108, 148, 117, 181, 152, 77, 84, 227, 138, 166, // Itl.u..MT... - 134, 227, 16, 140, 88, 235, 176, 105, 21, 43, 28, 233, // ....X..i.+.. - 42, 17, 128, 125, 71, 196, 122, 227, 16, 120, 142, 192, // *..}G.z..x.. - 62, 146, 182, 192, 208, 82, 193, 54, 164, 74, 67, 209, // >....R.6.JC. - 192, 125, 33, 132, 22, 34, 240, 237, 50, 150, 75, 2, // .}!.."..2.K. - 39, 2, 74, 148, 46, 169, 68, 76, 68, 150, 152, 169, // '.J...DLD... - 236, 18, 53, 158, 132, 4, 11, 159, 165, 195, 245, 89, // ..5........Y - 14, 8, 54, 221, 147, 221, 212, 86, 89, 100, 199, 94, // ..6....VYd.^ - 46, 221, 48, 130, 0, 14, 30, 138, 27, 25, 245, 10, // ..0......... - 135, 130, 63, 165, 207, 22, 110, 220, 66, 104, 9, 66, // ..?...n.Bh.B - 109, 51, 80, 22, 243, 54, 155, 56, 75, 43, 8, 198, // m3P..6.8K+.. - 226, 246, 193, 49, 233, 223, 199, 205, 97, 15, 207, 31, // ...1....a... - 186, 158, 241, 49, 112, 168, 195, 74, 4, 81, 124, 121, // ...1p..J.Q|y - 158, 108, 238, 68, 45, 242, 6, 219, 169, 177, 208, 83, // .l.D-......S - 245, 99, 24, 243, 94, 58, 33, 58, 58, 157, 144, 58, // .c..^:!::..: - 63, 123, 155, 190, 131, 43, 150, 83, 163, 205, 147, 45, // ?{...+.S...- - 102, 56, 157, 243, 201, 22, 17, 100, 63, 137, 41, 65, // f8.....d?.)A - 85, 224, 132, 95, 21, 77, 177, 246, 201, 166, 27, 207, // U.._.M...... - 114, 122, 182, 1, 97, 34, 44, 196, 4, 8, 143, 53, // rz..a",....5 - 1, 148, 145, 45, 146, 224, 23, 54, 233, 114, 177, 252, // ...-...6.r.. - 190, 102, 138, 173, 225, 201, 204, 97, 116, 50, 245, 224, // .f.....at2.. - 192, 109, 60, 128, 56, 52, 70, 117, 88, 195, 167, 13, // .m<.84FuX... - 214, 39, 197, 96, 27, 102, 194, 190, 105, 172, 207, 32, // .'.`.f..i.. - 39, 251, 195, 114, 157, 254, 131, 198, 177, 224, 71, 29, // '..r......G. - 4, 188, 124, 241, 159, 94, 190, 74, 160, 255, 196, 128, // ..|..^.J.... - 43, 71, 1, 174, 128, 18, 118, 36, 90, 170, 176, 188, // +G....v$Z... - 126, 87, 167, 52, 150, 235, 114, 152, 47, 128, 12, 239, // ~W.4..r./... - 51, 251, 58, 217, 57, 72, 194, 23, 1, 19, 38, 127, // 3.:.9H....&. - 103, 210, 51, 160, 69, 231, 138, 0, 190, 84, 44, 117, // g.3.E....T,u - 86, 249, 17, 38, 197, 225, 116, 110, 130, 104, 80, 25, // V..&..tn.hP. - 144, 184, 42, 9, 4, 236, 48, 140, 70, 199, 128, 148, // ..*...0.F... - 216, 27, 17, 207, 209, 74, 210, 197, 136, 116, 61, 71, // .....J...t=G - 187, 150, 196, 190, 74, 236, 78, 73, 93, 65, 184, 28, // ....J.NI]A.. - 17, 206, 138, 235, 74, 121, 163, 97, 114, 250, 84, 178, // ....Jy.ar.T. - 65, 62, 170, 67, 41, 75, 54, 200, 66, 17, 124, 228, // A>.C)K6.B.|. - 122, 152, 58, 83, 177, 152, 104, 61, 208, 171, 11, 45, // z.:S..h=...- - 111, 231, 20, 75, 225, 51, 138, 161, 240, 185, 169, 81, // o..K.3.....Q - 196, 122, 140, 224, 61, 104, 216, 50, 14, 98, 112, 155, // .z..=h.2.bp. - 208, 248, 120, 140, 83, 129, 176, 95, 51, 242, 46, 81, // ..x.S.._3..Q - 216, 144, 189, 70, 24, 5, 6, 91, 130, 158, 217, 4, // ...F...[.... - 138, 182, 78, 54, 46, 91, 9, 195, 198, 201, 102, 174, // ..N6.[....f. - 105, 28, 7, 217, 123, 220, 36, 220, 189, 121, 92, 109, // i...{.$..y.m - 0, 243, 4, 108, 193, 33, 203, 94, 102, 67, 60, 65, // ...l.!.^fC.Pa.. - 145, 201, 202, 193, 244, 167, 138, 194, 8, 211, 106, 114, // ..........jr - 37, 212, 228, 124, 208, 8, 176, 156, 240, 43, 112, 13, // %..|.....+p. - 215, 64, 106, 10, 107, 246, 16, 16, 188, 194, 252, 148, // .@j.k....... - 22, 206, 146, 253, 26, 65, 93, 1, 157, 82, 195, 161, // .....A]..R.. - 241, 32, 160, 248, 155, 186, 215, 176, 73, 27, 240, 91, // . ......I..[ - 11, 8, 105, 192, 115, 81, 28, 133, 5, 8, 65, 247, // ..i.sQ....A. - 203, 130, 84, 82, 133, 248, 236, 235, 245, 195, 186, 56, // ..TR.......8 - 32, 218, 90, 52, 235, 156, 139, 125, 69, 228, 52, 141, // .Z4...}E.4. - 126, 43, 145, 102, 147, 145, 218, 91, 88, 63, 204, 178, // ~+.f...[X?.. - 121, 52, 206, 161, 142, 143, 39, 91, 141, 160, 153, 9, // y4....'[.... - 38, 113, 181, 197, 76, 49, 161, 52, 109, 21, 2, 143, // &q..L1.4m... - 10, 121, 186, 151, 240, 7, 57, 180, 66, 250, 104, 206, // .y....9.B.h. - 64, 143, 143, 143, 6, 11, 61, 134, 62, 172, 13, 8, // @.....=.>... - 140, 209, 255, 123, 128, 179, 0, 158, 195, 255, 172, 193, // ...{........ - 145, 17, 141, 110, 212, 14, 44, 170, 23, 152, 63, 235, // ...n..,...?. - 24, 232, 115, 210, 38, 51, 61, 93, 160, 133, 85, 154, // ..s.&3=]..U. - 229, 148, 70, 110, 141, 17, 157, 170, 167, 227, 63, 147, // ..Fn......?. - 158, 142, 83, 61, 29, 117, 61, 225, 227, 113, 74, 99, // ..S=.u=..qJc - 43, 106, 66, 77, 152, 90, 143, 127, 108, 21, 253, 230, // +jBM.Z..l... - 149, 28, 233, 25, 187, 49, 48, 191, 3, 97, 147, 50, // .....10..a.2 - 33, 46, 153, 11, 241, 113, 241, 120, 130, 160, 176, 72, // !....q.x...H - 243, 144, 70, 168, 64, 201, 26, 52, 198, 131, 166, 225, // ..F.@..4.... - 54, 6, 62, 112, 194, 218, 72, 139, 45, 122, 15, 120, // 6.>p..H.-z.x - 114, 176, 243, 189, 197, 195, 78, 61, 15, 96, 179, 116, // r.....N=.`.t - 27, 139, 97, 69, 210, 166, 107, 168, 87, 66, 4, 203, // ..aE..k.WB.. - 132, 176, 12, 151, 14, 213, 1, 236, 105, 134, 238, 171, // ........i... - 1, 71, 75, 127, 183, 36, 175, 168, 142, 89, 100, 214, // .GK..$...Yd. - 64, 144, 90, 145, 176, 125, 112, 77, 112, 220, 224, 162, // @.Z..}pMp... - 33, 236, 118, 183, 53, 174, 146, 161, 171, 119, 185, 171, // !.v.5....w.. - 55, 233, 74, 253, 42, 80, 49, 7, 155, 164, 24, 207, // 7.J.*P1..... - 163, 74, 88, 71, 142, 199, 64, 190, 151, 191, 2, 252, // .JXG..@..... - 7, 226, 115, 204, 166, 136, 75, 5, 139, 38, 134, 84, // ..s...K..&.T - 72, 0, 16, 120, 176, 131, 36, 13, 28, 201, 195, 186, // H..x..$..... - 237, 105, 94, 131, 38, 168, 154, 128, 61, 0, 16, 44, // .i^.&...=.., - 104, 144, 193, 132, 66, 225, 17, 19, 106, 2, 149, 132, // h...B...j... - 129, 78, 54, 94, 82, 164, 219, 163, 32, 145, 77, 46, // .N6^R... .M. - 136, 78, 22, 145, 246, 128, 15, 106, 157, 142, 30, 91, // .N.....j...[ - 4, 22, 148, 26, 86, 104, 137, 112, 8, 157, 40, 228, // ....Vh.p..(. - 197, 94, 50, 224, 98, 61, 64, 61, 6, 26, 0, 62, // .^2.b=@=...> - 5, 184, 178, 253, 142, 59, 19, 23, 2, 211, 171, 37, // .....;.....% - 201, 55, 58, 64, 208, 47, 166, 244, 235, 73, 135, 181, // .7:@./...I.. - 218, 195, 159, 244, 112, 53, 250, 65, 158, 35, 132, 19, // ....p5.A.#.. - 248, 208, 165, 80, 62, 46, 59, 183, 1, 163, 234, 253, // ...P>.;..... - 223, 97, 77, 182, 15, 34, 173, 244, 248, 183, 113, 147, // .aM.."....q. - 249, 24, 65, 93, 195, 97, 172, 110, 200, 16, 220, 179, // ..A].a.n.... - 40, 20, 54, 104, 252, 128, 231, 198, 31, 134, 77, 59, // (.6h......M; - 238, 241, 248, 184, 81, 227, 220, 161, 195, 131, 107, 88, // ....Q.....kX - 198, 249, 94, 176, 106, 5, 204, 255, 86, 130, 162, 102, // ..^.j...V..f - 238, 18, 148, 118, 184, 85, 208, 227, 61, 130, 30, 167, // ...v.U..=... - 130, 98, 216, 125, 121, 212, 163, 50, 170, 118, 26, 57, // .b.}y..2.v.9 - 59, 63, 165, 207, 201, 78, 82, 204, 50, 90, 199, 91, // ;?...NR.2Z.[ - 228, 20, 180, 138, 160, 147, 123, 52, 54, 234, 196, 152, // ......{46... - 122, 87, 20, 87, 222, 102, 210, 243, 180, 214, 253, 66, // zW.W.f.....B - 79, 41, 52, 230, 88, 44, 207, 113, 238, 144, 125, 72, // O)4.X,.q..}H - 255, 142, 110, 126, 234, 93, 244, 224, 121, 207, 134, 183, // ..n~.]..y... - 112, 225, 179, 252, 172, 143, 206, 187, 81, 203, 146, 108, // p.......Q..l - 59, 114, 108, 8, 24, 249, 53, 78, 81, 147, 54, 222, // ;rl...5NQ.6. - 171, 52, 28, 116, 178, 69, 66, 133, 29, 168, 101, 122, // .4.t.EB...ez - 133, 157, 157, 37, 146, 31, 105, 180, 236, 139, 66, 192, // ...%..i...B. - 146, 159, 3, 1, 107, 43, 4, 199, 241, 0, 16, 19, // ....k+...... - 240, 164, 67, 221, 21, 49, 198, 206, 122, 102, 103, 154, // ..C..1..zfg. - 198, 1, 98, 188, 83, 34, 89, 150, 86, 16, 131, 155, // ..b.S"Y.V... - 67, 95, 10, 151, 12, 4, 1, 28, 61, 144, 7, 91, // C_......=..[ - 104, 140, 69, 63, 199, 149, 222, 22, 145, 68, 68, 239, // h.E?.....DD. - 152, 101, 237, 26, 233, 112, 57, 150, 133, 202, 99, 146, // .e...p9...c. - 103, 248, 131, 193, 143, 32, 201, 118, 58, 143, 49, 139, // g.... .v:.1. - 124, 50, 134, 240, 223, 130, 226, 93, 31, 66, 158, 115, // |2.....].B.s - 41, 180, 31, 37, 178, 92, 229, 8, 226, 141, 81, 158, // )..%......Q. - 130, 138, 250, 185, 197, 173, 118, 150, 131, 210, 220, 209, // ......v..... - 20, 47, 199, 101, 137, 163, 41, 129, 88, 252, 163, 99, // ./.e..).X..c - 205, 189, 203, 123, 220, 13, 151, 183, 202, 125, 113, 7, // ...{.....}q. - 119, 7, 184, 187, 11, 248, 60, 223, 192, 189, 6, 181, // w.....<..... - 223, 35, 250, 210, 55, 60, 199, 195, 207, 13, 204, 89, // .#..7<.....Y - 124, 122, 151, 102, 86, 160, 21, 96, 239, 59, 55, 179, // |z.fV..`.;7. - 191, 75, 53, 11, 166, 26, 239, 22, 197, 211, 24, 22, // .K5......... - 142, 182, 16, 152, 244, 35, 86, 52, 121, 14, 100, 59, // .....#V4y.d; - 204, 81, 19, 107, 37, 5, 216, 169, 131, 235, 87, 180, // .Q.k%.....W. - 40, 192, 98, 109, 60, 63, 107, 118, 223, 141, 134, 222, // (.bmL._... - 42, 219, 187, 52, 59, 183, 26, 231, 217, 46, 239, 16, // *..4;....... - 246, 9, 20, 75, 149, 123, 129, 235, 91, 90, 102, 164, // ...K.{..[Zf. - 189, 75, 9, 176, 184, 188, 5, 44, 238, 165, 127, 129, // .K.....,.... - 47, 125, 2, 220, 110, 46, 208, 41, 251, 92, 96, 121, // /}..n..)..`y - 132, 39, 14, 60, 210, 238, 93, 6, 254, 179, 225, 62, // .'.<..]....> - 95, 226, 203, 91, 214, 122, 57, 225, 235, 192, 131, 1, // _..[.z9..... - 111, 29, 178, 204, 138, 143, 97, 1, 218, 119, 122, 108, // o.....a..wzl - 193, 214, 92, 69, 171, 196, 231, 56, 102, 26, 95, 34, // ...E...8f._" - 159, 253, 112, 17, 61, 225, 5, 67, 93, 190, 18, 214, // ..p.=..C]... - 21, 119, 47, 107, 67, 231, 167, 103, 55, 242, 36, 126, // .w/kC..g7.$~ - 240, 47, 130, 32, 142, 146, 37, 113, 37, 129, 203, 17, // ./. ..%q%... - 226, 153, 0, 39, 50, 120, 20, 137, 171, 27, 254, 248, // ...'2x...... - 195, 147, 136, 0, 185, 28, 178, 28, 32, 226, 65, 91, // ........ .A[ - 97, 118, 143, 67, 121, 58, 154, 37, 182, 5, 140, 167, // av.Cy:.%.... - 156, 7, 114, 79, 35, 159, 163, 30, 136, 241, 208, 52, // ..rO#......4 - 166, 95, 205, 242, 95, 13, 3, 44, 180, 14, 235, 57, // ._.._..,...9 - 250, 181, 36, 247, 199, 228, 238, 148, 216, 21, 164, 154, // ..$......... - 40, 238, 236, 84, 7, 213, 96, 226, 69, 224, 216, 37, // (..T..`.E..% - 134, 104, 13, 183, 24, 72, 164, 206, 145, 38, 214, 221, // .h...H...&.. - 49, 95, 113, 1, 224, 14, 140, 221, 113, 135, 121, 122, // 1_q.....q.yz - 133, 124, 50, 196, 98, 61, 219, 69, 132, 54, 213, 81, // .|2.b=.E.6.Q - 177, 211, 112, 97, 162, 147, 75, 226, 213, 136, 216, 157, // ..pa..K..... - 165, 22, 167, 197, 42, 195, 252, 243, 88, 147, 44, 13, // ....*...X.,. - 93, 213, 138, 241, 52, 67, 181, 186, 50, 25, 236, 140, // ]...4C..2... - 238, 120, 212, 137, 204, 89, 156, 201, 74, 35, 176, 125, // .x...Y..J#.} - 178, 89, 68, 205, 202, 36, 244, 234, 32, 94, 60, 193, // .YD..$.. ^<. - 186, 191, 124, 89, 177, 20, 178, 172, 189, 90, 209, 180, // ..|Y.....Z.. - 25, 45, 115, 204, 21, 176, 253, 196, 212, 57, 46, 140, // .-s......9.. - 84, 37, 121, 87, 11, 215, 196, 194, 25, 147, 175, 85, // T%yW.......U - 242, 70, 229, 62, 195, 156, 37, 215, 145, 4, 11, 244, // .F.>..%..... - 70, 21, 123, 107, 124, 202, 83, 64, 134, 237, 17, 110, // F.{k|.S@...n - 33, 113, 57, 129, 80, 53, 31, 33, 151, 18, 89, 148, // !q9.P5.!..Y. - 117, 30, 102, 35, 164, 47, 145, 13, 201, 211, 201, 160, // u.f#./...... - 43, 68, 119, 85, 69, 234, 56, 108, 136, 94, 71, 38, // +DwUE.8l.^G& - 17, 120, 211, 25, 82, 99, 173, 244, 42, 82, 145, 106, // .x..Rc..*R.j - 140, 95, 169, 45, 169, 232, 240, 44, 105, 149, 228, 185, // ._.-...,i... - 101, 59, 180, 42, 143, 233, 104, 28, 197, 176, 211, 132, // e;.*..h..... - 86, 155, 115, 38, 120, 81, 105, 105, 174, 20, 219, 52, // V.s&xQii...4 - 128, 241, 175, 178, 115, 151, 43, 195, 93, 45, 12, 119, // ....s.+.]-.w - 125, 19, 195, 229, 117, 134, 206, 218, 112, 93, 223, 112, // }...u...p].p - 189, 167, 91, 24, 94, 159, 240, 122, 105, 60, 45, 97, // ..[.^..zi<-a - 206, 183, 112, 91, 95, 229, 6, 207, 209, 21, 48, 116, // ..p[_.....0t - 111, 225, 246, 116, 221, 24, 174, 1, 65, 207, 242, 38, // o..t....A..& - 213, 61, 95, 87, 29, 132, 14, 190, 177, 184, 62, 83, // .=_W......>S - 12, 34, 175, 155, 118, 141, 81, 158, 119, 147, 33, 144, // ."..v.Q.w.!. - 225, 117, 75, 32, 51, 88, 42, 107, 255, 38, 126, 215, // .uK 3X*k.&~. - 231, 11, 177, 237, 211, 194, 240, 175, 105, 15, 163, 219, // ........i... - 235, 179, 197, 128, 206, 133, 83, 5, 124, 110, 224, 119, // ......S.|n.w - 131, 49, 60, 176, 6, 108, 180, 107, 214, 208, 142, 63, // .1<..l.k...? - 23, 38, 59, 115, 234, 185, 192, 241, 134, 173, 139, 51, // .&;s.......3 - 198, 173, 251, 116, 205, 32, 34, 56, 190, 190, 119, 29, // ...t. "8..w. - 208, 31, 56, 132, 171, 107, 144, 113, 188, 97, 187, 185, // ..8..k.q.a.. - 116, 187, 221, 54, 229, 27, 140, 2, 81, 48, 172, 24, // t..6....Q0.. - 239, 10, 59, 37, 188, 62, 111, 143, 185, 168, 122, 150, // ..;%.>o...z. - 27, 143, 172, 111, 144, 14, 204, 75, 237, 113, 158, 161, // ...o...K.q.. - 44, 130, 239, 181, 170, 117, 139, 150, 2, 75, 244, 201, // ,....u...K.. - 22, 113, 183, 35, 43, 52, 157, 1, 136, 81, 190, 148, // .q.#+4...Q.. - 0, 175, 147, 177, 118, 139, 231, 78, 69, 241, 153, 91, // ....v..NE..[ - 189, 27, 11, 248, 240, 50, 51, 199, 113, 67, 147, 65, // .....23.qC.A - 61, 248, 96, 126, 121, 64, 156, 169, 80, 27, 88, 12, // =.`~y@..P.X. - 25, 83, 133, 230, 81, 231, 55, 79, 37, 228, 51, 249, // .S..Q.7O%.3. - 55, 75, 81, 201, 234, 230, 225, 182, 108, 82, 115, 103, // 7KQ.....lRsg - 202, 34, 57, 229, 202, 77, 41, 188, 155, 197, 51, 148, // ."9..M)...3. - 28, 21, 71, 211, 20, 227, 128, 168, 238, 18, 133, 94, // ..G........^ - 168, 74, 0, 110, 62, 180, 87, 136, 240, 111, 209, 206, // .J.n>.W..o.. - 152, 207, 89, 21, 141, 152, 94, 86, 17, 134, 97, 83, // ..Y...^V..aS - 43, 122, 170, 21, 157, 228, 130, 177, 188, 11, 198, 218, // +z.......... - 252, 111, 232, 188, 86, 42, 11, 102, 106, 40, 199, 12, // .o..V*.fj(.. - 105, 5, 217, 163, 225, 208, 191, 179, 34, 209, 19, 221, // i......."... - 227, 60, 142, 207, 74, 151, 239, 210, 24, 52, 153, 126, // .<..J....4.~ - 97, 32, 125, 36, 97, 28, 54, 43, 147, 125, 187, 55, // a }$a.6+.}.7 - 46, 222, 121, 245, 77, 148, 166, 232, 243, 36, 6, 248, // ..y.M....$.. - 53, 171, 15, 151, 217, 191, 94, 26, 238, 162, 18, 41, // 5.....^....) - 191, 94, 227, 31, 208, 127, 57, 69, 148, 65, 200, 172, // .^....9E.A.. - 106, 64, 58, 90, 141, 37, 117, 185, 84, 176, 207, 154, // j@:Z.%u.T... - 52, 131, 187, 165, 237, 113, 234, 246, 6, 166, 179, 185, // 4....q...... - 219, 51, 172, 49, 210, 185, 135, 183, 187, 128, 168, 108, // .3.1.......l - 241, 12, 241, 182, 119, 133, 55, 134, 41, 119, 73, 189, // ....w.7.)wI. - 196, 240, 108, 137, 159, 43, 156, 249, 3, 237, 62, 230, // ..l..+....>. - 24, 185, 248, 198, 218, 189, 194, 91, 60, 161, 150, 51, // .......[<..3 - 172, 29, 219, 97, 249, 34, 188, 156, 102, 95, 74, 1, // ...a."..f_J. - 81, 214, 213, 106, 209, 144, 44, 49, 86, 128, 162, 184, // Q..j..,1V... - 88, 1, 201, 178, 98, 5, 54, 20, 20, 43, 64, 86, // X...b.6..+@V - 74, 172, 0, 68, 177, 176, 10, 194, 50, 97, 165, 173, // J..D....2a.. - 20, 70, 99, 50, 76, 173, 137, 230, 201, 176, 81, 153, // .Fc2L.....Q. - 52, 254, 243, 240, 84, 189, 235, 180, 230, 208, 228, 147, // 4...T....... - 23, 53, 18, 26, 92, 209, 134, 218, 95, 85, 203, 180, // .5......_U.. - 4, 123, 14, 59, 163, 168, 105, 33, 246, 28, 114, 86, // .{.;..i!..rV - 117, 90, 57, 246, 28, 70, 44, 131, 25, 212, 140, 158, // uZ9..F,..... - 199, 117, 217, 143, 155, 255, 87, 3, 170, 129, 87, 38, // .u....W...W& - 209, 106, 235, 126, 248, 105, 85, 64, 2, 227, 29, 3, // .j.~.iU@.... - 186, 29, 77, 61, 151, 107, 170, 183, 34, 166, 30, 86, // ..M=.k.."..V - 50, 40, 38, 94, 77, 150, 37, 53, 185, 140, 230, 240, // 2(&^M.%5.... - 20, 51, 135, 138, 40, 102, 0, 243, 204, 250, 220, 252, // .3..(f...... - 223, 74, 245, 171, 150, 230, 22, 157, 181, 105, 142, 254, // .J.......i.. - 112, 219, 21, 188, 182, 168, 139, 210, 216, 138, 200, 71, // p..........G - 74, 234, 7, 219, 55, 33, 196, 240, 76, 247, 81, 237, // J...7!..L.Q. - 146, 116, 252, 173, 86, 219, 93, 54, 234, 10, 177, 240, // .t..V.]6.... - 229, 209, 57, 13, 0, 252, 23, 27, 147, 106, 170, 249, // ..9......j.. - 229, 22, 231, 183, 21, 92, 52, 233, 109, 211, 44, 153, // ......4.m.,. - 167, 82, 45, 206, 81, 45, 128, 138, 132, 13, 129, 141, // .R-.Q-...... - 143, 47, 80, 246, 247, 11, 201, 251, 223, 211, 217, 25, // ./P......... - 250, 42, 175, 235, 189, 4, 163, 228, 222, 204, 11, 129, // .*.......... - 223, 32, 221, 119, 105, 188, 111, 60, 212, 30, 11, 38, // . .wi.o<...& - 94, 2, 113, 137, 187, 132, 33, 40, 232, 214, 59, 172, // ^.q...!(..;. - 37, 68, 82, 11, 199, 240, 252, 179, 55, 153, 195, 8, // %DR.....7... - 60, 129, 121, 223, 0, 120, 65, 198, 238, 9, 207, 94, // <.y..xA....^ - 192, 242, 17, 70, 73, 92, 117, 144, 159, 147, 202, 85, // ...FI.u....U - 121, 139, 4, 236, 77, 188, 111, 74, 195, 210, 119, 145, // y...M.oJ..w. - 95, 130, 15, 216, 32, 1, 253, 45, 223, 139, 241, 28, // _... ..-.... - 137, 21, 111, 250, 98, 113, 38, 167, 18, 111, 46, 227, // ..o.bq&..o.. - 113, 147, 255, 119, 11, 244, 77, 54, 237, 165, 96, 90, // q..w..M6..`Z - 0, 162, 113, 225, 71, 5, 103, 204, 73, 244, 24, 70, // ..q.G.g.I..F - 101, 71, 46, 78, 245, 107, 62, 15, 221, 125, 18, 186, // eG.N.k>..}.. - 241, 28, 254, 83, 142, 143, 84, 91, 214, 91, 218, 164, // ...S..T[.[.. - 81, 70, 164, 206, 131, 17, 88, 170, 156, 189, 163, 76, // QF....X....L - 205, 119, 174, 167, 229, 157, 233, 171, 20, 248, 156, 233, // .w.......... - 57, 182, 243, 132, 129, 102, 239, 105, 127, 185, 145, 230, // 9....f.i.... - 251, 243, 18, 16, 111, 185, 90, 144, 8, 235, 223, 216, // ....o.Z..... - 123, 200, 47, 1, 47, 84, 46, 74, 188, 35, 131, 83, // {././T.J.#.S - 14, 73, 38, 47, 41, 43, 56, 181, 167, 240, 65, 232, // .I&/)+8...A. - 230, 100, 151, 27, 189, 196, 243, 138, 30, 189, 192, 81, // .d.........Q - 156, 115, 18, 163, 113, 232, 78, 118, 127, 194, 56, 158, // .s..q.Nv..8. - 15, 199, 48, 223, 191, 228, 239, 134, 129, 198, 78, 99, // ..0.......Nc - 60, 212, 207, 242, 27, 191, 193, 203, 182, 208, 120, 168, // <.........x. - 106, 178, 37, 117, 195, 228, 179, 154, 120, 79, 114, 18, // j.%u....xOr. - 36, 97, 253, 250, 216, 219, 248, 245, 18, 168, 197, 83, // $a.........S - 242, 54, 229, 122, 133, 208, 244, 90, 101, 90, 30, 196, // .6.z...ZeZ.. - 7, 216, 233, 185, 227, 235, 74, 156, 38, 145, 53, 13, // ......J.&.5. - 82, 206, 131, 246, 188, 27, 46, 70, 102, 138, 127, 116, // R......Ff..t - 103, 171, 176, 253, 86, 249, 105, 105, 137, 225, 5, 166, // g...V.ii.... - 149, 239, 192, 1, 180, 183, 155, 252, 37, 152, 121, 191, // ........%.y. - 76, 128, 245, 119, 152, 16, 126, 203, 171, 40, 19, 58, // L..w..~..(.: - 115, 2, 250, 71, 127, 143, 98, 102, 66, 83, 93, 240, // s..G..bfBS]. - 251, 221, 49, 233, 185, 55, 83, 54, 255, 4, 10, 185, // ..1..7S6.... - 229, 253, 133, 129, 238, 252, 59, 12, 3, 205, 133, 247, // ......;..... - 24, 144, 232, 206, 151, 20, 176, 203, 76, 217, 15, 3, // ........L... - 175, 148, 66, 31, 197, 112, 247, 213, 61, 96, 151, 139, // ..B..p..=`.. - 183, 253, 51, 187, 113, 189, 122, 162, 187, 49, 7, 119, // ..3.q.z..1.w - 252, 211, 223, 77, 153, 97, 236, 58, 158, 79, 57, 103, // ...M.a.:.O9g - 187, 151, 96, 246, 253, 83, 68, 236, 45, 191, 31, 85, // ..`..SD.-..U - 88, 32, 240, 96, 85, 239, 189, 82, 62, 139, 176, 159, // X .`U..R>... - 241, 222, 204, 184, 187, 127, 185, 187, 63, 223, 157, 190, // ........?... - 181, 177, 154, 190, 181, 49, 121, 49, 68, 152, 143, 206, // .....1y1D... - 250, 151, 40, 210, 60, 253, 29, 51, 83, 243, 187, 174, // ..(.<..3S... - 76, 0, 0, 0 // L.. + 204, 223, 165, 17, 97, 195, 27, 72, 13, 136, 67, 157, // ....a..H..C. + 130, 197, 127, 79, 142, 166, 100, 181, 25, 230, 231, 146, // ...O..d..... + 188, 111, 242, 48, 203, 148, 57, 63, 57, 223, 247, 205, // .o.0..9?9... + 1, 164, 62, 84, 10, 116, 189, 252, 126, 100, 74, 103, // ..>T.t..~dJg + 83, 149, 77, 74, 39, 90, 147, 12, 134, 124, 35, 155, // S.MJ'Z...|#. + 55, 82, 227, 138, 202, 172, 48, 75, 119, 168, 0, 192, // 7R....0Kw... + 135, 25, 50, 131, 205, 210, 182, 101, 30, 88, 182, 183, // ..2....e.X.. + 196, 33, 129, 53, 152, 24, 154, 216, 130, 181, 154, 145, // .!.5........ + 142, 170, 15, 54, 28, 238, 8, 71, 172, 131, 217, 197, // ...6...G.... + 1, 192, 44, 172, 26, 18, 136, 31, 125, 116, 0, 238, // ..,.....}t.. + 133, 153, 22, 213, 161, 53, 203, 170, 221, 213, 229, 161, // .....5...... + 50, 27, 146, 145, 184, 53, 145, 113, 88, 147, 112, 164, // 2....5.qX.p. + 218, 145, 97, 153, 42, 112, 83, 205, 216, 121, 110, 1, // ..a.*pS..yn. + 107, 139, 86, 174, 245, 42, 76, 18, 244, 7, 142, 144, // k.V..*L..... + 136, 137, 192, 230, 214, 214, 176, 209, 96, 247, 231, 65, // ........`..A + 81, 22, 164, 255, 210, 158, 42, 242, 111, 140, 238, 171, // Q.....*.o... + 201, 90, 53, 129, 237, 36, 26, 160, 182, 60, 133, 22, // .Z5..$...<.. + 35, 145, 11, 62, 172, 42, 18, 2, 171, 152, 4, 12, // #..>.*...... + 179, 137, 194, 248, 21, 103, 92, 36, 82, 95, 84, 241, // .....g.$R_T. + 42, 34, 205, 195, 29, 97, 3, 7, 212, 115, 108, 203, // *"...a...sl. + 248, 208, 212, 32, 108, 87, 30, 90, 156, 98, 16, 30, // ... lW.Z.b.. + 218, 146, 35, 97, 225, 165, 197, 27, 88, 49, 97, 94, // ..#a....X1a^ + 110, 31, 38, 229, 145, 245, 174, 234, 114, 7, 98, 54, // n.&.....r.b6 + 221, 25, 99, 7, 129, 16, 52, 45, 10, 48, 86, 83, // ..c...4-.0VS + 165, 133, 197, 181, 49, 224, 96, 204, 49, 78, 248, 3, // ....1.`.1N.. + 42, 4, 159, 63, 76, 51, 222, 127, 157, 155, 56, 234, // *..?L3....8. + 115, 155, 146, 44, 217, 112, 225, 173, 114, 187, 5, 213, // s..,.p..r... + 5, 150, 7, 238, 98, 24, 134, 177, 80, 54, 229, 28, // ....b...P6.. + 51, 166, 20, 217, 103, 155, 102, 196, 58, 84, 89, 25, // 3...g.f.:TY. + 38, 214, 85, 213, 227, 122, 145, 27, 189, 57, 228, 176, // &.U..z...9.. + 18, 78, 93, 146, 54, 85, 22, 158, 130, 44, 109, 64, // .N].6U...,m@ + 11, 45, 172, 240, 40, 43, 227, 215, 255, 57, 148, 45, // .-..(+...9.- + 49, 147, 196, 76, 50, 115, 155, 238, 192, 197, 154, 19, // 1..L2s...... + 215, 99, 238, 107, 179, 66, 103, 32, 253, 103, 79, 231, // .c.k.Bg .gO. + 9, 115, 155, 66, 204, 140, 236, 72, 145, 116, 195, 170, // .s.B...H.t.. + 203, 73, 113, 48, 203, 204, 60, 224, 195, 4, 6, 111, // .Iq0..<....o + 218, 83, 198, 38, 56, 183, 70, 229, 198, 0, 123, 226, // .S.&8.F...{. + 14, 16, 22, 237, 233, 62, 10, 216, 82, 128, 153, 196, // .....>..R... + 100, 79, 189, 149, 220, 73, 83, 84, 87, 130, 99, 73, // dO...ISTW.cI + 219, 83, 224, 242, 173, 241, 221, 115, 28, 46, 194, 173, // .S.....s.... + 96, 53, 207, 229, 22, 6, 95, 234, 50, 27, 182, 9, // `5...._.2... + 55, 72, 124, 168, 27, 160, 169, 202, 20, 159, 103, 125, // 7H|.......g} + 0, 26, 71, 31, 146, 8, 68, 66, 182, 225, 33, 3, // ..G...DB..!. + 23, 125, 72, 210, 210, 140, 67, 88, 203, 141, 73, 242, // .}H...CX..I. + 136, 36, 102, 186, 173, 195, 156, 152, 105, 190, 51, 203, // .$f.....i.3. + 232, 47, 232, 31, 154, 183, 157, 249, 150, 38, 164, 148, // ./.......&.. + 134, 163, 230, 210, 189, 89, 158, 38, 73, 70, 122, 236, // .....Y.&IFz. + 200, 168, 243, 240, 93, 60, 163, 208, 117, 140, 22, 240, // ....]<..u... + 30, 136, 73, 241, 85, 114, 164, 107, 12, 34, 136, 0, // ..I.Ur.k.".. + 183, 100, 82, 151, 149, 30, 76, 208, 128, 128, 251, 55, // .dR...L....7 + 116, 210, 96, 33, 235, 29, 172, 53, 7, 63, 9, 56, // t.`!...5.?.8 + 245, 40, 224, 123, 201, 64, 58, 128, 36, 85, 93, 182, // .(.{.@:.$U]. + 208, 22, 173, 230, 149, 28, 7, 114, 218, 146, 148, 13, // .......r.... + 204, 22, 121, 185, 106, 243, 36, 154, 85, 88, 0, 206, // ..y.j.$.UX.. + 24, 26, 39, 217, 72, 11, 216, 101, 31, 37, 56, 120, // ..'.H..e.%8x + 67, 116, 5, 179, 101, 86, 83, 132, 21, 44, 194, 58, // Ct..eVS..,.: + 141, 219, 2, 124, 70, 0, 206, 227, 61, 5, 167, 118, // ...|F...=..v + 98, 84, 187, 58, 76, 82, 130, 78, 185, 46, 115, 75, // bT.:LR.N..sK + 62, 79, 12, 13, 251, 150, 134, 231, 145, 109, 57, 193, // >O.......m9. + 129, 182, 210, 34, 204, 164, 44, 240, 96, 220, 147, 196, // ..."..,.`... + 250, 32, 117, 41, 96, 197, 33, 135, 45, 27, 91, 108, // . u)`.!.-.[l + 31, 234, 80, 174, 232, 9, 113, 29, 198, 234, 56, 232, // ..P...q...8. + 61, 193, 203, 161, 223, 81, 33, 204, 21, 241, 165, 225, // =....Q!..... + 84, 239, 83, 20, 95, 225, 219, 237, 86, 193, 113, 224, // T.S._...V.q. + 34, 122, 242, 182, 171, 39, 103, 218, 139, 123, 97, 199, // "z...'g..{a. + 112, 140, 239, 28, 248, 163, 80, 204, 163, 46, 65, 217, // p.....P...A. + 112, 36, 209, 177, 81, 118, 168, 197, 108, 162, 26, 87, // p$..Qv..l..W + 52, 53, 28, 135, 96, 196, 90, 135, 77, 171, 88, 225, // 45..`.Z.M.X. + 68, 87, 137, 0, 236, 15, 68, 172, 55, 14, 129, 231, // DW....D.7... + 8, 236, 35, 105, 11, 12, 45, 21, 108, 67, 170, 52, // ..#i..-.lC.4 + 20, 13, 220, 23, 66, 104, 33, 2, 223, 46, 99, 185, // ....Bh!...c. + 36, 112, 34, 160, 68, 233, 146, 74, 196, 68, 100, 137, // $p".D..J.Dd. + 153, 202, 46, 81, 227, 73, 72, 176, 240, 89, 58, 92, // ...Q.IH..Y:. + 159, 229, 128, 96, 211, 237, 237, 166, 182, 202, 34, 59, // ...`......"; + 117, 114, 233, 134, 17, 4, 112, 240, 80, 220, 200, 168, // ur....p.P... + 87, 56, 20, 252, 41, 125, 182, 112, 227, 22, 66, 75, // W8..)}.p..BK + 16, 106, 155, 129, 178, 152, 183, 217, 196, 89, 90, 65, // .j.......YZA + 48, 22, 183, 15, 142, 73, 255, 62, 110, 142, 123, 120, // 0....I.>n.{x + 254, 208, 245, 140, 143, 129, 99, 29, 86, 34, 136, 226, // ......c.V".. + 203, 179, 183, 185, 19, 181, 200, 27, 108, 167, 198, 66, // ........l..B + 79, 213, 141, 97, 204, 123, 233, 132, 232, 232, 116, 66, // O..a.{....tB + 234, 252, 236, 109, 250, 14, 174, 88, 78, 141, 54, 123, // ...m...XN.6{ + 91, 204, 112, 58, 231, 222, 22, 17, 100, 55, 137, 41, // [.p:....d7.) + 65, 85, 224, 132, 95, 21, 77, 177, 118, 111, 211, 141, // AU.._.M.vo.. + 103, 57, 29, 219, 128, 48, 17, 22, 98, 2, 132, 199, // g9...0..b... + 154, 0, 202, 200, 22, 73, 240, 11, 155, 116, 185, 48, // .....I...t.0 + 193, 235, 193, 89, 219, 120, 216, 112, 104, 60, 10, 52, // ...Y.x.ph<.4 + 41, 6, 210, 32, 37, 251, 166, 113, 60, 131, 244, 246, // ).. %..q<... + 135, 229, 58, 221, 7, 141, 81, 193, 71, 58, 8, 120, // ..:...Q.G:.x + 249, 226, 63, 189, 124, 149, 64, 255, 137, 1, 87, 142, // ..?.|.@...W. + 2, 92, 1, 37, 236, 54, 180, 66, 97, 121, 221, 174, // ...%.6.Bay.. + 78, 105, 156, 118, 200, 97, 46, 0, 50, 188, 207, 236, // Ni.v.a..2... + 171, 183, 115, 203, 23, 79, 121, 183, 134, 176, 193, 206, // ..s..Oy..... + 223, 153, 180, 12, 104, 209, 121, 32, 128, 47, 3, 75, // ....h.y ./.K + 157, 69, 126, 130, 73, 112, 56, 157, 139, 32, 26, 212, // .E~.Ip8.. .. + 1, 36, 174, 74, 2, 193, 56, 12, 163, 209, 49, 32, // .$.J..8...1 + 37, 246, 70, 196, 115, 180, 146, 116, 49, 34, 93, 207, // %.F.s..t1"]. + 209, 174, 37, 177, 175, 18, 187, 83, 82, 87, 16, 46, // ..%....SRW.. + 71, 132, 179, 226, 186, 82, 222, 104, 152, 156, 62, 149, // G....R.h..>. + 108, 144, 143, 234, 80, 202, 146, 13, 178, 80, 4, 31, // l...P....P.. + 185, 30, 166, 206, 84, 44, 38, 90, 15, 244, 12, 193, // ....T,&Z.... + 59, 180, 115, 138, 165, 240, 25, 197, 80, 248, 220, 212, // ;.s.....P... + 40, 98, 61, 70, 240, 30, 52, 36, 25, 7, 40, 184, // (b=F..4$..(. + 5, 104, 236, 59, 198, 169, 64, 216, 139, 25, 121, 151, // .h.;..@...y. + 40, 108, 200, 94, 35, 140, 2, 131, 253, 64, 207, 99, // (l.^#....@.c + 2, 69, 91, 189, 141, 203, 86, 194, 176, 209, 219, 204, // .E[...V..... + 237, 140, 99, 28, 123, 143, 155, 132, 187, 46, 143, 171, // ..c.{....... + 13, 96, 158, 128, 45, 56, 100, 217, 201, 76, 135, 39, // .`..-8d..L.' + 168, 86, 3, 76, 128, 182, 7, 56, 155, 10, 40, 132, // .V.L...8..(. + 89, 160, 34, 80, 205, 30, 3, 12, 2, 99, 211, 134, // Y."P.....c.. + 196, 190, 237, 123, 251, 8, 187, 64, 250, 182, 163, 229, // ...{...@.... + 186, 188, 229, 9, 77, 30, 193, 132, 220, 201, 242, 246, // ....M....... + 82, 180, 133, 36, 71, 144, 68, 128, 4, 100, 237, 9, // R..$G.D..d.. + 208, 19, 135, 60, 11, 34, 207, 231, 16, 42, 236, 16, // ...<."...*.. + 18, 50, 89, 57, 152, 254, 84, 81, 24, 61, 90, 77, // .2Y9..TQ.=ZM + 174, 132, 145, 156, 15, 26, 1, 150, 19, 126, 5, 174, // .........~.. + 225, 26, 72, 77, 97, 205, 30, 30, 246, 175, 48, 63, // ..HMa.....0? + 165, 133, 179, 100, 191, 70, 80, 87, 64, 167, 212, 112, // ...d.FPW@..p + 32, 60, 50, 24, 254, 66, 74, 252, 22, 116, 20, 134, // <2..BJ..t.. + 206, 52, 108, 210, 6, 60, 217, 2, 2, 24, 240, 101, // .4l..<.....e + 20, 71, 97, 1, 66, 208, 217, 178, 144, 148, 84, 33, // .Ga.B.....T! + 62, 233, 58, 253, 104, 46, 142, 131, 182, 22, 187, 58, // >.:.h......: + 231, 34, 93, 17, 39, 77, 99, 221, 74, 36, 213, 100, // ."].'Mc.J$.d + 92, 246, 22, 214, 15, 179, 108, 30, 141, 115, 168, 211, // ......l..s.. + 99, 111, 171, 241, 50, 51, 202, 36, 138, 182, 152, 113, // co..23.$...q + 38, 148, 166, 173, 66, 224, 97, 33, 207, 242, 18, 254, // &...B.a!.... + 32, 135, 86, 72, 31, 205, 25, 232, 233, 241, 209, 96, // .VH.......` + 129, 198, 208, 135, 181, 1, 129, 17, 249, 127, 15, 112, // ...........p + 22, 174, 115, 248, 159, 53, 56, 50, 162, 177, 140, 218, // ..s..582.... + 129, 197, 240, 2, 243, 103, 29, 3, 125, 122, 109, 50, // .....g..}zm2 + 211, 179, 4, 90, 88, 165, 89, 78, 105, 228, 102, 25, // ...ZX.YNi.f. + 209, 169, 122, 58, 253, 51, 233, 233, 52, 213, 211, 73, // ..z:.3..4..I + 215, 19, 62, 48, 167, 52, 182, 162, 38, 212, 132, 169, // ..>0.4..&... + 245, 248, 199, 86, 209, 111, 94, 201, 137, 158, 168, 27, // ...V.o^..... + 3, 179, 57, 16, 69, 41, 19, 226, 146, 185, 16, 13, // ..9.E)...... + 23, 143, 61, 132, 128, 69, 154, 135, 52, 30, 5, 74, // ..=..E..4..J + 214, 160, 17, 29, 52, 13, 183, 49, 240, 17, 20, 214, // ....4..1.... + 70, 90, 108, 209, 123, 192, 179, 132, 157, 230, 45, 30, // FZl.{.....-. + 100, 234, 167, 126, 155, 37, 215, 88, 196, 42, 82, 52, // d..~.%.X.*R4 + 135, 134, 122, 37, 68, 176, 188, 7, 203, 103, 233, 80, // ..z%D....g.P + 29, 192, 158, 111, 232, 190, 26, 112, 189, 244, 119, 75, // ...o...p..wK + 242, 138, 234, 152, 197, 106, 13, 132, 164, 21, 9, 219, // .....j...... + 7, 215, 4, 87, 14, 78, 27, 130, 108, 119, 91, 227, // ...W.N..lw[. + 42, 25, 186, 122, 151, 187, 122, 147, 174, 212, 175, 2, // *..z..z..... + 21, 115, 176, 73, 138, 209, 59, 170, 132, 117, 228, 120, // .s.I..;..u.x + 12, 219, 59, 249, 43, 192, 127, 32, 26, 199, 220, 137, // ..;.+.. .... + 184, 66, 176, 104, 26, 72, 133, 4, 0, 129, 71, 61, // .B.h.H....G= + 72, 210, 192, 1, 60, 172, 219, 142, 102, 49, 104, 58, // H...<...f1h: + 170, 9, 216, 35, 1, 193, 130, 6, 25, 76, 40, 20, // ...#.....L(. + 30, 49, 161, 38, 80, 73, 24, 168, 183, 241, 74, 34, // .1.&PI....J" + 221, 158, 4, 137, 108, 114, 65, 116, 178, 136, 180, 71, // ....lrAt...G + 124, 116, 235, 116, 244, 144, 34, 176, 160, 212, 176, 66, // |t.t.."....B + 75, 132, 67, 48, 69, 33, 47, 246, 146, 1, 23, 235, // K.C0E!/..... + 1, 234, 49, 208, 0, 240, 41, 192, 149, 237, 119, 220, // ..1...)...w. + 153, 184, 16, 152, 94, 45, 73, 190, 209, 1, 130, 126, // ....^-I....~ + 49, 165, 95, 79, 58, 172, 213, 30, 254, 164, 135, 171, // 1._O:....... + 209, 15, 242, 156, 32, 192, 192, 135, 46, 133, 242, 113, // .... ......q + 217, 41, 13, 24, 85, 239, 255, 14, 107, 178, 125, 16, // .)..U...k.}. + 73, 164, 199, 191, 141, 155, 204, 199, 8, 234, 26, 142, // I........... + 94, 117, 67, 134, 112, 159, 197, 165, 176, 65, 227, 7, // ^uC.p....A.. + 60, 37, 254, 48, 108, 218, 113, 143, 199, 199, 141, 26, // <%.0l.q..... + 249, 14, 29, 30, 92, 195, 50, 206, 247, 130, 85, 43, // ......2...U+ + 96, 254, 183, 18, 20, 53, 115, 151, 160, 180, 195, 173, // `....5s..... + 130, 158, 238, 17, 244, 52, 21, 20, 3, 241, 203, 163, // .....4...... + 158, 148, 81, 181, 243, 201, 217, 249, 41, 125, 122, 59, // ..Q.....)}z; + 73, 49, 167, 104, 157, 110, 145, 83, 208, 42, 130, 78, // I1.h.n.S.*.N + 110, 205, 216, 168, 19, 99, 234, 93, 81, 92, 121, 119, // n....c.]Q.yw + 73, 79, 207, 90, 247, 11, 61, 165, 208, 152, 81, 177, // IO.Z..=...Q. + 60, 199, 185, 67, 246, 33, 217, 59, 186, 231, 169, 119, // <..C.!.;...w + 209, 131, 231, 61, 27, 222, 194, 133, 207, 242, 179, 62, // ...=.......> + 58, 239, 70, 45, 75, 178, 237, 200, 177, 33, 96, 228, // :.F-K....!`. + 215, 56, 69, 77, 218, 120, 175, 210, 112, 80, 111, 139, // .8EM.x..pPo. + 244, 9, 59, 98, 203, 100, 10, 59, 77, 75, 36, 63, // ..;b.d.;MK$? + 228, 104, 185, 22, 133, 128, 165, 58, 7, 2, 214, 86, // .h.....:...V + 8, 78, 227, 1, 32, 38, 224, 105, 135, 250, 80, 196, // .N.. &.i..P. + 24, 59, 235, 121, 156, 105, 210, 6, 136, 241, 6, 137, // .;.y.i...... + 100, 89, 90, 65, 12, 110, 14, 125, 41, 92, 50, 16, // dYZA.n.}).2. + 4, 112, 24, 65, 30, 108, 161, 49, 22, 221, 28, 87, // .p.A.l.1...W + 122, 55, 68, 18, 17, 189, 99, 78, 245, 208, 72, 135, // z7D...cN..H. + 203, 177, 44, 84, 30, 147, 60, 195, 31, 12, 126, 4, // ..,T..<...~. + 73, 182, 211, 121, 140, 89, 228, 147, 49, 132, 255, 22, // I..y.Y..1... + 20, 239, 250, 16, 242, 228, 75, 161, 221, 40, 109, 229, // ......K..(m. + 42, 71, 16, 111, 140, 242, 20, 84, 212, 205, 45, 110, // *G.o...T..-n + 181, 179, 28, 148, 102, 138, 166, 120, 57, 46, 75, 29, // ....f..x9.K. + 77, 9, 196, 226, 31, 29, 107, 238, 93, 222, 227, 110, // M.....k.]..n + 184, 188, 85, 238, 139, 59, 184, 59, 192, 221, 93, 192, // ..U..;.;..]. + 231, 249, 6, 238, 53, 168, 253, 30, 209, 151, 190, 225, // ....5....... + 57, 30, 126, 110, 96, 206, 226, 211, 187, 52, 179, 2, // 9.~n`....4.. + 173, 0, 123, 223, 185, 153, 253, 93, 170, 89, 48, 213, // ..{....].Y0. + 120, 183, 40, 158, 198, 176, 112, 180, 133, 192, 164, 27, // x.(...p..... + 177, 162, 169, 114, 32, 219, 97, 70, 154, 88, 43, 41, // ...r .aF.X+) + 192, 78, 29, 92, 191, 144, 69, 1, 22, 107, 227, 249, // .N....E..k.. + 89, 179, 251, 110, 52, 244, 78, 95, 77, 87, 121, 206, // Y..n4.N_MWy. + 175, 166, 41, 87, 136, 168, 240, 100, 123, 59, 91, 199, // ..)W...d{;[. + 240, 150, 30, 178, 190, 192, 22, 151, 207, 61, 76, 113, // .........=Lq + 249, 160, 141, 189, 213, 5, 166, 204, 174, 247, 176, 245, // ............ + 97, 250, 254, 18, 62, 207, 87, 217, 222, 165, 217, 185, // a...>.W..... + 213, 56, 207, 118, 121, 135, 176, 79, 160, 88, 170, 220, // .8.vy..O.X.. + 11, 92, 223, 210, 50, 35, 237, 93, 74, 128, 197, 229, // ....2#.]J... + 45, 96, 113, 47, 253, 11, 124, 233, 19, 224, 118, 115, // -`q/..|...vs + 129, 78, 217, 231, 2, 203, 19, 60, 113, 224, 145, 118, // .N......1......... + 175, 19, 234, 242, 149, 176, 174, 184, 123, 89, 27, 58, // ........{Y.: + 63, 61, 187, 145, 39, 241, 131, 127, 17, 4, 113, 148, // ?=..'.....q. + 44, 137, 43, 9, 92, 142, 16, 207, 4, 56, 145, 193, // ,.+......8.. + 163, 72, 92, 212, 240, 199, 31, 158, 68, 4, 200, 229, // .H......D... + 144, 229, 0, 17, 15, 218, 10, 243, 125, 28, 202, 19, // ........}... + 212, 44, 213, 45, 96, 60, 9, 61, 144, 123, 26, 249, // .,.-`<.=.{.. + 28, 245, 64, 140, 135, 166, 49, 253, 106, 150, 255, 106, // ..@...1.j..j + 24, 96, 161, 117, 88, 207, 209, 175, 37, 185, 63, 38, // .`.uX...%.?& + 119, 167, 196, 174, 32, 213, 68, 113, 103, 167, 58, 168, // w... .Dqg.:. + 6, 19, 47, 2, 199, 174, 53, 68, 107, 184, 215, 64, // ../...5Dk..@ + 34, 117, 142, 52, 213, 238, 142, 249, 138, 43, 1, 119, // "u.4.....+.w + 96, 236, 142, 59, 204, 211, 43, 228, 147, 33, 22, 235, // `..;..+..!.. + 217, 46, 34, 180, 169, 78, 138, 157, 134, 43, 20, 157, // .."..N...+.. + 92, 18, 47, 198, 196, 243, 204, 7, 222, 171, 17, 185, // ../......... + 59, 203, 92, 28, 46, 171, 12, 19, 216, 99, 197, 179, // ;........c.. + 60, 118, 85, 43, 227, 106, 118, 109, 117, 221, 51, 216, // ]3. + 136, 177, 175, 239, 93, 7, 244, 7, 14, 225, 234, 26, // ....]....... + 100, 28, 111, 216, 110, 46, 221, 110, 183, 77, 249, 6, // d.o.n..n.M.. + 163, 64, 48, 13, 43, 198, 187, 194, 78, 137, 210, 207, // .@0.+...N... + 219, 99, 46, 56, 159, 229, 198, 3, 244, 27, 164, 3, // .c.8........ + 243, 82, 123, 156, 103, 40, 43, 231, 59, 173, 212, 221, // .R{.g(+.;... + 162, 245, 195, 18, 221, 219, 34, 124, 119, 100, 89, 167, // ......"|wdY. + 51, 0, 241, 176, 32, 37, 192, 123, 106, 44, 248, 226, // 3... %.{j,.. + 41, 88, 81, 177, 230, 86, 239, 198, 2, 62, 188, 54, // )XQ..V...>.6 + 205, 113, 220, 208, 100, 80, 15, 62, 152, 166, 30, 16, // .q..dP.>.... + 103, 202, 218, 6, 22, 67, 226, 85, 161, 121, 212, 249, // g....C.U.y.. + 205, 83, 9, 249, 76, 254, 205, 50, 93, 178, 36, 122, // .S..L..2].$z + 184, 116, 155, 20, 234, 153, 178, 178, 78, 185, 185, 83, // .t......N..S + 170, 245, 102, 241, 12, 37, 71, 197, 209, 52, 197, 56, // ..f..%G..4.8 + 32, 170, 187, 68, 161, 23, 170, 18, 128, 155, 15, 237, // ..D........ + 21, 34, 252, 91, 180, 51, 230, 115, 86, 69, 35, 166, // .".[.3.sVE#. + 151, 85, 132, 97, 216, 212, 138, 158, 106, 69, 39, 185, // .U.a....jE'. + 96, 44, 239, 130, 177, 54, 255, 27, 58, 175, 149, 2, // `,...6..:... + 133, 153, 194, 203, 49, 67, 90, 118, 246, 104, 56, 244, // ....1CZv.h8. + 239, 172, 72, 244, 96, 248, 56, 143, 227, 179, 210, 229, // ..H.`.8..... + 187, 52, 6, 205, 201, 95, 24, 72, 31, 73, 24, 135, // .4..._.H.I.. + 205, 202, 100, 223, 238, 141, 139, 119, 94, 125, 19, 165, // ..d....w^}.. + 41, 250, 236, 197, 0, 191, 102, 245, 225, 50, 251, 215, // ).....f..2.. + 75, 195, 93, 84, 34, 229, 215, 105, 252, 3, 250, 47, // K.]T"..i.../ + 167, 136, 50, 8, 153, 85, 13, 72, 71, 171, 177, 164, // ..2..U.HG... + 46, 151, 10, 246, 89, 147, 102, 112, 183, 180, 61, 206, // ....Y.fp..=. + 0, 223, 192, 116, 54, 5, 124, 134, 53, 70, 58, 247, // ...t6.|.5F:. + 240, 118, 23, 16, 149, 45, 158, 33, 222, 246, 174, 240, // .v...-.!.... + 198, 48, 229, 46, 169, 151, 24, 158, 45, 241, 115, 133, // .0......-.s. + 51, 127, 160, 221, 199, 28, 35, 23, 223, 88, 187, 87, // 3.....#..X.W + 120, 139, 39, 212, 114, 134, 181, 99, 59, 44, 237, 132, // x.'.r..c;,.. + 119, 220, 236, 75, 169, 67, 202, 14, 181, 90, 123, 36, // w..K.C...Z{$ + 235, 146, 21, 160, 168, 72, 86, 64, 178, 22, 89, 129, // .....HV@..Y. + 13, 85, 200, 10, 144, 213, 31, 43, 0, 81, 97, 172, // .U.....+.Qa. + 130, 176, 182, 88, 105, 43, 213, 212, 152, 83, 83, 11, // ...Xi+...SS. + 169, 121, 78, 109, 84, 91, 141, 255, 60, 60, 85, 239, // .yNmT[..<7..R.... + 69, 103, 109, 154, 163, 63, 220, 30, 10, 94, 162, 116, // Egm..?...^.t + 136, 210, 216, 138, 200, 71, 74, 234, 7, 219, 55, 33, // .....GJ...7! + 196, 240, 76, 247, 81, 237, 146, 28, 248, 171, 176, 182, // ..L.Q....... + 187, 108, 212, 21, 98, 225, 27, 167, 115, 26, 0, 248, // .l..b...s... + 47, 54, 38, 213, 84, 243, 203, 45, 206, 111, 43, 184, // /6&.T..-.o+. + 104, 210, 75, 171, 89, 50, 79, 165, 90, 156, 163, 90, // h.K.Y2O.Z..Z + 0, 21, 9, 27, 2, 27, 31, 223, 186, 236, 238, 23, // ............ + 146, 247, 191, 167, 179, 51, 244, 85, 222, 241, 123, 9, // .....3.U..{. + 70, 201, 189, 153, 183, 8, 191, 65, 186, 239, 210, 120, // F......A...x + 223, 120, 168, 61, 214, 93, 188, 4, 226, 46, 120, 9, // .x.=.]....x. + 67, 80, 208, 173, 87, 97, 75, 136, 164, 22, 142, 225, // CP..WaK..... + 249, 103, 47, 68, 135, 17, 120, 2, 243, 190, 1, 240, // .g/D..x..... + 158, 141, 93, 55, 158, 189, 199, 229, 35, 140, 146, 184, // ..]7....#... + 234, 32, 63, 39, 149, 171, 242, 22, 9, 216, 155, 120, // . ?'.......x + 223, 148, 134, 165, 47, 48, 191, 4, 31, 176, 65, 2, // ..../0....A. + 250, 91, 190, 112, 227, 57, 18, 43, 94, 15, 198, 26, // .[.p.9.+^... + 79, 78, 37, 94, 119, 198, 227, 38, 255, 63, 26, 232, // ON%^w..&.?.. + 235, 111, 218, 155, 196, 180, 142, 68, 227, 194, 143, 10, // .o.....D.... + 206, 152, 147, 232, 49, 140, 202, 142, 92, 156, 234, 215, // ....1....... + 124, 30, 186, 251, 36, 116, 227, 57, 252, 167, 28, 31, // |...$t.9.... + 169, 182, 172, 183, 180, 73, 163, 140, 72, 157, 7, 35, // .....I..H..# + 176, 84, 57, 123, 177, 153, 154, 239, 92, 79, 203, 59, // .T9{.....O.; + 211, 87, 169, 19, 58, 211, 115, 108, 231, 9, 3, 205, // .W..:.sl.... + 222, 211, 254, 114, 35, 205, 247, 231, 149, 36, 222, 114, // ...r#....$.r + 181, 32, 17, 150, 209, 177, 151, 151, 95, 2, 94, 239, // . ......_.^. + 92, 148, 120, 71, 6, 167, 28, 146, 76, 222, 108, 86, // ..xG....L.lV + 112, 106, 79, 225, 131, 208, 205, 201, 46, 55, 122, 137, // pjO......7z. + 231, 21, 61, 122, 129, 163, 56, 231, 36, 70, 227, 208, // ..=z..8.$F.. + 157, 236, 254, 132, 113, 60, 31, 142, 97, 190, 127, 201, // ....q<..a... + 223, 13, 3, 141, 157, 198, 120, 168, 159, 229, 55, 126, // ......x...7~ + 131, 151, 109, 161, 241, 80, 213, 100, 75, 234, 134, 201, // ..m..P.dK... + 103, 53, 241, 158, 228, 36, 72, 194, 250, 245, 177, 179, // g5...$H..... + 241, 235, 37, 80, 107, 176, 228, 109, 202, 245, 66, 163, // ..%Pk..m..B. + 233, 181, 202, 180, 202, 136, 15, 176, 211, 115, 199, 215, // .........s.. + 149, 56, 77, 34, 107, 26, 164, 156, 7, 237, 121, 55, // .8M"k.....y7 + 92, 140, 204, 212, 16, 233, 206, 86, 97, 251, 173, 242, // .......Va... + 211, 210, 18, 195, 155, 81, 43, 223, 129, 3, 104, 103, // .....Q+...hg + 55, 249, 75, 48, 243, 226, 154, 0, 235, 47, 71, 33, // 7.K0...../G! + 252, 150, 55, 90, 38, 116, 230, 4, 244, 143, 254, 58, // ..7Z&t.....: + 198, 204, 132, 166, 186, 224, 247, 187, 99, 210, 115, 47, // ........c.s/ + 184, 108, 254, 9, 20, 114, 203, 107, 16, 3, 221, 249, // .l...r.k.... + 87, 33, 6, 154, 11, 175, 67, 32, 209, 157, 239, 58, // W!....C ...: + 96, 151, 153, 234, 33, 6, 150, 101, 30, 242, 98, 158, // `...!..e..b. + 26, 238, 190, 186, 7, 236, 114, 241, 182, 127, 102, 55, // ......r...f7 + 174, 87, 79, 116, 55, 230, 224, 142, 127, 250, 43, 46, // .WOt7.....+. + 51, 140, 93, 199, 243, 41, 231, 108, 247, 18, 204, 190, // 3.]..).l.... + 216, 138, 136, 189, 229, 119, 163, 10, 11, 4, 30, 173, // .....w...... + 234, 189, 83, 170, 112, 17, 246, 51, 94, 191, 25, 119, // ..S.p..3^..w + 95, 92, 238, 190, 184, 210, 221, 191, 220, 221, 159, 239, // _........... + 78, 223, 29, 89, 77, 223, 29, 153, 188, 158, 34, 172, // N..YM.....". + 79, 149, 246, 75, 148, 138, 246, 127, 7, 220, 180, 72, // O..K.......H + 237, 34, 77, 0, 0, 0 // ."M.. }; static const unsigned char v6[] = { - 31, 139, 8, 8, 184, 237, 25, 101, 0, 3, 109, 97, // .......e..ma - 105, 110, 46, 106, 115, 0, 181, 91, 235, 118, 219, 70, // in.js..[.v.F - 146, 254, 239, 167, 232, 96, 28, 147, 116, 8, 144, 32, // .....`..t.. - 41, 201, 166, 37, 229, 200, 151, 68, 158, 163, 216, 62, // )..%...D...> - 150, 236, 221, 140, 142, 142, 3, 18, 77, 18, 17, 110, // ........M..n - 3, 128, 34, 57, 26, 190, 211, 62, 195, 62, 217, 126, // .."9...>.>.~ - 85, 221, 184, 145, 20, 237, 76, 178, 51, 10, 13, 160, // U.....L.3... - 187, 171, 171, 171, 235, 242, 85, 161, 209, 233, 8, 241, // ......U..... - 238, 253, 213, 155, 161, 56, 251, 240, 86, 140, 29, 223, // .....8..V... - 79, 69, 48, 79, 51, 145, 102, 78, 146, 137, 133, 151, // OE0O3.fN.... - 205, 68, 195, 137, 189, 78, 67, 120, 161, 136, 18, 87, // .D...NCx...W - 38, 34, 139, 68, 42, 147, 59, 41, 178, 153, 20, 78, // &".D*.;)...N - 28, 11, 39, 19, 78, 184, 18, 159, 62, 190, 125, 244, // ..'.N...>.}. - 168, 49, 79, 37, 6, 39, 222, 56, 107, 188, 120, 228, // .1O%.'.8k.x. - 5, 113, 4, 50, 247, 98, 214, 22, 137, 12, 49, 186, // .q.2.b....1. - 45, 208, 225, 50, 115, 50, 201, 87, 111, 38, 19, 57, // -..2s2.Wo&.9 - 206, 248, 242, 163, 156, 180, 197, 44, 11, 252, 182, 248, // .......,.... - 24, 205, 51, 76, 180, 22, 147, 36, 10, 132, 104, 88, // ..3L...$..hX - 157, 209, 60, 116, 125, 105, 253, 158, 86, 137, 190, 29, // ...X.Gh9...f - 61, 59, 52, 241, 223, 249, 192, 58, 234, 127, 62, 178, // =;4....:..>. - 122, 207, 208, 124, 136, 63, 110, 238, 182, 249, 230, 224, // z..|.?n..... - 252, 185, 53, 32, 138, 7, 248, 43, 26, 64, 241, 217, // ..5 ...+.@.. - 193, 231, 190, 53, 56, 56, 171, 13, 1, 207, 118, 191, // ...588....v. - 221, 111, 91, 71, 135, 248, 43, 30, 50, 131, 142, 213, // .o[G..+.2... - 123, 142, 63, 245, 144, 216, 196, 127, 180, 174, 231, 234, // {.?......... - 71, 61, 230, 197, 157, 247, 172, 254, 243, 207, 36, 28, // G=........$. - 146, 203, 81, 155, 127, 20, 203, 131, 182, 213, 59, 56, // ..Q.......;8 - 183, 237, 173, 134, 82, 160, 255, 48, 58, 123, 37, 79, // ....R..0:{%O - 98, 85, 194, 253, 108, 111, 11, 30, 187, 193, 180, 206, // bU..lo...... - 119, 78, 143, 201, 177, 53, 88, 248, 243, 193, 54, 7, // wN...5X...6. - 24, 128, 133, 130, 125, 208, 112, 234, 11, 179, 105, 108, // ....}.p...il - 255, 200, 199, 170, 45, 219, 169, 72, 7, 143, 109, 219, // ....-..H..m. - 178, 7, 21, 41, 210, 163, 129, 53, 56, 202, 119, 164, // ...)...58.w. - 16, 188, 109, 170, 27, 208, 183, 251, 249, 118, 150, 194, // ..m......v.. - 55, 213, 182, 28, 158, 211, 182, 84, 55, 154, 90, 168, // 7......T7.Z. - 219, 103, 236, 100, 85, 53, 176, 145, 246, 1, 196, 0, // .g.dU5...... - 174, 88, 105, 74, 141, 162, 150, 190, 101, 219, 237, 186, // .XiJ....e... - 238, 117, 213, 42, 88, 192, 157, 169, 254, 15, 38, 123, // .u.*X.....&{ - 250, 27, 188, 193, 100, 30, 142, 201, 135, 136, 115, 233, // ....d.....s. - 192, 207, 53, 239, 125, 56, 134, 185, 114, 109, 240, 122, // ..5.}8..rm.z - 169, 204, 46, 103, 209, 226, 210, 115, 229, 200, 161, 251, // ...g...s.... - 242, 102, 221, 18, 247, 143, 4, 252, 99, 54, 79, 66, // .f......c6OB - 229, 63, 30, 29, 187, 222, 93, 190, 127, 163, 169, 185, // .?....]..... - 152, 193, 138, 225, 86, 189, 241, 237, 10, 254, 55, 54, // ....V.....76 - 187, 226, 95, 230, 245, 224, 217, 141, 88, 46, 204, 201, // .._.....X... - 220, 247, 197, 136, 125, 179, 57, 18, 241, 202, 236, 137, // ....}.9..... - 199, 247, 21, 250, 226, 201, 19, 209, 136, 125, 243, 168, // .........}.. - 215, 88, 139, 44, 113, 194, 212, 35, 70, 77, 56, 123, // .X.,q..#FM8{ - 225, 206, 19, 246, 124, 102, 191, 219, 85, 109, 147, 40, // ....|f..Um.( - 9, 140, 83, 240, 83, 101, 33, 94, 130, 168, 158, 9, // ..S.Se!^.... - 19, 116, 69, 64, 63, 19, 95, 46, 5, 24, 11, 82, // .tE@?._....R - 115, 12, 191, 40, 19, 30, 135, 145, 35, 229, 59, 179, // s..(....#.;. - 85, 12, 119, 160, 110, 12, 17, 133, 99, 31, 252, 195, // U.w.n...c... - 33, 202, 59, 114, 148, 117, 137, 52, 249, 217, 119, 119, // !.;r.u.4..ww - 173, 117, 62, 103, 38, 151, 153, 153, 250, 136, 20, 230, // .u>g&....... - 160, 219, 213, 164, 65, 252, 241, 61, 251, 125, 11, 131, // ....A..=.}.. - 210, 126, 209, 123, 102, 30, 26, 162, 163, 231, 239, 228, // .~.{f....... - 23, 149, 37, 48, 179, 244, 99, 218, 98, 234, 196, 230, // ..%0..c.b... - 210, 28, 128, 5, 127, 98, 194, 37, 202, 108, 60, 19, // .....b.%.l<. - 254, 116, 168, 158, 31, 150, 115, 85, 198, 39, 18, 172, // .t....sU.'.. - 120, 136, 122, 21, 66, 112, 113, 249, 84, 59, 38, 171, // x.z.Bpq.T;&. - 74, 166, 152, 114, 199, 44, 24, 154, 198, 78, 88, 95, // J..r.,...NX_ - 119, 32, 54, 215, 15, 125, 154, 74, 151, 194, 176, 147, // w 6..}.J.... - 14, 177, 195, 164, 87, 235, 202, 252, 117, 14, 102, 158, // ....W...u.f. - 235, 202, 144, 166, 27, 249, 209, 248, 150, 46, 102, 106, // ..........fj - 250, 133, 25, 47, 249, 249, 212, 156, 38, 14, 180, 5, // .../....&... - 196, 133, 147, 120, 142, 169, 198, 128, 131, 100, 46, 107, // ...x.....d.k - 75, 99, 169, 171, 128, 8, 13, 242, 50, 159, 188, 60, // Kc......2..< - 171, 183, 33, 60, 108, 198, 73, 190, 39, 74, 231, 215, // ..!....*)u..<. - 64, 114, 205, 192, 21, 49, 172, 45, 87, 3, 31, 238, // @r...1.-W... - 4, 176, 198, 60, 20, 147, 40, 196, 19, 25, 120, 163, // ...<..(...x. - 200, 119, 171, 246, 64, 235, 46, 12, 97, 129, 158, 100, // .w..@...a..d - 12, 133, 192, 31, 43, 241, 172, 115, 161, 23, 82, 135, // ....+..s..R. - 192, 247, 123, 157, 59, 47, 242, 101, 102, 218, 180, 132, // ..{.;/.ef... - 212, 164, 69, 248, 206, 170, 114, 105, 70, 177, 12, 135, // ..E...riF... - 236, 53, 88, 72, 75, 179, 91, 40, 12, 253, 207, 172, // .5XHK.[(.... - 54, 177, 239, 248, 38, 239, 83, 163, 49, 241, 150, 80, // 6...&.S.1..P - 122, 229, 242, 124, 57, 201, 240, 207, 40, 130, 34, 6, // z..|9...(.". - 202, 5, 30, 118, 111, 224, 151, 142, 122, 162, 112, 146, // ...vo...z.p. - 218, 17, 38, 53, 42, 250, 97, 174, 239, 130, 22, 48, // ..&5*.a....0 - 241, 163, 133, 185, 50, 157, 57, 225, 217, 113, 18, 249, // ....2.9..q.. - 62, 180, 205, 92, 213, 198, 41, 63, 202, 14, 180, 182, // >.....)?.... - 76, 236, 93, 226, 77, 103, 153, 26, 157, 51, 180, 229, // L.].Mg...3.. - 54, 75, 87, 49, 142, 124, 17, 192, 254, 104, 179, 87, // 6KW1.|...h.W - 133, 237, 111, 245, 157, 65, 216, 80, 245, 4, 138, 141, // ..o..A.P.... - 245, 237, 116, 32, 172, 5, 164, 1, 74, 67, 150, 126, // ..t ....JC.~ - 213, 81, 28, 212, 29, 37, 217, 104, 197, 67, 210, 22, // .Q...%.h.C.. - 64, 47, 196, 175, 209, 60, 17, 47, 177, 30, 247, 219, // @/...<./.... - 220, 101, 190, 130, 42, 105, 109, 126, 133, 59, 120, 237, // .e..*im~.;x. - 164, 179, 81, 228, 36, 238, 134, 71, 152, 69, 129, 92, // ..Q.$..G.E.. - 107, 123, 235, 24, 100, 87, 104, 34, 227, 172, 120, 132, // k{..dWh"..x. - 109, 106, 26, 203, 167, 27, 196, 198, 209, 180, 160, 149, // mj.......... - 22, 93, 190, 145, 230, 79, 94, 18, 44, 156, 68, 2, // .]...O^.,.D. - 227, 3, 172, 202, 13, 210, 110, 180, 8, 9, 250, 23, // ......n..... - 244, 231, 186, 215, 55, 82, 127, 115, 71, 153, 193, 6, // ....7R.sG... - 81, 199, 151, 73, 86, 80, 148, 186, 203, 54, 197, 175, // Q..IVP...6.. - 185, 66, 69, 188, 121, 95, 115, 128, 215, 138, 30, 67, // .BE.y_s....C - 11, 213, 225, 6, 206, 48, 207, 174, 154, 215, 55, 173, // .....0....7. - 23, 101, 223, 216, 153, 74, 238, 137, 100, 71, 214, 250, // .e...J..dG.. - 217, 232, 86, 244, 3, 163, 137, 76, 103, 228, 84, 201, // ..V....Lg.T. - 121, 50, 115, 19, 138, 142, 77, 78, 2, 213, 140, 157, // y2s...MN.... - 169, 204, 26, 109, 230, 68, 253, 47, 144, 217, 44, 114, // ...m.D./..,r - 225, 10, 63, 188, 191, 188, 66, 203, 40, 114, 87, 67, // ..?...B.(rWC - 241, 247, 203, 247, 239, 44, 202, 4, 195, 169, 55, 89, // .....,....7Y - 53, 239, 137, 133, 161, 160, 223, 117, 171, 173, 199, 174, // 5......u.... - 91, 22, 146, 200, 176, 153, 144, 167, 78, 144, 87, 69, // [.......N.WE - 97, 179, 213, 42, 8, 87, 26, 139, 69, 54, 147, 150, // a..*.W..E6.. - 226, 184, 200, 30, 155, 154, 235, 182, 90, 230, 205, 102, // ........Z..f - 51, 47, 69, 179, 171, 37, 208, 100, 230, 98, 32, 8, // 3/E..%.d.b . - 217, 68, 120, 116, 252, 203, 44, 74, 240, 220, 194, 210, // .Dxt..,J.... - 222, 194, 234, 154, 13, 162, 212, 104, 181, 88, 134, 204, // .......h.X.. - 41, 168, 239, 165, 92, 35, 147, 214, 200, 180, 121, 213, // )....#....y. - 86, 22, 93, 178, 52, 154, 138, 234, 186, 206, 175, 218, // V.].4....... - 128, 171, 217, 118, 46, 9, 36, 159, 142, 35, 130, 82, // ...v..$..#.R - 100, 131, 185, 129, 110, 128, 65, 187, 91, 66, 64, 125, // d...n.A.[B@} - 161, 92, 2, 185, 214, 210, 57, 78, 225, 179, 157, 177, // ......9N.... - 151, 33, 88, 29, 16, 146, 3, 126, 23, 49, 185, 21, // .!X....~.1.. - 118, 34, 228, 96, 139, 192, 83, 11, 55, 85, 39, 243, // v".`..S.7U'. - 156, 40, 58, 227, 91, 23, 108, 82, 144, 75, 202, 59, // .(:.[.lR.K.; - 100, 162, 12, 3, 243, 164, 87, 69, 158, 227, 78, 54, // d.....WE..N6 - 83, 209, 70, 47, 210, 221, 177, 72, 183, 8, 96, 196, // S.F/...H..`. - 41, 0, 209, 88, 154, 97, 180, 72, 156, 248, 129, 133, // )..X.a.H.... - 145, 31, 103, 176, 203, 252, 199, 9, 66, 232, 14, 232, // ..g.....B... - 244, 156, 60, 98, 193, 14, 158, 19, 55, 110, 149, 155, // ...yw%...|.) - 81, 114, 229, 18, 123, 89, 212, 200, 160, 128, 243, 36, // Qr..{Y.....$ - 1, 125, 242, 163, 84, 221, 34, 135, 158, 251, 213, 159, // .}..T."..... - 40, 246, 233, 107, 108, 66, 148, 57, 62, 249, 193, 244, // (..klB.9>... - 4, 25, 140, 98, 237, 131, 76, 120, 96, 175, 43, 202, // ...b..Lx`.+. - 152, 87, 231, 201, 11, 125, 47, 148, 166, 202, 91, 2, // .W...}/...[. - 47, 52, 117, 226, 233, 248, 222, 52, 52, 3, 36, 41, // /4u....44.$) - 62, 226, 50, 215, 172, 176, 0, 103, 105, 206, 36, 97, // >.2....gi.$a - 177, 161, 120, 214, 187, 155, 189, 40, 182, 106, 40, 104, // ..x....(.j(h - 175, 94, 228, 98, 203, 156, 145, 47, 139, 101, 151, 84, // .^.b.../.e.T - 115, 159, 34, 17, 13, 156, 18, 63, 146, 228, 9, 118, // s."....?...v - 87, 196, 134, 96, 228, 184, 149, 148, 72, 217, 79, 113, // W..`....H.Oq - 11, 197, 155, 21, 112, 224, 10, 214, 97, 136, 206, 195, // ....p...a... - 29, 200, 56, 246, 118, 184, 130, 242, 239, 237, 240, 90, // ..8.v......Z - 2, 181, 122, 49, 237, 73, 173, 31, 252, 91, 193, 24, // ..z1.I...[.. - 121, 222, 10, 211, 199, 25, 133, 230, 178, 235, 227, 251, // y........... - 166, 10, 233, 150, 147, 36, 48, 190, 202, 205, 144, 194, // .....$0..... - 157, 21, 56, 113, 83, 178, 203, 104, 178, 23, 65, 212, // ..8qS..h..A. - 135, 15, 105, 173, 75, 242, 37, 65, 220, 144, 136, 247, // ..i.K.%A.... - 2, 153, 87, 112, 42, 89, 243, 158, 138, 133, 53, 44, // ..Wp*Y....5, - 19, 194, 61, 209, 67, 203, 151, 225, 20, 241, 174, 243, // ..=.C....... - 84, 96, 182, 196, 147, 169, 120, 218, 105, 139, 5, 154, // T`....x.i... - 73, 97, 212, 211, 149, 224, 242, 37, 183, 248, 228, 103, // Ia.....%...g - 237, 3, 180, 112, 236, 98, 123, 65, 67, 233, 221, 41, // ...p.b{AC..) - 158, 82, 2, 131, 30, 48, 132, 120, 38, 148, 178, 240, // .R...0.x&... - 224, 21, 133, 80, 34, 112, 64, 205, 191, 10, 103, 233, // ...P"p@...g. - 165, 66, 61, 163, 230, 17, 211, 230, 161, 10, 225, 239, // .B=......... - 32, 191, 130, 254, 17, 115, 7, 149, 71, 228, 107, 61, // ....s..G.k= - 18, 90, 115, 38, 76, 80, 105, 137, 78, 62, 213, 83, // .Zs&LPi.N>.S - 209, 244, 196, 15, 194, 174, 64, 179, 17, 71, 252, 90, // ......@..G.Z - 247, 167, 184, 239, 16, 215, 47, 68, 167, 35, 94, 58, // ....../D.#^: - 137, 102, 186, 28, 179, 218, 26, 131, 223, 89, 51, 174, // .f.......Y3. - 208, 5, 188, 159, 74, 242, 250, 92, 201, 7, 246, 243, // ....J....... - 254, 69, 8, 48, 147, 49, 199, 128, 179, 4, 110, 193, // .E.0.1....n. - 162, 218, 118, 243, 94, 9, 125, 200, 93, 128, 74, 154, // ..v.^.}.].J. - 95, 144, 74, 115, 39, 143, 24, 166, 33, 226, 223, 255, // _.Js'...!... - 6, 211, 224, 156, 137, 241, 44, 224, 140, 38, 66, 134, // ......,..&B. - 72, 89, 127, 211, 77, 91, 123, 211, 201, 96, 245, 87, // HY..M[{..`.W - 187, 87, 159, 247, 113, 30, 199, 50, 25, 59, 169, 252, // .W..q..2.;.. - 22, 47, 59, 96, 192, 192, 228, 174, 100, 128, 129, 14, // ./;`....d... - 184, 133, 84, 64, 53, 19, 189, 193, 108, 183, 63, 202, // ..T@5...l.?. - 43, 63, 185, 39, 41, 107, 251, 148, 36, 171, 80, 110, // +?.')k..$.Pn - 46, 145, 214, 231, 5, 50, 184, 212, 122, 17, 255, 241, // .....2..z... - 125, 248, 116, 241, 131, 143, 88, 141, 232, 184, 46, 60, // }.t...X....< - 202, 227, 123, 222, 164, 102, 55, 87, 69, 101, 112, 94, // ..{..f7WEep^ - 181, 108, 161, 13, 141, 60, 162, 88, 218, 39, 93, 177, // .l...<.X.']. - 178, 225, 98, 87, 89, 211, 107, 173, 197, 178, 71, 21, // ..bWY.k...G. - 150, 244, 7, 80, 95, 139, 85, 175, 108, 168, 150, 249, // ...P_.U.l... - 79, 186, 86, 191, 4, 141, 252, 188, 64, 134, 70, 222, // O.V.....@.F. - 211, 69, 250, 230, 144, 74, 156, 24, 118, 219, 174, 251, // .E...J..v... - 19, 70, 64, 75, 154, 58, 159, 192, 236, 213, 171, 116, // .F@K.:.....t - 215, 135, 241, 242, 70, 208, 107, 136, 106, 193, 10, 157, // ....F.k.j... - 201, 59, 211, 79, 71, 173, 239, 105, 211, 251, 193, 110, // .;.OG..i...n - 85, 139, 86, 191, 21, 190, 164, 34, 140, 80, 201, 97, // U.V....".P.a - 185, 67, 14, 9, 96, 55, 120, 225, 85, 47, 121, 213, // .C..`7x.U/y. - 184, 30, 173, 154, 228, 60, 174, 151, 55, 79, 97, 52, // .....<..7Oa4 - 29, 154, 16, 50, 80, 139, 183, 123, 218, 120, 168, 223, // ...2P..{.x.. - 108, 87, 191, 100, 121, 210, 43, 20, 139, 150, 48, 94, // lW.dy.+...0^ - 57, 33, 103, 210, 187, 164, 80, 157, 153, 252, 202, 183, // 9!g...P..... - 136, 97, 249, 180, 183, 30, 118, 187, 59, 150, 253, 181, // .a....v.;... - 196, 239, 53, 60, 178, 15, 232, 159, 188, 139, 128, 136, // ..5<........ - 24, 226, 181, 197, 120, 230, 249, 46, 34, 240, 215, 234, // ....x..."... - 198, 108, 16, 177, 46, 58, 244, 182, 140, 104, 7, 88, // .l...:...h.X - 46, 203, 7, 123, 139, 153, 219, 181, 88, 47, 156, 148, // ...{....X/.. - 133, 6, 93, 85, 165, 247, 135, 35, 39, 245, 82, 243, // ..]U...#'.R. - 186, 223, 37, 193, 76, 19, 216, 73, 165, 188, 161, 205, // ..%.L..I.... - 19, 96, 135, 237, 19, 80, 164, 87, 17, 249, 131, 56, // .`...P.W...8 - 199, 56, 45, 164, 66, 47, 242, 228, 102, 65, 145, 195, // .8-.B/..fA.. - 26, 239, 22, 156, 86, 163, 209, 178, 210, 216, 247, 178, // ....V....... - 102, 195, 106, 40, 181, 186, 43, 212, 74, 28, 199, 21, // f.j(..+.J... - 247, 212, 19, 180, 87, 119, 172, 157, 249, 254, 0, 100, // ....Ww.....d - 231, 194, 222, 183, 77, 191, 56, 94, 184, 153, 157, 67, // ....M.8^...C - 0, 58, 57, 167, 60, 187, 158, 155, 135, 112, 19, 85, // .:9.<....p.U - 87, 93, 207, 186, 171, 25, 55, 83, 225, 132, 123, 103, // W]....7S..{g - 166, 92, 79, 144, 121, 34, 149, 31, 239, 78, 143, 85, // ..O.y"...N.U - 73, 192, 155, 136, 230, 119, 76, 184, 149, 43, 79, 163, // I....wL..+O. - 177, 215, 121, 239, 82, 31, 82, 172, 52, 24, 82, 169, // ..y.R.R.4.R. - 50, 88, 42, 191, 61, 77, 60, 151, 127, 168, 88, 148, // 2X*.=M<...X. - 162, 129, 138, 221, 197, 173, 210, 195, 65, 174, 96, 143, // ........A.`. - 239, 137, 221, 18, 238, 148, 254, 216, 80, 232, 221, 0, // ........P... - 146, 36, 38, 1, 225, 139, 166, 181, 248, 223, 255, 121, // .$&........y - 101, 80, 218, 116, 197, 93, 166, 81, 228, 242, 237, 219, // eP.t.].Q.... - 106, 217, 37, 226, 178, 140, 206, 172, 40, 51, 170, 103, // j.%.....(3.g - 89, 101, 217, 101, 131, 135, 243, 57, 192, 37, 114, 227, // Ye.e...9.%r. - 77, 6, 102, 250, 249, 90, 124, 95, 153, 27, 185, 81, // M.f..Z|_...Q - 184, 61, 55, 61, 125, 104, 118, 21, 42, 202, 233, 119, // .=7=}hv.*..w - 189, 227, 129, 168, 8, 123, 134, 144, 158, 66, 162, 213, // .....{...B.. - 186, 48, 124, 180, 11, 27, 242, 167, 6, 158, 18, 199, // .0|......... - 92, 96, 170, 154, 99, 205, 97, 232, 52, 200, 96, 189, // .`..c.a.4.`. - 96, 124, 37, 0, 112, 224, 66, 37, 162, 153, 171, 94, // `|%.p.B%...^ - 108, 211, 59, 252, 95, 162, 16, 130, 68, 8, 165, 60, // l.;._...D..< - 94, 134, 238, 230, 139, 148, 29, 49, 241, 235, 187, 111, // ^......1...o - 215, 119, 191, 87, 236, 126, 46, 122, 198, 130, 107, 102, // .w.W.~.z..kf - 235, 36, 151, 116, 28, 121, 0, 160, 44, 161, 45, 17, // .$.t.y..,.-. - 49, 130, 152, 45, 205, 222, 96, 179, 216, 251, 103, 68, // 1..-..`...gD - 84, 56, 120, 37, 170, 171, 25, 36, 52, 38, 206, 72, // T8x%...$4&.H - 84, 78, 40, 46, 63, 255, 44, 188, 128, 171, 103, 83, // TN(.?.,...gS - 25, 146, 26, 66, 114, 244, 110, 107, 70, 136, 99, 85, // ...Br.nkF.cU - 8, 177, 160, 195, 98, 86, 150, 68, 16, 102, 165, 79, // ....bV.D.f.O - 73, 84, 76, 185, 56, 106, 177, 83, 206, 187, 252, 75, // ITL.8j.S...K - 94, 186, 164, 141, 156, 167, 229, 251, 14, 120, 221, 173, // ^........x.. - 112, 160, 92, 10, 77, 38, 185, 108, 241, 233, 221, 217, // p...M&.l.... - 231, 179, 183, 23, 103, 47, 47, 222, 80, 2, 255, 211, // ....g//.P... - 219, 143, 151, 87, 95, 94, 190, 127, 79, 133, 186, 198, // ...W_^..O... - 187, 247, 87, 95, 94, 189, 255, 229, 151, 183, 87, 87, // ..W_^.....WW - 111, 94, 211, 131, 242, 230, 230, 186, 73, 244, 173, 148, // o^......I... - 231, 36, 95, 218, 109, 137, 239, 197, 224, 166, 244, 91, // .$_.m......[ - 119, 200, 200, 168, 148, 83, 237, 119, 42, 186, 95, 123, // w....S.w*._{ - 173, 160, 182, 142, 138, 79, 37, 32, 172, 111, 228, 255, // .....O% .o.. - 7, 224, 171, 189, 8, 217, 165, 209, 121, 111, 177, 137, // ........yo.. - 247, 234, 58, 104, 27, 167, 106, 27, 232, 29, 28, 139, // ..:h..j..... - 121, 189, 179, 128, 174, 186, 190, 250, 248, 170, 223, 163, // y........... - 158, 74, 86, 63, 42, 89, 141, 147, 113, 191, 87, 214, // .JV?*Y..q.W. - 3, 237, 67, 46, 102, 132, 29, 167, 177, 143, 214, 37, // ..C.f......% - 224, 249, 22, 41, 194, 236, 223, 50, 248, 39, 220, 204, // ...)...2.'.. - 160, 144, 78, 86, 37, 81, 20, 91, 152, 22, 213, 91, // ..NV%Q.[...[ - 176, 162, 32, 206, 139, 46, 59, 107, 46, 245, 153, 246, // .. ...;k.... - 71, 200, 109, 21, 86, 197, 247, 205, 96, 169, 52, 153, // G.m.V...`.4. - 170, 166, 184, 168, 151, 177, 239, 145, 145, 220, 175, 111, // ...........o - 190, 45, 92, 78, 244, 44, 29, 165, 141, 223, 18, 52, // .-.N.,.....4 - 105, 198, 175, 199, 76, 53, 115, 20, 142, 163, 32, 240, // i...L5s... . - 40, 193, 83, 239, 176, 119, 77, 173, 186, 52, 84, 21, // (.S..wM..4T. - 251, 193, 242, 182, 110, 80, 211, 212, 166, 72, 228, 40, // ....nP...H.( - 138, 118, 78, 225, 202, 59, 111, 44, 59, 24, 33, 191, // .vN..;o,;.!. - 149, 62, 53, 208, 38, 127, 128, 155, 242, 82, 89, 172, // .>5.&....RY. - 154, 170, 11, 209, 60, 107, 170, 57, 238, 115, 153, 54, // .....=...... - 9, 132, 19, 205, 211, 189, 10, 96, 23, 10, 176, 45, // .......`...- - 226, 220, 106, 1, 210, 234, 155, 91, 23, 183, 238, 150, // ..j....[.... - 47, 169, 38, 118, 106, 192, 16, 183, 182, 187, 122, 98, // /.&vj.....zb - 109, 33, 176, 7, 54, 204, 117, 165, 176, 251, 232, 1, // m!..6.u..... - 148, 171, 195, 125, 9, 214, 10, 222, 235, 232, 108, 103, // ...}......lg - 201, 122, 85, 209, 98, 33, 254, 11, 238, 69, 56, 181, // .zU.b!...E8. - 205, 3, 82, 3, 222, 157, 168, 136, 7, 152, 132, 27, // ..R......... - 141, 78, 176, 248, 192, 73, 110, 41, 14, 34, 55, 67, // .N...In)."7C - 186, 159, 164, 217, 23, 210, 50, 195, 42, 8, 94, 205, // ......2.*.^. - 156, 28, 252, 205, 161, 131, 190, 199, 133, 227, 230, 92, // ............ - 107, 61, 240, 95, 171, 152, 201, 18, 103, 124, 190, 11, // k=._....g|.. - 84, 87, 90, 99, 74, 229, 138, 224, 26, 238, 36, 103, // TWZcJ.....$g - 193, 185, 240, 1, 123, 242, 205, 44, 168, 149, 108, 107, // ....{..,..lk - 88, 153, 206, 71, 169, 252, 231, 28, 38, 95, 208, 34, // X..G....&_." - 22, 83, 75, 188, 162, 205, 66, 32, 206, 123, 26, 138, // .SK...B .{.. - 136, 33, 244, 129, 43, 117, 126, 215, 8, 166, 95, 162, // .!..+u~..._. - 204, 249, 162, 26, 155, 45, 163, 240, 175, 5, 61, 236, // .....-....=. - 194, 120, 166, 89, 72, 21, 150, 205, 87, 84, 148, 118, // .x.YH...WT.v - 119, 102, 226, 74, 248, 66, 84, 164, 5, 81, 253, 252, // wf.J.BT..Q.. - 233, 173, 32, 109, 135, 208, 202, 213, 144, 209, 64, 136, // .. m......@. - 128, 228, 72, 41, 32, 122, 120, 214, 217, 60, 188, 37, // ..H) zx..<.% - 72, 172, 46, 148, 68, 74, 224, 204, 46, 128, 222, 149, // H...DJ...... - 166, 41, 173, 81, 191, 102, 208, 157, 163, 201, 4, 62, // .).Q.f.....> - 189, 173, 222, 41, 148, 147, 48, 252, 161, 73, 28, 53, // ...)..0..I.5 - 31, 5, 143, 97, 65, 114, 135, 65, 254, 168, 8, 157, // ...aAr.A.... - 252, 247, 19, 166, 116, 242, 235, 19, 62, 180, 250, 143, // ....t...>... - 205, 101, 87, 141, 243, 175, 212, 226, 82, 113, 139, 243, // .eW.....Rq.. - 8, 234, 164, 129, 8, 36, 242, 142, 208, 75, 3, 72, // .....$...K.H - 98, 226, 133, 50, 21, 125, 206, 20, 242, 205, 163, 125, // b..2.}.....} - 114, 50, 222, 172, 204, 73, 160, 226, 27, 146, 83, 231, // r2...I....S. - 182, 189, 32, 246, 101, 0, 185, 13, 133, 86, 131, 145, // .. .e....V.. - 156, 122, 128, 5, 237, 252, 126, 145, 128, 119, 32, 39, // .z....~..w ' - 146, 154, 126, 132, 13, 106, 182, 254, 224, 198, 127, 124, // ..~..j.....| - 115, 121, 53, 153, 251, 204, 34, 248, 118, 145, 102, 165, // sy5...".v.f. - 100, 11, 130, 8, 46, 151, 75, 204, 64, 77, 116, 184, // d.....K.@Mt. - 198, 185, 43, 245, 139, 30, 176, 101, 86, 13, 78, 170, // ..+....eV.N. - 10, 108, 215, 212, 229, 127, 173, 31, 240, 230, 83, 162, // .l........S. - 90, 176, 168, 245, 22, 114, 165, 115, 66, 165, 35, 43, // Z....r.sB.#+ - 72, 105, 81, 206, 89, 129, 104, 94, 119, 195, 105, 254, // HiQ.Y.h^w.i. - 193, 69, 30, 59, 197, 33, 90, 58, 107, 86, 63, 214, // .E.;.!Z:kV?. - 69, 169, 74, 66, 133, 89, 163, 28, 32, 244, 97, 15, // E.JB.Y.. .a. - 58, 223, 157, 14, 59, 157, 64, 167, 214, 214, 34, 237, // :...;.@...". - 44, 36, 66, 128, 147, 164, 29, 227, 244, 239, 17, 157, // ,$B......... - 166, 159, 39, 72, 31, 165, 20, 186, 225, 184, 227, 156, // ..'H........ - 66, 60, 5, 45, 74, 21, 93, 153, 57, 208, 107, 87, // B<.-J.].9.kW - 200, 101, 236, 59, 234, 13, 28, 172, 108, 4, 96, 35, // .e.;....l.`# - 226, 8, 134, 66, 190, 105, 82, 215, 36, 242, 118, 148, // ...B.iR.$.v. - 167, 78, 61, 153, 150, 166, 128, 221, 46, 116, 131, 201, // .N=......t.. - 128, 118, 16, 237, 85, 251, 157, 167, 242, 244, 177, 155, // .v..U....... - 173, 114, 151, 126, 174, 42, 94, 250, 102, 95, 209, 235, // .r.~.*^.f_.. - 154, 182, 231, 163, 76, 231, 126, 166, 198, 20, 183, 255, // ....L.~..... - 105, 169, 76, 79, 170, 170, 101, 223, 140, 142, 43, 236, // i.LO..e...+. - 126, 45, 13, 40, 184, 8, 110, 49, 106, 66, 32, 241, // ~-.(..n1jB . - 150, 95, 194, 220, 109, 18, 226, 210, 245, 251, 209, 239, // ._..m....... - 160, 97, 145, 59, 155, 82, 121, 176, 45, 150, 72, 101, // .a.;.Ry.-.He - 174, 111, 111, 134, 226, 110, 77, 200, 90, 84, 176, 48, // .oo..nM.ZT.0 - 27, 201, 14, 88, 93, 172, 42, 173, 28, 186, 41, 14, // ...X].*...). - 220, 64, 5, 178, 135, 14, 220, 228, 35, 91, 52, 205, // .@......#[4. - 158, 131, 54, 27, 178, 40, 182, 129, 164, 177, 51, 85, // ..6..(....3U - 41, 74, 136, 197, 4, 181, 42, 162, 90, 145, 31, 77, // )J....*.Z..M - 223, 199, 74, 91, 79, 196, 245, 117, 183, 45, 26, 175, // ..J[O..u.-.. - 21, 114, 104, 220, 64, 156, 54, 238, 223, 36, 73, 148, // .rh.@.6..$I. - 240, 93, 15, 119, 148, 135, 241, 77, 159, 186, 202, 209, // .].w...M.... - 124, 218, 184, 185, 249, 58, 190, 222, 68, 214, 10, 112, // |....:..D..p - 7, 238, 6, 190, 222, 76, 246, 247, 20, 31, 202, 234, // .....L...... - 82, 237, 248, 222, 67, 175, 223, 255, 108, 85, 66, 80, // R...C...lUBP - 145, 159, 220, 119, 174, 60, 245, 90, 246, 6, 215, 124, // ...w.<.Z...| - 218, 229, 160, 122, 48, 175, 60, 95, 184, 81, 183, 224, // ...z0.<_.Q.. - 211, 139, 197, 110, 82, 2, 147, 31, 204, 168, 126, 254, // ...nR.....~. - 178, 22, 17, 193, 191, 178, 163, 46, 228, 108, 20, 198, // .........l.. - 106, 61, 2, 153, 166, 252, 130, 127, 236, 195, 181, 161, // j=.......... - 77, 217, 98, 93, 123, 216, 112, 249, 60, 202, 250, 81, // M.b]{.p.<..Q - 137, 197, 245, 34, 203, 99, 115, 33, 163, 171, 139, 136, // ...".cs!.... - 14, 242, 1, 71, 206, 165, 58, 64, 192, 146, 160, 23, // ...G..:@.... - 139, 112, 252, 12, 55, 249, 136, 193, 132, 0, 169, 54, // .p..7......6 - 190, 102, 163, 210, 218, 192, 76, 234, 180, 121, 186, 240, // .f....L..y.. - 96, 59, 245, 4, 96, 115, 82, 204, 38, 46, 40, 66, // `;..`sR.&.(B - 63, 48, 165, 79, 109, 15, 76, 200, 109, 149, 233, 164, // ?0.Om.L.m... - 15, 27, 7, 202, 119, 221, 40, 188, 144, 19, 0, 253, // ....w.(..... - 174, 217, 55, 170, 40, 249, 187, 221, 203, 137, 148, 117, // ..7.(......u - 168, 35, 210, 218, 84, 214, 251, 184, 126, 201, 201, 13, // .#..T...~... - 112, 193, 46, 73, 141, 138, 198, 29, 124, 151, 141, 37, // p..I....|..% - 227, 33, 146, 53, 153, 104, 198, 63, 242, 11, 50, 227, // .!.5.h.?..2. - 251, 253, 98, 211, 122, 250, 206, 161, 131, 9, 91, 28, // ..b.z.....[. - 40, 16, 242, 133, 208, 212, 14, 22, 42, 173, 37, 15, // (.......*.%. - 15, 188, 237, 9, 70, 80, 237, 32, 51, 251, 74, 191, // ....FP. 3.J. - 17, 247, 198, 18, 10, 14, 91, 130, 185, 81, 121, 250, // ......[..Qy. - 180, 146, 227, 212, 178, 20, 210, 209, 117, 45, 169, 81, // ........u-.Q - 79, 242, 83, 165, 228, 99, 203, 163, 165, 157, 211, 255, // O.S..c...... - 4, 237, 85, 106, 205, 108, 216, 210, 247, 189, 56, 5, // ..Uj.l....8. - 8, 174, 189, 195, 222, 85, 125, 254, 90, 237, 249, 12, // .....U}.Z... - 66, 77, 60, 153, 173, 0, 118, 201, 139, 102, 32, 129, // BM<...v..f . - 88, 159, 112, 210, 96, 42, 80, 72, 71, 161, 133, 36, // X.p.`*PHG..$ - 63, 67, 56, 208, 85, 228, 24, 238, 85, 32, 72, 22, // ?C8.U...U H. - 77, 167, 48, 170, 145, 254, 14, 142, 78, 230, 209, 241, // M.0.....N... - 86, 161, 148, 149, 234, 198, 241, 156, 202, 9, 210, 119, // V..........w - 213, 23, 126, 124, 118, 130, 16, 66, 162, 143, 25, 20, // ..~|v..B.... - 168, 129, 180, 3, 137, 135, 222, 250, 124, 179, 153, 169, // ........|... - 226, 61, 2, 1, 122, 36, 30, 104, 168, 142, 220, 136, // .=..z$.h.... - 200, 69, 209, 187, 173, 65, 156, 114, 235, 105, 73, 147, // .E...A.r.iI. - 194, 151, 136, 84, 204, 172, 16, 218, 204, 121, 56, 80, // ...T.....y8P - 214, 242, 157, 205, 48, 89, 25, 188, 81, 105, 223, 130, // ....0Y..Qi.. - 53, 42, 86, 157, 197, 113, 181, 8, 181, 129, 108, 40, // 5*V..q....l( - 107, 224, 239, 10, 65, 250, 66, 93, 215, 16, 10, 125, // k...A.B]...} - 45, 81, 197, 53, 234, 115, 5, 153, 125, 74, 252, 90, // -Q.5.s..}J.Z - 191, 70, 167, 81, 235, 150, 127, 22, 244, 9, 23, 245, // .F.Q........ - 142, 181, 126, 105, 237, 171, 161, 218, 55, 51, 187, 216, // ..~i....73.. - 168, 6, 96, 2, 137, 59, 128, 146, 106, 105, 108, 212, // ..`..;..jil. - 65, 137, 13, 154, 186, 85, 139, 225, 30, 129, 28, 238, // A....U...... - 242, 93, 98, 69, 183, 226, 199, 138, 20, 154, 156, 238, // .]bE........ - 183, 40, 178, 228, 227, 217, 233, 139, 97, 129, 48, 244, // .(......a.0. - 86, 236, 152, 41, 177, 72, 0, 197, 89, 95, 11, 202, // V..).H..Y_.. - 141, 125, 90, 21, 157, 234, 115, 236, 62, 120, 91, 95, // .}Z...s.>x[_ - 147, 23, 230, 75, 226, 155, 86, 9, 218, 8, 173, 232, // ...K..V..... - 93, 172, 98, 21, 62, 195, 66, 226, 20, 35, 64, 235, // ].b.>.B..#@. - 91, 62, 164, 75, 90, 230, 133, 94, 230, 33, 201, 164, // [>.KZ..^.!.. - 33, 57, 214, 97, 102, 55, 143, 100, 242, 135, 167, 107, // !9.af7.d...k - 37, 38, 62, 249, 230, 23, 15, 34, 253, 82, 144, 79, // %&>....".R.O - 224, 243, 26, 235, 78, 180, 56, 46, 175, 190, 94, 213, // ....N.8...^. - 25, 68, 241, 110, 241, 42, 82, 84, 249, 235, 177, 33, // .D.n.*RT...! - 204, 48, 240, 194, 14, 255, 170, 239, 201, 236, 14, 255, // .0.......... - 170, 155, 30, 223, 112, 93, 233, 55, 62, 49, 244, 118, // ....p].7>1.v - 34, 194, 136, 183, 79, 125, 48, 164, 190, 158, 209, 219, // "...O}0..... - 153, 142, 233, 29, 232, 163, 189, 192, 202, 11, 205, 153, // ............ - 169, 58, 138, 226, 19, 24, 91, 31, 14, 160, 200, 160, // .:....[..... - 63, 92, 171, 30, 101, 167, 41, 78, 106, 223, 157, 149, // ?...e.)Nj... - 39, 50, 213, 39, 113, 107, 173, 147, 149, 175, 130, 136, // '2.'qk...... - 241, 19, 253, 41, 83, 245, 147, 184, 77, 66, 117, 189, // ...)S...MBu. - 87, 97, 231, 114, 123, 166, 202, 26, 254, 138, 47, 224, // Wa.r{...../. - 152, 119, 245, 45, 50, 69, 149, 87, 51, 58, 160, 82, // .w.-2E.W3:.R - 253, 126, 13, 38, 222, 148, 119, 22, 214, 143, 152, 54, // .~.&..w....6 - 243, 210, 44, 74, 232, 60, 202, 185, 186, 178, 32, 64, // ..,J.<.... @ - 8, 238, 28, 91, 173, 159, 52, 209, 173, 18, 96, 233, // ...[..4...`. - 216, 192, 154, 178, 125, 7, 128, 137, 222, 20, 195, 132, // ....}....... - 215, 187, 66, 48, 130, 58, 125, 208, 73, 112, 163, 12, // ..B0.:}.Ip.. - 94, 101, 175, 250, 187, 149, 188, 111, 254, 1, 67, 181, // ^e.....o..C. - 167, 58, 66, 159, 247, 200, 63, 72, 216, 255, 22, 114, // .:B...?H...r - 225, 133, 136, 30, 86, 20, 234, 98, 189, 178, 61, 245, // ....V..b..=. - 53, 119, 115, 214, 132, 243, 132, 169, 185, 209, 120, 78, // 5ws.......xN - 97, 200, 162, 84, 4, 86, 247, 127, 124, 10, 84, 34, // a..T.V..|.T" - 88, 62, 0, 0, 0 // X>.. + 31, 139, 8, 8, 11, 164, 64, 101, 0, 3, 109, 97, // ......@e..ma + 105, 110, 46, 106, 115, 0, 189, 91, 233, 114, 219, 72, // in.js..[.r.H + 146, 254, 239, 167, 168, 230, 184, 155, 164, 155, 0, 9, // ............ + 82, 151, 105, 81, 29, 62, 219, 158, 112, 219, 14, 75, // R.iQ.>..p..K + 118, 108, 143, 66, 225, 6, 137, 34, 137, 22, 174, 0, // vl.B...".... + 64, 145, 28, 13, 223, 105, 159, 97, 159, 108, 191, 204, // @....i.a.l.. + 194, 81, 32, 33, 74, 125, 236, 206, 168, 105, 28, 85, // .Q !J}...i.U + 89, 89, 89, 121, 124, 153, 85, 232, 118, 133, 248, 240, // YYYy|.U.v... + 241, 226, 245, 80, 60, 255, 244, 78, 76, 108, 207, 75, // ...P<..NLl.K + 132, 191, 72, 82, 145, 164, 118, 156, 138, 165, 155, 206, // ..HR..v..... + 69, 211, 142, 220, 110, 83, 184, 129, 8, 99, 71, 198, // E...nS...cG. + 34, 13, 69, 34, 227, 27, 41, 210, 185, 20, 118, 20, // ".E"..)...v. + 9, 59, 21, 118, 176, 22, 95, 62, 191, 123, 244, 168, // .;.v.._>.{.. + 185, 72, 36, 58, 199, 238, 36, 109, 62, 123, 228, 250, // .H$:..$m>{.. + 81, 8, 50, 183, 98, 222, 17, 177, 12, 208, 187, 35, // Q.2.b......# + 208, 224, 60, 181, 83, 201, 87, 175, 167, 83, 57, 73, // ..<.S.W..S9I + 249, 242, 179, 156, 118, 196, 60, 245, 189, 142, 248, 28, // ....v.<..... + 46, 82, 12, 180, 17, 211, 56, 244, 133, 104, 154, 221, // .R....8..h.. + 241, 34, 112, 60, 105, 254, 158, 232, 68, 223, 77, 194, // ."p..;u'v.R.O + 54, 250, 103, 215, 95, 34, 47, 180, 157, 55, 174, 39, // 6.g._"/..7.' + 21, 149, 156, 7, 176, 48, 9, 49, 110, 32, 131, 52, // .....0.1n .4 + 81, 108, 60, 162, 209, 83, 26, 61, 20, 35, 17, 197, // Ql<..S.=.#.. + 97, 148, 136, 209, 25, 207, 224, 183, 211, 228, 102, 38, // a.........f& + 38, 158, 157, 36, 163, 199, 183, 252, 202, 228, 187, 141, // &..$........ + 88, 249, 94, 144, 140, 26, 243, 52, 141, 134, 221, 238, // X.^....4.... + 114, 185, 52, 151, 3, 51, 140, 103, 221, 126, 175, 215, // r.4..3.g.~.. + 235, 162, 91, 67, 220, 184, 114, 249, 34, 92, 141, 26, // ..[C..r."... + 61, 209, 19, 86, 223, 60, 57, 230, 223, 195, 198, 217, // =..V.<9..... + 169, 35, 167, 201, 217, 105, 146, 174, 61, 121, 102, 122, // .#...i..=yfz + 158, 49, 241, 18, 195, 186, 157, 186, 158, 55, 12, 192, // .1.......7.. + 219, 51, 8, 62, 188, 150, 195, 127, 128, 86, 118, 109, // .3.>.....Vvm + 248, 46, 68, 233, 185, 248, 103, 104, 21, 15, 151, 174, // ..D...gh.... + 147, 206, 135, 61, 243, 48, 90, 61, 219, 156, 118, 21, // ...=.0Z=..v. + 193, 211, 174, 34, 63, 19, 174, 51, 106, 188, 183, 215, // ..."?..3j... + 50, 254, 214, 111, 8, 199, 78, 109, 35, 176, 125, 153, // 2..o..Nm#.}. + 61, 19, 253, 70, 181, 141, 101, 212, 181, 178, 208, 42, // =..F..e....* + 178, 161, 62, 74, 12, 141, 156, 91, 52, 29, 53, 126, // ..>J...[4.5~ + 193, 132, 142, 250, 29, 203, 60, 233, 127, 61, 49, 159, // ......<..=1. + 90, 207, 45, 243, 240, 164, 195, 63, 61, 252, 223, 234, // Z.-....?=... + 88, 248, 235, 153, 7, 39, 111, 15, 108, 203, 60, 56, // X....'o.l.<8 + 232, 240, 15, 191, 50, 44, 195, 28, 28, 63, 55, 143, // ....2,...?7. + 158, 226, 47, 107, 13, 233, 160, 73, 207, 51, 76, 188, // ../k...I.3L. + 180, 250, 182, 121, 2, 202, 86, 214, 222, 180, 14, 13, // ...y..V..... + 80, 250, 122, 104, 30, 30, 227, 205, 49, 254, 178, 110, // P.zh....1..n + 230, 201, 145, 129, 255, 222, 30, 152, 199, 131, 175, 199, // ............ + 102, 255, 4, 175, 143, 240, 199, 175, 123, 29, 190, 57, // f.......{..9 + 124, 251, 212, 60, 32, 138, 135, 248, 43, 94, 128, 226, // |..< ...+^.. + 201, 225, 215, 129, 121, 112, 248, 188, 210, 5, 60, 91, // ....yp....<[ + 131, 206, 160, 99, 30, 31, 225, 175, 120, 200, 12, 218, // ...c....x... + 102, 255, 41, 254, 212, 67, 98, 19, 255, 209, 188, 158, // f.)..Cb..... + 170, 31, 245, 152, 39, 247, 182, 111, 14, 158, 126, 37, // ....'..o..~% + 225, 144, 92, 142, 59, 252, 163, 88, 62, 232, 152, 253, // ....;..X>... + 195, 183, 150, 181, 243, 162, 20, 232, 191, 26, 221, 189, // ............ + 146, 39, 177, 42, 225, 126, 181, 118, 5, 143, 213, 96, // .'.*.~.v...` + 90, 111, 107, 135, 199, 224, 88, 26, 76, 252, 233, 193, // Zok...X.L... + 46, 7, 232, 128, 137, 130, 125, 208, 176, 171, 19, 179, // ......}..... + 168, 239, 224, 216, 195, 172, 77, 203, 214, 164, 131, 199, // ......M..... + 150, 101, 90, 7, 154, 20, 233, 209, 129, 121, 112, 156, // .eZ......yp. + 175, 72, 33, 120, 203, 80, 55, 160, 111, 13, 242, 229, // .H!x.P7.o... + 44, 133, 111, 168, 101, 57, 122, 75, 203, 162, 47, 52, // ,.o.e9zK../4 + 189, 161, 102, 95, 177, 146, 186, 106, 96, 33, 173, 67, // ..f_...j`!.C + 136, 1, 92, 177, 210, 148, 26, 69, 111, 6, 166, 101, // .......Eo..e + 117, 170, 186, 215, 83, 179, 96, 1, 119, 103, 217, 127, // u...S.`.wg.. + 48, 217, 179, 223, 224, 13, 166, 139, 96, 66, 62, 68, // 0.......`B>D + 188, 149, 54, 252, 92, 235, 214, 131, 99, 88, 40, 215, // ..6.....cX(. + 6, 175, 151, 200, 244, 124, 30, 46, 207, 93, 71, 142, // .....|...]G. + 109, 186, 47, 111, 54, 109, 113, 251, 72, 192, 63, 166, // m./o6mq.H.?. + 139, 56, 80, 254, 227, 209, 169, 227, 222, 228, 235, 55, // .8P........7 + 158, 25, 203, 57, 172, 24, 110, 213, 157, 92, 175, 225, // ...9..n..... + 127, 35, 163, 39, 254, 109, 92, 30, 156, 92, 137, 213, // .#.'.m...... + 210, 152, 46, 60, 79, 140, 217, 55, 27, 99, 17, 173, // ...f*W..x + 136, 20, 198, 65, 175, 151, 145, 6, 241, 199, 183, 236, // ...A........ + 247, 77, 116, 74, 6, 69, 235, 185, 113, 212, 16, 221, // .MtJ.E..q... + 108, 252, 110, 126, 161, 77, 129, 153, 165, 31, 195, 18, // l.n~.M...... + 51, 59, 50, 86, 198, 1, 88, 240, 166, 6, 92, 162, // 3;2V..X..... + 76, 39, 115, 225, 205, 134, 234, 249, 81, 57, 150, 214, // L's.....Q9.. + 63, 150, 96, 197, 69, 212, 211, 8, 193, 197, 229, 67, // ?.`.E......C + 213, 12, 166, 75, 166, 24, 178, 102, 20, 116, 77, 34, // ...K...f.tM" + 59, 168, 206, 219, 23, 219, 243, 135, 62, 205, 164, 67, // ;.......>..C + 97, 216, 78, 134, 88, 97, 210, 171, 141, 54, 126, 149, // a.N.Xa...6~. + 131, 185, 235, 56, 50, 160, 225, 198, 94, 56, 185, 166, // ...82...^8.. + 139, 185, 26, 126, 105, 68, 43, 126, 62, 51, 102, 177, // ...~iD+~>3f. + 13, 109, 1, 113, 97, 199, 174, 109, 168, 62, 224, 32, // .m.qa..m.>. + 94, 200, 202, 212, 88, 234, 42, 32, 66, 131, 220, 212, // ^...X.* B... + 35, 47, 207, 234, 221, 16, 46, 22, 99, 148, 175, 137, // #/......c... + 210, 249, 141, 182, 214, 249, 147, 82, 76, 221, 234, 42, // .......RL..* + 241, 63, 244, 3, 35, 218, 232, 118, 148, 43, 198, 237, // .?..#..v.+.. + 34, 246, 148, 189, 100, 134, 162, 226, 238, 7, 251, 230, // "...d....... + 189, 27, 92, 35, 244, 182, 110, 153, 165, 14, 179, 2, // ...#..n..... + 8, 17, 19, 144, 64, 39, 52, 207, 227, 113, 166, 206, // ....@'4..q.. + 217, 192, 54, 183, 25, 53, 254, 241, 248, 150, 46, 54, // ..6..5.....6 + 141, 92, 104, 234, 94, 140, 70, 212, 93, 252, 36, 154, // ..h.^.F.].$. + 144, 145, 90, 129, 195, 158, 90, 143, 177, 183, 144, 198, // ..Z...Z..... + 17, 108, 101, 22, 135, 139, 168, 41, 134, 162, 201, 207, // .le....).... + 89, 146, 199, 120, 62, 15, 111, 100, 60, 172, 182, 85, // Y..x>.od<..U + 207, 114, 121, 31, 230, 157, 55, 74, 149, 148, 58, 12, // .ry...7J..:. + 4, 158, 1, 32, 57, 134, 239, 136, 8, 214, 150, 171, // ... 9....... + 129, 7, 119, 2, 88, 99, 28, 137, 105, 24, 224, 137, // ..w.Xc..i... + 244, 221, 113, 232, 57, 186, 61, 208, 188, 11, 67, 88, // ..q.9.=...CX + 162, 37, 25, 67, 33, 240, 199, 74, 60, 155, 92, 232, // .%.C!..J<... + 133, 212, 33, 240, 253, 94, 231, 198, 13, 61, 153, 26, // ..!..^...=.. + 22, 77, 33, 49, 104, 18, 158, 189, 214, 46, 141, 48, // .M!1h......0 + 146, 193, 144, 189, 6, 11, 105, 101, 244, 10, 133, 161, // ......ie.... + 255, 25, 250, 43, 246, 29, 15, 242, 62, 21, 26, 83, // ...+....>..S + 119, 5, 165, 87, 46, 207, 147, 211, 20, 255, 140, 67, // w..W.......C + 40, 162, 175, 92, 224, 81, 239, 10, 126, 233, 184, 47, // (....Q..~../ + 10, 39, 153, 57, 194, 184, 66, 37, 123, 152, 235, 187, // .'.9..B%{... + 160, 9, 76, 189, 112, 105, 172, 13, 123, 65, 120, 118, // ..L.pi..{Axv + 18, 135, 158, 7, 109, 51, 214, 149, 126, 202, 143, 178, // ....m3..~... + 3, 173, 76, 19, 107, 23, 187, 179, 121, 170, 122, 231, // ..L.k...y.z. + 12, 237, 184, 205, 210, 85, 76, 66, 79, 248, 176, 63, // .....ULBO..? + 90, 236, 117, 97, 251, 59, 109, 231, 16, 54, 84, 61, // Z.ua.;m..6T= + 134, 98, 99, 126, 181, 14, 132, 181, 128, 52, 64, 105, // .bc~.....4@i + 200, 202, 211, 29, 197, 97, 213, 81, 146, 141, 106, 30, // .....a.Q..j. + 146, 150, 0, 122, 33, 126, 13, 23, 177, 120, 129, 249, // ...z!~...x.. + 56, 15, 115, 151, 249, 12, 116, 210, 153, 249, 21, 238, // 8.s...t..... + 224, 149, 157, 204, 199, 161, 29, 59, 91, 30, 97, 30, // .......;[.a. + 250, 114, 147, 217, 91, 183, 65, 118, 133, 87, 100, 156, // .r..[.Av.Wd. + 154, 71, 216, 165, 150, 97, 249, 100, 139, 216, 36, 156, // .G...a.d..$. + 21, 180, 146, 162, 201, 3, 105, 190, 113, 99, 127, 105, // ......i.qc.i + 199, 18, 24, 31, 96, 85, 110, 145, 118, 194, 101, 64, // ....`Un.v.e@ + 208, 191, 160, 191, 200, 90, 61, 144, 250, 235, 27, 202, // .....Z=..... + 12, 182, 136, 218, 158, 140, 211, 130, 162, 204, 154, 236, // ............ + 82, 188, 207, 21, 42, 226, 173, 219, 138, 3, 188, 84, // R...*......T + 244, 24, 90, 168, 6, 87, 112, 134, 121, 118, 213, 186, // ..Z..Wp.yv.. + 188, 106, 63, 43, 219, 70, 246, 76, 114, 75, 36, 59, // .j?+.F.LrK$; + 178, 210, 206, 66, 179, 162, 29, 24, 141, 101, 50, 39, // ...B.....e2' + 167, 74, 206, 147, 153, 155, 82, 116, 108, 113, 18, 168, // .J....Rtlq.. + 70, 236, 206, 100, 218, 236, 48, 39, 234, 127, 190, 76, // F..d..0'...L + 231, 161, 3, 87, 248, 233, 227, 249, 5, 222, 140, 67, // ...W.......C + 103, 61, 20, 255, 60, 255, 248, 193, 164, 76, 48, 152, // g=..<....L0. + 185, 211, 117, 235, 150, 88, 24, 10, 250, 221, 180, 59, // ..u..X.....; + 89, 223, 77, 219, 68, 18, 25, 180, 98, 242, 212, 49, // Y.M.D...b..1 + 242, 170, 48, 104, 181, 219, 5, 97, 237, 101, 49, 201, // ..0h...a.e1. + 86, 220, 86, 28, 23, 217, 99, 43, 227, 186, 163, 166, // V.V...c+.... + 121, 181, 253, 154, 167, 146, 177, 155, 73, 160, 197, 204, // y.......I... + 69, 64, 16, 178, 133, 240, 104, 123, 231, 105, 24, 227, // E@....h{.i.. + 185, 137, 169, 189, 131, 213, 181, 154, 68, 169, 217, 110, // ........D..n + 179, 12, 153, 83, 80, 223, 75, 185, 66, 38, 169, 144, // ...SP.K.B&.. + 233, 240, 172, 205, 52, 60, 103, 105, 180, 20, 213, 77, // ....4. + 132, 4, 165, 200, 6, 115, 3, 221, 2, 131, 86, 175, // .....s....V. + 132, 128, 217, 133, 114, 9, 228, 90, 75, 231, 56, 131, // ....r..ZK.8. + 207, 182, 39, 110, 138, 96, 117, 72, 72, 14, 248, 93, // ..'n.`uHH..] + 68, 228, 86, 216, 137, 144, 131, 45, 2, 79, 37, 220, // D.V....-.O%. + 232, 78, 230, 41, 81, 180, 39, 215, 14, 216, 164, 32, // .N.)Q.'.... + 23, 151, 119, 200, 68, 25, 6, 230, 73, 175, 138, 60, // ..w.D...I..< + 167, 221, 116, 174, 162, 77, 54, 73, 167, 102, 146, 78, // ..t..M6I.f.N + 17, 192, 136, 83, 0, 162, 137, 52, 130, 112, 25, 219, // ...S...4.p.. + 209, 29, 19, 35, 63, 206, 96, 151, 249, 143, 98, 132, // ...#?.`...b. + 208, 26, 232, 244, 148, 60, 98, 193, 14, 158, 19, 55, // ...... + 102, 72, 225, 206, 244, 237, 168, 37, 217, 101, 180, 216, // fH.....%.e.. + 139, 32, 234, 195, 135, 180, 55, 37, 249, 146, 32, 110, // . ....7%.. n + 72, 196, 123, 129, 204, 75, 56, 149, 180, 117, 75, 197, // H.{..K8..uK. + 194, 10, 150, 9, 224, 158, 232, 161, 233, 201, 96, 134, // ..........`. + 120, 215, 125, 34, 48, 90, 236, 202, 68, 60, 233, 118, // x.}"0Z..D<.v + 196, 18, 175, 73, 97, 212, 211, 181, 224, 242, 37, 191, // ...Ia.....%. + 241, 200, 207, 90, 135, 120, 195, 177, 139, 237, 5, 47, // ...Z.x...../ + 74, 239, 78, 241, 148, 18, 24, 180, 128, 33, 68, 115, // J.N......!Ds + 161, 148, 133, 59, 175, 41, 132, 18, 129, 67, 122, 253, // ...;.)...Cz. + 171, 176, 87, 110, 34, 212, 51, 122, 61, 102, 218, 220, // ..Wn".3z=f.. + 85, 33, 252, 26, 242, 107, 232, 31, 49, 119, 168, 61, // U!...k..1w.= + 34, 95, 235, 146, 208, 90, 115, 97, 128, 74, 91, 116, // "_...Zsa.J[t + 243, 161, 158, 136, 150, 43, 126, 20, 150, 6, 205, 198, // .....+~..... + 28, 241, 43, 205, 159, 224, 190, 75, 92, 63, 19, 221, // ..+....K.?.. + 174, 120, 97, 199, 25, 211, 101, 159, 245, 78, 31, 252, // .xa...e..N.. + 206, 91, 145, 70, 23, 240, 126, 38, 201, 235, 115, 37, // .[.F..~&..s% + 31, 216, 207, 253, 55, 33, 192, 84, 70, 28, 3, 158, // ....7!.TF... + 199, 112, 11, 38, 213, 182, 91, 183, 74, 232, 67, 110, // .p.&..[.J.Cn + 2, 84, 210, 250, 134, 84, 154, 27, 185, 196, 48, 117, // .T...T....0u + 17, 255, 249, 15, 152, 6, 231, 76, 140, 71, 1, 103, // .......L.G.g + 52, 16, 50, 68, 202, 250, 91, 78, 210, 222, 155, 78, // 4.2D..[N...N + 250, 235, 191, 219, 189, 122, 188, 142, 139, 40, 146, 241, // .....z...(.. + 196, 78, 228, 67, 188, 236, 1, 3, 6, 38, 119, 33, // .N.C.....&w! + 125, 116, 180, 193, 45, 164, 2, 170, 169, 232, 31, 204, // }t..-....... + 235, 253, 81, 94, 249, 201, 61, 73, 89, 219, 167, 36, // ..Q^..=IY..$ + 89, 133, 114, 99, 133, 180, 62, 47, 144, 193, 165, 86, // Y.rc..>/...V + 139, 248, 143, 111, 131, 39, 203, 31, 61, 196, 106, 68, // ...o.'..=.jD + 199, 77, 225, 81, 30, 223, 242, 34, 181, 122, 185, 42, // .M.Q...".z.* + 42, 131, 115, 245, 178, 69, 102, 104, 228, 17, 197, 202, // *.s..Efh.... + 26, 245, 196, 218, 130, 139, 93, 167, 45, 183, 189, 17, // ......].-... + 171, 62, 85, 88, 146, 31, 65, 125, 35, 214, 253, 242, // .>UX..A}#... + 133, 94, 230, 31, 245, 204, 65, 9, 26, 249, 121, 129, // .^....A...y. + 12, 27, 121, 75, 7, 233, 155, 77, 42, 49, 106, 88, // ..yK...M*1jX + 29, 171, 234, 79, 24, 1, 173, 104, 232, 124, 0, 163, // ...O...h.|.. + 95, 173, 210, 93, 30, 69, 171, 43, 65, 219, 16, 122, // _..].E.+A..z + 193, 10, 141, 201, 59, 211, 79, 87, 205, 239, 73, 203, // ....;.OW..I. + 253, 209, 106, 235, 69, 171, 223, 10, 95, 162, 9, 35, // ..j.E..._..# + 80, 114, 88, 213, 200, 33, 6, 236, 6, 47, 60, 235, // PrX..!.../<. + 21, 207, 26, 215, 227, 117, 139, 156, 199, 229, 234, 234, // .....u...... + 9, 140, 166, 75, 3, 66, 6, 106, 242, 86, 63, 51, // ...K.B.j.V?3 + 30, 106, 55, 175, 107, 23, 175, 70, 253, 66, 177, 104, // .j7.k..F.B.h + 10, 147, 181, 29, 112, 38, 93, 39, 5, 125, 100, 242, // ....p&]'.}d. + 43, 15, 17, 195, 234, 73, 127, 51, 236, 245, 106, 166, // +....I.3..j. + 125, 95, 226, 247, 10, 30, 217, 3, 244, 143, 63, 132, // }_........?. + 64, 68, 12, 241, 58, 98, 50, 119, 61, 7, 17, 248, // @D..:b2w=... + 190, 186, 49, 27, 68, 148, 21, 29, 250, 59, 70, 84, // ..1.D....;FT + 3, 150, 203, 242, 193, 222, 98, 230, 110, 45, 214, 13, // ......b.n-.. + 166, 101, 161, 33, 171, 170, 210, 254, 225, 216, 78, 220, // .e.!......N. + 196, 184, 28, 244, 72, 48, 179, 24, 118, 162, 149, 55, // ....H0..v..7 + 50, 243, 4, 216, 97, 251, 4, 20, 233, 107, 34, 191, // 2...a....k". + 19, 231, 52, 206, 10, 169, 208, 70, 158, 220, 46, 40, // ..4....F...( + 114, 88, 227, 213, 130, 211, 106, 54, 219, 102, 18, 121, // rX....j6.f.y + 110, 218, 106, 154, 77, 165, 86, 55, 133, 90, 137, 211, // n.j.M.V7.Z.. + 72, 115, 79, 125, 65, 107, 117, 195, 218, 153, 175, 15, // HsO}Aku..... + 64, 118, 46, 236, 125, 203, 244, 139, 237, 6, 219, 217, // @v..}....... + 57, 4, 144, 37, 231, 148, 103, 87, 115, 243, 0, 110, // 9..%..gWs..n + 66, 119, 213, 213, 172, 91, 207, 184, 153, 10, 39, 220, // Bw...[....'. + 181, 153, 114, 53, 65, 230, 129, 84, 126, 92, 159, 30, // ..r5A..T~... + 171, 146, 128, 59, 21, 173, 239, 152, 112, 59, 87, 158, // ...;....p;W. + 102, 115, 175, 243, 174, 83, 31, 82, 172, 196, 31, 82, // fs...S.R...R + 169, 210, 95, 41, 191, 61, 139, 93, 135, 127, 168, 88, // .._).=.]...X + 148, 224, 5, 21, 187, 139, 91, 165, 135, 7, 185, 130, // ......[..... + 61, 190, 37, 118, 75, 184, 83, 250, 227, 134, 66, 239, // =.%vK.S...B. + 13, 32, 73, 98, 18, 16, 190, 120, 181, 17, 255, 243, // . Ib...x.... + 223, 47, 27, 148, 54, 93, 112, 147, 89, 24, 58, 124, // ./..6]p.Y.:| + 251, 78, 47, 187, 132, 92, 150, 201, 50, 43, 202, 140, // .N/.....2+.. + 170, 89, 86, 89, 118, 217, 226, 225, 237, 2, 224, 18, // .YVYv....... + 185, 241, 54, 3, 243, 236, 249, 70, 124, 175, 141, 141, // ..6....F|... + 220, 40, 216, 29, 155, 158, 222, 53, 186, 10, 21, 229, // .(.....5.... + 240, 117, 123, 60, 16, 21, 97, 207, 0, 210, 83, 72, // .u{<..a...SH + 84, 175, 11, 195, 71, 59, 176, 33, 111, 214, 192, 83, // T...G;.!o..S + 226, 152, 11, 76, 186, 57, 86, 28, 70, 150, 6, 53, // ...L.9V.F..5 + 88, 47, 24, 95, 9, 0, 28, 184, 80, 137, 104, 230, // X/._....P.h. + 168, 141, 109, 218, 195, 255, 37, 12, 32, 72, 132, 80, // ..m...%. H.P + 202, 227, 101, 224, 108, 111, 164, 212, 196, 196, 251, 87, // ..e.lo.....W + 223, 170, 174, 126, 191, 88, 253, 92, 244, 140, 5, 55, // ...~.X.....7 + 204, 214, 40, 151, 116, 20, 186, 0, 160, 44, 161, 29, // ..(.t....,.. + 17, 49, 130, 152, 175, 140, 254, 193, 118, 177, 247, 175, // .1......v... + 136, 168, 112, 240, 74, 84, 23, 115, 72, 104, 66, 156, // ..p.JT.sHhB. + 145, 168, 236, 64, 156, 127, 253, 89, 184, 62, 87, 207, // ...@...Y.>W. + 102, 50, 32, 53, 132, 228, 104, 111, 107, 78, 136, 99, // f2 5..hokN.c + 93, 8, 177, 160, 195, 98, 86, 150, 68, 16, 102, 157, // ]....bV.D.f. + 157, 146, 208, 76, 185, 56, 106, 81, 43, 231, 58, 255, // ...L.8jQ+.:. + 146, 151, 46, 105, 33, 23, 73, 185, 223, 1, 175, 187, // ...i!.I..... + 19, 14, 148, 75, 161, 193, 36, 151, 45, 190, 124, 120, // ...K..$.-.|x + 254, 245, 249, 187, 247, 207, 95, 188, 127, 77, 9, 252, // ......_..M.. + 155, 119, 159, 207, 47, 190, 189, 248, 248, 145, 10, 117, // .w../......u + 205, 15, 31, 47, 190, 189, 252, 248, 203, 47, 239, 46, // .../...../.. + 46, 94, 191, 162, 7, 229, 205, 213, 101, 139, 232, 155, // .^......e... + 9, 143, 73, 190, 180, 215, 22, 223, 139, 131, 171, 210, // ..I......... + 111, 221, 32, 35, 163, 82, 142, 222, 238, 76, 244, 238, // o. #.R...L.. + 219, 86, 80, 75, 71, 197, 167, 18, 16, 86, 23, 242, // .VPKG....V.. + 255, 2, 240, 85, 54, 66, 234, 52, 58, 111, 45, 182, // ...U6B.4:o-. + 241, 94, 85, 7, 173, 198, 153, 90, 6, 218, 131, 99, // .^U....Z...c + 49, 111, 106, 11, 232, 170, 233, 203, 207, 47, 7, 125, // 1oj....../.} + 106, 169, 100, 245, 147, 146, 213, 36, 158, 12, 250, 101, // j.d....$...e + 61, 208, 58, 226, 98, 70, 208, 181, 155, 251, 104, 157, // =.:.bF....h. + 3, 158, 239, 144, 34, 204, 254, 144, 206, 111, 112, 51, // ...."....op3 + 135, 66, 218, 169, 78, 162, 40, 182, 48, 45, 170, 183, // .B..N.(.0-.. + 96, 70, 126, 148, 23, 93, 106, 107, 46, 213, 145, 246, // `F~..]jk.... + 71, 200, 93, 21, 86, 197, 247, 237, 96, 169, 52, 153, // G.].V...`.4. + 170, 166, 184, 168, 150, 177, 111, 145, 145, 220, 110, 174, // ......o...n. + 30, 22, 46, 167, 217, 40, 93, 165, 141, 15, 9, 154, // .....(]..... + 52, 226, 253, 49, 83, 141, 28, 6, 147, 208, 247, 93, // 4..1S......] + 74, 240, 212, 30, 118, 221, 208, 170, 73, 83, 85, 177, // J...v...ISU. + 239, 44, 111, 103, 47, 212, 48, 149, 33, 98, 57, 14, // .,og/.0.!b9. + 195, 218, 33, 28, 121, 227, 78, 100, 23, 61, 228, 67, // ..!.y.Nd.=.C + 233, 211, 11, 90, 228, 79, 112, 83, 110, 34, 139, 89, // ...Z.OpSn".Y + 83, 117, 33, 92, 164, 45, 53, 198, 109, 46, 211, 86, // Su!..-5.m..V + 251, 153, 136, 233, 7, 66, 31, 112, 217, 173, 202, 26, // .....B.p.... + 111, 146, 77, 174, 247, 206, 63, 111, 84, 225, 48, 159, // o.M...?oT.0. + 86, 133, 28, 188, 105, 34, 247, 76, 148, 223, 83, 110, // V...i".L..Sn + 86, 172, 99, 141, 184, 22, 124, 98, 11, 84, 114, 85, // V.c...|b.TrU + 107, 133, 215, 72, 33, 108, 95, 170, 156, 183, 157, 85, // k..H!l_....U + 115, 25, 245, 132, 215, 5, 228, 153, 218, 94, 34, 43, // s........^"+ + 149, 214, 191, 36, 167, 172, 232, 186, 47, 3, 206, 17, // ...$..../... + 208, 61, 145, 114, 208, 200, 234, 152, 85, 175, 95, 160, // .=.r....U._. + 148, 151, 170, 252, 38, 114, 129, 171, 240, 212, 96, 119, // ....&r....`w + 128, 64, 74, 255, 92, 246, 174, 54, 251, 182, 244, 184, // .@J....6.... + 170, 94, 102, 5, 89, 96, 220, 218, 224, 127, 169, 84, // .^f.Y`.....T + 61, 165, 136, 152, 143, 165, 159, 226, 200, 141, 161, 12, // =........... + 161, 149, 189, 175, 20, 168, 105, 252, 37, 66, 128, 119, // ......i.%B.w + 19, 170, 11, 57, 37, 111, 121, 172, 24, 141, 4, 31, // ...9%oy..... + 224, 224, 93, 107, 222, 156, 188, 3, 120, 220, 41, 139, // ..]k....x.). + 79, 49, 52, 37, 92, 36, 123, 133, 97, 21, 194, 216, // O14%.${.a... + 153, 227, 231, 92, 161, 129, 95, 246, 76, 52, 87, 233, // ......_.L4W. + 124, 170, 149, 137, 210, 11, 116, 113, 118, 103, 106, 233, // |.....tqvgj. + 51, 237, 213, 205, 180, 38, 14, 21, 1, 114, 85, 41, // 3....&...rU) + 72, 87, 3, 164, 168, 236, 44, 223, 85, 25, 254, 171, // HW....,.U... + 1, 83, 80, 254, 9, 67, 36, 91, 75, 33, 131, 106, // .SP..C$[K!.j + 150, 85, 23, 60, 7, 85, 198, 148, 142, 113, 226, 167, // .U.<.U...q.. + 43, 218, 246, 33, 75, 13, 132, 169, 101, 81, 13, 216, // +..!K...eQ.. + 32, 139, 133, 53, 199, 110, 64, 185, 53, 47, 141, 50, // ..5.n@.5/.2 + 122, 94, 27, 117, 153, 147, 160, 189, 213, 70, 197, 29, // z^.u.....F.. + 169, 247, 13, 97, 79, 38, 50, 2, 194, 35, 58, 29, // ...aO&2..#:. + 115, 49, 189, 43, 215, 84, 204, 234, 231, 122, 118, 181, // s1.+.T...zv. + 70, 121, 104, 229, 165, 182, 52, 133, 95, 109, 170, 26, // Fyh...4._m.. + 146, 57, 141, 122, 85, 175, 27, 224, 53, 59, 70, 174, // .9.zU...5;F. + 74, 37, 136, 70, 97, 92, 29, 132, 253, 226, 102, 123, // J%.Fa.....f{ + 255, 122, 82, 161, 47, 212, 97, 158, 59, 33, 38, 98, // .zR./.a.;!&b + 243, 159, 113, 78, 187, 121, 224, 54, 22, 47, 1, 120, // ..qN.y.6./.x + 97, 116, 85, 196, 93, 187, 13, 161, 43, 157, 40, 192, // atU.]...+.(. + 130, 200, 204, 199, 14, 128, 185, 17, 1, 98, 182, 235, // .........b.. + 216, 231, 141, 8, 2, 232, 73, 74, 123, 98, 116, 38, // ......IJ{bt& + 138, 80, 182, 38, 176, 130, 84, 56, 133, 54, 2, 250, // .P.&..T8.6.. + 20, 21, 235, 218, 69, 191, 103, 252, 9, 18, 129, 177, // ....E.g..... + 20, 37, 118, 238, 136, 47, 31, 10, 168, 44, 194, 88, // .%v../...,.X + 20, 55, 166, 120, 55, 21, 65, 88, 250, 196, 42, 195, // .7.x7.AX..*. + 246, 141, 237, 122, 228, 36, 128, 222, 57, 197, 208, 224, // ...z.$..9... + 185, 249, 16, 30, 133, 40, 72, 115, 174, 242, 243, 151, // .....(Hs.... + 119, 130, 20, 28, 164, 75, 91, 33, 51, 97, 161, 37, // w....K[!3a.% + 200, 230, 18, 26, 105, 50, 95, 4, 215, 148, 141, 168, // ....i2_..... + 11, 118, 119, 90, 206, 194, 154, 76, 219, 212, 73, 2, // .vwZ...L..I. + 156, 151, 239, 240, 100, 141, 195, 233, 20, 145, 176, 163, // ....d....... + 182, 115, 202, 65, 24, 121, 210, 32, 182, 26, 143, 66, // .s.A.y. ...B + 238, 176, 32, 89, 99, 131, 63, 41, 66, 163, 255, 250, // .. Yc.?)B... + 129, 41, 141, 126, 253, 129, 207, 11, 255, 107, 123, 218, // .).~.....k{. + 186, 170, 254, 157, 202, 86, 179, 190, 234, 144, 135, 240, // .....V...... + 37, 82, 190, 192, 77, 124, 72, 98, 234, 6, 50, 17, // %R..M|Hb..2. + 3, 78, 210, 114, 72, 145, 64, 90, 118, 202, 58, 150, // .N.rH.@Zv.:. + 218, 49, 82, 184, 45, 201, 169, 35, 243, 174, 31, 121, // .1R.-..#...y + 210, 135, 220, 134, 194, 159, 125, 195, 20, 191, 141, 229, // ......}..... + 204, 5, 34, 235, 228, 247, 203, 24, 188, 3, 180, 146, // .."......... + 212, 178, 71, 88, 160, 86, 251, 15, 46, 252, 231, 215, // ..GX.V...... + 231, 23, 176, 113, 102, 17, 124, 59, 200, 112, 19, 194, // ...qf.|;.p.. + 174, 130, 8, 174, 86, 43, 140, 64, 175, 232, 92, 147, // ....V+.@.... + 77, 7, 22, 243, 217, 226, 1, 219, 130, 169, 169, 80, // M..........P + 102, 53, 61, 35, 219, 121, 201, 244, 35, 118, 103, 51, // f5=#.y..#vg3 + 162, 90, 176, 72, 251, 145, 147, 185, 128, 92, 73, 159, // .Z.H......I. + 203, 64, 89, 144, 202, 68, 185, 96, 5, 162, 113, 157, // .@Y..D.`..q. + 173, 160, 252, 7, 39, 121, 106, 23, 231, 151, 233, 152, // ....'yj..... + 95, 245, 68, 29, 5, 193, 152, 106, 226, 141, 178, 131, // _.D....j.... + 200, 206, 217, 208, 209, 250, 100, 216, 237, 250, 89, 85, // ......d...YU + 195, 92, 38, 221, 165, 132, 215, 183, 227, 164, 219, 56, // ..&........8 + 251, 103, 72, 31, 50, 44, 98, 100, 238, 82, 138, 236, // .gH.2,bd.R.. + 197, 105, 215, 62, 131, 120, 10, 90, 148, 165, 59, 50, // .i.>.x.Z..;2 + 133, 173, 98, 26, 114, 21, 121, 182, 218, 252, 132, 149, // ..b.r.y..... + 141, 1, 7, 69, 20, 194, 80, 104, 63, 113, 90, 213, // ...E..Ph?qZ. + 36, 242, 72, 84, 34, 152, 185, 50, 41, 77, 1, 171, // $.HT"..2)M.. + 93, 232, 134, 242, 4, 142, 244, 195, 189, 106, 95, 123, // ]........j_{ + 32, 50, 59, 241, 180, 83, 105, 204, 158, 171, 98, 99, // 2;..Si...bc + 118, 179, 175, 222, 120, 73, 203, 243, 89, 38, 11, 47, // v...xI..Y&./ + 85, 125, 138, 219, 63, 91, 165, 204, 6, 85, 133, 202, // U}..?[...U.. + 7, 39, 38, 26, 187, 247, 101, 96, 5, 23, 254, 53, // .'&...e`...5 + 122, 77, 105, 191, 240, 154, 247, 191, 110, 182, 9, 241, // zMi.....n... + 174, 193, 199, 241, 239, 160, 97, 146, 59, 155, 81, 101, // ......a.;.Qe + 182, 35, 86, 200, 34, 47, 175, 175, 134, 226, 102, 67, // .#V."/....fC + 73, 141, 208, 50, 8, 54, 146, 154, 44, 164, 152, 85, // I..2.6..,..U + 162, 157, 119, 42, 206, 58, 65, 5, 210, 187, 206, 58, // ..w*.:A....: + 229, 61, 219, 52, 204, 158, 51, 78, 91, 178, 40, 150, // .=.4..3N[.(. + 129, 164, 81, 155, 37, 22, 213, 219, 98, 128, 74, 1, // ..Q.%...b.J. + 87, 205, 200, 11, 103, 31, 35, 165, 173, 35, 113, 121, // W...g.#..#qy + 217, 235, 136, 230, 43, 133, 76, 155, 87, 16, 167, 133, // ....+.L.W... + 251, 215, 113, 28, 198, 124, 215, 199, 29, 165, 192, 124, // ..q..|.....| + 51, 160, 166, 114, 188, 152, 53, 175, 174, 238, 207, 101, // 3..r..5....e + 182, 129, 130, 194, 15, 190, 179, 5, 23, 182, 235, 44, // ..........., + 123, 234, 62, 101, 97, 239, 255, 23, 223, 230, 202, 179, // {.>ea....... + 7, 224, 102, 7, 141, 14, 245, 51, 145, 37, 206, 221, // ..f....3.%.. + 42, 25, 241, 193, 209, 98, 53, 233, 248, 104, 126, 38, // *....b5..h~& + 70, 255, 242, 104, 35, 66, 194, 115, 101, 195, 44, 91, // F..h#B.se.,[ + 216, 170, 73, 86, 90, 248, 50, 73, 248, 108, 197, 196, // ..IVZ.2I.l.. + 131, 107, 195, 59, 101, 139, 85, 237, 97, 195, 229, 163, // .k.;e.U.a... + 64, 155, 71, 37, 198, 204, 38, 89, 130, 204, 128, 79, // @.G%..&Y...O + 68, 188, 15, 233, 12, 229, 141, 13, 215, 170, 206, 110, // D..........n + 176, 36, 104, 79, 23, 142, 159, 211, 25, 62, 221, 49, // .$hO.....>.1 + 37, 168, 153, 25, 95, 171, 169, 189, 109, 98, 36, 117, // %..._...mb$u + 208, 63, 89, 186, 176, 157, 42, 176, 221, 30, 20, 163, // .?Y...*..... + 137, 247, 20, 161, 239, 24, 210, 163, 119, 119, 12, 200, // ........ww.. + 239, 180, 225, 164, 7, 27, 7, 176, 119, 156, 48, 120, // ........w.0x + 47, 167, 192, 246, 61, 36, 207, 122, 22, 246, 93, 253, // /...=$.z..]. + 116, 66, 101, 29, 234, 116, 122, 102, 42, 155, 125, 92, // tBe..tzf*.}. + 191, 224, 195, 190, 192, 5, 117, 146, 26, 23, 47, 107, // ......u.../k + 248, 46, 95, 150, 140, 7, 72, 140, 101, 156, 49, 254, // .._...H.e.1. + 153, 247, 38, 27, 223, 239, 23, 91, 166, 167, 31, 108, // ..&....[...l + 58, 19, 178, 195, 129, 2, 33, 223, 8, 77, 213, 176, // :.....!..M.. + 160, 189, 45, 121, 184, 35, 249, 241, 199, 80, 109, 63, // ..-y.#...Pm? + 205, 243, 56, 196, 189, 137, 52, 40, 251, 131, 57, 25, // ..8...4(..9. + 180, 51, 112, 166, 37, 43, 149, 252, 131, 116, 116, 83, // .3p.%+...ttS + 201, 82, 212, 147, 252, 64, 47, 249, 216, 242, 84, 111, // .R...@/...To + 247, 236, 207, 160, 61, 173, 204, 207, 134, 45, 61, 207, // ....=....-=. + 141, 18, 128, 224, 202, 241, 129, 186, 194, 255, 125, 101, // ..........}e + 255, 231, 16, 106, 236, 202, 116, 77, 249, 66, 150, 237, // ...j..tM.B.. + 34, 214, 35, 174, 71, 177, 52, 20, 40, 164, 83, 232, // ".#.G.4.(.S. + 66, 146, 159, 33, 28, 232, 40, 114, 12, 247, 52, 8, // B..!..(r..4. + 146, 134, 179, 25, 140, 106, 156, 125, 130, 72, 135, 34, // .....j.}.H." + 233, 100, 177, 80, 202, 74, 37, 251, 104, 65, 165, 27, // .d.P.J%.hA.. + 233, 57, 234, 227, 74, 62, 182, 66, 8, 33, 206, 78, // .9..J>.B.!.N + 120, 20, 168, 129, 180, 35, 49, 115, 23, 149, 47, 54, // x....#1s../6 + 51, 85, 108, 225, 16, 160, 183, 33, 133, 96, 166, 247, // 3Ul....!.`.. + 220, 138, 200, 197, 126, 67, 39, 3, 113, 202, 173, 39, // ....~C'.q..' + 37, 77, 10, 95, 34, 84, 49, 83, 35, 244, 146, 214, // %M._"T1S#... + 146, 224, 92, 182, 223, 193, 129, 50, 251, 182, 71, 125, // .......2..G} + 42, 186, 29, 38, 181, 206, 91, 155, 28, 59, 176, 70, // *..&..[..;.F + 197, 170, 231, 81, 164, 151, 238, 182, 144, 13, 101, 13, // ...Q......e. + 252, 73, 39, 72, 191, 87, 215, 21, 132, 66, 31, 170, // .I'H.W...B.. + 232, 184, 70, 125, 41, 34, 211, 47, 177, 87, 105, 215, // ..F})"./.Wi. + 236, 54, 43, 205, 242, 47, 178, 190, 224, 162, 218, 176, // .6+../...... + 210, 46, 169, 124, 176, 85, 249, 92, 169, 142, 13, 61, // ...|.U.....= + 0, 19, 72, 172, 1, 74, 234, 77, 115, 171, 4, 77, // ..H..J.Ms..M + 108, 208, 208, 237, 74, 12, 119, 9, 228, 112, 147, 239, // l...J.w..p.. + 98, 51, 188, 22, 63, 105, 82, 104, 113, 245, 178, 77, // b3..?iRhq..M + 145, 37, 239, 207, 78, 95, 12, 11, 132, 145, 45, 69, // .%..N_....-E + 205, 72, 177, 73, 2, 40, 142, 89, 155, 80, 110, 172, // .H.I.(.Y.Pn. + 211, 186, 104, 84, 29, 163, 254, 204, 115, 117, 78, 110, // ..hT....suNn + 144, 79, 137, 111, 218, 37, 104, 35, 180, 146, 173, 162, // .O.o.%h#.... + 142, 85, 248, 248, 16, 137, 83, 140, 1, 173, 175, 249, // .U....S..... + 124, 52, 105, 153, 27, 184, 169, 139, 36, 147, 186, 228, // |4i.....$... + 88, 135, 153, 221, 62, 13, 203, 223, 252, 110, 148, 152, // X...>....n.. + 248, 208, 161, 87, 60, 8, 179, 253, 88, 254, 248, 129, // ...W<...X... + 231, 88, 117, 162, 197, 151, 10, 234, 195, 225, 44, 131, // .Xu.......,. + 40, 182, 117, 47, 66, 69, 149, 63, 220, 27, 194, 12, // (.u/BE.?.... + 125, 55, 232, 242, 175, 250, 148, 207, 234, 242, 175, 186, // }7.......... + 233, 243, 13, 151, 146, 126, 227, 195, 90, 156, 252, 243, // .....~..Z... + 242, 169, 111, 181, 212, 135, 75, 217, 114, 38, 19, 218, // ..o...K.r&.. + 126, 126, 180, 23, 88, 185, 129, 49, 55, 84, 67, 81, // ~~..X..17TCQ + 124, 125, 100, 101, 231, 50, 40, 50, 100, 223, 12, 234, // |}de.2(2d... + 95, 17, 208, 16, 163, 202, 39, 127, 229, 97, 88, 245, // _.....'..aX. + 53, 226, 38, 211, 73, 237, 131, 44, 98, 124, 148, 125, // 5.&.I..,b|.} + 69, 166, 127, 141, 184, 77, 168, 170, 247, 42, 236, 156, // E....M...*.. + 239, 142, 164, 205, 225, 239, 248, 248, 144, 121, 87, 159, // .........yW. + 129, 83, 84, 121, 57, 167, 179, 65, 250, 167, 131, 48, // .STy9..A...0 + 241, 150, 188, 49, 49, 127, 196, 180, 185, 75, 133, 32, // ...11....K. + 58, 10, 244, 86, 93, 153, 16, 32, 4, 247, 22, 75, // :..V].. ...K + 157, 61, 105, 161, 153, 22, 96, 233, 196, 198, 134, 178, // .=i...`..... + 125, 27, 128, 137, 54, 233, 97, 194, 155, 186, 16, 140, // }...6.a..... + 160, 78, 223, 210, 18, 220, 40, 131, 87, 217, 170, 186, // .N....(.W... + 173, 149, 183, 205, 191, 29, 209, 91, 170, 175, 23, 242, // .......[.... + 22, 249, 183, 32, 251, 55, 128, 151, 110, 128, 232, 97, // ... .7..n..a + 134, 65, 182, 197, 161, 108, 79, 125, 72, 223, 154, 183, // .A...lO}H... + 224, 60, 97, 106, 78, 56, 89, 80, 24, 50, 41, 21, // . html` `, camera: props => html` `, arrows: props => html` `, + doc: props => html` `, }; export const tipColors = { @@ -157,7 +158,7 @@ export function Colored({icon, text, colors}) { export function Stat({title, text, tipText, tipIcon, tipColors, colors}) { return html`
-
+

${title}

@@ -173,27 +174,34 @@ export function Stat({title, text, tipText, tipIcon, tipColors, colors}) { `; }; -export function TextValue({value, setfn, disabled, placeholder, type, addonRight, addonLeft, attr, min, max, step}) { +export function TextValue({value, setfn, disabled, placeholder, type, addonRight, addonLeft, attr, min, max, step, mult}) { const [bg, setBg] = useState('bg-white'); - useEffect(() => { checkval(value); }, []); - const checkval = function(v) { + useEffect(() => { if (type == 'number') checkval(+min, +max, +value); }, []); + step ||= '1', mult ||= 1; + const checkval = function(min, max, v) { setBg('bg-white'); if (min && v < min) setBg('bg-red-100 border-red-200'); if (max && v > max) setBg('bg-red-100 border-red-200'); }; - const oninput = ev => { + const m = step.match(/^.+\.(.+)/); + const digits = m ? m[1].length : 0; + const onchange = ev => { let v = ev.target.value; - if (type == 'number') v = parseInt(v); + if (type == 'number') { + checkval(+min, +max, +v); + v = +(parseFloat(v) / mult).toFixed(digits); + } setfn(v); - checkval(v); }; + if (type == 'number') value = +(value * mult).toFixed(digits); return html`
- ${ addonLeft && html`${addonLeft}` } - - ${ addonRight && html`${addonRight}` } + ${addonLeft && html`${addonLeft}` } + + ${addonRight && html`${addonRight}` } `; }; @@ -344,6 +352,6 @@ export function UploadFileButton(props) {
<${Button} title=${props.title} icon=${Icons.download} onclick=${onclick} ref=${btn} colors=${props.colors} /> -
${status} +
${status} `; }; diff --git a/examples/device-dashboard/web_root/main.css b/examples/device-dashboard/web_root/main.css index c963fdcacd..32a32c1ec1 100644 --- a/examples/device-dashboard/web_root/main.css +++ b/examples/device-dashboard/web_root/main.css @@ -1 +1 @@ -/*! tailwindcss v3.3.2 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter var,Helvetica,sans-serif;font-feature-settings:"cv11","ss01";font-variation-settings:"opsz" 32}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.bottom-0{bottom:0}.left-0{left:0}.right-4{right:1rem}.right-auto{right:auto}.top-0{top:0}.top-4{top:1rem}.isolate{isolation:isolate}.z-10{z-index:10}.z-\[48\]{z-index:48}.z-\[60\]{z-index:60}.col-span-2{grid-column:span 2/span 2}.m-4{margin:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-0{margin-top:0;margin-bottom:0}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-5{margin-top:1.25rem;margin-bottom:1.25rem}.mb-1{margin-bottom:.25rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.mr-2{margin-right:.5rem}.mr-4{margin-right:1rem}.mt-1{margin-top:.25rem}.mt-3{margin-top:.75rem}.mt-5{margin-top:1.25rem}.mt-7{margin-top:1.75rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-10{height:2.5rem}.h-12{height:3rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-full{height:100%}.min-h-screen{min-height:100vh}.w-0{width:0}.w-11{width:2.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-72{width:18rem}.w-96{width:24rem}.w-full{width:100%}.min-w-full{min-width:100%}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow-0{flex-grow:0}.basis-\[30px\]{flex-basis:30px}.border-separate{border-collapse:initial}.border-spacing-0{--tw-border-spacing-x:0px;--tw-border-spacing-y:0px;border-spacing:var(--tw-border-spacing-x) var(--tw-border-spacing-y)}.-translate-x-full{--tw-translate-x:-100%}.-translate-x-full,.translate-x-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x:0px}.translate-x-5{--tw-translate-x:1.25rem}.translate-x-5,.translate-y-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y:0px}.translate-y-2{--tw-translate-y:0.5rem}.transform,.translate-y-2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-content-end{place-content:end}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-6{row-gap:1.5rem}.-space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1px*var(--tw-space-x-reverse));margin-left:calc(-1px*(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(229 231 235/var(--tw-divide-opacity))}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-scroll{overflow:scroll}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;white-space:nowrap}.text-ellipsis,.truncate{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity))}.border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}.border-slate-300{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity))}.border-transparent{border-color:#0000}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}.bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.bg-slate-200{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.bg-violet-100{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-yellow-100{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity))}.bg-opacity-75{--tw-bg-opacity:0.75}.fill-cyan-500{fill:#06b6d4}.fill-slate-400{fill:#94a3b8}.stroke-cyan-600{stroke:#0891b2}.stroke-slate-300{stroke:#cbd5e1}.stroke-1{stroke-width:1}.p-2{padding:.5rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.pl-72{padding-left:18rem}.pr-3{padding-right:.75rem}.pt-0{padding-top:0}.pt-0\.5{padding-top:.125rem}.text-left{text-align:left}.align-middle{vertical-align:middle}.text-\[6px\]{font-size:6px}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.leading-6{line-height:1.5rem}.tracking-tight{letter-spacing:-.025em}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}.text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.text-green-900{--tw-text-opacity:1;color:rgb(20 83 45/var(--tw-text-opacity))}.text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}.text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity))}.text-slate-300{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}.text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.text-slate-700{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}.text-slate-900{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-yellow-900{--tw-text-opacity:1;color:rgb(113 63 18/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-0,.ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-inset{--tw-ring-inset:inset}.ring-black{--tw-ring-opacity:1;--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity))}.ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity))}.ring-green-300{--tw-ring-opacity:1;--tw-ring-color:rgb(134 239 172/var(--tw-ring-opacity))}.ring-red-300{--tw-ring-opacity:1;--tw-ring-color:rgb(252 165 165/var(--tw-ring-opacity))}.ring-yellow-300{--tw-ring-opacity:1;--tw-ring-color:rgb(253 224 71/var(--tw-ring-opacity))}.ring-opacity-5{--tw-ring-opacity:0.05}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur:blur(8px)}.backdrop-blur,.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.placeholder\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.placeholder\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.hover\:bg-blue-500:hover{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.hover\:text-blue-600:hover{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.focus\:z-20:focus{z-index:20}.focus\:outline-none:focus{outline:2px solid #0000;outline-offset:2px}.focus\:outline-offset-0:focus{outline-offset:0}.focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:outline:focus-visible{outline-style:solid}.focus-visible\:outline-2:focus-visible{outline-width:2px}.focus-visible\:outline-offset-0:focus-visible{outline-offset:0}.focus-visible\:outline-blue-600:focus-visible{outline-color:#2563eb}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-blue-400:disabled{--tw-bg-opacity:1;background-color:rgb(96 165 250/var(--tw-bg-opacity))}.disabled\:bg-gray-100:disabled{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.disabled\:text-gray-500:disabled{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.dark\:border-gray-800{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}.dark\:bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity))}.dark\:text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.dark\:text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}}@media (min-width:640px){.sm\:flex{display:flex}.sm\:flex-1{flex:1 1 0%}.sm\:translate-x-0{--tw-translate-x:0px}.sm\:translate-x-0,.sm\:translate-x-2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:translate-x-2{--tw-translate-x:0.5rem}.sm\:translate-y-0{--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:items-start{align-items:flex-start}.sm\:items-end{align-items:flex-end}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:p-2{padding:.5rem}.sm\:p-6{padding:1.5rem}.sm\:text-sm{font-size:.875rem;line-height:1.25rem}.sm\:leading-6{line-height:1.5rem}}@media (min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1024px){.lg\:block{display:block}.lg\:h-4{height:1rem}.lg\:w-px{width:1px}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.lg\:bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}} \ No newline at end of file +/*! tailwindcss v3.3.2 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter var,Helvetica,sans-serif;font-feature-settings:"cv11","ss01";font-variation-settings:"opsz" 32}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.bottom-0{bottom:0}.left-0{left:0}.right-auto{right:auto}.top-0{top:0}.isolate{isolation:isolate}.z-10{z-index:10}.z-\[48\]{z-index:48}.z-\[60\]{z-index:60}.col-span-2{grid-column:span 2/span 2}.m-4{margin:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-0{margin-top:0;margin-bottom:0}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-5{margin-top:1.25rem;margin-bottom:1.25rem}.mb-1{margin-bottom:.25rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.mr-2{margin-right:.5rem}.mr-4{margin-right:1rem}.mt-1{margin-top:.25rem}.mt-3{margin-top:.75rem}.mt-5{margin-top:1.25rem}.mt-7{margin-top:1.75rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-10{height:2.5rem}.h-12{height:3rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-full{height:100%}.min-h-screen{min-height:100vh}.w-0{width:0}.w-11{width:2.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-72{width:18rem}.w-96{width:24rem}.w-full{width:100%}.min-w-full{min-width:100%}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.grow-0{flex-grow:0}.basis-\[30px\]{flex-basis:30px}.border-separate{border-collapse:initial}.border-spacing-0{--tw-border-spacing-x:0px;--tw-border-spacing-y:0px;border-spacing:var(--tw-border-spacing-x) var(--tw-border-spacing-y)}.-translate-x-full{--tw-translate-x:-100%}.-translate-x-full,.translate-x-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x:0px}.translate-x-5{--tw-translate-x:1.25rem}.translate-x-5,.translate-y-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y:0px}.translate-y-2{--tw-translate-y:0.5rem}.transform,.translate-y-2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-content-end{place-content:end}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-6{row-gap:1.5rem}.-space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1px*var(--tw-space-x-reverse));margin-left:calc(-1px*(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(229 231 235/var(--tw-divide-opacity))}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-scroll{overflow:scroll}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;white-space:nowrap}.text-ellipsis,.truncate{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity))}.border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}.border-slate-300{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity))}.border-transparent{border-color:#0000}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}.bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.bg-slate-200{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.bg-violet-100{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-yellow-100{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity))}.bg-opacity-75{--tw-bg-opacity:0.75}.fill-cyan-500{fill:#06b6d4}.fill-slate-400{fill:#94a3b8}.stroke-cyan-600{stroke:#0891b2}.stroke-slate-300{stroke:#cbd5e1}.stroke-1{stroke-width:1}.p-2{padding:.5rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.pl-72{padding-left:18rem}.pr-3{padding-right:.75rem}.pt-0{padding-top:0}.pt-0\.5{padding-top:.125rem}.pt-2{padding-top:.5rem}.text-left{text-align:left}.align-middle{vertical-align:middle}.text-\[6px\]{font-size:6px}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.leading-6{line-height:1.5rem}.tracking-tight{letter-spacing:-.025em}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}.text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.text-green-900{--tw-text-opacity:1;color:rgb(20 83 45/var(--tw-text-opacity))}.text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}.text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity))}.text-slate-300{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}.text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.text-slate-700{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}.text-slate-900{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-yellow-900{--tw-text-opacity:1;color:rgb(113 63 18/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-0,.ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-inset{--tw-ring-inset:inset}.ring-black{--tw-ring-opacity:1;--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity))}.ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity))}.ring-green-300{--tw-ring-opacity:1;--tw-ring-color:rgb(134 239 172/var(--tw-ring-opacity))}.ring-red-300{--tw-ring-opacity:1;--tw-ring-color:rgb(252 165 165/var(--tw-ring-opacity))}.ring-yellow-300{--tw-ring-opacity:1;--tw-ring-color:rgb(253 224 71/var(--tw-ring-opacity))}.ring-opacity-5{--tw-ring-opacity:0.05}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur:blur(8px)}.backdrop-blur,.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.placeholder\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.placeholder\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.hover\:bg-blue-500:hover{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.hover\:text-blue-600:hover{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.focus\:z-20:focus{z-index:20}.focus\:outline-none:focus{outline:2px solid #0000;outline-offset:2px}.focus\:outline-offset-0:focus{outline-offset:0}.focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:outline:focus-visible{outline-style:solid}.focus-visible\:outline-2:focus-visible{outline-width:2px}.focus-visible\:outline-offset-0:focus-visible{outline-offset:0}.focus-visible\:outline-blue-600:focus-visible{outline-color:#2563eb}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-blue-400:disabled{--tw-bg-opacity:1;background-color:rgb(96 165 250/var(--tw-bg-opacity))}.disabled\:bg-gray-100:disabled{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.disabled\:text-gray-500:disabled{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.dark\:border-gray-800{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}.dark\:bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity))}.dark\:text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.dark\:text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}}@media (min-width:640px){.sm\:flex{display:flex}.sm\:flex-1{flex:1 1 0%}.sm\:translate-x-0{--tw-translate-x:0px}.sm\:translate-x-0,.sm\:translate-x-2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:translate-x-2{--tw-translate-x:0.5rem}.sm\:translate-y-0{--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:items-start{align-items:flex-start}.sm\:items-end{align-items:flex-end}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:p-2{padding:.5rem}.sm\:p-6{padding:1.5rem}.sm\:text-sm{font-size:.875rem;line-height:1.25rem}.sm\:leading-6{line-height:1.5rem}}@media (min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1024px){.lg\:block{display:block}.lg\:h-4{height:1rem}.lg\:w-px{width:1px}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.lg\:bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}} \ No newline at end of file diff --git a/examples/device-dashboard/web_root/main.js b/examples/device-dashboard/web_root/main.js index 6e3f953270..679800dbb6 100644 --- a/examples/device-dashboard/web_root/main.js +++ b/examples/device-dashboard/web_root/main.js @@ -216,36 +216,49 @@ function FirmwareUpdate({}) { .then(r => new Promise(r => setTimeout(ev => { refresh(); r(); }, 3000))); const onrollback = ev => fetch('api/firmware/rollback') .then(onreboot); + const onerase = ev => fetch('api/device/eraselast').then(refresh); const onupload = function(ok, name, size) { if (!ok) return false; return new Promise(r => setTimeout(ev => { refresh(); r(); }, 3000)); }; - const clean = info[0].valid && info[0].golden == 0; return html` -
+
<${FirmwareStatus} title="Current firmware image" info=${info[0]}>
- <${Button} title="Commit this firmware" - onclick=${oncommit} icon=${Icons.thumbUp} disabled=${clean} /> - <${Button} title="Reboot device" onclick=${onreboot} icon=${Icons.refresh} clsx="absolute top-4 right-4" /> - <${UploadFileButton} - title="Upload new firmware: choose .bin file:" onupload=${onupload} - url="api/firmware/upload" accept=".bin,.uf2" /> + <${Button} title="Commit this firmware" onclick=${oncommit} + icon=${Icons.thumbUp} disabled=${info[0].status == 3} cls="w-full" /> <${FirmwareStatus} title="Previous firmware image" info=${info[1]}> <${Button} title="Rollback to this firmware" onclick=${onrollback} - icon=${Icons.backward} disabled=${info[1].valid == false} /> + icon=${Icons.backward} disabled=${info[1].status == 0} cls="w-full" /> +
+
+ Device control + +
+ <${UploadFileButton} + title="Upload new firmware .bin file" onupload=${onupload} + url="api/firmware/upload" accept=".bin,.uf2" /> +
+ <${Button} title="Reboot device" onclick=${onreboot} icon=${Icons.refresh} cls="w-full" /> + <${Button} title="Erase last sector" onclick=${onerase} icon=${Icons.doc} cls="w-full hidden" /> + + + + +
<${DeveloperNote}>
- When a new firmware gets flashed, its status is marked as, "first_boot". - That is an unreliable (uncommitted) firmware. A user may choose - to revert back to the previous committed firmware on the subsequent - boots. Clicking on the "commit" button calls "mg_ota_commit()" function - which commits the firmware. + Firmware status and other information is stored in the last sector + of flash + +
+ Firmware status can be FIRST_BOOT, UNCOMMITTED or COMMITTED. If no + information is available, it is UNAVAILABLE.
This GUI loads a firmware file and sends it chunk by chunk to the diff --git a/examples/stm32/nucleo-h563zi-make-baremetal-builtin/main.c b/examples/stm32/nucleo-h563zi-make-baremetal-builtin/main.c index 94d58764f2..b60d1ce9ca 100644 --- a/examples/stm32/nucleo-h563zi-make-baremetal-builtin/main.c +++ b/examples/stm32/nucleo-h563zi-make-baremetal-builtin/main.c @@ -42,23 +42,21 @@ int main(void) { mg_mgr_init(&mgr); // Mongoose event manager mg_log_set(MG_LL_DEBUG); // Set log level -#if MG_OTA == MG_OTA_FLASH - // If we don't have any OTA info saved, e.g. we're pre-flashed, then - // call mg_ota_commit() to mark this firmware as reliable - if (mg_ota_status(MG_FIRMWARE_CURRENT) == MG_OTA_UNAVAILABLE) mg_ota_commit(); + mg_ota_boot(); // Call bootloader: continue to load, or boot another FW - // Demonstrate the use of mg_flash_{load/save} functions for keeping device +#if MG_OTA == MG_OTA_FLASH + // Demonstrate the use of mg_flash_{load/save} functions for storing device // configuration data on flash. Increment boot count on every boot. struct deviceconfig { uint32_t boot_count; - int some_other_data; + char some_other_data[40]; }; uint32_t key = 0x12345678; // A unique key, one per data type struct deviceconfig dc = {}; // Initialise to some default values - mg_flash_load(NULL, key, &dc, sizeof(dc)); // Load from flash - dc.boot_count++; // Increment boot count - mg_flash_save(NULL, key, &dc, sizeof(dc)); // And save back - MG_INFO(("Boot count: %u", dc.boot_count)); + mg_flash_load(NULL, key, &dc, sizeof(dc)); // Load from flash + dc.boot_count++; // Increment boot count + mg_flash_save(NULL, key, &dc, sizeof(dc)); // And save back + MG_INFO(("Boot count: %u", dc.boot_count)); // Print boot count #endif // Initialise Mongoose network stack diff --git a/examples/stm32/nucleo-h723zg-make-baremetal-builtin/Makefile b/examples/stm32/nucleo-h723zg-make-baremetal-builtin/Makefile index 5d2f216c0d..15e621f1e8 100644 --- a/examples/stm32/nucleo-h723zg-make-baremetal-builtin/Makefile +++ b/examples/stm32/nucleo-h723zg-make-baremetal-builtin/Makefile @@ -24,6 +24,7 @@ firmware.bin: firmware.elf firmware.elf: cmsis_core cmsis_h7 $(SOURCES) hal.h link.ld Makefile arm-none-eabi-gcc $(SOURCES) $(CFLAGS) $(LDFLAGS) -o $@ + arm-none-eabi-size $@ flash: firmware.bin st-flash --reset write $< 0x8000000 diff --git a/examples/stm32/nucleo-h723zg-make-baremetal-builtin/hal.h b/examples/stm32/nucleo-h723zg-make-baremetal-builtin/hal.h index 2ecc44512b..75c19b72ce 100644 --- a/examples/stm32/nucleo-h723zg-make-baremetal-builtin/hal.h +++ b/examples/stm32/nucleo-h723zg-make-baremetal-builtin/hal.h @@ -8,6 +8,16 @@ #pragma once +#define BTN PIN('C', 13) // User push button +#define LED1 PIN('B', 0) // On-board LED pin (green) +#define LED2 PIN('E', 1) // On-board LED pin (yellow) +#define LED3 PIN('B', 14) // On-board LED pin (red) +#define LED LED2 // Use yellow LED for blinking + +#ifndef UART_DEBUG +#define UART_DEBUG USART3 +#endif + #include #include @@ -21,12 +31,6 @@ #define PINNO(pin) (pin & 255) #define PINBANK(pin) (pin >> 8) -#define LED1 PIN('B', 0) // On-board LED pin (green) -#define LED2 PIN('E', 1) // On-board LED pin (yellow) -#define LED3 PIN('B', 14) // On-board LED pin (red) - -#define LED LED2 // Use yellow LED for blinking - // System clock (2.1, Figure 1; 8.5, Figure 45; 8.5.5, Figure 47; 8.5.6, Figure // 49; 8.5.8 Table 56; datasheet) CPU_FREQUENCY <= 550 MHz; hclk = CPU_FREQUENCY // / HPRE ; hclk <= 275 MHz; APB clocks <= 137.5 MHz. D1 domain bus matrix (and @@ -96,10 +100,6 @@ static inline void gpio_output(uint16_t pin) { GPIO_PULL_NONE, 0); } -#ifndef UART_DEBUG -#define UART_DEBUG USART3 -#endif - // D2 Kernel clock (8.7.21) USART1 defaults to pclk2 (APB2), while USART2,3 // default to pclk1 (APB1). Even if using other kernel clocks, the APBx clocks // must be enabled for CPU access, as the kernel clock drives the BRR, not the diff --git a/examples/stm32/nucleo-h723zg-make-baremetal-builtin/link.ld b/examples/stm32/nucleo-h723zg-make-baremetal-builtin/link.ld index 5494c6b864..9256c02435 100644 --- a/examples/stm32/nucleo-h723zg-make-baremetal-builtin/link.ld +++ b/examples/stm32/nucleo-h723zg-make-baremetal-builtin/link.ld @@ -16,19 +16,15 @@ SECTIONS { .rodata : { *(.rodata*) } > flash .data : { - _sdata = .; /* for init_ram() */ + _sdata = .; *(.first_data) *(.data SORT(.data.*)) - _edata = .; /* for init_ram() */ + *(.iram .iram* .iram.*) + _edata = .; } > sram AT > flash _sidata = LOADADDR(.data); - .bss : { - _sbss = .; /* for init_ram() */ - *(.bss SORT(.bss.*) COMMON) - _ebss = .; /* for init_ram() */ - } > sram - + .bss : { _sbss = .; *(.bss SORT(.bss.*) COMMON) _ebss = .; } > sram . = ALIGN(8); - _end = .; /* for cmsis_gcc.h and init_ram() */ + _end = .; } diff --git a/examples/stm32/nucleo-h723zg-make-baremetal-builtin/main.c b/examples/stm32/nucleo-h723zg-make-baremetal-builtin/main.c index 771e8e74dd..6f73c9f074 100644 --- a/examples/stm32/nucleo-h723zg-make-baremetal-builtin/main.c +++ b/examples/stm32/nucleo-h723zg-make-baremetal-builtin/main.c @@ -43,9 +43,22 @@ int main(void) { mg_mgr_init(&mgr); // Mongoose event manager mg_log_set(MG_LL_DEBUG); // Set log level - // If we don't have any OTA info saved, e.g. we're pre-flashed, then - // call mg_ota_commit() to mark this firmware as reliable - if (mg_ota_status(MG_FIRMWARE_CURRENT) == MG_OTA_UNAVAILABLE) mg_ota_commit(); + mg_ota_boot(); // Call bootloader: continue to load, or boot another FW + +#if MG_OTA == MG_OTA_FLASH + // Demonstrate the use of mg_flash_{load/save} functions for keeping device + // configuration data on flash. Increment boot count on every boot. + struct deviceconfig { + uint32_t boot_count; + char some_other_data[40]; + }; + uint32_t key = 0x12345678; // A unique key, one per data type + struct deviceconfig dc = {}; // Initialise to some default values + mg_flash_load(NULL, key, &dc, sizeof(dc)); // Load from flash + dc.boot_count++; // Increment boot count + mg_flash_save(NULL, key, &dc, sizeof(dc)); // And save back + MG_INFO(("Boot count: %u", dc.boot_count)); +#endif // Initialise Mongoose network stack struct mg_tcpip_driver_stm32h_data driver_data = {.mdc_cr = 4}; diff --git a/examples/stm32/nucleo-h723zg-make-baremetal-builtin/mongoose_custom.h b/examples/stm32/nucleo-h723zg-make-baremetal-builtin/mongoose_custom.h index 93d839e071..29a55da21e 100644 --- a/examples/stm32/nucleo-h723zg-make-baremetal-builtin/mongoose_custom.h +++ b/examples/stm32/nucleo-h723zg-make-baremetal-builtin/mongoose_custom.h @@ -1,6 +1,8 @@ #pragma once #define MG_ARCH MG_ARCH_NEWLIB +#define MG_OTA MG_OTA_FLASH +#define MG_DEVICE MG_DEVICE_STM32H7 #define MG_ENABLE_TCPIP 1 #define MG_ENABLE_CUSTOM_MILLIS 1 diff --git a/examples/stm32/nucleo-h743zi-make-baremetal-builtin/main.c b/examples/stm32/nucleo-h743zi-make-baremetal-builtin/main.c index e01b08e3dd..2f008f4cc8 100644 --- a/examples/stm32/nucleo-h743zi-make-baremetal-builtin/main.c +++ b/examples/stm32/nucleo-h743zi-make-baremetal-builtin/main.c @@ -45,9 +45,22 @@ int main(void) { mg_mgr_init(&mgr); // Mongoose event manager mg_log_set(MG_LL_DEBUG); // Set log level - // If we don't have any OTA info saved, e.g. we're pre-flashed, then - // call mg_ota_commit() to mark this firmware as reliable - if (mg_ota_status(MG_FIRMWARE_CURRENT) == MG_OTA_UNAVAILABLE) mg_ota_commit(); + mg_ota_boot(); // Call bootloader: continue to load, or boot another FW + +#if MG_OTA == MG_OTA_FLASH + // Demonstrate the use of mg_flash_{load/save} functions for keeping device + // configuration data on flash. Increment boot count on every boot. + struct deviceconfig { + uint32_t boot_count; + char some_other_data[40]; + }; + uint32_t key = 0x12345678; // A unique key, one per data type + struct deviceconfig dc = {}; // Initialise to some default values + mg_flash_load(NULL, key, &dc, sizeof(dc)); // Load from flash + dc.boot_count++; // Increment boot count + mg_flash_save(NULL, key, &dc, sizeof(dc)); // And save back + MG_INFO(("Boot count: %u", dc.boot_count)); +#endif // Initialise Mongoose network stack struct mg_tcpip_driver_stm32h_data driver_data = {.mdc_cr = 4}; diff --git a/mongoose.c b/mongoose.c index b768dbadad..74d3f76601 100644 --- a/mongoose.c +++ b/mongoose.c @@ -211,26 +211,6 @@ bool mg_flash_load(void *sector, uint32_t key, void *buf, size_t len) { return ok; } -static bool mg_flash_writev(char *location, struct mg_str *strings, size_t n) { - size_t align = mg_flash_write_align(), i, j, k = 0, nwritten = 0; - char buf[align]; - bool ok = true; - for (i = 0; ok && i < n; i++) { - for (j = 0; ok && j < strings[i].len; j++) { - buf[k++] = strings[i].ptr[j]; - if (k >= sizeof(buf)) { - ok = mg_flash_write(location + nwritten, buf, sizeof(buf)); - k = 0, nwritten += sizeof(buf); - } - } - } - if (k > 0) { - while (k < sizeof(buf)) buf[k++] = 0xff; - ok = mg_flash_write(location + nwritten, buf, sizeof(buf)); - } - return ok; -} - // For all saved objects in the sector, delete old versions of objects static void mg_flash_sector_cleanup(char *sector) { // Buffer all saved objects into an IO buffer (backed by RAM) @@ -243,7 +223,7 @@ static void mg_flash_sector_cleanup(char *sector) { MG_DEBUG(("Cleaning up sector %p", sector)); while ((n = mg_flash_next(sector + ofs, sector + ss, &key, &size)) > 0) { // Delete an old copy of this object in the cache - for (size_t o = 0; o < io.len; o += size2 + hs) { + for (size_t o = 0; o < io.len; o += size2 + hs) { uint32_t k = *(uint32_t *) (io.buf + o + sizeof(uint32_t)); size2 = *(uint32_t *) (io.buf + o); if (k == key) { @@ -252,7 +232,7 @@ static void mg_flash_sector_cleanup(char *sector) { } } // And add the new copy - mg_iobuf_add(&io, io.len, sector + ofs, size + hs); + mg_iobuf_add(&io, io.len, sector + ofs, size + hs); ofs += n; } // All objects are cached in RAM now @@ -277,8 +257,10 @@ bool mg_flash_save(void *sector, uint32_t key, const void *buf, size_t len) { } else if (((s - base) % ss) != 0) { MG_ERROR(("%p is not a sector boundary", sector)); } else { - size_t needed = sizeof(uint32_t) * 2 + len; - size_t needed_aligned = MG_ROUND_UP(needed, mg_flash_write_align()); + char ab[mg_flash_write_align()]; // Aligned write block + uint32_t hdr[2] = {(uint32_t) len, key}; + size_t needed = sizeof(hdr) + len; + size_t needed_aligned = MG_ROUND_UP(needed, sizeof(ab)); while ((n = mg_flash_next(s + ofs, s + ss, NULL, NULL)) > 0) ofs += n; // If there is not enough space left, cleanup sector and re-eval ofs @@ -290,11 +272,39 @@ bool mg_flash_save(void *sector, uint32_t key, const void *buf, size_t len) { if (ofs + needed_aligned <= ss) { // Enough space to save this object - uint32_t hdr[2] = {(uint32_t) len, key}; - struct mg_str data[] = {mg_str_n((char *) hdr, sizeof(hdr)), - mg_str_n(buf, len)}; - ok = mg_flash_writev(s + ofs, data, 2); - MG_DEBUG(("Saving %lu bytes @ %p, key %x: %d", len, s + ofs, key, ok)); + if (sizeof(ab) < sizeof(hdr)) { + // Flash write granularity is 32 bit or less, write with no buffering + ok = mg_flash_write(s + ofs, hdr, sizeof(hdr)); + if (ok) mg_flash_write(s + ofs + sizeof(hdr), buf, len); + } else { + // Flash granularity is sizeof(hdr) or more. We need to save in + // 3 chunks: initial block, bulk, rest. This is because we have + // two memory chunks to write: hdr and buf, on aligned boundaries. + n = sizeof(ab) - sizeof(hdr); // Initial chunk that we write + if (n > len) n = len; // is + memset(ab, 0xff, sizeof(ab)); // initialized to all-one + memcpy(ab, hdr, sizeof(hdr)); // contains the header (key + size) + memcpy(ab + sizeof(hdr), buf, n); // and an initial part of buf + MG_INFO(("saving initial block of %lu", sizeof(ab))); + ok = mg_flash_write(s + ofs, ab, sizeof(ab)); + if (ok && len > n) { + size_t n2 = MG_ROUND_DOWN(len - n, sizeof(ab)); + if (n2 > 0) { + MG_INFO(("saving bulk, %lu", n2)); + ok = mg_flash_write(s + ofs + sizeof(ab), (char *) buf + n, n2); + } + if (ok && len > n) { + size_t n3 = len - n - n2; + if (n3 > sizeof(ab)) n3 = sizeof(ab); + memset(ab, 0xff, sizeof(ab)); + memcpy(ab, (char *) buf + n + n2, n3); + MG_INFO(("saving rest, %lu", n3)); + ok = mg_flash_write(s + ofs + sizeof(ab) + n2, ab, sizeof(ab)); + } + } + } + MG_DEBUG(("Saved %lu/%lu bytes @ %p, key %x: %d", len, needed_aligned, + s + ofs, key, ok)); MG_DEBUG(("Sector space left: %lu bytes", ss - ofs - needed_aligned)); } else { MG_ERROR(("Sector is full")); @@ -391,6 +401,7 @@ bool mg_flash_erase(void *location) { } else { uintptr_t diff = (char *) location - (char *) mg_flash_start(); uint32_t sector = diff / mg_flash_sector_size(); + uint32_t saved_cr = MG_REG(FLASH_NSCR); // Save CR value flash_unlock(); flash_clear_err(); MG_REG(FLASH_NSCR) = 0; @@ -406,6 +417,7 @@ bool mg_flash_erase(void *location) { MG_DEBUG(("Erase sector %lu @ %p: %s. CR %#lx SR %#lx", sector, location, ok ? "ok" : "fail", MG_REG(FLASH_NSCR), MG_REG(FLASH_NSSR))); // mg_hexdump(location, 32); + MG_REG(FLASH_NSCR) = saved_cr; // Restore saved CR } return ok; } @@ -435,21 +447,18 @@ bool mg_flash_write(void *addr, const void *buf, size_t len) { flash_clear_err(); MG_ARM_DISABLE_IRQ(); // MG_DEBUG(("Starting flash write %lu bytes @ %p", len, addr)); + MG_REG(FLASH_NSCR) = MG_BIT(1); // Set programming flag while (ok && src < end) { if (flash_page_start(dst) && mg_flash_erase(dst) == false) break; - MG_REG(FLASH_NSCR) = MG_BIT(1); // Set programming flag *(volatile uint32_t *) dst++ = *src++; flash_wait(); if (flash_is_err()) ok = false; } + MG_ARM_ENABLE_IRQ(); MG_DEBUG(("Flash write %lu bytes @ %p: %s. CR %#lx SR %#lx", len, dst, flash_is_err() ? "fail" : "ok", MG_REG(FLASH_NSCR), MG_REG(FLASH_NSSR))); - if (flash_is_err()) ok = false; - // mg_hexdump(addr, len > 32 ? 32 : len); - // MG_REG(FLASH_NSCR) &= ~MG_BIT(1); // Set programming flag MG_REG(FLASH_NSCR) = 0; // Clear flags - MG_ARM_ENABLE_IRQ(); return ok; } @@ -477,66 +486,71 @@ void mg_device_reset(void) { #define FLASH_CCR 0x14 #define FLASH_OPTSR_CUR 0x1c #define FLASH_OPTSR_PRG 0x20 +#define FLASH_SIZE_REG 0x1ff1e880 -void *mg_flash_start(void) { +MG_IRAM void *mg_flash_start(void) { return (void *) 0x08000000; } -size_t mg_flash_size(void) { - return 2 * 1024 * 1024; // 2Mb +MG_IRAM size_t mg_flash_size(void) { + return MG_REG(FLASH_SIZE_REG) * 1024; } -size_t mg_flash_sector_size(void) { +MG_IRAM size_t mg_flash_sector_size(void) { return 128 * 1024; // 128k } -size_t mg_flash_write_align(void) { +MG_IRAM size_t mg_flash_write_align(void) { return 32; // 256 bit } -int mg_flash_bank(void) { +MG_IRAM int mg_flash_bank(void) { + if (mg_flash_size() < 2 * 1024 * 1024) return 0; // No dual bank support return MG_REG(FLASH_BASE1 + FLASH_OPTCR) & MG_BIT(31) ? 2 : 1; } -static void flash_unlock(void) { +MG_IRAM static void flash_unlock(void) { static bool unlocked = false; if (unlocked == false) { MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0x45670123; MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0xcdef89ab; - MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0x45670123; - MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0xcdef89ab; + if (mg_flash_bank() > 0) { + MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0x45670123; + MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0xcdef89ab; + } MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x08192a3b; // opt reg is "shared" MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x4c5d6e7f; // thus unlock once unlocked = true; } } -static bool flash_page_start(volatile uint32_t *dst) { +MG_IRAM static bool flash_page_start(volatile uint32_t *dst) { char *base = (char *) mg_flash_start(), *end = base + mg_flash_size(); volatile char *p = (char *) dst; return p >= base && p < end && ((p - base) % mg_flash_sector_size()) == 0; } -static bool flash_is_err(uint32_t bank) { +MG_IRAM static bool flash_is_err(uint32_t bank) { return MG_REG(bank + FLASH_SR) & ((MG_BIT(11) - 1) << 17); // RM0433 4.9.5 } -static void flash_wait(uint32_t bank) { +MG_IRAM static void flash_wait(uint32_t bank) { while (MG_REG(bank + FLASH_SR) & (MG_BIT(0) | MG_BIT(2))) (void) 0; } -static void flash_clear_err(uint32_t bank) { +MG_IRAM static void flash_clear_err(uint32_t bank) { flash_wait(bank); // Wait until ready MG_REG(bank + FLASH_CCR) = ((MG_BIT(11) - 1) << 16U); // Clear all errors } -static bool flash_bank_is_swapped(uint32_t bank) { +MG_IRAM static bool flash_bank_is_swapped(uint32_t bank) { return MG_REG(bank + FLASH_OPTCR) & MG_BIT(31); // RM0433 4.9.7 } // Figure out flash bank based on the address -static uint32_t flash_bank(void *addr) { +MG_IRAM static uint32_t flash_bank(void *addr) { size_t ofs = (char *) addr - (char *) mg_flash_start(); + if (mg_flash_bank() == 0) return FLASH_BASE1; return ofs < mg_flash_size() / 2 ? FLASH_BASE1 : FLASH_BASE2; } -bool mg_flash_erase(void *addr) { +MG_IRAM bool mg_flash_erase(void *addr) { bool ok = false; if (flash_page_start(addr) == false) { MG_ERROR(("%p is not on a sector boundary", addr)); @@ -544,12 +558,13 @@ bool mg_flash_erase(void *addr) { uintptr_t diff = (char *) addr - (char *) mg_flash_start(); uint32_t sector = diff / mg_flash_sector_size(); uint32_t bank = flash_bank(addr); + uint32_t saved_cr = MG_REG(bank + FLASH_CR); // Save CR value flash_unlock(); if (sector > 7) sector -= 8; - // MG_INFO(("Erasing @ %p, sector %lu, bank %#x", addr, sector, bank)); flash_clear_err(bank); + MG_REG(bank + FLASH_CR) = MG_BIT(5); // 32-bit write parallelism MG_REG(bank + FLASH_CR) |= (sector & 7U) << 8U; // Sector to erase MG_REG(bank + FLASH_CR) |= MG_BIT(2); // Sector erase bit MG_REG(bank + FLASH_CR) |= MG_BIT(7); // Start erasing @@ -557,12 +572,13 @@ bool mg_flash_erase(void *addr) { MG_DEBUG(("Erase sector %lu @ %p %s. CR %#lx SR %#lx", sector, addr, ok ? "ok" : "fail", MG_REG(bank + FLASH_CR), MG_REG(bank + FLASH_SR))); - // mg_hexdump(addr, 32); + MG_REG(bank + FLASH_CR) = saved_cr; // Restore CR } return ok; } -bool mg_flash_swap_bank() { +MG_IRAM bool mg_flash_swap_bank() { + if (mg_flash_bank() == 0) return true; uint32_t bank = FLASH_BASE1; uint32_t desired = flash_bank_is_swapped(bank) ? 0 : MG_BIT(31); flash_unlock(); @@ -575,7 +591,7 @@ bool mg_flash_swap_bank() { return true; } -bool mg_flash_write(void *addr, const void *buf, size_t len) { +MG_IRAM bool mg_flash_write(void *addr, const void *buf, size_t len) { if ((len % mg_flash_write_align()) != 0) { MG_ERROR(("%lu is not aligned to %lu", len, mg_flash_write_align())); return false; @@ -587,25 +603,25 @@ bool mg_flash_write(void *addr, const void *buf, size_t len) { bool ok = true; flash_unlock(); flash_clear_err(bank); + MG_REG(bank + FLASH_CR) = MG_BIT(1); // Set programming flag + MG_REG(bank + FLASH_CR) |= MG_BIT(5); // 32-bit write parallelism + MG_DEBUG(("Writing flash @ %p, %lu bytes", addr, len)); MG_ARM_DISABLE_IRQ(); - MG_REG(bank + FLASH_CR) = MG_BIT(1); // Set programming flag - // MG_INFO(("Writing flash @ %p, %lu bytes", addr, len)); while (ok && src < end) { if (flash_page_start(dst) && mg_flash_erase(dst) == false) break; *(volatile uint32_t *) dst++ = *src++; flash_wait(bank); if (flash_is_err(bank)) ok = false; } + MG_ARM_ENABLE_IRQ(); MG_DEBUG(("Flash write %lu bytes @ %p: %s. CR %#lx SR %#lx", len, dst, ok ? "ok" : "fail", MG_REG(bank + FLASH_CR), MG_REG(bank + FLASH_SR))); - // mg_hexdump(addr, len > 32 ? 32 : len); MG_REG(bank + FLASH_CR) &= ~MG_BIT(1); // Clear programming flag - MG_ARM_ENABLE_IRQ(); return ok; } -void mg_device_reset(void) { +MG_IRAM void mg_device_reset(void) { // SCB->AIRCR = ((0x5fa << SCB_AIRCR_VECTKEY_Pos)|SCB_AIRCR_SYSRESETREQ_Msk); *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004; } @@ -3243,7 +3259,7 @@ long mg_json_get_long(struct mg_str json, const char *path, long dflt) { -static int s_level = MG_LL_INFO; +int mg_log_level = MG_LL_INFO; static mg_pfn_t s_log_func = mg_pfn_stdout; static void *s_log_func_param = NULL; @@ -3261,29 +3277,19 @@ static void logs(const char *buf, size_t len) { for (i = 0; i < len; i++) logc(((unsigned char *) buf)[i]); } -void mg_log_set(int log_level) { - MG_DEBUG(("Setting log level to %d", log_level)); - s_level = log_level; -} - #if MG_ENABLE_CUSTOM_LOG // Let user define their own mg_log_prefix() and mg_log() #else -bool mg_log_prefix(int level, const char *file, int line, const char *fname) { - if (level <= s_level) { - const char *p = strrchr(file, '/'); - char buf[41]; - size_t n; - if (p == NULL) p = strrchr(file, '\\'); - n = mg_snprintf(buf, sizeof(buf), "%-6llx %d %s:%d:%s", mg_millis(), level, - p == NULL ? file : p + 1, line, fname); - if (n > sizeof(buf) - 2) n = sizeof(buf) - 2; - while (n < sizeof(buf)) buf[n++] = ' '; - logs(buf, n - 1); - return true; - } else { - return false; - } +void mg_log_prefix(int level, const char *file, int line, const char *fname) { + const char *p = strrchr(file, '/'); + char buf[41]; + size_t n; + if (p == NULL) p = strrchr(file, '\\'); + n = mg_snprintf(buf, sizeof(buf), "%-6llx %d %s:%d:%s", mg_millis(), level, + p == NULL ? file : p + 1, line, fname); + if (n > sizeof(buf) - 2) n = sizeof(buf) - 2; + while (n < sizeof(buf)) buf[n++] = ' '; + logs(buf, n - 1); } void mg_log(const char *fmt, ...) { @@ -5492,6 +5498,8 @@ size_t mg_ota_size(int fw) { (void) fw; return 0; } +MG_IRAM void mg_ota_boot(void) { +} #endif #ifdef MG_ENABLE_LINES @@ -5526,7 +5534,7 @@ bool mg_ota_begin(size_t new_firmware_size) { size_t half = mg_flash_size() / 2, max = half - mg_flash_sector_size(); s_crc32 = 0; s_addr = (char *) mg_flash_start() + half; - MG_DEBUG(("Firmware %lu bytes, max %lu", s_size, max)); + MG_DEBUG(("Firmware %lu bytes, max %lu", new_firmware_size, max)); if (new_firmware_size < max) { ok = true; s_size = new_firmware_size; @@ -5560,6 +5568,14 @@ bool mg_ota_write(const void *buf, size_t len) { return ok; } +MG_IRAM static uint32_t mg_fwkey(int fw) { + uint32_t key = MG_OTADATA_KEY + fw; + int bank = mg_flash_bank(); + if (bank == 2 && fw == MG_FIRMWARE_PREVIOUS) key--; + if (bank == 2 && fw == MG_FIRMWARE_CURRENT) key++; + return key; +} + bool mg_ota_end(void) { char *base = (char *) mg_flash_start() + mg_flash_size() / 2; bool ok = false; @@ -5569,7 +5585,7 @@ bool mg_ota_end(void) { if (size == s_size && crc32 == s_crc32) { uint32_t now = (uint32_t) (mg_now() / 1000); struct mg_otadata od = {crc32, size, now, MG_OTA_FIRST_BOOT}; - uint32_t key = MG_OTADATA_KEY + (mg_flash_bank() == 2 ? 1 : 2); + uint32_t key = mg_fwkey(MG_FIRMWARE_PREVIOUS); ok = mg_flash_save(NULL, key, &od, sizeof(od)); } MG_DEBUG(("CRC: %x/%x, size: %lu/%lu, status: %s", s_crc32, crc32, s_size, @@ -5581,12 +5597,10 @@ bool mg_ota_end(void) { return ok; } -static struct mg_otadata mg_otadata(int fw) { +MG_IRAM static struct mg_otadata mg_otadata(int fw) { + uint32_t key = mg_fwkey(fw); struct mg_otadata od = {}; - int bank = mg_flash_bank(); - uint32_t key = MG_OTADATA_KEY + 1; - if ((fw == MG_FIRMWARE_CURRENT && bank == 2)) key++; - if ((fw == MG_FIRMWARE_PREVIOUS && bank == 1)) key++; + MG_INFO(("Loading %s OTA data", fw == MG_FIRMWARE_CURRENT ? "curr" : "prev")); mg_flash_load(NULL, key, &od, sizeof(od)); // MG_DEBUG(("Loaded OTA data. fw %d, bank %d, key %p", fw, bank, key)); // mg_hexdump(&od, sizeof(od)); @@ -5610,16 +5624,80 @@ size_t mg_ota_size(int fw) { return od.size; } -bool mg_ota_commit(void) { +MG_IRAM bool mg_ota_commit(void) { + bool ok = true; struct mg_otadata od = mg_otadata(MG_FIRMWARE_CURRENT); - od.status = MG_OTA_COMMITTED; - uint32_t key = MG_OTADATA_KEY + mg_flash_bank(); - return mg_flash_save(NULL, key, &od, sizeof(od)); + if (od.status != MG_OTA_COMMITTED) { + od.status = MG_OTA_COMMITTED; + MG_INFO(("Committing current firmware, OD size %lu", sizeof(od))); + ok = mg_flash_save(NULL, mg_fwkey(MG_FIRMWARE_CURRENT), &od, sizeof(od)); + } + return ok; } bool mg_ota_rollback(void) { MG_DEBUG(("Rolling firmware back")); - return mg_flash_swap_bank(); + if (mg_flash_bank() == 0) { + // No dual bank support. Mark previous firmware as FIRST_BOOT + struct mg_otadata prev = mg_otadata(MG_FIRMWARE_PREVIOUS); + prev.status = MG_OTA_FIRST_BOOT; + return mg_flash_save(NULL, MG_OTADATA_KEY + MG_FIRMWARE_PREVIOUS, &prev, + sizeof(prev)); + } else { + return mg_flash_swap_bank(); + } +} + +MG_IRAM void mg_ota_boot(void) { + MG_INFO(("Booting. Flash bank: %d", mg_flash_bank())); + struct mg_otadata curr = mg_otadata(MG_FIRMWARE_CURRENT); + struct mg_otadata prev = mg_otadata(MG_FIRMWARE_PREVIOUS); + + if (curr.status == MG_OTA_FIRST_BOOT) { + curr.status = MG_OTA_UNCOMMITTED; + MG_INFO(("First boot, setting status to UNCOMMITTED")); + mg_flash_save(NULL, MG_OTADATA_KEY + MG_FIRMWARE_CURRENT, &curr, + sizeof(curr)); + } else if (prev.status == MG_OTA_FIRST_BOOT && mg_flash_bank() == 0) { + // Swap paritions. Pray power does not disappear + size_t fs = mg_flash_size(), ss = mg_flash_sector_size(); + char *partition1 = mg_flash_start(); + char *partition2 = mg_flash_start() + fs / 2; + size_t ofs, max = fs / 2 - ss; // Set swap size to the whole partition + + if (curr.status != MG_OTA_UNAVAILABLE && + prev.status != MG_OTA_UNAVAILABLE) { + // We know exact sizes of both firmwares. + // Shrink swap size to the MAX(firmware1, firmware2) + size_t sz = curr.size > prev.size ? curr.size : prev.size; + if (sz > 0 && sz < max) max = sz; + } + + // MG_OTA_FIRST_BOOT -> MG_OTA_UNCOMMITTED + prev.status = MG_OTA_UNCOMMITTED; + mg_flash_save(NULL, MG_OTADATA_KEY + MG_FIRMWARE_CURRENT, &prev, + sizeof(prev)); + mg_flash_save(NULL, MG_OTADATA_KEY + MG_FIRMWARE_PREVIOUS, &curr, + sizeof(curr)); + + MG_INFO(("Swapping partitions, size %u (%u sectors)", max, max / ss)); + MG_INFO(("Do NOT power off...")); + mg_log_level = MG_LL_NONE; + + // We use the last sector of partition2 for OTA data/config storage + // Therefore we can use last sector of partition1 for swapping + char *tmpsector = partition1 + fs / 2 - ss; // Last sector of partition1 + (void) tmpsector; + for (ofs = 0; ofs < max; ofs += ss) { + // mg_flash_erase(tmpsector); + mg_flash_write(tmpsector, partition1 + ofs, ss); + // mg_flash_erase(partition1 + ofs); + mg_flash_write(partition1 + ofs, partition2 + ofs, ss); + // mg_flash_erase(partition2 + ofs); + mg_flash_write(partition2 + ofs, tmpsector, ss); + } + mg_device_reset(); + } } #endif diff --git a/mongoose.h b/mongoose.h index f03f51749b..6adbb4d4d2 100644 --- a/mongoose.h +++ b/mongoose.h @@ -27,21 +27,21 @@ extern "C" { #endif -#define MG_ARCH_CUSTOM 0 // User creates its own mongoose_custom.h -#define MG_ARCH_UNIX 1 // Linux, BSD, Mac, ... -#define MG_ARCH_WIN32 2 // Windows -#define MG_ARCH_ESP32 3 // ESP32 -#define MG_ARCH_ESP8266 4 // ESP8266 -#define MG_ARCH_FREERTOS 5 // FreeRTOS -#define MG_ARCH_AZURERTOS 6 // MS Azure RTOS -#define MG_ARCH_ZEPHYR 7 // Zephyr RTOS -#define MG_ARCH_NEWLIB 8 // Bare metal ARM -#define MG_ARCH_CMSIS_RTOS1 9 // CMSIS-RTOS API v1 (Keil RTX) -#define MG_ARCH_TIRTOS 10 // Texas Semi TI-RTOS -#define MG_ARCH_RP2040 11 // Raspberry Pi RP2040 -#define MG_ARCH_ARMCC 12 // Keil MDK-Core with Configuration Wizard -#define MG_ARCH_CMSIS_RTOS2 13 // CMSIS-RTOS API v2 (Keil RTX5, FreeRTOS) -#define MG_ARCH_RTTHREAD 14 // RT-Thread RTOS +#define MG_ARCH_CUSTOM 0 // User creates its own mongoose_custom.h +#define MG_ARCH_UNIX 1 // Linux, BSD, Mac, ... +#define MG_ARCH_WIN32 2 // Windows +#define MG_ARCH_ESP32 3 // ESP32 +#define MG_ARCH_ESP8266 4 // ESP8266 +#define MG_ARCH_FREERTOS 5 // FreeRTOS +#define MG_ARCH_AZURERTOS 6 // MS Azure RTOS +#define MG_ARCH_ZEPHYR 7 // Zephyr RTOS +#define MG_ARCH_NEWLIB 8 // Bare metal ARM +#define MG_ARCH_CMSIS_RTOS1 9 // CMSIS-RTOS API v1 (Keil RTX) +#define MG_ARCH_TIRTOS 10 // Texas Semi TI-RTOS +#define MG_ARCH_RP2040 11 // Raspberry Pi RP2040 +#define MG_ARCH_ARMCC 12 // Keil MDK-Core with Configuration Wizard +#define MG_ARCH_CMSIS_RTOS2 13 // CMSIS-RTOS API v2 (Keil RTX5, FreeRTOS) +#define MG_ARCH_RTTHREAD 14 // RT-Thread RTOS #if !defined(MG_ARCH) #if defined(__unix__) || defined(__APPLE__) @@ -497,6 +497,7 @@ typedef int socklen_t; #define realpath(a, b) _fullpath((b), (a), MG_PATH_MAX) #define sleep(x) Sleep((x) *1000) #define mkdir(a, b) _mkdir(a) +#define timegm(x) _mkgmtime(x) #ifndef S_ISDIR #define S_ISDIR(x) (((x) &_S_IFMT) == _S_IFDIR) @@ -919,16 +920,23 @@ void mg_pfn_stdout(char c, void *param); // param: ignored enum { MG_LL_NONE, MG_LL_ERROR, MG_LL_INFO, MG_LL_DEBUG, MG_LL_VERBOSE }; +extern int mg_log_level; // Current log level, one of MG_LL_* + void mg_log(const char *fmt, ...); -bool mg_log_prefix(int ll, const char *file, int line, const char *fname); -void mg_log_set(int log_level); +void mg_log_prefix(int ll, const char *file, int line, const char *fname); +// bool mg_log2(int ll, const char *file, int line, const char *fmt, ...); void mg_hexdump(const void *buf, size_t len); void mg_log_set_fn(mg_pfn_t fn, void *param); +#define mg_log_set(level_) mg_log_level = (level_) + #if MG_ENABLE_LOG -#define MG_LOG(level, args) \ - do { \ - if (mg_log_prefix((level), __FILE__, __LINE__, __func__)) mg_log args; \ +#define MG_LOG(level, args) \ + do { \ + if ((level) <= mg_log_level) { \ + mg_log_prefix((level), __FILE__, __LINE__, __func__); \ + mg_log args; \ + } \ } while (0) #else #define MG_LOG(level, args) \ @@ -1053,8 +1061,8 @@ uint64_t mg_now(void); // Return milliseconds since Epoch #define MG_ROUND_DOWN(x, a) ((a) == 0 ? (x) : (((x) / (a)) * (a))) #ifdef __GNUC__ -#define MG_ARM_DISABLE_IRQ() asm volatile ("cpsid i" : : : "memory") -#define MG_ARM_ENABLE_IRQ() asm volatile ("cpsie i" : : : "memory") +#define MG_ARM_DISABLE_IRQ() asm volatile("cpsid i" : : : "memory") +#define MG_ARM_ENABLE_IRQ() asm volatile("cpsie i" : : : "memory") #else #define MG_ARM_DISABLE_IRQ() #define MG_ARM_ENABLE_IRQ() @@ -1678,6 +1686,12 @@ void mg_rpc_list(struct mg_rpc_req *r); #define MG_OTA MG_OTA_NONE #endif +#if defined(__GNUC__) && !defined(__APPLE__) +#define MG_IRAM __attribute__((section(".iram"))) +#else +#define MG_IRAM +#endif + // Firmware update API bool mg_ota_begin(size_t new_firmware_size); // Start writing bool mg_ota_write(const void *buf, size_t len); // Write chunk, aligned to 1k @@ -1696,8 +1710,9 @@ uint32_t mg_ota_crc32(int firmware); // Return firmware checksum uint32_t mg_ota_timestamp(int firmware); // Firmware timestamp, UNIX UTC epoch size_t mg_ota_size(int firmware); // Firmware size -bool mg_ota_commit(void); // Commit current firmware -bool mg_ota_rollback(void); // Rollback to the previous firmware +bool mg_ota_commit(void); // Commit current firmware +bool mg_ota_rollback(void); // Rollback to the previous firmware +MG_IRAM void mg_ota_boot(void); // Bootloader function // Copyright (c) 2023 Cesanta Software Limited // All rights reserved @@ -1723,7 +1738,7 @@ int mg_flash_bank(void); // 0: not dual bank, 1: bank1, 2: bank2 // Write, erase, swap bank bool mg_flash_write(void *addr, const void *buf, size_t len); -bool mg_flash_erase(void *addr); // Must be at sector boundary +bool mg_flash_erase(void *sector); bool mg_flash_swap_bank(void); // Convenience functions to store data on a flash sector with wear levelling diff --git a/src/arch.h b/src/arch.h index 1636b74a86..a9bc24b083 100644 --- a/src/arch.h +++ b/src/arch.h @@ -1,20 +1,20 @@ #pragma once -#define MG_ARCH_CUSTOM 0 // User creates its own mongoose_custom.h -#define MG_ARCH_UNIX 1 // Linux, BSD, Mac, ... -#define MG_ARCH_WIN32 2 // Windows -#define MG_ARCH_ESP32 3 // ESP32 -#define MG_ARCH_ESP8266 4 // ESP8266 -#define MG_ARCH_FREERTOS 5 // FreeRTOS -#define MG_ARCH_AZURERTOS 6 // MS Azure RTOS -#define MG_ARCH_ZEPHYR 7 // Zephyr RTOS -#define MG_ARCH_NEWLIB 8 // Bare metal ARM -#define MG_ARCH_CMSIS_RTOS1 9 // CMSIS-RTOS API v1 (Keil RTX) -#define MG_ARCH_TIRTOS 10 // Texas Semi TI-RTOS -#define MG_ARCH_RP2040 11 // Raspberry Pi RP2040 -#define MG_ARCH_ARMCC 12 // Keil MDK-Core with Configuration Wizard -#define MG_ARCH_CMSIS_RTOS2 13 // CMSIS-RTOS API v2 (Keil RTX5, FreeRTOS) -#define MG_ARCH_RTTHREAD 14 // RT-Thread RTOS +#define MG_ARCH_CUSTOM 0 // User creates its own mongoose_custom.h +#define MG_ARCH_UNIX 1 // Linux, BSD, Mac, ... +#define MG_ARCH_WIN32 2 // Windows +#define MG_ARCH_ESP32 3 // ESP32 +#define MG_ARCH_ESP8266 4 // ESP8266 +#define MG_ARCH_FREERTOS 5 // FreeRTOS +#define MG_ARCH_AZURERTOS 6 // MS Azure RTOS +#define MG_ARCH_ZEPHYR 7 // Zephyr RTOS +#define MG_ARCH_NEWLIB 8 // Bare metal ARM +#define MG_ARCH_CMSIS_RTOS1 9 // CMSIS-RTOS API v1 (Keil RTX) +#define MG_ARCH_TIRTOS 10 // Texas Semi TI-RTOS +#define MG_ARCH_RP2040 11 // Raspberry Pi RP2040 +#define MG_ARCH_ARMCC 12 // Keil MDK-Core with Configuration Wizard +#define MG_ARCH_CMSIS_RTOS2 13 // CMSIS-RTOS API v2 (Keil RTX5, FreeRTOS) +#define MG_ARCH_RTTHREAD 14 // RT-Thread RTOS #if !defined(MG_ARCH) #if defined(__unix__) || defined(__APPLE__) diff --git a/src/arch_win32.h b/src/arch_win32.h index c4ed572c67..ab96ec7219 100644 --- a/src/arch_win32.h +++ b/src/arch_win32.h @@ -96,6 +96,7 @@ typedef int socklen_t; #define realpath(a, b) _fullpath((b), (a), MG_PATH_MAX) #define sleep(x) Sleep((x) *1000) #define mkdir(a, b) _mkdir(a) +#define timegm(x) _mkgmtime(x) #ifndef S_ISDIR #define S_ISDIR(x) (((x) &_S_IFMT) == _S_IFDIR) diff --git a/src/device.h b/src/device.h index d73397e492..99b1064bd8 100644 --- a/src/device.h +++ b/src/device.h @@ -23,7 +23,7 @@ int mg_flash_bank(void); // 0: not dual bank, 1: bank1, 2: bank2 // Write, erase, swap bank bool mg_flash_write(void *addr, const void *buf, size_t len); -bool mg_flash_erase(void *addr); // Must be at sector boundary +bool mg_flash_erase(void *sector); bool mg_flash_swap_bank(void); // Convenience functions to store data on a flash sector with wear levelling diff --git a/src/device_flash.c b/src/device_flash.c index 70d759afe6..c7de46e15b 100644 --- a/src/device_flash.c +++ b/src/device_flash.c @@ -58,26 +58,6 @@ bool mg_flash_load(void *sector, uint32_t key, void *buf, size_t len) { return ok; } -static bool mg_flash_writev(char *location, struct mg_str *strings, size_t n) { - size_t align = mg_flash_write_align(), i, j, k = 0, nwritten = 0; - char buf[align]; - bool ok = true; - for (i = 0; ok && i < n; i++) { - for (j = 0; ok && j < strings[i].len; j++) { - buf[k++] = strings[i].ptr[j]; - if (k >= sizeof(buf)) { - ok = mg_flash_write(location + nwritten, buf, sizeof(buf)); - k = 0, nwritten += sizeof(buf); - } - } - } - if (k > 0) { - while (k < sizeof(buf)) buf[k++] = 0xff; - ok = mg_flash_write(location + nwritten, buf, sizeof(buf)); - } - return ok; -} - // For all saved objects in the sector, delete old versions of objects static void mg_flash_sector_cleanup(char *sector) { // Buffer all saved objects into an IO buffer (backed by RAM) @@ -90,7 +70,7 @@ static void mg_flash_sector_cleanup(char *sector) { MG_DEBUG(("Cleaning up sector %p", sector)); while ((n = mg_flash_next(sector + ofs, sector + ss, &key, &size)) > 0) { // Delete an old copy of this object in the cache - for (size_t o = 0; o < io.len; o += size2 + hs) { + for (size_t o = 0; o < io.len; o += size2 + hs) { uint32_t k = *(uint32_t *) (io.buf + o + sizeof(uint32_t)); size2 = *(uint32_t *) (io.buf + o); if (k == key) { @@ -99,7 +79,7 @@ static void mg_flash_sector_cleanup(char *sector) { } } // And add the new copy - mg_iobuf_add(&io, io.len, sector + ofs, size + hs); + mg_iobuf_add(&io, io.len, sector + ofs, size + hs); ofs += n; } // All objects are cached in RAM now @@ -124,8 +104,10 @@ bool mg_flash_save(void *sector, uint32_t key, const void *buf, size_t len) { } else if (((s - base) % ss) != 0) { MG_ERROR(("%p is not a sector boundary", sector)); } else { - size_t needed = sizeof(uint32_t) * 2 + len; - size_t needed_aligned = MG_ROUND_UP(needed, mg_flash_write_align()); + char ab[mg_flash_write_align()]; // Aligned write block + uint32_t hdr[2] = {(uint32_t) len, key}; + size_t needed = sizeof(hdr) + len; + size_t needed_aligned = MG_ROUND_UP(needed, sizeof(ab)); while ((n = mg_flash_next(s + ofs, s + ss, NULL, NULL)) > 0) ofs += n; // If there is not enough space left, cleanup sector and re-eval ofs @@ -137,11 +119,39 @@ bool mg_flash_save(void *sector, uint32_t key, const void *buf, size_t len) { if (ofs + needed_aligned <= ss) { // Enough space to save this object - uint32_t hdr[2] = {(uint32_t) len, key}; - struct mg_str data[] = {mg_str_n((char *) hdr, sizeof(hdr)), - mg_str_n(buf, len)}; - ok = mg_flash_writev(s + ofs, data, 2); - MG_DEBUG(("Saving %lu bytes @ %p, key %x: %d", len, s + ofs, key, ok)); + if (sizeof(ab) < sizeof(hdr)) { + // Flash write granularity is 32 bit or less, write with no buffering + ok = mg_flash_write(s + ofs, hdr, sizeof(hdr)); + if (ok) mg_flash_write(s + ofs + sizeof(hdr), buf, len); + } else { + // Flash granularity is sizeof(hdr) or more. We need to save in + // 3 chunks: initial block, bulk, rest. This is because we have + // two memory chunks to write: hdr and buf, on aligned boundaries. + n = sizeof(ab) - sizeof(hdr); // Initial chunk that we write + if (n > len) n = len; // is + memset(ab, 0xff, sizeof(ab)); // initialized to all-one + memcpy(ab, hdr, sizeof(hdr)); // contains the header (key + size) + memcpy(ab + sizeof(hdr), buf, n); // and an initial part of buf + MG_INFO(("saving initial block of %lu", sizeof(ab))); + ok = mg_flash_write(s + ofs, ab, sizeof(ab)); + if (ok && len > n) { + size_t n2 = MG_ROUND_DOWN(len - n, sizeof(ab)); + if (n2 > 0) { + MG_INFO(("saving bulk, %lu", n2)); + ok = mg_flash_write(s + ofs + sizeof(ab), (char *) buf + n, n2); + } + if (ok && len > n) { + size_t n3 = len - n - n2; + if (n3 > sizeof(ab)) n3 = sizeof(ab); + memset(ab, 0xff, sizeof(ab)); + memcpy(ab, (char *) buf + n + n2, n3); + MG_INFO(("saving rest, %lu", n3)); + ok = mg_flash_write(s + ofs + sizeof(ab) + n2, ab, sizeof(ab)); + } + } + } + MG_DEBUG(("Saved %lu/%lu bytes @ %p, key %x: %d", len, needed_aligned, + s + ofs, key, ok)); MG_DEBUG(("Sector space left: %lu bytes", ss - ofs - needed_aligned)); } else { MG_ERROR(("Sector is full")); diff --git a/src/device_stm32h5.c b/src/device_stm32h5.c index e4c5d3320b..e0b1d4b5cb 100644 --- a/src/device_stm32h5.c +++ b/src/device_stm32h5.c @@ -1,5 +1,5 @@ -#include "log.h" #include "device.h" +#include "log.h" #if MG_DEVICE == MG_DEVICE_STM32H5 @@ -73,6 +73,7 @@ bool mg_flash_erase(void *location) { } else { uintptr_t diff = (char *) location - (char *) mg_flash_start(); uint32_t sector = diff / mg_flash_sector_size(); + uint32_t saved_cr = MG_REG(FLASH_NSCR); // Save CR value flash_unlock(); flash_clear_err(); MG_REG(FLASH_NSCR) = 0; @@ -88,6 +89,7 @@ bool mg_flash_erase(void *location) { MG_DEBUG(("Erase sector %lu @ %p: %s. CR %#lx SR %#lx", sector, location, ok ? "ok" : "fail", MG_REG(FLASH_NSCR), MG_REG(FLASH_NSSR))); // mg_hexdump(location, 32); + MG_REG(FLASH_NSCR) = saved_cr; // Restore saved CR } return ok; } @@ -117,21 +119,18 @@ bool mg_flash_write(void *addr, const void *buf, size_t len) { flash_clear_err(); MG_ARM_DISABLE_IRQ(); // MG_DEBUG(("Starting flash write %lu bytes @ %p", len, addr)); + MG_REG(FLASH_NSCR) = MG_BIT(1); // Set programming flag while (ok && src < end) { if (flash_page_start(dst) && mg_flash_erase(dst) == false) break; - MG_REG(FLASH_NSCR) = MG_BIT(1); // Set programming flag *(volatile uint32_t *) dst++ = *src++; flash_wait(); if (flash_is_err()) ok = false; } + MG_ARM_ENABLE_IRQ(); MG_DEBUG(("Flash write %lu bytes @ %p: %s. CR %#lx SR %#lx", len, dst, flash_is_err() ? "fail" : "ok", MG_REG(FLASH_NSCR), MG_REG(FLASH_NSSR))); - if (flash_is_err()) ok = false; - // mg_hexdump(addr, len > 32 ? 32 : len); - // MG_REG(FLASH_NSCR) &= ~MG_BIT(1); // Set programming flag MG_REG(FLASH_NSCR) = 0; // Clear flags - MG_ARM_ENABLE_IRQ(); return ok; } diff --git a/src/device_stm32h7.c b/src/device_stm32h7.c index b33ca15d75..fe40232a55 100644 --- a/src/device_stm32h7.c +++ b/src/device_stm32h7.c @@ -1,5 +1,5 @@ -#include "log.h" #include "device.h" +#include "log.h" #if MG_DEVICE == MG_DEVICE_STM32H7 @@ -13,66 +13,71 @@ #define FLASH_CCR 0x14 #define FLASH_OPTSR_CUR 0x1c #define FLASH_OPTSR_PRG 0x20 +#define FLASH_SIZE_REG 0x1ff1e880 -void *mg_flash_start(void) { +MG_IRAM void *mg_flash_start(void) { return (void *) 0x08000000; } -size_t mg_flash_size(void) { - return 2 * 1024 * 1024; // 2Mb +MG_IRAM size_t mg_flash_size(void) { + return MG_REG(FLASH_SIZE_REG) * 1024; } -size_t mg_flash_sector_size(void) { +MG_IRAM size_t mg_flash_sector_size(void) { return 128 * 1024; // 128k } -size_t mg_flash_write_align(void) { +MG_IRAM size_t mg_flash_write_align(void) { return 32; // 256 bit } -int mg_flash_bank(void) { +MG_IRAM int mg_flash_bank(void) { + if (mg_flash_size() < 2 * 1024 * 1024) return 0; // No dual bank support return MG_REG(FLASH_BASE1 + FLASH_OPTCR) & MG_BIT(31) ? 2 : 1; } -static void flash_unlock(void) { +MG_IRAM static void flash_unlock(void) { static bool unlocked = false; if (unlocked == false) { MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0x45670123; MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0xcdef89ab; - MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0x45670123; - MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0xcdef89ab; + if (mg_flash_bank() > 0) { + MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0x45670123; + MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0xcdef89ab; + } MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x08192a3b; // opt reg is "shared" MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x4c5d6e7f; // thus unlock once unlocked = true; } } -static bool flash_page_start(volatile uint32_t *dst) { +MG_IRAM static bool flash_page_start(volatile uint32_t *dst) { char *base = (char *) mg_flash_start(), *end = base + mg_flash_size(); volatile char *p = (char *) dst; return p >= base && p < end && ((p - base) % mg_flash_sector_size()) == 0; } -static bool flash_is_err(uint32_t bank) { +MG_IRAM static bool flash_is_err(uint32_t bank) { return MG_REG(bank + FLASH_SR) & ((MG_BIT(11) - 1) << 17); // RM0433 4.9.5 } -static void flash_wait(uint32_t bank) { +MG_IRAM static void flash_wait(uint32_t bank) { while (MG_REG(bank + FLASH_SR) & (MG_BIT(0) | MG_BIT(2))) (void) 0; } -static void flash_clear_err(uint32_t bank) { +MG_IRAM static void flash_clear_err(uint32_t bank) { flash_wait(bank); // Wait until ready MG_REG(bank + FLASH_CCR) = ((MG_BIT(11) - 1) << 16U); // Clear all errors } -static bool flash_bank_is_swapped(uint32_t bank) { +MG_IRAM static bool flash_bank_is_swapped(uint32_t bank) { return MG_REG(bank + FLASH_OPTCR) & MG_BIT(31); // RM0433 4.9.7 } // Figure out flash bank based on the address -static uint32_t flash_bank(void *addr) { +MG_IRAM static uint32_t flash_bank(void *addr) { size_t ofs = (char *) addr - (char *) mg_flash_start(); + if (mg_flash_bank() == 0) return FLASH_BASE1; return ofs < mg_flash_size() / 2 ? FLASH_BASE1 : FLASH_BASE2; } -bool mg_flash_erase(void *addr) { +MG_IRAM bool mg_flash_erase(void *addr) { bool ok = false; if (flash_page_start(addr) == false) { MG_ERROR(("%p is not on a sector boundary", addr)); @@ -80,12 +85,13 @@ bool mg_flash_erase(void *addr) { uintptr_t diff = (char *) addr - (char *) mg_flash_start(); uint32_t sector = diff / mg_flash_sector_size(); uint32_t bank = flash_bank(addr); + uint32_t saved_cr = MG_REG(bank + FLASH_CR); // Save CR value flash_unlock(); if (sector > 7) sector -= 8; - // MG_INFO(("Erasing @ %p, sector %lu, bank %#x", addr, sector, bank)); flash_clear_err(bank); + MG_REG(bank + FLASH_CR) = MG_BIT(5); // 32-bit write parallelism MG_REG(bank + FLASH_CR) |= (sector & 7U) << 8U; // Sector to erase MG_REG(bank + FLASH_CR) |= MG_BIT(2); // Sector erase bit MG_REG(bank + FLASH_CR) |= MG_BIT(7); // Start erasing @@ -93,12 +99,13 @@ bool mg_flash_erase(void *addr) { MG_DEBUG(("Erase sector %lu @ %p %s. CR %#lx SR %#lx", sector, addr, ok ? "ok" : "fail", MG_REG(bank + FLASH_CR), MG_REG(bank + FLASH_SR))); - // mg_hexdump(addr, 32); + MG_REG(bank + FLASH_CR) = saved_cr; // Restore CR } return ok; } -bool mg_flash_swap_bank() { +MG_IRAM bool mg_flash_swap_bank() { + if (mg_flash_bank() == 0) return true; uint32_t bank = FLASH_BASE1; uint32_t desired = flash_bank_is_swapped(bank) ? 0 : MG_BIT(31); flash_unlock(); @@ -111,7 +118,7 @@ bool mg_flash_swap_bank() { return true; } -bool mg_flash_write(void *addr, const void *buf, size_t len) { +MG_IRAM bool mg_flash_write(void *addr, const void *buf, size_t len) { if ((len % mg_flash_write_align()) != 0) { MG_ERROR(("%lu is not aligned to %lu", len, mg_flash_write_align())); return false; @@ -123,25 +130,25 @@ bool mg_flash_write(void *addr, const void *buf, size_t len) { bool ok = true; flash_unlock(); flash_clear_err(bank); + MG_REG(bank + FLASH_CR) = MG_BIT(1); // Set programming flag + MG_REG(bank + FLASH_CR) |= MG_BIT(5); // 32-bit write parallelism + MG_DEBUG(("Writing flash @ %p, %lu bytes", addr, len)); MG_ARM_DISABLE_IRQ(); - MG_REG(bank + FLASH_CR) = MG_BIT(1); // Set programming flag - // MG_INFO(("Writing flash @ %p, %lu bytes", addr, len)); while (ok && src < end) { if (flash_page_start(dst) && mg_flash_erase(dst) == false) break; *(volatile uint32_t *) dst++ = *src++; flash_wait(bank); if (flash_is_err(bank)) ok = false; } + MG_ARM_ENABLE_IRQ(); MG_DEBUG(("Flash write %lu bytes @ %p: %s. CR %#lx SR %#lx", len, dst, ok ? "ok" : "fail", MG_REG(bank + FLASH_CR), MG_REG(bank + FLASH_SR))); - // mg_hexdump(addr, len > 32 ? 32 : len); MG_REG(bank + FLASH_CR) &= ~MG_BIT(1); // Clear programming flag - MG_ARM_ENABLE_IRQ(); return ok; } -void mg_device_reset(void) { +MG_IRAM void mg_device_reset(void) { // SCB->AIRCR = ((0x5fa << SCB_AIRCR_VECTKEY_Pos)|SCB_AIRCR_SYSRESETREQ_Msk); *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004; } diff --git a/src/log.c b/src/log.c index 02c6604c85..e5d3eeba5d 100644 --- a/src/log.c +++ b/src/log.c @@ -3,7 +3,7 @@ #include "str.h" #include "util.h" -static int s_level = MG_LL_INFO; +int mg_log_level = MG_LL_INFO; static mg_pfn_t s_log_func = mg_pfn_stdout; static void *s_log_func_param = NULL; @@ -21,29 +21,19 @@ static void logs(const char *buf, size_t len) { for (i = 0; i < len; i++) logc(((unsigned char *) buf)[i]); } -void mg_log_set(int log_level) { - MG_DEBUG(("Setting log level to %d", log_level)); - s_level = log_level; -} - #if MG_ENABLE_CUSTOM_LOG // Let user define their own mg_log_prefix() and mg_log() #else -bool mg_log_prefix(int level, const char *file, int line, const char *fname) { - if (level <= s_level) { - const char *p = strrchr(file, '/'); - char buf[41]; - size_t n; - if (p == NULL) p = strrchr(file, '\\'); - n = mg_snprintf(buf, sizeof(buf), "%-6llx %d %s:%d:%s", mg_millis(), level, - p == NULL ? file : p + 1, line, fname); - if (n > sizeof(buf) - 2) n = sizeof(buf) - 2; - while (n < sizeof(buf)) buf[n++] = ' '; - logs(buf, n - 1); - return true; - } else { - return false; - } +void mg_log_prefix(int level, const char *file, int line, const char *fname) { + const char *p = strrchr(file, '/'); + char buf[41]; + size_t n; + if (p == NULL) p = strrchr(file, '\\'); + n = mg_snprintf(buf, sizeof(buf), "%-6llx %d %s:%d:%s", mg_millis(), level, + p == NULL ? file : p + 1, line, fname); + if (n > sizeof(buf) - 2) n = sizeof(buf) - 2; + while (n < sizeof(buf)) buf[n++] = ' '; + logs(buf, n - 1); } void mg_log(const char *fmt, ...) { diff --git a/src/log.h b/src/log.h index e90ba79e9a..18fd2c377d 100644 --- a/src/log.h +++ b/src/log.h @@ -5,16 +5,23 @@ #include "fmt.h" enum { MG_LL_NONE, MG_LL_ERROR, MG_LL_INFO, MG_LL_DEBUG, MG_LL_VERBOSE }; +extern int mg_log_level; // Current log level, one of MG_LL_* + void mg_log(const char *fmt, ...); -bool mg_log_prefix(int ll, const char *file, int line, const char *fname); -void mg_log_set(int log_level); +void mg_log_prefix(int ll, const char *file, int line, const char *fname); +// bool mg_log2(int ll, const char *file, int line, const char *fmt, ...); void mg_hexdump(const void *buf, size_t len); void mg_log_set_fn(mg_pfn_t fn, void *param); +#define mg_log_set(level_) mg_log_level = (level_) + #if MG_ENABLE_LOG -#define MG_LOG(level, args) \ - do { \ - if (mg_log_prefix((level), __FILE__, __LINE__, __func__)) mg_log args; \ +#define MG_LOG(level, args) \ + do { \ + if ((level) <= mg_log_level) { \ + mg_log_prefix((level), __FILE__, __LINE__, __func__); \ + mg_log args; \ + } \ } while (0) #else #define MG_LOG(level, args) \ diff --git a/src/ota.h b/src/ota.h index a39c79bfb9..7eae2a496a 100644 --- a/src/ota.h +++ b/src/ota.h @@ -13,6 +13,12 @@ #define MG_OTA MG_OTA_NONE #endif +#if defined(__GNUC__) && !defined(__APPLE__) +#define MG_IRAM __attribute__((section(".iram"))) +#else +#define MG_IRAM +#endif + // Firmware update API bool mg_ota_begin(size_t new_firmware_size); // Start writing bool mg_ota_write(const void *buf, size_t len); // Write chunk, aligned to 1k @@ -31,5 +37,6 @@ uint32_t mg_ota_crc32(int firmware); // Return firmware checksum uint32_t mg_ota_timestamp(int firmware); // Firmware timestamp, UNIX UTC epoch size_t mg_ota_size(int firmware); // Firmware size -bool mg_ota_commit(void); // Commit current firmware -bool mg_ota_rollback(void); // Rollback to the previous firmware +bool mg_ota_commit(void); // Commit current firmware +bool mg_ota_rollback(void); // Rollback to the previous firmware +MG_IRAM void mg_ota_boot(void); // Bootloader function diff --git a/src/ota_dummy.c b/src/ota_dummy.c index 6aa106a3f1..5af659c8e9 100644 --- a/src/ota_dummy.c +++ b/src/ota_dummy.c @@ -35,4 +35,6 @@ size_t mg_ota_size(int fw) { (void) fw; return 0; } +MG_IRAM void mg_ota_boot(void) { +} #endif diff --git a/src/ota_flash.c b/src/ota_flash.c index da10757a0b..d5fe87b05b 100644 --- a/src/ota_flash.c +++ b/src/ota_flash.c @@ -1,7 +1,7 @@ #include "arch.h" +#include "device.h" #include "log.h" #include "ota.h" -#include "device.h" // This OTA implementation uses the internal flash API outlined in device.h // It splits flash into 2 equal partitions, and stores OTA status in the @@ -27,7 +27,7 @@ bool mg_ota_begin(size_t new_firmware_size) { size_t half = mg_flash_size() / 2, max = half - mg_flash_sector_size(); s_crc32 = 0; s_addr = (char *) mg_flash_start() + half; - MG_DEBUG(("Firmware %lu bytes, max %lu", s_size, max)); + MG_DEBUG(("Firmware %lu bytes, max %lu", new_firmware_size, max)); if (new_firmware_size < max) { ok = true; s_size = new_firmware_size; @@ -61,6 +61,14 @@ bool mg_ota_write(const void *buf, size_t len) { return ok; } +MG_IRAM static uint32_t mg_fwkey(int fw) { + uint32_t key = MG_OTADATA_KEY + fw; + int bank = mg_flash_bank(); + if (bank == 2 && fw == MG_FIRMWARE_PREVIOUS) key--; + if (bank == 2 && fw == MG_FIRMWARE_CURRENT) key++; + return key; +} + bool mg_ota_end(void) { char *base = (char *) mg_flash_start() + mg_flash_size() / 2; bool ok = false; @@ -70,7 +78,7 @@ bool mg_ota_end(void) { if (size == s_size && crc32 == s_crc32) { uint32_t now = (uint32_t) (mg_now() / 1000); struct mg_otadata od = {crc32, size, now, MG_OTA_FIRST_BOOT}; - uint32_t key = MG_OTADATA_KEY + (mg_flash_bank() == 2 ? 1 : 2); + uint32_t key = mg_fwkey(MG_FIRMWARE_PREVIOUS); ok = mg_flash_save(NULL, key, &od, sizeof(od)); } MG_DEBUG(("CRC: %x/%x, size: %lu/%lu, status: %s", s_crc32, crc32, s_size, @@ -82,12 +90,10 @@ bool mg_ota_end(void) { return ok; } -static struct mg_otadata mg_otadata(int fw) { +MG_IRAM static struct mg_otadata mg_otadata(int fw) { + uint32_t key = mg_fwkey(fw); struct mg_otadata od = {}; - int bank = mg_flash_bank(); - uint32_t key = MG_OTADATA_KEY + 1; - if ((fw == MG_FIRMWARE_CURRENT && bank == 2)) key++; - if ((fw == MG_FIRMWARE_PREVIOUS && bank == 1)) key++; + MG_INFO(("Loading %s OTA data", fw == MG_FIRMWARE_CURRENT ? "curr" : "prev")); mg_flash_load(NULL, key, &od, sizeof(od)); // MG_DEBUG(("Loaded OTA data. fw %d, bank %d, key %p", fw, bank, key)); // mg_hexdump(&od, sizeof(od)); @@ -111,15 +117,79 @@ size_t mg_ota_size(int fw) { return od.size; } -bool mg_ota_commit(void) { +MG_IRAM bool mg_ota_commit(void) { + bool ok = true; struct mg_otadata od = mg_otadata(MG_FIRMWARE_CURRENT); - od.status = MG_OTA_COMMITTED; - uint32_t key = MG_OTADATA_KEY + mg_flash_bank(); - return mg_flash_save(NULL, key, &od, sizeof(od)); + if (od.status != MG_OTA_COMMITTED) { + od.status = MG_OTA_COMMITTED; + MG_INFO(("Committing current firmware, OD size %lu", sizeof(od))); + ok = mg_flash_save(NULL, mg_fwkey(MG_FIRMWARE_CURRENT), &od, sizeof(od)); + } + return ok; } bool mg_ota_rollback(void) { MG_DEBUG(("Rolling firmware back")); - return mg_flash_swap_bank(); + if (mg_flash_bank() == 0) { + // No dual bank support. Mark previous firmware as FIRST_BOOT + struct mg_otadata prev = mg_otadata(MG_FIRMWARE_PREVIOUS); + prev.status = MG_OTA_FIRST_BOOT; + return mg_flash_save(NULL, MG_OTADATA_KEY + MG_FIRMWARE_PREVIOUS, &prev, + sizeof(prev)); + } else { + return mg_flash_swap_bank(); + } +} + +MG_IRAM void mg_ota_boot(void) { + MG_INFO(("Booting. Flash bank: %d", mg_flash_bank())); + struct mg_otadata curr = mg_otadata(MG_FIRMWARE_CURRENT); + struct mg_otadata prev = mg_otadata(MG_FIRMWARE_PREVIOUS); + + if (curr.status == MG_OTA_FIRST_BOOT) { + curr.status = MG_OTA_UNCOMMITTED; + MG_INFO(("First boot, setting status to UNCOMMITTED")); + mg_flash_save(NULL, MG_OTADATA_KEY + MG_FIRMWARE_CURRENT, &curr, + sizeof(curr)); + } else if (prev.status == MG_OTA_FIRST_BOOT && mg_flash_bank() == 0) { + // Swap paritions. Pray power does not disappear + size_t fs = mg_flash_size(), ss = mg_flash_sector_size(); + char *partition1 = mg_flash_start(); + char *partition2 = mg_flash_start() + fs / 2; + size_t ofs, max = fs / 2 - ss; // Set swap size to the whole partition + + if (curr.status != MG_OTA_UNAVAILABLE && + prev.status != MG_OTA_UNAVAILABLE) { + // We know exact sizes of both firmwares. + // Shrink swap size to the MAX(firmware1, firmware2) + size_t sz = curr.size > prev.size ? curr.size : prev.size; + if (sz > 0 && sz < max) max = sz; + } + + // MG_OTA_FIRST_BOOT -> MG_OTA_UNCOMMITTED + prev.status = MG_OTA_UNCOMMITTED; + mg_flash_save(NULL, MG_OTADATA_KEY + MG_FIRMWARE_CURRENT, &prev, + sizeof(prev)); + mg_flash_save(NULL, MG_OTADATA_KEY + MG_FIRMWARE_PREVIOUS, &curr, + sizeof(curr)); + + MG_INFO(("Swapping partitions, size %u (%u sectors)", max, max / ss)); + MG_INFO(("Do NOT power off...")); + mg_log_level = MG_LL_NONE; + + // We use the last sector of partition2 for OTA data/config storage + // Therefore we can use last sector of partition1 for swapping + char *tmpsector = partition1 + fs / 2 - ss; // Last sector of partition1 + (void) tmpsector; + for (ofs = 0; ofs < max; ofs += ss) { + // mg_flash_erase(tmpsector); + mg_flash_write(tmpsector, partition1 + ofs, ss); + // mg_flash_erase(partition1 + ofs); + mg_flash_write(partition1 + ofs, partition2 + ofs, ss); + // mg_flash_erase(partition2 + ofs); + mg_flash_write(partition2 + ofs, tmpsector, ss); + } + mg_device_reset(); + } } #endif diff --git a/src/util.h b/src/util.h index 0ec33ff7d0..782b35822b 100644 --- a/src/util.h +++ b/src/util.h @@ -40,8 +40,8 @@ uint64_t mg_now(void); // Return milliseconds since Epoch #define MG_ROUND_DOWN(x, a) ((a) == 0 ? (x) : (((x) / (a)) * (a))) #ifdef __GNUC__ -#define MG_ARM_DISABLE_IRQ() asm volatile ("cpsid i" : : : "memory") -#define MG_ARM_ENABLE_IRQ() asm volatile ("cpsie i" : : : "memory") +#define MG_ARM_DISABLE_IRQ() asm volatile("cpsid i" : : : "memory") +#define MG_ARM_ENABLE_IRQ() asm volatile("cpsie i" : : : "memory") #else #define MG_ARM_DISABLE_IRQ() #define MG_ARM_ENABLE_IRQ()