-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathwasm-loader-main.js
More file actions
358 lines (285 loc) · 51.3 KB
/
wasm-loader-main.js
File metadata and controls
358 lines (285 loc) · 51.3 KB
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
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
const fs = require("fs");
const child_process = require("child_process");
const clang = require("clang-wasm");
const { compile } = require("./wasm-compiler");
const { generateSourceMap, replaceSourceMapURL, removeDwarfSection, getWasmFunctionExports, getWasmMemoryExports, copyRequireDwarfSections, elemAllFunctions, getWasmImports, getTypedArrayCtorFromMemoryObj } = require("./wasm-to-sourcemap");
// TODO:
// - Use WebAssembly.Instance IF functions are called before the async callback finishes,
// so we can seamlessly replace javascript with C++ code.
// - ALTHOUGH, it doesn't work with wasm > 4KB in size (in the browser?)
// TODO:
// Add flags for enabling/disabling:
// - shim functions
// - support passing function pointers
// - support passing buffers
// - support buffers before we load (as in copying the memory)
// - support buffers in general
// - emit .d.ts file
// We should use __attribute((used)) instead of __attribute__((visibility("default"))). This will let us get rid of the
// `-Wl,--export-dynamic` and `-fvisibility=hidden` flags.
// - HOWEVER, this requires an update to clang 9, which changed exception handling in a way which appears to break it.
// Once the -fwasm-exceptions change is released (https://reviews.llvm.org/D67208) it should be easier to
// handle exceptions.
// (Although, --compile may be usable. It disables linking, but still emits a wasm file? The file has no exports though,
// but emscripten seems to make it work... not sure how...)
// Hey... we could copmile with --assemble, and then it appears the output has .hidden for non-exported functions. We already
// compile twice for DWARF info, why not three times?
const loaderUtils = require("loader-utils");
function readFilePromise(filePath) {
return new Promise((resolve, reject) => {
fs.readFile(filePath, (err, data) => {
err ? resolve("") : resolve(data);
});
});
}
function writeFilePromise(filePath, contents) {
return new Promise((resolve, reject) => {
fs.writeFile(filePath, contents, (err, data) => {
err ? reject(err) : resolve(data);
});
});
}
function existsFilePromise(filePath) {
return new Promise((resolve) => {
fs.exists(filePath, resolve);
});
}
module.exports.transform = async function() {
let options = loaderUtils.getOptions(this) || Object.create(null);
let debugBuild = ((this.mode === "development" || options.forceDebug) && !options.forceRelease);
//debugBuild = false;
let wasmCompilerUrl = loaderUtils.stringifyRequest(this, require.resolve("./wasm-compiler.js"));
// The results of the loader, depends on the loader code (this file). I am not sure why this isn't automatic...
// Although usually the require.cache isn't cleared for loaders... although that should probably be done automatically too...
this.addDependency(require("path").resolve(__filename));
//this.addDependency(require("path").resolve(compileArgumentsPath));
let inputPath = this.resourcePath.replace(/\\/g, "/");
let relativePath = this.resource.slice(this.rootContext.length).replace(/\\/g, "/");
// We need *A* output path, but it doesn't need to be in the output directory, or something sensible. However,
// using a path that is symmetrical with the input file, but in the output directory, makes debugging easier.
let wasmPath = this._compilation.options.output.path.replace(/\\/g, "/") + "/" + relativePath + ".wasm";
let jsOutputPath = this._compilation.options.output.path.replace(/\\/g, "/") + "/" + relativePath + ".js";
await new Promise(resolve => fs.mkdir(require("path").dirname(wasmPath), { recursive: true }, resolve));
let buildTime = Date.now();
// Always do one debug build, to produce the dwarf information needed to:
// - emit the .d.ts file
// - know when to convert pointer return values to a Uint8Array
// - know when to convert function return values to a function
await compileCpp(inputPath, wasmPath, getParameters(true), includes => {
for (let include of includes) {
this.addDependency(require("path").resolve(include));
}
});
let dwarfWasm;
if(!debugBuild) {
dwarfWasm = await readFilePromise(wasmPath);
await compileCpp(inputPath, wasmPath, getParameters(debugBuild));
}
let wasmFile = await readFilePromise(wasmPath);
if(!debugBuild) {
wasmFile = copyRequireDwarfSections(dwarfWasm, wasmFile);
// Not needed, because of the elemAllFunctions call
//await writeFilePromise(wasmPath, wasmFile);
}
// Make sure all functions are in the elem table, that way they can be passed as function arguments
wasmFile = elemAllFunctions(wasmFile);
await writeFilePromise(wasmPath, wasmFile);
buildTime = Date.now() - buildTime;
if (options.emitMapFile || !options.noInlineSourceMap) {
let sourceMap = await generateSourceMap(wasmFile, () => true, undefined, true);
if (sourceMap) {
if(!options.noInlineSourceMap) {
// Embed source map as a data url. Sure, 33% overhead, BUT we don't have to worry about the path
// of the source map (which is hard to manage, especially when we rebundle the files, etc).
let sourceMapUrl = "data:application/json;base64," + Buffer.from(JSON.stringify(sourceMap)).toString("base64");
wasmFile = replaceSourceMapURL(wasmFile, () => sourceMapUrl);
}
//wasmFile = removeDwarfSection(wasmFile);
if(options.emitMapFile) {
await writeFilePromise(wasmPath + ".map", JSON.stringify(sourceMap, null, 4));
}
}
}
let typingsPath = inputPath + ".d.ts";
let prevContents = (await readFilePromise(typingsPath)).toString("utf8");
let newTypingsFile = generateTypings(wasmFile, { omitDocComments: false, wasmPath });
// Make sure we only write the .d.ts file if it changed, OTHERWISE we may infintely loop
// (although, the user should REALLY only trigger on .ts file changes, not .d.ts, as usually .d.ts files
// shouldn't change the build output (the only do if the previous output was nothing, as the build failed))
if(newTypingsFile !== prevContents) {
if(prevContents && !prevContents.startsWith(`// AUTO GENERATED FILE`)) {
newTypingsFile += `\n\n`;
newTypingsFile += `// Overwritten typings file:\n`;
newTypingsFile += prevContents.split(/\r\n|\n/g).map(x => `// ` + x).join("\n");
}
await writeFilePromise(typingsPath, newTypingsFile);
}
sha3_512 = await sha3_512;
let hash = Buffer.from(sha3_512(wasmFile)).toString("base64");
hash = inputPath + hash;
let moduleContents = (
`// Bytes ${wasmFile.length}, build took ${buildTime.toFixed(1)}ms
const compiler = require(${wasmCompilerUrl});
module.exports = compiler.compile(new Uint8Array([${wasmFile.join(",")}]), ${JSON.stringify(hash)})`
);
await writeFilePromise(jsOutputPath, moduleContents);
return moduleContents;
};
function generateTypings(wasmFile, { omitDocComments, wasmPath }) {
let newTypingsFile = "";
let importList = getWasmImports(wasmFile);
let memoryExports = getWasmMemoryExports(wasmFile);
let functionExports = getWasmFunctionExports(wasmFile);
newTypingsFile += `// AUTO GENERATED FILE, DO NOT EDIT DIRECTLY. GENERATED FROM: ${wasmPath}\n`;
newTypingsFile += "\n";
if(importList.length > 0) {
newTypingsFile += "\n";
newTypingsFile += "// IMPORTANT! The promise results of promises will not be resolved until GetSyncFunctions is called with the required javascript function definitions.";
newTypingsFile += "\n\n\n";
}
newTypingsFile += getDefinitions(functionExports);
newTypingsFile += "\n";
if(importList.length === 0) {
newTypingsFile += `/** Returns a promise that contains all of the above functions, but with the guarantee that they won't return promises. */\n`;
} else {
newTypingsFile += `/** Triggers compilation with the given javascript import functions. Returns a promise that contains all of the above functions, but with the guarantee that they won't return promises. */\n`;
}
let importObject = getDefinitions(importList, " ", true, true, true);
let moduleObject = getDefinitions(functionExports, " ", true, true);
let importSignature = importList.length === 0 ? "" : `requiredJavascriptFunctions: {\n${importObject}}`;
newTypingsFile += `export declare function GetSyncFunctions(${importSignature}): Promise<{\n${moduleObject}}>;\n`;
newTypingsFile += "\n";
newTypingsFile += `/** Recompiles the file, possibly with new imports, creating a new module with new memory space. The module is self contained, and this recompilation doesn't impact the static exported functions. */\n`
newTypingsFile += `export declare function CompileNewWasm(${importSignature}): Promise<{\n${moduleObject}}>;\n`;
let typedArrayTypes = "Uint8Array|Uint16Array|Uint32Array|Int8Array|Int16Array|Int32Array|Float32Array|Float64Array|BigUint64Array|BigInt64Array";
newTypingsFile += "\n";
newTypingsFile += `export declare function UtilGetBufferFromAddress(address: number): ${typedArrayTypes};\n`;
newTypingsFile += `export declare function UtilGetAddressFromBuffer(wasmBuffer: ${typedArrayTypes}): number;\n`;
newTypingsFile += `export declare function UtilGetFncFromArg(arg: number): Function;\n`;
newTypingsFile += `export declare function UtilGetArgFromFnc(wasmFnc: Function): number;\n`;
return newTypingsFile;
function getDefinitions(functions, indent = "", forObject, noPromises, noDefinitions) {
let definitions = "";
let varPrefix = forObject ? "" : "export declare const ";
let fncPrefix = forObject ? "" : "export declare function ";
if(!noDefinitions) {
for(let exportName in memoryExports) {
let memoryObj = memoryExports[exportName];
if(!memoryObj.typeName) continue;
if(exportName.startsWith("SHIM__")) continue;
let baseType = memoryObj.typeName.split("*")[0];
let buffer = "";
let typedArrayCtor = getTypedArrayCtorFromMemoryObj(memoryObj);
if(typedArrayCtor) {
buffer = typedArrayCtor.name;
}
if(buffer === "") {
buffer = "Uint8Array";
console.error(`Value size does not correspond to a native typed array, ${memoryObj.float ? "float" : ""} ${memoryObj.signed ? "signed" : "unsigned"} byteWidth=${memoryObj.byteWidth}. Setting to Uint8Array`);
}
definitions += `${indent}/** ${baseType}[${memoryObj.count || 1}] */\n${indent}${varPrefix}${exportName}: ${buffer};\n`;
}
definitions += "\n";
}
let lastWasWarning = false;
if(functions.length === 0) {
definitions += `// No exports found. The visiblity attribute is required on functions and variables to export them. Try adding __attribute__((visibility("default"))) to functions you wish to export.\n`;
}
for(let i = 0; i < functions.length; i++) {
let functionObj = functions[i];
if(functionObj.warning) {
definitions += `// WARNING: ${functionObj.warning}\n`;
lastWasWarning = true;
continue;
}
if(lastWasWarning) {
definitions += "\n";
}
lastWasWarning = false;
let { name, demangledName, javascriptTypeNames, returnType } = functionObj;
name = demangledName || name;
let typeNamesStr = javascriptTypeNames.map(x => `${x.name}: ${x.type.type}`).join(", ");
let docCommentLines = javascriptTypeNames.map(x => `@param {${x.type.type}} ${x.name} ${x.type.typeName}`);
if(returnType.type !== "void") {
if(noPromises) {
docCommentLines.push(`@returns {${returnType.type}} ${returnType.typeName}`);
} else {
docCommentLines.push(`@returns {${returnType.type} | Promise<${returnType.type}>} ${returnType.typeName}`);
}
}
if(!omitDocComments && docCommentLines.length > 0) {
definitions += [`/**`, ...docCommentLines.map(x => " * " + x), ` * */`].map(x => indent + x + "\n").join("");
}
if(noPromises) {
definitions += `${indent}${fncPrefix}${name}(${typeNamesStr}): ${returnType.type};\n`;
} else {
definitions += `${indent}${fncPrefix}${name}(${typeNamesStr}): ${returnType.type} | Promise<${returnType.type}>;\n`;
}
if(!omitDocComments && i < functions.length - 1) {
definitions += "\n";
}
}
return definitions;
}
}
// NOTE: We embed a fast sha3_512 hasher, so we can hash wasm contents in compile mode. That way when the javascript runs
// identical modules don't have to be recompiled (which is important for hot reloading, which may load an identical module
// many times).
const sha3_512Source = new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 35, 7, 96, 0, 0, 96, 0, 1, 127, 96, 1, 127, 0, 96, 1, 127, 1, 127, 96, 3, 127, 127, 127, 0, 96, 3, 127, 127, 127, 1, 127, 96, 2, 127, 127, 0, 2, 25, 1, 3, 101, 110, 118, 17, 116, 104, 114, 111, 119, 67, 117, 114, 114, 101, 110, 116, 69, 114, 114, 111, 114, 0, 0, 3, 30, 29, 0, 1, 1, 1, 1, 1, 2, 3, 4, 5, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 6, 2, 0, 2, 0, 4, 5, 1, 112, 1, 1, 1, 5, 3, 1, 0, 2, 6, 51, 8, 127, 1, 65, 144, 161, 4, 11, 127, 0, 65, 144, 161, 4, 11, 127, 0, 65, 144, 33, 11, 127, 0, 65, 128, 8, 11, 127, 0, 65, 128, 8, 11, 127, 0, 65, 128, 16, 11, 127, 0, 65, 128, 24, 11, 127, 0, 65, 192, 24, 11, 7, 208, 6, 35, 6, 109, 101, 109, 111, 114, 121, 2, 0, 17, 95, 95, 119, 97, 115, 109, 95, 99, 97, 108, 108, 95, 99, 116, 111, 114, 115, 0, 1, 11, 95, 95, 104, 101, 97, 112, 95, 98, 97, 115, 101, 3, 1, 10, 95, 95, 100, 97, 116, 97, 95, 101, 110, 100, 3, 2, 12, 95, 95, 100, 115, 111, 95, 104, 97, 110, 100, 108, 101, 3, 3, 33, 83, 72, 73, 77, 95, 97, 114, 114, 97, 121, 95, 108, 97, 115, 116, 69, 114, 114, 111, 114, 83, 116, 114, 105, 110, 103, 70, 111, 114, 83, 104, 105, 109, 0, 2, 22, 108, 97, 115, 116, 69, 114, 114, 111, 114, 83, 116, 114, 105, 110, 103, 70, 111, 114, 83, 104, 105, 109, 3, 4, 38, 83, 72, 73, 77, 95, 112, 97, 114, 116, 95, 108, 97, 115, 116, 69, 114, 114, 111, 114, 83, 116, 114, 105, 110, 103, 70, 111, 114, 83, 104, 105, 109, 95, 99, 111, 117, 110, 116, 0, 3, 42, 83, 72, 73, 77, 95, 112, 97, 114, 116, 95, 108, 97, 115, 116, 69, 114, 114, 111, 114, 83, 116, 114, 105, 110, 103, 70, 111, 114, 83, 104, 105, 109, 95, 115, 105, 122, 101, 66, 121, 116, 101, 115, 0, 4, 41, 83, 72, 73, 77, 95, 112, 97, 114, 116, 95, 108, 97, 115, 116, 69, 114, 114, 111, 114, 83, 116, 114, 105, 110, 103, 70, 111, 114, 83, 104, 105, 109, 95, 105, 115, 83, 105, 103, 110, 101, 100, 0, 5, 40, 83, 72, 73, 77, 95, 112, 97, 114, 116, 95, 108, 97, 115, 116, 69, 114, 114, 111, 114, 83, 116, 114, 105, 110, 103, 70, 111, 114, 83, 104, 105, 109, 95, 105, 115, 70, 108, 111, 97, 116, 0, 6, 14, 95, 90, 56, 115, 101, 116, 69, 114, 114, 111, 114, 80, 75, 99, 0, 7, 24, 95, 95, 99, 120, 97, 95, 97, 108, 108, 111, 99, 97, 116, 101, 95, 101, 120, 99, 101, 112, 116, 105, 111, 110, 0, 8, 11, 95, 95, 99, 120, 97, 95, 116, 104, 114, 111, 119, 0, 9, 6, 109, 101, 109, 99, 112, 121, 0, 10, 6, 109, 101, 109, 115, 101, 116, 0, 11, 12, 99, 108, 101, 97, 114, 67, 111, 110, 116, 101, 120, 116, 0, 12, 26, 83, 72, 73, 77, 95, 97, 114, 114, 97, 121, 95, 115, 104, 97, 53, 49, 50, 73, 110, 112, 117, 116, 68, 97, 116, 97, 0, 13, 15, 115, 104, 97, 53, 49, 50, 73, 110, 112, 117, 116, 68, 97, 116, 97, 3, 5, 31, 83, 72, 73, 77, 95, 112, 97, 114, 116, 95, 115, 104, 97, 53, 49, 50, 73, 110, 112, 117, 116, 68, 97, 116, 97, 95, 99, 111, 117, 110, 116, 0, 14, 35, 83, 72, 73, 77, 95, 112, 97, 114, 116, 95, 115, 104, 97, 53, 49, 50, 73, 110, 112, 117, 116, 68, 97, 116, 97, 95, 115, 105, 122, 101, 66, 121, 116, 101, 115, 0, 15, 34, 83, 72, 73, 77, 95, 112, 97, 114, 116, 95, 115, 104, 97, 53, 49, 50, 73, 110, 112, 117, 116, 68, 97, 116, 97, 95, 105, 115, 83, 105, 103, 110, 101, 100, 0, 16, 33, 83, 72, 73, 77, 95, 112, 97, 114, 116, 95, 115, 104, 97, 53, 49, 50, 73, 110, 112, 117, 116, 68, 97, 116, 97, 95, 105, 115, 70, 108, 111, 97, 116, 0, 17, 24, 83, 72, 73, 77, 95, 97, 114, 114, 97, 121, 95, 115, 104, 97, 53, 49, 50, 72, 97, 115, 104, 79, 117, 116, 0, 18, 13, 115, 104, 97, 53, 49, 50, 72, 97, 115, 104, 79, 117, 116, 3, 6, 29, 83, 72, 73, 77, 95, 112, 97, 114, 116, 95, 115, 104, 97, 53, 49, 50, 72, 97, 115, 104, 79, 117, 116, 95, 99, 111, 117, 110, 116, 0, 19, 33, 83, 72, 73, 77, 95, 112, 97, 114, 116, 95, 115, 104, 97, 53, 49, 50, 72, 97, 115, 104, 79, 117, 116, 95, 115, 105, 122, 101, 66, 121, 116, 101, 115, 0, 20, 32, 83, 72, 73, 77, 95, 112, 97, 114, 116, 95, 115, 104, 97, 53, 49, 50, 72, 97, 115, 104, 79, 117, 116, 95, 105, 115, 83, 105, 103, 110, 101, 100, 0, 21, 31, 83, 72, 73, 77, 95, 112, 97, 114, 116, 95, 115, 104, 97, 53, 49, 50, 72, 97, 115, 104, 79, 117, 116, 95, 105, 115, 70, 108, 111, 97, 116, 0, 22, 7, 104, 101, 120, 67, 104, 97, 114, 0, 23, 6, 83, 72, 65, 53, 49, 50, 0, 24, 11, 83, 72, 65, 53, 49, 50, 95, 105, 110, 105, 116, 0, 27, 11, 115, 104, 97, 51, 95, 53, 49, 50, 99, 116, 120, 3, 7, 13, 83, 72, 65, 53, 49, 50, 95, 117, 112, 100, 97, 116, 101, 0, 28, 13, 83, 72, 65, 53, 49, 50, 95, 102, 105, 110, 105, 115, 104, 0, 29, 10, 164, 34, 29, 2, 0, 11, 8, 0, 65, 128, 136, 128, 128, 0, 11, 5, 0, 65, 128, 8, 11, 4, 0, 65, 1, 11, 4, 0, 65, 0, 11, 4, 0, 65, 0, 11, 115, 1, 3, 127, 65, 0, 33, 1, 3, 64, 32, 0, 32, 1, 106, 33, 2, 32, 1, 65, 1, 106, 34, 3, 33, 1, 32, 2, 45, 0, 0, 13, 0, 11, 65, 0, 33, 1, 65, 0, 32, 3, 65, 127, 106, 34, 2, 65, 255, 7, 32, 2, 65, 255, 7, 73, 27, 34, 2, 58, 0, 128, 136, 128, 128, 0, 2, 64, 32, 2, 69, 13, 0, 3, 64, 32, 1, 65, 129, 136, 128, 128, 0, 106, 32, 0, 32, 1, 106, 45, 0, 0, 58, 0, 0, 32, 1, 65, 1, 106, 34, 1, 32, 2, 73, 13, 0, 11, 11, 16, 128, 128, 128, 128, 0, 11, 157, 1, 1, 1, 127, 65, 128, 136, 128, 128, 0, 33, 1, 2, 64, 32, 0, 65, 1, 106, 65, 129, 8, 73, 13, 0, 65, 0, 33, 1, 65, 0, 65, 48, 58, 0, 128, 136, 128, 128, 0, 65, 0, 65, 0, 41, 0, 144, 154, 128, 128, 0, 55, 0, 129, 136, 128, 128, 0, 65, 0, 65, 0, 41, 0, 152, 154, 128, 128, 0, 55, 0, 137, 136, 128, 128, 0, 65, 0, 65, 0, 41, 0, 160, 154, 128, 128, 0, 55, 0, 145, 136, 128, 128, 0, 65, 0, 65, 0, 41, 0, 168, 154, 128, 128, 0, 55, 0, 153, 136, 128, 128, 0, 65, 0, 65, 0, 41, 0, 176, 154, 128, 128, 0, 55, 0, 161, 136, 128, 128, 0, 65, 0, 65, 0, 41, 0, 184, 154, 128, 128, 0, 55, 0, 169, 136, 128, 128, 0, 16, 128, 128, 128, 128, 0, 11, 32, 1, 11, 122, 1, 3, 127, 32, 0, 40, 2, 0, 33, 3, 65, 0, 33, 0, 3, 64, 32, 3, 32, 0, 106, 33, 4, 32, 0, 65, 1, 106, 34, 5, 33, 0, 32, 4, 45, 0, 0, 13, 0, 11, 65, 0, 33, 0, 65, 0, 32, 5, 65, 127, 106, 34, 4, 65, 255, 7, 32, 4, 65, 255, 7, 73, 27, 34, 4, 58, 0, 128, 136, 128, 128, 0, 2, 64, 32, 4, 69, 13, 0, 3, 64, 32, 0, 65, 129, 136, 128, 128, 0, 106, 32, 3, 32, 0, 106, 45, 0, 0, 58, 0, 0, 32, 0, 65, 1, 106, 34, 0, 32, 4, 73, 13, 0, 11, 11, 16, 128, 128, 128, 128, 0, 11, 56, 1, 1, 127, 2, 64, 32, 2, 65, 1, 72, 13, 0, 32, 0, 33, 3, 3, 64, 32, 3, 32, 1, 45, 0, 0, 58, 0, 0, 32, 1, 65, 1, 106, 33, 1, 32, 3, 65, 1, 106, 33, 3, 32, 2, 65, 127, 106, 34, 2, 13, 0, 11, 11, 32, 0, 11, 46, 1, 1, 127, 2, 64, 32, 2, 65, 1, 72, 13, 0, 32, 0, 33, 3, 3, 64, 32, 3, 32, 1, 58, 0, 0, 32, 3, 65, 1, 106, 33, 3, 32, 2, 65, 127, 106, 34, 2, 13, 0, 11, 11, 32, 0, 11, 16, 0, 32, 0, 65, 0, 65, 208, 1, 16, 139, 128, 128, 128, 0, 26, 11, 8, 0, 65, 128, 144, 128, 128, 0, 11, 5, 0, 65, 128, 8, 11, 4, 0, 65, 1, 11, 4, 0, 65, 0, 11, 4, 0, 65, 0, 11, 8, 0, 65, 128, 152, 128, 128, 0, 11, 5, 0, 65, 192, 0, 11, 4, 0, 65, 1, 11, 4, 0, 65, 0, 11, 4, 0, 65, 0, 11, 22, 0, 65, 48, 65, 215, 0, 32, 0, 65, 10, 73, 27, 32, 0, 106, 65, 24, 116, 65, 24, 117, 11, 195, 2, 2, 2, 127, 2, 126, 35, 128, 128, 128, 128, 0, 65, 208, 1, 107, 34, 1, 36, 128, 128, 128, 128, 0, 32, 1, 65, 0, 65, 208, 1, 16, 139, 128, 128, 128, 0, 34, 2, 65, 200, 0, 106, 66, 249, 194, 248, 155, 145, 163, 179, 240, 219, 0, 55, 3, 0, 32, 2, 65, 192, 0, 106, 66, 235, 250, 134, 218, 191, 181, 246, 193, 31, 55, 3, 0, 32, 2, 65, 56, 106, 66, 159, 216, 249, 217, 194, 145, 218, 130, 155, 127, 55, 3, 0, 32, 2, 65, 48, 106, 66, 209, 133, 154, 239, 250, 207, 148, 135, 209, 0, 55, 3, 0, 32, 2, 65, 40, 106, 66, 241, 237, 244, 248, 165, 167, 253, 167, 165, 127, 55, 3, 0, 32, 2, 65, 32, 106, 66, 171, 240, 211, 244, 175, 238, 188, 183, 60, 55, 3, 0, 32, 2, 65, 24, 106, 66, 187, 206, 170, 166, 216, 208, 235, 179, 187, 127, 55, 3, 0, 32, 2, 66, 136, 146, 243, 157, 255, 204, 249, 132, 234, 0, 55, 3, 16, 2, 64, 32, 0, 69, 13, 0, 32, 2, 32, 0, 173, 34, 3, 55, 3, 0, 65, 128, 144, 128, 128, 0, 33, 1, 2, 64, 32, 0, 65, 128, 1, 73, 13, 0, 65, 128, 144, 128, 128, 0, 33, 1, 32, 3, 33, 4, 3, 64, 32, 2, 32, 1, 16, 153, 128, 128, 128, 0, 32, 1, 65, 128, 1, 106, 33, 1, 32, 4, 66, 128, 127, 124, 34, 4, 66, 255, 0, 86, 13, 0, 11, 32, 3, 66, 255, 0, 131, 33, 3, 11, 32, 3, 80, 13, 0, 32, 2, 65, 208, 0, 106, 32, 1, 32, 3, 167, 16, 138, 128, 128, 128, 0, 26, 11, 32, 2, 16, 154, 128, 128, 128, 0, 32, 2, 65, 208, 1, 106, 36, 128, 128, 128, 128, 0, 65, 0, 11, 246, 9, 4, 2, 127, 1, 126, 1, 127, 16, 126, 35, 128, 128, 128, 128, 0, 65, 128, 5, 107, 34, 2, 36, 128, 128, 128, 128, 0, 65, 0, 33, 3, 3, 64, 32, 2, 32, 3, 106, 32, 1, 32, 3, 106, 41, 0, 0, 34, 4, 66, 56, 134, 32, 4, 66, 40, 134, 66, 128, 128, 128, 128, 128, 128, 192, 255, 0, 131, 132, 32, 4, 66, 24, 134, 66, 128, 128, 128, 128, 128, 224, 63, 131, 32, 4, 66, 8, 134, 66, 128, 128, 128, 128, 240, 31, 131, 132, 132, 32, 4, 66, 8, 136, 66, 128, 128, 128, 248, 15, 131, 32, 4, 66, 24, 136, 66, 128, 128, 252, 7, 131, 132, 32, 4, 66, 40, 136, 66, 128, 254, 3, 131, 32, 4, 66, 56, 136, 132, 132, 132, 55, 3, 0, 32, 3, 65, 8, 106, 34, 3, 65, 128, 1, 71, 13, 0, 11, 65, 0, 33, 1, 32, 2, 41, 3, 0, 33, 4, 3, 64, 32, 2, 32, 1, 106, 34, 3, 65, 128, 1, 106, 32, 4, 32, 3, 65, 200, 0, 106, 41, 3, 0, 124, 32, 3, 65, 240, 0, 106, 41, 3, 0, 34, 4, 66, 3, 137, 32, 4, 66, 6, 136, 133, 32, 4, 66, 45, 137, 133, 124, 32, 3, 65, 8, 106, 41, 3, 0, 34, 4, 66, 56, 137, 32, 4, 66, 7, 136, 133, 32, 4, 66, 63, 137, 133, 124, 55, 3, 0, 32, 4, 33, 4, 32, 1, 65, 8, 106, 34, 1, 65, 128, 4, 71, 13, 0, 11, 65, 0, 33, 3, 65, 0, 33, 5, 32, 0, 41, 3, 16, 34, 6, 33, 4, 32, 0, 65, 24, 106, 41, 3, 0, 34, 7, 33, 8, 32, 0, 65, 32, 106, 41, 3, 0, 34, 9, 33, 10, 32, 0, 65, 40, 106, 41, 3, 0, 34, 11, 33, 12, 32, 0, 65, 48, 106, 41, 3, 0, 34, 13, 33, 14, 32, 0, 65, 56, 106, 41, 3, 0, 34, 15, 33, 16, 32, 0, 65, 192, 0, 106, 41, 3, 0, 34, 17, 33, 18, 32, 0, 65, 200, 0, 106, 41, 3, 0, 34, 19, 33, 20, 3, 64, 32, 4, 66, 36, 137, 32, 4, 66, 30, 137, 133, 32, 4, 66, 25, 137, 133, 32, 10, 32, 8, 32, 4, 132, 131, 32, 8, 32, 4, 131, 132, 124, 32, 14, 66, 50, 137, 32, 14, 66, 46, 137, 133, 32, 14, 66, 23, 137, 133, 32, 20, 124, 32, 3, 65, 144, 155, 128, 128, 0, 106, 41, 3, 0, 124, 32, 18, 32, 16, 133, 32, 14, 131, 32, 18, 133, 124, 32, 2, 32, 3, 106, 34, 1, 41, 3, 0, 124, 34, 21, 124, 34, 20, 66, 36, 137, 32, 20, 66, 30, 137, 133, 32, 20, 66, 25, 137, 133, 32, 20, 32, 4, 132, 32, 8, 131, 32, 20, 32, 4, 131, 132, 124, 32, 3, 65, 152, 155, 128, 128, 0, 106, 41, 3, 0, 32, 18, 124, 32, 1, 65, 8, 106, 41, 3, 0, 124, 32, 21, 32, 12, 124, 34, 12, 32, 16, 32, 14, 133, 131, 32, 16, 133, 124, 32, 12, 66, 50, 137, 32, 12, 66, 46, 137, 133, 32, 12, 66, 23, 137, 133, 124, 34, 21, 124, 34, 18, 66, 36, 137, 32, 18, 66, 30, 137, 133, 32, 18, 66, 25, 137, 133, 32, 18, 32, 20, 132, 32, 4, 131, 32, 18, 32, 20, 131, 132, 124, 32, 3, 65, 160, 155, 128, 128, 0, 106, 41, 3, 0, 32, 16, 124, 32, 1, 65, 16, 106, 41, 3, 0, 124, 32, 21, 32, 10, 124, 34, 10, 32, 12, 32, 14, 133, 131, 32, 14, 133, 124, 32, 10, 66, 50, 137, 32, 10, 66, 46, 137, 133, 32, 10, 66, 23, 137, 133, 124, 34, 21, 124, 34, 16, 66, 36, 137, 32, 16, 66, 30, 137, 133, 32, 16, 66, 25, 137, 133, 32, 16, 32, 18, 132, 32, 20, 131, 32, 16, 32, 18, 131, 132, 124, 32, 3, 65, 168, 155, 128, 128, 0, 106, 41, 3, 0, 32, 14, 124, 32, 1, 65, 24, 106, 41, 3, 0, 124, 32, 21, 32, 8, 124, 34, 8, 32, 10, 32, 12, 133, 131, 32, 12, 133, 124, 32, 8, 66, 50, 137, 32, 8, 66, 46, 137, 133, 32, 8, 66, 23, 137, 133, 124, 34, 21, 124, 34, 14, 66, 36, 137, 32, 14, 66, 30, 137, 133, 32, 14, 66, 25, 137, 133, 32, 14, 32, 16, 132, 32, 18, 131, 32, 14, 32, 16, 131, 132, 124, 32, 3, 65, 176, 155, 128, 128, 0, 106, 41, 3, 0, 32, 12, 124, 32, 1, 65, 32, 106, 41, 3, 0, 124, 32, 21, 32, 4, 124, 34, 4, 32, 8, 32, 10, 133, 131, 32, 10, 133, 124, 32, 4, 66, 50, 137, 32, 4, 66, 46, 137, 133, 32, 4, 66, 23, 137, 133, 124, 34, 21, 124, 34, 12, 66, 36, 137, 32, 12, 66, 30, 137, 133, 32, 12, 66, 25, 137, 133, 32, 12, 32, 14, 132, 32, 16, 131, 32, 12, 32, 14, 131, 132, 124, 32, 1, 65, 40, 106, 41, 3, 0, 32, 3, 65, 184, 155, 128, 128, 0, 106, 41, 3, 0, 124, 32, 10, 124, 32, 21, 32, 20, 124, 34, 20, 32, 4, 32, 8, 133, 131, 32, 8, 133, 124, 32, 20, 66, 50, 137, 32, 20, 66, 46, 137, 133, 32, 20, 66, 23, 137, 133, 124, 34, 21, 124, 34, 10, 66, 36, 137, 32, 10, 66, 30, 137, 133, 32, 10, 66, 25, 137, 133, 32, 10, 32, 12, 132, 32, 14, 131, 32, 10, 32, 12, 131, 132, 124, 32, 1, 65, 48, 106, 41, 3, 0, 32, 3, 65, 192, 155, 128, 128, 0, 106, 41, 3, 0, 124, 32, 8, 124, 32, 21, 32, 18, 124, 34, 18, 32, 20, 32, 4, 133, 131, 32, 4, 133, 124, 32, 18, 66, 50, 137, 32, 18, 66, 46, 137, 133, 32, 18, 66, 23, 137, 133, 124, 34, 21, 124, 34, 8, 66, 36, 137, 32, 8, 66, 30, 137, 133, 32, 8, 66, 25, 137, 133, 32, 8, 32, 10, 132, 32, 12, 131, 32, 8, 32, 10, 131, 132, 124, 32, 1, 65, 56, 106, 41, 3, 0, 32, 3, 65, 200, 155, 128, 128, 0, 106, 41, 3, 0, 124, 32, 4, 124, 32, 21, 32, 16, 124, 34, 16, 32, 18, 32, 20, 133, 131, 32, 20, 133, 124, 32, 16, 66, 50, 137, 32, 16, 66, 46, 137, 133, 32, 16, 66, 23, 137, 133, 124, 34, 21, 124, 33, 4, 32, 21, 32, 14, 124, 33, 14, 32, 3, 65, 192, 0, 106, 33, 3, 32, 5, 65, 8, 106, 34, 5, 65, 208, 0, 73, 13, 0, 11, 32, 0, 65, 200, 0, 106, 32, 20, 32, 19, 124, 55, 3, 0, 32, 0, 65, 192, 0, 106, 32, 18, 32, 17, 124, 55, 3, 0, 32, 0, 65, 56, 106, 32, 16, 32, 15, 124, 55, 3, 0, 32, 0, 65, 48, 106, 32, 14, 32, 13, 124, 55, 3, 0, 32, 0, 65, 40, 106, 32, 12, 32, 11, 124, 55, 3, 0, 32, 0, 65, 32, 106, 32, 10, 32, 9, 124, 55, 3, 0, 32, 0, 65, 24, 106, 32, 8, 32, 7, 124, 55, 3, 0, 32, 0, 65, 16, 106, 32, 4, 32, 6, 124, 55, 3, 0, 32, 2, 65, 128, 5, 106, 36, 128, 128, 128, 128, 0, 11, 190, 12, 5, 1, 127, 2, 126, 1, 127, 1, 126, 3, 127, 35, 128, 128, 128, 128, 0, 65, 16, 107, 34, 1, 36, 128, 128, 128, 128, 0, 32, 1, 32, 0, 41, 3, 0, 34, 2, 66, 5, 136, 60, 0, 14, 32, 1, 32, 2, 66, 13, 136, 60, 0, 13, 32, 1, 32, 2, 66, 21, 136, 60, 0, 12, 32, 1, 32, 2, 66, 29, 136, 60, 0, 11, 32, 1, 32, 2, 66, 37, 136, 60, 0, 10, 32, 1, 32, 2, 66, 45, 136, 60, 0, 9, 32, 1, 32, 2, 66, 53, 136, 60, 0, 8, 32, 1, 32, 0, 41, 3, 8, 34, 3, 66, 5, 136, 60, 0, 6, 32, 1, 32, 3, 66, 13, 136, 60, 0, 5, 32, 1, 32, 3, 66, 21, 136, 60, 0, 4, 32, 1, 32, 3, 66, 29, 136, 60, 0, 3, 32, 1, 32, 3, 66, 37, 136, 60, 0, 2, 32, 1, 32, 3, 66, 45, 136, 60, 0, 1, 32, 1, 32, 3, 66, 53, 136, 60, 0, 0, 32, 1, 32, 2, 167, 34, 4, 65, 3, 116, 58, 0, 15, 32, 1, 32, 3, 66, 3, 134, 32, 2, 66, 61, 136, 132, 60, 0, 7, 2, 64, 66, 240, 0, 66, 240, 1, 32, 2, 66, 255, 0, 131, 34, 5, 66, 240, 0, 84, 27, 32, 5, 125, 34, 5, 80, 13, 0, 32, 0, 32, 5, 32, 2, 124, 34, 2, 55, 3, 0, 32, 4, 65, 255, 0, 113, 33, 6, 2, 64, 32, 2, 32, 5, 90, 13, 0, 32, 0, 65, 8, 106, 32, 3, 66, 1, 124, 55, 3, 0, 11, 65, 0, 33, 7, 65, 144, 160, 128, 128, 0, 33, 4, 2, 64, 2, 64, 2, 64, 2, 64, 2, 64, 32, 6, 69, 13, 0, 32, 5, 65, 128, 1, 32, 6, 107, 34, 8, 173, 34, 2, 90, 13, 1, 32, 6, 33, 7, 11, 32, 5, 66, 128, 1, 90, 13, 1, 12, 2, 11, 32, 0, 65, 208, 0, 106, 34, 4, 32, 6, 106, 65, 144, 160, 128, 128, 0, 32, 8, 16, 138, 128, 128, 128, 0, 26, 32, 0, 32, 4, 16, 153, 128, 128, 128, 0, 32, 8, 65, 144, 160, 128, 128, 0, 106, 33, 4, 32, 5, 32, 2, 125, 34, 5, 66, 128, 1, 84, 13, 1, 11, 32, 5, 33, 2, 3, 64, 32, 0, 32, 4, 16, 153, 128, 128, 128, 0, 32, 4, 65, 128, 1, 106, 33, 4, 32, 2, 66, 128, 127, 124, 34, 2, 66, 255, 0, 86, 13, 0, 11, 32, 5, 66, 255, 0, 131, 34, 5, 80, 69, 13, 1, 12, 2, 11, 32, 5, 80, 13, 1, 11, 32, 0, 32, 7, 106, 65, 208, 0, 106, 32, 4, 32, 5, 167, 16, 138, 128, 128, 128, 0, 26, 11, 66, 16, 33, 3, 32, 0, 32, 0, 41, 3, 0, 34, 2, 66, 16, 124, 34, 5, 55, 3, 0, 32, 2, 167, 65, 255, 0, 113, 33, 4, 2, 64, 32, 5, 32, 2, 90, 13, 0, 32, 0, 65, 8, 106, 34, 6, 32, 6, 41, 3, 0, 66, 1, 124, 55, 3, 0, 11, 65, 0, 33, 6, 32, 1, 33, 7, 2, 64, 2, 64, 32, 4, 69, 13, 0, 2, 64, 65, 128, 1, 32, 4, 107, 34, 8, 65, 16, 77, 13, 0, 32, 4, 33, 6, 12, 1, 11, 32, 0, 65, 208, 0, 106, 34, 7, 32, 4, 106, 32, 1, 32, 8, 16, 138, 128, 128, 128, 0, 26, 32, 0, 32, 7, 16, 153, 128, 128, 128, 0, 66, 16, 32, 8, 173, 125, 34, 3, 80, 13, 1, 32, 1, 32, 8, 106, 33, 7, 11, 32, 0, 32, 6, 106, 65, 208, 0, 106, 32, 7, 32, 3, 167, 16, 138, 128, 128, 128, 0, 26, 11, 65, 0, 32, 0, 41, 3, 16, 34, 2, 60, 0, 135, 152, 128, 128, 0, 65, 0, 32, 2, 66, 8, 136, 60, 0, 134, 152, 128, 128, 0, 65, 0, 32, 2, 66, 16, 136, 60, 0, 133, 152, 128, 128, 0, 65, 0, 32, 2, 66, 24, 136, 60, 0, 132, 152, 128, 128, 0, 65, 0, 32, 2, 66, 32, 136, 60, 0, 131, 152, 128, 128, 0, 65, 0, 32, 2, 66, 40, 136, 60, 0, 130, 152, 128, 128, 0, 65, 0, 32, 2, 66, 48, 136, 60, 0, 129, 152, 128, 128, 0, 65, 0, 32, 2, 66, 56, 136, 60, 0, 128, 152, 128, 128, 0, 65, 0, 32, 0, 65, 24, 106, 41, 3, 0, 34, 2, 60, 0, 143, 152, 128, 128, 0, 65, 0, 32, 0, 65, 32, 106, 41, 3, 0, 34, 3, 60, 0, 151, 152, 128, 128, 0, 65, 0, 32, 2, 66, 8, 136, 60, 0, 142, 152, 128, 128, 0, 65, 0, 32, 2, 66, 16, 136, 60, 0, 141, 152, 128, 128, 0, 65, 0, 32, 2, 66, 24, 136, 60, 0, 140, 152, 128, 128, 0, 65, 0, 32, 2, 66, 32, 136, 60, 0, 139, 152, 128, 128, 0, 65, 0, 32, 2, 66, 40, 136, 60, 0, 138, 152, 128, 128, 0, 65, 0, 32, 2, 66, 48, 136, 60, 0, 137, 152, 128, 128, 0, 65, 0, 32, 2, 66, 56, 136, 60, 0, 136, 152, 128, 128, 0, 65, 0, 32, 3, 66, 8, 136, 60, 0, 150, 152, 128, 128, 0, 65, 0, 32, 3, 66, 16, 136, 60, 0, 149, 152, 128, 128, 0, 65, 0, 32, 3, 66, 24, 136, 60, 0, 148, 152, 128, 128, 0, 65, 0, 32, 3, 66, 32, 136, 60, 0, 147, 152, 128, 128, 0, 65, 0, 32, 3, 66, 40, 136, 60, 0, 146, 152, 128, 128, 0, 65, 0, 32, 3, 66, 48, 136, 60, 0, 145, 152, 128, 128, 0, 65, 0, 32, 3, 66, 56, 136, 60, 0, 144, 152, 128, 128, 0, 65, 0, 32, 0, 65, 40, 106, 41, 3, 0, 34, 2, 60, 0, 159, 152, 128, 128, 0, 65, 0, 32, 2, 66, 8, 136, 60, 0, 158, 152, 128, 128, 0, 65, 0, 32, 2, 66, 16, 136, 60, 0, 157, 152, 128, 128, 0, 65, 0, 32, 2, 66, 24, 136, 60, 0, 156, 152, 128, 128, 0, 65, 0, 32, 2, 66, 32, 136, 60, 0, 155, 152, 128, 128, 0, 65, 0, 32, 2, 66, 40, 136, 60, 0, 154, 152, 128, 128, 0, 65, 0, 32, 2, 66, 48, 136, 60, 0, 153, 152, 128, 128, 0, 65, 0, 32, 2, 66, 56, 136, 60, 0, 152, 152, 128, 128, 0, 65, 0, 32, 0, 65, 48, 106, 41, 3, 0, 34, 2, 60, 0, 167, 152, 128, 128, 0, 65, 0, 32, 2, 66, 8, 136, 60, 0, 166, 152, 128, 128, 0, 65, 0, 32, 2, 66, 16, 136, 60, 0, 165, 152, 128, 128, 0, 65, 0, 32, 2, 66, 24, 136, 60, 0, 164, 152, 128, 128, 0, 65, 0, 32, 2, 66, 32, 136, 60, 0, 163, 152, 128, 128, 0, 65, 0, 32, 2, 66, 40, 136, 60, 0, 162, 152, 128, 128, 0, 65, 0, 32, 2, 66, 48, 136, 60, 0, 161, 152, 128, 128, 0, 65, 0, 32, 2, 66, 56, 136, 60, 0, 160, 152, 128, 128, 0, 65, 0, 32, 0, 65, 56, 106, 41, 3, 0, 34, 2, 60, 0, 175, 152, 128, 128, 0, 65, 0, 32, 2, 66, 8, 136, 60, 0, 174, 152, 128, 128, 0, 65, 0, 32, 2, 66, 16, 136, 60, 0, 173, 152, 128, 128, 0, 65, 0, 32, 2, 66, 24, 136, 60, 0, 172, 152, 128, 128, 0, 65, 0, 32, 2, 66, 32, 136, 60, 0, 171, 152, 128, 128, 0, 65, 0, 32, 2, 66, 40, 136, 60, 0, 170, 152, 128, 128, 0, 65, 0, 32, 2, 66, 48, 136, 60, 0, 169, 152, 128, 128, 0, 65, 0, 32, 2, 66, 56, 136, 60, 0, 168, 152, 128, 128, 0, 65, 0, 32, 0, 65, 192, 0, 106, 41, 3, 0, 34, 2, 60, 0, 183, 152, 128, 128, 0, 65, 0, 32, 2, 66, 8, 136, 60, 0, 182, 152, 128, 128, 0, 65, 0, 32, 2, 66, 16, 136, 60, 0, 181, 152, 128, 128, 0, 65, 0, 32, 2, 66, 24, 136, 60, 0, 180, 152, 128, 128, 0, 65, 0, 32, 2, 66, 32, 136, 60, 0, 179, 152, 128, 128, 0, 65, 0, 32, 2, 66, 40, 136, 60, 0, 178, 152, 128, 128, 0, 65, 0, 32, 2, 66, 48, 136, 60, 0, 177, 152, 128, 128, 0, 65, 0, 32, 2, 66, 56, 136, 60, 0, 176, 152, 128, 128, 0, 65, 0, 32, 0, 65, 200, 0, 106, 41, 3, 0, 34, 2, 60, 0, 191, 152, 128, 128, 0, 65, 0, 32, 2, 66, 8, 136, 60, 0, 190, 152, 128, 128, 0, 65, 0, 32, 2, 66, 16, 136, 60, 0, 189, 152, 128, 128, 0, 65, 0, 32, 2, 66, 24, 136, 60, 0, 188, 152, 128, 128, 0, 65, 0, 32, 2, 66, 32, 136, 60, 0, 187, 152, 128, 128, 0, 65, 0, 32, 2, 66, 40, 136, 60, 0, 186, 152, 128, 128, 0, 65, 0, 32, 2, 66, 48, 136, 60, 0, 185, 152, 128, 128, 0, 65, 0, 32, 2, 66, 56, 136, 60, 0, 184, 152, 128, 128, 0, 32, 1, 65, 16, 106, 36, 128, 128, 128, 128, 0, 11, 178, 1, 0, 65, 192, 152, 128, 128, 0, 65, 0, 65, 208, 1, 16, 139, 128, 128, 128, 0, 26, 65, 0, 66, 249, 194, 248, 155, 145, 163, 179, 240, 219, 0, 55, 3, 136, 153, 128, 128, 0, 65, 0, 66, 235, 250, 134, 218, 191, 181, 246, 193, 31, 55, 3, 128, 153, 128, 128, 0, 65, 0, 66, 159, 216, 249, 217, 194, 145, 218, 130, 155, 127, 55, 3, 248, 152, 128, 128, 0, 65, 0, 66, 209, 133, 154, 239, 250, 207, 148, 135, 209, 0, 55, 3, 240, 152, 128, 128, 0, 65, 0, 66, 241, 237, 244, 248, 165, 167, 253, 167, 165, 127, 55, 3, 232, 152, 128, 128, 0, 65, 0, 66, 171, 240, 211, 244, 175, 238, 188, 183, 60, 55, 3, 224, 152, 128, 128, 0, 65, 0, 66, 187, 206, 170, 166, 216, 208, 235, 179, 187, 127, 55, 3, 216, 152, 128, 128, 0, 65, 0, 66, 136, 146, 243, 157, 255, 204, 249, 132, 234, 0, 55, 3, 208, 152, 128, 128, 0, 11, 212, 2, 3, 1, 127, 3, 126, 3, 127, 2, 64, 2, 64, 2, 64, 2, 64, 32, 0, 65, 129, 8, 79, 13, 0, 32, 0, 69, 13, 3, 65, 0, 33, 1, 65, 0, 65, 0, 41, 3, 192, 152, 128, 128, 0, 34, 2, 32, 0, 173, 34, 3, 124, 34, 4, 55, 3, 192, 152, 128, 128, 0, 32, 2, 167, 65, 255, 0, 113, 33, 5, 2, 64, 32, 4, 32, 2, 90, 13, 0, 65, 0, 65, 0, 41, 3, 200, 152, 128, 128, 0, 66, 1, 124, 55, 3, 200, 152, 128, 128, 0, 11, 65, 128, 144, 128, 128, 0, 33, 6, 2, 64, 2, 64, 2, 64, 32, 5, 69, 13, 0, 65, 128, 1, 32, 5, 107, 34, 7, 32, 0, 77, 13, 1, 32, 5, 33, 1, 11, 32, 3, 66, 128, 1, 90, 13, 1, 12, 3, 11, 32, 5, 65, 144, 153, 128, 128, 0, 106, 65, 128, 144, 128, 128, 0, 32, 7, 16, 138, 128, 128, 128, 0, 26, 65, 192, 152, 128, 128, 0, 65, 144, 153, 128, 128, 0, 16, 153, 128, 128, 128, 0, 32, 7, 65, 128, 144, 128, 128, 0, 106, 33, 6, 32, 3, 32, 7, 173, 125, 34, 3, 66, 128, 1, 84, 13, 2, 11, 32, 3, 33, 2, 3, 64, 65, 192, 152, 128, 128, 0, 32, 6, 16, 153, 128, 128, 128, 0, 32, 6, 65, 128, 1, 106, 33, 6, 32, 2, 66, 128, 127, 124, 34, 2, 66, 255, 0, 86, 13, 0, 11, 32, 3, 66, 255, 0, 131, 34, 3, 80, 69, 13, 2, 12, 3, 11, 65, 0, 65, 193, 154, 128, 128, 0, 54, 2, 128, 136, 128, 128, 0, 65, 128, 136, 128, 128, 0, 65, 128, 128, 128, 128, 0, 65, 0, 16, 137, 128, 128, 128, 0, 0, 11, 32, 3, 80, 13, 1, 11, 32, 1, 65, 144, 153, 128, 128, 0, 106, 32, 6, 32, 3, 167, 16, 138, 128, 128, 128, 0, 26, 11, 11, 32, 0, 65, 192, 152, 128, 128, 0, 16, 154, 128, 128, 128, 0, 65, 192, 152, 128, 128, 0, 65, 0, 65, 208, 1, 16, 139, 128, 128, 128, 0, 26, 11, 11, 159, 25, 2, 0, 65, 128, 8, 11, 144, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 144, 26, 11, 128, 7, 69, 120, 99, 101, 112, 116, 105, 111, 110, 32, 105, 115, 32, 108, 97, 114, 103, 101, 114, 32, 116, 104, 97, 110, 32, 109, 97, 120, 32, 115, 105, 122, 101, 32, 102, 111, 114, 32, 101, 120, 99, 101, 112, 116, 105, 111, 110, 115, 0, 115, 104, 97, 53, 49, 50, 73, 110, 112, 117, 116, 76, 101, 110, 103, 116, 104, 32, 99, 97, 110, 110, 111, 116, 32, 98, 101, 32, 103, 114, 101, 97, 116, 101, 114, 32, 116, 104, 97, 110, 32, 116, 104, 101, 32, 115, 105, 122, 101, 32, 111, 102, 32, 115, 104, 97, 53, 49, 50, 73, 110, 112, 117, 116, 68, 97, 116, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 174, 40, 215, 152, 47, 138, 66, 205, 101, 239, 35, 145, 68, 55, 113, 47, 59, 77, 236, 207, 251, 192, 181, 188, 219, 137, 129, 165, 219, 181, 233, 56, 181, 72, 243, 91, 194, 86, 57, 25, 208, 5, 182, 241, 17, 241, 89, 155, 79, 25, 175, 164, 130, 63, 146, 24, 129, 109, 218, 213, 94, 28, 171, 66, 2, 3, 163, 152, 170, 7, 216, 190, 111, 112, 69, 1, 91, 131, 18, 140, 178, 228, 78, 190, 133, 49, 36, 226, 180, 255, 213, 195, 125, 12, 85, 111, 137, 123, 242, 116, 93, 190, 114, 177, 150, 22, 59, 254, 177, 222, 128, 53, 18, 199, 37, 167, 6, 220, 155, 148, 38, 105, 207, 116, 241, 155, 193, 210, 74, 241, 158, 193, 105, 155, 228, 227, 37, 79, 56, 134, 71, 190, 239, 181, 213, 140, 139, 198, 157, 193, 15, 101, 156, 172, 119, 204, 161, 12, 36, 117, 2, 43, 89, 111, 44, 233, 45, 131, 228, 166, 110, 170, 132, 116, 74, 212, 251, 65, 189, 220, 169, 176, 92, 181, 83, 17, 131, 218, 136, 249, 118, 171, 223, 102, 238, 82, 81, 62, 152, 16, 50, 180, 45, 109, 198, 49, 168, 63, 33, 251, 152, 200, 39, 3, 176, 228, 14, 239, 190, 199, 127, 89, 191, 194, 143, 168, 61, 243, 11, 224, 198, 37, 167, 10, 147, 71, 145, 167, 213, 111, 130, 3, 224, 81, 99, 202, 6, 112, 110, 14, 10, 103, 41, 41, 20, 252, 47, 210, 70, 133, 10, 183, 39, 38, 201, 38, 92, 56, 33, 27, 46, 237, 42, 196, 90, 252, 109, 44, 77, 223, 179, 149, 157, 19, 13, 56, 83, 222, 99, 175, 139, 84, 115, 10, 101, 168, 178, 119, 60, 187, 10, 106, 118, 230, 174, 237, 71, 46, 201, 194, 129, 59, 53, 130, 20, 133, 44, 114, 146, 100, 3, 241, 76, 161, 232, 191, 162, 1, 48, 66, 188, 75, 102, 26, 168, 145, 151, 248, 208, 112, 139, 75, 194, 48, 190, 84, 6, 163, 81, 108, 199, 24, 82, 239, 214, 25, 232, 146, 209, 16, 169, 101, 85, 36, 6, 153, 214, 42, 32, 113, 87, 133, 53, 14, 244, 184, 209, 187, 50, 112, 160, 106, 16, 200, 208, 210, 184, 22, 193, 164, 25, 83, 171, 65, 81, 8, 108, 55, 30, 153, 235, 142, 223, 76, 119, 72, 39, 168, 72, 155, 225, 181, 188, 176, 52, 99, 90, 201, 197, 179, 12, 28, 57, 203, 138, 65, 227, 74, 170, 216, 78, 115, 227, 99, 119, 79, 202, 156, 91, 163, 184, 178, 214, 243, 111, 46, 104, 252, 178, 239, 93, 238, 130, 143, 116, 96, 47, 23, 67, 111, 99, 165, 120, 114, 171, 240, 161, 20, 120, 200, 132, 236, 57, 100, 26, 8, 2, 199, 140, 40, 30, 99, 35, 250, 255, 190, 144, 233, 189, 130, 222, 235, 108, 80, 164, 21, 121, 198, 178, 247, 163, 249, 190, 43, 83, 114, 227, 242, 120, 113, 198, 156, 97, 38, 234, 206, 62, 39, 202, 7, 194, 192, 33, 199, 184, 134, 209, 30, 235, 224, 205, 214, 125, 218, 234, 120, 209, 110, 238, 127, 79, 125, 245, 186, 111, 23, 114, 170, 103, 240, 6, 166, 152, 200, 162, 197, 125, 99, 10, 174, 13, 249, 190, 4, 152, 63, 17, 27, 71, 28, 19, 53, 11, 113, 27, 132, 125, 4, 35, 245, 119, 219, 40, 147, 36, 199, 64, 123, 171, 202, 50, 188, 190, 201, 21, 10, 190, 158, 60, 76, 13, 16, 156, 196, 103, 29, 67, 182, 66, 62, 203, 190, 212, 197, 76, 42, 126, 101, 252, 156, 41, 127, 89, 236, 250, 214, 58, 171, 111, 203, 95, 23, 88, 71, 74, 140, 25, 68, 108, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 226, 6, 4, 110, 97, 109, 101, 1, 218, 6, 30, 0, 17, 116, 104, 114, 111, 119, 67, 117, 114, 114, 101, 110, 116, 69, 114, 114, 111, 114, 1, 17, 95, 95, 119, 97, 115, 109, 95, 99, 97, 108, 108, 95, 99, 116, 111, 114, 115, 2, 33, 83, 72, 73, 77, 95, 97, 114, 114, 97, 121, 95, 108, 97, 115, 116, 69, 114, 114, 111, 114, 83, 116, 114, 105, 110, 103, 70, 111, 114, 83, 104, 105, 109, 3, 38, 83, 72, 73, 77, 95, 112, 97, 114, 116, 95, 108, 97, 115, 116, 69, 114, 114, 111, 114, 83, 116, 114, 105, 110, 103, 70, 111, 114, 83, 104, 105, 109, 95, 99, 111, 117, 110, 116, 4, 42, 83, 72, 73, 77, 95, 112, 97, 114, 116, 95, 108, 97, 115, 116, 69, 114, 114, 111, 114, 83, 116, 114, 105, 110, 103, 70, 111, 114, 83, 104, 105, 109, 95, 115, 105, 122, 101, 66, 121, 116, 101, 115, 5, 41, 83, 72, 73, 77, 95, 112, 97, 114, 116, 95, 108, 97, 115, 116, 69, 114, 114, 111, 114, 83, 116, 114, 105, 110, 103, 70, 111, 114, 83, 104, 105, 109, 95, 105, 115, 83, 105, 103, 110, 101, 100, 6, 40, 83, 72, 73, 77, 95, 112, 97, 114, 116, 95, 108, 97, 115, 116, 69, 114, 114, 111, 114, 83, 116, 114, 105, 110, 103, 70, 111, 114, 83, 104, 105, 109, 95, 105, 115, 70, 108, 111, 97, 116, 7, 21, 115, 101, 116, 69, 114, 114, 111, 114, 40, 99, 104, 97, 114, 32, 99, 111, 110, 115, 116, 42, 41, 8, 24, 95, 95, 99, 120, 97, 95, 97, 108, 108, 111, 99, 97, 116, 101, 95, 101, 120, 99, 101, 112, 116, 105, 111, 110, 9, 11, 95, 95, 99, 120, 97, 95, 116, 104, 114, 111, 119, 10, 6, 109, 101, 109, 99, 112, 121, 11, 6, 109, 101, 109, 115, 101, 116, 12, 12, 99, 108, 101, 97, 114, 67, 111, 110, 116, 101, 120, 116, 13, 26, 83, 72, 73, 77, 95, 97, 114, 114, 97, 121, 95, 115, 104, 97, 53, 49, 50, 73, 110, 112, 117, 116, 68, 97, 116, 97, 14, 31, 83, 72, 73, 77, 95, 112, 97, 114, 116, 95, 115, 104, 97, 53, 49, 50, 73, 110, 112, 117, 116, 68, 97, 116, 97, 95, 99, 111, 117, 110, 116, 15, 35, 83, 72, 73, 77, 95, 112, 97, 114, 116, 95, 115, 104, 97, 53, 49, 50, 73, 110, 112, 117, 116, 68, 97, 116, 97, 95, 115, 105, 122, 101, 66, 121, 116, 101, 115, 16, 34, 83, 72, 73, 77, 95, 112, 97, 114, 116, 95, 115, 104, 97, 53, 49, 50, 73, 110, 112, 117, 116, 68, 97, 116, 97, 95, 105, 115, 83, 105, 103, 110, 101, 100, 17, 33, 83, 72, 73, 77, 95, 112, 97, 114, 116, 95, 115, 104, 97, 53, 49, 50, 73, 110, 112, 117, 116, 68, 97, 116, 97, 95, 105, 115, 70, 108, 111, 97, 116, 18, 24, 83, 72, 73, 77, 95, 97, 114, 114, 97, 121, 95, 115, 104, 97, 53, 49, 50, 72, 97, 115, 104, 79, 117, 116, 19, 29, 83, 72, 73, 77, 95, 112, 97, 114, 116, 95, 115, 104, 97, 53, 49, 50, 72, 97, 115, 104, 79, 117, 116, 95, 99, 111, 117, 110, 116, 20, 33, 83, 72, 73, 77, 95, 112, 97, 114, 116, 95, 115, 104, 97, 53, 49, 50, 72, 97, 115, 104, 79, 117, 116, 95, 115, 105, 122, 101, 66, 121, 116, 101, 115, 21, 32, 83, 72, 73, 77, 95, 112, 97, 114, 116, 95, 115, 104, 97, 53, 49, 50, 72, 97, 115, 104, 79, 117, 116, 95, 105, 115, 83, 105, 103, 110, 101, 100, 22, 31, 83, 72, 73, 77, 95, 112, 97, 114, 116, 95, 115, 104, 97, 53, 49, 50, 72, 97, 115, 104, 79, 117, 116, 95, 105, 115, 70, 108, 111, 97, 116, 23, 7, 104, 101, 120, 67, 104, 97, 114, 24, 6, 83, 72, 65, 53, 49, 50, 25, 69, 109, 98, 101, 100, 116, 108, 115, 95, 115, 104, 97, 53, 49, 50, 95, 112, 114, 111, 99, 101, 115, 115, 40, 109, 98, 101, 100, 116, 108, 115, 95, 115, 104, 97, 53, 49, 50, 95, 99, 111, 110, 116, 101, 120, 116, 42, 44, 32, 117, 110, 115, 105, 103, 110, 101, 100, 32, 99, 104, 97, 114, 32, 99, 111, 110, 115, 116, 42, 41, 26, 62, 109, 98, 101, 100, 116, 108, 115, 95, 115, 104, 97, 53, 49, 50, 95, 102, 105, 110, 105, 115, 104, 40, 109, 98, 101, 100, 116, 108, 115, 95, 115, 104, 97, 53, 49, 50, 95, 99, 111, 110, 116, 101, 120, 116, 42, 44, 32, 117, 110, 115, 105, 103, 110, 101, 100, 32, 99, 104, 97, 114, 42, 41, 27, 11, 83, 72, 65, 53, 49, 50, 95, 105, 110, 105, 116, 28, 13, 83, 72, 65, 53, 49, 50, 95, 117, 112, 100, 97, 116, 101, 29, 13, 83, 72, 65, 53, 49, 50, 95, 102, 105, 110, 105, 115, 104]);
const createSha3_512 = module.exports.createSha3_512 = function createSha3_512() {
return (async () => {
let fscryptctl2 = compile(sha3_512Source, "SHA3_512_for_loader", { throwCurrentError() { throw new Error(`Unexpected error from sha3_512 code`); } });
await fscryptctl2.GetSyncFunctions();
return function sha3_512(input) {
fscryptctl2.SHA512_init();
for (let j = 0; j < input.length; j += fscryptctl2.sha512InputData.length) {
let curPos = j;
let curLength = Math.min(input.length - curPos, fscryptctl2.sha512InputData.length);
fscryptctl2.sha512InputData.set(input.slice(curPos, curLength), 0);
fscryptctl2.SHA512_update(curLength);
}
fscryptctl2.SHA512_finish();
return fscryptctl2.sha512HashOut;
};
})();
};
function getParameters(debugBuild) {
let parameters = [
`--target=wasm32`,
`-nostdlib`,
`-H`,
`-Wl,--no-entry`,
`-Wl,--export-dynamic`,
`-fvisibility=hidden`,
`-Wl,--allow-undefined`,
debugBuild ? "-g" : `-Ofast`,
];
return parameters;
}
let sha3_512 = createSha3_512();
const compileCpp = module.exports.compileCpp = async function compileCpp(inputPath, wasmPath, parameters, onIncludes) {
let compileError = undefined;
let includeFilesResultCallback;
let includeFilesResult = new Promise((resolve, reject) => {
includeFilesResultCallback = resolve;
});
// clang --target=wasm32 -nostdlib -Wl,--no-entry -Wl,--export-all -o add2.wasm add2.cpp
child_process.execFile(clang.getBinaryPath("clang"), parameters.concat([
`-o`,
wasmPath,
inputPath
]), {}, (error, stdout, stderr) => {
compileError = error;
includeFilesResultCallback(stderr);
});
let outputForHeaders = await includeFilesResult;
let includes = outputForHeaders
.split(/\.+ (.+)[\n\r]+/g)
.filter((x) => x);
if(onIncludes) {
onIncludes(includes);
}
if (compileError) {
throw compileError;
}
};