-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
333 lines (312 loc) · 109 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
<!DOCTYPE html>
<!-- Created with https://packager.turbowarp.org/ -->
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<!-- We only include this to explicitly loosen the CSP of various packager environments. It does not provide any security. -->
<meta http-equiv="Content-Security-Policy" content="default-src * 'self' 'unsafe-inline' 'unsafe-eval' data: blob:">
<title>Browser</title>
<style>
body {
color: #ffffff;
font-family: sans-serif;
overflow: hidden;
margin: 0;
padding: 0;
}
:root, body.is-fullscreen {
background-color: #000000;
}
[hidden] {
display: none !important;
}
h1 {
font-weight: normal;
}
a {
color: inherit;
text-decoration: underline;
cursor: pointer;
}
#app, #loading, #error, #launch {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.screen {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
cursor: default;
user-select: none;
-webkit-user-select: none;
background-color: #000000;
}
#launch {
background-color: rgba(0, 0, 0, 0.7);
cursor: pointer;
}
.green-flag {
width: 80px;
height: 80px;
padding: 16px;
border-radius: 100%;
background: rgba(255, 255, 255, 0.75);
border: 3px solid hsla(0, 100%, 100%, 1);
display: flex;
justify-content: center;
align-items: center;
box-sizing: border-box;
}
#loading {
background-image: url(data:image/jpeg;base64,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);
background-repeat: no-repeat;
background-size: contain;
background-position: center;
}
.progress-bar-outer {
border: 1px solid currentColor;
height: 10px;
width: 200px;
max-width: 200px;
}
.progress-bar-inner {
height: 100%;
width: 0;
background-color: currentColor;
}
.loading-text, noscript {
font-weight: normal;
font-size: 36px;
margin: 0 0 16px;
}
.loading-image {
margin: 0 0 16px;
}
#error-message, #error-stack {
font-family: monospace;
max-width: 600px;
white-space: pre-wrap;
user-select: text;
-webkit-user-select: text;
}
#error-stack {
text-align: left;
max-height: 200px;
overflow: auto;
}
.control-button {
width: 2rem;
height: 2rem;
padding: 0.375rem;
margin-top: 0.5rem;
margin-bottom: 0.5rem;
user-select: none;
-webkit-user-select: none;
cursor: pointer;
border: 0;
border-radius: 4px;
}
.control-button:hover {
background: #ff4c4c26;
}
.control-button.active {
background: #ff4c4c59;
}
.fullscreen-button {
background: white !important;
}
.standalone-fullscreen-button {
position: absolute;
top: 0;
right: 0;
background-color: rgba(0, 0, 0, 0.5);
border-radius: 0 0 0 4px;
padding: 4px;
cursor: pointer;
}
.sc-canvas {
cursor: auto;
}
.sc-monitor-root[data-opcode^="data_"] .sc-monitor-value-color {
background-color: #ff8c1a;
}
.sc-monitor-row-value-outer {
background-color: #fc662c;
}
.sc-monitor-row-value-editing .sc-monitor-row-value-outer {
background-color: #e25b27;
}
</style>
<meta name="theme-color" content="#000000">
<link rel="icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOQAAADdCAMAAACc/C7aAAABFFBMVEX///8AcbztHCQ5tUr7sDvsAAAAb7sAZrgAbLoAZLcAabkAaLgAbbr7rzcAY7c0tEYAbMLtACIqrkcjsDn7rCnpGyMzqk37rTDtDxrwoTfsAAguskEesDb7qiLsABCCrtf//fn2oaPS7NXW5fKuyuTh7PbF2eztCxf83N393rb8xXn7tEb+9vbxXGD/+fD8wGz4tLb+8N0AesTh8uNfwGuu3bRgmc1Aicbw9vvuKTDydnn5v8HybXD0hYj91J7wUVb96OjvQkf8yoX+6M38vF/I58uev9+d1qNSkspxxnt6qdVFuVXw+fEtgMNav2eW05370NL92arvPEH1j5LxYmb+8+P3p6mEzIx6yoOq3LCTuNy60ulPtov/AAAL0ElEQVR4nO2caUMaSRCGmRCGkUOyC7vDgiAqoki8T2LEA8QD8Ig58f//j52BoFDV0zOD1T1k9PmUD5se363qqrer2wQCL6bwrV6u1c5WGpVK5b+/qtXq6eqno7nDu5OXLz0RFDbvzxp6LpXS9bjB+/f//fXOIJ1eymdCoXfHRxvLXv+IL6NQr1Vyprr3Q/RFDkgvGVJX5/5UoWvldT01qo8hsq80H6p+OvT6B3bNWrmRS2GBFiJNlkKhz3+UzvpKykKhtUgzoKH00YnXP7tDypWcpUKuyF48T/+AcBZq762DaC/SDGd1w2sRfAq1HKPUuBLZy9pJllnTdRuFTkQaTG40y/GUvURnIg2ZXyaxdX5rcMuNW5FG0n7+6LUmSM2hRMcizUo7WTm7WXGUqe5EGjl7PEHBdB5GdyKNnJ2UrrnWcB5GlyKNYH7yWl6Puk3zHxDXdT1loIcMMpl8Ou1IZb564rXCQODePlXjcT2VSzVWauV6vb65uXx3d3j4/eHzF0Ns3l5pOuN5yq7k7BSmcpX1Wn2N9ZdP7uZW39kLDc3JVjVKg29xDIXrZaa+Z5bnjkMZvs7QkRw1TNYqPI1Gkq7XHa3zcWM1lOepzKwKVmLN2nvOdoznKvc2MRzm5MHw5dYq88fiZHD5FrfWqOdWNt2ud3jKkZk/FSHBljVrjXru7Ns4S94dW8tc8kKltcZ4bsVFno5ydxqyVCk/Y9cqVhpTDdeJOsxG2qoE5aVXHyuNun7/0qWPrHI285niJ3fOukXvyK2PnanPLH+xCGbo4eWLO+eMbcnjqTLN+kcWO1PmCbPM9nJ6ZayayuLOImVDd1RfsGOTrTG1QviNE4uUTUs6RhfYzSNXo/3MV2bKymokzKITzxFtx2cemCrlFJ8yq+jEc86suCvm2ColbMtvrA0Z119kAKzYYKlMV0V8apQGY0PGU2RldRSmyrzw0+U9I1njKSFxNPnOUik6YddYG1LEfhzA2peiE5ZVWenr6jAs85MRWmHrjKqTIu6PkNUlRsKKtASMs4dO6XOYVLHDWxI4cma0yHhF3Od+c8JI2JC4iz1GIHOCmscwjEaSFnaAZgQy9eIjshO+4m0pLJR4AhlfF/SpUT7iXSkqlIxA5gjmAE44xAkrKJR4R8pJVpOvKJZiCizukRIq6wBGhRXSK9dRIEXaOcgDGhTkBdieNRxIOVXnN7j2/EP/kRpyrTlhZw8W3zMoX+kvZ1HZkRvIQAB3ka/Un8BlR24gmaGkLj1nMFvjDeIv2PERlZ4M9agZGYGUxNLaBxXYNPF4sg5FxuO0H3AA7pUZ2nxF2aoLPiqzOIZthPhqBNVWGUcsCDpyLZHe5aFhq/SyY4JLzxLl8ugAQnVH545P8FxJehRZgVsyJemMNQo6ceW/E64O77Eknj+G+QhFpgk3JTLnXtRWE1RfCcfMqEuKuxfgMwdLT+iEbG10AtHJlnbHMsxXwpPICtySXjQQE9RECCsPtAL6GdnSLvkCNiXdpKeAGognXdLkCHRKOo+OiquoO1d7NuChMk21Mi6uBaql3XKHKg/VQQSK9OCYNQAdt8iM3T3Yk54VVwMkkupqHbZJ74prIFAV1SjhidkrU2eyCnpIhqpRnsE2Ke0KBPMZiMxT/c4INDzetUl8pCS7LIC3IPIHdc9AN+BLkXAuSSayAbyA7qHIuXfV6j9PGH+meoO2E2wF/36i1cqeEy08Bl1la0t5wvjzNdHCO4ngCEkPRc5qygjaLNHCV5Mssku0MBK5S7TwGFyLEvkDiMz+Ilp4DPaAyEiTaOHbLBB5S7TwGOzHgMgi0cIXUOQPooXHoKOOioyWiBbeBSITO0QLj0EEilwgWvg8GQQQLeyeg6lRjUp4kWjleSgyWyBa2TULUSBymmrl9gwQmdymWtotxcioRlWhWrmQhSI9cwPQC8T2yZZuwUbpWQ/ZB3VHo7KugcBPINK78qoBkWReIBD4BfM1S7a0OxbCoO6QtUlGD0nOk63timYEijwgWxuV1+wF2dquuASmTt0iXByagcQN4eIugNka2yNc/AdqIm3C1R3zCK0AmT032UWex5Mj5R7IViVM5VxN2lCkN00ENhBVJV0e2oHgjAf5irKV0AqYwHOzJ/UVHpiV6CPp+ugg4sFxCx2zlAhdl+wBI+mBSYfmXIldEn8BNRH5pSemwkBSNhATnK8zkg+VyNIpYeJsNeorFJm4ov4EHyiR1u70gSM72aFswv6hhOlOIAOQSZe8KxW4IxWyyccQ8NrHCKXEAttFO5LsgmAYPJhMtAR8hs0BPH+IKDsmyNoFk9IuReBB0ggkfdkxQUcReSeuR2R2aA8gQyRQKGXVHlx0NGq3M4AVSikJC+/rDKYEBRJPQSQ1yyKuOsICyQylhAq7GMbZKmpHmuACG8wKd3dbjB0pprT2mUe2x9iWgo/Pl3hDCuqRA+Abid62FGp8rpFnVZSoCLPzDHawpkqB8/QmLjqK2hH3vR6/cO0ReWtQnMYalWmBVafPDSNhhd3KMpqHokRoZ3QstlkJKyiWTVYcSe8/rGAmrBCVXVYcJSSrCT5Y9qoP+cXBNVOj4Mo6oI0GIX2VxP3yktE7BIwhrWBZAjNjKb3PYofhAWSKtNiWwWyLrMiWouiU/ButI9TtDPGTnbEJqo15PYX96lMsFapHWHbssFUGkzsEs4KFDppajajUpNTXAPM80g/my4/R19PWYeyhEr754NIOWqgMJlsvaplFlV1xRlRO0d7ZWdLOWqlMzFyNXYBKnahNGH+rpHukxGXbUqWRsz/HklnaZwwB2ITleILANp7eDUfTddIWO2GrvsFSKd6m97Del71oti5cVNrFWdVRoj4TFTkCGaLdsugkfbIzO+eOdC42O1PwZYc9EbpnoFwKVv3yKZzJm18223Oh24nCl+XOkGZ+frAd3pDO7Ezi6uK8XcB/92DxsbsfCbuP4QBp5ueC7daB0GQy0bq63T2fn5/fLpVKj8Xu7OWWFo5q6CEAgvcfxGKSzM+8dSuBUg2tyZm/p6PRaCRiyHMUQW2L5/HkmZ8bu5Qd4d8PTrQNREztBZo8m6eGJZmfwO2Mw2C6FRnrvWJ55FkEdVqS+Qls83vJmCLV8GW/fJa4LTRM9SuUtjgPpmORmvb0GGlB5XkhWebHCKbTnelQZGxqb6gLHmzxVEalzUQC50FHOetMZLgz2hwOLGY+fWSZH5OLrAOZTkRGFVwz93mtRN7kx7B5DmTailSjCvNl4B5zRjlQKW3yY9C+yCb5JchGZCy6ZfX4kT1tHvyvkTb56bHb4srkiVS1qX1Oc+/ily7DCSDJ/Pxm/ipprdNSpBqLatf8pGtyRpWGO6J+/2pDe3dnxsLTskWqWjSyZ+/QuOZHkTX5ecbQmUwyhGKRakyLanuPjurjwoSYn2cK57c3SOiISFXVjAPlftd50Vjkmx9JMxFAYf7Xj5ZxxMpmEwlz8pX494NqEItpkYhx5OpcN11WxYkxP5D29vnu7c+rnVYrmDVEKkpnf++6WSyN1dsmx/wIZWLMj1C45iemSjQ/Ipkk8yMOrvlRpuSaH2FMlvkRxaSZHzGUuHN3L8yPCPjmR9aFkGj45ifinfkh5c38vBrzI3PyI5JXYn54KkX8lqUnFPnXXn4xP9yZyLSk1zCiWeBaPN+YH+XN/PjF/AS45kcT/fsysuCbn61XYX7eJj9/El3WrwQ94ZfJT5E7+fGL+Snxp3h+MT/cyc+UX8zP2+Tnzfz8WVy+TX5iMZ+Yn9nXYX64kx9ZvwclGv7kxy/XXiVuLH0z+eFfe0l7CiyW1zL54V4I+cX87L+ZH/9MfnhF1jfXXnzzE/GJ+WlypwXSfg9KMPzJj2/MD+9Q8komP6/j2ssv8y3eaxhV9Um75FwIqRGfNEsT9r/VZJRXn7TKPqx/zdA4WfqkUQ6YZdgCvzwafQabH1n/UopM4OQn6pP5wCij5ifik+kAZNj8aH55LIpYVAa2IOaXyQCDgflRFd8YHRZ986P5yOiwMMyPz4wOi+uwX96C8JgdnQf8D/5dW1zu9aqyAAAAAElFTkSuQmCC">
</head>
<body>
<div id="app"></div>
<div id="launch" class="screen" hidden title="Click to start">
<div class="green-flag">
<svg viewBox="0 0 16.63 17.5" width="42" height="44">
<defs><style>.cls-1,.cls-2{fill:#4cbf56;stroke:#45993d;stroke-linecap:round;stroke-linejoin:round;}.cls-2{stroke-width:1.5px;}</style></defs>
<path class="cls-1" d="M.75,2A6.44,6.44,0,0,1,8.44,2h0a6.44,6.44,0,0,0,7.69,0V12.4a6.44,6.44,0,0,1-7.69,0h0a6.44,6.44,0,0,0-7.69,0"/>
<line class="cls-2" x1="0.75" y1="16.75" x2="0.75" y2="0.75"/>
</svg>
</div>
</div>
<div id="loading" class="screen">
<noscript>Enable JavaScript</noscript>
<h1 class="loading-text">Please wait</h1>
<div class="progress-bar-outer"><div class="progress-bar-inner" id="loading-inner"></div></div>
</div>
<div id="error" class="screen" hidden>
<h1>Error</h1>
<details>
<summary id="error-message"></summary>
<p id="error-stack"></p>
</details>
</div>
<script src="script.js"></script>
<script>
const appElement = document.getElementById('app');
const launchScreen = document.getElementById('launch');
const loadingScreen = document.getElementById('loading');
const loadingInner = document.getElementById('loading-inner');
const errorScreen = document.getElementById('error');
const errorScreenMessage = document.getElementById('error-message');
const errorScreenStack = document.getElementById('error-stack');
const handleError = (error) => {
console.error(error);
if (!errorScreen.hidden) return;
errorScreen.hidden = false;
errorScreenMessage.textContent = '' + error;
let debug = error && error.stack || 'no stack';
debug += '\nUser agent: ' + navigator.userAgent;
errorScreenStack.textContent = debug;
};
const setProgress = (progress) => {
if (loadingInner) loadingInner.style.width = progress * 100 + '%';
};
const interpolate = (a, b, t) => a + t * (b - a);
try {
setProgress(0.1);
const scaffolding = new Scaffolding.Scaffolding();
scaffolding.width = 480;
scaffolding.height = 360;
scaffolding.resizeMode = "preserve-ratio";
scaffolding.editableLists = false;
scaffolding.usePackagedRuntime = false;
scaffolding.setup();
scaffolding.appendTo(appElement);
const vm = scaffolding.vm;
window.scaffolding = scaffolding;
window.vm = scaffolding.vm;
window.Scratch = {
vm,
renderer: vm.renderer,
audioEngine: vm.runtime.audioEngine,
bitmapAdapter: vm.runtime.v2BitmapAdapter,
videoProvider: vm.runtime.ioDevices.video.provider
};
scaffolding.setUsername("".replace(/#/g, () => Math.floor(Math.random() * 10)));
scaffolding.setAccentColor("#ff4c4c");
try {
scaffolding.addCloudProvider(new Scaffolding.Cloud.WebSocketProvider(["wss://clouddata.turbowarp.org","wss://clouddata.turbowarp.xyz"], "Browser"));
} catch (error) {
console.error(error);
}
vm.setTurboMode(false);
if (vm.setInterpolation) vm.setInterpolation(true);
if (vm.setFramerate) vm.setFramerate(55);
if (vm.renderer.setUseHighQualityRender) vm.renderer.setUseHighQualityRender(false);
if (vm.setRuntimeOptions) vm.setRuntimeOptions({
fencing: true,
miscLimits: true,
maxClones: 9999999999,
});
if (vm.setCompilerOptions) vm.setCompilerOptions({
enabled: true,
warpTimer: false
});
if (vm.renderer.setMaxTextureDimension) vm.renderer.setMaxTextureDimension(2048);
if (typeof ScaffoldingAddons !== 'undefined') {
ScaffoldingAddons.run(scaffolding, {"gamepad":false,"pointerlock":false,"specialCloudBehaviors":false,"unsafeCloudBehaviors":false,"pause":false});
}
scaffolding.setExtensionSecurityManager({
getSandboxMode: () => 'unsandboxed',
canLoadExtensionFromProject: () => true
});
for (const extension of ["data:text/javascript;,(function(Scratch)%20%7B%20%2F%2F%20Name%3A%20Mouse%20Cursor%0A%2F%2F%20ID%3A%20MouseCursor%0A%2F%2F%20Description%3A%20Use%20custom%20cursors%20or%20hide%20the%20cursor.%20Also%20allows%20replacing%20the%20cursor%20with%20any%20costume%20image.%0A%2F%2F%20License%3A%20MIT%20AND%20MPL-2.0%0A%0A%2F*%20generated%20l10n%20code%20*%2FScratch.translate.setup(%7B%22de%22%3A%7B%22_Mouse%20Cursor%22%3A%22Mauszeiger%22%7D%2C%22it%22%3A%7B%22_Mouse%20Cursor%22%3A%22Puntatore%20Mouse%22%2C%22_bottom%20left%22%3A%22angolo%20sinistra%20in%20basso%22%2C%22_bottom%20right%22%3A%22angolo%20destra%20in%20basso%22%2C%22_center%22%3A%22centro%22%2C%22_cursor%22%3A%22puntatore%22%2C%22_hide%20cursor%22%3A%22nascondi%20puntatore%22%2C%22_set%20cursor%20to%20%5Bcur%5D%22%3A%22usa%20%5Bcur%5D%20come%20puntatore%22%2C%22_set%20cursor%20to%20current%20costume%20center%3A%20%5Bposition%5D%20max%20size%3A%20%5Bsize%5D%22%3A%22usa%20il%20costume%20attuale%20con%20centro%3A%20%5Bposition%5D%20dimensione%20massima%3A%20%5Bsize%5D%20come%20puntatore%22%2C%22_top%20left%22%3A%22angolo%20sinistra%20in%20alto%22%2C%22_top%20right%22%3A%22angolo%20destra%20in%20alto%22%2C%22_%7Bsize%7D%20(unreliable)%22%3A%22%7Bsize%7D%20(inaffidabile)%22%7D%2C%22ja%22%3A%7B%22_Mouse%20Cursor%22%3A%22%E3%83%9E%E3%82%A6%E3%82%B9%E3%82%AB%E3%83%BC%E3%82%BD%E3%83%AB%22%2C%22_bottom%20left%22%3A%22%E5%B7%A6%E4%B8%8B%22%2C%22_bottom%20right%22%3A%22%E5%8F%B3%E4%B8%8B%22%2C%22_center%22%3A%22%E4%B8%AD%E5%A4%AE%22%2C%22_top%20left%22%3A%22%E5%B7%A6%E4%B8%8A%22%2C%22_top%20right%22%3A%22%E5%8F%B3%E4%B8%8A%22%7D%2C%22nb%22%3A%7B%22_Mouse%20Cursor%22%3A%22Mus%20Pekkeren%22%2C%22_bottom%20left%22%3A%22nederst%20til%20venstre%22%2C%22_bottom%20right%22%3A%22nederst%20til%20h%C3%B8yre%22%2C%22_center%22%3A%22senter%22%2C%22_cursor%22%3A%22pekeren%22%2C%22_hide%20cursor%22%3A%22skjul%20pekeren%22%2C%22_set%20cursor%20to%20%5Bcur%5D%22%3A%22sett%20mark%C3%B8ren%20til%20%5Bcur%5D%22%2C%22_set%20cursor%20to%20current%20costume%20center%3A%20%5Bposition%5D%20max%20size%3A%20%5Bsize%5D%22%3A%22sett%20mark%C3%B8ren%20til%20midten%20av%20gjeldende%20drakt%3A%20%5Bposition%5D%20maks%20st%C3%B8rrelse%3A%20%5Bsize%5D%22%2C%22_top%20left%22%3A%22%C3%B8verst%20til%20venstre%22%2C%22_top%20right%22%3A%22%C3%B8verst%20til%20h%C3%B8yre%22%2C%22_%7Bsize%7D%20(unreliable)%22%3A%22%7Bsize%7D%20(up%C3%A5litelig)%22%7D%2C%22nl%22%3A%7B%22_Mouse%20Cursor%22%3A%22Muisaanwijzer%22%2C%22_bottom%20left%22%3A%22linksonder%22%2C%22_bottom%20right%22%3A%22rechtsonder%22%2C%22_center%22%3A%22midden%22%2C%22_hide%20cursor%22%3A%22verberg%20cursor%22%2C%22_set%20cursor%20to%20%5Bcur%5D%22%3A%22maak%20cursor%20%5Bcur%5D%22%2C%22_set%20cursor%20to%20current%20costume%20center%3A%20%5Bposition%5D%20max%20size%3A%20%5Bsize%5D%22%3A%22maak%20cursor%20huidig%20uiterlijk%20met%20middelpunt%3A%20%5Bposition%5D%20en%20max.%20grootte%3A%20%5Bsize%5D%22%2C%22_top%20left%22%3A%22linksboven%22%2C%22_top%20right%22%3A%22rechtsboven%22%2C%22_%7Bsize%7D%20(unreliable)%22%3A%22%7Bsize%7D%20(onbetrouwbaar)%22%7D%2C%22ru%22%3A%7B%22_Mouse%20Cursor%22%3A%22%D0%9A%D1%83%D1%80%D1%81%D0%BE%D1%80%20%D0%9C%D1%8B%D1%88%D0%B8%22%2C%22_bottom%20left%22%3A%22%D0%BD%D0%B8%D0%B6%D0%BD%D0%B5%D0%BC%20%D0%BB%D0%B5%D0%B2%D0%BE%D0%BC%20%D1%83%D0%B3%D0%BB%D1%83%22%2C%22_bottom%20right%22%3A%22%D0%BD%D0%B8%D0%B6%D0%BD%D0%B5%D0%BC%20%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%BC%20%D1%83%D0%B3%D0%BB%D1%83%22%2C%22_center%22%3A%22%D1%86%D0%B5%D0%BD%D1%82%D1%80%D0%B5%22%2C%22_cursor%22%3A%22%D0%BA%D1%83%D1%80%D1%81%D0%BE%D1%80%22%2C%22_hide%20cursor%22%3A%22%D1%81%D0%BF%D1%80%D1%8F%D1%82%D0%B0%D1%82%D1%8C%20%D0%BA%D1%83%D1%80%D1%81%D0%BE%D1%80%22%2C%22_set%20cursor%20to%20%5Bcur%5D%22%3A%22%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C%20%D0%BA%D1%83%D1%80%D1%81%D0%BE%D1%80%20%D0%BD%D0%B0%20%5Bcur%5D%22%2C%22_set%20cursor%20to%20current%20costume%20center%3A%20%5Bposition%5D%20max%20size%3A%20%5Bsize%5D%22%3A%22%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C%20%D0%BA%D1%83%D1%80%D1%81%D0%BE%D1%80%20%D0%BD%D0%B0%20%D1%82%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B9%20%D0%BA%D0%BE%D1%81%D1%82%D1%8E%D0%BC%20%D1%81%20%D1%86%D0%B5%D0%BD%D1%82%D1%80%D0%BE%D0%BC%20%D0%B2%3A%20%5Bposition%5D%20%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%BC%20%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BE%D0%BC%3A%20%5Bsize%5D%22%2C%22_top%20left%22%3A%22%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B5%D0%BC%20%D0%BB%D0%B5%D0%B2%D0%BE%D0%BC%20%D1%83%D0%B3%D0%BB%D1%83%22%2C%22_top%20right%22%3A%22%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B5%D0%BC%20%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%BC%20%D1%83%D0%B3%D0%BB%D1%83%22%2C%22_%7Bsize%7D%20(unreliable)%22%3A%22%7Bsize%7D%20(%D0%BD%D0%B5%D0%BD%D0%B0%D0%B4%D0%B5%D0%B6%D0%BD%D0%BE)%22%7D%2C%22zh-cn%22%3A%7B%22_Mouse%20Cursor%22%3A%22%E9%BC%A0%E6%A0%87%E5%9B%BE%E6%A0%87%22%2C%22_bottom%20left%22%3A%22%E5%BA%95%E9%83%A8%E5%B7%A6%E4%BE%A7%22%2C%22_bottom%20right%22%3A%22%E5%BA%95%E9%83%A8%E5%8F%B3%E4%BE%A7%22%2C%22_center%22%3A%22%E5%B1%85%E4%B8%AD%22%2C%22_cursor%22%3A%22%E9%BC%A0%E6%A0%87%E6%A0%B7%E5%BC%8F%22%2C%22_hide%20cursor%22%3A%22%E9%9A%90%E8%97%8F%E9%BC%A0%E6%A0%87%22%2C%22_set%20cursor%20to%20%5Bcur%5D%22%3A%22%E8%AE%BE%E7%BD%AE%E9%BC%A0%E6%A0%87%E6%A0%B7%E5%BC%8F%E4%B8%BA%5Bcur%5D%22%2C%22_set%20cursor%20to%20current%20costume%20center%3A%20%5Bposition%5D%20max%20size%3A%20%5Bsize%5D%22%3A%22%E8%AE%BE%E7%BD%AE%E9%BC%A0%E6%A0%87%E4%B8%AD%E5%BF%83%E4%B8%BA%5Bposition%5D%EF%BC%8C%E6%9C%80%E5%A4%A7%E5%B0%BA%E5%AF%B8%E4%B8%BA%5Bsize%5D%22%2C%22_top%20left%22%3A%22%E9%A1%B6%E9%83%A8%E5%B7%A6%E4%BE%A7%22%2C%22_top%20right%22%3A%22%E9%A1%B6%E9%83%A8%E5%8F%B3%E4%BE%A7%22%2C%22_%7Bsize%7D%20(unreliable)%22%3A%22%7Bsize%7D%EF%BC%88%E5%AE%9E%E9%AA%8C%E6%80%A7%EF%BC%89%22%7D%7D)%3B%2F*%20end%20generated%20l10n%20code%20*%2F(function%20(Scratch)%20%7B%0A%20%20%22use%20strict%22%3B%0A%0A%20%20if%20(!Scratch.extensions.unsandboxed)%20%7B%0A%20%20%20%20throw%20new%20Error(%22MouseCursor%20extension%20must%20be%20run%20unsandboxed%22)%3B%0A%20%20%7D%0A%0A%20%20const%20lazilyCreatedCanvas%20%3D%20()%20%3D%3E%20%7B%0A%20%20%20%20%2F**%20%40type%20%7BHTMLCanvasElement%7D%20*%2F%0A%20%20%20%20let%20canvas%20%3D%20null%3B%0A%20%20%20%20%2F**%20%40type%20%7BCanvasRenderingContext2D%7D%20*%2F%0A%20%20%20%20let%20ctx%20%3D%20null%3B%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20width%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20height%0A%20%20%20%20%20*%20%40returns%20%7B%5BHTMLCanvasElement%2C%20CanvasRenderingContext2D%5D%7D%0A%20%20%20%20%20*%2F%0A%20%20%20%20return%20(width%2C%20height)%20%3D%3E%20%7B%0A%20%20%20%20%20%20if%20(!canvas)%20%7B%0A%20%20%20%20%20%20%20%20canvas%20%3D%20document.createElement(%22canvas%22)%3B%0A%20%20%20%20%20%20%20%20ctx%20%3D%20canvas.getContext(%222d%22)%3B%0A%20%20%20%20%20%20%20%20if%20(!ctx)%20%7B%0A%20%20%20%20%20%20%20%20%20%20throw%20new%20Error(%22Could%20not%20get%202d%20rendering%20context%22)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F%2F%20Setting%20canvas%20size%20also%20clears%20it%0A%20%20%20%20%20%20canvas.width%20%3D%20width%3B%0A%20%20%20%20%20%20canvas.height%20%3D%20height%3B%0A%20%20%20%20%20%20return%20%5Bcanvas%2C%20ctx%5D%3B%0A%20%20%20%20%7D%3B%0A%20%20%7D%3B%0A%20%20const%20getRawSkinCanvas%20%3D%20lazilyCreatedCanvas()%3B%0A%0A%20%20%2F**%0A%20%20%20*%20%40param%20%7BRenderWebGL.Skin%7D%20skin%0A%20%20%20*%20%40returns%20%7Bstring%7D%20A%20data%3A%20URI%20for%20the%20skin.%0A%20%20%20*%2F%0A%20%20const%20encodeSkinToURL%20%3D%20(skin)%20%3D%3E%20%7B%0A%20%20%20%20const%20svgSkin%20%3D%20%2F**%20%40type%20%7BRenderWebGL.SVGSkin%7D%20*%2F%20(skin)%3B%0A%20%20%20%20if%20(svgSkin._svgImage)%20%7B%0A%20%20%20%20%20%20%2F%2F%20This%20is%20an%20SVG%20skin%0A%20%20%20%20%20%20return%20svgSkin._svgImage.src%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20It's%20probably%20a%20bitmap%20skin.%0A%20%20%20%20%2F%2F%20The%20most%20reliable%20way%20to%20get%20the%20bitmap%20in%20every%20runtime%20is%20through%20the%20silhouette.%0A%20%20%20%20%2F%2F%20This%20is%20very%20slow%20and%20could%20involve%20reading%20the%20texture%20from%20the%20GPU.%0A%20%20%20%20const%20silhouette%20%3D%20skin._silhouette%3B%0A%20%20%20%20%2F%2F%20unlazy()%20only%20exists%20in%20TW%0A%20%20%20%20if%20(silhouette.unlazy)%20%7B%0A%20%20%20%20%20%20silhouette.unlazy()%3B%0A%20%20%20%20%7D%0A%20%20%20%20const%20colorData%20%3D%20silhouette._colorData%3B%0A%20%20%20%20const%20width%20%3D%20silhouette._width%3B%0A%20%20%20%20const%20height%20%3D%20silhouette._height%3B%0A%20%20%20%20const%20imageData%20%3D%20new%20ImageData(%0A%20%20%20%20%20%20colorData%2C%0A%20%20%20%20%20%20silhouette._width%2C%0A%20%20%20%20%20%20silhouette._height%0A%20%20%20%20)%3B%0A%20%20%20%20const%20%5Bcanvas%2C%20ctx%5D%20%3D%20getRawSkinCanvas(width%2C%20height)%3B%0A%20%20%20%20ctx.putImageData(imageData%2C%200%2C%200)%3B%0A%20%20%20%20return%20canvas.toDataURL()%3B%0A%20%20%7D%3B%0A%0A%20%20%2F**%0A%20%20%20*%20%40param%20%7BVM.Costume%7D%20costume%0A%20%20%20*%20%40param%20%7Bnumber%7D%20maxWidth%0A%20%20%20*%20%40param%20%7Bnumber%7D%20maxHeight%0A%20%20%20*%20%40returns%20%7B%7Buri%3A%20string%2C%20width%3A%20number%2C%20height%3A%20number%7D%7D%0A%20%20%20*%2F%0A%20%20const%20costumeToCursor%20%3D%20(costume%2C%20maxWidth%2C%20maxHeight)%20%3D%3E%20%7B%0A%20%20%20%20const%20skin%20%3D%20Scratch.vm.renderer._allSkins%5Bcostume.skinId%5D%3B%0A%20%20%20%20const%20imageURI%20%3D%20encodeSkinToURL(skin)%3B%0A%0A%20%20%20%20let%20width%20%3D%20skin.size%5B0%5D%3B%0A%20%20%20%20let%20height%20%3D%20skin.size%5B1%5D%3B%0A%20%20%20%20if%20(width%20%3E%20maxWidth)%20%7B%0A%20%20%20%20%20%20height%20%3D%20height%20*%20(maxWidth%20%2F%20width)%3B%0A%20%20%20%20%20%20width%20%3D%20maxWidth%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20(height%20%3E%20maxHeight)%20%7B%0A%20%20%20%20%20%20width%20%3D%20width%20*%20(maxHeight%20%2F%20height)%3B%0A%20%20%20%20%20%20height%20%3D%20maxHeight%3B%0A%20%20%20%20%7D%0A%20%20%20%20width%20%3D%20Math.round(width)%3B%0A%20%20%20%20height%20%3D%20Math.round(height)%3B%0A%0A%20%20%20%20%2F%2F%20We%20wrap%20the%20encoded%20image%20in%20an%20%3Csvg%3E.%20This%20lets%20us%20do%20some%20clever%20things%3A%0A%20%20%20%20%2F%2F%20%20-%20We%20can%20resize%20the%20image%20without%20a%20canvas.%0A%20%20%20%20%2F%2F%20%20-%20We%20can%20give%20the%20browser%20an%20image%20with%20more%20raw%20pixels%20than%20its%20DPI%20independent%20size.%0A%20%20%20%20%2F%2F%20The%20latter%20is%20important%20so%20that%20cursors%20won't%20look%20horrible%20on%20high%20DPI%20displays.%20For%0A%20%20%20%20%2F%2F%20example%2C%20if%20the%20cursor%20will%20display%20at%2032x32%20in%20DPI%20independent%20units%20on%20a%202x%20high%20DPI%0A%20%20%20%20%2F%2F%20display%2C%20we%20actually%20need%20to%20send%20a%2064x64%20image%20for%20it%20to%20look%20good.%20This%20lets%20us%20do%0A%20%20%20%20%2F%2F%20that%20automatically.%0A%20%20%20%20let%20svg%20%3D%20%60%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22%24%7Bwidth%7D%22%20height%3D%22%24%7Bheight%7D%22%3E%60%3B%0A%20%20%20%20svg%20%2B%3D%20%60%3Cimage%20href%3D%22%24%7BimageURI%7D%22%20width%3D%22%24%7Bwidth%7D%22%20height%3D%22%24%7Bheight%7D%22%20%2F%3E%60%3B%0A%20%20%20%20svg%20%2B%3D%20%22%3C%2Fsvg%3E%22%3B%0A%20%20%20%20%2F%2F%20URI%20encoding%20usually%20results%20in%20smaller%20string%20than%20base%2064%20for%20the%20types%20of%20data%20we%20get%20here.%0A%20%20%20%20const%20svgURI%20%3D%20%60data%3Aimage%2Fsvg%2Bxml%3B%2C%24%7BencodeURIComponent(svg)%7D%60%3B%0A%0A%20%20%20%20return%20%7B%0A%20%20%20%20%20%20uri%3A%20svgURI%2C%0A%20%20%20%20%20%20width%2C%0A%20%20%20%20%20%20height%2C%0A%20%20%20%20%7D%3B%0A%20%20%7D%3B%0A%0A%20%20%2F**%20%40type%20%7Bstring%7D%20*%2F%0A%20%20let%20nativeCursor%20%3D%20%22default%22%3B%0A%20%20%2F**%20%40type%20%7Bnull%7Cstring%7D%20*%2F%0A%20%20let%20customCursorImageName%20%3D%20null%3B%0A%0A%20%20const%20canvas%20%3D%20Scratch.renderer.canvas%3B%0A%20%20%2F**%20%40type%20%7Bstring%7D%20*%2F%0A%20%20let%20currentCanvasCursor%20%3D%20nativeCursor%3B%0A%20%20const%20updateCanvasCursor%20%3D%20()%20%3D%3E%20%7B%0A%20%20%20%20if%20(canvas.style.cursor%20!%3D%3D%20currentCanvasCursor)%20%7B%0A%20%20%20%20%20%20canvas.style.cursor%20%3D%20currentCanvasCursor%3B%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20scratch-gui%20will%20sometimes%20reset%20the%20cursor%20when%20resizing%20the%20window%20or%20going%20in%2Fout%20of%20fullscreen%0A%20%20new%20MutationObserver(updateCanvasCursor).observe(canvas%2C%20%7B%0A%20%20%20%20attributeFilter%3A%20%5B%22style%22%5D%2C%0A%20%20%20%20attributes%3A%20true%2C%0A%20%20%7D)%3B%0A%0A%20%20%2F**%0A%20%20%20*%20Parse%20strings%20like%20%2260x12%22%20or%20%2277%2C1%22%0A%20%20%20*%20%40param%20%7Bstring%7D%20string%0A%20%20%20*%20%40returns%20%7B%5Bnumber%2C%20number%5D%7D%0A%20%20%20*%2F%0A%20%20const%20parseTuple%20%3D%20(string)%20%3D%3E%20%7B%0A%20%20%20%20const%20%5Ba%2C%20b%5D%20%3D%20(%22%22%20%2B%20string).split(%2F%5B%20%2Cx%5D%2F)%3B%0A%20%20%20%20return%20%5B%2Ba%20%7C%7C%200%2C%20%2Bb%20%7C%7C%200%5D%3B%0A%20%20%7D%3B%0A%0A%20%20%2F**%0A%20%20%20*%20%40param%20%7Bstring%7D%20size%20eg.%20%2248x84%22%0A%20%20%20*%20%40returns%20%7Bstring%7D%0A%20%20%20*%2F%0A%20%20const%20formatUnreliableSize%20%3D%20(size)%20%3D%3E%0A%20%20%20%20Scratch.translate(%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20default%3A%20%22%7Bsize%7D%20(unreliable)%22%2C%0A%20%20%20%20%20%20%20%20description%3A%20%22%5Bsize%5D%20is%20replaced%20with%20a%20size%20in%20pixels%20such%20as%20'48x48'%22%2C%0A%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%7B%20size%20%7D%0A%20%20%20%20)%3B%0A%0A%20%20const%20cursors%20%3D%20%5B%0A%20%20%20%20%22default%22%2C%0A%20%20%20%20%22pointer%22%2C%0A%20%20%20%20%22move%22%2C%0A%20%20%20%20%22grab%22%2C%0A%20%20%20%20%22grabbing%22%2C%0A%20%20%20%20%22text%22%2C%0A%20%20%20%20%22vertical-text%22%2C%0A%20%20%20%20%22wait%22%2C%0A%20%20%20%20%22progress%22%2C%0A%20%20%20%20%22help%22%2C%0A%20%20%20%20%22context-menu%22%2C%0A%20%20%20%20%22zoom-in%22%2C%0A%20%20%20%20%22zoom-out%22%2C%0A%20%20%20%20%22crosshair%22%2C%0A%20%20%20%20%22cell%22%2C%0A%20%20%20%20%22not-allowed%22%2C%0A%20%20%20%20%22copy%22%2C%0A%20%20%20%20%22alias%22%2C%0A%20%20%20%20%22no-drop%22%2C%0A%20%20%20%20%22all-scroll%22%2C%0A%20%20%20%20%22col-resize%22%2C%0A%20%20%20%20%22row-resize%22%2C%0A%20%20%20%20%22n-resize%22%2C%0A%20%20%20%20%22e-resize%22%2C%0A%20%20%20%20%22s-resize%22%2C%0A%20%20%20%20%22w-resize%22%2C%0A%20%20%20%20%22ne-resize%22%2C%0A%20%20%20%20%22nw-resize%22%2C%0A%20%20%20%20%22se-resize%22%2C%0A%20%20%20%20%22sw-resize%22%2C%0A%20%20%20%20%22ew-resize%22%2C%0A%20%20%20%20%22ns-resize%22%2C%0A%20%20%20%20%22nesw-resize%22%2C%0A%20%20%20%20%22nwse-resize%22%2C%0A%20%20%5D%3B%0A%0A%20%20class%20MouseCursor%20%7B%0A%20%20%20%20constructor()%20%7B%0A%20%20%20%20%20%20Scratch.vm.runtime.on(%22RUNTIME_DISPOSED%22%2C%20()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20this.setCur(%7B%0A%20%20%20%20%20%20%20%20%20%20cur%3A%20%22default%22%2C%0A%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%20%20%20%20getInfo()%20%7B%0A%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20id%3A%20%22MouseCursor%22%2C%0A%20%20%20%20%20%20%20%20name%3A%20Scratch.translate(%22Mouse%20Cursor%22)%2C%0A%20%20%20%20%20%20%20%20blocks%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setCur%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22set%20cursor%20to%20%5Bcur%5D%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20cur%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22pointer%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22cursors%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setCursorImage%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22set%20cursor%20to%20current%20costume%20center%3A%20%5Bposition%5D%20max%20size%3A%20%5Bsize%5D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20position%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%220%2C0%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22imagePositions%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20size%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%2232x32%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22imageSizes%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22hideCur%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22hide%20cursor%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getCur%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22cursor%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20menus%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20cursors%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20cursors%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20imagePositions%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%5Bx%2C%20y%5D%20where%20x%20is%20%5B0%3Dleft%2C%20100%3Dright%5D%20and%20y%20is%20%5B0%3Dtop%2C%20100%3Dbottom%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20Scratch.translate(%22top%20left%22)%2C%20value%3A%20%220%2C0%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20Scratch.translate(%22top%20right%22)%2C%20value%3A%20%22100%2C0%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20Scratch.translate(%22bottom%20left%22)%2C%20value%3A%20%220%2C100%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20Scratch.translate(%22bottom%20right%22)%2C%20value%3A%20%22100%2C100%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20Scratch.translate(%22center%22)%2C%20value%3A%20%2250%2C50%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20imageSizes%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Some%20important%20numbers%20to%20keep%20in%20mind%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Browsers%20ignore%20cursor%20images%20%3E128%20in%20any%20dimension%20(https%3A%2F%2Fsearchfox.org%2Fmozilla-central%2Frev%2F43ee5e789b079e94837a21336e9ce2420658fd19%2Fwidget%2Fgtk%2FnsWindow.cpp%233393-3402)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Browsers%20may%20refuse%20to%20display%20a%20cursor%20near%20window%20borders%20for%20images%20%3E32%20in%20any%20dimension%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%224x4%22%2C%20value%3A%20%224x4%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%228x8%22%2C%20value%3A%20%228x4%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%2212x12%22%2C%20value%3A%20%2212x12%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%2216x16%22%2C%20value%3A%20%2216x16%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%2232x32%22%2C%20value%3A%20%2232x32%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20formatUnreliableSize(%2248x48%22)%2C%20value%3A%20%2248x48%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20formatUnreliableSize(%2264x64%22)%2C%20value%3A%20%2264x64%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20formatUnreliableSize(%22128x128%22)%2C%20value%3A%20%22128x128%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setCur(args)%20%7B%0A%20%20%20%20%20%20const%20newCursor%20%3D%20Scratch.Cast.toString(args.cur)%3B%0A%20%20%20%20%20%20%2F%2F%20Prevent%20setting%20cursor%20to%20%22url(...)%2C%20default%22%20from%20causing%20fetch.%0A%20%20%20%20%20%20if%20(cursors.includes(newCursor)%20%7C%7C%20newCursor%20%3D%3D%3D%20%22none%22)%20%7B%0A%20%20%20%20%20%20%20%20nativeCursor%20%3D%20newCursor%3B%0A%20%20%20%20%20%20%20%20customCursorImageName%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20currentCanvasCursor%20%3D%20newCursor%3B%0A%20%20%20%20%20%20%20%20updateCanvasCursor()%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20setCursorImage(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20%5BmaxWidth%2C%20maxHeight%5D%20%3D%20parseTuple(args.size).map((i)%20%3D%3E%0A%20%20%20%20%20%20%20%20Math.max(0%2C%20i)%0A%20%20%20%20%20%20)%3B%0A%0A%20%20%20%20%20%20const%20currentCostume%20%3D%0A%20%20%20%20%20%20%20%20util.target.getCostumes()%5Butil.target.currentCostume%5D%3B%0A%20%20%20%20%20%20const%20costumeName%20%3D%20currentCostume.name%3B%0A%0A%20%20%20%20%20%20let%20encodedCostume%3B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20encodedCostume%20%3D%20costumeToCursor(currentCostume%2C%20maxWidth%2C%20maxHeight)%3B%0A%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20This%20could%20happen%20for%20a%20variety%20of%20reasons.%0A%20%20%20%20%20%20%20%20console.error(e)%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20(encodedCostume)%20%7B%0A%20%20%20%20%20%20%20%20const%20%5BpercentX%2C%20percentY%5D%20%3D%20parseTuple(args.position).map(%0A%20%20%20%20%20%20%20%20%20%20(i)%20%3D%3E%20Math.max(0%2C%20Math.min(100%2C%20i))%20%2F%20100%0A%20%20%20%20%20%20%20%20)%3B%0A%20%20%20%20%20%20%20%20const%20x%20%3D%20percentX%20*%20encodedCostume.width%3B%0A%20%20%20%20%20%20%20%20const%20y%20%3D%20percentY%20*%20encodedCostume.height%3B%0A%0A%20%20%20%20%20%20%20%20currentCanvasCursor%20%3D%20%60url(%22%24%7BencodedCostume.uri%7D%22)%20%24%7Bx%7D%20%24%7By%7D%2C%20%24%7BnativeCursor%7D%60%3B%0A%20%20%20%20%20%20%20%20updateCanvasCursor()%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20If%20for%20some%20reason%20the%20costume%20couldn't%20be%20encoded%2C%20we'll%20leave%20the%20cursor%20unchanged.%0A%20%20%20%20%20%20%20%20%2F%2F%20This%20is%20the%20same%20behavior%20that%20would%20happen%20if%20we%20successfully%20encode%20a%20cursor%20but%20the%20browser%0A%20%20%20%20%20%20%20%20%2F%2F%20is%20unable%20to%20parse%20it%20for%20some%20reason.%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20customCursorImageName%20%3D%20costumeName%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20hideCur()%20%7B%0A%20%20%20%20%20%20this.setCur(%7B%0A%20%20%20%20%20%20%20%20cur%3A%20%22none%22%2C%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getCur()%20%7B%0A%20%20%20%20%20%20if%20(customCursorImageName%20!%3D%3D%20null)%20%7B%0A%20%20%20%20%20%20%20%20return%20customCursorImageName%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20nativeCursor%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20Scratch.extensions.register(new%20MouseCursor())%3B%0A%7D)(Scratch)%3B%0A%20%7D)(Scratch)%3B","data:text/javascript;,(function(Scratch)%20%7B%20%2F%2F%20Name%3A%20Navigator%0A%2F%2F%20ID%3A%20navigatorinfo%0A%2F%2F%20Description%3A%20Details%20about%20the%20user's%20browser%20and%20operating%20system.%0A%2F%2F%20Context%3A%20%22Navigator%22%20refers%20to%20someone's%20browser%0A%2F%2F%20License%3A%20MIT%20AND%20MPL-2.0%0A%0A%2F*%20generated%20l10n%20code%20*%2FScratch.translate.setup(%7B%22it%22%3A%7B%22_Navigator%20Info%22%3A%22Informazioni%20Browser%20e%20SO%22%2C%22_dark%22%3A%22scuro%22%2C%22_device%20memory%20in%20GB%22%3A%22memoria%20dispositivo%20in%20GB%22%2C%22_light%22%3A%22chiaro%22%2C%22_operating%20system%22%3A%22sistema%20operativo%22%2C%22_user%20prefers%20%5BTHEME%5D%20color%20scheme%3F%22%3A%22l'utente%20preferisce%20il%20tema%20%5BTHEME%5D%22%2C%22_user%20prefers%20more%20contrast%3F%22%3A%22l'utente%20preferisce%20contrasto%20alto%22%2C%22_user%20prefers%20reduced%20motion%3F%22%3A%22l'utente%20preferisce%20movimento%20ridotto%22%7D%2C%22ja%22%3A%7B%22_browser%22%3A%22%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%22%2C%22_dark%22%3A%22%E3%83%80%E3%83%BC%E3%82%AF%22%2C%22_light%22%3A%22%E3%83%A9%E3%82%A4%E3%83%88%22%7D%2C%22nb%22%3A%7B%22_browser%22%3A%22nettleser%22%2C%22_dark%22%3A%22m%C3%B8rk%22%2C%22_device%20memory%20in%20GB%22%3A%22enhetens%20minne%20i%20GB%22%2C%22_light%22%3A%22lys%22%2C%22_operating%20system%22%3A%22operativsystem%22%2C%22_user%20prefers%20%5BTHEME%5D%20color%20scheme%3F%22%3A%22bruker%20foretrekker%20%5BTHEME%5D%20fargeskjema%3F%22%2C%22_user%20prefers%20more%20contrast%3F%22%3A%22brukeren%20foretrekker%20mer%20kontrast%3F%22%2C%22_user%20prefers%20reduced%20motion%3F%22%3A%22bruker%20foretrekker%20redusert%20bevegelse%3F%22%7D%2C%22nl%22%3A%7B%22_Navigator%20Info%22%3A%22Navigator-Info%22%2C%22_dark%22%3A%22donker%22%2C%22_device%20memory%20in%20GB%22%3A%22apparaatgeheugen%20in%20GB%22%2C%22_light%22%3A%22licht%22%2C%22_operating%20system%22%3A%22besturingssysteem%22%2C%22_user%20prefers%20%5BTHEME%5D%20color%20scheme%3F%22%3A%22gebruik%20heeft%20voorkeur%20voor%20%5BTHEME%5D%20kleurenschema%3F%22%2C%22_user%20prefers%20more%20contrast%3F%22%3A%22gebruiker%20heeft%20voorkeur%20voor%20meer%20contrast%3F%22%2C%22_user%20prefers%20reduced%20motion%3F%22%3A%22gebruiker%20heeft%20voorkeur%20voor%20verminderde%20beweging%3F%22%7D%2C%22ru%22%3A%7B%22_Navigator%20Info%22%3A%22%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BE%20%D0%9D%D0%B0%D0%B2%D0%B8%D0%B3%D0%B0%D1%82%D0%BE%D1%80%D0%B5%22%2C%22_browser%22%3A%22%D0%B1%D1%80%D0%B0%D1%83%D0%B7%D0%B5%D1%80%22%2C%22_dark%22%3A%22%D1%82%D1%91%D0%BC%D0%BD%D1%83%D1%8E%22%2C%22_device%20memory%20in%20GB%22%3A%22%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D1%8C%20%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0%20%D0%B2%20%D0%93%D0%91%22%2C%22_light%22%3A%22%D1%81%D0%B2%D0%B5%D1%82%D0%BB%D1%83%D1%8E%22%2C%22_operating%20system%22%3A%22%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0%22%2C%22_user%20prefers%20%5BTHEME%5D%20color%20scheme%3F%22%3A%22%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BF%D0%BE%D1%87%D0%B8%D1%82%D0%B0%D0%B5%D1%82%20%5BTHEME%5D%20%D1%82%D0%B5%D0%BC%D1%83%3F%22%2C%22_user%20prefers%20more%20contrast%3F%22%3A%22%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BF%D0%BE%D1%87%D0%B8%D1%82%D0%B0%D0%B5%D1%82%20%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B8%D0%B9%20%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%B0%D1%81%D1%82%3F%22%2C%22_user%20prefers%20reduced%20motion%3F%22%3A%22%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BF%D0%BE%D1%87%D0%B8%D1%82%D0%B0%D0%B5%D1%82%20%D1%83%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5%20%D0%B4%D0%B2%D0%B8%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5%3F%22%7D%2C%22zh-cn%22%3A%7B%22_Navigator%20Info%22%3A%22Navigator%20API%20%E4%BF%A1%E6%81%AF%22%2C%22_browser%22%3A%22%E6%B5%8F%E8%A7%88%E5%99%A8%E5%90%8D%E7%A7%B0%22%2C%22_dark%22%3A%22%E6%9A%97%E8%89%B2%22%2C%22_device%20memory%20in%20GB%22%3A%22%E8%AE%BE%E5%A4%87%E8%BF%90%E8%A1%8C%E5%86%85%E5%AD%98%22%2C%22_light%22%3A%22%E4%BA%AE%E8%89%B2%22%2C%22_operating%20system%22%3A%22%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%90%8D%E7%A7%B0%22%2C%22_user%20prefers%20%5BTHEME%5D%20color%20scheme%3F%22%3A%22%E5%BC%80%E5%90%AF%E4%BA%86%5BTHEME%5D%E4%B8%BB%E9%A2%98%EF%BC%9F%22%2C%22_user%20prefers%20more%20contrast%3F%22%3A%22%E5%BC%80%E5%90%AF%E4%BA%86%E9%AB%98%E5%AF%B9%E6%AF%94%E5%BA%A6%EF%BC%9F%22%2C%22_user%20prefers%20reduced%20motion%3F%22%3A%22%E5%BC%80%E5%90%AF%E4%BA%86%E5%8A%A8%E7%94%BB%E5%87%8F%E5%BC%B1%E5%8A%9F%E8%83%BD%EF%BC%9F%22%7D%7D)%3B%2F*%20end%20generated%20l10n%20code%20*%2F(function%20(Scratch)%20%7B%0A%20%20%22use%20strict%22%3B%0A%0A%20%20class%20NavigatorInfo%20%7B%0A%20%20%20%20getInfo()%20%7B%0A%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20id%3A%20%22navigatorinfo%22%2C%0A%20%20%20%20%20%20%20%20name%3A%20Scratch.translate(%22Navigator%20Info%22)%2C%0A%20%20%20%20%20%20%20%20blocks%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getOS%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22operating%20system%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getBrowser%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22browser%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getMemory%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22device%20memory%20in%20GB%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getPreferredColorScheme%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22user%20prefers%20%5BTHEME%5D%20color%20scheme%3F%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20THEME%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22THEME%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22dark%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getPreferredReducedMotion%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22user%20prefers%20reduced%20motion%3F%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getPreferredContrast%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22user%20prefers%20more%20contrast%3F%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20menus%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20THEME%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22light%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%22light%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22dark%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%22dark%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getOS()%20%7B%0A%20%20%20%20%20%20const%20userAgent%20%3D%20navigator.userAgent%3B%0A%20%20%20%20%20%20if%20(userAgent.includes(%22Windows%22))%20%7B%0A%20%20%20%20%20%20%20%20return%20%22Windows%22%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(userAgent.includes(%22Android%22))%20%7B%0A%20%20%20%20%20%20%20%20return%20%22Android%22%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(%0A%20%20%20%20%20%20%20%20userAgent.includes(%22iPhone%22)%20%7C%7C%0A%20%20%20%20%20%20%20%20userAgent.includes(%22iPod%22)%20%7C%7C%0A%20%20%20%20%20%20%20%20userAgent.includes(%22iPad%22)%0A%20%20%20%20%20%20)%20%7B%0A%20%20%20%20%20%20%20%20return%20%22iOS%22%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(userAgent.includes(%22Linux%22))%20%7B%0A%20%20%20%20%20%20%20%20return%20%22Linux%22%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(userAgent.includes(%22CrOS%22))%20%7B%0A%20%20%20%20%20%20%20%20return%20%22ChromeOS%22%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(userAgent.includes(%22Mac%20OS%22))%20%7B%0A%20%20%20%20%20%20%20%20return%20%22macOS%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20%22Other%22%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getBrowser()%20%7B%0A%20%20%20%20%20%20const%20userAgent%20%3D%20navigator.userAgent%3B%0A%20%20%20%20%20%20if%20(userAgent.includes(%22Chrome%22))%20%7B%0A%20%20%20%20%20%20%20%20return%20%22Chrome%22%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(userAgent.includes(%22Firefox%22))%20%7B%0A%20%20%20%20%20%20%20%20return%20%22Firefox%22%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(userAgent.includes(%22Safari%22))%20%7B%0A%20%20%20%20%20%20%20%20return%20%22Safari%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20%22Other%22%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getMemory()%20%7B%0A%20%20%20%20%20%20%2F%2F%20%40ts-expect-error%0A%20%20%20%20%20%20if%20(navigator.deviceMemory%20%3D%3D%20undefined)%20%7B%0A%20%20%20%20%20%20%20%20return%20%22Unsupported%22%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20%40ts-expect-error%0A%20%20%20%20%20%20%20%20return%20navigator.deviceMemory%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20getPreferredColorScheme(args)%20%7B%0A%20%20%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20window.matchMedia(%22(prefers-color-scheme%3A%20dark)%22).matches%20%3D%3D%3D%0A%20%20%20%20%20%20%20%20(args.THEME%20%3D%3D%3D%20%22dark%22)%0A%20%20%20%20%20%20)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getPreferredReducedMotion()%20%7B%0A%20%20%20%20%20%20return%20!!window.matchMedia(%22(prefers-reduced-motion%3A%20reduce)%22).matches%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getPreferredContrast()%20%7B%0A%20%20%20%20%20%20return%20!!window.matchMedia(%22(prefers-contrast%3A%20more)%22).matches%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20Scratch.extensions.register(new%20NavigatorInfo())%3B%0A%7D)(Scratch)%3B%0A%20%7D)(Scratch)%3B","data:text/javascript;,(function(Scratch)%20%7B%20%2F%2F%20Name%3A%20Notifications%0A%2F%2F%20ID%3A%20mdwaltersnotifications%0A%2F%2F%20Description%3A%20Display%20notifications.%0A%2F%2F%20License%3A%20MIT%0A%0A(function%20(Scratch)%20%7B%0A%20%20%22use%20strict%22%3B%0A%0A%20%20let%20denied%20%3D%20false%3B%0A%20%20%2F**%20%40type%20%7BNotification%7Cnull%7D%20*%2F%0A%20%20let%20notification%20%3D%20null%3B%0A%0A%20%20const%20askForNotificationPermission%20%3D%20async%20()%20%3D%3E%20%7B%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20const%20allowedByVM%20%3D%20await%20Scratch.canNotify()%3B%0A%20%20%20%20%20%20if%20(!allowedByVM)%20%7B%0A%20%20%20%20%20%20%20%20throw%20new%20Error(%22Denied%20by%20VM%22)%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20allowedByBrowser%20%3D%20await%20Notification.requestPermission()%3B%0A%20%20%20%20%20%20if%20(!allowedByBrowser)%20%7B%0A%20%20%20%20%20%20%20%20throw%20new%20Error(%22Denied%20by%20browser%22)%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20denied%20%3D%20false%3B%0A%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%7D%20catch%20(e)%20%7B%0A%20%20%20%20%20%20denied%20%3D%20true%3B%0A%20%20%20%20%20%20console.warn(%22Could%20not%20request%20notification%20permissions%22%2C%20e)%3B%0A%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%0A%20%20const%20isAndroid%20%3D%20()%20%3D%3E%20navigator.userAgent.includes(%22Android%22)%3B%0A%0A%20%20const%20getServiceWorkerRegistration%20%3D%20()%20%3D%3E%20%7B%0A%20%20%20%20if%20(!(%22serviceWorker%22%20in%20navigator))%20return%20null%3B%0A%20%20%20%20%2F%2F%20This%20is%20only%20needed%20on%20Android%0A%20%20%20%20if%20(!isAndroid())%20return%20null%3B%0A%20%20%20%20return%20navigator.serviceWorker.getRegistration()%3B%0A%20%20%7D%3B%0A%0A%20%20class%20Notifications%20%7B%0A%20%20%20%20constructor()%20%7B%0A%20%20%20%20%20%20Scratch.vm.runtime.on(%22RUNTIME_DISPOSED%22%2C%20()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20this._closeNotification()%3B%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%20%20%20%20getInfo()%20%7B%0A%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20id%3A%20%22mdwaltersnotifications%22%2C%0A%20%20%20%20%20%20%20%20name%3A%20%22Notifications%22%2C%0A%20%20%20%20%20%20%20%20blocks%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22requestPermission%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22request%20notification%20permission%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22hasPermission%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22has%20notification%20permission%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20disableMonitor%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22showNotification%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22create%20notification%20with%20text%20%5Btext%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22Hello%2C%20world!%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22closeNotification%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22close%20notification%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20requestPermission()%20%7B%0A%20%20%20%20%20%20return%20askForNotificationPermission()%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20hasPermission()%20%7B%0A%20%20%20%20%20%20if%20(denied)%20%7B%0A%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20askForNotificationPermission()%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20async%20_showNotification(text)%20%7B%0A%20%20%20%20%20%20if%20(await%20this.hasPermission())%20%7B%0A%20%20%20%20%20%20%20%20const%20title%20%3D%20%22Notification%20from%20project%22%3B%0A%20%20%20%20%20%20%20%20const%20options%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20body%3A%20text%2C%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20notification%20%3D%20new%20Notification(title%2C%20options)%3B%0A%20%20%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20On%20Android%20we%20need%20to%20go%20through%20the%20service%20worker.%0A%20%20%20%20%20%20%20%20%20%20const%20registration%20%3D%20await%20getServiceWorkerRegistration()%3B%0A%20%20%20%20%20%20%20%20%20%20if%20(registration)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20await%20registration.showNotification(title%2C%20options)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20(e2)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.error(%22Could%20not%20show%20notification%22%2C%20e%2C%20e2)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20console.error(%22Could%20not%20show%20notification%22%2C%20e)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20showNotification(args)%20%7B%0A%20%20%20%20%20%20this._showNotification(Scratch.Cast.toString(args.text))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20async%20_closeNotification()%20%7B%0A%20%20%20%20%20%20if%20(notification)%20%7B%0A%20%20%20%20%20%20%20%20notification.close()%3B%0A%20%20%20%20%20%20%20%20notification%20%3D%20null%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20registration%20%3D%20await%20getServiceWorkerRegistration()%3B%0A%20%20%20%20%20%20if%20(registration)%20%7B%0A%20%20%20%20%20%20%20%20const%20notifications%20%3D%20await%20registration.getNotifications()%3B%0A%20%20%20%20%20%20%20%20for%20(const%20notification%20of%20notifications)%20%7B%0A%20%20%20%20%20%20%20%20%20%20notification.close()%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20closeNotification()%20%7B%0A%20%20%20%20%20%20this._closeNotification()%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20Scratch.extensions.register(new%20Notifications())%3B%0A%7D)(Scratch)%3B%0A%20%7D)(Scratch)%3B","data:text/javascript;,(function(Scratch)%20%7B%20%2F%2F%20Name%3A%20Network%0A%2F%2F%20ID%3A%20truefantomnetwork%0A%2F%2F%20Description%3A%20Various%20blocks%20for%20interacting%20with%20the%20network.%0A%2F%2F%20By%3A%20TrueFantom%20%3Chttps%3A%2F%2Fscratch.mit.edu%2Fusers%2FTrueFantom%2F%3E%0A%2F%2F%20License%3A%20MIT%0A%0A((Scratch)%20%3D%3E%20%7B%0A%20%20%22use%20strict%22%3B%0A%0A%20%20const%20icon%20%3D%0A%20%20%20%20%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB2aWV3Qm94PSIwLDAsMjI1LjM1NDgsMjI1LjM1NDgiIGhlaWdodD0iMjI1LjM1NDgiIHdpZHRoPSIyMjUuMzU0OCIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4xIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTI3LjMyMjc0LC02Ny4zMjI2KSI%2BPGcgc3R5bGU9Im1peC1ibGVuZC1tb2RlOiBub3JtYWwiIHN0cm9rZS1kYXNob2Zmc2V0PSIwIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHN0cm9rZT0ibm9uZSIgZmlsbC1ydWxlPSJub256ZXJvIiBkYXRhLXBhcGVyLWRhdGE9InsmcXVvdDtpc1BhaW50aW5nTGF5ZXImcXVvdDs6dHJ1ZX0iPjxwYXRoIHN0cm9rZS13aWR0aD0iMCIgZmlsbD0iIzE0NjYwMCIgZD0iTTEyNy4zMjI3NSwxODBjMCwtNjIuMjMwMDEgNTAuNDQ3MzksLTExMi42Nzc0IDExMi42Nzc0LC0xMTIuNjc3NGM2Mi4yMzAwMSwwIDExMi42Nzc0LDUwLjQ0NzM5IDExMi42Nzc0LDExMi42Nzc0YzAsNjIuMjMwMDEgLTUwLjQ0NzM5LDExMi42Nzc0IC0xMTIuNjc3NCwxMTIuNjc3NGMtNjIuMjMwMDEsMCAtMTEyLjY3NzQsLTUwLjQ0NzM5IC0xMTIuNjc3NCwtMTEyLjY3NzR6Ij48L3BhdGg%2BPGcgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSIjZmZmZmZmIj48cGF0aCBkYXRhLXBhcGVyLWRhdGE9InsmcXVvdDtpbmRleCZxdW90OzpudWxsfSIgZD0iTTI2MS4zNjIzNSwxNDYuNjIzNTlsLTUuMTUwOTcsNS4yNzQ2MmwtMTMuMTg1NTEsLTEyLjIzOTg5bDE5LjIzNjg5LC0xOS40OTU4OWMxMC41OTE0NywtMTAuNTkxNDcgMjcuNzU4NCwtMTAuNTkxNDcgMzguMzQxMTIsMGwxMi43ODAzOCwxMi43ODAzOGMxMC41OTE0NywxMC41ODI3MSAxMC41OTE0NywyNy43NDk2NSAwLDM4LjM0MTEybC0zOC4zNDExMiwzOC4zNDExMmMtMTAuNTkxNDcsMTAuNTg2OTUgLTI3Ljc0OTY1LDEwLjU4Njk1IC0zOC4zNDExMiwwbC0xMi43ODAzNywtMTIuNzgwMzdsLTEyLjY3Mzc4LC0xMy4yMjYxMmwxMi4yNjMwNCwtMTIuNDMzbDI1Ljk3MTQ5LDI1LjY1OTEyYzMuNTIxNzQsMy41MjE3NCA5LjI1ODY0LDMuNTIxNzQgMTIuNzgwMzgsMGwzOC4zNDExMiwtMzguMzQxMTJjMy41MzA0OSwtMy41MzA0OSAzLjUzMDQ5LC05LjI1ODY0IDAsLTEyLjc4MDM4bC0xMi43ODAzNywtMTIuNzgwMzdjLTMuNTIxNzQsLTMuNTIxNzMgLTkuMjQ5ODgsLTMuNTMwNDkgLTEyLjc4MDM4LDBsLTEzLjY4MDc5LDEzLjY4MDc5eiI%2BPC9wYXRoPjxwYXRoIGRhdGEtcGFwZXItZGF0YT0ieyZxdW90O2luZGV4JnF1b3Q7Om51bGx9IiBkPSJNMjE4LjYzNzczLDIxMy4zNzY0bDUuMTUwOTcsLTUuMjc0NjJsMTMuMTg1NTEsMTIuMjM5ODlsLTE5LjIzNjg5LDE5LjQ5NTg5Yy0xMC41OTE0NywxMC41OTE0NyAtMjcuNzU4NCwxMC41OTE0NyAtMzguMzQxMTIsMGwtMTIuNzgwMzgsLTEyLjc4MDM4Yy0xMC41OTE0NywtMTAuNTgyNzEgLTEwLjU5MTQ3LC0yNy43NDk2NSAwLC0zOC4zNDExMWwzOC4zNDExMiwtMzguMzQxMTJjMTAuNTkxNDcsLTEwLjU4Njk1IDI3Ljc0OTY1LC0xMC41ODY5NSAzOC4zNDExMiwwbDEyLjc4MDM3LDEyLjc4MDM3bDEyLjY3Mzc4LDEzLjIyNjEybC0xMi4yNjMwNSwxMi40MzNsLTI1Ljk3MTQ4LC0yNS42NTkxMmMtMy41MjE3NCwtMy41MjE3NCAtOS4yNTg2NCwtMy41MjE3NCAtMTIuNzgwMzgsMGwtMzguMzQxMTIsMzguMzQxMTJjLTMuNTMwNDksMy41MzA0OSAtMy41MzA0OSw5LjI1ODY0IDAsMTIuNzgwMzhsMTIuNzgwMzcsMTIuNzgwMzdjMy41MjE3NCwzLjUyMTczIDkuMjQ5ODgsMy41MzA0OSAxMi43ODAzOCwwbDEzLjY4MDc5LC0xMy42ODA3OXoiPjwvcGF0aD48L2c%2BPC9nPjwvZz48L3N2Zz48IS0tcm90YXRpb25DZW50ZXI6MTEyLjY3NzI1NToxMTIuNjc3NDA1LS0%2B%22%3B%0A%0A%20%20const%20fetch_url%20%3D%20(%0A%20%20%20%20%7B%20USER_URL%2C%20BODY%2C%20CONTENT_TYPE%2C%20RESPONSES_TYPES%2C%20SPLIT%20%7D%2C%0A%20%20%20%20METHOD%0A%20%20)%20%3D%3E%20%7B%0A%20%20%20%20SPLIT%20%3D%20String(SPLIT)%3B%0A%20%20%20%20CONTENT_TYPE%20%3D%20Number(CONTENT_TYPE)%3B%0A%20%20%20%20RESPONSES_TYPES%20%3D%0A%20%20%20%20%20%20String(RESPONSES_TYPES)%0A%20%20%20%20%20%20%20%20.split(%22%20%22)%0A%20%20%20%20%20%20%20%20.filter((word)%20%3D%3E%20word%20!%3D%3D%20%22%22).length%20%3E%3D%201%0A%20%20%20%20%20%20%20%20%3F%20String(RESPONSES_TYPES)%0A%20%20%20%20%20%20%20%20%20%20%20%20.split(%22%20%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20.filter((word)%20%3D%3E%20word%20!%3D%3D%20%22%22)%0A%20%20%20%20%20%20%20%20%3A%20%5B%229%22%5D%3B%0A%20%20%20%20let%20single%20%3D%20METHOD%20%3D%3D%3D%20%22GET%22%20%7C%7C%20METHOD%20%3D%3D%3D%20%22DELETE%22%3B%0A%20%20%20%20return%20Scratch.fetch(String(USER_URL)%2C%20%7B%0A%20%20%20%20%20%20method%3A%20METHOD%2C%0A%20%20%20%20%20%20headers%3A%20single%0A%20%20%20%20%20%20%20%20%3F%20%7B%7D%0A%20%20%20%20%20%20%20%20%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Content-Type%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20CONTENT_TYPE%20%3D%3D%3D%201%20%3F%20%22text%2Fplain%22%20%3A%20%22application%2Fjson%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20redirect%3A%20single%20%3F%20%22follow%22%20%3A%20%22follow%22%2C%0A%20%20%20%20%20%20body%3A%20CONTENT_TYPE%20%3D%3D%3D%201%20%3F%20String(BODY)%20%3A%20JSON.stringify(BODY)%2C%0A%20%20%20%20%7D)%0A%20%20%20%20%20%20.then((res)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20const%20responses%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%3D%20RESPONSES_TYPES.length%20-%201%3B%20i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20switch%20(Number(RESPONSES_TYPES%5Bi%5D))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%201%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20responses.push(res.text())%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%202%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20responses.push(JSON.stringify(res.json()))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%203%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20responses.push(String(res.ok))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%204%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20responses.push(res.status)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%205%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20responses.push(res.statusText)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%206%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20responses.push(res.type)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%207%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20responses.push(String(res.redirected))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%208%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20responses.push(res.url)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%209%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20default%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20responses.push(single%20%3F%20res.url%20%3A%20String(res.bodyUsed))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20Promise.all(responses)%3B%0A%20%20%20%20%20%20%7D)%0A%20%20%20%20%20%20.then((arr)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20let%20responses%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%3D%20RESPONSES_TYPES.length%20-%201%3B%20i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20responses%20%2B%3D%20SPLIT%20%2B%20arr%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20SPLIT%20%3D%3D%3D%20%22%22%20%3F%20responses%20%3A%20responses.slice(1)%3B%0A%20%20%20%20%20%20%7D)%0A%20%20%20%20%20%20.catch((err)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20console.error(err)%3B%0A%20%20%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%7D%3B%0A%0A%20%20class%20Network%20%7B%0A%20%20%20%20getInfo()%20%7B%0A%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20id%3A%20%22truefantomnetwork%22%2C%0A%20%20%20%20%20%20%20%20name%3A%20%22Network%22%2C%0A%0A%20%20%20%20%20%20%20%20color1%3A%20%22%23146600%22%2C%0A%20%20%20%20%20%20%20%20color2%3A%20%22%23125C00%22%2C%0A%20%20%20%20%20%20%20%20color3%3A%20%22%23105200%22%2C%0A%0A%20%20%20%20%20%20%20%20menuIconURI%3A%20icon%2C%0A%0A%20%20%20%20%20%20%20%20blocks%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22connected_to_internet_block%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22connected%20to%20internet%3F%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22browser_block%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22browser%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22current_url_block%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22current%20url%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22network_type_block%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22network%20type%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22network_generation_block%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22network%20generation%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22downlink_speed_block%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22downlink%20speed%20in%20mb%2Fs%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22downlink_max_speed_block%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22downlink%20max%20speed%20in%20mb%2Fs%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22rtt_block%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22rtt%20in%20ms%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22get_block%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22get%20%5BUSER_URL%5D%20respond%20%5BRESPONSES_TYPES%5D%20split%20by%20%5BSPLIT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20USER_URL%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22https%3A%2F%2Fhttpbin.org%2Fget%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20RESPONSES_TYPES%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22only_url_response_type%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SPLIT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22%20%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22delete_block%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22delete%20%5BUSER_URL%5D%20respond%20%5BRESPONSES_TYPES%5D%20split%20by%20%5BSPLIT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20USER_URL%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22https%3A%2F%2Fhttpbin.org%2Fdelete%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20RESPONSES_TYPES%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22only_url_response_type%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SPLIT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22%20%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22post_block%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22post%20%5BCONTENT_TYPE%5D%20%5BBODY%5D%20to%20%5BUSER_URL%5D%20respond%20%5BRESPONSES_TYPES%5D%20split%20by%20%5BSPLIT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20USER_URL%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22https%3A%2F%2Fhttpbin.org%2Fpost%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20BODY%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22apple%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20CONTENT_TYPE%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22content_type%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20RESPONSES_TYPES%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22response_type%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SPLIT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22%20%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22put_block%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22put%20%5BCONTENT_TYPE%5D%20%5BBODY%5D%20to%20%5BUSER_URL%5D%20respond%20%5BRESPONSES_TYPES%5D%20split%20by%20%5BSPLIT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20USER_URL%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22https%3A%2F%2Fhttpbin.org%2Fput%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20BODY%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22apple%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20CONTENT_TYPE%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22content_type%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20RESPONSES_TYPES%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22response_type%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SPLIT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22%20%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22patch_block%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22patch%20%5BCONTENT_TYPE%5D%20%5BBODY%5D%20to%20%5BUSER_URL%5D%20respond%20%5BRESPONSES_TYPES%5D%20split%20by%20%5BSPLIT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20USER_URL%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22https%3A%2F%2Fhttpbin.org%2Fpatch%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20BODY%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22apple%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20CONTENT_TYPE%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22content_type%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20RESPONSES_TYPES%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22response_type%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SPLIT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22%20%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22open_link_block%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22open%20%5BUSER_URL%5D%20in%20new%20tab%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20USER_URL%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22https%3A%2F%2Fextensions.turbowarp.org%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22open_window_block%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22open%20%5BUSER_URL%5D%20in%20new%20window%20with%20width%3A%20%5BWIDTH%5D%20height%3A%20%5BHEIGHT%5D%20left%3A%20%5BLEFT%5D%20top%3A%20%5BTOP%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20USER_URL%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22https%3A%2F%2Fextensions.turbowarp.org%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20WIDTH%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22default%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20HEIGHT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22default%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20LEFT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22default%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TOP%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22default%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22redirect_link_block%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22redirect%20this%20tab%20to%20%5BUSER_URL%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20USER_URL%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22https%3A%2F%2Fextensions.turbowarp.org%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%0A%20%20%20%20%20%20%20%20menus%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20content_type%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22(1)%20text%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%221%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22(2)%20json%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%222%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20only_url_response_type%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22(1)%20text%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%221%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22(2)%20json%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%222%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22(3)%20status%20ok%3F%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%223%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22(4)%20status%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%224%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22(5)%20status%20text%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%225%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22(5%201)%20status%20text%20and%20text%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%225%201%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22(6)%20type%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%226%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22(6%204)%20type%20and%20status%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%226%204%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22(7)%20redirected%3F%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%227%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22(8)%20url%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%228%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20response_type%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22(1)%20text%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%221%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22(2)%20json%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%222%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22(3)%20status%20ok%3F%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%223%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22(4)%20status%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%224%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22(5)%20status%20text%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%225%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22(5%201)%20status%20text%20and%20text%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%225%201%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22(6)%20type%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%226%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22(6%204)%20type%20and%20status%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%226%204%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22(7)%20redirected%3F%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%227%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22(8)%20url%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%228%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22(9)%20body%20used%3F%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%229%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20default%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22default%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%22default%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20connected_to_internet_block()%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20return%20navigator.onLine%3B%0A%20%20%20%20%20%20%7D%20catch%20(err)%20%7B%0A%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20browser_block()%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20let%20has%20%3D%20(input)%20%3D%3E%20navigator.userAgent.includes(input)%3B%0A%20%20%20%20%20%20%20%20if%20(has(%22Firefox%22))%20return%20%22firefox%22%3B%0A%20%20%20%20%20%20%20%20if%20(has(%22SamsungBrowser%22))%20return%20%22samsung%20internet%22%3B%0A%20%20%20%20%20%20%20%20if%20((has(%22Opera%22)%20%7C%7C%20has(%22OPR%22))%20%26%26%20has(%22GX%22))%20return%20%22opera%20gx%22%3B%0A%20%20%20%20%20%20%20%20if%20(has(%22Opera%22)%20%7C%7C%20has(%22OPR%22))%20return%20%22opera%22%3B%0A%20%20%20%20%20%20%20%20if%20(has(%22Trident%22))%20return%20%22internet%20explorer%22%3B%0A%20%20%20%20%20%20%20%20if%20(has(%22Edge%22))%20return%20%22legacy%22%3B%0A%20%20%20%20%20%20%20%20if%20(has(%22Edg%22))%20return%20%22edge%22%3B%0A%20%20%20%20%20%20%20%20if%20(has(%22YaBrowser%22)%20%7C%7C%20has(%22YaSearchBrowser%22))%20return%20%22yandex%22%3B%0A%20%20%20%20%20%20%20%20if%20(has(%22Miui%22))%20return%20%22mi%20browser%22%3B%0A%20%20%20%20%20%20%20%20if%20(has(%22UBrowser%22))%20return%20%22uc%20browser%22%3B%0A%20%20%20%20%20%20%20%20if%20(has(%22Chrome%22))%20return%20%22chromium%22%3B%0A%20%20%20%20%20%20%20%20if%20(has(%22Safari%22))%20return%20%22safari%22%3B%0A%20%20%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%20%20%7D%20catch%20(err)%20%7B%0A%20%20%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20current_url_block()%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20return%20document.URL%20%7C%7C%20%22%22%3B%0A%20%20%20%20%20%20%7D%20catch%20(err)%20%7B%0A%20%20%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20network_type_block()%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20switch%20(navigator.connection.type)%20%7B%0A%20%20%20%20%20%20%20%20%20%20case%20%22bluetooth%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22bluetooth%22%3B%0A%20%20%20%20%20%20%20%20%20%20case%20%22cellular%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22cellular%22%3B%0A%20%20%20%20%20%20%20%20%20%20case%20%22ethernet%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22ethernet%22%3B%0A%20%20%20%20%20%20%20%20%20%20case%20%22wifi%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22wi-fi%22%3B%0A%20%20%20%20%20%20%20%20%20%20case%20%22wimax%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22wimax%22%3B%0A%20%20%20%20%20%20%20%20%20%20default%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20catch%20(err)%20%7B%0A%20%20%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20network_generation_block()%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20switch%20(navigator.connection.effectiveType)%20%7B%0A%20%20%20%20%20%20%20%20%20%20case%20%22slow-2g%22%3A%0A%20%20%20%20%20%20%20%20%20%20case%20%222g%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%222g%22%3B%0A%20%20%20%20%20%20%20%20%20%20case%20%223g%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%223g%22%3B%0A%20%20%20%20%20%20%20%20%20%20case%20%224g%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%224g%22%3B%0A%20%20%20%20%20%20%20%20%20%20default%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20catch%20(err)%20%7B%0A%20%20%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20downlink_speed_block()%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20return%20navigator.connection.downlink%20%7C%7C%20%22%22%3B%0A%20%20%20%20%20%20%7D%20catch%20(err)%20%7B%0A%20%20%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20downlink_max_speed_block()%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20return%20navigator.connection.downlinkMax%20%7C%7C%20%22%22%3B%0A%20%20%20%20%20%20%7D%20catch%20(err)%20%7B%0A%20%20%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20rtt_block()%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20return%20navigator.connection.rtt%20%7C%7C%20%22%22%3B%0A%20%20%20%20%20%20%7D%20catch%20(err)%20%7B%0A%20%20%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20get_block(args)%20%7B%0A%20%20%20%20%20%20return%20fetch_url(args%2C%20%22GET%22)%3B%0A%20%20%20%20%7D%0A%20%20%20%20delete_block(args)%20%7B%0A%20%20%20%20%20%20return%20fetch_url(args%2C%20%22DELETE%22)%3B%0A%20%20%20%20%7D%0A%20%20%20%20post_block(args)%20%7B%0A%20%20%20%20%20%20return%20fetch_url(args%2C%20%22POST%22)%3B%0A%20%20%20%20%7D%0A%20%20%20%20put_block(args)%20%7B%0A%20%20%20%20%20%20return%20fetch_url(args%2C%20%22PUT%22)%3B%0A%20%20%20%20%7D%0A%20%20%20%20patch_block(args)%20%7B%0A%20%20%20%20%20%20return%20fetch_url(args%2C%20%22PATCH%22)%3B%0A%20%20%20%20%7D%0A%20%20%20%20open_link_block(%7B%20USER_URL%20%7D)%20%7B%0A%20%20%20%20%20%20Scratch.openWindow(USER_URL)%3B%0A%20%20%20%20%7D%0A%20%20%20%20open_window_block(%7B%20USER_URL%2C%20WIDTH%2C%20HEIGHT%2C%20LEFT%2C%20TOP%20%7D)%20%7B%0A%20%20%20%20%20%20let%20params%20%3D%20%22popup%3D1%22%3B%0A%20%20%20%20%20%20params%20%2B%3D%20isNaN(WIDTH)%0A%20%20%20%20%20%20%20%20%3F%20%22%22%0A%20%20%20%20%20%20%20%20%3A%20%60%2Cwidth%3D%24%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20Number(WIDTH)%20%3C%20100%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20100%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20Number(WIDTH)%20%3E%20window.screen.width%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20window.screen.width%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20Number(WIDTH)%0A%20%20%20%20%20%20%20%20%20%20%7D%60%3B%0A%20%20%20%20%20%20params%20%2B%3D%20isNaN(HEIGHT)%0A%20%20%20%20%20%20%20%20%3F%20%22%22%0A%20%20%20%20%20%20%20%20%3A%20%60%2Cheight%3D%24%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20Number(HEIGHT)%20%3C%20100%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20100%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20Number(HEIGHT)%20%3E%20window.screen.height%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20window.screen.height%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20Number(HEIGHT)%0A%20%20%20%20%20%20%20%20%20%20%7D%60%3B%0A%20%20%20%20%20%20params%20%2B%3D%20isNaN(LEFT)%0A%20%20%20%20%20%20%20%20%3F%20%22%22%0A%20%20%20%20%20%20%20%20%3A%20%60%2Cleft%3D%24%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20Number(LEFT)%20%3C%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20Number(LEFT)%20%3E%20window.screen.width%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20window.screen.width%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20Number(LEFT)%0A%20%20%20%20%20%20%20%20%20%20%7D%60%3B%0A%20%20%20%20%20%20params%20%2B%3D%20isNaN(TOP)%0A%20%20%20%20%20%20%20%20%3F%20%22%22%0A%20%20%20%20%20%20%20%20%3A%20%60%2Ctop%3D%24%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20Number(TOP)%20%3C%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20Number(TOP)%20%3E%20window.screen.height%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20window.screen.height%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20Number(TOP)%0A%20%20%20%20%20%20%20%20%20%20%7D%60%3B%0A%20%20%20%20%20%20Scratch.openWindow(String(USER_URL)%2C%20params)%3B%0A%20%20%20%20%7D%0A%20%20%20%20redirect_link_block(%7B%20USER_URL%20%7D)%20%7B%0A%20%20%20%20%20%20Scratch.redirect(USER_URL)%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20Scratch.extensions.register(new%20Network())%3B%0A%7D)(Scratch)%3B%0A%20%7D)(Scratch)%3B"]) {
vm.extensionManager.loadExtensionURL(extension);
}
vm.runtime.on('PROJECT_RUN_STOP', () => {
if (!vm.isPaused || !vm.isPaused()) {
window.close();
}
});
} catch (e) {
handleError(e);
}
</script>
<script>
const getProjectData = (function() {
const storage = scaffolding.storage;
storage.onprogress = (total, loaded) => {
setProgress(interpolate(0.2, 0.98, loaded / total));
};
storage.addWebStore(
[
storage.AssetType.ImageVector,
storage.AssetType.ImageBitmap,
storage.AssetType.Sound,
storage.AssetType.Font
].filter(i => i),
(asset) => new URL('./assets/' + asset.assetId + '.' + asset.dataFormat, location).href
);
return () => new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.onload = () => {
resolve(xhr.response);
};
xhr.onerror = () => {
if (location.protocol === 'file:') {
reject(new Error('Zip environment must be used from a website, not from a file URL.'));
} else {
reject(new Error('Request to load project data failed.'));
}
};
xhr.onprogress = (e) => {
if (e.lengthComputable) {
setProgress(interpolate(0.1, 0.2, e.loaded / e.total));
}
};
xhr.responseType = 'arraybuffer';
xhr.open('GET', "./assets/project.json");
xhr.send();
});
})();
</script>
<script>
const run = async () => {
const projectData = await getProjectData();
await scaffolding.loadProject(projectData);
setProgress(1);
loadingScreen.hidden = true;
if (true) {
scaffolding.start();
} else {
launchScreen.hidden = false;
launchScreen.addEventListener('click', () => {
launchScreen.hidden = true;
scaffolding.start();
});
launchScreen.focus();
}
};
run().catch(handleError);
</script>
</body>
</html>