rk86 2.0.25 → 2.0.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/rk86.js +162 -19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rk86",
3
- "version": "2.0.25",
3
+ "version": "2.0.27",
4
4
  "description": "Эмулятор Радио-86РК (Intel 8080) для терминала",
5
5
  "bin": {
6
6
  "rk86": "rk86.js"
package/rk86.js CHANGED
@@ -2870,6 +2870,22 @@ var init_catalog_data = __esm(() => {
2870
2870
  checkSum: 60909,
2871
2871
  leadingE6: false
2872
2872
  },
2873
+ {
2874
+ name: "boulder.rkr",
2875
+ title: "\u0418\u0433\u0440\u0430 Boulder Dash",
2876
+ description: "",
2877
+ screenshots: [
2878
+ "boulder.rkr-1.png",
2879
+ "boulder.rkr-2.png",
2880
+ "boulder.rkr-3.png"
2881
+ ],
2882
+ start: 0,
2883
+ end: 16129,
2884
+ size: 16130,
2885
+ entry: 0,
2886
+ checkSum: 4539,
2887
+ leadingE6: false
2888
+ },
2873
2889
  {
2874
2890
  name: "chars.bin",
2875
2891
  title: "\u041F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0430 \u043F\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u0442\u0430\u0431\u043B\u0438\u0446\u0443 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0420\u0430\u0434\u0438\u043E-86\u0420\u041A",
@@ -2951,6 +2967,18 @@ var init_catalog_data = __esm(() => {
2951
2967
  checkSum: 64981,
2952
2968
  leadingE6: false
2953
2969
  },
2970
+ {
2971
+ name: "mon32-color.bin",
2972
+ title: "\u041C\u043E\u043D\u0438\u0442\u043E\u0440 32\u041A\u0411 \u0441 visible field-attribute mode (i8275 reset byte 4 = 0xD3 \u0432\u043C\u0435\u0441\u0442\u043E vanilla 0x93). \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0434\u043B\u044F \u0446\u0432\u0435\u0442\u043D\u044B\u0445 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C \u0434\u043B\u044F \u0420\u041A, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043D\u044B \u043D\u0430 \u044D\u0442\u043E\u0442 \u0440\u0435\u0436\u0438\u043C. \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044F \u0447\u0435\u0440\u0435\u0437 URL-\u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 `?monitor=mon32-color.bin` (web) \u0438\u043B\u0438 `-m static/files/mon32-color.bin` (terminal).",
2973
+ description: "",
2974
+ screenshots: [],
2975
+ start: 0,
2976
+ end: 2047,
2977
+ size: 2048,
2978
+ entry: 0,
2979
+ checkSum: 21013,
2980
+ leadingE6: false
2981
+ },
2954
2982
  {
2955
2983
  name: "mon32.bin",
2956
2984
  title: '\u041E\u0440\u0438\u0433\u0438\u043D\u0430\u043B\u044C\u043D\u044B\u0439 <a href="https://github.com/begoon/rk86-maximite/blob/master/monitor/monitor32.asm">\u041C\u043E\u043D\u0438\u0442\u043E\u0440 32\u041A\u0411</a>',
@@ -3021,6 +3049,22 @@ var init_catalog_data = __esm(() => {
3021
3049
  checkSum: 20998,
3022
3050
  leadingE6: false
3023
3051
  },
3052
+ {
3053
+ name: "piton.rkr",
3054
+ title: "\u0418\u0433\u0440\u0430 \u041F\u0438\u0442\u043E\u043D",
3055
+ description: "",
3056
+ screenshots: [
3057
+ "piton.rkr-1.png",
3058
+ "piton.rkr-2.png",
3059
+ "piton.rkr-3.png"
3060
+ ],
3061
+ start: 0,
3062
+ end: 22143,
3063
+ size: 22144,
3064
+ entry: 0,
3065
+ checkSum: 10676,
3066
+ leadingE6: false
3067
+ },
3024
3068
  {
3025
3069
  name: "psi_1v3.rkr",
3026
3070
  title: '<a href="./psi_1v3.rkr/psi_1v3.txt">\u0423\u0442\u0438\u043B\u0438\u0442\u0430 \u0434\u043B\u044F \u043E\u043F\u044B\u0442\u043E\u0432 \u0441 \u0412\u041375/\u0412\u042257</a>',
@@ -3051,6 +3095,21 @@ var init_catalog_data = __esm(() => {
3051
3095
  checkSum: 16294,
3052
3096
  leadingE6: false
3053
3097
  },
3098
+ {
3099
+ name: "rise.rkr",
3100
+ title: "\u0418\u0433\u0440\u0430 Rise",
3101
+ description: "",
3102
+ screenshots: [
3103
+ "rise.rkr-1.png",
3104
+ "rise.rkr-2.png"
3105
+ ],
3106
+ start: 0,
3107
+ end: 9649,
3108
+ size: 9650,
3109
+ entry: 0,
3110
+ checkSum: 54320,
3111
+ leadingE6: false
3112
+ },
3054
3113
  {
3055
3114
  name: "rk8080pre.bin",
3056
3115
  title: '\u0422\u0435\u0441\u0442 "8080 Preliminary tests" \u043E\u0442 Ian Bartholomew',
@@ -3157,6 +3216,20 @@ var init_catalog_data = __esm(() => {
3157
3216
  checkSum: 12710,
3158
3217
  leadingE6: false
3159
3218
  },
3219
+ {
3220
+ name: "tree2025.rk",
3221
+ title: "\u041D\u043E\u0432\u043E\u0433\u043E\u0434\u043D\u044F\u044F \u0451\u043B\u043A\u0430 2025.",
3222
+ description: "\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 transparent field-attribute mode i8275 \u2014 \u043A\u043E\u0440\u0440\u0435\u043A\u0442\u043D\u043E\n\u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u0441 \u0434\u0435\u0444\u043E\u043B\u0442\u043D\u044B\u043C `mon32.bin`.",
3223
+ screenshots: [
3224
+ "tree2025.rk-1.png"
3225
+ ],
3226
+ start: 0,
3227
+ end: 615,
3228
+ size: 616,
3229
+ entry: 0,
3230
+ checkSum: 48507,
3231
+ leadingE6: false
3232
+ },
3160
3233
  {
3161
3234
  name: "trex.rk",
3162
3235
  title: "\u0418\u0433\u0440\u0430 T-Rex (\u0422\u0438\u0440\u0430\u043D\u043D\u043E\u0437\u0430\u0432\u0440)",
@@ -4083,7 +4156,7 @@ import { basename } from "path";
4083
4156
  // packages/rk86/package.json
4084
4157
  var package_default = {
4085
4158
  name: "rk86",
4086
- version: "2.0.24",
4159
+ version: "2.0.26",
4087
4160
  description: "\u042D\u043C\u0443\u043B\u044F\u0442\u043E\u0440 \u0420\u0430\u0434\u0438\u043E-86\u0420\u041A (Intel 8080) \u0434\u043B\u044F \u0442\u0435\u0440\u043C\u0438\u043D\u0430\u043B\u0430",
4088
4161
  bin: {
4089
4162
  rk86: "rk86.js"
@@ -5427,6 +5500,7 @@ class Memory {
5427
5500
  this.video_screen_size_y = this.video_screen_size_y_buf;
5428
5501
  this.machine.screen.set_geometry(this.video_screen_size_x, this.video_screen_size_y);
5429
5502
  }
5503
+ this.machine.screen.transparent_attr = (byte & 64) === 0;
5430
5504
  return;
5431
5505
  }
5432
5506
  if (vt57_reg === 57352 && byte === 128) {
@@ -5634,6 +5708,7 @@ class Screen {
5634
5708
  light_pen_active;
5635
5709
  video_memory_base = 0;
5636
5710
  video_memory_size = 0;
5711
+ transparent_attr = false;
5637
5712
  ready = false;
5638
5713
  renderer;
5639
5714
  constructor(machine) {
@@ -6056,36 +6131,104 @@ class TerminalRenderer {
6056
6131
  const dim = "\x1B[2m";
6057
6132
  const reset = "\x1B[0m";
6058
6133
  const w = screen.width;
6134
+ const ANSI_FG = ["37", "33", "35", "31", "36", "32", "34", "30"];
6059
6135
  let output = "\x1B[H";
6060
6136
  output += `${dim}\u250C${"\u2500".repeat(w)}\u2510${reset}
6061
6137
  `;
6138
+ const transparent = screen.transparent_attr;
6139
+ const blinkOff = Math.floor(Date.now() / 320) % 2 === 1;
6140
+ const FA_PENDING = -1;
6062
6141
  let addr = screen.video_memory_base;
6063
6142
  let frameStopped = false;
6143
+ let color = 0;
6144
+ let blink = false;
6064
6145
  for (let y = 0;y < screen.height; y++) {
6065
6146
  let line = `${dim}\u2502${reset}`;
6066
- let rowStopped = frameStopped;
6147
+ const cells = new Array(w);
6148
+ if (transparent) {
6149
+ const fifo = [];
6150
+ let fifoFlag = false;
6151
+ let cellCount = 0;
6152
+ let rowStopped = frameStopped;
6153
+ let bytesFetched = 0;
6154
+ while (cellCount < w && !rowStopped) {
6155
+ const raw = memory.read(addr + bytesFetched);
6156
+ bytesFetched++;
6157
+ if (fifoFlag) {
6158
+ fifo.push(raw);
6159
+ fifoFlag = false;
6160
+ continue;
6161
+ }
6162
+ if (raw >= 240) {
6163
+ cells[cellCount++] = { ch: 0, color, blink };
6164
+ rowStopped = true;
6165
+ if (raw >= 248)
6166
+ frameStopped = true;
6167
+ } else if (raw >= 192) {
6168
+ cells[cellCount++] = { ch: 0, color, blink };
6169
+ } else if (raw >= 128) {
6170
+ color = (raw & 1) << 2 | (raw & 12) >> 2;
6171
+ blink = (raw & 2) !== 0;
6172
+ cells[cellCount++] = { ch: FA_PENDING, color, blink };
6173
+ fifoFlag = true;
6174
+ } else {
6175
+ cells[cellCount++] = { ch: raw, color, blink };
6176
+ }
6177
+ }
6178
+ while (cellCount < w)
6179
+ cells[cellCount++] = { ch: 0, color, blink };
6180
+ let fifoIdx = 0;
6181
+ for (let x = 0;x < w; ++x) {
6182
+ if (cells[x].ch === FA_PENDING) {
6183
+ cells[x].ch = (fifo[fifoIdx] ?? 0) & 127;
6184
+ fifoIdx++;
6185
+ }
6186
+ }
6187
+ addr += bytesFetched;
6188
+ if (addr - screen.video_memory_base < (y + 1) * w) {
6189
+ addr = screen.video_memory_base + (y + 1) * w;
6190
+ }
6191
+ } else {
6192
+ let rowStopped = frameStopped;
6193
+ for (let x = 0;x < w; x++) {
6194
+ const raw = memory.read(addr + x);
6195
+ let ch;
6196
+ if (rowStopped) {
6197
+ ch = 0;
6198
+ } else if (raw >= 240) {
6199
+ ch = 0;
6200
+ rowStopped = true;
6201
+ if (raw >= 248)
6202
+ frameStopped = true;
6203
+ } else if (raw >= 192) {
6204
+ ch = 0;
6205
+ } else if (raw >= 128) {
6206
+ color = (raw & 1) << 2 | (raw & 12) >> 2;
6207
+ blink = (raw & 2) !== 0;
6208
+ ch = 0;
6209
+ } else {
6210
+ ch = raw;
6211
+ }
6212
+ cells[x] = { ch, color, blink };
6213
+ }
6214
+ addr += w;
6215
+ }
6216
+ let prevColor = -1;
6067
6217
  for (let x = 0;x < w; x++) {
6068
- const raw = memory.read(addr++);
6069
- let ch;
6070
- if (rowStopped) {
6071
- ch = " ";
6072
- } else if (raw >= 240) {
6073
- ch = " ";
6074
- rowStopped = true;
6075
- if (raw >= 248)
6076
- frameStopped = true;
6077
- } else if (raw >= 128) {
6078
- ch = " ";
6079
- } else {
6080
- ch = rk86char(raw);
6218
+ const cell = cells[x];
6219
+ const ch = cell.blink && blinkOff ? 0 : cell.ch;
6220
+ const glyph = rk86char(ch);
6221
+ if (cell.color !== prevColor) {
6222
+ line += `\x1B[${ANSI_FG[cell.color]}m`;
6223
+ prevColor = cell.color;
6081
6224
  }
6082
6225
  if (x === screen.cursor_x && y === screen.cursor_y) {
6083
- line += `\x1B[4m${ch}${reset}`;
6226
+ line += `\x1B[4m${glyph}\x1B[24m`;
6084
6227
  } else {
6085
- line += ch;
6228
+ line += glyph;
6086
6229
  }
6087
6230
  }
6088
- line += `${dim}\u2502${reset}`;
6231
+ line += `${reset}${dim}\u2502${reset}`;
6089
6232
  output += line + `
6090
6233
  `;
6091
6234
  }
@@ -6210,7 +6353,7 @@ function setupKeyboard(keyboard) {
6210
6353
  }
6211
6354
  });
6212
6355
  }
6213
- var MON32_B64 = "wzb4w2P+w5j7w7r8w0b8w7r8wwH+w6X8wyL5w3L+w3v6w3/6w7b6w0n7wxb7w876" + "w1L/w1b/PooyA4Axz3bNzvohAHYRX3YOAM3t+SHPdiIcdiFa/80i+c3O+iH/dSIx" + "diEqHSIvdj7DMiZ2Mc92IWb/zSL5MgKAPTICoM3u+CFs+OUhM3Z+/ljK0//+VcoA" + "8PXNLPkqK3ZNRCopdusqJ3bx/kTKxfn+Q8rX+f5Gyu35/lPK9Pn+VMr/+f5Nyib6" + "/kfKP/r+ScqG+v5Pyi37/kzKCPr+Uspo+sMA8D4zvcrx+OUhnv/NIvnhK8Pz+CEz" + "dgYAzWP+/gjK3Pj+f8rc+MS5/Hf+Dcoa+f4uymz4Bv8+Ur3Krvojw/P4eBcRM3YG" + "AMl+p8jNufwjwyL5ISd2ES12DgDN7fkRNHbNWvkiJ3YiKXbYPv8yLXbNWvkiKXbY" + "zVr5Iit22MOu+iEAABoT/g3Kjvn+LMj+IMpd+dYw+q76/gr6gvn+Efqu+v4X8q76" + "1gdPKSkpKdqu+gnDXfk3yXy6wH27yc2k+c2Q+cKi+TMzySPJzXL+/gPAzc76w676" + "5SFs/80i+eHJfsXNpfw+IM25/MHJzXj7zbn5zZb5feYPysX5w8j5Cr7K5vnNePvN" + "ufkKzbr5A82W+cPX+XHNmfnD7fl5vsx4+82W+cP0+X4CA82Z+cP/+c14+363+hX6" + "/iDSF/o+Ls25/M2W+X3mD8oI+sML+s14+825+eXN7vjh0jv65c1a+X3hdyPDJvrN" + "kPnKWvrrIiN2fjIldjb3PsMyMAAhov8iMQAxGHbB0eHx+SoWdsMmdj6QMgOgIgGg" + "OgCgAgPNmfnDbfoqAnbJ5SoAdn7hyTotdrfKkfp7Mi92zbb6zXj76814++vFzRb7" + "YGnNePvRzZD5yOvNePs+P825/MNs+D7/zf/65Qnrzf364Qnr5c0K+z7/zf/64eUh" + "AcA2ACs2TTYdNpk2kyM2J35+5iDK4fohCOA2gC4ENtA2diw2IzZJLgg2pOHJPgjN" + "mPtHPgjNmPtPyT4IzZj7d82Z+cMK+wEAAH6BT/XNkPnKn/nxeI5HzZn5wxn7ebfK" + "NfsyMHblzRb74c14++vNePvr5WBpzXj74cUBAADNRvwF4+PCTfsO5s1G/M2Q++vN" + "kPvrzYb7IQAAzZD7DubNRvzhzZD7w876xc2w+XzNpfx9zbr5wclOzUb8zZn5w4b7" + "TM1G/E3DRvzlxdVXPoAyCOAhAAA5MQAAIg12DgA6AoAPDw8P5gFf8XnmfwdPJgAl" + "yjT88ToCgA8PDw/mAbvKv/uxTxU6L3bC3PvWEkfxBcLd+xQ6AoAPDw8P5gFferf" + "yC/x5/ubC//uvMi52wwn8/hnCt/s+/zIudhYJFcK3+yEE4DbQNnYjNiM2ST4nMgH" + "APuAyAcAuCDakKg12+ToudqnDofwqDXb5zc76erfyrvrNpPnDnPvlxdX1PoAyCOAh" + "AAA5MQAAFgjxeQdPPgGpMgKAOjB2R/EFwmb8PgCpMgKAFTowdsJ6/NYOR/EFwnv8" + "FBXCWPz5IQTgNtA2diM2IzZJPicyAcA+4DIBwC4INqTx0cHhyfUPDw8Pza788eYP" + "/gr6t/zGB8YwT/XF1eXNAf4hhf3lKgJ26yoAdjoEdj367vzKZf3ic/151iBPDfrp/" + "MXNuf3Bw938rzIEdsl55n9P/h/Ko/3+DMqy/f4NyvP9/grKR/3+CMrW/f4Yyrn9/h" + "nK4v3+GsrF/f4byp79/gfCOP0B8AV4+z3CKP148z3CLv0Nwif9yXHNuf16/gPAe/" + "4IwM3i/Xr+G8LF/eXVIcJ3ERB4AZ4HGncjEwt5sMJY/dHhyXn+WcLp/M2y/T4C" + "w+r8edYgTw0+BPrq/MXNxf3Bw3f9IgB26yICdj6AMgHAfTIAwHwyAMDh0cHxyT4B" + "w+r8IfR/ESUJr3crG3uywqn9EQgDIcJ3yXsjHP5HwB4IAcD/CXr+GwFOAMLT/RYC" + "AbD4FAnJeysd/gjAHkcBQAAJev4DAbL/wvD9FhwBUAcVCcl9k9L5/SVvHggBCAAJ" + "yToCgOaAyg7+OgV2t8DlKgl2zXL+vW/KKv4+ATILdiYVryIJduEyBXbJJcIh/jzK" + "Iv48ylH+xQEDUM0n/cE6C3Ym4D0yC3bKTP4mQD7/wyL+OgKA5oDKUf46BnYvMgZ2" + "wxr+zQH+t8pj/q8yBXY6CXbJOgKA5oDCff4+/smvMgCAMgKAOgZ25gH2BjIDgDoB" + "gDzCl/49yeUuASYHfQ9vLzIAgDoBgC+3wrP+JfKc/j7/4ckuIDoBgC+3yq/+LcK1" + "/i4ILQfSw/58ZW/+Acr6/trz/gcHB8YgtP5fwgb/PiDhyQkKDX8IGRgaDB8bAAEC" + "AwQFfCHq/sP+/nwh4v6Fb37+QOHY5W86AoBn5kDCGv99/kD6P//mH+HJOgZ2t8oq" + "/33+QPoq//Ygb3zmIMI//33+QPo7/33uIOHJfeYvb33+QOHw5W/mD/4MffpQ/+4Q" + "4ckqMXbJIjF2yR9yYWRpby04NnJrAA0KLS0+AA0KGBgYGAANCiBQQy0NCiBITC0N" + "CiBCQy0NCiBERS0NCiBTUC0NCiBBRi0ZGRkZGRkACCAIACIWdvXhIh524SsiFHYh" + "AAA5MR525dXFKhR2Mc92zXj76yojds2Q+cJs+DoldnfDbPghc//NIvkhFHYGBl4j" + "VsXl6814+83u+NL2/81a+dHV63Irc+HBBSPC3v/J//8=";
6356
+ var MON32_B64 = "wzb4w2P+w5j7w7r8w0b8w7r8wwH+w6X8wyL5w3L+w3v6w3/6w7b6w0n7wxb7" + "w876w1L/w1b/PooyA4Axz3bNzvohAHYRX3YOAM3t+SHPdiIcdiFa/80i+c3O" + "+iH/dSIxdiEqHSIvdj7DMiZ2Mc92IWb/zSL5MgKAPTICoM3u+CFs+OUhM3Z+" + "/ljK0//+VcoA8PXNLPkqK3ZNRCopdusqJ3bx/kTKxfn+Q8rX+f5Gyu35/lPK" + "9Pn+VMr/+f5Nyib6/kfKP/r+ScqG+v5Pyi37/kzKCPr+Uspo+sMA8D4zvcrx" + "+OUhnv/NIvnhK8Pz+CEzdgYAzWP+/gjK3Pj+f8rc+MS5/Hf+Dcoa+f4uymz4" + "Bv8+Ur3Krvojw/P4eBcRM3YGAMl+p8jNufwjwyL5ISd2ES12DgDN7fkRNHbN" + "WvkiJ3YiKXbYPv8yLXbNWvkiKXbYzVr5Iit22MOu+iEAABoT/g3Kjvn+LMj+" + "IMpd+dYw+q76/gr6gvn+Efqu+v4X8q761gdPKSkpKdqu+gnDXfk3yXy6wH27" + "yc2k+c2Q+cKi+TMzySPJzXL+/gPAzc76w6765SFs/80i+eHJfsXNpfw+IM25" + "/MHJzXj7zbn5zZb5feYPysX5w8j5Cr7K5vnNePvNufkKzbr5A82W+cPX+XHN" + "mfnD7fl5vsx4+82W+cP0+X4CA82Z+cP/+c14+363+hX6/iDSF/o+Ls25/M2W" + "+X3mD8oI+sML+s14+825+eXN7vjh0jv65c1a+X3hdyPDJvrNkPnKWvrrIiN2" + "fjIldjb3PsMyMAAhov8iMQAxGHbB0eHx+SoWdsMmdj6QMgOgIgGgOgCgAgPN" + "mfnDbfoqAnbJ5SoAdn7hyTotdrfKkfp7Mi92zbb6zXj76814++vFzRb7YGnN" + "ePvRzZD5yOvNePs+P825/MNs+D7/zf/65Qnrzf364Qnr5c0K+z7/zf/64eUh" + "AcA2ACs2TTYdNpk2kyM2J35+5iDK4fohCOA2gC4ENtA2diw2IzZJLgg2pOHJ" + "PgjNmPtHPgjNmPtPyT4IzZj7d82Z+cMK+wEAAH6BT/XNkPnKn/nxeI5HzZn5" + "wxn7ebfKNfsyMHblzRb74c14++vNePvr5WBpzXj74cUBAADNRvwF4+PCTfsO" + "5s1G/M2Q++vNkPvrzYb7IQAAzZD7DubNRvzhzZD7w876xc2w+XzNpfx9zbr5" + "wclOzUb8zZn5w4b7TM1G/E3DRvzlxdVXPoAyCOAhAAA5MQAAIg12DgA6AoAP" + "Dw8P5gFf8XnmfwdPJgAlyjT88ToCgA8PDw/mAbvKv/uxTxU6L3bC3PvWEkfx" + "BcLd+xQ6AoAPDw8P5gFferfyC/x5/ubC//uvMi52wwn8/hnCt/s+/zIudhYJ" + "FcK3+yEE4DbQNnYjNiM2ST4nMgHAPuAyAcAuCDakKg12+ToudqnDofwqDXb5" + "zc76erfyrvrNpPnDnPvlxdX1PoAyCOAhAAA5MQAAFgjxeQdPPgGpMgKAOjB2" + "R/EFwmb8PgCpMgKAFTowdsJ6/NYOR/EFwnv8FBXCWPz5IQTgNtA2diM2IzZJ" + "PicyAcA+4DIBwC4INqTx0cHhyfUPDw8Pza788eYP/gr6t/zGB8YwT/XF1eXN" + "Af4hhf3lKgJ26yoAdjoEdj367vzKZf3ic/151iBPDfrp/MXNuf3Bw938rzIE" + "dsl55n9P/h/Ko/3+DMqy/f4NyvP9/grKR/3+CMrW/f4Yyrn9/hnK4v3+GsrF" + "/f4byp79/gfCOP0B8AV4+z3CKP148z3CLv0Nwif9yXHNuf16/gPAe/4IwM3i" + "/Xr+G8LF/eXVIcJ3ERB4AZ4HGncjEwt5sMJY/dHhyXn+WcLp/M2y/T4Cw+r8" + "edYgTw0+BPrq/MXNxf3Bw3f9IgB26yICdj6AMgHAfTIAwHwyAMDh0cHxyT4B" + "w+r8IfR/ESUJr3crG3uywqn9EQgDIcJ3yXsjHP5HwB4IAcD/CXr+GwFOAMLT" + "/RYCAbD4FAnJeysd/gjAHkcBQAAJev4DAbL/wvD9FhwBUAcVCcl9k9L5/SVv" + "HggBCAAJyToCgOaAyg7+OgV2t8DlKgl2zXL+vW/KKv4+ATILdiYVryIJduEy" + "BXbJJcIh/jzKIv48ylH+xQEDUM0n/cE6C3Ym4D0yC3bKTP4mQD7/wyL+OgKA" + "5oDKUf46BnYvMgZ2wxr+zQH+t8pj/q8yBXY6CXbJOgKA5oDCff4+/smvMgCA" + "MgKAOgZ25gH2BjIDgDoBgDzCl/49yeUuASYHfQ9vLzIAgDoBgC+3wrP+JfKc" + "/j7/4ckuIDoBgC+3yq/+LcK1/i4ILQfSw/58ZW/+Acr6/trz/gcHB8YgtP5f" + "wgb/PiDhyQkKDX8IGRgaDB8bAAECAwQFfCHq/sP+/nwh4v6Fb37+QOHY5W86" + "AoBn5kDCGv99/kD6P//mH+HJOgZ2t8oq/33+QPoq//Ygb3zmIMI//33+QPo7" + "/33uIOHJfeYvb33+QOHw5W/mD/4MffpQ/+4Q4ckqMXbJIjF2yR9yYWRpby04" + "NnJrAA0KLS0+AA0KGBgYGAANCiBQQy0NCiBITC0NCiBCQy0NCiBERS0NCiBT" + "UC0NCiBBRi0ZGRkZGRkACCAIACIWdvXhIh524SsiFHYhAAA5MR525dXFKhR2" + "Mc92zXj76yojds2Q+cJs+DoldnfDbPghc//NIvkhFHYGBl4jVsXl6814+83u" + "+NL2/81a+dHV63Irc+HBBSPC3v/J//8=";
6214
6357
  function decodeMon32() {
6215
6358
  return Array.from(new Uint8Array(Uint8Array.from(atob(MON32_B64), (c) => c.charCodeAt(0))));
6216
6359
  }