├── src
├── main.wasm
├── extend.js
├── webgl.js
├── main.c
├── utils.js
├── index.js
└── main.js
├── rollup
├── rollup.config.es.js
├── rollup.config.cjs.js
├── rollup.config.js
├── rollup.config.iife.js
├── compile.wasm.js
└── rollup.bundle.js
├── package.json
├── .gitattributes
├── README.md
├── static
├── index.html
└── stats.min.js
├── LICENSE
├── .gitignore
└── dist
└── bundle.js
/src/main.wasm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maierfelix/wasm-particles/HEAD/src/main.wasm
--------------------------------------------------------------------------------
/rollup/rollup.config.es.js:
--------------------------------------------------------------------------------
1 | const pkg = require("../package.json");
2 | import config from "./rollup.config";
3 |
4 | config.format = "es";
5 | config.dest = pkg.module;
6 |
7 | export default config;
8 |
--------------------------------------------------------------------------------
/rollup/rollup.config.cjs.js:
--------------------------------------------------------------------------------
1 | const pkg = require("../package.json");
2 | import config from "./rollup.config";
3 |
4 | config.format = "cjs";
5 | config.dest = pkg.main;
6 | config.paths = {};
7 |
8 | export default config;
9 |
--------------------------------------------------------------------------------
/rollup/rollup.config.js:
--------------------------------------------------------------------------------
1 | import json from "rollup-plugin-json";
2 |
3 | export default {
4 | entry: "src/index.js",
5 | moduleName: "iroh",
6 | external: [],
7 | plugins: [
8 | json()
9 | ]
10 | };
11 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "devDependencies": {
3 | "rollup": "^0.47.2",
4 | "rollup-plugin-buble": "^0.15.0",
5 | "rollup-plugin-commonjs": "^8.1.0",
6 | "rollup-plugin-json": "^2.3.0",
7 | "rollup-plugin-node-resolve": "^3.0.0",
8 | "webassembly": "^0.11.0"
9 | },
10 | "dependencies": {}
11 | }
12 |
--------------------------------------------------------------------------------
/src/extend.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @param {Class} cls
3 | * @param {Array} prot
4 | */
5 | export default function(cls, prot) {
6 | for (let key in prot) {
7 | if (prot[key] instanceof Function) {
8 | if (cls.prototype[key] instanceof Function) {
9 | console.log(`Warning: Overwriting ${cls.name}.prototype.${key}`);
10 | }
11 | cls.prototype[key] = prot[key];
12 | }
13 | };
14 | };
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
4 | # Custom for Visual Studio
5 | *.cs diff=csharp
6 |
7 | # Standard to msysgit
8 | *.doc diff=astextplain
9 | *.DOC diff=astextplain
10 | *.docx diff=astextplain
11 | *.DOCX diff=astextplain
12 | *.dot diff=astextplain
13 | *.DOT diff=astextplain
14 | *.pdf diff=astextplain
15 | *.PDF diff=astextplain
16 | *.rtf diff=astextplain
17 | *.RTF diff=astextplain
18 |
--------------------------------------------------------------------------------
/rollup/rollup.config.iife.js:
--------------------------------------------------------------------------------
1 | const pkg = require("../package.json");
2 | import config from "./rollup.config";
3 | import json from "rollup-plugin-json";
4 | import buble from "rollup-plugin-buble";
5 | import resolve from "rollup-plugin-node-resolve";
6 | import commonjs from "rollup-plugin-commonjs";
7 |
8 | config.format = "iife";
9 | config.dest = pkg.browser;
10 | config.external = [];
11 | config.plugins = [
12 | json(),
13 | buble(),
14 | resolve({
15 | jsnext: true,
16 | browser: true
17 | }),
18 | commonjs({
19 | namedExports: {}
20 | })
21 | ];
22 |
23 | export default config;
24 |
--------------------------------------------------------------------------------
/rollup/compile.wasm.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const compiler = require("webassembly/cli/compiler");
3 |
4 | let args = [
5 | "-q",
6 | "-o", "./wasm_tmp.wasm",
7 | "src/main.c"
8 | ];
9 |
10 | module.exports = function() {
11 | return new Promise((resolve) => {
12 | compiler.main(args, (e, path) => {
13 | if (e) throw e;
14 | let data = fs.readFileSync(path);
15 | let code = `
16 | let binary = new Uint8Array([${new Uint8Array(data).toString()}]);
17 | export default binary;
18 | `;
19 | fs.unlinkSync(path);
20 | fs.writeFileSync("src/main.wasm", data);
21 | fs.writeFileSync("src/main.js", code, "utf-8");
22 | resolve();
23 | });
24 | });
25 | };
26 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # wasm-particles
2 |
3 | [Demo](https://maierfelix.github.io/wasm-particles/static)
4 |
5 | This is a visual benchmark, each particle is updated from WebAssembly and then drawn to the screen with WebGL. Normally you would outsource everything to the GPU, but to showcase WASM's speed each particle is updated within the WASM module (and so updated on the CPU).
6 |
7 | There is also some basic glue code to work with point based textures. You can tell the wasm module to allocate some space for a RGB texture and then have access from JS to manipulate it etc. Since there is no garbage collection for WebAssembly yet, you have to free the texture manually. The three example methods to work with textures: ``allocateTexture``, ``freeTexture`` and ``drawTexture`` which fills the texture's pixels into the relative particles.
8 |
--------------------------------------------------------------------------------
/static/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
27 |
28 |
31 |
--------------------------------------------------------------------------------
/rollup/rollup.bundle.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const pkg = require("../package.json");
3 | const wasm = require("./compile.wasm");
4 |
5 | const rollup = require("rollup");
6 | const json = require("rollup-plugin-json");
7 | const buble = require("rollup-plugin-buble");
8 | const resolve = require("rollup-plugin-node-resolve");
9 | const commonjs = require("rollup-plugin-commonjs");
10 |
11 | let config = {};
12 | config.entry = "src/index.js";
13 | config.moduleName = "iroh";
14 | config.useStrict = true;
15 | config.format = "iife";
16 | config.dest = pkg.browser;
17 | config.external = [];
18 | config.plugins = [
19 | json(),
20 | buble(),
21 | resolve({
22 | browser: true
23 | }),
24 | commonjs()
25 | ];
26 |
27 | const outputOptions = {};
28 |
29 | async function build() {
30 |
31 | await wasm();
32 |
33 | const bundle = await rollup.rollup(config);
34 |
35 | const { code, map } = await bundle.generate(config);
36 | fs.writeFileSync("dist/bundle.js", code, "utf-8");
37 |
38 | }
39 |
40 | build();
41 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 Felix Maier
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 |
6 | # Runtime data
7 | pids
8 | *.pid
9 | *.seed
10 |
11 | # Directory for instrumented libs generated by jscoverage/JSCover
12 | lib-cov
13 |
14 | # Coverage directory used by tools like istanbul
15 | coverage
16 |
17 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
18 | .grunt
19 |
20 | # node-waf configuration
21 | .lock-wscript
22 |
23 | # Compiled binary addons (http://nodejs.org/api/addons.html)
24 | build/Release
25 |
26 | # Dependency directories
27 | node_modules
28 | jspm_packages
29 |
30 | # Optional npm cache directory
31 | .npm
32 |
33 | # Optional REPL history
34 | .node_repl_history
35 |
36 | # =========================
37 | # Operating System Files
38 | # =========================
39 |
40 | # OSX
41 | # =========================
42 |
43 | .DS_Store
44 | .AppleDouble
45 | .LSOverride
46 |
47 | # Thumbnails
48 | ._*
49 |
50 | # Files that might appear in the root of a volume
51 | .DocumentRevisions-V100
52 | .fseventsd
53 | .Spotlight-V100
54 | .TemporaryItems
55 | .Trashes
56 | .VolumeIcon.icns
57 |
58 | # Directories potentially created on remote AFP share
59 | .AppleDB
60 | .AppleDesktop
61 | Network Trash Folder
62 | Temporary Items
63 | .apdisk
64 |
65 | # Windows
66 | # =========================
67 |
68 | # Windows image file caches
69 | Thumbs.db
70 | ehthumbs.db
71 |
72 | # Folder config file
73 | Desktop.ini
74 |
75 | # Recycle Bin used on file shares
76 | $RECYCLE.BIN/
77 |
78 | # Windows Installer files
79 | *.cab
80 | *.msi
81 | *.msm
82 | *.msp
83 |
84 | # Windows shortcuts
85 | *.lnk
86 |
87 | www
88 |
89 | package-lock.json
--------------------------------------------------------------------------------
/static/stats.min.js:
--------------------------------------------------------------------------------
1 | // stats.js - http://github.com/mrdoob/stats.js
2 | (function(f,e){"object"===typeof exports&&"undefined"!==typeof module?module.exports=e():"function"===typeof define&&define.amd?define(e):f.Stats=e()})(this,function(){var f=function(){function e(a){c.appendChild(a.dom);return a}function u(a){for(var d=0;dg+1E3&&(r.update(1E3*a/(c-g),100),g=c,a=0,t)){var d=performance.memory;t.update(d.usedJSHeapSize/
4 | 1048576,d.jsHeapSizeLimit/1048576)}return c},update:function(){k=this.end()},domElement:c,setMode:u}};f.Panel=function(e,f,l){var c=Infinity,k=0,g=Math.round,a=g(window.devicePixelRatio||1),r=80*a,h=48*a,t=3*a,v=2*a,d=3*a,m=15*a,n=74*a,p=30*a,q=document.createElement("canvas");q.width=r;q.height=h;q.style.cssText="width:80px;height:48px";var b=q.getContext("2d");b.font="bold "+9*a+"px Helvetica,Arial,sans-serif";b.textBaseline="top";b.fillStyle=l;b.fillRect(0,0,r,h);b.fillStyle=f;b.fillText(e,t,v);
5 | b.fillRect(d,m,n,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d,m,n,p);return{dom:q,update:function(h,w){c=Math.min(c,h);k=Math.max(k,h);b.fillStyle=l;b.globalAlpha=1;b.fillRect(0,0,r,m);b.fillStyle=f;b.fillText(g(h)+" "+e+" ("+g(c)+"-"+g(k)+")",t,v);b.drawImage(q,d+a,m,n-a,p,d,m,n-a,p);b.fillRect(d+n-a,m,a,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d+n-a,m,a,g((1-h/w)*p))}}};return f});
--------------------------------------------------------------------------------
/src/webgl.js:
--------------------------------------------------------------------------------
1 | function compileShader(gl, type, source) {
2 | let shader = gl.createShader(type);
3 | gl.shaderSource(shader, source);
4 | gl.compileShader(shader);
5 | return shader;
6 | };
7 |
8 | export default function initRender (ptSize) {
9 |
10 | let gl = canvas.getContext("webgl", {
11 | antialias: false,
12 | alpha: true,
13 | depth: false,
14 | stencil: false
15 | });
16 |
17 | gl.depthMask(false);
18 | gl.disable(gl.DEPTH_TEST);
19 | gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
20 |
21 | let program = gl.createProgram();
22 |
23 | gl.attachShader(program, compileShader(gl, gl.VERTEX_SHADER,
24 | `
25 | attribute vec3 aColor;
26 | attribute vec3 aPosition;
27 | varying vec3 vColor;
28 | uniform vec2 res;
29 | uniform int time;
30 | void main(void) {
31 | vColor = aColor / 255.0;
32 | vec2 circle = aPosition.xy / res * vec2(2, -2) - vec2(1, -1);
33 | gl_Position = vec4(circle, 0, 1);
34 | gl_PointSize = 1.0;
35 | }
36 | `));
37 | gl.attachShader(program, compileShader(gl, gl.FRAGMENT_SHADER,
38 | `precision lowp float;
39 | varying vec3 vColor;
40 | void main(void) {
41 | gl_FragColor = vec4(vColor.r, vColor.g, vColor.b, 1.0);
42 | }
43 | `));
44 |
45 | gl.linkProgram(program);
46 | gl.useProgram(program);
47 |
48 | let resLoc = gl.getUniformLocation(program, "res");
49 | gl.uniform2f(resLoc, canvas.width, canvas.height);
50 |
51 | gl.viewport(0, 0, canvas.width, canvas.height);
52 |
53 | let coordBuffer = gl.createBuffer();
54 | let colorBuffer = gl.createBuffer();
55 |
56 | let coordLoc = gl.getAttribLocation(program, "aPosition");
57 | gl.enableVertexAttribArray(coordLoc);
58 |
59 | let colorLoc = gl.getAttribLocation(program, "aColor");
60 | gl.enableVertexAttribArray(colorLoc);
61 |
62 | return {
63 | gl, program,
64 | coordBuffer, colorBuffer,
65 | coordLoc, colorLoc
66 | };
67 |
68 | };
69 |
--------------------------------------------------------------------------------
/src/main.c:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | int PARTICLE_COUNT = 0;
6 | int PADDING = 2;
7 |
8 | import void printi(int);
9 | import void printfl(float);
10 | import void printxy(int, int);
11 | import int getTime();
12 | import float randomf();
13 |
14 | struct Ball {
15 | float x;
16 | float y;
17 | float vx;
18 | float vy;
19 | };
20 |
21 | struct Ball ball = {
22 | .x = 0.0, .y = 0.0,
23 | .vx = 0.0, .vy = 0.0
24 | };
25 |
26 | int width = 0;
27 | int height = 0;
28 |
29 | struct Particle {
30 | float x;
31 | float y;
32 | float z;
33 | };
34 |
35 | struct Particle *particles;
36 | struct Particle *cparticles;
37 | struct Particle *oparticles;
38 |
39 | export int getParticleCount() {
40 | return PARTICLE_COUNT;
41 | }
42 |
43 | export int getParticleByteSize() {
44 | return sizeof (struct Particle);
45 | }
46 |
47 | export struct Particle* getParticleColorOffset() {
48 | return &cparticles[0];
49 | }
50 |
51 | export struct Particle* getParticlePositionOffset() {
52 | return &particles[0];
53 | }
54 |
55 | export void updateMouse(int x, int y) {
56 | ball.x = (float) x;
57 | ball.y = (float) y;
58 | }
59 |
60 | export void init(int ww, int hh) {
61 | width = ww;
62 | height = hh;
63 | PARTICLE_COUNT = (width * height) / PADDING;
64 | int amount = (width * height) * getParticleByteSize();
65 | particles = malloc(amount);
66 | oparticles = malloc(amount);
67 | cparticles = malloc(amount);
68 | for (int ii = 0; ii < PARTICLE_COUNT; ++ii) {
69 | float xx = (ii % (width)) * PADDING;
70 | float yy = (ii / (width)) * PADDING;
71 | particles[ii].x = randomf() * width;
72 | particles[ii].y = randomf() * height;
73 | oparticles[ii].x = xx;
74 | oparticles[ii].y = yy;
75 | cparticles[ii].x = (xx / width) * 255.0f;
76 | cparticles[ii].y = (yy / height) * 255.0f;
77 | cparticles[ii].z = 128.0f;
78 | };
79 | }
80 |
81 | export int* allocateTexture(int ww, int hh) {
82 | int size = 4 * (ww * hh);
83 | int *data = malloc(size * sizeof (*data));
84 | // initialize with zero
85 | for (int ii = 0; ii < size; ++ii) data[ii] = 0;
86 | return data;
87 | }
88 |
89 | export void destroyTexture(int **texture) {
90 | free(*texture);
91 | }
92 |
93 | export void drawTexture(int *texture, int x, int y, int ww, int hh) {
94 | int size = (ww * hh);
95 | float factor = 0.1f;
96 | for (int ii = 0; ii < size; ++ii) {
97 | int px = ii * 4;
98 | if (texture[px + 3] == 0) continue;
99 | int r = texture[px + 0];
100 | int g = texture[px + 1];
101 | int b = texture[px + 2];
102 | int xx = x + (ii % ww);
103 | int yy = y + (ii / ww);
104 | int ix = yy * width + xx;
105 | if (ix < 0 || xx >= width || yy >= height) continue;
106 | //particles[ix].x += 1.0f;
107 | cparticles[ix].x = r;
108 | cparticles[ix].y = g;
109 | cparticles[ix].z = b;
110 | };
111 | }
112 |
113 | void updateBall() {
114 |
115 | }
116 |
117 | export void tick() {
118 | int t = (float) getTime();
119 | float s = 19.75f;
120 | float ease = 0.05f;
121 | updateBall();
122 | float bx = ball.x;
123 | float by = ball.y;
124 | for (int ii = PARTICLE_COUNT; ii > 0; --ii) {
125 | // move back to origin point
126 | particles[ii].x += (oparticles[ii].x - particles[ii].x) * ease;
127 | particles[ii].y += (oparticles[ii].y - particles[ii].y) * ease;
128 |
129 | int dx = bx - particles[ii].x;
130 | int dy = by - particles[ii].y;
131 | int dist = (dx * dx) + (dy * dy);
132 |
133 | if (dist < 12500) {
134 | float t = atan2(dy, dx);
135 | particles[ii].x -= cosf(t) * s;
136 | particles[ii].y -= sinf(t) * s;
137 | }
138 |
139 | // resets pixels after each frame (like clearRect)
140 | // disabled since we dont draw texture based
141 | //cparticles[ii].x = cparticles[ii].y = cparticles[ii].z = 0.0f;
142 | };
143 | }
144 |
--------------------------------------------------------------------------------
/src/utils.js:
--------------------------------------------------------------------------------
1 | export function mergeObjects(a, b) {
2 | console.assert(a instanceof Object);
3 | console.assert(b instanceof Object);
4 | for (let key in b) {
5 | a[key] = b[key];
6 | };
7 | };
8 |
9 | export function roundTo(a, b) {
10 | let n = 1 / b;
11 | return (Math.round(a * n) / n);
12 | };
13 |
14 | export function load(buffer, options) {
15 |
16 | options || (options = {});
17 |
18 | var imports = options.imports || {};
19 |
20 | var memory = imports.memory;
21 | if (!memory) {
22 | var opts = { initial: options.initialMemory || 1 };
23 | if (options.maximumMemory)
24 | opts.maximum = options.maximumMemory;
25 | memory = new WebAssembly.Memory(opts);
26 | memory.initial = options.initialMemory || 1;
27 | memory.maximum = options.maximumMemory;
28 | }
29 |
30 | var table = imports.table;
31 | if (!table)
32 | table = new WebAssembly.Table({ initial: 0, element: "anyfunc" });
33 |
34 | function grow() {
35 | var buf = memory.buffer;
36 | memory.U8 = new Uint8Array (buf);
37 | memory.S32 = new Int32Array (buf);
38 | memory.U32 = new Uint32Array (buf);
39 | memory.F32 = new Float32Array(buf);
40 | memory.F64 = new Float64Array(buf);
41 | if (imports.ongrow) imports.ongrow();
42 | }
43 |
44 | grow();
45 |
46 | function getInt(ptr) {
47 | return memory.S32[ptr >> 2];
48 | }
49 |
50 | memory.getInt = getInt;
51 |
52 | function getUint(ptr) {
53 | return memory.U32[ptr >> 2];
54 | }
55 |
56 | memory.getUint = getUint;
57 |
58 | function getFloat(ptr) {
59 | return memory.F32[ptr >> 2];
60 | }
61 |
62 | memory.getFloat = getFloat;
63 |
64 | function getDouble(ptr) {
65 | return memory.F64[ptr >> 3];
66 | }
67 |
68 | memory.getDouble = getDouble;
69 |
70 | function getString(ptr) {
71 | var start = (ptr >>>= 0);
72 | while (memory.U8[ptr++]);
73 | getString.bytes = ptr - start;
74 | return String.fromCharCode.apply(null, memory.U8.subarray(start, ptr - 1));
75 | }
76 |
77 | memory.getString = getString;
78 |
79 | var env = {};
80 |
81 | env.memoryBase = imports.memoryBase || 0;
82 | env.memory = memory;
83 | env.tableBase = imports.tableBase || 0;
84 | env.table = table;
85 |
86 | function sprintf(ptr, base) {
87 | var s = getString(ptr);
88 | return base
89 | ? s.replace(/%([dfisu]|lf)/g, ($0, $1) => {
90 | var val;
91 | return base +=
92 | $1 === "u" ? (val = getUint(base), 4)
93 | : $1 === "f" ? (val = getFloat(base), 4)
94 | : $1 === "s" ? (val = getString(getUint(base)), 4)
95 | : $1 === "lf" ? (val = getDouble(base), 8)
96 | : (val = getInt(base), 4)
97 | , val;
98 | })
99 | : s;
100 | }
101 |
102 | Object.getOwnPropertyNames(console).forEach(key => {
103 | if (typeof console[key] === "function")
104 | env["console_" + key] = (ptr, base) => {
105 | console[key](sprintf(ptr, base));
106 | };
107 | });
108 |
109 | Object.getOwnPropertyNames(Math).forEach(key => {
110 | if (typeof Math[key] === "function")
111 | env["Math_" + key] = Math[key];
112 | });
113 |
114 | Object.keys(imports).forEach(key => env[key] = imports[key]);
115 |
116 | if (!env._abort)
117 | env._abort = errno => { throw Error("abnormal abort in " + file + ": " + errno); };
118 | if (!env._exit)
119 | env._exit = code => { if (code) throw Error("abnormal exit in " + file + ": " + code); }
120 |
121 | env._grow = grow;
122 |
123 | return WebAssembly.instantiate(buffer, { env: env })
124 | .then(module => {
125 | var instance = module.instance;
126 | instance.imports = imports;
127 | instance.memory = memory;
128 | instance.env = env;
129 | return instance;
130 | });
131 | };
132 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import { roundTo, load, mergeObjects } from "./utils";
2 |
3 | import wgl from "./webgl";
4 | import buffer from "./main.js";
5 |
6 | canvas.width = roundTo(window.innerWidth, 2);
7 | canvas.height = roundTo(window.innerHeight, 2);
8 |
9 | let width = canvas.width;
10 | let height = canvas.height;
11 |
12 | let mx = 0; let my = 0;
13 |
14 | const INT_BYTES = Int32Array.BYTES_PER_ELEMENT;
15 | const UINT_BYTES = Uint32Array.BYTES_PER_ELEMENT;
16 | const FLOAT_BYTES = Float32Array.BYTES_PER_ELEMENT;
17 | const DOUBLE_BYTES = Float64Array.BYTES_PER_ELEMENT;
18 |
19 | function createTexture(width, height) {
20 | let offset = program.allocateTexture(width, height);
21 | //console.log(`Allocated ${width * height * 4} bytes at ${offset}`);
22 | // this can be used just like ImageData
23 | let data = new Uint32Array(instance.memory.buffer, offset, 4 * (width * height));
24 | return ({
25 | data,
26 | offset,
27 | width, height
28 | });
29 | };
30 |
31 | let tex = null;
32 | function draw() {
33 | let width = 128;
34 | let height = 128;
35 | if (tex === null) tex = createTexture(width, height);
36 | let xx = 0;
37 | let yy = 0;
38 | let ww = width;
39 | let hh = height;
40 | //program.drawTexture(tex.offset, xx, yy, ww, hh);
41 | };
42 |
43 | window.addEventListener("contextmenu", function(e) {
44 | e.preventDefault();
45 | });
46 |
47 | window.addEventListener("mousemove", function(e) {
48 | if (program === null) return;
49 | mx = e.clientX;
50 | my = e.clientY;
51 | program.updateMouse(mx, my);
52 | });
53 |
54 | window.program = null;
55 | let instance = null;
56 | let imports = {
57 | initialMemory: 512,
58 | imports: {
59 | printi: console.log.bind(console),
60 | printfl: console.log.bind(console),
61 | printxy: console.log.bind(console),
62 | powf: Math.pow,
63 | randomf: Math.random,
64 | getTime: Date.now
65 | }
66 | };
67 | load(buffer, imports).then((inst) => {
68 | instance = inst;
69 | program = instance.exports;
70 | console.log("Initialising...");
71 | program.init(width, height);
72 | let last = performance.now();
73 | let frames = 0;
74 | let ptCount = program.getParticleCount();
75 | let ptBytes = program.getParticleByteSize();
76 | let ptSize = (ptBytes / FLOAT_BYTES);
77 | let ptColorOffset = program.getParticleColorOffset();
78 | let ptPositionOffset = program.getParticlePositionOffset();
79 | let ptColor = null;
80 | let ptPosition = null;
81 | let totalPtBytes = ptCount * ptBytes * FLOAT_BYTES;
82 | let usedKb = (totalPtBytes * 0.001) | 0;
83 | let initKb = (imports.initialMemory * 0x40) | 0;
84 | console.log(`Allocated ${ptCount} particles`);
85 | document.querySelector(".lbl").innerHTML = `${ptCount} Particles á ${ptBytes} byte`;
86 | console.log(`Memory: Used: ${usedKb}kB/${initKb}kB Left: ${initKb-usedKb}kB`);
87 | let webgl = wgl(ptSize);
88 | let gl = webgl.gl;
89 | let prog = webgl.program;
90 | let xx = 64; let yy = 64;
91 | let timeLoc = gl.getUniformLocation(prog, "time");
92 | let count = 0;
93 | console.log(`Particle size of ${ptSize}/${ptBytes}byte`);
94 | inst.imports.ongrow = function() {
95 | // keep track of point data after each memory mutation
96 | ptColor = new Float32Array(instance.memory.buffer, ptColorOffset, ptCount * ptSize);
97 | ptPosition = new Float32Array(instance.memory.buffer, ptPositionOffset, ptCount * ptSize);
98 | };
99 | inst.imports.ongrow();
100 | (function drawLoop() {
101 | requestAnimationFrame(drawLoop);
102 | program.tick();
103 | let now = performance.now();
104 | let dt = (now - last);
105 |
106 | //console.log(`Update took ${then - now}ms`);
107 | gl.uniform1i(timeLoc, (Date.now()));
108 |
109 | // colors
110 | gl.bindBuffer(gl.ARRAY_BUFFER, webgl.colorBuffer);
111 | gl.bufferData(gl.ARRAY_BUFFER, ptColor, gl.DYNAMIC_DRAW);
112 | gl.vertexAttribPointer(webgl.colorLoc, 3, gl.FLOAT, false, ptSize * 4, 0);
113 |
114 | // points
115 | gl.bindBuffer(gl.ARRAY_BUFFER, webgl.coordBuffer);
116 | gl.bufferData(gl.ARRAY_BUFFER, ptPosition, gl.DYNAMIC_DRAW);
117 | gl.vertexAttribPointer(webgl.coordLoc, 3, gl.FLOAT, false, ptSize * 4, 0);
118 |
119 | gl.drawArrays(gl.POINTS, 0, ptCount);
120 |
121 | let then = performance.now();
122 | //console.log(`Update took ${then - now}ms`);
123 |
124 | last = now;
125 | frames++;
126 | })();
127 | });
128 |
--------------------------------------------------------------------------------
/src/main.js:
--------------------------------------------------------------------------------
1 |
2 | let binary = new Uint8Array([0,97,115,109,1,0,0,0,1,210,128,128,128,0,15,96,0,1,125,96,0,1,127,96,0,0,96,1,127,0,96,2,127,127,0,96,2,127,127,1,127,96,5,127,127,127,127,127,0,96,2,124,124,1,124,96,1,124,1,124,96,1,125,1,125,96,1,124,1,125,96,2,125,127,1,127,96,5,127,127,127,127,127,1,127,96,2,124,127,1,124,96,1,127,1,127,2,196,128,128,128,0,5,3,101,110,118,6,95,97,98,111,114,116,0,3,3,101,110,118,5,95,103,114,111,119,0,2,3,101,110,118,7,103,101,116,84,105,109,101,0,1,3,101,110,118,7,114,97,110,100,111,109,102,0,0,3,101,110,118,6,109,101,109,111,114,121,2,0,1,3,157,128,128,128,0,28,1,1,1,1,4,4,5,3,6,2,2,7,8,8,9,10,10,11,12,13,8,14,2,14,1,3,14,9,4,132,128,128,128,0,1,112,0,0,7,172,129,128,128,0,10,16,103,101,116,80,97,114,116,105,99,108,101,67,111,117,110,116,0,4,19,103,101,116,80,97,114,116,105,99,108,101,66,121,116,101,83,105,122,101,0,5,22,103,101,116,80,97,114,116,105,99,108,101,67,111,108,111,114,79,102,102,115,101,116,0,6,25,103,101,116,80,97,114,116,105,99,108,101,80,111,115,105,116,105,111,110,79,102,102,115,101,116,0,7,11,117,112,100,97,116,101,77,111,117,115,101,0,8,4,105,110,105,116,0,9,15,97,108,108,111,99,97,116,101,84,101,120,116,117,114,101,0,10,14,100,101,115,116,114,111,121,84,101,120,116,117,114,101,0,11,11,100,114,97,119,84,101,120,116,117,114,101,0,12,4,116,105,99,107,0,14,9,129,128,128,128,0,0,10,230,255,128,128,0,28,135,128,128,128,0,0,65,0,40,2,12,11,132,128,128,128,0,0,65,12,11,135,128,128,128,0,0,65,0,40,2,44,11,135,128,128,128,0,0,65,0,40,2,48,11,149,128,128,128,0,0,2,64,65,0,32,1,178,56,2,24,65,0,32,0,178,56,2,20,11,11,158,130,128,128,0,2,3,127,3,125,2,64,65,0,32,1,54,2,40,65,0,32,0,54,2,36,65,0,32,1,32,0,108,34,1,65,0,40,2,16,109,34,2,54,2,12,65,0,32,1,65,12,108,34,1,16,25,54,2,48,65,0,32,1,16,25,54,2,52,65,0,32,1,16,25,54,2,44,65,0,33,1,65,0,33,4,2,64,3,64,32,4,32,2,78,13,1,65,0,40,2,16,33,2,16,3,33,5,65,0,40,2,48,32,1,106,32,5,65,0,40,2,36,178,148,56,2,0,16,3,33,5,65,0,40,2,48,32,1,106,65,4,106,32,5,65,0,40,2,40,178,34,6,148,56,2,0,65,0,40,2,52,32,1,106,34,3,32,2,32,4,32,0,111,108,178,34,5,56,2,0,32,3,65,4,106,32,2,32,4,32,0,109,108,178,34,7,56,2,0,65,0,40,2,44,32,1,106,34,2,65,8,106,65,128,128,128,152,4,54,2,0,32,2,32,5,65,0,40,2,36,34,0,178,149,67,0,0,127,67,148,56,2,0,32,2,65,4,106,32,7,32,6,149,67,0,0,127,67,148,56,2,0,32,1,65,12,106,33,1,32,4,65,1,106,33,4,65,0,40,2,12,33,2,12,0,11,0,11,11,11,201,128,128,128,0,1,2,127,2,127,32,1,32,0,108,34,1,65,2,116,33,2,32,1,65,4,116,16,25,34,3,33,0,65,0,33,1,2,64,3,64,32,1,32,2,78,13,1,32,0,65,0,54,2,0,32,0,65,4,106,33,0,32,1,65,1,106,33,1,12,0,11,0,11,32,3,11,11,137,128,128,128,0,0,32,0,40,2,0,16,29,11,173,129,128,128,0,1,5,127,2,64,32,4,32,3,108,33,5,65,0,40,2,44,33,6,65,0,33,4,2,64,3,64,32,4,32,5,78,13,1,2,64,32,0,65,12,106,40,2,0,69,13,0,32,4,32,3,111,33,8,32,4,32,3,109,32,2,106,34,9,65,0,40,2,40,78,13,0,32,8,32,1,106,34,8,65,0,40,2,36,34,7,78,13,0,32,9,32,7,108,32,8,106,34,8,65,0,72,13,0,32,6,32,8,65,12,108,106,34,8,32,0,40,2,0,178,56,2,0,32,8,32,0,65,4,106,40,2,0,178,56,2,4,32,8,32,0,65,8,106,40,2,0,178,56,2,8,11,32,0,65,16,106,33,0,32,4,65,1,106,33,4,12,0,11,0,11,11,11,131,128,128,128,0,0,1,11,243,129,128,128,0,2,6,127,5,125,2,64,16,2,26,65,0,40,2,52,65,0,40,2,12,34,5,65,12,108,34,4,106,65,4,106,33,3,65,0,40,2,48,32,4,106,65,4,106,33,4,65,0,42,2,24,33,7,65,0,42,2,20,33,6,2,64,3,64,32,5,65,0,76,13,1,32,4,32,4,42,2,0,34,9,32,3,42,2,0,32,9,147,67,205,204,76,61,148,146,34,9,56,2,0,32,4,65,124,106,34,0,32,0,42,2,0,34,8,32,3,65,124,106,42,2,0,32,8,147,67,205,204,76,61,148,146,34,8,56,2,0,2,64,32,7,32,9,147,168,34,2,32,2,108,32,6,32,8,147,168,34,1,32,1,108,106,65,211,225,0,75,13,0,32,4,32,9,32,2,183,32,1,183,16,15,182,34,10,16,31,67,0,0,158,65,148,147,56,2,0,32,0,32,8,32,10,16,18,67,0,0,158,65,148,147,56,2,0,11,32,3,65,116,106,33,3,32,4,65,116,106,33,4,32,5,65,127,106,33,5,12,0,11,0,11,11,11,242,131,128,128,0,3,6,127,2,126,1,124,2,124,2,64,2,64,32,1,189,34,8,66,255,255,255,255,255,255,255,255,255,0,131,66,128,128,128,128,128,128,128,248,255,0,86,13,0,32,0,189,34,9,66,255,255,255,255,255,255,255,255,255,0,131,66,129,128,128,128,128,128,128,248,255,0,84,13,1,11,32,0,32,1,160,15,11,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,32,8,66,32,136,167,34,2,65,128,128,192,128,124,106,32,8,167,34,3,114,69,13,0,32,8,66,62,136,167,65,2,113,34,5,32,9,66,63,136,167,34,4,114,33,6,32,9,66,32,136,167,65,255,255,255,255,7,113,34,7,32,9,167,114,69,13,1,32,2,65,255,255,255,255,7,113,34,2,32,3,114,69,13,2,32,2,65,128,128,192,255,7,71,13,3,32,6,65,2,115,65,3,113,33,2,32,7,65,128,128,192,255,7,71,13,4,32,2,65,3,116,65,192,0,106,43,3,0,15,11,32,0,16,16,15,11,32,6,65,3,113,34,2,65,3,70,13,4,32,2,65,2,70,13,5,32,0,15,11,68,24,45,68,84,251,33,249,191,68,24,45,68,84,251,33,249,63,32,4,27,15,11,32,7,65,128,128,192,255,7,70,13,1,32,2,65,128,128,128,32,106,32,7,73,13,1,2,64,2,64,32,5,69,13,0,68,0,0,0,0,0,0,0,0,33,10,32,7,65,128,128,128,32,106,32,2,73,13,1,11,32,0,32,1,163,16,17,16,16,33,10,11,32,6,65,3,113,34,2,69,13,4,32,2,65,2,70,13,5,32,2,65,1,71,13,6,32,10,154,15,11,32,2,65,3,116,65,224,0,106,43,3,0,15,11,68,24,45,68,84,251,33,249,191,68,24,45,68,84,251,33,249,63,32,4,27,15,11,68,24,45,68,84,251,33,9,192,15,11,68,24,45,68,84,251,33,9,64,15,11,32,10,15,11,68,24,45,68,84,251,33,9,64,32,10,68,7,92,20,51,38,166,161,188,160,161,15,11,32,10,68,7,92,20,51,38,166,161,188,160,68,24,45,68,84,251,33,9,192,160,11,11,203,132,128,128,0,3,4,127,1,126,3,124,2,124,65,0,65,0,40,2,4,65,16,107,34,4,54,2,4,32,0,189,34,5,66,63,136,167,33,1,2,64,2,64,32,5,66,32,136,167,65,255,255,255,255,7,113,34,2,65,128,128,192,160,4,73,13,0,32,5,66,255,255,255,255,255,255,255,255,255,0,131,66,128,128,128,128,128,128,128,248,255,0,86,13,1,68,24,45,68,84,251,33,249,191,68,24,45,68,84,251,33,249,63,32,1,27,33,0,12,1,11,2,64,2,64,32,2,65,255,255,239,254,3,75,13,0,65,127,33,3,32,2,65,255,255,255,241,3,75,13,1,32,2,65,255,255,63,75,13,2,32,4,32,0,182,56,2,12,12,2,11,32,0,16,17,33,0,2,64,2,64,2,64,32,2,65,255,255,203,255,3,75,13,0,32,2,65,255,255,151,255,3,75,13,1,32,0,32,0,160,68,0,0,0,0,0,0,240,191,160,32,0,68,0,0,0,0,0,0,0,64,160,163,33,0,65,0,33,3,12,3,11,32,2,65,255,255,141,128,4,75,13,1,32,0,68,0,0,0,0,0,0,248,191,160,32,0,68,0,0,0,0,0,0,248,63,162,68,0,0,0,0,0,0,240,63,160,163,33,0,65,2,33,3,12,2,11,32,0,68,0,0,0,0,0,0,240,191,160,32,0,68,0,0,0,0,0,0,240,63,160,163,33,0,65,1,33,3,12,1,11,68,0,0,0,0,0,0,240,191,32,0,163,33,0,65,3,33,3,11,32,0,32,0,162,34,7,32,7,162,34,8,32,8,32,8,32,8,32,8,68,47,108,106,44,68,180,162,191,162,68,154,253,222,82,45,222,173,191,160,162,68,109,154,116,175,242,176,179,191,160,162,68,113,22,35,254,198,113,188,191,160,162,68,196,235,152,153,153,153,201,191,160,162,33,6,32,7,32,8,32,8,32,8,32,8,32,8,68,17,218,34,227,58,173,144,63,162,68,235,13,118,36,75,123,169,63,160,162,68,81,61,208,160,102,13,177,63,160,162,68,110,32,76,197,205,69,183,63,160,162,68,255,131,0,146,36,73,194,63,160,162,68,13,85,85,85,85,85,213,63,160,162,33,8,2,64,32,3,65,127,76,13,0,32,3,65,3,116,34,2,65,128,1,106,43,3,0,32,0,32,6,32,8,160,162,32,2,65,160,1,106,43,3,0,161,32,0,161,161,34,0,154,32,0,32,1,27,33,0,12,1,11,32,0,32,0,32,6,32,8,160,162,161,33,0,11,65,0,32,4,65,16,106,54,2,4,32,0,11,11,146,128,128,128,0,0,32,0,189,66,255,255,255,255,255,255,255,255,255,0,131,191,11,180,131,128,128,0,2,3,127,1,124,2,125,65,0,65,0,40,2,4,65,16,107,34,3,54,2,4,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,32,0,188,34,2,65,255,255,255,255,7,113,34,1,65,218,159,164,250,3,75,13,0,32,1,65,255,255,255,203,3,75,13,1,32,3,32,0,67,0,0,128,123,146,56,2,4,67,0,0,128,63,33,0,12,12,11,32,2,65,31,118,33,2,32,1,65,209,167,237,131,4,75,13,1,32,0,187,33,4,32,1,65,228,151,219,128,4,73,13,2,68,24,45,68,84,251,33,9,64,68,24,45,68,84,251,33,9,192,32,2,27,32,4,160,16,19,140,33,0,12,11,11,32,0,187,16,19,33,0,12,10,11,32,1,65,213,227,136,135,4,75,13,1,32,1,65,224,219,191,133,4,73,13,2,68,24,45,68,84,251,33,25,64,68,24,45,68,84,251,33,25,192,32,2,27,32,0,187,160,16,19,33,0,12,9,11,32,2,69,13,3,32,4,68,24,45,68,84,251,33,249,63,160,16,20,33,0,12,8,11,32,1,65,128,128,128,252,7,73,13,1,32,0,32,0,147,33,0,12,7,11,32,2,69,13,2,68,210,33,51,127,124,217,18,192,32,0,187,161,16,20,33,0,12,6,11,32,0,32,3,65,8,106,16,21,65,3,113,34,1,65,2,70,13,2,32,1,65,1,70,13,3,32,1,13,4,32,3,43,3,8,16,19,33,0,12,5,11,68,24,45,68,84,251,33,249,63,32,4,161,16,20,33,0,12,4,11,32,0,187,68,210,33,51,127,124,217,18,192,160,16,20,33,0,12,3,11,32,3,43,3,8,16,19,140,33,0,12,2,11,32,3,43,3,8,154,16,20,33,0,12,1,11,32,3,43,3,8,16,20,33,0,11,65,0,32,3,65,16,106,54,2,4,32,0,11,11,207,128,128,128,0,1,1,124,32,0,32,0,162,34,0,68,129,94,12,253,255,255,223,191,162,68,0,0,0,0,0,0,240,63,160,32,0,32,0,162,34,1,68,66,58,5,225,83,85,165,63,162,160,32,0,32,1,162,32,0,68,105,80,238,224,66,147,249,62,162,68,39,30,15,232,135,192,86,191,160,162,160,182,11,203,128,128,128,0,1,2,124,32,0,32,0,162,34,1,32,0,162,34,2,32,1,32,1,162,162,32,1,68,167,70,59,140,135,205,198,62,162,68,116,231,202,226,249,0,42,191,160,162,32,2,32,1,68,178,251,110,137,16,17,129,63,162,68,119,172,203,84,85,85,197,191,160,162,32,0,160,160,182,11,253,129,128,128,0,2,4,127,1,124,2,127,65,0,65,0,40,2,4,65,16,107,34,5,54,2,4,2,64,2,64,32,0,188,34,2,65,255,255,255,255,7,113,34,4,65,218,159,164,238,4,75,13,0,32,1,32,0,187,34,6,32,6,68,131,200,201,109,48,95,228,63,162,68,0,0,0,0,0,0,56,67,160,68,0,0,0,0,0,0,56,195,160,34,6,68,0,0,0,80,251,33,249,191,162,160,32,6,68,99,98,26,97,180,16,81,190,162,160,57,3,0,32,6,170,33,4,12,1,11,2,64,32,4,65,128,128,128,252,7,73,13,0,32,1,32,0,32,0,147,187,57,3,0,65,0,33,4,12,1,11,32,5,32,4,32,4,65,23,118,65,234,126,106,34,3,65,23,116,107,190,187,57,3,8,32,5,65,8,106,32,5,32,3,65,1,65,0,16,22,33,4,32,5,43,3,0,33,6,2,64,32,2,65,127,76,13,0,32,1,32,6,57,3,0,12,1,11,32,1,32,6,154,57,3,0,65,0,32,4,107,33,4,11,65,0,32,5,65,16,106,54,2,4,32,4,11,11,252,147,128,128,0,2,21,127,4,124,2,127,65,0,65,0,40,2,4,65,176,4,107,34,25,54,2,4,32,2,32,2,65,125,106,65,24,109,34,22,65,0,32,22,65,0,74,27,34,6,65,104,108,106,33,15,2,64,32,4,65,2,116,65,192,1,106,40,2,0,34,5,32,3,65,127,106,34,14,106,65,0,72,13,0,32,5,32,3,106,33,13,32,6,32,14,107,34,2,65,2,116,65,208,1,106,33,23,32,25,65,192,2,106,33,22,3,64,2,64,2,64,32,2,65,0,72,13,0,32,23,40,2,0,183,33,28,12,1,11,68,0,0,0,0,0,0,0,0,33,28,11,32,22,32,28,57,3,0,32,22,65,8,106,33,22,32,23,65,4,106,33,23,32,2,65,1,106,33,2,32,13,65,127,106,34,13,13,0,11,11,32,15,65,104,106,33,24,2,64,2,64,32,3,65,0,76,13,0,32,25,65,192,2,106,32,14,65,3,116,106,33,14,65,0,33,13,3,64,68,0,0,0,0,0,0,0,0,33,28,32,0,33,2,32,3,33,23,32,14,33,22,3,64,32,28,32,2,43,3,0,32,22,43,3,0,162,160,33,28,32,2,65,8,106,33,2,32,22,65,120,106,33,22,32,23,65,127,106,34,23,13,0,11,32,25,32,13,65,3,116,106,32,28,57,3,0,32,14,65,8,106,33,14,32,13,32,5,72,33,2,32,13,65,1,106,33,13,32,2,13,0,12,2,11,0,11,65,127,33,22,32,25,33,2,3,64,32,2,66,0,55,3,0,32,2,65,8,106,33,2,32,22,65,1,106,34,22,32,5,72,13,0,11,11,65,23,32,24,107,33,8,65,24,32,24,107,33,7,32,25,65,224,3,106,32,5,65,2,116,106,65,124,106,33,11,32,25,65,8,114,33,12,32,25,65,224,3,106,65,124,106,33,10,32,25,65,120,106,33,9,32,3,65,0,74,33,18,32,5,33,19,2,64,2,64,3,64,32,25,32,19,34,14,65,3,116,34,16,106,43,3,0,33,28,2,64,32,14,65,1,72,34,13,13,0,32,14,65,1,106,33,23,32,9,32,16,106,33,2,32,25,65,224,3,106,33,22,3,64,32,22,32,28,32,28,68,0,0,0,0,0,0,112,62,162,170,183,34,26,68,0,0,0,0,0,0,112,193,162,160,170,54,2,0,32,22,65,4,106,33,22,32,2,43,3,0,32,26,160,33,28,32,2,65,120,106,33,2,32,23,65,127,106,34,23,65,1,74,13,0,11,11,2,64,32,28,32,24,16,23,34,28,32,28,68,0,0,0,0,0,0,192,63,162,16,24,68,0,0,0,0,0,0,32,192,162,160,34,28,32,28,170,34,19,183,161,33,28,2,64,2,64,2,64,2,64,32,24,65,1,72,34,17,13,0,32,25,65,224,3,106,32,14,65,2,116,106,65,124,106,34,2,32,2,40,2,0,34,2,32,2,32,7,117,34,2,32,7,116,107,34,22,54,2,0,32,2,32,19,106,33,19,32,22,32,8,117,34,20,65,1,78,13,1,12,2,11,2,64,32,24,69,13,0,65,2,33,20,32,28,68,0,0,0,0,0,0,224,63,99,32,28,32,28,98,114,69,13,1,65,0,33,20,32,28,68,0,0,0,0,0,0,0,0,97,13,3,12,4,11,32,25,65,224,3,106,32,14,65,2,116,106,65,124,106,40,2,0,65,23,117,34,20,65,1,72,13,1,11,2,64,2,64,2,64,32,13,13,0,65,0,33,21,32,25,65,224,3,106,33,2,32,14,33,13,3,64,32,2,40,2,0,33,22,65,255,255,255,7,33,23,2,64,2,64,32,21,13,0,2,64,32,22,13,0,65,0,33,21,12,2,11,65,128,128,128,8,33,23,65,1,33,21,11,32,2,32,23,32,22,107,54,2,0,11,32,2,65,4,106,33,2,32,13,65,127,106,34,13,13,0,11,32,17,13,2,12,1,11,65,0,33,21,32,17,13,1,11,2,64,2,64,32,24,65,1,70,13,0,32,24,65,2,71,13,2,65,255,255,255,1,33,22,12,1,11,65,255,255,255,3,33,22,11,32,25,65,224,3,106,32,14,65,2,116,106,65,124,106,34,2,32,2,40,2,0,32,22,113,54,2,0,11,32,19,65,1,106,33,19,32,20,65,2,71,13,0,68,0,0,0,0,0,0,240,63,32,28,161,33,28,65,2,33,20,32,21,69,13,0,32,28,68,0,0,0,0,0,0,240,63,32,24,16,23,161,33,28,11,32,28,68,0,0,0,0,0,0,0,0,98,13,1,11,2,64,32,14,32,5,76,13,0,32,10,32,14,65,2,116,106,33,2,65,0,33,22,32,14,33,23,3,64,32,2,40,2,0,32,22,114,33,22,32,2,65,124,106,33,2,32,23,65,127,106,34,23,32,5,74,13,0,11,32,22,13,3,11,65,0,33,22,32,11,33,2,3,64,32,22,65,1,106,33,22,32,2,40,2,0,33,23,32,2,65,124,106,33,2,32,23,69,13,0,11,32,14,32,22,106,33,19,32,22,65,1,72,13,1,2,64,32,18,69,13,0,32,14,65,1,106,33,2,32,25,65,192,2,106,32,3,32,14,106,65,3,116,106,33,21,3,64,32,25,65,192,2,106,32,14,32,3,106,65,3,116,106,32,2,34,13,32,6,106,65,2,116,65,208,1,106,40,2,0,183,57,3,0,68,0,0,0,0,0,0,0,0,33,28,32,0,33,2,32,21,33,22,32,3,33,23,3,64,32,28,32,2,43,3,0,32,22,43,3,0,162,160,33,28,32,2,65,8,106,33,2,32,22,65,120,106,33,22,32,23,65,127,106,34,23,13,0,11,32,25,32,13,65,3,116,106,32,28,57,3,0,32,21,65,8,106,33,21,32,13,65,1,106,33,2,32,13,33,14,32,13,32,19,72,13,0,12,3,11,0,11,32,12,32,16,106,33,2,32,6,32,14,106,65,2,116,65,212,1,106,33,22,32,25,65,192,2,106,32,3,32,14,106,65,3,116,106,33,23,3,64,32,2,66,0,55,3,0,32,23,32,22,40,2,0,183,57,3,0,32,22,65,4,106,33,22,32,2,65,8,106,33,2,32,23,65,8,106,33,23,32,14,65,1,106,34,14,32,19,72,13,0,12,2,11,0,11,11,2,64,2,64,32,28,65,0,32,24,107,16,23,34,28,68,0,0,0,0,0,0,112,65,99,32,28,32,28,98,114,69,13,0,32,28,33,26,12,1,11,32,25,65,224,3,106,32,14,65,2,116,106,32,28,32,28,68,0,0,0,0,0,0,112,62,162,170,183,34,26,68,0,0,0,0,0,0,112,193,162,160,170,54,2,0,32,14,65,1,106,33,14,32,15,33,24,11,32,25,65,224,3,106,32,14,65,2,116,106,32,26,170,54,2,0,12,1,11,32,25,65,224,3,106,32,14,65,2,116,106,65,124,106,33,2,3,64,32,14,65,127,106,33,14,32,24,65,104,106,33,24,32,2,40,2,0,33,22,32,2,65,124,106,33,2,32,22,69,13,0,11,11,68,0,0,0,0,0,0,240,63,32,24,16,23,33,28,2,64,32,14,65,0,72,13,0,32,14,65,1,106,33,23,32,25,32,14,65,3,116,106,33,2,32,25,65,224,3,106,32,14,65,2,116,106,33,22,3,64,32,2,32,28,32,22,40,2,0,183,162,57,3,0,32,2,65,120,106,33,2,32,22,65,124,106,33,22,32,28,68,0,0,0,0,0,0,112,62,162,33,28,32,23,65,127,106,34,23,65,0,74,13,0,11,32,14,65,0,72,13,0,32,25,32,14,65,3,116,106,33,13,32,14,33,2,3,64,32,14,32,2,34,3,107,33,21,68,0,0,0,0,0,0,0,0,33,28,65,0,33,2,65,0,33,22,2,64,3,64,32,28,32,2,65,160,23,106,43,3,0,32,13,32,2,106,43,3,0,162,160,33,28,32,22,32,5,78,13,1,32,2,65,8,106,33,2,32,22,32,21,72,33,23,32,22,65,1,106,33,22,32,23,13,0,11,11,32,25,65,160,1,106,32,21,65,3,116,106,32,28,57,3,0,32,13,65,120,106,33,13,32,3,65,127,106,33,2,32,3,65,0,74,13,0,11,11,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,32,4,65,127,106,65,2,73,13,0,32,4,69,13,1,32,4,65,3,71,13,9,68,0,0,0,0,0,0,0,0,33,29,2,64,32,14,65,1,72,13,0,32,14,65,1,106,33,22,32,25,65,160,1,106,32,14,65,3,116,106,34,23,65,120,106,33,2,32,23,43,3,0,33,28,3,64,32,2,32,2,43,3,0,34,27,32,28,160,34,26,57,3,0,32,2,65,8,106,32,28,32,27,32,26,161,160,57,3,0,32,2,65,120,106,33,2,32,26,33,28,32,22,65,127,106,34,22,65,1,74,13,0,11,32,14,65,2,72,13,0,32,14,65,1,106,33,22,32,25,65,160,1,106,32,14,65,3,116,106,34,23,65,120,106,33,2,32,23,43,3,0,33,28,3,64,32,2,32,2,43,3,0,34,27,32,28,160,34,26,57,3,0,32,2,65,8,106,32,28,32,27,32,26,161,160,57,3,0,32,2,65,120,106,33,2,32,26,33,28,32,22,65,127,106,34,22,65,2,74,13,0,11,32,14,65,2,72,13,0,32,14,65,1,106,33,22,32,25,65,160,1,106,32,14,65,3,116,106,33,2,68,0,0,0,0,0,0,0,0,33,29,3,64,32,29,32,2,43,3,0,160,33,29,32,2,65,120,106,33,2,32,22,65,127,106,34,22,65,2,74,13,0,11,11,32,25,43,3,160,1,33,28,32,20,69,13,4,32,1,32,28,154,57,3,0,32,1,32,25,43,3,168,1,154,57,3,8,32,29,154,33,29,12,5,11,32,14,65,0,72,13,1,32,14,65,1,106,33,22,32,25,65,160,1,106,32,14,65,3,116,106,33,2,68,0,0,0,0,0,0,0,0,33,28,3,64,32,28,32,2,43,3,0,160,33,28,32,2,65,120,106,33,2,32,22,65,127,106,34,22,65,0,74,13,0,12,3,11,0,11,32,14,65,0,72,13,4,32,14,65,1,106,33,22,32,25,65,160,1,106,32,14,65,3,116,106,33,2,68,0,0,0,0,0,0,0,0,33,28,3,64,32,28,32,2,43,3,0,160,33,28,32,2,65,120,106,33,2,32,22,65,127,106,34,22,65,0,74,13,0,12,6,11,0,11,68,0,0,0,0,0,0,0,0,33,28,11,32,1,32,28,154,32,28,32,20,27,57,3,0,32,25,43,3,160,1,32,28,161,33,28,2,64,32,14,65,1,72,13,0,32,25,65,160,1,106,65,8,114,33,2,3,64,32,28,32,2,43,3,0,160,33,28,32,2,65,8,106,33,2,32,14,65,127,106,34,14,13,0,11,11,32,28,154,32,28,32,20,27,33,29,32,1,65,8,106,33,1,12,4,11,32,1,32,28,57,3,0,32,1,32,25,41,3,168,1,55,3,8,11,32,1,65,16,106,33,1,12,2,11,68,0,0,0,0,0,0,0,0,33,28,11,32,28,154,32,28,32,20,27,33,29,11,32,1,32,29,57,3,0,11,65,0,32,25,65,176,4,106,54,2,4,32,19,65,7,113,11,11,181,129,128,128,0,0,2,124,2,64,2,64,2,64,2,64,32,1,65,128,8,72,13,0,32,0,68,0,0,0,0,0,0,224,127,162,33,0,32,1,65,255,15,72,13,1,32,1,65,130,112,106,34,1,65,255,7,32,1,65,255,7,72,27,33,1,32,0,68,0,0,0,0,0,0,224,127,162,33,0,12,3,11,32,1,65,129,120,74,13,2,32,0,68,0,0,0,0,0,0,96,3,162,33,0,32,1,65,184,112,74,13,1,32,1,65,146,15,106,34,1,65,130,120,32,1,65,130,120,74,27,33,1,32,0,68,0,0,0,0,0,0,96,3,162,33,0,12,2,11,32,1,65,129,120,106,33,1,12,1,11,32,1,65,201,7,106,33,1,11,32,0,32,1,65,255,7,106,173,66,52,134,191,162,11,11,184,129,128,128,0,3,3,127,1,126,1,124,2,124,65,0,40,2,4,65,16,107,33,3,2,64,32,0,68,0,0,0,0,0,0,0,0,97,13,0,32,0,189,34,4,66,52,136,167,65,255,15,113,34,1,65,178,8,75,13,0,68,0,0,0,0,0,0,48,67,68,0,0,0,0,0,0,48,195,32,4,66,0,83,34,2,27,68,0,0,0,0,0,0,48,195,68,0,0,0,0,0,0,48,67,32,2,27,32,0,160,160,32,0,161,33,5,2,64,32,1,65,254,7,75,13,0,32,3,32,5,57,3,8,32,4,66,63,135,167,183,15,11,32,5,32,0,160,33,0,32,5,68,0,0,0,0,0,0,0,0,101,32,5,32,5,98,114,13,0,32,0,68,0,0,0,0,0,0,240,191,160,33,0,11,32,0,11,11,237,184,128,128,0,1,13,127,2,127,65,0,65,0,40,2,4,65,16,107,34,13,54,2,4,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,32,0,65,244,1,75,13,0,65,0,40,2,224,23,34,7,65,16,32,0,65,11,106,65,120,113,32,0,65,11,73,27,34,6,65,3,118,34,10,118,34,0,65,3,113,69,13,1,32,0,65,127,115,65,1,113,32,10,106,34,11,65,3,116,34,6,65,144,24,106,40,2,0,34,10,40,2,8,34,0,32,6,65,136,24,106,34,6,70,13,2,65,0,40,2,240,23,32,0,75,13,39,32,0,40,2,12,32,10,71,13,39,32,6,65,8,106,32,0,54,2,0,32,0,65,12,106,32,6,54,2,0,12,3,11,65,127,33,6,32,0,65,191,127,75,13,15,32,0,65,11,106,34,0,65,120,113,33,6,65,0,40,2,228,23,34,3,69,13,15,65,0,33,8,2,64,32,0,65,8,118,34,0,69,13,0,65,31,33,8,32,6,65,255,255,255,7,75,13,0,32,6,65,14,32,0,32,0,65,128,254,63,106,65,16,118,65,8,113,34,10,116,34,0,65,128,224,31,106,65,16,118,65,4,113,34,11,32,10,114,32,0,32,11,116,34,0,65,128,128,15,106,65,16,118,65,2,113,34,10,114,107,32,0,32,10,116,65,15,118,106,34,0,65,7,106,118,65,1,113,32,0,65,1,116,114,33,8,11,65,0,32,6,107,33,11,32,8,65,2,116,65,144,26,106,40,2,0,34,10,69,13,3,32,6,65,0,65,25,32,8,65,1,118,107,32,8,65,31,70,27,116,33,9,65,0,33,0,65,0,33,12,3,64,2,64,32,10,40,2,4,65,120,113,32,6,107,34,7,32,11,79,13,0,32,7,33,11,32,10,33,12,32,7,69,13,8,11,32,0,32,10,65,20,106,40,2,0,34,7,32,7,32,10,32,9,65,29,118,65,4,113,106,65,16,106,40,2,0,34,10,70,27,32,0,32,7,27,33,0,32,9,32,10,65,0,71,116,33,9,32,10,13,0,11,32,0,32,12,114,69,13,4,12,12,11,32,6,65,0,40,2,232,23,34,3,77,13,14,32,0,69,13,4,32,0,32,10,116,65,2,32,10,116,34,0,65,0,32,0,107,114,113,34,0,65,0,32,0,107,113,65,127,106,34,0,32,0,65,12,118,65,16,113,34,0,118,34,10,65,5,118,65,8,113,34,11,32,0,114,32,10,32,11,118,34,0,65,2,118,65,4,113,34,10,114,32,0,32,10,118,34,0,65,1,118,65,2,113,34,10,114,32,0,32,10,118,34,0,65,1,118,65,1,113,34,10,114,32,0,32,10,118,106,34,11,65,3,116,34,12,65,144,24,106,40,2,0,34,0,40,2,8,34,10,32,12,65,136,24,106,34,12,70,13,6,65,0,40,2,240,23,32,10,75,13,37,32,10,40,2,12,32,0,71,13,37,32,12,65,8,106,32,10,54,2,0,32,10,65,12,106,32,12,54,2,0,12,7,11,65,0,32,7,65,126,32,11,119,113,54,2,224,23,11,32,10,65,8,106,33,0,32,10,32,11,65,3,116,34,11,65,3,114,54,2,4,32,10,32,11,106,34,10,32,10,40,2,4,65,1,114,54,2,4,12,34,11,65,0,33,0,65,0,33,12,65,0,65,0,114,13,8,11,65,0,33,12,32,3,65,2,32,8,116,34,0,65,0,32,0,107,114,113,34,0,69,13,10,32,0,65,0,32,0,107,113,65,127,106,34,0,32,0,65,12,118,65,16,113,34,0,118,34,10,65,5,118,65,8,113,34,9,32,0,114,32,10,32,9,118,34,0,65,2,118,65,4,113,34,10,114,32,0,32,10,118,34,0,65,1,118,65,2,113,34,10,114,32,0,32,10,118,34,0,65,1,118,65,1,113,34,10,114,32,0,32,10,118,106,65,2,116,65,144,26,106,40,2,0,34,0,13,8,12,9,11,65,0,40,2,228,23,34,5,69,13,9,32,5,65,0,32,5,107,113,65,127,106,34,0,32,0,65,12,118,65,16,113,34,0,118,34,10,65,5,118,65,8,113,34,11,32,0,114,32,10,32,11,118,34,0,65,2,118,65,4,113,34,10,114,32,0,32,10,118,34,0,65,1,118,65,2,113,34,10,114,32,0,32,10,118,34,0,65,1,118,65,1,113,34,10,114,32,0,32,10,118,106,65,2,116,65,144,26,106,40,2,0,34,11,40,2,4,65,120,113,32,6,107,33,10,2,64,32,11,65,16,106,32,11,40,2,16,69,65,2,116,106,40,2,0,34,0,69,13,0,3,64,32,0,40,2,4,65,120,113,32,6,107,34,12,32,10,32,12,32,10,73,34,12,27,33,10,32,0,32,11,32,12,27,33,11,32,0,65,16,106,32,0,40,2,16,69,65,2,116,106,40,2,0,34,12,33,0,32,12,13,0,11,11,65,0,40,2,240,23,34,1,32,11,75,13,32,32,11,32,6,106,34,2,32,11,77,13,32,32,11,40,2,24,33,4,32,11,40,2,12,34,9,32,11,70,13,3,32,1,32,11,40,2,8,34,0,75,13,32,32,0,40,2,12,32,11,71,13,32,32,9,40,2,8,32,11,71,13,32,32,9,65,8,106,32,0,54,2,0,32,0,65,12,106,32,9,54,2,0,32,4,13,4,12,5,11,65,0,33,11,32,10,33,12,32,10,33,0,12,6,11,65,0,32,7,65,126,32,11,119,113,34,7,54,2,224,23,11,32,0,32,6,65,3,114,54,2,4,32,0,32,6,106,34,12,32,11,65,3,116,34,10,32,6,107,34,11,65,1,114,54,2,4,32,0,32,10,106,32,11,54,2,0,2,64,32,3,69,13,0,32,3,65,3,118,34,9,65,3,116,65,136,24,106,33,6,65,0,40,2,244,23,33,10,2,64,2,64,32,7,65,1,32,9,116,34,9,113,69,13,0,65,0,40,2,240,23,32,6,40,2,8,34,9,77,13,1,12,32,11,65,0,32,7,32,9,114,54,2,224,23,32,6,33,9,11,32,9,32,10,54,2,12,32,6,65,8,106,32,10,54,2,0,32,10,32,6,54,2,12,32,10,32,9,54,2,8,11,32,0,65,8,106,33,0,65,0,32,12,54,2,244,23,65,0,32,11,54,2,232,23,12,28,11,2,64,2,64,32,11,65,20,106,34,12,40,2,0,34,0,13,0,32,11,40,2,16,34,0,69,13,1,32,11,65,16,106,33,12,11,3,64,32,12,33,8,32,0,34,9,65,20,106,34,12,40,2,0,34,0,13,0,32,9,65,16,106,33,12,32,9,40,2,16,34,0,13,0,11,32,1,32,8,75,13,29,32,8,65,0,54,2,0,32,4,69,13,2,12,1,11,65,0,33,9,32,4,69,13,1,11,2,64,2,64,2,64,32,11,32,11,40,2,28,34,12,65,2,116,65,144,26,106,34,0,40,2,0,70,13,0,65,0,40,2,240,23,32,4,75,13,30,32,4,65,16,106,32,4,40,2,16,32,11,71,65,2,116,106,32,9,54,2,0,32,9,13,1,12,3,11,32,0,32,9,54,2,0,32,9,69,13,1,11,65,0,40,2,240,23,34,12,32,9,75,13,28,32,9,32,4,54,2,24,2,64,32,11,40,2,16,34,0,69,13,0,32,12,32,0,75,13,29,32,9,32,0,54,2,16,32,0,32,9,54,2,24,11,32,11,65,20,106,40,2,0,34,0,69,13,1,65,0,40,2,240,23,32,0,75,13,28,32,9,65,20,106,32,0,54,2,0,32,0,32,9,54,2,24,12,1,11,65,0,32,5,65,126,32,12,119,113,54,2,228,23,11,2,64,2,64,32,10,65,15,75,13,0,32,11,32,10,32,6,106,34,0,65,3,114,54,2,4,32,11,32,0,106,34,0,32,0,40,2,4,65,1,114,54,2,4,12,1,11,32,11,32,6,65,3,114,54,2,4,32,2,32,10,65,1,114,54,2,4,32,2,32,10,106,32,10,54,2,0,2,64,32,3,69,13,0,32,3,65,3,118,34,12,65,3,116,65,136,24,106,33,6,65,0,40,2,244,23,33,0,2,64,2,64,32,7,65,1,32,12,116,34,12,113,69,13,0,65,0,40,2,240,23,32,6,40,2,8,34,12,77,13,1,12,30,11,65,0,32,7,32,12,114,54,2,224,23,32,6,33,12,11,32,12,32,0,54,2,12,32,6,65,8,106,32,0,54,2,0,32,0,32,6,54,2,12,32,0,32,12,54,2,8,11,65,0,32,2,54,2,244,23,65,0,32,10,54,2,232,23,11,32,11,65,8,106,33,0,12,25,11,32,0,69,13,1,11,3,64,32,0,40,2,4,65,120,113,32,6,107,34,10,32,11,32,10,32,11,73,34,10,27,33,11,32,0,32,12,32,10,27,33,12,32,0,65,16,106,32,0,40,2,16,69,65,2,116,106,40,2,0,34,10,33,0,32,10,13,0,11,11,32,12,69,13,0,32,11,65,0,40,2,232,23,32,6,107,79,13,0,65,0,40,2,240,23,34,4,32,12,75,13,23,32,12,32,6,106,34,8,32,12,77,13,23,32,12,40,2,24,33,5,32,12,40,2,12,34,9,32,12,70,13,1,32,4,32,12,40,2,8,34,0,75,13,23,32,0,40,2,12,32,12,71,13,23,32,9,40,2,8,32,12,71,13,23,32,9,65,8,106,32,0,54,2,0,32,0,65,12,106,32,9,54,2,0,32,5,13,20,12,21,11,2,64,2,64,2,64,2,64,2,64,2,64,65,0,40,2,232,23,34,0,32,6,79,13,0,65,0,40,2,236,23,34,12,32,6,77,13,1,65,0,40,2,248,23,34,0,32,6,106,34,10,32,12,32,6,107,34,11,65,1,114,54,2,4,65,0,32,11,54,2,236,23,65,0,32,10,54,2,248,23,32,0,32,6,65,3,114,54,2,4,32,0,65,8,106,33,0,12,27,11,65,0,40,2,244,23,33,10,32,0,32,6,107,34,11,65,16,73,13,1,32,10,32,6,106,34,12,32,11,65,1,114,54,2,4,32,10,32,0,106,32,11,54,2,0,65,0,32,11,54,2,232,23,65,0,32,12,54,2,244,23,32,10,32,6,65,3,114,54,2,4,12,2,11,65,0,40,2,184,27,69,13,2,65,0,40,2,192,27,33,10,12,3,11,32,10,32,0,65,3,114,54,2,4,32,10,32,0,106,34,0,32,0,40,2,4,65,1,114,54,2,4,65,0,65,0,54,2,244,23,65,0,65,0,54,2,232,23,11,32,10,65,8,106,33,0,12,23,11,65,0,66,128,128,132,128,128,128,192,0,55,2,188,27,65,0,66,255,255,255,255,143,128,128,16,55,2,196,27,65,0,32,13,65,12,106,65,112,113,65,216,170,213,170,5,115,54,2,184,27,65,0,65,0,54,2,204,27,65,0,65,0,54,2,156,27,65,128,128,4,33,10,11,65,0,33,0,32,10,32,6,65,47,106,34,3,106,34,7,65,0,32,10,107,34,8,113,34,9,32,6,77,13,21,65,0,33,0,2,64,65,0,40,2,152,27,34,10,69,13,0,65,0,40,2,144,27,34,11,32,9,106,34,5,32,11,77,13,22,32,5,32,10,75,13,22,11,65,0,45,0,156,27,65,4,113,13,8,2,64,65,0,40,2,248,23,34,10,69,13,0,65,160,27,33,0,3,64,2,64,32,0,40,2,0,34,11,32,10,75,13,0,32,11,32,0,40,2,4,106,32,10,75,13,4,11,32,0,40,2,8,34,0,13,0,11,11,65,0,16,27,34,12,65,127,70,13,7,32,9,33,7,2,64,65,0,40,2,188,27,34,0,65,127,106,34,10,32,12,113,69,13,0,32,9,32,12,107,32,10,32,12,106,65,0,32,0,107,113,106,33,7,11,32,7,32,6,77,13,7,32,7,65,254,255,255,255,7,75,13,7,2,64,65,0,40,2,152,27,34,0,69,13,0,65,0,40,2,144,27,34,10,32,7,106,34,11,32,10,77,13,8,32,11,32,0,75,13,8,11,32,7,16,27,34,0,32,12,71,13,2,12,9,11,2,64,32,12,65,20,106,34,10,40,2,0,34,0,13,0,32,12,40,2,16,34,0,69,13,3,32,12,65,16,106,33,10,11,3,64,32,10,33,7,32,0,34,9,65,20,106,34,10,40,2,0,34,0,13,0,32,9,65,16,106,33,10,32,9,40,2,16,34,0,13,0,11,32,4,32,7,75,13,21,32,7,65,0,54,2,0,32,5,69,13,19,12,18,11,32,7,32,12,107,32,8,113,34,7,65,254,255,255,255,7,75,13,5,32,7,16,27,34,12,32,0,40,2,0,32,0,65,4,106,40,2,0,106,70,13,3,32,12,33,0,11,32,0,33,12,32,6,65,48,106,32,7,77,13,1,32,7,65,254,255,255,255,7,75,13,1,32,12,65,127,70,13,1,32,3,32,7,107,65,0,40,2,192,27,34,0,106,65,0,32,0,107,113,34,0,65,254,255,255,255,7,75,13,6,32,0,16,27,65,127,70,13,3,32,0,32,7,106,33,7,12,6,11,65,0,33,9,32,5,13,15,12,16,11,32,12,65,127,71,13,4,12,2,11,32,12,65,127,71,13,3,12,1,11,65,0,32,7,107,16,27,26,11,65,0,65,0,40,2,156,27,65,4,114,54,2,156,27,11,32,9,65,254,255,255,255,7,75,13,1,32,9,16,27,34,12,65,0,16,27,34,0,79,13,1,32,12,65,127,70,13,1,32,0,65,127,70,13,1,32,0,32,12,107,34,7,32,6,65,40,106,77,13,1,11,65,0,65,0,40,2,144,27,32,7,106,34,0,54,2,144,27,2,64,32,0,65,0,40,2,148,27,77,13,0,65,0,32,0,54,2,148,27,11,2,64,2,64,2,64,2,64,65,0,40,2,248,23,34,10,69,13,0,65,160,27,33,0,3,64,32,12,32,0,40,2,0,34,11,32,0,40,2,4,34,9,106,70,13,2,32,0,40,2,8,34,0,13,0,12,3,11,0,11,2,64,2,64,65,0,40,2,240,23,34,0,69,13,0,32,12,32,0,79,13,1,11,65,0,32,12,54,2,240,23,11,65,0,32,7,54,2,164,27,65,0,32,12,54,2,160,27,65,0,65,127,54,2,128,24,65,0,65,136,24,54,2,148,24,65,0,65,136,24,54,2,144,24,65,0,65,144,24,54,2,156,24,65,0,65,144,24,54,2,152,24,65,0,65,152,24,54,2,164,24,65,0,65,152,24,54,2,160,24,65,0,65,160,24,54,2,172,24,65,0,65,160,24,54,2,168,24,65,0,65,168,24,54,2,180,24,65,0,65,168,24,54,2,176,24,65,0,65,176,24,54,2,188,24,65,0,65,176,24,54,2,184,24,65,0,65,184,24,54,2,196,24,65,0,65,0,40,2,184,27,54,2,132,24,65,0,65,0,54,2,172,27,65,0,65,192,24,54,2,204,24,65,0,65,184,24,54,2,192,24,65,0,65,192,24,54,2,200,24,65,0,65,200,24,54,2,212,24,65,0,65,200,24,54,2,208,24,65,0,65,208,24,54,2,220,24,65,0,65,208,24,54,2,216,24,65,0,65,216,24,54,2,228,24,65,0,65,216,24,54,2,224,24,65,0,65,224,24,54,2,236,24,65,0,65,224,24,54,2,232,24,65,0,65,232,24,54,2,244,24,65,0,65,232,24,54,2,240,24,65,0,65,240,24,54,2,252,24,65,0,65,240,24,54,2,248,24,65,0,65,248,24,54,2,132,25,65,0,65,248,24,54,2,128,25,65,0,65,128,25,54,2,140,25,65,0,65,128,25,54,2,136,25,65,0,65,136,25,54,2,144,25,65,0,65,136,25,54,2,148,25,65,0,65,144,25,54,2,156,25,65,0,65,144,25,54,2,152,25,65,0,65,152,25,54,2,164,25,65,0,65,152,25,54,2,160,25,65,0,65,160,25,54,2,172,25,65,0,65,160,25,54,2,168,25,65,0,65,168,25,54,2,180,25,65,0,65,168,25,54,2,176,25,65,0,65,176,25,54,2,188,25,65,0,65,176,25,54,2,184,25,65,0,65,184,25,54,2,196,25,65,0,65,184,25,54,2,192,25,65,0,65,192,25,54,2,204,25,65,0,65,192,25,54,2,200,25,65,0,65,200,25,54,2,212,25,65,0,65,200,25,54,2,208,25,65,0,65,208,25,54,2,220,25,32,12,65,120,32,12,107,65,7,113,65,0,32,12,65,8,106,65,7,113,27,34,0,106,34,10,32,7,65,88,106,34,11,32,0,107,34,0,65,1,114,54,2,4,65,0,65,216,25,54,2,228,25,65,0,65,208,25,54,2,216,25,65,0,65,216,25,54,2,224,25,65,0,65,224,25,54,2,236,25,65,0,65,224,25,54,2,232,25,65,0,65,232,25,54,2,244,25,65,0,65,232,25,54,2,240,25,65,0,65,240,25,54,2,252,25,65,0,65,240,25,54,2,248,25,65,0,65,248,25,54,2,132,26,65,0,65,248,25,54,2,128,26,65,0,65,128,26,54,2,140,26,65,0,65,128,26,54,2,136,26,65,0,32,10,54,2,248,23,65,0,32,0,54,2,236,23,32,12,32,11,106,65,40,54,2,4,65,0,65,0,40,2,200,27,54,2,252,23,12,2,11,32,0,45,0,12,65,8,113,13,0,32,12,32,10,77,13,0,32,11,32,10,75,13,0,32,10,65,120,32,10,107,65,7,113,65,0,32,10,65,8,106,65,7,113,27,34,11,106,34,12,65,0,40,2,236,23,32,7,106,34,8,32,11,107,34,11,65,1,114,54,2,4,32,0,65,4,106,32,9,32,7,106,54,2,0,65,0,65,0,40,2,200,27,54,2,252,23,65,0,32,11,54,2,236,23,65,0,32,12,54,2,248,23,32,10,32,8,106,65,40,54,2,4,12,1,11,2,64,32,12,65,0,40,2,240,23,34,9,79,13,0,65,0,32,12,54,2,240,23,32,12,33,9,11,32,12,32,7,106,33,11,65,160,27,33,0,2,64,2,64,2,64,2,64,2,64,2,64,2,64,3,64,32,0,40,2,0,32,11,70,13,1,32,0,40,2,8,34,0,13,0,12,2,11,0,11,32,0,45,0,12,65,8,113,13,0,32,0,32,12,54,2,0,32,0,32,0,40,2,4,32,7,106,54,2,4,32,12,65,120,32,12,107,65,7,113,65,0,32,12,65,8,106,65,7,113,27,106,34,8,32,6,65,3,114,54,2,4,32,11,65,120,32,11,107,65,7,113,65,0,32,11,65,8,106,65,7,113,27,106,34,12,32,8,107,32,6,107,33,0,32,8,32,6,106,33,11,32,10,32,12,70,13,1,65,0,40,2,244,23,32,12,70,13,8,32,12,40,2,4,34,5,65,3,113,65,1,71,13,14,32,5,65,255,1,75,13,9,32,12,40,2,12,33,10,2,64,32,12,40,2,8,34,6,32,5,65,3,118,34,3,65,3,116,65,136,24,106,34,7,70,13,0,32,9,32,6,75,13,20,32,6,40,2,12,32,12,71,13,20,11,32,10,32,6,70,13,10,2,64,32,10,32,7,70,13,0,32,9,32,10,75,13,20,32,10,40,2,8,32,12,71,13,20,11,32,6,32,10,54,2,12,32,10,65,8,106,32,6,54,2,0,12,13,11,65,160,27,33,0,2,64,3,64,2,64,32,0,40,2,0,34,11,32,10,75,13,0,32,11,32,0,40,2,4,106,34,11,32,10,75,13,2,11,32,0,40,2,8,33,0,12,0,11,0,11,32,12,65,120,32,12,107,65,7,113,65,0,32,12,65,8,106,65,7,113,27,34,0,106,34,8,32,7,65,88,106,34,9,32,0,107,34,0,65,1,114,54,2,4,32,12,32,9,106,65,40,54,2,4,32,10,32,11,65,39,32,11,107,65,7,113,65,0,32,11,65,89,106,65,7,113,27,106,65,81,106,34,9,32,9,32,10,65,16,106,73,27,34,9,65,27,54,2,4,65,0,65,0,40,2,200,27,54,2,252,23,65,0,32,0,54,2,236,23,65,0,32,8,54,2,248,23,32,9,65,16,106,65,0,40,2,168,27,54,2,0,32,9,65,12,106,65,0,40,2,164,27,54,2,0,32,9,65,0,40,2,160,27,54,2,8,32,9,65,20,106,65,0,40,2,172,27,54,2,0,65,0,32,12,54,2,160,27,65,0,32,7,54,2,164,27,65,0,32,9,65,8,106,54,2,168,27,65,0,65,0,54,2,172,27,32,9,65,28,106,33,0,3,64,32,0,65,7,54,2,0,32,0,65,4,106,34,0,32,11,73,13,0,11,32,9,32,10,70,13,5,32,9,65,4,106,34,0,32,0,40,2,0,65,126,113,54,2,0,32,9,32,9,32,10,107,34,7,54,2,0,32,10,32,7,65,1,114,54,2,4,2,64,32,7,65,255,1,75,13,0,32,7,65,3,118,34,11,65,3,116,65,136,24,106,33,0,65,0,40,2,224,23,34,12,65,1,32,11,116,34,11,113,69,13,2,65,0,40,2,240,23,32,0,40,2,8,34,11,77,13,3,12,19,11,65,0,33,0,2,64,32,7,65,8,118,34,11,69,13,0,65,31,33,0,32,7,65,255,255,255,7,75,13,0,32,7,65,14,32,11,32,11,65,128,254,63,106,65,16,118,65,8,113,34,0,116,34,11,65,128,224,31,106,65,16,118,65,4,113,34,12,32,0,114,32,11,32,12,116,34,0,65,128,128,15,106,65,16,118,65,2,113,34,11,114,107,32,0,32,11,116,65,15,118,106,34,0,65,7,106,118,65,1,113,32,0,65,1,116,114,33,0,11,32,10,66,0,55,2,16,32,10,65,28,106,32,0,54,2,0,32,0,65,2,116,65,144,26,106,33,11,65,0,40,2,228,23,34,12,65,1,32,0,116,34,9,113,69,13,3,32,7,65,0,65,25,32,0,65,1,118,107,32,0,65,31,70,27,116,33,0,32,11,40,2,0,33,12,3,64,32,12,34,11,40,2,4,65,120,113,32,7,70,13,5,32,0,65,29,118,33,12,32,0,65,1,116,33,0,32,11,32,12,65,4,113,106,65,16,106,34,9,40,2,0,34,12,13,0,11,65,0,40,2,240,23,32,9,75,13,18,32,9,32,10,54,2,0,32,10,65,24,106,32,11,54,2,0,32,10,32,10,54,2,12,32,10,32,10,54,2,8,12,5,11,65,0,32,11,54,2,248,23,65,0,65,0,40,2,236,23,32,0,106,34,0,54,2,236,23,32,11,32,0,65,1,114,54,2,4,12,13,11,65,0,32,12,32,11,114,54,2,224,23,32,0,33,11,11,32,11,32,10,54,2,12,32,0,65,8,106,32,10,54,2,0,32,10,32,0,54,2,12,32,10,32,11,54,2,8,12,2,11,32,11,32,10,54,2,0,65,0,32,12,32,9,114,54,2,228,23,32,10,65,24,106,32,11,54,2,0,32,10,32,10,54,2,8,32,10,32,10,54,2,12,12,1,11,65,0,40,2,240,23,34,12,32,11,40,2,8,34,0,75,13,13,32,12,32,11,75,13,13,32,0,32,10,54,2,12,32,11,65,8,106,32,10,54,2,0,32,10,32,11,54,2,12,32,10,65,24,106,65,0,54,2,0,32,10,32,0,54,2,8,11,65,0,40,2,236,23,34,0,32,6,77,13,0,65,0,40,2,248,23,34,10,32,6,106,34,11,32,0,32,6,107,34,0,65,1,114,54,2,4,65,0,32,0,54,2,236,23,65,0,32,11,54,2,248,23,32,10,32,6,65,3,114,54,2,4,32,10,65,8,106,33,0,12,11,11,16,28,65,12,54,2,0,65,0,33,0,12,10,11,32,11,65,0,40,2,232,23,32,0,106,34,0,65,1,114,54,2,4,65,0,32,11,54,2,244,23,65,0,32,0,54,2,232,23,32,11,32,0,106,32,0,54,2,0,12,6,11,32,12,40,2,24,33,4,32,12,40,2,12,34,7,32,12,70,13,1,32,9,32,12,40,2,8,34,10,75,13,9,32,10,40,2,12,32,12,71,13,9,32,7,40,2,8,32,12,71,13,9,32,7,65,8,106,32,10,54,2,0,32,10,65,12,106,32,7,54,2,0,32,4,13,2,12,3,11,65,0,65,0,40,2,224,23,65,126,32,3,119,113,54,2,224,23,12,2,11,2,64,2,64,32,12,65,20,106,34,6,40,2,0,34,10,13,0,32,12,65,16,106,34,6,40,2,0,34,10,69,13,1,11,3,64,32,6,33,3,32,10,34,7,65,20,106,34,6,40,2,0,34,10,13,0,32,7,65,16,106,33,6,32,7,40,2,16,34,10,13,0,11,32,9,32,3,75,13,8,32,3,65,0,54,2,0,32,4,69,13,2,12,1,11,65,0,33,7,32,4,69,13,1,11,2,64,2,64,2,64,32,12,40,2,28,34,6,65,2,116,65,144,26,106,34,10,40,2,0,32,12,70,13,0,65,0,40,2,240,23,32,4,75,13,9,32,4,65,16,106,32,4,40,2,16,32,12,71,65,2,116,106,32,7,54,2,0,32,7,13,1,12,3,11,32,10,32,7,54,2,0,32,7,69,13,1,11,65,0,40,2,240,23,34,6,32,7,75,13,7,32,7,32,4,54,2,24,2,64,32,12,40,2,16,34,10,69,13,0,32,6,32,10,75,13,8,32,7,32,10,54,2,16,32,10,32,7,54,2,24,11,32,12,65,20,106,40,2,0,34,10,69,13,1,65,0,40,2,240,23,32,10,75,13,7,32,7,65,20,106,32,10,54,2,0,32,10,32,7,54,2,24,12,1,11,65,0,65,0,40,2,228,23,65,126,32,6,119,113,54,2,228,23,11,32,5,65,120,113,34,10,32,0,106,33,0,32,12,32,10,106,33,12,11,32,12,32,12,40,2,4,65,126,113,54,2,4,32,11,32,0,65,1,114,54,2,4,32,11,32,0,106,32,0,54,2,0,2,64,2,64,2,64,2,64,2,64,32,0,65,255,1,75,13,0,32,0,65,3,118,34,10,65,3,116,65,136,24,106,33,0,65,0,40,2,224,23,34,6,65,1,32,10,116,34,10,113,69,13,1,65,0,40,2,240,23,32,0,40,2,8,34,10,75,13,9,32,0,65,8,106,33,6,12,2,11,65,0,33,10,2,64,32,0,65,8,118,34,6,69,13,0,65,31,33,10,32,0,65,255,255,255,7,75,13,0,32,0,65,14,32,6,32,6,65,128,254,63,106,65,16,118,65,8,113,34,10,116,34,6,65,128,224,31,106,65,16,118,65,4,113,34,12,32,10,114,32,6,32,12,116,34,10,65,128,128,15,106,65,16,118,65,2,113,34,6,114,107,32,10,32,6,116,65,15,118,106,34,10,65,7,106,118,65,1,113,32,10,65,1,116,114,33,10,11,32,11,32,10,54,2,28,32,11,66,0,55,2,16,32,10,65,2,116,65,144,26,106,33,6,65,0,40,2,228,23,34,12,65,1,32,10,116,34,9,113,69,13,2,32,0,65,0,65,25,32,10,65,1,118,107,32,10,65,31,70,27,116,33,10,32,6,40,2,0,33,12,3,64,32,12,34,6,40,2,4,65,120,113,32,0,70,13,4,32,10,65,29,118,33,12,32,10,65,1,116,33,10,32,6,32,12,65,4,113,106,65,16,106,34,9,40,2,0,34,12,13,0,11,65,0,40,2,240,23,32,9,75,13,8,32,9,32,11,54,2,0,32,11,32,6,54,2,24,32,11,32,11,54,2,12,32,11,32,11,54,2,8,12,4,11,65,0,32,6,32,10,114,54,2,224,23,32,0,65,8,106,33,6,32,0,33,10,11,32,10,32,11,54,2,12,32,6,32,11,54,2,0,32,11,32,0,54,2,12,32,11,32,10,54,2,8,12,2,11,32,6,32,11,54,2,0,65,0,32,12,32,9,114,54,2,228,23,32,11,32,6,54,2,24,32,11,32,11,54,2,8,32,11,32,11,54,2,12,12,1,11,65,0,40,2,240,23,34,10,32,6,40,2,8,34,0,75,13,4,32,10,32,6,75,13,4,32,0,32,11,54,2,12,32,6,65,8,106,32,11,54,2,0,32,11,65,0,54,2,24,32,11,32,6,54,2,12,32,11,32,0,54,2,8,11,32,8,65,8,106,33,0,12,2,11,2,64,2,64,2,64,32,12,32,12,40,2,28,34,10,65,2,116,65,144,26,106,34,0,40,2,0,70,13,0,65,0,40,2,240,23,32,5,75,13,5,32,5,65,16,106,32,5,40,2,16,32,12,71,65,2,116,106,32,9,54,2,0,32,9,13,1,12,3,11,32,0,32,9,54,2,0,32,9,69,13,1,11,65,0,40,2,240,23,34,10,32,9,75,13,3,32,9,32,5,54,2,24,2,64,32,12,40,2,16,34,0,69,13,0,32,10,32,0,75,13,4,32,9,32,0,54,2,16,32,0,32,9,54,2,24,11,32,12,65,20,106,40,2,0,34,0,69,13,1,65,0,40,2,240,23,32,0,75,13,3,32,9,65,20,106,32,0,54,2,0,32,0,32,9,54,2,24,12,1,11,65,0,32,3,65,126,32,10,119,113,34,3,54,2,228,23,11,2,64,2,64,32,11,65,15,75,13,0,32,12,32,11,32,6,106,34,0,65,3,114,54,2,4,32,12,32,0,106,34,0,32,0,40,2,4,65,1,114,54,2,4,12,1,11,32,12,32,6,65,3,114,54,2,4,32,8,32,11,65,1,114,54,2,4,32,8,32,11,106,32,11,54,2,0,2,64,2,64,2,64,2,64,2,64,32,11,65,255,1,75,13,0,32,11,65,3,118,34,10,65,3,116,65,136,24,106,33,0,65,0,40,2,224,23,34,11,65,1,32,10,116,34,10,113,69,13,1,65,0,40,2,240,23,32,0,40,2,8,34,10,75,13,7,32,0,65,8,106,33,11,12,2,11,32,11,65,8,118,34,10,69,13,2,65,31,33,0,32,11,65,255,255,255,7,75,13,3,32,11,65,14,32,10,32,10,65,128,254,63,106,65,16,118,65,8,113,34,0,116,34,10,65,128,224,31,106,65,16,118,65,4,113,34,6,32,0,114,32,10,32,6,116,34,0,65,128,128,15,106,65,16,118,65,2,113,34,10,114,107,32,0,32,10,116,65,15,118,106,34,0,65,7,106,118,65,1,113,32,0,65,1,116,114,33,0,12,3,11,65,0,32,11,32,10,114,54,2,224,23,32,0,65,8,106,33,11,32,0,33,10,11,32,10,32,8,54,2,12,32,11,32,8,54,2,0,32,8,32,0,54,2,12,32,8,32,10,54,2,8,12,2,11,65,0,33,0,11,32,8,32,0,54,2,28,32,8,66,0,55,2,16,32,0,65,2,116,65,144,26,106,33,10,2,64,2,64,32,3,65,1,32,0,116,34,6,113,69,13,0,32,11,65,0,65,25,32,0,65,1,118,107,32,0,65,31,70,27,116,33,0,32,10,40,2,0,33,6,3,64,32,6,34,10,40,2,4,65,120,113,32,11,70,13,2,32,0,65,29,118,33,6,32,0,65,1,116,33,0,32,10,32,6,65,4,113,106,65,16,106,34,9,40,2,0,34,6,13,0,11,65,0,40,2,240,23,32,9,75,13,4,32,9,32,8,54,2,0,32,8,32,10,54,2,24,32,8,32,8,54,2,12,32,8,32,8,54,2,8,12,2,11,32,10,32,8,54,2,0,65,0,32,3,32,6,114,54,2,228,23,32,8,32,10,54,2,24,32,8,32,8,54,2,8,32,8,32,8,54,2,12,12,1,11,65,0,40,2,240,23,34,11,32,10,40,2,8,34,0,75,13,2,32,11,32,10,75,13,2,32,0,32,8,54,2,12,32,10,65,8,106,32,8,54,2,0,32,8,65,0,54,2,24,32,8,32,10,54,2,12,32,8,32,0,54,2,8,11,32,12,65,8,106,33,0,11,65,0,32,13,65,16,106,54,2,4,32,0,15,11,16,26,0,11,11,137,128,128,128,0,0,16,28,40,2,0,16,0,11,128,129,128,128,0,1,3,127,2,127,2,64,2,64,2,64,2,64,32,0,65,0,72,13,0,63,0,65,16,116,33,1,65,0,40,2,212,27,34,2,32,0,79,13,1,32,0,65,127,106,32,2,107,65,16,118,65,1,106,64,0,69,13,3,16,1,65,0,63,0,65,16,116,34,3,32,1,107,65,0,40,2,212,27,106,34,2,54,2,212,27,12,2,11,65,127,15,11,32,1,33,3,11,65,0,32,2,32,0,107,54,2,212,27,32,3,32,2,107,15,11,16,28,65,12,54,2,0,16,26,0,11,11,133,128,128,128,0,0,65,208,27,11,232,144,128,128,0,1,8,127,2,64,2,64,2,64,2,64,32,0,69,13,0,2,64,2,64,2,64,2,64,32,0,65,120,106,34,3,65,0,40,2,240,23,34,5,73,13,0,32,0,65,124,106,40,2,0,34,8,65,3,113,34,6,65,1,70,13,0,32,3,32,8,65,120,113,34,0,106,33,1,2,64,2,64,32,8,65,1,113,13,0,32,6,69,13,6,32,3,32,3,40,2,0,34,8,107,34,3,32,5,73,13,2,32,8,32,0,106,33,0,2,64,2,64,2,64,2,64,2,64,65,0,40,2,244,23,32,3,70,13,0,32,8,65,255,1,75,13,1,32,3,40,2,12,33,6,2,64,32,3,40,2,8,34,7,32,8,65,3,118,34,4,65,3,116,65,136,24,106,34,8,70,13,0,32,5,32,7,75,13,14,32,7,40,2,12,32,3,71,13,14,11,32,6,32,7,70,13,2,2,64,32,6,32,8,70,13,0,32,5,32,6,75,13,14,32,6,40,2,8,32,3,71,13,14,11,32,7,32,6,54,2,12,32,6,65,8,106,32,7,54,2,0,32,3,32,1,73,13,6,12,7,11,32,1,40,2,4,34,8,65,3,113,65,3,71,13,4,32,1,65,4,106,32,8,65,126,113,54,2,0,32,3,32,0,65,1,114,54,2,4,65,0,32,0,54,2,232,23,32,3,32,0,106,32,0,54,2,0,15,11,32,3,40,2,24,33,2,32,3,40,2,12,34,7,32,3,70,13,1,32,5,32,3,40,2,8,34,8,75,13,11,32,8,40,2,12,32,3,71,13,11,32,7,40,2,8,32,3,71,13,11,32,7,65,8,106,32,8,54,2,0,32,8,65,12,106,32,7,54,2,0,32,2,13,2,12,3,11,65,0,65,0,40,2,224,23,65,126,32,4,119,113,54,2,224,23,32,3,32,1,73,13,3,12,4,11,2,64,2,64,32,3,65,20,106,34,8,40,2,0,34,6,13,0,32,3,65,16,106,34,8,40,2,0,34,6,69,13,1,11,3,64,32,8,33,4,32,6,34,7,65,20,106,34,8,40,2,0,34,6,13,0,32,7,65,16,106,33,8,32,7,40,2,16,34,6,13,0,11,32,5,32,4,75,13,10,32,4,65,0,54,2,0,32,2,69,13,2,12,1,11,65,0,33,7,32,2,69,13,1,11,2,64,2,64,2,64,32,3,40,2,28,34,6,65,2,116,65,144,26,106,34,8,40,2,0,32,3,70,13,0,65,0,40,2,240,23,32,2,75,13,11,32,2,65,16,106,32,2,40,2,16,32,3,71,65,2,116,106,32,7,54,2,0,32,7,13,1,12,3,11,32,8,32,7,54,2,0,32,7,69,13,1,11,65,0,40,2,240,23,34,6,32,7,75,13,9,32,7,32,2,54,2,24,2,64,32,3,40,2,16,34,8,69,13,0,32,6,32,8,75,13,10,32,7,32,8,54,2,16,32,8,32,7,54,2,24,11,32,3,65,20,106,40,2,0,34,8,69,13,1,65,0,40,2,240,23,32,8,75,13,9,32,7,65,20,106,32,8,54,2,0,32,8,32,7,54,2,24,32,3,32,1,73,13,2,12,3,11,65,0,65,0,40,2,228,23,65,126,32,6,119,113,54,2,228,23,11,32,3,32,1,79,13,1,11,32,1,40,2,4,34,4,65,1,113,69,13,0,2,64,2,64,2,64,2,64,2,64,2,64,32,4,65,2,113,13,0,65,0,40,2,248,23,32,1,70,13,1,65,0,40,2,244,23,32,1,70,13,2,32,4,65,255,1,75,13,3,32,1,40,2,12,33,8,2,64,32,1,40,2,8,34,6,32,4,65,3,118,34,5,65,3,116,65,136,24,106,34,7,70,13,0,65,0,40,2,240,23,32,6,75,13,13,32,6,40,2,12,32,1,71,13,13,11,32,8,32,6,70,13,4,2,64,32,8,32,7,70,13,0,65,0,40,2,240,23,32,8,75,13,13,32,8,40,2,8,32,1,71,13,13,11,32,6,32,8,54,2,12,32,8,65,8,106,32,6,54,2,0,12,8,11,32,1,65,4,106,32,4,65,126,113,54,2,0,32,3,32,0,106,32,0,54,2,0,32,3,32,0,65,1,114,54,2,4,12,8,11,65,0,32,3,54,2,248,23,65,0,65,0,40,2,236,23,32,0,106,34,0,54,2,236,23,32,3,32,0,65,1,114,54,2,4,2,64,32,3,65,0,40,2,244,23,71,13,0,65,0,65,0,54,2,232,23,65,0,65,0,54,2,244,23,11,32,0,65,0,40,2,252,23,77,13,8,65,0,16,30,26,15,11,65,0,32,3,54,2,244,23,65,0,65,0,40,2,232,23,32,0,106,34,0,54,2,232,23,32,3,32,0,65,1,114,54,2,4,32,3,32,0,106,32,0,54,2,0,15,11,32,1,40,2,24,33,2,32,1,40,2,12,34,7,32,1,70,13,1,65,0,40,2,240,23,32,1,40,2,8,34,8,75,13,8,32,8,40,2,12,32,1,71,13,8,32,7,40,2,8,32,1,71,13,8,32,7,65,8,106,32,8,54,2,0,32,8,65,12,106,32,7,54,2,0,32,2,13,3,12,4,11,65,0,65,0,40,2,224,23,65,126,32,5,119,113,54,2,224,23,12,3,11,2,64,2,64,32,1,65,20,106,34,6,40,2,0,34,8,13,0,32,1,65,16,106,34,6,40,2,0,34,8,69,13,1,11,3,64,32,6,33,5,32,8,34,7,65,20,106,34,6,40,2,0,34,8,13,0,32,7,65,16,106,33,6,32,7,40,2,16,34,8,13,0,11,65,0,40,2,240,23,32,5,75,13,7,32,5,65,0,54,2,0,32,2,69,13,3,12,2,11,65,0,33,7,32,2,13,1,12,2,11,16,28,26,16,28,65,14,54,2,0,16,26,0,11,2,64,2,64,2,64,32,1,40,2,28,34,6,65,2,116,65,144,26,106,34,8,40,2,0,32,1,70,13,0,65,0,40,2,240,23,32,2,75,13,7,32,2,65,16,106,32,2,40,2,16,32,1,71,65,2,116,106,32,7,54,2,0,32,7,13,1,12,3,11,32,8,32,7,54,2,0,32,7,69,13,1,11,65,0,40,2,240,23,34,6,32,7,75,13,5,32,7,32,2,54,2,24,2,64,32,1,40,2,16,34,8,69,13,0,32,6,32,8,75,13,6,32,7,32,8,54,2,16,32,8,32,7,54,2,24,11,32,1,65,20,106,40,2,0,34,8,69,13,1,65,0,40,2,240,23,32,8,75,13,5,32,7,65,20,106,32,8,54,2,0,32,8,32,7,54,2,24,12,1,11,65,0,65,0,40,2,228,23,65,126,32,6,119,113,54,2,228,23,11,32,3,32,4,65,120,113,32,0,106,34,0,106,32,0,54,2,0,32,3,32,0,65,1,114,54,2,4,32,3,65,0,40,2,244,23,71,13,0,65,0,32,0,54,2,232,23,15,11,2,64,2,64,2,64,2,64,2,64,2,64,32,0,65,255,1,75,13,0,32,0,65,3,118,34,8,65,3,116,65,136,24,106,33,0,65,0,40,2,224,23,34,6,65,1,32,8,116,34,8,113,69,13,1,65,0,40,2,240,23,32,0,40,2,8,34,8,77,13,2,12,8,11,65,0,33,8,2,64,32,0,65,8,118,34,6,69,13,0,65,31,33,8,32,0,65,255,255,255,7,75,13,0,32,0,65,14,32,6,32,6,65,128,254,63,106,65,16,118,65,8,113,34,8,116,34,6,65,128,224,31,106,65,16,118,65,4,113,34,7,32,8,114,32,6,32,7,116,34,8,65,128,128,15,106,65,16,118,65,2,113,34,6,114,107,32,8,32,6,116,65,15,118,106,34,8,65,7,106,118,65,1,113,32,8,65,1,116,114,33,8,11,32,3,66,0,55,2,16,32,3,65,28,106,32,8,54,2,0,32,8,65,2,116,65,144,26,106,33,6,65,0,40,2,228,23,34,7,65,1,32,8,116,34,1,113,69,13,2,32,0,65,0,65,25,32,8,65,1,118,107,32,8,65,31,70,27,116,33,8,32,6,40,2,0,33,7,3,64,32,7,34,6,40,2,4,65,120,113,32,0,70,13,4,32,8,65,29,118,33,7,32,8,65,1,116,33,8,32,6,32,7,65,4,113,106,65,16,106,34,1,40,2,0,34,7,13,0,11,65,0,40,2,240,23,32,1,75,13,7,32,1,32,3,54,2,0,32,3,65,24,106,32,6,54,2,0,32,3,32,3,54,2,12,32,3,32,3,54,2,8,12,4,11,65,0,32,6,32,8,114,54,2,224,23,32,0,33,8,11,32,8,32,3,54,2,12,32,0,65,8,106,32,3,54,2,0,32,3,32,0,54,2,12,32,3,32,8,54,2,8,15,11,32,6,32,3,54,2,0,65,0,32,7,32,1,114,54,2,228,23,32,3,65,24,106,32,6,54,2,0,32,3,32,3,54,2,8,32,3,32,3,54,2,12,12,1,11,65,0,40,2,240,23,34,8,32,6,40,2,8,34,0,75,13,3,32,8,32,6,75,13,3,32,0,32,3,54,2,12,32,6,65,8,106,32,3,54,2,0,32,3,32,6,54,2,12,32,3,65,24,106,65,0,54,2,0,32,3,32,0,54,2,8,11,65,0,65,0,40,2,128,24,65,127,106,34,3,54,2,128,24,32,3,69,13,1,11,15,11,65,168,27,33,3,3,64,32,3,40,2,0,34,0,65,8,106,33,3,32,0,13,0,11,65,0,65,127,54,2,128,24,15,11,16,26,0,0,11,0,11,240,131,128,128,0,1,7,127,2,127,65,0,65,0,40,2,4,65,16,107,34,7,54,2,4,65,0,33,6,2,64,65,0,40,2,184,27,13,0,65,0,66,128,128,132,128,128,128,192,0,55,2,188,27,65,0,66,255,255,255,255,143,128,128,16,55,2,196,27,65,0,32,7,65,12,106,65,112,113,65,216,170,213,170,5,115,54,2,184,27,65,0,65,0,54,2,204,27,65,0,65,0,54,2,156,27,11,2,64,32,0,65,191,127,75,13,0,65,0,33,6,65,0,40,2,248,23,34,1,69,13,0,65,0,33,6,2,64,65,0,40,2,236,23,34,4,32,0,65,40,106,77,13,0,65,88,32,0,107,32,4,106,65,0,40,2,192,27,34,2,106,65,127,106,32,2,110,65,127,106,33,3,65,160,27,33,0,2,64,3,64,2,64,32,0,40,2,0,34,4,32,1,75,13,0,32,4,32,0,40,2,4,106,32,1,75,13,2,11,32,0,40,2,8,33,0,12,0,11,0,11,32,0,45,0,12,65,8,113,13,0,65,0,16,27,34,1,32,0,40,2,0,32,0,65,4,106,40,2,0,106,71,13,0,65,0,65,128,128,128,128,120,32,2,107,32,3,32,2,108,34,4,32,4,65,254,255,255,255,7,75,27,107,16,27,33,2,65,0,16,27,33,4,32,2,65,127,70,13,0,32,4,32,1,79,13,0,32,1,32,4,107,34,1,69,13,0,65,1,33,6,65,0,40,2,248,23,34,4,65,120,32,4,107,65,7,113,65,0,32,4,65,8,106,65,7,113,27,34,2,106,34,3,65,0,40,2,236,23,32,1,107,34,5,32,2,107,34,2,65,1,114,54,2,4,65,0,65,0,40,2,200,27,54,2,252,23,65,0,65,0,40,2,144,27,32,1,107,54,2,144,27,32,0,65,4,106,34,0,32,0,40,2,0,32,1,107,54,2,0,65,0,32,2,54,2,236,23,65,0,32,3,54,2,248,23,32,4,32,5,106,65,40,54,2,4,12,1,11,65,0,40,2,236,23,65,0,40,2,252,23,77,13,0,65,0,33,6,65,0,65,127,54,2,252,23,11,65,0,32,7,65,16,106,54,2,4,32,6,11,11,194,131,128,128,0,2,3,127,1,124,2,125,65,0,65,0,40,2,4,65,16,107,34,3,54,2,4,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,32,0,188,34,2,65,255,255,255,255,7,113,34,1,65,218,159,164,250,3,75,13,0,32,1,65,255,255,255,203,3,75,13,1,32,3,32,0,67,0,0,128,3,148,32,0,67,0,0,128,123,146,32,1,65,128,128,128,4,73,27,56,2,4,12,12,11,32,2,65,31,118,33,2,32,1,65,209,167,237,131,4,75,13,1,32,0,187,33,4,32,1,65,227,151,219,128,4,75,13,2,32,2,69,13,6,32,4,68,24,45,68,84,251,33,249,63,160,16,19,140,33,0,12,11,11,32,0,187,16,20,33,0,12,10,11,32,1,65,213,227,136,135,4,75,13,1,32,0,187,33,4,32,1,65,223,219,191,133,4,75,13,2,32,2,69,13,5,32,4,68,210,33,51,127,124,217,18,64,160,16,19,33,0,12,9,11,68,24,45,68,84,251,33,9,64,68,24,45,68,84,251,33,9,192,32,2,27,32,4,160,154,16,20,33,0,12,8,11,32,1,65,128,128,128,252,7,73,13,1,32,0,32,0,147,33,0,12,7,11,68,24,45,68,84,251,33,25,64,68,24,45,68,84,251,33,25,192,32,2,27,32,4,160,16,20,33,0,12,6,11,32,0,32,3,65,8,106,16,21,65,3,113,34,1,65,2,70,13,2,32,1,65,1,70,13,3,32,1,13,4,32,3,43,3,8,16,20,33,0,12,5,11,32,4,68,24,45,68,84,251,33,249,191,160,16,19,33,0,12,4,11,32,4,68,210,33,51,127,124,217,18,192,160,16,19,140,33,0,12,3,11,32,3,43,3,8,154,16,20,33,0,12,2,11,32,3,43,3,8,16,19,33,0,12,1,11,32,3,43,3,8,16,19,140,33,0,11,65,0,32,3,65,16,106,54,2,4,32,0,11,11,11,160,152,128,128,0,17,0,65,4,11,4,240,52,0,0,0,65,12,11,4,0,0,0,0,0,65,16,11,4,2,0,0,0,0,65,36,11,4,0,0,0,0,0,65,40,11,4,0,0,0,0,0,65,44,11,4,0,0,0,0,0,65,48,11,4,0,0,0,0,0,65,52,11,4,0,0,0,0,0,65,192,0,11,32,210,33,51,127,124,217,2,64,210,33,51,127,124,217,2,192,24,45,68,84,251,33,233,63,24,45,68,84,251,33,233,191,0,65,224,0,11,32,24,45,68,84,251,33,9,64,24,45,68,84,251,33,9,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,65,128,1,11,32,79,187,97,5,103,172,221,63,24,45,68,84,251,33,233,63,155,246,129,210,11,115,239,63,24,45,68,84,251,33,249,63,0,65,160,1,11,32,226,101,47,34,127,43,122,60,7,92,20,51,38,166,129,60,189,203,240,122,136,7,112,60,7,92,20,51,38,166,145,60,0,65,192,1,11,16,3,0,0,0,4,0,0,0,4,0,0,0,6,0,0,0,0,65,208,1,11,200,21,131,249,162,0,68,78,110,0,252,41,21,0,209,87,39,0,221,52,245,0,98,219,192,0,60,153,149,0,65,144,67,0,99,81,254,0,187,222,171,0,183,97,197,0,58,110,36,0,210,77,66,0,73,6,224,0,9,234,46,0,28,146,209,0,235,29,254,0,41,177,28,0,232,62,167,0,245,53,130,0,68,187,46,0,156,233,132,0,180,38,112,0,65,126,95,0,214,145,57,0,83,131,57,0,156,244,57,0,139,95,132,0,40,249,189,0,248,31,59,0,222,255,151,0,15,152,5,0,17,47,239,0,10,90,139,0,109,31,109,0,207,126,54,0,9,203,39,0,70,79,183,0,158,102,63,0,45,234,95,0,186,39,117,0,229,235,199,0,61,123,241,0,247,57,7,0,146,82,138,0,251,107,234,0,31,177,95,0,8,93,141,0,48,3,86,0,123,252,70,0,240,171,107,0,32,188,207,0,54,244,154,0,227,169,29,0,94,97,145,0,8,27,230,0,133,153,101,0,160,20,95,0,141,64,104,0,128,216,255,0,39,115,77,0,6,6,49,0,202,86,21,0,201,168,115,0,123,226,96,0,107,140,192,0,25,196,71,0,205,103,195,0,9,232,220,0,89,131,42,0,139,118,196,0,166,28,150,0,68,175,221,0,25,87,209,0,165,62,5,0,5,7,255,0,51,126,63,0,194,50,232,0,152,79,222,0,187,125,50,0,38,61,195,0,30,107,239,0,159,248,94,0,53,31,58,0,127,242,202,0,241,135,29,0,124,144,33,0,106,36,124,0,213,110,250,0,48,45,119,0,21,59,67,0,181,20,198,0,195,25,157,0,173,196,194,0,44,77,65,0,12,0,93,0,134,125,70,0,227,113,45,0,155,198,154,0,51,98,0,0,180,210,124,0,180,167,151,0,55,85,213,0,215,62,246,0,163,16,24,0,77,118,252,0,100,157,42,0,112,215,171,0,99,124,248,0,122,176,87,0,23,21,231,0,192,73,86,0,59,214,217,0,167,132,56,0,36,35,203,0,214,138,119,0,90,84,35,0,0,31,185,0,241,10,27,0,25,206,223,0,159,49,255,0,102,30,106,0,153,87,97,0,172,251,71,0,126,127,216,0,34,101,183,0,50,232,137,0,230,191,96,0,239,196,205,0,108,54,9,0,93,63,212,0,22,222,215,0,88,59,222,0,222,155,146,0,210,34,40,0,40,134,232,0,226,88,77,0,198,202,50,0,8,227,22,0,224,125,203,0,23,192,80,0,243,29,167,0,24,224,91,0,46,19,52,0,131,18,98,0,131,72,1,0,245,142,91,0,173,176,127,0,30,233,242,0,72,74,67,0,16,103,211,0,170,221,216,0,174,95,66,0,106,97,206,0,10,40,164,0,211,153,180,0,6,166,242,0,92,119,127,0,163,194,131,0,97,60,136,0,138,115,120,0,175,140,90,0,111,215,189,0,45,166,99,0,244,191,203,0,141,129,239,0,38,193,103,0,85,202,69,0,202,217,54,0,40,168,210,0,194,97,141,0,18,201,119,0,4,38,20,0,18,70,155,0,196,89,196,0,200,197,68,0,77,178,145,0,0,23,243,0,212,67,173,0,41,73,229,0,253,213,16,0,0,190,252,0,30,148,204,0,112,206,238,0,19,62,245,0,236,241,128,0,179,231,195,0,199,248,40,0,147,5,148,0,193,113,62,0,46,9,179,0,11,69,243,0,136,18,156,0,171,32,123,0,46,181,159,0,71,146,194,0,123,50,47,0,12,85,109,0,114,167,144,0,107,231,31,0,49,203,150,0,121,22,74,0,65,121,226,0,244,223,137,0,232,148,151,0,226,230,132,0,153,49,151,0,136,237,107,0,95,95,54,0,187,253,14,0,72,154,180,0,103,164,108,0,113,114,66,0,141,93,50,0,159,21,184,0,188,229,9,0,141,49,37,0,247,116,57,0,48,5,28,0,13,12,1,0,75,8,104,0,44,238,88,0,71,170,144,0,116,231,2,0,189,214,36,0,247,125,166,0,110,72,114,0,159,22,239,0,142,148,166,0,180,145,246,0,209,83,81,0,207,10,242,0,32,152,51,0,245,75,126,0,178,99,104,0,221,62,95,0,64,93,3,0,133,137,127,0,85,82,41,0,55,100,192,0,109,216,16,0,50,72,50,0,91,76,117,0,78,113,212,0,69,84,110,0,11,9,193,0,42,245,105,0,20,102,213,0,39,7,157,0,93,4,80,0,180,59,219,0,234,118,197,0,135,249,23,0,73,107,125,0,29,39,186,0,150,105,41,0,198,204,172,0,173,20,84,0,144,226,106,0,136,217,137,0,44,114,80,0,4,164,190,0,119,7,148,0,243,48,112,0,0,252,39,0,234,113,168,0,102,194,73,0,100,224,61,0,151,221,131,0,163,63,151,0,67,148,253,0,13,134,140,0,49,65,222,0,146,57,157,0,221,112,140,0,23,183,231,0,8,223,59,0,21,55,43,0,92,128,160,0,90,128,147,0,16,17,146,0,15,232,216,0,108,128,175,0,219,255,75,0,56,144,15,0,89,24,118,0,98,165,21,0,97,203,187,0,199,137,185,0,16,64,189,0,210,242,4,0,73,117,39,0,235,182,246,0,219,34,187,0,10,20,170,0,137,38,47,0,100,131,118,0,9,59,51,0,14,148,26,0,81,58,170,0,29,163,194,0,175,237,174,0,92,38,18,0,109,194,77,0,45,122,156,0,192,86,151,0,3,63,131,0,9,240,246,0,43,64,140,0,109,49,153,0,57,180,7,0,12,32,21,0,216,195,91,0,245,146,196,0,198,173,75,0,78,202,165,0,167,55,205,0,230,169,54,0,171,146,148,0,221,66,104,0,25,99,222,0,118,140,239,0,104,139,82,0,252,219,55,0,174,161,171,0,223,21,49,0,0,174,161,0,12,251,218,0,100,77,102,0,237,5,183,0,41,101,48,0,87,86,191,0,71,255,58,0,106,249,185,0,117,190,243,0,40,147,223,0,171,128,48,0,102,140,246,0,4,203,21,0,250,34,6,0,217,228,29,0,61,179,164,0,87,27,143,0,54,205,9,0,78,66,233,0,19,190,164,0,51,35,181,0,240,170,26,0,79,101,168,0,210,193,165,0,11,63,15,0,91,120,205,0,35,249,118,0,123,139,4,0,137,23,114,0,198,166,83,0,111,110,226,0,239,235,0,0,155,74,88,0,196,218,183,0,170,102,186,0,118,207,207,0,209,2,29,0,177,241,45,0,140,153,193,0,195,173,119,0,134,72,218,0,247,93,160,0,198,128,244,0,172,240,47,0,221,236,154,0,63,92,188,0,208,222,109,0,144,199,31,0,42,219,182,0,163,37,58,0,0,175,154,0,173,83,147,0,182,87,4,0,41,45,180,0,75,128,126,0,218,7,167,0,118,170,14,0,123,89,161,0,22,18,42,0,220,183,45,0,250,229,253,0,137,219,254,0,137,190,253,0,228,118,108,0,6,169,252,0,62,128,112,0,133,110,21,0,253,135,255,0,40,62,7,0,97,103,51,0,42,24,134,0,77,189,234,0,179,231,175,0,143,109,110,0,149,103,57,0,49,191,91,0,132,215,72,0,48,223,22,0,199,45,67,0,37,97,53,0,201,112,206,0,48,203,184,0,191,108,253,0,164,0,162,0,5,108,228,0,90,221,160,0,33,111,71,0,98,18,210,0,185,92,132,0,112,97,73,0,107,86,224,0,153,82,1,0,80,85,55,0,30,213,183,0,51,241,196,0,19,110,95,0,93,48,228,0,133,46,169,0,29,178,195,0,161,50,54,0,8,183,164,0,234,177,212,0,22,247,33,0,143,105,228,0,39,255,119,0,12,3,128,0,141,64,45,0,79,205,160,0,32,165,153,0,179,162,211,0,47,93,10,0,180,249,66,0,17,218,203,0,125,190,208,0,155,219,193,0,171,23,189,0,202,162,129,0,8,106,92,0,46,85,23,0,39,0,85,0,127,20,240,0,225,7,134,0,20,11,100,0,150,65,141,0,135,190,222,0,218,253,42,0,107,37,182,0,123,137,52,0,5,243,254,0,185,191,158,0,104,106,79,0,74,42,168,0,79,196,90,0,45,248,188,0,215,90,152,0,244,199,149,0,13,77,141,0,32,58,166,0,164,87,95,0,20,63,177,0,128,56,149,0,204,32,1,0,113,221,134,0,201,222,182,0,191,96,245,0,77,101,17,0,1,7,107,0,140,176,172,0,178,192,208,0,81,85,72,0,30,251,14,0,149,114,195,0,163,6,59,0,192,64,53,0,6,220,123,0,224,69,204,0,78,41,250,0,214,202,200,0,232,243,65,0,124,100,222,0,155,100,216,0,217,190,49,0,164,151,195,0,119,88,212,0,105,227,197,0,240,218,19,0,186,58,60,0,70,24,70,0,85,117,95,0,210,189,245,0,110,146,198,0,172,46,93,0,14,68,237,0,28,62,66,0,97,196,135,0,41,253,233,0,231,214,243,0,34,124,202,0,111,145,53,0,8,224,197,0,255,215,141,0,110,106,226,0,176,253,198,0,147,8,193,0,124,93,116,0,107,173,178,0,205,110,157,0,62,114,123,0,198,17,106,0,247,207,169,0,41,115,223,0,181,201,186,0,183,0,81,0,226,178,13,0,116,186,36,0,229,125,96,0,116,216,138,0,13,21,44,0,129,24,12,0,126,102,148,0,1,41,22,0,159,122,118,0,253,253,190,0,86,69,239,0,217,126,54,0,236,217,19,0,139,186,185,0,196,151,252,0,49,168,39,0,241,110,195,0,148,197,54,0,216,168,86,0,180,168,181,0,207,204,14,0,18,137,45,0,111,87,52,0,44,86,137,0,153,206,227,0,214,32,185,0,107,94,170,0,62,42,156,0,17,95,204,0,253,11,74,0,225,244,251,0,142,59,109,0,226,134,44,0,233,212,132,0,252,180,169,0,239,238,209,0,46,53,201,0,47,57,97,0,56,33,68,0,27,217,200,0,129,252,10,0,251,74,106,0,47,28,216,0,83,180,132,0,78,153,140,0,84,34,204,0,42,85,220,0,192,198,214,0,11,25,150,0,26,112,184,0,105,149,100,0,38,90,96,0,63,82,238,0,127,17,15,0,244,181,17,0,252,203,245,0,52,188,45,0,52,188,238,0,232,93,204,0,221,94,96,0,103,142,155,0,146,51,239,0,201,23,184,0,97,88,155,0,225,87,188,0,81,131,198,0,216,62,16,0,221,113,72,0,45,28,221,0,175,24,161,0,33,44,70,0,89,243,215,0,217,122,152,0,158,84,192,0,79,134,250,0,86,6,252,0,229,121,174,0,137,34,54,0,56,173,34,0,103,147,220,0,85,232,170,0,130,38,56,0,202,231,155,0,81,13,164,0,153,51,177,0,169,215,14,0,105,5,72,0,101,178,240,0,127,136,167,0,136,76,151,0,249,209,54,0,33,146,179,0,123,130,74,0,152,207,33,0,64,159,220,0,220,71,85,0,225,116,58,0,103,235,66,0,254,157,223,0,94,212,95,0,123,103,164,0,186,172,122,0,85,246,162,0,43,136,35,0,65,186,85,0,89,110,8,0,33,42,134,0,57,71,131,0,137,227,230,0,229,158,212,0,73,251,64,0,255,86,233,0,28,15,202,0,197,89,138,0,148,250,43,0,211,193,197,0,15,197,207,0,219,90,174,0,71,197,134,0,133,67,98,0,33,134,59,0,44,121,148,0,16,97,135,0,42,76,123,0,128,44,26,0,67,191,18,0,136,38,144,0,120,60,137,0,168,196,228,0,229,219,123,0,196,58,194,0,38,244,234,0,247,103,138,0,13,146,191,0,101,163,43,0,61,147,177,0,189,124,11,0,164,81,220,0,39,221,99,0,105,225,221,0,154,148,25,0,168,41,149,0,104,206,40,0,9,237,180,0,68,159,32,0,78,152,202,0,112,130,99,0,126,124,35,0,15,185,50,0,167,245,142,0,20,86,231,0,33,241,8,0,181,157,42,0,111,126,77,0,165,25,81,0,181,249,171,0,130,223,214,0,150,221,97,0,22,54,2,0,196,58,159,0,131,162,161,0,114,237,109,0,57,141,122,0,130,184,169,0,107,50,92,0,70,39,91,0,0,52,237,0,210,0,119,0,252,244,85,0,1,89,77,0,224,113,128,0,0,65,160,23,11,64,0,0,0,64,251,33,249,63,0,0,0,0,45,68,116,62,0,0,0,128,152,70,248,60,0,0,0,96,81,204,120,59,0,0,0,128,131,27,240,57,0,0,0,64,32,37,122,56,0,0,0,128,34,130,227,54,0,0,0,0,29,243,105,53,0,65,208,27,11,4,0,0,0,0,0,65,212,27,11,4,0,0,0,0]);
3 | export default binary;
4 |
--------------------------------------------------------------------------------
/dist/bundle.js:
--------------------------------------------------------------------------------
1 | (function () {
2 | 'use strict';
3 |
4 | function roundTo(a, b) {
5 | var n = 1 / b;
6 | return (Math.round(a * n) / n);
7 | }
8 |
9 | function load(buffer, options) {
10 |
11 | options || (options = {});
12 |
13 | var imports = options.imports || {};
14 |
15 | var memory = imports.memory;
16 | if (!memory) {
17 | var opts = { initial: options.initialMemory || 1 };
18 | if (options.maximumMemory)
19 | { opts.maximum = options.maximumMemory; }
20 | memory = new WebAssembly.Memory(opts);
21 | memory.initial = options.initialMemory || 1;
22 | memory.maximum = options.maximumMemory;
23 | }
24 |
25 | var table = imports.table;
26 | if (!table)
27 | { table = new WebAssembly.Table({ initial: 0, element: "anyfunc" }); }
28 |
29 | function grow() {
30 | var buf = memory.buffer;
31 | memory.U8 = new Uint8Array (buf);
32 | memory.S32 = new Int32Array (buf);
33 | memory.U32 = new Uint32Array (buf);
34 | memory.F32 = new Float32Array(buf);
35 | memory.F64 = new Float64Array(buf);
36 | if (imports.ongrow) { imports.ongrow(); }
37 | }
38 |
39 | grow();
40 |
41 | function getInt(ptr) {
42 | return memory.S32[ptr >> 2];
43 | }
44 |
45 | memory.getInt = getInt;
46 |
47 | function getUint(ptr) {
48 | return memory.U32[ptr >> 2];
49 | }
50 |
51 | memory.getUint = getUint;
52 |
53 | function getFloat(ptr) {
54 | return memory.F32[ptr >> 2];
55 | }
56 |
57 | memory.getFloat = getFloat;
58 |
59 | function getDouble(ptr) {
60 | return memory.F64[ptr >> 3];
61 | }
62 |
63 | memory.getDouble = getDouble;
64 |
65 | function getString(ptr) {
66 | var start = (ptr >>>= 0);
67 | while (memory.U8[ptr++]){ }
68 | getString.bytes = ptr - start;
69 | return String.fromCharCode.apply(null, memory.U8.subarray(start, ptr - 1));
70 | }
71 |
72 | memory.getString = getString;
73 |
74 | var env = {};
75 |
76 | env.memoryBase = imports.memoryBase || 0;
77 | env.memory = memory;
78 | env.tableBase = imports.tableBase || 0;
79 | env.table = table;
80 |
81 | function sprintf(ptr, base) {
82 | var s = getString(ptr);
83 | return base
84 | ? s.replace(/%([dfisu]|lf)/g, function ($0, $1) {
85 | var val;
86 | return base +=
87 | $1 === "u" ? (val = getUint(base), 4)
88 | : $1 === "f" ? (val = getFloat(base), 4)
89 | : $1 === "s" ? (val = getString(getUint(base)), 4)
90 | : $1 === "lf" ? (val = getDouble(base), 8)
91 | : (val = getInt(base), 4)
92 | , val;
93 | })
94 | : s;
95 | }
96 |
97 | Object.getOwnPropertyNames(console).forEach(function (key) {
98 | if (typeof console[key] === "function")
99 | { env["console_" + key] = function (ptr, base) {
100 | console[key](sprintf(ptr, base));
101 | }; }
102 | });
103 |
104 | Object.getOwnPropertyNames(Math).forEach(function (key) {
105 | if (typeof Math[key] === "function")
106 | { env["Math_" + key] = Math[key]; }
107 | });
108 |
109 | Object.keys(imports).forEach(function (key) { return env[key] = imports[key]; });
110 |
111 | if (!env._abort)
112 | { env._abort = function (errno) { throw Error("abnormal abort in " + file + ": " + errno); }; }
113 | if (!env._exit)
114 | { env._exit = function (code) { if (code) { throw Error("abnormal exit in " + file + ": " + code); } }; }
115 |
116 | env._grow = grow;
117 |
118 | return WebAssembly.instantiate(buffer, { env: env })
119 | .then(function (module) {
120 | var instance = module.instance;
121 | instance.imports = imports;
122 | instance.memory = memory;
123 | instance.env = env;
124 | return instance;
125 | });
126 | }
127 |
128 | function compileShader(gl, type, source) {
129 | var shader = gl.createShader(type);
130 | gl.shaderSource(shader, source);
131 | gl.compileShader(shader);
132 | return shader;
133 | }
134 |
135 | function initRender (ptSize) {
136 |
137 | var gl = canvas.getContext("webgl", {
138 | antialias: false,
139 | alpha: true,
140 | depth: false,
141 | stencil: false
142 | });
143 |
144 | gl.depthMask(false);
145 | gl.disable(gl.DEPTH_TEST);
146 | gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
147 |
148 | var program = gl.createProgram();
149 |
150 | gl.attachShader(program, compileShader(gl, gl.VERTEX_SHADER,
151 | "\n attribute vec3 aColor;\n attribute vec3 aPosition;\n varying vec3 vColor;\n uniform vec2 res;\n uniform int time;\n void main(void) {\n vColor = aColor / 255.0;\n vec2 circle = aPosition.xy / res * vec2(2, -2) - vec2(1, -1);\n gl_Position = vec4(circle, 0, 1);\n gl_PointSize = 1.0;\n }\n "));
152 | gl.attachShader(program, compileShader(gl, gl.FRAGMENT_SHADER,
153 | "precision lowp float;\n varying vec3 vColor;\n void main(void) {\n gl_FragColor = vec4(vColor.r, vColor.g, vColor.b, 1.0);\n }\n "));
154 |
155 | gl.linkProgram(program);
156 | gl.useProgram(program);
157 |
158 | var resLoc = gl.getUniformLocation(program, "res");
159 | gl.uniform2f(resLoc, canvas.width, canvas.height);
160 |
161 | gl.viewport(0, 0, canvas.width, canvas.height);
162 |
163 | var coordBuffer = gl.createBuffer();
164 | var colorBuffer = gl.createBuffer();
165 |
166 | var coordLoc = gl.getAttribLocation(program, "aPosition");
167 | gl.enableVertexAttribArray(coordLoc);
168 |
169 | var colorLoc = gl.getAttribLocation(program, "aColor");
170 | gl.enableVertexAttribArray(colorLoc);
171 |
172 | return {
173 | gl: gl, program: program,
174 | coordBuffer: coordBuffer, colorBuffer: colorBuffer,
175 | coordLoc: coordLoc, colorLoc: colorLoc
176 | };
177 |
178 | }
179 |
180 | var binary = new Uint8Array([0,97,115,109,1,0,0,0,1,210,128,128,128,0,15,96,0,1,125,96,0,1,127,96,0,0,96,1,127,0,96,2,127,127,0,96,2,127,127,1,127,96,5,127,127,127,127,127,0,96,2,124,124,1,124,96,1,124,1,124,96,1,125,1,125,96,1,124,1,125,96,2,125,127,1,127,96,5,127,127,127,127,127,1,127,96,2,124,127,1,124,96,1,127,1,127,2,196,128,128,128,0,5,3,101,110,118,6,95,97,98,111,114,116,0,3,3,101,110,118,5,95,103,114,111,119,0,2,3,101,110,118,7,103,101,116,84,105,109,101,0,1,3,101,110,118,7,114,97,110,100,111,109,102,0,0,3,101,110,118,6,109,101,109,111,114,121,2,0,1,3,157,128,128,128,0,28,1,1,1,1,4,4,5,3,6,2,2,7,8,8,9,10,10,11,12,13,8,14,2,14,1,3,14,9,4,132,128,128,128,0,1,112,0,0,7,172,129,128,128,0,10,16,103,101,116,80,97,114,116,105,99,108,101,67,111,117,110,116,0,4,19,103,101,116,80,97,114,116,105,99,108,101,66,121,116,101,83,105,122,101,0,5,22,103,101,116,80,97,114,116,105,99,108,101,67,111,108,111,114,79,102,102,115,101,116,0,6,25,103,101,116,80,97,114,116,105,99,108,101,80,111,115,105,116,105,111,110,79,102,102,115,101,116,0,7,11,117,112,100,97,116,101,77,111,117,115,101,0,8,4,105,110,105,116,0,9,15,97,108,108,111,99,97,116,101,84,101,120,116,117,114,101,0,10,14,100,101,115,116,114,111,121,84,101,120,116,117,114,101,0,11,11,100,114,97,119,84,101,120,116,117,114,101,0,12,4,116,105,99,107,0,14,9,129,128,128,128,0,0,10,230,255,128,128,0,28,135,128,128,128,0,0,65,0,40,2,12,11,132,128,128,128,0,0,65,12,11,135,128,128,128,0,0,65,0,40,2,44,11,135,128,128,128,0,0,65,0,40,2,48,11,149,128,128,128,0,0,2,64,65,0,32,1,178,56,2,24,65,0,32,0,178,56,2,20,11,11,158,130,128,128,0,2,3,127,3,125,2,64,65,0,32,1,54,2,40,65,0,32,0,54,2,36,65,0,32,1,32,0,108,34,1,65,0,40,2,16,109,34,2,54,2,12,65,0,32,1,65,12,108,34,1,16,25,54,2,48,65,0,32,1,16,25,54,2,52,65,0,32,1,16,25,54,2,44,65,0,33,1,65,0,33,4,2,64,3,64,32,4,32,2,78,13,1,65,0,40,2,16,33,2,16,3,33,5,65,0,40,2,48,32,1,106,32,5,65,0,40,2,36,178,148,56,2,0,16,3,33,5,65,0,40,2,48,32,1,106,65,4,106,32,5,65,0,40,2,40,178,34,6,148,56,2,0,65,0,40,2,52,32,1,106,34,3,32,2,32,4,32,0,111,108,178,34,5,56,2,0,32,3,65,4,106,32,2,32,4,32,0,109,108,178,34,7,56,2,0,65,0,40,2,44,32,1,106,34,2,65,8,106,65,128,128,128,152,4,54,2,0,32,2,32,5,65,0,40,2,36,34,0,178,149,67,0,0,127,67,148,56,2,0,32,2,65,4,106,32,7,32,6,149,67,0,0,127,67,148,56,2,0,32,1,65,12,106,33,1,32,4,65,1,106,33,4,65,0,40,2,12,33,2,12,0,11,0,11,11,11,201,128,128,128,0,1,2,127,2,127,32,1,32,0,108,34,1,65,2,116,33,2,32,1,65,4,116,16,25,34,3,33,0,65,0,33,1,2,64,3,64,32,1,32,2,78,13,1,32,0,65,0,54,2,0,32,0,65,4,106,33,0,32,1,65,1,106,33,1,12,0,11,0,11,32,3,11,11,137,128,128,128,0,0,32,0,40,2,0,16,29,11,173,129,128,128,0,1,5,127,2,64,32,4,32,3,108,33,5,65,0,40,2,44,33,6,65,0,33,4,2,64,3,64,32,4,32,5,78,13,1,2,64,32,0,65,12,106,40,2,0,69,13,0,32,4,32,3,111,33,8,32,4,32,3,109,32,2,106,34,9,65,0,40,2,40,78,13,0,32,8,32,1,106,34,8,65,0,40,2,36,34,7,78,13,0,32,9,32,7,108,32,8,106,34,8,65,0,72,13,0,32,6,32,8,65,12,108,106,34,8,32,0,40,2,0,178,56,2,0,32,8,32,0,65,4,106,40,2,0,178,56,2,4,32,8,32,0,65,8,106,40,2,0,178,56,2,8,11,32,0,65,16,106,33,0,32,4,65,1,106,33,4,12,0,11,0,11,11,11,131,128,128,128,0,0,1,11,243,129,128,128,0,2,6,127,5,125,2,64,16,2,26,65,0,40,2,52,65,0,40,2,12,34,5,65,12,108,34,4,106,65,4,106,33,3,65,0,40,2,48,32,4,106,65,4,106,33,4,65,0,42,2,24,33,7,65,0,42,2,20,33,6,2,64,3,64,32,5,65,0,76,13,1,32,4,32,4,42,2,0,34,9,32,3,42,2,0,32,9,147,67,205,204,76,61,148,146,34,9,56,2,0,32,4,65,124,106,34,0,32,0,42,2,0,34,8,32,3,65,124,106,42,2,0,32,8,147,67,205,204,76,61,148,146,34,8,56,2,0,2,64,32,7,32,9,147,168,34,2,32,2,108,32,6,32,8,147,168,34,1,32,1,108,106,65,211,225,0,75,13,0,32,4,32,9,32,2,183,32,1,183,16,15,182,34,10,16,31,67,0,0,158,65,148,147,56,2,0,32,0,32,8,32,10,16,18,67,0,0,158,65,148,147,56,2,0,11,32,3,65,116,106,33,3,32,4,65,116,106,33,4,32,5,65,127,106,33,5,12,0,11,0,11,11,11,242,131,128,128,0,3,6,127,2,126,1,124,2,124,2,64,2,64,32,1,189,34,8,66,255,255,255,255,255,255,255,255,255,0,131,66,128,128,128,128,128,128,128,248,255,0,86,13,0,32,0,189,34,9,66,255,255,255,255,255,255,255,255,255,0,131,66,129,128,128,128,128,128,128,248,255,0,84,13,1,11,32,0,32,1,160,15,11,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,32,8,66,32,136,167,34,2,65,128,128,192,128,124,106,32,8,167,34,3,114,69,13,0,32,8,66,62,136,167,65,2,113,34,5,32,9,66,63,136,167,34,4,114,33,6,32,9,66,32,136,167,65,255,255,255,255,7,113,34,7,32,9,167,114,69,13,1,32,2,65,255,255,255,255,7,113,34,2,32,3,114,69,13,2,32,2,65,128,128,192,255,7,71,13,3,32,6,65,2,115,65,3,113,33,2,32,7,65,128,128,192,255,7,71,13,4,32,2,65,3,116,65,192,0,106,43,3,0,15,11,32,0,16,16,15,11,32,6,65,3,113,34,2,65,3,70,13,4,32,2,65,2,70,13,5,32,0,15,11,68,24,45,68,84,251,33,249,191,68,24,45,68,84,251,33,249,63,32,4,27,15,11,32,7,65,128,128,192,255,7,70,13,1,32,2,65,128,128,128,32,106,32,7,73,13,1,2,64,2,64,32,5,69,13,0,68,0,0,0,0,0,0,0,0,33,10,32,7,65,128,128,128,32,106,32,2,73,13,1,11,32,0,32,1,163,16,17,16,16,33,10,11,32,6,65,3,113,34,2,69,13,4,32,2,65,2,70,13,5,32,2,65,1,71,13,6,32,10,154,15,11,32,2,65,3,116,65,224,0,106,43,3,0,15,11,68,24,45,68,84,251,33,249,191,68,24,45,68,84,251,33,249,63,32,4,27,15,11,68,24,45,68,84,251,33,9,192,15,11,68,24,45,68,84,251,33,9,64,15,11,32,10,15,11,68,24,45,68,84,251,33,9,64,32,10,68,7,92,20,51,38,166,161,188,160,161,15,11,32,10,68,7,92,20,51,38,166,161,188,160,68,24,45,68,84,251,33,9,192,160,11,11,203,132,128,128,0,3,4,127,1,126,3,124,2,124,65,0,65,0,40,2,4,65,16,107,34,4,54,2,4,32,0,189,34,5,66,63,136,167,33,1,2,64,2,64,32,5,66,32,136,167,65,255,255,255,255,7,113,34,2,65,128,128,192,160,4,73,13,0,32,5,66,255,255,255,255,255,255,255,255,255,0,131,66,128,128,128,128,128,128,128,248,255,0,86,13,1,68,24,45,68,84,251,33,249,191,68,24,45,68,84,251,33,249,63,32,1,27,33,0,12,1,11,2,64,2,64,32,2,65,255,255,239,254,3,75,13,0,65,127,33,3,32,2,65,255,255,255,241,3,75,13,1,32,2,65,255,255,63,75,13,2,32,4,32,0,182,56,2,12,12,2,11,32,0,16,17,33,0,2,64,2,64,2,64,32,2,65,255,255,203,255,3,75,13,0,32,2,65,255,255,151,255,3,75,13,1,32,0,32,0,160,68,0,0,0,0,0,0,240,191,160,32,0,68,0,0,0,0,0,0,0,64,160,163,33,0,65,0,33,3,12,3,11,32,2,65,255,255,141,128,4,75,13,1,32,0,68,0,0,0,0,0,0,248,191,160,32,0,68,0,0,0,0,0,0,248,63,162,68,0,0,0,0,0,0,240,63,160,163,33,0,65,2,33,3,12,2,11,32,0,68,0,0,0,0,0,0,240,191,160,32,0,68,0,0,0,0,0,0,240,63,160,163,33,0,65,1,33,3,12,1,11,68,0,0,0,0,0,0,240,191,32,0,163,33,0,65,3,33,3,11,32,0,32,0,162,34,7,32,7,162,34,8,32,8,32,8,32,8,32,8,68,47,108,106,44,68,180,162,191,162,68,154,253,222,82,45,222,173,191,160,162,68,109,154,116,175,242,176,179,191,160,162,68,113,22,35,254,198,113,188,191,160,162,68,196,235,152,153,153,153,201,191,160,162,33,6,32,7,32,8,32,8,32,8,32,8,32,8,68,17,218,34,227,58,173,144,63,162,68,235,13,118,36,75,123,169,63,160,162,68,81,61,208,160,102,13,177,63,160,162,68,110,32,76,197,205,69,183,63,160,162,68,255,131,0,146,36,73,194,63,160,162,68,13,85,85,85,85,85,213,63,160,162,33,8,2,64,32,3,65,127,76,13,0,32,3,65,3,116,34,2,65,128,1,106,43,3,0,32,0,32,6,32,8,160,162,32,2,65,160,1,106,43,3,0,161,32,0,161,161,34,0,154,32,0,32,1,27,33,0,12,1,11,32,0,32,0,32,6,32,8,160,162,161,33,0,11,65,0,32,4,65,16,106,54,2,4,32,0,11,11,146,128,128,128,0,0,32,0,189,66,255,255,255,255,255,255,255,255,255,0,131,191,11,180,131,128,128,0,2,3,127,1,124,2,125,65,0,65,0,40,2,4,65,16,107,34,3,54,2,4,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,32,0,188,34,2,65,255,255,255,255,7,113,34,1,65,218,159,164,250,3,75,13,0,32,1,65,255,255,255,203,3,75,13,1,32,3,32,0,67,0,0,128,123,146,56,2,4,67,0,0,128,63,33,0,12,12,11,32,2,65,31,118,33,2,32,1,65,209,167,237,131,4,75,13,1,32,0,187,33,4,32,1,65,228,151,219,128,4,73,13,2,68,24,45,68,84,251,33,9,64,68,24,45,68,84,251,33,9,192,32,2,27,32,4,160,16,19,140,33,0,12,11,11,32,0,187,16,19,33,0,12,10,11,32,1,65,213,227,136,135,4,75,13,1,32,1,65,224,219,191,133,4,73,13,2,68,24,45,68,84,251,33,25,64,68,24,45,68,84,251,33,25,192,32,2,27,32,0,187,160,16,19,33,0,12,9,11,32,2,69,13,3,32,4,68,24,45,68,84,251,33,249,63,160,16,20,33,0,12,8,11,32,1,65,128,128,128,252,7,73,13,1,32,0,32,0,147,33,0,12,7,11,32,2,69,13,2,68,210,33,51,127,124,217,18,192,32,0,187,161,16,20,33,0,12,6,11,32,0,32,3,65,8,106,16,21,65,3,113,34,1,65,2,70,13,2,32,1,65,1,70,13,3,32,1,13,4,32,3,43,3,8,16,19,33,0,12,5,11,68,24,45,68,84,251,33,249,63,32,4,161,16,20,33,0,12,4,11,32,0,187,68,210,33,51,127,124,217,18,192,160,16,20,33,0,12,3,11,32,3,43,3,8,16,19,140,33,0,12,2,11,32,3,43,3,8,154,16,20,33,0,12,1,11,32,3,43,3,8,16,20,33,0,11,65,0,32,3,65,16,106,54,2,4,32,0,11,11,207,128,128,128,0,1,1,124,32,0,32,0,162,34,0,68,129,94,12,253,255,255,223,191,162,68,0,0,0,0,0,0,240,63,160,32,0,32,0,162,34,1,68,66,58,5,225,83,85,165,63,162,160,32,0,32,1,162,32,0,68,105,80,238,224,66,147,249,62,162,68,39,30,15,232,135,192,86,191,160,162,160,182,11,203,128,128,128,0,1,2,124,32,0,32,0,162,34,1,32,0,162,34,2,32,1,32,1,162,162,32,1,68,167,70,59,140,135,205,198,62,162,68,116,231,202,226,249,0,42,191,160,162,32,2,32,1,68,178,251,110,137,16,17,129,63,162,68,119,172,203,84,85,85,197,191,160,162,32,0,160,160,182,11,253,129,128,128,0,2,4,127,1,124,2,127,65,0,65,0,40,2,4,65,16,107,34,5,54,2,4,2,64,2,64,32,0,188,34,2,65,255,255,255,255,7,113,34,4,65,218,159,164,238,4,75,13,0,32,1,32,0,187,34,6,32,6,68,131,200,201,109,48,95,228,63,162,68,0,0,0,0,0,0,56,67,160,68,0,0,0,0,0,0,56,195,160,34,6,68,0,0,0,80,251,33,249,191,162,160,32,6,68,99,98,26,97,180,16,81,190,162,160,57,3,0,32,6,170,33,4,12,1,11,2,64,32,4,65,128,128,128,252,7,73,13,0,32,1,32,0,32,0,147,187,57,3,0,65,0,33,4,12,1,11,32,5,32,4,32,4,65,23,118,65,234,126,106,34,3,65,23,116,107,190,187,57,3,8,32,5,65,8,106,32,5,32,3,65,1,65,0,16,22,33,4,32,5,43,3,0,33,6,2,64,32,2,65,127,76,13,0,32,1,32,6,57,3,0,12,1,11,32,1,32,6,154,57,3,0,65,0,32,4,107,33,4,11,65,0,32,5,65,16,106,54,2,4,32,4,11,11,252,147,128,128,0,2,21,127,4,124,2,127,65,0,65,0,40,2,4,65,176,4,107,34,25,54,2,4,32,2,32,2,65,125,106,65,24,109,34,22,65,0,32,22,65,0,74,27,34,6,65,104,108,106,33,15,2,64,32,4,65,2,116,65,192,1,106,40,2,0,34,5,32,3,65,127,106,34,14,106,65,0,72,13,0,32,5,32,3,106,33,13,32,6,32,14,107,34,2,65,2,116,65,208,1,106,33,23,32,25,65,192,2,106,33,22,3,64,2,64,2,64,32,2,65,0,72,13,0,32,23,40,2,0,183,33,28,12,1,11,68,0,0,0,0,0,0,0,0,33,28,11,32,22,32,28,57,3,0,32,22,65,8,106,33,22,32,23,65,4,106,33,23,32,2,65,1,106,33,2,32,13,65,127,106,34,13,13,0,11,11,32,15,65,104,106,33,24,2,64,2,64,32,3,65,0,76,13,0,32,25,65,192,2,106,32,14,65,3,116,106,33,14,65,0,33,13,3,64,68,0,0,0,0,0,0,0,0,33,28,32,0,33,2,32,3,33,23,32,14,33,22,3,64,32,28,32,2,43,3,0,32,22,43,3,0,162,160,33,28,32,2,65,8,106,33,2,32,22,65,120,106,33,22,32,23,65,127,106,34,23,13,0,11,32,25,32,13,65,3,116,106,32,28,57,3,0,32,14,65,8,106,33,14,32,13,32,5,72,33,2,32,13,65,1,106,33,13,32,2,13,0,12,2,11,0,11,65,127,33,22,32,25,33,2,3,64,32,2,66,0,55,3,0,32,2,65,8,106,33,2,32,22,65,1,106,34,22,32,5,72,13,0,11,11,65,23,32,24,107,33,8,65,24,32,24,107,33,7,32,25,65,224,3,106,32,5,65,2,116,106,65,124,106,33,11,32,25,65,8,114,33,12,32,25,65,224,3,106,65,124,106,33,10,32,25,65,120,106,33,9,32,3,65,0,74,33,18,32,5,33,19,2,64,2,64,3,64,32,25,32,19,34,14,65,3,116,34,16,106,43,3,0,33,28,2,64,32,14,65,1,72,34,13,13,0,32,14,65,1,106,33,23,32,9,32,16,106,33,2,32,25,65,224,3,106,33,22,3,64,32,22,32,28,32,28,68,0,0,0,0,0,0,112,62,162,170,183,34,26,68,0,0,0,0,0,0,112,193,162,160,170,54,2,0,32,22,65,4,106,33,22,32,2,43,3,0,32,26,160,33,28,32,2,65,120,106,33,2,32,23,65,127,106,34,23,65,1,74,13,0,11,11,2,64,32,28,32,24,16,23,34,28,32,28,68,0,0,0,0,0,0,192,63,162,16,24,68,0,0,0,0,0,0,32,192,162,160,34,28,32,28,170,34,19,183,161,33,28,2,64,2,64,2,64,2,64,32,24,65,1,72,34,17,13,0,32,25,65,224,3,106,32,14,65,2,116,106,65,124,106,34,2,32,2,40,2,0,34,2,32,2,32,7,117,34,2,32,7,116,107,34,22,54,2,0,32,2,32,19,106,33,19,32,22,32,8,117,34,20,65,1,78,13,1,12,2,11,2,64,32,24,69,13,0,65,2,33,20,32,28,68,0,0,0,0,0,0,224,63,99,32,28,32,28,98,114,69,13,1,65,0,33,20,32,28,68,0,0,0,0,0,0,0,0,97,13,3,12,4,11,32,25,65,224,3,106,32,14,65,2,116,106,65,124,106,40,2,0,65,23,117,34,20,65,1,72,13,1,11,2,64,2,64,2,64,32,13,13,0,65,0,33,21,32,25,65,224,3,106,33,2,32,14,33,13,3,64,32,2,40,2,0,33,22,65,255,255,255,7,33,23,2,64,2,64,32,21,13,0,2,64,32,22,13,0,65,0,33,21,12,2,11,65,128,128,128,8,33,23,65,1,33,21,11,32,2,32,23,32,22,107,54,2,0,11,32,2,65,4,106,33,2,32,13,65,127,106,34,13,13,0,11,32,17,13,2,12,1,11,65,0,33,21,32,17,13,1,11,2,64,2,64,32,24,65,1,70,13,0,32,24,65,2,71,13,2,65,255,255,255,1,33,22,12,1,11,65,255,255,255,3,33,22,11,32,25,65,224,3,106,32,14,65,2,116,106,65,124,106,34,2,32,2,40,2,0,32,22,113,54,2,0,11,32,19,65,1,106,33,19,32,20,65,2,71,13,0,68,0,0,0,0,0,0,240,63,32,28,161,33,28,65,2,33,20,32,21,69,13,0,32,28,68,0,0,0,0,0,0,240,63,32,24,16,23,161,33,28,11,32,28,68,0,0,0,0,0,0,0,0,98,13,1,11,2,64,32,14,32,5,76,13,0,32,10,32,14,65,2,116,106,33,2,65,0,33,22,32,14,33,23,3,64,32,2,40,2,0,32,22,114,33,22,32,2,65,124,106,33,2,32,23,65,127,106,34,23,32,5,74,13,0,11,32,22,13,3,11,65,0,33,22,32,11,33,2,3,64,32,22,65,1,106,33,22,32,2,40,2,0,33,23,32,2,65,124,106,33,2,32,23,69,13,0,11,32,14,32,22,106,33,19,32,22,65,1,72,13,1,2,64,32,18,69,13,0,32,14,65,1,106,33,2,32,25,65,192,2,106,32,3,32,14,106,65,3,116,106,33,21,3,64,32,25,65,192,2,106,32,14,32,3,106,65,3,116,106,32,2,34,13,32,6,106,65,2,116,65,208,1,106,40,2,0,183,57,3,0,68,0,0,0,0,0,0,0,0,33,28,32,0,33,2,32,21,33,22,32,3,33,23,3,64,32,28,32,2,43,3,0,32,22,43,3,0,162,160,33,28,32,2,65,8,106,33,2,32,22,65,120,106,33,22,32,23,65,127,106,34,23,13,0,11,32,25,32,13,65,3,116,106,32,28,57,3,0,32,21,65,8,106,33,21,32,13,65,1,106,33,2,32,13,33,14,32,13,32,19,72,13,0,12,3,11,0,11,32,12,32,16,106,33,2,32,6,32,14,106,65,2,116,65,212,1,106,33,22,32,25,65,192,2,106,32,3,32,14,106,65,3,116,106,33,23,3,64,32,2,66,0,55,3,0,32,23,32,22,40,2,0,183,57,3,0,32,22,65,4,106,33,22,32,2,65,8,106,33,2,32,23,65,8,106,33,23,32,14,65,1,106,34,14,32,19,72,13,0,12,2,11,0,11,11,2,64,2,64,32,28,65,0,32,24,107,16,23,34,28,68,0,0,0,0,0,0,112,65,99,32,28,32,28,98,114,69,13,0,32,28,33,26,12,1,11,32,25,65,224,3,106,32,14,65,2,116,106,32,28,32,28,68,0,0,0,0,0,0,112,62,162,170,183,34,26,68,0,0,0,0,0,0,112,193,162,160,170,54,2,0,32,14,65,1,106,33,14,32,15,33,24,11,32,25,65,224,3,106,32,14,65,2,116,106,32,26,170,54,2,0,12,1,11,32,25,65,224,3,106,32,14,65,2,116,106,65,124,106,33,2,3,64,32,14,65,127,106,33,14,32,24,65,104,106,33,24,32,2,40,2,0,33,22,32,2,65,124,106,33,2,32,22,69,13,0,11,11,68,0,0,0,0,0,0,240,63,32,24,16,23,33,28,2,64,32,14,65,0,72,13,0,32,14,65,1,106,33,23,32,25,32,14,65,3,116,106,33,2,32,25,65,224,3,106,32,14,65,2,116,106,33,22,3,64,32,2,32,28,32,22,40,2,0,183,162,57,3,0,32,2,65,120,106,33,2,32,22,65,124,106,33,22,32,28,68,0,0,0,0,0,0,112,62,162,33,28,32,23,65,127,106,34,23,65,0,74,13,0,11,32,14,65,0,72,13,0,32,25,32,14,65,3,116,106,33,13,32,14,33,2,3,64,32,14,32,2,34,3,107,33,21,68,0,0,0,0,0,0,0,0,33,28,65,0,33,2,65,0,33,22,2,64,3,64,32,28,32,2,65,160,23,106,43,3,0,32,13,32,2,106,43,3,0,162,160,33,28,32,22,32,5,78,13,1,32,2,65,8,106,33,2,32,22,32,21,72,33,23,32,22,65,1,106,33,22,32,23,13,0,11,11,32,25,65,160,1,106,32,21,65,3,116,106,32,28,57,3,0,32,13,65,120,106,33,13,32,3,65,127,106,33,2,32,3,65,0,74,13,0,11,11,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,32,4,65,127,106,65,2,73,13,0,32,4,69,13,1,32,4,65,3,71,13,9,68,0,0,0,0,0,0,0,0,33,29,2,64,32,14,65,1,72,13,0,32,14,65,1,106,33,22,32,25,65,160,1,106,32,14,65,3,116,106,34,23,65,120,106,33,2,32,23,43,3,0,33,28,3,64,32,2,32,2,43,3,0,34,27,32,28,160,34,26,57,3,0,32,2,65,8,106,32,28,32,27,32,26,161,160,57,3,0,32,2,65,120,106,33,2,32,26,33,28,32,22,65,127,106,34,22,65,1,74,13,0,11,32,14,65,2,72,13,0,32,14,65,1,106,33,22,32,25,65,160,1,106,32,14,65,3,116,106,34,23,65,120,106,33,2,32,23,43,3,0,33,28,3,64,32,2,32,2,43,3,0,34,27,32,28,160,34,26,57,3,0,32,2,65,8,106,32,28,32,27,32,26,161,160,57,3,0,32,2,65,120,106,33,2,32,26,33,28,32,22,65,127,106,34,22,65,2,74,13,0,11,32,14,65,2,72,13,0,32,14,65,1,106,33,22,32,25,65,160,1,106,32,14,65,3,116,106,33,2,68,0,0,0,0,0,0,0,0,33,29,3,64,32,29,32,2,43,3,0,160,33,29,32,2,65,120,106,33,2,32,22,65,127,106,34,22,65,2,74,13,0,11,11,32,25,43,3,160,1,33,28,32,20,69,13,4,32,1,32,28,154,57,3,0,32,1,32,25,43,3,168,1,154,57,3,8,32,29,154,33,29,12,5,11,32,14,65,0,72,13,1,32,14,65,1,106,33,22,32,25,65,160,1,106,32,14,65,3,116,106,33,2,68,0,0,0,0,0,0,0,0,33,28,3,64,32,28,32,2,43,3,0,160,33,28,32,2,65,120,106,33,2,32,22,65,127,106,34,22,65,0,74,13,0,12,3,11,0,11,32,14,65,0,72,13,4,32,14,65,1,106,33,22,32,25,65,160,1,106,32,14,65,3,116,106,33,2,68,0,0,0,0,0,0,0,0,33,28,3,64,32,28,32,2,43,3,0,160,33,28,32,2,65,120,106,33,2,32,22,65,127,106,34,22,65,0,74,13,0,12,6,11,0,11,68,0,0,0,0,0,0,0,0,33,28,11,32,1,32,28,154,32,28,32,20,27,57,3,0,32,25,43,3,160,1,32,28,161,33,28,2,64,32,14,65,1,72,13,0,32,25,65,160,1,106,65,8,114,33,2,3,64,32,28,32,2,43,3,0,160,33,28,32,2,65,8,106,33,2,32,14,65,127,106,34,14,13,0,11,11,32,28,154,32,28,32,20,27,33,29,32,1,65,8,106,33,1,12,4,11,32,1,32,28,57,3,0,32,1,32,25,41,3,168,1,55,3,8,11,32,1,65,16,106,33,1,12,2,11,68,0,0,0,0,0,0,0,0,33,28,11,32,28,154,32,28,32,20,27,33,29,11,32,1,32,29,57,3,0,11,65,0,32,25,65,176,4,106,54,2,4,32,19,65,7,113,11,11,181,129,128,128,0,0,2,124,2,64,2,64,2,64,2,64,32,1,65,128,8,72,13,0,32,0,68,0,0,0,0,0,0,224,127,162,33,0,32,1,65,255,15,72,13,1,32,1,65,130,112,106,34,1,65,255,7,32,1,65,255,7,72,27,33,1,32,0,68,0,0,0,0,0,0,224,127,162,33,0,12,3,11,32,1,65,129,120,74,13,2,32,0,68,0,0,0,0,0,0,96,3,162,33,0,32,1,65,184,112,74,13,1,32,1,65,146,15,106,34,1,65,130,120,32,1,65,130,120,74,27,33,1,32,0,68,0,0,0,0,0,0,96,3,162,33,0,12,2,11,32,1,65,129,120,106,33,1,12,1,11,32,1,65,201,7,106,33,1,11,32,0,32,1,65,255,7,106,173,66,52,134,191,162,11,11,184,129,128,128,0,3,3,127,1,126,1,124,2,124,65,0,40,2,4,65,16,107,33,3,2,64,32,0,68,0,0,0,0,0,0,0,0,97,13,0,32,0,189,34,4,66,52,136,167,65,255,15,113,34,1,65,178,8,75,13,0,68,0,0,0,0,0,0,48,67,68,0,0,0,0,0,0,48,195,32,4,66,0,83,34,2,27,68,0,0,0,0,0,0,48,195,68,0,0,0,0,0,0,48,67,32,2,27,32,0,160,160,32,0,161,33,5,2,64,32,1,65,254,7,75,13,0,32,3,32,5,57,3,8,32,4,66,63,135,167,183,15,11,32,5,32,0,160,33,0,32,5,68,0,0,0,0,0,0,0,0,101,32,5,32,5,98,114,13,0,32,0,68,0,0,0,0,0,0,240,191,160,33,0,11,32,0,11,11,237,184,128,128,0,1,13,127,2,127,65,0,65,0,40,2,4,65,16,107,34,13,54,2,4,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,32,0,65,244,1,75,13,0,65,0,40,2,224,23,34,7,65,16,32,0,65,11,106,65,120,113,32,0,65,11,73,27,34,6,65,3,118,34,10,118,34,0,65,3,113,69,13,1,32,0,65,127,115,65,1,113,32,10,106,34,11,65,3,116,34,6,65,144,24,106,40,2,0,34,10,40,2,8,34,0,32,6,65,136,24,106,34,6,70,13,2,65,0,40,2,240,23,32,0,75,13,39,32,0,40,2,12,32,10,71,13,39,32,6,65,8,106,32,0,54,2,0,32,0,65,12,106,32,6,54,2,0,12,3,11,65,127,33,6,32,0,65,191,127,75,13,15,32,0,65,11,106,34,0,65,120,113,33,6,65,0,40,2,228,23,34,3,69,13,15,65,0,33,8,2,64,32,0,65,8,118,34,0,69,13,0,65,31,33,8,32,6,65,255,255,255,7,75,13,0,32,6,65,14,32,0,32,0,65,128,254,63,106,65,16,118,65,8,113,34,10,116,34,0,65,128,224,31,106,65,16,118,65,4,113,34,11,32,10,114,32,0,32,11,116,34,0,65,128,128,15,106,65,16,118,65,2,113,34,10,114,107,32,0,32,10,116,65,15,118,106,34,0,65,7,106,118,65,1,113,32,0,65,1,116,114,33,8,11,65,0,32,6,107,33,11,32,8,65,2,116,65,144,26,106,40,2,0,34,10,69,13,3,32,6,65,0,65,25,32,8,65,1,118,107,32,8,65,31,70,27,116,33,9,65,0,33,0,65,0,33,12,3,64,2,64,32,10,40,2,4,65,120,113,32,6,107,34,7,32,11,79,13,0,32,7,33,11,32,10,33,12,32,7,69,13,8,11,32,0,32,10,65,20,106,40,2,0,34,7,32,7,32,10,32,9,65,29,118,65,4,113,106,65,16,106,40,2,0,34,10,70,27,32,0,32,7,27,33,0,32,9,32,10,65,0,71,116,33,9,32,10,13,0,11,32,0,32,12,114,69,13,4,12,12,11,32,6,65,0,40,2,232,23,34,3,77,13,14,32,0,69,13,4,32,0,32,10,116,65,2,32,10,116,34,0,65,0,32,0,107,114,113,34,0,65,0,32,0,107,113,65,127,106,34,0,32,0,65,12,118,65,16,113,34,0,118,34,10,65,5,118,65,8,113,34,11,32,0,114,32,10,32,11,118,34,0,65,2,118,65,4,113,34,10,114,32,0,32,10,118,34,0,65,1,118,65,2,113,34,10,114,32,0,32,10,118,34,0,65,1,118,65,1,113,34,10,114,32,0,32,10,118,106,34,11,65,3,116,34,12,65,144,24,106,40,2,0,34,0,40,2,8,34,10,32,12,65,136,24,106,34,12,70,13,6,65,0,40,2,240,23,32,10,75,13,37,32,10,40,2,12,32,0,71,13,37,32,12,65,8,106,32,10,54,2,0,32,10,65,12,106,32,12,54,2,0,12,7,11,65,0,32,7,65,126,32,11,119,113,54,2,224,23,11,32,10,65,8,106,33,0,32,10,32,11,65,3,116,34,11,65,3,114,54,2,4,32,10,32,11,106,34,10,32,10,40,2,4,65,1,114,54,2,4,12,34,11,65,0,33,0,65,0,33,12,65,0,65,0,114,13,8,11,65,0,33,12,32,3,65,2,32,8,116,34,0,65,0,32,0,107,114,113,34,0,69,13,10,32,0,65,0,32,0,107,113,65,127,106,34,0,32,0,65,12,118,65,16,113,34,0,118,34,10,65,5,118,65,8,113,34,9,32,0,114,32,10,32,9,118,34,0,65,2,118,65,4,113,34,10,114,32,0,32,10,118,34,0,65,1,118,65,2,113,34,10,114,32,0,32,10,118,34,0,65,1,118,65,1,113,34,10,114,32,0,32,10,118,106,65,2,116,65,144,26,106,40,2,0,34,0,13,8,12,9,11,65,0,40,2,228,23,34,5,69,13,9,32,5,65,0,32,5,107,113,65,127,106,34,0,32,0,65,12,118,65,16,113,34,0,118,34,10,65,5,118,65,8,113,34,11,32,0,114,32,10,32,11,118,34,0,65,2,118,65,4,113,34,10,114,32,0,32,10,118,34,0,65,1,118,65,2,113,34,10,114,32,0,32,10,118,34,0,65,1,118,65,1,113,34,10,114,32,0,32,10,118,106,65,2,116,65,144,26,106,40,2,0,34,11,40,2,4,65,120,113,32,6,107,33,10,2,64,32,11,65,16,106,32,11,40,2,16,69,65,2,116,106,40,2,0,34,0,69,13,0,3,64,32,0,40,2,4,65,120,113,32,6,107,34,12,32,10,32,12,32,10,73,34,12,27,33,10,32,0,32,11,32,12,27,33,11,32,0,65,16,106,32,0,40,2,16,69,65,2,116,106,40,2,0,34,12,33,0,32,12,13,0,11,11,65,0,40,2,240,23,34,1,32,11,75,13,32,32,11,32,6,106,34,2,32,11,77,13,32,32,11,40,2,24,33,4,32,11,40,2,12,34,9,32,11,70,13,3,32,1,32,11,40,2,8,34,0,75,13,32,32,0,40,2,12,32,11,71,13,32,32,9,40,2,8,32,11,71,13,32,32,9,65,8,106,32,0,54,2,0,32,0,65,12,106,32,9,54,2,0,32,4,13,4,12,5,11,65,0,33,11,32,10,33,12,32,10,33,0,12,6,11,65,0,32,7,65,126,32,11,119,113,34,7,54,2,224,23,11,32,0,32,6,65,3,114,54,2,4,32,0,32,6,106,34,12,32,11,65,3,116,34,10,32,6,107,34,11,65,1,114,54,2,4,32,0,32,10,106,32,11,54,2,0,2,64,32,3,69,13,0,32,3,65,3,118,34,9,65,3,116,65,136,24,106,33,6,65,0,40,2,244,23,33,10,2,64,2,64,32,7,65,1,32,9,116,34,9,113,69,13,0,65,0,40,2,240,23,32,6,40,2,8,34,9,77,13,1,12,32,11,65,0,32,7,32,9,114,54,2,224,23,32,6,33,9,11,32,9,32,10,54,2,12,32,6,65,8,106,32,10,54,2,0,32,10,32,6,54,2,12,32,10,32,9,54,2,8,11,32,0,65,8,106,33,0,65,0,32,12,54,2,244,23,65,0,32,11,54,2,232,23,12,28,11,2,64,2,64,32,11,65,20,106,34,12,40,2,0,34,0,13,0,32,11,40,2,16,34,0,69,13,1,32,11,65,16,106,33,12,11,3,64,32,12,33,8,32,0,34,9,65,20,106,34,12,40,2,0,34,0,13,0,32,9,65,16,106,33,12,32,9,40,2,16,34,0,13,0,11,32,1,32,8,75,13,29,32,8,65,0,54,2,0,32,4,69,13,2,12,1,11,65,0,33,9,32,4,69,13,1,11,2,64,2,64,2,64,32,11,32,11,40,2,28,34,12,65,2,116,65,144,26,106,34,0,40,2,0,70,13,0,65,0,40,2,240,23,32,4,75,13,30,32,4,65,16,106,32,4,40,2,16,32,11,71,65,2,116,106,32,9,54,2,0,32,9,13,1,12,3,11,32,0,32,9,54,2,0,32,9,69,13,1,11,65,0,40,2,240,23,34,12,32,9,75,13,28,32,9,32,4,54,2,24,2,64,32,11,40,2,16,34,0,69,13,0,32,12,32,0,75,13,29,32,9,32,0,54,2,16,32,0,32,9,54,2,24,11,32,11,65,20,106,40,2,0,34,0,69,13,1,65,0,40,2,240,23,32,0,75,13,28,32,9,65,20,106,32,0,54,2,0,32,0,32,9,54,2,24,12,1,11,65,0,32,5,65,126,32,12,119,113,54,2,228,23,11,2,64,2,64,32,10,65,15,75,13,0,32,11,32,10,32,6,106,34,0,65,3,114,54,2,4,32,11,32,0,106,34,0,32,0,40,2,4,65,1,114,54,2,4,12,1,11,32,11,32,6,65,3,114,54,2,4,32,2,32,10,65,1,114,54,2,4,32,2,32,10,106,32,10,54,2,0,2,64,32,3,69,13,0,32,3,65,3,118,34,12,65,3,116,65,136,24,106,33,6,65,0,40,2,244,23,33,0,2,64,2,64,32,7,65,1,32,12,116,34,12,113,69,13,0,65,0,40,2,240,23,32,6,40,2,8,34,12,77,13,1,12,30,11,65,0,32,7,32,12,114,54,2,224,23,32,6,33,12,11,32,12,32,0,54,2,12,32,6,65,8,106,32,0,54,2,0,32,0,32,6,54,2,12,32,0,32,12,54,2,8,11,65,0,32,2,54,2,244,23,65,0,32,10,54,2,232,23,11,32,11,65,8,106,33,0,12,25,11,32,0,69,13,1,11,3,64,32,0,40,2,4,65,120,113,32,6,107,34,10,32,11,32,10,32,11,73,34,10,27,33,11,32,0,32,12,32,10,27,33,12,32,0,65,16,106,32,0,40,2,16,69,65,2,116,106,40,2,0,34,10,33,0,32,10,13,0,11,11,32,12,69,13,0,32,11,65,0,40,2,232,23,32,6,107,79,13,0,65,0,40,2,240,23,34,4,32,12,75,13,23,32,12,32,6,106,34,8,32,12,77,13,23,32,12,40,2,24,33,5,32,12,40,2,12,34,9,32,12,70,13,1,32,4,32,12,40,2,8,34,0,75,13,23,32,0,40,2,12,32,12,71,13,23,32,9,40,2,8,32,12,71,13,23,32,9,65,8,106,32,0,54,2,0,32,0,65,12,106,32,9,54,2,0,32,5,13,20,12,21,11,2,64,2,64,2,64,2,64,2,64,2,64,65,0,40,2,232,23,34,0,32,6,79,13,0,65,0,40,2,236,23,34,12,32,6,77,13,1,65,0,40,2,248,23,34,0,32,6,106,34,10,32,12,32,6,107,34,11,65,1,114,54,2,4,65,0,32,11,54,2,236,23,65,0,32,10,54,2,248,23,32,0,32,6,65,3,114,54,2,4,32,0,65,8,106,33,0,12,27,11,65,0,40,2,244,23,33,10,32,0,32,6,107,34,11,65,16,73,13,1,32,10,32,6,106,34,12,32,11,65,1,114,54,2,4,32,10,32,0,106,32,11,54,2,0,65,0,32,11,54,2,232,23,65,0,32,12,54,2,244,23,32,10,32,6,65,3,114,54,2,4,12,2,11,65,0,40,2,184,27,69,13,2,65,0,40,2,192,27,33,10,12,3,11,32,10,32,0,65,3,114,54,2,4,32,10,32,0,106,34,0,32,0,40,2,4,65,1,114,54,2,4,65,0,65,0,54,2,244,23,65,0,65,0,54,2,232,23,11,32,10,65,8,106,33,0,12,23,11,65,0,66,128,128,132,128,128,128,192,0,55,2,188,27,65,0,66,255,255,255,255,143,128,128,16,55,2,196,27,65,0,32,13,65,12,106,65,112,113,65,216,170,213,170,5,115,54,2,184,27,65,0,65,0,54,2,204,27,65,0,65,0,54,2,156,27,65,128,128,4,33,10,11,65,0,33,0,32,10,32,6,65,47,106,34,3,106,34,7,65,0,32,10,107,34,8,113,34,9,32,6,77,13,21,65,0,33,0,2,64,65,0,40,2,152,27,34,10,69,13,0,65,0,40,2,144,27,34,11,32,9,106,34,5,32,11,77,13,22,32,5,32,10,75,13,22,11,65,0,45,0,156,27,65,4,113,13,8,2,64,65,0,40,2,248,23,34,10,69,13,0,65,160,27,33,0,3,64,2,64,32,0,40,2,0,34,11,32,10,75,13,0,32,11,32,0,40,2,4,106,32,10,75,13,4,11,32,0,40,2,8,34,0,13,0,11,11,65,0,16,27,34,12,65,127,70,13,7,32,9,33,7,2,64,65,0,40,2,188,27,34,0,65,127,106,34,10,32,12,113,69,13,0,32,9,32,12,107,32,10,32,12,106,65,0,32,0,107,113,106,33,7,11,32,7,32,6,77,13,7,32,7,65,254,255,255,255,7,75,13,7,2,64,65,0,40,2,152,27,34,0,69,13,0,65,0,40,2,144,27,34,10,32,7,106,34,11,32,10,77,13,8,32,11,32,0,75,13,8,11,32,7,16,27,34,0,32,12,71,13,2,12,9,11,2,64,32,12,65,20,106,34,10,40,2,0,34,0,13,0,32,12,40,2,16,34,0,69,13,3,32,12,65,16,106,33,10,11,3,64,32,10,33,7,32,0,34,9,65,20,106,34,10,40,2,0,34,0,13,0,32,9,65,16,106,33,10,32,9,40,2,16,34,0,13,0,11,32,4,32,7,75,13,21,32,7,65,0,54,2,0,32,5,69,13,19,12,18,11,32,7,32,12,107,32,8,113,34,7,65,254,255,255,255,7,75,13,5,32,7,16,27,34,12,32,0,40,2,0,32,0,65,4,106,40,2,0,106,70,13,3,32,12,33,0,11,32,0,33,12,32,6,65,48,106,32,7,77,13,1,32,7,65,254,255,255,255,7,75,13,1,32,12,65,127,70,13,1,32,3,32,7,107,65,0,40,2,192,27,34,0,106,65,0,32,0,107,113,34,0,65,254,255,255,255,7,75,13,6,32,0,16,27,65,127,70,13,3,32,0,32,7,106,33,7,12,6,11,65,0,33,9,32,5,13,15,12,16,11,32,12,65,127,71,13,4,12,2,11,32,12,65,127,71,13,3,12,1,11,65,0,32,7,107,16,27,26,11,65,0,65,0,40,2,156,27,65,4,114,54,2,156,27,11,32,9,65,254,255,255,255,7,75,13,1,32,9,16,27,34,12,65,0,16,27,34,0,79,13,1,32,12,65,127,70,13,1,32,0,65,127,70,13,1,32,0,32,12,107,34,7,32,6,65,40,106,77,13,1,11,65,0,65,0,40,2,144,27,32,7,106,34,0,54,2,144,27,2,64,32,0,65,0,40,2,148,27,77,13,0,65,0,32,0,54,2,148,27,11,2,64,2,64,2,64,2,64,65,0,40,2,248,23,34,10,69,13,0,65,160,27,33,0,3,64,32,12,32,0,40,2,0,34,11,32,0,40,2,4,34,9,106,70,13,2,32,0,40,2,8,34,0,13,0,12,3,11,0,11,2,64,2,64,65,0,40,2,240,23,34,0,69,13,0,32,12,32,0,79,13,1,11,65,0,32,12,54,2,240,23,11,65,0,32,7,54,2,164,27,65,0,32,12,54,2,160,27,65,0,65,127,54,2,128,24,65,0,65,136,24,54,2,148,24,65,0,65,136,24,54,2,144,24,65,0,65,144,24,54,2,156,24,65,0,65,144,24,54,2,152,24,65,0,65,152,24,54,2,164,24,65,0,65,152,24,54,2,160,24,65,0,65,160,24,54,2,172,24,65,0,65,160,24,54,2,168,24,65,0,65,168,24,54,2,180,24,65,0,65,168,24,54,2,176,24,65,0,65,176,24,54,2,188,24,65,0,65,176,24,54,2,184,24,65,0,65,184,24,54,2,196,24,65,0,65,0,40,2,184,27,54,2,132,24,65,0,65,0,54,2,172,27,65,0,65,192,24,54,2,204,24,65,0,65,184,24,54,2,192,24,65,0,65,192,24,54,2,200,24,65,0,65,200,24,54,2,212,24,65,0,65,200,24,54,2,208,24,65,0,65,208,24,54,2,220,24,65,0,65,208,24,54,2,216,24,65,0,65,216,24,54,2,228,24,65,0,65,216,24,54,2,224,24,65,0,65,224,24,54,2,236,24,65,0,65,224,24,54,2,232,24,65,0,65,232,24,54,2,244,24,65,0,65,232,24,54,2,240,24,65,0,65,240,24,54,2,252,24,65,0,65,240,24,54,2,248,24,65,0,65,248,24,54,2,132,25,65,0,65,248,24,54,2,128,25,65,0,65,128,25,54,2,140,25,65,0,65,128,25,54,2,136,25,65,0,65,136,25,54,2,144,25,65,0,65,136,25,54,2,148,25,65,0,65,144,25,54,2,156,25,65,0,65,144,25,54,2,152,25,65,0,65,152,25,54,2,164,25,65,0,65,152,25,54,2,160,25,65,0,65,160,25,54,2,172,25,65,0,65,160,25,54,2,168,25,65,0,65,168,25,54,2,180,25,65,0,65,168,25,54,2,176,25,65,0,65,176,25,54,2,188,25,65,0,65,176,25,54,2,184,25,65,0,65,184,25,54,2,196,25,65,0,65,184,25,54,2,192,25,65,0,65,192,25,54,2,204,25,65,0,65,192,25,54,2,200,25,65,0,65,200,25,54,2,212,25,65,0,65,200,25,54,2,208,25,65,0,65,208,25,54,2,220,25,32,12,65,120,32,12,107,65,7,113,65,0,32,12,65,8,106,65,7,113,27,34,0,106,34,10,32,7,65,88,106,34,11,32,0,107,34,0,65,1,114,54,2,4,65,0,65,216,25,54,2,228,25,65,0,65,208,25,54,2,216,25,65,0,65,216,25,54,2,224,25,65,0,65,224,25,54,2,236,25,65,0,65,224,25,54,2,232,25,65,0,65,232,25,54,2,244,25,65,0,65,232,25,54,2,240,25,65,0,65,240,25,54,2,252,25,65,0,65,240,25,54,2,248,25,65,0,65,248,25,54,2,132,26,65,0,65,248,25,54,2,128,26,65,0,65,128,26,54,2,140,26,65,0,65,128,26,54,2,136,26,65,0,32,10,54,2,248,23,65,0,32,0,54,2,236,23,32,12,32,11,106,65,40,54,2,4,65,0,65,0,40,2,200,27,54,2,252,23,12,2,11,32,0,45,0,12,65,8,113,13,0,32,12,32,10,77,13,0,32,11,32,10,75,13,0,32,10,65,120,32,10,107,65,7,113,65,0,32,10,65,8,106,65,7,113,27,34,11,106,34,12,65,0,40,2,236,23,32,7,106,34,8,32,11,107,34,11,65,1,114,54,2,4,32,0,65,4,106,32,9,32,7,106,54,2,0,65,0,65,0,40,2,200,27,54,2,252,23,65,0,32,11,54,2,236,23,65,0,32,12,54,2,248,23,32,10,32,8,106,65,40,54,2,4,12,1,11,2,64,32,12,65,0,40,2,240,23,34,9,79,13,0,65,0,32,12,54,2,240,23,32,12,33,9,11,32,12,32,7,106,33,11,65,160,27,33,0,2,64,2,64,2,64,2,64,2,64,2,64,2,64,3,64,32,0,40,2,0,32,11,70,13,1,32,0,40,2,8,34,0,13,0,12,2,11,0,11,32,0,45,0,12,65,8,113,13,0,32,0,32,12,54,2,0,32,0,32,0,40,2,4,32,7,106,54,2,4,32,12,65,120,32,12,107,65,7,113,65,0,32,12,65,8,106,65,7,113,27,106,34,8,32,6,65,3,114,54,2,4,32,11,65,120,32,11,107,65,7,113,65,0,32,11,65,8,106,65,7,113,27,106,34,12,32,8,107,32,6,107,33,0,32,8,32,6,106,33,11,32,10,32,12,70,13,1,65,0,40,2,244,23,32,12,70,13,8,32,12,40,2,4,34,5,65,3,113,65,1,71,13,14,32,5,65,255,1,75,13,9,32,12,40,2,12,33,10,2,64,32,12,40,2,8,34,6,32,5,65,3,118,34,3,65,3,116,65,136,24,106,34,7,70,13,0,32,9,32,6,75,13,20,32,6,40,2,12,32,12,71,13,20,11,32,10,32,6,70,13,10,2,64,32,10,32,7,70,13,0,32,9,32,10,75,13,20,32,10,40,2,8,32,12,71,13,20,11,32,6,32,10,54,2,12,32,10,65,8,106,32,6,54,2,0,12,13,11,65,160,27,33,0,2,64,3,64,2,64,32,0,40,2,0,34,11,32,10,75,13,0,32,11,32,0,40,2,4,106,34,11,32,10,75,13,2,11,32,0,40,2,8,33,0,12,0,11,0,11,32,12,65,120,32,12,107,65,7,113,65,0,32,12,65,8,106,65,7,113,27,34,0,106,34,8,32,7,65,88,106,34,9,32,0,107,34,0,65,1,114,54,2,4,32,12,32,9,106,65,40,54,2,4,32,10,32,11,65,39,32,11,107,65,7,113,65,0,32,11,65,89,106,65,7,113,27,106,65,81,106,34,9,32,9,32,10,65,16,106,73,27,34,9,65,27,54,2,4,65,0,65,0,40,2,200,27,54,2,252,23,65,0,32,0,54,2,236,23,65,0,32,8,54,2,248,23,32,9,65,16,106,65,0,40,2,168,27,54,2,0,32,9,65,12,106,65,0,40,2,164,27,54,2,0,32,9,65,0,40,2,160,27,54,2,8,32,9,65,20,106,65,0,40,2,172,27,54,2,0,65,0,32,12,54,2,160,27,65,0,32,7,54,2,164,27,65,0,32,9,65,8,106,54,2,168,27,65,0,65,0,54,2,172,27,32,9,65,28,106,33,0,3,64,32,0,65,7,54,2,0,32,0,65,4,106,34,0,32,11,73,13,0,11,32,9,32,10,70,13,5,32,9,65,4,106,34,0,32,0,40,2,0,65,126,113,54,2,0,32,9,32,9,32,10,107,34,7,54,2,0,32,10,32,7,65,1,114,54,2,4,2,64,32,7,65,255,1,75,13,0,32,7,65,3,118,34,11,65,3,116,65,136,24,106,33,0,65,0,40,2,224,23,34,12,65,1,32,11,116,34,11,113,69,13,2,65,0,40,2,240,23,32,0,40,2,8,34,11,77,13,3,12,19,11,65,0,33,0,2,64,32,7,65,8,118,34,11,69,13,0,65,31,33,0,32,7,65,255,255,255,7,75,13,0,32,7,65,14,32,11,32,11,65,128,254,63,106,65,16,118,65,8,113,34,0,116,34,11,65,128,224,31,106,65,16,118,65,4,113,34,12,32,0,114,32,11,32,12,116,34,0,65,128,128,15,106,65,16,118,65,2,113,34,11,114,107,32,0,32,11,116,65,15,118,106,34,0,65,7,106,118,65,1,113,32,0,65,1,116,114,33,0,11,32,10,66,0,55,2,16,32,10,65,28,106,32,0,54,2,0,32,0,65,2,116,65,144,26,106,33,11,65,0,40,2,228,23,34,12,65,1,32,0,116,34,9,113,69,13,3,32,7,65,0,65,25,32,0,65,1,118,107,32,0,65,31,70,27,116,33,0,32,11,40,2,0,33,12,3,64,32,12,34,11,40,2,4,65,120,113,32,7,70,13,5,32,0,65,29,118,33,12,32,0,65,1,116,33,0,32,11,32,12,65,4,113,106,65,16,106,34,9,40,2,0,34,12,13,0,11,65,0,40,2,240,23,32,9,75,13,18,32,9,32,10,54,2,0,32,10,65,24,106,32,11,54,2,0,32,10,32,10,54,2,12,32,10,32,10,54,2,8,12,5,11,65,0,32,11,54,2,248,23,65,0,65,0,40,2,236,23,32,0,106,34,0,54,2,236,23,32,11,32,0,65,1,114,54,2,4,12,13,11,65,0,32,12,32,11,114,54,2,224,23,32,0,33,11,11,32,11,32,10,54,2,12,32,0,65,8,106,32,10,54,2,0,32,10,32,0,54,2,12,32,10,32,11,54,2,8,12,2,11,32,11,32,10,54,2,0,65,0,32,12,32,9,114,54,2,228,23,32,10,65,24,106,32,11,54,2,0,32,10,32,10,54,2,8,32,10,32,10,54,2,12,12,1,11,65,0,40,2,240,23,34,12,32,11,40,2,8,34,0,75,13,13,32,12,32,11,75,13,13,32,0,32,10,54,2,12,32,11,65,8,106,32,10,54,2,0,32,10,32,11,54,2,12,32,10,65,24,106,65,0,54,2,0,32,10,32,0,54,2,8,11,65,0,40,2,236,23,34,0,32,6,77,13,0,65,0,40,2,248,23,34,10,32,6,106,34,11,32,0,32,6,107,34,0,65,1,114,54,2,4,65,0,32,0,54,2,236,23,65,0,32,11,54,2,248,23,32,10,32,6,65,3,114,54,2,4,32,10,65,8,106,33,0,12,11,11,16,28,65,12,54,2,0,65,0,33,0,12,10,11,32,11,65,0,40,2,232,23,32,0,106,34,0,65,1,114,54,2,4,65,0,32,11,54,2,244,23,65,0,32,0,54,2,232,23,32,11,32,0,106,32,0,54,2,0,12,6,11,32,12,40,2,24,33,4,32,12,40,2,12,34,7,32,12,70,13,1,32,9,32,12,40,2,8,34,10,75,13,9,32,10,40,2,12,32,12,71,13,9,32,7,40,2,8,32,12,71,13,9,32,7,65,8,106,32,10,54,2,0,32,10,65,12,106,32,7,54,2,0,32,4,13,2,12,3,11,65,0,65,0,40,2,224,23,65,126,32,3,119,113,54,2,224,23,12,2,11,2,64,2,64,32,12,65,20,106,34,6,40,2,0,34,10,13,0,32,12,65,16,106,34,6,40,2,0,34,10,69,13,1,11,3,64,32,6,33,3,32,10,34,7,65,20,106,34,6,40,2,0,34,10,13,0,32,7,65,16,106,33,6,32,7,40,2,16,34,10,13,0,11,32,9,32,3,75,13,8,32,3,65,0,54,2,0,32,4,69,13,2,12,1,11,65,0,33,7,32,4,69,13,1,11,2,64,2,64,2,64,32,12,40,2,28,34,6,65,2,116,65,144,26,106,34,10,40,2,0,32,12,70,13,0,65,0,40,2,240,23,32,4,75,13,9,32,4,65,16,106,32,4,40,2,16,32,12,71,65,2,116,106,32,7,54,2,0,32,7,13,1,12,3,11,32,10,32,7,54,2,0,32,7,69,13,1,11,65,0,40,2,240,23,34,6,32,7,75,13,7,32,7,32,4,54,2,24,2,64,32,12,40,2,16,34,10,69,13,0,32,6,32,10,75,13,8,32,7,32,10,54,2,16,32,10,32,7,54,2,24,11,32,12,65,20,106,40,2,0,34,10,69,13,1,65,0,40,2,240,23,32,10,75,13,7,32,7,65,20,106,32,10,54,2,0,32,10,32,7,54,2,24,12,1,11,65,0,65,0,40,2,228,23,65,126,32,6,119,113,54,2,228,23,11,32,5,65,120,113,34,10,32,0,106,33,0,32,12,32,10,106,33,12,11,32,12,32,12,40,2,4,65,126,113,54,2,4,32,11,32,0,65,1,114,54,2,4,32,11,32,0,106,32,0,54,2,0,2,64,2,64,2,64,2,64,2,64,32,0,65,255,1,75,13,0,32,0,65,3,118,34,10,65,3,116,65,136,24,106,33,0,65,0,40,2,224,23,34,6,65,1,32,10,116,34,10,113,69,13,1,65,0,40,2,240,23,32,0,40,2,8,34,10,75,13,9,32,0,65,8,106,33,6,12,2,11,65,0,33,10,2,64,32,0,65,8,118,34,6,69,13,0,65,31,33,10,32,0,65,255,255,255,7,75,13,0,32,0,65,14,32,6,32,6,65,128,254,63,106,65,16,118,65,8,113,34,10,116,34,6,65,128,224,31,106,65,16,118,65,4,113,34,12,32,10,114,32,6,32,12,116,34,10,65,128,128,15,106,65,16,118,65,2,113,34,6,114,107,32,10,32,6,116,65,15,118,106,34,10,65,7,106,118,65,1,113,32,10,65,1,116,114,33,10,11,32,11,32,10,54,2,28,32,11,66,0,55,2,16,32,10,65,2,116,65,144,26,106,33,6,65,0,40,2,228,23,34,12,65,1,32,10,116,34,9,113,69,13,2,32,0,65,0,65,25,32,10,65,1,118,107,32,10,65,31,70,27,116,33,10,32,6,40,2,0,33,12,3,64,32,12,34,6,40,2,4,65,120,113,32,0,70,13,4,32,10,65,29,118,33,12,32,10,65,1,116,33,10,32,6,32,12,65,4,113,106,65,16,106,34,9,40,2,0,34,12,13,0,11,65,0,40,2,240,23,32,9,75,13,8,32,9,32,11,54,2,0,32,11,32,6,54,2,24,32,11,32,11,54,2,12,32,11,32,11,54,2,8,12,4,11,65,0,32,6,32,10,114,54,2,224,23,32,0,65,8,106,33,6,32,0,33,10,11,32,10,32,11,54,2,12,32,6,32,11,54,2,0,32,11,32,0,54,2,12,32,11,32,10,54,2,8,12,2,11,32,6,32,11,54,2,0,65,0,32,12,32,9,114,54,2,228,23,32,11,32,6,54,2,24,32,11,32,11,54,2,8,32,11,32,11,54,2,12,12,1,11,65,0,40,2,240,23,34,10,32,6,40,2,8,34,0,75,13,4,32,10,32,6,75,13,4,32,0,32,11,54,2,12,32,6,65,8,106,32,11,54,2,0,32,11,65,0,54,2,24,32,11,32,6,54,2,12,32,11,32,0,54,2,8,11,32,8,65,8,106,33,0,12,2,11,2,64,2,64,2,64,32,12,32,12,40,2,28,34,10,65,2,116,65,144,26,106,34,0,40,2,0,70,13,0,65,0,40,2,240,23,32,5,75,13,5,32,5,65,16,106,32,5,40,2,16,32,12,71,65,2,116,106,32,9,54,2,0,32,9,13,1,12,3,11,32,0,32,9,54,2,0,32,9,69,13,1,11,65,0,40,2,240,23,34,10,32,9,75,13,3,32,9,32,5,54,2,24,2,64,32,12,40,2,16,34,0,69,13,0,32,10,32,0,75,13,4,32,9,32,0,54,2,16,32,0,32,9,54,2,24,11,32,12,65,20,106,40,2,0,34,0,69,13,1,65,0,40,2,240,23,32,0,75,13,3,32,9,65,20,106,32,0,54,2,0,32,0,32,9,54,2,24,12,1,11,65,0,32,3,65,126,32,10,119,113,34,3,54,2,228,23,11,2,64,2,64,32,11,65,15,75,13,0,32,12,32,11,32,6,106,34,0,65,3,114,54,2,4,32,12,32,0,106,34,0,32,0,40,2,4,65,1,114,54,2,4,12,1,11,32,12,32,6,65,3,114,54,2,4,32,8,32,11,65,1,114,54,2,4,32,8,32,11,106,32,11,54,2,0,2,64,2,64,2,64,2,64,2,64,32,11,65,255,1,75,13,0,32,11,65,3,118,34,10,65,3,116,65,136,24,106,33,0,65,0,40,2,224,23,34,11,65,1,32,10,116,34,10,113,69,13,1,65,0,40,2,240,23,32,0,40,2,8,34,10,75,13,7,32,0,65,8,106,33,11,12,2,11,32,11,65,8,118,34,10,69,13,2,65,31,33,0,32,11,65,255,255,255,7,75,13,3,32,11,65,14,32,10,32,10,65,128,254,63,106,65,16,118,65,8,113,34,0,116,34,10,65,128,224,31,106,65,16,118,65,4,113,34,6,32,0,114,32,10,32,6,116,34,0,65,128,128,15,106,65,16,118,65,2,113,34,10,114,107,32,0,32,10,116,65,15,118,106,34,0,65,7,106,118,65,1,113,32,0,65,1,116,114,33,0,12,3,11,65,0,32,11,32,10,114,54,2,224,23,32,0,65,8,106,33,11,32,0,33,10,11,32,10,32,8,54,2,12,32,11,32,8,54,2,0,32,8,32,0,54,2,12,32,8,32,10,54,2,8,12,2,11,65,0,33,0,11,32,8,32,0,54,2,28,32,8,66,0,55,2,16,32,0,65,2,116,65,144,26,106,33,10,2,64,2,64,32,3,65,1,32,0,116,34,6,113,69,13,0,32,11,65,0,65,25,32,0,65,1,118,107,32,0,65,31,70,27,116,33,0,32,10,40,2,0,33,6,3,64,32,6,34,10,40,2,4,65,120,113,32,11,70,13,2,32,0,65,29,118,33,6,32,0,65,1,116,33,0,32,10,32,6,65,4,113,106,65,16,106,34,9,40,2,0,34,6,13,0,11,65,0,40,2,240,23,32,9,75,13,4,32,9,32,8,54,2,0,32,8,32,10,54,2,24,32,8,32,8,54,2,12,32,8,32,8,54,2,8,12,2,11,32,10,32,8,54,2,0,65,0,32,3,32,6,114,54,2,228,23,32,8,32,10,54,2,24,32,8,32,8,54,2,8,32,8,32,8,54,2,12,12,1,11,65,0,40,2,240,23,34,11,32,10,40,2,8,34,0,75,13,2,32,11,32,10,75,13,2,32,0,32,8,54,2,12,32,10,65,8,106,32,8,54,2,0,32,8,65,0,54,2,24,32,8,32,10,54,2,12,32,8,32,0,54,2,8,11,32,12,65,8,106,33,0,11,65,0,32,13,65,16,106,54,2,4,32,0,15,11,16,26,0,11,11,137,128,128,128,0,0,16,28,40,2,0,16,0,11,128,129,128,128,0,1,3,127,2,127,2,64,2,64,2,64,2,64,32,0,65,0,72,13,0,63,0,65,16,116,33,1,65,0,40,2,212,27,34,2,32,0,79,13,1,32,0,65,127,106,32,2,107,65,16,118,65,1,106,64,0,69,13,3,16,1,65,0,63,0,65,16,116,34,3,32,1,107,65,0,40,2,212,27,106,34,2,54,2,212,27,12,2,11,65,127,15,11,32,1,33,3,11,65,0,32,2,32,0,107,54,2,212,27,32,3,32,2,107,15,11,16,28,65,12,54,2,0,16,26,0,11,11,133,128,128,128,0,0,65,208,27,11,232,144,128,128,0,1,8,127,2,64,2,64,2,64,2,64,32,0,69,13,0,2,64,2,64,2,64,2,64,32,0,65,120,106,34,3,65,0,40,2,240,23,34,5,73,13,0,32,0,65,124,106,40,2,0,34,8,65,3,113,34,6,65,1,70,13,0,32,3,32,8,65,120,113,34,0,106,33,1,2,64,2,64,32,8,65,1,113,13,0,32,6,69,13,6,32,3,32,3,40,2,0,34,8,107,34,3,32,5,73,13,2,32,8,32,0,106,33,0,2,64,2,64,2,64,2,64,2,64,65,0,40,2,244,23,32,3,70,13,0,32,8,65,255,1,75,13,1,32,3,40,2,12,33,6,2,64,32,3,40,2,8,34,7,32,8,65,3,118,34,4,65,3,116,65,136,24,106,34,8,70,13,0,32,5,32,7,75,13,14,32,7,40,2,12,32,3,71,13,14,11,32,6,32,7,70,13,2,2,64,32,6,32,8,70,13,0,32,5,32,6,75,13,14,32,6,40,2,8,32,3,71,13,14,11,32,7,32,6,54,2,12,32,6,65,8,106,32,7,54,2,0,32,3,32,1,73,13,6,12,7,11,32,1,40,2,4,34,8,65,3,113,65,3,71,13,4,32,1,65,4,106,32,8,65,126,113,54,2,0,32,3,32,0,65,1,114,54,2,4,65,0,32,0,54,2,232,23,32,3,32,0,106,32,0,54,2,0,15,11,32,3,40,2,24,33,2,32,3,40,2,12,34,7,32,3,70,13,1,32,5,32,3,40,2,8,34,8,75,13,11,32,8,40,2,12,32,3,71,13,11,32,7,40,2,8,32,3,71,13,11,32,7,65,8,106,32,8,54,2,0,32,8,65,12,106,32,7,54,2,0,32,2,13,2,12,3,11,65,0,65,0,40,2,224,23,65,126,32,4,119,113,54,2,224,23,32,3,32,1,73,13,3,12,4,11,2,64,2,64,32,3,65,20,106,34,8,40,2,0,34,6,13,0,32,3,65,16,106,34,8,40,2,0,34,6,69,13,1,11,3,64,32,8,33,4,32,6,34,7,65,20,106,34,8,40,2,0,34,6,13,0,32,7,65,16,106,33,8,32,7,40,2,16,34,6,13,0,11,32,5,32,4,75,13,10,32,4,65,0,54,2,0,32,2,69,13,2,12,1,11,65,0,33,7,32,2,69,13,1,11,2,64,2,64,2,64,32,3,40,2,28,34,6,65,2,116,65,144,26,106,34,8,40,2,0,32,3,70,13,0,65,0,40,2,240,23,32,2,75,13,11,32,2,65,16,106,32,2,40,2,16,32,3,71,65,2,116,106,32,7,54,2,0,32,7,13,1,12,3,11,32,8,32,7,54,2,0,32,7,69,13,1,11,65,0,40,2,240,23,34,6,32,7,75,13,9,32,7,32,2,54,2,24,2,64,32,3,40,2,16,34,8,69,13,0,32,6,32,8,75,13,10,32,7,32,8,54,2,16,32,8,32,7,54,2,24,11,32,3,65,20,106,40,2,0,34,8,69,13,1,65,0,40,2,240,23,32,8,75,13,9,32,7,65,20,106,32,8,54,2,0,32,8,32,7,54,2,24,32,3,32,1,73,13,2,12,3,11,65,0,65,0,40,2,228,23,65,126,32,6,119,113,54,2,228,23,11,32,3,32,1,79,13,1,11,32,1,40,2,4,34,4,65,1,113,69,13,0,2,64,2,64,2,64,2,64,2,64,2,64,32,4,65,2,113,13,0,65,0,40,2,248,23,32,1,70,13,1,65,0,40,2,244,23,32,1,70,13,2,32,4,65,255,1,75,13,3,32,1,40,2,12,33,8,2,64,32,1,40,2,8,34,6,32,4,65,3,118,34,5,65,3,116,65,136,24,106,34,7,70,13,0,65,0,40,2,240,23,32,6,75,13,13,32,6,40,2,12,32,1,71,13,13,11,32,8,32,6,70,13,4,2,64,32,8,32,7,70,13,0,65,0,40,2,240,23,32,8,75,13,13,32,8,40,2,8,32,1,71,13,13,11,32,6,32,8,54,2,12,32,8,65,8,106,32,6,54,2,0,12,8,11,32,1,65,4,106,32,4,65,126,113,54,2,0,32,3,32,0,106,32,0,54,2,0,32,3,32,0,65,1,114,54,2,4,12,8,11,65,0,32,3,54,2,248,23,65,0,65,0,40,2,236,23,32,0,106,34,0,54,2,236,23,32,3,32,0,65,1,114,54,2,4,2,64,32,3,65,0,40,2,244,23,71,13,0,65,0,65,0,54,2,232,23,65,0,65,0,54,2,244,23,11,32,0,65,0,40,2,252,23,77,13,8,65,0,16,30,26,15,11,65,0,32,3,54,2,244,23,65,0,65,0,40,2,232,23,32,0,106,34,0,54,2,232,23,32,3,32,0,65,1,114,54,2,4,32,3,32,0,106,32,0,54,2,0,15,11,32,1,40,2,24,33,2,32,1,40,2,12,34,7,32,1,70,13,1,65,0,40,2,240,23,32,1,40,2,8,34,8,75,13,8,32,8,40,2,12,32,1,71,13,8,32,7,40,2,8,32,1,71,13,8,32,7,65,8,106,32,8,54,2,0,32,8,65,12,106,32,7,54,2,0,32,2,13,3,12,4,11,65,0,65,0,40,2,224,23,65,126,32,5,119,113,54,2,224,23,12,3,11,2,64,2,64,32,1,65,20,106,34,6,40,2,0,34,8,13,0,32,1,65,16,106,34,6,40,2,0,34,8,69,13,1,11,3,64,32,6,33,5,32,8,34,7,65,20,106,34,6,40,2,0,34,8,13,0,32,7,65,16,106,33,6,32,7,40,2,16,34,8,13,0,11,65,0,40,2,240,23,32,5,75,13,7,32,5,65,0,54,2,0,32,2,69,13,3,12,2,11,65,0,33,7,32,2,13,1,12,2,11,16,28,26,16,28,65,14,54,2,0,16,26,0,11,2,64,2,64,2,64,32,1,40,2,28,34,6,65,2,116,65,144,26,106,34,8,40,2,0,32,1,70,13,0,65,0,40,2,240,23,32,2,75,13,7,32,2,65,16,106,32,2,40,2,16,32,1,71,65,2,116,106,32,7,54,2,0,32,7,13,1,12,3,11,32,8,32,7,54,2,0,32,7,69,13,1,11,65,0,40,2,240,23,34,6,32,7,75,13,5,32,7,32,2,54,2,24,2,64,32,1,40,2,16,34,8,69,13,0,32,6,32,8,75,13,6,32,7,32,8,54,2,16,32,8,32,7,54,2,24,11,32,1,65,20,106,40,2,0,34,8,69,13,1,65,0,40,2,240,23,32,8,75,13,5,32,7,65,20,106,32,8,54,2,0,32,8,32,7,54,2,24,12,1,11,65,0,65,0,40,2,228,23,65,126,32,6,119,113,54,2,228,23,11,32,3,32,4,65,120,113,32,0,106,34,0,106,32,0,54,2,0,32,3,32,0,65,1,114,54,2,4,32,3,65,0,40,2,244,23,71,13,0,65,0,32,0,54,2,232,23,15,11,2,64,2,64,2,64,2,64,2,64,2,64,32,0,65,255,1,75,13,0,32,0,65,3,118,34,8,65,3,116,65,136,24,106,33,0,65,0,40,2,224,23,34,6,65,1,32,8,116,34,8,113,69,13,1,65,0,40,2,240,23,32,0,40,2,8,34,8,77,13,2,12,8,11,65,0,33,8,2,64,32,0,65,8,118,34,6,69,13,0,65,31,33,8,32,0,65,255,255,255,7,75,13,0,32,0,65,14,32,6,32,6,65,128,254,63,106,65,16,118,65,8,113,34,8,116,34,6,65,128,224,31,106,65,16,118,65,4,113,34,7,32,8,114,32,6,32,7,116,34,8,65,128,128,15,106,65,16,118,65,2,113,34,6,114,107,32,8,32,6,116,65,15,118,106,34,8,65,7,106,118,65,1,113,32,8,65,1,116,114,33,8,11,32,3,66,0,55,2,16,32,3,65,28,106,32,8,54,2,0,32,8,65,2,116,65,144,26,106,33,6,65,0,40,2,228,23,34,7,65,1,32,8,116,34,1,113,69,13,2,32,0,65,0,65,25,32,8,65,1,118,107,32,8,65,31,70,27,116,33,8,32,6,40,2,0,33,7,3,64,32,7,34,6,40,2,4,65,120,113,32,0,70,13,4,32,8,65,29,118,33,7,32,8,65,1,116,33,8,32,6,32,7,65,4,113,106,65,16,106,34,1,40,2,0,34,7,13,0,11,65,0,40,2,240,23,32,1,75,13,7,32,1,32,3,54,2,0,32,3,65,24,106,32,6,54,2,0,32,3,32,3,54,2,12,32,3,32,3,54,2,8,12,4,11,65,0,32,6,32,8,114,54,2,224,23,32,0,33,8,11,32,8,32,3,54,2,12,32,0,65,8,106,32,3,54,2,0,32,3,32,0,54,2,12,32,3,32,8,54,2,8,15,11,32,6,32,3,54,2,0,65,0,32,7,32,1,114,54,2,228,23,32,3,65,24,106,32,6,54,2,0,32,3,32,3,54,2,8,32,3,32,3,54,2,12,12,1,11,65,0,40,2,240,23,34,8,32,6,40,2,8,34,0,75,13,3,32,8,32,6,75,13,3,32,0,32,3,54,2,12,32,6,65,8,106,32,3,54,2,0,32,3,32,6,54,2,12,32,3,65,24,106,65,0,54,2,0,32,3,32,0,54,2,8,11,65,0,65,0,40,2,128,24,65,127,106,34,3,54,2,128,24,32,3,69,13,1,11,15,11,65,168,27,33,3,3,64,32,3,40,2,0,34,0,65,8,106,33,3,32,0,13,0,11,65,0,65,127,54,2,128,24,15,11,16,26,0,0,11,0,11,240,131,128,128,0,1,7,127,2,127,65,0,65,0,40,2,4,65,16,107,34,7,54,2,4,65,0,33,6,2,64,65,0,40,2,184,27,13,0,65,0,66,128,128,132,128,128,128,192,0,55,2,188,27,65,0,66,255,255,255,255,143,128,128,16,55,2,196,27,65,0,32,7,65,12,106,65,112,113,65,216,170,213,170,5,115,54,2,184,27,65,0,65,0,54,2,204,27,65,0,65,0,54,2,156,27,11,2,64,32,0,65,191,127,75,13,0,65,0,33,6,65,0,40,2,248,23,34,1,69,13,0,65,0,33,6,2,64,65,0,40,2,236,23,34,4,32,0,65,40,106,77,13,0,65,88,32,0,107,32,4,106,65,0,40,2,192,27,34,2,106,65,127,106,32,2,110,65,127,106,33,3,65,160,27,33,0,2,64,3,64,2,64,32,0,40,2,0,34,4,32,1,75,13,0,32,4,32,0,40,2,4,106,32,1,75,13,2,11,32,0,40,2,8,33,0,12,0,11,0,11,32,0,45,0,12,65,8,113,13,0,65,0,16,27,34,1,32,0,40,2,0,32,0,65,4,106,40,2,0,106,71,13,0,65,0,65,128,128,128,128,120,32,2,107,32,3,32,2,108,34,4,32,4,65,254,255,255,255,7,75,27,107,16,27,33,2,65,0,16,27,33,4,32,2,65,127,70,13,0,32,4,32,1,79,13,0,32,1,32,4,107,34,1,69,13,0,65,1,33,6,65,0,40,2,248,23,34,4,65,120,32,4,107,65,7,113,65,0,32,4,65,8,106,65,7,113,27,34,2,106,34,3,65,0,40,2,236,23,32,1,107,34,5,32,2,107,34,2,65,1,114,54,2,4,65,0,65,0,40,2,200,27,54,2,252,23,65,0,65,0,40,2,144,27,32,1,107,54,2,144,27,32,0,65,4,106,34,0,32,0,40,2,0,32,1,107,54,2,0,65,0,32,2,54,2,236,23,65,0,32,3,54,2,248,23,32,4,32,5,106,65,40,54,2,4,12,1,11,65,0,40,2,236,23,65,0,40,2,252,23,77,13,0,65,0,33,6,65,0,65,127,54,2,252,23,11,65,0,32,7,65,16,106,54,2,4,32,6,11,11,194,131,128,128,0,2,3,127,1,124,2,125,65,0,65,0,40,2,4,65,16,107,34,3,54,2,4,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,2,64,32,0,188,34,2,65,255,255,255,255,7,113,34,1,65,218,159,164,250,3,75,13,0,32,1,65,255,255,255,203,3,75,13,1,32,3,32,0,67,0,0,128,3,148,32,0,67,0,0,128,123,146,32,1,65,128,128,128,4,73,27,56,2,4,12,12,11,32,2,65,31,118,33,2,32,1,65,209,167,237,131,4,75,13,1,32,0,187,33,4,32,1,65,227,151,219,128,4,75,13,2,32,2,69,13,6,32,4,68,24,45,68,84,251,33,249,63,160,16,19,140,33,0,12,11,11,32,0,187,16,20,33,0,12,10,11,32,1,65,213,227,136,135,4,75,13,1,32,0,187,33,4,32,1,65,223,219,191,133,4,75,13,2,32,2,69,13,5,32,4,68,210,33,51,127,124,217,18,64,160,16,19,33,0,12,9,11,68,24,45,68,84,251,33,9,64,68,24,45,68,84,251,33,9,192,32,2,27,32,4,160,154,16,20,33,0,12,8,11,32,1,65,128,128,128,252,7,73,13,1,32,0,32,0,147,33,0,12,7,11,68,24,45,68,84,251,33,25,64,68,24,45,68,84,251,33,25,192,32,2,27,32,4,160,16,20,33,0,12,6,11,32,0,32,3,65,8,106,16,21,65,3,113,34,1,65,2,70,13,2,32,1,65,1,70,13,3,32,1,13,4,32,3,43,3,8,16,20,33,0,12,5,11,32,4,68,24,45,68,84,251,33,249,191,160,16,19,33,0,12,4,11,32,4,68,210,33,51,127,124,217,18,192,160,16,19,140,33,0,12,3,11,32,3,43,3,8,154,16,20,33,0,12,2,11,32,3,43,3,8,16,19,33,0,12,1,11,32,3,43,3,8,16,19,140,33,0,11,65,0,32,3,65,16,106,54,2,4,32,0,11,11,11,160,152,128,128,0,17,0,65,4,11,4,240,52,0,0,0,65,12,11,4,0,0,0,0,0,65,16,11,4,2,0,0,0,0,65,36,11,4,0,0,0,0,0,65,40,11,4,0,0,0,0,0,65,44,11,4,0,0,0,0,0,65,48,11,4,0,0,0,0,0,65,52,11,4,0,0,0,0,0,65,192,0,11,32,210,33,51,127,124,217,2,64,210,33,51,127,124,217,2,192,24,45,68,84,251,33,233,63,24,45,68,84,251,33,233,191,0,65,224,0,11,32,24,45,68,84,251,33,9,64,24,45,68,84,251,33,9,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,65,128,1,11,32,79,187,97,5,103,172,221,63,24,45,68,84,251,33,233,63,155,246,129,210,11,115,239,63,24,45,68,84,251,33,249,63,0,65,160,1,11,32,226,101,47,34,127,43,122,60,7,92,20,51,38,166,129,60,189,203,240,122,136,7,112,60,7,92,20,51,38,166,145,60,0,65,192,1,11,16,3,0,0,0,4,0,0,0,4,0,0,0,6,0,0,0,0,65,208,1,11,200,21,131,249,162,0,68,78,110,0,252,41,21,0,209,87,39,0,221,52,245,0,98,219,192,0,60,153,149,0,65,144,67,0,99,81,254,0,187,222,171,0,183,97,197,0,58,110,36,0,210,77,66,0,73,6,224,0,9,234,46,0,28,146,209,0,235,29,254,0,41,177,28,0,232,62,167,0,245,53,130,0,68,187,46,0,156,233,132,0,180,38,112,0,65,126,95,0,214,145,57,0,83,131,57,0,156,244,57,0,139,95,132,0,40,249,189,0,248,31,59,0,222,255,151,0,15,152,5,0,17,47,239,0,10,90,139,0,109,31,109,0,207,126,54,0,9,203,39,0,70,79,183,0,158,102,63,0,45,234,95,0,186,39,117,0,229,235,199,0,61,123,241,0,247,57,7,0,146,82,138,0,251,107,234,0,31,177,95,0,8,93,141,0,48,3,86,0,123,252,70,0,240,171,107,0,32,188,207,0,54,244,154,0,227,169,29,0,94,97,145,0,8,27,230,0,133,153,101,0,160,20,95,0,141,64,104,0,128,216,255,0,39,115,77,0,6,6,49,0,202,86,21,0,201,168,115,0,123,226,96,0,107,140,192,0,25,196,71,0,205,103,195,0,9,232,220,0,89,131,42,0,139,118,196,0,166,28,150,0,68,175,221,0,25,87,209,0,165,62,5,0,5,7,255,0,51,126,63,0,194,50,232,0,152,79,222,0,187,125,50,0,38,61,195,0,30,107,239,0,159,248,94,0,53,31,58,0,127,242,202,0,241,135,29,0,124,144,33,0,106,36,124,0,213,110,250,0,48,45,119,0,21,59,67,0,181,20,198,0,195,25,157,0,173,196,194,0,44,77,65,0,12,0,93,0,134,125,70,0,227,113,45,0,155,198,154,0,51,98,0,0,180,210,124,0,180,167,151,0,55,85,213,0,215,62,246,0,163,16,24,0,77,118,252,0,100,157,42,0,112,215,171,0,99,124,248,0,122,176,87,0,23,21,231,0,192,73,86,0,59,214,217,0,167,132,56,0,36,35,203,0,214,138,119,0,90,84,35,0,0,31,185,0,241,10,27,0,25,206,223,0,159,49,255,0,102,30,106,0,153,87,97,0,172,251,71,0,126,127,216,0,34,101,183,0,50,232,137,0,230,191,96,0,239,196,205,0,108,54,9,0,93,63,212,0,22,222,215,0,88,59,222,0,222,155,146,0,210,34,40,0,40,134,232,0,226,88,77,0,198,202,50,0,8,227,22,0,224,125,203,0,23,192,80,0,243,29,167,0,24,224,91,0,46,19,52,0,131,18,98,0,131,72,1,0,245,142,91,0,173,176,127,0,30,233,242,0,72,74,67,0,16,103,211,0,170,221,216,0,174,95,66,0,106,97,206,0,10,40,164,0,211,153,180,0,6,166,242,0,92,119,127,0,163,194,131,0,97,60,136,0,138,115,120,0,175,140,90,0,111,215,189,0,45,166,99,0,244,191,203,0,141,129,239,0,38,193,103,0,85,202,69,0,202,217,54,0,40,168,210,0,194,97,141,0,18,201,119,0,4,38,20,0,18,70,155,0,196,89,196,0,200,197,68,0,77,178,145,0,0,23,243,0,212,67,173,0,41,73,229,0,253,213,16,0,0,190,252,0,30,148,204,0,112,206,238,0,19,62,245,0,236,241,128,0,179,231,195,0,199,248,40,0,147,5,148,0,193,113,62,0,46,9,179,0,11,69,243,0,136,18,156,0,171,32,123,0,46,181,159,0,71,146,194,0,123,50,47,0,12,85,109,0,114,167,144,0,107,231,31,0,49,203,150,0,121,22,74,0,65,121,226,0,244,223,137,0,232,148,151,0,226,230,132,0,153,49,151,0,136,237,107,0,95,95,54,0,187,253,14,0,72,154,180,0,103,164,108,0,113,114,66,0,141,93,50,0,159,21,184,0,188,229,9,0,141,49,37,0,247,116,57,0,48,5,28,0,13,12,1,0,75,8,104,0,44,238,88,0,71,170,144,0,116,231,2,0,189,214,36,0,247,125,166,0,110,72,114,0,159,22,239,0,142,148,166,0,180,145,246,0,209,83,81,0,207,10,242,0,32,152,51,0,245,75,126,0,178,99,104,0,221,62,95,0,64,93,3,0,133,137,127,0,85,82,41,0,55,100,192,0,109,216,16,0,50,72,50,0,91,76,117,0,78,113,212,0,69,84,110,0,11,9,193,0,42,245,105,0,20,102,213,0,39,7,157,0,93,4,80,0,180,59,219,0,234,118,197,0,135,249,23,0,73,107,125,0,29,39,186,0,150,105,41,0,198,204,172,0,173,20,84,0,144,226,106,0,136,217,137,0,44,114,80,0,4,164,190,0,119,7,148,0,243,48,112,0,0,252,39,0,234,113,168,0,102,194,73,0,100,224,61,0,151,221,131,0,163,63,151,0,67,148,253,0,13,134,140,0,49,65,222,0,146,57,157,0,221,112,140,0,23,183,231,0,8,223,59,0,21,55,43,0,92,128,160,0,90,128,147,0,16,17,146,0,15,232,216,0,108,128,175,0,219,255,75,0,56,144,15,0,89,24,118,0,98,165,21,0,97,203,187,0,199,137,185,0,16,64,189,0,210,242,4,0,73,117,39,0,235,182,246,0,219,34,187,0,10,20,170,0,137,38,47,0,100,131,118,0,9,59,51,0,14,148,26,0,81,58,170,0,29,163,194,0,175,237,174,0,92,38,18,0,109,194,77,0,45,122,156,0,192,86,151,0,3,63,131,0,9,240,246,0,43,64,140,0,109,49,153,0,57,180,7,0,12,32,21,0,216,195,91,0,245,146,196,0,198,173,75,0,78,202,165,0,167,55,205,0,230,169,54,0,171,146,148,0,221,66,104,0,25,99,222,0,118,140,239,0,104,139,82,0,252,219,55,0,174,161,171,0,223,21,49,0,0,174,161,0,12,251,218,0,100,77,102,0,237,5,183,0,41,101,48,0,87,86,191,0,71,255,58,0,106,249,185,0,117,190,243,0,40,147,223,0,171,128,48,0,102,140,246,0,4,203,21,0,250,34,6,0,217,228,29,0,61,179,164,0,87,27,143,0,54,205,9,0,78,66,233,0,19,190,164,0,51,35,181,0,240,170,26,0,79,101,168,0,210,193,165,0,11,63,15,0,91,120,205,0,35,249,118,0,123,139,4,0,137,23,114,0,198,166,83,0,111,110,226,0,239,235,0,0,155,74,88,0,196,218,183,0,170,102,186,0,118,207,207,0,209,2,29,0,177,241,45,0,140,153,193,0,195,173,119,0,134,72,218,0,247,93,160,0,198,128,244,0,172,240,47,0,221,236,154,0,63,92,188,0,208,222,109,0,144,199,31,0,42,219,182,0,163,37,58,0,0,175,154,0,173,83,147,0,182,87,4,0,41,45,180,0,75,128,126,0,218,7,167,0,118,170,14,0,123,89,161,0,22,18,42,0,220,183,45,0,250,229,253,0,137,219,254,0,137,190,253,0,228,118,108,0,6,169,252,0,62,128,112,0,133,110,21,0,253,135,255,0,40,62,7,0,97,103,51,0,42,24,134,0,77,189,234,0,179,231,175,0,143,109,110,0,149,103,57,0,49,191,91,0,132,215,72,0,48,223,22,0,199,45,67,0,37,97,53,0,201,112,206,0,48,203,184,0,191,108,253,0,164,0,162,0,5,108,228,0,90,221,160,0,33,111,71,0,98,18,210,0,185,92,132,0,112,97,73,0,107,86,224,0,153,82,1,0,80,85,55,0,30,213,183,0,51,241,196,0,19,110,95,0,93,48,228,0,133,46,169,0,29,178,195,0,161,50,54,0,8,183,164,0,234,177,212,0,22,247,33,0,143,105,228,0,39,255,119,0,12,3,128,0,141,64,45,0,79,205,160,0,32,165,153,0,179,162,211,0,47,93,10,0,180,249,66,0,17,218,203,0,125,190,208,0,155,219,193,0,171,23,189,0,202,162,129,0,8,106,92,0,46,85,23,0,39,0,85,0,127,20,240,0,225,7,134,0,20,11,100,0,150,65,141,0,135,190,222,0,218,253,42,0,107,37,182,0,123,137,52,0,5,243,254,0,185,191,158,0,104,106,79,0,74,42,168,0,79,196,90,0,45,248,188,0,215,90,152,0,244,199,149,0,13,77,141,0,32,58,166,0,164,87,95,0,20,63,177,0,128,56,149,0,204,32,1,0,113,221,134,0,201,222,182,0,191,96,245,0,77,101,17,0,1,7,107,0,140,176,172,0,178,192,208,0,81,85,72,0,30,251,14,0,149,114,195,0,163,6,59,0,192,64,53,0,6,220,123,0,224,69,204,0,78,41,250,0,214,202,200,0,232,243,65,0,124,100,222,0,155,100,216,0,217,190,49,0,164,151,195,0,119,88,212,0,105,227,197,0,240,218,19,0,186,58,60,0,70,24,70,0,85,117,95,0,210,189,245,0,110,146,198,0,172,46,93,0,14,68,237,0,28,62,66,0,97,196,135,0,41,253,233,0,231,214,243,0,34,124,202,0,111,145,53,0,8,224,197,0,255,215,141,0,110,106,226,0,176,253,198,0,147,8,193,0,124,93,116,0,107,173,178,0,205,110,157,0,62,114,123,0,198,17,106,0,247,207,169,0,41,115,223,0,181,201,186,0,183,0,81,0,226,178,13,0,116,186,36,0,229,125,96,0,116,216,138,0,13,21,44,0,129,24,12,0,126,102,148,0,1,41,22,0,159,122,118,0,253,253,190,0,86,69,239,0,217,126,54,0,236,217,19,0,139,186,185,0,196,151,252,0,49,168,39,0,241,110,195,0,148,197,54,0,216,168,86,0,180,168,181,0,207,204,14,0,18,137,45,0,111,87,52,0,44,86,137,0,153,206,227,0,214,32,185,0,107,94,170,0,62,42,156,0,17,95,204,0,253,11,74,0,225,244,251,0,142,59,109,0,226,134,44,0,233,212,132,0,252,180,169,0,239,238,209,0,46,53,201,0,47,57,97,0,56,33,68,0,27,217,200,0,129,252,10,0,251,74,106,0,47,28,216,0,83,180,132,0,78,153,140,0,84,34,204,0,42,85,220,0,192,198,214,0,11,25,150,0,26,112,184,0,105,149,100,0,38,90,96,0,63,82,238,0,127,17,15,0,244,181,17,0,252,203,245,0,52,188,45,0,52,188,238,0,232,93,204,0,221,94,96,0,103,142,155,0,146,51,239,0,201,23,184,0,97,88,155,0,225,87,188,0,81,131,198,0,216,62,16,0,221,113,72,0,45,28,221,0,175,24,161,0,33,44,70,0,89,243,215,0,217,122,152,0,158,84,192,0,79,134,250,0,86,6,252,0,229,121,174,0,137,34,54,0,56,173,34,0,103,147,220,0,85,232,170,0,130,38,56,0,202,231,155,0,81,13,164,0,153,51,177,0,169,215,14,0,105,5,72,0,101,178,240,0,127,136,167,0,136,76,151,0,249,209,54,0,33,146,179,0,123,130,74,0,152,207,33,0,64,159,220,0,220,71,85,0,225,116,58,0,103,235,66,0,254,157,223,0,94,212,95,0,123,103,164,0,186,172,122,0,85,246,162,0,43,136,35,0,65,186,85,0,89,110,8,0,33,42,134,0,57,71,131,0,137,227,230,0,229,158,212,0,73,251,64,0,255,86,233,0,28,15,202,0,197,89,138,0,148,250,43,0,211,193,197,0,15,197,207,0,219,90,174,0,71,197,134,0,133,67,98,0,33,134,59,0,44,121,148,0,16,97,135,0,42,76,123,0,128,44,26,0,67,191,18,0,136,38,144,0,120,60,137,0,168,196,228,0,229,219,123,0,196,58,194,0,38,244,234,0,247,103,138,0,13,146,191,0,101,163,43,0,61,147,177,0,189,124,11,0,164,81,220,0,39,221,99,0,105,225,221,0,154,148,25,0,168,41,149,0,104,206,40,0,9,237,180,0,68,159,32,0,78,152,202,0,112,130,99,0,126,124,35,0,15,185,50,0,167,245,142,0,20,86,231,0,33,241,8,0,181,157,42,0,111,126,77,0,165,25,81,0,181,249,171,0,130,223,214,0,150,221,97,0,22,54,2,0,196,58,159,0,131,162,161,0,114,237,109,0,57,141,122,0,130,184,169,0,107,50,92,0,70,39,91,0,0,52,237,0,210,0,119,0,252,244,85,0,1,89,77,0,224,113,128,0,0,65,160,23,11,64,0,0,0,64,251,33,249,63,0,0,0,0,45,68,116,62,0,0,0,128,152,70,248,60,0,0,0,96,81,204,120,59,0,0,0,128,131,27,240,57,0,0,0,64,32,37,122,56,0,0,0,128,34,130,227,54,0,0,0,0,29,243,105,53,0,65,208,27,11,4,0,0,0,0,0,65,212,27,11,4,0,0,0,0]);
181 |
182 | canvas.width = roundTo(window.innerWidth, 2);
183 | canvas.height = roundTo(window.innerHeight, 2);
184 |
185 | var width = canvas.width;
186 | var height = canvas.height;
187 |
188 | var mx = 0; var my = 0;
189 |
190 | var FLOAT_BYTES = Float32Array.BYTES_PER_ELEMENT;
191 |
192 |
193 |
194 |
195 | window.addEventListener("contextmenu", function(e) {
196 | e.preventDefault();
197 | });
198 |
199 | window.addEventListener("mousemove", function(e) {
200 | if (program === null) { return; }
201 | mx = e.clientX;
202 | my = e.clientY;
203 | program.updateMouse(mx, my);
204 | });
205 |
206 | window.program = null;
207 | var instance = null;
208 | var imports = {
209 | initialMemory: 512,
210 | imports: {
211 | printi: console.log.bind(console),
212 | printfl: console.log.bind(console),
213 | printxy: console.log.bind(console),
214 | powf: Math.pow,
215 | randomf: Math.random,
216 | getTime: Date.now
217 | }
218 | };
219 | load(binary, imports).then(function (inst) {
220 | instance = inst;
221 | program = instance.exports;
222 | console.log("Initialising...");
223 | program.init(width, height);
224 | var last = performance.now();
225 | var frames = 0;
226 | var ptCount = program.getParticleCount();
227 | var ptBytes = program.getParticleByteSize();
228 | var ptSize = (ptBytes / FLOAT_BYTES);
229 | var ptColorOffset = program.getParticleColorOffset();
230 | var ptPositionOffset = program.getParticlePositionOffset();
231 | var ptColor = null;
232 | var ptPosition = null;
233 | var totalPtBytes = ptCount * ptBytes * FLOAT_BYTES;
234 | var usedKb = (totalPtBytes * 0.001) | 0;
235 | var initKb = (imports.initialMemory * 0x40) | 0;
236 | console.log(("Allocated " + ptCount + " particles"));
237 | document.querySelector(".lbl").innerHTML = ptCount + " Particles á " + ptBytes + " byte";
238 | console.log(("Memory: Used: " + usedKb + "kB/" + initKb + "kB Left: " + (initKb-usedKb) + "kB"));
239 | var webgl = initRender(ptSize);
240 | var gl = webgl.gl;
241 | var prog = webgl.program;
242 | var xx = 64; var yy = 64;
243 | var timeLoc = gl.getUniformLocation(prog, "time");
244 | var count = 0;
245 | console.log(("Particle size of " + ptSize + "/" + ptBytes + "byte"));
246 | inst.imports.ongrow = function() {
247 | // keep track of point data after each memory mutation
248 | ptColor = new Float32Array(instance.memory.buffer, ptColorOffset, ptCount * ptSize);
249 | ptPosition = new Float32Array(instance.memory.buffer, ptPositionOffset, ptCount * ptSize);
250 | };
251 | inst.imports.ongrow();
252 | (function drawLoop() {
253 | requestAnimationFrame(drawLoop);
254 | program.tick();
255 | var now = performance.now();
256 | var dt = (now - last);
257 |
258 | //console.log(`Update took ${then - now}ms`);
259 | gl.uniform1i(timeLoc, (Date.now()));
260 |
261 | // colors
262 | gl.bindBuffer(gl.ARRAY_BUFFER, webgl.colorBuffer);
263 | gl.bufferData(gl.ARRAY_BUFFER, ptColor, gl.DYNAMIC_DRAW);
264 | gl.vertexAttribPointer(webgl.colorLoc, 3, gl.FLOAT, false, ptSize * 4, 0);
265 |
266 | // points
267 | gl.bindBuffer(gl.ARRAY_BUFFER, webgl.coordBuffer);
268 | gl.bufferData(gl.ARRAY_BUFFER, ptPosition, gl.DYNAMIC_DRAW);
269 | gl.vertexAttribPointer(webgl.coordLoc, 3, gl.FLOAT, false, ptSize * 4, 0);
270 |
271 | gl.drawArrays(gl.POINTS, 0, ptCount);
272 |
273 | var then = performance.now();
274 | //console.log(`Update took ${then - now}ms`);
275 |
276 | last = now;
277 | frames++;
278 | })();
279 | });
280 |
281 | }());
282 |
--------------------------------------------------------------------------------