From 9f9a63fa0099ed3daf2423b94c11ffb60b52cf65 Mon Sep 17 00:00:00 2001 From: d07riv Date: Sun, 25 Aug 2019 18:45:53 +0300 Subject: [PATCH] mpq compress --- package-lock.json | 2 +- package.json | 2 +- src/App.js | 155 +-- src/App.scss | 18 +- src/api/codec.js | 129 +-- src/api/savefile.js | 150 +-- src/mpqcmp/MpqCmp.jscc | 1944 +++++++++++++++-------------------- src/mpqcmp/MpqCmp.wasm | Bin 356747 -> 244866 bytes src/mpqcmp/compress.js | 27 + src/mpqcmp/index.js | 84 ++ src/mpqcmp/mpqcmp.worker.js | 33 +- 11 files changed, 1200 insertions(+), 1344 deletions(-) create mode 100644 src/mpqcmp/compress.js create mode 100644 src/mpqcmp/index.js diff --git a/package-lock.json b/package-lock.json index a6e0c24..3f7e9f0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "diabloweb", - "version": "1.0.36", + "version": "1.0.37", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 48310c1..e9ae3f8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "diabloweb", - "version": "1.0.36", + "version": "1.0.37", "private": true, "dependencies": { "@babel/core": "7.4.3", diff --git a/src/App.js b/src/App.js index f01e1eb..7b8b728 100644 --- a/src/App.js +++ b/src/App.js @@ -11,6 +11,7 @@ import { mapStackTrace } from 'sourcemapped-stacktrace'; import create_fs from './fs'; import load_game from './api/loader'; import { SpawnSizes } from './api/load_spawn'; +import CompressMpq from './mpqcmp'; import Peer from 'peerjs'; @@ -130,7 +131,9 @@ class App extends React.Component { if (spawn && SpawnSizes.includes(spawn.byteLength)) { this.setState({has_spawn: true}); } - this.updateSaves(); + if ([...fs.files.keys()].filter(name => name.match(/\.sv$/i)).length) { + this.setState({save_names: true}); + } }); } @@ -138,7 +141,11 @@ class App extends React.Component { const file = getDropFile(e); if (file) { e.preventDefault(); - this.start(file); + if (this.compressMpq) { + this.compressMpq.start(file); + } else { + this.start(file); + } } this.setState({dropping: 0}); } @@ -223,12 +230,18 @@ class App extends React.Component { this.saveName = name; } + showSaves = () => { + if (this.state.save_names === true) { + this.updateSaves().then(() => this.setState({show_saves: !this.state.show_saves})); + } else { + this.setState({show_saves: !this.state.show_saves}); + } + } updateSaves() { - this.fs.then(fs => { - const saves = []; + return this.fs.then(fs => { + const saves = {}; [...fs.files.keys()].filter(name => name.match(/\.sv$/i)).forEach(name => { - saves.push(name); - console.log(name, getPlayerName(fs.files.get(name).buffer)); + saves[name] = getPlayerName(fs.files.get(name).buffer, name); }); this.setState({save_names: saves}); }); @@ -302,7 +315,7 @@ class App extends React.Component { document.removeEventListener("dragleave", this.onDragLeave, true); this.setState({dropping: 0}); - const retail = !!(file && file.name.match(/^diabdat\.mpq$/i)); + const retail = !!(file && !file.name.match(/^spawn\.mpq$/i)); if (process.env.NODE_ENV === 'production') { ReactGA.event({ category: 'Game', @@ -656,30 +669,78 @@ class App extends React.Component { } } - render() { - const {started, loading, error, progress, dropping, has_spawn, save_names, show_saves} = this.state; - if (show_saves && save_names) { + renderUi() { + const {started, loading, error, progress, has_spawn, save_names, show_saves, compress} = this.state; + if (show_saves && typeof save_names === "object") { + const plrClass = ["Warrior", "Rogue", "Sorcerer"]; return ( -
-
-
-
    - {save_names.map(name =>
  • - {name} - this.downloadSave(name)}/> - this.removeSave(name)}/> -
  • )} -
-
- - -
- this.setState({show_saves: false})}>Back -
-
+
+
    + {Object.entries(save_names).map(([name, info]) =>
  • + {name}{info ? {info.name} (lv. {info.level} {plrClass[info.cls]}) : ""} + this.downloadSave(name)}/> + this.removeSave(name)}/> +
  • )} +
+
+ + +
+
this.setState({show_saves: false})}>Back
+
+ ); + } else if (compress) { + return ( + this.compressMpq = e}/> + ); + } else if (error) { + return ( + +

The following error has occurred:

+

{error.message}

+

Click to create an issue on GitHub

+ {error.save != null && Download save file} + + ); + } else if (loading && !started) { + return ( +
+ {(progress && progress.text) || 'Loading...'} + {progress != null && !!progress.total && ( + + )} +
+ ); + } else if (!started) { + return ( +
+

+ This is a web port of the original Diablo game, based on source code reconstructed by + GalaXyHaXz and devilution team. The project page with information and links can be found over here https://github.com/d07RiV/diabloweb +

+

+ If you own the original game, you can drop the original DIABDAT.MPQ onto this page or click the button below to start playing. + The game can be purchased from GoG. + {" "} this.setState({compress: true})}>Click here to compress the MPQ, greatly reducing its size. +

+ {!has_spawn && ( +

+ Or you can play the shareware version for free (50MB download). +

+ )} +
+ + +
+
this.start()}>Play Shareware
+ {!!save_names &&
Manage Saves
}
); } + } + + render() { + const {started, error, dropping} = this.state; return (
@@ -699,45 +760,7 @@ class App extends React.Component {
- {!!error && ( - -

The following error has occurred:

-

{error.message}

-

Click to create an issue on GitHub

- {error.save != null && Download save file} - - )} - {!!loading && !started && !error && ( -
- {(progress && progress.text) || 'Loading...'} - {progress != null && !!progress.total && ( - - )} -
- )} - {!started && !loading && !error && ( -
-

- This is a web port of the original Diablo game, based on source code reconstructed by - GalaXyHaXz and devilution team. The project page with information and links can be found over here https://github.com/d07RiV/diabloweb -

-

- If you own the original game, you can drop the original DIABDAT.MPQ onto this page or click the button below to start playing. - The game can be purchased from GoG. -

- {!has_spawn && ( -

- Or you can play the shareware version for free (50MB download). -

- )} -
- - -
- this.start()}>Play Shareware - {!!(save_names && save_names.length) && this.setState({show_saves: true})}>Manage Saves} -
- )} + {this.renderUi()}
); diff --git a/src/App.scss b/src/App.scss index af3e5ff..08ff118 100644 --- a/src/App.scss +++ b/src/App.scss @@ -110,7 +110,9 @@ body, #root, .App { margin: 10px 0; } .startButton { - display: inline-block; + display: block; + margin-left: auto; + margin-right: auto; border: 1px solid #fff; background: #000; font-size: 2em; @@ -127,14 +129,24 @@ body, #root, .App { text-align: left; li { padding: 0 6px; + .info { + color: #888; + margin-left: 6px; + } .btnRemove { - color: #f88; + color: #800; + &:hover { + color: #f00; + } float: right; cursor: pointer; margin: 0 4px; } .btnDownload { - color: #fff; + color: #888; + &:hover { + color: #fff; + } float: right; cursor: pointer; margin: 0 4px; diff --git a/src/api/codec.js b/src/api/codec.js index 2bf2aa6..9736192 100644 --- a/src/api/codec.js +++ b/src/api/codec.js @@ -1,25 +1,28 @@ const W = new Uint32Array(80); -const SHA1CircularShift = (shift, value) => ((value << shift) | (value >>> (32 - shift))); +const SHA1CircularShift = (shift, value) => ((value << shift) | (value >> (32 - shift))); class SHA1 { - state = new Uint32Array(5); + digest = new Uint32Array(5); count = 0; - input(u8) { + input8(u8) { const u32 = new Uint32Array(u8.buffer, u8.byteOffset, 16); - context.count += data.length * 32; + this.input(u32); + } + input(u32) { + this.count += u32.length * 32; for (let i = 0; i < 16; ++i) { W[i] = u32[i]; } for (let i = 16; i < 80; ++i) { W[i] = W[i - 16] ^ W[i - 14] ^ W[i - 8] ^ W[i - 3]; } - let A = this.state[0]; - let B = this.state[1]; - let C = this.state[2]; - let D = this.state[3]; - let E = this.state[4]; + let A = this.digest[0]; + let B = this.digest[1]; + let C = this.digest[2]; + let D = this.digest[3]; + let E = this.digest[4]; for (let i = 0; i < 20; i++) { const temp = SHA1CircularShift(5, A) + ((B & C) | ((~B) & D)) + E + W[i] + 0x5A827999; @@ -57,21 +60,21 @@ class SHA1 { A = temp | 0; } - this.state[0] += A; - this.state[1] += B; - this.state[2] += C; - this.state[3] += D; - this.state[4] += E; + this.digest[0] += A; + this.digest[1] += B; + this.digest[2] += C; + this.digest[3] += D; + this.digest[4] += E; } constructor() { - this.state[0] = 0x67452301; - this.state[1] = 0xEFCDAB89; - this.state[2] = 0x98BADCFE; - this.state[3] = 0x10325476; - this.state[4] = 0xC3D2E1F0; + this.digest[0] = 0x67452301; + this.digest[1] = 0xEFCDAB89; + this.digest[2] = 0x98BADCFE; + this.digest[3] = 0x10325476; + this.digest[4] = 0xC3D2E1F0; - this.result = new Uint8Array(this.state.buffer); + this.digest8 = new Uint8Array(this.digest.buffer); } } @@ -85,16 +88,10 @@ class Random { } } -struct CodecSignature { - DWORD checksum; - BYTE error; - BYTE last_chunk_size; - WORD unused; -}; - function codec_init_key(password) { const rand = new Random(0x7058); const key = new Uint8Array(136); + const k32 = new Uint32Array(key.buffer); for (let i = 0; i < 136; ++i) { key[i] = rand.next(); } @@ -103,62 +100,50 @@ function codec_init_key(password) { pw[i] = password.charCodeAt(i % password.length); } - const sha = new SHA1(); - sha.input(pw); + let sha = new SHA1(); + sha.input8(pw); - for (let i = 0; i < 136; ++i) { - key[i] ^= sha.result[i % sha.result.length]; + for (let i = 0; i < 34; ++i) { + k32[i] ^= sha.digest[i % sha.digest.length]; } sha = new SHA1(); - sha.input(key.subarray(72)); + sha.input(k32.subarray(18)); return sha; } -function codec_decode(data, password) { - const sha = codec_init_key(password); +export default function codec_decode(data, password) { if (data.length <= 8) { return; } const size = data.length - 8; - if () - char buf[128]; - char dst[SHA1HashSize]; - int i; - CodecSignature *sig; + if (size % 64) { + return; + } - codec_init_key(0, pszPassword); - if (size <= 8) - return 0; - size = size - 8; - if (size % 64 != 0) - return 0; - for (i = size; i != 0; pbSrcDst += 64, i -= 64) { - memcpy(buf, pbSrcDst, 64); - SHA1Result(0, dst); - for (int j = 0; j < 64; j++) { - buf[j] ^= dst[j % SHA1HashSize]; - } - SHA1Calculate(0, buf, NULL); - memset(dst, 0, sizeof(dst)); - memcpy(pbSrcDst, buf, 64); - } + if (data[size + 4]) { + return; + } - memset(buf, 0, sizeof(buf)); - sig = (CodecSignature *)pbSrcDst; - if (sig->error > 0) { - size = 0; - SHA1Clear(); - } else { - SHA1Result(0, dst); - if (sig->checksum != *(DWORD *)dst) { - memset(dst, 0, sizeof(dst)); - size = 0; - SHA1Clear(); - } else { - size += sig->last_chunk_size - 64; - SHA1Clear(); - } - } - return size; + const last_size = data[size + 5]; + const result_size = size + last_size - 64; + const result = new Uint8Array(result_size); + + const sha = codec_init_key(password); + const size32 = size >> 2; + const data32 = new Uint32Array(data.buffer, data.byteOffset, size32 + 1); + const buf32 = new Uint32Array(16); + const buf = new Uint8Array(buf32.buffer); + + for (let i = 0; i < size32; i += 16) { + for (let j = 0; j < 16; ++j) { + buf32[j] = data32[i + j] ^ sha.digest[j % sha.digest.length]; + } + sha.input(buf32); + result.set(i === size32 - 16 ? buf.subarray(0, last_size) : buf, i * 4); + } + if (data32[size32] !== sha.digest[0]) { + return; + } + return result; } diff --git a/src/api/savefile.js b/src/api/savefile.js index 728b966..508d528 100644 --- a/src/api/savefile.js +++ b/src/api/savefile.js @@ -1,4 +1,5 @@ import { explode } from './explode'; +import codec_decode from './codec'; function pkzip_decompress(data, out_size) { if (data.length === out_size) { @@ -43,7 +44,7 @@ const hashtable = (function() { } return hashtable; })(); -function decrypt(u32, key) { +export function decrypt(u32, key) { let seed = 0xEEEEEEEE; for (let i = 0; i < u32.length; ++i) { seed += hashtable[0x400 + (key & 0xFF)]; @@ -52,10 +53,23 @@ function decrypt(u32, key) { key = ((~key << 0x15) + 0x11111111) | (key >>> 0x0B); } } -function decrypt8(u8, key) { +export function decrypt8(u8, key) { decrypt(new Uint32Array(u8.buffer, u8.byteOffset, u8.length >> 2), key); } -function hash(name, type) { +export function encrypt(u32, key) { + let seed = 0xEEEEEEEE; + for (let i = 0; i < u32.length; ++i) { + seed += hashtable[0x400 + (key & 0xFF)]; + const orig = u32[i]; + u32[i] ^= seed + key; + seed = (orig + seed * 33 + 3) | 0; + key = ((~key << 0x15) + 0x11111111) | (key >>> 0x0B); + } +} +export function encrypt8(u8, key) { + encrypt(new Uint32Array(u8.buffer, u8.byteOffset, u8.length >> 2), key); +} +export function hash(name, type) { let seed1 = 0x7FED7FED; let seed2 = 0xEEEEEEEE; for (let i = 0; i < name.length; ++i) { @@ -72,7 +86,7 @@ function hash(name, type) { return seed1 >>> 0; } -function path_name(name) { +export function path_name(name) { const pos = Math.max(name.lastIndexOf('/'), name.lastIndexOf('\\')); return name.substring(pos + 1); } @@ -90,11 +104,11 @@ const Flags = { Exists: 0x80000000, }; -class MpqReader { +export class MpqReader { constructor(buffer) { this.buffer = buffer; this.u8 = new Uint8Array(buffer); - this.u32 = new Uint32Array(buffer); + this.u32 = new Uint32Array(buffer, 0, buffer.byteLength >> 2); this.readHeader(); } @@ -132,79 +146,81 @@ class MpqReader { } } - read(name) { + readRaw(name) { const index = this.fileIndex(name); if (index == null) { return; } const block = this.hashTable[index * 4 + 3]; - const filePos = this.blockTable[block * 4]; - let cmpSize = this.blockTable[block * 4 + 1]; - const fileSize = this.blockTable[block * 4 + 2]; - const flags = this.blockTable[block * 4 + 3]; - - if (flags & Flags.PatchFile) { + const info = { + filePos: this.blockTable[block * 4], + cmpSize: this.blockTable[block * 4 + 1], + fileSize: this.blockTable[block * 4 + 2], + flags: this.blockTable[block * 4 + 3], + key: hash(path_name(name), 3), + }; + if ((info.flags & Flags.PatchFile) || info.filePos + info.cmpSize > this.buffer.byteLength) { return; } - if (!(flags & Flags.Compressed)) { - cmpSize = fileSize; + if (!(info.flags & Flags.Compressed)) { + info.cmpSize = info.fileSize; } - - let key = hash(path_name(name), 3); - if (flags & Flags.FixSeed) { - key = (key + filePos) ^ fileSize; + if (info.flags & Flags.FixSeed) { + info.key = (info.key + info.filePos) ^ info.fileSize; } + return {info, data: new Uint8Array(this.buffer, info.filePos, info.cmpSize)}; + } - if (flags & Flags.SingleUnit) { - const raw = new Uint8Array(this.buffer, filePos, cmpSize); - if (raw.length !== cmpSize) { + read(name) { + const raw = this.readRaw(name); + if (!raw) { + return; + } + let {info, data} = raw; + data = data.slice(); + + if (info.flags & Flags.SingleUnit) { + if (info.flags & Flags.Encrypted) { + decrypt8(data, info.key); + } + if (info.flags & Flags.CompressMulti) { return; + } else if (info.flags & Flags.CompressPkWare) { + return pkzip_decompress(data, info.fileSize); } - if (flags & Flags.Encrypted) { - decrypt8(raw, key); - } - if (flags & Flags.CompressMulti) { - return; - } else if (flags & Flags.CompressPkWare) { - return pkzip_decompress(raw, fileSize); - } - return raw; - } else if (!(flags & Flags.Compressed)) { - const raw = Uint8Array(this.buffer, filePos, fileSize); - if (raw.length !== fileSize) { - return; - } - if (flags & Flags.Encrypted) { - for (let i = 0; i < fileSize; i += this.blockSize) { - decrypt8(raw.subarray(i, Math.min(fileSize, i + this.blockSize)), key + i / this.blockSize); + return data; + } else if (!(info.flags & Flags.Compressed)) { + if (info.flags & Flags.Encrypted) { + for (let i = 0; i < info.fileSize; i += this.blockSize) { + decrypt8(data.subarray(i, Math.min(info.fileSize, i + this.blockSize)), info.key + i / this.blockSize); } } - return raw; + return data; } else { - const numBlocks = Math.floor((fileSize + this.blockSize - 1) / this.blockSize); - const tableSize = numBlocks + 1 + ((flags & Flags.SectorCrc) ? 1 : 0); - const blocks = new Uint32Array(this.buffer, filePos, tableSize); - if (blocks.length !== tableSize) { + const numBlocks = Math.floor((info.fileSize + this.blockSize - 1) / this.blockSize); + const tableSize = numBlocks + 1; + if (data.length < tableSize * 4) { return; } - if (flags & Flags.Encrypted) { - decrypt(blocks, key - 1); + const blocks = new Uint32Array(data.buffer, 0, tableSize); + if (info.flags & Flags.Encrypted) { + decrypt(blocks, info.key - 1); } - const output = new Uint8Array(fileSize); + const output = new Uint8Array(info.fileSize); for (let i = 0; i < numBlocks; ++i) { const oPos = i * this.blockSize; - const cSize = blocks[i + 1] - blocks[i]; - const uSize = Math.min(this.blockSize, fileSize - oPos); - let tmp = new Uint8Array(this.buffer, filePos + blocks[i], cSize); - if (tmp.length !== cSize) { + const uSize = Math.min(this.blockSize, info.fileSize - oPos); + if (blocks[i + 1] > data.length) { return; } - if (flags & Flags.Encrypted) { - decrypt8(tmp, key + i); + let tmp = data.subarray(blocks[i], blocks[i + 1]); + if (info.flags & Flags.Encrypted) { + // this is not safe, but our files are small enough + decrypt8(tmp, info.key + i); } - if (flags & Flags.CompressMulti) { + if (info.flags & Flags.CompressMulti) { return; - } else if (flags & Flags.CompressPkWare) { + } else if (info.flags & Flags.CompressPkWare) { tmp = pkzip_decompress(tmp, uSize); } if (!tmp || tmp.length !== uSize) { @@ -217,12 +233,28 @@ class MpqReader { } } -export default function getPlayerName(data) { - debugger; +function getPassword(name) { + if (name.match(/spawn\d+\.sv/i)) { + return 'lshbkfg1'; // single, spawn + } else if (name.match(/share_\d+\.sv/i)) { + return 'lshbkfg1'; // multi, spawn + } else if (name.match(/multi_\d+\.sv/i)) { + return 'szqnlsk1'; // multi, retail + } else { + return 'xrgyrkj1'; // single, retail + } +} + +export default function getPlayerName(data, name) { try { const reader = new MpqReader(data); - const hero = reader.read("hero"); - return ''; + const hero = codec_decode(reader.read("hero"), getPassword(name)); + const nameEnd = hero.indexOf(0, 16); + const result = {}; + result.name = String.fromCharCode(...hero.subarray(16, nameEnd)); + result.cls = hero[48]; + result.level = hero[53]; + return result; } catch (e) { return null; } diff --git a/src/mpqcmp/MpqCmp.jscc b/src/mpqcmp/MpqCmp.jscc index cc1906b..b48a5e7 100644 --- a/src/mpqcmp/MpqCmp.jscc +++ b/src/mpqcmp/MpqCmp.jscc @@ -5,11 +5,6 @@ var MpqCmp = (function() { function(MpqCmp) { MpqCmp = MpqCmp || {}; -// Copyright 2010 The Emscripten Authors. All rights reserved. -// Emscripten is available under two separate licenses, the MIT license and the -// University of Illinois/NCSA Open Source License. Both these licenses can be -// found in the LICENSE file. - // The Module object: Our interface to the outside world. We import // and export values on it. There are various ways Module can be used: // 1. Not defined. We create it here @@ -50,35 +45,25 @@ Module['quit'] = function(status, toThrow) { Module['preRun'] = []; Module['postRun'] = []; -// Determine the runtime environment we are in. You can customize this by -// setting the ENVIRONMENT setting at compile time (see settings.js). +// The environment setup code below is customized to use Module. +// *** Environment setup code *** var ENVIRONMENT_IS_WEB = false; var ENVIRONMENT_IS_WORKER = false; var ENVIRONMENT_IS_NODE = false; -var ENVIRONMENT_HAS_NODE = false; var ENVIRONMENT_IS_SHELL = false; ENVIRONMENT_IS_WEB = typeof window === 'object'; ENVIRONMENT_IS_WORKER = typeof importScripts === 'function'; -// A web environment like Electron.js can have Node enabled, so we must -// distinguish between Node-enabled environments and Node environments per se. -// This will allow the former to do things like mount NODEFS. -// Extended check using process.versions fixes issue #8816. -// (Also makes redundant the original check that 'require' is a function.) -ENVIRONMENT_HAS_NODE = typeof process === 'object' && typeof process.versions === 'object' && typeof process.versions.node === 'string'; -ENVIRONMENT_IS_NODE = ENVIRONMENT_HAS_NODE && !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_WORKER; +ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function' && !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_WORKER; ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; - // Three configurations we can be running in: // 1) We could be the application main() thread running in the main JS UI thread. (ENVIRONMENT_IS_WORKER == false and ENVIRONMENT_IS_PTHREAD == false) // 2) We could be the application main() thread proxied to worker. (with Emscripten -s PROXY_TO_WORKER=1) (ENVIRONMENT_IS_WORKER == true, ENVIRONMENT_IS_PTHREAD == false) // 3) We could be an application pthread running in a worker. (ENVIRONMENT_IS_WORKER == true and ENVIRONMENT_IS_PTHREAD == true) - - // `/` should be present at the end if `scriptDirectory` is not empty var scriptDirectory = ''; function locateFile(path) { @@ -89,12 +74,6 @@ function locateFile(path) { } } -// Hooks that are implemented differently in different runtime environments. -var read_, - readAsync, - readBinary, - setWindowTitle; - if (ENVIRONMENT_IS_NODE) { scriptDirectory = __dirname + '/'; @@ -103,7 +82,7 @@ if (ENVIRONMENT_IS_NODE) { var nodeFS; var nodePath; - read_ = function shell_read(filename, binary) { + Module['read'] = function shell_read(filename, binary) { var ret; if (!nodeFS) nodeFS = require('fs'); if (!nodePath) nodePath = require('path'); @@ -112,8 +91,8 @@ if (ENVIRONMENT_IS_NODE) { return binary ? ret : ret.toString(); }; - readBinary = function readBinary(filename) { - var ret = read_(filename, true); + Module['readBinary'] = function readBinary(filename) { + var ret = Module['read'](filename, true); if (!ret.buffer) { ret = new Uint8Array(ret); } @@ -137,7 +116,9 @@ if (ENVIRONMENT_IS_NODE) { }); // Currently node will swallow unhandled rejections, but this behavior is // deprecated, and in the future it will exit with error status. - process['on']('unhandledRejection', abort); + process['on']('unhandledRejection', function(reason, p) { + process['exit'](1); + }); Module['quit'] = function(status) { process['exit'](status); @@ -149,12 +130,12 @@ if (ENVIRONMENT_IS_SHELL) { if (typeof read != 'undefined') { - read_ = function shell_read(f) { + Module['read'] = function shell_read(f) { return read(f); }; } - readBinary = function readBinary(f) { + Module['readBinary'] = function readBinary(f) { var data; if (typeof readbuffer === 'function') { return new Uint8Array(readbuffer(f)); @@ -177,10 +158,12 @@ if (ENVIRONMENT_IS_SHELL) { } } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { - if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled + if (ENVIRONMENT_IS_WEB) { + if (document.currentScript) { + scriptDirectory = document.currentScript.src; + } + } else { // worker scriptDirectory = self.location.href; - } else if (document.currentScript) { // web - scriptDirectory = document.currentScript.src; } // When MODULARIZE (and not _INSTANCE), this JS may be executed later, after document.currentScript // is gone, so we saved it, and we use it here instead of any other info. @@ -189,16 +172,14 @@ if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { } // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them. // otherwise, slice off the final part of the url to find the script directory. - // if scriptDirectory does not contain a slash, lastIndexOf will return -1, - // and scriptDirectory will correctly be replaced with an empty string. if (scriptDirectory.indexOf('blob:') !== 0) { - scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf('/')+1); + scriptDirectory = scriptDirectory.split('/').slice(0, -1).join('/') + '/'; } else { scriptDirectory = ''; } - read_ = function shell_read(url) { + Module['read'] = function shell_read(url) { var xhr = new XMLHttpRequest(); xhr.open('GET', url, false); xhr.send(null); @@ -206,7 +187,7 @@ if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { }; if (ENVIRONMENT_IS_WORKER) { - readBinary = function readBinary(url) { + Module['readBinary'] = function readBinary(url) { var xhr = new XMLHttpRequest(); xhr.open('GET', url, false); xhr.responseType = 'arraybuffer'; @@ -215,7 +196,7 @@ if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { }; } - readAsync = function readAsync(url, onload, onerror) { + Module['readAsync'] = function readAsync(url, onload, onerror) { var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.responseType = 'arraybuffer'; @@ -230,7 +211,7 @@ if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { xhr.send(null); }; - setWindowTitle = function(title) { document.title = title }; + Module['setWindowTitle'] = function(title) { document.title = title }; } else { } @@ -244,6 +225,8 @@ if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { var out = Module['print'] || (typeof console !== 'undefined' ? console.log.bind(console) : (typeof print !== 'undefined' ? print : null)); var err = Module['printErr'] || (typeof printErr !== 'undefined' ? printErr : ((typeof console !== 'undefined' && console.warn.bind(console)) || out)); +// *** Environment setup code *** + // Merge back in the overrides for (key in moduleOverrides) { if (moduleOverrides.hasOwnProperty(key)) { @@ -254,35 +237,37 @@ for (key in moduleOverrides) { // reclaim data used e.g. in memoryInitializerRequest, which is a large typed array. moduleOverrides = undefined; -// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message -// TODO remove when SDL2 is fixed; also add the above assertion - - - -// Copyright 2017 The Emscripten Authors. All rights reserved. -// Emscripten is available under two separate licenses, the MIT license and the -// University of Illinois/NCSA Open Source License. Both these licenses can be -// found in the LICENSE file. // {{PREAMBLE_ADDITIONS}} var STACK_ALIGN = 16; +function staticAlloc(size) { + var ret = STATICTOP; + STATICTOP = (STATICTOP + size + 15) & -16; + return ret; +} + function dynamicAlloc(size) { var ret = HEAP32[DYNAMICTOP_PTR>>2]; var end = (ret + size + 15) & -16; - if (end > _emscripten_get_heap_size()) { - abort(); - } HEAP32[DYNAMICTOP_PTR>>2] = end; + if (end >= TOTAL_MEMORY) { + var success = enlargeMemory(); + if (!success) { + HEAP32[DYNAMICTOP_PTR>>2] = ret; + return 0; + } + } return ret; } function alignMemory(size, factor) { if (!factor) factor = STACK_ALIGN; // stack alignment (16-byte) by default - return Math.ceil(size / factor) * factor; + var ret = size = Math.ceil(size / factor) * factor; + return ret; } function getNativeTypeSize(type) { @@ -298,7 +283,7 @@ function getNativeTypeSize(type) { return 4; // A pointer } else if (type[0] === 'i') { var bits = parseInt(type.substr(1)); - assert(bits % 8 === 0, 'getNativeTypeSize invalid bits ' + bits + ', type ' + type); + assert(bits % 8 === 0); return bits / 8; } else { return 0; @@ -329,112 +314,8 @@ var asm2wasmImports = { // special asm2wasm imports var jsCallStartIndex = 1; var functionPointers = new Array(0); -// Wraps a JS function as a wasm function with a given signature. -// In the future, we may get a WebAssembly.Function constructor. Until then, -// we create a wasm module that takes the JS function as an import with a given -// signature, and re-exports that as a wasm function. -function convertJsFunctionToWasm(func, sig) { - - // The module is static, with the exception of the type section, which is - // generated based on the signature passed in. - var typeSection = [ - 0x01, // id: section, - 0x00, // length: 0 (placeholder) - 0x01, // count: 1 - 0x60, // form: func - ]; - var sigRet = sig.slice(0, 1); - var sigParam = sig.slice(1); - var typeCodes = { - 'i': 0x7f, // i32 - 'j': 0x7e, // i64 - 'f': 0x7d, // f32 - 'd': 0x7c, // f64 - }; - - // Parameters, length + signatures - typeSection.push(sigParam.length); - for (var i = 0; i < sigParam.length; ++i) { - typeSection.push(typeCodes[sigParam[i]]); - } - - // Return values, length + signatures - // With no multi-return in MVP, either 0 (void) or 1 (anything else) - if (sigRet == 'v') { - typeSection.push(0x00); - } else { - typeSection = typeSection.concat([0x01, typeCodes[sigRet]]); - } - - // Write the overall length of the type section back into the section header - // (excepting the 2 bytes for the section id and length) - typeSection[1] = typeSection.length - 2; - - // Rest of the module is static - var bytes = new Uint8Array([ - 0x00, 0x61, 0x73, 0x6d, // magic ("\0asm") - 0x01, 0x00, 0x00, 0x00, // version: 1 - ].concat(typeSection, [ - 0x02, 0x07, // import section - // (import "e" "f" (func 0 (type 0))) - 0x01, 0x01, 0x65, 0x01, 0x66, 0x00, 0x00, - 0x07, 0x05, // export section - // (export "f" (func 0 (type 0))) - 0x01, 0x01, 0x66, 0x00, 0x00, - ])); - - // We can compile this wasm module synchronously because it is very small. - // This accepts an import (at "e.f"), that it reroutes to an export (at "f") - var module = new WebAssembly.Module(bytes); - var instance = new WebAssembly.Instance(module, { - e: { - f: func - } - }); - var wrappedFunc = instance.exports.f; - return wrappedFunc; -} - -// Add a wasm function to the table. -function addFunctionWasm(func, sig) { - var table = wasmTable; - var ret = table.length; - - // Grow the table - try { - table.grow(1); - } catch (err) { - if (!err instanceof RangeError) { - throw err; - } - throw 'Unable to grow wasm table. Use a higher value for RESERVED_FUNCTION_POINTERS or set ALLOW_TABLE_GROWTH.'; - } - - // Insert new element - try { - // Attempting to call this with JS function will cause of table.set() to fail - table.set(ret, func); - } catch (err) { - if (!err instanceof TypeError) { - throw err; - } - assert(typeof sig !== 'undefined', 'Missing signature argument to addFunction'); - var wrapped = convertJsFunctionToWasm(func, sig); - table.set(ret, wrapped); - } - - return ret; -} - -function removeFunctionWasm(index) { - // TODO(sbc): Look into implementing this to allow re-using of table slots -} - -// 'sig' parameter is required for the llvm backend but only when func is not -// already a WebAssembly function. +// 'sig' parameter is only used on LLVM wasm backend function addFunction(func, sig) { - - var base = 0; for (var i = base; i < base + 0; i++) { if (!functionPointers[i]) { @@ -443,11 +324,9 @@ function addFunction(func, sig) { } } throw 'Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.'; - } function removeFunction(index) { - functionPointers[index-jsCallStartIndex] = null; } @@ -493,18 +372,13 @@ function dynCall(sig, ptr, args) { } } -var tempRet0 = 0; - -var setTempRet0 = function(value) { - tempRet0 = value; -}; - -var getTempRet0 = function() { - return tempRet0; -}; var Runtime = { + // FIXME backwards compatibility layer for ports. Support some Runtime.* + // for now, fix it there, then remove it from here. That way we + // can minimize any period of breakage. + dynCall: dynCall, // for SDL2 port }; // The address globals begin at. Very low in memory, for code size and optimization opportunities. @@ -514,8 +388,6 @@ var Runtime = { var GLOBAL_BASE = 1024; - - // === Preamble library stuff === // Documentation for the public APIs defined in this file must be updated in: @@ -528,70 +400,11 @@ var GLOBAL_BASE = 1024; -if (typeof WebAssembly !== 'object') { - err('no native wasm support detected'); -} - - -// In MINIMAL_RUNTIME, setValue() and getValue() are only available when building with safe heap enabled, for heap safety checking. -// In traditional runtime, setValue() and getValue() are always available (although their use is highly discouraged due to perf penalties) - -/** @type {function(number, number, string, boolean=)} */ -function setValue(ptr, value, type, noSafe) { - type = type || 'i8'; - if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit - switch(type) { - case 'i1': HEAP8[((ptr)>>0)]=value; break; - case 'i8': HEAP8[((ptr)>>0)]=value; break; - case 'i16': HEAP16[((ptr)>>1)]=value; break; - case 'i32': HEAP32[((ptr)>>2)]=value; break; - case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((ptr)>>2)]=tempI64[0],HEAP32[(((ptr)+(4))>>2)]=tempI64[1]); break; - case 'float': HEAPF32[((ptr)>>2)]=value; break; - case 'double': HEAPF64[((ptr)>>3)]=value; break; - default: abort('invalid type for setValue: ' + type); - } -} - -/** @type {function(number, string, boolean=)} */ -function getValue(ptr, type, noSafe) { - type = type || 'i8'; - if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit - switch(type) { - case 'i1': return HEAP8[((ptr)>>0)]; - case 'i8': return HEAP8[((ptr)>>0)]; - case 'i16': return HEAP16[((ptr)>>1)]; - case 'i32': return HEAP32[((ptr)>>2)]; - case 'i64': return HEAP32[((ptr)>>2)]; - case 'float': return HEAPF32[((ptr)>>2)]; - case 'double': return HEAPF64[((ptr)>>3)]; - default: abort('invalid type for getValue: ' + type); - } - return null; -} - - - - - -// Wasm globals - -var wasmMemory; - -// Potentially used for direct table calls. -var wasmTable; - - //======================================== // Runtime essentials //======================================== -// whether we are quitting the application. no code should run after this. -// set in exit() and abort() -var ABORT = false; - -// set by exit() and abort(). Passed to 'onExit' handler. -// NOTE: This is also used as the process return code code in shell environments -// but only when noExitRuntime is false. +var ABORT = 0; // whether we are quitting the application. no code should run after this. set in exit() and abort() var EXITSTATUS = 0; /** @type {function(*, string=)} */ @@ -601,6 +414,8 @@ function assert(condition, text) { } } +var globalScope = this; + // Returns the C function with a specified identifier (for C++, you need to do manual name mangling) function getCFunc(ident) { var func = Module['_' + ident]; // closure exported function @@ -608,29 +423,44 @@ function getCFunc(ident) { return func; } +var JSfuncs = { + // Helpers for cwrap -- it can't refer to Runtime directly because it might + // be renamed by closure, instead it calls JSfuncs['stackSave'].body to find + // out what the minified function name is. + 'stackSave': function() { + stackSave() + }, + 'stackRestore': function() { + stackRestore() + }, + // type conversion from js to c + 'arrayToC' : function(arr) { + var ret = stackAlloc(arr.length); + writeArrayToMemory(arr, ret); + return ret; + }, + 'stringToC' : function(str) { + var ret = 0; + if (str !== null && str !== undefined && str !== 0) { // null string + // at most 4 bytes per UTF-8 code point, +1 for the trailing '\0' + var len = (str.length << 2) + 1; + ret = stackAlloc(len); + stringToUTF8(str, ret, len); + } + return ret; + } +}; + +// For fast lookup of conversion functions +var toC = { + 'string': JSfuncs['stringToC'], 'array': JSfuncs['arrayToC'] +}; + + // C calling interface. function ccall(ident, returnType, argTypes, args, opts) { - // For fast lookup of conversion functions - var toC = { - 'string': function(str) { - var ret = 0; - if (str !== null && str !== undefined && str !== 0) { // null string - // at most 4 bytes per UTF-8 code point, +1 for the trailing '\0' - var len = (str.length << 2) + 1; - ret = stackAlloc(len); - stringToUTF8(str, ret, len); - } - return ret; - }, - 'array': function(arr) { - var ret = stackAlloc(arr.length); - writeArrayToMemory(arr, ret); - return ret; - } - }; - function convertReturnValue(ret) { - if (returnType === 'string') return UTF8ToString(ret); + if (returnType === 'string') return Pointer_stringify(ret); if (returnType === 'boolean') return Boolean(ret); return ret; } @@ -669,10 +499,44 @@ function cwrap(ident, returnType, argTypes, opts) { } } +/** @type {function(number, number, string, boolean=)} */ +function setValue(ptr, value, type, noSafe) { + type = type || 'i8'; + if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit + switch(type) { + case 'i1': HEAP8[((ptr)>>0)]=value; break; + case 'i8': HEAP8[((ptr)>>0)]=value; break; + case 'i16': HEAP16[((ptr)>>1)]=value; break; + case 'i32': HEAP32[((ptr)>>2)]=value; break; + case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((ptr)>>2)]=tempI64[0],HEAP32[(((ptr)+(4))>>2)]=tempI64[1]); break; + case 'float': HEAPF32[((ptr)>>2)]=value; break; + case 'double': HEAPF64[((ptr)>>3)]=value; break; + default: abort('invalid type for setValue: ' + type); + } +} + +/** @type {function(number, string, boolean=)} */ +function getValue(ptr, type, noSafe) { + type = type || 'i8'; + if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit + switch(type) { + case 'i1': return HEAP8[((ptr)>>0)]; + case 'i8': return HEAP8[((ptr)>>0)]; + case 'i16': return HEAP16[((ptr)>>1)]; + case 'i32': return HEAP32[((ptr)>>2)]; + case 'i64': return HEAP32[((ptr)>>2)]; + case 'float': return HEAPF32[((ptr)>>2)]; + case 'double': return HEAPF64[((ptr)>>3)]; + default: abort('invalid type for getValue: ' + type); + } + return null; +} + var ALLOC_NORMAL = 0; // Tries to use _malloc() var ALLOC_STACK = 1; // Lives for the duration of the current function call -var ALLOC_DYNAMIC = 2; // Cannot be freed except through sbrk -var ALLOC_NONE = 3; // Do not allocate +var ALLOC_STATIC = 2; // Cannot be freed +var ALLOC_DYNAMIC = 3; // Cannot be freed except through sbrk +var ALLOC_NONE = 4; // Do not allocate // allocate(): This is for internal use. You can use it yourself as well, but the interface // is a little tricky (see docs right below). The reason is that it is optimized @@ -704,9 +568,7 @@ function allocate(slab, types, allocator, ptr) { if (allocator == ALLOC_NONE) { ret = ptr; } else { - ret = [_malloc, - stackAlloc, - dynamicAlloc][allocator](Math.max(size, singleType ? 1 : types.length)); + ret = [typeof _malloc === 'function' ? _malloc : staticAlloc, stackAlloc, staticAlloc, dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length)); } if (zeroinit) { @@ -760,16 +622,41 @@ function allocate(slab, types, allocator, ptr) { // Allocate memory during any stage of startup - static memory early on, dynamic memory later, malloc when ready function getMemory(size) { + if (!staticSealed) return staticAlloc(size); if (!runtimeInitialized) return dynamicAlloc(size); return _malloc(size); } - - - /** @type {function(number, number=)} */ function Pointer_stringify(ptr, length) { - abort("this function has been removed - you should use UTF8ToString(ptr, maxBytesToRead) instead!"); + if (length === 0 || !ptr) return ''; + // Find the length, and check for UTF while doing so + var hasUtf = 0; + var t; + var i = 0; + while (1) { + t = HEAPU8[(((ptr)+(i))>>0)]; + hasUtf |= t; + if (t == 0 && !length) break; + i++; + if (length && i == length) break; + } + if (!length) length = i; + + var ret = ''; + + if (hasUtf < 128) { + var MAX_CHUNK = 1024; // split up into chunks, because .apply on a huge string can overflow the stack + var curr; + while (length > 0) { + curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK))); + ret = ret ? ret + curr : curr; + ptr += MAX_CHUNK; + length -= MAX_CHUNK; + } + return ret; + } + return UTF8ToString(ptr); } // Given a pointer 'ptr' to a null-terminated ASCII-encoded string in the emscripten HEAP, returns @@ -778,7 +665,7 @@ function Pointer_stringify(ptr, length) { function AsciiToString(ptr) { var str = ''; while (1) { - var ch = HEAPU8[((ptr++)>>0)]; + var ch = HEAP8[((ptr++)>>0)]; if (!ch) return str; str += String.fromCharCode(ch); } @@ -791,46 +678,46 @@ function stringToAscii(str, outPtr) { return writeAsciiToMemory(str, outPtr, false); } - // Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the given array that contains uint8 values, returns // a copy of that string as a Javascript String object. var UTF8Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined; - -/** - * @param {number} idx - * @param {number=} maxBytesToRead - * @return {string} - */ -function UTF8ArrayToString(u8Array, idx, maxBytesToRead) { - var endIdx = idx + maxBytesToRead; +function UTF8ArrayToString(u8Array, idx) { var endPtr = idx; // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. - // (As a tiny code save trick, compare endPtr against endIdx using a negation, so that undefined means Infinity) - while (u8Array[endPtr] && !(endPtr >= endIdx)) ++endPtr; + while (u8Array[endPtr]) ++endPtr; if (endPtr - idx > 16 && u8Array.subarray && UTF8Decoder) { return UTF8Decoder.decode(u8Array.subarray(idx, endPtr)); } else { + var u0, u1, u2, u3, u4, u5; + var str = ''; - // If building with TextDecoder, we have already computed the string length above, so test loop end condition against that - while (idx < endPtr) { - // For UTF8 byte structure, see: - // http://en.wikipedia.org/wiki/UTF-8#Description - // https://www.ietf.org/rfc/rfc2279.txt - // https://tools.ietf.org/html/rfc3629 - var u0 = u8Array[idx++]; + while (1) { + // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629 + u0 = u8Array[idx++]; + if (!u0) return str; if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } - var u1 = u8Array[idx++] & 63; + u1 = u8Array[idx++] & 63; if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } - var u2 = u8Array[idx++] & 63; + u2 = u8Array[idx++] & 63; if ((u0 & 0xF0) == 0xE0) { u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; } else { - u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (u8Array[idx++] & 63); + u3 = u8Array[idx++] & 63; + if ((u0 & 0xF8) == 0xF0) { + u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | u3; + } else { + u4 = u8Array[idx++] & 63; + if ((u0 & 0xFC) == 0xF8) { + u0 = ((u0 & 3) << 24) | (u1 << 18) | (u2 << 12) | (u3 << 6) | u4; + } else { + u5 = u8Array[idx++] & 63; + u0 = ((u0 & 1) << 30) | (u1 << 24) | (u2 << 18) | (u3 << 12) | (u4 << 6) | u5; + } + } } - if (u0 < 0x10000) { str += String.fromCharCode(u0); } else { @@ -839,26 +726,13 @@ function UTF8ArrayToString(u8Array, idx, maxBytesToRead) { } } } - return str; } -// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the emscripten HEAP, returns a -// copy of that string as a Javascript String object. -// maxBytesToRead: an optional length that specifies the maximum number of bytes to read. You can omit -// this parameter to scan the string until the first \0 byte. If maxBytesToRead is -// passed, and the string at [ptr, ptr+maxBytesToReadr[ contains a null byte in the -// middle, then the string will cut short at that byte index (i.e. maxBytesToRead will -// not produce a string of exact length [ptr, ptr+maxBytesToRead[) -// N.B. mixing frequent uses of UTF8ToString() with and without maxBytesToRead may -// throw JS JIT optimizations off, so it is worth to consider consistently using one -// style or the other. -/** - * @param {number} ptr - * @param {number=} maxBytesToRead - * @return {string} - */ -function UTF8ToString(ptr, maxBytesToRead) { - return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; +// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the emscripten HEAP, returns +// a copy of that string as a Javascript String object. + +function UTF8ToString(ptr) { + return UTF8ArrayToString(HEAPU8,ptr); } // Copies the given Javascript String object 'str' to the given byte array at address 'outIdx', @@ -901,12 +775,27 @@ function stringToUTF8Array(str, outU8Array, outIdx, maxBytesToWrite) { outU8Array[outIdx++] = 0xE0 | (u >> 12); outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63); outU8Array[outIdx++] = 0x80 | (u & 63); - } else { + } else if (u <= 0x1FFFFF) { if (outIdx + 3 >= endIdx) break; outU8Array[outIdx++] = 0xF0 | (u >> 18); outU8Array[outIdx++] = 0x80 | ((u >> 12) & 63); outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63); outU8Array[outIdx++] = 0x80 | (u & 63); + } else if (u <= 0x3FFFFFF) { + if (outIdx + 4 >= endIdx) break; + outU8Array[outIdx++] = 0xF8 | (u >> 24); + outU8Array[outIdx++] = 0x80 | ((u >> 18) & 63); + outU8Array[outIdx++] = 0x80 | ((u >> 12) & 63); + outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63); + outU8Array[outIdx++] = 0x80 | (u & 63); + } else { + if (outIdx + 5 >= endIdx) break; + outU8Array[outIdx++] = 0xFC | (u >> 30); + outU8Array[outIdx++] = 0x80 | ((u >> 24) & 63); + outU8Array[outIdx++] = 0x80 | ((u >> 18) & 63); + outU8Array[outIdx++] = 0x80 | ((u >> 12) & 63); + outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63); + outU8Array[outIdx++] = 0x80 | (u & 63); } } // Null-terminate the pointer to the buffer. @@ -924,6 +813,7 @@ function stringToUTF8(str, outPtr, maxBytesToWrite) { } // Returns the number of bytes the given Javascript string takes if encoded as a UTF8 byte array, EXCLUDING the null terminator byte. + function lengthBytesUTF8(str) { var len = 0; for (var i = 0; i < str.length; ++i) { @@ -931,15 +821,23 @@ function lengthBytesUTF8(str) { // See http://unicode.org/faq/utf_bom.html#utf16-3 var u = str.charCodeAt(i); // possibly a lead surrogate if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF); - if (u <= 0x7F) ++len; - else if (u <= 0x7FF) len += 2; - else if (u <= 0xFFFF) len += 3; - else len += 4; + if (u <= 0x7F) { + ++len; + } else if (u <= 0x7FF) { + len += 2; + } else if (u <= 0xFFFF) { + len += 3; + } else if (u <= 0x1FFFFF) { + len += 4; + } else if (u <= 0x3FFFFFF) { + len += 5; + } else { + len += 6; + } } return len; } - // Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns // a copy of that string as a Javascript String object. @@ -1093,42 +991,6 @@ function allocateUTF8OnStack(str) { return ret; } -// Deprecated: This function should not be called because it is unsafe and does not provide -// a maximum length limit of how many bytes it is allowed to write. Prefer calling the -// function stringToUTF8Array() instead, which takes in a maximum length that can be used -// to be secure from out of bounds writes. -/** @deprecated */ -function writeStringToMemory(string, buffer, dontAddNull) { - warnOnce('writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!'); - - var /** @type {number} */ lastChar, /** @type {number} */ end; - if (dontAddNull) { - // stringToUTF8Array always appends null. If we don't want to do that, remember the - // character that existed at the location where the null will be placed, and restore - // that after the write (below). - end = buffer + lengthBytesUTF8(string); - lastChar = HEAP8[end]; - } - stringToUTF8(string, buffer, Infinity); - if (dontAddNull) HEAP8[end] = lastChar; // Restore the value under the null character. -} - -function writeArrayToMemory(array, buffer) { - HEAP8.set(array, buffer); -} - -function writeAsciiToMemory(str, buffer, dontAddNull) { - for (var i = 0; i < str.length; ++i) { - HEAP8[((buffer++)>>0)]=str.charCodeAt(i); - } - // Null-terminate the pointer to the HEAP. - if (!dontAddNull) HEAP8[((buffer)>>0)]=0; -} - - - - - function demangle(func) { return func; } @@ -1139,7 +1001,7 @@ function demangleAll(text) { return text.replace(regex, function(x) { var y = demangle(x); - return x === y ? x : (y + ' [' + x + ']'); + return x === y ? x : (x + ' [' + y + ']'); }); } @@ -1166,13 +1028,12 @@ function stackTrace() { return demangleAll(js); } - - // Memory management var PAGE_SIZE = 16384; var WASM_PAGE_SIZE = 65536; var ASMJS_PAGE_SIZE = 16777216; +var MIN_TOTAL_MEMORY = 16777216; function alignUp(x, multiple) { if (x % multiple > 0) { @@ -1201,6 +1062,10 @@ var HEAP, /** @type {Float64Array} */ HEAPF64; +function updateGlobalBuffer(buf) { + Module['buffer'] = buffer = buf; +} + function updateGlobalBufferViews() { Module['HEAP8'] = HEAP8 = new Int8Array(buffer); Module['HEAP16'] = HEAP16 = new Int16Array(buffer); @@ -1212,53 +1077,116 @@ function updateGlobalBufferViews() { Module['HEAPF64'] = HEAPF64 = new Float64Array(buffer); } +var STATIC_BASE, STATICTOP, staticSealed; // static area +var STACK_BASE, STACKTOP, STACK_MAX; // stack area +var DYNAMIC_BASE, DYNAMICTOP_PTR; // dynamic area handled by sbrk -var STATIC_BASE = 1024, - STACK_BASE = 127296, - STACKTOP = STACK_BASE, - STACK_MAX = 5370176, - DYNAMIC_BASE = 5370176, - DYNAMICTOP_PTR = 127264; + STATIC_BASE = STATICTOP = STACK_BASE = STACKTOP = STACK_MAX = DYNAMIC_BASE = DYNAMICTOP_PTR = 0; + staticSealed = false; -var TOTAL_STACK = 5242880; +function abortOnCannotGrowMemory() { + abort('Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value ' + TOTAL_MEMORY + ', (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 '); +} -var INITIAL_TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 134217728; -if (INITIAL_TOTAL_MEMORY < TOTAL_STACK) err('TOTAL_MEMORY should be larger than TOTAL_STACK, was ' + INITIAL_TOTAL_MEMORY + '! (TOTAL_STACK=' + TOTAL_STACK + ')'); +if (!Module['reallocBuffer']) Module['reallocBuffer'] = function(size) { + var ret; + try { + if (ArrayBuffer.transfer) { + ret = ArrayBuffer.transfer(buffer, size); + } else { + var oldHEAP8 = HEAP8; + ret = new ArrayBuffer(size); + var temp = new Int8Array(ret); + temp.set(oldHEAP8); + } + } catch(e) { + return false; + } + var success = _emscripten_replace_memory(ret); + if (!success) return false; + return ret; +}; + +function enlargeMemory() { + // TOTAL_MEMORY is the current size of the actual array, and DYNAMICTOP is the new top. + + + var PAGE_MULTIPLE = Module["usingWasm"] ? WASM_PAGE_SIZE : ASMJS_PAGE_SIZE; // In wasm, heap size must be a multiple of 64KB. In asm.js, they need to be multiples of 16MB. + var LIMIT = 2147483648 - PAGE_MULTIPLE; // We can do one page short of 2GB as theoretical maximum. + + if (HEAP32[DYNAMICTOP_PTR>>2] > LIMIT) { + return false; + } + + var OLD_TOTAL_MEMORY = TOTAL_MEMORY; + TOTAL_MEMORY = Math.max(TOTAL_MEMORY, MIN_TOTAL_MEMORY); // So the loop below will not be infinite, and minimum asm.js memory size is 16MB. + + while (TOTAL_MEMORY < HEAP32[DYNAMICTOP_PTR>>2]) { // Keep incrementing the heap size as long as it's less than what is requested. + if (TOTAL_MEMORY <= 536870912) { + TOTAL_MEMORY = alignUp(2 * TOTAL_MEMORY, PAGE_MULTIPLE); // Simple heuristic: double until 1GB... + } else { + // ..., but after that, add smaller increments towards 2GB, which we cannot reach + TOTAL_MEMORY = Math.min(alignUp((3 * TOTAL_MEMORY + 2147483648) / 4, PAGE_MULTIPLE), LIMIT); + } + } + + + var replacement = Module['reallocBuffer'](TOTAL_MEMORY); + if (!replacement || replacement.byteLength != TOTAL_MEMORY) { + // restore the state to before this call, we failed + TOTAL_MEMORY = OLD_TOTAL_MEMORY; + return false; + } + + // everything worked + + updateGlobalBuffer(replacement); + updateGlobalBufferViews(); + + + + return true; +} + +var byteLength; +try { + byteLength = Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, 'byteLength').get); + byteLength(new ArrayBuffer(4)); // can fail on older ie +} catch(e) { // can fail on older node/v8 + byteLength = function(buffer) { return buffer.byteLength; }; +} + +var TOTAL_STACK = Module['TOTAL_STACK'] || 5242880; +var TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 536870912; +if (TOTAL_MEMORY < TOTAL_STACK) err('TOTAL_MEMORY should be larger than TOTAL_STACK, was ' + TOTAL_MEMORY + '! (TOTAL_STACK=' + TOTAL_STACK + ')'); // Initialize the runtime's memory - - - - if (Module['wasmMemory']) { - wasmMemory = Module['wasmMemory']; - } else { - wasmMemory = new WebAssembly.Memory({ - 'initial': INITIAL_TOTAL_MEMORY / WASM_PAGE_SIZE - }); +// Use a provided buffer, if there is one, or else allocate a new one +if (Module['buffer']) { + buffer = Module['buffer']; +} else { + // Use a WebAssembly memory where available + if (typeof WebAssembly === 'object' && typeof WebAssembly.Memory === 'function') { + Module['wasmMemory'] = new WebAssembly.Memory({ 'initial': TOTAL_MEMORY / WASM_PAGE_SIZE }); + buffer = Module['wasmMemory'].buffer; + } else + { + buffer = new ArrayBuffer(TOTAL_MEMORY); } - - -if (wasmMemory) { - buffer = wasmMemory.buffer; + Module['buffer'] = buffer; } - -// If the user provides an incorrect length, just use that length instead rather than providing the user to -// specifically provide the memory length with Module['TOTAL_MEMORY']. -INITIAL_TOTAL_MEMORY = buffer.byteLength; updateGlobalBufferViews(); -HEAP32[DYNAMICTOP_PTR>>2] = DYNAMIC_BASE; - - - - +function getTotalMemory() { + return TOTAL_MEMORY; +} // Endianness check (note: assumes compiler arch was little-endian) @@ -1303,18 +1231,18 @@ function preRun() { callRuntimeCallbacks(__ATPRERUN__); } -function initRuntime() { +function ensureInitRuntime() { + if (runtimeInitialized) return; runtimeInitialized = true; - callRuntimeCallbacks(__ATINIT__); } function preMain() { - callRuntimeCallbacks(__ATMAIN__); } function exitRuntime() { + callRuntimeCallbacks(__ATEXIT__); runtimeExited = true; } @@ -1342,12 +1270,45 @@ function addOnPreMain(cb) { } function addOnExit(cb) { + __ATEXIT__.unshift(cb); } function addOnPostRun(cb) { __ATPOSTRUN__.unshift(cb); } +// Deprecated: This function should not be called because it is unsafe and does not provide +// a maximum length limit of how many bytes it is allowed to write. Prefer calling the +// function stringToUTF8Array() instead, which takes in a maximum length that can be used +// to be secure from out of bounds writes. +/** @deprecated */ +function writeStringToMemory(string, buffer, dontAddNull) { + warnOnce('writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!'); + + var /** @type {number} */ lastChar, /** @type {number} */ end; + if (dontAddNull) { + // stringToUTF8Array always appends null. If we don't want to do that, remember the + // character that existed at the location where the null will be placed, and restore + // that after the write (below). + end = buffer + lengthBytesUTF8(string); + lastChar = HEAP8[end]; + } + stringToUTF8(string, buffer, Infinity); + if (dontAddNull) HEAP8[end] = lastChar; // Restore the value under the null character. +} + +function writeArrayToMemory(array, buffer) { + HEAP8.set(array, buffer); +} + +function writeAsciiToMemory(str, buffer, dontAddNull) { + for (var i = 0; i < str.length; ++i) { + HEAP8[((buffer++)>>0)]=str.charCodeAt(i); + } + // Null-terminate the pointer to the HEAP. + if (!dontAddNull) HEAP8[((buffer)>>0)]=0; +} + function unSign(value, bits, ignore) { if (value >= 0) { return value; @@ -1370,7 +1331,6 @@ function reSign(value, bits, ignore) { } - var Math_abs = Math.abs; var Math_cos = Math.cos; var Math_sin = Math.sin; @@ -1393,12 +1353,10 @@ var Math_max = Math.max; var Math_clz32 = Math.clz32; var Math_trunc = Math.trunc; - - // A counter of dependencies for calling run(). If we need to // do asynchronous work before running, increment this and // decrement it. Incrementing must happen in a place like -// Module.preRun (used by emcc to add file preloading). +// PRE_RUN_ADDITIONS (used by emcc to add file preloading). // Note that you can add dependencies in preRun, even though // it happens right before run - run will be postponed until // the dependencies are met. @@ -1439,6 +1397,7 @@ Module["preloadedImages"] = {}; // maps url to image data Module["preloadedAudios"] = {}; // maps url to audio data + var memoryInitializer = null; @@ -1446,11 +1405,6 @@ var memoryInitializer = null; -// Copyright 2017 The Emscripten Authors. All rights reserved. -// Emscripten is available under two separate licenses, the MIT license and the -// University of Illinois/NCSA Open Source License. Both these licenses can be -// found in the LICENSE file. - // Prefix of data URIs emitted by SINGLE_FILE and related options. var dataURIPrefix = 'data:application/octet-stream;base64,'; @@ -1464,162 +1418,276 @@ function isDataURI(filename) { -var wasmBinaryFile = 'MpqCmp.wasm'; -if (!isDataURI(wasmBinaryFile)) { - wasmBinaryFile = locateFile(wasmBinaryFile); -} +function integrateWasmJS() { + // wasm.js has several methods for creating the compiled code module here: + // * 'native-wasm' : use native WebAssembly support in the browser + // * 'interpret-s-expr': load s-expression code from a .wast and interpret + // * 'interpret-binary': load binary wasm and interpret + // * 'interpret-asm2wasm': load asm.js code, translate to wasm, and interpret + // * 'asmjs': no wasm, just load the asm.js code and use that (good for testing) + // The method is set at compile time (BINARYEN_METHOD) + // The method can be a comma-separated list, in which case, we will try the + // options one by one. Some of them can fail gracefully, and then we can try + // the next. -function getBinary() { - try { - if (Module['wasmBinary']) { - return new Uint8Array(Module['wasmBinary']); - } - if (readBinary) { - return readBinary(wasmBinaryFile); - } else { - throw "both async and sync fetching of the wasm failed"; - } - } - catch (err) { - abort(err); - } -} + // inputs -function getBinaryPromise() { - // if we don't have the binary yet, and have the Fetch api, use that - // in some environments, like Electron's render process, Fetch api may be present, but have a different context than expected, let's only use it on the Web - if (!Module['wasmBinary'] && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) && typeof fetch === 'function') { - return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) { - if (!response['ok']) { - throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + var method = 'native-wasm'; + + var wasmTextFile = 'MpqCmp.wast'; + var wasmBinaryFile = 'MpqCmp.wasm'; + var asmjsCodeFile = 'MpqCmp.temp.asm.js'; + + if (!isDataURI(wasmTextFile)) { + wasmTextFile = locateFile(wasmTextFile); + } + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + if (!isDataURI(asmjsCodeFile)) { + asmjsCodeFile = locateFile(asmjsCodeFile); + } + + // utilities + + var wasmPageSize = 64*1024; + + var info = { + 'global': null, + 'env': null, + 'asm2wasm': asm2wasmImports, + 'parent': Module // Module inside wasm-js.cpp refers to wasm-js.cpp; this allows access to the outside program. + }; + + var exports = null; + + + function mergeMemory(newBuffer) { + // The wasm instance creates its memory. But static init code might have written to + // buffer already, including the mem init file, and we must copy it over in a proper merge. + // TODO: avoid this copy, by avoiding such static init writes + // TODO: in shorter term, just copy up to the last static init write + var oldBuffer = Module['buffer']; + if (newBuffer.byteLength < oldBuffer.byteLength) { + err('the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here'); + } + var oldView = new Int8Array(oldBuffer); + var newView = new Int8Array(newBuffer); + + + newView.set(oldView); + updateGlobalBuffer(newBuffer); + updateGlobalBufferViews(); + } + + function fixImports(imports) { + return imports; + } + + function getBinary() { + try { + if (Module['wasmBinary']) { + return new Uint8Array(Module['wasmBinary']); } - return response['arrayBuffer'](); - }).catch(function () { - return getBinary(); + if (Module['readBinary']) { + return Module['readBinary'](wasmBinaryFile); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } + catch (err) { + abort(err); + } + } + + function getBinaryPromise() { + // if we don't have the binary yet, and have the Fetch api, use that + // in some environments, like Electron's render process, Fetch api may be present, but have a different context than expected, let's only use it on the Web + if (!Module['wasmBinary'] && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) && typeof fetch === 'function') { + return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) { + if (!response['ok']) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response['arrayBuffer'](); + }).catch(function () { + return getBinary(); + }); + } + // Otherwise, getBinary should be able to get it synchronously + return new Promise(function(resolve, reject) { + resolve(getBinary()); }); } - // Otherwise, getBinary should be able to get it synchronously - return new Promise(function(resolve, reject) { - resolve(getBinary()); - }); -} + + // do-method functions - -// Create the wasm instance. -// Receives the wasm imports, returns the exports. -function createWasm(env) { - - // prepare imports - var info = { - 'env': env - , - 'global': { + function doNativeWasm(global, env, providedBuffer) { + if (typeof WebAssembly !== 'object') { + err('no native wasm support detected'); + return false; + } + // prepare memory import + if (!(Module['wasmMemory'] instanceof WebAssembly.Memory)) { + err('no native wasm Memory in use'); + return false; + } + env['memory'] = Module['wasmMemory']; + // Load the wasm module and create an instance of using native support in the JS engine. + info['global'] = { 'NaN': NaN, 'Infinity': Infinity - }, - 'global.Math': Math, - 'asm2wasm': asm2wasmImports - }; - // Load the wasm module and create an instance of using native support in the JS engine. - // handle a generated wasm instance, receiving its exports and - // performing other necessary setup - function receiveInstance(instance, module) { - var exports = instance.exports; - Module['asm'] = exports; - removeRunDependency('wasm-instantiate'); - } - addRunDependency('wasm-instantiate'); + }; + info['global.Math'] = Math; + info['env'] = env; + // handle a generated wasm instance, receiving its exports and + // performing other necessary setup + function receiveInstance(instance, module) { + exports = instance.exports; + if (exports.memory) mergeMemory(exports.memory); + Module['asm'] = exports; + Module["usingWasm"] = true; + removeRunDependency('wasm-instantiate'); + } + addRunDependency('wasm-instantiate'); + // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback + // to manually instantiate the Wasm module themselves. This allows pages to run the instantiation parallel + // to any other async startup actions they are performing. + if (Module['instantiateWasm']) { + try { + return Module['instantiateWasm'](info, receiveInstance); + } catch(e) { + err('Module.instantiateWasm callback failed with error: ' + e); + return false; + } + } - function receiveInstantiatedSource(output) { - // 'output' is a WebAssemblyInstantiatedSource object which has both the module and instance. - // receiveInstance() will swap in the exports (to Module.asm) so they can be called - // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line. - // When the regression is fixed, can restore the above USE_PTHREADS-enabled path. - receiveInstance(output['instance']); - } - - - function instantiateArrayBuffer(receiver) { - return getBinaryPromise().then(function(binary) { - return WebAssembly.instantiate(binary, info); - }).then(receiver, function(reason) { - err('failed to asynchronously prepare wasm: ' + reason); - abort(reason); - }); - } - - // Prefer streaming instantiation if available. - function instantiateAsync() { + function receiveInstantiatedSource(output) { + // 'output' is a WebAssemblyInstantiatedSource object which has both the module and instance. + // receiveInstance() will swap in the exports (to Module.asm) so they can be called + receiveInstance(output['instance'], output['module']); + } + function instantiateArrayBuffer(receiver) { + getBinaryPromise().then(function(binary) { + return WebAssembly.instantiate(binary, info); + }).then(receiver).catch(function(reason) { + err('failed to asynchronously prepare wasm: ' + reason); + abort(reason); + }); + } + // Prefer streaming instantiation if available. if (!Module['wasmBinary'] && typeof WebAssembly.instantiateStreaming === 'function' && !isDataURI(wasmBinaryFile) && typeof fetch === 'function') { - fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function (response) { - return WebAssembly.instantiateStreaming(response, info) - .then(receiveInstantiatedSource, function(reason) { - // We expect the most common failure cause to be a bad MIME type for the binary, - // in which case falling back to ArrayBuffer instantiation should work. - err('wasm streaming compile failed: ' + reason); - err('falling back to ArrayBuffer instantiation'); - instantiateArrayBuffer(receiveInstantiatedSource); - }); - }); + WebAssembly.instantiateStreaming(fetch(wasmBinaryFile, { credentials: 'same-origin' }), info) + .then(receiveInstantiatedSource) + .catch(function(reason) { + // We expect the most common failure cause to be a bad MIME type for the binary, + // in which case falling back to ArrayBuffer instantiation should work. + err('wasm streaming compile failed: ' + reason); + err('falling back to ArrayBuffer instantiation'); + instantiateArrayBuffer(receiveInstantiatedSource); + }); } else { - return instantiateArrayBuffer(receiveInstantiatedSource); - } - } - // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback - // to manually instantiate the Wasm module themselves. This allows pages to run the instantiation parallel - // to any other async startup actions they are performing. - if (Module['instantiateWasm']) { - try { - var exports = Module['instantiateWasm'](info, receiveInstance); - return exports; - } catch(e) { - err('Module.instantiateWasm callback failed with error: ' + e); - return false; + instantiateArrayBuffer(receiveInstantiatedSource); } + return {}; // no exports yet; we'll fill them in later } - instantiateAsync(); - return {}; // no exports yet; we'll fill them in later + + // We may have a preloaded value in Module.asm, save it + Module['asmPreload'] = Module['asm']; + + // Memory growth integration code + + var asmjsReallocBuffer = Module['reallocBuffer']; + + var wasmReallocBuffer = function(size) { + var PAGE_MULTIPLE = Module["usingWasm"] ? WASM_PAGE_SIZE : ASMJS_PAGE_SIZE; // In wasm, heap size must be a multiple of 64KB. In asm.js, they need to be multiples of 16MB. + size = alignUp(size, PAGE_MULTIPLE); // round up to wasm page size + var old = Module['buffer']; + var oldSize = old.byteLength; + if (Module["usingWasm"]) { + // native wasm support + try { + var result = Module['wasmMemory'].grow((size - oldSize) / wasmPageSize); // .grow() takes a delta compared to the previous size + if (result !== (-1 | 0)) { + // success in native wasm memory growth, get the buffer from the memory + return Module['buffer'] = Module['wasmMemory'].buffer; + } else { + return null; + } + } catch(e) { + return null; + } + } + }; + + Module['reallocBuffer'] = function(size) { + if (finalMethod === 'asmjs') { + return asmjsReallocBuffer(size); + } else { + return wasmReallocBuffer(size); + } + }; + + // we may try more than one; this is the final one, that worked and we are using + var finalMethod = ''; + + // Provide an "asm.js function" for the application, called to "link" the asm.js module. We instantiate + // the wasm module at that time, and it receives imports and provides exports and so forth, the app + // doesn't need to care that it is wasm or olyfilled wasm or asm.js. + + Module['asm'] = function(global, env, providedBuffer) { + env = fixImports(env); + + // import table + if (!env['table']) { + var TABLE_SIZE = Module['wasmTableSize']; + if (TABLE_SIZE === undefined) TABLE_SIZE = 1024; // works in binaryen interpreter at least + var MAX_TABLE_SIZE = Module['wasmMaxTableSize']; + if (typeof WebAssembly === 'object' && typeof WebAssembly.Table === 'function') { + if (MAX_TABLE_SIZE !== undefined) { + env['table'] = new WebAssembly.Table({ 'initial': TABLE_SIZE, 'maximum': MAX_TABLE_SIZE, 'element': 'anyfunc' }); + } else { + env['table'] = new WebAssembly.Table({ 'initial': TABLE_SIZE, element: 'anyfunc' }); + } + } else { + env['table'] = new Array(TABLE_SIZE); // works in binaryen interpreter at least + } + Module['wasmTable'] = env['table']; + } + + if (!env['memoryBase']) { + env['memoryBase'] = Module['STATIC_BASE']; // tell the memory segments where to place themselves + } + if (!env['tableBase']) { + env['tableBase'] = 0; // table starts at 0 by default, in dynamic linking this will change + } + + // try the methods. each should return the exports if it succeeded + + var exports; + exports = doNativeWasm(global, env, providedBuffer); + + assert(exports, 'no binaryen method succeeded.'); + + + return exports; + }; + + var methodHandler = Module['asm']; // note our method handler, as we may modify Module['asm'] later } -// Provide an "asm.js function" for the application, called to "link" the asm.js module. We instantiate -// the wasm module at that time, and it receives imports and provides exports and so forth, the app -// doesn't need to care that it is wasm or asm.js. - -Module['asm'] = function(global, env, providedBuffer) { - // memory was already allocated (so js could use the buffer) - env['memory'] = wasmMemory - ; - // import table - env['table'] = wasmTable = new WebAssembly.Table({ - 'initial': 402, - 'maximum': 402, - 'element': 'anyfunc' - }); - // With the wasm backend __memory_base and __table_base and only needed for - // relocatable output. - env['__memory_base'] = 1024; // tell the memory segments where to place themselves - // table starts at 0 by default (even in dynamic linking, for the main module) - env['__table_base'] = 0; - - var exports = createWasm(env); - return exports; -}; - -// Globals used by JS i64 conversions -var tempDouble; -var tempI64; +integrateWasmJS(); // === Body === var ASM_CONSTS = []; -function _do_error(err){ var end = HEAPU8.indexOf( 0, err ); var text = String.fromCharCode.apply(null, HEAPU8.subarray( err, end )); self.DApi.exit_error( text ); } +function _do_error(err){ var end = HEAPU8.indexOf(0, err); var text = String.fromCharCode.apply(null, HEAPU8.subarray(err, end)); self.DApi.exit_error(text); } function _do_progress(done,total){ self.DApi.progress(done, total); } function _get_file_contents(ptr,offset,size){ self.DApi.get_file_contents(HEAPU8.subarray(ptr, ptr + size), offset); } function _put_file_contents(ptr,offset,size){ self.DApi.put_file_contents(HEAPU8.subarray(ptr, ptr + size), offset); } @@ -1627,8 +1695,10 @@ function _put_file_size(size){ self.DApi.put_file_size(size); } -// STATICTOP = STATIC_BASE + 126272; -/* global initializers */ /*__ATINIT__.push();*/ +STATIC_BASE = GLOBAL_BASE; + +STATICTOP = STATIC_BASE + 113200; +/* global initializers */ __ATINIT__.push(); @@ -1636,123 +1706,118 @@ function _put_file_size(size){ self.DApi.put_file_size(size); } +var STATIC_BUMP = 113200; +Module["STATIC_BASE"] = STATIC_BASE; +Module["STATIC_BUMP"] = STATIC_BUMP; /* no memory initializer */ -var tempDoublePtr = 127280 +var tempDoublePtr = STATICTOP; STATICTOP += 16; function copyTempFloat(ptr) { // functions, because inlining this code increases code size too much + HEAP8[tempDoublePtr] = HEAP8[ptr]; + HEAP8[tempDoublePtr+1] = HEAP8[ptr+1]; + HEAP8[tempDoublePtr+2] = HEAP8[ptr+2]; + HEAP8[tempDoublePtr+3] = HEAP8[ptr+3]; + } function copyTempDouble(ptr) { + HEAP8[tempDoublePtr] = HEAP8[ptr]; + HEAP8[tempDoublePtr+1] = HEAP8[ptr+1]; + HEAP8[tempDoublePtr+2] = HEAP8[ptr+2]; + HEAP8[tempDoublePtr+3] = HEAP8[ptr+3]; + HEAP8[tempDoublePtr+4] = HEAP8[ptr+4]; + HEAP8[tempDoublePtr+5] = HEAP8[ptr+5]; + HEAP8[tempDoublePtr+6] = HEAP8[ptr+6]; + HEAP8[tempDoublePtr+7] = HEAP8[ptr+7]; + } // {{PRE_LIBRARY}} function ___assert_fail(condition, filename, line, func) { - abort('Assertion failed: ' + UTF8ToString(condition) + ', at: ' + [filename ? UTF8ToString(filename) : 'unknown filename', line, func ? UTF8ToString(func) : 'unknown function']); + abort('Assertion failed: ' + Pointer_stringify(condition) + ', at: ' + [filename ? Pointer_stringify(filename) : 'unknown filename', line, func ? Pointer_stringify(func) : 'unknown function']); } function ___cxa_allocate_exception(size) { return _malloc(size); } - - var ___exception_infos={}; - - var ___exception_caught= []; - - function ___exception_addRef(ptr) { - if (!ptr) return; - var info = ___exception_infos[ptr]; - info.refcount++; - } - - function ___exception_deAdjust(adjusted) { - if (!adjusted || ___exception_infos[adjusted]) return adjusted; - for (var key in ___exception_infos) { - var ptr = +key; // the iteration key is a string, and if we throw this, it must be an integer as that is what we look for - var adj = ___exception_infos[ptr].adjusted; - var len = adj.length; - for (var i = 0; i < len; i++) { - if (adj[i] === adjusted) { - return ptr; - } + function ___cxa_find_matching_catch_2() { + return ___cxa_find_matching_catch.apply(null, arguments); } - } - return adjusted; - }function ___cxa_begin_catch(ptr) { - var info = ___exception_infos[ptr]; - if (info && !info.caught) { - info.caught = true; - __ZSt18uncaught_exceptionv.uncaught_exceptions--; - } - if (info) info.rethrown = false; - ___exception_caught.push(ptr); - ___exception_addRef(___exception_deAdjust(ptr)); - return ptr; - } - - var ___exception_last=0; - - function ___cxa_free_exception(ptr) { try { return _free(ptr); - } catch(e) { - } - }function ___exception_decRef(ptr) { - if (!ptr) return; - var info = ___exception_infos[ptr]; - info.refcount--; - // A rethrown exception can reach refcount 0; it must not be discarded - // Its next handler will clear the rethrown flag and addRef it, prior to - // final decRef and destruction here - if (info.refcount === 0 && !info.rethrown) { - if (info.destructor) { - Module['dynCall_vi'](info.destructor, ptr); - } - delete ___exception_infos[ptr]; - ___cxa_free_exception(ptr); - } - } - - function ___cxa_end_catch() { - // Clear state flag. - _setThrew(0); - // Call destructor if one is registered then clear it. - var ptr = ___exception_caught.pop(); - if (ptr) { - ___exception_decRef(___exception_deAdjust(ptr)); - ___exception_last = 0; // XXX in decRef? + } catch(e) { // XXX FIXME } } + function __ZSt18uncaught_exceptionv() { // std::uncaught_exception() + return !!__ZSt18uncaught_exceptionv.uncaught_exception; + } + + + var EXCEPTIONS={last:0,caught:[],infos:{},deAdjust:function (adjusted) { + if (!adjusted || EXCEPTIONS.infos[adjusted]) return adjusted; + for (var key in EXCEPTIONS.infos) { + var ptr = +key; // the iteration key is a string, and if we throw this, it must be an integer as that is what we look for + var info = EXCEPTIONS.infos[ptr]; + if (info.adjusted === adjusted) { + return ptr; + } + } + return adjusted; + },addRef:function (ptr) { + if (!ptr) return; + var info = EXCEPTIONS.infos[ptr]; + info.refcount++; + },decRef:function (ptr) { + if (!ptr) return; + var info = EXCEPTIONS.infos[ptr]; + assert(info.refcount > 0); + info.refcount--; + // A rethrown exception can reach refcount 0; it must not be discarded + // Its next handler will clear the rethrown flag and addRef it, prior to + // final decRef and destruction here + if (info.refcount === 0 && !info.rethrown) { + if (info.destructor) { + Module['dynCall_vi'](info.destructor, ptr); + } + delete EXCEPTIONS.infos[ptr]; + ___cxa_free_exception(ptr); + } + },clearRef:function (ptr) { + if (!ptr) return; + var info = EXCEPTIONS.infos[ptr]; + info.refcount = 0; + }}; function ___resumeException(ptr) { - if (!___exception_last) { ___exception_last = ptr; } + if (!EXCEPTIONS.last) { EXCEPTIONS.last = ptr; } throw ptr; }function ___cxa_find_matching_catch() { - var thrown = ___exception_last; + var thrown = EXCEPTIONS.last; if (!thrown) { // just pass through the null ptr return ((setTempRet0(0),0)|0); } - var info = ___exception_infos[thrown]; + var info = EXCEPTIONS.infos[thrown]; var throwntype = info.type; if (!throwntype) { // just pass through the thrown ptr @@ -1760,19 +1825,19 @@ function copyTempDouble(ptr) { } var typeArray = Array.prototype.slice.call(arguments); - var pointer = ___cxa_is_pointer_type(throwntype); + var pointer = Module['___cxa_is_pointer_type'](throwntype); // can_catch receives a **, add indirection - var buffer = 127248; - HEAP32[((buffer)>>2)]=thrown; - thrown = buffer; + if (!___cxa_find_matching_catch.buffer) ___cxa_find_matching_catch.buffer = _malloc(4); + HEAP32[((___cxa_find_matching_catch.buffer)>>2)]=thrown; + thrown = ___cxa_find_matching_catch.buffer; // The different catch blocks are denoted by different types. // Due to inheritance, those types may not precisely match the // type of the thrown object. Find one which matches, and // return the type of the catch block which should be called. for (var i = 0; i < typeArray.length; i++) { - if (typeArray[i] && ___cxa_can_catch(typeArray[i], throwntype, thrown)) { + if (typeArray[i] && Module['___cxa_can_catch'](typeArray[i], throwntype, thrown)) { thrown = HEAP32[((thrown)>>2)]; // undo indirection - info.adjusted.push(thrown); + info.adjusted = thrown; return ((setTempRet0(typeArray[i]),thrown)|0); } } @@ -1781,228 +1846,47 @@ function copyTempDouble(ptr) { // typeinfo defined. Best-efforts match just in case. thrown = HEAP32[((thrown)>>2)]; // undo indirection return ((setTempRet0(throwntype),thrown)|0); - } - Module["___cxa_find_matching_catch"] = ___cxa_find_matching_catch;function ___cxa_find_matching_catch_2(a0,a1 - /*``*/) { - return ___cxa_find_matching_catch(a0,a1); - } - - function ___cxa_find_matching_catch_3(a0,a1,a2 - /*``*/) { - return ___cxa_find_matching_catch(a0,a1,a2); - } - - - function ___cxa_pure_virtual() { - ABORT = true; - throw 'Pure virtual function called!'; - } - - function ___cxa_throw(ptr, type, destructor) { - ___exception_infos[ptr] = { + }function ___cxa_throw(ptr, type, destructor) { + EXCEPTIONS.infos[ptr] = { ptr: ptr, - adjusted: [ptr], + adjusted: ptr, type: type, destructor: destructor, refcount: 0, caught: false, rethrown: false }; - ___exception_last = ptr; + EXCEPTIONS.last = ptr; if (!("uncaught_exception" in __ZSt18uncaught_exceptionv)) { - __ZSt18uncaught_exceptionv.uncaught_exceptions = 1; + __ZSt18uncaught_exceptionv.uncaught_exception = 1; } else { - __ZSt18uncaught_exceptionv.uncaught_exceptions++; + __ZSt18uncaught_exceptionv.uncaught_exception++; } throw ptr; } - function ___cxa_uncaught_exceptions() { - return __ZSt18uncaught_exceptionv.uncaught_exceptions; - } - function ___gxx_personality_v0() { } - - - var PATH={splitPath:function (filename) { - var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; - return splitPathRe.exec(filename).slice(1); - },normalizeArray:function (parts, allowAboveRoot) { - // if the path tries to go above the root, `up` ends up > 0 - var up = 0; - for (var i = parts.length - 1; i >= 0; i--) { - var last = parts[i]; - if (last === '.') { - parts.splice(i, 1); - } else if (last === '..') { - parts.splice(i, 1); - up++; - } else if (up) { - parts.splice(i, 1); - up--; - } - } - // if the path is allowed to go above the root, restore leading ..s - if (allowAboveRoot) { - for (; up; up--) { - parts.unshift('..'); - } - } - return parts; - },normalize:function (path) { - var isAbsolute = path.charAt(0) === '/', - trailingSlash = path.substr(-1) === '/'; - // Normalize the path - path = PATH.normalizeArray(path.split('/').filter(function(p) { - return !!p; - }), !isAbsolute).join('/'); - if (!path && !isAbsolute) { - path = '.'; - } - if (path && trailingSlash) { - path += '/'; - } - return (isAbsolute ? '/' : '') + path; - },dirname:function (path) { - var result = PATH.splitPath(path), - root = result[0], - dir = result[1]; - if (!root && !dir) { - // No dirname whatsoever - return '.'; - } - if (dir) { - // It has a dirname, strip trailing slash - dir = dir.substr(0, dir.length - 1); - } - return root + dir; - },basename:function (path) { - // EMSCRIPTEN return '/'' for '/', not an empty string - if (path === '/') return '/'; - var lastSlash = path.lastIndexOf('/'); - if (lastSlash === -1) return path; - return path.substr(lastSlash+1); - },extname:function (path) { - return PATH.splitPath(path)[3]; - },join:function () { - var paths = Array.prototype.slice.call(arguments, 0); - return PATH.normalize(paths.join('/')); - },join2:function (l, r) { - return PATH.normalize(l + '/' + r); - }};var SYSCALLS={buffers:[null,[],[]],printChar:function (stream, curr) { - var buffer = SYSCALLS.buffers[stream]; - if (curr === 0 || curr === 10) { - (stream === 1 ? out : err)(UTF8ArrayToString(buffer, 0)); - buffer.length = 0; - } else { - buffer.push(curr); - } - },varargs:0,get:function (varargs) { - SYSCALLS.varargs += 4; - var ret = HEAP32[(((SYSCALLS.varargs)-(4))>>2)]; - return ret; - },getStr:function () { - var ret = UTF8ToString(SYSCALLS.get()); - return ret; - },get64:function () { - var low = SYSCALLS.get(), high = SYSCALLS.get(); - return low; - },getZero:function () { - SYSCALLS.get(); - }};function ___syscall140(which, varargs) {SYSCALLS.varargs = varargs; - try { - // llseek - var stream = SYSCALLS.getStreamFromFD(), offset_high = SYSCALLS.get(), offset_low = SYSCALLS.get(), result = SYSCALLS.get(), whence = SYSCALLS.get(); - return 0; - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - - function flush_NO_FILESYSTEM() { - // flush anything remaining in the buffers during shutdown - var fflush = Module["_fflush"]; - if (fflush) fflush(0); - var buffers = SYSCALLS.buffers; - if (buffers[1].length) SYSCALLS.printChar(1, 10); - if (buffers[2].length) SYSCALLS.printChar(2, 10); - }function ___syscall146(which, varargs) {SYSCALLS.varargs = varargs; - try { - // writev - // hack to support printf in SYSCALLS_REQUIRE_FILESYSTEM=0 - var stream = SYSCALLS.get(), iov = SYSCALLS.get(), iovcnt = SYSCALLS.get(); - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAP32[(((iov)+(i*8))>>2)]; - var len = HEAP32[(((iov)+(i*8 + 4))>>2)]; - for (var j = 0; j < len; j++) { - SYSCALLS.printChar(stream, HEAPU8[ptr+j]); - } - ret += len; - } - return ret; - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall54(which, varargs) {SYSCALLS.varargs = varargs; - try { - // ioctl - return 0; - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - - function ___syscall6(which, varargs) {SYSCALLS.varargs = varargs; - try { - // close - var stream = SYSCALLS.getStreamFromFD(); - return 0; - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); - return -e.errno; - } - } - function _abort() { Module['abort'](); } - function _emscripten_get_heap_size() { - return HEAP8.length; - } - function _llvm_exp2_f32(x) { return Math.pow(2, x); - }function _llvm_exp2_f64(a0 - /*``*/) { - return _llvm_exp2_f32(a0); + }function _llvm_exp2_f64() { + return _llvm_exp2_f32.apply(null, arguments) } - function _llvm_trap() { - abort('trap!'); - } - function _emscripten_memcpy_big(dest, src, num) { HEAPU8.set(HEAPU8.subarray(src, src+num), dest); - } - - - - + return dest; + } @@ -2010,80 +1894,20 @@ function copyTempDouble(ptr) { function ___setErrNo(value) { if (Module['___errno_location']) HEAP32[((Module['___errno_location']())>>2)]=value; return value; - } - - - function abortOnCannotGrowMemory(requestedSize) { - abort('OOM'); - } - - function emscripten_realloc_buffer(size) { - var PAGE_MULTIPLE = 65536; - size = alignUp(size, PAGE_MULTIPLE); // round up to wasm page size - var oldSize = buffer.byteLength; - // native wasm support - // note that this is *not* threadsafe. multiple threads can call .grow(), and each - // presents a delta, so in theory we may over-allocate here (e.g. if two threads - // ask to grow from 256MB to 512MB, we get 2 requests to add +256MB, and may end - // up growing to 768MB (even though we may have been able to make do with 512MB). - // TODO: consider decreasing the step sizes in emscripten_resize_heap - try { - var result = wasmMemory.grow((size - oldSize) / 65536); // .grow() takes a delta compared to the previous size - if (result !== (-1 | 0)) { - // success in native wasm memory growth, get the buffer from the memory - buffer = wasmMemory.buffer; - return true; - } else { - return false; - } - } catch(e) { - return false; - } - }function _emscripten_resize_heap(requestedSize) { - var oldSize = _emscripten_get_heap_size(); - // With pthreads, races can happen (another thread might increase the size in between), so return a failure, and let the caller retry. - - - var PAGE_MULTIPLE = 65536; - var LIMIT = 2147483648 - PAGE_MULTIPLE; // We can do one page short of 2GB as theoretical maximum. - - if (requestedSize > LIMIT) { - return false; - } - - var MIN_TOTAL_MEMORY = 16777216; - var newSize = Math.max(oldSize, MIN_TOTAL_MEMORY); // So the loop below will not be infinite, and minimum asm.js memory size is 16MB. - - // TODO: see realloc_buffer - for PTHREADS we may want to decrease these jumps - while (newSize < requestedSize) { // Keep incrementing the heap size as long as it's less than what is requested. - if (newSize <= 536870912) { - newSize = alignUp(2 * newSize, PAGE_MULTIPLE); // Simple heuristic: double until 1GB... - } else { - // ..., but after that, add smaller increments towards 2GB, which we cannot reach - newSize = Math.min(alignUp((3 * newSize + 2147483648) / 4, PAGE_MULTIPLE), LIMIT); - } - - } - - - - - if (!emscripten_realloc_buffer(newSize)) { - return false; - } - - updateGlobalBufferViews(); - - - - return true; } -var ASSERTIONS = false; +DYNAMICTOP_PTR = staticAlloc(4); -// Copyright 2017 The Emscripten Authors. All rights reserved. -// Emscripten is available under two separate licenses, the MIT license and the -// University of Illinois/NCSA Open Source License. Both these licenses can be -// found in the LICENSE file. +STACK_BASE = STACKTOP = alignMemory(STATICTOP); + +STACK_MAX = STACK_BASE + TOTAL_STACK; + +DYNAMIC_BASE = alignMemory(STACK_MAX); + +HEAP32[DYNAMICTOP_PTR>>2] = DYNAMIC_BASE; + +staticSealed = true; // seal the static portion of memory + +var ASSERTIONS = false; /** @type {function(string, boolean=, number=)} */ function intArrayFromString(stringy, dontAddNull, length) { @@ -2110,358 +1934,222 @@ function intArrayToString(array) { } -// ASM_LIBRARY EXTERN PRIMITIVES: Int8Array,Int32Array +Module['wasmTableSize'] = 163; + +Module['wasmMaxTableSize'] = 163; function invoke_ii(index,a1) { var sp = stackSave(); try { - return dynCall_ii(index,a1); + return Module["dynCall_ii"](index,a1); } catch(e) { stackRestore(sp); - if (e !== e+0 && e !== 'longjmp') throw e; - _setThrew(1, 0); + if (typeof e !== 'number' && e !== 'longjmp') throw e; + Module["setThrew"](1, 0); } } function invoke_iii(index,a1,a2) { var sp = stackSave(); try { - return dynCall_iii(index,a1,a2); + return Module["dynCall_iii"](index,a1,a2); } catch(e) { stackRestore(sp); - if (e !== e+0 && e !== 'longjmp') throw e; - _setThrew(1, 0); + if (typeof e !== 'number' && e !== 'longjmp') throw e; + Module["setThrew"](1, 0); } } function invoke_iiii(index,a1,a2,a3) { var sp = stackSave(); try { - return dynCall_iiii(index,a1,a2,a3); + return Module["dynCall_iiii"](index,a1,a2,a3); } catch(e) { stackRestore(sp); - if (e !== e+0 && e !== 'longjmp') throw e; - _setThrew(1, 0); + if (typeof e !== 'number' && e !== 'longjmp') throw e; + Module["setThrew"](1, 0); } } function invoke_iiiii(index,a1,a2,a3,a4) { var sp = stackSave(); try { - return dynCall_iiiii(index,a1,a2,a3,a4); + return Module["dynCall_iiiii"](index,a1,a2,a3,a4); } catch(e) { stackRestore(sp); - if (e !== e+0 && e !== 'longjmp') throw e; - _setThrew(1, 0); + if (typeof e !== 'number' && e !== 'longjmp') throw e; + Module["setThrew"](1, 0); } } function invoke_iiiiii(index,a1,a2,a3,a4,a5) { var sp = stackSave(); try { - return dynCall_iiiiii(index,a1,a2,a3,a4,a5); + return Module["dynCall_iiiiii"](index,a1,a2,a3,a4,a5); } catch(e) { stackRestore(sp); - if (e !== e+0 && e !== 'longjmp') throw e; - _setThrew(1, 0); + if (typeof e !== 'number' && e !== 'longjmp') throw e; + Module["setThrew"](1, 0); } } function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6) { var sp = stackSave(); try { - return dynCall_iiiiiii(index,a1,a2,a3,a4,a5,a6); + return Module["dynCall_iiiiiii"](index,a1,a2,a3,a4,a5,a6); } catch(e) { stackRestore(sp); - if (e !== e+0 && e !== 'longjmp') throw e; - _setThrew(1, 0); + if (typeof e !== 'number' && e !== 'longjmp') throw e; + Module["setThrew"](1, 0); } } function invoke_ji(index,a1) { var sp = stackSave(); try { - return dynCall_ji(index,a1); + return Module["dynCall_ji"](index,a1); } catch(e) { stackRestore(sp); - if (e !== e+0 && e !== 'longjmp') throw e; - _setThrew(1, 0); + if (typeof e !== 'number' && e !== 'longjmp') throw e; + Module["setThrew"](1, 0); } } function invoke_v(index) { var sp = stackSave(); try { - dynCall_v(index); + Module["dynCall_v"](index); } catch(e) { stackRestore(sp); - if (e !== e+0 && e !== 'longjmp') throw e; - _setThrew(1, 0); + if (typeof e !== 'number' && e !== 'longjmp') throw e; + Module["setThrew"](1, 0); } } function invoke_vi(index,a1) { var sp = stackSave(); try { - dynCall_vi(index,a1); + Module["dynCall_vi"](index,a1); } catch(e) { stackRestore(sp); - if (e !== e+0 && e !== 'longjmp') throw e; - _setThrew(1, 0); + if (typeof e !== 'number' && e !== 'longjmp') throw e; + Module["setThrew"](1, 0); } } function invoke_vii(index,a1,a2) { var sp = stackSave(); try { - dynCall_vii(index,a1,a2); + Module["dynCall_vii"](index,a1,a2); } catch(e) { stackRestore(sp); - if (e !== e+0 && e !== 'longjmp') throw e; - _setThrew(1, 0); + if (typeof e !== 'number' && e !== 'longjmp') throw e; + Module["setThrew"](1, 0); } } function invoke_viii(index,a1,a2,a3) { var sp = stackSave(); try { - dynCall_viii(index,a1,a2,a3); + Module["dynCall_viii"](index,a1,a2,a3); } catch(e) { stackRestore(sp); - if (e !== e+0 && e !== 'longjmp') throw e; - _setThrew(1, 0); + if (typeof e !== 'number' && e !== 'longjmp') throw e; + Module["setThrew"](1, 0); + } +} + +function invoke_viiii(index,a1,a2,a3,a4) { + var sp = stackSave(); + try { + Module["dynCall_viiii"](index,a1,a2,a3,a4); + } catch(e) { + stackRestore(sp); + if (typeof e !== 'number' && e !== 'longjmp') throw e; + Module["setThrew"](1, 0); + } +} + +function invoke_viiiii(index,a1,a2,a3,a4,a5) { + var sp = stackSave(); + try { + Module["dynCall_viiiii"](index,a1,a2,a3,a4,a5); + } catch(e) { + stackRestore(sp); + if (typeof e !== 'number' && e !== 'longjmp') throw e; + Module["setThrew"](1, 0); + } +} + +function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6) { + var sp = stackSave(); + try { + Module["dynCall_viiiiii"](index,a1,a2,a3,a4,a5,a6); + } catch(e) { + stackRestore(sp); + if (typeof e !== 'number' && e !== 'longjmp') throw e; + Module["setThrew"](1, 0); } } function invoke_viji(index,a1,a2,a3,a4) { var sp = stackSave(); try { - dynCall_viji(index,a1,a2,a3,a4); + Module["dynCall_viji"](index,a1,a2,a3,a4); } catch(e) { stackRestore(sp); - if (e !== e+0 && e !== 'longjmp') throw e; - _setThrew(1, 0); + if (typeof e !== 'number' && e !== 'longjmp') throw e; + Module["setThrew"](1, 0); } } -var asmGlobalArg = {}; +Module.asmGlobalArg = {}; -var asmLibraryArg = { - "abort": abort, - "setTempRet0": setTempRet0, - "getTempRet0": getTempRet0, - "invoke_ii": invoke_ii, - "invoke_iii": invoke_iii, - "invoke_iiii": invoke_iiii, - "invoke_iiiii": invoke_iiiii, - "invoke_iiiiii": invoke_iiiiii, - "invoke_iiiiiii": invoke_iiiiiii, - "invoke_ji": invoke_ji, - "invoke_v": invoke_v, - "invoke_vi": invoke_vi, - "invoke_vii": invoke_vii, - "invoke_viii": invoke_viii, - "invoke_viji": invoke_viji, - "___assert_fail": ___assert_fail, - "___cxa_allocate_exception": ___cxa_allocate_exception, - "___cxa_begin_catch": ___cxa_begin_catch, - "___cxa_end_catch": ___cxa_end_catch, - "___cxa_find_matching_catch": ___cxa_find_matching_catch, - "___cxa_find_matching_catch_2": ___cxa_find_matching_catch_2, - "___cxa_find_matching_catch_3": ___cxa_find_matching_catch_3, - "___cxa_free_exception": ___cxa_free_exception, - "___cxa_pure_virtual": ___cxa_pure_virtual, - "___cxa_throw": ___cxa_throw, - "___cxa_uncaught_exceptions": ___cxa_uncaught_exceptions, - "___exception_addRef": ___exception_addRef, - "___exception_deAdjust": ___exception_deAdjust, - "___exception_decRef": ___exception_decRef, - "___gxx_personality_v0": ___gxx_personality_v0, - "___resumeException": ___resumeException, - "___setErrNo": ___setErrNo, - "___syscall140": ___syscall140, - "___syscall146": ___syscall146, - "___syscall54": ___syscall54, - "___syscall6": ___syscall6, - "_abort": _abort, - "_do_error": _do_error, - "_do_progress": _do_progress, - "_emscripten_get_heap_size": _emscripten_get_heap_size, - "_emscripten_memcpy_big": _emscripten_memcpy_big, - "_emscripten_resize_heap": _emscripten_resize_heap, - "_get_file_contents": _get_file_contents, - "_llvm_exp2_f32": _llvm_exp2_f32, - "_llvm_exp2_f64": _llvm_exp2_f64, - "_llvm_trap": _llvm_trap, - "_put_file_contents": _put_file_contents, - "_put_file_size": _put_file_size, - "abortOnCannotGrowMemory": abortOnCannotGrowMemory, - "emscripten_realloc_buffer": emscripten_realloc_buffer, - "flush_NO_FILESYSTEM": flush_NO_FILESYSTEM, - "tempDoublePtr": tempDoublePtr, - "DYNAMICTOP_PTR": DYNAMICTOP_PTR -}; +Module.asmLibraryArg = { "abort": abort, "assert": assert, "enlargeMemory": enlargeMemory, "getTotalMemory": getTotalMemory, "abortOnCannotGrowMemory": abortOnCannotGrowMemory, "invoke_ii": invoke_ii, "invoke_iii": invoke_iii, "invoke_iiii": invoke_iiii, "invoke_iiiii": invoke_iiiii, "invoke_iiiiii": invoke_iiiiii, "invoke_iiiiiii": invoke_iiiiiii, "invoke_ji": invoke_ji, "invoke_v": invoke_v, "invoke_vi": invoke_vi, "invoke_vii": invoke_vii, "invoke_viii": invoke_viii, "invoke_viiii": invoke_viiii, "invoke_viiiii": invoke_viiiii, "invoke_viiiiii": invoke_viiiiii, "invoke_viji": invoke_viji, "__ZSt18uncaught_exceptionv": __ZSt18uncaught_exceptionv, "___assert_fail": ___assert_fail, "___cxa_allocate_exception": ___cxa_allocate_exception, "___cxa_find_matching_catch": ___cxa_find_matching_catch, "___cxa_find_matching_catch_2": ___cxa_find_matching_catch_2, "___cxa_free_exception": ___cxa_free_exception, "___cxa_throw": ___cxa_throw, "___gxx_personality_v0": ___gxx_personality_v0, "___resumeException": ___resumeException, "___setErrNo": ___setErrNo, "_abort": _abort, "_do_error": _do_error, "_do_progress": _do_progress, "_emscripten_memcpy_big": _emscripten_memcpy_big, "_get_file_contents": _get_file_contents, "_llvm_exp2_f32": _llvm_exp2_f32, "_llvm_exp2_f64": _llvm_exp2_f64, "_put_file_contents": _put_file_contents, "_put_file_size": _put_file_size, "DYNAMICTOP_PTR": DYNAMICTOP_PTR, "tempDoublePtr": tempDoublePtr, "ABORT": ABORT, "STACKTOP": STACKTOP, "STACK_MAX": STACK_MAX }; // EMSCRIPTEN_START_ASM var asm =Module["asm"]// EMSCRIPTEN_END_ASM -(asmGlobalArg, asmLibraryArg, buffer); +(Module.asmGlobalArg, Module.asmLibraryArg, buffer); Module["asm"] = asm; -var _DApi_MpqCmp = Module["_DApi_MpqCmp"] = function() { - return Module["asm"]["_DApi_MpqCmp"].apply(null, arguments) -}; - -var __ZSt18uncaught_exceptionv = Module["__ZSt18uncaught_exceptionv"] = function() { - return Module["asm"]["__ZSt18uncaught_exceptionv"].apply(null, arguments) -}; - -var ___cxa_can_catch = Module["___cxa_can_catch"] = function() { - return Module["asm"]["___cxa_can_catch"].apply(null, arguments) -}; - -var ___cxa_is_pointer_type = Module["___cxa_is_pointer_type"] = function() { - return Module["asm"]["___cxa_is_pointer_type"].apply(null, arguments) -}; - -var ___em_js__do_error = Module["___em_js__do_error"] = function() { - return Module["asm"]["___em_js__do_error"].apply(null, arguments) -}; - -var ___em_js__do_progress = Module["___em_js__do_progress"] = function() { - return Module["asm"]["___em_js__do_progress"].apply(null, arguments) -}; - -var ___em_js__get_file_contents = Module["___em_js__get_file_contents"] = function() { - return Module["asm"]["___em_js__get_file_contents"].apply(null, arguments) -}; - -var ___em_js__put_file_contents = Module["___em_js__put_file_contents"] = function() { - return Module["asm"]["___em_js__put_file_contents"].apply(null, arguments) -}; - -var ___em_js__put_file_size = Module["___em_js__put_file_size"] = function() { - return Module["asm"]["___em_js__put_file_size"].apply(null, arguments) -}; - -var _emscripten_replace_memory = Module["_emscripten_replace_memory"] = function() { - return Module["asm"]["_emscripten_replace_memory"].apply(null, arguments) -}; - -var _free = Module["_free"] = function() { - return Module["asm"]["_free"].apply(null, arguments) -}; - -var _llvm_bswap_i32 = Module["_llvm_bswap_i32"] = function() { - return Module["asm"]["_llvm_bswap_i32"].apply(null, arguments) -}; - -var _malloc = Module["_malloc"] = function() { - return Module["asm"]["_malloc"].apply(null, arguments) -}; - -var _memcpy = Module["_memcpy"] = function() { - return Module["asm"]["_memcpy"].apply(null, arguments) -}; - -var _memmove = Module["_memmove"] = function() { - return Module["asm"]["_memmove"].apply(null, arguments) -}; - -var _memset = Module["_memset"] = function() { - return Module["asm"]["_memset"].apply(null, arguments) -}; - -var _sbrk = Module["_sbrk"] = function() { - return Module["asm"]["_sbrk"].apply(null, arguments) -}; - -var _setThrew = Module["_setThrew"] = function() { - return Module["asm"]["_setThrew"].apply(null, arguments) -}; - -var establishStackSpace = Module["establishStackSpace"] = function() { - return Module["asm"]["establishStackSpace"].apply(null, arguments) -}; - -var stackAlloc = Module["stackAlloc"] = function() { - return Module["asm"]["stackAlloc"].apply(null, arguments) -}; - -var stackRestore = Module["stackRestore"] = function() { - return Module["asm"]["stackRestore"].apply(null, arguments) -}; - -var stackSave = Module["stackSave"] = function() { - return Module["asm"]["stackSave"].apply(null, arguments) -}; - -var dynCall_ii = Module["dynCall_ii"] = function() { - return Module["asm"]["dynCall_ii"].apply(null, arguments) -}; - -var dynCall_iidiiii = Module["dynCall_iidiiii"] = function() { - return Module["asm"]["dynCall_iidiiii"].apply(null, arguments) -}; - -var dynCall_iii = Module["dynCall_iii"] = function() { - return Module["asm"]["dynCall_iii"].apply(null, arguments) -}; - -var dynCall_iiii = Module["dynCall_iiii"] = function() { - return Module["asm"]["dynCall_iiii"].apply(null, arguments) -}; - -var dynCall_iiiii = Module["dynCall_iiiii"] = function() { - return Module["asm"]["dynCall_iiiii"].apply(null, arguments) -}; - -var dynCall_iiiiii = Module["dynCall_iiiiii"] = function() { - return Module["asm"]["dynCall_iiiiii"].apply(null, arguments) -}; - -var dynCall_iiiiiii = Module["dynCall_iiiiiii"] = function() { - return Module["asm"]["dynCall_iiiiiii"].apply(null, arguments) -}; - -var dynCall_ji = Module["dynCall_ji"] = function() { - return Module["asm"]["dynCall_ji"].apply(null, arguments) -}; - -var dynCall_jiji = Module["dynCall_jiji"] = function() { - return Module["asm"]["dynCall_jiji"].apply(null, arguments) -}; - -var dynCall_v = Module["dynCall_v"] = function() { - return Module["asm"]["dynCall_v"].apply(null, arguments) -}; - -var dynCall_vi = Module["dynCall_vi"] = function() { - return Module["asm"]["dynCall_vi"].apply(null, arguments) -}; - -var dynCall_vii = Module["dynCall_vii"] = function() { - return Module["asm"]["dynCall_vii"].apply(null, arguments) -}; - -var dynCall_viii = Module["dynCall_viii"] = function() { - return Module["asm"]["dynCall_viii"].apply(null, arguments) -}; - -var dynCall_viiii = Module["dynCall_viiii"] = function() { - return Module["asm"]["dynCall_viiii"].apply(null, arguments) -}; - -var dynCall_viiiii = Module["dynCall_viiiii"] = function() { - return Module["asm"]["dynCall_viiiii"].apply(null, arguments) -}; - -var dynCall_viiiiii = Module["dynCall_viiiiii"] = function() { - return Module["asm"]["dynCall_viiiiii"].apply(null, arguments) -}; - -var dynCall_viji = Module["dynCall_viji"] = function() { - return Module["asm"]["dynCall_viji"].apply(null, arguments) -}; +var _DApi_MpqCmp = Module["_DApi_MpqCmp"] = function() { return Module["asm"]["_DApi_MpqCmp"].apply(null, arguments) }; +var ___cxa_can_catch = Module["___cxa_can_catch"] = function() { return Module["asm"]["___cxa_can_catch"].apply(null, arguments) }; +var ___cxa_is_pointer_type = Module["___cxa_is_pointer_type"] = function() { return Module["asm"]["___cxa_is_pointer_type"].apply(null, arguments) }; +var ___em_js__do_error = Module["___em_js__do_error"] = function() { return Module["asm"]["___em_js__do_error"].apply(null, arguments) }; +var ___em_js__do_progress = Module["___em_js__do_progress"] = function() { return Module["asm"]["___em_js__do_progress"].apply(null, arguments) }; +var ___em_js__get_file_contents = Module["___em_js__get_file_contents"] = function() { return Module["asm"]["___em_js__get_file_contents"].apply(null, arguments) }; +var ___em_js__put_file_contents = Module["___em_js__put_file_contents"] = function() { return Module["asm"]["___em_js__put_file_contents"].apply(null, arguments) }; +var ___em_js__put_file_size = Module["___em_js__put_file_size"] = function() { return Module["asm"]["___em_js__put_file_size"].apply(null, arguments) }; +var _emscripten_replace_memory = Module["_emscripten_replace_memory"] = function() { return Module["asm"]["_emscripten_replace_memory"].apply(null, arguments) }; +var _free = Module["_free"] = function() { return Module["asm"]["_free"].apply(null, arguments) }; +var _llvm_bswap_i32 = Module["_llvm_bswap_i32"] = function() { return Module["asm"]["_llvm_bswap_i32"].apply(null, arguments) }; +var _malloc = Module["_malloc"] = function() { return Module["asm"]["_malloc"].apply(null, arguments) }; +var _memcpy = Module["_memcpy"] = function() { return Module["asm"]["_memcpy"].apply(null, arguments) }; +var _memset = Module["_memset"] = function() { return Module["asm"]["_memset"].apply(null, arguments) }; +var _sbrk = Module["_sbrk"] = function() { return Module["asm"]["_sbrk"].apply(null, arguments) }; +var establishStackSpace = Module["establishStackSpace"] = function() { return Module["asm"]["establishStackSpace"].apply(null, arguments) }; +var getTempRet0 = Module["getTempRet0"] = function() { return Module["asm"]["getTempRet0"].apply(null, arguments) }; +var runPostSets = Module["runPostSets"] = function() { return Module["asm"]["runPostSets"].apply(null, arguments) }; +var setTempRet0 = Module["setTempRet0"] = function() { return Module["asm"]["setTempRet0"].apply(null, arguments) }; +var setThrew = Module["setThrew"] = function() { return Module["asm"]["setThrew"].apply(null, arguments) }; +var stackAlloc = Module["stackAlloc"] = function() { return Module["asm"]["stackAlloc"].apply(null, arguments) }; +var stackRestore = Module["stackRestore"] = function() { return Module["asm"]["stackRestore"].apply(null, arguments) }; +var stackSave = Module["stackSave"] = function() { return Module["asm"]["stackSave"].apply(null, arguments) }; +var dynCall_ii = Module["dynCall_ii"] = function() { return Module["asm"]["dynCall_ii"].apply(null, arguments) }; +var dynCall_iii = Module["dynCall_iii"] = function() { return Module["asm"]["dynCall_iii"].apply(null, arguments) }; +var dynCall_iiii = Module["dynCall_iiii"] = function() { return Module["asm"]["dynCall_iiii"].apply(null, arguments) }; +var dynCall_iiiii = Module["dynCall_iiiii"] = function() { return Module["asm"]["dynCall_iiiii"].apply(null, arguments) }; +var dynCall_iiiiii = Module["dynCall_iiiiii"] = function() { return Module["asm"]["dynCall_iiiiii"].apply(null, arguments) }; +var dynCall_iiiiiii = Module["dynCall_iiiiiii"] = function() { return Module["asm"]["dynCall_iiiiiii"].apply(null, arguments) }; +var dynCall_ji = Module["dynCall_ji"] = function() { return Module["asm"]["dynCall_ji"].apply(null, arguments) }; +var dynCall_v = Module["dynCall_v"] = function() { return Module["asm"]["dynCall_v"].apply(null, arguments) }; +var dynCall_vi = Module["dynCall_vi"] = function() { return Module["asm"]["dynCall_vi"].apply(null, arguments) }; +var dynCall_vii = Module["dynCall_vii"] = function() { return Module["asm"]["dynCall_vii"].apply(null, arguments) }; +var dynCall_viii = Module["dynCall_viii"] = function() { return Module["asm"]["dynCall_viii"].apply(null, arguments) }; +var dynCall_viiii = Module["dynCall_viiii"] = function() { return Module["asm"]["dynCall_viiii"].apply(null, arguments) }; +var dynCall_viiiii = Module["dynCall_viiiii"] = function() { return Module["asm"]["dynCall_viiiii"].apply(null, arguments) }; +var dynCall_viiiiii = Module["dynCall_viiiiii"] = function() { return Module["asm"]["dynCall_viiiiii"].apply(null, arguments) }; +var dynCall_viji = Module["dynCall_viji"] = function() { return Module["asm"]["dynCall_viji"].apply(null, arguments) }; ; @@ -2576,17 +2264,18 @@ function ExitStatus(status) { this.name = "ExitStatus"; this.message = "Program terminated with exit(" + status + ")"; this.status = status; -} +}; ExitStatus.prototype = new Error(); ExitStatus.prototype.constructor = ExitStatus; +var initialStackTop; var calledMain = false; dependenciesFulfilled = function runCaller() { // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) if (!Module['calledRun']) run(); if (!Module['calledRun']) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled -}; +} @@ -2612,7 +2301,7 @@ function run(args) { if (ABORT) return; - initRuntime(); + ensureInitRuntime(); preMain(); @@ -2652,6 +2341,7 @@ function exit(status, implicit) { ABORT = true; EXITSTATUS = status; + STACKTOP = initialStackTop; exitRuntime(); @@ -2668,9 +2358,13 @@ function abort(what) { Module['onAbort'](what); } - what += ''; - out(what); - err(what); + if (what !== undefined) { + out(what); + err(what); + what = JSON.stringify(what) + } else { + what = ''; + } ABORT = true; EXITSTATUS = 1; @@ -2679,6 +2373,8 @@ function abort(what) { } Module['abort'] = abort; +// {{PRE_RUN_ADDITIONS}} + if (Module['preInit']) { if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; while (Module['preInit'].length > 0) { @@ -2687,10 +2383,12 @@ if (Module['preInit']) { } - Module["noExitRuntime"] = true; +Module["noExitRuntime"] = true; run(); +// {{POST_RUN_ADDITIONS}} + @@ -2711,14 +2409,14 @@ Module['ready'] = new Promise(function (resolve, reject) { - return MpqCmp + return MpqCmp; } ); })(); if (typeof exports === 'object' && typeof module === 'object') - module.exports = MpqCmp; - else if (typeof define === 'function' && define['amd']) - define([], function() { return MpqCmp; }); - else if (typeof exports === 'object') - exports["MpqCmp"] = MpqCmp; - \ No newline at end of file + module.exports = MpqCmp; + else if (typeof define === 'function' && define['amd']) + define([], function() { return MpqCmp; }); + else if (typeof exports === 'object') + exports["MpqCmp"] = MpqCmp; + \ No newline at end of file diff --git a/src/mpqcmp/MpqCmp.wasm b/src/mpqcmp/MpqCmp.wasm index 2e07d00303c4689dfa71c4098d4552e637b531b8..a1b8386f0c35fc8f90aeb1cc805579a83dbe8f22 100644 GIT binary patch literal 244866 zcmeFa3%p&`UGF;|>pk~l?K~hnTIQOhG?YiNw&~N7K?!dPwp6QD!=s_iUICJwo%A6k z8%Qgy)KW{Y)yp|eDMx9Ad*YD_D%$jlS6ZoJl&tqgvYDa`moj`kOax*%CF>L}&24B{ER6VaApyQ-$MgNAXvO6-iM6GJu$|0|9ZExDN>9QR=HqXs(y7ICuTYbf& z$h_j6mu(*;nu4Ug>8;mn+B`RR&73cs(DSyrYu-jP?W>72Dpm z>GCaa^K-Id6BE7Z$}L+rZ@S`|tEn-+!vi$6Y3tTqS26HyFWGeE`jxG`fd>s=CRou+7qU#gQC#o6RU zRG(BQE&i{^any)9*{V*5_LD}V!{0`IsX^oHjotC_amGK1 z{z>`AMU{V=&(==pZrb!VsN)9_ae>K>o7i-w+qPxXh1<5j?y7Ck+o)kgdc|c|d(w;k zM|?!c+p=TRwrjR9pL3h$-?eRX^h7KI+kDlg*&UmP6!Ufw=`eFZHd~Gv<}W6X*-GhP z)(6DXKXUl)pwwt$Ykkv|Fhlg2c-qs}*^{&m=UkU-xY_U?1G zM9)@Rq5lsjD>v_u(BHD-?QfjF?27&yw_SF{=IHoL0($dR+upEw{K}%0>pWFP7Xl;k4uIM|%bUtAZZ=m^W<~Bz~+aBL|*{;n|ul+Mg z933BJpNy|hUiFUm#*f8+7C#t&KE8|R>VG#R|5yBf#Q!zk7tg)^m*X3g(>MJ1wLcNx z6n`+j_Tl(~kHjA)Pyg*nJ{o^Ie(`&gpNUU>Z}Pt6e~W)2dChBI^X{KW^xsX%`;*t5 zx$&%5ywY8_d*fLlT55>P9 zUvtF!d3kyNeIR-DJKq;yedP7=_3_#BUyN^ve>(o%_yfrYlAlbrZND|XIr+o*PvXCd zKbU+e{^R&yyyJt3{`;xq58^M!e;I!$`M!63DCyktwdOy^jVO;cMAywuMnaFm<$!^jQ9*AapX&&{GbVHt~M&y5L{H&QRk~}?oGRmm= zFg5vkh@T>{YPtPH?y;w$Sr=PR)}C)Au5FmsdyhR%Y2+3rx=+SOXDLGSqn&t4eLq4| zl-$%(NgliD?M3X`7u7bno9}D5yZQUkn)||ijqX%NX)^Dg{EKLIT@v*=yljB0eF4;K zk`REswu^c(L+Rw{?8#A7G{8`nXS`J;E)M8mWLsxlZMFweG|a8DMO`&oRIVv8k+(D) zW#$vYUCocFZa-OG&zn|Xm1=p5rivCBdTix&{WSegXg*I3^S-aV;hv4R7mfAFMA^NX z?N%RF1@z=8F;7*V{GT^+@wS0+Okz zyw*!I=*0$-`u-9>>@fPWgX;tM*1uRw;QNOF{@_92KPvDIeMTA$=t9sA852fqZ0t=k zS!o{kn7Uq^KuHh{_#5k{a) zKYuNc1Q-%rW_jDQj6vDTYeh#`6y}8KTHe-A)Bl7H^x~kmd^(?^zQ=?I#xRlUm2N)a zf5Mw$w^cNnoNN3t35?BNY_!UdWARB%d_t;L#KtF?YCy=Hay+R<5gD(kIdQpxIvfvg zTTV;u7>kG~^pXJuEH<2aUV{aN+**;+7af592|6?BSjx^U`%h`y-krzDbd#GV*B~C7 z#a>H*yNTH%QeW{blV~&-CCU$|ETWC%)=enXdl>Byfd-psu%v1Qr4kAhTKBXC5yzsI z*mY-l1%5*=LYyj+yf8v42j0{r~C?lI`wHs((H9c-?9=8~; zsuK%VOCg_0mBX|5bFXOpPXf@MJyW;JizrlqhGKXs+R7Ch`Z0PT!BppohTO15m<0hb zAi|c>GbkpHGF~oXG+_3H6hoWokeX2@%}&5lUK15eFXPh0)F4Kqa+)>qA;DSHYrGpI z5VK{x6I6xDB}iZbKmLaQ3A(nf;kSC3fhBq{4LrylHri|Fos8iJ0S&`xRAK560D20w zHSmFW%qPdhBO=8^Di%O3nW6@((nQwE1jVIkQ7Z)lDmb@?Li1X*L9i*wk{L8gW29zv zvXL@gpESJ~2{PR#nKBQvH7oiN%)Ud&Lo#vjAeenMgSn$uO|mmv(6m4gjm6!QvY%_j zU06;0WV4gF=DEF8B9Y8;dTPek=Q43Af7>))io@C|5zIGF-Igc6IXDKU5VQ??BiD$% zUY|&^Iq3dlmY#D0||sa8*ML|ZUTKXCHzgR1mRG0_0&Q0GeRqO z2N3tlth*M*(jfbw&+cI}(p+;_0X!&r;CYvahyGEcb%bIVjo`I0#CbWSbWX3041@L< z5z6v_d^^!D$+OFhW)p8Qoih6E5nt@&tHmy*SUz0u`Io z-R{{s5SsciPMXMLFdhJNW}5MeYi7JFT8wuUnTN{Ahm7sCgS4t4&obs_Qd3uRs6{3d znCMJ`ZB;P?FbPo9;AB;t=_QiP*dDzaf2ApHmZtNL&_)xQh$*id%AspMN|yICBxIPp z6UzMzyWK9&YyDk$Q&uk1T()5kHm7A9KF8Wfjh2{f4G)CmwfUkxO9Klr@JPO!eNB;C z6sh<*Ic%d6 zQhR<50mzK1N&|sLB@;t!_f8M6kp+`W)52(rI^HaY!Cn=in$%}47hCq4vb1ZiwM&X$ z?KRyyLwikTLQq4{=`7Yt>Z0>#&f7vg2`yU=%z&bV4ti~4?jXt%QPZS^g6B0DRAcWJ z3AE~GzR8O){Jf}W6>A_3tEq<29jYliA%S2zLxMrB^=g7RV8tX$IzQ)SK?B}tVmE3a zaOZ`SF+CVEN;xBBNXDoJw#xt+iAM&eqqH-~Fxf(TLPpu1kTHRYW76XPjwP>RmSdzrulk#LT2DxU#MIy4?=RdNLEITQt=!eKvbhRRGzf8$G2)1w{fq z8S^67b6C`90rgdx15A9t_RK|>Mo+Bp2lNCZQ7)TQvKo3S+Y>zv+VjjM2ZM+-&-&9@ ziT8hV2O?kT(*(_x^+R8DRCbYl3STG1^y(sv;8b$Oj0l8)29yq@QUhjbguykWj%)Lj zLLeI39C{&GK~1nsuH*-bSjl=%tb>t@`6WEmrPq>KoC>@GI>df@>z#(UAobc5Y0;jT z>_hpRKr|7<>%BzMCFO7VA2gD7PeJ7@B>kxc{Ke^i1WgEV@R2QufbZ#vL_nx%l>m ztdOBhpRsJW#@f0|v^p0-PD4qE5KIwMYEzJ*27?|J?>34Fck-)aw1IwPdr%VfFbUKR z4AVyX0Kfd(w$9W-rPPa|=ag?l4jDT+vhm5N@c7ee4&M4RxfZTf1Hr#XycL zL|xDlqBpOd1G6$NR*y;9l}1s+V#6MbStE-{R`57qq%J?l%q^E^#Yz{S(?jkFMh9;M znD~w6TzB4ecLJ{rK1_|%imm`JW=@Txei8Rs*Tn9)oo;`$-4=I|nr#C{(MBZazH*1k zm_;}V_x+2vjK|be{Zb z2|fc*8oOtoO}9&QB$fgnEF=Z>!oq=s8Fr7-HSlD@DvM7IrveG}2c2GD?bO@2^A|8# z27W@v7x;cfZqVo|n^(kT+{68VdWd@sAVT)f7OV62dBqW;@70p!M*s&Rt_6?HX%Xn+ zod~)XBPv??$_q@K3!`MxOuk|#GsZ-NR9avq45k^+b@ZWMC#M6C#aP)gnuHaoO<+;)w9@7HV=Y+%q3DAKG&b>S+4jf^qGIEFK30Lo28 zZYeY=n(7802~!L!MfoHO$dWP1>=|(zyw)mttyQ!=ci0aU=DQHlBiR$6)KUOch_#AT zTBzmAKoMoOBxs8ZC+LhZv9f1eDgLmUn)3X$8=raLFhB&C?kHx;uR+FHZQ8S1R|BLm zv0C*Vb?72+Ea8ao1wK8XvU_=|WFH_|n9PkngA|Ht#f z?*3E~#n4?_72(!I3@9rG8>ZwnP^mIeT>=goCT=ifym8A<;4Bk14dJ1o1=FC(7suEq zSOA{wm_V8yVLNPXBcLIyemXozEp?1fF+gZMHdA3t#D2CDsS9=NWXZrp?Ch=JC*9dw z$xm&kB$li1?5!4RY)L7K&8Kn5yF|}jJ?p8arxoQ>OHV7yr>>q>l~1{zR@)OusRssR zs<4Nu3@FC|AUik2rWk5-sf2$cKBmJZ^5FU33bGRl-QYSnWj6a_~n zfg^eH90^Hae&thUboJ!9pyQIfvOj-eyjt8>E4i;`SX{?)DmP;?aVO6fE4{}haci|| zw1rCIj>Q0T3tbsmiM!_k7L@pZ=qY0NhyA7*NKYmCYynHCR^-fKF^!_ci9iuX@2Wh8 zM&Sa;(zk@2xSF!h(4b22rl5yx(U>?~fI``?P=>nk_1W19&NiA=R_d;ub!+C`nw@&p zA=WqK>NB=J@h2W3B6M9X;i+G;0$dY$Mv#GnD9}4n=nU@9*xlOybrem~{rmW6n(d|T zHy7ewl)@xdOs`TcP`H4uspnpUCN1UKXfMaK&YQuiGAsvJ!qyTr@Te@BSuc25Fw4QQ zfaaHmj-Y%)!KCzqw87KyEaHXcWY`V|I^H%UQ#SvVLp5)1B;Wnytn&&@{hcmNqQ0IP z_EkmdqP}W_zW(@7eMw|B+}DQ%HwFzpwnT%ma3eZSkxyPrBkdx0o%GZGXCf>> z3KRF#pF@@S4;JDRlj!9}f{%u@=;)sR$97B;_p2nlX_vUqRnniYr2n9j{&FS#=aux| zRMP)YNq?=9zW$GfeZ9Yu{%|Gzvz7EGD(O#E(!W$m|7s=uxk~!;mGmD}(qFEm|Gbj^ zn@aj0D(SCP($_<*C9d9INq@MK{@F_U6P5I*D(PP;(@=8a{+XGArRVY0rN&lFCp*zz zk0K|;dzy5s{4c}Go(HY6$x2p_W0k);tlSv3oG#t+)5FT0VP#ugEN=O0!^+99a((HR zzdo!yF{~V{^l_NKF|535SlR5d#b7)$tXvybwuQ#x%Ktj7yk=Ory)?|<99G6`LDm_b zJ4;u7c32rhqpX}QU3r1+|1jO%VdaUXD_=jXoDVBcE?xPCVdeeNu=do_wQn5Ou2c@@ zTV+(M~e+!@krb+~;YEqCU9A-zT-2&^IP_g!B~sG7Sk zq~$`~AJQl*_h3k`A^mVj=cFGE>2;(Jg!E~o9}nqQsGCQSbZkcTuvKm0riCDSXkLoQ zl+`4^PcFoo6Wpzt77YD_Y;qolyooEB8P6U@Fv|t?iKUCeAaBR z(`I`|CakB^;3TDm?HhYd>~GsTlgG9VG`r17BV5H&%ii}|)XW(mXMbsH$jFde&pdZk zQ^Q*s2#9FoWO6k1%|MW#Q3S(=`Ij~)hO~}$#O%%Lk z-~bCkqa`7WCBj%>#NHl@m=HQagnJ5rB6f=)JT0;PX`t8&z*4-1O(6$Lt%3`)>g2gA z8s7#kIu%@`9v3A56mNWK?nYn9>_Qnk zh7hrh)^3geRY%tt9i5y(gVDXaGP*`(bh5k{U9?@J!xUYDn!htMi1TMa&ELih8a4ZE z6lQQRJY3;=u*t(kt~G*9o~+`*Wb+N16P*X+CAttVmlK zBOKlNHmI0I+BgoD;OLI1xMNhzTF~!10>*%&v9U{zhPj)4xKl$Hz=(yY6dy<`KbZ_z zHnPTziE7MK3~*8eG*oDMD80U&v1&7LAe|2>y_PrD!F=0zD`d^+2lLLn4dz{XoC(%4 z&7$|T&bHNAa~>U(r`vlS#2k~p=u&i#O+()(X#e0?&II=nN!R$LsPn z5P06rJKB46yYV!7qH7}FQ>P-FYT6*jP7KnIMRh4XlO?3z5EI|dj92ZMpaGV^#Nj1E zbI#%F9N06iQHnk@O;5v`)hwFLH;LuyiyMp;DeiXfVDA7674wPt2N(P_Rf3$*(n0=J zi*RkqjF33R{U9&Vq;FO)2u+EjBP?gVL?J!8XHVBI#dNTXSFk%`=Ict8u^I7`@$5_- z?uYp5IeVavj{ymLywLtXTaAR+mBihS zx0};Q?zVW=wQ*_aB&w4?JnF?P?6kER=uLL3-N{n%D~g|-*%ykly8`(~^;HB0p0 zU?++CL;}e1!HQ2SLu-MC)x7qeW5C(q34CJ9eTFi zua0;0CGNpvW{F(p_w?D`j2iuYT0fG+Lw`>~JAV(6QykS>!Q|I$b1d^70-j^hce;U~ zAw{Qq&~ie!a02jbZmGe>SCMYSTj!7I=4s#WFQwG(5pOan>R)Mo3bwK4*cXEWR%+R= z-mUeb2~TKZ_uv_c^OY_-yEs~*CMh9;Lrx29hDX6IthMn%`JxEh@qm5>u14+Y#Jp4W zt==e+w@sj8g5N!w1?;YaY?4`hJvGq7x6ibt*@=z8vtBqTZsMQ&T0Epw{ zo5Gul4?}PGj+gASp&kb@A`o+K?IrHvk0>V2IudZev!d^N!qLNSiF!zJ4sp)bd_C-= zE#&g5#IUfAej%Plu+i)bh4@H@Xu(%BfG#y=lGyn7LyKJ2?C;hTG5GI@8@k!;I1D{R z4{l^5vN41(-`IBtS&;*Y5^NC^SSR6UII0lMrT|`v%YYBTu;RV|nRT@N^!Z5GBB$VMTd5{(I4QlEld z!AgoqB7B$_#aO=xuvk)w_-MQuZR zKIBhlBtAh1uDffc3^C>>05(97EJ&c{xEB!H&Q1jfGSH&zH#+h3Zugme#4GgkSQ?U} zUTgX$aSH8?nDW5rK;4;uYcaFnGmzptw4SB*%Fx7ZZ^j`#A4ZvPWU5 zd5wQW(!vjwV@)r;+po5QbPBSCT(FRsw!PODRkl^n2C5dMwo_yRtY=CsM(=r{M=*_< z&#-5lTa0|t)3!4mwn3yqm3@>?>^kR9rlJlzouGfqu_*MpXfQ~PiK9FkhJvdH_^Q*f zw`g2^K6|U^<0vCcS72yx5reZWE1t;?C<@5r5RMLj2$@(H2`6{WlCXOBuOtLkiX?Ks zNirhout-29NYIhy#4zV~jv10S9*RU6;DlL?9Bt4&&1>%2GZI#JV=Tai(kmmch+qYu z-VvHTJz!l5L{LR5HWMM=>=w{!B%;aYJVQDELKpaD`V3iYVET9~-xlW}m@jZGYlKZL zg~?9ZNn4F-9BPju!?}SU^{{jT`i8oY#Y>}yQmD=hR+Fd4mgcZ!bBJKjt};@ZZ6U85 zc~4UaHmAWHHUi5*;ZTuKR5`1t%lynl6FNg~f$Z4Q8C{B)d>2~LlvC-xge_<6qY!lZ zBX$f30)I7Z;y7wz)UGq^7IJPJ!Br_buvOw7_6p4>8i82NT0D0$o@izn{2|LqMoluC z6*`atI_nOfqUQKd)IY>Vk}(JP0iM{8vfJ)(t;9QKZHK7@gh?b7G!BDymR=F42I4 z#w1Qb$_wn82K3FLby$RPHpMh%czK{PwZUE0n4?XYL{Xbu5ZXjS!lYsE;rlD$xeh%F%gKqS__p(ZAh5u$vME zY46n9jKS^dVRs8{7OrGS^!P(Dc>JaFxr|)1I6Mj@c;z=S{000E2k)=au$Hhpg}?Mr z_`|y6!UI}D*-C4bQ(#URsRP3wzo@KfQEPK;9mzV1MTx=XVNo6%854#@;~sDzT`4U3 zgY!cyCUnQP{bDR4;}t~?7~Hv*MsfB6?q{Rrho12x=bUL#UeqJ^(nKD2zYu3HUb+?* z{TFnO1Qe82Eh}5^?_gsAC<_oVgvBtSe_BPeu#hd5_;!j$QMqP%3GtDx$?*qr^F+2D3j_uYUFm(;gg#YI zYP5(P2ly~LyT7j~W4aMn&+;cdm*sAP+Tk#jEq@c)RW(F#B%Sc=v&|yP^wfRObS~An zbON$gPbguXvq2u@bs1(l`ek!8ya)ji7{bwTSwtMF{z9Dd-vB@mRDH}^pox1w?#|AO zjX9RC5D+;FZF23}JHlG~TKW>$CW9;W6WIw9 zNjp*jHj!NIp^0R6W#6DfFnJk5T25rDiA>9hWDc=+7>X|MBNSRQX~EEbCUG!|W|_&H ziSFm^SqpVB;;~en`gL&)K}Tj}0NDunl~Nj`Gcr5fuo8hQMAsuIn(Oxth*#iLXb!Xwl|vRKT@%w~Qd$3FagMjo3a;?c}Kd(dDK1E0d|jzl+h z*`ye%HCfD_wMQ7Go$zkIAIfHveL7l!_ATWuasmNxE z5d&a3Qxn_S-FJgBj0R8k$6OaUseg~@G)2q|6Rz=#sf?|Ls4_XXMMg{X1U zDiflR(21g0NyjxNNR^Yl>~OC!>PmfH?w-hBIy=_Cg%I>&0fZ7n?p{4R!wRm+gsakD zC7wV^Tf^m`3W3IqNSN`XgI)pP#4fifMZcADR@6k0u9y;8G3TNtfv-pKED~6s94iT@ zSq6iCvhByNp{Pk8!?ynL092<6u<76jRSC1b-0MfLr+ZpuSregM$V&AM6)efXiUC88 z#_fa4`~w2qucGWmgc3Kc0dBzi?_ghgbHM7PM({?^=G#EJ7`56!=qZ$2S7@wZOA#%p zG+Sqob?@;yQ`4(uF!19#(hoG?a&8#Q)-nJHHsbv2!ooYxQa5K2`0o&&lw76jn6m8e zV+=&-%8wUGOH3k}qAZYMYLbcZk`>(364Pdyvd!^!I?{DT zN%veNRrlUFSX@4MmH1BbYhG-rG4!Z@U^`(&%5WF$(YXZr96||6Ab@ZjOW6ONVW4R* z(W^@8E*IEVOJ)d*usoWlL>8xVvuve}q~+3im(vQj4)wFIHj@swz9$=!@}`MgH%&Ca z3dh_{e8|hm+6_R~CC3gt{!*U0Kf`_Lr+@ap)!2^FQ_KC)4PXAWJsFNf%*D9-pT21RlePw@*eSWDMxG$MOJq%B0ak5aRBy z|M(AXB#@cQ2&~yvx_FCb@lE9E-7fBaBq^KqO>!vuTlHU7tg)5BF?dH`6Lni?_*c8b zKDs}h98LS7Pk~Ib*JSn7?e@5`gtxGN)CSjsp$`WrF|$?ttLw^aMy<#^Y9s8>_Kd}7 zT=(2L)^|2baH|dz`;k;;DHLl5Z`&-xH#x(VL0U3=oS@ItlQ)vXNVm1IsHxwUX2}0N9`QH)F`{19r(ILG)Z z&MN>7ikBu8y(?#&T@4d{xw&GR79=9`_-Y&USF&U^f&eQg!OA(HOQTU)uRt~i&7=v( zOyCA(ywDBak4gF%O z+Yq+^0UQcnaN?Um;}l>}b&c8DmyZ;AJB=XntfAGaFAj34qAgNs3o9G~C@xj2qrByX z(8x6EWl%2YalNGYE1XMmZ6Qg(l|Sk-+Cgu^bpIj|;u3M&g+iL*h&yECl$1Fjcly!Nl%j4Rn&4FXbKqh;$ zi+#()V1_d>_@=g-P$-QG?w65c&>Pf=!)7+4z3X>F@Fg*c+!_wQ`;{Zpg^453%z)Ff zNPEh6vlng4OxXj-q@D?T>EHZF7kNQV>yrPVR2OFWcI!NYdTjtAOp&hqozm#^AKGB0 zPTe4$&Mj6$;#_CKHKrg<^I@Jhv#tHPrXuOx3n8fn_lJ?RFk-N}*FuIhQKfZIoc0c}?j`qdG`(!veq^0nju zwrv`3gqqDEVH+mj=A-5rH8GGh7wpbS$ocIZn`S%Nn}8zi-pFmtJj%V`u1~gNh$Xh+ zPKlVmX8S2#=YU!xf?#2cc1uHxdmfx{T@3^XEKQ5=)BNR1s*{f2wBfeJe4_hfbfXgw zSP5QV8p-9Q=wYszuf<)3L%zDr3aZLG7KFuT*Q{gSWTp`~3x<6OI4wMVT$B2<+Y}fV{T5o(xxan(GtV{|tL_vt5~}+w zgu&l^<=4M@om5FL1}5`PxdXV#<)zZv;p2o<46j%@S{FhkMU0xt234r)UW`wlNTC9! zCAjCnu`cyuY)}BCQJdX?oT|B=MhV5T{G`i>5sA6YuWj};`a}Epz=HS!-0a2#1v-vG zA+Hv;Btkc!WE5qMv1hHq2{ggx_9)~`A1LJC!=n)YKlhk|LN?kwrc#82FvZks|Id~+ z=uL(#d~on(bm$CE<8ACP!R%J+{;`GKJKTqFf8Zwb!e+bXz;i=*(f_VKZ<{+p3>d@a z&;Hjyg0^ZFA>mMChIv{11Pn>$>|nYfgJmG0Aq+q;kb&P*vCGf1>>U&EdGYKA}mrvPoOces*zG>`RD(r$mTf@l<uj%Ma$ANbtnO6I50SlQ3T zNy>-J+>D8>1VusI;Jqxoj`uv^4m{0TIdQkdTx4wgkjM9yeVo4c%)8J0@8_-g!CyK3 z_U;3*FgWj4&fa_G^_Khdr{A8}Ztwn9d^<1fM?wFYyS@7+lc`vsntnfWlLSI&kI|78 zhihA(eqPevy%u*dpii|dQUC0-ZRUrw}<;4 zmNOqWFSFjQ%dB_XGV9&3%zAgJUIJao`Zv1Lv1g2h6|&pl0#W!FskwdsFVtRMyLwko z(q)8Z-M+sWsensxynE>@%4yL2t%c!mEy(gN`f;}!mTqyiV~k5~AskqQ`j;}!mN zq{7VN3U*oA0LT@KD=7GDh=-MnEBwhw1%1w73{jxJ(!%OPiINgg9M3IV@WN<(E{GP?kh`HjF;R~maH5v*;kgV8ZWu4ELlBXa%Wj`#CXXaWyz7_C40+~HRC0>l_f`w zmwc=&IeNV0*0SW7@seB0l4Hk9ZZ1onH(qj6S@Qhxl09X~apNTmWl26>@(k9s6lmTX zFL}BwDaK2lDoc(ZFL|;oSvy|xL|O8J@sh{Ok`u;D4wfY^EK9130fTy-FY${$>~Yq} z*zfp~%%qoROZ=?mn=!THqBdJj%j6&m@QfSpeE;7yuCq#FdS6ydobkKY-}(}ThOpk07hHyQ+3?eU^iS_=4jYzx-HK`Z$)En(ZP$*p zeaqjz?=Mre?cZ9|_G?Cg{`zB|d8pcU*jK)bw*TUrH-Gj$BW?fZ>;GwgqPG28i`v%K zKn3n!xc;C2uG%(xmnGcaxc#x;zHX%L_kQJ*zeY68#2NmrMQy)ywC!K{+&$l@wjFkC z1^3<0eB|T1N80|w8=p83scrw(qP9;PZTqv&eE8XF+pC6ffBtvg_X8tM-+SNJPE^bO zokcC5JlgVK9Q?`9MX;aDv&4!QBz z+@_F&BssMemyNRl?-k(+9*W4I$WByPN9@!*p5iLJwrKC$qD0%U*(VcyLc~_`#Pce2 zmh>&)Pq!0;7PS!DSV5^?Fw`km&LtX;%HisCi|*qGSe&@@s+hMHpC?f8J0rv!$1RWM zWiW>pZ*nlxnxTT>(E_e)Cq+opcY|=!pNFq9IuCGY82=;xCh3L*Zv?HVFXofM`_{0h z?vq1AM<)?m+88TZgyrPA5j>9-fuODOmhC`;&%R+^z326Fh*Q>%oM6hsc}!dk>yvk8 z2NM$5J#OzW#+un&anvrtWva}5)lB(kmASu~iEGv}AFgI{zQ8gMR5NQK^T}!^TRc{C z;jT*W_?ay8mTG1*WbUnIwnFBfN+nU|bNLskRm{laL#SX;o$xqux3M4PJ;mPkT_mt1Y z?|Igod)hw`1<6MpZR_$G%i-BA{GwjBYI_DrDkXJyQ~B&}E>m;vmO;|yTAR$7K7@7NoBE?5xwo@`t4=KJSoIog?yfk``LW} zE?!z9x(o}7hO*SE^~sxkYR&rOEg)FZ#czIk1~1c4Dsi=Xy1@Tj?0+udhfdZd8(eRGUy--NyHRwR1d6b&{U}8gxP`oX4oSZH<~Vqr+9sw*jy?7s#*$Jd zVB?(Y3f-MJllLZUn%^v*x2(sJ-gj!R{bofiI-sKYCyow!DL;DnLbBD4gKf8BxQCEz4jwmE(;NHCPiM_8(5oa`?OL*(W z4So7TFr#u*S1W3uTnB7@Bhc=->!k%*!gha7JQg8{LQcZ`2i`N+Jdn9r@qQ|xs!V%qy7j1N`CP_d{+ zVSC|39jFVOZp8KqS*4gq)R=|f%>^&?!6+Jl7z;a*Z&9Y2QZx}$s&L^*lPz^M?XvE9 zHsoMw682`##5xa?7i=UbD`cPPYT*q9iTI;|-P4A3^I_GChsjmL3YQF%Zyr{7%P@JY zRWMqEwJ;wb#WsCfh=|Q!AVO_0rrq=47ZUaEc{(aX-PWP%GBjV8!GOPE51K^7FVht> zUHa%qOLSQ?7i0iUCuc2VVmyP3Hw`C)8mlZL%z|1E6Jeo@y7XCg2J{s*%&ro|F#n2?vD(uwM5VjA9EC)5# z)oX-n;b^o?&uvSWtxL{4RKYocp2k{Rmt3H^9f5IC6(ca&X^ToOITY}o;mroM`WF*LEW{d<02||@HQqB{#wTrY*CZay%vek^az@DQ8?*8^+ z3iltb@PWe>K6tpohlYjISfk(~jA3FphA}W79=^f=#|j@gT;ZdKD}3y5g$IU(qhNLq z3FblnN)UfzU_O4h!Y2+__~hXVpBfg9g1PFDU_L#3Wid9NIb7jF$H-;r0q!|m;Z1|W z%uY%};Ys)W-VsPl7BP$Y;T+?KS$BswsJZ^%SClRvW1S0Tr6%2-p{7E7#%i3*&T!%N zBm9@y!fLFNdyOtdS@C-QS^0WvP%?NDe)eh?yHJWbY|dg3D-1)(KuRuM!xx(v@1+jA zqEB#Ns_php5FqgF!^-!B@{VG-)IEsEr{-jpa|&L4>4Vdt*7v0VV=8o20Xa_?u|fif z@G@V6z`;}^eyV$(LgcK6rvqFa8riO0^%1yYH+5bygB{2hpgBX;$|nF*c}M!ZT2`>~ zp?kY9fy-=0ptgf;Z0^wjP&ma-Sh{0rL~s}lCtWudEsbW%FiY&DjR$aSIdCK;9F?&> zf89=0bN@g%Ky!A^VlwgxgpfohW49^+1tv^^$TS(4F^d3OT_2%p4~74T6o0eJ{+Z_xK{07xAJmM7x#R40tj91_d~%GC%XDe7W589iLvB`yQmfKgci)UrB}T)N z#rOMStY5PxmuNwBFJ4g)1C}JDU_{yKwPjjDs&cAE=lO#GEjb&oc8pYKC{I~o- zvYhx=J{e0n4GrGM%qq(j1*5(LGB8if#R*Agi+C!M^_q;t=dbBI3Vfc_fXGhSa5~)6hNPRmrHF+#MhYnI@vOJ>b0lFOyF#Su^6t3+ zp1R{^-Rb_+U7X6w{%eFY;gjOE#Kk!QFuSozz47X>Q^NAYj1_Oe$RVR4 ziBoi5opXvTH(BMW#}F5%1FknFNdwS2kT)~9=U}|`lc@`Uu#2Mm3CYR zKeT9`o}#9S=;2m28^a7Fl-IZ3d*+o_z3!54^gc!G&TqwMM*P|Q#V@+sizaKdylENA zys~!f;OW5Wdr=y{$&$V-Kk!+flWDf?WeejPxUk1PQRpPeCg%L3~4O-Um9SkEa+HB)GgVSop?&OR_~?6>Fl0K%4h zP2@1qfLb7yuh>}|G3kP8>72a+uzTAoj zms|0`aw|Tz+=`Dbx8ftqt@!YAD?YT`iVrTg;seXAxPQ47?_X}k`<7erp5<2Dx7><% zEw|#G%dL3Fax3m#ZpGV{Tk&Jdt$6ElE8eo)iZ>ssqLa7}Qm_ebuk2sy z6=^LU4(>Ja*>1?S%4wRfS{scVE%WcF7UvkAiSOcKqvLv-R?H|~LR*?m>3g^;c~!85(4N>)P*mPPO?S*K=t5$DdPezJ~Q2+J2YZ zt%1l#M>)v$IAJbyN-2+x3n1>nWU-oOvXU@SEex1Xu1Jr=fMJhGkqUhK2h+&z?C9G4 zXiNkzkQvz4sI3pE%fah?s&1k_G;>u2meCyY&Mdt%aYbK17#$@3B`{GT3>t#IX`i zH#j^-VASJQw-Z~u7rO^fAnO zPuZ={vh}d`J`z5I%+7!Z$(OAx&ssFK=g?roP`69TY@X4oVy8b*=kr-gSzrN0Oz}>S z5<6_bI$r({eJ9$MB#Dkzbrd$N(^+XKZQ3Bx;o8@hgTPhdq+qpZPbK^X%XB7Jc?c>G zH)mEw7SlSNd3MppteK(Tfe%kF;Q~0t2`xU21uH z0q4$579&pRiE|!!x&0B(qZYm4!wl>u3hUW&3TmTj1Re``C42Y z)PP{2Olr*Xw*t)XJrl?C+Z5PuVhn^i>O9@ArqNN&h>hCxk~m6Vv1B=A_Pkcvza zP#>^nIGLn}3E@QNy7>5&$68AVhF8!cSQ9^64S9LF_GYWOg{F%p!o0*9gJ(=l!y4$4 zrw@`btO*Wqw+KKgdj_q7E~&2qx8kKV zQ@;Dgfch49WF9h(f(okzfHRhlNk3Id z-~7JeyLVL5$g(5hv?KVtn!l^~yOO^v_&dYjE`O)_X0N-y^3Efb^b?izo}U=@aa$#Q zPbK|OC4I1x29D$C>-qeB9)FMJ?=k#6n!iW!ca6NSx)9=Uf}rC|OS(mJ7)6W6m=aNj zH2Q$4jC=<+KwZQs^0nOo34#In)+Go6`RX1}t1%D+y8U64d}~Hto_ytog?yo6FFt`o z@BoWNg_L5*zcK<|pwb|2N-7;~56noiV2X(HWF_v-5#&wXLffh`zWm!2k=gN&Lrk?w zOnEG^QBZ1O!;<+!B`C(QRAq9oG+^=(ETs~ci?IYAU_y^2?Ztp4SZKiHU`TvC=-F3S z#sIVdhOCDYL!)gO2UpPI?hFit+3u!rDWD5)sbo!(g`j`>Mo-GBH9;1LK2XWZ$bt$U ztYme_LayzrWVOj6V(Vj-tQJ|sbuCn~bn^+(Uyt7~?2&tE9bsb+SF-A45nOg(C5t2G zx^`r5B`YOMk$ROZ?s(Pqg~jC!!p6AEtx6r*PpE7mvAg#zHF-%M6;0m6lo-fT1mD1D zD6gH@f+8Wh&ZT{BPN>)8dQz{a^?I$Ix%&-dV139Zs+w^?10|PKX<(=sx%Ij=(2P}j zl1kJn4J@Z{hTCJ|Rm;@_#ShWfgv?BW5RC~;edzVS~D%{Qh9b}%bx5pLn=A#UZ( zAL5oq((^2a+O>2Kci3^2$Z`*r<9w_HVyGVnI9-abN}Q%_v4*|ifZ8hS?S_k#c??&I!@sG@ro7jhW}j!r`kq6L6Y@*KZqULqX7sw zxPyoQWZln##V#{wm^+B8olDK#?6X^}wKeTxaF{!YRlx-ApphPMM31_InxO@jXBBr) z+3tut=%oCl;105H9J4JfYqB}qf-T)agn#bWkp~+GnY}ob#8vcS)hDE9d_rYk_=Fgw zd_vmJ#3$6qXgUiEX5OdN`-B=2;GlSBl)+A0mFEpFJVc?;mvSC$NrdlEvpNvQlQzT3O9y#VMjL#18{u7KIBYr_ zaSpP-AACYsVXV7n{HnSGcq|}5?4-$hJXiRH2rFS#rhtVPgo^Sc$tTpX&#iM;{e+C7 zyp8jwMYBVbFJH0)jsvKT=dpWGsjIB#`@2uEiAUW&@)1Mi`BB~r#OK*m`xyTdGyJ3S z#K9J$4j=i62||j`x4_%JzwF+WKpxu=uX~^#%%AzoJXz6 zIi=CaPh_P}4F#ld*hD^|)r??jtC8?@(UDu*n^cgb>=S$e_=E%>CJ4dEeo=EsFy%Us zHb!dFZUr#k+6d$TYdr)2f+aWFm92MBi}G3Fhy`CKdTNz@*`63Os4zjQ(&` zdrab!)NPIfpQP2mQO@*tmhwq@iZRQS7Xv0I%jIGNOfCYFMQ^FIjrs;)mDE>(J9yaS z5u^KZ9kEnL;&Dg<|8FyYAw!#~=iO`;cH)zD`Eh*#mq+LL=*Sa#tMCR<={R9ufr{Gh z;KO$&TI)L6H)=r1>=@0-IofnkH@uG+d+U>v_U29KMzEEsYB0z`2WViChRe9=2oRQTn!&7LlEXrj?#9jvJj4%Q?{*gWd~a30&u)G_jt0C??Tt|wu;njCP_X6DQJk*WF$es5!+ zu=h$5A5-F0B=&3n^VK9CP~tTz`fnt-S;jq~guak-s}kH4;~rN+--^6N32uII2bJK4 z7k9G~+~nd8D8Y>_?j|L4Gs|O2Xs=?A66{F0N0rdWEEkmE<`nmc5(;K}MqqFgihEc& z$C7wjIp0U(A?0wziF-;pTxH@ORL*NjJgJ=1Nj#t&5aXUujw7*OIcJb~Tsf~JaldlT zBymtV8%f-!oU=$AP|n#T?orM;Bpy@Fxg_=}=R6XRD(8F>cPZxr5|1e7LK1f>=k+8W zR?bBv?oiIfBpy=E_mkMGoHvkoP&scTahq~3L2nncW*a?cu2yJaMld>n*}*=mYRzasn#dshs6T z+4R=tB7D1cj9_)etmCfYptqO})x?kcY|ZZlxclJ~faA3#U-3oKCGlOwd*l4Qv0rl4 z!U=RI(SU0e)MzK%H-z!X0!C-HYlTkvQ74>Cm*~X6Ba1SveGDyl(#Z!R6RAEbc?9s@ zRyvTNW#OzNEw+_8%c2c=RLya#*C&s}nBq9z603J7)sb6w#)?W!Hsmj7D9%nZy@C{? z+Vejz2m=BPtR_NFY^XK#luE~ScIHg7lp~XgL)xI$xopK!OMHZOw0oP}8-fA$zV`O+ zZ^viecIMsRJmb{AKK+y3H%XD2=yP0Z?k#HfR5-ejTDM{d+Iob8J4k7PRx$Di8xq`f zid$5+MxGoBUa2|Ym8{KE+pn;_xWfZC0B{_Y0K-a}wQljgcx+I;7#uta|Bk}_J|EZ{ z@#k`*3C1ppu-o%u+hL7C0$cq-pT;`P_bN>jR&<=dk`!aaNy>2psQxM_?$zYwui+n} zp8I|}0=*@f>zvcOnmUuJqsxhhbrdE7p0H8<*ZLH3!qNSH?;3JuR9{yH+qW&Yk+V`c zI`PG4H~PKpXm`#6TKdJh zes3o^-$zcd%R*NA#fkmiJIIs0mcLd7@9Y;Z>i6D7-s#HQz(4)sq<-(+y&e*<($&*T}#eJ<(y?Xr}lgAA?Ix6oWnl__bI=)-@A^ybCq|V)jF-;gNX9; zm2-jRd{4i(fTYSVRMzV)>m~i(^~$K|P=2=>-3DLOtKX(+mC6 z3+wqjPwV{Cx_Z8orxX3tiS_&)JiW+2y{MkQi>H(P(@FLG-8`M_pH8mlKhD!B{^^u@ zel1U@`lnOt`FnVJv447TJ-?2p)BMwE^?Wx^-{YUYr=BmwJif#~zNDUCugCB8kKbF* zZ_wjQ{o_mP`HgyfnSXp)J>SElI~bia>l$Z6r}-Jt%fYJsw6t_Q&dY5HC$@|D8>bsU zbSl9prYmI>AA|A7FAUK{`g3qcGK;!_JQ=Dks1aY^M(xpNH&lWhYa_(lc*D}<&57_0m_06g|)72r&W979h4xHkrH z5dijV2nP=3%7#29EC$GbKxF=dM$xA7Py&)DQe%{s>>SQ<*yrLc*zRXL9l6tDx!ie;(weuq-7-Mw;;wnPuknOxh?fmGW+ezuG zBHn0+1#JFfdTW!t#VA_1sD>~yaeO--Iv5TO;=|JxsN(n%$rU+Dv!+h{n#%Besk*qV z1We>t#dAd}9}?AF*n@dQRMzwwS)oYSNwsWQ0dE24e5voV^ zl~Db5y|u;OGE^VGd{oP0hmATTO9>Mbjf~c2iS%ZW?av0Y%jpd%oeeHxq)i&-_JeOs zPeh682e+Jla{sf=|8Pr$GG75e8~RFxSI_bJvhhDQps}J~F`Q&V?^O^W`!>3q zA}9X8+jq5{y~yz?2&c#=yT>HzW+R_*u}_DfxDq+g74*PQ$1Svak#;W1|58Ldtx6=) z7!En6v(}xUrC2$@%eM{4wh0o@-j~s~FV}d#gT@jL>}lVg=@T(nd)$)5j&m~J9#Laz z&%1y*Ypd6!AkCT;mh785{(DX%-y><-_egx(a)&@Xse9}Q8+ip@0=T}N_L)?GLe2k0 zBun2$av~m^&Jy_5hvK=~;mNp&Kto*@&pZ_~V|)co`3Ecck5}@$cFxeSX6VQMkm|Oj zr2?VAg^)5b_~94CSPqsrf39ysJ;xfTkd-cU@sNt9EEjnv{10;JNzibBk4@M^fIBQ- z8fO1CAAm^t1Pb>8>01y!Y2SjdWLVeI6s|X-%0v(_HeGt07!>}yIwLr#d4lls?ZZs} z4X=MkrVy0?uX%9ImG+#baQSZ|8vjjmnCkmM!zmo;5WM^1L(HHG85NY$Bo)VFAYumc};m-A^jeVoYh63JrwJdq?kpy*0Nf3eFK_x|>mVxCYsCemKy zKDxhQLaiz~1;PT?)x0>K;=t_$?Q>D14K#cd)T;t%prUrZ9O&o`_CFK_(_bWr5z_t( zKOOLr%7_B@SXG2IGPN2JyG8tX{*SFyw%>iLe4w6)v7@9O zoUd#AmuR+Pjy*eZN6wBC~R1gfhP;a>yy)r*)a-idbPbA zk6DA79=p>Ej=dsFNu-py7JDh&GKAARPm6lSd6N`@SE2H@PI2vPb@ zjVM9zko?reVp28PB2qOXQ5_6SUAW~1yBU}eut8AyTAseGig+@jii~TdH4o7St;bfp zbURkKFZEwlg-!|$nzlq5nhLp0Q5MWk^4VYJ=Z-0Ji~1-(=q%LK1385PDL|2pRB8U!LwREX(n{)qmyj-= zlPhMUZ*fGE1nH86Po3Kw$h_4R!~Oxf>Ik#nO!>NFPVi)huRKe1g%KGV@M?LKz$HY^ zk%m}m%oO7#Ud>6xuhV)}DPA-Kt;SarQ_!90nJ)Y%ERpcml>eDR-un+F`fbhBf7~&A zSQ(D7%39>u#~nS=r*W%GK4XdsgSL9LZ@q@LQ%$8Zh)ZHDckAG^DtZA@{m3P;iX$Jn zWK@DvF`0Tn|H$?YBY=pe2d2(&RI1I#*a8|}2_fXaZ@fY{(1@2V=%adq(u55 zy6GYnMms@Ej&@QzOeg+0noNcY4iJ$griBEvct8#iu(v}(xX0tEAG4ECc!q9eU{L8t z+o0f-fVxm0@u_@)W-C~d!Y_uECc#k0@(oUuXKpy@Ue4*>H@XZ>SqgL276aa%8L@Iq zW@t#}tAKk3#tFyW`Ej>+vQcd_Ca$ZC?#o{Xsn*%DUmzcA&Aff zSh4Gp$75QNp<;$w-4s&`N=z~3E`sDyCn<<)ON*?FCfs{2R9r4APiw$z1S^B;AY3%_ zAioH2sYJrts_~uDNa0?Chfetb7|%%XfF^>TBR;&2m%v|c0GLn47J7hA@v_I%D{H=r zDFnp40hk_?@E|>o8tPu+9)L)HT{D=vg*|+EPw>)vn3j&X9j~7G$AspANlB7A9u$3< zRN_n(EX7BOHI-cZXX4O&S|cwQZ6MvzU5dkMmg~15mP?Rh;i%FCeL%26XhqQ++QZU#ZZFp)6)g_8B`Wv{643i@cG;!mh zF}cJ%JcqYSWXDL?F?=)XaL?UypWh%zhWa|yco!21BQte=h~Zh`C+elm+`wkOWuYaj znb4yJ?KxP&HZ;^Yvm<0ynY5Vx1*~b)@nvCUF{7`+&bsa{Y;XjDf_92j<|c*>PD?E^ ztyu|eEhcTtK`VhCi%D5J$no@U1k*<}&xy|q^XzTQ1TTloge+4mSJVHI%zz1=ZC@=pF^XOuQ70$WdN~3Qy0fhlxtD@(CYa}uJ6T70hU)h; zTG_omc_}|!tl#twA^SmY28WQAM6!&{-UL~!Y$IL$BiFEQ_R*uFZ6}b2TuCX|S&Vfr zEZLzKneoX2z=*01q&2fRYDVlV3Qed<2ywZIcly+V`Ipd`{4qxGrA2N|LK!_nf6S27 zG@Dl2Pfpbw2b00`I95H64r`A?@qYZ+pMLy;RcL0s-8X1DZ8q(0ezOC;o#sF2?fnu! zg^O8A!{?gFwOu2oUxECCGSNf!r6lg`2CvY9cOa5R`dM44TmgBk+d@-Ed$5p+8S{pT zpXkM0l}6Nc!rG``VEv$ZY)@GZYVk24Y6RxMFhCiw5 z-z`#v5gm)0(hDs~|H!*GC%_2oXmzK1hF+(I;#ZL$GA?U_sW#)1Ub@^4+Fhyb-&+^F zf#@FpM(oyhSAb3?*Y5QJw8{V>Tpw79MXWCuKzM$;MN-tfE5a}G9Pm6Ea{sAm#Y22{5`BcHiS&fA%EbmKH%?(RBLift8&|I_}lw#zzGbxnkeH&==PQ5z1Q#Lh76C zEzXFwYDltLKn%#@?1|C33d4RQ#fpw_(gZeoWZ7A1wCJ#VL`wq zS}KhhJT6%AVs@4$Vs_))bA>|AQNrmpX_qHyo{GN2q2|UBr%Q|3)Ux5G_^RO503ne!6-@eR zQ9d{T#%z_IRFRETQK6MDBQYhWm43lMCp`i;^!+R#Bl^HJIgY<6TQ(mGe+XEeu$(ab zvEZ)Yj|M&dY^N_3{uFYJH+L!gHS@_K{;>Qc$Y_r{$4!uNF_LDFGltkeN==hmgg?L+ z{5}NhZyB}Su zaz=HPkB!%2^J0#IQS_}wisl&~sX5~+BbBYJaT+Ap417b##tE`HwX4Z#BP%cWvOhSH zgId8TTbEosR3Ln+N|dkMrIpP~ef&z)J+agQMB90z@WgEEceslYT{G;*>zn_S#Eq(W zLldLaF?!7>tsiU@_n@~xEgL_nviaDTInCX{vP@r2^fqR!ZFGyFKtCueHxp3%>kG-4 zVIac|=_~wFS-oO}=*fO$1t<8?P0C_zA*GqeBDk4O^hmQ95mPQy=F?v=V=6gvZCE$b zh=&VX6zk(GsV#rGlN!r<15cWiGEG*R{fk5wN0~t;x){-9iQG?KyCl6xJz_aW3`0Mx zj!nDBSO)>ZL%7qO8Mi$xuIlOIvLarAMJCeT0G~xvG9nk zIu(j9H7qTSm4$b$O(c^SN0X~|X|^dQ{p_=+Z`VZ-K(B>GaOb*bS&7+wkSK*f{IS_SQ{xm$b;8H04puC5EMPY%>vofP0y)`n{xMY`09Ni#afFuiaR1ORrgji%cVn_1UIN7fX@{la#o(*nYh z^(&)PG^RVlh-MOo;0=$e4m55yG<2^5eYn*)0s9UbXMad1ki}cJAqVGY*`EwCXzvh0 z42f%inm>s>{6N--;F=YFEutpiS7c?_Rd5%E3pf;Nq3Q}EgaI68Fb=i-6>b`^++Ym2 z<_C;1had_zw++t*$7 z&6dJGz(eL`hKQ%9-P%c2p30~7gVyrU59K#h>D!J0HTJ5)8b&&K4bYGU`yMa2gZUTK z1=g;DFRK#V%vc$HVmt)x&v;aRb`-ynD-49IM?=%eFNWR$E8|7gl3w>f^ zmsAd(45TOIQ}JX7tKdE99_3>{m@zYD&G<>O29we~G0W`7_wm_Ayh;+Fy9;uVY)-c` zk(e~z?vSqsz2H8yaIMK8_vEv79~2@wE~Iu<*kxT0UE`#cwhT3N)&hE&lN}|UA-7ZF zx-ufM6O7{6HWhTf4~g?CGr(Ffg3JfsIpUA6Yo*lZ{}nHr*a*$_qCgdvKns|`_8`UO$kMQ(`d>K8;|9UG!n=odus9RNcVmxCLkxWn5J z#pVA2Q7i+OhoaT9`4It8kQoyWz8DwR=bkS#;J6d2@V#LiC_oG{kg3E_QPKaCy|;m~ z?7HeZ@4fH6s#o=1RlWXHb*m-a_uMv(-IisLWm*1EU!iWPB`byuWC)A3CS+#KVpS=# z+^u$746?dyYls3~i3YS7Ar!mScCd#riSdZolVzdyXAF2ilQAGx7@~jxL%b3h3^>?W z^ZWnzx%a+TRsA8yX5uwzsr%i}bI;jlfA4+v@gM=8^#{RMs%$5Up9=$xc+>EeaUeWA zK3D`sxZFmM<%4-z82v&%IHFzdQN9?Jv`bShMis7 zJmSS%c}1}gRHFP?HGfhwaBQtwJyET`DP7D@&RpsrBd4o#a`u_Isb|pr1iXIR%ny;SyX;!vUp{e?u4hTV2&**?US1Q&vUp>XygfuKo$4FCv zOpjyHzK_jwRMfUNCV>c+$KLjcc?~bWjXl%@$bMit6KXV@jn*R*N^y$?>kJD(K%$(K zndAW-m9B0;IXUKeVu8GDxjgJC7}SG`dni2EKae!o0v;1DMI6F`*aPnvAX23zN>sxF zRh=qRgqeYMm0yX;4fLv&JFD(Vu2Y#t^N-h1^G`5L^G{$>BVQ5}c*V!kX-MdaGt8LF z#CHjEm)w;SaeAov;DYM7IRHN5fJ`8v3?52!h`G_Vd+k7kqYw^K(#t^F3cKDj8vMP2 zL(a|(-Z!BqW={|MYF3W*MGc{P^D$eBqUk5Y`1rj)^{fx!TzJ}gAg(LZd` z5J5-(tkNfIX*f#d5AqL4p^@V-mC-z+4bodzV#xCqkC$BHXTKFdoFvt$>MzdCRo9cW zwZM$Bd&YhO>FlBrbGjf=XkC#8&Qd^8^&R_wPl0{u z#s;3LA|D+P0x;Fakc<`*cp#Et1)K6dIf9UO#G^se4Ox z_ek8;o{BoB6tV_+?=fxJ!GYOBc*dtu)t@fd+xg|lZ9bw%FUW(#dW_bv;D-2u4h#St zfd9I3sycm2xKeiY%|#Z^0#JSGT&96<`ii#remPpe+)?WNs}c-rGP9ca2wo$V$DrRsJd}_OJzv0WIdx*ZnIWFxvIfujJ z3r{N*g_Uo-_VE(uoq7gs4_stT8ji){5IotbDSu{(psy=n6)InGWC``5mIq=e*};sJ zNlXYh`{v_S|1KT8g#wvAIDP6E5;JB=H=a0k9B|xqOiYk|l7o=^1#l%fby+~HeHxMk zAWfr@0C90f0+5S$j8vCa0>m>j62Nh7X5Z|m{#wobq45AarN9BUhBH?^%Z~I=(BQCk zQ>mWO{`4?gZo_k7aB1~8(dC-f&E~r#(~7AwhL*o?V(o*?tX(NDuv2JbiP36WyA5jx z2lZX#tysIwrxjaKsA^*E_!XwJ6cUG*l)+OJjGY)B{)Alh^GYZjpBWhJ+;~!PBI>Bz zI=Ju<6gO9gdx)#UboFtk^<@D7ys5QRr{JBWx=cQyd2U_+vt=1HQ58N0!=RI6dwiJD zhU3x~%7$N<*TUQNX`-Rxwf>Rsn%;?{pf!Oien1QtD8#WDF6$yA(?lwZEa|z#a(~8F z-nm@=7ry>s?q|p1i5-cmUIUYv0(QAH0T5nQJBZ-}Bb>YZH}& z0St?ZtgGnNxLa=v&=I3t2_+IuoMJ!a9A;?QWjzztGe#Tt`)l~-kg2ly;DmG9b{sRb zy!;p<3l9~t3o0Uc3tHin_b0_k>5VuyrEtXMtMfu|$f2%Ar6(m2a?&;V4Kz_*-J@4* ze_}SS9f*%Dq0aDmC|0nL1e6m+fyn0T+9HG#K0=fFrcc!sG;U>bjBEu3VMXjv6t3!uLc1EB-P6Buhb!YLsKHhyB#b4nb|z=A0`m=U4L z4^!a%gPE03*te9v zO%I`p_@SQKpS}xm;p?HdSJ!=>eSYcNJp%r#fD~L+UOF$P@6Bfdw zL=VgWMUah2JOgRSg1IPxpI#bXhiRX5G-bd^z96~=l!zXo=O{%Z;sYx>NZ+B!JC+J< zH}LiPln8F6ysG&ES;GKf<8byo&*7A78`rBTjSrBlFt!0xhI1Y)P(Y9oi?*8? zZ`YhH&_DwZ`qcB=a_jd24c>tPY|WSQ4s@Vc!tpw0`E;=ZX`iY_#6xZ_EDsP~h zA7;-gC|d$myQ+;Bm~}Xd+y*DsUX}w6qFAK!U9H2lSLceeGJ$w_9q5S{E9!7xonJYb zTeALqb-qvfGX>^x&~RgKI%7ji&Q{ae&}X~T8FR|Lo#~9i@tkc>XB0%|Y?RKRXUT@=i&fvS85hnCKWD{p-S5-b{QoWoQ)?H<{ zkm%1;#tI9NBNlpQh#z4mAQ9iqSc#QOD%e84@I%N|AwqILLU`>TIcv&A@ykU74!v0N zTwn}JClCW&q-yihcu^S3RRtIpwfefgKB$ldQc;#HGbZpJjQLx!)A1{vDElwVyOSO3 za!KkMdYZ4zO_s?|CF)mw>MAO4pVr zyVfV{j;U*_>Dp+rx-PeH?~iyzzq zZF{=5I@!KHVbcXYw>MqeJK4KFVFw0XL+$i8_DwEdpX`fk`*dy2kXcvym!6vgsM%rm zcF1oz&W3#De9R;k_^Wfd_I40(nasU9C#41xj?fIp^7T=9-p9CqIYvX~x}1M=L}7HS zl*zermyhuVa*UnJb#{Z~c$<%R`gpgG*}8=5@MxZqgK>_Sj*hiU>0G(j$NPMIIW%}> zIkbN;Y$V1M2;xm8u8S6e31SoJh+P47LM9;JQl zJst0mYdy*S)vO(0R*L|VNkM(i|a&aQy{%g2$Q+~?A-0g z5UESmlik~oL4d(PQK1YwD**M$B=@f%DqjnewAI7P{4GOgjx+@yGGz4@Krb7CDR^~|?YBDuC zW93cAn>ZNk;J#nvc@E`~8XU_wc}Vfd>cKjn>&))8>Zz#ZMR|GOyMKp!MkRUfeZIc; z0pI(|&UEj?+&lf8g$q?SUrGw3FoDwOI<)RFdS^cPi!SNAblo3h00NO84E?csXNdKz z;+u5~?`RJnXb&H34hVR8Px}Lr)kBYQ0-6 zsj#|}@SHfb$T8y8DyJMXl3YS;bZbK6;<{=9ryy%q-(NpD zNguomyPP8PYl?2sRb&YM=kUDaK~fg6dt<4jG0+>ky+!=>H}Kq$IW^szaJteI5Yq?o z7N_2j*&+KHN2uzE<~(kzt{zUl+O$^e*~{ z)eHW)Yht_K%?Sb?9AP~Vj#V|vB8%o`IVMIPjB<>zD(SxUn~`yfXmg51FI=I6&*hQl zD%^=&u4*I)ec(?n8%2{QmW=NuAxb+g{gKfD|x5nI=jTu6Y+ z4Q8nhx%Qab^j+E~3(KFc@l^6;i-yYdQQ^4;g72GJp>nn}Z+vv{`3~fQIv;crW3B0= zYdWF3A?))hI&qSA!pu4^8BC6W;9W`sQ469I%<33&UPjJIGi0)9!v3!C-MNdC96GUf zkyoM<$^=6v$Z~@mH$(&nbYr2R+iyUBgz4yPd{A(EvwJdMCm51#6ZpXN8@nL7hDuSo z=v+Ph%?KM<_ys*=M6PFz3k@vd+wJsgwz;n__+=wY`oh$EWrFv4XZwHOO#+NQdmkuf z;Aw0JQTz2<;2VqfigU{9nPt^y% zT^~GMA3ReZe6BwDe7?jkL|5m}rr$57-!G-#`--@KfBJn#`h6h%emJ+G-5rk5L$A(1 zGJE>z_OvRUCLPL(v(jw`S0ttlx7kOnkkM&x`V3AGWt{y3l`Cv2ZP$9%=-tc;hp1IP zygL6$imV>S&8Vx7>|O)hG>FnVvSxJZ)jS}sjGf@rkq)J#Bph%6?9$qD)|&Gx`v$2g zeVbkLju%5s}vqf8LCK4us&b!P5I0Y7nYx=4Be@^OWf5e%H z__>4TX}Xr|(h8Jn1kVu_pxD+5uryT&&Z5Tabrip=6=0I5LXoW13K6Pa&_jBfUesa_ zt;Zo9+yV%8cM-v^uZ37w-f*Hz)l>u0MR5P9%X(<0%Ur0RY`a{bi}-tmb&=?_Q%{*;vlZN4(t{FD zA8G-2>O4R>!C4&A^MV=DVR^Ut@TU@VvhbvXf3#8aHcKADa;14L_}w}bxPHvS{W3F z3iyyMYn#1=Y}QRyO0tejZ2`ZD6kasy);gkto2(r*TUp~nLS8P< zXM;zpWl{c>z~Xh4;0Eku2!PoQ@<5Zo$7Ye7^sC3E9~y2%1OOJ=Ljl?la1PZhV@e{& ziEaj^vKJ+uH^Qa(dShXD_0$0laqZZ2R-!|CU;Q=XPut_n8K(;y2N6=~V} zE_#yxp{GbGIH3g-S|IuzeG>ifFdx2kvPidhDtOZ@5UXw1W$IwV}cU4DV%m;V@^@WilJxU%sp?jOiXp2fbjA6#M-edbHKI z!Ft3fX-Tn;jBcEq==)^9&?|NZWq2`5p)FgUu%3owc>L1n;9c#VMFd@g9An;MvJ+$O zKt2VnNZlqyGBrW#$0J23%6@FqODM^B`^5{Vp5wYz3xaOxk==eo#>4h<_bvFhqi^2N zJss~5W4g_;Cn(VBQG;G6+~n%&Tam=Ww~{+6wZG{0Z)IAjdaN+|GL5B%yK4CLDsdd3 z2)u9>DMLDenq$z~k6}FYVjke2JW{fwX5JI3k#jB-0fcgdX?YQ}r8Yvtk3*izs;5ch zB5vgkLWNJHc||}YYS~CGH)9l?E(i8%+LkpRFh|V*8X%z-&yhk(4B&!ulp<~c&{m4>82P9)empj>F1xPvG10{5+vVBQHvtX`8`BI{wvOrc`0D&0K z4;|cPO;Ol+v_FM_L9!b#MkKqf+|i=L$`m>nHB7SSK?j-H|KFnnOic+=U@Qlsu*6DD zz9}Wg;j)Y4i}AtYwdZ|EA!rL&Us{&$usbGUM((gh{bWtu> zepb=;Vj5(s2*1*gg=VoFq^!j`wGV6HF5Nqjd#jL zqLA+QfahchqVENvOuBcvDuJcyE@)A{A>Wb#cBi4Jdt$3}=`K>iHB*i#V*h!#bWMJ5 zbOfhSq0v5{fs)=K9YOK?ct;gB=eqVDAWO zOu(Xu$*X9{yfnTN{)Ve*KI(@xQJ9UMX5XN?jb^Qmj8AM%=heLdV-f(QEI2D#1v}6J z$7ry?pA<9o#Jot)_yFB8uIMJW18bvVPMUwD>B?=&#E}hSN2Ty?kq%9))w5WZ#M$~D zms_yO%4aN6Q{+FdzAAkrtA25} zST!*^-=ZQ;d+XfHt-0x2ADg-5#LK$DPt4p}oPO(5Gq;A*w>~{{ODmh29{%#oErR#$ ztsM!P?VP^#2irwQu^?Q_U@9;w+I! z1f~qNI{_4$gC9|_hxu}@ICC=2T;zVp+z3-Unn`hGrd8O=YdV(vGYN26Inch3i$Xf9 z`6&vQG|0riv1=1Or0$VuwyJraS9WhC=OxA4_&M{sKb6 zDgDMA-wEq}Qt4ZMk{lj$WaV##A55EoCKG*b{p8f=v@D$VVCk54gV3QC=yrAH-+K88 zTw#H*UA0q5;98ODo9FN}(53Zg2!=~qy^oJG`025b1kM`s&131L9y0&r|42jHFcwUe z7>nWw66*xJo3S)Lz0S;7<}{Yh%vcBqh~F%*yqZaoDv#d9k+Q#V%k~D|W-SoW z$$&}Q4W$tNqN)b%;8JQ;a$8=~;D#3(9Ltf@;3#)shb1Dko~ZK-PA-TvQR;Jb<~Qq! zQZt&9&X zwb7bW&A?Kai^)$kDHMDQmlb>`Mc@l@NNnG{dRt$z48F&>tJ6MFS&bI)jB%Q!!ebS~ zidd|a#GNTWBQIfyY1}xf>(S71c%Eky5n!6p0pE_3_8z`++m|~rDb=J zYE=G`^HbPJzfqrsjdeUA`4%qpq*=GRG@0cHD>b{Lz*row>;oq!6XF#zO7{Vdq z+9`L{J>IQ;dJdwCQ=ngLyC{JsS1!^!Krey~7W=h=J{Zno3w3qUP6sXXZ^H)Q;S_!d zfSqc&5rG$)X+|bWy%e0-2)k}|9KdzZ$C>(}g5G2W*C5+2kfo`mZ+{JNYq|%@UI=bO zDc>pFvK8DMsjzbM4TGEF6di>Fd*zNAU_1Xa2H2lp5MWM9`o;oG$w-}wWF(eTMc&D( z@+Y)#CGsaEzDI4g1WP6B7|SByo9%F^&!>^omn#yNZ_gdDl)&R*Pwn|{9bfJg1bD-GYJjMFmDz85CN(AG|F_z(P z!*Ayg+@m&>%(ahOv~sOPXH*TuZ@51$9*CcV@pDc5Xx~9zkigx@G89DIO+S)AO-2|wQ%Kd_ zUcwK{@AmOSJ;xjA#}BVn#nCY~03nI-xAAjmon<=x>T?v2DEa+ueqY7!)BJurzt8Y{ zEx)Q7e~{lN`F#byPx1RweoL)_?lU9S0IpdZPdKCE`uK(XewN=czl@kA(=@_wrE{)d z&Cqyj4}F?DGQN(hz;669em~FM7x4Qmzc=U?Rqd7frN=k%dvI<19lVUdzlJk*R(?@A zm|TH;7=H_?{8$G!^MhJ6xUUw zH)z;YRy$VN3AU%Y|6^WT(XXzcAppb(s27MUgpyMD1hk}DG&U?>W2o^qRX(&#Wl#0) z=~v~a12(<#H7><8D34;fvS3=>s|Wc&sy#Z1l4QuxYDhKRW7XiU>2X~Lr1n%__~>-U zuC1qt>6zCU&Nn@bfJ#oD7flbdbiU~!aY&wAriR6~C40-Ns}7TF4I8@9sZO8sR*HM7 z4^0n#$UVuHe&A9%PD6?!Oyl0S z)8ng-X%X|pIDakYy^~yW;;Yc|Ra{v-DYAt%i)V4piZ=oHxTtlGRYJEz{a4(sM7BNE zgCCzJo)`AYG8jd_+NPHiLcyUZ-{T6%3k(!&Ek)!D<*W2Fe8Un8?gI7dCx^>g*(z+D z^Rq0)-8C5Q)`XV_d5KlstApX5=49_cXgq*m0rg-w8I+fosv05!Kqjd#EG3jbljWh5 zCehPk&myBs!j-Eo1>{>G@-^i(dVBQ3|W?+jvmMd5iOrM)Qe)S_kfe0KMb5iF|?z+K}TB4WsKY!^Hke!Pxa%UoSH6J z+wyQ9|A-@84v5&+jB0@d7t$K_FN96Sod7UJxAi+67SHTkV!j5?1 z{0ZDl;EXoQB#S{5NrRwL;G{|fgPxpr>iyKp8#R=rJ=2Wb2JfV%EoHQ*NJYO=99u`J z#d5*^b8Hr&{Y-B=skif~x2s~7h#Im4)lFT89V0;uM zO6Mo4bAOi0IVGPy;(7j<4BB2rEfJ;9yhQ?czAee zHRh4uOG8Kq;o|aV3xw<#{a{!%W{8URRPUX}3^?nIm_ca|G^=7Gl1(z^W*|E9>Y>9N zt@>z(5fr)84Xr|xCeg=tyZW~3${t#}Oh2O3iIpLWg=$`v;9pW43f*P`F7tI)zreK8 z$>F8lPzy(+pUz>sdK;#%8RE5d(KrqhRuF?<>(ZNa*3*K61-v_p)sEn>F`J7UW;4>v zxT+$SBmsz5RXb>VP`;pinZEJD_!(E)X`#x>8>$`L8keseJ)Ao^YftszX|6cM6Sw<~ zU~7P2fw8N?Kyb%PrZ#|cacZ-cc^+z`!fz%f{A~aZn(SA5H7Mq%Ls$GO!ud83!K%ru>aMFNtIo0IF3NO=wFD%NiHu)ZoqNW* z=eRPhy`nnzMW4U4asor&lTco_w40}^5igN$w5NK;g0#9q6gEI4C``d%zyndCG$d%U zGh9-snT7INVam4)*;rQpT8-<4oQ$up@^Z|93VDoQCx*n7h*lS)@36m4d42i1a_$%l zm+_#!G|MNZ?qWRTrdH&aHE$HRnS(bj!fm>!@$6PKRJ$sy2XC~}#tJsKx0v`3b)%=7 zUKQgIrzo&Al;^2q>PYIGCE8l%MxH%v6yG`xil1B$=#y(V0s+-X&aSfb$`j{s1io_) z%Tm;tF}X$#B~4Xf3h_*zX|`9_)+&j))f=wyEVkfeE_zllXszp;8T9a8sMqLt*@Hpuf3gW z0Z|^pl}Cg%zl zH8H$JvE_}oBq*uw<=ZQ8Dr7V1z@73YLJz{aJ=MRPX-ds3ZRXG7BT)7Y<=%1we}3Q- zQ)-Z2eMR{K=wDp$rIl_~_1MKMOfhC1FDPF+&F0@f-3$nsSd=;C;&7+5{zVlZ8Vo6} zJ7cy%!gi906i(s`yRdX^Bx$nGB}t_g(SE_-j_@j!TpdXrBrJZqFT*_C4PgESZCUvI zG#|fYTlTWB%%+EiKTqQ6JbJ>Wk<>%zO}iGDh!I?`Z_ckF4KP`5r;EMYHKzTgl-2S; zRJ=y-(%Fk+Ze!A?*uPOuBh5O#l>oH%hE!5 zrJaf@Eq7&DG=*gag=bn>F;O0s}#9fE7{!@sm!J zqe(gfGGvvz_=r}kXQ>jaQrJ|R0U=q8L&X}&!pZ8fa_%Gy%gGBcif%nr_XJfK|IEd3 z3+kH1Eq!HrfMtAz=4S^gOY7nmcub{D_wmZ|O2(BeZ@LhgE@(jNf?%mW zSGA?NJ9Sr}s7|{8WupWyN$A^wD>;dr$HGuqgQWnzs;aSh_~CXZ46?*_noKcE<3{&Wz2{-YczW#m?;D(iA&N?q0N;3P?2) zHgV97eK!_sjSo@&!zX9_)|B`JLtCB$aV|tW;vlF4lOjM=hh&I5nFmj5{%ScW-41aH zHysQCsbGU-va{5?>9Kg4ok+{?;JQLVNBHGuk1EItZYh|g1xvSb3yQx*E%2(WeO{GR zf3@y(*Wr**2p%Lc?1kiVQlmVB4q@->T)M29zle1n3%3)zM0L>gNut5!<*t;eRgl)9 z_(6o0b4UQWn-#P(T1ydIMRLo6#|aRQDFVmgnGP*Mo@t>VeT>{V?4|P372GSROjh7Q zs!dvZJqSn2{A?nUrJ{+DDbZbxpnkSiNb9&|&Qnb1d2YKA>}h>bSpxc1#zE6puPe$* ziA|Jod;ecvT6_7{QlpeB#dARzo_sJRC~MSIjk`ibpI6;m(DU~mRV_x>v(A_kC60}v zn2GiEZK1@kNRaibEA_3qL(cxA`O|wsZ z(H28V>2>he+zotMWDa|F$H$S}@xtM9Vmo9|+JsR0gxzYV;HorEht^`8*cBqB(-Z|^ zTdOjwb{yfKWeNgtvGB#~ih~+Xx&5%faRkY}eEjfnm8|_?E)F!$g8JZ}7L-B)n$BzJ zXw!G+Y}$d!HF7&tUTOacemN}_&2f$gsEbQfeb%Ge;Rt^O;rpnkWYZd3B;Hlth4>Ud z*Tm03jm;&f$>5+QE~}5x6ypiahn~I$&xR(IP2qV~)K!du0ZUQHrX)=>-XW8n5FIzw z?YLg3EtbFYQMDCmYNS|B$aqzQ)WPw}o7^Dps6GyBjUaVbcJ}Teq>@KYX4?5q?*UPu z{nk9!F0UGMB+0NHpwd34vSY|zh{a%XYo({iYoK>jtDp4ftIS4bgu3U)sxN12+j>Be zOUPO^H5LH$1f!gK!qCa+!mbSXusXR~;V+;eSo6Q-gR?z#OlG3fc;=PbBQ|p0)E@Ls zO-n|iNX)qw$85^);j3P#RCd!;3t`=^Wj(v+6TGhY(IPc%BaQ^Y*$~zJy@m?s9uplvz36V7UWEOowxhyr-O$^e= zEMk85F?bIGHy$OD`2=UWNNnI5&X`#=WTG;Wry$!)>yxkLiLN|n$m;LpF_L0%(C5^t z*A+ojS)SJw-|gq9Qr8*Xab5AfPIsgUqEPBu-6zXv5>dzu(97z!lP?vO-K`<&9Q zw|tH~9QpSOalOerx+P*7>1 z{B#aG_51K~<{n6}iUY4A@)pq>Wh@J===bN}VWe}RAyN*aS%5@^`BY>^-Y;rZD=&5*%v@oFBs`BEMup^rB%<;erZ^&uz3 z2UT?dVUbC!NGxpXf$kw+=pT6?3z<0cTcjoo{!wQ$MM@L}qqT%X z>Te|&GBwwvX!?wb^~wf12oLZ*SKxu8QgoS1WRqI_<_HqRgO|G@PQ)KN0wautZoRli z{}9Z`UmglkUD3LnGy-;%E_( zm8L=5{ob|FBiz>$_vP#>JG`^{lL*CMSDe-jUwXE_^p57z7wbz8G?)IozH|>TVDNXw z&-cfV>M}i6GjYS{Zms~TzZ3U=Fn(^8ezA}*pnTtXVYd#eWIUG@%drl@qJN&%e7;cT#}5;wVQDC8cr4Rl z;Yrjb!F^;QC~X$Gs^_uvQE85P6B>CtBS443|K=hQq%`Q%!7ru=a&JR^5q>(0pPmWX(o ztKwL2s6G5BeS9y!S~INGXe=Zq9v^Fmck_#qOXhoqeJck?Ft~=LB^6P&dG#a389ftWM#nEFpY`yB8JciqsYy>72p~ZtIJf$(cxIov|aDm?C70HzJ7mJYH?z$9Z z*V`Y&dgMa#W1QRNvf=)?!*{wsUaajjy#+@p@cANVlQ5V5NdMh3BLQE^{t;1tre zZPIE-w6yqA?FS9*UyGtW^)` zfl}S&MYZI>Qd$Va;*wacE1iLIV01rL>=L{vniachXSNNQD|TxkPLI&7G%X#z;3ydUQ$N}~JBwmI=SbR_L4}YF^rHmQkGTok<8Cq5bhIT%~Bj$$mq;^rz z&lR3ORx)VmILjXFdMQ1LT2`owgxK^WH!{HvT91v5_04@J$}70kNgup21Fg z0#pEQ3qh8Yk|fpC?u;O7WS2Uhw3!(}M%Zp6B&GzJsJ5N>^AFcb%Qxw8H_EUNZ_BS# z#X{-ItkgaXqX-!$Atf0mIfD$7uSqgYHk4$T#ExW`L>@9s(h3{=7yOJNtIEg^XIBDmqk0F^S8CT0T$<_OL{i<4Rw-ZDJI4$AW zw@0LyBpl94Yw(tEFe>w48&f;X1cfRD4f&}kcP81hEvjya)0_y`wzY5gb>e%9F0*5y z-jon4C5G6G%yLOPWr{bQ0L>)=Eu11(LC(OaAb+7=u%7%7Vvm(Uv?OapA4hX?jMefI zErgybg@Eg|(1gJ%y6?acn=5fdI@~Q3wDIfW_UqN@lKQ$;hf!)xOgrcS1kiG!M*O8z(^pijeL&CZKZ6dZk+V&@X;c*wO_ zD2N&j0kN%+PO$S3+6Ca85z=bMqLcPR-L~&8(X79oSX3t<0GBe^l6%3c>c9CltY})@ z7H=aKMqV{#*mUef7+^g&DWq<*qzQMUzHN2e9z~m3q&Vwpu;>|n-Py#iDGTmrZDuWm z*qbr42*A}`itvX!yakwB3yl114GK~9mQal3cUHZy2!a$w%us7A@RQ19*e@t~H?>Y_ zIB7WlX(|)>%%L)MM69SxMN*l7B1>*lk(12=S~H5KEOm%EWlaWa0*sFnbVU(#NI#mp zH^j8Z?DA3awIjPD$WqR!i1cO}29;;XcX5_{lLl+@#l;Q2sScKOmqqKZ&<3BL)?vtd zunvRMMok4dFDw@}#+J;0c)1`z9S}E~eceEhZnHV8K$G;N3963-JW=BeM-D zI-$ADSlzWYVk|B;X)a0k4->rBa;8mi_+rfyYS2$(- zGtzyuT3je59Y}hJlpg6qXgSh-(3dO-P>85y*OAB;?1^6|rYq-dK_ok03za&|xV*%% zgS{db&60JIsyZu94XIx-zmq*l`cPazLWt5*5OiqVz;zm!OucvNlT3*;13 zZ!>SrdK^r$fnou;LjW8T!RyqFLg0Z6(VE{?9Vg`*$p6d_c|=eulis{;m!(De;NNuf zZFc0}qsWXRI;i;viaRH)79_ZFptxH`$ARL399)9J6}W)3CuH7{k5Vp3r_II;Uxo-{ z6p@oZ0F8ImGiY0j`I8z-f)da>m}T$^WQKMCcjNEK<))rT?PWfB{ltWQVZALUTZYR@ z5%<_8=Z4&Nxn3JHRbzJdC^XCLMJg=Kga#P7xF96?0;}hEM=SwhPz|XP@xZ-n$9cK*c7HPD?U0eLXF}V!GASNWU3C|L zhsZ`m7Nh?lg7tDmAaJ&bw)vu}i%mJ-z!$GQ^^>}5zFDM4=pc#iVbD>+#I}uKE89ty zU)|*9m%3?9>jfW)1+bUW*hM?3s)x#}&h%f%8OsDvpSjN@Zb&2Y&8XPHZhHwP2|kj7 zzz6D_f=|@^NT3TnkC_Pg2{@@3$ORrCZ$!uhwrZRc?LA=_`%{*@GwnGc@&e8MwcM}K zbwRi(6a#S^oL2f>S8BKtrO)5fD3W&m`<3^gOxQYHgzEqvqOqa@q=Y}rN6LaMDnga@ zM}4LZ)BEaz&-QaR@|jnrT)b172$;h2e44@`NQO%obKSfuT|BQBR#nLM{16L>e*NYq z`ssy9m+)O+6B-Beem~U0U8daYZw}Zxc zgJX$85!)E?<{o3wjl%EsOJ<9)O43ZhTv6ukxIlFDlp$#20|nXRLnF5f51B&XPW-~Q z1$l~p*d*{ZOf}GOQ2PVT0Jr;P7-y{o*OLPt8P2InF>7RD zH)^MF@ydZy?(X_I4eLdy%%*90i>t>>r_!1x3 zA5;8?GgD0I7EQ5cy5#{EoMKJjg{Qb?3Evb`9K+dSiuW^LM(W)IKylV_@Y$jnyW!|DPyOv?y9F4(7^}Qza(O<+6tf1rBqY4R`*#_ z;NswZv=PXDPO#V7Le52Jz>_U=QZGpA$Cs91)iDc7 zTqjNptHj~sN`jS=)WkIsE8{f0E1KQuh&kay*49ef)1AE-f%yqpf_Rjx1u>U(cF*C` z%JikzlUl<7{nof+<5P@8=A!djJBOFp;*x*CpZu^iRHV;|!^iO1fKoONZL&(MupwB~ z{;-}ywY!1c)3_ug9`J8&=SL3E9sDYgO4@}3sRFSAsW{;rNR>S;|L3lb%wc(}G^U>N zf_$Rxus&U2vBXn)h`B8|AXr;;V%*f(7@7buq!rg_-h`mSUU?7?68mUvm5rfxjC;68 zlpnL(pXWqhj%Cjh^qwE(V#F>u)U&c<+g+P){rK}KgtE)gEj0nmQZB}#sL!d6_M%dt zy7A+0(2?3)3};yew-9d4BwM7wQqbY%T#Qk3C_AJ(&)k>GgYQS4Jqxe!2*OF7};a+Jt2XdjxeR#W=kH~>A_8j zfo5>iey`+fs3ZpLD7nRnSO>7Zk7a>zzMgI1XO~QB+*D% z_FzaN@5b(l)e5z$GV5=E-jl|Kh6S_V8*rl2EVZ&K1eg?7A+J9yp%ik+0kRNr%FiG9 z@rt1P`-&e&?PtAGC5wn42xqYS3qPH_yO;PhuHB12Nf*M-v>kWx=fw&yz1M#Fl6&o^ z>2)j(@m583@6HFB6!FoU=Y1q1KAs_BmU^;N!x?JutT^Vx!f%JA;t}oN=j52_XF$qa zw#r5E72zDI3oX9NsTX-Z$@Z)fB5t@J#@EbY#0Zzy__}eajV&(QVyp*iu+^vunJQ4) zt!PK`n}P7|LB4lPR$^8lnNR>flO zs&hQnJ$BXXq000 zBkdf>a~dTjy8EneC^G^?6lUew;$+n&?e{qS5Gb_vyV!6}y|Q#4#?pYL;UByNdD{C( zka!v_U4z92@792^#caU9yEV|XI-Zn;Dc~fyppmoY(6CYl2TNiafW^xz%*ZDUA9UK4 zis1m%m_#4|iMSL1^IT7oJ8nJ>13xs{MJ|Uts^cXzMNKVszrnBNBYKt_;JPz1@ycpB zJ(&YqWDh`9da+`5+!b{rasV`Qi!7{qEauHyMln%K>ld0I=2P=iJpcJY8?B!HlQ{`n zob(J@;k>(#0WXyi#5*F>d}72I;{fJt=Y-%sqEk+tcoO8EJ33jg$4Cy~1<(w}1un<> zmIOT#TI6aLk~`ms_y;~WpAz*SdzBOGSV3fq8)pX^*1-{Eji*zR5Tb7~yd`5Mi~6{e z57Mb!IIzS;aw()rvOiUtv5w6;I*6LjWd_`z#Jxm(j*uw_L0xN5H9Ex_HeuajtV5;^ zW1YG#mz@1;`$QuFRQFd@4C&}Kmp)-)$&$@QhQR`4Yt#rv%^#zcR=YAAUd5_G>+3eM zWV}UFEL|DYkfr?uS!^>`w$Q9edxVTrlSVmmc=Y}%5Mkg<J;#$MCJNud zlVRVCF8B^Ow~6l{AjF(ZW<)3w!6{Y|^$#ydaKJ=tt(?CI!6|4qN(9H#iQvFZ5ga95 zM*$%W(jYka#4N$7ev=8#>X3P*SoR9k3`*#4Ry}bFhFP7`;Xq?XBy?+FOmZv)%C1V^SJ_qi*$G&Tp+XT#y$#b& z4Jj8>147Kv(aDndN+E#wXx^jK^t&C*1hE%}OKzT$jv$sEcMI`#QEhi!nnOtV3BIdD zq`-v;N7+m44{5(T9x|;Qi2X?`!$kot-t!{?uQM1=UxtNkWK* z#26C$bFg8W0S*%v8U_PoliV0~?3yT0BVX#qN^%gu*Om|Rp#)+IFNzN`yx@a;FtuzJ zE7qF*!e@D=fu#6v&ze-&KmC z5eRt~Y(IwM0jw&+B}T1bzondvJ%$3xJ{# zv5Z!;=3#2O5b;c&V6z$oXc;E`8W|?FCjLSg<4$5lu(J-iy|ucFs3{fstFQ}vkxx;o zUaEz4(i9S`F_p&?rt(p>4|3#f_a3Sb9^pWosrvk%rUM!(m#a4(tDgGVU;o*j zx86Ek4kqgU%Ww^l?ptL@poz9_Dm#k(qIk<~RDJGGZTCs4J{^Z9Z!(VVz}m>X1~5G< zg^?VU1<7Q6nyzCT@nSa4d%DQwPse}}dt^`l=^VK$Ty-wY1aYJfTNT3#p4~34ZGE&@ zl7mWuG-uTp+JVUNxq0)3(HC-t!DIfX8|(h6Qv?I-wbr){>C6vCSv3SR;1ex4J=m%n zQ?!nTu?|Xeu5z|64=7fa*CY2HI+`mcHhQ3nfC)nL^c@L!2mj0qD*CdQROb3JZ5~lw z1yKfo1r?Ql4+QhJF(~cSEyq&gF!kS}i9#ND*gUAQp73Boekj9TM}3NZykV)}f{YZh za=yTzq#n<4w71Hvgt8z2u>vTJ67}4OX(+1EK(iY_GOP%gs6Q}4bqb4+AwVL`@qxA5 zCvzID6ak(&A_;caaT?-Z8AFUrAWLAAmYmr7Ge!!bI!EU9aHSe2XfjYjh$6ldXu*eJ zF;t8^LJD3&2kQ6>Hy|k#53UVSEu|Ka?Q=U!X3pG#AQ+z(83dJaf**rN#9CNjH;-Mf zZv$DDCu+vQ3)mwHuDYA3Q419~)990&lGLm7&q6aZ3=+!*Z1L-oZa47h62qf|t zlQU}9Ag+$Xf`oBB)S-|N)Mhg*IA2PxvqUZq3DtysfUO3d1iD}%aH)KCDL;_?2ff5Y z;}tQ%TG>mlG^Tv>ie84k1v7*!OujooTflK7thH@H|8YNzVHzAHB><2pXF|{SCrVwY z{Yx3j8PlU33T2`)9f$}($_b+`$%D6}DX9(>3Ugy>S}1nHwWL)+2=9U3TU^SebR_E!a86n7jo}`8C)GPbZ*}fK-BNA1M{5dtH;MuRk`*@YG~1y_ zV>J{t8rkMk=KG=sA+?oOlKBo6F@jp#ysRz9JIA+T3yAVgdx&$FNa&Hrk!bnoB5J&4CNWhY7Op=4Q@zk zv%zg~g)6XCO*XsGA!;4GqQAL1zuwVyOpkBDksfkwba^JcYmUXYsBP^IIl zaMT7pNb(Cz3Au+u56)I=Lb2WoUcXR%SM69g!xtAIJ3&IM7o1%smG<4#`$eOHq|eR{M_^w-SeZ2de6MH$yOm zF@9^2y;8JQeJLHYrx98JKw;r52U2>guhbeV4+Rjr@>DJTzuR0!}hu5c42}?J5B;RnjB`puBBhYdLIY^?02SIkD7GT@OzDM ziB6kHSHdoau*y#w7e9RlR4_&6(#af*a(8Tw))<#e07zGpZUN~Qo>z>^qBbsZKEOno zNqWJ32{s#-ZY>`VMY@{v8RIhCNX&ge+%VqQL6sw@H8XfWb5t*Ol{`qK>k)x8%`i1# z_)VC;mUL?oHz^L6XoW|m>DOwWN%?#T{aIvY*mJ`3Cpojx_6!G4J*#h4Pq&Ak=a5rf z{akzaMGiUD)o0touW-nzu70UKyzdKhI@Q(F?cqB(ynES3leyeu6_zb@g0(_!$m4)zwe8 zho9w;Q(b+sJ^XDBIn~vt+QVl!e>6-!v{I!R97Ep4Q(b+iJ$w&`oa*YC_VE22a;mHEYY!je zkW*d#KzsNR4ms7;54VS(;E+>YJ=Y$7hC@zu_0#R)XF23lSD$PTf15*2b@i#{Fyu&4 z%Ml6=U{>WxjwFdBLwb@UN9<3LlLN}eqfATY3AG%-s@-f>LAPPPO>kDoa@6}A#`|!B z!RTM$s8w6F%K{@s9WXnR8z+oUdRl)d`D_OE6NzCDet)}{n`1*d+2d{nYN2X1q1`1z zi@wKUL76HOsy$*>=rZ;h9&#-5@q7UfBupXpB@r{}X!|8uc%*S^Zw;De86Nhe_oLOz zcu|nWwFPD8@Vo?_Z3LW0Y*i?^MlFew+%$al)XKrU3Q>j>nkh=Da&<0x;3AWBN3^a=@*YWVTc3^GRqZ8 zY~AQ^TPyz_AW={o9Pn!}K%&u+>voLTgmiLsyd-$apu%7Q*uYk%k-+1iX2B&kS%d3q zmRyUsbBI?QDD@M9Ij6jpPNha^UpAC}tZYR=!)T-pG5Cym>tj$ce%qJ{B6A7@I0~A; zLYs`JjlDCAdKqIawUG>}C3RZq)?{X-2&kZid&A1&k*-!M)Sa1m zZfAO~{is~8LOG%C%rUShj)enOL|}{;nM_1I%vn%dA!Sz76(*UmJ#buJ9V?6S&;^~B z^BepXxSXt4ayw$v82Rb-P9ir@9QS7JtZm%4agE+Yn^0Tr(5Ty#L>Bwy7Y8<$iDv z@&#O_LIgNxt`OQLu_TcoKNLm>=cYXvvmmwO6U(TjL;2T5gDo9u*CHp)zyzT_W0k3o zHOs-fW=RlKj6s#zcoZZE9~KER!{8z_BC_k#VRdwp9!^#sWY?JCus1tBHu*99g!fuB zMx|3*FN}LGwDsA}(NNGHj))e^4WgETK!9qih6i&A0h*RH@!*}QH%tgdS9>)2+@qyw zcZRfh&nys24hY~nLx8P6V~Xs8V6?NSGZ7q>soQetWgMwf4vjQM{A;a0Lo@`k!;Tt2 zGHZ#_w)SVVls5C+lsf}TBKp%%M&kZujpQL zGb33*%wn>DQgDr(v2k>W!x4iMj*(d{3kaIw3^Ku68L>5$W^ZC^y)7LWGZ_Q01Vz37 zlVWQy6FD$CVF3AOR2U6F51EV_KMd$lh#>Gh86pn*X5;17tYPsK7+jk*UCf$pZPs*a zv&Qo+vxb(r--gq!e1bz6gg8~W?qWPKF&0F0nzSM8p5O9 z7(0W%o#%LX0YqMAcgntFE}4Gmbt2*s-G<{;r<6JX3miR`N4Q_=OjcR{LMf71k1I&* z(X;ryvcXT}6y0$t7t${uQ_61cq?JRpcBo($*CL&fZ&i0Is2Qn@5}KnA6Qof$0HU7M zx4m7C-sAcD`wWbP2sB8AesHe$2P_dRoh*rSHy@1tgZeZ21w2)Q#}@J-36_2t{^=CI ze$p1jO1x!leoM_P6aYI0I%T)lQqVPJ;9$nd`l2(-Ac^AWlH6hPULr|#RL6(FGI@~b zdBjOd*D=xq^nNAXB5SL!q#E+b>sd#_p~a<`Wh`1VXTfpIg3AAc*+M!diEF(uG;@?# zf#43hvt^rLus)sSw`~K-8*B150@N&0m2rl;3CGg07NY>!7^S-|JlXOS>UOOG`!yr5 zT~M*gGqebD31iU8luxLR)xq3A@q98ytH>RHldi3n)VokQgbifz93zJ&!rt1mn?9n` zGe)XR*}+sW>9vbV3N<<>Kg4%HuUhC!wxcsPnQA;%=b0$jCzr>pyl)gk$$Ok*l6;C~ zDX72&3le_C1S~AgT?+1^Ps#E?I~5z2bznzXge=rOX3r0MLjeQL>X@SZR2P6cgn_IM zOCgI6GBEN0yk~4v;BYeUOh{fS=TjL>NGA!nBBVUpKboM^OwfT+pIt0bpR57EY%&TV zesnDIeQ~5((XK5BlzDo{04U7ZXxLLjPo5mu#jJp529n}5CE#Zw7Np46a#|gTJvD%> zxZ<267B$VH#?^q2fQ4b$fUgbNSP!LOn;KETf=93rTLB+ICoB>1UiJ-4&xsGB<70!? zs5@*?cen|48wB4-)k{q#LcBDci2!vkLEW$)=r9|6a9h3{TnjDM>Z`g+YMWCq#IYAuKEFaMuvxd>e%VFVW(QIwsnk&di4c#C9lc+nW z&@_k^qjcubtm(~=CioGN(W#VsuEZ@UbB4$o;}(zPCL)`!aieUz1ZxdiO2jsmxGOZ( zP(u6ewZsOZ*2LDdR2#O7a0hi5vNJ%eD?7kzRxh%fCzaN&gNcTs|{O|U2E7n&LhKCJfrN4`^m6fq=yV(n(R!y9!;I&bAGaG z05U~>p(caA(yxgEiu~#}F#}Owrp?-VZl;Y|zMCkq?^quKn>HGVdSND}C3063CQ3|3 zEstzTiGEI$XvIB!66Uq}2pYwW7VaWtrO1G_qe3zTnvf<5k=3Rw=#{Zga|zt=p7P+t}ttLza{mMl6$|E38fA zhIp1C%MZ!o5MfPj!XvnJ6F}!NM`kR6!a+1E(_)1K0N7~5E@O>uVZLf8Ou%x;G}H=_ z*|ODDJA%S|Rre-v>X49Nfg`+js!93moX>pq6E5gr+)1Y*E?z+tM(%vwuPMt_$)hYa z7C2^%R(rh^nhKW&%)&VBjzRpQDj1}Gn&eTc)F9TkFk1amE+IqsZxeAnKckhlYNIu^ zrzm`l!h9rA5_Q03v^tX5fDc6WZEfq#5Th2S{j?$>OwGSjkH$>xWC z+K~Ija@=P^c1T_C%_$nk(WakK9kN69mA%?V+abwXxn(>^gb+A0W~{TF+QiRkBUXu@ zo!W>c+CG)|DI=E8aevB)UE*ZcwbMu#0~Fd;=2>Ep`Vxc?=yZpyXK!?43JJiIWT9y= z;01pZxre;UH25-`mDZEQv;Dyw(ULFD4Zhz-;K5A(V7;iL&Miv5$7RK${EqUAesU0l7=N0~4AN)#Q6sPigba7sb@AB%ccS}~~)mK+;lk#zM=08uLIy>pM z$8P3rZxj=HZk~Fk{HwgVsFKzk!Cc@WRL#AcC8ug~KAOJojkiuUJ<8gqId;=uSy9t( zyZiMt{kFTC2H{xgBWfBd@@VGQe(t7gf8>d?gSY27Rl^S9o0SsACt1ok&X{z;0!^PT z2ryu52U`bwm`1p(Fg%b%_{+jS{noeL$3C?FxeL5_?ytW5<~5t=JZ?pVYf>BiW`aAd zxi`i7;Ft0aWo_>TrrG0@?oHR;|K933wze-4V2kR566ugm_Noq?@}|@EpHpvt0+XtH zlM)yCGynFRvhU*ir`Zv=dykypnYL&qF(z_EXJ36~C+jtDmYtuQ^zJXaYJpd`{1o$2 zfBNpS_xE{t(xs7-E}r{r+pu-u&+# zdC8Cd!S8?HFP`BtH{SBqpZ~9a?}~r^Ur)~v~AnAx88W> z3?dhvaTbNHpig|}=A+-EKcBo&uje&xafbKl?4xJP{LwRyqAzl@ceZ|(Cd=#$IlhAj z^W4qQH>l?9xRV-q_QtYk+nRJAo%Gr}y+_OLqoOkXck=_geuZxSB^`eAcYSpCoge*M z>hSB`sef`~4C*Y8ed6aId;FdMe*8KPKYRWCzxYRg`M%fEy_LN#S^W(!c4(``;U7LdyP4<^AskEj-sO zrmVjF*~d?JmD!?eH?j-#$M-9Tk|@qCPz&`lKKNtlzT})K^U!yHdHf%5JTu8|e))g< zclZ9lV^6;J%w$1m#qDz8(e~=AI&5Fel(%m^G4YQpL;%7Y?HGe7?2->eV6^1)v@-8}+to(mFUYOgtU z&u?vamwx%dpLp;8y!=NSy3|}%m)Jj{N5B)p54%a^j<)vs}3k*+FkeuT{)1n!Q2z_GMk%}*`pI! z3M(wkSt{2M={G##?KQQ3;G@}nPmm;x#t#RRJ=&ojdp7!>4+ZKNaWemTVhmw*)6`LGxH3VoWql`;SLW$*VWFG)gQlEnKI-a z=cA9&OxfiNu z(Q?Q;${C#g+{-PG@sRL{n;FvV;&=f;qs9mNQj8wq)rHUGgLiK$cAe^o`7FVFKF}5S zS*p%OX?S^)p8a#z+!$kB#B3F8q*JYqj!sy6C}B$!jSK=xyjPjZl=GY_uZ_xi)*W^Z zp-d{kr`mt))q78ZZI$r44Cuu6YL&c(@s8>;{p`j(pR`t@e+a?2bdko(m&vTz?1vY%I+?)FG#@C${wKb>J*+)m;6FNHiQ!2fk zhP78C!AB*s0*b}JF|9lB z^o{>L(F3v#i2PL2hjbeU2Oy!K5%f97XMl|+kiXKrhULH=apm}J>ZB-NB5|I)biTTc zGnU_DVVv$OQ{4?41eBTIS#FCm5hSi?F#rX$;81f~{6+JM!2>z@`nD_P<<=LfX19$g zIHafmpY149TB(d%-pzGaieA4eu;&uA(Kz-3Vhyc<1=ln^TxNjeUoc+{68>EjQ4o&V zR5!tt8cUdZql#Q_gX7$y@IRoVY%5M`fdPn#m;j^v10Xz;$ioU9%?Dm6@r3(4$Uc?O zZr~C#ZW0`M&1_AjBGJ`m6dCACe?;UWEz?Ml7Fn?~q~*qFd@Irl?qJfwnLkZa^Uzji z3ASLBJcI7XS%Ne1+cXpnSH7s;*eEkB=@j&5RIkaW0?+*77GyQ)e5iS>CaYaaNV08C za{K~EA`P@k)JT2Sj+UCkNPXmEOecZB+a~jXHUuU1bFdA*j4(9dKXg_wtY;Ro<~2(} zWz@TtNhc-cwCzZQjbSj2!YaTU=pEXx9{7*BIoc9xFF~AO1m){RNV8fyQ1e^%be3J$%^#k0`NG~_d3lIb;ikzht8y8j zp@VGx06+thPW~#>Y(R|B=cyL^Rv==SfB=0bKyRq1(=MFCwTU#8$-WZae0e<@C}v-I z`J*U!a(!JMb6|GO7t71Xdp$>V^fm^en8$_M?_Ick01)jL5(m@m)AS`yreED^GG{

*ted_fAb!=P6_< z%NP>he~y)qMfH`BzejuA-viv=`O$~}M2Bf;&)(RZQa(rLWS(H4KFX7!46|aSL3Fw} z`lvDvmphs9Jr~ySPoEdbGtgn2qkcY-KP<-IT;h?3?ZBORCOjw%B^&&o8^-~w*m@j? z=-uhl=l(>ibEkS=WqcG%TN-nt$!jo>S<#Sd!7Jw-hx^Urs%cR7la6y`^XRy^aeRE7 znaMqzcXjYvhrv z?9_9rd1-~6bMBVDp>F=}FTT)TDOu3q&T}1{L*r;0>x$yAEF+l#=-T&~4PagXWeuSI5fBC=s)KC4?Z^@;gA|-n6=D+#6f3y7y zALF^->HNx1{&z?IrJnoSKQVc5|IvS?!=JDh;`cc`!~f-+d<$K;@Zb(7o5;Wk^DT`16gjcU^LusMIn=cMt@7CmZ2W1k*A&WBQiR4Sg=#Qx)msdAz zo6kaaSKZOdBpdxvjzswMm-A{e+Ah9HW(r-K=L@4x=kfas`QS#OPd<7)pLD9FHST~$ zk-?xJ+(7d8V!Vw$qdPKZ^R-Acv8&YW5X>7~L%U#~+^1Exf4*Acl$5Z1GY+Dj)4G`4{l{>Re!V+PgL;S>d!to=XY|ygD=qUj2X;`+8LuAz^HoA-{IhM z3~&Ev`(W^^iOf4#REO3@Dj-BQ`fM)M6l{ee^6CsvKfvE?^ia>`GfNRCYYXl(YEL6F(ItZpH(EN|`wQYT@ zRgxTIsVOjK;sq-&_3kk-`in=e?3m841e|ICwN8ULgnpGHAaSpceiIMzyYj3!R6o(3 zd1CY%jMwiX=6px(kY{;|@US9(LTHyxHOD1S+v}ZcdnmrkZ6?`xdZ5_vbaOSqc2KC( zG(m~F>%@>MVzUR82&TcOTQmoa4+i_{{>LOV{U7~0y%!F$AawBenEgU65+~DFEq6h= z=;{8AozbSqT9&Ero9C-sqI>I(0Xq6@8j9iQ+|OTE?59gF5*aZLJ`kN{|02c2Vt3-m z^Wd?6p3^sd;}z{;206|*xcZS? zqjK6y768ZH!nl}IZ9|co^*11l)U+V}W1W0n0$UEvL;;5BJn3ePQZ?A;Bacn~>zHv8 z8b#v{1d8baFftavkukmsE!JauI_*3|)#0j?MbiaE(A2!ya4+b_KcH#Qjen^2B1$Rs z^Xh!Res0KK1UL!$CZePX(~G(S3$GwbXVYt!8VKg6A(#bB3Qx}wDAijd$w|9k_K4q_ zdS?}lrTPip*#=p}e@5fwBFhn804?J!#eFn2N`}+aC_&c;Vy!%&;=(XW9SXhTQvX1z0e74`wRPHOCJ^%G{2rK$$Xs5y!#FPe(7xaVTv?ewcxsQNg3Dnd)F1(vB}~ z;z6%#=U_7vN;3fF2e1sPDPBDo%w^SAKQ%Yl0k2AOjf3vm=-*Ogf@`DyC+DAE&IgNn zfa_0(Or@d04UPqleigoLxQu=maU*R&17-9w)j|=_ubgy;kZiOStg$+=Hn^|I`xnNb zm>Iwdk;csESQ3e4AK}!pJOFamA{^@`?7r|u(C{ptqGAl84(c5M3N}p zu^u;0x(p=d0D-ZXHDGD%(nx2%!W07ojm5gYz5tC2j(y(l3xNKjAjjuK^MWCD-_PHW zKfp zkR4;l9d--ggsipG%1vR{G`uBCbG1R6u>`Od0OkwfI!ma6Qf1I(TIMp&a3h_c!Tb

?Sx27e2|ppj9V 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 literal 356747 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Ν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 diff --git a/src/mpqcmp/compress.js b/src/mpqcmp/compress.js new file mode 100644 index 0000000..9f602a6 --- /dev/null +++ b/src/mpqcmp/compress.js @@ -0,0 +1,27 @@ +import Worker from './mpqcmp.worker.js'; + +export default function compress(mpq, progress) { + progress("Loading..."); + return new Promise((resolve, reject) => { + try { + const worker = new Worker(); + worker.addEventListener("message", ({data}) => { + switch (data.action) { + case "result": + resolve(data.result); + break; + case "error": + reject({message: data.error, stack: data.stack}); + break; + case "progress": + progress(data.text, data.loaded, data.total); + break; + default: + } + }); + worker.postMessage({action: "run", mpq}); + } catch (e) { + reject(e); + } + }); +} diff --git a/src/mpqcmp/index.js b/src/mpqcmp/index.js new file mode 100644 index 0000000..bce78d8 --- /dev/null +++ b/src/mpqcmp/index.js @@ -0,0 +1,84 @@ +import React from 'react'; +import compress from './compress'; + +export default class CompressMpq extends React.Component { + state = {}; + + parseFile = e => { + const files = e.target.files; + if (files.length > 0) { + this.start(files[0]); + } + } + + onProgress(progress) { + this.setState({progress}); + } + onDone = result => { + const blob = new Blob([result], {type: 'binary/octet-stream'}); + const url = URL.createObjectURL(blob); + this.setState({url}); + + const lnk = document.createElement('a'); + lnk.setAttribute('href', url); + lnk.setAttribute('download', 'DIABDAT.MPQ'); + document.body.appendChild(lnk); + lnk.click(); + document.body.removeChild(lnk); + } + onError(message, stack) { + const { api } = this.props; + api.setState({compress: false}); + api.onError(message, stack); + } + + onClose = () => { + if (this.state.url) { + URL.revokeObjectURL(this.state.url); + } + this.props.api.setState({compress: false}); + } + + start(file) { + this.setState({started: true}); + compress(file, (text, loaded, total) => this.onProgress({text, loaded, total})) + .then(this.onDone, e => this.onError(e.message, e.stack)); + } + + render() { + const { url, started, progress } = this.state; + if (url) { + return ( +

+ ); + } + if (started) { + return ( +
+ {(progress && progress.text) || 'Processing...'} + {progress != null && !!progress.total && ( + + )} +
+ ); + } + return ( +
+

+ You can use this tool to reduce the original MPQ to about half its size. It encodes sounds in MP3 format and uses better compression for regular files. + To begin, click the button below or drop the MPQ onto the page. +

+
+ + +
+
Back
+
+ ); + } +} diff --git a/src/mpqcmp/mpqcmp.worker.js b/src/mpqcmp/mpqcmp.worker.js index 2ffdbb9..6852f74 100644 --- a/src/mpqcmp/mpqcmp.worker.js +++ b/src/mpqcmp/mpqcmp.worker.js @@ -7,14 +7,6 @@ const MpqSize = 356747; /* eslint-disable-next-line no-restricted-globals */ const worker = self; -function onError(err, action="error") { - if (err instanceof Error) { - worker.postMessage({action, error: err.toString(), stack: err.stack}); - } else { - worker.postMessage({action, error: err.toString()}); - } -} - let input_file = null; let output_file = null; let last_progress = 0; @@ -31,6 +23,7 @@ const DApi = { array.set(input_file.subarray(offset, offset + array.byteLength)); }, put_file_size(size) { + debugger; output_file = new Uint8Array(size); }, put_file_contents(array, offset) { @@ -65,25 +58,27 @@ const readFile = (file, progress) => new Promise((resolve, reject) => { reader.readAsArrayBuffer(file); }); -async function initWasm(spawn, progress) { +async function initWasm(progress) { const binary = await axios.request({ - url: spawn ? SpawnBinary : DiabloBinary, + url: MpqBinary, responseType: 'arraybuffer', onDownloadProgress: progress, }); - const result = await (spawn ? SpawnModule : DiabloModule)({wasmBinary: binary.data}).ready; - progress({loaded: 2000000}); + const result = await MpqModule({ + wasmBinary: binary.data, + }).ready; + progress({loaded: MpqSize}); return result; } async function run(mpq) { progress("Loading..."); - let mpqLoaded = 0, mpqTotal = (mpq ? mpq.size : 0), wasmLoaded = 0, wasmTotal = (spawn ? SpawnSize : DiabloSize); + let mpqLoaded = 0, mpqTotal = (mpq ? mpq.size : 0), wasmLoaded = 0, wasmTotal = MpqSize; const wasmWeight = 5; function updateProgress() { progress("Loading...", mpqLoaded + wasmLoaded * wasmWeight, mpqTotal + wasmTotal * wasmWeight); } - const loadWasm = initWasm(spawn, e => { + const loadWasm = initWasm(e => { wasmLoaded = Math.min(e.loaded, wasmTotal); updateProgress(); }); @@ -95,7 +90,7 @@ async function run(mpq) { input_file = new Uint8Array(mpq); - progress("Initializing..."); + progress("Processing..."); wasm._DApi_MpqCmp(input_file.length); @@ -105,10 +100,10 @@ async function run(mpq) { worker.addEventListener("message", ({data}) => { switch (data.action) { case "run": - init_game(data.mpq).then( - res => worker.postMessage({action: "result", data: res}, [res]), - e => onError(e, "failed")); + run(data.mpq).then( + result => worker.postMessage({action: "result", result}, [result]), + err => worker.postMessage({action: "error", error: err.toString(), stack: err.stack})); break; default: } -}); +}); \ No newline at end of file