From afe87487d18a3e8e6dd2844f98c2092100e94794 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 7 Sep 2014 16:12:55 -0700 Subject: [PATCH 001/461] wip emterpreter --- tools/js-optimizer.js | 352 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 352 insertions(+) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index abe28e79bf37d..acd5115811f6d 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5585,6 +5585,357 @@ function pointerMasking(ast) { }); } +// Converts functions into binary format to be run by an emterpreter +function emterpretify(ast) { + emitAst = false; + + function walkFunction(func) { + function walk(node) { + if (!node) return; + switch(node[0]) { + case 'var': { + node[1].forEach(function(varItem, i) { + var ident = varItem[0]; + var value = varItem[1]; + if (i > 0) emitIndent(); + output += typeName(detectAsmCoercion(value)); + output += ' ' + cName(ident) + ' = 0;'; + if (i < node[1].length-1) output += '\n'; + }); + break; + } + case 'assign': { + // try to emit nice += etc. operators + if (node[2][0] === 'name' && node[3][0] === 'binary') { + if (node[3][1] === '|' && node[3][3][0] === 'num' && node[3][3][1] === 0) { + node[3] = node[3][2]; // wipe out |0 coercion + } + if (node[3][0] === 'binary' && node[3][2][0] === 'name' && node[2][1] === node[3][2][1]) { + switch (node[3][1]) { + case '+': case '-': case '|': case '&': { + walk(node[2], true); + if (node[3][3][0] === 'num' && node[3][3][1] === 1 && (node[3][1] === '+' || node[3][1] === '-')) { + output += node[3][1] + node[3][1]; + } else { + output += ' ' + node[3][1] + '= '; + walk(node[3][3]); + } + return; + } + } + } + } + walk(node[2], true); + output += ' = '; + walk(node[3], true); + break; + } + case 'name': { + output += cName(node[1]); + break; + } + case 'num': { + output += node[1]; + break; + } + case 'binary': { + if (node[1] === '>>>') { + if (!freeParens) output += '('; + // special-case the unsigned coercion + output += '((uint32_t)'; + walk(node[2]); + output += ') >> ((uint32_t)'; + walk(node[3]); + output += ')'; + if (!freeParens) output += ')'; + break; + } else if (node[1] === '|' && node[3][0] === 'num' && node[3][1] === 0) { + // no need for |0 coercions (cannot be double-to-int) + walk(node[2], freeParens); + break; + } + if (!freeParens) output += '('; + walk(node[2]); + output += ' ' + node[1] + ' '; + walk(node[3]); + if (!freeParens) output += ')'; + break; + } + case 'unary-prefix': { + if (node[1] === '~' && node[2][0] === 'unary-prefix' && node[2][1] === '~') { + // special-case the double-to-int conversion + output += '((int32_t)'; + walk(node[2][2]); + output += ')'; + break; + } + output += '('; + switch (node[1]) { + case '!': output += '!'; break; + case '~': output += '~'; break; + case '-': output += '-'; break; + case '+': output += '(double)'; break; + default: throw 'bad unary ' + node[1]; + } + walk(node[2]); + output += ')'; + break; + } + case 'return': { + if (HASH_MEM) { + output += 'hash_mem("leave ' + cName(currFunc[1]) + '");\n'; + emitIndent(); + } + output += 'return '; + walk(node[1], true); + output += ';'; + break; + } + case 'call': { + var relocations = null; + if (node[1][0] === 'name') { + var name = cName(node[1][1]); + if (callHandlers[name]) { + if (callHandlers[name](node)) break; + } + relocations = relocationInfo[name]; + if (funcIncludes[name]) includes.push(funcIncludes[name]); + } + relocations = relocations || []; + if (relocations[0]) output += 'derelocate((int32_t)'; + walk(node[1]); + output += '('; + node[2].forEach(function(arg, i) { + if (i > 0) output += ', '; + if (relocations[i+1]) output += '(' + relocations[i+1] + ')relocate('; + walk(arg, true); + if (relocations[i+1]) output += ')'; + }); + output += ')'; + if (relocations[0]) output += ')'; + break; + } + case 'if': { + output += 'if ('; + walk(node[1], true); + output += ') {\n'; + indent++; + walk(blockify(node[2])); + indent--; + emitIndent(); + output += '}'; + if (node[3]) { + output += ' else {\n' + indent++; + walk(blockify(node[3])); + indent--; + emitIndent(); + output += '}'; + } + break; + } + case 'switch': { + output += 'switch ('; + walk(node[1], true); + output += ') {\n'; + indent++; + var cases = node[2]; + for (var i = 0; i < cases.length; i++) { + emitIndent(); + if (cases[i][0]) { + output += 'case '; + walk(cases[i][0]); + } else { + output += 'default'; + } + output += ': {\n'; + if (cases[i][1].length > 0) { + indent++; + assert(cases[i][1][0][0] === 'block' && cases[i][1].length === 1); + walk(cases[i][1][0]); + indent--; + } + emitIndent(); + output += '}\n'; + } + indent--; + emitIndent(); + output += '}'; + break; + } + case 'while': { + output += 'while ('; + walk(node[1], true); + output += ') {\n'; + indent++; + walk(blockify(node[2])); + indent--; + emitIndent(); + output += '}'; + break; + } + case 'do': { + output += 'do {\n'; + indent++; + walk(blockify(node[2])); + indent--; + emitIndent(); + output += '} while ('; + walk(node[1], true); + output += ');'; + break; + } + case 'block': { + walkStatements(getStatements(node)); + break; + } + case 'conditional': { + output += '(('; + walk(node[1]); + output += ') ? ('; + walk(node[2]); + output += ') : ('; + walk(node[3]); + output += '))'; + break; + } + case 'label': { + output += node[1] + ':\n'; + emitIndent(); + walk(node[2]); + output += '\n'; + emitIndent(); + output += node[1] + '_post:'; + break; + } + case 'break': { + if (!node[1]) { + output += 'break;'; + } else { + output += 'goto ' + node[1] + '_post;'; + } + break; + } + case 'continue': { + if (!node[1]) { + output += 'continue;'; + } else { + output += 'goto ' + node[1] + ';'; + } + break; + } + case 'sub': { + assert(node[1][0] === 'name'); + if (node[1][1][0] === 'F') { + // function table access + walk(node[1]); + output += '['; + walk(node[2]); + output += ']'; + break; + } + var stripped = stripShifts(node[2]); + if (stripped[0] === 'name') { + var name = cName(stripped[1]); + if (name in cExterns) { + output += '((int32_t)' + name + ')'; + break; + } + } + if (ALIASING_MEM_VIEWS) { + switch (node[1][1]) { + case 'HEAP8': case 'HEAPU8': output += 'MEM8'; break; + case 'HEAP16': case 'HEAPU16': output += 'MEM16'; break; + case 'HEAP32': case 'HEAPU32': output += 'MEM32'; break; + case 'HEAPF32': output += 'MEMF32'; break; + case 'HEAPF64': output += 'MEMF64'; break; + default: throw 'bad sub ' + node[1][1]; + } + output += '['; + walk(node[2], true); + output += ']'; + } else { + if (!freeParens) output += '('; + output += '*(('; + assert(node[1][0] === 'name'); + var shifts; + switch (node[1][1]) { + case 'HEAP8': case 'HEAPU8': output += 'int8_t'; shifts = 0; break; + case 'HEAP16': case 'HEAPU16': output += 'int16_t'; shifts = 1; break; + case 'HEAP32': case 'HEAPU32': output += 'int32_t'; shifts = 2; break; + case 'HEAPF32': output += 'float'; shifts = 2; break; + case 'HEAPF64': output += 'double'; shifts = 3; break; + default: throw 'bad sub ' + node[1][1]; + } + output += '*)(((int32_t)MEM) + ('; + if (node[2][0] === 'binary' && node[2][1] === '>>' && node[2][3][0] === 'num' && node[2][3][1] === shifts) { + // we can eliminate out the shifts + walk(node[2][2], true); + } else { + if (shifts) { + walk(['binary', '<<', node[2], ['num', shifts]]); + } else { + walk(node[2], true); + } + } + output += ')'; + if (ALIGNMENT_MASK && shifts) { + output += '&-'; + switch (shifts) { + case 1: output += '1'; break; + case 2: output += '3'; break; + case 3: output += '7'; break; + default: throw 'bad shifts ' + shifts; + } + } + output += '))'; + if (!freeParens) output += ')'; + } + break; + } + case 'seq': { + output += '('; + walk(node[1]); + output += ', '; + walk(node[2]); + output += ')'; + break; + } + case 'toplevel': break; // empty node + default: throw 'wha? ' + node[0]; + } + } + function walkStatements(stats) { + if (!stats) return; + stats.forEach(function(stat) { + emitIndent(); + walk(stat); + output += '\n'; + }); + } + + // walkFunction main + + var asmData = normalizeAsm(func); + + var totalVars = 0; + for (var i in asmData.vars) totalVars++; + print('function ' + func[1] + '() {'); + print(' ' + JSON.stringify({ + name: func[1], + params: func[2].map(function(param) { + return asmData.params[param]; + }), + stackInts: totalVars, // TODO: optimize these + stackDoubles: totalVars, + stackFloats: totalVars, + //blocks: walkStatements(getStatements(func)) + })); + print('}\n'); + } + traverseGeneratedFunctions(ast, walkFunction); +} + // Last pass utilities // Change +5 to DOT$ZERO(5). We then textually change 5 to 5.0 (uglify's ast cannot differentiate between 5 and 5.0 directly) @@ -5734,6 +6085,7 @@ var passes = { safeHeap: safeHeap, optimizeFrounds: optimizeFrounds, pointerMasking: pointerMasking, + emterpretify: emterpretify, asmLastOpts: asmLastOpts, // flags From ae6872a6f713e3a6fead5ae5c8972f33c198d420 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 10 Sep 2014 16:22:07 -0700 Subject: [PATCH 002/461] more wip --- tools/js-optimizer.js | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index acd5115811f6d..661cfd038ec2f 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5589,6 +5589,13 @@ function pointerMasking(ast) { function emterpretify(ast) { emitAst = false; + var OPCODES = { + 255: 'FUNC', // [ints, doubles, floats] + }; + + var ROPCODES = {}; + for (var o in OPCODES) ROPCODES[OPCODES[o]] = o; + function walkFunction(func) { function walk(node) { if (!node) return; @@ -5920,18 +5927,13 @@ function emterpretify(ast) { var totalVars = 0; for (var i in asmData.vars) totalVars++; + + var data = [ROPCODES['FUNC'], totalVars, totalVars, totalVars]; // TODO: optimize these + print('function ' + func[1] + '() {'); - print(' ' + JSON.stringify({ - name: func[1], - params: func[2].map(function(param) { - return asmData.params[param]; - }), - stackInts: totalVars, // TODO: optimize these - stackDoubles: totalVars, - stackFloats: totalVars, - //blocks: walkStatements(getStatements(func)) - })); - print('}\n'); + print(' [' + data + ']'); + //blocks: walkStatements(getStatements(func)) + print('}'); } traverseGeneratedFunctions(ast, walkFunction); } From 5f285a8f1da3be0b141b3b15fc831e8222e05377 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 16 Sep 2014 13:10:02 -0700 Subject: [PATCH 003/461] add output filename param to Building.js_optimizer --- tools/shared.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tools/shared.py b/tools/shared.py index 85dba650a74ab..23c3cccd088d5 100644 --- a/tools/shared.py +++ b/tools/shared.py @@ -1588,8 +1588,12 @@ def pick_llvm_opts(optimization_level): return opts @staticmethod - def js_optimizer(filename, passes, jcache=False, debug=False, extra_info=None): - return js_optimizer.run(filename, passes, listify(NODE_JS), jcache, debug, extra_info) + def js_optimizer(filename, passes, jcache=False, debug=False, extra_info=None, output_filename=None): + ret = js_optimizer.run(filename, passes, listify(NODE_JS), jcache, debug, extra_info) + if output_filename: + safe_move(ret, output_filename) + ret = output_filename + return ret @staticmethod def closure_compiler(filename, pretty=True): From 7d773ac185714190ba3088a5998c57b71fd8fa35 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 16 Sep 2014 13:16:52 -0700 Subject: [PATCH 004/461] stub emterpreter script and stub test --- tests/test_other.py | 7 +++++++ tools/emterpretify.py | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100755 tools/emterpretify.py diff --git a/tests/test_other.py b/tests/test_other.py index 8716788b9ac05..e58461d9ae2ea 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4103,3 +4103,10 @@ def test_stat_fail_alongtheway(self): pass: error == ENOTDIR ''', run_js('a.out.js')) + + def test_emterpreter(self): + Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world.c'), '-O2', '--profiling', '-s', 'FINALIZE_ASM_JS=1']).communicate() + Popen([PYTHON, path_from_root('tools', 'emterpretify.py'), 'a.out.js', 'em.out.js']).communicate() + self.assertContained('hello, world!', run_js('a.out.js')) + self.assertContained('hello, world!', run_js('em.out.js')) + diff --git a/tools/emterpretify.py b/tools/emterpretify.py new file mode 100755 index 0000000000000..09131435713a3 --- /dev/null +++ b/tools/emterpretify.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python2 + +''' +Processes asm.js code to make it run in an emterpreter. + +Currently this requires the asm.js code to have been built with -s FINALIZE_ASM_JS=1 +''' + +import os, sys +import asm_module, shared + +infile = sys.argv[1] +outfile = sys.argv[2] + +print 'emterpretifying %s to %s' % (infile, outfile) + +shared.Building.js_optimizer(infile, ['emterpretify'], extra_info=None, output_filename=outfile) + From 8309cb036db63b2d3f9d336c4a5abf9509a7d2a5 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 16 Sep 2014 13:40:33 -0700 Subject: [PATCH 005/461] start to emit trampolines --- tools/js-optimizer.js | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 661cfd038ec2f..5b596eba8937d 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -155,7 +155,7 @@ function srcToAst(src) { } function astToSrc(ast, minifyWhitespace) { - return uglify.uglify.gen_code(ast, { + return uglify.uglify.gen_code(ast, { debug: debug, ascii_only: true, beautify: !minifyWhitespace, @@ -5585,6 +5585,18 @@ function pointerMasking(ast) { }); } +function getReturnType(func) { + var ret = ASM_NONE; + traverse(func, function(node, type) { + if (type == 'return' && node[1]) { + var type = detectAsmCoercion(node[1]); + if (ret) assert(ret === type); + ret = type; + } + }); + return ret; +} + // Converts functions into binary format to be run by an emterpreter function emterpretify(ast) { emitAst = false; @@ -5930,10 +5942,26 @@ function emterpretify(ast) { var data = [ROPCODES['FUNC'], totalVars, totalVars, totalVars]; // TODO: optimize these - print('function ' + func[1] + '() {'); - print(' [' + data + ']'); - //blocks: walkStatements(getStatements(func)) - print('}'); + var stats = getStatements(func); + func[3] = []; // wipe out all contents + denormalizeAsm(func, asmData); + var theCall = ['call', ['name', 'emterpret'], []]; + func[3] = func[3].filter(function(node) { + if (node[0] === 'return') { + assert(asmData.ret !== undefined); + node[1] = makeAsmCoercion(theCall, detectAsmCoercion(node[1])); + } + return node[0] !== 'var'; + }); + if (asmData.ret === undefined) { + func[3].push(['stat', theCall]); + } + + print(astToSrc(func) + ' //[' + data + ']'); + + //getReturnType + + //blocks: walkStatements(stats) } traverseGeneratedFunctions(ast, walkFunction); } From 7357a3b5309b98224862fe3c35d5aa286d8a965c Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 16 Sep 2014 14:40:02 -0700 Subject: [PATCH 006/461] emit params to emstack --- tools/js-optimizer.js | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 5b596eba8937d..9cc7d90a80b3f 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5937,15 +5937,29 @@ function emterpretify(ast) { var asmData = normalizeAsm(func); - var totalVars = 0; - for (var i in asmData.vars) totalVars++; + var locals = 0; + for (var i in asmData.vars) locals++; + for (var i in asmData.params) locals++; - var data = [ROPCODES['FUNC'], totalVars, totalVars, totalVars]; // TODO: optimize these + var data = [ROPCODES['FUNC'], locals, 0, 0]; var stats = getStatements(func); - func[3] = []; // wipe out all contents + // emit stack assignments, emterpreter assumes params to be in place + func[3] = []; + var bump = 0; // we will assert in the emterpreter itself that we did not overflow the emstack + func[2].forEach(function(arg) { + var code; + switch (asmData.params[arg]) { + case ASM_INT: code = 'HEAP32[EMSTACKTOP + ' + bump + ' >> 2] = ' + arg + ';'; break; + case ASM_DOUBLE: code = 'HEAPF64[EMSTACKTOP + ' + bump + ' >> 3] = ' + arg + ';'; break; + case ASM_FLOAT: code = 'HEAPF32[EMSTACKTOP + ' + bump + ' >> 2] = ' + arg + ';'; break; + default: throw 'bad'; + } + func[3].push(srcToAst(code)[1][0]); + bump += 8; // each local is a 64-bit value + }); denormalizeAsm(func, asmData); - var theCall = ['call', ['name', 'emterpret'], []]; + var theCall = ['call', ['name', 'emterpret'], [['name', 'EMTERPRETER_' + func[1]]]]; // EMTERPRETER_* will be replaced with the absolute bytecode offset later func[3] = func[3].filter(function(node) { if (node[0] === 'return') { assert(asmData.ret !== undefined); From 95b82ca04295abca4176b5cf1980f0e8a95423a1 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 16 Sep 2014 15:06:17 -0700 Subject: [PATCH 007/461] add utility to set pre_js in an asm module --- tools/asm_module.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tools/asm_module.py b/tools/asm_module.py index 4b88bba672639..0982fa741d9c0 100644 --- a/tools/asm_module.py +++ b/tools/asm_module.py @@ -63,11 +63,16 @@ def __init__(self, filename): self.sendings[sending[:colon].replace('"', '')] = sending[colon+1:].strip() self.module_defs = set(re.findall('var [\w\d_$]+ = Module\["[\w\d_$]+"\] = asm\["[\w\d_$]+"\];\n', self.post_js)) + def set_pre_js(self, staticbump=None, mem_init_js=None): + if staticbump is None: staticbump = self.staticbump + if mem_init_js is None: mem_init_js = self.mem_init_js + self.pre_js = re.sub(shared.JS.memory_staticbump_pattern, 'STATICTOP = STATIC_BASE + %d;\n' % (staticbump,) + mem_init_js, self.pre_js, count=1) + def relocate_into(self, main): # heap initializer if self.staticbump > 0: new_mem_init = self.mem_init_js[:self.mem_init_js.rfind(', ')] + ', Runtime.GLOBAL_BASE+%d)' % main.staticbump - main.pre_js = re.sub(shared.JS.memory_staticbump_pattern, 'STATICTOP = STATIC_BASE + %d;\n' % (main.staticbump + self.staticbump) + new_mem_init, main.pre_js, count=1) + main.set_pre_js(main.staticbump + self.staticbump, new_mem_init) # Find function name replacements TODO: do not rename duplicate names with duplicate contents, just merge them replacements = {} From 4faebc9fca1cd61043788fab0348721aef8c2944 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 16 Sep 2014 15:35:58 -0700 Subject: [PATCH 008/461] do not cleanup non-asm code if not finalizing --- emcc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emcc b/emcc index 8545a35876094..f21dbe9221131 100755 --- a/emcc +++ b/emcc @@ -1441,7 +1441,7 @@ try: if shared.Settings.ASM_JS: if closure == 1: js_optimizer_queue += ['closure'] - elif debug_level <= 2 and not shared.Settings.MAIN_MODULE and not shared.Settings.SIDE_MODULE and not closure: + elif debug_level <= 2 and not shared.Settings.MAIN_MODULE and shared.Settings.FINALIZE_ASM_JS and not closure: js_optimizer_queue += ['cleanup'] js_optimizer_queue += ['asmLastOpts'] From 6d254d1f3a045925e6729c55f6975c9e1f460233 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 16 Sep 2014 15:36:36 -0700 Subject: [PATCH 009/461] simplify staticbump generation --- emscripten.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/emscripten.py b/emscripten.py index 98a9e6ae85cbb..b6abcaa24096d 100755 --- a/emscripten.py +++ b/emscripten.py @@ -881,9 +881,11 @@ def save_settings(): global_initializers = ', '.join(map(lambda i: '{ func: function() { %s() } }' % i, metadata['initializers'])) - pre = pre.replace('STATICTOP = STATIC_BASE + 0;', '''STATICTOP = STATIC_BASE + Runtime.alignMemory(%d); + staticbump = mem_init.count(',')+1 + while staticbump % 8 != 0: staticbump += 1 + pre = pre.replace('STATICTOP = STATIC_BASE + 0;', '''STATICTOP = STATIC_BASE + %d; /* global initializers */ __ATINIT__.push(%s); - %s''' % (mem_init.count(',')+1, global_initializers, mem_init)) # XXX wrong size calculation! + %s''' % (staticbump, global_initializers, mem_init)) # XXX wrong size calculation! funcs_js = [funcs] if settings.get('ASM_JS'): From 2997a505896a5c431305236c63b683972e47584e Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 16 Sep 2014 16:38:22 -0700 Subject: [PATCH 010/461] start to modify the staticbump etc. --- tests/test_other.py | 2 +- tools/asm_module.py | 7 ++++++- tools/emterpretify.py | 19 +++++++++++++++++-- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/tests/test_other.py b/tests/test_other.py index e58461d9ae2ea..d0738b96fb5a6 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4105,7 +4105,7 @@ def test_stat_fail_alongtheway(self): def test_emterpreter(self): - Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world.c'), '-O2', '--profiling', '-s', 'FINALIZE_ASM_JS=1']).communicate() + Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world.c'), '-O2', '--profiling', '-s', 'FINALIZE_ASM_JS=0']).communicate() Popen([PYTHON, path_from_root('tools', 'emterpretify.py'), 'a.out.js', 'em.out.js']).communicate() self.assertContained('hello, world!', run_js('a.out.js')) self.assertContained('hello, world!', run_js('em.out.js')) diff --git a/tools/asm_module.py b/tools/asm_module.py index 0982fa741d9c0..ff89880af50b8 100644 --- a/tools/asm_module.py +++ b/tools/asm_module.py @@ -21,7 +21,10 @@ def __init__(self, filename): # heap initializer self.staticbump = int(re.search(shared.JS.memory_staticbump_pattern, self.pre_js).group(1)) if self.staticbump: - self.mem_init_js = re.search(shared.JS.memory_initializer_pattern, self.pre_js).group(0) + try: + self.mem_init_js = re.search(shared.JS.memory_initializer_pattern, self.pre_js).group(0) + except: + self.mem_init_js = '' # global initializers global_inits = re.search(shared.JS.global_initializers_pattern, self.pre_js) @@ -63,6 +66,8 @@ def __init__(self, filename): self.sendings[sending[:colon].replace('"', '')] = sending[colon+1:].strip() self.module_defs = set(re.findall('var [\w\d_$]+ = Module\["[\w\d_$]+"\] = asm\["[\w\d_$]+"\];\n', self.post_js)) + self.extra_funcs_js = '' + def set_pre_js(self, staticbump=None, mem_init_js=None): if staticbump is None: staticbump = self.staticbump if mem_init_js is None: mem_init_js = self.mem_init_js diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 09131435713a3..73747cd1660ab 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -3,7 +3,7 @@ ''' Processes asm.js code to make it run in an emterpreter. -Currently this requires the asm.js code to have been built with -s FINALIZE_ASM_JS=1 +Currently this requires the asm.js code to have been built with -s FINALIZE_ASM_JS=0 ''' import os, sys @@ -14,5 +14,20 @@ print 'emterpretifying %s to %s' % (infile, outfile) -shared.Building.js_optimizer(infile, ['emterpretify'], extra_info=None, output_filename=outfile) +temp = infile + '.tmp.js' +shared.Building.js_optimizer(infile, ['emterpretify'], extra_info=None, output_filename=temp) + +asm = asm_module.AsmModule(temp) + +code_size = 1024 # XXX + +while asm.staticbump % 8 != 0: asm.staticbump += 1 +code_start = asm.staticbump +asm.staticbump += code_size +while asm.staticbump % 8 != 0: asm.staticbump += 1 +stack_start = asm.staticbump +asm.staticbump += 1024*1024 # 1MB default emterpreter stack TODO: customize +asm.set_pre_js() # apply staticbump + +asm.write(outfile) From 0dca7dd7fca73025f89376e4ecf62726a8c6390c Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 16 Sep 2014 16:50:24 -0700 Subject: [PATCH 011/461] work towards adding in code --- tools/asm_module.py | 6 +++--- tools/emterpretify.py | 16 +++++++++++++--- tools/js-optimizer.js | 8 ++++---- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/tools/asm_module.py b/tools/asm_module.py index ff89880af50b8..945d72a20e355 100644 --- a/tools/asm_module.py +++ b/tools/asm_module.py @@ -68,10 +68,10 @@ def __init__(self, filename): self.extra_funcs_js = '' - def set_pre_js(self, staticbump=None, mem_init_js=None): + def set_pre_js(self, staticbump=None, js=None): if staticbump is None: staticbump = self.staticbump - if mem_init_js is None: mem_init_js = self.mem_init_js - self.pre_js = re.sub(shared.JS.memory_staticbump_pattern, 'STATICTOP = STATIC_BASE + %d;\n' % (staticbump,) + mem_init_js, self.pre_js, count=1) + if js is None: js = self.mem_init_js + self.pre_js = re.sub(shared.JS.memory_staticbump_pattern, 'STATICTOP = STATIC_BASE + %d;\n' % (staticbump,) + js, self.pre_js, count=1) def relocate_into(self, main): # heap initializer diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 73747cd1660ab..3b5f0bd64e7b2 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -14,20 +14,30 @@ print 'emterpretifying %s to %s' % (infile, outfile) +# process functions, generating bytecode temp = infile + '.tmp.js' shared.Building.js_optimizer(infile, ['emterpretify'], extra_info=None, output_filename=temp) +# load the module and modify it asm = asm_module.AsmModule(temp) -code_size = 1024 # XXX +assert '.mem' in asm.pre_js, 'we assume a mem init file for now' +mem_file = infile + '.mem' +assert os.path.exists(mem_file), 'need to find mem file at %s' % mem_file +mem_init = open(mem_file, 'rb').read() +zero_space = asm.staticbump - len(mem_init) +assert zero_space >= 0 # can be positive, if we add a bump of zeros + +# parse out bytecode and add to mem init file +code = [] # XXX while asm.staticbump % 8 != 0: asm.staticbump += 1 code_start = asm.staticbump -asm.staticbump += code_size +asm.staticbump += len(code) while asm.staticbump % 8 != 0: asm.staticbump += 1 stack_start = asm.staticbump asm.staticbump += 1024*1024 # 1MB default emterpreter stack TODO: customize -asm.set_pre_js() # apply staticbump +asm.set_pre_js(js='var EMTCODE = %d, EMTSTACKTOP = %s;' % (code_start, stack_start)) # apply staticbump and do allocations asm.write(outfile) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 9cc7d90a80b3f..842657569e86b 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5946,13 +5946,13 @@ function emterpretify(ast) { var stats = getStatements(func); // emit stack assignments, emterpreter assumes params to be in place func[3] = []; - var bump = 0; // we will assert in the emterpreter itself that we did not overflow the emstack + var bump = 0; // we will assert in the emterpreter itself that we did not overflow the emtstack func[2].forEach(function(arg) { var code; switch (asmData.params[arg]) { - case ASM_INT: code = 'HEAP32[EMSTACKTOP + ' + bump + ' >> 2] = ' + arg + ';'; break; - case ASM_DOUBLE: code = 'HEAPF64[EMSTACKTOP + ' + bump + ' >> 3] = ' + arg + ';'; break; - case ASM_FLOAT: code = 'HEAPF32[EMSTACKTOP + ' + bump + ' >> 2] = ' + arg + ';'; break; + case ASM_INT: code = 'HEAP32[EMTSTACKTOP + ' + bump + ' >> 2] = ' + arg + ';'; break; + case ASM_DOUBLE: code = 'HEAPF64[EMTSTACKTOP + ' + bump + ' >> 3] = ' + arg + ';'; break; + case ASM_FLOAT: code = 'HEAPF32[EMTSTACKTOP + ' + bump + ' >> 2] = ' + arg + ';'; break; default: throw 'bad'; } func[3].push(srcToAst(code)[1][0]); From debbd332e71d9bc622693f1079ecfeae3d6d0f2e Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 16 Sep 2014 17:22:13 -0700 Subject: [PATCH 012/461] create new mem init --- tools/emterpretify.py | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 3b5f0bd64e7b2..c481756ec5cc9 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -21,23 +21,34 @@ # load the module and modify it asm = asm_module.AsmModule(temp) -assert '.mem' in asm.pre_js, 'we assume a mem init file for now' -mem_file = infile + '.mem' -assert os.path.exists(mem_file), 'need to find mem file at %s' % mem_file -mem_init = open(mem_file, 'rb').read() +in_mem_file = infile + '.mem' +out_mem_file = outfile + '.mem' +assert in_mem_file in asm.pre_js, 'we assume a mem init file for now' +asm.pre_js = asm.pre_js.replace(in_mem_file, out_mem_file) +assert os.path.exists(in_mem_file), 'need to find mem file at %s' % mem_file +mem_init = map(ord, open(in_mem_file, 'rb').read()) zero_space = asm.staticbump - len(mem_init) assert zero_space >= 0 # can be positive, if we add a bump of zeros # parse out bytecode and add to mem init file code = [] # XXX -while asm.staticbump % 8 != 0: asm.staticbump += 1 -code_start = asm.staticbump +while len(mem_init) % 8 != 0: + mem_init.append(0) + asm.staticbump += 1 +code_start = len(mem_init) +mem_init = mem_init + code asm.staticbump += len(code) -while asm.staticbump % 8 != 0: asm.staticbump += 1 -stack_start = asm.staticbump + +while len(mem_init) % 8 != 0: + mem_init.append(0) + asm.staticbump += 1 +stack_start = len(mem_init) asm.staticbump += 1024*1024 # 1MB default emterpreter stack TODO: customize -asm.set_pre_js(js='var EMTCODE = %d, EMTSTACKTOP = %s;' % (code_start, stack_start)) # apply staticbump and do allocations + +open(out_mem_file, 'wb').write(''.join(map(chr, mem_init))) + +asm.set_pre_js(js='var EMTCODE = STATIC_BASE + %d, EMTSTACKTOP = STATIC_BASE + %s;' % (code_start, stack_start)) # apply staticbump and do allocations asm.write(outfile) From d3082ceafb9b74dd5c7835228fe6fecce9fe57ce Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 16 Sep 2014 17:41:26 -0700 Subject: [PATCH 013/461] parse code into mem init --- tools/emterpretify.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index c481756ec5cc9..b485026ed5d94 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -6,7 +6,7 @@ Currently this requires the asm.js code to have been built with -s FINALIZE_ASM_JS=0 ''' -import os, sys +import os, sys, re, json import asm_module, shared infile = sys.argv[1] @@ -31,7 +31,24 @@ assert zero_space >= 0 # can be positive, if we add a bump of zeros # parse out bytecode and add to mem init file -code = [] # XXX +code = [] +lines = asm.funcs_js.split('\n') +asm.funcs_js = None +func = None +for i in range(len(lines)): + line = lines[i] + if line.startswith('function '): + assert not func + func = line.split(' ')[1].split('(')[0] + elif line.startswith('}'): + assert func + curr = json.loads(line[4:]) + assert len(curr) % 4 == 0 + code += curr + func = None + lines[i] = '}' +asm.funcs_js = '\n'.join(lines) +lines = None while len(mem_init) % 8 != 0: mem_init.append(0) From 716f551d89fba6fa335b5b8d25fd8641875901c6 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 17 Sep 2014 14:06:59 -0700 Subject: [PATCH 014/461] finalize trampoline addresses --- tools/emterpretify.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index b485026ed5d94..7b43d8068bf5e 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -30,11 +30,16 @@ zero_space = asm.staticbump - len(mem_init) assert zero_space >= 0 # can be positive, if we add a bump of zeros +assert 'GLOBAL_BASE: 8,' in asm.pre_js + # parse out bytecode and add to mem init file code = [] +funcs = {} lines = asm.funcs_js.split('\n') asm.funcs_js = None func = None + +# first pass, collect bytecode for i in range(len(lines)): line = lines[i] if line.startswith('function '): @@ -44,9 +49,26 @@ assert func curr = json.loads(line[4:]) assert len(curr) % 4 == 0 + funcs[func] = len(code) code += curr func = None lines[i] = '}' + +# second pass, finalize trampolines +for i in range(len(lines)): + line = lines[i] + if line.startswith('function '): + assert not func + func = line.split(' ')[1].split('(')[0] + elif line.startswith('}'): + assert func + func = None + elif func: + call = 'emterpret(EMTERPRETER_' + func + ')' + if call in line: + lines[i] = lines[i].replace(call, 'emterpret(%s)' % (funcs[func] + 8)) + +# finalize JS asm.funcs_js = '\n'.join(lines) lines = None From f43cc2aac62fdf7b70e6a1abd6b22836c48d1936 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 17 Sep 2014 14:14:15 -0700 Subject: [PATCH 015/461] sent EMT vars into asm, and use proper absolute code offsets --- tools/emterpretify.py | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 7b43d8068bf5e..d3b0b9c278da6 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -54,6 +54,22 @@ func = None lines[i] = '}' +# create new mem init, and calculate where code will start +while len(mem_init) % 8 != 0: + mem_init.append(0) + asm.staticbump += 1 +code_start = len(mem_init) + 8 # 8 is GLOBAL_BASE +mem_init = mem_init + code +asm.staticbump += len(code) + +while len(mem_init) % 8 != 0: + mem_init.append(0) + asm.staticbump += 1 +stack_start = len(mem_init) +asm.staticbump += 1024*1024 # 1MB default emterpreter stack TODO: customize + +open(out_mem_file, 'wb').write(''.join(map(chr, mem_init))) + # second pass, finalize trampolines for i in range(len(lines)): line = lines[i] @@ -66,28 +82,16 @@ elif func: call = 'emterpret(EMTERPRETER_' + func + ')' if call in line: - lines[i] = lines[i].replace(call, 'emterpret(%s)' % (funcs[func] + 8)) + lines[i] = lines[i].replace(call, 'emterpret(%s)' % (funcs[func] + code_start)) -# finalize JS +# finalize funcs JS asm.funcs_js = '\n'.join(lines) lines = None -while len(mem_init) % 8 != 0: - mem_init.append(0) - asm.staticbump += 1 -code_start = len(mem_init) -mem_init = mem_init + code -asm.staticbump += len(code) - -while len(mem_init) % 8 != 0: - mem_init.append(0) - asm.staticbump += 1 -stack_start = len(mem_init) -asm.staticbump += 1024*1024 # 1MB default emterpreter stack TODO: customize - -open(out_mem_file, 'wb').write(''.join(map(chr, mem_init))) +# send EMT vars into asm +asm.exports_js = asm.exports_js.replace('};', ', EMTSTACKTOP: EMTSTACKTOP };') -asm.set_pre_js(js='var EMTCODE = STATIC_BASE + %d, EMTSTACKTOP = STATIC_BASE + %s;' % (code_start, stack_start)) # apply staticbump and do allocations +asm.set_pre_js(js='var EMTSTACKTOP = STATIC_BASE + %s;' % (stack_start)) # apply staticbump and do allocations asm.write(outfile) From 92b3e060af2074de83b280e760c0e691f695f6f4 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 17 Sep 2014 14:22:51 -0700 Subject: [PATCH 016/461] properly set up EMTSTACKTOP --- tools/emterpretify.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index d3b0b9c278da6..9a1e7ffa198bb 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -88,10 +88,13 @@ asm.funcs_js = '\n'.join(lines) lines = None -# send EMT vars into asm -asm.exports_js = asm.exports_js.replace('};', ', EMTSTACKTOP: EMTSTACKTOP };') +# set up emterpreter stack top +asm.set_pre_js(js='var EMTSTACKTOP = STATIC_BASE + %s;' % (stack_start)) -asm.set_pre_js(js='var EMTSTACKTOP = STATIC_BASE + %s;' % (stack_start)) # apply staticbump and do allocations +# send EMT vars into asm +brace = asm.post_js.find('{') +asm.post_js = asm.post_js[:brace+1] + ' EMTSTACKTOP: EMTSTACKTOP, ' + asm.post_js[brace+1:] +asm.imports_js += 'var EMTSTACKTOP = EMTSTACKTOP|0;\n' asm.write(outfile) From e1304d3b60579ba7356bf95b6cc9af035c043280 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 17 Sep 2014 14:45:57 -0700 Subject: [PATCH 017/461] make separate emterpreters for each return type, and set up asm validation and testing --- tests/test_other.py | 3 +++ tools/emterpretify.py | 28 +++++++++++++++++++++++----- tools/js-optimizer.js | 12 ++++++++++-- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/tests/test_other.py b/tests/test_other.py index d0738b96fb5a6..0dc9b19178945 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4109,4 +4109,7 @@ def test_emterpreter(self): Popen([PYTHON, path_from_root('tools', 'emterpretify.py'), 'a.out.js', 'em.out.js']).communicate() self.assertContained('hello, world!', run_js('a.out.js')) self.assertContained('hello, world!', run_js('em.out.js')) + out = run_js('em.out.js', engine=SPIDERMONKEY_ENGINE, stderr=PIPE, full_output=True) + self.assertContained('hello, world!', out) + self.validate_asmjs(out) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 9a1e7ffa198bb..54aed1c57b3ab 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -9,6 +9,24 @@ import os, sys, re, json import asm_module, shared +# utils + +settings = { 'PRECISE_F32': 0 } # TODO + +def make_emterpreter(t): + return r''' +function emterpret%s%s(pc) { + pc = pc|0; + %s +} +''' % ( + '_' if t != 'void' else '', + '' if t == 'void' else t[0], + '' if t == 'void' else 'return %s;' % shared.JS.make_initializer(t[0], settings) +) + +# main + infile = sys.argv[1] outfile = sys.argv[2] @@ -80,12 +98,12 @@ assert func func = None elif func: - call = 'emterpret(EMTERPRETER_' + func + ')' + call = '(EMTERPRETER_' + func + ')' if call in line: - lines[i] = lines[i].replace(call, 'emterpret(%s)' % (funcs[func] + code_start)) + lines[i] = lines[i].replace(call, '(%s)' % (funcs[func] + code_start)) # finalize funcs JS -asm.funcs_js = '\n'.join(lines) +asm.funcs_js = '\n'.join(['\n'.join(lines), make_emterpreter('void'), make_emterpreter('int'), make_emterpreter('double'), make_emterpreter('float')]) lines = None # set up emterpreter stack top @@ -93,8 +111,8 @@ # send EMT vars into asm brace = asm.post_js.find('{') -asm.post_js = asm.post_js[:brace+1] + ' EMTSTACKTOP: EMTSTACKTOP, ' + asm.post_js[brace+1:] -asm.imports_js += 'var EMTSTACKTOP = EMTSTACKTOP|0;\n' +asm.post_js = asm.post_js[:brace+1] + ' "EMTSTACKTOP": EMTSTACKTOP, ' + asm.post_js[brace+1:] +asm.imports_js += 'var EMTSTACKTOP = env.EMTSTACKTOP|0;\n' asm.write(outfile) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 842657569e86b..dac0b560ae9b0 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5959,11 +5959,19 @@ function emterpretify(ast) { bump += 8; // each local is a 64-bit value }); denormalizeAsm(func, asmData); - var theCall = ['call', ['name', 'emterpret'], [['name', 'EMTERPRETER_' + func[1]]]]; // EMTERPRETER_* will be replaced with the absolute bytecode offset later + var theName = ['name', 'emterpret']; + var theCall = ['call', theName, [['name', 'EMTERPRETER_' + func[1]]]]; // EMTERPRETER_* will be replaced with the absolute bytecode offset later func[3] = func[3].filter(function(node) { if (node[0] === 'return') { assert(asmData.ret !== undefined); - node[1] = makeAsmCoercion(theCall, detectAsmCoercion(node[1])); + var type = detectAsmCoercion(node[1]); + node[1] = makeAsmCoercion(theCall, type); + switch (type) { + case ASM_INT: theName[1] += '_i'; break; + case ASM_DOUBLE: theName[1] += '_d'; break; + case ASM_FLOAT: theName[1] += '_f'; break; + default: throw 'bad'; + } } return node[0] !== 'var'; }); From 0665273acce9b705232007bbc1c93ba76c2e0240 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 17 Sep 2014 14:50:32 -0700 Subject: [PATCH 018/461] fix EMTSTACKTOP passing --- tools/emterpretify.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 54aed1c57b3ab..51ee34537a74b 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -110,8 +110,8 @@ def make_emterpreter(t): asm.set_pre_js(js='var EMTSTACKTOP = STATIC_BASE + %s;' % (stack_start)) # send EMT vars into asm -brace = asm.post_js.find('{') -asm.post_js = asm.post_js[:brace+1] + ' "EMTSTACKTOP": EMTSTACKTOP, ' + asm.post_js[brace+1:] +brace = asm.post_js.find(', {') + 3 +asm.post_js = asm.post_js[:brace] + ' "EMTSTACKTOP": EMTSTACKTOP, ' + asm.post_js[brace:] asm.imports_js += 'var EMTSTACKTOP = env.EMTSTACKTOP|0;\n' asm.write(outfile) From 2e0deedaaf513e695b6478062537893d5ac76f36 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 17 Sep 2014 14:54:23 -0700 Subject: [PATCH 019/461] minor code tweaks --- tools/emterpretify.py | 2 +- tools/js-optimizer.js | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 51ee34537a74b..1d109b28a3033 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -16,7 +16,7 @@ def make_emterpreter(t): return r''' function emterpret%s%s(pc) { - pc = pc|0; + pc = pc | 0; %s } ''' % ( diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index dac0b560ae9b0..08d79bd2adfaa 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5949,10 +5949,11 @@ function emterpretify(ast) { var bump = 0; // we will assert in the emterpreter itself that we did not overflow the emtstack func[2].forEach(function(arg) { var code; + var bumpText = bump ? ' + ' + bump : ''; switch (asmData.params[arg]) { - case ASM_INT: code = 'HEAP32[EMTSTACKTOP + ' + bump + ' >> 2] = ' + arg + ';'; break; - case ASM_DOUBLE: code = 'HEAPF64[EMTSTACKTOP + ' + bump + ' >> 3] = ' + arg + ';'; break; - case ASM_FLOAT: code = 'HEAPF32[EMTSTACKTOP + ' + bump + ' >> 2] = ' + arg + ';'; break; + case ASM_INT: code = 'HEAP32[EMTSTACKTOP' + bumpText + ' >> 2] = ' + arg + ';'; break; + case ASM_DOUBLE: code = 'HEAPF64[EMTSTACKTOP' + bumpText + ' >> 3] = ' + arg + ';'; break; + case ASM_FLOAT: code = 'HEAPF32[EMTSTACKTOP' + bumpText + ' >> 2] = ' + arg + ';'; break; default: throw 'bad'; } func[3].push(srcToAst(code)[1][0]); From 6440dfe8901910e9ea1ef207add33429c2f1328d Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 17 Sep 2014 15:34:10 -0700 Subject: [PATCH 020/461] code appearance tweaks --- tools/emterpretify.py | 3 +-- tools/js-optimizer.js | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 1d109b28a3033..4423abc399b3c 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -18,8 +18,7 @@ def make_emterpreter(t): function emterpret%s%s(pc) { pc = pc | 0; %s -} -''' % ( +}''' % ( '_' if t != 'void' else '', '' if t == 'void' else t[0], '' if t == 'void' else 'return %s;' % shared.JS.make_initializer(t[0], settings) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 08d79bd2adfaa..48c125445f461 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6202,6 +6202,6 @@ if (emitAst) { print('\n'); print(suffix); } else { - print('/* not printing ast */'); + //print('/* not printing ast */'); } From 31b29de088706dbe52a92d1e9b9115244d896171 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 17 Sep 2014 15:44:54 -0700 Subject: [PATCH 021/461] start to emit bytecode --- tools/emterpretify.py | 1 + tools/js-optimizer.js | 333 ++---------------------------------------- 2 files changed, 15 insertions(+), 319 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 4423abc399b3c..f8ee9d1f4230e 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -17,6 +17,7 @@ def make_emterpreter(t): return r''' function emterpret%s%s(pc) { pc = pc | 0; + // TODO: bump and check emtstack %s }''' % ( '_' if t != 'void' else '', diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 48c125445f461..0cadc8e7689a9 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5602,7 +5602,8 @@ function emterpretify(ast) { emitAst = false; var OPCODES = { - 255: 'FUNC', // [ints, doubles, floats] + 254: 'RET', // [x, 0, 0] + 255: 'FUNC', // [locals, 0, 0] }; var ROPCODES = {}; @@ -5610,327 +5611,22 @@ function emterpretify(ast) { function walkFunction(func) { function walk(node) { - if (!node) return; + printErr('walk ' + JSON.stringify(node)); + if (!node) return []; switch(node[0]) { - case 'var': { - node[1].forEach(function(varItem, i) { - var ident = varItem[0]; - var value = varItem[1]; - if (i > 0) emitIndent(); - output += typeName(detectAsmCoercion(value)); - output += ' ' + cName(ident) + ' = 0;'; - if (i < node[1].length-1) output += '\n'; - }); - break; - } - case 'assign': { - // try to emit nice += etc. operators - if (node[2][0] === 'name' && node[3][0] === 'binary') { - if (node[3][1] === '|' && node[3][3][0] === 'num' && node[3][3][1] === 0) { - node[3] = node[3][2]; // wipe out |0 coercion - } - if (node[3][0] === 'binary' && node[3][2][0] === 'name' && node[2][1] === node[3][2][1]) { - switch (node[3][1]) { - case '+': case '-': case '|': case '&': { - walk(node[2], true); - if (node[3][3][0] === 'num' && node[3][3][1] === 1 && (node[3][1] === '+' || node[3][1] === '-')) { - output += node[3][1] + node[3][1]; - } else { - output += ' ' + node[3][1] + '= '; - walk(node[3][3]); - } - return; - } - } - } - } - walk(node[2], true); - output += ' = '; - walk(node[3], true); - break; - } - case 'name': { - output += cName(node[1]); - break; - } - case 'num': { - output += node[1]; - break; - } - case 'binary': { - if (node[1] === '>>>') { - if (!freeParens) output += '('; - // special-case the unsigned coercion - output += '((uint32_t)'; - walk(node[2]); - output += ') >> ((uint32_t)'; - walk(node[3]); - output += ')'; - if (!freeParens) output += ')'; - break; - } else if (node[1] === '|' && node[3][0] === 'num' && node[3][1] === 0) { - // no need for |0 coercions (cannot be double-to-int) - walk(node[2], freeParens); - break; - } - if (!freeParens) output += '('; - walk(node[2]); - output += ' ' + node[1] + ' '; - walk(node[3]); - if (!freeParens) output += ')'; - break; - } - case 'unary-prefix': { - if (node[1] === '~' && node[2][0] === 'unary-prefix' && node[2][1] === '~') { - // special-case the double-to-int conversion - output += '((int32_t)'; - walk(node[2][2]); - output += ')'; - break; - } - output += '('; - switch (node[1]) { - case '!': output += '!'; break; - case '~': output += '~'; break; - case '-': output += '-'; break; - case '+': output += '(double)'; break; - default: throw 'bad unary ' + node[1]; - } - walk(node[2]); - output += ')'; - break; - } - case 'return': { - if (HASH_MEM) { - output += 'hash_mem("leave ' + cName(currFunc[1]) + '");\n'; - emitIndent(); - } - output += 'return '; - walk(node[1], true); - output += ';'; - break; - } - case 'call': { - var relocations = null; - if (node[1][0] === 'name') { - var name = cName(node[1][1]); - if (callHandlers[name]) { - if (callHandlers[name](node)) break; - } - relocations = relocationInfo[name]; - if (funcIncludes[name]) includes.push(funcIncludes[name]); - } - relocations = relocations || []; - if (relocations[0]) output += 'derelocate((int32_t)'; - walk(node[1]); - output += '('; - node[2].forEach(function(arg, i) { - if (i > 0) output += ', '; - if (relocations[i+1]) output += '(' + relocations[i+1] + ')relocate('; - walk(arg, true); - if (relocations[i+1]) output += ')'; - }); - output += ')'; - if (relocations[0]) output += ')'; - break; - } - case 'if': { - output += 'if ('; - walk(node[1], true); - output += ') {\n'; - indent++; - walk(blockify(node[2])); - indent--; - emitIndent(); - output += '}'; - if (node[3]) { - output += ' else {\n' - indent++; - walk(blockify(node[3])); - indent--; - emitIndent(); - output += '}'; - } - break; - } - case 'switch': { - output += 'switch ('; - walk(node[1], true); - output += ') {\n'; - indent++; - var cases = node[2]; - for (var i = 0; i < cases.length; i++) { - emitIndent(); - if (cases[i][0]) { - output += 'case '; - walk(cases[i][0]); - } else { - output += 'default'; - } - output += ': {\n'; - if (cases[i][1].length > 0) { - indent++; - assert(cases[i][1][0][0] === 'block' && cases[i][1].length === 1); - walk(cases[i][1][0]); - indent--; - } - emitIndent(); - output += '}\n'; - } - indent--; - emitIndent(); - output += '}'; - break; - } - case 'while': { - output += 'while ('; - walk(node[1], true); - output += ') {\n'; - indent++; - walk(blockify(node[2])); - indent--; - emitIndent(); - output += '}'; - break; - } - case 'do': { - output += 'do {\n'; - indent++; - walk(blockify(node[2])); - indent--; - emitIndent(); - output += '} while ('; - walk(node[1], true); - output += ');'; - break; - } - case 'block': { - walkStatements(getStatements(node)); - break; - } - case 'conditional': { - output += '(('; - walk(node[1]); - output += ') ? ('; - walk(node[2]); - output += ') : ('; - walk(node[3]); - output += '))'; - break; - } - case 'label': { - output += node[1] + ':\n'; - emitIndent(); - walk(node[2]); - output += '\n'; - emitIndent(); - output += node[1] + '_post:'; - break; - } - case 'break': { - if (!node[1]) { - output += 'break;'; - } else { - output += 'goto ' + node[1] + '_post;'; - } - break; - } - case 'continue': { - if (!node[1]) { - output += 'continue;'; - } else { - output += 'goto ' + node[1] + ';'; - } - break; - } - case 'sub': { - assert(node[1][0] === 'name'); - if (node[1][1][0] === 'F') { - // function table access - walk(node[1]); - output += '['; - walk(node[2]); - output += ']'; - break; - } - var stripped = stripShifts(node[2]); - if (stripped[0] === 'name') { - var name = cName(stripped[1]); - if (name in cExterns) { - output += '((int32_t)' + name + ')'; - break; - } - } - if (ALIASING_MEM_VIEWS) { - switch (node[1][1]) { - case 'HEAP8': case 'HEAPU8': output += 'MEM8'; break; - case 'HEAP16': case 'HEAPU16': output += 'MEM16'; break; - case 'HEAP32': case 'HEAPU32': output += 'MEM32'; break; - case 'HEAPF32': output += 'MEMF32'; break; - case 'HEAPF64': output += 'MEMF64'; break; - default: throw 'bad sub ' + node[1][1]; - } - output += '['; - walk(node[2], true); - output += ']'; - } else { - if (!freeParens) output += '('; - output += '*(('; - assert(node[1][0] === 'name'); - var shifts; - switch (node[1][1]) { - case 'HEAP8': case 'HEAPU8': output += 'int8_t'; shifts = 0; break; - case 'HEAP16': case 'HEAPU16': output += 'int16_t'; shifts = 1; break; - case 'HEAP32': case 'HEAPU32': output += 'int32_t'; shifts = 2; break; - case 'HEAPF32': output += 'float'; shifts = 2; break; - case 'HEAPF64': output += 'double'; shifts = 3; break; - default: throw 'bad sub ' + node[1][1]; - } - output += '*)(((int32_t)MEM) + ('; - if (node[2][0] === 'binary' && node[2][1] === '>>' && node[2][3][0] === 'num' && node[2][3][1] === shifts) { - // we can eliminate out the shifts - walk(node[2][2], true); - } else { - if (shifts) { - walk(['binary', '<<', node[2], ['num', shifts]]); - } else { - walk(node[2], true); - } - } - output += ')'; - if (ALIGNMENT_MASK && shifts) { - output += '&-'; - switch (shifts) { - case 1: output += '1'; break; - case 2: output += '3'; break; - case 3: output += '7'; break; - default: throw 'bad shifts ' + shifts; - } - } - output += '))'; - if (!freeParens) output += ')'; - } - break; - } - case 'seq': { - output += '('; - walk(node[1]); - output += ', '; - walk(node[2]); - output += ')'; - break; - } - case 'toplevel': break; // empty node + case 'var': + case 'toplevel': return []; // empty node + case 'stat': return walk(node[1]); default: throw 'wha? ' + node[0]; } } function walkStatements(stats) { - if (!stats) return; + if (!stats) return []; + var ret = []; stats.forEach(function(stat) { - emitIndent(); - walk(stat); - output += '\n'; + ret = ret.concat(walk(stat)); }); + return ret; } // walkFunction main @@ -5980,11 +5676,10 @@ function emterpretify(ast) { func[3].push(['stat', theCall]); } - print(astToSrc(func) + ' //[' + data + ']'); + // walk all the function to emit bytecode, and add a final ret + data = data.concat(walkStatements(stats)).concat([ROPCODES['RET'], 0, 0, 0]); - //getReturnType - - //blocks: walkStatements(stats) + print(astToSrc(func) + ' //[' + data + ']'); } traverseGeneratedFunctions(ast, walkFunction); } From 6f0aa0b9737de9c786424ec7a96a4ed15882ddc3 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 17 Sep 2014 17:07:11 -0700 Subject: [PATCH 022/461] start to work on emitting assign --- tools/js-optimizer.js | 62 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 56 insertions(+), 6 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 0cadc8e7689a9..58c1c5f9cb4df 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5601,15 +5601,33 @@ function getReturnType(func) { function emterpretify(ast) { emitAst = false; + // l, lx, ly etc - one of 256 locals var OPCODES = { - 254: 'RET', // [x, 0, 0] - 255: 'FUNC', // [locals, 0, 0] + 0: 'SET', // [lx, ly, 0] lx = ly + 1: 'SETST', // [lx, 0, 0] lx = STACKTOP + 254: 'RET', // [l, 0, 0] return l + 255: 'FUNC', // [n, 0, 0] function with n locals }; var ROPCODES = {}; for (var o in OPCODES) ROPCODES[OPCODES[o]] = o; function walkFunction(func) { + // returns [l, bytecode] where l is a local register, and bytecode is bytecode to generate it + function getReg(node) { + printErr('getReg ' + JSON.stringify(node)); + switch(node[0]) { + case 'name': { + var name = node[1]; + if (name in locals) return [locals[name], []]; + // this is a global + switch(name) { + default: throw 'getReg global wha? ' + name; + } + } + default: throw 'getReg wha? ' + node[0]; + } + } function walk(node) { printErr('walk ' + JSON.stringify(node)); if (!node) return []; @@ -5617,6 +5635,32 @@ function emterpretify(ast) { case 'var': case 'toplevel': return []; // empty node case 'stat': return walk(node[1]); + case 'assign': { + assert(node[1] === true); + var target = node[2]; + var value = node[3]; + if (target[0] === 'name') { + // assign to a local or a global + var name = target[1]; + if (name in locals) { + // local + if (value[0] === 'name' && value[1] === 'STACKTOP') { + // special-case the common STACKTOP load + return [ROPCODES['SETST'], locals[name], 0, 0]; + } + var reg = getReg(value); + return reg[1].concat([ROPCODES['SET'], locals[name], reg[0], 0]); + } else { + switch(name) { + //case 'STACKTOP': return [ROPCODES['SET'], locals[name], reg[0]]; + default: throw 'assign global wha? ' + name; + } + } + } else if (target[0] === 'sub') { + // assign to memory + throw 'todo'; + } else throw 'assign wha? ' + target[0]; + } default: throw 'wha? ' + node[0]; } } @@ -5633,11 +5677,17 @@ function emterpretify(ast) { var asmData = normalizeAsm(func); - var locals = 0; - for (var i in asmData.vars) locals++; - for (var i in asmData.params) locals++; + var locals = {}; + var numLocals = 0; + for (var i in asmData.vars) { + locals[i] = numLocals++; + } + for (var i in asmData.params) { + locals[i] = numLocals++; + } + assert(numLocals <= 256); - var data = [ROPCODES['FUNC'], locals, 0, 0]; + var data = [ROPCODES['FUNC'], numLocals, 0, 0]; var stats = getStatements(func); // emit stack assignments, emterpreter assumes params to be in place From c7ec5d4fe213dc579fb3ee8a024328d036f36c1c Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 17 Sep 2014 17:10:07 -0700 Subject: [PATCH 023/461] simplify test temporarily --- tests/test_other.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/test_other.py b/tests/test_other.py index 0dc9b19178945..72e122b769c7f 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4105,7 +4105,13 @@ def test_stat_fail_alongtheway(self): def test_emterpreter(self): - Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world.c'), '-O2', '--profiling', '-s', 'FINALIZE_ASM_JS=0']).communicate() + try: # avoid libc for now XXX + os.environ['EMCC_FORCE_STDLIBS'] = '' + os.environ['EMCC_ONLY_FORCED_STDLIBS'] = '1' + Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world.c'), '-O2', '--profiling', '-s', 'FINALIZE_ASM_JS=0']).communicate() + finally: + del os.environ['EMCC_FORCE_STDLIBS'] + del os.environ['EMCC_ONLY_FORCED_STDLIBS'] Popen([PYTHON, path_from_root('tools', 'emterpretify.py'), 'a.out.js', 'em.out.js']).communicate() self.assertContained('hello, world!', run_js('a.out.js')) self.assertContained('hello, world!', run_js('em.out.js')) From c6823d5791fd35749f9982788545c1566d2427fb Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 17 Sep 2014 17:20:40 -0700 Subject: [PATCH 024/461] add blacklist --- tools/emterpretify.py | 14 +++++++++----- tools/js-optimizer.js | 7 +++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index f8ee9d1f4230e..7a5ba2bf9100b 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -65,10 +65,14 @@ def make_emterpreter(t): func = line.split(' ')[1].split('(')[0] elif line.startswith('}'): assert func - curr = json.loads(line[4:]) - assert len(curr) % 4 == 0 - funcs[func] = len(code) - code += curr + try: + curr = json.loads(line[4:]) + except: + curr = None + if curr is not None: + assert len(curr) % 4 == 0 + funcs[func] = len(code) + code += curr func = None lines[i] = '}' @@ -97,7 +101,7 @@ def make_emterpreter(t): elif line.startswith('}'): assert func func = None - elif func: + elif func and func in funcs: call = '(EMTERPRETER_' + func + ')' if call in line: lines[i] = lines[i].replace(call, '(%s)' % (funcs[func] + code_start)) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 58c1c5f9cb4df..c0de705854a09 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5601,6 +5601,8 @@ function getReturnType(func) { function emterpretify(ast) { emitAst = false; + var BLACKLIST = set('_memcpy', '_memset', 'copyTempDouble', 'copyTempFloat', '_strlen', 'stackAlloc', 'setThrew', 'stackRestore', 'setTempRet0', 'getTempRet0', 'stackSave'); + // l, lx, ly etc - one of 256 locals var OPCODES = { 0: 'SET', // [lx, ly, 0] lx = ly @@ -5675,6 +5677,11 @@ function emterpretify(ast) { // walkFunction main + if (func[1] in BLACKLIST) { + print(astToSrc(func)); + return; + } + var asmData = normalizeAsm(func); var locals = {}; From 5978f6692022c8682304a1c6a39da868691c515a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 17 Sep 2014 18:03:45 -0700 Subject: [PATCH 025/461] infrastructure to manage free locals --- tools/js-optimizer.js | 94 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 85 insertions(+), 9 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index c0de705854a09..ff2629e10b993 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5605,17 +5605,41 @@ function emterpretify(ast) { // l, lx, ly etc - one of 256 locals var OPCODES = { - 0: 'SET', // [lx, ly, 0] lx = ly - 1: 'SETST', // [lx, 0, 0] lx = STACKTOP - 254: 'RET', // [l, 0, 0] return l - 255: 'FUNC', // [n, 0, 0] function with n locals + 0: 'SET', // [lx, ly, 0] lx = ly + 1: 'SETST', // [l, 0, 0] l = STACKTOP + 2: 'SETI', // [l, vl, vm, vh] l = v (24-bit) + 253: 'CALL', // [target, params..] target(params..) + 254: 'RET', // [l, 0, 0] return l + 255: 'FUNC', // [n, 0, 0] function with n locals }; var ROPCODES = {}; - for (var o in OPCODES) ROPCODES[OPCODES[o]] = o; + for (var o in OPCODES) ROPCODES[OPCODES[o]] = +o; + + var TYPE_TO_CALL = {}; + TYPE_TO_CALL[ASM_INT] = 'CALL'; function walkFunction(func) { + + var freeLocals = []; + var maxLocal = 0; + + // gets a 'free' local. this notices the maximum local used, which is then the size of out stack + // 'free' locals are ones above the set of actual local vars in the asm.js method. + // you *must* free that local by calling releaseFree on it, which implies you must call + // releaseIfFree on anything returned by getReg + function getFree() { + assert(freeLocals.length > 0); + var ret = freeLocals.pop(); + maxLocal = Math.max(maxLocal, ret); + return ret; + } + function releaseFree(l) { + freeLocals.push(l); + } + // returns [l, bytecode] where l is a local register, and bytecode is bytecode to generate it + // you *must* call releaseIfFree on the l that is returned; if it is a free local, that will free it function getReg(node) { printErr('getReg ' + JSON.stringify(node)); switch(node[0]) { @@ -5627,9 +5651,44 @@ function emterpretify(ast) { default: throw 'getReg global wha? ' + name; } } + case 'num': { + var value = node[1]; + if (value >>> 24 === 0) { + var l = getFree(); + return [l, [ROPCODES['SETI'], l, value & 255, (value >>> 8) & 255, value >>> 24]]; + } else { + throw 'todo: big nums'; + } + } default: throw 'getReg wha? ' + node[0]; } } + function releaseIfFree(l) { + if (l >= numLocals) releaseFree(l); + return l; + } + + function makeCall(node, type) { + assert(node[0] === 'call'); + assert(type === ASM_NONE); + if (node[1][0] === 'name') { + // normal direct call + var ret = [ROPCODES[TYPE_TO_CALL[type]]]; + var actuals = []; + node[2].forEach(function(param) { + var reg = getReg(param); + ret = reg[1].concat(ret); + actuals.push(reg[0]); + }); + ret = ret.concat(actuals); + actuals.forEach(releaseIfFree); + while (ret.length % 4 !== 0) ret.push(0); + return ret; + } else { + throw 'todo: function pointer call'; + } + } + function walk(node) { printErr('walk ' + JSON.stringify(node)); if (!node) return []; @@ -5651,7 +5710,7 @@ function emterpretify(ast) { return [ROPCODES['SETST'], locals[name], 0, 0]; } var reg = getReg(value); - return reg[1].concat([ROPCODES['SET'], locals[name], reg[0], 0]); + return reg[1].concat([ROPCODES['SET'], locals[name], releaseIfFree(reg[0]), 0]); } else { switch(name) { //case 'STACKTOP': return [ROPCODES['SET'], locals[name], reg[0]]; @@ -5663,6 +5722,20 @@ function emterpretify(ast) { throw 'todo'; } else throw 'assign wha? ' + target[0]; } + case 'binary': { + if (node[1] === '|' && node[2][0] === 'call' && node[3][0] === 'num' && node[3][1] === 0) { + // function call with dropped result + return makeCall(node[2], ASM_NONE); + } + } + case 'call': { + throw 'todo'; + if (node[1][0] === 'name') { + // normal direct call + } else { + // todo: function pointer call + } + } default: throw 'wha? ' + node[0]; } } @@ -5693,8 +5766,9 @@ function emterpretify(ast) { locals[i] = numLocals++; } assert(numLocals <= 256); - - var data = [ROPCODES['FUNC'], numLocals, 0, 0]; + for (var i = 255; i >= numLocals; i--) { + freeLocals.push(i); + } var stats = getStatements(func); // emit stack assignments, emterpreter assumes params to be in place @@ -5734,7 +5808,9 @@ function emterpretify(ast) { } // walk all the function to emit bytecode, and add a final ret - data = data.concat(walkStatements(stats)).concat([ROPCODES['RET'], 0, 0, 0]); + var data = walkStatements(stats).concat([ROPCODES['RET'], 0, 0, 0]); + assert(maxLocal <= 256); + data = [ROPCODES['FUNC'], maxLocal, 0, 0].concat(data); print(astToSrc(func) + ' //[' + data + ']'); } From 696d02c7d03511ccef0210c091b2899513ca8f9e Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 17 Sep 2014 18:11:39 -0700 Subject: [PATCH 026/461] return and some more --- tools/emterpretify.py | 1 + tools/js-optimizer.js | 21 +++++++++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 7a5ba2bf9100b..f58f714e6cf31 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -72,6 +72,7 @@ def make_emterpreter(t): if curr is not None: assert len(curr) % 4 == 0 funcs[func] = len(code) + print >> sys.stderr, 'bytecode for %s:' % func, code code += curr func = None lines[i] = '}' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index ff2629e10b993..dfc34f6c723ff 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5601,15 +5601,16 @@ function getReturnType(func) { function emterpretify(ast) { emitAst = false; - var BLACKLIST = set('_memcpy', '_memset', 'copyTempDouble', 'copyTempFloat', '_strlen', 'stackAlloc', 'setThrew', 'stackRestore', 'setTempRet0', 'getTempRet0', 'stackSave'); + var BLACKLIST = set('_memcpy', '_memset', 'copyTempDouble', 'copyTempFloat', '_strlen', 'stackAlloc', 'setThrew', 'stackRestore', 'setTempRet0', 'getTempRet0', 'stackSave', 'runPostSets'); // l, lx, ly etc - one of 256 locals var OPCODES = { 0: 'SET', // [lx, ly, 0] lx = ly - 1: 'SETST', // [l, 0, 0] l = STACKTOP - 2: 'SETI', // [l, vl, vm, vh] l = v (24-bit) + 1: 'GETST', // [l, 0, 0] l = STACKTOP + 2: 'SETST', // [l, 0, 0] STACKTOP = l + 3: 'SETI', // [l, vl, vm, vh] l = v (24-bit) 253: 'CALL', // [target, params..] target(params..) - 254: 'RET', // [l, 0, 0] return l + 254: 'RET', // [l, 0, 0] return l (depending on which emterpreter_x we are in, has the right type) 255: 'FUNC', // [n, 0, 0] function with n locals }; @@ -5707,13 +5708,13 @@ function emterpretify(ast) { // local if (value[0] === 'name' && value[1] === 'STACKTOP') { // special-case the common STACKTOP load - return [ROPCODES['SETST'], locals[name], 0, 0]; + return [ROPCODES['GETST'], locals[name], 0, 0]; } var reg = getReg(value); return reg[1].concat([ROPCODES['SET'], locals[name], releaseIfFree(reg[0]), 0]); } else { switch(name) { - //case 'STACKTOP': return [ROPCODES['SET'], locals[name], reg[0]]; + case 'STACKTOP': return [ROPCODES['SETST'], locals[name], 0, 0]; default: throw 'assign global wha? ' + name; } } @@ -5727,6 +5728,7 @@ function emterpretify(ast) { // function call with dropped result return makeCall(node[2], ASM_NONE); } + throw 'todo'; } case 'call': { throw 'todo'; @@ -5736,6 +5738,13 @@ function emterpretify(ast) { // todo: function pointer call } } + case 'return': { + var value = node[1]; + var reg; + if (value) reg = getReg(value); + else reg = [0, []]; + return reg[1].concat([ROPCODES['RET'], value ? releaseIfFree(reg[0]) : 0, 0, 0]); + } default: throw 'wha? ' + node[0]; } } From 6f48456158917bca0704bf338660f2e041bf8beb Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 17 Sep 2014 18:19:41 -0700 Subject: [PATCH 027/461] fixes and asserts --- tools/emterpretify.py | 4 ++-- tools/js-optimizer.js | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index f58f714e6cf31..714b9619b20a9 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -60,7 +60,7 @@ def make_emterpreter(t): # first pass, collect bytecode for i in range(len(lines)): line = lines[i] - if line.startswith('function '): + if line.startswith('function ') and '}' not in line: assert not func func = line.split(' ')[1].split('(')[0] elif line.startswith('}'): @@ -96,7 +96,7 @@ def make_emterpreter(t): # second pass, finalize trampolines for i in range(len(lines)): line = lines[i] - if line.startswith('function '): + if line.startswith('function ') and '}' not in line: assert not func func = line.split(' ')[1].split('(')[0] elif line.startswith('}'): diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index dfc34f6c723ff..50a290b9f089d 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5608,7 +5608,7 @@ function emterpretify(ast) { 0: 'SET', // [lx, ly, 0] lx = ly 1: 'GETST', // [l, 0, 0] l = STACKTOP 2: 'SETST', // [l, 0, 0] STACKTOP = l - 3: 'SETI', // [l, vl, vm, vh] l = v (24-bit) + 3: 'SETI', // [l, vl, vh] l = v (16-bit) 253: 'CALL', // [target, params..] target(params..) 254: 'RET', // [l, 0, 0] return l (depending on which emterpreter_x we are in, has the right type) 255: 'FUNC', // [n, 0, 0] function with n locals @@ -5654,9 +5654,9 @@ function emterpretify(ast) { } case 'num': { var value = node[1]; - if (value >>> 24 === 0) { + if (value >>> 16 === 0) { var l = getFree(); - return [l, [ROPCODES['SETI'], l, value & 255, (value >>> 8) & 255, value >>> 24]]; + return [l, [ROPCODES['SETI'], l, value & 255, value >>> 8]]; } else { throw 'todo: big nums'; } @@ -5817,9 +5817,12 @@ function emterpretify(ast) { } // walk all the function to emit bytecode, and add a final ret + // TODO: only add final ret if needed var data = walkStatements(stats).concat([ROPCODES['RET'], 0, 0, 0]); + assert(data.length % 4 === 0); assert(maxLocal <= 256); data = [ROPCODES['FUNC'], maxLocal, 0, 0].concat(data); + assert(data.length % 4 === 0); print(astToSrc(func) + ' //[' + data + ']'); } From 770e23f2e4befc471be14a53a3572f2f304f8ca3 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 17 Sep 2014 20:01:00 -0700 Subject: [PATCH 028/461] fixes --- tools/emterpretify.py | 2 +- tools/js-optimizer.js | 20 ++++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 714b9619b20a9..d640dcb03b411 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -72,7 +72,7 @@ def make_emterpreter(t): if curr is not None: assert len(curr) % 4 == 0 funcs[func] = len(code) - print >> sys.stderr, 'bytecode for %s:' % func, code + print >> sys.stderr, 'bytecode for %s:' % func, curr code += curr func = None lines[i] = '}' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 50a290b9f089d..dd91e98151725 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5618,7 +5618,12 @@ function emterpretify(ast) { for (var o in OPCODES) ROPCODES[OPCODES[o]] = +o; var TYPE_TO_CALL = {}; - TYPE_TO_CALL[ASM_INT] = 'CALL'; + TYPE_TO_CALL[ASM_NONE] = 'CALL'; + + function verifyCode(code) { + if (code.length % 4 !== 0) assert(0, JSON.stringify(code)); + for (var i = 0; i < code.length; i++) if (code[i] === undefined || code[i] === null) assert(0, i + ' : ' + JSON.stringify(code)); + } function walkFunction(func) { @@ -5675,6 +5680,7 @@ function emterpretify(ast) { if (node[1][0] === 'name') { // normal direct call var ret = [ROPCODES[TYPE_TO_CALL[type]]]; + assert(ret[0], type); var actuals = []; node[2].forEach(function(param) { var reg = getReg(param); @@ -5714,7 +5720,10 @@ function emterpretify(ast) { return reg[1].concat([ROPCODES['SET'], locals[name], releaseIfFree(reg[0]), 0]); } else { switch(name) { - case 'STACKTOP': return [ROPCODES['SETST'], locals[name], 0, 0]; + case 'STACKTOP': { + var reg = getReg(value); + return reg[1].concat([ROPCODES['SETST'], releaseIfFree(reg[0]), 0, 0]); + } default: throw 'assign global wha? ' + name; } } @@ -5752,7 +5761,9 @@ function emterpretify(ast) { if (!stats) return []; var ret = []; stats.forEach(function(stat) { - ret = ret.concat(walk(stat)); + var curr = walk(stat); + verifyCode(curr); + ret = ret.concat(curr); }); return ret; } @@ -5822,7 +5833,8 @@ function emterpretify(ast) { assert(data.length % 4 === 0); assert(maxLocal <= 256); data = [ROPCODES['FUNC'], maxLocal, 0, 0].concat(data); - assert(data.length % 4 === 0); + verifyCode(data); + //printErr(JSON.stringify(data)); print(astToSrc(func) + ' //[' + data + ']'); } From 122f35a876034847eb82a7347ea5453ae74f3729 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 17 Sep 2014 20:04:49 -0700 Subject: [PATCH 029/461] fix # of locals --- tools/js-optimizer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index dd91e98151725..56635f4a137b2 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5832,7 +5832,7 @@ function emterpretify(ast) { var data = walkStatements(stats).concat([ROPCODES['RET'], 0, 0, 0]); assert(data.length % 4 === 0); assert(maxLocal <= 256); - data = [ROPCODES['FUNC'], maxLocal, 0, 0].concat(data); + data = [ROPCODES['FUNC'], maxLocal+1, 0, 0].concat(data); verifyCode(data); //printErr(JSON.stringify(data)); From a0e048f92ff512344acbf3ad14dba6dfeb25bbf0 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 17 Sep 2014 21:14:02 -0700 Subject: [PATCH 030/461] list callable globals --- tools/emterpretify.py | 26 +++++++++++++++++++++++++- tools/js-optimizer.js | 4 +++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index d640dcb03b411..1913cd128d970 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -9,6 +9,10 @@ import os, sys, re, json import asm_module, shared +# settings + +BLACKLIST = set(['_memcpy', '_memset', 'copyTempDouble', 'copyTempFloat', '_strlen', 'stackAlloc', 'setThrew', 'stackRestore', 'setTempRet0', 'getTempRet0', 'stackSave', 'runPostSets']) + # utils settings = { 'PRECISE_F32': 0 } # TODO @@ -32,9 +36,29 @@ def make_emterpreter(t): print 'emterpretifying %s to %s' % (infile, outfile) +# final global functions + +asm = asm_module.AsmModule(infile) +global_funcs = {} +global_id = 0 +for k, v in asm.imports.iteritems(): + if '|' not in v and '+' not in v and 'new ' not in v and '.0' not in v and v != '0': + global_funcs[k] = global_id + global_id += 1 + +lines = asm.funcs_js.split('\n') +for i in range(len(lines)): + line = lines[i] + if line.startswith('function ') and '}' not in line: + func = line.split(' ')[1].split('(')[0] + if func not in BLACKLIST: + global_funcs[func] = global_id + global_id += 1 +assert global_id < 256 + # process functions, generating bytecode temp = infile + '.tmp.js' -shared.Building.js_optimizer(infile, ['emterpretify'], extra_info=None, output_filename=temp) +shared.Building.js_optimizer(infile, ['emterpretify'], extra_info={ 'blacklist': list(BLACKLIST), 'globalFuncs': global_funcs }, output_filename=temp) # load the module and modify it asm = asm_module.AsmModule(temp) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 56635f4a137b2..2e4a78ab95466 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5601,7 +5601,8 @@ function getReturnType(func) { function emterpretify(ast) { emitAst = false; - var BLACKLIST = set('_memcpy', '_memset', 'copyTempDouble', 'copyTempFloat', '_strlen', 'stackAlloc', 'setThrew', 'stackRestore', 'setTempRet0', 'getTempRet0', 'stackSave', 'runPostSets'); + var BLACKLIST = set(extraInfo.blacklist); + var GLOBAL_FUNCS = extraInfo.globalFuncs; // l, lx, ly etc - one of 256 locals var OPCODES = { @@ -5687,6 +5688,7 @@ function emterpretify(ast) { ret = reg[1].concat(ret); actuals.push(reg[0]); }); + ret.push(GLOBAL_FUNCS[node[1][1]]); ret = ret.concat(actuals); actuals.forEach(releaseIfFree); while (ret.length % 4 !== 0) ret.push(0); From b1c19660694ec4e01f95f37325d44488d582f6fb Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 17 Sep 2014 21:16:21 -0700 Subject: [PATCH 031/461] don't emit final unnecessary ret --- tools/js-optimizer.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 2e4a78ab95466..28413775c2776 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5830,9 +5830,11 @@ function emterpretify(ast) { } // walk all the function to emit bytecode, and add a final ret - // TODO: only add final ret if needed - var data = walkStatements(stats).concat([ROPCODES['RET'], 0, 0, 0]); + var data = walkStatements(stats); assert(data.length % 4 === 0); + if (data.length < 4 || data[data.length-4] != ROPCODES['RET']) { + data = data.concat([ROPCODES['RET'], 0, 0, 0]); // final ret for the function + } assert(maxLocal <= 256); data = [ROPCODES['FUNC'], maxLocal+1, 0, 0].concat(data); verifyCode(data); From f8e4153396c7e2f94e22edb1e6d3a289159fcfdc Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 18 Sep 2014 14:45:25 -0700 Subject: [PATCH 032/461] emit target and signature from calls --- tools/emterpretify.py | 3 ++- tools/js-optimizer.js | 25 ++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 1913cd128d970..ee93c60926ecb 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -92,9 +92,10 @@ def make_emterpreter(t): try: curr = json.loads(line[4:]) except: + if '[' in line: print >> sys.stderr, 'failed to parse code from', line curr = None if curr is not None: - assert len(curr) % 4 == 0 + assert len(curr) % 4 == 0, curr funcs[func] = len(code) print >> sys.stderr, 'bytecode for %s:' % func, curr code += curr diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 28413775c2776..eb49898cb099a 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1817,6 +1817,13 @@ var ASM_DOUBLE = 1; var ASM_FLOAT = 2; var ASM_NONE = 3; +var ASM_SIG = { + 0: 'i', + 1: 'd', + 2: 'f', + 3: 'v' +}; + var ASM_FLOAT_ZERO = null; // TODO: share the entire node? function detectAsmCoercion(node, asmInfo, inVarDef) { @@ -5585,18 +5592,6 @@ function pointerMasking(ast) { }); } -function getReturnType(func) { - var ret = ASM_NONE; - traverse(func, function(node, type) { - if (type == 'return' && node[1]) { - var type = detectAsmCoercion(node[1]); - if (ret) assert(ret === type); - ret = type; - } - }); - return ret; -} - // Converts functions into binary format to be run by an emterpreter function emterpretify(ast) { emitAst = false; @@ -5683,12 +5678,16 @@ function emterpretify(ast) { var ret = [ROPCODES[TYPE_TO_CALL[type]]]; assert(ret[0], type); var actuals = []; + var sig = ASM_SIG[type]; node[2].forEach(function(param) { var reg = getReg(param); ret = reg[1].concat(ret); actuals.push(reg[0]); + sig += ASM_SIG[detectAsmCoercion(param, asmData)]; }); ret.push(GLOBAL_FUNCS[node[1][1]]); + assert(sig.indexOf('u') < 0); // no undefined + ret.push(sig); ret = ret.concat(actuals); actuals.forEach(releaseIfFree); while (ret.length % 4 !== 0) ret.push(0); @@ -5840,7 +5839,7 @@ function emterpretify(ast) { verifyCode(data); //printErr(JSON.stringify(data)); - print(astToSrc(func) + ' //[' + data + ']'); + print(astToSrc(func) + ' //' + JSON.stringify(data) + ''); } traverseGeneratedFunctions(ast, walkFunction); } From a88f6ca71639007f0cb0b0c433560d06271b10a2 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 18 Sep 2014 14:50:12 -0700 Subject: [PATCH 033/461] move opcodes into python --- tools/emterpretify.py | 18 ++++++++++++++++-- tools/js-optimizer.js | 16 ++-------------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index ee93c60926ecb..7044f742fd4c3 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -9,10 +9,24 @@ import os, sys, re, json import asm_module, shared -# settings +# consts BLACKLIST = set(['_memcpy', '_memset', 'copyTempDouble', 'copyTempFloat', '_strlen', 'stackAlloc', 'setThrew', 'stackRestore', 'setTempRet0', 'getTempRet0', 'stackSave', 'runPostSets']) +OPCODES = { # l, lx, ly etc - one of 256 locals + '0': 'SET', # [lx, ly, 0] lx = ly + '1': 'GETST', # [l, 0, 0] l = STACKTOP + '2': 'SETST', # [l, 0, 0] STACKTOP = l + '3': 'SETI', # [l, vl, vh] l = v (16-bit) + '253': 'CALL', # [target, params..] target(params..) + '254': 'RET', # [l, 0, 0] return l (depending on which emterpreter_x we are in, has the right type) + '255': 'FUNC', # [n, 0, 0] function with n locals +} + +ROPCODES = {} +for o in OPCODES: + ROPCODES[OPCODES[o]] = int(o); + # utils settings = { 'PRECISE_F32': 0 } # TODO @@ -58,7 +72,7 @@ def make_emterpreter(t): # process functions, generating bytecode temp = infile + '.tmp.js' -shared.Building.js_optimizer(infile, ['emterpretify'], extra_info={ 'blacklist': list(BLACKLIST), 'globalFuncs': global_funcs }, output_filename=temp) +shared.Building.js_optimizer(infile, ['emterpretify'], extra_info={ 'blacklist': list(BLACKLIST), 'globalFuncs': global_funcs, 'opcodes': OPCODES, 'ropcodes': ROPCODES }, output_filename=temp) # load the module and modify it asm = asm_module.AsmModule(temp) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index eb49898cb099a..a382b31ce0d5c 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5598,20 +5598,8 @@ function emterpretify(ast) { var BLACKLIST = set(extraInfo.blacklist); var GLOBAL_FUNCS = extraInfo.globalFuncs; - - // l, lx, ly etc - one of 256 locals - var OPCODES = { - 0: 'SET', // [lx, ly, 0] lx = ly - 1: 'GETST', // [l, 0, 0] l = STACKTOP - 2: 'SETST', // [l, 0, 0] STACKTOP = l - 3: 'SETI', // [l, vl, vh] l = v (16-bit) - 253: 'CALL', // [target, params..] target(params..) - 254: 'RET', // [l, 0, 0] return l (depending on which emterpreter_x we are in, has the right type) - 255: 'FUNC', // [n, 0, 0] function with n locals - }; - - var ROPCODES = {}; - for (var o in OPCODES) ROPCODES[OPCODES[o]] = +o; + var OPCODES = extraInfo.opcodes; + var ROPCODES = extraInfo.ropcodes; var TYPE_TO_CALL = {}; TYPE_TO_CALL[ASM_NONE] = 'CALL'; From 0c280acdf190ffbbc74bfc3c953add46a970457e Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 18 Sep 2014 15:02:28 -0700 Subject: [PATCH 034/461] start to process call sigs --- tools/emterpretify.py | 27 +++++++++++++++++++++------ tools/js-optimizer.js | 2 +- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 7044f742fd4c3..1adbb18dc7cd4 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -18,7 +18,7 @@ '1': 'GETST', # [l, 0, 0] l = STACKTOP '2': 'SETST', # [l, 0, 0] STACKTOP = l '3': 'SETI', # [l, vl, vh] l = v (16-bit) - '253': 'CALL', # [target, params..] target(params..) + '253': 'CALL', # [target, sig, params..] target(params..) '254': 'RET', # [l, 0, 0] return l (depending on which emterpreter_x we are in, has the right type) '255': 'FUNC', # [n, 0, 0] function with n locals } @@ -89,13 +89,27 @@ def make_emterpreter(t): assert 'GLOBAL_BASE: 8,' in asm.pre_js # parse out bytecode and add to mem init file -code = [] +all_code = [] funcs = {} lines = asm.funcs_js.split('\n') asm.funcs_js = None func = None # first pass, collect bytecode +call_sigs = {} # signatures appearing for each call target +def process_code(code): + # find CALL instructions and fix their targets and signatures + for i in range(len(code)/4): + j = i*4 + if code[j] == ROPCODES['CALL']: + target = code[j+1] + sig = code[j+2] + if target not in call_sigs: call_sigs[target] = [] + sigs = call_sigs[target] + if sig not in sigs: sigs.append(sig) + code[j+1] = global_funcs[target] + code[j+2] = sigs.index(sig) + for i in range(len(lines)): line = lines[i] if line.startswith('function ') and '}' not in line: @@ -110,9 +124,10 @@ def make_emterpreter(t): curr = None if curr is not None: assert len(curr) % 4 == 0, curr - funcs[func] = len(code) + funcs[func] = len(all_code) # no operation here should change the length + process_code(curr) print >> sys.stderr, 'bytecode for %s:' % func, curr - code += curr + all_code += curr func = None lines[i] = '}' @@ -121,8 +136,8 @@ def make_emterpreter(t): mem_init.append(0) asm.staticbump += 1 code_start = len(mem_init) + 8 # 8 is GLOBAL_BASE -mem_init = mem_init + code -asm.staticbump += len(code) +mem_init = mem_init + all_code +asm.staticbump += len(all_code) while len(mem_init) % 8 != 0: mem_init.append(0) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index a382b31ce0d5c..3bd5de9a12f1a 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5673,7 +5673,7 @@ function emterpretify(ast) { actuals.push(reg[0]); sig += ASM_SIG[detectAsmCoercion(param, asmData)]; }); - ret.push(GLOBAL_FUNCS[node[1][1]]); + ret.push(node[1][1]); assert(sig.indexOf('u') < 0); // no undefined ret.push(sig); ret = ret.concat(actuals); From 06bc0e1deaf287ed79194c5adb17a2c6e4f2331d Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 18 Sep 2014 15:43:42 -0700 Subject: [PATCH 035/461] start to implement emterpreters --- tools/emterpretify.py | 43 +++++++++++++++++++++++++++++++++++-------- tools/js-optimizer.js | 2 ++ 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 1adbb18dc7cd4..96adc6aeeb1cd 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -9,24 +9,31 @@ import os, sys, re, json import asm_module, shared +# params + +EMT_STACK_MAX = 1024*1024 + # consts BLACKLIST = set(['_memcpy', '_memset', 'copyTempDouble', 'copyTempFloat', '_strlen', 'stackAlloc', 'setThrew', 'stackRestore', 'setTempRet0', 'getTempRet0', 'stackSave', 'runPostSets']) OPCODES = { # l, lx, ly etc - one of 256 locals - '0': 'SET', # [lx, ly, 0] lx = ly + '0': 'SET', # [lx, ly, 0] lx = ly (int or float, not double) '1': 'GETST', # [l, 0, 0] l = STACKTOP '2': 'SETST', # [l, 0, 0] STACKTOP = l - '3': 'SETI', # [l, vl, vh] l = v (16-bit) + '3': 'SETI', # [l, vl, vh] l = v (16-bit int) '253': 'CALL', # [target, sig, params..] target(params..) '254': 'RET', # [l, 0, 0] return l (depending on which emterpreter_x we are in, has the right type) - '255': 'FUNC', # [n, 0, 0] function with n locals + '255': 'FUNC', # [n, 0, 0] function with n locals (each taking 64 bits) } ROPCODES = {} for o in OPCODES: ROPCODES[OPCODES[o]] = int(o); +CASES = {} +CASES[ROPCODES['SET']] = 'HEAP32[sp + (lx << 3) >> 2] = HEAP32[sp + (ly << 3) >> 2];' + # utils settings = { 'PRECISE_F32': 0 } # TODO @@ -35,11 +42,28 @@ def make_emterpreter(t): return r''' function emterpret%s%s(pc) { pc = pc | 0; - // TODO: bump and check emtstack + var sp = 0, inst = 0, lx = 0, ly = 0, lz = 0; + sp = EMTSTACKTOP; + assert((HEAP8[pc>>0]|0) == %d); + EMTSTACKTOP = EMTSTACKTOP + (HEAP8[pc + 1 >> 0] << 3) | 0; + assert((EMTSTACKTOP|0) <= (EMT_STACK_MAX|0)); + while (1) { + inst = HEAP32[pc>>2]|0; + op = inst & 255; + lx = (inst >> 8) && 255; + ly = (inst >> 16) && 255; + lz = inst >>> 24; + switch (op) { +%s + default: assert(0); + } + } %s }''' % ( '_' if t != 'void' else '', '' if t == 'void' else t[0], + ROPCODES['CALL'], + '\n'.join([' case %d: %s break;' % (k, v) for k, v in CASES.iteritems()]), '' if t == 'void' else 'return %s;' % shared.JS.make_initializer(t[0], settings) ) @@ -54,10 +78,12 @@ def make_emterpreter(t): asm = asm_module.AsmModule(infile) global_funcs = {} +rglobal_funcs = {} global_id = 0 for k, v in asm.imports.iteritems(): if '|' not in v and '+' not in v and 'new ' not in v and '.0' not in v and v != '0': global_funcs[k] = global_id + rglobal_funcs[global_id] = k global_id += 1 lines = asm.funcs_js.split('\n') @@ -95,7 +121,8 @@ def make_emterpreter(t): asm.funcs_js = None func = None -# first pass, collect bytecode +# first pass, collect and process bytecode + call_sigs = {} # signatures appearing for each call target def process_code(code): # find CALL instructions and fix their targets and signatures @@ -143,7 +170,7 @@ def process_code(code): mem_init.append(0) asm.staticbump += 1 stack_start = len(mem_init) -asm.staticbump += 1024*1024 # 1MB default emterpreter stack TODO: customize +asm.staticbump += EMT_STACK_MAX open(out_mem_file, 'wb').write(''.join(map(chr, mem_init))) @@ -166,11 +193,11 @@ def process_code(code): lines = None # set up emterpreter stack top -asm.set_pre_js(js='var EMTSTACKTOP = STATIC_BASE + %s;' % (stack_start)) +asm.set_pre_js(js='var EMTSTACKTOP = STATIC_BASE + %s, EMT_STACK_MAX = EMTSTACKTOP + %d;' % (stack_start, EMT_STACK_MAX)) # send EMT vars into asm brace = asm.post_js.find(', {') + 3 -asm.post_js = asm.post_js[:brace] + ' "EMTSTACKTOP": EMTSTACKTOP, ' + asm.post_js[brace:] +asm.post_js = asm.post_js[:brace] + ' "EMTSTACKTOP": EMTSTACKTOP, "EMT_STACK_MAX": EMT_STACK_MAX, ' + asm.post_js[brace:] asm.imports_js += 'var EMTSTACKTOP = env.EMTSTACKTOP|0;\n' asm.write(outfile) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 3bd5de9a12f1a..b064cd7bd6dfc 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5706,6 +5706,8 @@ function emterpretify(ast) { return [ROPCODES['GETST'], locals[name], 0, 0]; } var reg = getReg(value); + var type = asmData.vars[name]; + assert(type !== ASM_DOUBLE); // TODO: SETD return reg[1].concat([ROPCODES['SET'], locals[name], releaseIfFree(reg[0]), 0]); } else { switch(name) { From d6cc0e26cedeb766c67a90169936437b4b2df396 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 18 Sep 2014 15:48:18 -0700 Subject: [PATCH 036/461] asm validation fixes --- tools/emterpretify.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 96adc6aeeb1cd..cf5dcdcb11d9f 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -42,18 +42,18 @@ def make_emterpreter(t): return r''' function emterpret%s%s(pc) { pc = pc | 0; - var sp = 0, inst = 0, lx = 0, ly = 0, lz = 0; + var sp = 0, inst = 0, op = 0, lx = 0, ly = 0, lz = 0; sp = EMTSTACKTOP; - assert((HEAP8[pc>>0]|0) == %d); + assert(((HEAP8[pc>>0]|0) == %d)|0); EMTSTACKTOP = EMTSTACKTOP + (HEAP8[pc + 1 >> 0] << 3) | 0; - assert((EMTSTACKTOP|0) <= (EMT_STACK_MAX|0)); + assert(((EMTSTACKTOP|0) <= (EMT_STACK_MAX|0))|0); while (1) { inst = HEAP32[pc>>2]|0; op = inst & 255; - lx = (inst >> 8) && 255; - ly = (inst >> 16) && 255; + lx = (inst >> 8) & 255; + ly = (inst >> 16) & 255; lz = inst >>> 24; - switch (op) { + switch (op|0) { %s default: assert(0); } @@ -198,7 +198,7 @@ def process_code(code): # send EMT vars into asm brace = asm.post_js.find(', {') + 3 asm.post_js = asm.post_js[:brace] + ' "EMTSTACKTOP": EMTSTACKTOP, "EMT_STACK_MAX": EMT_STACK_MAX, ' + asm.post_js[brace:] -asm.imports_js += 'var EMTSTACKTOP = env.EMTSTACKTOP|0;\n' +asm.imports_js += 'var EMTSTACKTOP = env.EMTSTACKTOP|0;\nvar EMT_STACK_MAX = env.EMT_STACK_MAX|0;\n' asm.write(outfile) From 051a4560d5ab0d02ec371634b095127e680609e9 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 18 Sep 2014 15:49:25 -0700 Subject: [PATCH 037/461] fixes; execution enters main loop --- tools/emterpretify.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index cf5dcdcb11d9f..89c1c1b573186 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -44,8 +44,9 @@ def make_emterpreter(t): pc = pc | 0; var sp = 0, inst = 0, op = 0, lx = 0, ly = 0, lz = 0; sp = EMTSTACKTOP; - assert(((HEAP8[pc>>0]|0) == %d)|0); + assert(((HEAPU8[pc>>0]>>>0) == %d)|0); EMTSTACKTOP = EMTSTACKTOP + (HEAP8[pc + 1 >> 0] << 3) | 0; + pc = pc + 4 | 0; assert(((EMTSTACKTOP|0) <= (EMT_STACK_MAX|0))|0); while (1) { inst = HEAP32[pc>>2]|0; @@ -53,7 +54,7 @@ def make_emterpreter(t): lx = (inst >> 8) & 255; ly = (inst >> 16) & 255; lz = inst >>> 24; - switch (op|0) { + switch (op>>>0) { %s default: assert(0); } @@ -62,7 +63,7 @@ def make_emterpreter(t): }''' % ( '_' if t != 'void' else '', '' if t == 'void' else t[0], - ROPCODES['CALL'], + ROPCODES['FUNC'], '\n'.join([' case %d: %s break;' % (k, v) for k, v in CASES.iteritems()]), '' if t == 'void' else 'return %s;' % shared.JS.make_initializer(t[0], settings) ) From 19d08749904446e3cc7ee4f2f61b2dc014afe155 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 18 Sep 2014 16:05:41 -0700 Subject: [PATCH 038/461] more opcodes --- tools/emterpretify.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 89c1c1b573186..d64748efaed5a 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -32,13 +32,25 @@ ROPCODES[OPCODES[o]] = int(o); CASES = {} -CASES[ROPCODES['SET']] = 'HEAP32[sp + (lx << 3) >> 2] = HEAP32[sp + (ly << 3) >> 2];' +CASES[ROPCODES['SET']] = 'HEAP32[sp + (lx << 3) >> 2] = HEAP32[sp + (ly << 3) >> 2]|0;' +CASES[ROPCODES['GETST']] = 'HEAP32[sp + (lx << 3) >> 2] = STACKTOP;' +CASES[ROPCODES['SETST']] = 'STACKTOP = HEAP32[sp + (lx << 3) >> 2]|0;' +CASES[ROPCODES['SETI']] = 'HEAP32[sp + (lx << 3) >> 2] = inst >>> 16;' +CASES[ROPCODES['CALL']] = 'assert(1111);' # utils settings = { 'PRECISE_F32': 0 } # TODO def make_emterpreter(t): + # return is specialized per interpreter + if t == 'void': + CASES[ROPCODES['RET']] = 'return;' + elif t == 'int': + CASES[ROPCODES['RET']] = 'return HEAP32[sp + (lx << 3) >> 2]|0;' + elif t == 'double': + CASES[ROPCODES['RET']] = 'return +HEAPF64[sp + (lx << 3) >> 3];' + return r''' function emterpret%s%s(pc) { pc = pc | 0; @@ -54,7 +66,7 @@ def make_emterpreter(t): lx = (inst >> 8) & 255; ly = (inst >> 16) & 255; lz = inst >>> 24; - switch (op>>>0) { + switch (op|0) { %s default: assert(0); } @@ -190,7 +202,7 @@ def process_code(code): lines[i] = lines[i].replace(call, '(%s)' % (funcs[func] + code_start)) # finalize funcs JS -asm.funcs_js = '\n'.join(['\n'.join(lines), make_emterpreter('void'), make_emterpreter('int'), make_emterpreter('double'), make_emterpreter('float')]) +asm.funcs_js = '\n'.join(['\n'.join(lines), make_emterpreter('void'), make_emterpreter('int'), make_emterpreter('double')]) lines = None # set up emterpreter stack top From 37340328821bd1a7ae652bb57bff2d6b8c082331 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 18 Sep 2014 16:06:56 -0700 Subject: [PATCH 039/461] advance pc --- tools/emterpretify.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index d64748efaed5a..fe3775dc8d3c7 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -66,10 +66,12 @@ def make_emterpreter(t): lx = (inst >> 8) & 255; ly = (inst >> 16) & 255; lz = inst >>> 24; + //printErr([pc, op, lx, ly, lz]); switch (op|0) { %s default: assert(0); } + pc = pc + 4 | 0; } %s }''' % ( From b925e29e08ba6c73615588ea4a669f3d0fd490f0 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 18 Sep 2014 16:10:17 -0700 Subject: [PATCH 040/461] fix call abort --- tools/emterpretify.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index fe3775dc8d3c7..accf68031d76c 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -36,7 +36,7 @@ CASES[ROPCODES['GETST']] = 'HEAP32[sp + (lx << 3) >> 2] = STACKTOP;' CASES[ROPCODES['SETST']] = 'STACKTOP = HEAP32[sp + (lx << 3) >> 2]|0;' CASES[ROPCODES['SETI']] = 'HEAP32[sp + (lx << 3) >> 2] = inst >>> 16;' -CASES[ROPCODES['CALL']] = 'assert(1111);' +CASES[ROPCODES['CALL']] = 'assert(0);' # utils From 32c5743cca60a1485a1f73b239903101befaac7f Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 18 Sep 2014 16:57:31 -0700 Subject: [PATCH 041/461] implement call; hello world passes --- tools/emterpretify.py | 42 +++++++++++++++++++++++++++++++++++++----- tools/js-optimizer.js | 1 + 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index accf68031d76c..88be5bebcdaf9 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -22,7 +22,7 @@ '1': 'GETST', # [l, 0, 0] l = STACKTOP '2': 'SETST', # [l, 0, 0] STACKTOP = l '3': 'SETI', # [l, vl, vh] l = v (16-bit int) - '253': 'CALL', # [target, sig, params..] target(params..) + '253': 'CALL', # [target, sig, params..] target(params..) # TODO: assign to a var, optionally '254': 'RET', # [l, 0, 0] return l (depending on which emterpreter_x we are in, has the right type) '255': 'FUNC', # [n, 0, 0] function with n locals (each taking 64 bits) } @@ -36,12 +36,27 @@ CASES[ROPCODES['GETST']] = 'HEAP32[sp + (lx << 3) >> 2] = STACKTOP;' CASES[ROPCODES['SETST']] = 'STACKTOP = HEAP32[sp + (lx << 3) >> 2]|0;' CASES[ROPCODES['SETI']] = 'HEAP32[sp + (lx << 3) >> 2] = inst >>> 16;' -CASES[ROPCODES['CALL']] = 'assert(0);' # utils settings = { 'PRECISE_F32': 0 } # TODO +def get_access(l, s='i'): + if s == 'i': + return 'HEAP32[sp + (' + l + ' << 3) >> 2]' + elif s == 'd': + return 'HEAPF64[sp + (' + l + ' << 3) >> 3]' + else: + assert 0 + +def get_coerced_access(l, s='i'): + if s == 'i': + return get_access(l, s) + '|0' + elif s == 'd': + return '+' + get_access(l, s) + else: + assert 0 + def make_emterpreter(t): # return is specialized per interpreter if t == 'void': @@ -51,10 +66,28 @@ def make_emterpreter(t): elif t == 'double': CASES[ROPCODES['RET']] = 'return +HEAPF64[sp + (lx << 3) >> 3];' + # call is generated using information of actual call patterns + if ROPCODES['CALL'] not in CASES: + #print >> sys.stderr, call_sigs + def make_target_call(i): + name = rglobal_funcs[i] + if name not in call_sigs: return None + sigs = call_sigs[name] + assert len(sigs) == 1 + sig = sigs[0] + ret = ' ' + name + '(' + ', '.join([get_coerced_access('HEAP8[pc+%d>>0]' % (i+3)) for i in range(len(sig)-1)]) + ')' + assert sig[0] == 'v' # if sig[0] != 'v': ret = get_access(.. + return ret + '; break;' + + CASES[ROPCODES['CALL']] = 'switch (lx|0) {\n' + \ + '\n'.join(filter(lambda x: 'None' not in x, [' case %d: {\n%s\n }' % (i, make_target_call(i)) for i in range(global_id-1)])) + \ + '\n default: assert(0);' + \ + '\n }' + return r''' function emterpret%s%s(pc) { pc = pc | 0; - var sp = 0, inst = 0, op = 0, lx = 0, ly = 0, lz = 0; + var sp = 0, inst = 0, lx = 0, ly = 0, lz = 0; sp = EMTSTACKTOP; assert(((HEAPU8[pc>>0]>>>0) == %d)|0); EMTSTACKTOP = EMTSTACKTOP + (HEAP8[pc + 1 >> 0] << 3) | 0; @@ -62,12 +95,11 @@ def make_emterpreter(t): assert(((EMTSTACKTOP|0) <= (EMT_STACK_MAX|0))|0); while (1) { inst = HEAP32[pc>>2]|0; - op = inst & 255; lx = (inst >> 8) & 255; ly = (inst >> 16) & 255; lz = inst >>> 24; //printErr([pc, op, lx, ly, lz]); - switch (op|0) { + switch (inst&255) { %s default: assert(0); } diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index b064cd7bd6dfc..f925fbb6213d9 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5659,6 +5659,7 @@ function emterpretify(ast) { } function makeCall(node, type) { + // TODO: specialize calls like imul assert(node[0] === 'call'); assert(type === ASM_NONE); if (node[1][0] === 'name') { From 719991755eb4e20aaf6f6873d63c4ac777cad565 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 19 Sep 2014 15:54:07 -0700 Subject: [PATCH 042/461] unify getReg and walk --- tools/js-optimizer.js | 106 +++++++++++++++++++++--------------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index f925fbb6213d9..38c1fbb4a215c 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5606,7 +5606,7 @@ function emterpretify(ast) { function verifyCode(code) { if (code.length % 4 !== 0) assert(0, JSON.stringify(code)); - for (var i = 0; i < code.length; i++) if (code[i] === undefined || code[i] === null) assert(0, i + ' : ' + JSON.stringify(code)); + for (var i = 0; i < code.length; i++) if (code[i] === undefined || code[i] === null || code < 0 || code > 255) assert(0, i + ' : ' + JSON.stringify(code)); } function walkFunction(func) { @@ -5628,9 +5628,10 @@ function emterpretify(ast) { freeLocals.push(l); } - // returns [l, bytecode] where l is a local register, and bytecode is bytecode to generate it - // you *must* call releaseIfFree on the l that is returned; if it is a free local, that will free it - function getReg(node) { + // returns [l, bytecode] where l is a local register, and bytecode is bytecode to generate it. + // if dropIt is provided, then the output of this can just be dropped. + // you *must* call releaseIfFree on the l that is returned; if it is a free local, that will free it. + function getReg(node, dropIt) { printErr('getReg ' + JSON.stringify(node)); switch(node[0]) { case 'name': { @@ -5650,49 +5651,12 @@ function emterpretify(ast) { throw 'todo: big nums'; } } - default: throw 'getReg wha? ' + node[0]; - } - } - function releaseIfFree(l) { - if (l >= numLocals) releaseFree(l); - return l; - } - - function makeCall(node, type) { - // TODO: specialize calls like imul - assert(node[0] === 'call'); - assert(type === ASM_NONE); - if (node[1][0] === 'name') { - // normal direct call - var ret = [ROPCODES[TYPE_TO_CALL[type]]]; - assert(ret[0], type); - var actuals = []; - var sig = ASM_SIG[type]; - node[2].forEach(function(param) { - var reg = getReg(param); - ret = reg[1].concat(ret); - actuals.push(reg[0]); - sig += ASM_SIG[detectAsmCoercion(param, asmData)]; - }); - ret.push(node[1][1]); - assert(sig.indexOf('u') < 0); // no undefined - ret.push(sig); - ret = ret.concat(actuals); - actuals.forEach(releaseIfFree); - while (ret.length % 4 !== 0) ret.push(0); - return ret; - } else { - throw 'todo: function pointer call'; - } - } - - function walk(node) { - printErr('walk ' + JSON.stringify(node)); - if (!node) return []; - switch(node[0]) { case 'var': - case 'toplevel': return []; // empty node - case 'stat': return walk(node[1]); + case 'toplevel': { + assert(dropIt); + return [-1, []]; // empty node + } + case 'stat': return getReg(node[1], dropIt); case 'assign': { assert(node[1] === true); var target = node[2]; @@ -5704,17 +5668,17 @@ function emterpretify(ast) { // local if (value[0] === 'name' && value[1] === 'STACKTOP') { // special-case the common STACKTOP load - return [ROPCODES['GETST'], locals[name], 0, 0]; + return [locals[name], [ROPCODES['GETST'], locals[name], 0, 0]]; } var reg = getReg(value); var type = asmData.vars[name]; assert(type !== ASM_DOUBLE); // TODO: SETD - return reg[1].concat([ROPCODES['SET'], locals[name], releaseIfFree(reg[0]), 0]); + return [locals[name], reg[1].concat([ROPCODES['SET'], locals[name], releaseIfFree(reg[0]), 0])]; } else { switch(name) { case 'STACKTOP': { var reg = getReg(value); - return reg[1].concat([ROPCODES['SETST'], releaseIfFree(reg[0]), 0, 0]); + return [-1, reg[1].concat([ROPCODES['SETST'], releaseIfFree(reg[0]), 0, 0])]; } default: throw 'assign global wha? ' + name; } @@ -5727,7 +5691,8 @@ function emterpretify(ast) { case 'binary': { if (node[1] === '|' && node[2][0] === 'call' && node[3][0] === 'num' && node[3][1] === 0) { // function call with dropped result - return makeCall(node[2], ASM_NONE); + assert(dropIt); + return [-1, makeCall(node[2], ASM_NONE)]; } throw 'todo'; } @@ -5740,20 +5705,55 @@ function emterpretify(ast) { } } case 'return': { + assert(dropIt); var value = node[1]; var reg; if (value) reg = getReg(value); else reg = [0, []]; - return reg[1].concat([ROPCODES['RET'], value ? releaseIfFree(reg[0]) : 0, 0, 0]); + return [-1, reg[1].concat([ROPCODES['RET'], value ? releaseIfFree(reg[0]) : 0, 0, 0])]; } - default: throw 'wha? ' + node[0]; + default: throw 'getReg wha? ' + node[0]; + } + } + function releaseIfFree(l) { + if (l >= numLocals) releaseFree(l); + return l; + } + + function makeCall(node, type) { + // TODO: specialize calls like imul + assert(node[0] === 'call'); + assert(type === ASM_NONE); + if (node[1][0] === 'name') { + // normal direct call + var ret = [ROPCODES[TYPE_TO_CALL[type]]]; + assert(ret[0], type); + var actuals = []; + var sig = ASM_SIG[type]; + node[2].forEach(function(param) { + var reg = getReg(param); + ret = reg[1].concat(ret); + actuals.push(reg[0]); + sig += ASM_SIG[detectAsmCoercion(param, asmData)]; + }); + ret.push(node[1][1]); + assert(sig.indexOf('u') < 0); // no undefined + ret.push(sig); + ret = ret.concat(actuals); + actuals.forEach(releaseIfFree); + while (ret.length % 4 !== 0) ret.push(0); + return ret; + } else { + throw 'todo: function pointer call'; } } + function walkStatements(stats) { if (!stats) return []; var ret = []; stats.forEach(function(stat) { - var curr = walk(stat); + var curr = getReg(stat, true)[1]; + printErr('stat: ' + JSON.stringify(curr)); verifyCode(curr); ret = ret.concat(curr); }); From 1cdd9b2155ee8e9fb5ae35c4ee00cf6c11766ea5 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 19 Sep 2014 16:01:48 -0700 Subject: [PATCH 043/461] add breaking test --- tests/test_other.py | 29 ++++++++++++++++------------- tools/js-optimizer.js | 2 ++ 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/tests/test_other.py b/tests/test_other.py index 72e122b769c7f..f8e40521cd992 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4105,17 +4105,20 @@ def test_stat_fail_alongtheway(self): def test_emterpreter(self): - try: # avoid libc for now XXX - os.environ['EMCC_FORCE_STDLIBS'] = '' - os.environ['EMCC_ONLY_FORCED_STDLIBS'] = '1' - Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world.c'), '-O2', '--profiling', '-s', 'FINALIZE_ASM_JS=0']).communicate() - finally: - del os.environ['EMCC_FORCE_STDLIBS'] - del os.environ['EMCC_ONLY_FORCED_STDLIBS'] - Popen([PYTHON, path_from_root('tools', 'emterpretify.py'), 'a.out.js', 'em.out.js']).communicate() - self.assertContained('hello, world!', run_js('a.out.js')) - self.assertContained('hello, world!', run_js('em.out.js')) - out = run_js('em.out.js', engine=SPIDERMONKEY_ENGINE, stderr=PIPE, full_output=True) - self.assertContained('hello, world!', out) - self.validate_asmjs(out) + for source in ['hello_world.c', 'hello_world_loop.cpp']: + print source + self.clear() + try: # avoid libc for now XXX + os.environ['EMCC_FORCE_STDLIBS'] = '' + os.environ['EMCC_ONLY_FORCED_STDLIBS'] = '1' + Popen([PYTHON, EMCC, path_from_root('tests', source), '-O2', '--profiling', '-s', 'FINALIZE_ASM_JS=0']).communicate() + finally: + del os.environ['EMCC_FORCE_STDLIBS'] + del os.environ['EMCC_ONLY_FORCED_STDLIBS'] + Popen([PYTHON, path_from_root('tools', 'emterpretify.py'), 'a.out.js', 'em.out.js']).communicate() + self.assertContained('hello, world!', run_js('a.out.js')) + self.assertContained('hello, world!', run_js('em.out.js')) + out = run_js('em.out.js', engine=SPIDERMONKEY_ENGINE, stderr=PIPE, full_output=True) + self.assertContained('hello, world!', out) + self.validate_asmjs(out) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 38c1fbb4a215c..cbcf8f98180b2 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5767,6 +5767,8 @@ function emterpretify(ast) { return; } + printErr('emterpretifying ' + func[1]); + var asmData = normalizeAsm(func); var locals = {}; From c88767b33bd163cc4aabbbf457811c53e14fe247 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 19 Sep 2014 16:23:45 -0700 Subject: [PATCH 044/461] add opcode, and utilities to reuse free locals efficiently --- tools/emterpretify.py | 1 + tools/js-optimizer.js | 37 +++++++++++++++++++++++++++++++------ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 88be5bebcdaf9..93b6a23461d63 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -22,6 +22,7 @@ '1': 'GETST', # [l, 0, 0] l = STACKTOP '2': 'SETST', # [l, 0, 0] STACKTOP = l '3': 'SETI', # [l, vl, vh] l = v (16-bit int) + '4': 'ADD', # [lx, ly, lz] lx = ly + lz (32-bit int) '253': 'CALL', # [target, sig, params..] target(params..) # TODO: assign to a var, optionally '254': 'RET', # [l, 0, 0] return l (depending on which emterpreter_x we are in, has the right type) '255': 'FUNC', # [n, 0, 0] function with n locals (each taking 64 bits) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index cbcf8f98180b2..309c855ce0a9d 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5618,13 +5618,21 @@ function emterpretify(ast) { // 'free' locals are ones above the set of actual local vars in the asm.js method. // you *must* free that local by calling releaseFree on it, which implies you must call // releaseIfFree on anything returned by getReg - function getFree() { + // if possible1 or possible2 are passed in, and they are free, they will be reused. this should + // be done when they are free variables in use right now, but will become free in time to become + // the free variable we need here (e.g. y = y + z, no need for a new x to assign into). this can + // then be passed as a second argument to releaseFree. + function getFree(possible1, possible2) { + if (possible1 >= numLocals) return possible1; // (undefined >= any number is false) + if (possible2 >= numLocals) return possible2; assert(freeLocals.length > 0); var ret = freeLocals.pop(); maxLocal = Math.max(maxLocal, ret); return ret; } - function releaseFree(l) { + // if possible is passed in, and is identical to l, then it means l was reused, and we must not free it + function releaseFree(l, possible) { + if (l === possible) return; freeLocals.push(l); } @@ -5689,10 +5697,27 @@ function emterpretify(ast) { } else throw 'assign wha? ' + target[0]; } case 'binary': { - if (node[1] === '|' && node[2][0] === 'call' && node[3][0] === 'num' && node[3][1] === 0) { - // function call with dropped result - assert(dropIt); - return [-1, makeCall(node[2], ASM_NONE)]; + if (node[1] === '|' && node[3][0] === 'num' && node[3][1] === 0) { + var inner = node[2]; + switch (inner[0]) { + case 'binary': { + switch (inner[1]) { + case '+': { + var y = getReg(inner[2]); + var z = getReg(inner[3]); + assert(!dropIt); + var x = getFree(y[0], z[0]); + return [x, y[1].concat(z[1]).concat([ROPCODES['ADD'], x, releaseIfFree(y[0], x), releaseIfFree(z[0], x)])]; + } + } + } + case 'call': { + // function call with dropped result + assert(dropIt); + return [-1, makeCall(inner, ASM_NONE)]; + } + default: throw 'ehh'; + } } throw 'todo'; } From dc7a77ee475d1be3eddb83052ee925e8d9d43aed Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 19 Sep 2014 16:25:40 -0700 Subject: [PATCH 045/461] use GETST to get the value of STACKTOP when in a free name --- tools/js-optimizer.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 309c855ce0a9d..faba93ed388fc 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5647,6 +5647,10 @@ function emterpretify(ast) { if (name in locals) return [locals[name], []]; // this is a global switch(name) { + case 'STACKTOP': { + var x = getFree(); + return [x, [ROPCODES['GETST'], x, 0, 0]]; + } default: throw 'getReg global wha? ' + name; } } From 04fab79992238a0b3e5c04dca910a70194554554 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 19 Sep 2014 16:32:45 -0700 Subject: [PATCH 046/461] code cleanup --- tests/test_other.py | 1 + tools/js-optimizer.js | 5 +---- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/test_other.py b/tests/test_other.py index f8e40521cd992..14963187e0f37 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4106,6 +4106,7 @@ def test_stat_fail_alongtheway(self): def test_emterpreter(self): for source in ['hello_world.c', 'hello_world_loop.cpp']: + print print source self.clear() try: # avoid libc for now XXX diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index faba93ed388fc..54acb981ec691 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5670,6 +5670,7 @@ function emterpretify(ast) { } case 'stat': return getReg(node[1], dropIt); case 'assign': { + assert(dropIt); assert(node[1] === true); var target = node[2]; var value = node[3]; @@ -5678,10 +5679,6 @@ function emterpretify(ast) { var name = target[1]; if (name in locals) { // local - if (value[0] === 'name' && value[1] === 'STACKTOP') { - // special-case the common STACKTOP load - return [locals[name], [ROPCODES['GETST'], locals[name], 0, 0]]; - } var reg = getReg(value); var type = asmData.vars[name]; assert(type !== ASM_DOUBLE); // TODO: SETD From 4d78a14500ed15ee1e8473587e8a047add87d859 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 19 Sep 2014 16:56:33 -0700 Subject: [PATCH 047/461] store32 --- tools/emterpretify.py | 17 +++++++++-------- tools/js-optimizer.js | 18 +++++++++++++++++- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 93b6a23461d63..e71611c7b246b 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -18,14 +18,15 @@ BLACKLIST = set(['_memcpy', '_memset', 'copyTempDouble', 'copyTempFloat', '_strlen', 'stackAlloc', 'setThrew', 'stackRestore', 'setTempRet0', 'getTempRet0', 'stackSave', 'runPostSets']) OPCODES = { # l, lx, ly etc - one of 256 locals - '0': 'SET', # [lx, ly, 0] lx = ly (int or float, not double) - '1': 'GETST', # [l, 0, 0] l = STACKTOP - '2': 'SETST', # [l, 0, 0] STACKTOP = l - '3': 'SETI', # [l, vl, vh] l = v (16-bit int) - '4': 'ADD', # [lx, ly, lz] lx = ly + lz (32-bit int) - '253': 'CALL', # [target, sig, params..] target(params..) # TODO: assign to a var, optionally - '254': 'RET', # [l, 0, 0] return l (depending on which emterpreter_x we are in, has the right type) - '255': 'FUNC', # [n, 0, 0] function with n locals (each taking 64 bits) + '0': 'SET', # [lx, ly, 0] lx = ly (int or float, not double) + '1': 'GETST', # [l, 0, 0] l = STACKTOP + '2': 'SETST', # [l, 0, 0] STACKTOP = l + '3': 'SETI', # [l, vl, vh] l = v (16-bit int) + '4': 'ADD', # [lx, ly, lz] lx = ly + lz (32-bit int) + '5': 'STORE32', # [lx, ly, 0] HEAP32[lx >> 2] = ly + '253': 'CALL', # [target, sig, params..] target(params..) # TODO: assign to a var, optionally + '254': 'RET', # [l, 0, 0] return l (depending on which emterpreter_x we are in, has the right type) + '255': 'FUNC', # [n, 0, 0] function with n locals (each taking 64 bits) } ROPCODES = {} diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 54acb981ec691..fd28bc32a8a8b 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5682,6 +5682,7 @@ function emterpretify(ast) { var reg = getReg(value); var type = asmData.vars[name]; assert(type !== ASM_DOUBLE); // TODO: SETD + // TODO: detect when the last operation in reg[1] assigns in its arg x, in which case we can avoid the SET and make it assign to us return [locals[name], reg[1].concat([ROPCODES['SET'], locals[name], releaseIfFree(reg[0]), 0])]; } else { switch(name) { @@ -5694,7 +5695,22 @@ function emterpretify(ast) { } } else if (target[0] === 'sub') { // assign to memory - throw 'todo'; + assert(target[1][0] === 'name'); + assert(target[2][0] === 'binary' && target[2][1] === '>>' && target[2][3][0] === 'num'); + var shifts = target[2][3][1]; + var x = getReg(target[2][2]); + var y = getReg(value); + var opcode; + switch(shifts) { + case 2: { + var type = detectAsmCoercion(value, asmData); + assert(type === ASM_INT); + opcode = 'STORE32'; + break; + } + default: throw 'todo'; + } + return [-1, x[1].concat(y[1]).concat([ROPCODES[opcode], releaseIfFree(x[0]), releaseIfFree(y[0]), 0])]; } else throw 'assign wha? ' + target[0]; } case 'binary': { From 588cfebf0d051ba8de6e727731a6444d6d622240 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 12:40:07 -0700 Subject: [PATCH 048/461] start to handle control flow, and some refactoring --- tools/emterpretify.py | 16 +++++++---- tools/js-optimizer.js | 64 +++++++++++++++++++++++++++++++++++++------ 2 files changed, 66 insertions(+), 14 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index e71611c7b246b..8d304d046f0df 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -24,6 +24,7 @@ '3': 'SETI', # [l, vl, vh] l = v (16-bit int) '4': 'ADD', # [lx, ly, lz] lx = ly + lz (32-bit int) '5': 'STORE32', # [lx, ly, 0] HEAP32[lx >> 2] = ly + '6': 'BRT', # [cond, tl, th] if cond, jump t instructions (multiple of 4) '253': 'CALL', # [target, sig, params..] target(params..) # TODO: assign to a var, optionally '254': 'RET', # [l, 0, 0] return l (depending on which emterpreter_x we are in, has the right type) '255': 'FUNC', # [n, 0, 0] function with n locals (each taking 64 bits) @@ -33,12 +34,6 @@ for o in OPCODES: ROPCODES[OPCODES[o]] = int(o); -CASES = {} -CASES[ROPCODES['SET']] = 'HEAP32[sp + (lx << 3) >> 2] = HEAP32[sp + (ly << 3) >> 2]|0;' -CASES[ROPCODES['GETST']] = 'HEAP32[sp + (lx << 3) >> 2] = STACKTOP;' -CASES[ROPCODES['SETST']] = 'STACKTOP = HEAP32[sp + (lx << 3) >> 2]|0;' -CASES[ROPCODES['SETI']] = 'HEAP32[sp + (lx << 3) >> 2] = inst >>> 16;' - # utils settings = { 'PRECISE_F32': 0 } # TODO @@ -59,6 +54,15 @@ def get_coerced_access(l, s='i'): else: assert 0 +CASES = {} +CASES[ROPCODES['SET']] = get_access('lx') + ' = ' + get_coerced_access('ly') + ';' +CASES[ROPCODES['GETST']] = 'HEAP32[sp + (lx << 3) >> 2] = STACKTOP;' +CASES[ROPCODES['SETST']] = 'STACKTOP = HEAP32[sp + (lx << 3) >> 2]|0;' +CASES[ROPCODES['SETI']] = 'HEAP32[sp + (lx << 3) >> 2] = inst >>> 16;' +CASES[ROPCODES['ADD']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') | 0;' +CASES[ROPCODES['STORE32']] = 'HEAP32[' + get_access('lx') + ' >> 2] = ' + get_coerced_access('ly') + ';'; +CASES[ROPCODES['BRT']] = 'if (' + get_coerced_access('lx') + ') { pc = pc + ((inst >> 16) << 2) | 0; continue; }' + def make_emterpreter(t): # return is specialized per interpreter if t == 'void': diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index fd28bc32a8a8b..63aa571dc4ace 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5636,6 +5636,12 @@ function emterpretify(ast) { freeLocals.push(l); } + var markerId = 0; + var breakStack = []; + var continueStack = []; + var breakLabels = {}; + var continueLabels = {}; + // returns [l, bytecode] where l is a local register, and bytecode is bytecode to generate it. // if dropIt is provided, then the output of this can just be dropped. // you *must* call releaseIfFree on the l that is returned; if it is a free local, that will free it. @@ -5754,6 +5760,19 @@ function emterpretify(ast) { else reg = [0, []]; return [-1, reg[1].concat([ROPCODES['RET'], value ? releaseIfFree(reg[0]) : 0, 0, 0])]; } + case 'do': { + var top = markerId++, cond = markerId++, exit = markerId++; + breakStack.push(exit); + continueStack.push(cond); + // TODO: labels + var body = walkStatements(node[2]); + breakStack.pop(); + continueStack.pop(); + var condition = getReg(node[1]); + return ['marker', top, 0, 0].concat(body).concat(['marker', cond, 0, 0]).concat(condition).concat( + [ROPCODES['BRT'], releaseIfFree(condition[0]), top, 0, 'marker', exit, 0, 0] + ); + } default: throw 'getReg wha? ' + node[0]; } } @@ -5792,6 +5811,7 @@ function emterpretify(ast) { function walkStatements(stats) { if (!stats) return []; + if (stats[0] === 'block') stats = stats[1]; var ret = []; stats.forEach(function(stat) { var curr = getReg(stat, true)[1]; @@ -5802,6 +5822,31 @@ function emterpretify(ast) { return ret; } + function finalizeJumps(code) { + assert(code.length / 4 < 32768); // our jumps are 16-bit offsets + // first pass, finalize markers. after this, every instruction is in its absolute location + var markers = {}; + for (var i = 0; i < code.length; i += 4) { + if (code[i] === 'marker') { + markers[code[i+1]] = i; + code.splice(i, 4); + i -= 4; + } + } + // second pass, finalize jumps + for (var i = 0; i < code.length; i += 4) { + if (code[i] === ROPCODES['BRT']) { + var target = markers[code[i+2]]; + var offset = target - i; + assert(offset % 4 === 0); + offset >> 2; + assert(Math.abs(offset) < 32768); + code[i+2] = offset & 255; + code[i+3] = (offset >> 8) & 255; + } + } + } + // walkFunction main if (func[1] in BLACKLIST) { @@ -5864,17 +5909,20 @@ function emterpretify(ast) { } // walk all the function to emit bytecode, and add a final ret - var data = walkStatements(stats); - assert(data.length % 4 === 0); - if (data.length < 4 || data[data.length-4] != ROPCODES['RET']) { - data = data.concat([ROPCODES['RET'], 0, 0, 0]); // final ret for the function + var code = walkStatements(stats); + assert(code.length % 4 === 0); + if (code.length < 4 || code[code.length-4] != ROPCODES['RET']) { + code = code.concat([ROPCODES['RET'], 0, 0, 0]); // final ret for the function } assert(maxLocal <= 256); - data = [ROPCODES['FUNC'], maxLocal+1, 0, 0].concat(data); - verifyCode(data); - //printErr(JSON.stringify(data)); + code = [ROPCODES['FUNC'], maxLocal+1, 0, 0].concat(code); + verifyCode(code); + + finalizeJumps(code); + + //printErr(JSON.stringify(code)); - print(astToSrc(func) + ' //' + JSON.stringify(data) + ''); + print(astToSrc(func) + ' //' + JSON.stringify(code) + ''); } traverseGeneratedFunctions(ast, walkFunction); } From 2549dc5a3634c05ac03d4f4633c3f26600710248 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 12:56:53 -0700 Subject: [PATCH 049/461] more math --- tools/js-optimizer.js | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 63aa571dc4ace..f0370a973cab8 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5726,13 +5726,12 @@ function emterpretify(ast) { case 'binary': { switch (inner[1]) { case '+': { - var y = getReg(inner[2]); - var z = getReg(inner[3]); assert(!dropIt); - var x = getFree(y[0], z[0]); - return [x, y[1].concat(z[1]).concat([ROPCODES['ADD'], x, releaseIfFree(y[0], x), releaseIfFree(z[0], x)])]; + return makeMath(inner, ASM_INT); } + default: throw 'wha'; } + break; } case 'call': { // function call with dropped result @@ -5742,6 +5741,16 @@ function emterpretify(ast) { default: throw 'ehh'; } } + switch (node[1]) { + case '+': { + var type1 = detectAsmCoercion(node[2], asmData); + var type2 = detectAsmCoercion(node[3], asmData); + assert(type1 === type2 && type1 !== ASM_NONE); + assert(!dropIt); + return makeMath(node, type1); + } + default: throw 'ehh'; + } throw 'todo'; } case 'call': { @@ -5781,6 +5790,19 @@ function emterpretify(ast) { return l; } + function makeMath(node, type) { + assert(type === ASM_INT); + var opcode; + switch(node[1]) { + case '+': opcode = 'ADD'; break; + default: throw 'bad'; + } + var y = getReg(node[2]); + var z = getReg(node[3]); + var x = getFree(y[0], z[0]); + return [x, y[1].concat(z[1]).concat([ROPCODES[opcode], x, releaseIfFree(y[0], x), releaseIfFree(z[0], x)])]; + } + function makeCall(node, type) { // TODO: specialize calls like imul assert(node[0] === 'call'); From 039b65bfe2bb75693d856f552b949ab9d69b23fb Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 13:26:47 -0700 Subject: [PATCH 050/461] div --- tools/emterpretify.py | 15 +++++++++++---- tools/js-optimizer.js | 17 ++++++++++++++++- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 8d304d046f0df..ebe396e46a028 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -23,8 +23,10 @@ '2': 'SETST', # [l, 0, 0] STACKTOP = l '3': 'SETI', # [l, vl, vh] l = v (16-bit int) '4': 'ADD', # [lx, ly, lz] lx = ly + lz (32-bit int) - '5': 'STORE32', # [lx, ly, 0] HEAP32[lx >> 2] = ly - '6': 'BRT', # [cond, tl, th] if cond, jump t instructions (multiple of 4) + '7': 'SDIV', # [lx, ly, lz] lx = ly / lz (32-bit signed int) + '8': 'UDIV', # [lx, ly, lz] lx = ly / lz (32-bit unsigned int) + '15': 'STORE32', # [lx, ly, 0] HEAP32[lx >> 2] = ly + '16': 'BRT', # [cond, tl, th] if cond, jump t instructions (multiple of 4) '253': 'CALL', # [target, sig, params..] target(params..) # TODO: assign to a var, optionally '254': 'RET', # [l, 0, 0] return l (depending on which emterpreter_x we are in, has the right type) '255': 'FUNC', # [n, 0, 0] function with n locals (each taking 64 bits) @@ -46,9 +48,12 @@ def get_access(l, s='i'): else: assert 0 -def get_coerced_access(l, s='i'): +def get_coerced_access(l, s='i', unsigned=False): if s == 'i': - return get_access(l, s) + '|0' + if not unsigned: + return get_access(l, s) + '|0' + else: + return get_access(l, s) + '>>>0' elif s == 'd': return '+' + get_access(l, s) else: @@ -60,6 +65,8 @@ def get_coerced_access(l, s='i'): CASES[ROPCODES['SETST']] = 'STACKTOP = HEAP32[sp + (lx << 3) >> 2]|0;' CASES[ROPCODES['SETI']] = 'HEAP32[sp + (lx << 3) >> 2] = inst >>> 16;' CASES[ROPCODES['ADD']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') | 0;' +CASES[ROPCODES['SDIV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') / (' + get_coerced_access('lz') + ') | 0;' +CASES[ROPCODES['UDIV']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') / (' + get_coerced_access('lz', unsigned=True) + ') >>> 0;' CASES[ROPCODES['STORE32']] = 'HEAP32[' + get_access('lx') + ' >> 2] = ' + get_coerced_access('ly') + ';'; CASES[ROPCODES['BRT']] = 'if (' + get_coerced_access('lx') + ') { pc = pc + ((inst >> 16) << 2) | 0; continue; }' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index f0370a973cab8..f330b6ec40b63 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5721,11 +5721,12 @@ function emterpretify(ast) { } case 'binary': { if (node[1] === '|' && node[3][0] === 'num' && node[3][1] === 0) { + // int-coerced operation var inner = node[2]; switch (inner[0]) { case 'binary': { switch (inner[1]) { - case '+': { + case '+': case '/': { assert(!dropIt); return makeMath(inner, ASM_INT); } @@ -5738,6 +5739,11 @@ function emterpretify(ast) { assert(dropIt); return [-1, makeCall(inner, ASM_NONE)]; } + case 'name': { + var name = inner[1]; + assert(asmData.vars[name] === ASM_INT); + return [locals[name], []]; + } default: throw 'ehh'; } } @@ -5795,6 +5801,15 @@ function emterpretify(ast) { var opcode; switch(node[1]) { case '+': opcode = 'ADD'; break; + case '/': { + assert(node[2][0] === 'binary'); + switch(node[2][1]) { + case '|': opcode = 'SDIV'; break; + case '>>>': opcode = 'UDIV'; break; + default: throw 'argh'; + } + break; + } default: throw 'bad'; } var y = getReg(node[2]); From 1f41682986b2bac9e5caefb83cf2f248eb574b34 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 13:47:10 -0700 Subject: [PATCH 051/461] load --- tools/emterpretify.py | 10 ++++++++-- tools/js-optimizer.js | 11 +++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index ebe396e46a028..2c49b2790944e 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -23,8 +23,11 @@ '2': 'SETST', # [l, 0, 0] STACKTOP = l '3': 'SETI', # [l, vl, vh] l = v (16-bit int) '4': 'ADD', # [lx, ly, lz] lx = ly + lz (32-bit int) - '7': 'SDIV', # [lx, ly, lz] lx = ly / lz (32-bit signed int) - '8': 'UDIV', # [lx, ly, lz] lx = ly / lz (32-bit unsigned int) + '7': 'SDIV', # [lx, ly, lz] lx = ly / lz (32-bit signed int) + '8': 'UDIV', # [lx, ly, lz] lx = ly / lz (32-bit unsigned int) + '10': 'LOAD8', # [lx, ly, 0] lx = HEAP8[ly >> 0] + '11': 'LOAD16', # [lx, ly, 0] lx = HEAP16[ly >> 1] + '12': 'LOAD32', # [lx, ly, 0] lx = HEAP32[ly >> 2] '15': 'STORE32', # [lx, ly, 0] HEAP32[lx >> 2] = ly '16': 'BRT', # [cond, tl, th] if cond, jump t instructions (multiple of 4) '253': 'CALL', # [target, sig, params..] target(params..) # TODO: assign to a var, optionally @@ -67,6 +70,9 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['ADD']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['SDIV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') / (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['UDIV']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') / (' + get_coerced_access('lz', unsigned=True) + ') >>> 0;' +CASES[ROPCODES['LOAD8']] = get_access('lx') + ' = ' + 'HEAP8[' + get_access('ly') + ' >> 0];' +CASES[ROPCODES['LOAD16']] = get_access('lx') + ' = ' + 'HEAP16[' + get_access('ly') + ' >> 1];' +CASES[ROPCODES['LOAD32']] = get_access('lx') + ' = ' + 'HEAP32[' + get_access('ly') + ' >> 2];' CASES[ROPCODES['STORE32']] = 'HEAP32[' + get_access('lx') + ' >> 2] = ' + get_coerced_access('ly') + ';'; CASES[ROPCODES['BRT']] = 'if (' + get_coerced_access('lx') + ') { pc = pc + ((inst >> 16) << 2) | 0; continue; }' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index f330b6ec40b63..7730ccbdf6fb2 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5744,6 +5744,17 @@ function emterpretify(ast) { assert(asmData.vars[name] === ASM_INT); return [locals[name], []]; } + case 'sub': { + assert(inner[1][0] === 'name'); + // coerced heap access => a load + assert(inner[2][0] === 'binary' && inner[2][1] === '>>' && inner[2][3][0] === 'num'); + var shifts = inner[2][3][1]; + assert(shifts >= 0 && shifts <= 2); + var opcode = 'LOAD' + (Math.pow(2, shifts)*8); + var y = getReg(inner[2][2]); + var x = getFree(y[0]); + return [x, y[1].concat([ROPCODES[opcode], releaseIfFree(y[0], x), 0])]; + } default: throw 'ehh'; } } From 67791d6b1bf30a59ee5aec95ef3570ffc8c9f61a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 13:48:53 -0700 Subject: [PATCH 052/461] store8, 16 --- tools/emterpretify.py | 4 ++++ tools/js-optimizer.js | 1 + 2 files changed, 5 insertions(+) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 2c49b2790944e..22bc6a4b8762e 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -28,6 +28,8 @@ '10': 'LOAD8', # [lx, ly, 0] lx = HEAP8[ly >> 0] '11': 'LOAD16', # [lx, ly, 0] lx = HEAP16[ly >> 1] '12': 'LOAD32', # [lx, ly, 0] lx = HEAP32[ly >> 2] + '13': 'STORE8', # [lx, ly, 0] HEAP8[lx >> 2] = ly + '14': 'STORE16', # [lx, ly, 0] HEAP16[lx >> 2] = ly '15': 'STORE32', # [lx, ly, 0] HEAP32[lx >> 2] = ly '16': 'BRT', # [cond, tl, th] if cond, jump t instructions (multiple of 4) '253': 'CALL', # [target, sig, params..] target(params..) # TODO: assign to a var, optionally @@ -73,6 +75,8 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['LOAD8']] = get_access('lx') + ' = ' + 'HEAP8[' + get_access('ly') + ' >> 0];' CASES[ROPCODES['LOAD16']] = get_access('lx') + ' = ' + 'HEAP16[' + get_access('ly') + ' >> 1];' CASES[ROPCODES['LOAD32']] = get_access('lx') + ' = ' + 'HEAP32[' + get_access('ly') + ' >> 2];' +CASES[ROPCODES['STORE8']] = 'HEAP8[' + get_access('lx') + ' >> 0] = ' + get_coerced_access('ly') + ';'; +CASES[ROPCODES['STORE16']] = 'HEAP16[' + get_access('lx') + ' >> 1] = ' + get_coerced_access('ly') + ';'; CASES[ROPCODES['STORE32']] = 'HEAP32[' + get_access('lx') + ' >> 2] = ' + get_coerced_access('ly') + ';'; CASES[ROPCODES['BRT']] = 'if (' + get_coerced_access('lx') + ') { pc = pc + ((inst >> 16) << 2) | 0; continue; }' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 7730ccbdf6fb2..677e3dfaa4ba8 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5708,6 +5708,7 @@ function emterpretify(ast) { var y = getReg(value); var opcode; switch(shifts) { + case 0: opcode = 'STORE8'; break; case 2: { var type = detectAsmCoercion(value, asmData); assert(type === ASM_INT); From 29bed1a37fa821c20521446d21463a8a8a7f469a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 13:57:22 -0700 Subject: [PATCH 053/461] let python turn strings into opcodes --- tools/emterpretify.py | 11 +++++++++-- tools/js-optimizer.js | 28 ++++++++++++++-------------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 22bc6a4b8762e..6ecb3ac3082aa 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -198,7 +198,7 @@ def process_code(code): # find CALL instructions and fix their targets and signatures for i in range(len(code)/4): j = i*4 - if code[j] == ROPCODES['CALL']: + if code[j] == 'CALL': target = code[j+1] sig = code[j+2] if target not in call_sigs: call_sigs[target] = [] @@ -207,6 +207,12 @@ def process_code(code): code[j+1] = global_funcs[target] code[j+2] = sigs.index(sig) + # finalize instruction string names to opcodes + for i in range(len(code)/4): + j = i*4 + if type(code[j]) in (str, unicode): + code[j] = ROPCODES[code[j]] + for i in range(len(lines)): line = lines[i] if line.startswith('function ') and '}' not in line: @@ -222,8 +228,9 @@ def process_code(code): if curr is not None: assert len(curr) % 4 == 0, curr funcs[func] = len(all_code) # no operation here should change the length + print >> sys.stderr, 'raw bytecode for %s:' % func, curr process_code(curr) - print >> sys.stderr, 'bytecode for %s:' % func, curr + print >> sys.stderr, 'processed bytecode for %s:' % func, curr all_code += curr func = None lines[i] = '}' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 677e3dfaa4ba8..1a44de03c938f 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5655,7 +5655,7 @@ function emterpretify(ast) { switch(name) { case 'STACKTOP': { var x = getFree(); - return [x, [ROPCODES['GETST'], x, 0, 0]]; + return [x, ['GETST', x, 0, 0]]; } default: throw 'getReg global wha? ' + name; } @@ -5664,7 +5664,7 @@ function emterpretify(ast) { var value = node[1]; if (value >>> 16 === 0) { var l = getFree(); - return [l, [ROPCODES['SETI'], l, value & 255, value >>> 8]]; + return [l, ['SETI', l, value & 255, value >>> 8]]; } else { throw 'todo: big nums'; } @@ -5689,12 +5689,12 @@ function emterpretify(ast) { var type = asmData.vars[name]; assert(type !== ASM_DOUBLE); // TODO: SETD // TODO: detect when the last operation in reg[1] assigns in its arg x, in which case we can avoid the SET and make it assign to us - return [locals[name], reg[1].concat([ROPCODES['SET'], locals[name], releaseIfFree(reg[0]), 0])]; + return [locals[name], reg[1].concat(['SET', locals[name], releaseIfFree(reg[0]), 0])]; } else { switch(name) { case 'STACKTOP': { var reg = getReg(value); - return [-1, reg[1].concat([ROPCODES['SETST'], releaseIfFree(reg[0]), 0, 0])]; + return [-1, reg[1].concat(['SETST', releaseIfFree(reg[0]), 0, 0])]; } default: throw 'assign global wha? ' + name; } @@ -5717,7 +5717,7 @@ function emterpretify(ast) { } default: throw 'todo'; } - return [-1, x[1].concat(y[1]).concat([ROPCODES[opcode], releaseIfFree(x[0]), releaseIfFree(y[0]), 0])]; + return [-1, x[1].concat(y[1]).concat([opcode, releaseIfFree(x[0]), releaseIfFree(y[0]), 0])]; } else throw 'assign wha? ' + target[0]; } case 'binary': { @@ -5754,7 +5754,7 @@ function emterpretify(ast) { var opcode = 'LOAD' + (Math.pow(2, shifts)*8); var y = getReg(inner[2][2]); var x = getFree(y[0]); - return [x, y[1].concat([ROPCODES[opcode], releaseIfFree(y[0], x), 0])]; + return [x, y[1].concat([opcode, releaseIfFree(y[0], x), 0])]; } default: throw 'ehh'; } @@ -5785,7 +5785,7 @@ function emterpretify(ast) { var reg; if (value) reg = getReg(value); else reg = [0, []]; - return [-1, reg[1].concat([ROPCODES['RET'], value ? releaseIfFree(reg[0]) : 0, 0, 0])]; + return [-1, reg[1].concat(['RET', value ? releaseIfFree(reg[0]) : 0, 0, 0])]; } case 'do': { var top = markerId++, cond = markerId++, exit = markerId++; @@ -5797,7 +5797,7 @@ function emterpretify(ast) { continueStack.pop(); var condition = getReg(node[1]); return ['marker', top, 0, 0].concat(body).concat(['marker', cond, 0, 0]).concat(condition).concat( - [ROPCODES['BRT'], releaseIfFree(condition[0]), top, 0, 'marker', exit, 0, 0] + ['BRT', releaseIfFree(condition[0]), top, 0, 'marker', exit, 0, 0] ); } default: throw 'getReg wha? ' + node[0]; @@ -5827,7 +5827,7 @@ function emterpretify(ast) { var y = getReg(node[2]); var z = getReg(node[3]); var x = getFree(y[0], z[0]); - return [x, y[1].concat(z[1]).concat([ROPCODES[opcode], x, releaseIfFree(y[0], x), releaseIfFree(z[0], x)])]; + return [x, y[1].concat(z[1]).concat([opcode, x, releaseIfFree(y[0], x), releaseIfFree(z[0], x)])]; } function makeCall(node, type) { @@ -5836,7 +5836,7 @@ function emterpretify(ast) { assert(type === ASM_NONE); if (node[1][0] === 'name') { // normal direct call - var ret = [ROPCODES[TYPE_TO_CALL[type]]]; + var ret = [TYPE_TO_CALL[type]]; assert(ret[0], type); var actuals = []; var sig = ASM_SIG[type]; @@ -5884,7 +5884,7 @@ function emterpretify(ast) { } // second pass, finalize jumps for (var i = 0; i < code.length; i += 4) { - if (code[i] === ROPCODES['BRT']) { + if (code[i] === 'BRT') { var target = markers[code[i+2]]; var offset = target - i; assert(offset % 4 === 0); @@ -5960,11 +5960,11 @@ function emterpretify(ast) { // walk all the function to emit bytecode, and add a final ret var code = walkStatements(stats); assert(code.length % 4 === 0); - if (code.length < 4 || code[code.length-4] != ROPCODES['RET']) { - code = code.concat([ROPCODES['RET'], 0, 0, 0]); // final ret for the function + if (code.length < 4 || code[code.length-4] != 'RET') { + code = code.concat(['RET', 0, 0, 0]); // final ret for the function } assert(maxLocal <= 256); - code = [ROPCODES['FUNC'], maxLocal+1, 0, 0].concat(code); + code = ['FUNC', maxLocal+1, 0, 0].concat(code); verifyCode(code); finalizeJumps(code); From fa196fbe0015f79ca78f6629ef3b0d731b087311 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 13:58:15 -0700 Subject: [PATCH 054/461] fix load --- tools/js-optimizer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 1a44de03c938f..5d1359c8511fd 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5754,7 +5754,7 @@ function emterpretify(ast) { var opcode = 'LOAD' + (Math.pow(2, shifts)*8); var y = getReg(inner[2][2]); var x = getFree(y[0]); - return [x, y[1].concat([opcode, releaseIfFree(y[0], x), 0])]; + return [x, y[1].concat([opcode, x, releaseIfFree(y[0], x), 0])]; } default: throw 'ehh'; } From ac0c73d9b9abf34612680c50e83789c669ad352e Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 15:17:57 -0700 Subject: [PATCH 055/461] add sign detection --- tools/js-optimizer.js | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 5d1359c8511fd..0b9d6f1ae0a21 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1873,6 +1873,18 @@ function getAsmType(name, asmInfo) { assert(false, 'unknown var ' + name); } +var ASM_SIGNED = 0; +var ASM_UNSIGNED = 1; + +function detectSign(node) { + assert(node[0] === 'binary'); + switch(node[1]) { + case '|': return ASM_SIGNED; + case '>>>': return ASM_UNSIGNED; + default: throw 'yikes'; + } +} + function normalizeAsm(func) { //printErr('pre-normalize \n\n' + astToSrc(func) + '\n\n'); var data = { @@ -5814,12 +5826,8 @@ function emterpretify(ast) { switch(node[1]) { case '+': opcode = 'ADD'; break; case '/': { - assert(node[2][0] === 'binary'); - switch(node[2][1]) { - case '|': opcode = 'SDIV'; break; - case '>>>': opcode = 'UDIV'; break; - default: throw 'argh'; - } + if (detectSign(node[2]) === ASM_SIGNED) opcode = 'SDIV'; + else opcode = 'UDIV'; break; } default: throw 'bad'; From 637047c1588b25bb8b77038ca6e8345e45d0fe38 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 15:30:48 -0700 Subject: [PATCH 056/461] less than --- tools/emterpretify.py | 18 ++++++++++------- tools/js-optimizer.js | 46 +++++++++++++++++++++++++++++++++---------- 2 files changed, 47 insertions(+), 17 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 6ecb3ac3082aa..c19ab2cdafb59 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -25,13 +25,15 @@ '4': 'ADD', # [lx, ly, lz] lx = ly + lz (32-bit int) '7': 'SDIV', # [lx, ly, lz] lx = ly / lz (32-bit signed int) '8': 'UDIV', # [lx, ly, lz] lx = ly / lz (32-bit unsigned int) - '10': 'LOAD8', # [lx, ly, 0] lx = HEAP8[ly >> 0] - '11': 'LOAD16', # [lx, ly, 0] lx = HEAP16[ly >> 1] - '12': 'LOAD32', # [lx, ly, 0] lx = HEAP32[ly >> 2] - '13': 'STORE8', # [lx, ly, 0] HEAP8[lx >> 2] = ly - '14': 'STORE16', # [lx, ly, 0] HEAP16[lx >> 2] = ly - '15': 'STORE32', # [lx, ly, 0] HEAP32[lx >> 2] = ly - '16': 'BRT', # [cond, tl, th] if cond, jump t instructions (multiple of 4) + '20': 'SLT', # [lx, ly, lz] ly = ly < lz (32-bit signed) + '21': 'ULT', # [lx, ly, lz] ly = ly < lz (32-bit unsigned) + '100': 'LOAD8', # [lx, ly, 0] lx = HEAP8[ly >> 0] + '110': 'LOAD16', # [lx, ly, 0] lx = HEAP16[ly >> 1] + '120': 'LOAD32', # [lx, ly, 0] lx = HEAP32[ly >> 2] + '130': 'STORE8', # [lx, ly, 0] HEAP8[lx >> 2] = ly + '140': 'STORE16', # [lx, ly, 0] HEAP16[lx >> 2] = ly + '150': 'STORE32', # [lx, ly, 0] HEAP32[lx >> 2] = ly + '160': 'BRT', # [cond, tl, th] if cond, jump t instructions (multiple of 4) '253': 'CALL', # [target, sig, params..] target(params..) # TODO: assign to a var, optionally '254': 'RET', # [l, 0, 0] return l (depending on which emterpreter_x we are in, has the right type) '255': 'FUNC', # [n, 0, 0] function with n locals (each taking 64 bits) @@ -72,6 +74,8 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['ADD']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['SDIV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') / (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['UDIV']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') / (' + get_coerced_access('lz', unsigned=True) + ') >>> 0;' +CASES[ROPCODES['SLT']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') < (' + get_coerced_access('lz') + ') | 0;' +CASES[ROPCODES['ULT']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') < (' + get_coerced_access('lz', unsigned=True) + ') | 0;' CASES[ROPCODES['LOAD8']] = get_access('lx') + ' = ' + 'HEAP8[' + get_access('ly') + ' >> 0];' CASES[ROPCODES['LOAD16']] = get_access('lx') + ' = ' + 'HEAP16[' + get_access('ly') + ' >> 1];' CASES[ROPCODES['LOAD32']] = get_access('lx') + ' = ' + 'HEAP32[' + get_access('ly') + ' >> 2];' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 0b9d6f1ae0a21..ebb40dce003d5 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1873,8 +1873,16 @@ function getAsmType(name, asmInfo) { assert(false, 'unknown var ' + name); } -var ASM_SIGNED = 0; -var ASM_UNSIGNED = 1; +function getCombinedType(node1, node2, asmData) { + var type1 = detectAsmCoercion(node1, asmData); + var type2 = detectAsmCoercion(node2, asmData); + assert(type1 === type2 && type1 !== ASM_NONE); + return type1; +} + +var ASM_SMALLCONST = 0; // small constants can be signed or unsigned +var ASM_SIGNED = 1; +var ASM_UNSIGNED = 2 function detectSign(node) { assert(node[0] === 'binary'); @@ -1885,6 +1893,20 @@ function detectSign(node) { } } +function getCombinedSign(node1, node2) { + var sign1 = detectSign(node1); + var sign2 = detectSign(node2); + if (sign1 === ASM_SMALLCONST) { + assert(sign2 != ASM_SMALLCONST); + return sign2; + } else if (sign2 === ASM_SMALLCONST) { + assert(sign1 != ASM_SMALLCONST); + return sign1; + } + assert(sign1 === sign2); + return sign1; +} + function normalizeAsm(func) { //printErr('pre-normalize \n\n' + astToSrc(func) + '\n\n'); var data = { @@ -5770,14 +5792,13 @@ function emterpretify(ast) { } default: throw 'ehh'; } - } + } // TODO: double etc. coercions + + // not a simple coercion switch (node[1]) { - case '+': { - var type1 = detectAsmCoercion(node[2], asmData); - var type2 = detectAsmCoercion(node[3], asmData); - assert(type1 === type2 && type1 !== ASM_NONE); + case '+': case '<': { assert(!dropIt); - return makeMath(node, type1); + return makeMath(node, getCombinedType(node[2], node[3], asmData), getCombinedSign(node[2], node[3])); } default: throw 'ehh'; } @@ -5820,16 +5841,21 @@ function emterpretify(ast) { return l; } - function makeMath(node, type) { + function makeMath(node, type, sign) { assert(type === ASM_INT); var opcode; switch(node[1]) { case '+': opcode = 'ADD'; break; case '/': { - if (detectSign(node[2]) === ASM_SIGNED) opcode = 'SDIV'; + if (sign === ASM_SIGNED) opcode = 'SDIV'; else opcode = 'UDIV'; break; } + case '<': { + if (sign === ASM_SIGNED) opcode = 'SLT'; + else opcode = 'ULT'; + break; + } default: throw 'bad'; } var y = getReg(node[2]); From 34bbf01b49d37f57e474bbe06de703c09058d8f0 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 15:34:23 -0700 Subject: [PATCH 057/461] improve sign handling --- tools/js-optimizer.js | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index ebb40dce003d5..2e92829c2d64f 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1880,27 +1880,31 @@ function getCombinedType(node1, node2, asmData) { return type1; } -var ASM_SMALLCONST = 0; // small constants can be signed or unsigned +var ASM_FLEXIBLE = 0; // small constants can be signed or unsigned, variables are also flexible var ASM_SIGNED = 1; var ASM_UNSIGNED = 2 function detectSign(node) { - assert(node[0] === 'binary'); - switch(node[1]) { - case '|': return ASM_SIGNED; - case '>>>': return ASM_UNSIGNED; - default: throw 'yikes'; + if (node[0] === 'binary') { + switch(node[1]) { + case '|': return ASM_SIGNED; + case '>>>': return ASM_UNSIGNED; + default: throw 'yikes'; + } + } else if (node[0] === 'num' || node[0] === 'name') { + return ASM_FLEXIBLE; } + throw 'badd ' + JSON.stringify(node); } function getCombinedSign(node1, node2) { var sign1 = detectSign(node1); var sign2 = detectSign(node2); - if (sign1 === ASM_SMALLCONST) { - assert(sign2 != ASM_SMALLCONST); + if (sign1 === ASM_FLEXIBLE) { + assert(sign2 != ASM_FLEXIBLE); return sign2; - } else if (sign2 === ASM_SMALLCONST) { - assert(sign1 != ASM_SMALLCONST); + } else if (sign2 === ASM_FLEXIBLE) { + assert(sign1 != ASM_FLEXIBLE); return sign1; } assert(sign1 === sign2); From bba2f17c3130e8b0fef9a833ffa04b81bc65893b Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 15:46:43 -0700 Subject: [PATCH 058/461] refactoring simplification --- tools/js-optimizer.js | 81 ++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 44 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 2e92829c2d64f..81de11ed42b10 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1870,13 +1870,24 @@ function makeAsmVarDef(v, type) { function getAsmType(name, asmInfo) { if (name in asmInfo.vars) return asmInfo.vars[name]; if (name in asmInfo.params) return asmInfo.params[name]; - assert(false, 'unknown var ' + name); + return ASM_NONE; } -function getCombinedType(node1, node2, asmData) { +function getCombinedType(node1, node2, asmData, hint) { var type1 = detectAsmCoercion(node1, asmData); var type2 = detectAsmCoercion(node2, asmData); - assert(type1 === type2 && type1 !== ASM_NONE); + if (type1 === ASM_NONE && type2 === ASM_NONE) { + assert(hint !== undefined); + return hint; + } + if (type1 === ASM_NONE) { + assert(type2 != ASM_NONE); + return type2; + } else if (type2 === ASM_NONE) { + assert(type1 != ASM_NONE); + return type1; + } + assert(type1 === type2); return type1; } @@ -1897,9 +1908,13 @@ function detectSign(node) { throw 'badd ' + JSON.stringify(node); } -function getCombinedSign(node1, node2) { +function getCombinedSign(node1, node2, hint) { var sign1 = detectSign(node1); var sign2 = detectSign(node2); + if (sign1 === ASM_FLEXIBLE && sign2 === ASM_FLEXIBLE) { + assert(hint !== undefined); + return hint; + } if (sign1 === ASM_FLEXIBLE) { assert(sign2 != ASM_FLEXIBLE); return sign2; @@ -5683,7 +5698,7 @@ function emterpretify(ast) { // returns [l, bytecode] where l is a local register, and bytecode is bytecode to generate it. // if dropIt is provided, then the output of this can just be dropped. // you *must* call releaseIfFree on the l that is returned; if it is a free local, that will free it. - function getReg(node, dropIt) { + function getReg(node, dropIt, typeHint, signHint) { printErr('getReg ' + JSON.stringify(node)); switch(node[0]) { case 'name': { @@ -5761,57 +5776,24 @@ function emterpretify(ast) { case 'binary': { if (node[1] === '|' && node[3][0] === 'num' && node[3][1] === 0) { // int-coerced operation - var inner = node[2]; - switch (inner[0]) { - case 'binary': { - switch (inner[1]) { - case '+': case '/': { - assert(!dropIt); - return makeMath(inner, ASM_INT); - } - default: throw 'wha'; - } - break; - } - case 'call': { - // function call with dropped result - assert(dropIt); - return [-1, makeCall(inner, ASM_NONE)]; - } - case 'name': { - var name = inner[1]; - assert(asmData.vars[name] === ASM_INT); - return [locals[name], []]; - } - case 'sub': { - assert(inner[1][0] === 'name'); - // coerced heap access => a load - assert(inner[2][0] === 'binary' && inner[2][1] === '>>' && inner[2][3][0] === 'num'); - var shifts = inner[2][3][1]; - assert(shifts >= 0 && shifts <= 2); - var opcode = 'LOAD' + (Math.pow(2, shifts)*8); - var y = getReg(inner[2][2]); - var x = getFree(y[0]); - return [x, y[1].concat([opcode, x, releaseIfFree(y[0], x), 0])]; - } - default: throw 'ehh'; - } + return getReg(node[2], dropIt, ASM_INT, ASM_SIGNED); } // TODO: double etc. coercions // not a simple coercion switch (node[1]) { - case '+': case '<': { + case '+': case '<': case '/': { assert(!dropIt); - return makeMath(node, getCombinedType(node[2], node[3], asmData), getCombinedSign(node[2], node[3])); + return makeMath(node, getCombinedType(node[2], node[3], asmData, typeHint), getCombinedSign(node[2], node[3], signHint)); } default: throw 'ehh'; } throw 'todo'; } case 'call': { - throw 'todo'; if (node[1][0] === 'name') { - // normal direct call + // function call with dropped result + assert(dropIt); + return [-1, makeCall(node, ASM_NONE)]; } else { // todo: function pointer call } @@ -5837,6 +5819,17 @@ function emterpretify(ast) { ['BRT', releaseIfFree(condition[0]), top, 0, 'marker', exit, 0, 0] ); } + case 'sub': { + assert(node[1][0] === 'name'); + // coerced heap access => a load + assert(node[2][0] === 'binary' && node[2][1] === '>>' && node[2][3][0] === 'num'); + var shifts = node[2][3][1]; + assert(shifts >= 0 && shifts <= 2); + var opcode = 'LOAD' + (Math.pow(2, shifts)*8); + var y = getReg(node[2][2], false, ASM_INT, ASM_SIGNED); + var x = getFree(y[0]); + return [x, y[1].concat([opcode, x, releaseIfFree(y[0], x), 0])]; + } default: throw 'getReg wha? ' + node[0]; } } From 7c83f7f538bfeb650a9c6a315eed286bdacd67ac Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 15:48:12 -0700 Subject: [PATCH 059/461] notice unsigned coercions --- tools/js-optimizer.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 81de11ed42b10..1d567b574d4e2 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5775,8 +5775,11 @@ function emterpretify(ast) { } case 'binary': { if (node[1] === '|' && node[3][0] === 'num' && node[3][1] === 0) { - // int-coerced operation + // signed-coerced operation return getReg(node[2], dropIt, ASM_INT, ASM_SIGNED); + } else if (node[1] === '>>>' && node[3][0] === 'num' && node[3][1] === 0) { + // unsigned-coerced operation + return getReg(node[2], dropIt, ASM_INT, ASM_UNSIGNED); } // TODO: double etc. coercions // not a simple coercion From 86788c0f1b1676e7a8cccf4acfd65a25c233ffe3 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 15:56:14 -0700 Subject: [PATCH 060/461] do-while fixes --- tools/js-optimizer.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 1d567b574d4e2..94454bdbdedbb 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5818,9 +5818,9 @@ function emterpretify(ast) { breakStack.pop(); continueStack.pop(); var condition = getReg(node[1]); - return ['marker', top, 0, 0].concat(body).concat(['marker', cond, 0, 0]).concat(condition).concat( + return [-1, ['marker', top, 0, 0].concat(body).concat(['marker', cond, 0, 0]).concat(condition[1]).concat( ['BRT', releaseIfFree(condition[0]), top, 0, 'marker', exit, 0, 0] - ); + )]; } case 'sub': { assert(node[1][0] === 'name'); @@ -5897,7 +5897,9 @@ function emterpretify(ast) { if (stats[0] === 'block') stats = stats[1]; var ret = []; stats.forEach(function(stat) { - var curr = getReg(stat, true)[1]; + var raw = getReg(stat, true); + //printErr('raw: ' + JSON.stringify(raw)); + var curr = raw[1]; printErr('stat: ' + JSON.stringify(curr)); verifyCode(curr); ret = ret.concat(curr); From 5b0f8798a0fb6456d6296961311a6da6bcf200a7 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 16:05:10 -0700 Subject: [PATCH 061/461] sign and type forwarding --- tools/js-optimizer.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 94454bdbdedbb..3da9e8df2ad9c 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1900,6 +1900,7 @@ function detectSign(node) { switch(node[1]) { case '|': return ASM_SIGNED; case '>>>': return ASM_UNSIGNED; + case '+': return ASM_FLEXIBLE; default: throw 'yikes'; } } else if (node[0] === 'num' || node[0] === 'name') { @@ -5757,7 +5758,7 @@ function emterpretify(ast) { assert(target[1][0] === 'name'); assert(target[2][0] === 'binary' && target[2][1] === '>>' && target[2][3][0] === 'num'); var shifts = target[2][3][1]; - var x = getReg(target[2][2]); + var x = getReg(target[2][2], false, ASM_INT, ASM_SIGNED); var y = getReg(value); var opcode; switch(shifts) { From d419b23e0523c4fffb00ab33a19e91bcb5532a86 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 16:23:37 -0700 Subject: [PATCH 062/461] rename SETI --- tools/emterpretify.py | 6 +++--- tools/js-optimizer.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index c19ab2cdafb59..40477100652ed 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -21,7 +21,7 @@ '0': 'SET', # [lx, ly, 0] lx = ly (int or float, not double) '1': 'GETST', # [l, 0, 0] l = STACKTOP '2': 'SETST', # [l, 0, 0] STACKTOP = l - '3': 'SETI', # [l, vl, vh] l = v (16-bit int) + '3': 'SETVI', # [l, vl, vh] l = v (16-bit int) '4': 'ADD', # [lx, ly, lz] lx = ly + lz (32-bit int) '7': 'SDIV', # [lx, ly, lz] lx = ly / lz (32-bit signed int) '8': 'UDIV', # [lx, ly, lz] lx = ly / lz (32-bit unsigned int) @@ -34,7 +34,7 @@ '140': 'STORE16', # [lx, ly, 0] HEAP16[lx >> 2] = ly '150': 'STORE32', # [lx, ly, 0] HEAP32[lx >> 2] = ly '160': 'BRT', # [cond, tl, th] if cond, jump t instructions (multiple of 4) - '253': 'CALL', # [target, sig, params..] target(params..) # TODO: assign to a var, optionally + '250': 'CALL', # [target, sig, params..] target(params..) '254': 'RET', # [l, 0, 0] return l (depending on which emterpreter_x we are in, has the right type) '255': 'FUNC', # [n, 0, 0] function with n locals (each taking 64 bits) } @@ -70,7 +70,7 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['SET']] = get_access('lx') + ' = ' + get_coerced_access('ly') + ';' CASES[ROPCODES['GETST']] = 'HEAP32[sp + (lx << 3) >> 2] = STACKTOP;' CASES[ROPCODES['SETST']] = 'STACKTOP = HEAP32[sp + (lx << 3) >> 2]|0;' -CASES[ROPCODES['SETI']] = 'HEAP32[sp + (lx << 3) >> 2] = inst >>> 16;' +CASES[ROPCODES['SETVI']] = 'HEAP32[sp + (lx << 3) >> 2] = inst >>> 16;' CASES[ROPCODES['ADD']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['SDIV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') / (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['UDIV']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') / (' + get_coerced_access('lz', unsigned=True) + ') >>> 0;' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 3da9e8df2ad9c..6d55f7344c369 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5718,7 +5718,7 @@ function emterpretify(ast) { var value = node[1]; if (value >>> 16 === 0) { var l = getFree(); - return [l, ['SETI', l, value & 255, value >>> 8]]; + return [l, ['SETVI', l, value & 255, value >>> 8]]; } else { throw 'todo: big nums'; } From 73e149401cfd6a94a26a688fa73c34e9937fba39 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 16:43:02 -0700 Subject: [PATCH 063/461] add output to CALL --- tools/emterpretify.py | 25 +++++++++++++++---------- tools/js-optimizer.js | 5 +++-- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 40477100652ed..486ddc0e274ec 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -34,7 +34,8 @@ '140': 'STORE16', # [lx, ly, 0] HEAP16[lx >> 2] = ly '150': 'STORE32', # [lx, ly, 0] HEAP32[lx >> 2] = ly '160': 'BRT', # [cond, tl, th] if cond, jump t instructions (multiple of 4) - '250': 'CALL', # [target, sig, params..] target(params..) + '250': 'CALL', # [lx, target, sig, params..] (lx = ) target(params..) lx's existence and type depend on the target's actual callsig; + # this instruction can take multiple 32-bit instruction chunks '254': 'RET', # [l, 0, 0] return l (depending on which emterpreter_x we are in, has the right type) '255': 'FUNC', # [n, 0, 0] function with n locals (each taking 64 bits) } @@ -102,11 +103,15 @@ def make_target_call(i): sigs = call_sigs[name] assert len(sigs) == 1 sig = sigs[0] - ret = ' ' + name + '(' + ', '.join([get_coerced_access('HEAP8[pc+%d>>0]' % (i+3)) for i in range(len(sig)-1)]) + ')' - assert sig[0] == 'v' # if sig[0] != 'v': ret = get_access(.. - return ret + '; break;' - - CASES[ROPCODES['CALL']] = 'switch (lx|0) {\n' + \ + ret = name + '(' + ', '.join([get_coerced_access('HEAP8[pc+%d>>0]' % (i+4)) for i in range(len(sig)-1)]) + ')' + if sig[0] != 'v': + ret = get_access('lx', sig[0]) + ' = ' + ret + extra = len(sig) - 1 # [opcode, lx, target, sig], take the usual 4. params are extra + if extra > 0: + ret += '; pc = pc + %d | 0' % (4*((extra+3)>>2)) + return ' ' + ret + '; break;' + + CASES[ROPCODES['CALL']] = 'switch (ly|0) {\n' + \ '\n'.join(filter(lambda x: 'None' not in x, [' case %d: {\n%s\n }' % (i, make_target_call(i)) for i in range(global_id-1)])) + \ '\n default: assert(0);' + \ '\n }' @@ -203,13 +208,13 @@ def process_code(code): for i in range(len(code)/4): j = i*4 if code[j] == 'CALL': - target = code[j+1] - sig = code[j+2] + target = code[j+2] + sig = code[j+3] if target not in call_sigs: call_sigs[target] = [] sigs = call_sigs[target] if sig not in sigs: sigs.append(sig) - code[j+1] = global_funcs[target] - code[j+2] = sigs.index(sig) + code[j+2] = global_funcs[target] + code[j+3] = sigs.index(sig) # finalize instruction string names to opcodes for i in range(len(code)/4): diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 6d55f7344c369..8a7ae30f8a874 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5797,7 +5797,7 @@ function emterpretify(ast) { if (node[1][0] === 'name') { // function call with dropped result assert(dropIt); - return [-1, makeCall(node, ASM_NONE)]; + return [0, makeCall(0, node, ASM_NONE)]; } else { // todo: function pointer call } @@ -5865,7 +5865,7 @@ function emterpretify(ast) { return [x, y[1].concat(z[1]).concat([opcode, x, releaseIfFree(y[0], x), releaseIfFree(z[0], x)])]; } - function makeCall(node, type) { + function makeCall(lx, node, type) { // TODO: specialize calls like imul assert(node[0] === 'call'); assert(type === ASM_NONE); @@ -5881,6 +5881,7 @@ function emterpretify(ast) { actuals.push(reg[0]); sig += ASM_SIG[detectAsmCoercion(param, asmData)]; }); + ret.push(lx); ret.push(node[1][1]); assert(sig.indexOf('u') < 0); // no undefined ret.push(sig); From d8248b902827ee46804e81a30ad2aa5f6ce7875b Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 16:51:54 -0700 Subject: [PATCH 064/461] call generalizations --- tools/emterpretify.py | 6 +++--- tools/js-optimizer.js | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 486ddc0e274ec..7b1efd5e9efb9 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -170,9 +170,9 @@ def make_target_call(i): line = lines[i] if line.startswith('function ') and '}' not in line: func = line.split(' ')[1].split('(')[0] - if func not in BLACKLIST: - global_funcs[func] = global_id - global_id += 1 + global_funcs[func] = global_id + rglobal_funcs[global_id] = func + global_id += 1 assert global_id < 256 # process functions, generating bytecode diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 8a7ae30f8a874..eb35c4ba47192 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5796,7 +5796,6 @@ function emterpretify(ast) { case 'call': { if (node[1][0] === 'name') { // function call with dropped result - assert(dropIt); return [0, makeCall(0, node, ASM_NONE)]; } else { // todo: function pointer call From bf8655a199ed8e25af519eca4aeb5f52a74ac29b Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 17:02:44 -0700 Subject: [PATCH 065/461] jump fix --- tools/emterpretify.py | 2 +- tools/js-optimizer.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 7b1efd5e9efb9..7b91a7d73a4bd 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -130,7 +130,7 @@ def make_target_call(i): lx = (inst >> 8) & 255; ly = (inst >> 16) & 255; lz = inst >>> 24; - //printErr([pc, op, lx, ly, lz]); + //printErr([pc, inst&255, lx, ly, lz]); switch (inst&255) { %s default: assert(0); diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index eb35c4ba47192..bbd5cbd9695f4 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5923,9 +5923,10 @@ function emterpretify(ast) { for (var i = 0; i < code.length; i += 4) { if (code[i] === 'BRT') { var target = markers[code[i+2]]; + assert(target !== undefined); var offset = target - i; assert(offset % 4 === 0); - offset >> 2; + offset >>= 2; assert(Math.abs(offset) < 32768); code[i+2] = offset & 255; code[i+3] = (offset >> 8) & 255; From 4a789e4104d91f073552a545a77cfdf3dcbf6736 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 17:57:56 -0700 Subject: [PATCH 066/461] fix free local releasing bug --- tools/emterpretify.py | 1 + tools/js-optimizer.js | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 7b91a7d73a4bd..8292929a568d9 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -131,6 +131,7 @@ def make_target_call(i): ly = (inst >> 16) & 255; lz = inst >>> 24; //printErr([pc, inst&255, lx, ly, lz]); + //printErr(' ' + Array.prototype.slice.call(HEAPU8, sp, sp+8)); switch (inst&255) { %s default: assert(0); diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index bbd5cbd9695f4..0a1aed6117e7a 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5682,11 +5682,14 @@ function emterpretify(ast) { assert(freeLocals.length > 0); var ret = freeLocals.pop(); maxLocal = Math.max(maxLocal, ret); + assert(ret >= numLocals); return ret; } // if possible is passed in, and is identical to l, then it means l was reused, and we must not free it function releaseFree(l, possible) { if (l === possible) return; + assert(freeLocals.indexOf(l) < 0); + assert(l >= numLocals); freeLocals.push(l); } @@ -5836,8 +5839,8 @@ function emterpretify(ast) { default: throw 'getReg wha? ' + node[0]; } } - function releaseIfFree(l) { - if (l >= numLocals) releaseFree(l); + function releaseIfFree(l, possible) { + if (l >= numLocals) releaseFree(l, possible); return l; } @@ -5956,7 +5959,7 @@ function emterpretify(ast) { assert(numLocals <= 256); for (var i = 255; i >= numLocals; i--) { freeLocals.push(i); - } + } var stats = getStatements(func); // emit stack assignments, emterpreter assumes params to be in place From a386df46f7cf6d91158f24cde98bdf336fb8d81f Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 18:04:57 -0700 Subject: [PATCH 067/461] fix non-void calls; loop test passes --- tools/emterpretify.py | 2 +- tools/js-optimizer.js | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 8292929a568d9..de129abbcbd01 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -105,7 +105,7 @@ def make_target_call(i): sig = sigs[0] ret = name + '(' + ', '.join([get_coerced_access('HEAP8[pc+%d>>0]' % (i+4)) for i in range(len(sig)-1)]) + ')' if sig[0] != 'v': - ret = get_access('lx', sig[0]) + ' = ' + ret + ret = get_access('lx', sig[0]) + ' = ' + shared.JS.make_coercion(ret, sig[0]) extra = len(sig) - 1 # [opcode, lx, target, sig], take the usual 4. params are extra if extra > 0: ret += '; pc = pc + %d | 0' % (4*((extra+3)>>2)) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 0a1aed6117e7a..c4e8d11bfdf59 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5655,9 +5655,6 @@ function emterpretify(ast) { var OPCODES = extraInfo.opcodes; var ROPCODES = extraInfo.ropcodes; - var TYPE_TO_CALL = {}; - TYPE_TO_CALL[ASM_NONE] = 'CALL'; - function verifyCode(code) { if (code.length % 4 !== 0) assert(0, JSON.stringify(code)); for (var i = 0; i < code.length; i++) if (code[i] === undefined || code[i] === null || code < 0 || code > 255) assert(0, i + ' : ' + JSON.stringify(code)); @@ -5798,8 +5795,14 @@ function emterpretify(ast) { } case 'call': { if (node[1][0] === 'name') { - // function call with dropped result - return [0, makeCall(0, node, ASM_NONE)]; + var type; + if (dropIt) { + type = ASM_NONE; + } else { + assert(typeHint !== ASM_NONE); + type = typeHint; + } + return [0, makeCall(0, node, type)]; } else { // todo: function pointer call } @@ -5870,11 +5873,9 @@ function emterpretify(ast) { function makeCall(lx, node, type) { // TODO: specialize calls like imul assert(node[0] === 'call'); - assert(type === ASM_NONE); if (node[1][0] === 'name') { // normal direct call - var ret = [TYPE_TO_CALL[type]]; - assert(ret[0], type); + var ret = ['CALL']; var actuals = []; var sig = ASM_SIG[type]; node[2].forEach(function(param) { From 90b56ad7ec8764311fa54a11ec6879ba114e9f16 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 20:30:08 -0700 Subject: [PATCH 068/461] BR and BRF --- tools/emterpretify.py | 5 +++++ tools/js-optimizer.js | 21 +++++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index de129abbcbd01..8f286b5c2a581 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -15,6 +15,7 @@ # consts +#BLACKLIST = set(['_memset', 'copyTempDouble', 'copyTempFloat', '_strlen', 'stackAlloc', 'setThrew', 'stackRestore', 'setTempRet0', 'getTempRet0', 'stackSave', 'runPostSets']) BLACKLIST = set(['_memcpy', '_memset', 'copyTempDouble', 'copyTempFloat', '_strlen', 'stackAlloc', 'setThrew', 'stackRestore', 'setTempRet0', 'getTempRet0', 'stackSave', 'runPostSets']) OPCODES = { # l, lx, ly etc - one of 256 locals @@ -33,7 +34,9 @@ '130': 'STORE8', # [lx, ly, 0] HEAP8[lx >> 2] = ly '140': 'STORE16', # [lx, ly, 0] HEAP16[lx >> 2] = ly '150': 'STORE32', # [lx, ly, 0] HEAP32[lx >> 2] = ly + '159': 'BR', # [0, tl, th] jump t instructions (multiple of 4) '160': 'BRT', # [cond, tl, th] if cond, jump t instructions (multiple of 4) + '161': 'BRF', # [cond, tl, th] if !cond, jump t instructions (multiple of 4) '250': 'CALL', # [lx, target, sig, params..] (lx = ) target(params..) lx's existence and type depend on the target's actual callsig; # this instruction can take multiple 32-bit instruction chunks '254': 'RET', # [l, 0, 0] return l (depending on which emterpreter_x we are in, has the right type) @@ -83,7 +86,9 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['STORE8']] = 'HEAP8[' + get_access('lx') + ' >> 0] = ' + get_coerced_access('ly') + ';'; CASES[ROPCODES['STORE16']] = 'HEAP16[' + get_access('lx') + ' >> 1] = ' + get_coerced_access('ly') + ';'; CASES[ROPCODES['STORE32']] = 'HEAP32[' + get_access('lx') + ' >> 2] = ' + get_coerced_access('ly') + ';'; +CASES[ROPCODES['BR']] = 'pc = pc + ((inst >> 16) << 2) | 0; continue;' CASES[ROPCODES['BRT']] = 'if (' + get_coerced_access('lx') + ') { pc = pc + ((inst >> 16) << 2) | 0; continue; }' +CASES[ROPCODES['BRF']] = 'if (!(' + get_coerced_access('lx') + ')) { pc = pc + ((inst >> 16) << 2) | 0; continue; }' def make_emterpreter(t): # return is specialized per interpreter diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index c4e8d11bfdf59..cf0e3ec21f236 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5655,6 +5655,8 @@ function emterpretify(ast) { var OPCODES = extraInfo.opcodes; var ROPCODES = extraInfo.ropcodes; + var BRANCHES = set('BR', 'BRT', 'BRF'); + function verifyCode(code) { if (code.length % 4 !== 0) assert(0, JSON.stringify(code)); for (var i = 0; i < code.length; i++) if (code[i] === undefined || code[i] === null || code < 0 || code > 255) assert(0, i + ' : ' + JSON.stringify(code)); @@ -5828,6 +5830,21 @@ function emterpretify(ast) { ['BRT', releaseIfFree(condition[0]), top, 0, 'marker', exit, 0, 0] )]; } + case 'if': { + var exit = markerId++; + var condition = getReg(node[1]); + var ret; + if (!node[3]) { + ret = condition[1].concat(['BRF', releaseIfFree(condition[0]), exit, 0]); + ret = ret.concat(walkStatements(node[2])); + } else { + var otherwise = markerId++; + ret = condition[1].concat(['BRF', releaseIfFree(condition[0]), otherwise, 0]); + ret = ret.concat(walkStatements(node[2])).concat(['BR', 0, exit, 0]) + .concat(['marker', otherwise, 0, 0]).concat(walkStatements(node[3])); + } + return [-1, ret.concat(['marker', exit, 0, 0])]; + } case 'sub': { assert(node[1][0] === 'name'); // coerced heap access => a load @@ -5923,9 +5940,9 @@ function emterpretify(ast) { i -= 4; } } - // second pass, finalize jumps + // second pass, finalize jumps TODO: optimize jump->jump->x to jump->x for (var i = 0; i < code.length; i += 4) { - if (code[i] === 'BRT') { + if (code[i] in BRANCHES) { var target = markers[code[i+2]]; assert(target !== undefined); var offset = target - i; From 02dccd063ed43de9f8148694602bd83899b80b60 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 20:35:03 -0700 Subject: [PATCH 069/461] add int >= --- tools/js-optimizer.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index cf0e3ec21f236..e22aa86d5f4da 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5786,10 +5786,23 @@ function emterpretify(ast) { } // TODO: double etc. coercions // not a simple coercion + var type = getCombinedType(node[2], node[3], asmData, typeHint); + var sign = getCombinedSign(node[2], node[3], signHint); + assert(!dropIt); + switch (node[1]) { + case '>=': { + if (type === ASM_INT) { // float/double comparisons are not antisymmetrical due to NaNs + var temp = node[2]; + node[2] = node[3]; + node[3] = temp; + node[1] = '<'; + return makeMath(node, type, sign); + } + break; + } case '+': case '<': case '/': { - assert(!dropIt); - return makeMath(node, getCombinedType(node[2], node[3], asmData, typeHint), getCombinedSign(node[2], node[3], signHint)); + return makeMath(node, type, sign); } default: throw 'ehh'; } From 0241e20569a68729b882633d083abd9a224c427f Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 20:39:38 -0700 Subject: [PATCH 070/461] fix walkStatements on a singleton --- tools/js-optimizer.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index e22aa86d5f4da..10cde3a8a08ce 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5821,6 +5821,7 @@ function emterpretify(ast) { } else { // todo: function pointer call } + throw 'todo'; } case 'return': { assert(dropIt); @@ -5869,7 +5870,7 @@ function emterpretify(ast) { var x = getFree(y[0]); return [x, y[1].concat([opcode, x, releaseIfFree(y[0], x), 0])]; } - default: throw 'getReg wha? ' + node[0]; + default: throw 'getReg wha? ' + node[0] + new Error().stack; } } function releaseIfFree(l, possible) { @@ -5930,6 +5931,7 @@ function emterpretify(ast) { function walkStatements(stats) { if (!stats) return []; if (stats[0] === 'block') stats = stats[1]; + if (typeof stats[0] === 'string') stats = [stats]; var ret = []; stats.forEach(function(stat) { var raw = getReg(stat, true); From 547ccce4dea90882617b71d2c821debb36bda52e Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 20:44:23 -0700 Subject: [PATCH 071/461] EQ --- tools/emterpretify.py | 2 ++ tools/js-optimizer.js | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 8f286b5c2a581..c34bc1bcbedf3 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -26,6 +26,7 @@ '4': 'ADD', # [lx, ly, lz] lx = ly + lz (32-bit int) '7': 'SDIV', # [lx, ly, lz] lx = ly / lz (32-bit signed int) '8': 'UDIV', # [lx, ly, lz] lx = ly / lz (32-bit unsigned int) + '18': 'EQ', # [lx, ly, lz] ly = ly == lz '20': 'SLT', # [lx, ly, lz] ly = ly < lz (32-bit signed) '21': 'ULT', # [lx, ly, lz] ly = ly < lz (32-bit unsigned) '100': 'LOAD8', # [lx, ly, 0] lx = HEAP8[ly >> 0] @@ -78,6 +79,7 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['ADD']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['SDIV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') / (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['UDIV']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') / (' + get_coerced_access('lz', unsigned=True) + ') >>> 0;' +CASES[ROPCODES['EQ']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') == (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['SLT']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') < (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['ULT']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') < (' + get_coerced_access('lz', unsigned=True) + ') | 0;' CASES[ROPCODES['LOAD8']] = get_access('lx') + ' = ' + 'HEAP8[' + get_access('ly') + ' >> 0];' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 10cde3a8a08ce..db6367276943a 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1898,7 +1898,7 @@ var ASM_UNSIGNED = 2 function detectSign(node) { if (node[0] === 'binary') { switch(node[1]) { - case '|': return ASM_SIGNED; + case '|': case '&': return ASM_SIGNED; case '>>>': return ASM_UNSIGNED; case '+': return ASM_FLEXIBLE; default: throw 'yikes'; @@ -5801,7 +5801,7 @@ function emterpretify(ast) { } break; } - case '+': case '<': case '/': { + case '+': case '<': case '/': case '==': { return makeMath(node, type, sign); } default: throw 'ehh'; @@ -5893,6 +5893,7 @@ function emterpretify(ast) { else opcode = 'ULT'; break; } + case '==': opcode = 'EQ'; break; default: throw 'bad'; } var y = getReg(node[2]); From 985fca2ca30292b202c75227574314a86b43cd1f Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 21:09:07 -0700 Subject: [PATCH 072/461] AND --- tools/emterpretify.py | 2 ++ tools/js-optimizer.js | 25 +++++++++++++------------ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index c34bc1bcbedf3..8fe8b2b3b3b75 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -29,6 +29,7 @@ '18': 'EQ', # [lx, ly, lz] ly = ly == lz '20': 'SLT', # [lx, ly, lz] ly = ly < lz (32-bit signed) '21': 'ULT', # [lx, ly, lz] ly = ly < lz (32-bit unsigned) + '30': 'AND', # [lx, ly, lz] ly = ly & lz '100': 'LOAD8', # [lx, ly, 0] lx = HEAP8[ly >> 0] '110': 'LOAD16', # [lx, ly, 0] lx = HEAP16[ly >> 1] '120': 'LOAD32', # [lx, ly, 0] lx = HEAP32[ly >> 2] @@ -82,6 +83,7 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['EQ']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') == (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['SLT']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') < (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['ULT']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') < (' + get_coerced_access('lz', unsigned=True) + ') | 0;' +CASES[ROPCODES['AND']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') & (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['LOAD8']] = get_access('lx') + ' = ' + 'HEAP8[' + get_access('ly') + ' >> 0];' CASES[ROPCODES['LOAD16']] = get_access('lx') + ' = ' + 'HEAP16[' + get_access('ly') + ' >> 1];' CASES[ROPCODES['LOAD32']] = get_access('lx') + ' = ' + 'HEAP32[' + get_access('ly') + ' >> 2];' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index db6367276943a..6ee859dfd7c30 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5786,22 +5786,22 @@ function emterpretify(ast) { } // TODO: double etc. coercions // not a simple coercion - var type = getCombinedType(node[2], node[3], asmData, typeHint); - var sign = getCombinedSign(node[2], node[3], signHint); assert(!dropIt); switch (node[1]) { - case '>=': { - if (type === ASM_INT) { // float/double comparisons are not antisymmetrical due to NaNs - var temp = node[2]; - node[2] = node[3]; - node[3] = temp; - node[1] = '<'; - return makeMath(node, type, sign); - } - break; - } + case '&': return makeMath(node, ASM_INT, ASM_SIGNED); + case '>=': case '+': case '<': case '/': case '==': { + var type = getCombinedType(node[2], node[3], asmData, typeHint); + var sign = getCombinedSign(node[2], node[3], signHint); + if (node[1] === '>=') { + if (type === ASM_INT) { // float/double comparisons are not antisymmetrical due to NaNs + var temp = node[2]; + node[2] = node[3]; + node[3] = temp; + node[1] = '<'; + } else throw 'ex ' + type; + } return makeMath(node, type, sign); } default: throw 'ehh'; @@ -5894,6 +5894,7 @@ function emterpretify(ast) { break; } case '==': opcode = 'EQ'; break; + case '&': opcode = 'AND'; break; default: throw 'bad'; } var y = getReg(node[2]); From e4d46803b77d6ead0317445420ebd7bfc216ef88 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 21:33:01 -0700 Subject: [PATCH 073/461] while --- tools/js-optimizer.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 6ee859dfd7c30..e664171ef9d7f 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5844,6 +5844,20 @@ function emterpretify(ast) { ['BRT', releaseIfFree(condition[0]), top, 0, 'marker', exit, 0, 0] )]; } + case 'while': { + var condition = getReg(node[1]); + var cond = markerId++, top = markerId++, exit = markerId++; + breakStack.push(exit); + continueStack.push(cond); + // TODO: labels + var ret = ['marker', cond, 0, 0].concat(condition[1]).concat( + ['BRF', releaseIfFree(condition[0]), exit, 0, 'marker', top, 0, 0] + ); + ret = ret.concat(walkStatements(node[2])); + breakStack.pop(); + continueStack.pop(); + return [-1, ret.concat(['marker', exit, 0, 0])]; + } case 'if': { var exit = markerId++; var condition = getReg(node[1]); From c5a07ca39f921836ed807dc16b7ac032a546b45d Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 21:35:50 -0700 Subject: [PATCH 074/461] sub --- tools/emterpretify.py | 2 ++ tools/js-optimizer.js | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 8fe8b2b3b3b75..fcff6defab4e6 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -24,6 +24,7 @@ '2': 'SETST', # [l, 0, 0] STACKTOP = l '3': 'SETVI', # [l, vl, vh] l = v (16-bit int) '4': 'ADD', # [lx, ly, lz] lx = ly + lz (32-bit int) + '5': 'SUB', # [lx, ly, lz] lx = ly - lz (32-bit int) '7': 'SDIV', # [lx, ly, lz] lx = ly / lz (32-bit signed int) '8': 'UDIV', # [lx, ly, lz] lx = ly / lz (32-bit unsigned int) '18': 'EQ', # [lx, ly, lz] ly = ly == lz @@ -78,6 +79,7 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['SETST']] = 'STACKTOP = HEAP32[sp + (lx << 3) >> 2]|0;' CASES[ROPCODES['SETVI']] = 'HEAP32[sp + (lx << 3) >> 2] = inst >>> 16;' CASES[ROPCODES['ADD']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') | 0;' +CASES[ROPCODES['SUB']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') - (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['SDIV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') / (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['UDIV']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') / (' + get_coerced_access('lz', unsigned=True) + ') >>> 0;' CASES[ROPCODES['EQ']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') == (' + get_coerced_access('lz') + ') | 0;' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index e664171ef9d7f..4c2ad79f91529 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5791,7 +5791,7 @@ function emterpretify(ast) { switch (node[1]) { case '&': return makeMath(node, ASM_INT, ASM_SIGNED); case '>=': - case '+': case '<': case '/': case '==': { + case '+': case '-': case '<': case '/': case '==': { var type = getCombinedType(node[2], node[3], asmData, typeHint); var sign = getCombinedSign(node[2], node[3], signHint); if (node[1] === '>=') { @@ -5897,6 +5897,7 @@ function emterpretify(ast) { var opcode; switch(node[1]) { case '+': opcode = 'ADD'; break; + case '-': opcode = 'SUB'; break; case '/': { if (sign === ASM_SIGNED) opcode = 'SDIV'; else opcode = 'UDIV'; From 18a8e2356dc3e3fd9090b36c2bcfcdf28de02bb5 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 21:45:19 -0700 Subject: [PATCH 075/461] SLE, ULE --- tools/emterpretify.py | 4 ++++ tools/js-optimizer.js | 13 +++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index fcff6defab4e6..663d9b75d3a7b 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -30,6 +30,8 @@ '18': 'EQ', # [lx, ly, lz] ly = ly == lz '20': 'SLT', # [lx, ly, lz] ly = ly < lz (32-bit signed) '21': 'ULT', # [lx, ly, lz] ly = ly < lz (32-bit unsigned) + '22': 'SLE', # [lx, ly, lz] ly = ly <= lz (32-bit signed) + '23': 'ULE', # [lx, ly, lz] ly = ly <= lz (32-bit unsigned) '30': 'AND', # [lx, ly, lz] ly = ly & lz '100': 'LOAD8', # [lx, ly, 0] lx = HEAP8[ly >> 0] '110': 'LOAD16', # [lx, ly, 0] lx = HEAP16[ly >> 1] @@ -85,6 +87,8 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['EQ']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') == (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['SLT']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') < (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['ULT']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') < (' + get_coerced_access('lz', unsigned=True) + ') | 0;' +CASES[ROPCODES['SLE']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') <= (' + get_coerced_access('lz') + ') | 0;' +CASES[ROPCODES['ULE']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') <= (' + get_coerced_access('lz', unsigned=True) + ') | 0;' CASES[ROPCODES['AND']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') & (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['LOAD8']] = get_access('lx') + ' = ' + 'HEAP8[' + get_access('ly') + ' >> 0];' CASES[ROPCODES['LOAD16']] = get_access('lx') + ' = ' + 'HEAP16[' + get_access('ly') + ' >> 1];' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 4c2ad79f91529..97ee79c731adc 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5790,16 +5790,16 @@ function emterpretify(ast) { switch (node[1]) { case '&': return makeMath(node, ASM_INT, ASM_SIGNED); - case '>=': - case '+': case '-': case '<': case '/': case '==': { + case '>=': case '>': + case '+': case '-': case '<': case '<=': case '/': case '==': { var type = getCombinedType(node[2], node[3], asmData, typeHint); var sign = getCombinedSign(node[2], node[3], signHint); - if (node[1] === '>=') { + if (node[1] === '>=' || node[1] === '>') { if (type === ASM_INT) { // float/double comparisons are not antisymmetrical due to NaNs var temp = node[2]; node[2] = node[3]; node[3] = temp; - node[1] = '<'; + node[1] = node[1] === '>=' ? '<' : '<='; } else throw 'ex ' + type; } return makeMath(node, type, sign); @@ -5908,6 +5908,11 @@ function emterpretify(ast) { else opcode = 'ULT'; break; } + case '<=': { + if (sign === ASM_SIGNED) opcode = 'SLE'; + else opcode = 'ULE'; + break; + } case '==': opcode = 'EQ'; break; case '&': opcode = 'AND'; break; default: throw 'bad'; From 90c6e6c0cc445f432633fd2be98e9e4967349cd5 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 21:51:01 -0700 Subject: [PATCH 076/461] shifts --- tools/emterpretify.py | 10 ++++++++-- tools/js-optimizer.js | 5 ++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 663d9b75d3a7b..b103d239d0adf 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -15,7 +15,7 @@ # consts -#BLACKLIST = set(['_memset', 'copyTempDouble', 'copyTempFloat', '_strlen', 'stackAlloc', 'setThrew', 'stackRestore', 'setTempRet0', 'getTempRet0', 'stackSave', 'runPostSets']) +#BLACKLIST = set(['copyTempDouble', 'copyTempFloat', '_strlen', 'stackAlloc', 'setThrew', 'stackRestore', 'setTempRet0', 'getTempRet0', 'stackSave', 'runPostSets']) BLACKLIST = set(['_memcpy', '_memset', 'copyTempDouble', 'copyTempFloat', '_strlen', 'stackAlloc', 'setThrew', 'stackRestore', 'setTempRet0', 'getTempRet0', 'stackSave', 'runPostSets']) OPCODES = { # l, lx, ly etc - one of 256 locals @@ -33,6 +33,9 @@ '22': 'SLE', # [lx, ly, lz] ly = ly <= lz (32-bit signed) '23': 'ULE', # [lx, ly, lz] ly = ly <= lz (32-bit unsigned) '30': 'AND', # [lx, ly, lz] ly = ly & lz + '40': 'SHL', # [lx, ly, lz] ly = ly << lz + '41': 'ASHR', # [lx, ly, lz] ly = ly >> lz + '42': 'LSHR', # [lx, ly, lz] ly = ly >>> lz '100': 'LOAD8', # [lx, ly, 0] lx = HEAP8[ly >> 0] '110': 'LOAD16', # [lx, ly, 0] lx = HEAP16[ly >> 1] '120': 'LOAD32', # [lx, ly, 0] lx = HEAP32[ly >> 2] @@ -89,7 +92,10 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['ULT']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') < (' + get_coerced_access('lz', unsigned=True) + ') | 0;' CASES[ROPCODES['SLE']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') <= (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['ULE']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') <= (' + get_coerced_access('lz', unsigned=True) + ') | 0;' -CASES[ROPCODES['AND']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') & (' + get_coerced_access('lz') + ') | 0;' +CASES[ROPCODES['AND']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') & (' + get_coerced_access('lz') + ');' +CASES[ROPCODES['SHL']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') << (' + get_coerced_access('lz') + ');' +CASES[ROPCODES['ASHR']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') >> (' + get_coerced_access('lz') + ');' +CASES[ROPCODES['LSHR']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') >>> (' + get_coerced_access('lz') + ');' CASES[ROPCODES['LOAD8']] = get_access('lx') + ' = ' + 'HEAP8[' + get_access('ly') + ' >> 0];' CASES[ROPCODES['LOAD16']] = get_access('lx') + ' = ' + 'HEAP16[' + get_access('ly') + ' >> 1];' CASES[ROPCODES['LOAD32']] = get_access('lx') + ' = ' + 'HEAP32[' + get_access('ly') + ' >> 2];' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 97ee79c731adc..93e49dd239258 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5791,7 +5791,7 @@ function emterpretify(ast) { switch (node[1]) { case '&': return makeMath(node, ASM_INT, ASM_SIGNED); case '>=': case '>': - case '+': case '-': case '<': case '<=': case '/': case '==': { + case '+': case '-': case '<': case '<=': case '/': case '==': case '<<': case '>>': case '>>>': { var type = getCombinedType(node[2], node[3], asmData, typeHint); var sign = getCombinedSign(node[2], node[3], signHint); if (node[1] === '>=' || node[1] === '>') { @@ -5915,6 +5915,9 @@ function emterpretify(ast) { } case '==': opcode = 'EQ'; break; case '&': opcode = 'AND'; break; + case '<<': opcode = 'SHL'; break; + case '>>': opcode = 'ASHR'; break; + case '>>>': opcode = 'LSHR'; break; default: throw 'bad'; } var y = getReg(node[2]); From 04d82b8a85cf3f1cd4233ed211dbfc453f72f1d8 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 21:53:01 -0700 Subject: [PATCH 077/461] OR, XOR --- tools/emterpretify.py | 4 ++++ tools/js-optimizer.js | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index b103d239d0adf..b2b12079cf954 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -33,6 +33,8 @@ '22': 'SLE', # [lx, ly, lz] ly = ly <= lz (32-bit signed) '23': 'ULE', # [lx, ly, lz] ly = ly <= lz (32-bit unsigned) '30': 'AND', # [lx, ly, lz] ly = ly & lz + '31': 'OR', # [lx, ly, lz] ly = ly | lz + '32': 'XOR', # [lx, ly, lz] ly = ly ^ lz '40': 'SHL', # [lx, ly, lz] ly = ly << lz '41': 'ASHR', # [lx, ly, lz] ly = ly >> lz '42': 'LSHR', # [lx, ly, lz] ly = ly >>> lz @@ -93,6 +95,8 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['SLE']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') <= (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['ULE']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') <= (' + get_coerced_access('lz', unsigned=True) + ') | 0;' CASES[ROPCODES['AND']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') & (' + get_coerced_access('lz') + ');' +CASES[ROPCODES['OR']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') | (' + get_coerced_access('lz') + ');' +CASES[ROPCODES['XOR']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') ^ (' + get_coerced_access('lz') + ');' CASES[ROPCODES['SHL']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') << (' + get_coerced_access('lz') + ');' CASES[ROPCODES['ASHR']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') >> (' + get_coerced_access('lz') + ');' CASES[ROPCODES['LSHR']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') >>> (' + get_coerced_access('lz') + ');' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 93e49dd239258..d8e4321fdba5a 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5789,7 +5789,7 @@ function emterpretify(ast) { assert(!dropIt); switch (node[1]) { - case '&': return makeMath(node, ASM_INT, ASM_SIGNED); + case '&': case '|': case '^': return makeMath(node, ASM_INT, ASM_SIGNED); case '>=': case '>': case '+': case '-': case '<': case '<=': case '/': case '==': case '<<': case '>>': case '>>>': { var type = getCombinedType(node[2], node[3], asmData, typeHint); @@ -5915,6 +5915,8 @@ function emterpretify(ast) { } case '==': opcode = 'EQ'; break; case '&': opcode = 'AND'; break; + case '|': opcode = 'OR'; break; + case '^': opcode = 'XOR'; break; case '<<': opcode = 'SHL'; break; case '>>': opcode = 'ASHR'; break; case '>>>': opcode = 'LSHR'; break; From ec4d8668d0992d76f9beefb10e7ded7ad47dff49 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 20 Sep 2014 21:54:17 -0700 Subject: [PATCH 078/461] fix shifts --- tools/js-optimizer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index d8e4321fdba5a..0adb9b788cee9 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5789,9 +5789,9 @@ function emterpretify(ast) { assert(!dropIt); switch (node[1]) { - case '&': case '|': case '^': return makeMath(node, ASM_INT, ASM_SIGNED); + case '&': case '|': case '^': case '<<': case '>>': case '>>>': return makeMath(node, ASM_INT, ASM_SIGNED); case '>=': case '>': - case '+': case '-': case '<': case '<=': case '/': case '==': case '<<': case '>>': case '>>>': { + case '+': case '-': case '<': case '<=': case '/': case '==': { var type = getCombinedType(node[2], node[3], asmData, typeHint); var sign = getCombinedSign(node[2], node[3], signHint); if (node[1] === '>=' || node[1] === '>') { From 14f3075a7f43b2c7b3c86c21e2f87cb236d93771 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 21 Sep 2014 10:05:20 -0700 Subject: [PATCH 079/461] typo fix --- tools/emterpretify.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index b2b12079cf954..355169d6c5cc3 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -27,17 +27,17 @@ '5': 'SUB', # [lx, ly, lz] lx = ly - lz (32-bit int) '7': 'SDIV', # [lx, ly, lz] lx = ly / lz (32-bit signed int) '8': 'UDIV', # [lx, ly, lz] lx = ly / lz (32-bit unsigned int) - '18': 'EQ', # [lx, ly, lz] ly = ly == lz - '20': 'SLT', # [lx, ly, lz] ly = ly < lz (32-bit signed) - '21': 'ULT', # [lx, ly, lz] ly = ly < lz (32-bit unsigned) - '22': 'SLE', # [lx, ly, lz] ly = ly <= lz (32-bit signed) - '23': 'ULE', # [lx, ly, lz] ly = ly <= lz (32-bit unsigned) - '30': 'AND', # [lx, ly, lz] ly = ly & lz - '31': 'OR', # [lx, ly, lz] ly = ly | lz - '32': 'XOR', # [lx, ly, lz] ly = ly ^ lz - '40': 'SHL', # [lx, ly, lz] ly = ly << lz - '41': 'ASHR', # [lx, ly, lz] ly = ly >> lz - '42': 'LSHR', # [lx, ly, lz] ly = ly >>> lz + '18': 'EQ', # [lx, ly, lz] lx = ly == lz + '20': 'SLT', # [lx, ly, lz] lx = ly < lz (32-bit signed) + '21': 'ULT', # [lx, ly, lz] lx = ly < lz (32-bit unsigned) + '22': 'SLE', # [lx, ly, lz] lx = ly <= lz (32-bit signed) + '23': 'ULE', # [lx, ly, lz] lx = ly <= lz (32-bit unsigned) + '30': 'AND', # [lx, ly, lz] lx = ly & lz + '31': 'OR', # [lx, ly, lz] lx = ly | lz + '32': 'XOR', # [lx, ly, lz] lx = ly ^ lz + '40': 'SHL', # [lx, ly, lz] lx = ly << lz + '41': 'ASHR', # [lx, ly, lz] lx = ly >> lz + '42': 'LSHR', # [lx, ly, lz] lx = ly >>> lz '100': 'LOAD8', # [lx, ly, 0] lx = HEAP8[ly >> 0] '110': 'LOAD16', # [lx, ly, 0] lx = HEAP16[ly >> 1] '120': 'LOAD32', # [lx, ly, 0] lx = HEAP32[ly >> 2] From 591c87a6d219e915d3cdf20f9fac61c7fcac9bf1 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 21 Sep 2014 10:08:46 -0700 Subject: [PATCH 080/461] more sign detection --- tools/emterpretify.py | 1 - tools/js-optimizer.js | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 355169d6c5cc3..933bf715a455c 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -15,7 +15,6 @@ # consts -#BLACKLIST = set(['copyTempDouble', 'copyTempFloat', '_strlen', 'stackAlloc', 'setThrew', 'stackRestore', 'setTempRet0', 'getTempRet0', 'stackSave', 'runPostSets']) BLACKLIST = set(['_memcpy', '_memset', 'copyTempDouble', 'copyTempFloat', '_strlen', 'stackAlloc', 'setThrew', 'stackRestore', 'setTempRet0', 'getTempRet0', 'stackSave', 'runPostSets']) OPCODES = { # l, lx, ly etc - one of 256 locals diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 0adb9b788cee9..2b34b9874a87b 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1898,7 +1898,7 @@ var ASM_UNSIGNED = 2 function detectSign(node) { if (node[0] === 'binary') { switch(node[1]) { - case '|': case '&': return ASM_SIGNED; + case '|': case '&': case '^': case '<<': case '>>': return ASM_SIGNED; case '>>>': return ASM_UNSIGNED; case '+': return ASM_FLEXIBLE; default: throw 'yikes'; From b9398a09736a373c18bdf28278d31c001277d211 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 21 Sep 2014 10:11:20 -0700 Subject: [PATCH 081/461] NE --- tools/emterpretify.py | 4 +++- tools/js-optimizer.js | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 933bf715a455c..f7037f4889a58 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -26,7 +26,8 @@ '5': 'SUB', # [lx, ly, lz] lx = ly - lz (32-bit int) '7': 'SDIV', # [lx, ly, lz] lx = ly / lz (32-bit signed int) '8': 'UDIV', # [lx, ly, lz] lx = ly / lz (32-bit unsigned int) - '18': 'EQ', # [lx, ly, lz] lx = ly == lz + '18': 'EQ', # [lx, ly, lz] lx = ly == lz (32-bit int) + '19': 'NE', # [lx, ly, lz] lx = ly != lz (32-bit int) '20': 'SLT', # [lx, ly, lz] lx = ly < lz (32-bit signed) '21': 'ULT', # [lx, ly, lz] lx = ly < lz (32-bit unsigned) '22': 'SLE', # [lx, ly, lz] lx = ly <= lz (32-bit signed) @@ -89,6 +90,7 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['SDIV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') / (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['UDIV']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') / (' + get_coerced_access('lz', unsigned=True) + ') >>> 0;' CASES[ROPCODES['EQ']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') == (' + get_coerced_access('lz') + ') | 0;' +CASES[ROPCODES['NE']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') != (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['SLT']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') < (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['ULT']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') < (' + get_coerced_access('lz', unsigned=True) + ') | 0;' CASES[ROPCODES['SLE']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') <= (' + get_coerced_access('lz') + ') | 0;' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 2b34b9874a87b..c3d46fed678ff 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5791,7 +5791,7 @@ function emterpretify(ast) { switch (node[1]) { case '&': case '|': case '^': case '<<': case '>>': case '>>>': return makeMath(node, ASM_INT, ASM_SIGNED); case '>=': case '>': - case '+': case '-': case '<': case '<=': case '/': case '==': { + case '+': case '-': case '<': case '<=': case '/': case '==': case '!=': { var type = getCombinedType(node[2], node[3], asmData, typeHint); var sign = getCombinedSign(node[2], node[3], signHint); if (node[1] === '>=' || node[1] === '>') { @@ -5913,7 +5913,8 @@ function emterpretify(ast) { else opcode = 'ULE'; break; } - case '==': opcode = 'EQ'; break; + case '==': assert(type === ASM_INT); opcode = 'EQ'; break; + case '!=': assert(type === ASM_INT); opcode = 'NE'; break; case '&': opcode = 'AND'; break; case '|': opcode = 'OR'; break; case '^': opcode = 'XOR'; break; From fc2303b7ad511bac829cce815bcd40aa6f682301 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 21 Sep 2014 10:12:13 -0700 Subject: [PATCH 082/461] be more flexible in type detection, using hinting --- tools/js-optimizer.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index c3d46fed678ff..cb1940c450fca 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1887,7 +1887,10 @@ function getCombinedType(node1, node2, asmData, hint) { assert(type1 != ASM_NONE); return type1; } - assert(type1 === type2); + if (type1 !== type2) { + if (type1 === hint || type2 === hint) return hint; + assert(0, "can't figure it out " + JSON.stringify([node1, '....', node2, ' ', type1, type2, hint])); + } return type1; } From d833b65a8ec743915e555d6634f14a8b07fdac3a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 21 Sep 2014 10:20:45 -0700 Subject: [PATCH 083/461] unary - --- tools/emterpretify.py | 2 ++ tools/js-optimizer.js | 34 ++++++++++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index f7037f4889a58..8b6df61cb2755 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -26,6 +26,7 @@ '5': 'SUB', # [lx, ly, lz] lx = ly - lz (32-bit int) '7': 'SDIV', # [lx, ly, lz] lx = ly / lz (32-bit signed int) '8': 'UDIV', # [lx, ly, lz] lx = ly / lz (32-bit unsigned int) + '12': 'NEG', # [lx, ly, 0] lx = -ly (int) '18': 'EQ', # [lx, ly, lz] lx = ly == lz (32-bit int) '19': 'NE', # [lx, ly, lz] lx = ly != lz (32-bit int) '20': 'SLT', # [lx, ly, lz] lx = ly < lz (32-bit signed) @@ -89,6 +90,7 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['SUB']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') - (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['SDIV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') / (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['UDIV']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') / (' + get_coerced_access('lz', unsigned=True) + ') >>> 0;' +CASES[ROPCODES['NEG']] = get_access('lx') + ' = -(' + get_coerced_access('ly') + ');' CASES[ROPCODES['EQ']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') == (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['NE']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') != (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['SLT']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') < (' + get_coerced_access('lz') + ') | 0;' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index cb1940c450fca..74e599549fe99 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5786,13 +5786,13 @@ function emterpretify(ast) { } else if (node[1] === '>>>' && node[3][0] === 'num' && node[3][1] === 0) { // unsigned-coerced operation return getReg(node[2], dropIt, ASM_INT, ASM_UNSIGNED); - } // TODO: double etc. coercions + } // not a simple coercion assert(!dropIt); switch (node[1]) { - case '&': case '|': case '^': case '<<': case '>>': case '>>>': return makeMath(node, ASM_INT, ASM_SIGNED); + case '&': case '|': case '^': case '<<': case '>>': case '>>>': return makeBinary(node, ASM_INT, ASM_SIGNED); case '>=': case '>': case '+': case '-': case '<': case '<=': case '/': case '==': case '!=': { var type = getCombinedType(node[2], node[3], asmData, typeHint); @@ -5805,7 +5805,21 @@ function emterpretify(ast) { node[1] = node[1] === '>=' ? '<' : '<='; } else throw 'ex ' + type; } - return makeMath(node, type, sign); + return makeBinary(node, type, sign); + } + default: throw 'ehh'; + } + throw 'todo'; + } + case 'unary-prefix': { + // TODO: double coercions + assert(!dropIt); + + switch (node[1]) { + case '-': { + var type = detectAsmCoercion(node[2], asmData); + var sign = detectSign(node[2]); + return makeUnary(node, type, sign); } default: throw 'ehh'; } @@ -5895,7 +5909,7 @@ function emterpretify(ast) { return l; } - function makeMath(node, type, sign) { + function makeBinary(node, type, sign) { assert(type === ASM_INT); var opcode; switch(node[1]) { @@ -5932,6 +5946,18 @@ function emterpretify(ast) { return [x, y[1].concat(z[1]).concat([opcode, x, releaseIfFree(y[0], x), releaseIfFree(z[0], x)])]; } + function makeUnary(node, type, sign) { + assert(type === ASM_INT); + var opcode; + switch(node[1]) { + case '-': opcode = 'NEG'; break; + default: throw 'bad'; + } + var y = getReg(node[2]); + var x = getFree(y[0]); + return [x, y[1].concat([opcode, x, releaseIfFree(y[0], x), 0])]; + } + function makeCall(lx, node, type) { // TODO: specialize calls like imul assert(node[0] === 'call'); From eed085f0d9bc08be7951057dae1f1f1b2ff07833 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 21 Sep 2014 10:24:21 -0700 Subject: [PATCH 084/461] unary - sign detection --- tools/js-optimizer.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 74e599549fe99..e5d74871e45df 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1906,6 +1906,11 @@ function detectSign(node) { case '+': return ASM_FLEXIBLE; default: throw 'yikes'; } + } else if (node[0] === 'unary-prefix') { + switch(node[1]) { + case '-': return ASM_FLEXIBLE; + default: throw 'yikes'; + } } else if (node[0] === 'num' || node[0] === 'name') { return ASM_FLEXIBLE; } From b2aab86a632e465e35331470ca8e65028a29c84d Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 21 Sep 2014 10:37:24 -0700 Subject: [PATCH 085/461] todo --- tools/js-optimizer.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index e5d74871e45df..561c3ec9b9ec6 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5854,6 +5854,7 @@ function emterpretify(ast) { return [-1, reg[1].concat(['RET', value ? releaseIfFree(reg[0]) : 0, 0, 0])]; } case 'do': { + // TODO: optimize do-while(0) var top = markerId++, cond = markerId++, exit = markerId++; breakStack.push(exit); continueStack.push(cond); From 8d3a036a9f157deff1611028e0993f14859f10c7 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 21 Sep 2014 10:44:52 -0700 Subject: [PATCH 086/461] refactor do, while --- tools/js-optimizer.js | 55 ++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 561c3ec9b9ec6..6dcd5da7188c2 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5854,32 +5854,10 @@ function emterpretify(ast) { return [-1, reg[1].concat(['RET', value ? releaseIfFree(reg[0]) : 0, 0, 0])]; } case 'do': { - // TODO: optimize do-while(0) - var top = markerId++, cond = markerId++, exit = markerId++; - breakStack.push(exit); - continueStack.push(cond); - // TODO: labels - var body = walkStatements(node[2]); - breakStack.pop(); - continueStack.pop(); - var condition = getReg(node[1]); - return [-1, ['marker', top, 0, 0].concat(body).concat(['marker', cond, 0, 0]).concat(condition[1]).concat( - ['BRT', releaseIfFree(condition[0]), top, 0, 'marker', exit, 0, 0] - )]; + return makeDo(node); } case 'while': { - var condition = getReg(node[1]); - var cond = markerId++, top = markerId++, exit = markerId++; - breakStack.push(exit); - continueStack.push(cond); - // TODO: labels - var ret = ['marker', cond, 0, 0].concat(condition[1]).concat( - ['BRF', releaseIfFree(condition[0]), exit, 0, 'marker', top, 0, 0] - ); - ret = ret.concat(walkStatements(node[2])); - breakStack.pop(); - continueStack.pop(); - return [-1, ret.concat(['marker', exit, 0, 0])]; + return makeWhile(node); } case 'if': { var exit = markerId++; @@ -5964,6 +5942,35 @@ function emterpretify(ast) { return [x, y[1].concat([opcode, x, releaseIfFree(y[0], x), 0])]; } + function makeDo(node) { + // TODO: optimize do-while(0) + var top = markerId++, cond = markerId++, exit = markerId++; + breakStack.push(exit); + continueStack.push(cond); + var body = walkStatements(node[2]); + breakStack.pop(); + continueStack.pop(); + var condition = getReg(node[1]); + return [-1, ['marker', top, 0, 0].concat(body).concat(['marker', cond, 0, 0]).concat(condition[1]).concat( + ['BRT', releaseIfFree(condition[0]), top, 0, 'marker', exit, 0, 0] + )]; + } + + function makeWhile(node, label) { + var condition = getReg(node[1]); + var cond = markerId++, top = markerId++, exit = markerId++; + breakStack.push(exit); + continueStack.push(cond); + // TODO: labels + var ret = ['marker', cond, 0, 0].concat(condition[1]).concat( + ['BRF', releaseIfFree(condition[0]), exit, 0, 'marker', top, 0, 0] + ); + ret = ret.concat(walkStatements(node[2])); + breakStack.pop(); + continueStack.pop(); + return [-1, ret.concat(['marker', exit, 0, 0])]; + } + function makeCall(lx, node, type) { // TODO: specialize calls like imul assert(node[0] === 'call'); From 490bc6c5c17e6cff1cc7657b80d62f97f3c4c735 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 21 Sep 2014 10:46:44 -0700 Subject: [PATCH 087/461] labels --- tools/js-optimizer.js | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 6dcd5da7188c2..6c38bf7f1fdfa 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5859,6 +5859,17 @@ function emterpretify(ast) { case 'while': { return makeWhile(node); } + case 'label': { + var name = node[1]; + var inner = node[2]; + assert(name); + if (inner[0] === 'do') { + return makeDo(inner, name); + } else if (inner[0] === 'while') { + return makeWhile(inner, name); + } + throw 'sigh'; + } case 'if': { var exit = markerId++; var condition = getReg(node[1]); @@ -5942,14 +5953,24 @@ function emterpretify(ast) { return [x, y[1].concat([opcode, x, releaseIfFree(y[0], x), 0])]; } - function makeDo(node) { + function makeDo(node, label) { // TODO: optimize do-while(0) var top = markerId++, cond = markerId++, exit = markerId++; breakStack.push(exit); continueStack.push(cond); + if (label) { + assert(!(label in breakLabels)); + breakLabels[label] = exit; + assert(!(label in continueLabels)); + continueLabels[label] = cond; + } var body = walkStatements(node[2]); breakStack.pop(); continueStack.pop(); + if (label) { + delete breakLabels[label]; + delete continueLabels[label]; + } var condition = getReg(node[1]); return [-1, ['marker', top, 0, 0].concat(body).concat(['marker', cond, 0, 0]).concat(condition[1]).concat( ['BRT', releaseIfFree(condition[0]), top, 0, 'marker', exit, 0, 0] @@ -5961,13 +5982,22 @@ function emterpretify(ast) { var cond = markerId++, top = markerId++, exit = markerId++; breakStack.push(exit); continueStack.push(cond); - // TODO: labels + if (label) { + assert(!(label in breakLabels)); + breakLabels[label] = exit; + assert(!(label in continueLabels)); + continueLabels[label] = cond; + } var ret = ['marker', cond, 0, 0].concat(condition[1]).concat( ['BRF', releaseIfFree(condition[0]), exit, 0, 'marker', top, 0, 0] ); ret = ret.concat(walkStatements(node[2])); breakStack.pop(); continueStack.pop(); + if (label) { + delete breakLabels[label]; + delete continueLabels[label]; + } return [-1, ret.concat(['marker', exit, 0, 0])]; } From 88fa76467184388a6bf5fb6d6bd0e7510247c255 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 21 Sep 2014 11:44:28 -0700 Subject: [PATCH 088/461] conditional --- tools/js-optimizer.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 6c38bf7f1fdfa..c15303440777c 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5690,14 +5690,17 @@ function emterpretify(ast) { var ret = freeLocals.pop(); maxLocal = Math.max(maxLocal, ret); assert(ret >= numLocals); + //printErr('get free ' + ret); return ret; } // if possible is passed in, and is identical to l, then it means l was reused, and we must not free it function releaseFree(l, possible) { if (l === possible) return; + //printErr('free free ' + l); assert(freeLocals.indexOf(l) < 0); assert(l >= numLocals); freeLocals.push(l); + return l; } var markerId = 0; @@ -5885,6 +5888,19 @@ function emterpretify(ast) { } return [-1, ret.concat(['marker', exit, 0, 0])]; } + case 'conditional': { + // TODO: optimize + var otherwise = markerId++, exit = markerId++; + var temp = getFree(); + var condition = getReg(node[1]); + var ret = condition[1].concat(['BRF', releaseIfFree(condition[0]), otherwise, 0]); + var first = getReg(node[2]); + ret = ret.concat(first[1]).concat(['SET', temp, releaseIfFree(first[0]), 0, 'BR', 0, exit, 0]); + var second = getReg(node[3]); + ret = ret.concat(['marker', otherwise, 0, 0]).concat(second[1]).concat(['SET', temp, releaseIfFree(second[0]), 0]); + ret = ret.concat(['marker', exit, 0, 0]); + return [temp, ret]; + } case 'sub': { assert(node[1][0] === 'name'); // coerced heap access => a load From 03d7d242fde246526ba018e57206a99f15a9ee9a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 21 Sep 2014 11:59:10 -0700 Subject: [PATCH 089/461] break, continue --- tools/js-optimizer.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index c15303440777c..ca3f433286d7f 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5873,6 +5873,24 @@ function emterpretify(ast) { } throw 'sigh'; } + case 'break': { + var label = node[1]; + if (!label) { + assert(breakStack.length > 0); + return [-1, ['BR', 0, breakStack[breakStack.length-1], 0]]; + } + assert(label in breakLabels); + return [-1, ['BR', 0, breakLabels[label], 0]]; + } + case 'continue': { + var label = node[1]; + if (!label) { + assert(continueStack.length > 0); + return [-1, ['BR', 0, continueStack[continueStack.length-1], 0]]; + } + assert(label in continueLabels); + return [-1, ['BR', 0, continueLabels[label], 0]]; + } case 'if': { var exit = markerId++; var condition = getReg(node[1]); From 1d680307b77447bd9b68dcf29603e9ba5e0340f5 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 21 Sep 2014 14:48:53 -0700 Subject: [PATCH 090/461] seq --- tests/test_other.py | 2 +- tools/js-optimizer.js | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/test_other.py b/tests/test_other.py index 14963187e0f37..9b0c9eedc85f1 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4105,7 +4105,7 @@ def test_stat_fail_alongtheway(self): def test_emterpreter(self): - for source in ['hello_world.c', 'hello_world_loop.cpp']: + for source in ['hello_world.c', 'hello_world_loop.cpp']:#, 'fannkuch.cpp']: print print source self.clear() diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index ca3f433286d7f..cf930ed4a4262 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5919,6 +5919,12 @@ function emterpretify(ast) { ret = ret.concat(['marker', exit, 0, 0]); return [temp, ret]; } + case 'seq': { + var first = getReg(node[1], true); // first output is always dropped + releaseIfFree(first[0]); + var second = getReg(node[2], dropIt); // second output might be dropped + return [second[0], first[1].concat(second[1])]; + } case 'sub': { assert(node[1][0] === 'name'); // coerced heap access => a load From e294b9817cf26c82e8fdb394e60b6aeff63f7a77 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 21 Sep 2014 15:06:42 -0700 Subject: [PATCH 091/461] asserts and call fixes --- tools/emterpretify.py | 5 +++++ tools/js-optimizer.js | 14 ++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 8b6df61cb2755..99b992eacfe7a 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -244,6 +244,11 @@ def process_code(code): if sig not in sigs: sigs.append(sig) code[j+2] = global_funcs[target] code[j+3] = sigs.index(sig) + if sig[0] == 'v': + assert code[j+1] == -1 # dummy value for assignment + code[j+1] = 0 # clear it + else: + assert code[j+1] >= 0 # there should be a real target here # finalize instruction string names to opcodes for i in range(len(code)/4): diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index cf930ed4a4262..d0d95004166a1 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5698,7 +5698,7 @@ function emterpretify(ast) { if (l === possible) return; //printErr('free free ' + l); assert(freeLocals.indexOf(l) < 0); - assert(l >= numLocals); + assert(l >= numLocals && l <= maxLocal); freeLocals.push(l); return l; } @@ -5713,7 +5713,7 @@ function emterpretify(ast) { // if dropIt is provided, then the output of this can just be dropped. // you *must* call releaseIfFree on the l that is returned; if it is a free local, that will free it. function getReg(node, dropIt, typeHint, signHint) { - printErr('getReg ' + JSON.stringify(node)); + printErr('getReg ' + JSON.stringify(node) + ' : ' + astToSrc(node) + ' : ' + [dropIt, typeHint, signHint]); switch(node[0]) { case 'name': { var name = node[1]; @@ -5836,13 +5836,16 @@ function emterpretify(ast) { case 'call': { if (node[1][0] === 'name') { var type; + var ret; if (dropIt) { type = ASM_NONE; + ret = -1; } else { assert(typeHint !== ASM_NONE); type = typeHint; + ret = getFree(); } - return [0, makeCall(0, node, type)]; + return [ret, makeCall(ret, node, type)]; } else { // todo: function pointer call } @@ -5853,7 +5856,7 @@ function emterpretify(ast) { var value = node[1]; var reg; if (value) reg = getReg(value); - else reg = [0, []]; + else reg = [-1, []]; return [-1, reg[1].concat(['RET', value ? releaseIfFree(reg[0]) : 0, 0, 0])]; } case 'do': { @@ -6074,8 +6077,11 @@ function emterpretify(ast) { if (typeof stats[0] === 'string') stats = [stats]; var ret = []; stats.forEach(function(stat) { + var before = freeLocals.length; var raw = getReg(stat, true); //printErr('raw: ' + JSON.stringify(raw)); + releaseIfFree(raw[0]); + assert(freeLocals.length === before); // the statement is done - nothing should still be held on to var curr = raw[1]; printErr('stat: ' + JSON.stringify(curr)); verifyCode(curr); From 57be38b5e45aca141ec8e98f7eb7118e91b3207a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 21 Sep 2014 16:09:26 -0700 Subject: [PATCH 092/461] blacklist malloc/free, and simplify test --- tests/test_other.py | 15 +++++++-------- tools/emterpretify.py | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/tests/test_other.py b/tests/test_other.py index 9b0c9eedc85f1..c8457bb1b771b 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4105,17 +4105,11 @@ def test_stat_fail_alongtheway(self): def test_emterpreter(self): - for source in ['hello_world.c', 'hello_world_loop.cpp']:#, 'fannkuch.cpp']: + def do_test(source): print print source self.clear() - try: # avoid libc for now XXX - os.environ['EMCC_FORCE_STDLIBS'] = '' - os.environ['EMCC_ONLY_FORCED_STDLIBS'] = '1' - Popen([PYTHON, EMCC, path_from_root('tests', source), '-O2', '--profiling', '-s', 'FINALIZE_ASM_JS=0']).communicate() - finally: - del os.environ['EMCC_FORCE_STDLIBS'] - del os.environ['EMCC_ONLY_FORCED_STDLIBS'] + Popen([PYTHON, EMCC, path_from_root('tests', source), '-O2', '--profiling', '-s', 'FINALIZE_ASM_JS=0']).communicate() Popen([PYTHON, path_from_root('tools', 'emterpretify.py'), 'a.out.js', 'em.out.js']).communicate() self.assertContained('hello, world!', run_js('a.out.js')) self.assertContained('hello, world!', run_js('em.out.js')) @@ -4123,3 +4117,8 @@ def test_emterpreter(self): self.assertContained('hello, world!', out) self.validate_asmjs(out) + do_test('hello_world.c') + do_test('hello_world_loop.cpp') + + #, 'fannkuch.cpp']: + diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 99b992eacfe7a..f45d76e591a83 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -15,7 +15,7 @@ # consts -BLACKLIST = set(['_memcpy', '_memset', 'copyTempDouble', 'copyTempFloat', '_strlen', 'stackAlloc', 'setThrew', 'stackRestore', 'setTempRet0', 'getTempRet0', 'stackSave', 'runPostSets']) +BLACKLIST = set(['_malloc', '_free', '_memcpy', '_memset', 'copyTempDouble', 'copyTempFloat', '_strlen', 'stackAlloc', 'setThrew', 'stackRestore', 'setTempRet0', 'getTempRet0', 'stackSave', 'runPostSets']) OPCODES = { # l, lx, ly etc - one of 256 locals '0': 'SET', # [lx, ly, 0] lx = ly (int or float, not double) From 3575bd9af0b4e2bd43b9dc3fa77518d954fce1d0 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 21 Sep 2014 16:14:43 -0700 Subject: [PATCH 093/461] MUL --- tools/emterpretify.py | 2 ++ tools/js-optimizer.js | 7 ++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index f45d76e591a83..1e90d3e927aa4 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -24,6 +24,7 @@ '3': 'SETVI', # [l, vl, vh] l = v (16-bit int) '4': 'ADD', # [lx, ly, lz] lx = ly + lz (32-bit int) '5': 'SUB', # [lx, ly, lz] lx = ly - lz (32-bit int) + '6': 'MUL', # [lx, ly, lz] lx = ly * lz (32-bit int) '7': 'SDIV', # [lx, ly, lz] lx = ly / lz (32-bit signed int) '8': 'UDIV', # [lx, ly, lz] lx = ly / lz (32-bit unsigned int) '12': 'NEG', # [lx, ly, 0] lx = -ly (int) @@ -88,6 +89,7 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['SETVI']] = 'HEAP32[sp + (lx << 3) >> 2] = inst >>> 16;' CASES[ROPCODES['ADD']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['SUB']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') - (' + get_coerced_access('lz') + ') | 0;' +CASES[ROPCODES['MUL']] = get_access('lx') + ' = Math_imul(' + get_coerced_access('ly') + ', ' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['SDIV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') / (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['UDIV']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') / (' + get_coerced_access('lz', unsigned=True) + ') >>> 0;' CASES[ROPCODES['NEG']] = get_access('lx') + ' = -(' + get_coerced_access('ly') + ');' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index d0d95004166a1..f6dba7b5de560 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5802,7 +5802,7 @@ function emterpretify(ast) { switch (node[1]) { case '&': case '|': case '^': case '<<': case '>>': case '>>>': return makeBinary(node, ASM_INT, ASM_SIGNED); case '>=': case '>': - case '+': case '-': case '<': case '<=': case '/': case '==': case '!=': { + case '+': case '-': case '*': case '/': case '<': case '<=': case '==': case '!=': { var type = getCombinedType(node[2], node[3], asmData, typeHint); var sign = getCombinedSign(node[2], node[3], signHint); if (node[1] === '>=' || node[1] === '>') { @@ -5953,6 +5953,11 @@ function emterpretify(ast) { switch(node[1]) { case '+': opcode = 'ADD'; break; case '-': opcode = 'SUB'; break; + case '*': { + assert(type === ASM_INT); + opcode = 'MUL'; + break; + } case '/': { if (sign === ASM_SIGNED) opcode = 'SDIV'; else opcode = 'UDIV'; From 7786fc6d255e3d9185cb19e5cba09538046fa58e Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 21 Sep 2014 16:23:04 -0700 Subject: [PATCH 094/461] debug print of opcode names --- tools/emterpretify.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 1e90d3e927aa4..e76a5ecaf6995 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -160,7 +160,7 @@ def make_target_call(i): lx = (inst >> 8) & 255; ly = (inst >> 16) & 255; lz = inst >>> 24; - //printErr([pc, inst&255, lx, ly, lz]); + //printErr([pc, inst&255, %s[inst&255], lx, ly, lz]); //printErr(' ' + Array.prototype.slice.call(HEAPU8, sp, sp+8)); switch (inst&255) { %s @@ -173,6 +173,7 @@ def make_target_call(i): '_' if t != 'void' else '', '' if t == 'void' else t[0], ROPCODES['FUNC'], + json.dumps(OPCODES), '\n'.join([' case %d: %s break;' % (k, v) for k, v in CASES.iteritems()]), '' if t == 'void' else 'return %s;' % shared.JS.make_initializer(t[0], settings) ) From 27689dd82f3db3635e4d1c4c6b7221b8e2ce2a93 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 21 Sep 2014 16:30:17 -0700 Subject: [PATCH 095/461] number params before vars --- tools/emterpretify.py | 2 +- tools/js-optimizer.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index e76a5ecaf6995..2abf57d977e94 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -160,7 +160,7 @@ def make_target_call(i): lx = (inst >> 8) & 255; ly = (inst >> 16) & 255; lz = inst >>> 24; - //printErr([pc, inst&255, %s[inst&255], lx, ly, lz]); + //printErr([pc, inst&255, %s[inst&255], lx, ly, lz].join(', ')); //printErr(' ' + Array.prototype.slice.call(HEAPU8, sp, sp+8)); switch (inst&255) { %s diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index f6dba7b5de560..c47eac57d30a6 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6134,10 +6134,10 @@ function emterpretify(ast) { var locals = {}; var numLocals = 0; - for (var i in asmData.vars) { + for (var i in asmData.params) { locals[i] = numLocals++; } - for (var i in asmData.params) { + for (var i in asmData.vars) { locals[i] = numLocals++; } assert(numLocals <= 256); From 8c900f3dce6e410ee18609d3661af3a491ce19b7 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 21 Sep 2014 17:59:12 -0700 Subject: [PATCH 096/461] make detectAsmCoercion not see unary - as double --- tools/js-optimizer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index c47eac57d30a6..eb5e483750a4d 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1829,7 +1829,7 @@ var ASM_FLOAT_ZERO = null; // TODO: share the entire node? function detectAsmCoercion(node, asmInfo, inVarDef) { // for params, +x vs x|0, for vars, 0.0 vs 0 if (node[0] === 'num' && node[1].toString().indexOf('.') >= 0) return ASM_DOUBLE; - if (node[0] === 'unary-prefix') return ASM_DOUBLE; + if (node[0] === 'unary-prefix' && node[1] === '+') return ASM_DOUBLE; if (node[0] === 'call' && node[1][0] === 'name' && node[1][1] === 'Math_fround') return ASM_FLOAT; if (asmInfo && node[0] == 'name') return getAsmType(node[1], asmInfo); if (node[0] === 'name') { From e4f5dc103b1f3406b1773d59f5f367b90eb5640f Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 21 Sep 2014 17:59:22 -0700 Subject: [PATCH 097/461] improve assert message --- tools/emterpretify.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 2abf57d977e94..46b70332c3f01 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -131,7 +131,7 @@ def make_target_call(i): name = rglobal_funcs[i] if name not in call_sigs: return None sigs = call_sigs[name] - assert len(sigs) == 1 + assert len(sigs) == 1, [name, sigs] sig = sigs[0] ret = name + '(' + ', '.join([get_coerced_access('HEAP8[pc+%d>>0]' % (i+4)) for i in range(len(sig)-1)]) + ')' if sig[0] != 'v': From 22f04a5760b7830706504491ba977c97aa995875 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 21 Sep 2014 18:16:13 -0700 Subject: [PATCH 098/461] blacklist autodebug funcs, and add tempDoublePtr getter --- tools/emterpretify.py | 4 +++- tools/js-optimizer.js | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 46b70332c3f01..b5238f8fd3b8f 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -15,7 +15,7 @@ # consts -BLACKLIST = set(['_malloc', '_free', '_memcpy', '_memset', 'copyTempDouble', 'copyTempFloat', '_strlen', 'stackAlloc', 'setThrew', 'stackRestore', 'setTempRet0', 'getTempRet0', 'stackSave', 'runPostSets']) +BLACKLIST = set(['_malloc', '_free', '_memcpy', '_memset', 'copyTempDouble', 'copyTempFloat', '_strlen', 'stackAlloc', 'setThrew', 'stackRestore', 'setTempRet0', 'getTempRet0', 'stackSave', 'runPostSets', '_emscripten_autodebug_double', '_emscripten_autodebug_float', '_emscripten_autodebug_i8', '_emscripten_autodebug_i16', '_emscripten_autodebug_i32', '_emscripten_autodebug_i64']) OPCODES = { # l, lx, ly etc - one of 256 locals '0': 'SET', # [lx, ly, 0] lx = ly (int or float, not double) @@ -49,6 +49,7 @@ '159': 'BR', # [0, tl, th] jump t instructions (multiple of 4) '160': 'BRT', # [cond, tl, th] if cond, jump t instructions (multiple of 4) '161': 'BRF', # [cond, tl, th] if !cond, jump t instructions (multiple of 4) + '200': 'GETTDP', # [l, 0, 0] l = tempDoublePtr '250': 'CALL', # [lx, target, sig, params..] (lx = ) target(params..) lx's existence and type depend on the target's actual callsig; # this instruction can take multiple 32-bit instruction chunks '254': 'RET', # [l, 0, 0] return l (depending on which emterpreter_x we are in, has the right type) @@ -114,6 +115,7 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['BR']] = 'pc = pc + ((inst >> 16) << 2) | 0; continue;' CASES[ROPCODES['BRT']] = 'if (' + get_coerced_access('lx') + ') { pc = pc + ((inst >> 16) << 2) | 0; continue; }' CASES[ROPCODES['BRF']] = 'if (!(' + get_coerced_access('lx') + ')) { pc = pc + ((inst >> 16) << 2) | 0; continue; }' +CASES[ROPCODES['GETTDP']] = 'HEAP32[sp + (lx << 3) >> 2] = tempDoublePtr;' def make_emterpreter(t): # return is specialized per interpreter diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index eb5e483750a4d..6637e8527c3e3 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5724,6 +5724,10 @@ function emterpretify(ast) { var x = getFree(); return [x, ['GETST', x, 0, 0]]; } + case 'tempDoublePtr': { + var x = getFree(); + return [x, ['GETTDP', x, 0, 0]]; + } default: throw 'getReg global wha? ' + name; } } From 8bc2a6b2f378cbff5ba824b6259a98ab16fc6ca0 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 21 Sep 2014 19:09:05 -0700 Subject: [PATCH 099/461] fix binary bug --- tools/js-optimizer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 6637e8527c3e3..cec7fc030f3de 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5814,7 +5814,7 @@ function emterpretify(ast) { var temp = node[2]; node[2] = node[3]; node[3] = temp; - node[1] = node[1] === '>=' ? '<' : '<='; + node[1] = node[1] === '>=' ? '<=' : '<'; } else throw 'ex ' + type; } return makeBinary(node, type, sign); From 4b7ae9b8e8e6979c6a1c9fcc78a63b33786c6a92 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 21 Sep 2014 19:09:19 -0700 Subject: [PATCH 100/461] optional debug print --- tools/emterpretify.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index b5238f8fd3b8f..4576ef02f3cd4 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -168,6 +168,7 @@ def make_target_call(i): %s default: assert(0); } + //printErr('result in ' + lx + ': ' + Array.prototype.slice.call(HEAPU8, sp+8*lx, sp+8*(lx+1))); pc = pc + 4 | 0; } %s From 9d9cf5ee3c21bc4ff8674426a0831142f74c11f6 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 21 Sep 2014 19:39:51 -0700 Subject: [PATCH 101/461] add missing branch in while --- tools/js-optimizer.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index cec7fc030f3de..ea22a506dd26d 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6030,6 +6030,7 @@ function emterpretify(ast) { } function makeWhile(node, label) { + // TODO: optimize while(1) var condition = getReg(node[1]); var cond = markerId++, top = markerId++, exit = markerId++; breakStack.push(exit); @@ -6043,7 +6044,7 @@ function emterpretify(ast) { var ret = ['marker', cond, 0, 0].concat(condition[1]).concat( ['BRF', releaseIfFree(condition[0]), exit, 0, 'marker', top, 0, 0] ); - ret = ret.concat(walkStatements(node[2])); + ret = ret.concat(walkStatements(node[2])).concat(['BR', 0, cond, 0]); breakStack.pop(); continueStack.pop(); if (label) { From 2d162ea20a591ba241160820dc780a8aa3f05359 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 21 Sep 2014 20:29:23 -0700 Subject: [PATCH 102/461] prepare testing for fannkuch --- tests/test_other.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/tests/test_other.py b/tests/test_other.py index c8457bb1b771b..6f6d666d280d0 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4105,20 +4105,19 @@ def test_stat_fail_alongtheway(self): def test_emterpreter(self): - def do_test(source): + def do_test(source, args, output): print print source self.clear() Popen([PYTHON, EMCC, path_from_root('tests', source), '-O2', '--profiling', '-s', 'FINALIZE_ASM_JS=0']).communicate() Popen([PYTHON, path_from_root('tools', 'emterpretify.py'), 'a.out.js', 'em.out.js']).communicate() - self.assertContained('hello, world!', run_js('a.out.js')) - self.assertContained('hello, world!', run_js('em.out.js')) - out = run_js('em.out.js', engine=SPIDERMONKEY_ENGINE, stderr=PIPE, full_output=True) - self.assertContained('hello, world!', out) + self.assertContained(output, run_js('a.out.js', args=args)) + self.assertContained(output, run_js('em.out.js', args=args)) + out = run_js('em.out.js', engine=SPIDERMONKEY_ENGINE, args=args, stderr=PIPE, full_output=True) + self.assertContained(output, out) self.validate_asmjs(out) - do_test('hello_world.c') - do_test('hello_world_loop.cpp') - - #, 'fannkuch.cpp']: + do_test('hello_world.c', [], 'hello, world!') + do_test('hello_world_loop.cpp', [], 'hello, world!') + #do_test('fannkuch.cpp', ['5'], 'Pfannkuchen(5) = 7.') From 74e8dc504f2341edd5f2841721d9420cba62841e Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 21 Sep 2014 21:19:06 -0700 Subject: [PATCH 103/461] coerce function calls to asm functions even if return value is ignored, enable passing fannkuch test --- tests/test_other.py | 2 +- tools/emterpretify.py | 14 ++++++++++++++ tools/js-optimizer.js | 8 ++++++-- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/tests/test_other.py b/tests/test_other.py index 6f6d666d280d0..c0dafd04f9ce4 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4119,5 +4119,5 @@ def do_test(source, args, output): do_test('hello_world.c', [], 'hello, world!') do_test('hello_world_loop.cpp', [], 'hello, world!') - #do_test('fannkuch.cpp', ['5'], 'Pfannkuchen(5) = 7.') + do_test('fannkuch.cpp', ['5'], 'Pfannkuchen(5) = 7.') diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 4576ef02f3cd4..c32aac493445c 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -138,6 +138,8 @@ def make_target_call(i): ret = name + '(' + ', '.join([get_coerced_access('HEAP8[pc+%d>>0]' % (i+4)) for i in range(len(sig)-1)]) + ')' if sig[0] != 'v': ret = get_access('lx', sig[0]) + ' = ' + shared.JS.make_coercion(ret, sig[0]) + elif name in actual_return_types and actual_return_types[name] != 'v': + ret = shared.JS.make_coercion(ret, actual_return_types[name]) # return value ignored, but need a coercion extra = len(sig) - 1 # [opcode, lx, target, sig], take the usual 4. params are extra if extra > 0: ret += '; pc = pc + %d | 0' % (4*((extra+3)>>2)) @@ -262,6 +264,8 @@ def process_code(code): if type(code[j]) in (str, unicode): code[j] = ROPCODES[code[j]] +actual_return_types = {} + for i in range(len(lines)): line = lines[i] if line.startswith('function ') and '}' not in line: @@ -283,6 +287,16 @@ def process_code(code): all_code += curr func = None lines[i] = '}' + elif line.startswith('// return type: ['): + name, ret = line.split('[')[1].split(']')[0].split(',') + if ret == 'undefined': + actual_return_types[name] = 'v' + elif ret == '0': + actual_return_types[name] = 'i' + elif ret == '1': + actual_return_types[name] = 'd' + elif ret == '2': + actual_return_types[name] = 'f' # create new mem init, and calculate where code will start while len(mem_init) % 8 != 0: diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index ea22a506dd26d..5c542fc731a87 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6130,13 +6130,17 @@ function emterpretify(ast) { if (func[1] in BLACKLIST) { print(astToSrc(func)); + } + + var asmData = normalizeAsm(func); + print('// return type: [' + func[1] + ',' + asmData.ret + ']'); + + if (func[1] in BLACKLIST) { return; } printErr('emterpretifying ' + func[1]); - var asmData = normalizeAsm(func); - var locals = {}; var numLocals = 0; for (var i in asmData.params) { From 2eec4f918f105d9fdecf2a3b78cfff505eeb157d Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 13:26:59 -0700 Subject: [PATCH 104/461] optimize while(1) --- tools/js-optimizer.js | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 5c542fc731a87..d1946edc00f53 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6030,9 +6030,16 @@ function emterpretify(ast) { } function makeWhile(node, label) { - // TODO: optimize while(1) - var condition = getReg(node[1]); - var cond = markerId++, top = markerId++, exit = markerId++; + var infinite = node[1][0] === 'num' && node[1][1] === 1; // trivial infinite loops while(1) {..} do not need condition handling + var top = markerId++, exit = markerId++; + var condition, cond; + if (!infinite) { + condition = getReg(node[1]); + cond = markerId++; + } else { + condition = [-1, []]; + cond = top; + } breakStack.push(exit); continueStack.push(cond); if (label) { @@ -6041,10 +6048,13 @@ function emterpretify(ast) { assert(!(label in continueLabels)); continueLabels[label] = cond; } - var ret = ['marker', cond, 0, 0].concat(condition[1]).concat( - ['BRF', releaseIfFree(condition[0]), exit, 0, 'marker', top, 0, 0] - ); - ret = ret.concat(walkStatements(node[2])).concat(['BR', 0, cond, 0]); + var ret = []; + if (!infinite) { + ret = ret.concat(['marker', cond, 0, 0]).concat(condition[1]).concat( + ['BRF', releaseIfFree(condition[0]), exit, 0] + ); + } + ret = ret.concat(['marker', top, 0, 0]).concat(walkStatements(node[2])).concat(['BR', 0, cond, 0]); breakStack.pop(); continueStack.pop(); if (label) { From 57d69b14a91cb50a339f4030a343999e508cce09 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 13:31:55 -0700 Subject: [PATCH 105/461] optimize do-while(0) --- tools/js-optimizer.js | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index d1946edc00f53..6923d2b96c6a2 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6006,8 +6006,17 @@ function emterpretify(ast) { } function makeDo(node, label) { - // TODO: optimize do-while(0) - var top = markerId++, cond = markerId++, exit = markerId++; + var oneTime = node[1][0] === 'num' && node[1][1] === 0; // trivial one-time loops do {..} while(0) do not need condition handling + assert(!oneTime); // TODO: test + var exit = markerId++; + var top, cond; + if (!oneTime) { + top = markerId++; + cond = markerId++; + } else { + top = -1; // no need to even mark the top + cond = exit; // when we reach the condition, we just exit + } breakStack.push(exit); continueStack.push(cond); if (label) { @@ -6024,9 +6033,18 @@ function emterpretify(ast) { delete continueLabels[label]; } var condition = getReg(node[1]); - return [-1, ['marker', top, 0, 0].concat(body).concat(['marker', cond, 0, 0]).concat(condition[1]).concat( - ['BRT', releaseIfFree(condition[0]), top, 0, 'marker', exit, 0, 0] - )]; + var ret = []; + if (!oneTime) { + ret = ret.concat(['marker', top, 0, 0]); + } + ret = ret.concat(body); + if (!oneTime) { + ret = ret.concat(['marker', cond, 0, 0]).concat(condition[1]).concat( + ['BRT', releaseIfFree(condition[0]), top, 0] + ); + } + ret = ret.concat(['marker', exit, 0, 0]); + return [-1, ret]; } function makeWhile(node, label) { @@ -6038,7 +6056,7 @@ function emterpretify(ast) { cond = markerId++; } else { condition = [-1, []]; - cond = top; + cond = top; // when we reach the condition, we just go right to the top of the loop body } breakStack.push(exit); continueStack.push(cond); From 5b913ef70503d8309dc2ce8550b980d4bac5e82c Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 14:12:02 -0700 Subject: [PATCH 106/461] EMTERPRETIFY option in emcc --- emcc | 15 ++++++++++++++- src/settings.js | 2 ++ tests/test_other.py | 13 +++++++++++++ tools/emterpretify.py | 10 +++++++--- 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/emcc b/emcc index f21dbe9221131..737d1823a2897 100755 --- a/emcc +++ b/emcc @@ -1007,6 +1007,9 @@ try: if js_opts: shared.Settings.RUNNING_JS_OPTS = 1 + if shared.Settings.EMTERPRETIFY: + shared.Settings.FINALIZE_ASM_JS = 0 + shared.Settings.RUNNING_FASTCOMP = fastcomp shared.Settings.EMSCRIPTEN_VERSION = shared.EMSCRIPTEN_VERSION @@ -1461,6 +1464,17 @@ try: log_time('js opts') + js_target = unsuffixed(target) + '.js' + + if shared.Settings.EMTERPRETIFY: + try: + # move temp js to final position, alongside its mem init file + shutil.move(final, js_target) + execute([shared.PYTHON, shared.path_from_root('tools', 'emterpretify.py'), js_target, final + '.em.js', memfile]) + final = final + '.em.js' + finally: + shared.try_delete(js_target) + # Remove some trivial whitespace # TODO: do not run when compress has already been done on all parts of the code #src = open(final).read() #src = re.sub(r'\n+[ \n]*\n+', '\n', src) @@ -1479,7 +1493,6 @@ try: shell = open(shell_path).read() assert '{{{ SCRIPT }}}' in shell, 'HTML shell must contain {{{ SCRIPT }}} , see src/shell.html for an example' html = open(target, 'w') - js_target = unsuffixed(target) + '.js' base_js_target = os.path.basename(js_target) if proxy_to_worker: child_js = shared.Settings.PROXY_TO_WORKER_FILENAME or target_basename diff --git a/src/settings.js b/src/settings.js index a31ee71bceabe..19707641da5a0 100644 --- a/src/settings.js +++ b/src/settings.js @@ -559,6 +559,8 @@ var NO_DYNAMIC_EXECUTION = 0; // When enabled, we do not emit eval() and new Fun // acceptable in places that disallow dynamic code execution (chrome packaged app, non- // privileged firefox app, etc.) +var EMTERPRETIFY = 0; // Runs tools/emterpretify on the compiler output + var RUNNING_JS_OPTS = 0; // whether js opts will be run, after the main compiler var RUNNING_FASTCOMP = 1; // whether we are running the fastcomp backend diff --git a/tests/test_other.py b/tests/test_other.py index c0dafd04f9ce4..b2f5dbbd9c03c 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4105,6 +4105,17 @@ def test_stat_fail_alongtheway(self): def test_emterpreter(self): + def do_emcc_test(source, args, output): + print + print 'emcc', source + self.clear() + Popen([PYTHON, EMCC, path_from_root('tests', source), '-O2', '--profiling', '-s', 'EMTERPRETIFY=1']).communicate() + self.assertContained(output, run_js('a.out.js', args=args)) + out = run_js('a.out.js', engine=SPIDERMONKEY_ENGINE, args=args, stderr=PIPE, full_output=True) + self.assertContained(output, out) + self.validate_asmjs(out) + assert 'function emterpret' in open('a.out.js').read() + def do_test(source, args, output): print print source @@ -4117,6 +4128,8 @@ def do_test(source, args, output): self.assertContained(output, out) self.validate_asmjs(out) + do_emcc_test('hello_world.c', [], 'hello, world!') + do_test('hello_world.c', [], 'hello, world!') do_test('hello_world_loop.cpp', [], 'hello, world!') do_test('fannkuch.cpp', ['5'], 'Pfannkuchen(5) = 7.') diff --git a/tools/emterpretify.py b/tools/emterpretify.py index c32aac493445c..adf4e4e8d660c 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -187,6 +187,7 @@ def make_target_call(i): infile = sys.argv[1] outfile = sys.argv[2] +force_memfile = sys.argv[3] if len(sys.argv) >= 4 else None print 'emterpretifying %s to %s' % (infile, outfile) @@ -221,9 +222,12 @@ def make_target_call(i): in_mem_file = infile + '.mem' out_mem_file = outfile + '.mem' -assert in_mem_file in asm.pre_js, 'we assume a mem init file for now' -asm.pre_js = asm.pre_js.replace(in_mem_file, out_mem_file) -assert os.path.exists(in_mem_file), 'need to find mem file at %s' % mem_file +assert in_mem_file in asm.pre_js, 'we assume a mem init file for now (looked for %s)' % in_mem_file +if not force_memfile: + asm.pre_js = asm.pre_js.replace(in_mem_file, out_mem_file) + assert os.path.exists(in_mem_file), 'need to find mem file at %s' % mem_file +else: + out_mem_file = force_memfile mem_init = map(ord, open(in_mem_file, 'rb').read()) zero_space = asm.staticbump - len(mem_init) assert zero_space >= 0 # can be positive, if we add a bump of zeros From 8b1ad9f6fe9352633b56fd43deee022dbe95cfa4 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 14:15:32 -0700 Subject: [PATCH 107/461] check for mem init file for emterpreter --- emcc | 1 + 1 file changed, 1 insertion(+) diff --git a/emcc b/emcc index 737d1823a2897..b9c55abe747ef 100755 --- a/emcc +++ b/emcc @@ -1467,6 +1467,7 @@ try: js_target = unsuffixed(target) + '.js' if shared.Settings.EMTERPRETIFY: + assert memory_init_file, 'emterpreter requires a mem init file' try: # move temp js to final position, alongside its mem init file shutil.move(final, js_target) From 56209dd54e604b7f838d61080c1923bff5b89cb4 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 14:19:22 -0700 Subject: [PATCH 108/461] disable assert --- tools/js-optimizer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 6923d2b96c6a2..146a4ee872294 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6007,7 +6007,7 @@ function emterpretify(ast) { function makeDo(node, label) { var oneTime = node[1][0] === 'num' && node[1][1] === 0; // trivial one-time loops do {..} while(0) do not need condition handling - assert(!oneTime); // TODO: test + // TODO: more testing assert(!oneTime); var exit = markerId++; var top, cond; if (!oneTime) { From a8d880b3ebefe7ff6ed1399f936937eb15ab4b1a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 16:13:39 -0700 Subject: [PATCH 109/461] work towards some benchmarking --- tests/test_benchmark.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/tests/test_benchmark.py b/tests/test_benchmark.py index b569a01063549..0c00a3d2066e2 100644 --- a/tests/test_benchmark.py +++ b/tests/test_benchmark.py @@ -10,7 +10,7 @@ # 3: 1 second # 4: 5 seconds # 5: 10 seconds -DEFAULT_ARG = '4' +DEFAULT_ARG = '2' TEST_REPS = 2 @@ -109,11 +109,11 @@ def process(filename): try_delete(final) output = Popen([PYTHON, EMCC, filename, #'-O3', '-O3', '-s', 'DOUBLE_MODE=0', '-s', 'PRECISE_I64_MATH=0', - '--memory-init-file', '0', '--js-transform', 'python hardcode.py', + '--memory-init-file', '1', '--js-transform', 'python hardcode.py', '-s', 'TOTAL_MEMORY=128*1024*1024', - #'--profiling', + '--profiling', #'--closure', '1', - '-o', final] + shared_args + emcc_args + self.extra_args, stdout=PIPE, stderr=PIPE, env=self.env).communicate() + '-o', final] + shared_args + emcc_args + self.extra_args, stdout=None, stderr=None, env=self.env).communicate() assert os.path.exists(final), 'Failed to compile file: ' + output[0] self.filename = final @@ -134,12 +134,14 @@ def run(self, args): benchmarkers_error = '' benchmarkers = [ #NativeBenchmarker('clang', CLANG_CC, CLANG), - NativeBenchmarker(default_native_name, os.path.join(default_native, 'clang'), os.path.join(default_native, 'clang++')), + #NativeBenchmarker(default_native_name, os.path.join(default_native, 'clang'), os.path.join(default_native, 'clang++')), #NativeBenchmarker('clang-3.2-O3', os.path.join(default_native, 'clang'), os.path.join(default_native, 'clang++'), ['-O3']), #NativeBenchmarker('clang-3.3', os.path.join(LLVM_3_3, 'clang'), os.path.join(LLVM_3_3, 'clang++')), #NativeBenchmarker('clang-3.4', os.path.join(LLVM_3_4, 'clang'), os.path.join(LLVM_3_4, 'clang++')), #NativeBenchmarker('gcc', 'gcc', 'g++'), - JSBenchmarker('sm-f32', SPIDERMONKEY_ENGINE, ['-s', 'PRECISE_F32=2']), + #JSBenchmarker('sm-f32', SPIDERMONKEY_ENGINE, ['-s', 'PRECISE_F32=2']), + #JSBenchmarker('sm', SPIDERMONKEY_ENGINE), + JSBenchmarker('sm-emterp', SPIDERMONKEY_ENGINE, ['-s', 'EMTERPRETIFY=1']), #JSBenchmarker('sm-f32-si', SPIDERMONKEY_ENGINE, ['--profiling', '-s', 'PRECISE_F32=2', '-s', 'SIMPLIFY_IFS=1']), #JSBenchmarker('sm-f32-aggro', SPIDERMONKEY_ENGINE, ['-s', 'PRECISE_F32=2', '-s', 'AGGRESSIVE_VARIABLE_ELIMINATION=1']), #JSBenchmarker('sm-f32-3.2', SPIDERMONKEY_ENGINE, ['-s', 'PRECISE_F32=2'], env={ 'LLVM': LLVM_3_2 }), From b9d49582220e5910dbfbb8a5450168594c2a1e20 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 16:21:48 -0700 Subject: [PATCH 110/461] initial switch support --- tools/emterpretify.py | 37 +++++++++++++++++++---- tools/js-optimizer.js | 69 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 100 insertions(+), 6 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index adf4e4e8d660c..2db01beb55457 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -49,9 +49,12 @@ '159': 'BR', # [0, tl, th] jump t instructions (multiple of 4) '160': 'BRT', # [cond, tl, th] if cond, jump t instructions (multiple of 4) '161': 'BRF', # [cond, tl, th] if !cond, jump t instructions (multiple of 4) + #'170': 'ABR', # [lx, 0, 0, 0] absolute branch to address lx (assumed divisible by 4) '200': 'GETTDP', # [l, 0, 0] l = tempDoublePtr + #'201': 'GETPC', # [l, 0, 0] l = pc '250': 'CALL', # [lx, target, sig, params..] (lx = ) target(params..) lx's existence and type depend on the target's actual callsig; # this instruction can take multiple 32-bit instruction chunks + '251': 'SWITCH', # [lx, ly, lz] switch (lx) { .. }. followed by a jump table for values in range [ly..ly+lz), after which is the default (which might be empty) '254': 'RET', # [l, 0, 0] return l (depending on which emterpreter_x we are in, has the right type) '255': 'FUNC', # [n, 0, 0] function with n locals (each taking 64 bits) } @@ -60,10 +63,16 @@ for o in OPCODES: ROPCODES[OPCODES[o]] = int(o); +GLOBAL_BASE = 8 + # utils settings = { 'PRECISE_F32': 0 } # TODO +def bytify(x): + assert x >= 0 and x << (2**32) + return [x & 255, (x >> 8) & 255, (x >> 16) & 255, (x >> 24) & 255] + def get_access(l, s='i'): if s == 'i': return 'HEAP32[sp + (' + l + ' << 3) >> 2]' @@ -115,7 +124,18 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['BR']] = 'pc = pc + ((inst >> 16) << 2) | 0; continue;' CASES[ROPCODES['BRT']] = 'if (' + get_coerced_access('lx') + ') { pc = pc + ((inst >> 16) << 2) | 0; continue; }' CASES[ROPCODES['BRF']] = 'if (!(' + get_coerced_access('lx') + ')) { pc = pc + ((inst >> 16) << 2) | 0; continue; }' +#CASES[ROPCODES['ABR']] = 'pc = ' + get_coerced_access('lx') + '; continue;' CASES[ROPCODES['GETTDP']] = 'HEAP32[sp + (lx << 3) >> 2] = tempDoublePtr;' +#CASES[ROPCODES['GETPC']] = 'HEAP32[sp + (lx << 3) >> 2] = pc;' +CASES[ROPCODES['SWITCH']] = ''' +lx = (lx - ly) >>> 0; // lx is now relative to the base +if ((lx >>> 0) >= (lz >>> 0)) { // is the adjusted value too big? + pc = (pc + (lz << 2)) | 0; // jump to right after the table, where the default is + continue; +} +pc = HEAP32[pc + 4 + (lx << 2) >> 2] | 0; // we are within range, load from the jump table which is right after this instruction, and set pc to that +continue; +''' def make_emterpreter(t): # return is specialized per interpreter @@ -244,11 +264,13 @@ def make_target_call(i): # first pass, collect and process bytecode call_sigs = {} # signatures appearing for each call target -def process_code(code): - # find CALL instructions and fix their targets and signatures +def process_code(code, absolute_targets): + absolute_start = len(all_code) + GLOBAL_BASE + for i in range(len(code)/4): j = i*4 if code[j] == 'CALL': + # fix CALL instructions' targets and signatures target = code[j+2] sig = code[j+3] if target not in call_sigs: call_sigs[target] = [] @@ -261,6 +283,11 @@ def process_code(code): code[j+1] = 0 # clear it else: assert code[j+1] >= 0 # there should be a real target here + elif code[j] == 'absolute-value': + # put the 32-bit absolute value of an abolute target here + value = bytify(absolute_targets[code[j+1]]) + for k in range(4): + code[j + k] = value[k] # finalize instruction string names to opcodes for i in range(len(code)/4): @@ -278,7 +305,7 @@ def process_code(code): elif line.startswith('}'): assert func try: - curr = json.loads(line[4:]) + curr, absolute_targets = json.loads(line[4:]) except: if '[' in line: print >> sys.stderr, 'failed to parse code from', line curr = None @@ -286,7 +313,7 @@ def process_code(code): assert len(curr) % 4 == 0, curr funcs[func] = len(all_code) # no operation here should change the length print >> sys.stderr, 'raw bytecode for %s:' % func, curr - process_code(curr) + process_code(curr, absolute_targets) print >> sys.stderr, 'processed bytecode for %s:' % func, curr all_code += curr func = None @@ -306,7 +333,7 @@ def process_code(code): while len(mem_init) % 8 != 0: mem_init.append(0) asm.staticbump += 1 -code_start = len(mem_init) + 8 # 8 is GLOBAL_BASE +code_start = len(mem_init) + GLOBAL_BASE mem_init = mem_init + all_code asm.staticbump += len(all_code) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 146a4ee872294..ac21bc1d23a7e 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5704,6 +5704,9 @@ function emterpretify(ast) { } var markerId = 0; + var absoluteId = 0; + var absoluteTargets = {}; + var breakStack = []; var continueStack = []; var breakLabels = {}; @@ -5943,6 +5946,66 @@ function emterpretify(ast) { var x = getFree(y[0]); return [x, y[1].concat([opcode, x, releaseIfFree(y[0], x), 0])]; } + case 'switch': { + var condition = getReg(node[1]); + var exit = markerId++; + // parse cases and emit code + breakStack.push(exit); + var data = {}; + var cases = node[2]; + var minn = Infinity, maxx = -Infinity; + for (var i = 0; i < cases.length; i++) { + var c = cases[i]; + var id; + if (c[0] === null) id = 'default'; + else if (c[0][0] === 'num') id = c[0][1]; + else if (c[0][0] === 'unary-prefix' && c[0][2][0] === 'num') id = -c[0][2][1]; + else throw 'bad case'; + data[id] = { + code: walkStatements(c[1]), + absolute: absoluteId++ + }; + if (typeof id === 'number') { + minn = Math.min(id, minn); + maxx = Math.max(id, maxx); + } + } + breakStack.pop(); + var range = maxx - minn + 1; + assert(minn >= 0 && maxx < 128); // we need both minn to be a tiny int, and their range + var defaultAbsolute = data['default'] ? data['default'].absolute : absoluteId++; + // emit the switch instruction itself + var tempMin = getFree(), tempRange = getFree(); + var ret = condition[1].concat(['SETVI', tempMin, minn, 0, 'SETVI', tempRange, range, 0, + 'SWITCH', condition[0], tempMin, tempRange]); + releaseFree(tempRange); + releaseFree(tempMin); + releaseIfFree(condition[0]); + // emit the jump table + for (var i = 0; i < range; i++) { + if (data[i]) { + ret.push('absolute-value', data[i].absolute, 0, 0); + } else { + ret.push('absolute-value', defaultAbsolute, 0, 0); + } + } + // emit the default TODO: optimize when there is no default + ret.push('absolute-target', defaultAbsolute, 0, 0); + if (data['default']) { + ret = ret.concat(data['default'].code); + } + ret.push('BR', 0, exit, 0); + // emit the jump table targets + for (var i = 0; i < range; i++) { + if (data[i]) { + ret.push('absolute-target', data[i].absolute, 0, 0); + ret = ret.concat(data[i].code); + ret.push('BR', 0, exit, 0); + } + } + ret.push('marker', exit, 0, 0); + return [-1, ret]; + } default: throw 'getReg wha? ' + node[0] + new Error().stack; } } @@ -6137,6 +6200,10 @@ function emterpretify(ast) { markers[code[i+1]] = i; code.splice(i, 4); i -= 4; + } else if (code[i] === 'absolute-target') { + absoluteTargets[code[i+1]] = i; + code.splice(i, 4); + i -= 4; } } // second pass, finalize jumps TODO: optimize jump->jump->x to jump->x @@ -6233,7 +6300,7 @@ function emterpretify(ast) { //printErr(JSON.stringify(code)); - print(astToSrc(func) + ' //' + JSON.stringify(code) + ''); + print(astToSrc(func) + ' //' + JSON.stringify([code,absoluteTargets])); } traverseGeneratedFunctions(ast, walkFunction); } From 50c0e6f245b0ef91d0bcb2560722b6d02b59de4b Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 16:25:34 -0700 Subject: [PATCH 111/461] block --- tools/js-optimizer.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index ac21bc1d23a7e..23c819bdb4473 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5946,6 +5946,9 @@ function emterpretify(ast) { var x = getFree(y[0]); return [x, y[1].concat([opcode, x, releaseIfFree(y[0], x), 0])]; } + case 'block': { + return [-1, walkStatements(node[1])]; + } case 'switch': { var condition = getReg(node[1]); var exit = markerId++; From 590970664af56fea042ad3fb06dfdeaff4fc6f28 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 16:28:59 -0700 Subject: [PATCH 112/461] tolerate flexible signs when possible --- tools/js-optimizer.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 23c819bdb4473..fff4a0f0f2a92 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1921,8 +1921,7 @@ function getCombinedSign(node1, node2, hint) { var sign1 = detectSign(node1); var sign2 = detectSign(node2); if (sign1 === ASM_FLEXIBLE && sign2 === ASM_FLEXIBLE) { - assert(hint !== undefined); - return hint; + return ASM_FLEXIBLE; } if (sign1 === ASM_FLEXIBLE) { assert(sign2 != ASM_FLEXIBLE); @@ -6029,16 +6028,19 @@ function emterpretify(ast) { break; } case '/': { + assert(sign !== ASM_FLEXIBLE); if (sign === ASM_SIGNED) opcode = 'SDIV'; else opcode = 'UDIV'; break; } case '<': { + assert(sign !== ASM_FLEXIBLE); if (sign === ASM_SIGNED) opcode = 'SLT'; else opcode = 'ULT'; break; } case '<=': { + assert(sign !== ASM_FLEXIBLE); if (sign === ASM_SIGNED) opcode = 'SLE'; else opcode = 'ULE'; break; From 7840fc3eac7b000aa2db12902f6f76787c0fa61d Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 16:42:44 -0700 Subject: [PATCH 113/461] fix register leak in makeDo --- tools/js-optimizer.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index fff4a0f0f2a92..4880dd042ce70 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6100,7 +6100,10 @@ function emterpretify(ast) { delete breakLabels[label]; delete continueLabels[label]; } - var condition = getReg(node[1]); + var condition; + if (!oneTime) { + condition = getReg(node[1]); + } var ret = []; if (!oneTime) { ret = ret.concat(['marker', top, 0, 0]); @@ -6187,7 +6190,7 @@ function emterpretify(ast) { var raw = getReg(stat, true); //printErr('raw: ' + JSON.stringify(raw)); releaseIfFree(raw[0]); - assert(freeLocals.length === before); // the statement is done - nothing should still be held on to + if (freeLocals.length !== before) assert(0, [before, freeLocals.length] + ' due to ' + astToSrc(stat)); // the statement is done - nothing should still be held on to var curr = raw[1]; printErr('stat: ' + JSON.stringify(curr)); verifyCode(curr); From ada40fa10f58283f5e91af84184d421d4eee0931 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 16:48:32 -0700 Subject: [PATCH 114/461] fix emterpretify on absolute paths --- tools/emterpretify.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 2db01beb55457..8f0cc92b5dda7 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -241,13 +241,17 @@ def make_target_call(i): asm = asm_module.AsmModule(temp) in_mem_file = infile + '.mem' +in_mem_file_base = os.path.basename(in_mem_file) out_mem_file = outfile + '.mem' -assert in_mem_file in asm.pre_js, 'we assume a mem init file for now (looked for %s)' % in_mem_file +out_mem_file_base = os.path.basename(out_mem_file) + +assert in_mem_file_base in asm.pre_js, 'we assume a mem init file for now (looked for %s)' % in_mem_file if not force_memfile: - asm.pre_js = asm.pre_js.replace(in_mem_file, out_mem_file) - assert os.path.exists(in_mem_file), 'need to find mem file at %s' % mem_file + asm.pre_js = asm.pre_js.replace(in_mem_file_base, out_mem_file_base) + assert os.path.exists(in_mem_file), 'need to find mem file at %s' % in_mem_file else: out_mem_file = force_memfile + out_mem_file_base = os.path.basename(out_mem_file) mem_init = map(ord, open(in_mem_file, 'rb').read()) zero_space = asm.staticbump - len(mem_init) assert zero_space >= 0 # can be positive, if we add a bump of zeros From 50a88cc708b4d69b79d68b342bc9e26587a9d365 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 16:55:52 -0700 Subject: [PATCH 115/461] absolute target fixes --- tools/emterpretify.py | 3 +-- tools/js-optimizer.js | 7 ++++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 8f0cc92b5dda7..6eeb1abe2c728 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -270,7 +270,6 @@ def make_target_call(i): call_sigs = {} # signatures appearing for each call target def process_code(code, absolute_targets): absolute_start = len(all_code) + GLOBAL_BASE - for i in range(len(code)/4): j = i*4 if code[j] == 'CALL': @@ -289,7 +288,7 @@ def process_code(code, absolute_targets): assert code[j+1] >= 0 # there should be a real target here elif code[j] == 'absolute-value': # put the 32-bit absolute value of an abolute target here - value = bytify(absolute_targets[code[j+1]]) + value = bytify(absolute_targets[unicode(code[j+1])]) for k in range(4): code[j + k] = value[k] diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 4880dd042ce70..a8dab3b843d45 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5999,9 +5999,10 @@ function emterpretify(ast) { ret.push('BR', 0, exit, 0); // emit the jump table targets for (var i = 0; i < range; i++) { - if (data[i]) { - ret.push('absolute-target', data[i].absolute, 0, 0); - ret = ret.concat(data[i].code); + var j = minn + i; + if (data[j]) { + ret.push('absolute-target', data[j].absolute, 0, 0); + ret = ret.concat(data[j].code); ret.push('BR', 0, exit, 0); } } From 05c7fbaddddaa5ce920fa9e17e495fd822eafd0e Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 17:07:18 -0700 Subject: [PATCH 116/461] fix switch opcode implementation --- tools/emterpretify.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 6eeb1abe2c728..473d540d3adc1 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -128,7 +128,8 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['GETTDP']] = 'HEAP32[sp + (lx << 3) >> 2] = tempDoublePtr;' #CASES[ROPCODES['GETPC']] = 'HEAP32[sp + (lx << 3) >> 2] = pc;' CASES[ROPCODES['SWITCH']] = ''' -lx = (lx - ly) >>> 0; // lx is now relative to the base +lz = ''' + get_coerced_access('lz') + '''; +lx = ((''' + get_coerced_access('lx') + ''') - (''' + get_coerced_access('ly') + ''')) >>> 0; // lx is now relative to the base if ((lx >>> 0) >= (lz >>> 0)) { // is the adjusted value too big? pc = (pc + (lz << 2)) | 0; // jump to right after the table, where the default is continue; From 8b88d1d27463e1203bb75bb468ead31ac9fd4331 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 17:07:28 -0700 Subject: [PATCH 117/461] fix jump table emitting --- tools/js-optimizer.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index a8dab3b843d45..f78235a208a59 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5985,8 +5985,9 @@ function emterpretify(ast) { releaseIfFree(condition[0]); // emit the jump table for (var i = 0; i < range; i++) { - if (data[i]) { - ret.push('absolute-value', data[i].absolute, 0, 0); + var j = minn + i; + if (data[j]) { + ret.push('absolute-value', data[j].absolute, 0, 0); } else { ret.push('absolute-value', defaultAbsolute, 0, 0); } From 12b043b0c6067a9d6e53247af6855440627749cb Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 17:14:11 -0700 Subject: [PATCH 118/461] fix absolute positioning --- tools/emterpretify.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 473d540d3adc1..dc50875cea6c7 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -259,6 +259,12 @@ def make_target_call(i): assert 'GLOBAL_BASE: 8,' in asm.pre_js +# calculate where code will start +while len(mem_init) % 8 != 0: + mem_init.append(0) + asm.staticbump += 1 +code_start = len(mem_init) + GLOBAL_BASE + # parse out bytecode and add to mem init file all_code = [] funcs = {} @@ -270,7 +276,7 @@ def make_target_call(i): call_sigs = {} # signatures appearing for each call target def process_code(code, absolute_targets): - absolute_start = len(all_code) + GLOBAL_BASE + absolute_start = code_start + len(all_code) # true absolute starting point of this function for i in range(len(code)/4): j = i*4 if code[j] == 'CALL': @@ -289,7 +295,7 @@ def process_code(code, absolute_targets): assert code[j+1] >= 0 # there should be a real target here elif code[j] == 'absolute-value': # put the 32-bit absolute value of an abolute target here - value = bytify(absolute_targets[unicode(code[j+1])]) + value = bytify(absolute_start + absolute_targets[unicode(code[j+1])]) for k in range(4): code[j + k] = value[k] @@ -333,11 +339,7 @@ def process_code(code, absolute_targets): elif ret == '2': actual_return_types[name] = 'f' -# create new mem init, and calculate where code will start -while len(mem_init) % 8 != 0: - mem_init.append(0) - asm.staticbump += 1 -code_start = len(mem_init) + GLOBAL_BASE +# create new mem init mem_init = mem_init + all_code asm.staticbump += len(all_code) From 3f6541766e89ecfe8b9bac785facb64821d5c59a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 17:33:34 -0700 Subject: [PATCH 119/461] debug prints --- tools/emterpretify.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index dc50875cea6c7..7d4cdeec7f1a6 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -275,8 +275,9 @@ def make_target_call(i): # first pass, collect and process bytecode call_sigs = {} # signatures appearing for each call target -def process_code(code, absolute_targets): +def process_code(func, code, absolute_targets): absolute_start = code_start + len(all_code) # true absolute starting point of this function + #print 'processing code', func, absolute_start for i in range(len(code)/4): j = i*4 if code[j] == 'CALL': @@ -295,6 +296,7 @@ def process_code(code, absolute_targets): assert code[j+1] >= 0 # there should be a real target here elif code[j] == 'absolute-value': # put the 32-bit absolute value of an abolute target here + #print ' fixing absolute value', code[j+1], absolute_targets[unicode(code[j+1])], absolute_start + absolute_targets[unicode(code[j+1])] value = bytify(absolute_start + absolute_targets[unicode(code[j+1])]) for k in range(4): code[j + k] = value[k] @@ -323,7 +325,7 @@ def process_code(code, absolute_targets): assert len(curr) % 4 == 0, curr funcs[func] = len(all_code) # no operation here should change the length print >> sys.stderr, 'raw bytecode for %s:' % func, curr - process_code(curr, absolute_targets) + process_code(func, curr, absolute_targets) print >> sys.stderr, 'processed bytecode for %s:' % func, curr all_code += curr func = None From 87340e57b4e09eb0396074f460cc5dbf1efe7960 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 17:36:03 -0700 Subject: [PATCH 120/461] benchmarking set up --- tests/test_benchmark.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/test_benchmark.py b/tests/test_benchmark.py index 0c00a3d2066e2..e97e60cbb3788 100644 --- a/tests/test_benchmark.py +++ b/tests/test_benchmark.py @@ -113,7 +113,8 @@ def process(filename): '-s', 'TOTAL_MEMORY=128*1024*1024', '--profiling', #'--closure', '1', - '-o', final] + shared_args + emcc_args + self.extra_args, stdout=None, stderr=None, env=self.env).communicate() + '-o', final] + shared_args + emcc_args + self.extra_args, stdout=PIPE, stderr=PIPE, env=self.env).communicate() + #'-o', final] + shared_args + emcc_args + self.extra_args, stdout=None, stderr=None, env=self.env).communicate() assert os.path.exists(final), 'Failed to compile file: ' + output[0] self.filename = final @@ -140,7 +141,7 @@ def run(self, args): #NativeBenchmarker('clang-3.4', os.path.join(LLVM_3_4, 'clang'), os.path.join(LLVM_3_4, 'clang++')), #NativeBenchmarker('gcc', 'gcc', 'g++'), #JSBenchmarker('sm-f32', SPIDERMONKEY_ENGINE, ['-s', 'PRECISE_F32=2']), - #JSBenchmarker('sm', SPIDERMONKEY_ENGINE), + JSBenchmarker('sm', SPIDERMONKEY_ENGINE), JSBenchmarker('sm-emterp', SPIDERMONKEY_ENGINE, ['-s', 'EMTERPRETIFY=1']), #JSBenchmarker('sm-f32-si', SPIDERMONKEY_ENGINE, ['--profiling', '-s', 'PRECISE_F32=2', '-s', 'SIMPLIFY_IFS=1']), #JSBenchmarker('sm-f32-aggro', SPIDERMONKEY_ENGINE, ['-s', 'PRECISE_F32=2', '-s', 'AGGRESSIVE_VARIABLE_ELIMINATION=1']), From 3c17be5e13354a021f2ea16057451c5e0172de90 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 17:53:19 -0700 Subject: [PATCH 121/461] remove a branch from the interpreter --- tools/emterpretify.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 7d4cdeec7f1a6..dd7daace829b5 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -171,6 +171,10 @@ def make_target_call(i): '\n default: assert(0);' + \ '\n }' + def fix_case(case): + # we increment pc at the top of the loop. cases doing 'continue' really need to decrement it + return case.replace('continue;', 'pc = pc - 4 | 0; continue;') + return r''' function emterpret%s%s(pc) { pc = pc | 0; @@ -178,9 +182,9 @@ def make_target_call(i): sp = EMTSTACKTOP; assert(((HEAPU8[pc>>0]>>>0) == %d)|0); EMTSTACKTOP = EMTSTACKTOP + (HEAP8[pc + 1 >> 0] << 3) | 0; - pc = pc + 4 | 0; assert(((EMTSTACKTOP|0) <= (EMT_STACK_MAX|0))|0); while (1) { + pc = pc + 4 | 0; inst = HEAP32[pc>>2]|0; lx = (inst >> 8) & 255; ly = (inst >> 16) & 255; @@ -192,7 +196,6 @@ def make_target_call(i): default: assert(0); } //printErr('result in ' + lx + ': ' + Array.prototype.slice.call(HEAPU8, sp+8*lx, sp+8*(lx+1))); - pc = pc + 4 | 0; } %s }''' % ( @@ -200,7 +203,7 @@ def make_target_call(i): '' if t == 'void' else t[0], ROPCODES['FUNC'], json.dumps(OPCODES), - '\n'.join([' case %d: %s break;' % (k, v) for k, v in CASES.iteritems()]), + '\n'.join([fix_case(' case %d: %s break;' % (k, v)) for k, v in CASES.iteritems()]), '' if t == 'void' else 'return %s;' % shared.JS.make_initializer(t[0], settings) ) From 412eaa43376e77a2d20e23caf78a8fcd2bc595a7 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 18:02:20 -0700 Subject: [PATCH 122/461] SMOD, UMOD --- tools/emterpretify.py | 4 ++++ tools/js-optimizer.js | 8 +++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index dd7daace829b5..4a06c2c8f5385 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -27,6 +27,8 @@ '6': 'MUL', # [lx, ly, lz] lx = ly * lz (32-bit int) '7': 'SDIV', # [lx, ly, lz] lx = ly / lz (32-bit signed int) '8': 'UDIV', # [lx, ly, lz] lx = ly / lz (32-bit unsigned int) + '9': 'SMOD', # [lx, ly, lz] lx = ly % lz (32-bit signed int) + '10': 'UMOD', # [lx, ly, lz] lx = ly % lz (32-bit unsigned int) '12': 'NEG', # [lx, ly, 0] lx = -ly (int) '18': 'EQ', # [lx, ly, lz] lx = ly == lz (32-bit int) '19': 'NE', # [lx, ly, lz] lx = ly != lz (32-bit int) @@ -102,6 +104,8 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['MUL']] = get_access('lx') + ' = Math_imul(' + get_coerced_access('ly') + ', ' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['SDIV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') / (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['UDIV']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') / (' + get_coerced_access('lz', unsigned=True) + ') >>> 0;' +CASES[ROPCODES['SMOD']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') % (' + get_coerced_access('lz') + ') | 0;' +CASES[ROPCODES['UMOD']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') % (' + get_coerced_access('lz', unsigned=True) + ') >>> 0;' CASES[ROPCODES['NEG']] = get_access('lx') + ' = -(' + get_coerced_access('ly') + ');' CASES[ROPCODES['EQ']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') == (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['NE']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') != (' + get_coerced_access('lz') + ') | 0;' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index f78235a208a59..58805008e145b 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5808,7 +5808,7 @@ function emterpretify(ast) { switch (node[1]) { case '&': case '|': case '^': case '<<': case '>>': case '>>>': return makeBinary(node, ASM_INT, ASM_SIGNED); case '>=': case '>': - case '+': case '-': case '*': case '/': case '<': case '<=': case '==': case '!=': { + case '+': case '-': case '*': case '/': case '%': case '<': case '<=': case '==': case '!=': { var type = getCombinedType(node[2], node[3], asmData, typeHint); var sign = getCombinedSign(node[2], node[3], signHint); if (node[1] === '>=' || node[1] === '>') { @@ -6035,6 +6035,12 @@ function emterpretify(ast) { else opcode = 'UDIV'; break; } + case '%': { + assert(sign !== ASM_FLEXIBLE); + if (sign === ASM_SIGNED) opcode = 'SMOD'; + else opcode = 'UMOD'; + break; + } case '<': { assert(sign !== ASM_FLEXIBLE); if (sign === ASM_SIGNED) opcode = 'SLT'; From 5038e9c9799d98ee941e20176cbf7408ba985eb8 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 18:08:06 -0700 Subject: [PATCH 123/461] LNOT --- tools/emterpretify.py | 2 ++ tools/js-optimizer.js | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 4a06c2c8f5385..8da81718db0d4 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -30,6 +30,7 @@ '9': 'SMOD', # [lx, ly, lz] lx = ly % lz (32-bit signed int) '10': 'UMOD', # [lx, ly, lz] lx = ly % lz (32-bit unsigned int) '12': 'NEG', # [lx, ly, 0] lx = -ly (int) + '13': 'LNOT', # [lx, ly, 0] ly = !ly (int) '18': 'EQ', # [lx, ly, lz] lx = ly == lz (32-bit int) '19': 'NE', # [lx, ly, lz] lx = ly != lz (32-bit int) '20': 'SLT', # [lx, ly, lz] lx = ly < lz (32-bit signed) @@ -107,6 +108,7 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['SMOD']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') % (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['UMOD']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') % (' + get_coerced_access('lz', unsigned=True) + ') >>> 0;' CASES[ROPCODES['NEG']] = get_access('lx') + ' = -(' + get_coerced_access('ly') + ');' +CASES[ROPCODES['LNOT']] = get_access('lx') + ' = !(' + get_coerced_access('ly') + ');' CASES[ROPCODES['EQ']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') == (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['NE']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') != (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['SLT']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') < (' + get_coerced_access('lz') + ') | 0;' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 58805008e145b..82188ed3205d5 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1930,7 +1930,7 @@ function getCombinedSign(node1, node2, hint) { assert(sign1 != ASM_FLEXIBLE); return sign1; } - assert(sign1 === sign2); + assert(sign1 === sign2);//, JSON.stringify([node1, ' ', node2, sign1, sign2])); return sign1; } @@ -5835,6 +5835,7 @@ function emterpretify(ast) { var sign = detectSign(node[2]); return makeUnary(node, type, sign); } + case '!': return makeUnary(node, ASM_INT, ASM_SIGNED); default: throw 'ehh'; } throw 'todo'; @@ -6074,6 +6075,7 @@ function emterpretify(ast) { var opcode; switch(node[1]) { case '-': opcode = 'NEG'; break; + case '!': opcode = 'LNOT'; break; default: throw 'bad'; } var y = getReg(node[2]); From 3c1e9ac7a91ecf9582f0e0c0ca3a95742cfac1f7 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 18:11:30 -0700 Subject: [PATCH 124/461] use hint more strongly in getCombinedSign --- tools/js-optimizer.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 82188ed3205d5..2d8fde7eb463b 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1930,8 +1930,9 @@ function getCombinedSign(node1, node2, hint) { assert(sign1 != ASM_FLEXIBLE); return sign1; } - assert(sign1 === sign2);//, JSON.stringify([node1, ' ', node2, sign1, sign2])); - return sign1; + if (sign1 === sign2) return sign1; + if (sign1 === hint || sign2 === hint) return hint; + assert(0, JSON.stringify([node1, ' ', node2, sign1, sign2, hint])); } function normalizeAsm(func) { From 2574cfec6bc84332eb21ba2bed1ac4b37e53488d Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 18:12:35 -0700 Subject: [PATCH 125/461] detectSign improvements --- tools/js-optimizer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 2d8fde7eb463b..a6125ba7b3cdd 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1903,7 +1903,7 @@ function detectSign(node) { switch(node[1]) { case '|': case '&': case '^': case '<<': case '>>': return ASM_SIGNED; case '>>>': return ASM_UNSIGNED; - case '+': return ASM_FLEXIBLE; + case '+': case '-': return ASM_FLEXIBLE; default: throw 'yikes'; } } else if (node[0] === 'unary-prefix') { From c9e3669b9c3b84a7a426edcd473b6c39a1434eb3 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 20:35:26 -0700 Subject: [PATCH 126/461] fix bytify assert --- tools/emterpretify.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 8da81718db0d4..d08097fe5740b 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -73,7 +73,7 @@ settings = { 'PRECISE_F32': 0 } # TODO def bytify(x): - assert x >= 0 and x << (2**32) + assert x >= 0 and x < (1 << 32) return [x & 255, (x >> 8) & 255, (x >> 16) & 255, (x >> 24) & 255] def get_access(l, s='i'): From 40e2f1a158328ab120c65b164bc5c6bf1c08c15c Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 20:39:51 -0700 Subject: [PATCH 127/461] sort emterpreter switches, and improve indentation --- tools/emterpretify.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index d08097fe5740b..3f2f21614c769 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -134,15 +134,14 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['GETTDP']] = 'HEAP32[sp + (lx << 3) >> 2] = tempDoublePtr;' #CASES[ROPCODES['GETPC']] = 'HEAP32[sp + (lx << 3) >> 2] = pc;' CASES[ROPCODES['SWITCH']] = ''' -lz = ''' + get_coerced_access('lz') + '''; -lx = ((''' + get_coerced_access('lx') + ''') - (''' + get_coerced_access('ly') + ''')) >>> 0; // lx is now relative to the base -if ((lx >>> 0) >= (lz >>> 0)) { // is the adjusted value too big? - pc = (pc + (lz << 2)) | 0; // jump to right after the table, where the default is - continue; -} -pc = HEAP32[pc + 4 + (lx << 2) >> 2] | 0; // we are within range, load from the jump table which is right after this instruction, and set pc to that -continue; -''' + lz = ''' + get_coerced_access('lz') + '''; + lx = ((''' + get_coerced_access('lx') + ''') - (''' + get_coerced_access('ly') + ''')) >>> 0; // lx is now relative to the base + if ((lx >>> 0) >= (lz >>> 0)) { // is the adjusted value too big? + pc = (pc + (lz << 2)) | 0; // jump to right after the table, where the default is + continue; + } + pc = HEAP32[pc + 4 + (lx << 2) >> 2] | 0; // load from the jump table which is right after this instruction, and set pc + continue;''' def make_emterpreter(t): # return is specialized per interpreter @@ -209,7 +208,7 @@ def fix_case(case): '' if t == 'void' else t[0], ROPCODES['FUNC'], json.dumps(OPCODES), - '\n'.join([fix_case(' case %d: %s break;' % (k, v)) for k, v in CASES.iteritems()]), + '\n'.join([fix_case(' case %d: %s break;' % (k, CASES[k])) for k in sorted(CASES.keys())]), '' if t == 'void' else 'return %s;' % shared.JS.make_initializer(t[0], settings) ) From 2ff7d1702c91f6a37868ec6f43ad1b6b37196262 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 21:00:10 -0700 Subject: [PATCH 128/461] SETVIB, and make SETVI signed --- tools/emterpretify.py | 20 +++++++++++--------- tools/js-optimizer.js | 21 ++++++++++++--------- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 3f2f21614c769..78c68525f047f 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -21,14 +21,15 @@ '0': 'SET', # [lx, ly, 0] lx = ly (int or float, not double) '1': 'GETST', # [l, 0, 0] l = STACKTOP '2': 'SETST', # [l, 0, 0] STACKTOP = l - '3': 'SETVI', # [l, vl, vh] l = v (16-bit int) - '4': 'ADD', # [lx, ly, lz] lx = ly + lz (32-bit int) - '5': 'SUB', # [lx, ly, lz] lx = ly - lz (32-bit int) - '6': 'MUL', # [lx, ly, lz] lx = ly * lz (32-bit int) - '7': 'SDIV', # [lx, ly, lz] lx = ly / lz (32-bit signed int) - '8': 'UDIV', # [lx, ly, lz] lx = ly / lz (32-bit unsigned int) - '9': 'SMOD', # [lx, ly, lz] lx = ly % lz (32-bit signed int) - '10': 'UMOD', # [lx, ly, lz] lx = ly % lz (32-bit unsigned int) + '3': 'SETVI', # [l, vl, vh] l = v (16-bit signed int) + '4': 'SETVIB', # [l, vl, vh] l = 32-bit int in next 32-bit instruction + '5': 'ADD', # [lx, ly, lz] lx = ly + lz (32-bit int) + '6': 'SUB', # [lx, ly, lz] lx = ly - lz (32-bit int) + '7': 'MUL', # [lx, ly, lz] lx = ly * lz (32-bit int) + '8': 'SDIV', # [lx, ly, lz] lx = ly / lz (32-bit signed int) + '9': 'UDIV', # [lx, ly, lz] lx = ly / lz (32-bit unsigned int) + '10': 'SMOD', # [lx, ly, lz] lx = ly % lz (32-bit signed int) + '11': 'UMOD', # [lx, ly, lz] lx = ly % lz (32-bit unsigned int) '12': 'NEG', # [lx, ly, 0] lx = -ly (int) '13': 'LNOT', # [lx, ly, 0] ly = !ly (int) '18': 'EQ', # [lx, ly, lz] lx = ly == lz (32-bit int) @@ -99,7 +100,8 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['SET']] = get_access('lx') + ' = ' + get_coerced_access('ly') + ';' CASES[ROPCODES['GETST']] = 'HEAP32[sp + (lx << 3) >> 2] = STACKTOP;' CASES[ROPCODES['SETST']] = 'STACKTOP = HEAP32[sp + (lx << 3) >> 2]|0;' -CASES[ROPCODES['SETVI']] = 'HEAP32[sp + (lx << 3) >> 2] = inst >>> 16;' +CASES[ROPCODES['SETVI']] = 'HEAP32[sp + (lx << 3) >> 2] = inst >> 16;' +CASES[ROPCODES['SETVIB']] = 'pc = pc + 4 | 0; ' + get_access('lx') + ' = HEAP32[pc >> 2] | 0;' CASES[ROPCODES['ADD']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['SUB']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') - (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['MUL']] = get_access('lx') + ' = Math_imul(' + get_coerced_access('ly') + ', ' + get_coerced_access('lz') + ') | 0;' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index a6125ba7b3cdd..2e41c3af05027 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5735,13 +5735,7 @@ function emterpretify(ast) { } } case 'num': { - var value = node[1]; - if (value >>> 16 === 0) { - var l = getFree(); - return [l, ['SETVI', l, value & 255, value >>> 8]]; - } else { - throw 'todo: big nums'; - } + return makeNum(node[1]); } case 'var': case 'toplevel': { @@ -5980,8 +5974,8 @@ function emterpretify(ast) { var defaultAbsolute = data['default'] ? data['default'].absolute : absoluteId++; // emit the switch instruction itself var tempMin = getFree(), tempRange = getFree(); - var ret = condition[1].concat(['SETVI', tempMin, minn, 0, 'SETVI', tempRange, range, 0, - 'SWITCH', condition[0], tempMin, tempRange]); + var ret = condition[1].concat(makeNum(minn, tempMin)[1]).concat(makeNum(range, tempRange)[1]); + ret.push('SWITCH', condition[0], tempMin, tempRange); releaseFree(tempRange); releaseFree(tempMin); releaseIfFree(condition[0]); @@ -6020,6 +6014,15 @@ function emterpretify(ast) { return l; } + function makeNum(value, l) { + if (l === undefined) l = getFree(); + if (((value << 16) >> 16) === (value | 0)) { + return [l, ['SETVI', l, value & 255, (value >> 8) & 255]]; + } else { + return [l, ['SETVIB', l, 0, 0, value & 255, (value >> 8) & 255, (value >> 16) & 255, (value >> 24) & 255]]; + } + } + function makeBinary(node, type, sign) { assert(type === ASM_INT); var opcode; From 4878f915f5a38112416b38ada960926d067b6420 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 21:28:02 -0700 Subject: [PATCH 129/461] SETD, and fix for assigning to a param --- tools/emterpretify.py | 2 ++ tools/js-optimizer.js | 20 ++++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 78c68525f047f..eadc7eba28c4b 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -44,6 +44,7 @@ '40': 'SHL', # [lx, ly, lz] lx = ly << lz '41': 'ASHR', # [lx, ly, lz] lx = ly >> lz '42': 'LSHR', # [lx, ly, lz] lx = ly >>> lz + '60': 'SETD', # [lx, ly, lz] lx = ly (double) '100': 'LOAD8', # [lx, ly, 0] lx = HEAP8[ly >> 0] '110': 'LOAD16', # [lx, ly, 0] lx = HEAP16[ly >> 1] '120': 'LOAD32', # [lx, ly, 0] lx = HEAP32[ly >> 2] @@ -123,6 +124,7 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['SHL']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') << (' + get_coerced_access('lz') + ');' CASES[ROPCODES['ASHR']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') >> (' + get_coerced_access('lz') + ');' CASES[ROPCODES['LSHR']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') >>> (' + get_coerced_access('lz') + ');' +CASES[ROPCODES['SETD']] = get_access('lx', s='d') + ' = ' + get_coerced_access('ly', s='d') + ';' CASES[ROPCODES['LOAD8']] = get_access('lx') + ' = ' + 'HEAP8[' + get_access('ly') + ' >> 0];' CASES[ROPCODES['LOAD16']] = get_access('lx') + ' = ' + 'HEAP16[' + get_access('ly') + ' >> 1];' CASES[ROPCODES['LOAD32']] = get_access('lx') + ' = ' + 'HEAP32[' + get_access('ly') + ' >> 2];' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 2e41c3af05027..302e31799e8cd 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1896,7 +1896,8 @@ function getCombinedType(node1, node2, asmData, hint) { var ASM_FLEXIBLE = 0; // small constants can be signed or unsigned, variables are also flexible var ASM_SIGNED = 1; -var ASM_UNSIGNED = 2 +var ASM_UNSIGNED = 2; +var ASM_NONSIGNED = 3; function detectSign(node) { if (node[0] === 'binary') { @@ -5755,9 +5756,15 @@ function emterpretify(ast) { // local var reg = getReg(value); var type = asmData.vars[name]; - assert(type !== ASM_DOUBLE); // TODO: SETD + if (type === undefined) type = asmData.params[name]; // TODO: detect when the last operation in reg[1] assigns in its arg x, in which case we can avoid the SET and make it assign to us - return [locals[name], reg[1].concat(['SET', locals[name], releaseIfFree(reg[0]), 0])]; + var opcode; + if (type === ASM_INT) { + opcode = 'SET'; + } else if (type === ASM_DOUBLE) { + opcode = 'SETD'; + } else throw 'ick'; + return [locals[name], reg[1].concat([opcode, locals[name], releaseIfFree(reg[0]), 0])]; } else { switch(name) { case 'STACKTOP': { @@ -5821,7 +5828,12 @@ function emterpretify(ast) { throw 'todo'; } case 'unary-prefix': { - // TODO: double coercions + if (node[1] === '+') { + // double operation + return getReg(node[2], dropIt, ASM_DOUBLE, ASM_NONSIGNED); + } + + // not a simple coercion assert(!dropIt); switch (node[1]) { From c72872399eef9bff6853eb5963464df07cb88dec Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 21:29:41 -0700 Subject: [PATCH 130/461] add unary+ to detectSign --- tools/js-optimizer.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 302e31799e8cd..cf82f662456a7 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1910,6 +1910,7 @@ function detectSign(node) { } else if (node[0] === 'unary-prefix') { switch(node[1]) { case '-': return ASM_FLEXIBLE; + case '+': return ASM_DOUBLE; // XXX default: throw 'yikes'; } } else if (node[0] === 'num' || node[0] === 'name') { From 6a44d21ae2b6c81d67d9330267ddd15e9773c037 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 21:48:14 -0700 Subject: [PATCH 131/461] double ops --- tools/emterpretify.py | 29 ++++++++++++++++ tools/js-optimizer.js | 77 ++++++++++++++++++++++++++++++++----------- 2 files changed, 86 insertions(+), 20 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index eadc7eba28c4b..2b0c371141732 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -44,7 +44,21 @@ '40': 'SHL', # [lx, ly, lz] lx = ly << lz '41': 'ASHR', # [lx, ly, lz] lx = ly >> lz '42': 'LSHR', # [lx, ly, lz] lx = ly >>> lz + '60': 'SETD', # [lx, ly, lz] lx = ly (double) + '65': 'ADDD', # [lx, ly, lz] lx = ly + lz (double) + '66': 'SUBD', # [lx, ly, lz] lx = ly - lz (double) + '67': 'MULD', # [lx, ly, lz] lx = ly * lz (double) + '69': 'DIVD', # [lx, ly, lz] lx = ly / lz (double) + '70': 'MODD', # [lx, ly, lz] lx = ly % lz (double) + #'72': 'NEGD', # [lx, ly, 0] lx = -ly (double) + '78': 'EQD', # [lx, ly, lz] lx = ly == lz (double) + '79': 'NED', # [lx, ly, lz] lx = ly != lz (double) + '80': 'LTD', # [lx, ly, lz] lx = ly < lz (signed) + '81': 'LED', # [lx, ly, lz] lx = ly < lz (double) + '82': 'GTD', # [lx, ly, lz] lx = ly <= lz (double) + '83': 'GED', # [lx, ly, lz] lx = ly <= lz (double) + '100': 'LOAD8', # [lx, ly, 0] lx = HEAP8[ly >> 0] '110': 'LOAD16', # [lx, ly, 0] lx = HEAP16[ly >> 1] '120': 'LOAD32', # [lx, ly, 0] lx = HEAP32[ly >> 2] @@ -64,6 +78,8 @@ '255': 'FUNC', # [n, 0, 0] function with n locals (each taking 64 bits) } +assert len(OPCODES.values()) == len(set(OPCODES.values())) # no dupe names + ROPCODES = {} for o in OPCODES: ROPCODES[OPCODES[o]] = int(o); @@ -124,7 +140,20 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['SHL']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') << (' + get_coerced_access('lz') + ');' CASES[ROPCODES['ASHR']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') >> (' + get_coerced_access('lz') + ');' CASES[ROPCODES['LSHR']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') >>> (' + get_coerced_access('lz') + ');' + CASES[ROPCODES['SETD']] = get_access('lx', s='d') + ' = ' + get_coerced_access('ly', s='d') + ';' +CASES[ROPCODES['ADDD']] = get_access('lx', s='d') + ' = (' + get_coerced_access('ly', s='d') + ') + (' + get_coerced_access('lz', s='d') + ');' +CASES[ROPCODES['SUBD']] = get_access('lx', s='d') + ' = (' + get_coerced_access('ly', s='d') + ') - (' + get_coerced_access('lz', s='d') + ');' +CASES[ROPCODES['MULD']] = get_access('lx', s='d') + ' = (' + get_coerced_access('ly', s='d') + ') * (' + get_coerced_access('lz', s='d') + ');' +CASES[ROPCODES['DIVD']] = get_access('lx', s='d') + ' = (' + get_coerced_access('ly', s='d') + ') / (' + get_coerced_access('lz', s='d') + ');' +CASES[ROPCODES['MODD']] = get_access('lx', s='d') + ' = (' + get_coerced_access('ly', s='d') + ') % (' + get_coerced_access('lz', s='d') + ');' +CASES[ROPCODES['EQD']] = get_access('lx') + ' = (' + get_coerced_access('ly', s='d') + ') == (' + get_coerced_access('lz', s='d') + ') | 0;' +CASES[ROPCODES['NED']] = get_access('lx') + ' = (' + get_coerced_access('ly', s='d') + ') != (' + get_coerced_access('lz', s='d') + ') | 0;' +CASES[ROPCODES['LTD']] = get_access('lx') + ' = (' + get_coerced_access('ly', s='d') + ') < (' + get_coerced_access('lz', s='d') + ') | 0;' +CASES[ROPCODES['LED']] = get_access('lx') + ' = (' + get_coerced_access('ly', s='d') + ') <= (' + get_coerced_access('lz', s='d') + ') | 0;' +CASES[ROPCODES['GTD']] = get_access('lx') + ' = (' + get_coerced_access('ly', s='d') + ') > (' + get_coerced_access('lz', s='d') + ') | 0;' +CASES[ROPCODES['GED']] = get_access('lx') + ' = (' + get_coerced_access('ly', s='d') + ') >= (' + get_coerced_access('lz', s='d') + ') | 0;' + CASES[ROPCODES['LOAD8']] = get_access('lx') + ' = ' + 'HEAP8[' + get_access('ly') + ' >> 0];' CASES[ROPCODES['LOAD16']] = get_access('lx') + ' = ' + 'HEAP16[' + get_access('ly') + ' >> 1];' CASES[ROPCODES['LOAD32']] = get_access('lx') + ' = ' + 'HEAP32[' + get_access('ly') + ' >> 2];' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index cf82f662456a7..c5300d2f4708e 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5820,7 +5820,7 @@ function emterpretify(ast) { node[2] = node[3]; node[3] = temp; node[1] = node[1] === '>=' ? '<=' : '<'; - } else throw 'ex ' + type; + } } return makeBinary(node, type, sign); } @@ -6037,42 +6037,79 @@ function emterpretify(ast) { } function makeBinary(node, type, sign) { - assert(type === ASM_INT); var opcode; switch(node[1]) { - case '+': opcode = 'ADD'; break; - case '-': opcode = 'SUB'; break; + case '+': { + if (type === ASM_INT) opcode = 'ADD'; + else if (type === ASM_DOUBLE) opcode = 'ADDD'; + break; + } + case '-': { + if (type === ASM_INT) opcode = 'SUB'; + else if (type === ASM_DOUBLE) opcode = 'SUBD'; + break; + } case '*': { - assert(type === ASM_INT); - opcode = 'MUL'; + if (type === ASM_INT) opcode = 'MUL'; + else if (type === ASM_DOUBLE) opcode = 'MULD'; break; } case '/': { - assert(sign !== ASM_FLEXIBLE); - if (sign === ASM_SIGNED) opcode = 'SDIV'; - else opcode = 'UDIV'; + if (type === ASM_INT) { + assert(sign !== ASM_FLEXIBLE); + if (sign === ASM_SIGNED) opcode = 'SDIV'; + else opcode = 'UDIV'; + } + else if (type === ASM_DOUBLE) opcode = 'DIVD'; break; } case '%': { - assert(sign !== ASM_FLEXIBLE); - if (sign === ASM_SIGNED) opcode = 'SMOD'; - else opcode = 'UMOD'; + if (type === ASM_INT) { + assert(sign !== ASM_FLEXIBLE); + if (sign === ASM_SIGNED) opcode = 'SMOD'; + else opcode = 'UMOD'; + } + else if (type === ASM_DOUBLE) opcode = 'MODD'; break; } case '<': { - assert(sign !== ASM_FLEXIBLE); - if (sign === ASM_SIGNED) opcode = 'SLT'; - else opcode = 'ULT'; + if (type === ASM_INT) { + assert(sign !== ASM_FLEXIBLE); + if (sign === ASM_SIGNED) opcode = 'SLT'; + else opcode = 'ULT'; + } + else if (type === ASM_DOUBLE) opcode = 'LTD'; break; } case '<=': { - assert(sign !== ASM_FLEXIBLE); - if (sign === ASM_SIGNED) opcode = 'SLE'; - else opcode = 'ULE'; + if (type === ASM_INT) { + assert(sign !== ASM_FLEXIBLE); + if (sign === ASM_SIGNED) opcode = 'SLE'; + else opcode = 'ULE'; + } + else if (type === ASM_DOUBLE) opcode = 'LED'; + break; + } + case '>': { + assert(type === ASM_DOUBLE); + opcode = 'GTD'; + break; + } + case '<=': { + assert(type === ASM_DOUBLE); + opcode = 'GED'; + break; + } + case '==': { + if (type === ASM_INT) opcode = 'EQ'; + else if (type === ASM_DOUBLE) opcode = 'EQD'; + break; + } + case '!=': { + if (type === ASM_INT) opcode = 'NE'; + else if (type === ASM_DOUBLE) opcode = 'NED'; break; } - case '==': assert(type === ASM_INT); opcode = 'EQ'; break; - case '!=': assert(type === ASM_INT); opcode = 'NE'; break; case '&': opcode = 'AND'; break; case '|': opcode = 'OR'; break; case '^': opcode = 'XOR'; break; From 82046535b4a8c2b8e59bdbdda6b01dfe13eb7169 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 22 Sep 2014 21:55:01 -0700 Subject: [PATCH 132/461] fix call coercions to non-ints --- tools/emterpretify.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 2b0c371141732..fc06d0d350096 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -194,7 +194,7 @@ def make_target_call(i): sigs = call_sigs[name] assert len(sigs) == 1, [name, sigs] sig = sigs[0] - ret = name + '(' + ', '.join([get_coerced_access('HEAP8[pc+%d>>0]' % (i+4)) for i in range(len(sig)-1)]) + ')' + ret = name + '(' + ', '.join([get_coerced_access('HEAP8[pc+%d>>0]' % (i+4), s=sig[i+1]) for i in range(len(sig)-1)]) + ')' if sig[0] != 'v': ret = get_access('lx', sig[0]) + ' = ' + shared.JS.make_coercion(ret, sig[0]) elif name in actual_return_types and actual_return_types[name] != 'v': From 14d5cdae3cbe7872fa9a295205691edba045d5fe Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 11:05:16 -0700 Subject: [PATCH 133/461] D2I and SETVD --- tools/emterpretify.py | 16 +++++++++------ tools/js-optimizer.js | 46 ++++++++++++++++++++++++++++++++++++------- 2 files changed, 49 insertions(+), 13 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index fc06d0d350096..f37fe4070d852 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -46,18 +46,20 @@ '42': 'LSHR', # [lx, ly, lz] lx = ly >>> lz '60': 'SETD', # [lx, ly, lz] lx = ly (double) - '65': 'ADDD', # [lx, ly, lz] lx = ly + lz (double) - '66': 'SUBD', # [lx, ly, lz] lx = ly - lz (double) - '67': 'MULD', # [lx, ly, lz] lx = ly * lz (double) + '61': 'SETVD', # [lx, vl, vh] lx = ly (16 bit signed int, converted into double) + '65': 'ADDD', # [lx, ly, lz] lx = ly + lz (double) + '66': 'SUBD', # [lx, ly, lz] lx = ly - lz (double) + '67': 'MULD', # [lx, ly, lz] lx = ly * lz (double) '69': 'DIVD', # [lx, ly, lz] lx = ly / lz (double) '70': 'MODD', # [lx, ly, lz] lx = ly % lz (double) - #'72': 'NEGD', # [lx, ly, 0] lx = -ly (double) - '78': 'EQD', # [lx, ly, lz] lx = ly == lz (double) - '79': 'NED', # [lx, ly, lz] lx = ly != lz (double) + #'72': 'NEGD', # [lx, ly, 0] lx = -ly (double) + '78': 'EQD', # [lx, ly, lz] lx = ly == lz (double) + '79': 'NED', # [lx, ly, lz] lx = ly != lz (double) '80': 'LTD', # [lx, ly, lz] lx = ly < lz (signed) '81': 'LED', # [lx, ly, lz] lx = ly < lz (double) '82': 'GTD', # [lx, ly, lz] lx = ly <= lz (double) '83': 'GED', # [lx, ly, lz] lx = ly <= lz (double) + '90': 'D2I', # [lx, ly, 0] lx = ~~ly (double-to-int) '100': 'LOAD8', # [lx, ly, 0] lx = HEAP8[ly >> 0] '110': 'LOAD16', # [lx, ly, 0] lx = HEAP16[ly >> 1] @@ -142,6 +144,7 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['LSHR']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') >>> (' + get_coerced_access('lz') + ');' CASES[ROPCODES['SETD']] = get_access('lx', s='d') + ' = ' + get_coerced_access('ly', s='d') + ';' +CASES[ROPCODES['SETVD']] = get_access('lx', s='d') + ' = +(inst >> 16);' CASES[ROPCODES['ADDD']] = get_access('lx', s='d') + ' = (' + get_coerced_access('ly', s='d') + ') + (' + get_coerced_access('lz', s='d') + ');' CASES[ROPCODES['SUBD']] = get_access('lx', s='d') + ' = (' + get_coerced_access('ly', s='d') + ') - (' + get_coerced_access('lz', s='d') + ');' CASES[ROPCODES['MULD']] = get_access('lx', s='d') + ' = (' + get_coerced_access('ly', s='d') + ') * (' + get_coerced_access('lz', s='d') + ');' @@ -153,6 +156,7 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['LED']] = get_access('lx') + ' = (' + get_coerced_access('ly', s='d') + ') <= (' + get_coerced_access('lz', s='d') + ') | 0;' CASES[ROPCODES['GTD']] = get_access('lx') + ' = (' + get_coerced_access('ly', s='d') + ') > (' + get_coerced_access('lz', s='d') + ') | 0;' CASES[ROPCODES['GED']] = get_access('lx') + ' = (' + get_coerced_access('ly', s='d') + ') >= (' + get_coerced_access('lz', s='d') + ') | 0;' +CASES[ROPCODES['D2I']] = get_access('lx') + ' = ~~(' + get_access('ly', s='d') + ');' CASES[ROPCODES['LOAD8']] = get_access('lx') + ' = ' + 'HEAP8[' + get_access('ly') + ' >> 0];' CASES[ROPCODES['LOAD16']] = get_access('lx') + ' = ' + 'HEAP16[' + get_access('ly') + ' >> 1];' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index c5300d2f4708e..ae98d7a8dfd2d 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5737,7 +5737,7 @@ function emterpretify(ast) { } } case 'num': { - return makeNum(node[1]); + return makeNum(node[1], ASM_INT); } case 'var': case 'toplevel': { @@ -5831,7 +5831,30 @@ function emterpretify(ast) { case 'unary-prefix': { if (node[1] === '+') { // double operation - return getReg(node[2], dropIt, ASM_DOUBLE, ASM_NONSIGNED); + var inner = node[2]; + switch (inner[0]) { + case 'unary-prefix': { + if (inner[1] === '+') return getReg(inner, dropIt, ASM_DOUBLE, ASM_NONSIGNED); + throw 'grr'; + } + case 'call': { + return getReg(inner, dropIt, ASM_DOUBLE, ASM_NONSIGNED); + } + case 'num': { + return makeNum(inner, ASM_DOUBLE); + } + default: { + var type = detectAsmCoercion(inner, asmData); + var sign = detectSign(inner); + if (type === ASM_INT && (sign === ASM_SIGNED || sign === ASM_UNSIGNED)) { + var y = getReg(inner); + var x = getFree(y[0]); + y[1].push('D2I', x, releaseIfFree(y[0], x), 0); + return [x, y[1]]; + } + throw 'meh ' + inner[0]; + } + } } // not a simple coercion @@ -5987,7 +6010,7 @@ function emterpretify(ast) { var defaultAbsolute = data['default'] ? data['default'].absolute : absoluteId++; // emit the switch instruction itself var tempMin = getFree(), tempRange = getFree(); - var ret = condition[1].concat(makeNum(minn, tempMin)[1]).concat(makeNum(range, tempRange)[1]); + var ret = condition[1].concat(makeNum(minn, ASM_INT, tempMin)[1]).concat(makeNum(range, ASM_INT, tempRange)[1]); ret.push('SWITCH', condition[0], tempMin, tempRange); releaseFree(tempRange); releaseFree(tempMin); @@ -6027,12 +6050,21 @@ function emterpretify(ast) { return l; } - function makeNum(value, l) { + function makeNum(value, type, l) { if (l === undefined) l = getFree(); - if (((value << 16) >> 16) === (value | 0)) { - return [l, ['SETVI', l, value & 255, (value >> 8) & 255]]; + var opcode; + if (((value << 16) >> 16) === (value | 0) && ((value === (value | 0)) || (value === (value >>> 0)))) { + assert(value !== 0 || 1/value > 0); // we abhor -0 + if (type === ASM_INT) { + opcode = 'SETVI'; + } else if (type === ASM_DOUBLE) { + opcode = 'SETVD'; + } else throw 'yuck'; + return [l, [opcode, l, value & 255, (value >> 8) & 255]]; } else { - return [l, ['SETVIB', l, 0, 0, value & 255, (value >> 8) & 255, (value >> 16) & 255, (value >> 24) & 255]]; + if (type === ASM_INT) { + return [l, ['SETVIB', l, 0, 0, value & 255, (value >> 8) & 255, (value >> 16) & 255, (value >> 24) & 255]]; + } else throw 'fff'; } } From 65d253e69b8267d9e7e9070743a8288eabc969c3 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 11:58:28 -0700 Subject: [PATCH 134/461] I2D and I/D fixes --- tools/emterpretify.py | 5 ++++- tools/js-optimizer.js | 17 ++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index f37fe4070d852..ee6fff0821112 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -60,6 +60,7 @@ '82': 'GTD', # [lx, ly, lz] lx = ly <= lz (double) '83': 'GED', # [lx, ly, lz] lx = ly <= lz (double) '90': 'D2I', # [lx, ly, 0] lx = ~~ly (double-to-int) + '91': 'I2D', # [lx, ly, 0] lx = +ly (int-to-double) '100': 'LOAD8', # [lx, ly, 0] lx = HEAP8[ly >> 0] '110': 'LOAD16', # [lx, ly, 0] lx = HEAP16[ly >> 1] @@ -156,7 +157,8 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['LED']] = get_access('lx') + ' = (' + get_coerced_access('ly', s='d') + ') <= (' + get_coerced_access('lz', s='d') + ') | 0;' CASES[ROPCODES['GTD']] = get_access('lx') + ' = (' + get_coerced_access('ly', s='d') + ') > (' + get_coerced_access('lz', s='d') + ') | 0;' CASES[ROPCODES['GED']] = get_access('lx') + ' = (' + get_coerced_access('ly', s='d') + ') >= (' + get_coerced_access('lz', s='d') + ') | 0;' -CASES[ROPCODES['D2I']] = get_access('lx') + ' = ~~(' + get_access('ly', s='d') + ');' +CASES[ROPCODES['D2I']] = get_access('lx') + ' = ~~(' + get_coerced_access('ly', s='d') + ');' +CASES[ROPCODES['I2D']] = get_access('lx', s='d') + ' = +(' + get_coerced_access('ly') + ');' CASES[ROPCODES['LOAD8']] = get_access('lx') + ' = ' + 'HEAP8[' + get_access('ly') + ' >> 0];' CASES[ROPCODES['LOAD16']] = get_access('lx') + ' = ' + 'HEAP16[' + get_access('ly') + ' >> 1];' @@ -226,6 +228,7 @@ def fix_case(case): EMTSTACKTOP = EMTSTACKTOP + (HEAP8[pc + 1 >> 0] << 3) | 0; assert(((EMTSTACKTOP|0) <= (EMT_STACK_MAX|0))|0); while (1) { + //printErr('last lx: ' + [HEAP32[sp + (lx << 3) >> 2]|0, +HEAPF64[sp + (lx << 3) >> 3]]); pc = pc + 4 | 0; inst = HEAP32[pc>>2]|0; lx = (inst >> 8) & 255; diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index ae98d7a8dfd2d..657d1a3ed356c 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5841,20 +5841,19 @@ function emterpretify(ast) { return getReg(inner, dropIt, ASM_DOUBLE, ASM_NONSIGNED); } case 'num': { - return makeNum(inner, ASM_DOUBLE); + return makeNum(inner[1], ASM_DOUBLE); } default: { var type = detectAsmCoercion(inner, asmData); var sign = detectSign(inner); if (type === ASM_INT && (sign === ASM_SIGNED || sign === ASM_UNSIGNED)) { - var y = getReg(inner); - var x = getFree(y[0]); - y[1].push('D2I', x, releaseIfFree(y[0], x), 0); - return [x, y[1]]; + return makeUnary(['unary-prefix', 'I2D', node[2][2]], ASM_DOUBLE, ASM_NONSIGNED); } throw 'meh ' + inner[0]; } } + } else if (node[1] === '~' && node[2][0] === 'unary-prefix' && node[2][1] === '~') { + return makeUnary(['unary-prefix', 'D2I', node[2][2]], ASM_INT, ASM_SIGNED); } // not a simple coercion @@ -6064,7 +6063,7 @@ function emterpretify(ast) { } else { if (type === ASM_INT) { return [l, ['SETVIB', l, 0, 0, value & 255, (value >> 8) & 255, (value >> 16) & 255, (value >> 24) & 255]]; - } else throw 'fff'; + } else throw 'fff '; } } @@ -6157,11 +6156,11 @@ function emterpretify(ast) { } function makeUnary(node, type, sign) { - assert(type === ASM_INT); var opcode; switch(node[1]) { - case '-': opcode = 'NEG'; break; - case '!': opcode = 'LNOT'; break; + case '-': assert(type === ASM_INT); opcode = 'NEG'; break; + case '!': assert(type === ASM_INT); opcode = 'LNOT'; break; + case 'I2D': case 'D2I': opcode = node[1]; break; default: throw 'bad'; } var y = getReg(node[2]); From 1029e2d70fec8932d39757f25fee7e283b9440d2 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 12:11:30 -0700 Subject: [PATCH 135/461] more benchmarking --- tests/test_benchmark.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/test_benchmark.py b/tests/test_benchmark.py index e97e60cbb3788..e766039def876 100644 --- a/tests/test_benchmark.py +++ b/tests/test_benchmark.py @@ -142,13 +142,15 @@ def run(self, args): #NativeBenchmarker('gcc', 'gcc', 'g++'), #JSBenchmarker('sm-f32', SPIDERMONKEY_ENGINE, ['-s', 'PRECISE_F32=2']), JSBenchmarker('sm', SPIDERMONKEY_ENGINE), + JSBenchmarker('sm-ion', SPIDERMONKEY_ENGINE + ['--no-asmjs']), + JSBenchmarker('sm-baseline', SPIDERMONKEY_ENGINE + ['--no-asmjs', '--no-ion']), JSBenchmarker('sm-emterp', SPIDERMONKEY_ENGINE, ['-s', 'EMTERPRETIFY=1']), + JSBenchmarker('sm-interp', SPIDERMONKEY_ENGINE + ['--no-asmjs', '--no-ion', '--no-baseline']), #JSBenchmarker('sm-f32-si', SPIDERMONKEY_ENGINE, ['--profiling', '-s', 'PRECISE_F32=2', '-s', 'SIMPLIFY_IFS=1']), #JSBenchmarker('sm-f32-aggro', SPIDERMONKEY_ENGINE, ['-s', 'PRECISE_F32=2', '-s', 'AGGRESSIVE_VARIABLE_ELIMINATION=1']), #JSBenchmarker('sm-f32-3.2', SPIDERMONKEY_ENGINE, ['-s', 'PRECISE_F32=2'], env={ 'LLVM': LLVM_3_2 }), #JSBenchmarker('sm-f32-3.3', SPIDERMONKEY_ENGINE, ['-s', 'PRECISE_F32=2'], env={ 'LLVM': LLVM_3_3 }), #JSBenchmarker('sm-f32-3.4', SPIDERMONKEY_ENGINE, ['-s', 'PRECISE_F32=2'], env={ 'LLVM': LLVM_3_4 }), - #JSBenchmarker('sm-noasm', SPIDERMONKEY_ENGINE + ['--no-asmjs']), #JSBenchmarker('sm-noasm-f32', SPIDERMONKEY_ENGINE + ['--no-asmjs'], ['-s', 'PRECISE_F32=2']), #JSBenchmarker('v8', V8_ENGINE) ] From 2f54c8c699e24749136f87cf0b71a026dda897e9 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 13:05:50 -0700 Subject: [PATCH 136/461] refactor parseHeap, and start to use in emterpreter sub --- tests/test_benchmark.py | 12 ++++++------ tools/js-optimizer.js | 32 ++++++++++++++++++++++---------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/tests/test_benchmark.py b/tests/test_benchmark.py index e766039def876..6bd8655df8b87 100644 --- a/tests/test_benchmark.py +++ b/tests/test_benchmark.py @@ -113,8 +113,8 @@ def process(filename): '-s', 'TOTAL_MEMORY=128*1024*1024', '--profiling', #'--closure', '1', - '-o', final] + shared_args + emcc_args + self.extra_args, stdout=PIPE, stderr=PIPE, env=self.env).communicate() - #'-o', final] + shared_args + emcc_args + self.extra_args, stdout=None, stderr=None, env=self.env).communicate() + #'-o', final] + shared_args + emcc_args + self.extra_args, stdout=PIPE, stderr=PIPE, env=self.env).communicate() + '-o', final] + shared_args + emcc_args + self.extra_args, stdout=None, stderr=None, env=self.env).communicate() assert os.path.exists(final), 'Failed to compile file: ' + output[0] self.filename = final @@ -141,11 +141,11 @@ def run(self, args): #NativeBenchmarker('clang-3.4', os.path.join(LLVM_3_4, 'clang'), os.path.join(LLVM_3_4, 'clang++')), #NativeBenchmarker('gcc', 'gcc', 'g++'), #JSBenchmarker('sm-f32', SPIDERMONKEY_ENGINE, ['-s', 'PRECISE_F32=2']), - JSBenchmarker('sm', SPIDERMONKEY_ENGINE), - JSBenchmarker('sm-ion', SPIDERMONKEY_ENGINE + ['--no-asmjs']), - JSBenchmarker('sm-baseline', SPIDERMONKEY_ENGINE + ['--no-asmjs', '--no-ion']), + #JSBenchmarker('sm', SPIDERMONKEY_ENGINE), + #JSBenchmarker('sm-ion', SPIDERMONKEY_ENGINE + ['--no-asmjs']), + #JSBenchmarker('sm-baseline', SPIDERMONKEY_ENGINE + ['--no-asmjs', '--no-ion']), JSBenchmarker('sm-emterp', SPIDERMONKEY_ENGINE, ['-s', 'EMTERPRETIFY=1']), - JSBenchmarker('sm-interp', SPIDERMONKEY_ENGINE + ['--no-asmjs', '--no-ion', '--no-baseline']), + #JSBenchmarker('sm-interp', SPIDERMONKEY_ENGINE + ['--no-asmjs', '--no-ion', '--no-baseline']), #JSBenchmarker('sm-f32-si', SPIDERMONKEY_ENGINE, ['--profiling', '-s', 'PRECISE_F32=2', '-s', 'SIMPLIFY_IFS=1']), #JSBenchmarker('sm-f32-aggro', SPIDERMONKEY_ENGINE, ['-s', 'PRECISE_F32=2', '-s', 'AGGRESSIVE_VARIABLE_ELIMINATION=1']), #JSBenchmarker('sm-f32-3.2', SPIDERMONKEY_ENGINE, ['-s', 'PRECISE_F32=2'], env={ 'LLVM': LLVM_3_2 }), diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 657d1a3ed356c..5d4b68daa58ee 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -364,10 +364,14 @@ function removeUnneededLabelSettings(ast) { // Various expression simplifications. Happens after elimination, which opens up many of these simplification opportunities. +var parseHeapTemp = { unsigned: false, float: false, bits: 0 }; + function parseHeap(name, out) { + out = out || parseHeapTemp; if (name.substr(0, 4) != 'HEAP') return false; out.unsigned = name[4] === 'U'; - out.bits = parseInt(name.substr(out.unsigned || name[4] === 'F' ? 5 : 4)); + out.float = name[4] === 'F'; + out.bits = parseInt(name.substr(out.unsigned || out.float ? 5 : 4)); return true; } @@ -492,7 +496,6 @@ function simplifyExpressions(ast) { // & and heap-related optimizations - var parseHeapTemp = { unsigned: false, bits: 0 }; var hasTempDoublePtr = false, rerunOrZeroPass = false; traverse(ast, function(node, type) { @@ -5614,7 +5617,6 @@ function optimizeFrounds(ast) { // Optimize heap expressions into HEAP32[(x&m)+c>>2] where c is a small aligned constant, and m guarantees the pointer is without range+aligned function pointerMasking(ast) { var MAX_SMALL_OFFSET = 32; - var parseHeapTemp = { unsigned: false, bits: 0 }; traverse(ast, function(node, type) { if (type === 'sub' && node[1][0] === 'name' && node[1][1][0] === 'H' && node[2][0] === 'binary' && node[2][1] === '>>' && node[2][3][0] === 'num') { @@ -5967,14 +5969,24 @@ function emterpretify(ast) { } case 'sub': { assert(node[1][0] === 'name'); + var heap = node[1][1]; + assert(parseHeap(heap)); + assert(!parseHeapTemp.float); // coerced heap access => a load - assert(node[2][0] === 'binary' && node[2][1] === '>>' && node[2][3][0] === 'num'); - var shifts = node[2][3][1]; - assert(shifts >= 0 && shifts <= 2); - var opcode = 'LOAD' + (Math.pow(2, shifts)*8); - var y = getReg(node[2][2], false, ASM_INT, ASM_SIGNED); - var x = getFree(y[0]); - return [x, y[1].concat([opcode, x, releaseIfFree(y[0], x), 0])]; + if (node[2][0] === 'binary' && node[2][1] === '>>' && node[2][3][0] === 'num') { + var shifts = node[2][3][1]; + assert(shifts >= 0 && shifts <= 2); + var bits = Math.pow(2, shifts)*8; + assert(bits === parseHeapTemp.bits); + var opcode = 'LOAD' + bits; + var y = getReg(node[2][2], false, ASM_INT, ASM_SIGNED); + var x = getFree(y[0]); + return [x, y[1].concat([opcode, x, releaseIfFree(y[0], x), 0])]; + } else { + assert(node[2][0] === 'num'); // HEAP32[8] or such + var address = node[2][1]; + throw 'todo'; + } } case 'block': { return [-1, walkStatements(node[1])]; From f0901ad9b41576849eed59926409949d523c9e75 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 13:27:09 -0700 Subject: [PATCH 137/461] refactor load and improve store, so both now handle consts --- tools/js-optimizer.js | 45 ++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 5d4b68daa58ee..2962cec7e94d3 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -9,6 +9,10 @@ // TODO: Share EMPTY_NODE instead of emptyNode that constructs? //============================================================================== +if (!Math.log2) Math.log2 = function log2(x) { + return Math.log(x) / Math.LN2; +}; + // *** Environment setup code *** var arguments_ = []; var debug = false; @@ -5779,23 +5783,28 @@ function emterpretify(ast) { } } else if (target[0] === 'sub') { // assign to memory - assert(target[1][0] === 'name'); - assert(target[2][0] === 'binary' && target[2][1] === '>>' && target[2][3][0] === 'num'); - var shifts = target[2][3][1]; - var x = getReg(target[2][2], false, ASM_INT, ASM_SIGNED); + var heap = target[1][1]; + assert(parseHeap(heap)); + assert(!parseHeapTemp.float); + // coerced heap access => a load var y = getReg(value); - var opcode; - switch(shifts) { - case 0: opcode = 'STORE8'; break; - case 2: { - var type = detectAsmCoercion(value, asmData); - assert(type === ASM_INT); - opcode = 'STORE32'; - break; - } - default: throw 'todo'; + if (target[2][0] === 'binary' && target[2][1] === '>>' && target[2][3][0] === 'num') { + var shifts = target[2][3][1]; + assert(shifts >= 0 && shifts <= 2); + var bits = Math.pow(2, shifts)*8; + assert(bits === parseHeapTemp.bits); + var opcode = 'STORE' + bits; + var x = getReg(target[2][2], false, ASM_INT, ASM_SIGNED); + return [-1, x[1].concat(y[1]).concat([opcode, releaseIfFree(x[0]), releaseIfFree(y[0]), 0])]; + } else { + assert(target[2][0] === 'num'); // HEAP32[8] or such + var address = target[2][1]; + var shifts = Math.log2(parseHeapTemp.bits/8); + assert(address === ((address << shifts) >> shifts)); + var x = makeNum(address << shifts, ASM_INT); + y[1].push('STORE' + parseHeapTemp.bits, releaseIfFree(x[0]), releaseIfFree(y[0]), 0); + return [-1, x[1].concat(y[1])]; } - return [-1, x[1].concat(y[1]).concat([opcode, releaseIfFree(x[0]), releaseIfFree(y[0]), 0])]; } else throw 'assign wha? ' + target[0]; } case 'binary': { @@ -5985,7 +5994,11 @@ function emterpretify(ast) { } else { assert(node[2][0] === 'num'); // HEAP32[8] or such var address = node[2][1]; - throw 'todo'; + var shifts = Math.log2(parseHeapTemp.bits/8); + assert(address === ((address << shifts) >> shifts)); + var ret = makeNum(address << shifts, ASM_INT, getFree()); + ret[1].push('LOAD' + parseHeapTemp.bits, ret[0], ret[0], 0); + return ret; } } case 'block': { From 74118684a4e27983728a3378465c5e52875075e6 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 13:34:33 -0700 Subject: [PATCH 138/461] pop the emtstack --- tools/emterpretify.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index ee6fff0821112..d45587da0e940 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -184,12 +184,13 @@ def get_coerced_access(l, s='i', unsigned=False): def make_emterpreter(t): # return is specialized per interpreter + CASES[ROPCODES['RET']] = 'EMTSTACKTOP = sp; ' if t == 'void': - CASES[ROPCODES['RET']] = 'return;' + CASES[ROPCODES['RET']] += 'return;' elif t == 'int': - CASES[ROPCODES['RET']] = 'return HEAP32[sp + (lx << 3) >> 2]|0;' + CASES[ROPCODES['RET']] += 'return HEAP32[sp + (lx << 3) >> 2]|0;' elif t == 'double': - CASES[ROPCODES['RET']] = 'return +HEAPF64[sp + (lx << 3) >> 3];' + CASES[ROPCODES['RET']] += 'return +HEAPF64[sp + (lx << 3) >> 3];' # call is generated using information of actual call patterns if ROPCODES['CALL'] not in CASES: @@ -242,6 +243,7 @@ def fix_case(case): } //printErr('result in ' + lx + ': ' + Array.prototype.slice.call(HEAPU8, sp+8*lx, sp+8*(lx+1))); } + EMTSTACKTOP = sp; %s }''' % ( '_' if t != 'void' else '', From 4f2880876a069c12d97680b5ccd9ec2c4e579d02 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 13:48:44 -0700 Subject: [PATCH 139/461] load/store of floats --- tools/emterpretify.py | 8 ++++++++ tools/js-optimizer.js | 13 ++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index d45587da0e940..d9dfee5516293 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -68,6 +68,10 @@ '130': 'STORE8', # [lx, ly, 0] HEAP8[lx >> 2] = ly '140': 'STORE16', # [lx, ly, 0] HEAP16[lx >> 2] = ly '150': 'STORE32', # [lx, ly, 0] HEAP32[lx >> 2] = ly + + '151': 'LOADF64', # [lx, ly, 0] lx = HEAPF64[ly >> 3] + '152': 'STOREF64', # [lx, ly, 0] HEAPF64[lx >> 3] = ly + '159': 'BR', # [0, tl, th] jump t instructions (multiple of 4) '160': 'BRT', # [cond, tl, th] if cond, jump t instructions (multiple of 4) '161': 'BRF', # [cond, tl, th] if !cond, jump t instructions (multiple of 4) @@ -166,6 +170,10 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['STORE8']] = 'HEAP8[' + get_access('lx') + ' >> 0] = ' + get_coerced_access('ly') + ';'; CASES[ROPCODES['STORE16']] = 'HEAP16[' + get_access('lx') + ' >> 1] = ' + get_coerced_access('ly') + ';'; CASES[ROPCODES['STORE32']] = 'HEAP32[' + get_access('lx') + ' >> 2] = ' + get_coerced_access('ly') + ';'; + +CASES[ROPCODES['LOADF64']] = get_access('lx', s='d') + ' = ' + 'HEAPF64[' + get_access('ly') + ' >> 3];' +CASES[ROPCODES['STOREF64']] = 'HEAPF64[' + get_access('lx') + ' >> 3] = ' + get_coerced_access('ly', s='d') + ';'; + CASES[ROPCODES['BR']] = 'pc = pc + ((inst >> 16) << 2) | 0; continue;' CASES[ROPCODES['BRT']] = 'if (' + get_coerced_access('lx') + ') { pc = pc + ((inst >> 16) << 2) | 0; continue; }' CASES[ROPCODES['BRF']] = 'if (!(' + get_coerced_access('lx') + ')) { pc = pc + ((inst >> 16) << 2) | 0; continue; }' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 2962cec7e94d3..81fdc574b08fc 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1923,7 +1923,7 @@ function detectSign(node) { } else if (node[0] === 'num' || node[0] === 'name') { return ASM_FLEXIBLE; } - throw 'badd ' + JSON.stringify(node); + assert(0 , 'badd ' + JSON.stringify(node)); } function getCombinedSign(node1, node2, hint) { @@ -5788,12 +5788,12 @@ function emterpretify(ast) { assert(!parseHeapTemp.float); // coerced heap access => a load var y = getReg(value); + var opcode = 'STORE' + (parseHeapTemp.float ? 'F' : '') + parseHeapTemp.bits; if (target[2][0] === 'binary' && target[2][1] === '>>' && target[2][3][0] === 'num') { var shifts = target[2][3][1]; assert(shifts >= 0 && shifts <= 2); var bits = Math.pow(2, shifts)*8; assert(bits === parseHeapTemp.bits); - var opcode = 'STORE' + bits; var x = getReg(target[2][2], false, ASM_INT, ASM_SIGNED); return [-1, x[1].concat(y[1]).concat([opcode, releaseIfFree(x[0]), releaseIfFree(y[0]), 0])]; } else { @@ -5802,7 +5802,7 @@ function emterpretify(ast) { var shifts = Math.log2(parseHeapTemp.bits/8); assert(address === ((address << shifts) >> shifts)); var x = makeNum(address << shifts, ASM_INT); - y[1].push('STORE' + parseHeapTemp.bits, releaseIfFree(x[0]), releaseIfFree(y[0]), 0); + y[1].push(opcode, releaseIfFree(x[0]), releaseIfFree(y[0]), 0); return [-1, x[1].concat(y[1])]; } } else throw 'assign wha? ' + target[0]; @@ -5848,7 +5848,7 @@ function emterpretify(ast) { if (inner[1] === '+') return getReg(inner, dropIt, ASM_DOUBLE, ASM_NONSIGNED); throw 'grr'; } - case 'call': { + case 'call': case 'sub': { return getReg(inner, dropIt, ASM_DOUBLE, ASM_NONSIGNED); } case 'num': { @@ -5980,14 +5980,13 @@ function emterpretify(ast) { assert(node[1][0] === 'name'); var heap = node[1][1]; assert(parseHeap(heap)); - assert(!parseHeapTemp.float); // coerced heap access => a load + var opcode = 'LOAD' + (parseHeapTemp.float ? 'F' : '') + parseHeapTemp.bits; if (node[2][0] === 'binary' && node[2][1] === '>>' && node[2][3][0] === 'num') { var shifts = node[2][3][1]; assert(shifts >= 0 && shifts <= 2); var bits = Math.pow(2, shifts)*8; assert(bits === parseHeapTemp.bits); - var opcode = 'LOAD' + bits; var y = getReg(node[2][2], false, ASM_INT, ASM_SIGNED); var x = getFree(y[0]); return [x, y[1].concat([opcode, x, releaseIfFree(y[0], x), 0])]; @@ -5997,7 +5996,7 @@ function emterpretify(ast) { var shifts = Math.log2(parseHeapTemp.bits/8); assert(address === ((address << shifts) >> shifts)); var ret = makeNum(address << shifts, ASM_INT, getFree()); - ret[1].push('LOAD' + parseHeapTemp.bits, ret[0], ret[0], 0); + ret[1].push(opcode, ret[0], ret[0], 0); return ret; } } From 7275d4737d58897c90f3414eb389d8d0fb9f5468 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 13:55:29 -0700 Subject: [PATCH 140/461] improve detectAsmCoercion and add *,/ detection --- tools/js-optimizer.js | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 81fdc574b08fc..888caed79fd07 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1835,16 +1835,32 @@ var ASM_FLOAT_ZERO = null; // TODO: share the entire node? function detectAsmCoercion(node, asmInfo, inVarDef) { // for params, +x vs x|0, for vars, 0.0 vs 0 - if (node[0] === 'num' && node[1].toString().indexOf('.') >= 0) return ASM_DOUBLE; - if (node[0] === 'unary-prefix' && node[1] === '+') return ASM_DOUBLE; - if (node[0] === 'call' && node[1][0] === 'name' && node[1][1] === 'Math_fround') return ASM_FLOAT; - if (asmInfo && node[0] == 'name') return getAsmType(node[1], asmInfo); - if (node[0] === 'name') { - if (!inVarDef) return ASM_NONE; - // We are in a variable definition, where Math_fround(0) optimized into a global constant becomes f0 = Math_fround(0) - if (!ASM_FLOAT_ZERO) ASM_FLOAT_ZERO = node[1]; - else assert(ASM_FLOAT_ZERO === node[1]); - return ASM_FLOAT; + switch (node[0]) { + case 'num': { + if (node[1].toString().indexOf('.') >= 0) return ASM_DOUBLE; + break; + } + case 'unary-prefix': { + if (node[1] === '+') return ASM_DOUBLE; + break; + } + case 'call': { + if (node[1][0] === 'name' && node[1][1] === 'Math_fround') return ASM_FLOAT; + break; + } + case 'name': { + if (asmInfo) return getAsmType(node[1], asmInfo); + if (!inVarDef) return ASM_NONE; + // We are in a variable definition, where Math_fround(0) optimized into a global constant becomes f0 = Math_fround(0) + if (!ASM_FLOAT_ZERO) ASM_FLOAT_ZERO = node[1]; + else assert(ASM_FLOAT_ZERO === node[1]); + return ASM_FLOAT; + break; + } + case 'binary': { + if (node[1] === '*' || node[1] === '/') return ASM_DOUBLE; // uncoerced by |0 etc., these ops are double + break; + } } return ASM_INT; } From bb1e867c8f078d30e7f2bd8897df82e042cb9cba Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 13:58:50 -0700 Subject: [PATCH 141/461] detectSign of uncoerced *,/ as non-signed --- tools/js-optimizer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 888caed79fd07..326475bde21f3 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1928,7 +1928,8 @@ function detectSign(node) { case '|': case '&': case '^': case '<<': case '>>': return ASM_SIGNED; case '>>>': return ASM_UNSIGNED; case '+': case '-': return ASM_FLEXIBLE; - default: throw 'yikes'; + case '*': case '/': return ASM_NONSIGNED; // without a coercion, these are double + default: throw 'yikes ' + node[1]; } } else if (node[0] === 'unary-prefix') { switch(node[1]) { @@ -5801,7 +5802,6 @@ function emterpretify(ast) { // assign to memory var heap = target[1][1]; assert(parseHeap(heap)); - assert(!parseHeapTemp.float); // coerced heap access => a load var y = getReg(value); var opcode = 'STORE' + (parseHeapTemp.float ? 'F' : '') + parseHeapTemp.bits; From 4b67400af670d9127caffd40b27246daf6254816 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 14:02:40 -0700 Subject: [PATCH 142/461] detect +,- without coercion as double ops --- tools/js-optimizer.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 326475bde21f3..10f15da0a13b8 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1858,7 +1858,9 @@ function detectAsmCoercion(node, asmInfo, inVarDef) { break; } case 'binary': { - if (node[1] === '*' || node[1] === '/') return ASM_DOUBLE; // uncoerced by |0 etc., these ops are double + switch (node[1]) { + case '+': case '-': case '*': case '/': return ASM_DOUBLE; // uncoerced by |0 etc., these ops are double + } break; } } From 9ed209cb06ccf16a433d989719aca17710696a0b Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 14:04:10 -0700 Subject: [PATCH 143/461] load, store f32 --- tools/emterpretify.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index d9dfee5516293..a0c00154819ac 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -71,6 +71,8 @@ '151': 'LOADF64', # [lx, ly, 0] lx = HEAPF64[ly >> 3] '152': 'STOREF64', # [lx, ly, 0] HEAPF64[lx >> 3] = ly + '153': 'LOADF32', # [lx, ly, 0] lx = HEAPF32[ly >> 3] + '154': 'STOREF32', # [lx, ly, 0] HEAPF32[lx >> 3] = ly '159': 'BR', # [0, tl, th] jump t instructions (multiple of 4) '160': 'BRT', # [cond, tl, th] if cond, jump t instructions (multiple of 4) @@ -173,6 +175,8 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['LOADF64']] = get_access('lx', s='d') + ' = ' + 'HEAPF64[' + get_access('ly') + ' >> 3];' CASES[ROPCODES['STOREF64']] = 'HEAPF64[' + get_access('lx') + ' >> 3] = ' + get_coerced_access('ly', s='d') + ';'; +CASES[ROPCODES['LOADF32']] = get_access('lx', s='d') + ' = ' + 'HEAPF32[' + get_access('ly') + ' >> 2];' +CASES[ROPCODES['STOREF32']] = 'HEAPF32[' + get_access('lx') + ' >> 2] = ' + get_coerced_access('ly', s='d') + ';'; CASES[ROPCODES['BR']] = 'pc = pc + ((inst >> 16) << 2) | 0; continue;' CASES[ROPCODES['BRT']] = 'if (' + get_coerced_access('lx') + ') { pc = pc + ((inst >> 16) << 2) | 0; continue; }' From 982394591f5686b20189e21169643c49bba7c8be Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 14:05:31 -0700 Subject: [PATCH 144/461] relax restriction on float load/store size --- tools/js-optimizer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 10f15da0a13b8..c7807fd4223e2 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5809,7 +5809,7 @@ function emterpretify(ast) { var opcode = 'STORE' + (parseHeapTemp.float ? 'F' : '') + parseHeapTemp.bits; if (target[2][0] === 'binary' && target[2][1] === '>>' && target[2][3][0] === 'num') { var shifts = target[2][3][1]; - assert(shifts >= 0 && shifts <= 2); + assert(shifts >= 0 && shifts <= 3); var bits = Math.pow(2, shifts)*8; assert(bits === parseHeapTemp.bits); var x = getReg(target[2][2], false, ASM_INT, ASM_SIGNED); @@ -6002,7 +6002,7 @@ function emterpretify(ast) { var opcode = 'LOAD' + (parseHeapTemp.float ? 'F' : '') + parseHeapTemp.bits; if (node[2][0] === 'binary' && node[2][1] === '>>' && node[2][3][0] === 'num') { var shifts = node[2][3][1]; - assert(shifts >= 0 && shifts <= 2); + assert(shifts >= 0 && shifts <= 3); var bits = Math.pow(2, shifts)*8; assert(bits === parseHeapTemp.bits); var y = getReg(node[2][2], false, ASM_INT, ASM_SIGNED); From 1455957bd4aeb430884d1c2521778d5c8d637387 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 16:06:29 -0700 Subject: [PATCH 145/461] support for function pointer calls --- tools/emterpretify.py | 13 +++++--- tools/js-optimizer.js | 72 +++++++++++++++++++++++-------------------- 2 files changed, 48 insertions(+), 37 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index a0c00154819ac..5e99733a59899 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -22,7 +22,7 @@ '1': 'GETST', # [l, 0, 0] l = STACKTOP '2': 'SETST', # [l, 0, 0] STACKTOP = l '3': 'SETVI', # [l, vl, vh] l = v (16-bit signed int) - '4': 'SETVIB', # [l, vl, vh] l = 32-bit int in next 32-bit instruction + '4': 'SETVIB', # [l, 0, 0] [..v..] l = 32-bit int in next 32-bit instruction '5': 'ADD', # [lx, ly, lz] lx = ly + lz (32-bit int) '6': 'SUB', # [lx, ly, lz] lx = ly - lz (32-bit int) '7': 'MUL', # [lx, ly, lz] lx = ly * lz (32-bit int) @@ -80,8 +80,9 @@ #'170': 'ABR', # [lx, 0, 0, 0] absolute branch to address lx (assumed divisible by 4) '200': 'GETTDP', # [l, 0, 0] l = tempDoublePtr #'201': 'GETPC', # [l, 0, 0] l = pc - '250': 'CALL', # [lx, target, sig, params..] (lx = ) target(params..) lx's existence and type depend on the target's actual callsig; - # this instruction can take multiple 32-bit instruction chunks + '250': 'CALL', # [lx, target, sig] [params...] (lx = ) target(params..) lx's existence and type depend on the target's actual callsig; + # this instruction can take multiple 32-bit instruction chunks + # if target is a function table, then the first param is the index of the register holding the function pointer '251': 'SWITCH', # [lx, ly, lz] switch (lx) { .. }. followed by a jump table for values in range [ly..ly+lz), after which is the default (which might be empty) '254': 'RET', # [l, 0, 0] return l (depending on which emterpreter_x we are in, has the right type) '255': 'FUNC', # [n, 0, 0] function with n locals (each taking 64 bits) @@ -209,11 +210,15 @@ def make_emterpreter(t): #print >> sys.stderr, call_sigs def make_target_call(i): name = rglobal_funcs[i] + function_pointer_call = name.startswith('FUNCTION_TABLE_') if name not in call_sigs: return None sigs = call_sigs[name] assert len(sigs) == 1, [name, sigs] sig = sigs[0] - ret = name + '(' + ', '.join([get_coerced_access('HEAP8[pc+%d>>0]' % (i+4), s=sig[i+1]) for i in range(len(sig)-1)]) + ')' + ret = name + if function_pointer_call: + ret += '[' + get_coerced_access('HEAP8[pc+4>>0]') + ']' + ret += '(' + ', '.join([get_coerced_access('HEAP8[pc+%d>>0]' % (i+4+(1 if function_pointer_call else 0)), s=sig[i+1]) for i in range(len(sig)-1)]) + ')' if sig[0] != 'v': ret = get_access('lx', sig[0]) + ' = ' + shared.JS.make_coercion(ret, sig[0]) elif name in actual_return_types and actual_return_types[name] != 'v': diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index c7807fd4223e2..031fea846655a 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5900,22 +5900,17 @@ function emterpretify(ast) { throw 'todo'; } case 'call': { - if (node[1][0] === 'name') { - var type; - var ret; - if (dropIt) { - type = ASM_NONE; - ret = -1; - } else { - assert(typeHint !== ASM_NONE); - type = typeHint; - ret = getFree(); - } - return [ret, makeCall(ret, node, type)]; + var type; + var ret; + if (dropIt) { + type = ASM_NONE; + ret = -1; } else { - // todo: function pointer call + assert(typeHint !== ASM_NONE); + type = typeHint; + ret = getFree(); } - throw 'todo'; + return [ret, makeCall(ret, node, type)]; } case 'return': { assert(dropIt); @@ -6293,28 +6288,39 @@ function emterpretify(ast) { function makeCall(lx, node, type) { // TODO: specialize calls like imul assert(node[0] === 'call'); + var ret = []; + var target; + var functionPointer = null; if (node[1][0] === 'name') { // normal direct call - var ret = ['CALL']; - var actuals = []; - var sig = ASM_SIG[type]; - node[2].forEach(function(param) { - var reg = getReg(param); - ret = reg[1].concat(ret); - actuals.push(reg[0]); - sig += ASM_SIG[detectAsmCoercion(param, asmData)]; - }); - ret.push(lx); - ret.push(node[1][1]); - assert(sig.indexOf('u') < 0); // no undefined - ret.push(sig); - ret = ret.concat(actuals); - actuals.forEach(releaseIfFree); - while (ret.length % 4 !== 0) ret.push(0); - return ret; + target = node[1][1]; } else { - throw 'todo: function pointer call'; - } + // function pointer call through function table + assert(node[1][0] === 'sub' && node[1][1][0] === 'name'); + target = node[1][1][1]; + functionPointer = getReg(node[1][2]); + ret = ret.concat(functionPointer[1]); + } + var actuals = []; + var sig = ASM_SIG[type]; + node[2].forEach(function(param) { + var reg = getReg(param); + ret = ret.concat(reg[1]); + actuals.push(reg[0]); + sig += ASM_SIG[detectAsmCoercion(param, asmData)]; + }); + ret.push('CALL'); + ret.push(lx); + ret.push(target); + assert(sig.indexOf('u') < 0); // no undefined + ret.push(sig); + actuals.forEach(releaseIfFree); + if (functionPointer) { + ret.push(releaseIfFree(functionPointer[0])); + } + ret = ret.concat(actuals); + while (ret.length % 4 !== 0) ret.push(0); + return ret; } function walkStatements(stats) { From da9be3f5013fdb692fb795e517a8182c0b0a748b Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 16:13:54 -0700 Subject: [PATCH 146/461] fix bug with forEach extra params --- tools/js-optimizer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 031fea846655a..de6fcbec65a6b 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6314,7 +6314,7 @@ function emterpretify(ast) { ret.push(target); assert(sig.indexOf('u') < 0); // no undefined ret.push(sig); - actuals.forEach(releaseIfFree); + actuals.forEach(function(actual) { releaseIfFree(actual) }); if (functionPointer) { ret.push(releaseIfFree(functionPointer[0])); } From a4641f32e4c0cc1f4e58a133b1277a991b2fabb6 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 16:16:50 -0700 Subject: [PATCH 147/461] add function tables to list of callable globals, to enable function pointers to work --- tools/emterpretify.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 5e99733a59899..93b15de4809e2 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -299,6 +299,12 @@ def fix_case(case): global_funcs[func] = global_id rglobal_funcs[global_id] = func global_id += 1 + +for table in asm.tables: + global_funcs[table] = global_id + rglobal_funcs[global_id] = table + global_id += 1 + assert global_id < 256 # process functions, generating bytecode From 8b70e43df254f5f98697c414f783a3919513a547 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 16:26:03 -0700 Subject: [PATCH 148/461] add function table masks --- tools/emterpretify.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 93b15de4809e2..3194df2557bea 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -104,6 +104,12 @@ def bytify(x): assert x >= 0 and x < (1 << 32) return [x & 255, (x >> 8) & 255, (x >> 16) & 255, (x >> 24) & 255] +def next_power_of_two(x): + if x == 0: return 0 + ret = 1 + while ret < x: ret <<= 1 + return ret + def get_access(l, s='i'): if s == 'i': return 'HEAP32[sp + (' + l + ' << 3) >> 2]' @@ -217,7 +223,7 @@ def make_target_call(i): sig = sigs[0] ret = name if function_pointer_call: - ret += '[' + get_coerced_access('HEAP8[pc+4>>0]') + ']' + ret += '[' + get_access('HEAP8[pc+4>>0]') + ' & %d]' % (next_power_of_two(asm.tables[name].count(',')+1)-1) ret += '(' + ', '.join([get_coerced_access('HEAP8[pc+%d>>0]' % (i+4+(1 if function_pointer_call else 0)), s=sig[i+1]) for i in range(len(sig)-1)]) + ')' if sig[0] != 'v': ret = get_access('lx', sig[0]) + ' = ' + shared.JS.make_coercion(ret, sig[0]) From ae30209fccf92617911043def106c84f6bf2c5b5 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 16:39:27 -0700 Subject: [PATCH 149/461] clean up parseTempHeap usage --- tools/js-optimizer.js | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index de6fcbec65a6b..1472765c6171f 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -368,9 +368,13 @@ function removeUnneededLabelSettings(ast) { // Various expression simplifications. Happens after elimination, which opens up many of these simplification opportunities. -var parseHeapTemp = { unsigned: false, float: false, bits: 0 }; +function makeTempParseHeap() { + return { unsigned: false, float: false, bits: 0 }; +} + +var parseHeapTemp = makeTempParseHeap(); -function parseHeap(name, out) { +function parseHeap(name, out) { // XXX this uses parseHeapTemp by default, which is global! If between your call and your use, something else can call - that is bad out = out || parseHeapTemp; if (name.substr(0, 4) != 'HEAP') return false; out.unsigned = name[4] === 'U'; @@ -525,7 +529,7 @@ function simplifyExpressions(ast) { } else if (input[0] === 'sub' && input[1][0] === 'name') { // HEAP8[..] & 255 => HEAPU8[..] var name = input[1][1]; - if (parseHeap(name, parseHeapTemp)) { + if (parseHeap(name)) { if (amount === Math.pow(2, parseHeapTemp.bits)-1) { if (!parseHeapTemp.unsigned) { input[1][1] = 'HEAPU' + parseHeapTemp.bits; // make unsigned @@ -553,7 +557,7 @@ function simplifyExpressions(ast) { // collapse HEAPU?8[..] << 24 >> 24 etc. into HEAP8[..] | 0 var amount = node[3][1]; var name = node[2][2][1][1]; - if (amount === node[2][3][1] && parseHeap(name, parseHeapTemp)) { + if (amount === node[2][3][1] && parseHeap(name)) { if (parseHeapTemp.bits === 32 - amount) { node[2][2][1][1] = 'HEAP' + parseHeapTemp.bits; node[1] = '|'; @@ -5646,7 +5650,7 @@ function pointerMasking(ast) { var addee = node[2][2]; if (!(addee[0] === 'binary' && addee[1] === '+')) return; var shifts = node[2][3][1]; - if (!parseHeap(node[1][1], parseHeapTemp)) return; + if (!parseHeap(node[1][1])) return; if (parseHeapTemp.bits !== 8*Math.pow(2, shifts)) return; // this is an HEAP[U]N[x + y >> n] expression. gather up all the top-level added items, seek a small constant amongst them var addedElements = []; @@ -5803,21 +5807,22 @@ function emterpretify(ast) { } else if (target[0] === 'sub') { // assign to memory var heap = target[1][1]; - assert(parseHeap(heap)); + var temp = makeTempParseHeap(); + assert(parseHeap(heap, temp)); // coerced heap access => a load var y = getReg(value); - var opcode = 'STORE' + (parseHeapTemp.float ? 'F' : '') + parseHeapTemp.bits; + var opcode = 'STORE' + (temp.float ? 'F' : '') + temp.bits; if (target[2][0] === 'binary' && target[2][1] === '>>' && target[2][3][0] === 'num') { var shifts = target[2][3][1]; assert(shifts >= 0 && shifts <= 3); var bits = Math.pow(2, shifts)*8; - assert(bits === parseHeapTemp.bits); + assert(bits === temp.bits, JSON.stringify([heap, ' ', temp, ' ', target])); var x = getReg(target[2][2], false, ASM_INT, ASM_SIGNED); return [-1, x[1].concat(y[1]).concat([opcode, releaseIfFree(x[0]), releaseIfFree(y[0]), 0])]; } else { assert(target[2][0] === 'num'); // HEAP32[8] or such var address = target[2][1]; - var shifts = Math.log2(parseHeapTemp.bits/8); + var shifts = Math.log2(temp.bits/8); assert(address === ((address << shifts) >> shifts)); var x = makeNum(address << shifts, ASM_INT); y[1].push(opcode, releaseIfFree(x[0]), releaseIfFree(y[0]), 0); @@ -5992,21 +5997,22 @@ function emterpretify(ast) { case 'sub': { assert(node[1][0] === 'name'); var heap = node[1][1]; - assert(parseHeap(heap)); + var temp = makeTempParseHeap(); + assert(parseHeap(heap, temp)); // coerced heap access => a load - var opcode = 'LOAD' + (parseHeapTemp.float ? 'F' : '') + parseHeapTemp.bits; + var opcode = 'LOAD' + (temp.float ? 'F' : '') + temp.bits; if (node[2][0] === 'binary' && node[2][1] === '>>' && node[2][3][0] === 'num') { var shifts = node[2][3][1]; assert(shifts >= 0 && shifts <= 3); var bits = Math.pow(2, shifts)*8; - assert(bits === parseHeapTemp.bits); + assert(bits === temp.bits); var y = getReg(node[2][2], false, ASM_INT, ASM_SIGNED); var x = getFree(y[0]); return [x, y[1].concat([opcode, x, releaseIfFree(y[0], x), 0])]; } else { assert(node[2][0] === 'num'); // HEAP32[8] or such var address = node[2][1]; - var shifts = Math.log2(parseHeapTemp.bits/8); + var shifts = Math.log2(temp.bits/8); assert(address === ((address << shifts) >> shifts)); var ret = makeNum(address << shifts, ASM_INT, getFree()); ret[1].push(opcode, ret[0], ret[0], 0); From d88eebfbd011eaa8f81c00c4a080ca9b02136b26 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 16:53:28 -0700 Subject: [PATCH 150/461] BNOT --- tools/emterpretify.py | 2 ++ tools/js-optimizer.js | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 3194df2557bea..21a9429b39697 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -32,6 +32,7 @@ '11': 'UMOD', # [lx, ly, lz] lx = ly % lz (32-bit unsigned int) '12': 'NEG', # [lx, ly, 0] lx = -ly (int) '13': 'LNOT', # [lx, ly, 0] ly = !ly (int) + '14': 'BNOT', # [lx, ly, 0] ly = ~ly (int) '18': 'EQ', # [lx, ly, lz] lx = ly == lz (32-bit int) '19': 'NE', # [lx, ly, lz] lx = ly != lz (32-bit int) '20': 'SLT', # [lx, ly, lz] lx = ly < lz (32-bit signed) @@ -144,6 +145,7 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['UMOD']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') % (' + get_coerced_access('lz', unsigned=True) + ') >>> 0;' CASES[ROPCODES['NEG']] = get_access('lx') + ' = -(' + get_coerced_access('ly') + ');' CASES[ROPCODES['LNOT']] = get_access('lx') + ' = !(' + get_coerced_access('ly') + ');' +CASES[ROPCODES['BNOT']] = get_access('lx') + ' = ~(' + get_coerced_access('ly') + ');' CASES[ROPCODES['EQ']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') == (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['NE']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') != (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['SLT']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') < (' + get_coerced_access('lz') + ') | 0;' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 1472765c6171f..fe825b07769ae 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5894,7 +5894,7 @@ function emterpretify(ast) { assert(!dropIt); switch (node[1]) { - case '-': { + case '-': case '~': { var type = detectAsmCoercion(node[2], asmData); var sign = detectSign(node[2]); return makeUnary(node, type, sign); @@ -6203,6 +6203,7 @@ function emterpretify(ast) { switch(node[1]) { case '-': assert(type === ASM_INT); opcode = 'NEG'; break; case '!': assert(type === ASM_INT); opcode = 'LNOT'; break; + case '~': assert(type === ASM_INT); opcode = 'BNOT'; break; case 'I2D': case 'D2I': opcode = node[1]; break; default: throw 'bad'; } From 0990d783a96562bafe3ffe9b42dccb71ef479055 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 16:55:15 -0700 Subject: [PATCH 151/461] detect ~ as signed --- tools/js-optimizer.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index fe825b07769ae..d82ce37f3c9a2 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1941,6 +1941,7 @@ function detectSign(node) { switch(node[1]) { case '-': return ASM_FLEXIBLE; case '+': return ASM_DOUBLE; // XXX + case '~': return ASM_SIGNED; default: throw 'yikes'; } } else if (node[0] === 'num' || node[0] === 'name') { From 3ebe79cc0f050f6d628a418bba33dbf13e7fac98 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 16:56:18 -0700 Subject: [PATCH 152/461] fix unary + sign detection --- tools/js-optimizer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index d82ce37f3c9a2..ae91991c032a3 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1940,7 +1940,7 @@ function detectSign(node) { } else if (node[0] === 'unary-prefix') { switch(node[1]) { case '-': return ASM_FLEXIBLE; - case '+': return ASM_DOUBLE; // XXX + case '+': return ASM_NONSIGNED; // XXX double case '~': return ASM_SIGNED; default: throw 'yikes'; } From 18efa9c72349beeeae44869534698a830ee9b669 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 16:59:07 -0700 Subject: [PATCH 153/461] let type detection be driven by ints --- tools/js-optimizer.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index ae91991c032a3..a69e370ab2fe3 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1918,6 +1918,7 @@ function getCombinedType(node1, node2, asmData, hint) { } if (type1 !== type2) { if (type1 === hint || type2 === hint) return hint; + if (type1 === ASM_INT || type2 === ASM_INT) return ASM_INT; // INT overrides everything, least tolerant assert(0, "can't figure it out " + JSON.stringify([node1, '....', node2, ' ', type1, type2, hint])); } return type1; From fe57b74e5e8570f0b0d886efa62c6e3cdbd656ca Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 17:01:32 -0700 Subject: [PATCH 154/461] refactor detectSign and add conditional detection --- tools/js-optimizer.js | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index a69e370ab2fe3..78117fc33f1c9 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1930,23 +1930,28 @@ var ASM_UNSIGNED = 2; var ASM_NONSIGNED = 3; function detectSign(node) { - if (node[0] === 'binary') { - switch(node[1]) { - case '|': case '&': case '^': case '<<': case '>>': return ASM_SIGNED; - case '>>>': return ASM_UNSIGNED; - case '+': case '-': return ASM_FLEXIBLE; - case '*': case '/': return ASM_NONSIGNED; // without a coercion, these are double - default: throw 'yikes ' + node[1]; - } - } else if (node[0] === 'unary-prefix') { - switch(node[1]) { - case '-': return ASM_FLEXIBLE; - case '+': return ASM_NONSIGNED; // XXX double - case '~': return ASM_SIGNED; - default: throw 'yikes'; - } - } else if (node[0] === 'num' || node[0] === 'name') { - return ASM_FLEXIBLE; + switch (node[0]) { + case 'binary': { + switch(node[1]) { + case '|': case '&': case '^': case '<<': case '>>': return ASM_SIGNED; + case '>>>': return ASM_UNSIGNED; + case '+': case '-': return ASM_FLEXIBLE; + case '*': case '/': return ASM_NONSIGNED; // without a coercion, these are double + default: throw 'yikes ' + node[1]; + } + break; + } + case 'unary-prefix': { + switch(node[1]) { + case '-': return ASM_FLEXIBLE; + case '+': return ASM_NONSIGNED; // XXX double + case '~': return ASM_SIGNED; + default: throw 'yikes'; + } + break; + } + case 'num': case 'name': return ASM_FLEXIBLE; + case 'conditional': return detectSign(node[2]); } assert(0 , 'badd ' + JSON.stringify(node)); } From ae74db5940c9c0152f1503afbf938db5a08112f4 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 17:06:38 -0700 Subject: [PATCH 155/461] disable most debug output --- tools/emterpretify.py | 4 ++-- tools/js-optimizer.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 21a9429b39697..05bc992371461 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -405,9 +405,9 @@ def process_code(func, code, absolute_targets): if curr is not None: assert len(curr) % 4 == 0, curr funcs[func] = len(all_code) # no operation here should change the length - print >> sys.stderr, 'raw bytecode for %s:' % func, curr + #print >> sys.stderr, 'raw bytecode for %s:' % func, curr process_code(func, curr, absolute_targets) - print >> sys.stderr, 'processed bytecode for %s:' % func, curr + #print >> sys.stderr, 'processed bytecode for %s:' % func, curr all_code += curr func = None lines[i] = '}' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 78117fc33f1c9..8d94fa45b64cd 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5754,7 +5754,7 @@ function emterpretify(ast) { // if dropIt is provided, then the output of this can just be dropped. // you *must* call releaseIfFree on the l that is returned; if it is a free local, that will free it. function getReg(node, dropIt, typeHint, signHint) { - printErr('getReg ' + JSON.stringify(node) + ' : ' + astToSrc(node) + ' : ' + [dropIt, typeHint, signHint]); + //printErr('getReg ' + JSON.stringify(node) + ' : ' + astToSrc(node) + ' : ' + [dropIt, typeHint, signHint]); switch(node[0]) { case 'name': { var name = node[1]; @@ -6349,7 +6349,7 @@ function emterpretify(ast) { releaseIfFree(raw[0]); if (freeLocals.length !== before) assert(0, [before, freeLocals.length] + ' due to ' + astToSrc(stat)); // the statement is done - nothing should still be held on to var curr = raw[1]; - printErr('stat: ' + JSON.stringify(curr)); + //printErr('stat: ' + JSON.stringify(curr)); verifyCode(curr); ret = ret.concat(curr); }); From 14aa4d9a7bc9ac6872feb077baf8ae6646c15836 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 17:12:11 -0700 Subject: [PATCH 156/461] remove heavy assert output --- tools/js-optimizer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 8d94fa45b64cd..5c4659e920919 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5823,7 +5823,7 @@ function emterpretify(ast) { var shifts = target[2][3][1]; assert(shifts >= 0 && shifts <= 3); var bits = Math.pow(2, shifts)*8; - assert(bits === temp.bits, JSON.stringify([heap, ' ', temp, ' ', target])); + assert(bits === temp.bits); // JSON.stringify([heap, ' ', temp, ' ', target])); var x = getReg(target[2][2], false, ASM_INT, ASM_SIGNED); return [-1, x[1].concat(y[1]).concat([opcode, releaseIfFree(x[0]), releaseIfFree(y[0]), 0])]; } else { From 28f7bcf9446e90058c96a8654f8e278b38f97b66 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 17:16:02 -0700 Subject: [PATCH 157/461] relax switch assert --- tools/js-optimizer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 5c4659e920919..c06dbadfaeae2 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6055,7 +6055,7 @@ function emterpretify(ast) { } breakStack.pop(); var range = maxx - minn + 1; - assert(minn >= 0 && maxx < 128); // we need both minn to be a tiny int, and their range + assert(minn === (minn | 0) && range === (range | 0)); var defaultAbsolute = data['default'] ? data['default'].absolute : absoluteId++; // emit the switch instruction itself var tempMin = getFree(), tempRange = getFree(); From b0042503d347d3b88da11bf576f03d6874293b37 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 17:28:23 -0700 Subject: [PATCH 158/461] refactor make_target_call --- tools/emterpretify.py | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 05bc992371461..89e6d958de892 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -221,20 +221,23 @@ def make_target_call(i): function_pointer_call = name.startswith('FUNCTION_TABLE_') if name not in call_sigs: return None sigs = call_sigs[name] + + def make_target_call_sig(sig): + ret = name + if function_pointer_call: + ret += '[' + get_access('HEAP8[pc+4>>0]') + ' & %d]' % (next_power_of_two(asm.tables[name].count(',')+1)-1) + ret += '(' + ', '.join([get_coerced_access('HEAP8[pc+%d>>0]' % (i+4+(1 if function_pointer_call else 0)), s=sig[i+1]) for i in range(len(sig)-1)]) + ')' + if sig[0] != 'v': + ret = get_access('lx', sig[0]) + ' = ' + shared.JS.make_coercion(ret, sig[0]) + elif name in actual_return_types and actual_return_types[name] != 'v': + ret = shared.JS.make_coercion(ret, actual_return_types[name]) # return value ignored, but need a coercion + extra = len(sig) - 1 # [opcode, lx, target, sig], take the usual 4. params are extra + if extra > 0: + ret += '; pc = pc + %d | 0' % (4*((extra+3)>>2)) + return ' ' + ret + '; break;' + assert len(sigs) == 1, [name, sigs] - sig = sigs[0] - ret = name - if function_pointer_call: - ret += '[' + get_access('HEAP8[pc+4>>0]') + ' & %d]' % (next_power_of_two(asm.tables[name].count(',')+1)-1) - ret += '(' + ', '.join([get_coerced_access('HEAP8[pc+%d>>0]' % (i+4+(1 if function_pointer_call else 0)), s=sig[i+1]) for i in range(len(sig)-1)]) + ')' - if sig[0] != 'v': - ret = get_access('lx', sig[0]) + ' = ' + shared.JS.make_coercion(ret, sig[0]) - elif name in actual_return_types and actual_return_types[name] != 'v': - ret = shared.JS.make_coercion(ret, actual_return_types[name]) # return value ignored, but need a coercion - extra = len(sig) - 1 # [opcode, lx, target, sig], take the usual 4. params are extra - if extra > 0: - ret += '; pc = pc + %d | 0' % (4*((extra+3)>>2)) - return ' ' + ret + '; break;' + return make_target_call_sig(sigs[0]) CASES[ROPCODES['CALL']] = 'switch (ly|0) {\n' + \ '\n'.join(filter(lambda x: 'None' not in x, [' case %d: {\n%s\n }' % (i, make_target_call(i)) for i in range(global_id-1)])) + \ From 27a66daed6bb6ea4694fa3ec9f2d1bb7d365a358 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 17:35:55 -0700 Subject: [PATCH 159/461] support 2 call sigs for a function --- tools/emterpretify.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 89e6d958de892..731d80d154b09 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -236,8 +236,11 @@ def make_target_call_sig(sig): ret += '; pc = pc + %d | 0' % (4*((extra+3)>>2)) return ' ' + ret + '; break;' - assert len(sigs) == 1, [name, sigs] - return make_target_call_sig(sigs[0]) + if len(sigs) == 1: + return make_target_call_sig(sigs[0]) + else: + assert len(sigs) == 2 + return 'if ((HEAP8[pc+3>>0]|0) == 0) { ' + make_target_call_sig(sigs[0]) + ' } else { ' + make_target_call_sig(sigs[1]) + ' }' CASES[ROPCODES['CALL']] = 'switch (ly|0) {\n' + \ '\n'.join(filter(lambda x: 'None' not in x, [' case %d: {\n%s\n }' % (i, make_target_call(i)) for i in range(global_id-1)])) + \ From 1335622fa28286c2cfd2a25c84ae4b21d808fc17 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 17:42:02 -0700 Subject: [PATCH 160/461] fix off-by-one error in emitting call --- tools/emterpretify.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 731d80d154b09..6f8de00d77479 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -243,7 +243,7 @@ def make_target_call_sig(sig): return 'if ((HEAP8[pc+3>>0]|0) == 0) { ' + make_target_call_sig(sigs[0]) + ' } else { ' + make_target_call_sig(sigs[1]) + ' }' CASES[ROPCODES['CALL']] = 'switch (ly|0) {\n' + \ - '\n'.join(filter(lambda x: 'None' not in x, [' case %d: {\n%s\n }' % (i, make_target_call(i)) for i in range(global_id-1)])) + \ + '\n'.join(filter(lambda x: 'None' not in x, [' case %d: {\n%s\n }' % (i, make_target_call(i)) for i in range(global_id)])) + \ '\n default: assert(0);' + \ '\n }' From 70eeb13682293af2f2808f8e62e4542f67adc85f Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 18:02:13 -0700 Subject: [PATCH 161/461] optimize some arrays --- tools/js-optimizer.js | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index c06dbadfaeae2..b0364b27c643e 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5801,12 +5801,14 @@ function emterpretify(ast) { } else if (type === ASM_DOUBLE) { opcode = 'SETD'; } else throw 'ick'; - return [locals[name], reg[1].concat([opcode, locals[name], releaseIfFree(reg[0]), 0])]; + reg[1].push(opcode, locals[name], releaseIfFree(reg[0]), 0); + return [locals[name], reg[1]]; } else { switch(name) { case 'STACKTOP': { var reg = getReg(value); - return [-1, reg[1].concat(['SETST', releaseIfFree(reg[0]), 0, 0])]; + reg[1].push('SETST', releaseIfFree(reg[0]), 0, 0); + return [-1, reg[1]]; } default: throw 'assign global wha? ' + name; } @@ -5825,7 +5827,9 @@ function emterpretify(ast) { var bits = Math.pow(2, shifts)*8; assert(bits === temp.bits); // JSON.stringify([heap, ' ', temp, ' ', target])); var x = getReg(target[2][2], false, ASM_INT, ASM_SIGNED); - return [-1, x[1].concat(y[1]).concat([opcode, releaseIfFree(x[0]), releaseIfFree(y[0]), 0])]; + var ret = x[1].concat(y[1]); + ret.push(opcode, releaseIfFree(x[0]), releaseIfFree(y[0]), 0); + return [-1, ret]; } else { assert(target[2][0] === 'num'); // HEAP32[8] or such var address = target[2][1]; @@ -5930,7 +5934,8 @@ function emterpretify(ast) { var reg; if (value) reg = getReg(value); else reg = [-1, []]; - return [-1, reg[1].concat(['RET', value ? releaseIfFree(reg[0]) : 0, 0, 0])]; + reg[1].push('RET', value ? releaseIfFree(reg[0]) : 0, 0, 0); + return [-1, reg[1]]; } case 'do': { return makeDo(node); @@ -5972,15 +5977,17 @@ function emterpretify(ast) { var condition = getReg(node[1]); var ret; if (!node[3]) { - ret = condition[1].concat(['BRF', releaseIfFree(condition[0]), exit, 0]); - ret = ret.concat(walkStatements(node[2])); + condition[1].push('BRF', releaseIfFree(condition[0]), exit, 0); + ret = condition[1].concat(walkStatements(node[2])); } else { var otherwise = markerId++; - ret = condition[1].concat(['BRF', releaseIfFree(condition[0]), otherwise, 0]); - ret = ret.concat(walkStatements(node[2])).concat(['BR', 0, exit, 0]) - .concat(['marker', otherwise, 0, 0]).concat(walkStatements(node[3])); + condition[1].push('BRF', releaseIfFree(condition[0]), otherwise, 0); + ret = condition[1].concat(walkStatements(node[2])); + ret.push('BR', 0, exit, 0, 'marker', otherwise, 0, 0); + ret = ret.concat(walkStatements(node[3])); } - return [-1, ret.concat(['marker', exit, 0, 0])]; + ret.push('marker', exit, 0, 0); + return [-1, ret]; } case 'conditional': { // TODO: optimize From 28a872b7b3ff696306fc44639eedda7d1f91e22e Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 18:15:34 -0700 Subject: [PATCH 162/461] optimize more arrays --- tools/js-optimizer.js | 43 ++++++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index b0364b27c643e..8ecad67624193 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5994,12 +5994,15 @@ function emterpretify(ast) { var otherwise = markerId++, exit = markerId++; var temp = getFree(); var condition = getReg(node[1]); - var ret = condition[1].concat(['BRF', releaseIfFree(condition[0]), otherwise, 0]); + var ret = condition[1]; + ret.push('BRF', releaseIfFree(condition[0]), otherwise, 0); var first = getReg(node[2]); - ret = ret.concat(first[1]).concat(['SET', temp, releaseIfFree(first[0]), 0, 'BR', 0, exit, 0]); + ret = ret.concat(first[1]); + ret.push('SET', temp, releaseIfFree(first[0]), 0, 'BR', 0, exit, 0); var second = getReg(node[3]); - ret = ret.concat(['marker', otherwise, 0, 0]).concat(second[1]).concat(['SET', temp, releaseIfFree(second[0]), 0]); - ret = ret.concat(['marker', exit, 0, 0]); + ret.push('marker', otherwise, 0, 0); + ret = ret.concat(second[1]); + ret.push('SET', temp, releaseIfFree(second[0]), 0, 'marker', exit, 0, 0); return [temp, ret]; } case 'seq': { @@ -6022,7 +6025,8 @@ function emterpretify(ast) { assert(bits === temp.bits); var y = getReg(node[2][2], false, ASM_INT, ASM_SIGNED); var x = getFree(y[0]); - return [x, y[1].concat([opcode, x, releaseIfFree(y[0], x), 0])]; + y[1].push(opcode, x, releaseIfFree(y[0], x), 0); + return [x, y[1]]; } else { assert(node[2][0] === 'num'); // HEAP32[8] or such var address = node[2][1]; @@ -6209,7 +6213,9 @@ function emterpretify(ast) { var y = getReg(node[2]); var z = getReg(node[3]); var x = getFree(y[0], z[0]); - return [x, y[1].concat(z[1]).concat([opcode, x, releaseIfFree(y[0], x), releaseIfFree(z[0], x)])]; + y[1] = y[1].concat(z[1]); + y[1].push(opcode, x, releaseIfFree(y[0], x), releaseIfFree(z[0], x)); + return [x, y[1]]; } function makeUnary(node, type, sign) { @@ -6223,7 +6229,8 @@ function emterpretify(ast) { } var y = getReg(node[2]); var x = getFree(y[0]); - return [x, y[1].concat([opcode, x, releaseIfFree(y[0], x), 0])]; + y[1].push(opcode, x, releaseIfFree(y[0], x), 0); + return [x, y[1]]; } function makeDo(node, label) { @@ -6259,15 +6266,15 @@ function emterpretify(ast) { } var ret = []; if (!oneTime) { - ret = ret.concat(['marker', top, 0, 0]); + ret.push('marker', top, 0, 0); } ret = ret.concat(body); if (!oneTime) { - ret = ret.concat(['marker', cond, 0, 0]).concat(condition[1]).concat( - ['BRT', releaseIfFree(condition[0]), top, 0] - ); + ret.push('marker', cond, 0, 0); + ret = ret.concat(condition[1]); + ret.push('BRT', releaseIfFree(condition[0]), top, 0); } - ret = ret.concat(['marker', exit, 0, 0]); + ret.push('marker', exit, 0, 0); return [-1, ret]; } @@ -6292,18 +6299,20 @@ function emterpretify(ast) { } var ret = []; if (!infinite) { - ret = ret.concat(['marker', cond, 0, 0]).concat(condition[1]).concat( - ['BRF', releaseIfFree(condition[0]), exit, 0] - ); + ret.push('marker', cond, 0, 0); + ret = ret.concat(condition[1]); + ret.push('BRF', releaseIfFree(condition[0]), exit, 0); } - ret = ret.concat(['marker', top, 0, 0]).concat(walkStatements(node[2])).concat(['BR', 0, cond, 0]); + ret = ret.concat(['marker', top, 0, 0]).concat(walkStatements(node[2])); + ret.push('BR', 0, cond, 0); breakStack.pop(); continueStack.pop(); if (label) { delete breakLabels[label]; delete continueLabels[label]; } - return [-1, ret.concat(['marker', exit, 0, 0])]; + ret.push('marker', exit, 0, 0); + return [-1, ret]; } function makeCall(lx, node, type) { From cbe2c6cc2fb6b0800baff8af0a466c54f0800475 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 19:09:24 -0700 Subject: [PATCH 163/461] fix coercions --- tools/emterpretify.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 6f8de00d77479..fca0d15d22c3d 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -182,9 +182,9 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['STORE16']] = 'HEAP16[' + get_access('lx') + ' >> 1] = ' + get_coerced_access('ly') + ';'; CASES[ROPCODES['STORE32']] = 'HEAP32[' + get_access('lx') + ' >> 2] = ' + get_coerced_access('ly') + ';'; -CASES[ROPCODES['LOADF64']] = get_access('lx', s='d') + ' = ' + 'HEAPF64[' + get_access('ly') + ' >> 3];' +CASES[ROPCODES['LOADF64']] = get_access('lx', s='d') + ' = ' + '+HEAPF64[' + get_access('ly') + ' >> 3];' CASES[ROPCODES['STOREF64']] = 'HEAPF64[' + get_access('lx') + ' >> 3] = ' + get_coerced_access('ly', s='d') + ';'; -CASES[ROPCODES['LOADF32']] = get_access('lx', s='d') + ' = ' + 'HEAPF32[' + get_access('ly') + ' >> 2];' +CASES[ROPCODES['LOADF32']] = get_access('lx', s='d') + ' = ' + '+HEAPF32[' + get_access('ly') + ' >> 2];' CASES[ROPCODES['STOREF32']] = 'HEAPF32[' + get_access('lx') + ' >> 2] = ' + get_coerced_access('ly', s='d') + ';'; CASES[ROPCODES['BR']] = 'pc = pc + ((inst >> 16) << 2) | 0; continue;' From a435b25f17a4125bcda3fdc485729e558734d6aa Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 19:14:11 -0700 Subject: [PATCH 164/461] disable code verification by default --- tools/js-optimizer.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 8ecad67624193..57652014edb78 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5704,6 +5704,7 @@ function emterpretify(ast) { var BRANCHES = set('BR', 'BRT', 'BRF'); function verifyCode(code) { + return; if (code.length % 4 !== 0) assert(0, JSON.stringify(code)); for (var i = 0; i < code.length; i++) if (code[i] === undefined || code[i] === null || code < 0 || code > 255) assert(0, i + ' : ' + JSON.stringify(code)); } From 3393da2fab6803eaf872e9cf94253a90880db73e Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 19:21:09 -0700 Subject: [PATCH 165/461] small compiler optimization --- tools/js-optimizer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 57652014edb78..fcb6de497419a 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6472,7 +6472,7 @@ function emterpretify(ast) { var code = walkStatements(stats); assert(code.length % 4 === 0); if (code.length < 4 || code[code.length-4] != 'RET') { - code = code.concat(['RET', 0, 0, 0]); // final ret for the function + code.push('RET', 0, 0, 0); // final ret for the function } assert(maxLocal <= 256); code = ['FUNC', maxLocal+1, 0, 0].concat(code); From a5a2aaf8300479d464b40237b207dfec6645ccf0 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 23 Sep 2014 20:53:24 -0700 Subject: [PATCH 166/461] fix verifyCode --- tools/js-optimizer.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index fcb6de497419a..81fa5cafd6a66 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5704,9 +5704,13 @@ function emterpretify(ast) { var BRANCHES = set('BR', 'BRT', 'BRF'); function verifyCode(code) { - return; if (code.length % 4 !== 0) assert(0, JSON.stringify(code)); - for (var i = 0; i < code.length; i++) if (code[i] === undefined || code[i] === null || code < 0 || code > 255) assert(0, i + ' : ' + JSON.stringify(code)); + var len = code.length; + for (var i = 0; i < len; i++) { + if (typeof code[i] !== 'string' && typeof code[i] !== 'number') { + assert(0, i + ' : ' + JSON.stringify(code)); + } + } } function walkFunction(func) { From 40d5699461428879d338847e25999a4f393910bf Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 11:49:37 -0700 Subject: [PATCH 167/461] SETVDI --- tools/emterpretify.py | 2 ++ tools/js-optimizer.js | 7 ++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index fca0d15d22c3d..45533f80e8b36 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -48,6 +48,7 @@ '60': 'SETD', # [lx, ly, lz] lx = ly (double) '61': 'SETVD', # [lx, vl, vh] lx = ly (16 bit signed int, converted into double) + '62': 'SETVDI', # [lx, 0, 0] [..v..] lx = v (32 bit signed int, converted into double) '65': 'ADDD', # [lx, ly, lz] lx = ly + lz (double) '66': 'SUBD', # [lx, ly, lz] lx = ly - lz (double) '67': 'MULD', # [lx, ly, lz] lx = ly * lz (double) @@ -161,6 +162,7 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['SETD']] = get_access('lx', s='d') + ' = ' + get_coerced_access('ly', s='d') + ';' CASES[ROPCODES['SETVD']] = get_access('lx', s='d') + ' = +(inst >> 16);' +CASES[ROPCODES['SETVDI']] = 'pc = pc + 4 | 0; ' + get_access('lx', s='d') + ' = +(HEAP32[pc >> 2] | 0);' CASES[ROPCODES['ADDD']] = get_access('lx', s='d') + ' = (' + get_coerced_access('ly', s='d') + ') + (' + get_coerced_access('lz', s='d') + ');' CASES[ROPCODES['SUBD']] = get_access('lx', s='d') + ' = (' + get_coerced_access('ly', s='d') + ') - (' + get_coerced_access('lz', s='d') + ');' CASES[ROPCODES['MULD']] = get_access('lx', s='d') + ' = (' + get_coerced_access('ly', s='d') + ') * (' + get_coerced_access('lz', s='d') + ');' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 81fa5cafd6a66..e2f59a3d0e49f 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6129,7 +6129,12 @@ function emterpretify(ast) { } else { if (type === ASM_INT) { return [l, ['SETVIB', l, 0, 0, value & 255, (value >> 8) & 255, (value >> 16) & 255, (value >> 24) & 255]]; - } else throw 'fff '; + } else if (type === ASM_DOUBLE) { + if (value === (value | 0)) { + return [l, ['SETVDI', l, 0, 0, value & 255, (value >> 8) & 255, (value >> 16) & 255, (value >> 24) & 255]]; + } + throw 'fff ' + value; + } else throw 'aw'; } } From d1ad32270442320d8efd137d1ab74f563e5cc3e9 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 12:07:19 -0700 Subject: [PATCH 168/461] stop passing global funcs unnecessarily into js optimizer --- tools/emterpretify.py | 4 ++-- tools/js-optimizer.js | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 45533f80e8b36..a3e79ac7e7c0a 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -321,11 +321,11 @@ def fix_case(case): rglobal_funcs[global_id] = table global_id += 1 -assert global_id < 256 +assert global_id < 256, global_funcs # process functions, generating bytecode temp = infile + '.tmp.js' -shared.Building.js_optimizer(infile, ['emterpretify'], extra_info={ 'blacklist': list(BLACKLIST), 'globalFuncs': global_funcs, 'opcodes': OPCODES, 'ropcodes': ROPCODES }, output_filename=temp) +shared.Building.js_optimizer(infile, ['emterpretify'], extra_info={ 'blacklist': list(BLACKLIST), 'opcodes': OPCODES, 'ropcodes': ROPCODES }, output_filename=temp) # load the module and modify it asm = asm_module.AsmModule(temp) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index e2f59a3d0e49f..b2c2527eb0eb2 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5697,7 +5697,6 @@ function emterpretify(ast) { emitAst = false; var BLACKLIST = set(extraInfo.blacklist); - var GLOBAL_FUNCS = extraInfo.globalFuncs; var OPCODES = extraInfo.opcodes; var ROPCODES = extraInfo.ropcodes; From e0057f6272f118cba5f58991a1dfe2e117cd0b00 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 12:12:53 -0700 Subject: [PATCH 169/461] optimize global id generation --- tools/emterpretify.py | 34 ++++++++++------------------------ 1 file changed, 10 insertions(+), 24 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index a3e79ac7e7c0a..9f959e4fd6e3a 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -298,30 +298,6 @@ def fix_case(case): # final global functions asm = asm_module.AsmModule(infile) -global_funcs = {} -rglobal_funcs = {} -global_id = 0 -for k, v in asm.imports.iteritems(): - if '|' not in v and '+' not in v and 'new ' not in v and '.0' not in v and v != '0': - global_funcs[k] = global_id - rglobal_funcs[global_id] = k - global_id += 1 - -lines = asm.funcs_js.split('\n') -for i in range(len(lines)): - line = lines[i] - if line.startswith('function ') and '}' not in line: - func = line.split(' ')[1].split('(')[0] - global_funcs[func] = global_id - rglobal_funcs[global_id] = func - global_id += 1 - -for table in asm.tables: - global_funcs[table] = global_id - rglobal_funcs[global_id] = table - global_id += 1 - -assert global_id < 256, global_funcs # process functions, generating bytecode temp = infile + '.tmp.js' @@ -363,6 +339,10 @@ def fix_case(case): # first pass, collect and process bytecode +global_funcs = {} +rglobal_funcs = {} +global_id = 0 + call_sigs = {} # signatures appearing for each call target def process_code(func, code, absolute_targets): absolute_start = code_start + len(all_code) # true absolute starting point of this function @@ -376,6 +356,12 @@ def process_code(func, code, absolute_targets): if target not in call_sigs: call_sigs[target] = [] sigs = call_sigs[target] if sig not in sigs: sigs.append(sig) + if target not in global_funcs: + global global_id + assert global_id < 256, global_funcs + global_funcs[target] = global_id + rglobal_funcs[global_id] = target + global_id += 1 code[j+2] = global_funcs[target] code[j+3] = sigs.index(sig) if sig[0] == 'v': From fe19da8270c7940631bc1c83012f2db4e5f8d8f3 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 12:55:19 -0700 Subject: [PATCH 170/461] more unary + cases --- tools/js-optimizer.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index b2c2527eb0eb2..1751082b47cf3 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5886,19 +5886,30 @@ function emterpretify(ast) { if (inner[1] === '+') return getReg(inner, dropIt, ASM_DOUBLE, ASM_NONSIGNED); throw 'grr'; } + case 'binary': { + return getReg(inner, dropIt, ASM_DOUBLE, ASM_NONSIGNED); + } case 'call': case 'sub': { return getReg(inner, dropIt, ASM_DOUBLE, ASM_NONSIGNED); } case 'num': { return makeNum(inner[1], ASM_DOUBLE); } + case 'name': { + var name = inner[1]; + var type = getAsmType(name, asmData); + if (type === ASM_DOUBLE) { + return [name, []]; + } + throw 'no ' + type; + } default: { var type = detectAsmCoercion(inner, asmData); var sign = detectSign(inner); if (type === ASM_INT && (sign === ASM_SIGNED || sign === ASM_UNSIGNED)) { return makeUnary(['unary-prefix', 'I2D', node[2][2]], ASM_DOUBLE, ASM_NONSIGNED); } - throw 'meh ' + inner[0]; + throw 'meh ' + [inner[0], type, sign] + JSON.stringify(inner); } } } else if (node[1] === '~' && node[2][0] === 'unary-prefix' && node[2][1] === '~') { From 7357d4e2e57c0cfe43aaaebb8ee82a3fcbebdd22 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 13:04:19 -0700 Subject: [PATCH 171/461] SETVDF --- tools/emterpretify.py | 2 ++ tools/js-optimizer.js | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 9f959e4fd6e3a..cbaf9804d5aa6 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -49,6 +49,7 @@ '60': 'SETD', # [lx, ly, lz] lx = ly (double) '61': 'SETVD', # [lx, vl, vh] lx = ly (16 bit signed int, converted into double) '62': 'SETVDI', # [lx, 0, 0] [..v..] lx = v (32 bit signed int, converted into double) + '63': 'SETVDF', # [lx, 0, 0] [..v..] lx = v (32 float, converted into double) '65': 'ADDD', # [lx, ly, lz] lx = ly + lz (double) '66': 'SUBD', # [lx, ly, lz] lx = ly - lz (double) '67': 'MULD', # [lx, ly, lz] lx = ly * lz (double) @@ -163,6 +164,7 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['SETD']] = get_access('lx', s='d') + ' = ' + get_coerced_access('ly', s='d') + ';' CASES[ROPCODES['SETVD']] = get_access('lx', s='d') + ' = +(inst >> 16);' CASES[ROPCODES['SETVDI']] = 'pc = pc + 4 | 0; ' + get_access('lx', s='d') + ' = +(HEAP32[pc >> 2] | 0);' +CASES[ROPCODES['SETVDF']] = 'pc = pc + 4 | 0; ' + get_access('lx', s='d') + ' = +HEAPF32[pc >> 2];' CASES[ROPCODES['ADDD']] = get_access('lx', s='d') + ' = (' + get_coerced_access('ly', s='d') + ') + (' + get_coerced_access('lz', s='d') + ');' CASES[ROPCODES['SUBD']] = get_access('lx', s='d') + ' = (' + get_coerced_access('ly', s='d') + ') - (' + get_coerced_access('lz', s='d') + ');' CASES[ROPCODES['MULD']] = get_access('lx', s='d') + ' = (' + get_coerced_access('ly', s='d') + ') * (' + get_coerced_access('lz', s='d') + ');' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 1751082b47cf3..e662d5de1a12e 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -12,6 +12,10 @@ if (!Math.log2) Math.log2 = function log2(x) { return Math.log(x) / Math.LN2; }; +if (!Math.fround) { + var froundBuffer = new Float32Array(1); + Math.fround = function(x) { froundBuffer[0] = x; return froundBuffer[0] }; +} // *** Environment setup code *** var arguments_ = []; @@ -5702,6 +5706,14 @@ function emterpretify(ast) { var BRANCHES = set('BR', 'BRT', 'BRF'); + var tempBuffer = new ArrayBuffer(8); + var tempFloat32 = new Float32Array(tempBuffer); + var tempUint8 = new Uint8Array(tempBuffer); + function flattenFloat32(value) { + tempFloat32[0] = value; + return Array.prototype.slice.call(tempUint8, 0, 4); + } + function verifyCode(code) { if (code.length % 4 !== 0) assert(0, JSON.stringify(code)); var len = code.length; @@ -6142,6 +6154,8 @@ function emterpretify(ast) { } else if (type === ASM_DOUBLE) { if (value === (value | 0)) { return [l, ['SETVDI', l, 0, 0, value & 255, (value >> 8) & 255, (value >> 16) & 255, (value >> 24) & 255]]; + } else if (value === Math.fround(value)) { + return [l, ['SETVDF', l, 0, 0].concat(flattenFloat32(value))]; } throw 'fff ' + value; } else throw 'aw'; From 67c9eeae12116cd274ba3e30680c7df5c6311df1 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 13:06:30 -0700 Subject: [PATCH 172/461] NEGD --- tools/emterpretify.py | 3 ++- tools/js-optimizer.js | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index cbaf9804d5aa6..c074852431484 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -55,7 +55,7 @@ '67': 'MULD', # [lx, ly, lz] lx = ly * lz (double) '69': 'DIVD', # [lx, ly, lz] lx = ly / lz (double) '70': 'MODD', # [lx, ly, lz] lx = ly % lz (double) - #'72': 'NEGD', # [lx, ly, 0] lx = -ly (double) + '72': 'NEGD', # [lx, ly, 0] lx = -ly (double) '78': 'EQD', # [lx, ly, lz] lx = ly == lz (double) '79': 'NED', # [lx, ly, lz] lx = ly != lz (double) '80': 'LTD', # [lx, ly, lz] lx = ly < lz (signed) @@ -170,6 +170,7 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['MULD']] = get_access('lx', s='d') + ' = (' + get_coerced_access('ly', s='d') + ') * (' + get_coerced_access('lz', s='d') + ');' CASES[ROPCODES['DIVD']] = get_access('lx', s='d') + ' = (' + get_coerced_access('ly', s='d') + ') / (' + get_coerced_access('lz', s='d') + ');' CASES[ROPCODES['MODD']] = get_access('lx', s='d') + ' = (' + get_coerced_access('ly', s='d') + ') % (' + get_coerced_access('lz', s='d') + ');' +CASES[ROPCODES['NEGD']] = get_access('lx', s='d') + ' = -(' + get_coerced_access('ly', s='d') + ');' CASES[ROPCODES['EQD']] = get_access('lx') + ' = (' + get_coerced_access('ly', s='d') + ') == (' + get_coerced_access('lz', s='d') + ') | 0;' CASES[ROPCODES['NED']] = get_access('lx') + ' = (' + get_coerced_access('ly', s='d') + ') != (' + get_coerced_access('lz', s='d') + ') | 0;' CASES[ROPCODES['LTD']] = get_access('lx') + ' = (' + get_coerced_access('ly', s='d') + ') < (' + get_coerced_access('lz', s='d') + ') | 0;' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index e662d5de1a12e..9e1081482d349 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6255,7 +6255,12 @@ function emterpretify(ast) { function makeUnary(node, type, sign) { var opcode; switch(node[1]) { - case '-': assert(type === ASM_INT); opcode = 'NEG'; break; + case '-': { + if (type === ASM_INT) opcode = 'NEG'; + else if (type === ASM_DOUBLE) opcode = 'NEGD'; + else throw 'x'; + break; + } case '!': assert(type === ASM_INT); opcode = 'LNOT'; break; case '~': assert(type === ASM_INT); opcode = 'BNOT'; break; case 'I2D': case 'D2I': opcode = node[1]; break; From 6206512d080def79a4ee711aba1e9ef6b5017571 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 13:08:02 -0700 Subject: [PATCH 173/461] fix GED --- tools/js-optimizer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 9e1081482d349..4907550a5d1a1 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6221,7 +6221,7 @@ function emterpretify(ast) { opcode = 'GTD'; break; } - case '<=': { + case '>=': { assert(type === ASM_DOUBLE); opcode = 'GED'; break; @@ -6242,7 +6242,7 @@ function emterpretify(ast) { case '<<': opcode = 'SHL'; break; case '>>': opcode = 'ASHR'; break; case '>>>': opcode = 'LSHR'; break; - default: throw 'bad'; + default: throw 'bad ' + node[1]; } var y = getReg(node[2]); var z = getReg(node[3]); From 89b24f0b71931e29f5d541f8f5c6718f3572f5d8 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 13:10:26 -0700 Subject: [PATCH 174/461] enable binary ops in unary + --- tools/js-optimizer.js | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 4907550a5d1a1..de9bf83569a7b 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5770,7 +5770,7 @@ function emterpretify(ast) { // if dropIt is provided, then the output of this can just be dropped. // you *must* call releaseIfFree on the l that is returned; if it is a free local, that will free it. function getReg(node, dropIt, typeHint, signHint) { - //printErr('getReg ' + JSON.stringify(node) + ' : ' + astToSrc(node) + ' : ' + [dropIt, typeHint, signHint]); + printErr('getReg ' + JSON.stringify(node) + ' : ' + astToSrc(node) + ' : ' + [dropIt, typeHint, signHint]); switch(node[0]) { case 'name': { var name = node[1]; @@ -5894,14 +5894,7 @@ function emterpretify(ast) { // double operation var inner = node[2]; switch (inner[0]) { - case 'unary-prefix': { - if (inner[1] === '+') return getReg(inner, dropIt, ASM_DOUBLE, ASM_NONSIGNED); - throw 'grr'; - } - case 'binary': { - return getReg(inner, dropIt, ASM_DOUBLE, ASM_NONSIGNED); - } - case 'call': case 'sub': { + case 'unary-prefix': case 'binary': case 'call': case 'sub': { return getReg(inner, dropIt, ASM_DOUBLE, ASM_NONSIGNED); } case 'num': { From 4db1c5097db83da20efaa92d8d25d61ddd39044e Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 13:17:07 -0700 Subject: [PATCH 175/461] detect sign of seq, and assume sign is ok on +(exp) --- tools/js-optimizer.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index de9bf83569a7b..1ad2272ecec63 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1955,7 +1955,9 @@ function detectSign(node) { break; } case 'num': case 'name': return ASM_FLEXIBLE; - case 'conditional': return detectSign(node[2]); + case 'conditional': case 'seq': { + return detectSign(node[2]); + } } assert(0 , 'badd ' + JSON.stringify(node)); } @@ -5910,11 +5912,10 @@ function emterpretify(ast) { } default: { var type = detectAsmCoercion(inner, asmData); - var sign = detectSign(inner); - if (type === ASM_INT && (sign === ASM_SIGNED || sign === ASM_UNSIGNED)) { + if (type === ASM_INT) { return makeUnary(['unary-prefix', 'I2D', node[2][2]], ASM_DOUBLE, ASM_NONSIGNED); } - throw 'meh ' + [inner[0], type, sign] + JSON.stringify(inner); + throw 'meh ' + [inner[0], type] + JSON.stringify(inner); } } } else if (node[1] === '~' && node[2][0] === 'unary-prefix' && node[2][1] === '~') { From b37877484eaa44c89a59e8fc39de8039bae8f6dc Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 13:17:37 -0700 Subject: [PATCH 176/461] detect unary - type --- tools/js-optimizer.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 1ad2272ecec63..38334e42f405f 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1850,6 +1850,7 @@ function detectAsmCoercion(node, asmInfo, inVarDef) { } case 'unary-prefix': { if (node[1] === '+') return ASM_DOUBLE; + if (node[1] === '-') return detectAsmCoercion(node[2], asmInfo, inVarDef); break; } case 'call': { From 29c43378b2a67e23e5aa006b816dedc0c2cc9de7 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 13:36:23 -0700 Subject: [PATCH 177/461] start to make detectAsmCoercion precise --- tools/js-optimizer.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 38334e42f405f..778322c13d3b4 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1846,7 +1846,7 @@ function detectAsmCoercion(node, asmInfo, inVarDef) { switch (node[0]) { case 'num': { if (node[1].toString().indexOf('.') >= 0) return ASM_DOUBLE; - break; + return ASM_INT; } case 'unary-prefix': { if (node[1] === '+') return ASM_DOUBLE; @@ -1864,16 +1864,19 @@ function detectAsmCoercion(node, asmInfo, inVarDef) { if (!ASM_FLOAT_ZERO) ASM_FLOAT_ZERO = node[1]; else assert(ASM_FLOAT_ZERO === node[1]); return ASM_FLOAT; - break; } case 'binary': { switch (node[1]) { case '+': case '-': case '*': case '/': return ASM_DOUBLE; // uncoerced by |0 etc., these ops are double + case '|': case '&': case '^': case '<<': case '>>': case '>>>': return ASM_INT; } break; } + case 'conditional': case 'seq': { + return detectAsmCoercion(node[2], asmInfo, inVarDef); + } } - return ASM_INT; + assert(0 , 'horrible ' + JSON.stringify(node)); } function makeAsmCoercion(node, type) { @@ -1923,8 +1926,7 @@ function getCombinedType(node1, node2, asmData, hint) { } if (type1 !== type2) { if (type1 === hint || type2 === hint) return hint; - if (type1 === ASM_INT || type2 === ASM_INT) return ASM_INT; // INT overrides everything, least tolerant - assert(0, "can't figure it out " + JSON.stringify([node1, '....', node2, ' ', type1, type2, hint])); + assert(0, "can't figure it out " + JSON.stringify([node1, '....', node2, ' ', type1, type2, hint], null, ' ')); } return type1; } From 348820373cf18157ada29cff6900d3ac8a655c60 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 13:38:21 -0700 Subject: [PATCH 178/461] detectAsmCoercion => detectType --- tools/js-optimizer.js | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 778322c13d3b4..35012fc01a9ec 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -663,7 +663,7 @@ function simplifyExpressions(ast) { node[2][0] !== 'seq') { // avoid (x, y, z) which can be used for tempDoublePtr on doubles for alignment fixes if (node[1][2][1][1] === 'HEAP32') { node[1][3][1][1] = 'HEAPF32'; - return makeAsmCoercion(node[1][3], detectAsmCoercion(node[2])); + return makeAsmCoercion(node[1][3], detectType(node[2])); } else { node[1][3][1][1] = 'HEAP32'; return ['binary', '|', node[1][3], ['num', 0]]; @@ -1841,7 +1841,7 @@ var ASM_SIG = { var ASM_FLOAT_ZERO = null; // TODO: share the entire node? -function detectAsmCoercion(node, asmInfo, inVarDef) { +function detectType(node, asmInfo, inVarDef) { // for params, +x vs x|0, for vars, 0.0 vs 0 switch (node[0]) { case 'num': { @@ -1850,7 +1850,7 @@ function detectAsmCoercion(node, asmInfo, inVarDef) { } case 'unary-prefix': { if (node[1] === '+') return ASM_DOUBLE; - if (node[1] === '-') return detectAsmCoercion(node[2], asmInfo, inVarDef); + if (node[1] === '-') return detectType(node[2], asmInfo, inVarDef); break; } case 'call': { @@ -1873,7 +1873,7 @@ function detectAsmCoercion(node, asmInfo, inVarDef) { break; } case 'conditional': case 'seq': { - return detectAsmCoercion(node[2], asmInfo, inVarDef); + return detectType(node[2], asmInfo, inVarDef); } } assert(0 , 'horrible ' + JSON.stringify(node)); @@ -1911,8 +1911,8 @@ function getAsmType(name, asmInfo) { } function getCombinedType(node1, node2, asmData, hint) { - var type1 = detectAsmCoercion(node1, asmData); - var type2 = detectAsmCoercion(node2, asmData); + var type1 = detectType(node1, asmData); + var type2 = detectType(node2, asmData); if (type1 === ASM_NONE && type2 === ASM_NONE) { assert(hint !== undefined); return hint; @@ -2001,7 +2001,7 @@ function normalizeAsm(func) { var name = node[2][1]; if (func[2] && func[2].indexOf(name) < 0) break; // not an assign into a parameter, but a global if (name in data.params) break; // already done that param, must be starting function body - data.params[name] = detectAsmCoercion(node[3]); + data.params[name] = detectType(node[3]); stats[i] = emptyNode(); i++; } @@ -2015,7 +2015,7 @@ function normalizeAsm(func) { var name = v[0]; var value = v[1]; if (!(name in data.vars)) { - data.vars[name] = detectAsmCoercion(value, null, true); + data.vars[name] = detectType(value, null, true); v.length = 1; // make an un-assigning var } else { assert(j === 0, 'cannot break in the middle'); @@ -2040,7 +2040,7 @@ function normalizeAsm(func) { // look for final 'return' statement to get return type. var retStmt = stats[stats.length - 1]; if (retStmt && retStmt[0] === 'return' && retStmt[1]) { - data.ret = detectAsmCoercion(retStmt[1]); + data.ret = detectType(retStmt[1]); } //printErr('normalized \n\n' + astToSrc(func) + '\n\nwith: ' + JSON.stringify(data)); return data; @@ -4959,7 +4959,7 @@ function outline(ast) { if (!node[1]) { hasReturn = true; } else { - hasReturnType[detectAsmCoercion(node[1])] = true; + hasReturnType[detectType(node[1])] = true; } } else if (type == 'break') { var label = node[1] || 0; @@ -5103,7 +5103,7 @@ function outline(ast) { if (!node[1]) { ret.push(['stat', makeAssign(makeStackAccess(ASM_INT, asmData.controlStackPos(outlineIndex)), ['num', CONTROL_RETURN_VOID])]); } else { - var type = detectAsmCoercion(node[1], asmData); + var type = detectType(node[1], asmData); ret.push(['stat', makeAssign(makeStackAccess(ASM_INT, asmData.controlStackPos(outlineIndex)), ['num', controlFromAsmType(type)])]); ret.push(['stat', makeAssign(makeStackAccess(type, asmData.controlDataStackPos(outlineIndex)), node[1])]); } @@ -5914,7 +5914,7 @@ function emterpretify(ast) { throw 'no ' + type; } default: { - var type = detectAsmCoercion(inner, asmData); + var type = detectType(inner, asmData); if (type === ASM_INT) { return makeUnary(['unary-prefix', 'I2D', node[2][2]], ASM_DOUBLE, ASM_NONSIGNED); } @@ -5930,7 +5930,7 @@ function emterpretify(ast) { switch (node[1]) { case '-': case '~': { - var type = detectAsmCoercion(node[2], asmData); + var type = detectType(node[2], asmData); var sign = detectSign(node[2]); return makeUnary(node, type, sign); } @@ -6373,7 +6373,7 @@ function emterpretify(ast) { var reg = getReg(param); ret = ret.concat(reg[1]); actuals.push(reg[0]); - sig += ASM_SIG[detectAsmCoercion(param, asmData)]; + sig += ASM_SIG[detectType(param, asmData)]; }); ret.push('CALL'); ret.push(lx); @@ -6488,7 +6488,7 @@ function emterpretify(ast) { func[3] = func[3].filter(function(node) { if (node[0] === 'return') { assert(asmData.ret !== undefined); - var type = detectAsmCoercion(node[1]); + var type = detectType(node[1]); node[1] = makeAsmCoercion(theCall, type); switch (type) { case ASM_INT: theName[1] += '_i'; break; From 37a60cbb42569a26b0e22802f765d24e81259f0a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 13:46:34 -0700 Subject: [PATCH 179/461] detect sub type --- tools/js-optimizer.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 35012fc01a9ec..a1c724eee05f6 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1875,6 +1875,11 @@ function detectType(node, asmInfo, inVarDef) { case 'conditional': case 'seq': { return detectType(node[2], asmInfo, inVarDef); } + case 'sub': { + assert(node[1][0] === 'name'); + assert(parseHeap(node[1][1])); + return parseHeapTemp.float ? ASM_DOUBLE : ASM_INT; // XXX ASM_FLOAT? + } } assert(0 , 'horrible ' + JSON.stringify(node)); } @@ -5902,6 +5907,11 @@ function emterpretify(ast) { case 'unary-prefix': case 'binary': case 'call': case 'sub': { return getReg(inner, dropIt, ASM_DOUBLE, ASM_NONSIGNED); } + case 'conditional': { + var type = detectType(inner, asmData); + assert(type === ASM_DOUBLE, JSON.stringify([type, ASM_DOUBLE, inner])); + return getReg(inner, dropIt, ASM_DOUBLE, ASM_NONSIGNED); + } case 'num': { return makeNum(inner[1], ASM_DOUBLE); } From 694f74f465379f760c84fcd615b5914c5f3e3f8d Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 13:50:32 -0700 Subject: [PATCH 180/461] improve binary type detection on +,- --- tools/js-optimizer.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index a1c724eee05f6..8eb4cb62faaf0 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1867,7 +1867,8 @@ function detectType(node, asmInfo, inVarDef) { } case 'binary': { switch (node[1]) { - case '+': case '-': case '*': case '/': return ASM_DOUBLE; // uncoerced by |0 etc., these ops are double + case '+': case '-': return detectType(node[2], asmInfo, inVarDef); + case '*': case '/': return ASM_DOUBLE; // uncoerced by |0 etc., these ops are double case '|': case '&': case '^': case '<<': case '>>': case '>>>': return ASM_INT; } break; From db77ff813975991f43bec6e56bdb7f307728ff9b Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 13:51:49 -0700 Subject: [PATCH 181/461] detect sign of comparisons --- tools/js-optimizer.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 8eb4cb62faaf0..9e319c2c39b5c 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1869,7 +1869,10 @@ function detectType(node, asmInfo, inVarDef) { switch (node[1]) { case '+': case '-': return detectType(node[2], asmInfo, inVarDef); case '*': case '/': return ASM_DOUBLE; // uncoerced by |0 etc., these ops are double - case '|': case '&': case '^': case '<<': case '>>': case '>>>': return ASM_INT; + case '|': case '&': case '^': case '<<': case '>>': case '>>>': + case '==': case '!=': case '<': case '<=': case '>': case '>=': { + return ASM_INT; + } } break; } From 45aba1a7d7f29c836bfdba7d7e85a4d89b07fd8c Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 14:00:01 -0700 Subject: [PATCH 182/461] note inf as double --- tools/js-optimizer.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 9e319c2c39b5c..53ff05eb14919 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1859,7 +1859,12 @@ function detectType(node, asmInfo, inVarDef) { } case 'name': { if (asmInfo) return getAsmType(node[1], asmInfo); - if (!inVarDef) return ASM_NONE; + if (!inVarDef) { + switch (node[1]) { + case 'inf': return ASM_DOUBLE; // TODO: when minified + } + return ASM_NONE; + } // We are in a variable definition, where Math_fround(0) optimized into a global constant becomes f0 = Math_fround(0) if (!ASM_FLOAT_ZERO) ASM_FLOAT_ZERO = node[1]; else assert(ASM_FLOAT_ZERO === node[1]); @@ -6269,7 +6274,7 @@ function emterpretify(ast) { case '-': { if (type === ASM_INT) opcode = 'NEG'; else if (type === ASM_DOUBLE) opcode = 'NEGD'; - else throw 'x'; + else throw 'x ' + type; break; } case '!': assert(type === ASM_INT); opcode = 'LNOT'; break; From 17187f34b86915dc3690313bc88f3d15400a98d5 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 15:02:32 -0700 Subject: [PATCH 183/461] name handling improvements --- tools/js-optimizer.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 53ff05eb14919..7271483e79e9f 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1858,7 +1858,10 @@ function detectType(node, asmInfo, inVarDef) { break; } case 'name': { - if (asmInfo) return getAsmType(node[1], asmInfo); + if (asmInfo) { + var ret = getAsmType(node[1], asmInfo); + if (ret !== ASM_NONE) return ret; + } if (!inVarDef) { switch (node[1]) { case 'inf': return ASM_DOUBLE; // TODO: when minified @@ -5804,6 +5807,9 @@ function emterpretify(ast) { var x = getFree(); return [x, ['GETTDP', x, 0, 0]]; } + case 'inf': { + return makeNum(Infinity, ASM_DOUBLE); + } default: throw 'getReg global wha? ' + name; } } From 750de1fa12e167f8a8ee8c61dc96fa3ebd3736ca Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 15:16:32 -0700 Subject: [PATCH 184/461] final fixes and hacks to get box2d to compile --- tools/js-optimizer.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 7271483e79e9f..5006db3fde4f4 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5792,7 +5792,7 @@ function emterpretify(ast) { // if dropIt is provided, then the output of this can just be dropped. // you *must* call releaseIfFree on the l that is returned; if it is a free local, that will free it. function getReg(node, dropIt, typeHint, signHint) { - printErr('getReg ' + JSON.stringify(node) + ' : ' + astToSrc(node) + ' : ' + [dropIt, typeHint, signHint]); + //printErr('getReg ' + JSON.stringify(node) + ' : ' + astToSrc(node) + ' : ' + [dropIt, typeHint, signHint]); switch(node[0]) { case 'name': { var name = node[1]; @@ -5807,9 +5807,8 @@ function emterpretify(ast) { var x = getFree(); return [x, ['GETTDP', x, 0, 0]]; } - case 'inf': { - return makeNum(Infinity, ASM_DOUBLE); - } + case 'inf': return makeNum(Infinity, ASM_DOUBLE); + case '_stderr': printErr('WARNING: stderr!'); return makeNum(0, ASM_DOUBLE); // XXX XXX XXX default: throw 'getReg global wha? ' + name; } } @@ -5934,7 +5933,7 @@ function emterpretify(ast) { var name = inner[1]; var type = getAsmType(name, asmData); if (type === ASM_DOUBLE) { - return [name, []]; + return [locals[name], []]; } throw 'no ' + type; } From deb8644700e55f862ffe012059662df9a01a7f7a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 16:54:01 -0700 Subject: [PATCH 185/461] add type to heap parsing, and use it to add a coercion on stores when needed --- tools/js-optimizer.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 5006db3fde4f4..2d1803d47b36f 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -373,7 +373,7 @@ function removeUnneededLabelSettings(ast) { // Various expression simplifications. Happens after elimination, which opens up many of these simplification opportunities. function makeTempParseHeap() { - return { unsigned: false, float: false, bits: 0 }; + return { unsigned: false, float: false, bits: 0, type: 0 }; } var parseHeapTemp = makeTempParseHeap(); @@ -384,6 +384,7 @@ function parseHeap(name, out) { // XXX this uses parseHeapTemp by default, which out.unsigned = name[4] === 'U'; out.float = name[4] === 'F'; out.bits = parseInt(name.substr(out.unsigned || out.float ? 5 : 4)); + out.type = !out.float ? ASM_INT : (out.bits === 64 ? ASM_DOUBLE : ASM_FLOAT); return true; } @@ -5860,6 +5861,18 @@ function emterpretify(ast) { assert(parseHeap(heap, temp)); // coerced heap access => a load var y = getReg(value); + // add a coercion on the value, if needed + var yType = detectType(value, asmData); + if (yType !== temp.type) { + if (yType === ASM_DOUBLE && temp.float) { + // nothing to do - we don't have float32 values + } else if (yType === ASM_INT && temp.float) { + y[1].push('I2D', y[0], y[0], 0); + } else { + throw ['yType', yType, temp.type, temp.float, JSON.stringify(value)]; + } + } + // emit the proper store var opcode = 'STORE' + (temp.float ? 'F' : '') + temp.bits; if (target[2][0] === 'binary' && target[2][1] === '>>' && target[2][3][0] === 'num') { var shifts = target[2][3][1]; From d57e038b277905d0ff2b34fe618e474f132fb3f8 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 17:21:20 -0700 Subject: [PATCH 186/461] debug changes --- tools/emterpretify.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index c074852431484..e758ea0267453 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -265,19 +265,18 @@ def fix_case(case): EMTSTACKTOP = EMTSTACKTOP + (HEAP8[pc + 1 >> 0] << 3) | 0; assert(((EMTSTACKTOP|0) <= (EMT_STACK_MAX|0))|0); while (1) { - //printErr('last lx: ' + [HEAP32[sp + (lx << 3) >> 2]|0, +HEAPF64[sp + (lx << 3) >> 3]]); + //print('last lx: ' + [HEAP32[sp + (lx << 3) >> 2]|0, +HEAPF64[sp + (lx << 3) >> 3]]); pc = pc + 4 | 0; inst = HEAP32[pc>>2]|0; lx = (inst >> 8) & 255; ly = (inst >> 16) & 255; lz = inst >>> 24; - //printErr([pc, inst&255, %s[inst&255], lx, ly, lz].join(', ')); + //print([pc, inst&255, %s[inst&255], lx, ly, lz].join(', ')); //printErr(' ' + Array.prototype.slice.call(HEAPU8, sp, sp+8)); switch (inst&255) { %s default: assert(0); } - //printErr('result in ' + lx + ': ' + Array.prototype.slice.call(HEAPU8, sp+8*lx, sp+8*(lx+1))); } EMTSTACKTOP = sp; %s From 3128442e9dcc1581dbfbac5348b0cbd53bc1c4a9 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 17:25:02 -0700 Subject: [PATCH 187/461] ensure global names are unminified for emterpreter, for now --- emcc | 1 + 1 file changed, 1 insertion(+) diff --git a/emcc b/emcc index b9c55abe747ef..5dbff531f4e8a 100755 --- a/emcc +++ b/emcc @@ -1009,6 +1009,7 @@ try: if shared.Settings.EMTERPRETIFY: shared.Settings.FINALIZE_ASM_JS = 0 + debug_level = max(debug_level, 2) shared.Settings.RUNNING_FASTCOMP = fastcomp From d8abac70f06826ac9923536d04de2d33e265d394 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 17:29:25 -0700 Subject: [PATCH 188/461] emterpreter test improvements --- tests/test_other.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/tests/test_other.py b/tests/test_other.py index b2f5dbbd9c03c..1bc29b3df3f82 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4107,9 +4107,14 @@ def test_stat_fail_alongtheway(self): def test_emterpreter(self): def do_emcc_test(source, args, output): print - print 'emcc', source + print 'emcc', source[:40], '\n' in source self.clear() - Popen([PYTHON, EMCC, path_from_root('tests', source), '-O2', '--profiling', '-s', 'EMTERPRETIFY=1']).communicate() + if '\n' in source: + open('src.cpp', 'w').write(source) + source = 'src.cpp' + else: + source = path_from_root('tests', source) + Popen([PYTHON, EMCC, source, '-O2', '-s', 'EMTERPRETIFY=1']).communicate() self.assertContained(output, run_js('a.out.js', args=args)) out = run_js('a.out.js', engine=SPIDERMONKEY_ENGINE, args=args, stderr=PIPE, full_output=True) self.assertContained(output, out) @@ -4118,9 +4123,15 @@ def do_emcc_test(source, args, output): def do_test(source, args, output): print - print source + print 'emcc', source[:40], '\n' in source + self.clear() + if '\n' in source: + open('src.cpp', 'w').write(source) + source = 'src.cpp' + else: + source = path_from_root('tests', source) self.clear() - Popen([PYTHON, EMCC, path_from_root('tests', source), '-O2', '--profiling', '-s', 'FINALIZE_ASM_JS=0']).communicate() + Popen([PYTHON, EMCC, source, '-O2', '--profiling', '-s', 'FINALIZE_ASM_JS=0']).communicate() Popen([PYTHON, path_from_root('tools', 'emterpretify.py'), 'a.out.js', 'em.out.js']).communicate() self.assertContained(output, run_js('a.out.js', args=args)) self.assertContained(output, run_js('em.out.js', args=args)) From 8615b671dd2d8f204f1dd01ae2ee6b2fe160e3ca Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 17:44:14 -0700 Subject: [PATCH 189/461] coerce int to float when needed --- tests/test_other.py | 15 ++++++++-- tools/js-optimizer.js | 64 ++++++++++++++++++++++++++----------------- 2 files changed, 52 insertions(+), 27 deletions(-) diff --git a/tests/test_other.py b/tests/test_other.py index 1bc29b3df3f82..56492f42be618 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4123,14 +4123,13 @@ def do_emcc_test(source, args, output): def do_test(source, args, output): print - print 'emcc', source[:40], '\n' in source + print 'emcc', source.replace('\n', '.')[:40], '\n' in source self.clear() if '\n' in source: open('src.cpp', 'w').write(source) source = 'src.cpp' else: source = path_from_root('tests', source) - self.clear() Popen([PYTHON, EMCC, source, '-O2', '--profiling', '-s', 'FINALIZE_ASM_JS=0']).communicate() Popen([PYTHON, path_from_root('tools', 'emterpretify.py'), 'a.out.js', 'em.out.js']).communicate() self.assertContained(output, run_js('a.out.js', args=args)) @@ -4145,3 +4144,15 @@ def do_test(source, args, output): do_test('hello_world_loop.cpp', [], 'hello, world!') do_test('fannkuch.cpp', ['5'], 'Pfannkuchen(5) = 7.') + do_test(r''' +#include + +int main() { + volatile float f; + volatile float *ff = &f; + *ff = -10; + printf("hello, world! %d\n", (int)f); + return 0; +} +''', [], 'hello, world! -10') + diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 2d1803d47b36f..345c88b07b627 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5861,6 +5861,7 @@ function emterpretify(ast) { assert(parseHeap(heap, temp)); // coerced heap access => a load var y = getReg(value); + /* // add a coercion on the value, if needed var yType = detectType(value, asmData); if (yType !== temp.type) { @@ -5872,6 +5873,7 @@ function emterpretify(ast) { throw ['yType', yType, temp.type, temp.float, JSON.stringify(value)]; } } + */ // emit the proper store var opcode = 'STORE' + (temp.float ? 'F' : '') + temp.bits; if (target[2][0] === 'binary' && target[2][1] === '>>' && target[2][3][0] === 'num') { @@ -5929,35 +5931,47 @@ function emterpretify(ast) { case 'unary-prefix': { if (node[1] === '+') { // double operation - var inner = node[2]; - switch (inner[0]) { - case 'unary-prefix': case 'binary': case 'call': case 'sub': { - return getReg(inner, dropIt, ASM_DOUBLE, ASM_NONSIGNED); - } - case 'conditional': { - var type = detectType(inner, asmData); - assert(type === ASM_DOUBLE, JSON.stringify([type, ASM_DOUBLE, inner])); - return getReg(inner, dropIt, ASM_DOUBLE, ASM_NONSIGNED); - } - case 'num': { - return makeNum(inner[1], ASM_DOUBLE); - } - case 'name': { - var name = inner[1]; - var type = getAsmType(name, asmData); - if (type === ASM_DOUBLE) { - return [locals[name], []]; + var ret = (function() { + var inner = node[2]; + switch (inner[0]) { + case 'unary-prefix': case 'binary': case 'call': case 'sub': { + return getReg(inner, dropIt, ASM_DOUBLE, ASM_NONSIGNED); } - throw 'no ' + type; - } - default: { - var type = detectType(inner, asmData); - if (type === ASM_INT) { - return makeUnary(['unary-prefix', 'I2D', node[2][2]], ASM_DOUBLE, ASM_NONSIGNED); + case 'conditional': { + var type = detectType(inner, asmData); + assert(type === ASM_DOUBLE, JSON.stringify([type, ASM_DOUBLE, inner])); + return getReg(inner, dropIt, ASM_DOUBLE, ASM_NONSIGNED); + } + case 'num': { + return makeNum(inner[1], ASM_DOUBLE); + } + case 'name': { + var name = inner[1]; + var type = getAsmType(name, asmData); + if (type === ASM_DOUBLE) { + return [locals[name], []]; + } + throw 'no ' + type; } - throw 'meh ' + [inner[0], type] + JSON.stringify(inner); + default: { + var type = detectType(inner, asmData); + if (type === ASM_INT) { + return makeUnary(['unary-prefix', 'I2D', node[2][2]], ASM_DOUBLE, ASM_NONSIGNED); + } + throw 'meh ' + [inner[0], type] + JSON.stringify(inner); + } + } + })(); + // add a coercion on the value, if needed + var innerType = detectType(node[2], asmData); + if (innerType !== ASM_DOUBLE) { + if (innerType === ASM_INT) { + ret[1].push('I2D', ret[0], ret[0], 0); + } else { + throw 'whoops'; } } + return ret; } else if (node[1] === '~' && node[2][0] === 'unary-prefix' && node[2][1] === '~') { return makeUnary(['unary-prefix', 'D2I', node[2][2]], ASM_INT, ASM_SIGNED); } From 8aff4b3772bdc027b78e64566133b248e1d093e8 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 18:26:41 -0700 Subject: [PATCH 190/461] fix register handling bug in store --- tests/test_other.py | 12 ++++++++++++ tools/emterpretify.py | 2 +- tools/js-optimizer.js | 19 +++---------------- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/tests/test_other.py b/tests/test_other.py index 56492f42be618..fb6a74c8cf214 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4156,3 +4156,15 @@ def do_test(source, args, output): } ''', [], 'hello, world! -10') + do_test(r''' +#include + +int main() { + volatile float f; + volatile float *ff = &f; + *ff = -10; + printf("hello, world! %.2f\n", f); + return 0; +} +''', [], 'hello, world! -10.00') + diff --git a/tools/emterpretify.py b/tools/emterpretify.py index e758ea0267453..73245a4598e50 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -271,7 +271,7 @@ def fix_case(case): lx = (inst >> 8) & 255; ly = (inst >> 16) & 255; lz = inst >>> 24; - //print([pc, inst&255, %s[inst&255], lx, ly, lz].join(', ')); + //print([pc, inst&255, %s[inst&255], lx, ly, lz, HEAPU8[pc + 4],HEAPU8[pc + 5],HEAPU8[pc + 6],HEAPU8[pc + 7]].join(', ')); //printErr(' ' + Array.prototype.slice.call(HEAPU8, sp, sp+8)); switch (inst&255) { %s diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 345c88b07b627..0968d802e9797 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5860,28 +5860,14 @@ function emterpretify(ast) { var temp = makeTempParseHeap(); assert(parseHeap(heap, temp)); // coerced heap access => a load - var y = getReg(value); - /* - // add a coercion on the value, if needed - var yType = detectType(value, asmData); - if (yType !== temp.type) { - if (yType === ASM_DOUBLE && temp.float) { - // nothing to do - we don't have float32 values - } else if (yType === ASM_INT && temp.float) { - y[1].push('I2D', y[0], y[0], 0); - } else { - throw ['yType', yType, temp.type, temp.float, JSON.stringify(value)]; - } - } - */ - // emit the proper store var opcode = 'STORE' + (temp.float ? 'F' : '') + temp.bits; if (target[2][0] === 'binary' && target[2][1] === '>>' && target[2][3][0] === 'num') { var shifts = target[2][3][1]; assert(shifts >= 0 && shifts <= 3); var bits = Math.pow(2, shifts)*8; - assert(bits === temp.bits); // JSON.stringify([heap, ' ', temp, ' ', target])); + assert(bits === temp.bits); var x = getReg(target[2][2], false, ASM_INT, ASM_SIGNED); + var y = getReg(value); // generate y now, not earlier, to not trample x's output reg, which might be a temp var ret = x[1].concat(y[1]); ret.push(opcode, releaseIfFree(x[0]), releaseIfFree(y[0]), 0); return [-1, ret]; @@ -5891,6 +5877,7 @@ function emterpretify(ast) { var shifts = Math.log2(temp.bits/8); assert(address === ((address << shifts) >> shifts)); var x = makeNum(address << shifts, ASM_INT); + var y = getReg(value); y[1].push(opcode, releaseIfFree(x[0]), releaseIfFree(y[0]), 0); return [-1, x[1].concat(y[1])]; } From 216fbb5e86ed892b0d60c2cdbc60a013f9dd0480 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 21:34:33 -0700 Subject: [PATCH 191/461] GETTR0 --- tools/emterpretify.py | 2 ++ tools/js-optimizer.js | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 73245a4598e50..dfdf167d94757 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -83,6 +83,7 @@ #'170': 'ABR', # [lx, 0, 0, 0] absolute branch to address lx (assumed divisible by 4) '200': 'GETTDP', # [l, 0, 0] l = tempDoublePtr #'201': 'GETPC', # [l, 0, 0] l = pc + '202': 'GETTR0', # [l, 0, 0] l = tempRet0 '250': 'CALL', # [lx, target, sig] [params...] (lx = ) target(params..) lx's existence and type depend on the target's actual callsig; # this instruction can take multiple 32-bit instruction chunks # if target is a function table, then the first param is the index of the register holding the function pointer @@ -198,6 +199,7 @@ def get_coerced_access(l, s='i', unsigned=False): #CASES[ROPCODES['ABR']] = 'pc = ' + get_coerced_access('lx') + '; continue;' CASES[ROPCODES['GETTDP']] = 'HEAP32[sp + (lx << 3) >> 2] = tempDoublePtr;' #CASES[ROPCODES['GETPC']] = 'HEAP32[sp + (lx << 3) >> 2] = pc;' +CASES[ROPCODES['GETTR0']] = 'HEAP32[sp + (lx << 3) >> 2] = tempRet0;' CASES[ROPCODES['SWITCH']] = ''' lz = ''' + get_coerced_access('lz') + '''; lx = ((''' + get_coerced_access('lx') + ''') - (''' + get_coerced_access('ly') + ''')) >>> 0; // lx is now relative to the base diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 0968d802e9797..426293f2e9783 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5808,6 +5808,10 @@ function emterpretify(ast) { var x = getFree(); return [x, ['GETTDP', x, 0, 0]]; } + case 'tempRet0': { + var x = getFree(); + return [x, ['GETTR0', x, 0, 0]]; + } case 'inf': return makeNum(Infinity, ASM_DOUBLE); case '_stderr': printErr('WARNING: stderr!'); return makeNum(0, ASM_DOUBLE); // XXX XXX XXX default: throw 'getReg global wha? ' + name; From a20d95e8325743d71dc028cc892c91e14d6935dd Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 21:38:44 -0700 Subject: [PATCH 192/461] tolerate flexible signs in comparisons --- tools/js-optimizer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 426293f2e9783..0f58ce0ac688c 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6239,7 +6239,7 @@ function emterpretify(ast) { } case '<': { if (type === ASM_INT) { - assert(sign !== ASM_FLEXIBLE); + if (sign === ASM_FLEXIBLE) sign = ASM_SIGNED; // e.g. two numbers if (sign === ASM_SIGNED) opcode = 'SLT'; else opcode = 'ULT'; } @@ -6248,7 +6248,7 @@ function emterpretify(ast) { } case '<=': { if (type === ASM_INT) { - assert(sign !== ASM_FLEXIBLE); + if (sign === ASM_FLEXIBLE) sign = ASM_SIGNED; // e.g. two numbers if (sign === ASM_SIGNED) opcode = 'SLE'; else opcode = 'ULE'; } From b69a91aff883db4ef738ed85ad455e6ca0fa90f4 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 21:40:49 -0700 Subject: [PATCH 193/461] do not try to find the type of a coerced call, it never needs an extra coercion --- tools/js-optimizer.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 0f58ce0ac688c..ad146e320b7ce 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5954,12 +5954,14 @@ function emterpretify(ast) { } })(); // add a coercion on the value, if needed - var innerType = detectType(node[2], asmData); - if (innerType !== ASM_DOUBLE) { - if (innerType === ASM_INT) { - ret[1].push('I2D', ret[0], ret[0], 0); - } else { - throw 'whoops'; + if (node[2][0] !== 'call') { + var innerType = detectType(node[2], asmData); + if (innerType !== ASM_DOUBLE) { + if (innerType === ASM_INT) { + ret[1].push('I2D', ret[0], ret[0], 0); + } else { + throw 'whoops'; + } } } return ret; From 5e8f1a049d9199365a7f2a482f2cf696d28c48da Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 21:49:06 -0700 Subject: [PATCH 194/461] SETVDD --- tools/emterpretify.py | 4 +++- tools/js-optimizer.js | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index dfdf167d94757..ed54f49dfddd4 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -49,7 +49,8 @@ '60': 'SETD', # [lx, ly, lz] lx = ly (double) '61': 'SETVD', # [lx, vl, vh] lx = ly (16 bit signed int, converted into double) '62': 'SETVDI', # [lx, 0, 0] [..v..] lx = v (32 bit signed int, converted into double) - '63': 'SETVDF', # [lx, 0, 0] [..v..] lx = v (32 float, converted into double) + '63': 'SETVDF', # [lx, 0, 0] [..v..] lx = v (32 bit float, converted into double) + '64': 'SETVDD', # [lx, 0, 0][.v.][.v.] lx = v (64 bit double) '65': 'ADDD', # [lx, ly, lz] lx = ly + lz (double) '66': 'SUBD', # [lx, ly, lz] lx = ly - lz (double) '67': 'MULD', # [lx, ly, lz] lx = ly * lz (double) @@ -166,6 +167,7 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['SETVD']] = get_access('lx', s='d') + ' = +(inst >> 16);' CASES[ROPCODES['SETVDI']] = 'pc = pc + 4 | 0; ' + get_access('lx', s='d') + ' = +(HEAP32[pc >> 2] | 0);' CASES[ROPCODES['SETVDF']] = 'pc = pc + 4 | 0; ' + get_access('lx', s='d') + ' = +HEAPF32[pc >> 2];' +CASES[ROPCODES['SETVDD']] = 'HEAP32[tempDoublePtr >> 2] = HEAP32[pc + 4 >> 2]; HEAP32[tempDoublePtr + 4 >> 2] = HEAP32[pc + 8 >> 2]; pc = pc + 8 | 0; ' + get_access('lx', s='d') + ' = +HEAPF64[tempDoublePtr >> 2];' CASES[ROPCODES['ADDD']] = get_access('lx', s='d') + ' = (' + get_coerced_access('ly', s='d') + ') + (' + get_coerced_access('lz', s='d') + ');' CASES[ROPCODES['SUBD']] = get_access('lx', s='d') + ' = (' + get_coerced_access('ly', s='d') + ') - (' + get_coerced_access('lz', s='d') + ');' CASES[ROPCODES['MULD']] = get_access('lx', s='d') + ' = (' + get_coerced_access('ly', s='d') + ') * (' + get_coerced_access('lz', s='d') + ');' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index ad146e320b7ce..b6b0c5f7bc492 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5730,12 +5730,17 @@ function emterpretify(ast) { var BRANCHES = set('BR', 'BRT', 'BRF'); var tempBuffer = new ArrayBuffer(8); + var tempFloat64 = new Float64Array(tempBuffer); var tempFloat32 = new Float32Array(tempBuffer); var tempUint8 = new Uint8Array(tempBuffer); function flattenFloat32(value) { tempFloat32[0] = value; return Array.prototype.slice.call(tempUint8, 0, 4); } + function flattenFloat64(value) { + tempFloat64[0] = value; + return Array.prototype.slice.call(tempUint8, 0, 8); + } function verifyCode(code) { if (code.length % 4 !== 0) assert(0, JSON.stringify(code)); @@ -6197,6 +6202,8 @@ function emterpretify(ast) { return [l, ['SETVDI', l, 0, 0, value & 255, (value >> 8) & 255, (value >> 16) & 255, (value >> 24) & 255]]; } else if (value === Math.fround(value)) { return [l, ['SETVDF', l, 0, 0].concat(flattenFloat32(value))]; + } else { + return [l, ['SETVDD', l, 0, 0].concat(flattenFloat64(value))]; } throw 'fff ' + value; } else throw 'aw'; From 6555e40b18f4bf852f638ae9f19a7d20a19a1963 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 21:54:09 -0700 Subject: [PATCH 195/461] SETTR0 --- tools/emterpretify.py | 2 ++ tools/js-optimizer.js | 13 +++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index ed54f49dfddd4..19be6fbe00fff 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -85,6 +85,7 @@ '200': 'GETTDP', # [l, 0, 0] l = tempDoublePtr #'201': 'GETPC', # [l, 0, 0] l = pc '202': 'GETTR0', # [l, 0, 0] l = tempRet0 + '203': 'SETTR0', # [l, 0, 0] tempRet0 = l '250': 'CALL', # [lx, target, sig] [params...] (lx = ) target(params..) lx's existence and type depend on the target's actual callsig; # this instruction can take multiple 32-bit instruction chunks # if target is a function table, then the first param is the index of the register holding the function pointer @@ -202,6 +203,7 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['GETTDP']] = 'HEAP32[sp + (lx << 3) >> 2] = tempDoublePtr;' #CASES[ROPCODES['GETPC']] = 'HEAP32[sp + (lx << 3) >> 2] = pc;' CASES[ROPCODES['GETTR0']] = 'HEAP32[sp + (lx << 3) >> 2] = tempRet0;' +CASES[ROPCODES['SETTR0']] = 'tempRet0 = ' + get_coerced_access('lx') + ';' CASES[ROPCODES['SWITCH']] = ''' lz = ''' + get_coerced_access('lz') + '''; lx = ((''' + get_coerced_access('lx') + ''') - (''' + get_coerced_access('ly') + ''')) >>> 0; // lx is now relative to the base diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index b6b0c5f7bc492..92e687070a491 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5818,7 +5818,7 @@ function emterpretify(ast) { return [x, ['GETTR0', x, 0, 0]]; } case 'inf': return makeNum(Infinity, ASM_DOUBLE); - case '_stderr': printErr('WARNING: stderr!'); return makeNum(0, ASM_DOUBLE); // XXX XXX XXX + case '_stdout': case '_stderr': printErr('WARNING: stdout|err!'); return makeNum(0, ASM_INT); // XXX XXX XXX default: throw 'getReg global wha? ' + name; } } @@ -5854,14 +5854,15 @@ function emterpretify(ast) { reg[1].push(opcode, locals[name], releaseIfFree(reg[0]), 0); return [locals[name], reg[1]]; } else { + var reg = getReg(value); + var opcode; switch(name) { - case 'STACKTOP': { - var reg = getReg(value); - reg[1].push('SETST', releaseIfFree(reg[0]), 0, 0); - return [-1, reg[1]]; - } + case 'STACKTOP': opcode = 'SETST'; break; + case 'tempRet0': opcode = 'SETTR0'; break; default: throw 'assign global wha? ' + name; } + reg[1].push(opcode, releaseIfFree(reg[0]), 0, 0); + return [-1, reg[1]]; } } else if (target[0] === 'sub') { // assign to memory From 2bbfbf24cae8bd880524b46bb746fd627cf2c672 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 24 Sep 2014 21:55:45 -0700 Subject: [PATCH 196/461] mixed signed/unsigned is flexible --- tools/js-optimizer.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 92e687070a491..90042e05c5aec 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1998,6 +1998,10 @@ function getCombinedSign(node1, node2, hint) { } if (sign1 === sign2) return sign1; if (sign1 === hint || sign2 === hint) return hint; + if ((sign1 === ASM_SIGNED && sign2 === ASM_UNSIGNED) || + (sign1 === ASM_UNSIGNED && sign2 === ASM_SIGNED)) { + return ASM_FLEXIBLE; + } assert(0, JSON.stringify([node1, ' ', node2, sign1, sign2, hint])); } From a19e2358eb95819f9a63e0a1d49fa774a0eb3a3e Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 25 Sep 2014 10:42:47 -0700 Subject: [PATCH 197/461] fix SETVDD --- tools/emterpretify.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 19be6fbe00fff..da864ae301cdb 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -168,7 +168,7 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['SETVD']] = get_access('lx', s='d') + ' = +(inst >> 16);' CASES[ROPCODES['SETVDI']] = 'pc = pc + 4 | 0; ' + get_access('lx', s='d') + ' = +(HEAP32[pc >> 2] | 0);' CASES[ROPCODES['SETVDF']] = 'pc = pc + 4 | 0; ' + get_access('lx', s='d') + ' = +HEAPF32[pc >> 2];' -CASES[ROPCODES['SETVDD']] = 'HEAP32[tempDoublePtr >> 2] = HEAP32[pc + 4 >> 2]; HEAP32[tempDoublePtr + 4 >> 2] = HEAP32[pc + 8 >> 2]; pc = pc + 8 | 0; ' + get_access('lx', s='d') + ' = +HEAPF64[tempDoublePtr >> 2];' +CASES[ROPCODES['SETVDD']] = 'HEAP32[tempDoublePtr >> 2] = HEAP32[pc + 4 >> 2]; HEAP32[tempDoublePtr + 4 >> 2] = HEAP32[pc + 8 >> 2]; pc = pc + 8 | 0; ' + get_access('lx', s='d') + ' = +HEAPF64[tempDoublePtr >> 3];' CASES[ROPCODES['ADDD']] = get_access('lx', s='d') + ' = (' + get_coerced_access('ly', s='d') + ') + (' + get_coerced_access('lz', s='d') + ');' CASES[ROPCODES['SUBD']] = get_access('lx', s='d') + ' = (' + get_coerced_access('ly', s='d') + ') - (' + get_coerced_access('lz', s='d') + ');' CASES[ROPCODES['MULD']] = get_access('lx', s='d') + ' = (' + get_coerced_access('ly', s='d') + ') * (' + get_coerced_access('lz', s='d') + ');' From f163af4ebfc1c4fdd49ebb5767df00311668b6e1 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 25 Sep 2014 11:51:26 -0700 Subject: [PATCH 198/461] debug print --- tools/emterpretify.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index da864ae301cdb..122e403860c35 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -271,7 +271,7 @@ def fix_case(case): EMTSTACKTOP = EMTSTACKTOP + (HEAP8[pc + 1 >> 0] << 3) | 0; assert(((EMTSTACKTOP|0) <= (EMT_STACK_MAX|0))|0); while (1) { - //print('last lx: ' + [HEAP32[sp + (lx << 3) >> 2]|0, +HEAPF64[sp + (lx << 3) >> 3]]); + //print('last lx (' + lx + '): ' + [HEAP32[sp + (lx << 3) >> 2]|0, +HEAPF64[sp + (lx << 3) >> 3]]); pc = pc + 4 | 0; inst = HEAP32[pc>>2]|0; lx = (inst >> 8) & 255; From ba71f1fd789caebbef4b6e52f96f5b4528d9983b Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 25 Sep 2014 13:35:42 -0700 Subject: [PATCH 199/461] int/double fixes --- tools/emterpretify.py | 6 +++-- tools/js-optimizer.js | 53 +++++++++++++++++++++++++++---------------- 2 files changed, 37 insertions(+), 22 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 122e403860c35..fd9e4a2f7a0da 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -64,7 +64,8 @@ '82': 'GTD', # [lx, ly, lz] lx = ly <= lz (double) '83': 'GED', # [lx, ly, lz] lx = ly <= lz (double) '90': 'D2I', # [lx, ly, 0] lx = ~~ly (double-to-int) - '91': 'I2D', # [lx, ly, 0] lx = +ly (int-to-double) + '91': 'SI2D', # [lx, ly, 0] lx = +ly (signed int-to-double) + '92': 'UI2D', # [lx, ly, 0] lx = +ly (unsigned int-to-double) '100': 'LOAD8', # [lx, ly, 0] lx = HEAP8[ly >> 0] '110': 'LOAD16', # [lx, ly, 0] lx = HEAP16[ly >> 1] @@ -182,7 +183,8 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['GTD']] = get_access('lx') + ' = (' + get_coerced_access('ly', s='d') + ') > (' + get_coerced_access('lz', s='d') + ') | 0;' CASES[ROPCODES['GED']] = get_access('lx') + ' = (' + get_coerced_access('ly', s='d') + ') >= (' + get_coerced_access('lz', s='d') + ') | 0;' CASES[ROPCODES['D2I']] = get_access('lx') + ' = ~~(' + get_coerced_access('ly', s='d') + ');' -CASES[ROPCODES['I2D']] = get_access('lx', s='d') + ' = +(' + get_coerced_access('ly') + ');' +CASES[ROPCODES['SI2D']] = get_access('lx', s='d') + ' = +(' + get_coerced_access('ly') + ');' +CASES[ROPCODES['UI2D']] = get_access('lx', s='d') + ' = +(' + get_coerced_access('ly', unsigned=True) + ');' CASES[ROPCODES['LOAD8']] = get_access('lx') + ' = ' + 'HEAP8[' + get_access('ly') + ' >> 0];' CASES[ROPCODES['LOAD16']] = get_access('lx') + ' = ' + 'HEAP16[' + get_access('ly') + ' >> 1];' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 90042e05c5aec..2aa66ff634aee 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5789,6 +5789,10 @@ function emterpretify(ast) { return l; } + function isFree(l) { + return l >= numLocals; + } + var markerId = 0; var absoluteId = 0; var absoluteTargets = {}; @@ -5932,43 +5936,46 @@ function emterpretify(ast) { case 'unary-prefix': { if (node[1] === '+') { // double operation + var appliedCoercion = false; var ret = (function() { var inner = node[2]; switch (inner[0]) { - case 'unary-prefix': case 'binary': case 'call': case 'sub': { - return getReg(inner, dropIt, ASM_DOUBLE, ASM_NONSIGNED); - } - case 'conditional': { - var type = detectType(inner, asmData); - assert(type === ASM_DOUBLE, JSON.stringify([type, ASM_DOUBLE, inner])); + case 'call': case 'sub': { + // the coercion is part of the syntax of these + appliedCoercion = true; return getReg(inner, dropIt, ASM_DOUBLE, ASM_NONSIGNED); } case 'num': { + appliedCoercion = true; return makeNum(inner[1], ASM_DOUBLE); } - case 'name': { - var name = inner[1]; - var type = getAsmType(name, asmData); - if (type === ASM_DOUBLE) { - return [locals[name], []]; + case 'unary-prefix': { + if (inner[1] === '-' && inner[2][0] === 'num') { + appliedCoercion = true; + return makeNum(-inner[2][1], ASM_DOUBLE); } - throw 'no ' + type; + // otherwise fall through } default: { - var type = detectType(inner, asmData); - if (type === ASM_INT) { - return makeUnary(['unary-prefix', 'I2D', node[2][2]], ASM_DOUBLE, ASM_NONSIGNED); - } - throw 'meh ' + [inner[0], type] + JSON.stringify(inner); + return getReg(inner, dropIt, ASM_DOUBLE, ASM_NONSIGNED); } } })(); // add a coercion on the value, if needed - if (node[2][0] !== 'call') { + if (!appliedCoercion) { var innerType = detectType(node[2], asmData); if (innerType !== ASM_DOUBLE) { if (innerType === ASM_INT) { - ret[1].push('I2D', ret[0], ret[0], 0); + var sign = detectSign(node[2]); + var opcode = sign === ASM_SIGNED ? 'SI2D' : 'UI2D'; + if (isFree(ret[0])) { + ret[1].push(opcode, ret[0], ret[0], 0); + } else { + // we can't trample this reg + var l = getFree(); + ret[1].push(opcode, l, ret[0], 0); + ret[0] = l; + } } else { throw 'whoops'; } @@ -5983,7 +5990,13 @@ function emterpretify(ast) { assert(!dropIt); switch (node[1]) { - case '-': case '~': { + case '-': { + if (node[2][0] === 'num') { + return makeNum(-node[2][1], ASM_INT); + } + // otherwise fall through + } + case '~': { var type = detectType(node[2], asmData); var sign = detectSign(node[2]); return makeUnary(node, type, sign); From 23951a3e38d73d7e77798c12f21123cc804e510f Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 25 Sep 2014 14:15:37 -0700 Subject: [PATCH 200/461] emit negative zeros --- tools/js-optimizer.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 2aa66ff634aee..e33519d65fc0e 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6204,8 +6204,9 @@ function emterpretify(ast) { function makeNum(value, type, l) { if (l === undefined) l = getFree(); var opcode; - if (((value << 16) >> 16) === (value | 0) && ((value === (value | 0)) || (value === (value >>> 0)))) { - assert(value !== 0 || 1/value > 0); // we abhor -0 + if (((value << 16) >> 16) === (value | 0) && ((value === (value | 0)) || (value === (value >>> 0))) && + (value !== 0 || 1/value > 0)) { + // a small 16-bit integer value, and not negative zero if (type === ASM_INT) { opcode = 'SETVI'; } else if (type === ASM_DOUBLE) { From e320d63dd8f2b3e039cb8f6cf6977c55ee42e36b Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 25 Sep 2014 14:41:05 -0700 Subject: [PATCH 201/461] add generic global access inst --- tools/emterpretify.py | 46 +++++++++++++++++++++++++++++++++++-------- tools/js-optimizer.js | 16 ++++++++++----- 2 files changed, 49 insertions(+), 13 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index fd9e4a2f7a0da..d5dd12ece6b87 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -87,6 +87,8 @@ #'201': 'GETPC', # [l, 0, 0] l = pc '202': 'GETTR0', # [l, 0, 0] l = tempRet0 '203': 'SETTR0', # [l, 0, 0] tempRet0 = l + '240': 'GETGLBI', # [l, vl, vh] get global value, int, indexed by v + '241': 'GETGLBD', # [l, vl, vh] get global value, double, indexed by v '250': 'CALL', # [lx, target, sig] [params...] (lx = ) target(params..) lx's existence and type depend on the target's actual callsig; # this instruction can take multiple 32-bit instruction chunks # if target is a function table, then the first param is the index of the register holding the function pointer @@ -252,11 +254,25 @@ def make_target_call_sig(sig): if len(sigs) == 1: return make_target_call_sig(sigs[0]) else: - assert len(sigs) == 2 + assert len(sigs) == 2, [name, sigs] return 'if ((HEAP8[pc+3>>0]|0) == 0) { ' + make_target_call_sig(sigs[0]) + ' } else { ' + make_target_call_sig(sigs[1]) + ' }' CASES[ROPCODES['CALL']] = 'switch (ly|0) {\n' + \ - '\n'.join(filter(lambda x: 'None' not in x, [' case %d: {\n%s\n }' % (i, make_target_call(i)) for i in range(global_id)])) + \ + '\n'.join(filter(lambda x: 'None' not in x, [' case %d: {\n%s\n }' % (i, make_target_call(i)) for i in range(global_func_id)])) + \ + '\n default: assert(0);' + \ + '\n }' + + if ROPCODES['GETGLBI'] not in CASES: + def make_target_access(i): + name = rglobal_vars[i] + + def make_target_access_sig(sig): + return ' ' + get_access('lx', sig[0]) + ' = ' + name + '; break;' + + return make_target_access_sig('i') # XXX 'i' is the assumption for now + + CASES[ROPCODES['GETGLBI']] = 'switch (ly|0) {\n' + \ + '\n'.join(filter(lambda x: 'None' not in x, [' case %d: {\n%s\n }' % (i, make_target_access(i)) for i in range(global_var_id)])) + \ '\n default: assert(0);' + \ '\n }' @@ -351,7 +367,11 @@ def fix_case(case): global_funcs = {} rglobal_funcs = {} -global_id = 0 +global_func_id = 0 + +global_vars = {} +rglobal_vars = {} +global_var_id = 0 call_sigs = {} # signatures appearing for each call target def process_code(func, code, absolute_targets): @@ -367,11 +387,11 @@ def process_code(func, code, absolute_targets): sigs = call_sigs[target] if sig not in sigs: sigs.append(sig) if target not in global_funcs: - global global_id - assert global_id < 256, global_funcs - global_funcs[target] = global_id - rglobal_funcs[global_id] = target - global_id += 1 + global global_func_id + assert global_func_id < 256, global_funcs + global_funcs[target] = global_func_id + rglobal_funcs[global_func_id] = target + global_func_id += 1 code[j+2] = global_funcs[target] code[j+3] = sigs.index(sig) if sig[0] == 'v': @@ -379,6 +399,16 @@ def process_code(func, code, absolute_targets): code[j+1] = 0 # clear it else: assert code[j+1] >= 0 # there should be a real target here + elif code[j] in ['GETGLBI', 'GETGLBD']: + # fix global-accessing instructions' targets + target = code[j+2] + if target not in global_vars: + global global_var_id + assert global_var_id < 256, global_vars + global_vars[target] = global_var_id + rglobal_vars[global_var_id] = target + global_var_id += 1 + code[j+2] = global_vars[target] elif code[j] == 'absolute-value': # put the 32-bit absolute value of an abolute target here #print ' fixing absolute value', code[j+1], absolute_targets[unicode(code[j+1])], absolute_start + absolute_targets[unicode(code[j+1])] diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index e33519d65fc0e..6f74c8e33410f 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1866,6 +1866,7 @@ function detectType(node, asmInfo, inVarDef) { if (!inVarDef) { switch (node[1]) { case 'inf': return ASM_DOUBLE; // TODO: when minified + case 'tempRet0': return ASM_INT; } return ASM_NONE; } @@ -5826,8 +5827,11 @@ function emterpretify(ast) { return [x, ['GETTR0', x, 0, 0]]; } case 'inf': return makeNum(Infinity, ASM_DOUBLE); - case '_stdout': case '_stderr': printErr('WARNING: stdout|err!'); return makeNum(0, ASM_INT); // XXX XXX XXX - default: throw 'getReg global wha? ' + name; + default: { + var x = getFree(); + assert(typeHint === ASM_INT); + return [x, ['GETGLBI', x, name, 0]]; + } } } case 'num': { @@ -6311,8 +6315,8 @@ function emterpretify(ast) { case '>>>': opcode = 'LSHR'; break; default: throw 'bad ' + node[1]; } - var y = getReg(node[2]); - var z = getReg(node[3]); + var y = getReg(node[2], undefined, type, sign); + var z = getReg(node[3], undefined, type, sign); var x = getFree(y[0], z[0]); y[1] = y[1].concat(z[1]); y[1].push(opcode, x, releaseIfFree(y[0], x), releaseIfFree(z[0], x)); @@ -6443,7 +6447,9 @@ function emterpretify(ast) { var reg = getReg(param); ret = ret.concat(reg[1]); actuals.push(reg[0]); - sig += ASM_SIG[detectType(param, asmData)]; + var curr = ASM_SIG[detectType(param, asmData)]; + assert(curr !== 'v');//, JSON.stringify(param) + ' ==> ' + ASM_SIG[detectType(param, asmData)]); + sig += curr; }); ret.push('CALL'); ret.push(lx); From 90257ca7939697b81da5f83ac4cee04e67a99122 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 25 Sep 2014 16:04:12 -0700 Subject: [PATCH 202/461] use proper type of SET in conditional --- tools/js-optimizer.js | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 6f74c8e33410f..5e5066d52ea8c 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5853,17 +5853,10 @@ function emterpretify(ast) { var name = target[1]; if (name in locals) { // local - var reg = getReg(value); - var type = asmData.vars[name]; - if (type === undefined) type = asmData.params[name]; + var type = getAsmType(name, asmData); + var reg = getReg(value, type); // TODO: detect when the last operation in reg[1] assigns in its arg x, in which case we can avoid the SET and make it assign to us - var opcode; - if (type === ASM_INT) { - opcode = 'SET'; - } else if (type === ASM_DOUBLE) { - opcode = 'SETD'; - } else throw 'ick'; - reg[1].push(opcode, locals[name], releaseIfFree(reg[0]), 0); + reg[1] = reg[1].concat(makeSet(locals[name], releaseIfFree(reg[0]), type)); return [locals[name], reg[1]]; } else { var reg = getReg(value); @@ -6086,18 +6079,21 @@ function emterpretify(ast) { } case 'conditional': { // TODO: optimize + // TODO: handle dropIt var otherwise = markerId++, exit = markerId++; var temp = getFree(); var condition = getReg(node[1]); var ret = condition[1]; + var type = detectType(node[2], asmData); + assert(type !== ASM_NONE); ret.push('BRF', releaseIfFree(condition[0]), otherwise, 0); var first = getReg(node[2]); - ret = ret.concat(first[1]); - ret.push('SET', temp, releaseIfFree(first[0]), 0, 'BR', 0, exit, 0); + ret = ret.concat(first[1]).concat(makeSet(temp, releaseIfFree(first[0]), type)); + ret.push('BR', 0, exit, 0); var second = getReg(node[3]); ret.push('marker', otherwise, 0, 0); - ret = ret.concat(second[1]); - ret.push('SET', temp, releaseIfFree(second[0]), 0, 'marker', exit, 0, 0); + ret = ret.concat(second[1]).concat(makeSet(temp, releaseIfFree(second[0]), type)); + ret.push('marker', exit, 0, 0); return [temp, ret]; } case 'seq': { @@ -6205,6 +6201,16 @@ function emterpretify(ast) { return l; } + function makeSet(dst, src, type) { + var opcode; + if (type === ASM_INT) { + opcode = 'SET'; + } else if (type === ASM_DOUBLE) { + opcode = 'SETD'; + } else assert(0, 'ick ' + type); + return [opcode, dst, src, 0]; + } + function makeNum(value, type, l) { if (l === undefined) l = getFree(); var opcode; From 21f4494078b2b51a75e836f596101134f5808bc7 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 25 Sep 2014 16:04:25 -0700 Subject: [PATCH 203/461] add js testing for emterpreter --- tests/test_other.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/tests/test_other.py b/tests/test_other.py index fb6a74c8cf214..e2e5f6febc62e 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4138,6 +4138,28 @@ def do_test(source, args, output): self.assertContained(output, out) self.validate_asmjs(out) + # generate default shell for js test + Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world.c'), '-O2', '--profiling', '-s', 'FINALIZE_ASM_JS=0']).communicate() + default = open('a.out.js').read() + start = default.index('function _main(') + end = default.index('}', start) + default = default[:start] + '{{{MAIN}}}' + default[end+1:] + default_mem = open('a.out.js.mem', 'rb').read() + + def do_js_test(name, source, args, output): + print + print 'js', name + self.clear() + if '\n' not in source: + source = open(source).read() + source = default.replace('{{{MAIN}}}', source) + open('a.out.js', 'w').write(source) + open('a.out.js.mem', 'wb').write(default_mem) + Popen([PYTHON, path_from_root('tools', 'emterpretify.py'), 'a.out.js', 'em.out.js']).communicate() + sm_no_warn = filter(lambda x: x != '-w', SPIDERMONKEY_ENGINE) + self.assertContained(output, run_js('a.out.js', engine=sm_no_warn, args=args)) # run in spidermonkey for print() + self.assertContained(output, run_js('em.out.js', engine=sm_no_warn, args=args)) + do_emcc_test('hello_world.c', [], 'hello, world!') do_test('hello_world.c', [], 'hello, world!') @@ -4168,3 +4190,24 @@ def do_test(source, args, output): } ''', [], 'hello, world! -10.00') + do_js_test('conditionals', r''' +function _main() { + var i8 = 0; + var d10 = +d10, d11 = +d11, d7 = +d7, d5 = +d5, d6 = +d6, d9 = +d9; + d11 = +1; + d7 = +2; + d5 = +3; + d6 = +4; + d10 = d11 < d7 ? d11 : d7; + print(d10); + d9 = d5 < d6 ? d5 : d6; + print(d9); + HEAPF64[tempDoublePtr >> 3] = d10; + i8 = STACKTOP; + HEAP32[i8 >> 2] = HEAP32[tempDoublePtr >> 2]; + HEAP32[i8 + 4 >> 2] = HEAP32[tempDoublePtr + 4 >> 2]; + print(HEAP32[i8 >> 2]); + print(HEAP32[i8 + 4 >> 2]); +} +''', [], '1\n3\n0\n1072693248\n') + From bbe7506fb9d3a36bf3bd6cbd119e537b38f8d313 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 25 Sep 2014 16:06:12 -0700 Subject: [PATCH 204/461] fix bad call of getReg --- tools/js-optimizer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 5e5066d52ea8c..f0751c8f60724 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5854,7 +5854,7 @@ function emterpretify(ast) { if (name in locals) { // local var type = getAsmType(name, asmData); - var reg = getReg(value, type); + var reg = getReg(value, undefined, type); // TODO: detect when the last operation in reg[1] assigns in its arg x, in which case we can avoid the SET and make it assign to us reg[1] = reg[1].concat(makeSet(locals[name], releaseIfFree(reg[0]), type)); return [locals[name], reg[1]]; From 14517287aa62d1fbd0c4510491de4c414336ffee Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 25 Sep 2014 17:48:46 -0700 Subject: [PATCH 205/461] handle boolean not in detectSign, and fix switch on default value --- tools/emterpretify.py | 6 +++--- tools/js-optimizer.js | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index d5dd12ece6b87..4bf24debd33b4 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -213,7 +213,7 @@ def get_coerced_access(l, s='i', unsigned=False): lx = ((''' + get_coerced_access('lx') + ''') - (''' + get_coerced_access('ly') + ''')) >>> 0; // lx is now relative to the base if ((lx >>> 0) >= (lz >>> 0)) { // is the adjusted value too big? pc = (pc + (lz << 2)) | 0; // jump to right after the table, where the default is - continue; + break; // also increment the pc normally, to skip the switch itself } pc = HEAP32[pc + 4 + (lx << 2) >> 2] | 0; // load from the jump table which is right after this instruction, and set pc continue;''' @@ -439,9 +439,9 @@ def process_code(func, code, absolute_targets): if curr is not None: assert len(curr) % 4 == 0, curr funcs[func] = len(all_code) # no operation here should change the length - #print >> sys.stderr, 'raw bytecode for %s:' % func, curr + print >> sys.stderr, 'raw bytecode for %s:' % func, curr process_code(func, curr, absolute_targets) - #print >> sys.stderr, 'processed bytecode for %s:' % func, curr + print >> sys.stderr, 'processed bytecode for %s:' % func, curr all_code += curr func = None lines[i] = '}' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index f0751c8f60724..2d59141039906 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1852,6 +1852,7 @@ function detectType(node, asmInfo, inVarDef) { case 'unary-prefix': { if (node[1] === '+') return ASM_DOUBLE; if (node[1] === '-') return detectType(node[2], asmInfo, inVarDef); + if (node[1] === '!') return ASM_INT; break; } case 'call': { From bbf1c9d6ad3dea7af70a17f7a4fd2507f9f0f972 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 25 Sep 2014 17:49:24 -0700 Subject: [PATCH 206/461] add testcase --- tests/test_other.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/test_other.py b/tests/test_other.py index e2e5f6febc62e..742bf2ee808e4 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4211,3 +4211,25 @@ def do_js_test(name, source, args, output): } ''', [], '1\n3\n0\n1072693248\n') + do_js_test('bigswitch', r''' +function _main() { + var i2 = 0, i3 = 0, i4 = 0, i6 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i5 = 0, i7 = 0, i1 = 0; + print(4278); + L1 : while (1) { + i11 = -1; + switch ((i11 | 0)) { + case 0: + { + i6 = 67; + break; + } + default: + {} + } + print(i6); + break; + } + print(i6); +} +''', [], '4278\n0\n0\n') + From 28a7c6fea6f6af5363385f5c908a76feb3aa53ee Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 25 Sep 2014 17:50:04 -0700 Subject: [PATCH 207/461] disable debug info --- tools/emterpretify.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 4bf24debd33b4..4dbce46db462a 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -439,9 +439,9 @@ def process_code(func, code, absolute_targets): if curr is not None: assert len(curr) % 4 == 0, curr funcs[func] = len(all_code) # no operation here should change the length - print >> sys.stderr, 'raw bytecode for %s:' % func, curr + #print >> sys.stderr, 'raw bytecode for %s:' % func, curr process_code(func, curr, absolute_targets) - print >> sys.stderr, 'processed bytecode for %s:' % func, curr + #print >> sys.stderr, 'processed bytecode for %s:' % func, curr all_code += curr func = None lines[i] = '}' From d347e1cf671d77778ee3010a1a2c8e98b02a8f54 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 25 Sep 2014 18:11:44 -0700 Subject: [PATCH 208/461] add autodebugger annotations for basic blocks --- tools/autodebugger.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/autodebugger.py b/tools/autodebugger.py index df9594b3604ee..fd05300f16def 100644 --- a/tools/autodebugger.py +++ b/tools/autodebugger.py @@ -275,6 +275,12 @@ '\n call void @emscripten_autodebug_i8(i32 %d, i8 %%adtemp%d)' % (index, index) lines_added += 3 continue + m = re.match('[\w\d\.]+: +; preds', lines[i]) + if m: + # basic block + lines[i] += '\n call void @emscripten_autodebug_i32(i32 -10, i32 %s)' % (index,) + lines_added += 1 + continue finally: if len(pre) > 0: From 0353b8f1e3f2ce936b978d833e70ec0d1f0023c1 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 25 Sep 2014 18:12:53 -0700 Subject: [PATCH 209/461] fix autodebugger --- tools/autodebugger.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tools/autodebugger.py b/tools/autodebugger.py index fd05300f16def..9fb05395342df 100644 --- a/tools/autodebugger.py +++ b/tools/autodebugger.py @@ -278,9 +278,10 @@ m = re.match('[\w\d\.]+: +; preds', lines[i]) if m: # basic block - lines[i] += '\n call void @emscripten_autodebug_i32(i32 -10, i32 %s)' % (index,) - lines_added += 1 - continue + if len(lines) > i+1 and 'phi' not in lines[i+1]: + lines[i] += '\n call void @emscripten_autodebug_i32(i32 -10, i32 %s)' % (index,) + lines_added += 1 + continue finally: if len(pre) > 0: From d984d5a43e198fd19b4f7543ad81fcdee9f9abdd Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 25 Sep 2014 18:24:07 -0700 Subject: [PATCH 210/461] autodebugger line indexing improvement --- tools/autodebugger.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/autodebugger.py b/tools/autodebugger.py index 9fb05395342df..d8cb1a2c33e43 100644 --- a/tools/autodebugger.py +++ b/tools/autodebugger.py @@ -278,8 +278,8 @@ m = re.match('[\w\d\.]+: +; preds', lines[i]) if m: # basic block - if len(lines) > i+1 and 'phi' not in lines[i+1]: - lines[i] += '\n call void @emscripten_autodebug_i32(i32 -10, i32 %s)' % (index,) + if len(lines) > i+1 and 'phi' not in lines[i+1] and 'landingpad' not in lines[i+1]: + lines[i] += '\n call void @emscripten_autodebug_i32(i32 -10, i32 %d)' % (i+1+lines_added,) lines_added += 1 continue From a6dedde004d0d8ee0b416ea07e5e45f07269cb0d Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 25 Sep 2014 20:22:42 -0700 Subject: [PATCH 211/461] set up asm3i to test emterpreter --- tests/test_core.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/test_core.py b/tests/test_core.py index 142811bacb915..bb13fe3d828f3 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -16,7 +16,11 @@ def test_hello_world(self): self.do_run_from_file(src, output) - assert 'EMSCRIPTEN_GENERATED_FUNCTIONS' not in open(self.in_dir('src.cpp.o.js')).read(), 'must not emit this unneeded internal thing' + src = open(self.in_dir('src.cpp.o.js')).read() + if self.run_name != 'asm3i': + assert 'EMSCRIPTEN_GENERATED_FUNCTIONS' not in src, 'must not emit this unneeded internal thing' + else: + assert 'function emterpret(' in src def test_intvars(self): if self.emcc_args == None: return self.skip('needs ta2') @@ -7103,6 +7107,7 @@ def setUp(self): asm3 = make_run("asm3", compiler=CLANG, emcc_args=["-O3"]) asm2f = make_run("asm2f", compiler=CLANG, emcc_args=["-O2", "-s", "PRECISE_F32=1"]) asm2g = make_run("asm2g", compiler=CLANG, emcc_args=["-O2", "-g", "-s", "ASSERTIONS=1", "-s", "SAFE_HEAP=1"]) +asm3i = make_run("asm3i", compiler=CLANG, emcc_args=["-O3", '-s', 'EMTERPRETIFY=1']) # Legacy test modes - slow2 = make_run("slow2", compiler=CLANG, emcc_args=["-O2", "-s", "ASM_JS=0"], env={"EMCC_FAST_COMPILER": "0"}) From 1fafb0037ad5d23c8487139ec85fa7a068ff08a0 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 25 Sep 2014 20:33:04 -0700 Subject: [PATCH 212/461] save a copy of the pre-emterpreter code if in debug mode --- tools/emterpretify.py | 7 +++++-- tools/js-optimizer.js | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 4dbce46db462a..d6d69f1260018 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -7,7 +7,7 @@ ''' import os, sys, re, json -import asm_module, shared +import asm_module, shared, shutil # params @@ -319,7 +319,10 @@ def fix_case(case): outfile = sys.argv[2] force_memfile = sys.argv[3] if len(sys.argv) >= 4 else None -print 'emterpretifying %s to %s' % (infile, outfile) +#print 'emterpretifying %s to %s' % (infile, outfile) + +if shared.DEBUG: + shutil.copyfile(infile, infile + '.save.js') # final global functions diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 2d59141039906..1b834bb43c63e 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6534,7 +6534,7 @@ function emterpretify(ast) { return; } - printErr('emterpretifying ' + func[1]); + //printErr('emterpretifying ' + func[1]); var locals = {}; var numLocals = 0; From 287dbc34c8010d62a33c3ff60785bfee5a45c646 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 25 Sep 2014 21:08:10 -0700 Subject: [PATCH 213/461] generalize autodebugger block detection --- tools/autodebugger.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/autodebugger.py b/tools/autodebugger.py index d8cb1a2c33e43..0fccd6e213437 100644 --- a/tools/autodebugger.py +++ b/tools/autodebugger.py @@ -275,7 +275,7 @@ '\n call void @emscripten_autodebug_i8(i32 %d, i8 %%adtemp%d)' % (index, index) lines_added += 3 continue - m = re.match('[\w\d\.]+: +; preds', lines[i]) + m = re.match('[^ ] .*; preds = ', lines[i]) if m: # basic block if len(lines) > i+1 and 'phi' not in lines[i+1] and 'landingpad' not in lines[i+1]: From fddbdf93d827d710931e0dbd1616b20d8f019b02 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 25 Sep 2014 21:08:42 -0700 Subject: [PATCH 214/461] do not emit 32-bit unsigned values using SETVD; for doubles, we only handle signed there --- tools/js-optimizer.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 1b834bb43c63e..fb9db7c0c6917 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6215,9 +6215,10 @@ function emterpretify(ast) { function makeNum(value, type, l) { if (l === undefined) l = getFree(); var opcode; - if (((value << 16) >> 16) === (value | 0) && ((value === (value | 0)) || (value === (value >>> 0))) && + if (((value << 16) >> 16) === (value | 0) && ((value === (value | 0)) || (type === ASM_INT && value === (value >>> 0))) && (value !== 0 || 1/value > 0)) { // a small 16-bit integer value, and not negative zero + // note that for ints, we don't care if it is signed or not; for floating-point, we need this to be signed if (type === ASM_INT) { opcode = 'SETVI'; } else if (type === ASM_DOUBLE) { From 06059af5f6c5d5a9acdb970279fde46b5b906448 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 25 Sep 2014 21:16:41 -0700 Subject: [PATCH 215/461] add nan --- tools/js-optimizer.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index fb9db7c0c6917..21c708cd40e07 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5828,9 +5828,10 @@ function emterpretify(ast) { return [x, ['GETTR0', x, 0, 0]]; } case 'inf': return makeNum(Infinity, ASM_DOUBLE); + case 'nan': return makeNum(NaN, ASM_DOUBLE); default: { var x = getFree(); - assert(typeHint === ASM_INT); + assert(typeHint === ASM_INT, name); return [x, ['GETGLBI', x, name, 0]]; } } From 6daac4d99463da13164a083ca9225071c3662832 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 25 Sep 2014 21:21:57 -0700 Subject: [PATCH 216/461] assert on global ids near the end --- tools/emterpretify.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index d6d69f1260018..63ac87807884e 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -391,7 +391,6 @@ def process_code(func, code, absolute_targets): if sig not in sigs: sigs.append(sig) if target not in global_funcs: global global_func_id - assert global_func_id < 256, global_funcs global_funcs[target] = global_func_id rglobal_funcs[global_func_id] = target global_func_id += 1 @@ -407,7 +406,6 @@ def process_code(func, code, absolute_targets): target = code[j+2] if target not in global_vars: global global_var_id - assert global_var_id < 256, global_vars global_vars[target] = global_var_id rglobal_vars[global_var_id] = target global_var_id += 1 @@ -459,6 +457,9 @@ def process_code(func, code, absolute_targets): elif ret == '2': actual_return_types[name] = 'f' +assert global_func_id < 256, [global_funcs, global_func_id] +assert global_var_id < 256, [global_vars, global_var_id] + # create new mem init mem_init = mem_init + all_code asm.staticbump += len(all_code) From 89fc3f430e847ce581545e95f132cc48cd3b9863 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 25 Sep 2014 21:54:44 -0700 Subject: [PATCH 217/461] notice type hint in calls, even if told to drop the output --- tools/js-optimizer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 21c708cd40e07..a3b8f95c1ce26 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6008,7 +6008,7 @@ function emterpretify(ast) { case 'call': { var type; var ret; - if (dropIt) { + if (dropIt && (typeHint === undefined || typeHint === ASM_NONE)) { type = ASM_NONE; ret = -1; } else { From 8ea4bf61e25b1826d9d86e21330d7a6a27f1f06a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 11:07:11 -0700 Subject: [PATCH 218/461] disable test_asyncify in emterpreter --- tests/test_core.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/test_core.py b/tests/test_core.py index bb13fe3d828f3..99f0697b579f7 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -6947,10 +6947,9 @@ def test_64bit_return_value(self): assert "high = 1234" in out def test_asyncify(self): - if not Settings.ASM_JS: - return self.skip('asyncify requires asm.js') - if os.environ.get('EMCC_FAST_COMPILER') == '0': - return self.skip('asyncify requires fastcomp') + if not Settings.ASM_JS: return self.skip('asyncify requires asm.js') + if os.environ.get('EMCC_FAST_COMPILER') == '0': return self.skip('asyncify requires fastcomp') + if 'EMTERPRETIFY=1' in self.emcc_args: return self.skip('todo') self.banned_js_engines = [SPIDERMONKEY_ENGINE, V8_ENGINE] # needs setTimeout which only node has From da2f582f7bf15e629908b693107b75f850522e71 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 11:22:42 -0700 Subject: [PATCH 219/461] SETGLBI --- tools/emterpretify.py | 31 ++++++++++++++++++++++--------- tools/js-optimizer.js | 11 +++++++++-- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 63ac87807884e..21b34497c8ef3 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -89,6 +89,7 @@ '203': 'SETTR0', # [l, 0, 0] tempRet0 = l '240': 'GETGLBI', # [l, vl, vh] get global value, int, indexed by v '241': 'GETGLBD', # [l, vl, vh] get global value, double, indexed by v + '245': 'SETGLBI', # [vl, vh, l] set global value, int, indexed by v (v = l) '250': 'CALL', # [lx, target, sig] [params...] (lx = ) target(params..) lx's existence and type depend on the target's actual callsig; # this instruction can take multiple 32-bit instruction chunks # if target is a function table, then the first param is the index of the register holding the function pointer @@ -263,16 +264,20 @@ def make_target_call_sig(sig): '\n }' if ROPCODES['GETGLBI'] not in CASES: - def make_target_access(i): + def make_load(i): + sig = 'i' name = rglobal_vars[i] - - def make_target_access_sig(sig): - return ' ' + get_access('lx', sig[0]) + ' = ' + name + '; break;' - - return make_target_access_sig('i') # XXX 'i' is the assumption for now - + return ' ' + get_access('lx', sig[0]) + ' = ' + name + '; break;' CASES[ROPCODES['GETGLBI']] = 'switch (ly|0) {\n' + \ - '\n'.join(filter(lambda x: 'None' not in x, [' case %d: {\n%s\n }' % (i, make_target_access(i)) for i in range(global_var_id)])) + \ + '\n'.join(filter(lambda x: 'None' not in x, [' case %d: {\n%s\n }' % (i, make_load(i)) for i in range(global_var_id)])) + \ + '\n default: assert(0);' + \ + '\n }' + def make_store(i): + sig = 'i' + name = rglobal_vars[i] + return ' ' + name + ' = ' + get_coerced_access('lz', sig[0]) + '; break;' + CASES[ROPCODES['SETGLBI']] = 'switch ((inst >> 8)&255) {\n' + \ + '\n'.join(filter(lambda x: 'None' not in x, [' case %d: {\n%s\n }' % (i, make_store(i)) for i in range(global_var_id)])) + \ '\n default: assert(0);' + \ '\n }' @@ -378,6 +383,7 @@ def fix_case(case): call_sigs = {} # signatures appearing for each call target def process_code(func, code, absolute_targets): + global global_var_id absolute_start = code_start + len(all_code) # true absolute starting point of this function #print 'processing code', func, absolute_start for i in range(len(code)/4): @@ -405,11 +411,18 @@ def process_code(func, code, absolute_targets): # fix global-accessing instructions' targets target = code[j+2] if target not in global_vars: - global global_var_id global_vars[target] = global_var_id rglobal_vars[global_var_id] = target global_var_id += 1 code[j+2] = global_vars[target] + elif code[j] in ['SETGLBI']: + # fix global-accessing instructions' targets + target = code[j+1] + if target not in global_vars: + global_vars[target] = global_var_id + rglobal_vars[global_var_id] = target + global_var_id += 1 + code[j+1] = global_vars[target] elif code[j] == 'absolute-value': # put the 32-bit absolute value of an abolute target here #print ' fixing absolute value', code[j+1], absolute_targets[unicode(code[j+1])], absolute_start + absolute_targets[unicode(code[j+1])] diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index a3b8f95c1ce26..9a3dd93e1b190 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5866,10 +5866,17 @@ function emterpretify(ast) { switch(name) { case 'STACKTOP': opcode = 'SETST'; break; case 'tempRet0': opcode = 'SETTR0'; break; - default: throw 'assign global wha? ' + name; + default: { + var type = detectType(value, asmData); + assert(type === ASM_INT); + reg[1].push('SETGLBI', name, 0, releaseIfFree(reg[0])); + reg[0] = -1; + return reg; + } } reg[1].push(opcode, releaseIfFree(reg[0]), 0, 0); - return [-1, reg[1]]; + reg[0] = -1; + return reg; } } else if (target[0] === 'sub') { // assign to memory From 68fd338f15614bd389f16ddb060c797a6bcf2583 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 11:40:00 -0700 Subject: [PATCH 220/461] do not emit a branch at the end of a case statement, if there isn't a break then we should fall through --- tools/js-optimizer.js | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 9a3dd93e1b190..44a6aff3e30ce 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6196,7 +6196,6 @@ function emterpretify(ast) { if (data[j]) { ret.push('absolute-target', data[j].absolute, 0, 0); ret = ret.concat(data[j].code); - ret.push('BR', 0, exit, 0); } } ret.push('marker', exit, 0, 0); From da11ec0641c198a358a6bd93bd930617717375b4 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 12:45:16 -0700 Subject: [PATCH 221/461] LOADU8,16 --- tools/emterpretify.py | 6 +++++- tools/js-optimizer.js | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 21b34497c8ef3..396f9eb40e425 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -68,8 +68,10 @@ '92': 'UI2D', # [lx, ly, 0] lx = +ly (unsigned int-to-double) '100': 'LOAD8', # [lx, ly, 0] lx = HEAP8[ly >> 0] + '101': 'LOADU8', # [lx, ly, 0] lx = HEAPU8[ly >> 0] '110': 'LOAD16', # [lx, ly, 0] lx = HEAP16[ly >> 1] - '120': 'LOAD32', # [lx, ly, 0] lx = HEAP32[ly >> 2] + '111': 'LOADU16', # [lx, ly, 0] lx = HEAPU16[ly >> 1] + '120': 'LOAD32', # [lx, ly, 0] lx = HEAP32[ly >> 2] - no need for unsigned version, this is set to a register anyhow '130': 'STORE8', # [lx, ly, 0] HEAP8[lx >> 2] = ly '140': 'STORE16', # [lx, ly, 0] HEAP16[lx >> 2] = ly '150': 'STORE32', # [lx, ly, 0] HEAP32[lx >> 2] = ly @@ -190,7 +192,9 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['UI2D']] = get_access('lx', s='d') + ' = +(' + get_coerced_access('ly', unsigned=True) + ');' CASES[ROPCODES['LOAD8']] = get_access('lx') + ' = ' + 'HEAP8[' + get_access('ly') + ' >> 0];' +CASES[ROPCODES['LOADU8']] = get_access('lx') + ' = ' + 'HEAPU8[' + get_access('ly') + ' >> 0];' CASES[ROPCODES['LOAD16']] = get_access('lx') + ' = ' + 'HEAP16[' + get_access('ly') + ' >> 1];' +CASES[ROPCODES['LOADU16']] = get_access('lx') + ' = ' + 'HEAPU16[' + get_access('ly') + ' >> 1];' CASES[ROPCODES['LOAD32']] = get_access('lx') + ' = ' + 'HEAP32[' + get_access('ly') + ' >> 2];' CASES[ROPCODES['STORE8']] = 'HEAP8[' + get_access('lx') + ' >> 0] = ' + get_coerced_access('ly') + ';'; CASES[ROPCODES['STORE16']] = 'HEAP16[' + get_access('lx') + ' >> 1] = ' + get_coerced_access('ly') + ';'; diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 44a6aff3e30ce..b4810b0f76ed0 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6117,7 +6117,7 @@ function emterpretify(ast) { var temp = makeTempParseHeap(); assert(parseHeap(heap, temp)); // coerced heap access => a load - var opcode = 'LOAD' + (temp.float ? 'F' : '') + temp.bits; + var opcode = 'LOAD' + (temp.float ? 'F' : (temp.bits < 32 && temp.unsigned ? 'U' : '')) + temp.bits; if (node[2][0] === 'binary' && node[2][1] === '>>' && node[2][3][0] === 'num') { var shifts = node[2][3][1]; assert(shifts >= 0 && shifts <= 3); From 9211dd506ce462059f4b5bd832171c1d6315b1bd Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 12:51:45 -0700 Subject: [PATCH 222/461] labeled switches --- tools/js-optimizer.js | 133 +++++++++++++++++++++++------------------- 1 file changed, 73 insertions(+), 60 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index b4810b0f76ed0..308b947474ec0 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6048,8 +6048,10 @@ function emterpretify(ast) { return makeDo(inner, name); } else if (inner[0] === 'while') { return makeWhile(inner, name); + } else if (inner[0] === 'switch') { + return makeSwitch(inner, name); } - throw 'sigh'; + throw 'sigh ' + inner[0]; } case 'break': { var label = node[1]; @@ -6141,65 +6143,7 @@ function emterpretify(ast) { return [-1, walkStatements(node[1])]; } case 'switch': { - var condition = getReg(node[1]); - var exit = markerId++; - // parse cases and emit code - breakStack.push(exit); - var data = {}; - var cases = node[2]; - var minn = Infinity, maxx = -Infinity; - for (var i = 0; i < cases.length; i++) { - var c = cases[i]; - var id; - if (c[0] === null) id = 'default'; - else if (c[0][0] === 'num') id = c[0][1]; - else if (c[0][0] === 'unary-prefix' && c[0][2][0] === 'num') id = -c[0][2][1]; - else throw 'bad case'; - data[id] = { - code: walkStatements(c[1]), - absolute: absoluteId++ - }; - if (typeof id === 'number') { - minn = Math.min(id, minn); - maxx = Math.max(id, maxx); - } - } - breakStack.pop(); - var range = maxx - minn + 1; - assert(minn === (minn | 0) && range === (range | 0)); - var defaultAbsolute = data['default'] ? data['default'].absolute : absoluteId++; - // emit the switch instruction itself - var tempMin = getFree(), tempRange = getFree(); - var ret = condition[1].concat(makeNum(minn, ASM_INT, tempMin)[1]).concat(makeNum(range, ASM_INT, tempRange)[1]); - ret.push('SWITCH', condition[0], tempMin, tempRange); - releaseFree(tempRange); - releaseFree(tempMin); - releaseIfFree(condition[0]); - // emit the jump table - for (var i = 0; i < range; i++) { - var j = minn + i; - if (data[j]) { - ret.push('absolute-value', data[j].absolute, 0, 0); - } else { - ret.push('absolute-value', defaultAbsolute, 0, 0); - } - } - // emit the default TODO: optimize when there is no default - ret.push('absolute-target', defaultAbsolute, 0, 0); - if (data['default']) { - ret = ret.concat(data['default'].code); - } - ret.push('BR', 0, exit, 0); - // emit the jump table targets - for (var i = 0; i < range; i++) { - var j = minn + i; - if (data[j]) { - ret.push('absolute-target', data[j].absolute, 0, 0); - ret = ret.concat(data[j].code); - } - } - ret.push('marker', exit, 0, 0); - return [-1, ret]; + return makeSwitch(node); } default: throw 'getReg wha? ' + node[0] + new Error().stack; } @@ -6440,6 +6384,75 @@ function emterpretify(ast) { return [-1, ret]; } + function makeSwitch(node, label) { + var condition = getReg(node[1]); + var exit = markerId++; + // parse cases and emit code + breakStack.push(exit); + if (label) { + assert(!(label in breakLabels)); + breakLabels[label] = exit; + } + var data = {}; + var cases = node[2]; + var minn = Infinity, maxx = -Infinity; + for (var i = 0; i < cases.length; i++) { + var c = cases[i]; + var id; + if (c[0] === null) id = 'default'; + else if (c[0][0] === 'num') id = c[0][1]; + else if (c[0][0] === 'unary-prefix' && c[0][2][0] === 'num') id = -c[0][2][1]; + else throw 'bad case'; + data[id] = { + code: walkStatements(c[1]), + absolute: absoluteId++ + }; + if (typeof id === 'number') { + minn = Math.min(id, minn); + maxx = Math.max(id, maxx); + } + } + breakStack.pop(); + if (label) { + delete breakLabels[label]; + } + var range = maxx - minn + 1; + assert(minn === (minn | 0) && range === (range | 0)); + var defaultAbsolute = data['default'] ? data['default'].absolute : absoluteId++; + // emit the switch instruction itself + var tempMin = getFree(), tempRange = getFree(); + var ret = condition[1].concat(makeNum(minn, ASM_INT, tempMin)[1]).concat(makeNum(range, ASM_INT, tempRange)[1]); + ret.push('SWITCH', condition[0], tempMin, tempRange); + releaseFree(tempRange); + releaseFree(tempMin); + releaseIfFree(condition[0]); + // emit the jump table + for (var i = 0; i < range; i++) { + var j = minn + i; + if (data[j]) { + ret.push('absolute-value', data[j].absolute, 0, 0); + } else { + ret.push('absolute-value', defaultAbsolute, 0, 0); + } + } + // emit the default TODO: optimize when there is no default + ret.push('absolute-target', defaultAbsolute, 0, 0); + if (data['default']) { + ret = ret.concat(data['default'].code); + } + ret.push('BR', 0, exit, 0); + // emit the jump table targets + for (var i = 0; i < range; i++) { + var j = minn + i; + if (data[j]) { + ret.push('absolute-target', data[j].absolute, 0, 0); + ret = ret.concat(data[j].code); + } + } + ret.push('marker', exit, 0, 0); + return [-1, ret]; + } + function makeCall(lx, node, type) { // TODO: specialize calls like imul assert(node[0] === 'call'); From 16ae7e92747319c783ff6b804ff44d6fddf51a76 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 13:06:13 -0700 Subject: [PATCH 223/461] allow function call ids to be up to 16 bits --- tools/emterpretify.py | 65 ++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 35 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 396f9eb40e425..962a7a4f314b4 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -92,7 +92,7 @@ '240': 'GETGLBI', # [l, vl, vh] get global value, int, indexed by v '241': 'GETGLBD', # [l, vl, vh] get global value, double, indexed by v '245': 'SETGLBI', # [vl, vh, l] set global value, int, indexed by v (v = l) - '250': 'CALL', # [lx, target, sig] [params...] (lx = ) target(params..) lx's existence and type depend on the target's actual callsig; + '250': 'CALL', # [lx, targetl, targeth] [params...] (lx = ) target(params..) lx's existence and type depend on the target's actual callsig; # this instruction can take multiple 32-bit instruction chunks # if target is a function table, then the first param is the index of the register holding the function pointer '251': 'SWITCH', # [lx, ly, lz] switch (lx) { .. }. followed by a jump table for values in range [ly..ly+lz), after which is the default (which might be empty) @@ -235,34 +235,26 @@ def make_emterpreter(t): # call is generated using information of actual call patterns if ROPCODES['CALL'] not in CASES: - #print >> sys.stderr, call_sigs def make_target_call(i): - name = rglobal_funcs[i] + name = global_func_names[i] + sig = global_func_sigs[i] + function_pointer_call = name.startswith('FUNCTION_TABLE_') - if name not in call_sigs: return None - sigs = call_sigs[name] - - def make_target_call_sig(sig): - ret = name - if function_pointer_call: - ret += '[' + get_access('HEAP8[pc+4>>0]') + ' & %d]' % (next_power_of_two(asm.tables[name].count(',')+1)-1) - ret += '(' + ', '.join([get_coerced_access('HEAP8[pc+%d>>0]' % (i+4+(1 if function_pointer_call else 0)), s=sig[i+1]) for i in range(len(sig)-1)]) + ')' - if sig[0] != 'v': - ret = get_access('lx', sig[0]) + ' = ' + shared.JS.make_coercion(ret, sig[0]) - elif name in actual_return_types and actual_return_types[name] != 'v': - ret = shared.JS.make_coercion(ret, actual_return_types[name]) # return value ignored, but need a coercion - extra = len(sig) - 1 # [opcode, lx, target, sig], take the usual 4. params are extra - if extra > 0: - ret += '; pc = pc + %d | 0' % (4*((extra+3)>>2)) - return ' ' + ret + '; break;' - - if len(sigs) == 1: - return make_target_call_sig(sigs[0]) - else: - assert len(sigs) == 2, [name, sigs] - return 'if ((HEAP8[pc+3>>0]|0) == 0) { ' + make_target_call_sig(sigs[0]) + ' } else { ' + make_target_call_sig(sigs[1]) + ' }' - CASES[ROPCODES['CALL']] = 'switch (ly|0) {\n' + \ + ret = name + if function_pointer_call: + ret += '[' + get_access('HEAP8[pc+4>>0]') + ' & %d]' % (next_power_of_two(asm.tables[name].count(',')+1)-1) + ret += '(' + ', '.join([get_coerced_access('HEAP8[pc+%d>>0]' % (i+4+(1 if function_pointer_call else 0)), s=sig[i+1]) for i in range(len(sig)-1)]) + ')' + if sig[0] != 'v': + ret = get_access('lx', sig[0]) + ' = ' + shared.JS.make_coercion(ret, sig[0]) + elif name in actual_return_types and actual_return_types[name] != 'v': + ret = shared.JS.make_coercion(ret, actual_return_types[name]) # return value ignored, but need a coercion + extra = len(sig) - 1 # [opcode, lx, target, sig], take the usual 4. params are extra + if extra > 0: + ret += '; pc = pc + %d | 0' % (4*((extra+3)>>2)) + return ' ' + ret + '; break;' + + CASES[ROPCODES['CALL']] = 'switch ((inst>>>16)|0) {\n' + \ '\n'.join(filter(lambda x: 'None' not in x, [' case %d: {\n%s\n }' % (i, make_target_call(i)) for i in range(global_func_id)])) + \ '\n default: assert(0);' + \ '\n }' @@ -377,8 +369,9 @@ def fix_case(case): # first pass, collect and process bytecode -global_funcs = {} -rglobal_funcs = {} +global_funcs = {} # 'name|sig' -> id +global_func_names = {} # id -> name +global_func_sigs = {} # id -> sig, one name can have multiple sigs global_func_id = 0 global_vars = {} @@ -387,6 +380,7 @@ def fix_case(case): call_sigs = {} # signatures appearing for each call target def process_code(func, code, absolute_targets): + global global_func_id global global_var_id absolute_start = code_start + len(all_code) # true absolute starting point of this function #print 'processing code', func, absolute_start @@ -399,13 +393,14 @@ def process_code(func, code, absolute_targets): if target not in call_sigs: call_sigs[target] = [] sigs = call_sigs[target] if sig not in sigs: sigs.append(sig) - if target not in global_funcs: - global global_func_id - global_funcs[target] = global_func_id - rglobal_funcs[global_func_id] = target + fullname = target + '|' + sig + if fullname not in global_funcs: + global_funcs[fullname] = global_func_id + global_func_names[global_func_id] = target + global_func_sigs[global_func_id] = sig global_func_id += 1 - code[j+2] = global_funcs[target] - code[j+3] = sigs.index(sig) + code[j+2] = global_funcs[fullname] & 255 + code[j+3] = global_funcs[fullname] >> 8 if sig[0] == 'v': assert code[j+1] == -1 # dummy value for assignment code[j+1] = 0 # clear it @@ -474,7 +469,7 @@ def process_code(func, code, absolute_targets): elif ret == '2': actual_return_types[name] = 'f' -assert global_func_id < 256, [global_funcs, global_func_id] +assert global_func_id < 65536, [global_funcs, global_func_id] assert global_var_id < 256, [global_vars, global_var_id] # create new mem init From 8aa101d8eef0949aa43780f75318dfba5edde778 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 13:32:12 -0700 Subject: [PATCH 224/461] do not convert dynCall stubs --- tools/js-optimizer.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 308b947474ec0..b46cfd53ee1ed 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6544,14 +6544,16 @@ function emterpretify(ast) { // walkFunction main - if (func[1] in BLACKLIST) { + var ignore = (func[1] in BLACKLIST) || /^dynCall_.*/.test(func[1]); + + if (ignore) { print(astToSrc(func)); } var asmData = normalizeAsm(func); print('// return type: [' + func[1] + ',' + asmData.ret + ']'); - if (func[1] in BLACKLIST) { + if (ignore) { return; } From fdb61d7bbda21a4a6554e89fbdc3633ce78f9e05 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 13:47:47 -0700 Subject: [PATCH 225/461] disable test_coroutine in emterpreter --- tests/test_core.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_core.py b/tests/test_core.py index 99f0697b579f7..fff38666490b3 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -6975,6 +6975,7 @@ def test_asyncify(self): def test_coroutine(self): if not Settings.ASM_JS: return self.skip('asyncify requires asm.js') if os.environ.get('EMCC_FAST_COMPILER') == '0': return self.skip('asyncify requires fastcomp') + if 'EMTERPRETIFY=1' in self.emcc_args: return self.skip('todo') src = r''' #include From af14b70855587f1cbabfd787dc46aca43a8fc437 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 13:48:03 -0700 Subject: [PATCH 226/461] assert on global var loads being ints in the python driver --- tools/emterpretify.py | 2 ++ tools/js-optimizer.js | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 962a7a4f314b4..06603e9c28578 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -409,6 +409,8 @@ def process_code(func, code, absolute_targets): elif code[j] in ['GETGLBI', 'GETGLBD']: # fix global-accessing instructions' targets target = code[j+2] + imp = asm.imports[target] + assert '|0' in imp or '| 0' in imp or imp == '0' if target not in global_vars: global_vars[target] = global_var_id rglobal_vars[global_var_id] = target diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index b46cfd53ee1ed..82dba9eb33606 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5831,7 +5831,7 @@ function emterpretify(ast) { case 'nan': return makeNum(NaN, ASM_DOUBLE); default: { var x = getFree(); - assert(typeHint === ASM_INT, name); + // we assert in the python driver that these are ints return [x, ['GETGLBI', x, name, 0]]; } } From 0cd23f278e6ddc7eca3a7ea538012a98bd361c3d Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 13:54:59 -0700 Subject: [PATCH 227/461] drop dropIt binaries without side effects --- tools/js-optimizer.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 82dba9eb33606..6d42d2c20590f 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5917,7 +5917,12 @@ function emterpretify(ast) { } // not a simple coercion - assert(!dropIt); + + if (dropIt) { + // a pointless thing we can drop entirely + assert(!hasSideEffects(node)); + return [-1, []]; + } switch (node[1]) { case '&': case '|': case '^': case '<<': case '>>': case '>>>': return makeBinary(node, ASM_INT, ASM_SIGNED); From fedadd814534dc3d564629888011805304cec09c Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 13:58:52 -0700 Subject: [PATCH 228/461] ~ detection and handling fixes --- tools/js-optimizer.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 6d42d2c20590f..a8f40cb014c16 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1850,9 +1850,11 @@ function detectType(node, asmInfo, inVarDef) { return ASM_INT; } case 'unary-prefix': { - if (node[1] === '+') return ASM_DOUBLE; - if (node[1] === '-') return detectType(node[2], asmInfo, inVarDef); - if (node[1] === '!') return ASM_INT; + switch (node[1]) { + case '+': return ASM_DOUBLE; + case '-': return detectType(node[2], asmInfo, inVarDef); + case '!': case '~': return ASM_INT; + } break; } case 'call': { @@ -6009,8 +6011,7 @@ function emterpretify(ast) { } case '~': { var type = detectType(node[2], asmData); - var sign = detectSign(node[2]); - return makeUnary(node, type, sign); + return makeUnary(node, type, ASM_SIGNED); } case '!': return makeUnary(node, ASM_INT, ASM_SIGNED); default: throw 'ehh'; From dcd500ffef03ab0aacf1138330a899b6069cdf9c Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 14:02:02 -0700 Subject: [PATCH 229/461] type detection for nan --- tools/js-optimizer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index a8f40cb014c16..8527dcae543ca 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1868,7 +1868,7 @@ function detectType(node, asmInfo, inVarDef) { } if (!inVarDef) { switch (node[1]) { - case 'inf': return ASM_DOUBLE; // TODO: when minified + case 'inf': case 'nan': return ASM_DOUBLE; // TODO: when minified case 'tempRet0': return ASM_INT; } return ASM_NONE; From 2d3a932863121d5fa364a987d6ddb49b38157058 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 14:31:14 -0700 Subject: [PATCH 230/461] proper sign detection for nums --- tests/test_other.py | 6 ++++++ tools/js-optimizer.js | 9 ++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/tests/test_other.py b/tests/test_other.py index 742bf2ee808e4..b48fe70c494a8 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4233,3 +4233,9 @@ def do_js_test(name, source, args, output): } ''', [], '4278\n0\n0\n') + do_js_test('big int compare', r''' +function _main() { + print ((0 > 4294963001) | 0); +} +''', [], '0\n') + diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 8527dcae543ca..8d2f877079ec8 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1979,7 +1979,14 @@ function detectSign(node) { } break; } - case 'num': case 'name': return ASM_FLEXIBLE; + case 'num': { + var value = node[1]; + if (value < 0) return ASM_SIGNED; + if (value > (-1>>>0)) return ASM_NONSIGNED; + if (value === (value | 0)) return ASM_FLEXIBLE; + return ASM_UNSIGNED; + } + case 'name': return ASM_FLEXIBLE; case 'conditional': case 'seq': { return detectSign(node[2]); } From af6b6f28aaa91b674d40313d44c877a138e53aec Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 14:46:06 -0700 Subject: [PATCH 231/461] detect empty mem inits, but only emit them when emterpreting --- emcc | 1 + tools/shared.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/emcc b/emcc index 5dbff531f4e8a..d743106478b0c 100755 --- a/emcc +++ b/emcc @@ -1316,6 +1316,7 @@ try: def repl(m): # handle chunking of the memory initializer s = m.groups(0)[0] + if len(s) == 0 and not shared.Settings.EMTERPRETIFY: return m.group(0) # emterpreter must have a mem init file; otherwise, don't emit 0-size ones open(memfile, 'wb').write(''.join(map(lambda x: chr(int(x or '0')), s.split(',')))) if DEBUG: # Copy into temp dir as well, so can be run there too diff --git a/tools/shared.py b/tools/shared.py index 23c3cccd088d5..8ec7568473404 100644 --- a/tools/shared.py +++ b/tools/shared.py @@ -1726,7 +1726,7 @@ def ensure_struct_info(info_path): chunkify = cache.chunkify class JS: - memory_initializer_pattern = '/\* memory initializer \*/ allocate\(\[([\d, ]+)\], "i8", ALLOC_NONE, ([\d+Runtime\.GLOBAL_BASEH]+)\);' + memory_initializer_pattern = '/\* memory initializer \*/ allocate\(\[([\d, ]*)\], "i8", ALLOC_NONE, ([\d+Runtime\.GLOBAL_BASEH]+)\);' no_memory_initializer_pattern = '/\* no memory initializer \*/' memory_staticbump_pattern = 'STATICTOP = STATIC_BASE \+ (\d+);' From 246d5f951ca14bcf6aa7711090dd3359f3cafd8a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 15:03:30 -0700 Subject: [PATCH 232/461] finalize floats in non-emterpreted funcs --- tools/js-optimizer.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 8d2f877079ec8..c185878582adf 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6560,7 +6560,8 @@ function emterpretify(ast) { var ignore = (func[1] in BLACKLIST) || /^dynCall_.*/.test(func[1]); if (ignore) { - print(astToSrc(func)); + prepDotZero(func); + print(fixDotZero(astToSrc(func))); } var asmData = normalizeAsm(func); From 869e2c13b2c288ead3d91bda2c9ca63a77f368ba Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 16:42:38 -0700 Subject: [PATCH 233/461] clean up --- tools/emterpretify.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 06603e9c28578..1705184e990ec 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -470,6 +470,7 @@ def process_code(func, code, absolute_targets): actual_return_types[name] = 'd' elif ret == '2': actual_return_types[name] = 'f' + lines[i] = '' assert global_func_id < 65536, [global_funcs, global_func_id] assert global_var_id < 256, [global_vars, global_var_id] From 7da1db65e3439012616aa978ef8a736ed2a4d1c0 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 16:51:28 -0700 Subject: [PATCH 234/461] clear non-param locals --- tools/emterpretify.py | 10 ++++++++-- tools/js-optimizer.js | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 1705184e990ec..da97532c3e01e 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -97,7 +97,7 @@ # if target is a function table, then the first param is the index of the register holding the function pointer '251': 'SWITCH', # [lx, ly, lz] switch (lx) { .. }. followed by a jump table for values in range [ly..ly+lz), after which is the default (which might be empty) '254': 'RET', # [l, 0, 0] return l (depending on which emterpreter_x we are in, has the right type) - '255': 'FUNC', # [n, 0, 0] function with n locals (each taking 64 bits) + '255': 'FUNC', # [total locals, num params, 0] function with n locals (each taking 64 bits), of which the first are params } assert len(OPCODES.values()) == len(set(OPCODES.values())) # no dupe names @@ -287,8 +287,14 @@ def fix_case(case): var sp = 0, inst = 0, lx = 0, ly = 0, lz = 0; sp = EMTSTACKTOP; assert(((HEAPU8[pc>>0]>>>0) == %d)|0); - EMTSTACKTOP = EMTSTACKTOP + (HEAP8[pc + 1 >> 0] << 3) | 0; + lx = HEAP8[pc + 1 >> 0] | 0; // num locals + EMTSTACKTOP = EMTSTACKTOP + (lx << 3) | 0; assert(((EMTSTACKTOP|0) <= (EMT_STACK_MAX|0))|0); + ly = HEAP8[pc + 2 >> 0] | 0; + while ((ly | 0) < (lx | 0)) { // clear the non-param locals + HEAPF64[sp + (ly << 3) >> 3] = +0; + ly = ly + 1 | 0; + } while (1) { //print('last lx (' + lx + '): ' + [HEAP32[sp + (lx << 3) >> 2]|0, +HEAPF64[sp + (lx << 3) >> 3]]); pc = pc + 4 | 0; diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index c185878582adf..7176d43c7bdea 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6630,7 +6630,7 @@ function emterpretify(ast) { code.push('RET', 0, 0, 0); // final ret for the function } assert(maxLocal <= 256); - code = ['FUNC', maxLocal+1, 0, 0].concat(code); + code = ['FUNC', maxLocal+1, func[2].length, 0].concat(code); verifyCode(code); finalizeJumps(code); From 285e8705e85f30c931ff6a9152207b2c1bb759e5 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 18:07:42 -0700 Subject: [PATCH 235/461] add fallthrough jumps from all cases to the one after them --- tools/js-optimizer.js | 56 +++++++++++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 7176d43c7bdea..955dec0971aac 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6409,16 +6409,22 @@ function emterpretify(ast) { var data = {}; var cases = node[2]; var minn = Infinity, maxx = -Infinity; + function getId(raw) { + if (raw === null) return 'default'; + else if (raw[0] === 'num') return raw[1]; + else if (raw[0] === 'unary-prefix' && raw[2][0] === 'num') return -raw[2][1]; + else throw 'bad case'; + } for (var i = 0; i < cases.length; i++) { var c = cases[i]; - var id; - if (c[0] === null) id = 'default'; - else if (c[0][0] === 'num') id = c[0][1]; - else if (c[0][0] === 'unary-prefix' && c[0][2][0] === 'num') id = -c[0][2][1]; - else throw 'bad case'; + var id = getId(c[0]); data[id] = { + i: i, // original index + id: id, code: walkStatements(c[1]), - absolute: absoluteId++ + absolute: absoluteId++, + marker: markerId++, + next: -1 // will be the fall through target }; if (typeof id === 'number') { minn = Math.min(id, minn); @@ -6429,9 +6435,27 @@ function emterpretify(ast) { if (label) { delete breakLabels[label]; } + // finalize nexts + for (var id in data) { + var info = data[id]; + var i = info.i + 1; + while (1) { + if (i >= cases.length) { + info.next = exit; + break; + } + var nextId = getId(cases[i][0]); + assert(nextId in data); + info.next = data[nextId].marker; + break; + // TODO: optimize all this, we don't need a fallthrough branch if we branch anyhow; recurse multiple fallthroughs; etc. + } + } + // calculate values var range = maxx - minn + 1; assert(minn === (minn | 0) && range === (range | 0)); var defaultAbsolute = data['default'] ? data['default'].absolute : absoluteId++; + var defaultMarker = data['default'] ? data['default'].marker : markerId++; // emit the switch instruction itself var tempMin = getFree(), tempRange = getFree(); var ret = condition[1].concat(makeNum(minn, ASM_INT, tempMin)[1]).concat(makeNum(range, ASM_INT, tempRange)[1]); @@ -6442,14 +6466,16 @@ function emterpretify(ast) { // emit the jump table for (var i = 0; i < range; i++) { var j = minn + i; - if (data[j]) { - ret.push('absolute-value', data[j].absolute, 0, 0); + var info = data[j]; + if (info) { + ret.push('absolute-value', info.absolute, 0, 0); } else { ret.push('absolute-value', defaultAbsolute, 0, 0); } } // emit the default TODO: optimize when there is no default ret.push('absolute-target', defaultAbsolute, 0, 0); + ret.push('marker', defaultMarker, 0, 0); if (data['default']) { ret = ret.concat(data['default'].code); } @@ -6457,9 +6483,12 @@ function emterpretify(ast) { // emit the jump table targets for (var i = 0; i < range; i++) { var j = minn + i; - if (data[j]) { - ret.push('absolute-target', data[j].absolute, 0, 0); - ret = ret.concat(data[j].code); + var info = data[j]; + if (info) { + ret.push('absolute-target', info.absolute, 0, 0); + ret.push('marker', info.marker, 0, 0); + ret = ret.concat(info.code); + ret.push('BR', 0, info.next, 0); } } ret.push('marker', exit, 0, 0); @@ -6543,8 +6572,9 @@ function emterpretify(ast) { // second pass, finalize jumps TODO: optimize jump->jump->x to jump->x for (var i = 0; i < code.length; i += 4) { if (code[i] in BRANCHES) { - var target = markers[code[i+2]]; - assert(target !== undefined); + var id = code[i+2]; + var target = markers[id]; + assert(target !== undefined, id); var offset = target - i; assert(offset % 4 === 0); offset >>= 2; From 5c00b533e862e5d7ec6384e0e05775159a117ef5 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 18:09:16 -0700 Subject: [PATCH 236/461] add assert --- tools/js-optimizer.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 955dec0971aac..b7a1dda50fdbd 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6418,6 +6418,7 @@ function emterpretify(ast) { for (var i = 0; i < cases.length; i++) { var c = cases[i]; var id = getId(c[0]); + if (id === 'default') assert(i === cases.length-1, 'if there is a default, it must be last'); data[id] = { i: i, // original index id: id, From dd01cb6ffe0bf6cbd86a5a909998836ce6430365 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 19:52:59 -0700 Subject: [PATCH 237/461] disable f32 tests in emterpreter --- tests/test_core.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/tests/test_core.py b/tests/test_core.py index fff38666490b3..92a88652bd72b 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -10,6 +10,9 @@ class T(RunnerCore): # Short name, to make it more fun to use manually on the co def is_emscripten_abi(self): return not ('i386-pc-linux-gnu' in COMPILER_OPTS or self.env.get('EMCC_LLVM_TARGET') == 'i386-pc-linux-gnu') + def is_emterpreter(self): + return 'EMTERPRETIFY=1' in self.emcc_args + def test_hello_world(self): test_path = path_from_root('tests', 'core', 'test_hello_world') src, output = (test_path + s for s in ('.in', '.out')) @@ -17,7 +20,7 @@ def test_hello_world(self): self.do_run_from_file(src, output) src = open(self.in_dir('src.cpp.o.js')).read() - if self.run_name != 'asm3i': + if not self.is_emterpreter(): assert 'EMSCRIPTEN_GENERATED_FUNCTIONS' not in src, 'must not emit this unneeded internal thing' else: assert 'function emterpret(' in src @@ -470,8 +473,9 @@ def test_double_i64_conversion(self): self.do_run_from_file(src, output) def test_float32_precise(self): - Settings.PRECISE_F32 = 1 + if self.is_emterpreter(): return self.skip('todo') + Settings.PRECISE_F32 = 1 test_path = path_from_root('tests', 'core', 'test_float32_precise') src, output = (test_path + s for s in ('.in', '.out')) @@ -4957,6 +4961,7 @@ def test_fasta(self): for precision in [0, 1, 2]: Settings.PRECISE_F32 = precision for t in ['float', 'double']: + if self.is_emterpreter() and precision > 0: continue print precision, t src = open(path_from_root('tests', 'fasta.cpp'), 'r').read().replace('double', t) for i, j in results: @@ -6949,7 +6954,7 @@ def test_64bit_return_value(self): def test_asyncify(self): if not Settings.ASM_JS: return self.skip('asyncify requires asm.js') if os.environ.get('EMCC_FAST_COMPILER') == '0': return self.skip('asyncify requires fastcomp') - if 'EMTERPRETIFY=1' in self.emcc_args: return self.skip('todo') + if self.is_emterpreter(): return self.skip('todo') self.banned_js_engines = [SPIDERMONKEY_ENGINE, V8_ENGINE] # needs setTimeout which only node has @@ -6975,7 +6980,7 @@ def test_asyncify(self): def test_coroutine(self): if not Settings.ASM_JS: return self.skip('asyncify requires asm.js') if os.environ.get('EMCC_FAST_COMPILER') == '0': return self.skip('asyncify requires fastcomp') - if 'EMTERPRETIFY=1' in self.emcc_args: return self.skip('todo') + if self.is_emterpreter(): return self.skip('todo') src = r''' #include From 5036b3105a6459e44251983b55b36a2b353adb64 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 19:59:08 -0700 Subject: [PATCH 238/461] disable more irrelevant tests --- tests/test_core.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_core.py b/tests/test_core.py index 92a88652bd72b..119389aa45f4f 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -6674,6 +6674,7 @@ def clean(code): os.environ.pop('EMCC_DEBUG', None) def test_exception_source_map(self): + if self.is_emterpreter(): return self.skip('todo') if Settings.USE_TYPED_ARRAYS != 2: return self.skip("doesn't pass without typed arrays") if '-g4' not in Building.COMPILER_TEST_OPTS: Building.COMPILER_TEST_OPTS.append('-g4') if NODE_JS not in JS_ENGINES: return self.skip('sourcemapper requires Node to run') @@ -6714,6 +6715,7 @@ def post(filename): self.build(src, dirname, os.path.join(dirname, 'src.cpp'), post_build=(None, post)) def test_emscripten_log(self): + if self.is_emterpreter(): return self.skip('todo') if Settings.ASM_JS: # XXX Does not work in SpiderMonkey since callstacks cannot be captured when running in asm.js, see https://bugzilla.mozilla.org/show_bug.cgi?id=947996 self.banned_js_engines = [SPIDERMONKEY_ENGINE] From f6df16ce61df5a597e287ec805b7cf3b0bfb8546 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 20:06:35 -0700 Subject: [PATCH 239/461] improve assert --- tools/js-optimizer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index b7a1dda50fdbd..4cc06c00f83b8 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6612,7 +6612,7 @@ function emterpretify(ast) { for (var i in asmData.vars) { locals[i] = numLocals++; } - assert(numLocals <= 256); + assert(numLocals <= 256, [func[1], numLocals]); for (var i = 255; i >= numLocals; i--) { freeLocals.push(i); } From 9e45b70492095d6b6c10585ef6a79ebb59152af9 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 20:07:30 -0700 Subject: [PATCH 240/461] fix negative zero --- tools/js-optimizer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 4cc06c00f83b8..0cf6dcb94ecd8 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6193,7 +6193,7 @@ function emterpretify(ast) { if (type === ASM_INT) { return [l, ['SETVIB', l, 0, 0, value & 255, (value >> 8) & 255, (value >> 16) & 255, (value >> 24) & 255]]; } else if (type === ASM_DOUBLE) { - if (value === (value | 0)) { + if (value === (value | 0) && (value !== 0 || 1/value > 0)) { return [l, ['SETVDI', l, 0, 0, value & 255, (value >> 8) & 255, (value >> 16) & 255, (value >> 24) & 255]]; } else if (value === Math.fround(value)) { return [l, ['SETVDF', l, 0, 0].concat(flattenFloat32(value))]; From b882f2479c4b4be7bd5b358890340bcf34d145c0 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 21:19:33 -0700 Subject: [PATCH 241/461] disable test_inlinejs3 in emterpreter --- tests/test_core.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/test_core.py b/tests/test_core.py index 119389aa45f4f..05b3d89dc5d40 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -2165,10 +2165,11 @@ def test_inlinejs2(self): self.do_run_from_file(src, output) def test_inlinejs3(self): - test_path = path_from_root('tests', 'core', 'test_inlinejs3') - src, output = (test_path + s for s in ('.in', '.out')) + if self.is_emterpreter(): return self.skip('debugger keyword is meaningless in emterpreter') + test_path = path_from_root('tests', 'core', 'test_inlinejs3') + src, output = (test_path + s for s in ('.in', '.out')) - self.do_run_from_file(src, output) + self.do_run_from_file(src, output) def test_memorygrowth(self): if Settings.USE_TYPED_ARRAYS != 2: return self.skip('memory growth is only supported with typed arrays mode 2') From 9feebba7cbf096141b2feffa97b23925454504df Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 21:20:10 -0700 Subject: [PATCH 242/461] fix pc handling in function pointer calls --- tools/emterpretify.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index da97532c3e01e..82d442624f9fc 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -244,12 +244,12 @@ def make_target_call(i): ret = name if function_pointer_call: ret += '[' + get_access('HEAP8[pc+4>>0]') + ' & %d]' % (next_power_of_two(asm.tables[name].count(',')+1)-1) - ret += '(' + ', '.join([get_coerced_access('HEAP8[pc+%d>>0]' % (i+4+(1 if function_pointer_call else 0)), s=sig[i+1]) for i in range(len(sig)-1)]) + ')' + ret += '(' + ', '.join([get_coerced_access('HEAP8[pc+%d>>0]' % (i+4+int(function_pointer_call)), s=sig[i+1]) for i in range(len(sig)-1)]) + ')' if sig[0] != 'v': ret = get_access('lx', sig[0]) + ' = ' + shared.JS.make_coercion(ret, sig[0]) elif name in actual_return_types and actual_return_types[name] != 'v': ret = shared.JS.make_coercion(ret, actual_return_types[name]) # return value ignored, but need a coercion - extra = len(sig) - 1 # [opcode, lx, target, sig], take the usual 4. params are extra + extra = len(sig) - 1 + int(function_pointer_call) # [opcode, lx, target, sig], take the usual 4. params are extra if extra > 0: ret += '; pc = pc + %d | 0' % (4*((extra+3)>>2)) return ' ' + ret + '; break;' From e9fbf39597868cce6df41acf81eb623388230e38 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 26 Sep 2014 22:03:22 -0700 Subject: [PATCH 243/461] disable some more irrelevant tests --- tests/test_core.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_core.py b/tests/test_core.py index 05b3d89dc5d40..8777ba222f089 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -2172,6 +2172,7 @@ def test_inlinejs3(self): self.do_run_from_file(src, output) def test_memorygrowth(self): + if self.is_emterpreter(): return self.skip('todo') if Settings.USE_TYPED_ARRAYS != 2: return self.skip('memory growth is only supported with typed arrays mode 2') self.banned_js_engines = [V8_ENGINE] # stderr printing limitations in v8 @@ -5116,6 +5117,7 @@ def test_cubescript(self): assert main.count('\n') <= 7, ('must not emit too many postSets: %d' % main.count('\n')) + ' : ' + main def test_simd(self): + if self.is_emterpreter(): return self.skip('todo') if Settings.USE_TYPED_ARRAYS != 2: return self.skip('needs ta2') if Settings.ASM_JS: Settings.ASM_JS = 2 # does not validate @@ -5145,6 +5147,7 @@ def test_simd3(self): def test_simd4(self): # test_simd4 is to test phi node handling of SIMD path + if self.is_emterpreter(): return self.skip('todo') if Settings.ASM_JS: Settings.ASM_JS = 2 # does not validate test_path = path_from_root('tests', 'core', 'test_simd4') @@ -5228,6 +5231,7 @@ def process(filename): # Main for outlining in [0, 5000]: + if outlining and self.is_emterpreter(): continue Settings.OUTLINING_LIMIT = outlining print >> sys.stderr, 'outlining:', outlining self.do_run(open(path_from_root('tests', 'freetype', 'main.c'), 'r').read(), From bf065662e4da256e2a974f613fcc26b2b3ebdf5d Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 27 Sep 2014 09:46:56 -0700 Subject: [PATCH 244/461] support using an assign to a variable as a value --- tools/js-optimizer.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 0cf6dcb94ecd8..c32e1318baf69 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5855,7 +5855,6 @@ function emterpretify(ast) { } case 'stat': return getReg(node[1], dropIt); case 'assign': { - assert(dropIt); assert(node[1] === true); var target = node[2]; var value = node[3]; @@ -5878,16 +5877,15 @@ function emterpretify(ast) { default: { var type = detectType(value, asmData); assert(type === ASM_INT); - reg[1].push('SETGLBI', name, 0, releaseIfFree(reg[0])); - reg[0] = -1; - return reg; + reg[1].push('SETGLBI', name, 0, reg[0]); + return reg; // caller will free reg[0] if necessary } } - reg[1].push(opcode, releaseIfFree(reg[0]), 0, 0); - reg[0] = -1; + reg[1].push(opcode, reg[0], 0, 0); // caller will free reg[0] if necessary return reg; } } else if (target[0] === 'sub') { + assert(dropIt); // assign to memory var heap = target[1][1]; var temp = makeTempParseHeap(); From 44c59e8686af4f3837bebb6180b4c16728e13ffb Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 27 Sep 2014 11:59:53 -0700 Subject: [PATCH 245/461] rename marker to relative --- tools/js-optimizer.js | 62 +++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index c32e1318baf69..e7cac9c1e8068 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5804,7 +5804,7 @@ function emterpretify(ast) { return l >= numLocals; } - var markerId = 0; + var relativeId = 0; var absoluteId = 0; var absoluteTargets = {}; @@ -6083,26 +6083,26 @@ function emterpretify(ast) { return [-1, ['BR', 0, continueLabels[label], 0]]; } case 'if': { - var exit = markerId++; + var exit = relativeId++; var condition = getReg(node[1]); var ret; if (!node[3]) { condition[1].push('BRF', releaseIfFree(condition[0]), exit, 0); ret = condition[1].concat(walkStatements(node[2])); } else { - var otherwise = markerId++; + var otherwise = relativeId++; condition[1].push('BRF', releaseIfFree(condition[0]), otherwise, 0); ret = condition[1].concat(walkStatements(node[2])); - ret.push('BR', 0, exit, 0, 'marker', otherwise, 0, 0); + ret.push('BR', 0, exit, 0, 'relative', otherwise, 0, 0); ret = ret.concat(walkStatements(node[3])); } - ret.push('marker', exit, 0, 0); + ret.push('relative', exit, 0, 0); return [-1, ret]; } case 'conditional': { // TODO: optimize // TODO: handle dropIt - var otherwise = markerId++, exit = markerId++; + var otherwise = relativeId++, exit = relativeId++; var temp = getFree(); var condition = getReg(node[1]); var ret = condition[1]; @@ -6113,9 +6113,9 @@ function emterpretify(ast) { ret = ret.concat(first[1]).concat(makeSet(temp, releaseIfFree(first[0]), type)); ret.push('BR', 0, exit, 0); var second = getReg(node[3]); - ret.push('marker', otherwise, 0, 0); + ret.push('relative', otherwise, 0, 0); ret = ret.concat(second[1]).concat(makeSet(temp, releaseIfFree(second[0]), type)); - ret.push('marker', exit, 0, 0); + ret.push('relative', exit, 0, 0); return [temp, ret]; } case 'seq': { @@ -6316,11 +6316,11 @@ function emterpretify(ast) { function makeDo(node, label) { var oneTime = node[1][0] === 'num' && node[1][1] === 0; // trivial one-time loops do {..} while(0) do not need condition handling // TODO: more testing assert(!oneTime); - var exit = markerId++; + var exit = relativeId++; var top, cond; if (!oneTime) { - top = markerId++; - cond = markerId++; + top = relativeId++; + cond = relativeId++; } else { top = -1; // no need to even mark the top cond = exit; // when we reach the condition, we just exit @@ -6346,25 +6346,25 @@ function emterpretify(ast) { } var ret = []; if (!oneTime) { - ret.push('marker', top, 0, 0); + ret.push('relative', top, 0, 0); } ret = ret.concat(body); if (!oneTime) { - ret.push('marker', cond, 0, 0); + ret.push('relative', cond, 0, 0); ret = ret.concat(condition[1]); ret.push('BRT', releaseIfFree(condition[0]), top, 0); } - ret.push('marker', exit, 0, 0); + ret.push('relative', exit, 0, 0); return [-1, ret]; } function makeWhile(node, label) { var infinite = node[1][0] === 'num' && node[1][1] === 1; // trivial infinite loops while(1) {..} do not need condition handling - var top = markerId++, exit = markerId++; + var top = relativeId++, exit = relativeId++; var condition, cond; if (!infinite) { condition = getReg(node[1]); - cond = markerId++; + cond = relativeId++; } else { condition = [-1, []]; cond = top; // when we reach the condition, we just go right to the top of the loop body @@ -6379,11 +6379,11 @@ function emterpretify(ast) { } var ret = []; if (!infinite) { - ret.push('marker', cond, 0, 0); + ret.push('relative', cond, 0, 0); ret = ret.concat(condition[1]); ret.push('BRF', releaseIfFree(condition[0]), exit, 0); } - ret = ret.concat(['marker', top, 0, 0]).concat(walkStatements(node[2])); + ret = ret.concat(['relative', top, 0, 0]).concat(walkStatements(node[2])); ret.push('BR', 0, cond, 0); breakStack.pop(); continueStack.pop(); @@ -6391,13 +6391,13 @@ function emterpretify(ast) { delete breakLabels[label]; delete continueLabels[label]; } - ret.push('marker', exit, 0, 0); + ret.push('relative', exit, 0, 0); return [-1, ret]; } function makeSwitch(node, label) { var condition = getReg(node[1]); - var exit = markerId++; + var exit = relativeId++; // parse cases and emit code breakStack.push(exit); if (label) { @@ -6422,7 +6422,7 @@ function emterpretify(ast) { id: id, code: walkStatements(c[1]), absolute: absoluteId++, - marker: markerId++, + relative: relativeId++, next: -1 // will be the fall through target }; if (typeof id === 'number') { @@ -6445,7 +6445,7 @@ function emterpretify(ast) { } var nextId = getId(cases[i][0]); assert(nextId in data); - info.next = data[nextId].marker; + info.next = data[nextId].relative; break; // TODO: optimize all this, we don't need a fallthrough branch if we branch anyhow; recurse multiple fallthroughs; etc. } @@ -6454,7 +6454,7 @@ function emterpretify(ast) { var range = maxx - minn + 1; assert(minn === (minn | 0) && range === (range | 0)); var defaultAbsolute = data['default'] ? data['default'].absolute : absoluteId++; - var defaultMarker = data['default'] ? data['default'].marker : markerId++; + var defaultrelative = data['default'] ? data['default'].relative : relativeId++; // emit the switch instruction itself var tempMin = getFree(), tempRange = getFree(); var ret = condition[1].concat(makeNum(minn, ASM_INT, tempMin)[1]).concat(makeNum(range, ASM_INT, tempRange)[1]); @@ -6474,7 +6474,7 @@ function emterpretify(ast) { } // emit the default TODO: optimize when there is no default ret.push('absolute-target', defaultAbsolute, 0, 0); - ret.push('marker', defaultMarker, 0, 0); + ret.push('relative', defaultrelative, 0, 0); if (data['default']) { ret = ret.concat(data['default'].code); } @@ -6485,12 +6485,12 @@ function emterpretify(ast) { var info = data[j]; if (info) { ret.push('absolute-target', info.absolute, 0, 0); - ret.push('marker', info.marker, 0, 0); + ret.push('relative', info.relative, 0, 0); ret = ret.concat(info.code); ret.push('BR', 0, info.next, 0); } } - ret.push('marker', exit, 0, 0); + ret.push('relative', exit, 0, 0); return [-1, ret]; } @@ -6555,11 +6555,11 @@ function emterpretify(ast) { function finalizeJumps(code) { assert(code.length / 4 < 32768); // our jumps are 16-bit offsets - // first pass, finalize markers. after this, every instruction is in its absolute location - var markers = {}; + // first pass, finalize relatives. after this, every instruction is in its absolute location + var relatives = {}; for (var i = 0; i < code.length; i += 4) { - if (code[i] === 'marker') { - markers[code[i+1]] = i; + if (code[i] === 'relative') { + relatives[code[i+1]] = i; code.splice(i, 4); i -= 4; } else if (code[i] === 'absolute-target') { @@ -6572,7 +6572,7 @@ function emterpretify(ast) { for (var i = 0; i < code.length; i += 4) { if (code[i] in BRANCHES) { var id = code[i+2]; - var target = markers[id]; + var target = relatives[id]; assert(target !== undefined, id); var offset = target - i; assert(offset % 4 === 0); From 876b492ef0d20916c4bcaef7a049c747ad345d89 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 27 Sep 2014 12:24:20 -0700 Subject: [PATCH 246/461] work towards turning relative branches into absolute ones, when necessary --- tools/js-optimizer.js | 56 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index e7cac9c1e8068..a53b5f16fbb3a 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5742,7 +5742,11 @@ function emterpretify(ast) { var OPCODES = extraInfo.opcodes; var ROPCODES = extraInfo.ropcodes; - var BRANCHES = set('BR', 'BRT', 'BRF'); + var RELATIVE_BRANCHES = set('BR', 'BRT', 'BRF'); + var ABSOLUTE_BRANCHES = set('BRA', 'BRTA', 'BRFA'); + var BRANCHES = {}; + mergeInto(BRANCHES, RELATIVE_BRANCHES); + mergeInto(BRANCHES, ABSOLUTE_BRANCHES); var tempBuffer = new ArrayBuffer(8); var tempFloat64 = new Float64Array(tempBuffer); @@ -6554,23 +6558,63 @@ function emterpretify(ast) { } function finalizeJumps(code) { - assert(code.length / 4 < 32768); // our jumps are 16-bit offsets - // first pass, finalize relatives. after this, every instruction is in its absolute location + // first pass, collect and remove markers and absolute targets var relatives = {}; + var absolutes = {}; for (var i = 0; i < code.length; i += 4) { if (code[i] === 'relative') { relatives[code[i+1]] = i; code.splice(i, 4); i -= 4; } else if (code[i] === 'absolute-target') { - absoluteTargets[code[i+1]] = i; + absolutes[code[i+1]] = i; code.splice(i, 4); i -= 4; } } - // second pass, finalize jumps TODO: optimize jump->jump->x to jump->x + // second pass, find out which relative branches must be converted to absolutes, because they are too big + var needAbsolute = {}; // old relative id => new absolute id for (var i = 0; i < code.length; i += 4) { - if (code[i] in BRANCHES) { + if (code[i] in RELATIVE_BRANCHES) { + var id = code[i+2]; + var target = relatives[id]; + var offset = target - i; + var storedOffset = offset >> 2; // offsets are divisible by 4, so we ignore the lower bits + var maxOffset = storedOffset * 2; // when we convert relative to absolute, we double the size of a branch. + // so worst case, we may double offsets (TODO this could be optimized) + if ((maxOffset << 16 >> 16) !== maxOffset) { + if (!(id in needAbsolute)) { + var newId = absoluteId++; + needAbsolute[id] = newId; + delete relatives[id]; + absolutes[newId] = target; + } + } + } + } + // convert necessary relative branches to absolutes + for (var i = 0; i < code.length; i += 4) { + if (code[i] in RELATIVE_BRANCHES) { + var id = code[i+2]; + if (id in needAbsolute) { + code[i] += 'A'; // convert branch to absolute + code[i+2] = 0; // id is no longer needed + code.splice(i+4, 0, 'absolute-value', needAbsolute[id], 0, 0); // add absolute value after first part of branch inst + // we have added code, so we must adjust all relatives and absolutes + for (var x in relatives) { + if (relatives[x] >= i+4) relatives[x] += 4; + } + for (var x in absolutes) { + if (absolutes[x] >= i+4) absolutes[x] += 4; + } + } + } + } + // every instruction is now in its absolute location + mergeInto(absoluteTargets, absolutes); + // final pass, finalize relative jumps TODO: optimize jump->jump->x to jump->x + for (var i = 0; i < code.length; i += 4) { + if (code[i] in RELATIVE_BRANCHES) { var id = code[i+2]; var target = relatives[id]; assert(target !== undefined, id); From e07bcee0c0a8ab19771befff88fdff2b6afb5375 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 27 Sep 2014 12:59:11 -0700 Subject: [PATCH 247/461] absolute branch instrs --- tools/emterpretify.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 82d442624f9fc..d1ffed003b428 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -84,7 +84,10 @@ '159': 'BR', # [0, tl, th] jump t instructions (multiple of 4) '160': 'BRT', # [cond, tl, th] if cond, jump t instructions (multiple of 4) '161': 'BRF', # [cond, tl, th] if !cond, jump t instructions (multiple of 4) - #'170': 'ABR', # [lx, 0, 0, 0] absolute branch to address lx (assumed divisible by 4) + '169': 'BRA', # [0, 0, 0] [addr] jump to addr + '170': 'BRTA', # [cond, 0, 0] [addr] if cond, jump to addr + '171': 'BRFA', # [cond, 0, 0] [addr] if !cond, jump to addr + '200': 'GETTDP', # [l, 0, 0] l = tempDoublePtr #'201': 'GETPC', # [l, 0, 0] l = pc '202': 'GETTR0', # [l, 0, 0] l = tempRet0 @@ -208,7 +211,10 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['BR']] = 'pc = pc + ((inst >> 16) << 2) | 0; continue;' CASES[ROPCODES['BRT']] = 'if (' + get_coerced_access('lx') + ') { pc = pc + ((inst >> 16) << 2) | 0; continue; }' CASES[ROPCODES['BRF']] = 'if (!(' + get_coerced_access('lx') + ')) { pc = pc + ((inst >> 16) << 2) | 0; continue; }' -#CASES[ROPCODES['ABR']] = 'pc = ' + get_coerced_access('lx') + '; continue;' +CASES[ROPCODES['BRA']] = 'pc = HEAP32[pc + 4 >> 2] | 0; continue;' +CASES[ROPCODES['BRTA']] = 'if (' + get_coerced_access('lx') + ') { pc = HEAP32[pc + 4 >> 2] | 0; continue; }' +CASES[ROPCODES['BRFA']] = 'if (!(' + get_coerced_access('lx') + ')) { pc = HEAP32[pc + 4 >> 2] | 0; continue; }' + CASES[ROPCODES['GETTDP']] = 'HEAP32[sp + (lx << 3) >> 2] = tempDoublePtr;' #CASES[ROPCODES['GETPC']] = 'HEAP32[sp + (lx << 3) >> 2] = pc;' CASES[ROPCODES['GETTR0']] = 'HEAP32[sp + (lx << 3) >> 2] = tempRet0;' @@ -433,7 +439,10 @@ def process_code(func, code, absolute_targets): elif code[j] == 'absolute-value': # put the 32-bit absolute value of an abolute target here #print ' fixing absolute value', code[j+1], absolute_targets[unicode(code[j+1])], absolute_start + absolute_targets[unicode(code[j+1])] - value = bytify(absolute_start + absolute_targets[unicode(code[j+1])]) + absolute_value = absolute_start + absolute_targets[unicode(code[j+1])] + assert absolute_value < (1 << 31) + assert absolute_value % 4 == 0 + value = bytify(absolute_value) for k in range(4): code[j + k] = value[k] From 7364ab60dc1bbd9c90d44077b82299b83476ef98 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 27 Sep 2014 14:23:26 -0700 Subject: [PATCH 248/461] fix BRTA, BRFA --- tools/emterpretify.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index d1ffed003b428..3c248ee33bb23 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -212,8 +212,8 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['BRT']] = 'if (' + get_coerced_access('lx') + ') { pc = pc + ((inst >> 16) << 2) | 0; continue; }' CASES[ROPCODES['BRF']] = 'if (!(' + get_coerced_access('lx') + ')) { pc = pc + ((inst >> 16) << 2) | 0; continue; }' CASES[ROPCODES['BRA']] = 'pc = HEAP32[pc + 4 >> 2] | 0; continue;' -CASES[ROPCODES['BRTA']] = 'if (' + get_coerced_access('lx') + ') { pc = HEAP32[pc + 4 >> 2] | 0; continue; }' -CASES[ROPCODES['BRFA']] = 'if (!(' + get_coerced_access('lx') + ')) { pc = HEAP32[pc + 4 >> 2] | 0; continue; }' +CASES[ROPCODES['BRTA']] = 'pc = pc + 4 | 0; if (' + get_coerced_access('lx') + ') { pc = HEAP32[pc >> 2] | 0; continue; }' +CASES[ROPCODES['BRFA']] = 'pc = pc + 4 | 0; if (!(' + get_coerced_access('lx') + ')) { pc = HEAP32[pc >> 2] | 0; continue; }' CASES[ROPCODES['GETTDP']] = 'HEAP32[sp + (lx << 3) >> 2] = tempDoublePtr;' #CASES[ROPCODES['GETPC']] = 'HEAP32[sp + (lx << 3) >> 2] = pc;' @@ -438,8 +438,8 @@ def process_code(func, code, absolute_targets): code[j+1] = global_vars[target] elif code[j] == 'absolute-value': # put the 32-bit absolute value of an abolute target here - #print ' fixing absolute value', code[j+1], absolute_targets[unicode(code[j+1])], absolute_start + absolute_targets[unicode(code[j+1])] absolute_value = absolute_start + absolute_targets[unicode(code[j+1])] + #print ' fixing absolute value', code[j+1], absolute_targets[unicode(code[j+1])], absolute_value assert absolute_value < (1 << 31) assert absolute_value % 4 == 0 value = bytify(absolute_value) From 5ed44b3de546e665985c6a1fc6742c621b32f738 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 27 Sep 2014 15:13:13 -0700 Subject: [PATCH 249/461] add assertion --- tools/emterpretify.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 3c248ee33bb23..7070afc354f2b 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -452,6 +452,11 @@ def process_code(func, code, absolute_targets): if type(code[j]) in (str, unicode): code[j] = ROPCODES[code[j]] + # sanity checks + for i in range(len(code)): + v = code[i] + assert type(v) == int and v >= 0 and v < 256, [i, v, 'in', code] + actual_return_types = {} for i in range(len(lines)): From 2fd19fa39b5843958fa7778c35acc2c92ab814e5 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 27 Sep 2014 15:30:46 -0700 Subject: [PATCH 250/461] fix max locals assert, and use aggressive variable elimination to try to avoid hitting it --- tools/js-optimizer.js | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index a53b5f16fbb3a..11f754230f894 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6648,13 +6648,27 @@ function emterpretify(ast) { var locals = {}; var numLocals = 0; - for (var i in asmData.params) { - locals[i] = numLocals++; + + function parseLocals() { + locals = {}; + numLocals = 0; + for (var i in asmData.params) { + locals[i] = numLocals++; + } + for (var i in asmData.vars) { + locals[i] = numLocals++; + } } - for (var i in asmData.vars) { - locals[i] = numLocals++; + + parseLocals(); + if (numLocals >= 200) { + printErr(numLocals + ' locals in ' + func[1] + ', which is very high, trying to reduce'); + aggressiveVariableEliminationInternal(func, asmData); + parseLocals(); + printErr('number of locals is now ' + numLocals); + assert(numLocals <= 256, 'we need <= 256 locals'); } - assert(numLocals <= 256, [func[1], numLocals]); + for (var i = 255; i >= numLocals; i--) { freeLocals.push(i); } @@ -6702,7 +6716,7 @@ function emterpretify(ast) { if (code.length < 4 || code[code.length-4] != 'RET') { code.push('RET', 0, 0, 0); // final ret for the function } - assert(maxLocal <= 256); + assert(maxLocal < 255, 'too many locals ' + [maxLocal, numLocals]); // maximum local value is 255, for a total of 256 of them code = ['FUNC', maxLocal+1, func[2].length, 0].concat(code); verifyCode(code); From bb5a2689589bbf88cf4afda66fde24f4f0120dd8 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 27 Sep 2014 20:44:56 -0700 Subject: [PATCH 251/461] fix register loading in calls --- tools/emterpretify.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 7070afc354f2b..ba5d4cdd83db0 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -249,8 +249,8 @@ def make_target_call(i): ret = name if function_pointer_call: - ret += '[' + get_access('HEAP8[pc+4>>0]') + ' & %d]' % (next_power_of_two(asm.tables[name].count(',')+1)-1) - ret += '(' + ', '.join([get_coerced_access('HEAP8[pc+%d>>0]' % (i+4+int(function_pointer_call)), s=sig[i+1]) for i in range(len(sig)-1)]) + ')' + ret += '[' + get_access('HEAPU8[pc+4>>0]') + ' & %d]' % (next_power_of_two(asm.tables[name].count(',')+1)-1) + ret += '(' + ', '.join([get_coerced_access('HEAPU8[pc+%d>>0]' % (i+4+int(function_pointer_call)), s=sig[i+1]) for i in range(len(sig)-1)]) + ')' if sig[0] != 'v': ret = get_access('lx', sig[0]) + ' = ' + shared.JS.make_coercion(ret, sig[0]) elif name in actual_return_types and actual_return_types[name] != 'v': @@ -301,6 +301,7 @@ def fix_case(case): HEAPF64[sp + (ly << 3) >> 3] = +0; ly = ly + 1 | 0; } + //print('enter func ' + [pc, HEAPU8[pc + 0],HEAPU8[pc + 1],HEAPU8[pc + 2],HEAPU8[pc + 3],HEAPU8[pc + 4],HEAPU8[pc + 5],HEAPU8[pc + 6],HEAPU8[pc + 7]].join(', ')); while (1) { //print('last lx (' + lx + '): ' + [HEAP32[sp + (lx << 3) >> 2]|0, +HEAPF64[sp + (lx << 3) >> 3]]); pc = pc + 4 | 0; From fff563f3e867b173ea1ac18a32c6040a98460a04 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 27 Sep 2014 21:21:20 -0700 Subject: [PATCH 252/461] fix function enter initial loads --- tools/emterpretify.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index ba5d4cdd83db0..db623b3f265aa 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -293,10 +293,10 @@ def fix_case(case): var sp = 0, inst = 0, lx = 0, ly = 0, lz = 0; sp = EMTSTACKTOP; assert(((HEAPU8[pc>>0]>>>0) == %d)|0); - lx = HEAP8[pc + 1 >> 0] | 0; // num locals + lx = HEAPU8[pc + 1 >> 0] | 0; // num locals EMTSTACKTOP = EMTSTACKTOP + (lx << 3) | 0; assert(((EMTSTACKTOP|0) <= (EMT_STACK_MAX|0))|0); - ly = HEAP8[pc + 2 >> 0] | 0; + ly = HEAPU8[pc + 2 >> 0] | 0; while ((ly | 0) < (lx | 0)) { // clear the non-param locals HEAPF64[sp + (ly << 3) >> 3] = +0; ly = ly + 1 | 0; From 6dabe2baa278c8c4472ced9f6c2991c6b1b80111 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 28 Sep 2014 10:51:29 -0700 Subject: [PATCH 253/461] remove None hack --- tools/emterpretify.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index db623b3f265aa..d43d3db4dc99b 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -261,7 +261,7 @@ def make_target_call(i): return ' ' + ret + '; break;' CASES[ROPCODES['CALL']] = 'switch ((inst>>>16)|0) {\n' + \ - '\n'.join(filter(lambda x: 'None' not in x, [' case %d: {\n%s\n }' % (i, make_target_call(i)) for i in range(global_func_id)])) + \ + '\n'.join([' case %d: {\n%s\n }' % (i, make_target_call(i)) for i in range(global_func_id)]) + \ '\n default: assert(0);' + \ '\n }' @@ -271,7 +271,7 @@ def make_load(i): name = rglobal_vars[i] return ' ' + get_access('lx', sig[0]) + ' = ' + name + '; break;' CASES[ROPCODES['GETGLBI']] = 'switch (ly|0) {\n' + \ - '\n'.join(filter(lambda x: 'None' not in x, [' case %d: {\n%s\n }' % (i, make_load(i)) for i in range(global_var_id)])) + \ + '\n'.join([' case %d: {\n%s\n }' % (i, make_load(i)) for i in range(global_var_id)]) + \ '\n default: assert(0);' + \ '\n }' def make_store(i): @@ -279,7 +279,7 @@ def make_store(i): name = rglobal_vars[i] return ' ' + name + ' = ' + get_coerced_access('lz', sig[0]) + '; break;' CASES[ROPCODES['SETGLBI']] = 'switch ((inst >> 8)&255) {\n' + \ - '\n'.join(filter(lambda x: 'None' not in x, [' case %d: {\n%s\n }' % (i, make_store(i)) for i in range(global_var_id)])) + \ + '\n'.join([' case %d: {\n%s\n }' % (i, make_store(i)) for i in range(global_var_id)]) + \ '\n default: assert(0);' + \ '\n }' From 10f719d76152832eb13749cf979b878e831d16c0 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 28 Sep 2014 14:52:01 -0700 Subject: [PATCH 254/461] remove some unneded bytecode --- tools/js-optimizer.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 11f754230f894..5fb02005330f1 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6558,6 +6558,18 @@ function emterpretify(ast) { } function finalizeJumps(code) { + // pre pass, remove unreachable code + for (var i = 0; i < code.length; i += 4) { + if (code[i] === 'BR' || code[i] === 'BRA') { + var j = i + 4; + while (code[j] !== 'relative' && code[j] !== 'absolute-target') { + j += 4; + } + if (j > i + 4) { + code.splice(i + 4, j - i - 4); + } + } + } // first pass, collect and remove markers and absolute targets var relatives = {}; var absolutes = {}; From aed321b17c95f289c00fe6ea225f58e6a93abfb3 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 28 Sep 2014 15:01:14 -0700 Subject: [PATCH 255/461] skip over multiple non-conditional branches --- tools/js-optimizer.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 5fb02005330f1..135b4ddf4329e 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6584,6 +6584,28 @@ function emterpretify(ast) { i -= 4; } } + // optimization pass, skip over multiple jumps # TODO: clean up unreachable destinations after this + for (var i = 0; i < code.length; i += 4) { + if (code[i] === 'BR') { + while (1) { + var j = relatives[code[i+2]]; + if (code[j] === 'BR') { + code[i+2] = code[j+2]; + } else { + break; + } + } + } else if (code[i] === 'BRA') { + while (1) { + var j = absolutes[code[i+2]]; + if (code[j] === 'BRA') { + code[i+2] = code[j+2]; + } else { + break; + } + } + } + } // second pass, find out which relative branches must be converted to absolutes, because they are too big var needAbsolute = {}; // old relative id => new absolute id for (var i = 0; i < code.length; i += 4) { From 4c615b9df15dc48c8d0ac6929a6d320107da2fbf Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 28 Sep 2014 15:13:23 -0700 Subject: [PATCH 256/461] little cleanup --- tools/js-optimizer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 135b4ddf4329e..33d19a8a3f3d1 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6149,7 +6149,7 @@ function emterpretify(ast) { var address = node[2][1]; var shifts = Math.log2(temp.bits/8); assert(address === ((address << shifts) >> shifts)); - var ret = makeNum(address << shifts, ASM_INT, getFree()); + var ret = makeNum(address << shifts, ASM_INT); ret[1].push(opcode, ret[0], ret[0], 0); return ret; } From 20f5262c4c0eb224d52c2656f12b31935f4cce1b Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 28 Sep 2014 16:18:49 -0700 Subject: [PATCH 257/461] cleanup --- tools/js-optimizer.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 33d19a8a3f3d1..b9f60b222d342 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5867,11 +5867,12 @@ function emterpretify(ast) { var name = target[1]; if (name in locals) { // local + var l = locals[name]; var type = getAsmType(name, asmData); var reg = getReg(value, undefined, type); // TODO: detect when the last operation in reg[1] assigns in its arg x, in which case we can avoid the SET and make it assign to us - reg[1] = reg[1].concat(makeSet(locals[name], releaseIfFree(reg[0]), type)); - return [locals[name], reg[1]]; + reg[1] = reg[1].concat(makeSet(l, releaseIfFree(reg[0]), type)); + return [l, reg[1]]; } else { var reg = getReg(value); var opcode; From 3f0d4c6c34c554c32b151e8674b056b563f1ec11 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 28 Sep 2014 16:24:12 -0700 Subject: [PATCH 258/461] avoid a temporary just for an assignment to a local --- tools/js-optimizer.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index b9f60b222d342..7f63759df27ad 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5819,9 +5819,10 @@ function emterpretify(ast) { // returns [l, bytecode] where l is a local register, and bytecode is bytecode to generate it. // if dropIt is provided, then the output of this can just be dropped. + // if assignTo is provided, then it is where we can assign to, instead of allocating a free reg for that purpose. // you *must* call releaseIfFree on the l that is returned; if it is a free local, that will free it. - function getReg(node, dropIt, typeHint, signHint) { - //printErr('getReg ' + JSON.stringify(node) + ' : ' + astToSrc(node) + ' : ' + [dropIt, typeHint, signHint]); + function getReg(node, dropIt, typeHint, signHint, assignTo) { + //printErr('getReg ' + JSON.stringify(node) + ' : ' + astToSrc(node) + ' : ' + [dropIt, typeHint, signHint, assignTo]); switch(node[0]) { case 'name': { var name = node[1]; @@ -5850,7 +5851,7 @@ function emterpretify(ast) { } } case 'num': { - return makeNum(node[1], ASM_INT); + return makeNum(node[1], ASM_INT, assignTo); } case 'var': case 'toplevel': { @@ -5869,7 +5870,7 @@ function emterpretify(ast) { // local var l = locals[name]; var type = getAsmType(name, asmData); - var reg = getReg(value, undefined, type); + var reg = getReg(value, undefined, type, undefined, l); // TODO: detect when the last operation in reg[1] assigns in its arg x, in which case we can avoid the SET and make it assign to us reg[1] = reg[1].concat(makeSet(l, releaseIfFree(reg[0]), type)); return [l, reg[1]]; @@ -6170,6 +6171,7 @@ function emterpretify(ast) { } function makeSet(dst, src, type) { + if (dst === src) return []; var opcode; if (type === ASM_INT) { opcode = 'SET'; From ef3e65a00ec4077d2d3b766e5144d21c4907206f Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 28 Sep 2014 16:34:40 -0700 Subject: [PATCH 259/461] use assignTo in more places --- tools/js-optimizer.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 7f63759df27ad..05b4f92cc3972 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5807,6 +5807,9 @@ function emterpretify(ast) { function isFree(l) { return l >= numLocals; } + function getFreeOrAssignTo(assignTo) { + return assignTo >= 0 ? assignTo : getFree(); + } var relativeId = 0; var absoluteId = 0; @@ -5923,10 +5926,10 @@ function emterpretify(ast) { case 'binary': { if (node[1] === '|' && node[3][0] === 'num' && node[3][1] === 0) { // signed-coerced operation - return getReg(node[2], dropIt, ASM_INT, ASM_SIGNED); + return getReg(node[2], dropIt, ASM_INT, ASM_SIGNED, assignTo); } else if (node[1] === '>>>' && node[3][0] === 'num' && node[3][1] === 0) { // unsigned-coerced operation - return getReg(node[2], dropIt, ASM_INT, ASM_UNSIGNED); + return getReg(node[2], dropIt, ASM_INT, ASM_UNSIGNED, assignTo); } // not a simple coercion @@ -5967,21 +5970,21 @@ function emterpretify(ast) { case 'call': case 'sub': { // the coercion is part of the syntax of these appliedCoercion = true; - return getReg(inner, dropIt, ASM_DOUBLE, ASM_NONSIGNED); + return getReg(inner, dropIt, ASM_DOUBLE, ASM_NONSIGNED, assignTo); } case 'num': { appliedCoercion = true; - return makeNum(inner[1], ASM_DOUBLE); + return makeNum(inner[1], ASM_DOUBLE, assignTo); } case 'unary-prefix': { if (inner[1] === '-' && inner[2][0] === 'num') { appliedCoercion = true; - return makeNum(-inner[2][1], ASM_DOUBLE); + return makeNum(-inner[2][1], ASM_DOUBLE, assignTo); } // otherwise fall through } default: { - return getReg(inner, dropIt, ASM_DOUBLE, ASM_NONSIGNED); + return getReg(inner, dropIt, ASM_DOUBLE, ASM_NONSIGNED, assignTo); } } })(); @@ -6038,7 +6041,7 @@ function emterpretify(ast) { } else { assert(typeHint !== ASM_NONE); type = typeHint; - ret = getFree(); + ret = getFreeOrAssignTo(assignTo); } return [ret, makeCall(ret, node, type)]; } From 2b4d8a4433de29aeda11d479af352e28fff8f746 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 28 Sep 2014 16:47:36 -0700 Subject: [PATCH 260/461] use assignTo in yet more places --- tools/js-optimizer.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 05b4f92cc3972..8969847bef337 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5878,7 +5878,7 @@ function emterpretify(ast) { reg[1] = reg[1].concat(makeSet(l, releaseIfFree(reg[0]), type)); return [l, reg[1]]; } else { - var reg = getReg(value); + var reg = getReg(value, undefined, undefined, undefined, assignTo); var opcode; switch(name) { case 'STACKTOP': opcode = 'SETST'; break; @@ -5954,7 +5954,7 @@ function emterpretify(ast) { node[1] = node[1] === '>=' ? '<=' : '<'; } } - return makeBinary(node, type, sign); + return makeBinary(node, type, sign, assignTo); } default: throw 'ehh'; } @@ -6010,7 +6010,7 @@ function emterpretify(ast) { } return ret; } else if (node[1] === '~' && node[2][0] === 'unary-prefix' && node[2][1] === '~') { - return makeUnary(['unary-prefix', 'D2I', node[2][2]], ASM_INT, ASM_SIGNED); + return makeUnary(['unary-prefix', 'D2I', node[2][2]], ASM_INT, ASM_SIGNED, assignTo); } // not a simple coercion @@ -6019,15 +6019,15 @@ function emterpretify(ast) { switch (node[1]) { case '-': { if (node[2][0] === 'num') { - return makeNum(-node[2][1], ASM_INT); + return makeNum(-node[2][1], ASM_INT, assignTo); } // otherwise fall through } case '~': { var type = detectType(node[2], asmData); - return makeUnary(node, type, ASM_SIGNED); + return makeUnary(node, type, ASM_SIGNED, assignTo); } - case '!': return makeUnary(node, ASM_INT, ASM_SIGNED); + case '!': return makeUnary(node, ASM_INT, ASM_SIGNED, assignTo); default: throw 'ehh'; } throw 'todo'; @@ -6130,7 +6130,7 @@ function emterpretify(ast) { case 'seq': { var first = getReg(node[1], true); // first output is always dropped releaseIfFree(first[0]); - var second = getReg(node[2], dropIt); // second output might be dropped + var second = getReg(node[2], dropIt, undefined, undefined, assignTo); // second output might be dropped return [second[0], first[1].concat(second[1])]; } case 'sub': { @@ -6146,7 +6146,7 @@ function emterpretify(ast) { var bits = Math.pow(2, shifts)*8; assert(bits === temp.bits); var y = getReg(node[2][2], false, ASM_INT, ASM_SIGNED); - var x = getFree(y[0]); + var x = assignTo >= 0 ? assignTo : getFree(y[0]); y[1].push(opcode, x, releaseIfFree(y[0], x), 0); return [x, y[1]]; } else { @@ -6213,7 +6213,7 @@ function emterpretify(ast) { } } - function makeBinary(node, type, sign) { + function makeBinary(node, type, sign, assignTo) { var opcode; switch(node[1]) { case '+': { @@ -6297,13 +6297,13 @@ function emterpretify(ast) { } var y = getReg(node[2], undefined, type, sign); var z = getReg(node[3], undefined, type, sign); - var x = getFree(y[0], z[0]); + var x = assignTo >= 0 ? assignTo : getFree(y[0], z[0]); y[1] = y[1].concat(z[1]); y[1].push(opcode, x, releaseIfFree(y[0], x), releaseIfFree(z[0], x)); return [x, y[1]]; } - function makeUnary(node, type, sign) { + function makeUnary(node, type, sign, assignTo) { var opcode; switch(node[1]) { case '-': { @@ -6318,7 +6318,7 @@ function emterpretify(ast) { default: throw 'bad'; } var y = getReg(node[2]); - var x = getFree(y[0]); + var x = assignTo >= 0 ? assignTo : getFree(y[0]); y[1].push(opcode, x, releaseIfFree(y[0], x), 0); return [x, y[1]]; } From 071cd8985b965312543a17e466a79752120e0ef7 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 28 Sep 2014 19:22:26 -0700 Subject: [PATCH 261/461] split off primes benchmark to a separate file --- tests/primes.cpp | 32 ++++++++++++++++++++++++++++++++ tests/test_benchmark.py | 34 +--------------------------------- 2 files changed, 33 insertions(+), 33 deletions(-) create mode 100644 tests/primes.cpp diff --git a/tests/primes.cpp b/tests/primes.cpp new file mode 100644 index 0000000000000..1ab78806f8179 --- /dev/null +++ b/tests/primes.cpp @@ -0,0 +1,32 @@ +#include +#include +int main(int argc, char **argv) { + int arg = argc > 1 ? argv[1][0] - '0' : 3; + switch(arg) { + case 0: return 0; break; + case 1: arg = 33000; break; + case 2: arg = 130000; break; + case 3: arg = 220000; break; + case 4: arg = 610000; break; + case 5: arg = 1010000; break; + default: printf("error: %d\\n", arg); return -1; + } + + int primes = 0, curri = 2; + while (primes < arg) { + int ok = true; + for (int j = 2; j < sqrtf(curri); j++) { + if (curri % j == 0) { + ok = false; + break; + } + } + if (ok) { + primes++; + } + curri++; + } + printf("lastprime: %d.\n", curri-1); + return 0; +} + diff --git a/tests/test_benchmark.py b/tests/test_benchmark.py index 6bd8655df8b87..2dd2c2931cd75 100644 --- a/tests/test_benchmark.py +++ b/tests/test_benchmark.py @@ -212,39 +212,7 @@ def do_benchmark(self, name, src, expected_output='FAIL', args=[], emcc_args=[], b.display(benchmarkers[0]) def test_primes(self): - src = r''' - #include - #include - int main(int argc, char **argv) { - int arg = argc > 1 ? argv[1][0] - '0' : 3; - switch(arg) { - case 0: return 0; break; - case 1: arg = 33000; break; - case 2: arg = 130000; break; - case 3: arg = 220000; break; - case 4: arg = 610000; break; - case 5: arg = 1010000; break; - default: printf("error: %d\\n", arg); return -1; - } - - int primes = 0, curri = 2; - while (primes < arg) { - int ok = true; - for (int j = 2; j < sqrtf(curri); j++) { - if (curri % j == 0) { - ok = false; - break; - } - } - if (ok) { - primes++; - } - curri++; - } - printf("lastprime: %d.\n", curri-1); - return 0; - } - ''' + src = open(path_from_root('tests', 'primes.cpp')).read() self.do_benchmark('primes', src, 'lastprime:') def test_memops(self): From b2c3fc0bfd6218a06ef8fae10b0b7a549d7897b4 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 28 Sep 2014 19:31:17 -0700 Subject: [PATCH 262/461] add emterpreter codegen testing --- tests/test_other.py | 14 ++++++++++++++ tools/emterpretify.py | 4 +++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/tests/test_other.py b/tests/test_other.py index b48fe70c494a8..efa94246f966b 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4239,3 +4239,17 @@ def do_js_test(name, source, args, output): } ''', [], '0\n') + # codegen log tests + + def do_log_test(source, expected): + print 'log test', source, expected + try: + os.environ['EMCC_LOG_EMTERPRETER_CODE'] = '1' + out, err = Popen([PYTHON, EMCC, source, '-O3', '-s', 'EMTERPRETIFY=1'], stderr=PIPE).communicate() + finally: + del os.environ['EMCC_LOG_EMTERPRETER_CODE'] + seen = int(err.split('insts: ')[1]) + assert expected == seen, ['expect', expected, 'but see', seen] + + do_log_test(path_from_root('tests', 'primes.cpp'), 99) + diff --git a/tools/emterpretify.py b/tools/emterpretify.py index d43d3db4dc99b..ab6ff361cef55 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -13,6 +13,8 @@ EMT_STACK_MAX = 1024*1024 +LOG_CODE = os.environ.get('EMCC_LOG_EMTERPRETER_CODE') + # consts BLACKLIST = set(['_malloc', '_free', '_memcpy', '_memset', 'copyTempDouble', 'copyTempFloat', '_strlen', 'stackAlloc', 'setThrew', 'stackRestore', 'setTempRet0', 'getTempRet0', 'stackSave', 'runPostSets', '_emscripten_autodebug_double', '_emscripten_autodebug_float', '_emscripten_autodebug_i8', '_emscripten_autodebug_i16', '_emscripten_autodebug_i32', '_emscripten_autodebug_i64']) @@ -475,7 +477,7 @@ def process_code(func, code, absolute_targets): if curr is not None: assert len(curr) % 4 == 0, curr funcs[func] = len(all_code) # no operation here should change the length - #print >> sys.stderr, 'raw bytecode for %s:' % func, curr + if LOG_CODE: print >> sys.stderr, 'raw bytecode for %s:' % func, curr, 'insts:', len(curr)/4 process_code(func, curr, absolute_targets) #print >> sys.stderr, 'processed bytecode for %s:' % func, curr all_code += curr From a944df464514ef207996fde3c23270d073f13828 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 29 Sep 2014 13:46:48 -0700 Subject: [PATCH 263/461] refactor finalizeJumps, and remove dead code more aggressively --- tests/test_other.py | 2 +- tools/js-optimizer.js | 177 ++++++++++++++++++++++++------------------ 2 files changed, 104 insertions(+), 75 deletions(-) diff --git a/tests/test_other.py b/tests/test_other.py index efa94246f966b..0e7a9a6f659d0 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4251,5 +4251,5 @@ def do_log_test(source, expected): seen = int(err.split('insts: ')[1]) assert expected == seen, ['expect', expected, 'but see', seen] - do_log_test(path_from_root('tests', 'primes.cpp'), 99) + do_log_test(path_from_root('tests', 'primes.cpp'), 97) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 8969847bef337..ee2e00f7266e9 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5747,6 +5747,7 @@ function emterpretify(ast) { var BRANCHES = {}; mergeInto(BRANCHES, RELATIVE_BRANCHES); mergeInto(BRANCHES, ABSOLUTE_BRANCHES); + var UNCONDITIONAL_BRANCHES = set('BR', 'BRA'); var tempBuffer = new ArrayBuffer(8); var tempFloat64 = new Float64Array(tempBuffer); @@ -5765,7 +5766,7 @@ function emterpretify(ast) { if (code.length % 4 !== 0) assert(0, JSON.stringify(code)); var len = code.length; for (var i = 0; i < len; i++) { - if (typeof code[i] !== 'string' && typeof code[i] !== 'number') { + if (typeof code[i] !== 'string' && typeof code[i] !== 'number' && !(typeof code[i] === 'object' && code[i].what)) { assert(0, i + ' : ' + JSON.stringify(code)); } } @@ -5811,8 +5812,14 @@ function emterpretify(ast) { return assignTo >= 0 ? assignTo : getFree(); } - var relativeId = 0; + function getRelative(name) { + return { what: 'relative', name: name, uses: 0, replaceWith: null, id: -1 }; + } var absoluteId = 0; + function getAbsolute(name) { + return { what: 'absolute-target', name: name, uses: 0, replaceWith: null, id: absoluteId++ }; + } + var absoluteTargets = {}; var breakStack = []; @@ -6092,14 +6099,14 @@ function emterpretify(ast) { return [-1, ['BR', 0, continueLabels[label], 0]]; } case 'if': { - var exit = relativeId++; + var exit = getRelative('if-exit'); var condition = getReg(node[1]); var ret; if (!node[3]) { condition[1].push('BRF', releaseIfFree(condition[0]), exit, 0); ret = condition[1].concat(walkStatements(node[2])); } else { - var otherwise = relativeId++; + var otherwise = getRelative('if-else'); condition[1].push('BRF', releaseIfFree(condition[0]), otherwise, 0); ret = condition[1].concat(walkStatements(node[2])); ret.push('BR', 0, exit, 0, 'relative', otherwise, 0, 0); @@ -6111,7 +6118,7 @@ function emterpretify(ast) { case 'conditional': { // TODO: optimize // TODO: handle dropIt - var otherwise = relativeId++, exit = relativeId++; + var otherwise = getRelative('cond-else'), exit = getRelative('cond-exit'); var temp = getFree(); var condition = getReg(node[1]); var ret = condition[1]; @@ -6326,11 +6333,11 @@ function emterpretify(ast) { function makeDo(node, label) { var oneTime = node[1][0] === 'num' && node[1][1] === 0; // trivial one-time loops do {..} while(0) do not need condition handling // TODO: more testing assert(!oneTime); - var exit = relativeId++; + var exit = getRelative('do-exit'); var top, cond; if (!oneTime) { - top = relativeId++; - cond = relativeId++; + top = getRelative('do-top'); + cond = getRelative('do-cond'); } else { top = -1; // no need to even mark the top cond = exit; // when we reach the condition, we just exit @@ -6370,11 +6377,11 @@ function emterpretify(ast) { function makeWhile(node, label) { var infinite = node[1][0] === 'num' && node[1][1] === 1; // trivial infinite loops while(1) {..} do not need condition handling - var top = relativeId++, exit = relativeId++; + var top = getRelative('while-top'), exit = getRelative('while-exit'); var condition, cond; if (!infinite) { condition = getReg(node[1]); - cond = relativeId++; + cond = getRelative('while-cond'); } else { condition = [-1, []]; cond = top; // when we reach the condition, we just go right to the top of the loop body @@ -6407,7 +6414,7 @@ function emterpretify(ast) { function makeSwitch(node, label) { var condition = getReg(node[1]); - var exit = relativeId++; + var exit = getRelative('switch-exit'); // parse cases and emit code breakStack.push(exit); if (label) { @@ -6431,8 +6438,8 @@ function emterpretify(ast) { i: i, // original index id: id, code: walkStatements(c[1]), - absolute: absoluteId++, - relative: relativeId++, + absolute: getAbsolute('switch-case'), + relative: getRelative('switch-case'), next: -1 // will be the fall through target }; if (typeof id === 'number') { @@ -6463,8 +6470,8 @@ function emterpretify(ast) { // calculate values var range = maxx - minn + 1; assert(minn === (minn | 0) && range === (range | 0)); - var defaultAbsolute = data['default'] ? data['default'].absolute : absoluteId++; - var defaultrelative = data['default'] ? data['default'].relative : relativeId++; + var defaultAbsolute = data['default'] ? data['default'].absolute : getAbsolute('switch-default'); + var defaultrelative = data['default'] ? data['default'].relative : getRelative('switch-default'); // emit the switch instruction itself var tempMin = getFree(), tempRange = getFree(); var ret = condition[1].concat(makeNum(minn, ASM_INT, tempMin)[1]).concat(makeNum(range, ASM_INT, tempRange)[1]); @@ -6564,100 +6571,122 @@ function emterpretify(ast) { } function finalizeJumps(code) { - // pre pass, remove unreachable code - for (var i = 0; i < code.length; i += 4) { - if (code[i] === 'BR' || code[i] === 'BRA') { - var j = i + 4; - while (code[j] !== 'relative' && code[j] !== 'absolute-target') { - j += 4; - } - if (j > i + 4) { - code.splice(i + 4, j - i - 4); - } + /*function dump(name) { + printErr('=========='); + printErr(name); + printErr(JSON.stringify(code)); + printErr('=========='); + }*/ + // first pass, collect markers and absolute targets, and their uses + function getI(obj) { + var i = 0; + while (1) { // find the definition, ignoring uses + i = code.indexOf(obj, i); + assert(i >= 0); + if (code[i-1] === 'relative' || code[i-1] === 'absolute-target') return i-1; + i++; } } - // first pass, collect and remove markers and absolute targets - var relatives = {}; - var absolutes = {}; for (var i = 0; i < code.length; i += 4) { - if (code[i] === 'relative') { - relatives[code[i+1]] = i; - code.splice(i, 4); - i -= 4; - } else if (code[i] === 'absolute-target') { - absolutes[code[i+1]] = i; - code.splice(i, 4); - i -= 4; + if (code[i] in BRANCHES) { + code[i+2].uses++; + } else if (code[i] === 'absolute-value') { + assert(!(code[i-4] in ABSOLUTE_BRANCHES)); // would already be counted + code[i+1].uses++; } } - // optimization pass, skip over multiple jumps # TODO: clean up unreachable destinations after this - for (var i = 0; i < code.length; i += 4) { - if (code[i] === 'BR') { + // optimization pass, skip over multiple jumps + function trySkip(what, inst) { + // TODO: pass over a relative or absolute-target right here, we have not removed them yet XXX + if (code[i] === inst) { while (1) { - var j = relatives[code[i+2]]; - if (code[j] === 'BR') { + var j = getI(code[i+2]); + assert(code[j] === what); + j += 4; + if (code[j] === inst) { + code[i+2].uses--; + code[j+2].uses++; code[i+2] = code[j+2]; } else { break; } } - } else if (code[i] === 'BRA') { - while (1) { - var j = absolutes[code[i+2]]; - if (code[j] === 'BRA') { - code[i+2] = code[j+2]; - } else { - break; + } + } + for (var i = 0; i < code.length; i += 4) { + trySkip('relative', 'BR'); + trySkip('absolute-target', 'BRA'); + } + // optimization pass, remove unreachable code + for (var i = 0; i < code.length; i += 4) { + if (code[i] in UNCONDITIONAL_BRANCHES) { + var j = i + 4; // normal forward control flow cannot reach this position + while (j < code.length) { + if (code[j] === 'relative' || code[j] === 'absolute-target') { + var uses = code[j+1].uses; + assert(uses >= 0); + if (uses > 0) break; // this is reachable } + j += 4; // this instr is unreachable + } + if (j > i + 4) { + code.splice(i + 4, j - i - 4); } } } // second pass, find out which relative branches must be converted to absolutes, because they are too big - var needAbsolute = {}; // old relative id => new absolute id for (var i = 0; i < code.length; i += 4) { if (code[i] in RELATIVE_BRANCHES) { - var id = code[i+2]; - var target = relatives[id]; - var offset = target - i; + var obj = code[i+2]; + var target = getI(obj); + var offset = target - i; // overestimate, since there are still 'relative' and 'absolute-target' that will be cleaned up var storedOffset = offset >> 2; // offsets are divisible by 4, so we ignore the lower bits var maxOffset = storedOffset * 2; // when we convert relative to absolute, we double the size of a branch. // so worst case, we may double offsets (TODO this could be optimized) if ((maxOffset << 16 >> 16) !== maxOffset) { - if (!(id in needAbsolute)) { - var newId = absoluteId++; - needAbsolute[id] = newId; - delete relatives[id]; - absolutes[newId] = target; - } + obj.replaceWith = getAbsolute('relative-replacement'); } } } // convert necessary relative branches to absolutes for (var i = 0; i < code.length; i += 4) { if (code[i] in RELATIVE_BRANCHES) { - var id = code[i+2]; - if (id in needAbsolute) { + var obj = code[i+2]; + if (obj.replaceWith) { code[i] += 'A'; // convert branch to absolute - code[i+2] = 0; // id is no longer needed - code.splice(i+4, 0, 'absolute-value', needAbsolute[id], 0, 0); // add absolute value after first part of branch inst - // we have added code, so we must adjust all relatives and absolutes - for (var x in relatives) { - if (relatives[x] >= i+4) relatives[x] += 4; - } - for (var x in absolutes) { - if (absolutes[x] >= i+4) absolutes[x] += 4; - } + code[i+2] = 0; // id is no longer needed, 4 extra bytes in the inst will contain the absolute value + code.splice(i+4, 0, 'absolute-value', obj.replaceWith, 0, 0); // add absolute value after first part of branch inst + obj.replaceWith.uses++; } } } - // every instruction is now in its absolute location - mergeInto(absoluteTargets, absolutes); + // remove relative and absolute placeholders, after which every instruction is now in its absolute location, and we can write out absolutes + for (var i = 0; i < code.length; i += 4) { + if (code[i] === 'relative') { + code[i+1].id = i; // store the i position in the id + assert(i == getI(code[i+1])); + code.splice(i, 4); + i -= 4; + } else if (code[i] === 'absolute-target') { + var obj = code[i+1]; + if (obj.uses > 0) { + absoluteTargets[obj.id] = i; + } + code.splice(i, 4); + i -= 4; + } else if (code[i] === 'absolute-value') { + var obj = code[i+1]; + assert(obj.uses > 0); + code[i+1] = obj.id; + } + } // final pass, finalize relative jumps TODO: optimize jump->jump->x to jump->x for (var i = 0; i < code.length; i += 4) { if (code[i] in RELATIVE_BRANCHES) { - var id = code[i+2]; - var target = relatives[id]; - assert(target !== undefined, id); + var obj = code[i+2]; + assert(!obj.replaceWith); + var target = obj.id; + assert(target >= 0); var offset = target - i; assert(offset % 4 === 0); offset >>= 2; From b14ff51b8edd55b730dff9e423c5933d1cfaae68 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 29 Sep 2014 13:47:37 -0700 Subject: [PATCH 264/461] streamline benchmarking --- tests/test_benchmark.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/test_benchmark.py b/tests/test_benchmark.py index 2dd2c2931cd75..9b86dcc1af5d2 100644 --- a/tests/test_benchmark.py +++ b/tests/test_benchmark.py @@ -12,7 +12,7 @@ # 5: 10 seconds DEFAULT_ARG = '2' -TEST_REPS = 2 +TEST_REPS = 1 CORE_BENCHMARKS = True # core benchmarks vs full regression suite @@ -113,8 +113,8 @@ def process(filename): '-s', 'TOTAL_MEMORY=128*1024*1024', '--profiling', #'--closure', '1', - #'-o', final] + shared_args + emcc_args + self.extra_args, stdout=PIPE, stderr=PIPE, env=self.env).communicate() - '-o', final] + shared_args + emcc_args + self.extra_args, stdout=None, stderr=None, env=self.env).communicate() + '-o', final] + shared_args + emcc_args + self.extra_args, stdout=PIPE, stderr=PIPE, env=self.env).communicate() + #'-o', final] + shared_args + emcc_args + self.extra_args, stdout=None, stderr=None, env=self.env).communicate() assert os.path.exists(final), 'Failed to compile file: ' + output[0] self.filename = final @@ -141,7 +141,7 @@ def run(self, args): #NativeBenchmarker('clang-3.4', os.path.join(LLVM_3_4, 'clang'), os.path.join(LLVM_3_4, 'clang++')), #NativeBenchmarker('gcc', 'gcc', 'g++'), #JSBenchmarker('sm-f32', SPIDERMONKEY_ENGINE, ['-s', 'PRECISE_F32=2']), - #JSBenchmarker('sm', SPIDERMONKEY_ENGINE), + JSBenchmarker('sm', SPIDERMONKEY_ENGINE), #JSBenchmarker('sm-ion', SPIDERMONKEY_ENGINE + ['--no-asmjs']), #JSBenchmarker('sm-baseline', SPIDERMONKEY_ENGINE + ['--no-asmjs', '--no-ion']), JSBenchmarker('sm-emterp', SPIDERMONKEY_ENGINE, ['-s', 'EMTERPRETIFY=1']), @@ -345,7 +345,7 @@ def test_copy(self): ''' self.do_benchmark('copy', src, 'sum:') - def test_ifs(self): + def zzztest_ifs(self): src = r''' #include #include @@ -390,7 +390,7 @@ def test_ifs(self): ''' self.do_benchmark('ifs', src, 'ok', reps=TEST_REPS*5) - def test_conditionals(self): + def zzztest_conditionals(self): src = r''' #include #include From 3553056c6460c1b83806190a615048a274b51451 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 29 Sep 2014 17:15:26 -0700 Subject: [PATCH 265/461] optimize conditions to remove comparisons to zero and coercions, where possible --- tests/test_other.py | 2 +- tools/js-optimizer.js | 65 +++++++++++++++------- tools/test-js-optimizer-asm-last-output.js | 14 +++++ tools/test-js-optimizer-asm-last.js | 18 +++++- 4 files changed, 77 insertions(+), 22 deletions(-) diff --git a/tests/test_other.py b/tests/test_other.py index 0e7a9a6f659d0..56c6f91a52f28 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4251,5 +4251,5 @@ def do_log_test(source, expected): seen = int(err.split('insts: ')[1]) assert expected == seen, ['expect', expected, 'but see', seen] - do_log_test(path_from_root('tests', 'primes.cpp'), 97) + do_log_test(path_from_root('tests', 'primes.cpp'), 96) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index ee2e00f7266e9..c786da37bcf0b 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -149,6 +149,8 @@ var CONTINUE_CAPTURERS = LOOP; var COMMABLE = set('assign', 'binary', 'unary-prefix', 'unary-postfix', 'name', 'num', 'call', 'seq', 'conditional', 'sub'); +var CONDITION_CHECKERS = set('if', 'do', 'while', 'switch'); + var FUNCTIONS_THAT_ALWAYS_THROW = set('abort', '___resumeException', '___cxa_throw', '___cxa_rethrow'); var UNDEFINED_NODE = ['unary-prefix', 'void', ['num', 0]]; @@ -741,22 +743,6 @@ function simplifyExpressions(ast) { } } - // if (x === 0) can be if (!x), etc. - function simplifyZeroComp(ast) { - traverse(ast, function(node, type) { - var binary; - if (type === 'if' && (binary = node[1])[0] === 'binary') { - if ((binary[1] === '!=' || binary[1] === '!==') && binary[3][0] === 'num' && binary[3][1] === 0) { - node[1] = binary[2]; - return node; - } else if ((binary[1] === '==' || binary[1] === '===') && binary[3][0] === 'num' && binary[3][1] === 0) { - node[1] = ['unary-prefix', '!', binary[2]]; - return node; - } - } - }); - } - function emitsBoolean(node) { if (node[0] === 'num') { return node[1] === 0 || node[1] === 1; @@ -824,7 +810,6 @@ function simplifyExpressions(ast) { simplifyOps(func); simplifyNotComps(func); conditionalize(func); - // simplifyZeroComp(func); TODO: investigate performance }); } @@ -1407,6 +1392,43 @@ function simplifyNotCompsDirect(node) { if (!simplifyNotCompsPass) return node; } +var SAFE_TO_DROP_COERCION = set('unary-prefix', 'name', 'num'); + +function canDropCoercion(node) { + if (node[0] in SAFE_TO_DROP_COERCION) return true; + if (node[0] === 'binary') { + switch (node[1]) { + case '>>': case '>>>': case '<<': case '|': case '^': case '&': return true; + } + } + return false; +} + +function simplifyCondition(node) { + node = simplifyNotCompsDirect(node); + // on integers, if (x == 0) is the same as if (x), and if (x != 0) as if (!x) + if (node[0] === 'binary' && (node[1] === '==' || node[1] === '!=')) { + var target = null; + if (detectType(node[2]) === ASM_INT && node[3][0] === 'num' && node[3][1] === 0) { + target = node[2]; + } else if (detectType(node[3]) === ASM_INT && node[2][0] === 'num' && node[2][1] === 0) { + target = node[3]; + } + if (target) { + if (target[0] === 'binary' && (target[1] === '|' || target[1] === '>>>') && target[3][0] === 'num' && target[3][1] === 0 && + canDropCoercion(target[2])) { + target = target[2]; // drop the coercion, in a condition it is ok to do if (x) + } + if (node[1] === '==') { + return ['unary-prefix', '!', target]; + } else { + return target; + } + } + } + return node; +} + function flipCondition(cond) { return simplifyNotCompsDirect(['unary-prefix', '!', cond]); } @@ -1859,7 +1881,7 @@ function detectType(node, asmInfo, inVarDef) { } case 'call': { if (node[1][0] === 'name' && node[1][1] === 'Math_fround') return ASM_FLOAT; - break; + return ASM_NONE; } case 'name': { if (asmInfo) { @@ -1881,7 +1903,7 @@ function detectType(node, asmInfo, inVarDef) { case 'binary': { switch (node[1]) { case '+': case '-': return detectType(node[2], asmInfo, inVarDef); - case '*': case '/': return ASM_DOUBLE; // uncoerced by |0 etc., these ops are double + case '*': case '/': case '%': return ASM_DOUBLE; // uncoerced by |0 etc., these ops are double case '|': case '&': case '^': case '<<': case '>>': case '>>>': case '==': case '!=': case '<': case '<=': case '>': case '>=': { return ASM_INT; @@ -1894,7 +1916,7 @@ function detectType(node, asmInfo, inVarDef) { } case 'sub': { assert(node[1][0] === 'name'); - assert(parseHeap(node[1][1])); + if (!parseHeap(node[1][1])) return ASM_NONE; return parseHeapTemp.float ? ASM_DOUBLE : ASM_INT; // XXX ASM_FLOAT? } } @@ -6831,6 +6853,9 @@ function asmLastOpts(ast) { traverse(fun, function(node, type) { var stats = getStatements(node); if (stats) statsStack.push(stats); + if (type in CONDITION_CHECKERS) { + node[1] = simplifyCondition(node[1]); + } if (type === 'while' && node[1][0] === 'num' && node[1][1] === 1 && node[2][0] === 'block' && node[2].length == 2) { // This is at the end of the pipeline, we can assume all other optimizations are done, and we modify loops // into shapes that might confuse other passes diff --git a/tools/test-js-optimizer-asm-last-output.js b/tools/test-js-optimizer-asm-last-output.js index 1d1b03fb7b27a..220407f422768 100644 --- a/tools/test-js-optimizer-asm-last-output.js +++ b/tools/test-js-optimizer-asm-last-output.js @@ -86,4 +86,18 @@ function looop() { } else other(); if (a) if (a) waka(); else wala(); else other(); } +function conditions() { + if (HEAP32[$incdec_ptr71_i + 8 >> 2] | 0) shoo(); + if (x == 0) y(); + if (!x) y(); + if (!y) z(); + if (x != 0) y(); + if (x) y(); + if (y) z(); + if (x) y(); + if (!x) y(); + if (!(s() | 0)) z(); + if (x + 4 | 0) y(); + if (x & 4) y(); +} diff --git a/tools/test-js-optimizer-asm-last.js b/tools/test-js-optimizer-asm-last.js index f6609731cf585..1a30066ddc1a0 100644 --- a/tools/test-js-optimizer-asm-last.js +++ b/tools/test-js-optimizer-asm-last.js @@ -125,5 +125,21 @@ function looop() { if (a) { if (a) { waka(); } } else { other(); } if (a) { if (a) { waka(); } else { wala(); } } else { other(); } } -// EMSCRIPTEN_GENERATED_FUNCTIONS: ["finall", "looop"] +function conditions() { + if (!((HEAP32[$incdec_ptr71_i + 8 >> 2] | 0) == 0)) { + shoo(); + } + if (x == 0) y(); + if ((x | 0) == 0) y(); + if (0 == (y | 0)) z(); + if (x != 0) y(); + if ((x | 0) != 0) y(); + if (0 != (y | 0)) z(); + if (!((x | 0) == 0)) y(); + if (!(0 != (x | 0))) y(); + if (!(s() | 0)) z(); + if ((x + 4 | 0) != 0) y(); + if ((x & 4 | 0) != 0) y(); +} +// EMSCRIPTEN_GENERATED_FUNCTIONS: ["finall", "looop", "conditions"] From 4f1c2df9716eafcd45e5741539baa8a6420e510e Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 29 Sep 2014 15:34:14 -0700 Subject: [PATCH 266/461] refactor simplifyNotCompsDirect --- tools/js-optimizer.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index c786da37bcf0b..a03a61145a62c 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1373,8 +1373,7 @@ function optimizeShiftsAggressive(ast) { function simplifyNotCompsDirect(node) { if (node[0] === 'unary-prefix' && node[1] === '!') { // de-morgan's laws do not work on floats, due to nans >:( - if (node[2][0] === 'binary' && (!asm || (((node[2][2][0] === 'binary' && node[2][2][1] === '|') || node[2][2][0] === 'num') && - ((node[2][3][0] === 'binary' && node[2][3][1] === '|') || node[2][3][0] === 'num')))) { + if (node[2][0] === 'binary' && (!asm || (detectType(node[2][2]) === ASM_INT && detectType(node[2][3]) === ASM_INT))) { switch(node[2][1]) { case '<': return ['binary', '>=', node[2][2], node[2][3]]; case '>': return ['binary', '<=', node[2][2], node[2][3]]; From 21d258f3290d2eb5478023eaa0089405b0d282eb Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 29 Sep 2014 17:43:06 -0700 Subject: [PATCH 267/461] fix static static bump calculation --- emscripten.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emscripten.py b/emscripten.py index b6abcaa24096d..3f6d8408cd542 100755 --- a/emscripten.py +++ b/emscripten.py @@ -882,7 +882,7 @@ def save_settings(): global_initializers = ', '.join(map(lambda i: '{ func: function() { %s() } }' % i, metadata['initializers'])) staticbump = mem_init.count(',')+1 - while staticbump % 8 != 0: staticbump += 1 + while staticbump % 16 != 0: staticbump += 1 pre = pre.replace('STATICTOP = STATIC_BASE + 0;', '''STATICTOP = STATIC_BASE + %d; /* global initializers */ __ATINIT__.push(%s); %s''' % (staticbump, global_initializers, mem_init)) # XXX wrong size calculation! From 91df011798e5c25d2a2fd85eeebb3cf3e658bd01 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 29 Sep 2014 18:05:49 -0700 Subject: [PATCH 268/461] option to shuffle opcodes --- tools/emterpretify.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index ab6ff361cef55..8ef770892f789 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -105,6 +105,18 @@ '255': 'FUNC', # [total locals, num params, 0] function with n locals (each taking 64 bits), of which the first are params } +def randomize_opcodes(): + global OPCODES + keys = OPCODES.keys() + import random + random.shuffle(keys) + copy = OPCODES + OPCODES = {} + for k in range(len(keys)): + OPCODES[k] = copy[keys[k]] + print OPCODES +#randomize_opcodes() + assert len(OPCODES.values()) == len(set(OPCODES.values())) # no dupe names ROPCODES = {} From 9af8a755836b132b100180f48f2f2d812c32344d Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 29 Sep 2014 20:20:39 -0700 Subject: [PATCH 269/461] optimize jump skipping --- tests/test_other.py | 2 +- tools/js-optimizer.js | 15 +++++---------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/tests/test_other.py b/tests/test_other.py index 56c6f91a52f28..1d972f243075c 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4251,5 +4251,5 @@ def do_log_test(source, expected): seen = int(err.split('insts: ')[1]) assert expected == seen, ['expect', expected, 'but see', seen] - do_log_test(path_from_root('tests', 'primes.cpp'), 96) + do_log_test(path_from_root('tests', 'primes.cpp'), 95) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index a03a61145a62c..d1c01bb009d7b 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6617,14 +6617,13 @@ function emterpretify(ast) { } } // optimization pass, skip over multiple jumps - function trySkip(what, inst) { - // TODO: pass over a relative or absolute-target right here, we have not removed them yet XXX - if (code[i] === inst) { + for (var i = 0; i < code.length; i += 4) { + if (code[i] in RELATIVE_BRANCHES) { while (1) { var j = getI(code[i+2]); - assert(code[j] === what); - j += 4; - if (code[j] === inst) { + assert(code[j] === 'relative'); + while (code[j] === 'relative' || code[j] === 'absolute-target') j += 4; // jump over all NOPs here + if (code[j] === 'BR') { code[i+2].uses--; code[j+2].uses++; code[i+2] = code[j+2]; @@ -6634,10 +6633,6 @@ function emterpretify(ast) { } } } - for (var i = 0; i < code.length; i += 4) { - trySkip('relative', 'BR'); - trySkip('absolute-target', 'BRA'); - } // optimization pass, remove unreachable code for (var i = 0; i < code.length; i += 4) { if (code[i] in UNCONDITIONAL_BRANCHES) { From 08f668e141ed825acc8c3ae6256f9901d270bf87 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 30 Sep 2014 10:44:11 -0700 Subject: [PATCH 270/461] disable an invalid test in the emterpreter --- tests/test_core.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_core.py b/tests/test_core.py index 8777ba222f089..170d9bcf44248 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -5596,6 +5596,7 @@ def test_cases(self): 'quoted', # current fastcomp limitations FIXME 'atomicrmw_unaligned', # TODO XXX ]: continue + if self.is_emterpreter() and os.path.basename(shortname) in ['funcptr']: continue # test writes to memory we store out bytecode! test is invalid if os.path.basename(shortname) in need_no_leave_inputs_raw: if self.run_name.startswith('s_'): From 1251ad28e99b8e636a9e1664def06a189454d696 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 30 Sep 2014 10:54:47 -0700 Subject: [PATCH 271/461] avoid infinite loops in jump skipping --- tools/js-optimizer.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index d1c01bb009d7b..e761c0faff54b 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6617,13 +6617,17 @@ function emterpretify(ast) { } } // optimization pass, skip over multiple jumps + function skipNOPs(i) { + while (code[i] === 'relative' || code[i] === 'absolute-target') i += 4; // jump over all NOPs here + return i; + } for (var i = 0; i < code.length; i += 4) { if (code[i] in RELATIVE_BRANCHES) { while (1) { var j = getI(code[i+2]); assert(code[j] === 'relative'); - while (code[j] === 'relative' || code[j] === 'absolute-target') j += 4; // jump over all NOPs here - if (code[j] === 'BR') { + j = skipNOPs(j); + if (code[j] === 'BR' && code[i+2] !== code[j+2]) { code[i+2].uses--; code[j+2].uses++; code[i+2] = code[j+2]; From c99774abcd15b6a3356f85e023cc6b9ceba3c92e Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 30 Sep 2014 11:08:18 -0700 Subject: [PATCH 272/461] pack opcodes --- tools/emterpretify.py | 179 ++++++++++++++++++++---------------------- 1 file changed, 87 insertions(+), 92 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 8ef770892f789..c1301bdc1cf73 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -19,109 +19,104 @@ BLACKLIST = set(['_malloc', '_free', '_memcpy', '_memset', 'copyTempDouble', 'copyTempFloat', '_strlen', 'stackAlloc', 'setThrew', 'stackRestore', 'setTempRet0', 'getTempRet0', 'stackSave', 'runPostSets', '_emscripten_autodebug_double', '_emscripten_autodebug_float', '_emscripten_autodebug_i8', '_emscripten_autodebug_i16', '_emscripten_autodebug_i32', '_emscripten_autodebug_i64']) -OPCODES = { # l, lx, ly etc - one of 256 locals - '0': 'SET', # [lx, ly, 0] lx = ly (int or float, not double) - '1': 'GETST', # [l, 0, 0] l = STACKTOP - '2': 'SETST', # [l, 0, 0] STACKTOP = l - '3': 'SETVI', # [l, vl, vh] l = v (16-bit signed int) - '4': 'SETVIB', # [l, 0, 0] [..v..] l = 32-bit int in next 32-bit instruction - '5': 'ADD', # [lx, ly, lz] lx = ly + lz (32-bit int) - '6': 'SUB', # [lx, ly, lz] lx = ly - lz (32-bit int) - '7': 'MUL', # [lx, ly, lz] lx = ly * lz (32-bit int) - '8': 'SDIV', # [lx, ly, lz] lx = ly / lz (32-bit signed int) - '9': 'UDIV', # [lx, ly, lz] lx = ly / lz (32-bit unsigned int) - '10': 'SMOD', # [lx, ly, lz] lx = ly % lz (32-bit signed int) - '11': 'UMOD', # [lx, ly, lz] lx = ly % lz (32-bit unsigned int) - '12': 'NEG', # [lx, ly, 0] lx = -ly (int) - '13': 'LNOT', # [lx, ly, 0] ly = !ly (int) - '14': 'BNOT', # [lx, ly, 0] ly = ~ly (int) - '18': 'EQ', # [lx, ly, lz] lx = ly == lz (32-bit int) - '19': 'NE', # [lx, ly, lz] lx = ly != lz (32-bit int) - '20': 'SLT', # [lx, ly, lz] lx = ly < lz (32-bit signed) - '21': 'ULT', # [lx, ly, lz] lx = ly < lz (32-bit unsigned) - '22': 'SLE', # [lx, ly, lz] lx = ly <= lz (32-bit signed) - '23': 'ULE', # [lx, ly, lz] lx = ly <= lz (32-bit unsigned) - '30': 'AND', # [lx, ly, lz] lx = ly & lz - '31': 'OR', # [lx, ly, lz] lx = ly | lz - '32': 'XOR', # [lx, ly, lz] lx = ly ^ lz - '40': 'SHL', # [lx, ly, lz] lx = ly << lz - '41': 'ASHR', # [lx, ly, lz] lx = ly >> lz - '42': 'LSHR', # [lx, ly, lz] lx = ly >>> lz - - '60': 'SETD', # [lx, ly, lz] lx = ly (double) - '61': 'SETVD', # [lx, vl, vh] lx = ly (16 bit signed int, converted into double) - '62': 'SETVDI', # [lx, 0, 0] [..v..] lx = v (32 bit signed int, converted into double) - '63': 'SETVDF', # [lx, 0, 0] [..v..] lx = v (32 bit float, converted into double) - '64': 'SETVDD', # [lx, 0, 0][.v.][.v.] lx = v (64 bit double) - '65': 'ADDD', # [lx, ly, lz] lx = ly + lz (double) - '66': 'SUBD', # [lx, ly, lz] lx = ly - lz (double) - '67': 'MULD', # [lx, ly, lz] lx = ly * lz (double) - '69': 'DIVD', # [lx, ly, lz] lx = ly / lz (double) - '70': 'MODD', # [lx, ly, lz] lx = ly % lz (double) - '72': 'NEGD', # [lx, ly, 0] lx = -ly (double) - '78': 'EQD', # [lx, ly, lz] lx = ly == lz (double) - '79': 'NED', # [lx, ly, lz] lx = ly != lz (double) - '80': 'LTD', # [lx, ly, lz] lx = ly < lz (signed) - '81': 'LED', # [lx, ly, lz] lx = ly < lz (double) - '82': 'GTD', # [lx, ly, lz] lx = ly <= lz (double) - '83': 'GED', # [lx, ly, lz] lx = ly <= lz (double) - '90': 'D2I', # [lx, ly, 0] lx = ~~ly (double-to-int) - '91': 'SI2D', # [lx, ly, 0] lx = +ly (signed int-to-double) - '92': 'UI2D', # [lx, ly, 0] lx = +ly (unsigned int-to-double) - - '100': 'LOAD8', # [lx, ly, 0] lx = HEAP8[ly >> 0] - '101': 'LOADU8', # [lx, ly, 0] lx = HEAPU8[ly >> 0] - '110': 'LOAD16', # [lx, ly, 0] lx = HEAP16[ly >> 1] - '111': 'LOADU16', # [lx, ly, 0] lx = HEAPU16[ly >> 1] - '120': 'LOAD32', # [lx, ly, 0] lx = HEAP32[ly >> 2] - no need for unsigned version, this is set to a register anyhow - '130': 'STORE8', # [lx, ly, 0] HEAP8[lx >> 2] = ly - '140': 'STORE16', # [lx, ly, 0] HEAP16[lx >> 2] = ly - '150': 'STORE32', # [lx, ly, 0] HEAP32[lx >> 2] = ly - - '151': 'LOADF64', # [lx, ly, 0] lx = HEAPF64[ly >> 3] - '152': 'STOREF64', # [lx, ly, 0] HEAPF64[lx >> 3] = ly - '153': 'LOADF32', # [lx, ly, 0] lx = HEAPF32[ly >> 3] - '154': 'STOREF32', # [lx, ly, 0] HEAPF32[lx >> 3] = ly - - '159': 'BR', # [0, tl, th] jump t instructions (multiple of 4) - '160': 'BRT', # [cond, tl, th] if cond, jump t instructions (multiple of 4) - '161': 'BRF', # [cond, tl, th] if !cond, jump t instructions (multiple of 4) - '169': 'BRA', # [0, 0, 0] [addr] jump to addr - '170': 'BRTA', # [cond, 0, 0] [addr] if cond, jump to addr - '171': 'BRFA', # [cond, 0, 0] [addr] if !cond, jump to addr - - '200': 'GETTDP', # [l, 0, 0] l = tempDoublePtr - #'201': 'GETPC', # [l, 0, 0] l = pc - '202': 'GETTR0', # [l, 0, 0] l = tempRet0 - '203': 'SETTR0', # [l, 0, 0] tempRet0 = l - '240': 'GETGLBI', # [l, vl, vh] get global value, int, indexed by v - '241': 'GETGLBD', # [l, vl, vh] get global value, double, indexed by v - '245': 'SETGLBI', # [vl, vh, l] set global value, int, indexed by v (v = l) - '250': 'CALL', # [lx, targetl, targeth] [params...] (lx = ) target(params..) lx's existence and type depend on the target's actual callsig; +OPCODES = [ # l, lx, ly etc - one of 256 locals + 'SET', # [lx, ly, 0] lx = ly (int or float, not double) + 'GETST', # [l, 0, 0] l = STACKTOP + 'SETST', # [l, 0, 0] STACKTOP = l + 'SETVI', # [l, vl, vh] l = v (16-bit signed int) + 'SETVIB', # [l, 0, 0] [..v..] l = 32-bit int in next 32-bit instruction + + 'ADD', # [lx, ly, lz] lx = ly + lz (32-bit int) + 'SUB', # [lx, ly, lz] lx = ly - lz (32-bit int) + 'MUL', # [lx, ly, lz] lx = ly * lz (32-bit int) + 'SDIV', # [lx, ly, lz] lx = ly / lz (32-bit signed int) + 'UDIV', # [lx, ly, lz] lx = ly / lz (32-bit unsigned int) + 'SMOD', # [lx, ly, lz] lx = ly % lz (32-bit signed int) + 'UMOD', # [lx, ly, lz] lx = ly % lz (32-bit unsigned int) + 'NEG', # [lx, ly, 0] lx = -ly (int) + 'LNOT', # [lx, ly, 0] ly = !ly (int) + 'BNOT', # [lx, ly, 0] ly = ~ly (int) + 'EQ', # [lx, ly, lz] lx = ly == lz (32-bit int) + 'NE', # [lx, ly, lz] lx = ly != lz (32-bit int) + 'SLT', # [lx, ly, lz] lx = ly < lz (32-bit signed) + 'ULT', # [lx, ly, lz] lx = ly < lz (32-bit unsigned) + 'SLE', # [lx, ly, lz] lx = ly <= lz (32-bit signed) + 'ULE', # [lx, ly, lz] lx = ly <= lz (32-bit unsigned) + 'AND', # [lx, ly, lz] lx = ly & lz + 'OR', # [lx, ly, lz] lx = ly | lz + 'XOR', # [lx, ly, lz] lx = ly ^ lz + 'SHL', # [lx, ly, lz] lx = ly << lz + 'ASHR', # [lx, ly, lz] lx = ly >> lz + 'LSHR', # [lx, ly, lz] lx = ly >>> lz + + 'SETD', # [lx, ly, lz] lx = ly (double) + 'SETVD', # [lx, vl, vh] lx = ly (16 bit signed int, converted into double) + 'SETVDI', # [lx, 0, 0] [..v..] lx = v (32 bit signed int, converted into double) + 'SETVDF', # [lx, 0, 0] [..v..] lx = v (32 bit float, converted into double) + 'SETVDD', # [lx, 0, 0][.v.][.v.] lx = v (64 bit double) + 'ADDD', # [lx, ly, lz] lx = ly + lz (double) + 'SUBD', # [lx, ly, lz] lx = ly - lz (double) + 'MULD', # [lx, ly, lz] lx = ly * lz (double) + 'DIVD', # [lx, ly, lz] lx = ly / lz (double) + 'MODD', # [lx, ly, lz] lx = ly % lz (double) + 'NEGD', # [lx, ly, 0] lx = -ly (double) + 'EQD', # [lx, ly, lz] lx = ly == lz (double) + 'NED', # [lx, ly, lz] lx = ly != lz (double) + 'LTD', # [lx, ly, lz] lx = ly < lz (signed) + 'LED', # [lx, ly, lz] lx = ly < lz (double) + 'GTD', # [lx, ly, lz] lx = ly <= lz (double) + 'GED', # [lx, ly, lz] lx = ly <= lz (double) + 'D2I', # [lx, ly, 0] lx = ~~ly (double-to-int) + 'SI2D', # [lx, ly, 0] lx = +ly (signed int-to-double) + 'UI2D', # [lx, ly, 0] lx = +ly (unsigned int-to-double) + + 'LOAD8', # [lx, ly, 0] lx = HEAP8[ly >> 0] + 'LOADU8', # [lx, ly, 0] lx = HEAPU8[ly >> 0] + 'LOAD16', # [lx, ly, 0] lx = HEAP16[ly >> 1] + 'LOADU16', # [lx, ly, 0] lx = HEAPU16[ly >> 1] + 'LOAD32', # [lx, ly, 0] lx = HEAP32[ly >> 2] - no need for unsigned version, this is set to a register anyhow + 'STORE8', # [lx, ly, 0] HEAP8[lx >> 2] = ly + 'STORE16', # [lx, ly, 0] HEAP16[lx >> 2] = ly + 'STORE32', # [lx, ly, 0] HEAP32[lx >> 2] = ly + + 'LOADF64', # [lx, ly, 0] lx = HEAPF64[ly >> 3] + 'STOREF64', # [lx, ly, 0] HEAPF64[lx >> 3] = ly + 'LOADF32', # [lx, ly, 0] lx = HEAPF32[ly >> 3] + 'STOREF32', # [lx, ly, 0] HEAPF32[lx >> 3] = ly + + 'BR', # [0, tl, th] jump t instructions (multiple of 4) + 'BRT', # [cond, tl, th] if cond, jump t instructions (multiple of 4) + 'BRF', # [cond, tl, th] if !cond, jump t instructions (multiple of 4) + 'BRA', # [0, 0, 0] [addr] jump to addr + 'BRTA', # [cond, 0, 0] [addr] if cond, jump to addr + 'BRFA', # [cond, 0, 0] [addr] if !cond, jump to addr + + 'GETTDP', # [l, 0, 0] l = tempDoublePtr + 'GETTR0', # [l, 0, 0] l = tempRet0 + 'SETTR0', # [l, 0, 0] tempRet0 = l + 'GETGLBI', # [l, vl, vh] get global value, int, indexed by v + 'GETGLBD', # [l, vl, vh] get global value, double, indexed by v + 'SETGLBI', # [vl, vh, l] set global value, int, indexed by v (v = l) + 'CALL', # [lx, targetl, targeth] [params...] (lx = ) target(params..) lx's existence and type depend on the target's actual callsig; # this instruction can take multiple 32-bit instruction chunks # if target is a function table, then the first param is the index of the register holding the function pointer - '251': 'SWITCH', # [lx, ly, lz] switch (lx) { .. }. followed by a jump table for values in range [ly..ly+lz), after which is the default (which might be empty) - '254': 'RET', # [l, 0, 0] return l (depending on which emterpreter_x we are in, has the right type) - '255': 'FUNC', # [total locals, num params, 0] function with n locals (each taking 64 bits), of which the first are params -} + 'SWITCH', # [lx, ly, lz] switch (lx) { .. }. followed by a jump table for values in range [ly..ly+lz), after which is the default (which might be empty) + 'RET', # [l, 0, 0] return l (depending on which emterpreter_x we are in, has the right type) + 'FUNC', # [total locals, num params, 0] function with n locals (each taking 64 bits), of which the first are params +] def randomize_opcodes(): global OPCODES - keys = OPCODES.keys() import random - random.shuffle(keys) - copy = OPCODES - OPCODES = {} - for k in range(len(keys)): - OPCODES[k] = copy[keys[k]] + random.shuffle(opcodes) print OPCODES #randomize_opcodes() -assert len(OPCODES.values()) == len(set(OPCODES.values())) # no dupe names +assert len(OPCODES) == len(set(OPCODES)) # no dupe names ROPCODES = {} -for o in OPCODES: - ROPCODES[OPCODES[o]] = int(o); +for i in range(len(OPCODES)): + ROPCODES[OPCODES[i]] = i GLOBAL_BASE = 8 From ff49b52637d03c36a4a50851f20551087a6f19fc Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 30 Sep 2014 11:50:49 -0700 Subject: [PATCH 273/461] finalizeJump fixes --- tools/js-optimizer.js | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index e761c0faff54b..24350bcaa00a2 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6609,10 +6609,10 @@ function emterpretify(ast) { } } for (var i = 0; i < code.length; i += 4) { - if (code[i] in BRANCHES) { + assert(!(code[i] in ABSOLUTE_BRANCHES)); + if (code[i] in RELATIVE_BRANCHES) { code[i+2].uses++; } else if (code[i] === 'absolute-value') { - assert(!(code[i-4] in ABSOLUTE_BRANCHES)); // would already be counted code[i+1].uses++; } } @@ -6629,6 +6629,7 @@ function emterpretify(ast) { j = skipNOPs(j); if (code[j] === 'BR' && code[i+2] !== code[j+2]) { code[i+2].uses--; + assert(code[i+2].uses >= 0); code[j+2].uses++; code[i+2] = code[j+2]; } else { @@ -6638,6 +6639,20 @@ function emterpretify(ast) { } } // optimization pass, remove unreachable code + function deleteCode(i, num) { + // drop uses for code we are removing + for (var j = 0; j < num; j += 4) { + assert(!(code[j] in ABSOLUTE_BRANCHES)); + if (code[j] in RELATIVE_BRANCHES) { + code[j+2].uses--; + assert(code[j+2].uses >= 0); + } else if (code[j] === 'absolute-value') { + code[j+1].uses--; + assert(code[j+1].uses >= 0); + } + } + code.splice(i, num); + } for (var i = 0; i < code.length; i += 4) { if (code[i] in UNCONDITIONAL_BRANCHES) { var j = i + 4; // normal forward control flow cannot reach this position @@ -6650,7 +6665,7 @@ function emterpretify(ast) { j += 4; // this instr is unreachable } if (j > i + 4) { - code.splice(i + 4, j - i - 4); + deleteCode(i + 4, j - i - 4); } } } From 7daecbb57f5c7a948247b032b134d23b1a9d2468 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 30 Sep 2014 12:38:18 -0700 Subject: [PATCH 274/461] fix relative->absolute branch conversion --- tools/js-optimizer.js | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 24350bcaa00a2..01dd3993ea4ec 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6598,6 +6598,20 @@ function emterpretify(ast) { printErr(JSON.stringify(code)); printErr('=========='); }*/ + function sanityCheck() { + var seenAbsolutes = {}; // every absolute value must have a valid target + for (var i = 0; i < code.length; i += 4) { + if (code[i] === 'absolute-target') { + seenAbsolutes[code[i+1].id] = 1; + } + } + for (var i = 0; i < code.length; i += 4) { + if (code[i] === 'absolute-value') { + assert(code[i+1].id in seenAbsolutes); + } + } + } + sanityCheck(); // first pass, collect markers and absolute targets, and their uses function getI(obj) { var i = 0; @@ -6616,6 +6630,7 @@ function emterpretify(ast) { code[i+1].uses++; } } + sanityCheck(); // optimization pass, skip over multiple jumps function skipNOPs(i) { while (code[i] === 'relative' || code[i] === 'absolute-target') i += 4; // jump over all NOPs here @@ -6638,6 +6653,7 @@ function emterpretify(ast) { } } } + sanityCheck(); // optimization pass, remove unreachable code function deleteCode(i, num) { // drop uses for code we are removing @@ -6669,6 +6685,7 @@ function emterpretify(ast) { } } } + sanityCheck(); // second pass, find out which relative branches must be converted to absolutes, because they are too big for (var i = 0; i < code.length; i += 4) { if (code[i] in RELATIVE_BRANCHES) { @@ -6679,10 +6696,14 @@ function emterpretify(ast) { var maxOffset = storedOffset * 2; // when we convert relative to absolute, we double the size of a branch. // so worst case, we may double offsets (TODO this could be optimized) if ((maxOffset << 16 >> 16) !== maxOffset) { - obj.replaceWith = getAbsolute('relative-replacement'); + if (!obj.replaceWith) { + obj.replaceWith = getAbsolute('relative-replacement'); + code.splice(target, 0, 'absolute-target', obj.replaceWith, 0, 0); + } } } } + sanityCheck(); // convert necessary relative branches to absolutes for (var i = 0; i < code.length; i += 4) { if (code[i] in RELATIVE_BRANCHES) { @@ -6692,9 +6713,12 @@ function emterpretify(ast) { code[i+2] = 0; // id is no longer needed, 4 extra bytes in the inst will contain the absolute value code.splice(i+4, 0, 'absolute-value', obj.replaceWith, 0, 0); // add absolute value after first part of branch inst obj.replaceWith.uses++; + obj.uses--; + assert(obj.uses >= 0); } } } + sanityCheck(); // remove relative and absolute placeholders, after which every instruction is now in its absolute location, and we can write out absolutes for (var i = 0; i < code.length; i += 4) { if (code[i] === 'relative') { From ee199e462908fe324f96fd749ff8791b5dbd3807 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 30 Sep 2014 12:49:58 -0700 Subject: [PATCH 275/461] optimize BRF,BR into BRT where possible --- tests/test_other.py | 2 +- tools/js-optimizer.js | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/tests/test_other.py b/tests/test_other.py index 1d972f243075c..9dcea4f32a793 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4251,5 +4251,5 @@ def do_log_test(source, expected): seen = int(err.split('insts: ')[1]) assert expected == seen, ['expect', expected, 'but see', seen] - do_log_test(path_from_root('tests', 'primes.cpp'), 95) + do_log_test(path_from_root('tests', 'primes.cpp'), 94) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 01dd3993ea4ec..4cc8ad8cf12b7 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6719,6 +6719,19 @@ function emterpretify(ast) { } } sanityCheck(); + // optimizations that can only reduce code size + for (var i = 0; i < code.length; i += 4) { + if (code[i] === 'BRF' && code[i+4] === 'BR') { + // if we have a branch-if-false and then a branch, and the BRF jumps to right after the branch, then we can just emit + // a BRT. this can happen at the end of while loops, if there is a condition that checks if we should break out + if (skipNOPs(i+8) === skipNOPs(getI(code[i+2]))) { + code[i] = 'BRT'; + code[i+2].uses--; + code[i+2] = code[i+6]; + code.splice(i+4, 4); + } + } + } // remove relative and absolute placeholders, after which every instruction is now in its absolute location, and we can write out absolutes for (var i = 0; i < code.length; i += 4) { if (code[i] === 'relative') { From d0169018f997b022b7ac47e5b2d37df38e9dfe7b Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 30 Sep 2014 13:02:19 -0700 Subject: [PATCH 276/461] refactor a makeBranchIfFalse --- tools/js-optimizer.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 4cc8ad8cf12b7..aa422bc8980e7 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6121,15 +6121,12 @@ function emterpretify(ast) { } case 'if': { var exit = getRelative('if-exit'); - var condition = getReg(node[1]); var ret; if (!node[3]) { - condition[1].push('BRF', releaseIfFree(condition[0]), exit, 0); - ret = condition[1].concat(walkStatements(node[2])); + ret = makeBranchIfFalse(node[1], exit).concat(walkStatements(node[2])); } else { var otherwise = getRelative('if-else'); - condition[1].push('BRF', releaseIfFree(condition[0]), otherwise, 0); - ret = condition[1].concat(walkStatements(node[2])); + ret = makeBranchIfFalse(node[1], otherwise).concat(walkStatements(node[2])); ret.push('BR', 0, exit, 0, 'relative', otherwise, 0, 0); ret = ret.concat(walkStatements(node[3])); } @@ -6141,11 +6138,9 @@ function emterpretify(ast) { // TODO: handle dropIt var otherwise = getRelative('cond-else'), exit = getRelative('cond-exit'); var temp = getFree(); - var condition = getReg(node[1]); - var ret = condition[1]; var type = detectType(node[2], asmData); assert(type !== ASM_NONE); - ret.push('BRF', releaseIfFree(condition[0]), otherwise, 0); + var ret = makeBranchIfFalse(node[1], otherwise); var first = getReg(node[2]); ret = ret.concat(first[1]).concat(makeSet(temp, releaseIfFree(first[0]), type)); ret.push('BR', 0, exit, 0); @@ -6351,6 +6346,12 @@ function emterpretify(ast) { return [x, y[1]]; } + function makeBranchIfFalse(node, where) { + var condition = getReg(node); + condition[1].push('BRF', releaseIfFree(condition[0]), where, 0); + return condition[1]; + } + function makeDo(node, label) { var oneTime = node[1][0] === 'num' && node[1][1] === 0; // trivial one-time loops do {..} while(0) do not need condition handling // TODO: more testing assert(!oneTime); From 83dafc9d924d924964a0f26dd6d4111aa75fe0af Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 30 Sep 2014 13:09:18 -0700 Subject: [PATCH 277/461] optimize BRF not x => BRT x --- tests/test_other.py | 2 +- tools/js-optimizer.js | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/test_other.py b/tests/test_other.py index 9dcea4f32a793..985eaa3690859 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4251,5 +4251,5 @@ def do_log_test(source, expected): seen = int(err.split('insts: ')[1]) assert expected == seen, ['expect', expected, 'but see', seen] - do_log_test(path_from_root('tests', 'primes.cpp'), 94) + do_log_test(path_from_root('tests', 'primes.cpp'), 92) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index aa422bc8980e7..4db382d302f47 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6347,8 +6347,14 @@ function emterpretify(ast) { } function makeBranchIfFalse(node, where) { + // optimization: x = !y, BRF x => BRT y + var opcode = 'BRF'; + if (node[0] === 'unary-prefix' && node[1] === '!') { + node = node[2]; + opcode = 'BRT'; + } var condition = getReg(node); - condition[1].push('BRF', releaseIfFree(condition[0]), where, 0); + condition[1].push(opcode, releaseIfFree(condition[0]), where, 0); return condition[1]; } From a7e09f69c89b3be9e9fcefbd90d8388af5840e47 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 30 Sep 2014 13:34:49 -0700 Subject: [PATCH 278/461] ADDV optimized instruction --- tests/test_other.py | 2 +- tools/emterpretify.py | 5 +++++ tools/js-optimizer.js | 44 +++++++++++++++++++++++++++++++++++-------- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/tests/test_other.py b/tests/test_other.py index 985eaa3690859..6bdcd881654b1 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4251,5 +4251,5 @@ def do_log_test(source, expected): seen = int(err.split('insts: ')[1]) assert expected == seen, ['expect', expected, 'but see', seen] - do_log_test(path_from_root('tests', 'primes.cpp'), 92) + do_log_test(path_from_root('tests', 'primes.cpp'), 87) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index c1301bdc1cf73..45cb0d2feafad 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -49,6 +49,8 @@ 'ASHR', # [lx, ly, lz] lx = ly >> lz 'LSHR', # [lx, ly, lz] lx = ly >>> lz + 'ADDV', # [lx, ly, v] lx = ly + v (32-bit int, v is 8-bit signed) + 'SETD', # [lx, ly, lz] lx = ly (double) 'SETVD', # [lx, vl, vh] lx = ly (16 bit signed int, converted into double) 'SETVDI', # [lx, 0, 0] [..v..] lx = v (32 bit signed int, converted into double) @@ -159,6 +161,7 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['SETST']] = 'STACKTOP = HEAP32[sp + (lx << 3) >> 2]|0;' CASES[ROPCODES['SETVI']] = 'HEAP32[sp + (lx << 3) >> 2] = inst >> 16;' CASES[ROPCODES['SETVIB']] = 'pc = pc + 4 | 0; ' + get_access('lx') + ' = HEAP32[pc >> 2] | 0;' + CASES[ROPCODES['ADD']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['SUB']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') - (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['MUL']] = get_access('lx') + ' = Math_imul(' + get_coerced_access('ly') + ', ' + get_coerced_access('lz') + ') | 0;' @@ -182,6 +185,8 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['ASHR']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') >> (' + get_coerced_access('lz') + ');' CASES[ROPCODES['LSHR']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') >>> (' + get_coerced_access('lz') + ');' +CASES[ROPCODES['ADDV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') + (inst >> 24) | 0;' + CASES[ROPCODES['SETD']] = get_access('lx', s='d') + ' = ' + get_coerced_access('ly', s='d') + ';' CASES[ROPCODES['SETVD']] = get_access('lx', s='d') + ' = +(inst >> 16);' CASES[ROPCODES['SETVDI']] = 'pc = pc + 4 | 0; ' + get_access('lx', s='d') + ' = +(HEAP32[pc >> 2] | 0);' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 4db382d302f47..36cc56c3df329 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6236,12 +6236,30 @@ function emterpretify(ast) { } } + function getNum(node) { + if (node[0] === 'num') return node[1]; + if (node[0] === 'unary-prefix' && node[1] === '-' && node[2][0] === 'num') return -node[2][1]; + return null; + } + function makeBinary(node, type, sign, assignTo) { var opcode; + var numValue = null; // if one operand is a number, we can emit an optimized op + var otherValue = null; switch(node[1]) { case '+': { - if (type === ASM_INT) opcode = 'ADD'; - else if (type === ASM_DOUBLE) opcode = 'ADDD'; + if (type === ASM_INT) { + opcode = 'ADD'; + numValue = getNum(node[3]); + if (numValue !== null) { + otherValue = node[2]; + } else { + numValue = getNum(node[2]); + if (numValue !== null) { + otherValue = node[3]; + } + } + } else if (type === ASM_DOUBLE) opcode = 'ADDD'; break; } case '-': { @@ -6318,12 +6336,22 @@ function emterpretify(ast) { case '>>>': opcode = 'LSHR'; break; default: throw 'bad ' + node[1]; } - var y = getReg(node[2], undefined, type, sign); - var z = getReg(node[3], undefined, type, sign); - var x = assignTo >= 0 ? assignTo : getFree(y[0], z[0]); - y[1] = y[1].concat(z[1]); - y[1].push(opcode, x, releaseIfFree(y[0], x), releaseIfFree(z[0], x)); - return [x, y[1]]; + var x, y, z; + if (numValue === null || (numValue << 24 >> 24 !== numValue)) { + y = getReg(node[2], undefined, type, sign); + z = getReg(node[3], undefined, type, sign); + x = assignTo >= 0 ? assignTo : getFree(y[0], z[0]); + y[1] = y[1].concat(z[1]); + y[1].push(opcode, x, releaseIfFree(y[0], x), releaseIfFree(z[0], x)); + return [x, y[1]]; + } else { + // one operand is a small 8-bit signed number, emit an optimized instruction + opcode += 'V'; + y = getReg(otherValue, undefined, type, sign); + x = assignTo >= 0 ? assignTo : getFree(y[0]); + y[1].push(opcode, x, releaseIfFree(y[0], x), numValue & 255); + return [x, y[1]]; + } } function makeUnary(node, type, sign, assignTo) { From 4d4b07d9e08d9920fe31adc7a57203eb8f171c9f Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 30 Sep 2014 13:53:44 -0700 Subject: [PATCH 279/461] add fannkuch code size test --- tests/test_benchmark.py | 8 ++++---- tests/test_other.py | 11 ++++++++--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/tests/test_benchmark.py b/tests/test_benchmark.py index 9b86dcc1af5d2..46756e15208fb 100644 --- a/tests/test_benchmark.py +++ b/tests/test_benchmark.py @@ -12,7 +12,7 @@ # 5: 10 seconds DEFAULT_ARG = '2' -TEST_REPS = 1 +TEST_REPS = 2 CORE_BENCHMARKS = True # core benchmarks vs full regression suite @@ -111,10 +111,10 @@ def process(filename): '-O3', '-s', 'DOUBLE_MODE=0', '-s', 'PRECISE_I64_MATH=0', '--memory-init-file', '1', '--js-transform', 'python hardcode.py', '-s', 'TOTAL_MEMORY=128*1024*1024', - '--profiling', + #'--profiling', #'--closure', '1', - '-o', final] + shared_args + emcc_args + self.extra_args, stdout=PIPE, stderr=PIPE, env=self.env).communicate() - #'-o', final] + shared_args + emcc_args + self.extra_args, stdout=None, stderr=None, env=self.env).communicate() + #'-o', final] + shared_args + emcc_args + self.extra_args, stdout=PIPE, stderr=PIPE, env=self.env).communicate() + '-o', final] + shared_args + emcc_args + self.extra_args, stdout=None, stderr=None, env=self.env).communicate() assert os.path.exists(final), 'Failed to compile file: ' + output[0] self.filename = final diff --git a/tests/test_other.py b/tests/test_other.py index 6bdcd881654b1..64c2c474e2ee9 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4241,15 +4241,20 @@ def do_js_test(name, source, args, output): # codegen log tests - def do_log_test(source, expected): + def do_log_test(source, expected, func): print 'log test', source, expected try: os.environ['EMCC_LOG_EMTERPRETER_CODE'] = '1' out, err = Popen([PYTHON, EMCC, source, '-O3', '-s', 'EMTERPRETIFY=1'], stderr=PIPE).communicate() finally: del os.environ['EMCC_LOG_EMTERPRETER_CODE'] - seen = int(err.split('insts: ')[1]) + parts = err.split('insts: ') + pre, post = parts[:2] + assert func in pre, pre + post = post.split('\n')[0] + seen = int(post) assert expected == seen, ['expect', expected, 'but see', seen] - do_log_test(path_from_root('tests', 'primes.cpp'), 87) + do_log_test(path_from_root('tests', 'primes.cpp'), 87, 'main') + do_log_test(path_from_root('tests', 'fannkuch.cpp'), 280, 'fannkuch_worker') From d8c79dd12a67fe7fdba8dde34534afdd2a14e2b7 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 30 Sep 2014 14:28:07 -0700 Subject: [PATCH 280/461] add optimized V versions of all binary int insts --- tests/test_other.py | 4 +-- tools/emterpretify.py | 38 +++++++++++++++++++++- tools/js-optimizer.js | 75 +++++++++++++++++++++++++++++-------------- 3 files changed, 90 insertions(+), 27 deletions(-) diff --git a/tests/test_other.py b/tests/test_other.py index 64c2c474e2ee9..8b845f83b6596 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4255,6 +4255,6 @@ def do_log_test(source, expected, func): seen = int(post) assert expected == seen, ['expect', expected, 'but see', seen] - do_log_test(path_from_root('tests', 'primes.cpp'), 87, 'main') - do_log_test(path_from_root('tests', 'fannkuch.cpp'), 280, 'fannkuch_worker') + do_log_test(path_from_root('tests', 'primes.cpp'), 86, 'main') + do_log_test(path_from_root('tests', 'fannkuch.cpp'), 253, 'fannkuch_worker') diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 45cb0d2feafad..7cb477ee04954 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -49,7 +49,25 @@ 'ASHR', # [lx, ly, lz] lx = ly >> lz 'LSHR', # [lx, ly, lz] lx = ly >>> lz - 'ADDV', # [lx, ly, v] lx = ly + v (32-bit int, v is 8-bit signed) + 'ADDV', # [lx, ly, v] lx = ly + v (32-bit int, v is 8-bit signed) + 'SUBV', + 'MULV', + 'SDIVV', + 'UDIVV', # (v is 8-bit unsigned) + 'SMODV', + 'UMODV', # (v is 8-bit unsigned) + 'EQV', + 'NEV', + 'SLTV', + 'ULTV', # (v is 8-bit unsigned) + 'SLEV', + 'ULEV', # (v is 8-bit unsigned) + 'ANDV', + 'ORV', + 'XORV', + 'SHLV', # (v is 8-bit unsigned) + 'ASHRV', # (v is 8-bit unsigned) + 'LSHRV', # (v is 8-bit unsigned) 'SETD', # [lx, ly, lz] lx = ly (double) 'SETVD', # [lx, vl, vh] lx = ly (16 bit signed int, converted into double) @@ -186,6 +204,24 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['LSHR']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') >>> (' + get_coerced_access('lz') + ');' CASES[ROPCODES['ADDV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') + (inst >> 24) | 0;' +CASES[ROPCODES['SUBV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') - (inst >> 24) | 0;' +CASES[ROPCODES['MULV']] = get_access('lx') + ' = Math_imul(' + get_coerced_access('ly') + ', inst >> 24) | 0;' +CASES[ROPCODES['SDIVV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') / (inst >> 24) | 0;' +CASES[ROPCODES['UDIVV']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') / (lz >>> 0) >>> 0;' +CASES[ROPCODES['SMODV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') % (inst >> 24) | 0;' +CASES[ROPCODES['UMODV']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') % (lz >>> 0) >>> 0;' +CASES[ROPCODES['EQV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') == (inst >> 24) | 0;' +CASES[ROPCODES['NEV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') != (inst >> 24) | 0;' +CASES[ROPCODES['SLTV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') < (inst >> 24) | 0;' +CASES[ROPCODES['ULTV']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') < (lz >>> 0) | 0;' +CASES[ROPCODES['SLEV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') <= (inst >> 24) | 0;' +CASES[ROPCODES['ULEV']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') <= (lz >>> 0) | 0;' +CASES[ROPCODES['ANDV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') & (inst >> 24);' +CASES[ROPCODES['ORV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') | (inst >> 24);' +CASES[ROPCODES['XORV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') ^ (inst >> 24);' +CASES[ROPCODES['SHLV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') << lz;' +CASES[ROPCODES['ASHRV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') >> lz;' +CASES[ROPCODES['LSHRV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') >>> lz;' CASES[ROPCODES['SETD']] = get_access('lx', s='d') + ' = ' + get_coerced_access('ly', s='d') + ';' CASES[ROPCODES['SETVD']] = get_access('lx', s='d') + ' = +(inst >> 16);' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 36cc56c3df329..58eb9b21adf44 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6246,30 +6246,47 @@ function emterpretify(ast) { var opcode; var numValue = null; // if one operand is a number, we can emit an optimized op var otherValue = null; + var numValueUnsigned = false; + function tryNumSymmetrical(unsigned) { // flip operands to find a num + numValue = getNum(node[3]); + if (numValue !== null) { + otherValue = node[2]; + numValueUnsigned = unsigned; + } else { + numValue = getNum(node[2]); + if (numValue !== null) { + otherValue = node[3]; + numValueUnsigned = unsigned; + } + } + } + function tryNumAsymmetrical(unsigned) { // only try on the last operand (still common, e.g. x % 5, y >> 2, z > 0 + numValue = getNum(node[3]); + if (numValue !== null) { + otherValue = node[2]; + numValueUnsigned = unsigned; + } + } switch(node[1]) { case '+': { if (type === ASM_INT) { opcode = 'ADD'; - numValue = getNum(node[3]); - if (numValue !== null) { - otherValue = node[2]; - } else { - numValue = getNum(node[2]); - if (numValue !== null) { - otherValue = node[3]; - } - } + tryNumSymmetrical(); } else if (type === ASM_DOUBLE) opcode = 'ADDD'; break; } case '-': { - if (type === ASM_INT) opcode = 'SUB'; - else if (type === ASM_DOUBLE) opcode = 'SUBD'; + if (type === ASM_INT) { + opcode = 'SUB'; + tryNumAsymmetrical(); + } else if (type === ASM_DOUBLE) opcode = 'SUBD'; break; } case '*': { - if (type === ASM_INT) opcode = 'MUL'; - else if (type === ASM_DOUBLE) opcode = 'MULD'; + if (type === ASM_INT) { + opcode = 'MUL'; + tryNumSymmetrical(); + } else if (type === ASM_DOUBLE) opcode = 'MULD'; break; } case '/': { @@ -6277,6 +6294,7 @@ function emterpretify(ast) { assert(sign !== ASM_FLEXIBLE); if (sign === ASM_SIGNED) opcode = 'SDIV'; else opcode = 'UDIV'; + tryNumAsymmetrical(sign === ASM_UNSIGNED); } else if (type === ASM_DOUBLE) opcode = 'DIVD'; break; @@ -6286,6 +6304,7 @@ function emterpretify(ast) { assert(sign !== ASM_FLEXIBLE); if (sign === ASM_SIGNED) opcode = 'SMOD'; else opcode = 'UMOD'; + tryNumAsymmetrical(sign === ASM_UNSIGNED); } else if (type === ASM_DOUBLE) opcode = 'MODD'; break; @@ -6295,6 +6314,7 @@ function emterpretify(ast) { if (sign === ASM_FLEXIBLE) sign = ASM_SIGNED; // e.g. two numbers if (sign === ASM_SIGNED) opcode = 'SLT'; else opcode = 'ULT'; + tryNumAsymmetrical(sign === ASM_UNSIGNED); } else if (type === ASM_DOUBLE) opcode = 'LTD'; break; @@ -6304,6 +6324,7 @@ function emterpretify(ast) { if (sign === ASM_FLEXIBLE) sign = ASM_SIGNED; // e.g. two numbers if (sign === ASM_SIGNED) opcode = 'SLE'; else opcode = 'ULE'; + tryNumAsymmetrical(sign === ASM_UNSIGNED); } else if (type === ASM_DOUBLE) opcode = 'LED'; break; @@ -6319,25 +6340,31 @@ function emterpretify(ast) { break; } case '==': { - if (type === ASM_INT) opcode = 'EQ'; - else if (type === ASM_DOUBLE) opcode = 'EQD'; + if (type === ASM_INT) { + opcode = 'EQ'; + tryNumSymmetrical(); + } else if (type === ASM_DOUBLE) opcode = 'EQD'; break; } case '!=': { - if (type === ASM_INT) opcode = 'NE'; - else if (type === ASM_DOUBLE) opcode = 'NED'; + if (type === ASM_INT) { + opcode = 'NE'; + tryNumSymmetrical(); + } else if (type === ASM_DOUBLE) opcode = 'NED'; break; } - case '&': opcode = 'AND'; break; - case '|': opcode = 'OR'; break; - case '^': opcode = 'XOR'; break; - case '<<': opcode = 'SHL'; break; - case '>>': opcode = 'ASHR'; break; - case '>>>': opcode = 'LSHR'; break; + case '&': opcode = 'AND'; tryNumSymmetrical(); break; + case '|': opcode = 'OR'; tryNumSymmetrical(); break; + case '^': opcode = 'XOR'; tryNumSymmetrical(); break; + case '<<': opcode = 'SHL'; tryNumAsymmetrical(true); break; + case '>>': opcode = 'ASHR'; tryNumAsymmetrical(true); break; + case '>>>': opcode = 'LSHR'; tryNumAsymmetrical(true); break; default: throw 'bad ' + node[1]; } var x, y, z; - if (numValue === null || (numValue << 24 >> 24 !== numValue)) { + var usingNumValue = numValue !== null && ((!numValueUnsigned && ((numValue << 24 >> 24) === numValue)) || + ( numValueUnsigned && ((numValue & 255) === numValue))); + if (!usingNumValue) { y = getReg(node[2], undefined, type, sign); z = getReg(node[3], undefined, type, sign); x = assignTo >= 0 ? assignTo : getFree(y[0], z[0]); From 9884696ea2bd42b1ae3aa843da2a483ca6aa71a4 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 30 Sep 2014 14:37:37 -0700 Subject: [PATCH 281/461] fix deleteCode indexing --- tools/js-optimizer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 58eb9b21adf44..94e6df6f4f74f 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6719,7 +6719,7 @@ function emterpretify(ast) { // optimization pass, remove unreachable code function deleteCode(i, num) { // drop uses for code we are removing - for (var j = 0; j < num; j += 4) { + for (var j = i; j < i + num; j += 4) { assert(!(code[j] in ABSOLUTE_BRANCHES)); if (code[j] in RELATIVE_BRANCHES) { code[j+2].uses--; From fc15803395123f96a43d569544ad9c8739090bcc Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 30 Sep 2014 14:40:30 -0700 Subject: [PATCH 282/461] disable test_source_map on emterpreter --- tests/test_core.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_core.py b/tests/test_core.py index 170d9bcf44248..1540ff50f2ea2 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -6594,6 +6594,7 @@ def test_safe_heap(self): assert 'Assertion failed: Load-store consistency assumption failure!' in str(e), str(e) def test_source_map(self): + if self.is_emterpreter(): return self.skip('todo') if Settings.USE_TYPED_ARRAYS != 2: return self.skip("doesn't pass without typed arrays") if NODE_JS not in JS_ENGINES: return self.skip('sourcemapper requires Node to run') if '-g' not in Building.COMPILER_TEST_OPTS: Building.COMPILER_TEST_OPTS.append('-g') From 11f6ead25627adf732730a0c0184ac9ab4741020 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 30 Sep 2014 15:38:47 -0700 Subject: [PATCH 283/461] optimize x + (-y) into x - y --- tools/js-optimizer.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 94e6df6f4f74f..ca68065e39759 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6269,11 +6269,18 @@ function emterpretify(ast) { } switch(node[1]) { case '+': { - if (type === ASM_INT) { - opcode = 'ADD'; - tryNumSymmetrical(); - } else if (type === ASM_DOUBLE) opcode = 'ADDD'; - break; + if (node[3][0] === 'unary-prefix' && node[3][1] === '-') { + // optimize x + (-y) into x - y + node[1] = '-'; + node[3] = node[3][2]; + // fall through into '-' + } else { + if (type === ASM_INT) { + opcode = 'ADD'; + tryNumSymmetrical(); + } else if (type === ASM_DOUBLE) opcode = 'ADDD'; + break; + } } case '-': { if (type === ASM_INT) { From d109322f51452c9fadb6d914cb5c936d9501e035 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 30 Sep 2014 15:57:50 -0700 Subject: [PATCH 284/461] LOAD*A --- tests/test_other.py | 2 +- tools/emterpretify.py | 29 +++++++++++++++++++++++++++++ tools/js-optimizer.js | 20 ++++++++++++++++---- 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/tests/test_other.py b/tests/test_other.py index 8b845f83b6596..4fa1601fd9b56 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4256,5 +4256,5 @@ def do_log_test(source, expected, func): assert expected == seen, ['expect', expected, 'but see', seen] do_log_test(path_from_root('tests', 'primes.cpp'), 86, 'main') - do_log_test(path_from_root('tests', 'fannkuch.cpp'), 253, 'fannkuch_worker') + do_log_test(path_from_root('tests', 'fannkuch.cpp'), 251, 'fannkuch_worker') diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 7cb477ee04954..d0e781c24b6d8 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -104,6 +104,20 @@ 'LOADF32', # [lx, ly, 0] lx = HEAPF32[ly >> 3] 'STOREF32', # [lx, ly, 0] HEAPF32[lx >> 3] = ly + 'LOAD8A', # [lx, ly, lz] load-add and store-add instructions, whose pointer input is a signed addition: lx = load(ly + lz), store(lx + ly) = lz + 'LOADU8A', + 'LOAD16A', + 'LOADU16A', + 'LOAD32A', + 'STORE8A', + 'STORE16A', + 'STORE32A', + + 'LOADF64A', + 'STOREF64A', + 'LOADF32A', + 'STOREF32A', + 'BR', # [0, tl, th] jump t instructions (multiple of 4) 'BRT', # [cond, tl, th] if cond, jump t instructions (multiple of 4) 'BRF', # [cond, tl, th] if !cond, jump t instructions (multiple of 4) @@ -133,6 +147,7 @@ def randomize_opcodes(): #randomize_opcodes() assert len(OPCODES) == len(set(OPCODES)) # no dupe names +assert len(OPCODES) < 256 ROPCODES = {} for i in range(len(OPCODES)): @@ -258,6 +273,20 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['LOADF32']] = get_access('lx', s='d') + ' = ' + '+HEAPF32[' + get_access('ly') + ' >> 2];' CASES[ROPCODES['STOREF32']] = 'HEAPF32[' + get_access('lx') + ' >> 2] = ' + get_coerced_access('ly', s='d') + ';'; +CASES[ROPCODES['LOAD8A']] = get_access('lx') + ' = ' + 'HEAP8[(' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') >> 0];' +CASES[ROPCODES['LOADU8A']] = get_access('lx') + ' = ' + 'HEAPU8[(' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') >> 0];' +CASES[ROPCODES['LOAD16A']] = get_access('lx') + ' = ' + 'HEAP16[(' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') >> 1];' +CASES[ROPCODES['LOADU16A']] = get_access('lx') + ' = ' + 'HEAPU16[(' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') >> 1];' +CASES[ROPCODES['LOAD32A']] = get_access('lx') + ' = ' + 'HEAP32[(' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') >> 2];' +#CASES[ROPCODES['STORE8A']] = 'HEAP8[' + get_access('lx') + ' >> 0] = ' + get_coerced_access('ly') + ';'; +#CASES[ROPCODES['STORE16A']] = 'HEAP16[' + get_access('lx') + ' >> 1] = ' + get_coerced_access('ly') + ';'; +#CASES[ROPCODES['STORE32A']] = 'HEAP32[' + get_access('lx') + ' >> 2] = ' + get_coerced_access('ly') + ';'; + +CASES[ROPCODES['LOADF64A']] = get_access('lx', s='d') + ' = ' + '+HEAPF64[(' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') >> 3];' +#CASES[ROPCODES['STOREF64A']] = 'HEAPF64[' + get_access('lx') + ' >> 3] = ' + get_coerced_access('ly', s='d') + ';'; +CASES[ROPCODES['LOADF32A']] = get_access('lx', s='d') + ' = ' + '+HEAPF32[(' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') >> 2];' +#CASES[ROPCODES['STOREF32A']] = 'HEAPF32[' + get_access('lx') + ' >> 2] = ' + get_coerced_access('ly', s='d') + ';'; + CASES[ROPCODES['BR']] = 'pc = pc + ((inst >> 16) << 2) | 0; continue;' CASES[ROPCODES['BRT']] = 'if (' + get_coerced_access('lx') + ') { pc = pc + ((inst >> 16) << 2) | 0; continue; }' CASES[ROPCODES['BRF']] = 'if (!(' + get_coerced_access('lx') + ')) { pc = pc + ((inst >> 16) << 2) | 0; continue; }' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index ca68065e39759..f984bf1d2e5f2 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6168,10 +6168,22 @@ function emterpretify(ast) { assert(shifts >= 0 && shifts <= 3); var bits = Math.pow(2, shifts)*8; assert(bits === temp.bits); - var y = getReg(node[2][2], false, ASM_INT, ASM_SIGNED); - var x = assignTo >= 0 ? assignTo : getFree(y[0]); - y[1].push(opcode, x, releaseIfFree(y[0], x), 0); - return [x, y[1]]; + var pointer = node[2][2]; + + if (pointer[0] === 'binary' && pointer[1] === '+') { + opcode += 'A'; + var y = getReg(pointer[2], false, ASM_INT, ASM_SIGNED); + var z = getReg(pointer[3], false, ASM_INT, ASM_SIGNED); + var x = assignTo >= 0 ? assignTo : getFree(y[0], z[0]); + y[1] = y[1].concat(z[1]); + y[1].push(opcode, x, releaseIfFree(y[0], x), releaseIfFree(z[0], x)); + return [x, y[1]]; + } else { + var y = getReg(node[2][2], false, ASM_INT, ASM_SIGNED); + var x = assignTo >= 0 ? assignTo : getFree(y[0]); + y[1].push(opcode, x, releaseIfFree(y[0], x), 0); + return [x, y[1]]; + } } else { assert(node[2][0] === 'num'); // HEAP32[8] or such var address = node[2][1]; From 9e2fe113e18a7a87545fd9ee17bc575b043a8540 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 30 Sep 2014 16:43:35 -0700 Subject: [PATCH 285/461] STORE*A --- tests/test_other.py | 2 +- tools/emterpretify.py | 20 ++++++++++---------- tools/js-optimizer.js | 26 ++++++++++++++++++++------ 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/tests/test_other.py b/tests/test_other.py index 4fa1601fd9b56..d5e9792d2b087 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4256,5 +4256,5 @@ def do_log_test(source, expected, func): assert expected == seen, ['expect', expected, 'but see', seen] do_log_test(path_from_root('tests', 'primes.cpp'), 86, 'main') - do_log_test(path_from_root('tests', 'fannkuch.cpp'), 251, 'fannkuch_worker') + do_log_test(path_from_root('tests', 'fannkuch.cpp'), 242, 'fannkuch_worker') diff --git a/tools/emterpretify.py b/tools/emterpretify.py index d0e781c24b6d8..b47c181dedc70 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -264,28 +264,28 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['LOAD16']] = get_access('lx') + ' = ' + 'HEAP16[' + get_access('ly') + ' >> 1];' CASES[ROPCODES['LOADU16']] = get_access('lx') + ' = ' + 'HEAPU16[' + get_access('ly') + ' >> 1];' CASES[ROPCODES['LOAD32']] = get_access('lx') + ' = ' + 'HEAP32[' + get_access('ly') + ' >> 2];' -CASES[ROPCODES['STORE8']] = 'HEAP8[' + get_access('lx') + ' >> 0] = ' + get_coerced_access('ly') + ';'; -CASES[ROPCODES['STORE16']] = 'HEAP16[' + get_access('lx') + ' >> 1] = ' + get_coerced_access('ly') + ';'; -CASES[ROPCODES['STORE32']] = 'HEAP32[' + get_access('lx') + ' >> 2] = ' + get_coerced_access('ly') + ';'; +CASES[ROPCODES['STORE8']] = 'HEAP8[' + get_access('lx') + ' >> 0] = ' + get_coerced_access('ly') + ';' +CASES[ROPCODES['STORE16']] = 'HEAP16[' + get_access('lx') + ' >> 1] = ' + get_coerced_access('ly') + ';' +CASES[ROPCODES['STORE32']] = 'HEAP32[' + get_access('lx') + ' >> 2] = ' + get_coerced_access('ly') + ';' CASES[ROPCODES['LOADF64']] = get_access('lx', s='d') + ' = ' + '+HEAPF64[' + get_access('ly') + ' >> 3];' -CASES[ROPCODES['STOREF64']] = 'HEAPF64[' + get_access('lx') + ' >> 3] = ' + get_coerced_access('ly', s='d') + ';'; +CASES[ROPCODES['STOREF64']] = 'HEAPF64[' + get_access('lx') + ' >> 3] = ' + get_coerced_access('ly', s='d') + ';' CASES[ROPCODES['LOADF32']] = get_access('lx', s='d') + ' = ' + '+HEAPF32[' + get_access('ly') + ' >> 2];' -CASES[ROPCODES['STOREF32']] = 'HEAPF32[' + get_access('lx') + ' >> 2] = ' + get_coerced_access('ly', s='d') + ';'; +CASES[ROPCODES['STOREF32']] = 'HEAPF32[' + get_access('lx') + ' >> 2] = ' + get_coerced_access('ly', s='d') + ';' CASES[ROPCODES['LOAD8A']] = get_access('lx') + ' = ' + 'HEAP8[(' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') >> 0];' CASES[ROPCODES['LOADU8A']] = get_access('lx') + ' = ' + 'HEAPU8[(' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') >> 0];' CASES[ROPCODES['LOAD16A']] = get_access('lx') + ' = ' + 'HEAP16[(' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') >> 1];' CASES[ROPCODES['LOADU16A']] = get_access('lx') + ' = ' + 'HEAPU16[(' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') >> 1];' CASES[ROPCODES['LOAD32A']] = get_access('lx') + ' = ' + 'HEAP32[(' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') >> 2];' -#CASES[ROPCODES['STORE8A']] = 'HEAP8[' + get_access('lx') + ' >> 0] = ' + get_coerced_access('ly') + ';'; -#CASES[ROPCODES['STORE16A']] = 'HEAP16[' + get_access('lx') + ' >> 1] = ' + get_coerced_access('ly') + ';'; -#CASES[ROPCODES['STORE32A']] = 'HEAP32[' + get_access('lx') + ' >> 2] = ' + get_coerced_access('ly') + ';'; +CASES[ROPCODES['STORE8A']] = 'HEAP8[(' + get_coerced_access('lx') + ') + (' + get_coerced_access('ly') + ') >> 0] = ' + get_coerced_access('lz') + ';' +CASES[ROPCODES['STORE16A']] = 'HEAP16[(' + get_coerced_access('lx') + ') + (' + get_coerced_access('ly') + ') >> 1] = ' + get_coerced_access('lz') + ';' +CASES[ROPCODES['STORE32A']] = 'HEAP32[(' + get_coerced_access('lx') + ') + (' + get_coerced_access('ly') + ') >> 2] = ' + get_coerced_access('lz') + ';' CASES[ROPCODES['LOADF64A']] = get_access('lx', s='d') + ' = ' + '+HEAPF64[(' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') >> 3];' -#CASES[ROPCODES['STOREF64A']] = 'HEAPF64[' + get_access('lx') + ' >> 3] = ' + get_coerced_access('ly', s='d') + ';'; +CASES[ROPCODES['STOREF64A']] = 'HEAPF64[(' + get_coerced_access('lx') + ') + (' + get_coerced_access('ly') + ') >> 3] = ' + get_coerced_access('lz', s='d') + ';' CASES[ROPCODES['LOADF32A']] = get_access('lx', s='d') + ' = ' + '+HEAPF32[(' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') >> 2];' -#CASES[ROPCODES['STOREF32A']] = 'HEAPF32[' + get_access('lx') + ' >> 2] = ' + get_coerced_access('ly', s='d') + ';'; +CASES[ROPCODES['STOREF32A']] = 'HEAPF32[(' + get_coerced_access('lx') + ') + (' + get_coerced_access('ly') + ') >> 2] = ' + get_coerced_access('lz', s='d') + ';' CASES[ROPCODES['BR']] = 'pc = pc + ((inst >> 16) << 2) | 0; continue;' CASES[ROPCODES['BRT']] = 'if (' + get_coerced_access('lx') + ') { pc = pc + ((inst >> 16) << 2) | 0; continue; }' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index f984bf1d2e5f2..14a5bd17d1aae 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5934,11 +5934,25 @@ function emterpretify(ast) { assert(shifts >= 0 && shifts <= 3); var bits = Math.pow(2, shifts)*8; assert(bits === temp.bits); - var x = getReg(target[2][2], false, ASM_INT, ASM_SIGNED); - var y = getReg(value); // generate y now, not earlier, to not trample x's output reg, which might be a temp - var ret = x[1].concat(y[1]); - ret.push(opcode, releaseIfFree(x[0]), releaseIfFree(y[0]), 0); - return [-1, ret]; + + + var pointer = target[2][2]; + if (pointer[0] === 'binary' && pointer[1] === '+') { + // optimized store + add + opcode += 'A'; + var x = getReg(pointer[2], false, ASM_INT, ASM_SIGNED); + var y = getReg(pointer[3], false, ASM_INT, ASM_SIGNED); + var z = getReg(value); + var ret = x[1].concat(y[1]).concat(z[1]); + ret.push(opcode, releaseIfFree(x[0]), releaseIfFree(y[0]), releaseIfFree(z[0])); + return [-1, ret]; + } else { + var x = getReg(target[2][2], false, ASM_INT, ASM_SIGNED); + var y = getReg(value); // generate y now, not earlier, to not trample x's output reg, which might be a temp + var ret = x[1].concat(y[1]); + ret.push(opcode, releaseIfFree(x[0]), releaseIfFree(y[0]), 0); + return [-1, ret]; + } } else { assert(target[2][0] === 'num'); // HEAP32[8] or such var address = target[2][1]; @@ -6169,8 +6183,8 @@ function emterpretify(ast) { var bits = Math.pow(2, shifts)*8; assert(bits === temp.bits); var pointer = node[2][2]; - if (pointer[0] === 'binary' && pointer[1] === '+') { + // optimized load + add opcode += 'A'; var y = getReg(pointer[2], false, ASM_INT, ASM_SIGNED); var z = getReg(pointer[3], false, ASM_INT, ASM_SIGNED); From 479f968c5afa332f239caca28e87205229ce284b Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 30 Sep 2014 17:18:10 -0700 Subject: [PATCH 286/461] hoist common numbers --- tools/js-optimizer.js | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 14a5bd17d1aae..90d6684f13439 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6233,7 +6233,10 @@ function emterpretify(ast) { return [opcode, dst, src, 0]; } + var hoistedNums = {}; + function makeNum(value, type, l) { + if (value in hoistedNums) return [hoistedNums[value], []]; if (l === undefined) l = getFree(); var opcode; if (((value << 16) >> 16) === (value | 0) && ((value === (value | 0)) || (type === ASM_INT && value === (value >>> 0))) && @@ -6864,6 +6867,39 @@ function emterpretify(ast) { } } + function hoistConstants(stats) { + // find constants that appear a lot or appear in loops, and hoist them to the top + var nums = {}; + var depth = 0; + traverse(stats, function(node, type) { + if (type in LOOP && !(node[1] === 'num' && node[2] === 0)) depth++; + else if (type === 'unary-prefix' && node[1] === '+' && getNum(node[2]) !== null) return null; // we only care about ints + var num = getNum(node); + if (num === null) return; + nums[num] = (nums[num] || 0) + Math.pow(5, depth); + return null; // do not traverse into this node + }, function(node, type) { + if (type in LOOP && !(node[1] === 'num' && node[2] === 0)) depth--; + }); + var ks = keys(nums); + ks.sort(function(x, y) { return nums[y] - nums[x] }); + var ret = []; + var limit = Math.max(numLocals + 3, Math.min(1.1*numLocals, 120)); + for (var i = 0; i < ks.length && numLocals < limit; i++) { + var n = ks[i]; + if (n >= -127 && n < 128) continue; // constant like these are typically folded into ops anyhow + var weight = nums[n]; + if (weight < 10) continue; // not heavy enough + // hoist this num + //printErr('hoist ' + [n, weight]); + var reg = makeNum(n, ASM_INT); + hoistedNums[n] = reg[0]; + ret = ret.concat(reg[1]); + numLocals++; // this will never be freed + } + return ret; + } + // walkFunction main var ignore = (func[1] in BLACKLIST) || /^dynCall_.*/.test(func[1]); @@ -6946,6 +6982,9 @@ function emterpretify(ast) { func[3].push(['stat', theCall]); } + // do some pre-calculation and optimization + var constants = hoistConstants(stats); + // walk all the function to emit bytecode, and add a final ret var code = walkStatements(stats); assert(code.length % 4 === 0); @@ -6953,7 +6992,7 @@ function emterpretify(ast) { code.push('RET', 0, 0, 0); // final ret for the function } assert(maxLocal < 255, 'too many locals ' + [maxLocal, numLocals]); // maximum local value is 255, for a total of 256 of them - code = ['FUNC', maxLocal+1, func[2].length, 0].concat(code); + code = ['FUNC', maxLocal+1, func[2].length, 0].concat(constants).concat(code); verifyCode(code); finalizeJumps(code); From 2b4d4e6f5e0506a4e987776f32b2c83be3ae1d92 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 30 Sep 2014 18:36:24 -0700 Subject: [PATCH 287/461] fix a load-constant bug, and correct some constant hoisting issues --- tools/js-optimizer.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 90d6684f13439..930d542c16f9d 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6204,7 +6204,9 @@ function emterpretify(ast) { var shifts = Math.log2(temp.bits/8); assert(address === ((address << shifts) >> shifts)); var ret = makeNum(address << shifts, ASM_INT); - ret[1].push(opcode, ret[0], ret[0], 0); + var out = assignTo >= 0 ? assignTo : getFree(ret[0]); + ret[1].push(opcode, out, releaseIfFree(ret[0], out), 0); + ret[0] = out; return ret; } } @@ -6236,7 +6238,7 @@ function emterpretify(ast) { var hoistedNums = {}; function makeNum(value, type, l) { - if (value in hoistedNums) return [hoistedNums[value], []]; + if (type === ASM_INT && l === undefined && value in hoistedNums) return [hoistedNums[value], []]; if (l === undefined) l = getFree(); var opcode; if (((value << 16) >> 16) === (value | 0) && ((value === (value | 0)) || (type === ASM_INT && value === (value >>> 0))) && @@ -6891,10 +6893,11 @@ function emterpretify(ast) { var weight = nums[n]; if (weight < 10) continue; // not heavy enough // hoist this num - //printErr('hoist ' + [n, weight]); var reg = makeNum(n, ASM_INT); + //printErr('hoist ' + [n, weight, reg[0]]); hoistedNums[n] = reg[0]; ret = ret.concat(reg[1]); + assert(reg[0] === numLocals); numLocals++; // this will never be freed } return ret; From 274442ee2ce8c2dcbe350cf523de2edb17a425d0 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 30 Sep 2014 21:06:35 -0700 Subject: [PATCH 288/461] emit continues in interpreter, not breaks which might add another branch --- tools/emterpretify.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index b47c181dedc70..f3837c861c6e8 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -364,7 +364,7 @@ def make_store(i): def fix_case(case): # we increment pc at the top of the loop. cases doing 'continue' really need to decrement it - return case.replace('continue;', 'pc = pc - 4 | 0; continue;') + return case.replace('continue;', 'CONTINUE').replace('break;', 'continue;').replace('CONTINUE', 'pc = pc - 4 | 0; continue;') return r''' function emterpret%s%s(pc) { From 77ed32fceddc066f553190593195dfe250b9ace6 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 30 Sep 2014 21:11:03 -0700 Subject: [PATCH 289/461] reorder operands a little --- tools/emterpretify.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index f3837c861c6e8..c965b49e59374 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -21,8 +21,6 @@ OPCODES = [ # l, lx, ly etc - one of 256 locals 'SET', # [lx, ly, 0] lx = ly (int or float, not double) - 'GETST', # [l, 0, 0] l = STACKTOP - 'SETST', # [l, 0, 0] STACKTOP = l 'SETVI', # [l, vl, vh] l = v (16-bit signed int) 'SETVIB', # [l, 0, 0] [..v..] l = 32-bit int in next 32-bit instruction @@ -134,6 +132,10 @@ 'CALL', # [lx, targetl, targeth] [params...] (lx = ) target(params..) lx's existence and type depend on the target's actual callsig; # this instruction can take multiple 32-bit instruction chunks # if target is a function table, then the first param is the index of the register holding the function pointer + + 'GETST', # [l, 0, 0] l = STACKTOP + 'SETST', # [l, 0, 0] STACKTOP = l + 'SWITCH', # [lx, ly, lz] switch (lx) { .. }. followed by a jump table for values in range [ly..ly+lz), after which is the default (which might be empty) 'RET', # [l, 0, 0] return l (depending on which emterpreter_x we are in, has the right type) 'FUNC', # [total locals, num params, 0] function with n locals (each taking 64 bits), of which the first are params From 242aee41f21429b285bfe207c0cf463cf1bb988a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 30 Sep 2014 21:14:38 -0700 Subject: [PATCH 290/461] minor emterpreter cleanups --- tools/emterpretify.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index c965b49e59374..e0b2c3b5cf78a 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -366,7 +366,7 @@ def make_store(i): def fix_case(case): # we increment pc at the top of the loop. cases doing 'continue' really need to decrement it - return case.replace('continue;', 'CONTINUE').replace('break;', 'continue;').replace('CONTINUE', 'pc = pc - 4 | 0; continue;') + return case.replace('continue;', 'CONTINUE').replace('break;', 'continue;').replace('CONTINUE', 'pc = pc - 4 | 0; continue;').replace('continue; continue;', 'continue;') return r''' function emterpret%s%s(pc) { @@ -397,7 +397,6 @@ def fix_case(case): default: assert(0); } } - EMTSTACKTOP = sp; %s }''' % ( '_' if t != 'void' else '', From 2f05b0a174590d9ed229e538d844a9767eef7c91 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 30 Sep 2014 21:46:02 -0700 Subject: [PATCH 291/461] STORE*C, copy ops --- tests/test_other.py | 2 +- tools/emterpretify.py | 12 ++++++++++++ tools/js-optimizer.js | 13 ++++++++++--- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/tests/test_other.py b/tests/test_other.py index d5e9792d2b087..6052b3af15747 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4256,5 +4256,5 @@ def do_log_test(source, expected, func): assert expected == seen, ['expect', expected, 'but see', seen] do_log_test(path_from_root('tests', 'primes.cpp'), 86, 'main') - do_log_test(path_from_root('tests', 'fannkuch.cpp'), 242, 'fannkuch_worker') + do_log_test(path_from_root('tests', 'fannkuch.cpp'), 240, 'fannkuch_worker') diff --git a/tools/emterpretify.py b/tools/emterpretify.py index e0b2c3b5cf78a..39b11baabec19 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -116,6 +116,12 @@ 'LOADF32A', 'STOREF32A', + 'STORE8C', + 'STORE16C', + 'STORE32C', + 'STOREF64C', + 'STOREF32C', + 'BR', # [0, tl, th] jump t instructions (multiple of 4) 'BRT', # [cond, tl, th] if cond, jump t instructions (multiple of 4) 'BRF', # [cond, tl, th] if !cond, jump t instructions (multiple of 4) @@ -289,6 +295,12 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['LOADF32A']] = get_access('lx', s='d') + ' = ' + '+HEAPF32[(' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') >> 2];' CASES[ROPCODES['STOREF32A']] = 'HEAPF32[(' + get_coerced_access('lx') + ') + (' + get_coerced_access('ly') + ') >> 2] = ' + get_coerced_access('lz', s='d') + ';' +CASES[ROPCODES['STORE8C']] = 'HEAP8[' + get_access('lx') + ' >> 0] = HEAP8[' + get_access('ly') + ' >> 0] | 0;' +CASES[ROPCODES['STORE16C']] = 'HEAP16[' + get_access('lx') + ' >> 1] = HEAP16[' + get_access('ly') + ' >> 1] | 0;' +CASES[ROPCODES['STORE32C']] = 'HEAP32[' + get_access('lx') + ' >> 2] = HEAP32[' + get_access('ly') + ' >> 2] | 0;' +CASES[ROPCODES['STOREF32C']] = 'HEAPF32[' + get_access('lx') + ' >> 2] = +HEAPF32[' + get_access('ly') + ' >> 2];' +CASES[ROPCODES['STOREF64C']] = 'HEAPF64[' + get_access('lx') + ' >> 3] = +HEAPF64[' + get_access('ly') + ' >> 3];' + CASES[ROPCODES['BR']] = 'pc = pc + ((inst >> 16) << 2) | 0; continue;' CASES[ROPCODES['BRT']] = 'if (' + get_coerced_access('lx') + ') { pc = pc + ((inst >> 16) << 2) | 0; continue; }' CASES[ROPCODES['BRF']] = 'if (!(' + get_coerced_access('lx') + ')) { pc = pc + ((inst >> 16) << 2) | 0; continue; }' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 930d542c16f9d..8256e711f5528 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5934,8 +5934,6 @@ function emterpretify(ast) { assert(shifts >= 0 && shifts <= 3); var bits = Math.pow(2, shifts)*8; assert(bits === temp.bits); - - var pointer = target[2][2]; if (pointer[0] === 'binary' && pointer[1] === '+') { // optimized store + add @@ -5946,8 +5944,17 @@ function emterpretify(ast) { var ret = x[1].concat(y[1]).concat(z[1]); ret.push(opcode, releaseIfFree(x[0]), releaseIfFree(y[0]), releaseIfFree(z[0])); return [-1, ret]; + } else if (value[0] === 'sub' && value[1][0] === 'name' && value[1][1] === heap && value[2][0] === 'binary' && value[2][1] === '>>') { + // a copy: store the result of a load, identical heap, identical shifts + assert(value[2][3][0] === 'num' && value[2][3][1] === shifts); + opcode += 'C'; + var x = getReg(pointer, false, ASM_INT, ASM_SIGNED); + var y = getReg(value[2][2]); + var ret = x[1].concat(y[1]); + ret.push(opcode, releaseIfFree(x[0]), releaseIfFree(y[0]), 0); + return [-1, ret]; } else { - var x = getReg(target[2][2], false, ASM_INT, ASM_SIGNED); + var x = getReg(pointer, false, ASM_INT, ASM_SIGNED); var y = getReg(value); // generate y now, not earlier, to not trample x's output reg, which might be a temp var ret = x[1].concat(y[1]); ret.push(opcode, releaseIfFree(x[0]), releaseIfFree(y[0]), 0); From 9212547dcfcec38fb4fef940c504ac1eb4cfd31e Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 1 Oct 2014 11:18:37 -0700 Subject: [PATCH 292/461] refactor optimized load generation --- tools/js-optimizer.js | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 8256e711f5528..a0b73144287c6 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6190,20 +6190,22 @@ function emterpretify(ast) { var bits = Math.pow(2, shifts)*8; assert(bits === temp.bits); var pointer = node[2][2]; - if (pointer[0] === 'binary' && pointer[1] === '+') { + var y = getReg(pointer, false, ASM_INT, ASM_SIGNED); + var yLast = y[1][y[1].length-4]; + if (yLast === 'ADD') { // optimized load + add - opcode += 'A'; - var y = getReg(pointer[2], false, ASM_INT, ASM_SIGNED); - var z = getReg(pointer[3], false, ASM_INT, ASM_SIGNED); - var x = assignTo >= 0 ? assignTo : getFree(y[0], z[0]); - y[1] = y[1].concat(z[1]); - y[1].push(opcode, x, releaseIfFree(y[0], x), releaseIfFree(z[0], x)); - return [x, y[1]]; + y[1][y[1].length-4] = opcode + 'A'; + if (assignTo >= 0) { + releaseIfFree(y[0]); + y[1][y[1].length-3] = assignTo; + y[0] = assignTo; + } + return y; } else { - var y = getReg(node[2][2], false, ASM_INT, ASM_SIGNED); var x = assignTo >= 0 ? assignTo : getFree(y[0]); y[1].push(opcode, x, releaseIfFree(y[0], x), 0); - return [x, y[1]]; + y[0] = x; + return y; } } else { assert(node[2][0] === 'num'); // HEAP32[8] or such From d9e5c28c4ba295ba6add18727491e59de043bd9f Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 1 Oct 2014 11:36:24 -0700 Subject: [PATCH 293/461] refactor optimized store generation --- tools/js-optimizer.js | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index a0b73144287c6..8044e55b6ac6f 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5825,6 +5825,12 @@ function emterpretify(ast) { freeLocals.push(l); return l; } + function unreleaseFree(l) { + assert(l >= numLocals && l <= maxLocal); + var i = freeLocals.indexOf(l); + assert(l >= 0); + freeLocals.splice(i, 1); + } function isFree(l) { return l >= numLocals; @@ -5935,26 +5941,28 @@ function emterpretify(ast) { var bits = Math.pow(2, shifts)*8; assert(bits === temp.bits); var pointer = target[2][2]; - if (pointer[0] === 'binary' && pointer[1] === '+') { + var x = getReg(pointer, false, ASM_INT, ASM_SIGNED); + var xLast = x[1][x[1].length-4]; + if (xLast === 'ADD') { // optimized store + add - opcode += 'A'; - var x = getReg(pointer[2], false, ASM_INT, ASM_SIGNED); - var y = getReg(pointer[3], false, ASM_INT, ASM_SIGNED); + var curr = x[1].slice(x[1].length-4); + x[1].splice(x[1].length-4, 4); + if (curr[2] !== x[0]) unreleaseIfFree(curr[2]); // make sure these are kept alie during z's operations, we are + if (curr[3] !== x[0]) unreleaseIfFree(curr[3]); // putting code in between their definition and use var z = getReg(value); - var ret = x[1].concat(y[1]).concat(z[1]); - ret.push(opcode, releaseIfFree(x[0]), releaseIfFree(y[0]), releaseIfFree(z[0])); + if (x[0] !== curr[2] && x[0] !== curr[3]) releaseIfFree(x[0]); + curr = [opcode + 'A', releaseIfFree(curr[2]), releaseIfFree(curr[3]), releaseIfFree(z[0])]; + var ret = x[1].concat(z[1]).concat(curr); return [-1, ret]; } else if (value[0] === 'sub' && value[1][0] === 'name' && value[1][1] === heap && value[2][0] === 'binary' && value[2][1] === '>>') { // a copy: store the result of a load, identical heap, identical shifts assert(value[2][3][0] === 'num' && value[2][3][1] === shifts); opcode += 'C'; - var x = getReg(pointer, false, ASM_INT, ASM_SIGNED); var y = getReg(value[2][2]); var ret = x[1].concat(y[1]); ret.push(opcode, releaseIfFree(x[0]), releaseIfFree(y[0]), 0); return [-1, ret]; } else { - var x = getReg(pointer, false, ASM_INT, ASM_SIGNED); var y = getReg(value); // generate y now, not earlier, to not trample x's output reg, which might be a temp var ret = x[1].concat(y[1]); ret.push(opcode, releaseIfFree(x[0]), releaseIfFree(y[0]), 0); @@ -6232,6 +6240,9 @@ function emterpretify(ast) { if (l >= numLocals) releaseFree(l, possible); return l; } + function unreleaseIfFree(l) { + if (l >= numLocals) unreleaseFree(l); + } function makeSet(dst, src, type) { if (dst === src) return []; From 7c5c2397f9b5213b8b7932f517f9f446cdca7a15 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 1 Oct 2014 13:11:12 -0700 Subject: [PATCH 294/461] typo fix --- tools/js-optimizer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 8044e55b6ac6f..d906d2aa845e4 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5947,7 +5947,7 @@ function emterpretify(ast) { // optimized store + add var curr = x[1].slice(x[1].length-4); x[1].splice(x[1].length-4, 4); - if (curr[2] !== x[0]) unreleaseIfFree(curr[2]); // make sure these are kept alie during z's operations, we are + if (curr[2] !== x[0]) unreleaseIfFree(curr[2]); // make sure these are kept alive during z's operations, we are if (curr[3] !== x[0]) unreleaseIfFree(curr[3]); // putting code in between their definition and use var z = getReg(value); if (x[0] !== curr[2] && x[0] !== curr[3]) releaseIfFree(x[0]); From dba085382912c8adf845d7322deeec6ff3711e30 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 1 Oct 2014 13:15:43 -0700 Subject: [PATCH 295/461] adjust benchmarking --- tests/test_benchmark.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_benchmark.py b/tests/test_benchmark.py index 46756e15208fb..f7e2c828f6349 100644 --- a/tests/test_benchmark.py +++ b/tests/test_benchmark.py @@ -113,8 +113,8 @@ def process(filename): '-s', 'TOTAL_MEMORY=128*1024*1024', #'--profiling', #'--closure', '1', - #'-o', final] + shared_args + emcc_args + self.extra_args, stdout=PIPE, stderr=PIPE, env=self.env).communicate() - '-o', final] + shared_args + emcc_args + self.extra_args, stdout=None, stderr=None, env=self.env).communicate() + '-o', final] + shared_args + emcc_args + self.extra_args, stdout=PIPE, stderr=PIPE, env=self.env).communicate() + #'-o', final] + shared_args + emcc_args + self.extra_args, stdout=None, stderr=None, env=self.env).communicate() assert os.path.exists(final), 'Failed to compile file: ' + output[0] self.filename = final @@ -142,8 +142,8 @@ def run(self, args): #NativeBenchmarker('gcc', 'gcc', 'g++'), #JSBenchmarker('sm-f32', SPIDERMONKEY_ENGINE, ['-s', 'PRECISE_F32=2']), JSBenchmarker('sm', SPIDERMONKEY_ENGINE), - #JSBenchmarker('sm-ion', SPIDERMONKEY_ENGINE + ['--no-asmjs']), - #JSBenchmarker('sm-baseline', SPIDERMONKEY_ENGINE + ['--no-asmjs', '--no-ion']), + JSBenchmarker('sm-ion', SPIDERMONKEY_ENGINE + ['--no-asmjs']), + JSBenchmarker('sm-baseline', SPIDERMONKEY_ENGINE + ['--no-asmjs', '--no-ion']), JSBenchmarker('sm-emterp', SPIDERMONKEY_ENGINE, ['-s', 'EMTERPRETIFY=1']), #JSBenchmarker('sm-interp', SPIDERMONKEY_ENGINE + ['--no-asmjs', '--no-ion', '--no-baseline']), #JSBenchmarker('sm-f32-si', SPIDERMONKEY_ENGINE, ['--profiling', '-s', 'PRECISE_F32=2', '-s', 'SIMPLIFY_IFS=1']), From e8e1b30c5d5f8cbc26826feea6045c51b419ca74 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 1 Oct 2014 14:45:25 -0700 Subject: [PATCH 296/461] disable simd tests in emterpreter --- tests/test_core.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_core.py b/tests/test_core.py index 313390c44a7b3..b3eb4e7bb24a7 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -5178,6 +5178,7 @@ def test_simd6(self): if Settings.ASM_JS: Settings.ASM_JS = 2 # does not validate Settings.PRECISE_F32 = 1 # SIMD currently requires Math.fround if os.environ.get('EMCC_FAST_COMPILER') == '0': return self.skip('needs fastcomp') + if self.is_emterpreter(): return self.skip('todo') test_path = path_from_root('tests', 'core', 'test_simd6') src, output = (test_path + s for s in ('.in', '.out')) @@ -5198,6 +5199,7 @@ def test_simd_dyncall(self): if Settings.ASM_JS: Settings.ASM_JS = 2 # does not validate Settings.PRECISE_F32 = 1 # SIMD currently requires Math.fround if os.environ.get('EMCC_FAST_COMPILER') == '0': return self.skip('needs fastcomp') + if self.is_emterpreter(): return self.skip('todo') test_path = path_from_root('tests', 'core', 'test_simd_dyncall') src, output = (test_path + s for s in ('.cpp', '.txt')) From aa2e5f64cdf7a6687ea0de14701e08c28caf1400 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 1 Oct 2014 13:45:54 -0700 Subject: [PATCH 297/461] STORE*AV --- tools/emterpretify.py | 29 +++++++++++++++++++++++++++-- tools/js-optimizer.js | 9 +++++---- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 39b11baabec19..9b8da87bf63f1 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -116,6 +116,20 @@ 'LOADF32A', 'STOREF32A', + 'LOAD8AV', # [lx, ly, lz] load-add and store-add instructions, whose pointer input is a signed addition: lx = load(ly + lz), store(lx + ly) = lz, where the second add op is 8-bit signed + 'LOADU8AV', + 'LOAD16AV', + 'LOADU16AV', + 'LOAD32AV', + 'STORE8AV', + 'STORE16AV', + 'STORE32AV', + + 'LOADF64AV', + 'STOREF64AV', + 'LOADF32AV', + 'STOREF32AV', + 'STORE8C', 'STORE16C', 'STORE32C', @@ -275,7 +289,6 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['STORE8']] = 'HEAP8[' + get_access('lx') + ' >> 0] = ' + get_coerced_access('ly') + ';' CASES[ROPCODES['STORE16']] = 'HEAP16[' + get_access('lx') + ' >> 1] = ' + get_coerced_access('ly') + ';' CASES[ROPCODES['STORE32']] = 'HEAP32[' + get_access('lx') + ' >> 2] = ' + get_coerced_access('ly') + ';' - CASES[ROPCODES['LOADF64']] = get_access('lx', s='d') + ' = ' + '+HEAPF64[' + get_access('ly') + ' >> 3];' CASES[ROPCODES['STOREF64']] = 'HEAPF64[' + get_access('lx') + ' >> 3] = ' + get_coerced_access('ly', s='d') + ';' CASES[ROPCODES['LOADF32']] = get_access('lx', s='d') + ' = ' + '+HEAPF32[' + get_access('ly') + ' >> 2];' @@ -289,12 +302,24 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['STORE8A']] = 'HEAP8[(' + get_coerced_access('lx') + ') + (' + get_coerced_access('ly') + ') >> 0] = ' + get_coerced_access('lz') + ';' CASES[ROPCODES['STORE16A']] = 'HEAP16[(' + get_coerced_access('lx') + ') + (' + get_coerced_access('ly') + ') >> 1] = ' + get_coerced_access('lz') + ';' CASES[ROPCODES['STORE32A']] = 'HEAP32[(' + get_coerced_access('lx') + ') + (' + get_coerced_access('ly') + ') >> 2] = ' + get_coerced_access('lz') + ';' - CASES[ROPCODES['LOADF64A']] = get_access('lx', s='d') + ' = ' + '+HEAPF64[(' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') >> 3];' CASES[ROPCODES['STOREF64A']] = 'HEAPF64[(' + get_coerced_access('lx') + ') + (' + get_coerced_access('ly') + ') >> 3] = ' + get_coerced_access('lz', s='d') + ';' CASES[ROPCODES['LOADF32A']] = get_access('lx', s='d') + ' = ' + '+HEAPF32[(' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') >> 2];' CASES[ROPCODES['STOREF32A']] = 'HEAPF32[(' + get_coerced_access('lx') + ') + (' + get_coerced_access('ly') + ') >> 2] = ' + get_coerced_access('lz', s='d') + ';' +CASES[ROPCODES['LOAD8AV']] = get_access('lx') + ' = ' + 'HEAP8[(' + get_coerced_access('ly') + ') + (inst >> 24) >> 0];' +CASES[ROPCODES['LOADU8AV']] = get_access('lx') + ' = ' + 'HEAPU8[(' + get_coerced_access('ly') + ') + (inst >> 24) >> 0];' +CASES[ROPCODES['LOAD16AV']] = get_access('lx') + ' = ' + 'HEAP16[(' + get_coerced_access('ly') + ') + (inst >> 24) >> 1];' +CASES[ROPCODES['LOADU16AV']] = get_access('lx') + ' = ' + 'HEAPU16[(' + get_coerced_access('ly') + ') + (inst >> 24) >> 1];' +CASES[ROPCODES['LOAD32AV']] = get_access('lx') + ' = ' + 'HEAP32[(' + get_coerced_access('ly') + ') + (inst >> 24) >> 2];' +CASES[ROPCODES['STORE8AV']] = 'HEAP8[(' + get_coerced_access('lx') + ') + (ly << 24 >> 24) >> 0] = ' + get_coerced_access('lz') + ';' +CASES[ROPCODES['STORE16AV']] = 'HEAP16[(' + get_coerced_access('lx') + ') + (ly << 24 >> 24) >> 1] = ' + get_coerced_access('lz') + ';' +CASES[ROPCODES['STORE32AV']] = 'HEAP32[(' + get_coerced_access('lx') + ') + (ly << 24 >> 24) >> 2] = ' + get_coerced_access('lz') + ';' +CASES[ROPCODES['LOADF64AV']] = get_access('lx', s='d') + ' = ' + '+HEAPF64[(' + get_coerced_access('ly') + ') + (inst >> 24) >> 3];' +CASES[ROPCODES['STOREF64AV']] = 'HEAPF64[(' + get_coerced_access('lx') + ') + (ly << 24 >> 24) >> 3] = ' + get_coerced_access('lz', s='d') + ';' +CASES[ROPCODES['LOADF32AV']] = get_access('lx', s='d') + ' = ' + '+HEAPF32[(' + get_coerced_access('ly') + ') + (inst >> 24) >> 2];' +CASES[ROPCODES['STOREF32AV']] = 'HEAPF32[(' + get_coerced_access('lx') + ') + (ly << 24 >> 24) >> 2] = ' + get_coerced_access('lz', s='d') + ';' + CASES[ROPCODES['STORE8C']] = 'HEAP8[' + get_access('lx') + ' >> 0] = HEAP8[' + get_access('ly') + ' >> 0] | 0;' CASES[ROPCODES['STORE16C']] = 'HEAP16[' + get_access('lx') + ' >> 1] = HEAP16[' + get_access('ly') + ' >> 1] | 0;' CASES[ROPCODES['STORE32C']] = 'HEAP32[' + get_access('lx') + ' >> 2] = HEAP32[' + get_access('ly') + ' >> 2] | 0;' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index c77d665d5bce1..1a63f258174ff 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5979,15 +5979,16 @@ function emterpretify(ast) { var pointer = target[2][2]; var x = getReg(pointer, false, ASM_INT, ASM_SIGNED); var xLast = x[1][x[1].length-4]; - if (xLast === 'ADD') { + if (xLast === 'ADD' || xLast === 'ADDV') { + var v = xLast === 'ADDV'; // optimized store + add var curr = x[1].slice(x[1].length-4); x[1].splice(x[1].length-4, 4); if (curr[2] !== x[0]) unreleaseIfFree(curr[2]); // make sure these are kept alive during z's operations, we are - if (curr[3] !== x[0]) unreleaseIfFree(curr[3]); // putting code in between their definition and use + if (!v && curr[3] !== x[0]) unreleaseIfFree(curr[3]); // putting code in between their definition and use var z = getReg(value); - if (x[0] !== curr[2] && x[0] !== curr[3]) releaseIfFree(x[0]); - curr = [opcode + 'A', releaseIfFree(curr[2]), releaseIfFree(curr[3]), releaseIfFree(z[0])]; + if (x[0] !== curr[2] && (v || x[0] !== curr[3])) releaseIfFree(x[0]); + curr = [opcode + 'A' + (v ? 'V' : ''), releaseIfFree(curr[2]), !v ? releaseIfFree(curr[3]) : curr[3], releaseIfFree(z[0])]; var ret = x[1].concat(z[1]).concat(curr); return [-1, ret]; } else if (value[0] === 'sub' && value[1][0] === 'name' && value[1][1] === heap && value[2][0] === 'binary' && value[2][1] === '>>') { From 428c725d91ec98f8db9c01e254fcd5827a4b2ebc Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 1 Oct 2014 13:48:40 -0700 Subject: [PATCH 298/461] LOAD*AV --- tests/test_other.py | 4 ++-- tools/js-optimizer.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_other.py b/tests/test_other.py index 60827c09a7d20..c92462b27cdc5 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4284,6 +4284,6 @@ def do_log_test(source, expected, func): seen = int(post) assert expected == seen, ['expect', expected, 'but see', seen] - do_log_test(path_from_root('tests', 'primes.cpp'), 86, 'main') - do_log_test(path_from_root('tests', 'fannkuch.cpp'), 240, 'fannkuch_worker') + do_log_test(path_from_root('tests', 'primes.cpp'), 85, 'main') + do_log_test(path_from_root('tests', 'fannkuch.cpp'), 239, 'fannkuch_worker') diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 1a63f258174ff..e0c08f38e4049 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6237,9 +6237,9 @@ function emterpretify(ast) { var pointer = node[2][2]; var y = getReg(pointer, false, ASM_INT, ASM_SIGNED); var yLast = y[1][y[1].length-4]; - if (yLast === 'ADD') { + if (yLast === 'ADD' || yLast === 'ADDV') { // optimized load + add - y[1][y[1].length-4] = opcode + 'A'; + y[1][y[1].length-4] = opcode + 'A' + (yLast === 'ADDV' ? 'V' : ''); if (assignTo >= 0) { releaseIfFree(y[0]); y[1][y[1].length-3] = assignTo; From 1c874bae95f33ea93c5172a7d07dd276a5f1e964 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 1 Oct 2014 14:17:41 -0700 Subject: [PATCH 299/461] todo --- tools/js-optimizer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index e0c08f38e4049..975fb43749130 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6962,7 +6962,7 @@ function emterpretify(ast) { // walkFunction main - var ignore = (func[1] in BLACKLIST) || /^dynCall_.*/.test(func[1]); + var ignore = (func[1] in BLACKLIST) || /^dynCall_.*/.test(func[1]); // TODO: do not convert small funcs || measureSize(func[3]) < 60; if (ignore) { prepDotZero(func); From 0ae2c0385334eb6a2ef573d4ff95a7bbb5e81b68 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 1 Oct 2014 16:46:51 -0700 Subject: [PATCH 300/461] fix up detectType on *,/,% --- tools/js-optimizer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 975fb43749130..bb831366f4bca 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1912,8 +1912,8 @@ function detectType(node, asmInfo, inVarDef) { } case 'binary': { switch (node[1]) { - case '+': case '-': return detectType(node[2], asmInfo, inVarDef); - case '*': case '/': case '%': return ASM_DOUBLE; // uncoerced by |0 etc., these ops are double + case '+': case '-': + case '*': case '/': case '%': return detectType(node[2], asmInfo, inVarDef); case '|': case '&': case '^': case '<<': case '>>': case '>>>': case '==': case '!=': case '<': case '<=': case '>': case '>=': { return ASM_INT; From c0a095052d8e17ac43335b15564a1d1091e3b3f5 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 1 Oct 2014 15:56:24 -0700 Subject: [PATCH 301/461] localCSE pass for emterpreter --- emcc | 3 + tests/test_other.py | 2 + tools/js-optimizer.js | 143 +++++++++++++++++++++ tools/test-js-optimizer-localCSE-output.js | 46 +++++++ tools/test-js-optimizer-localCSE.js | 44 +++++++ 5 files changed, 238 insertions(+) create mode 100644 tools/test-js-optimizer-localCSE-output.js create mode 100644 tools/test-js-optimizer-localCSE.js diff --git a/emcc b/emcc index d160f8b900240..d322c42f5e962 100755 --- a/emcc +++ b/emcc @@ -1410,6 +1410,9 @@ try: js_optimizer_queue += ['simplifyExpressions'] + if shared.Settings.EMTERPRETIFY: # emterpreter code will not run through a JS optimizing JIT, do more work ourselves + js_optimizer_queue += ['localCSE'] + if shared.Settings.RELOOP and not shared.Settings.ASM_JS: js_optimizer_queue += ['optimizeShiftsAggressive', get_eliminate()] # aggressive shifts optimization requires loops, it breaks on switches diff --git a/tests/test_other.py b/tests/test_other.py index c92462b27cdc5..cf201b66d3f4e 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -1895,6 +1895,8 @@ def test_js_optimizer(self): ['asm', 'aggressiveVariableElimination']), (path_from_root('tools', 'test-js-optimizer-pointerMask.js'), open(path_from_root('tools', 'test-js-optimizer-pointerMask-output.js')).read(), ['pointerMasking']), + (path_from_root('tools', 'test-js-optimizer-localCSE.js'), open(path_from_root('tools', 'test-js-optimizer-localCSE-output.js')).read(), + ['asm', 'localCSE']), ]: print input output = Popen(listify(NODE_JS) + [path_from_root('tools', 'js-optimizer.js'), input] + passes, stdin=PIPE, stdout=PIPE).communicate()[0] diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index bb831366f4bca..13e655bcef8a1 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -301,6 +301,11 @@ function dumpSrc(ast) { printErr(astToSrc(ast)); } +function overwrite(x, y) { + for (var i = 0; i < y.length; i++) x[i] = y[i]; + x.length = y.length; +} + // Closure compiler, when inlining, will insert assignments to // undefined for the shared variables. However, in compiled code // - and in library/shell code too! - we should never rely on @@ -813,6 +818,129 @@ function simplifyExpressions(ast) { }); } +function localCSE(ast) { + // very simple CSE/GVN type optimization, factor out common expressions in a single basic block + assert(asm); + var MIN_COST = 3; + traverseGeneratedFunctions(ast, function(func) { + var asmData = normalizeAsm(func); + var counter = 0; + var optimized = false; + traverse(func, function(node, type) { + var stats = getStatements(node); + if (!stats) return; + var exps = {}; // JSON'd expression => [i it first appears on, original node, replacement var, type, sign] + var deps = {}; // dependency (local name, or 'memory' or 'global') + function invalidate(what) { + var list = deps[what]; + if (!list) return; + for (var i = 0; i < list.length; i++) { + delete exps[list[i]]; + } + delete deps[what]; + } + function doInvalidations(curr) { + return traverse(curr, function(node, type) { + if (type in CONTROL_FLOW) { + exps = {}; + deps = {}; + return true; // abort everything + } + if (type === 'assign') { + var target = node[2]; + if (target[0] === 'name') { + var name = target[1]; + if (name in asmData.params || name in asmData.vars) { + invalidate(name); + } else { + invalidate(''); + } + } else { + assert(target[0] === 'sub'); + invalidate(''); + } + } + if (type === 'call') { + invalidate(''); + invalidate(''); + } + }); + } + for (var i = 0; i < stats.length; i++) { + var curr = stats[i]; + // first, look at the entire line and invalidate what we need to + if (doInvalidations(curr) === true) { + continue; // we saw control flow + } + // next, process the line and try to find useful expressions + var skips = []; + traverse(curr, function seekExpressions(node, type) { + if (type === 'sub' && node[1][0] === 'name' && node[2][0] === 'binary' && node[2][1] === '>>') { + // skip over the shift, we can't cse that + skips.push(node[2]); + return; + } + if (type === 'binary' || type === 'unary-prefix') { + if (type === 'binary' && skips.indexOf(node) >= 0) return; + if (measureCost(node) < MIN_COST) return; + var str = JSON.stringify(node); + var lookup = exps[str]; + if (!lookup) { + // add ourselves, and set up our deps + exps[str] = [i, node, null]; + traverse(node, function(node, type) { + var names = []; + if (type === 'name') { + var name = node[1]; + if (!(name in asmData.params || name in asmData.vars)) name = ''; + names.push(name); + } else if (type === 'sub') { + names.push(''); + } else if (type === 'call') { + names.push(''); + names.push(''); + } + names.forEach(function(name) { + if (!deps[name]) deps[name] = []; + deps[name].push(str); + }); + }); + } else { + //printErr('CSEing ' + str); + optimized = true; + var type, sign; + // with the original node plus us, this is worth optimizing out + if (lookup[2] === null) { + // this is the first node after the first. generate the saved var, and optimize out the original + lookup[2] = 'CSE$' + (counter++); + // ensure an asm coercion + type = lookup[3] = detectType(node, asmData); + sign = detectSign(node); + if (sign === ASM_FLEXIBLE) sign = ASM_SIGNED; + lookup[4] = sign; + asmData.vars[lookup[2]] = type; + overwrite(lookup[1], makeSignedAsmCoercion(['name', lookup[2]], type, sign)); + stats.splice(lookup[0], 0, ['stat', ['assign', true, ['name', lookup[2]], makeSignedAsmCoercion(node, type, sign)]]); + i++; + } else { + type = lookup[3]; + sign = lookup[4]; + } + // optimize out ourselves + return makeSignedAsmCoercion(['name', lookup[2]], type, sign); + } + } + }); + // finally, repeat invalidation processing, to not be sensitive to inter-line control flow + doInvalidations(curr); + } + }); + denormalizeAsm(func, asmData); + if (optimized) { + simplifyExpressions(func); // remove double coercions, etc. + } + }); +} function simplifyIfs(ast) { traverseGeneratedFunctions(ast, function(func) { @@ -1933,6 +2061,13 @@ function detectType(node, asmInfo, inVarDef) { assert(0 , 'horrible ' + JSON.stringify(node)); } +function isAsmCoercion(node) { + if (node[0] === 'binary' && ((node[1] === '|' && node[3][0] === 'num' && node[3][1] === 0) || + (node[1] === '>>>' && node[3][0] === 'num' && node[3][1] === 0))) return true; + if (node[0] === 'unary-prefix' && (node[1] === '+' || (node[1] === '~' && node[2][0] === 'unary-prefix' && node[2][1] === '~'))) return true; + return false; +} + function makeAsmCoercion(node, type) { switch (type) { case ASM_INT: return ['binary', '|', node, ['num', 0]]; @@ -1945,6 +2080,12 @@ function makeAsmCoercion(node, type) { } } +function makeSignedAsmCoercion(node, type, sign) { + if (type !== ASM_INT || sign === ASM_SIGNED) return makeAsmCoercion(node, type); + if (sign === ASM_UNSIGNED) return ['binary', '>>>', node, ['num', 0]]; + assert(0); +} + function makeAsmVarDef(v, type) { switch (type) { case ASM_INT: return [v, ['num', 0]]; @@ -2006,6 +2147,7 @@ function detectSign(node) { case '>>>': return ASM_UNSIGNED; case '+': case '-': return ASM_FLEXIBLE; case '*': case '/': return ASM_NONSIGNED; // without a coercion, these are double + case '==': case '!=': case '<': case '<=': case '>': case '>=': return ASM_SIGNED; default: throw 'yikes ' + node[1]; } break; @@ -7201,6 +7343,7 @@ var passes = { simplifyExpressions: simplifyExpressions, optimizeShiftsConservative: optimizeShiftsConservative, optimizeShiftsAggressive: optimizeShiftsAggressive, + localCSE: localCSE, simplifyIfs: simplifyIfs, hoistMultiples: hoistMultiples, loopOptimizer: loopOptimizer, diff --git a/tools/test-js-optimizer-localCSE-output.js b/tools/test-js-optimizer-localCSE-output.js new file mode 100644 index 0000000000000..5f6d5696710cf --- /dev/null +++ b/tools/test-js-optimizer-localCSE-output.js @@ -0,0 +1,46 @@ +function skinning(i1, i3, i5, i19, i4) { + i1 = i1 | 0; + i3 = i3 | 0; + i5 = i5 | 0; + i19 = i19 | 0; + i4 = i4 | 0; + var i2 = 0, i6 = 0, d7 = 0, d8 = 0, d9 = 0, d10 = 0, d11 = 0, d12 = 0, d13 = 0, d14 = 0, d15 = 0, d16 = 0, d17 = 0, d18 = 0, i20 = 0, d21 = 0, i22 = 0, CSE$0 = 0; + i2 = STACKTOP; + if (!i3) { + STACKTOP = i2; + return; + } + while (1) { + i3 = i3 + -1 | 0; + i6 = HEAP32[i19 >> 2] | 0; + d8 = +HEAPF32[i19 + 4 >> 2]; + CSE$0 = i1 + (i6 * 48 | 0) | 0; + d9 = d8 * +HEAPF32[CSE$0 >> 2]; + d14 = d8 * +HEAPF32[CSE$0 + 4 >> 2]; + d7 = d8 * +HEAPF32[CSE$0 + 8 >> 2]; + d11 = d8 * +HEAPF32[CSE$0 + 12 >> 2]; + d12 = d8 * +HEAPF32[CSE$0 + 16 >> 2]; + d15 = d8 * +HEAPF32[CSE$0 + 20 >> 2]; + d16 = d8 * +HEAPF32[CSE$0 + 24 >> 2]; + d17 = d8 * +HEAPF32[CSE$0 + 28 >> 2]; + d18 = d8 * +HEAPF32[CSE$0 + 32 >> 2]; + d13 = d8 * +HEAPF32[CSE$0 + 36 >> 2]; + d10 = d8 * +HEAPF32[CSE$0 + 40 >> 2]; + d8 = d8 * +HEAPF32[CSE$0 + 44 >> 2]; + } + HEAP32[tempDoublePtr + 4 >> 2] | 0; + HEAP8[10] = 15; + HEAP32[tempDoublePtr + 4 >> 2] | 0; +} +function _i64Subtract(a, b, c, d) { + a = a | 0; + b = b | 0; + c = c | 0; + d = d | 0; + var h = 0, CSE$0 = 0; + CSE$0 = b - d | 0; + h = (CSE$0 | 0) >>> 0; + h = (CSE$0 | 0) - (c >>> 0 > a >>> 0 | 0) >>> 0; + return (tempRet0 = h, a - c >>> 0 | 0) | 0; +} + diff --git a/tools/test-js-optimizer-localCSE.js b/tools/test-js-optimizer-localCSE.js new file mode 100644 index 0000000000000..1f3c822973a9a --- /dev/null +++ b/tools/test-js-optimizer-localCSE.js @@ -0,0 +1,44 @@ +function skinning(i1, i3, i5, i19, i4) { + i1 = i1 | 0; + i3 = i3 | 0; + i5 = i5 | 0; + i19 = i19 | 0; + i4 = i4 | 0; + var i2 = 0, i6 = 0, d7 = 0, d8 = 0, d9 = 0, d10 = 0, d11 = 0, d12 = 0, d13 = 0, d14 = 0, d15 = 0, d16 = 0, d17 = 0, d18 = 0, i20 = 0, d21 = 0, i22 = 0; + i2 = STACKTOP; + if (!i3) { + STACKTOP = i2; + return; + } + while (1) { + i3 = i3 + -1 | 0; + i6 = HEAP32[i19 >> 2] | 0; + d8 = +HEAPF32[i19 + 4 >> 2]; + d9 = d8 * +HEAPF32[i1 + (i6 * 48 | 0) >> 2]; + d14 = d8 * +HEAPF32[i1 + (i6 * 48 | 0) + 4 >> 2]; + d7 = d8 * +HEAPF32[i1 + (i6 * 48 | 0) + 8 >> 2]; + d11 = d8 * +HEAPF32[i1 + (i6 * 48 | 0) + 12 >> 2]; + d12 = d8 * +HEAPF32[i1 + (i6 * 48 | 0) + 16 >> 2]; + d15 = d8 * +HEAPF32[i1 + (i6 * 48 | 0) + 20 >> 2]; + d16 = d8 * +HEAPF32[i1 + (i6 * 48 | 0) + 24 >> 2]; + d17 = d8 * +HEAPF32[i1 + (i6 * 48 | 0) + 28 >> 2]; + d18 = d8 * +HEAPF32[i1 + (i6 * 48 | 0) + 32 >> 2]; + d13 = d8 * +HEAPF32[i1 + (i6 * 48 | 0) + 36 >> 2]; + d10 = d8 * +HEAPF32[i1 + (i6 * 48 | 0) + 40 >> 2]; + d8 = d8 * +HEAPF32[i1 + (i6 * 48 | 0) + 44 >> 2]; + } + HEAP32[tempDoublePtr + 4 >> 2] | 0; + HEAP8[10] = 15; + HEAP32[tempDoublePtr + 4 >> 2] | 0; +} +function _i64Subtract(a, b, c, d) { + a = a | 0; + b = b | 0; + c = c | 0; + d = d | 0; + var h = 0; + h = b - d >>> 0; + h = b - d - (c >>> 0 > a >>> 0 | 0) >>> 0; + return (tempRet0 = h, a - c >>> 0 | 0) | 0; +} +// EMSCRIPTEN_GENERATED_FUNCTIONS: ["skinning", "_i64Subtract"] From 46bfe3ad6f3d32c24f89536c6502e40e8c65f721 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 1 Oct 2014 21:24:16 -0700 Subject: [PATCH 302/461] optimize simple conditionals --- tests/test_other.py | 2 +- tools/emterpretify.py | 6 ++++++ tools/js-optimizer.js | 14 ++++++++++++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/tests/test_other.py b/tests/test_other.py index cf201b66d3f4e..1de19eddbcc50 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4287,5 +4287,5 @@ def do_log_test(source, expected, func): assert expected == seen, ['expect', expected, 'but see', seen] do_log_test(path_from_root('tests', 'primes.cpp'), 85, 'main') - do_log_test(path_from_root('tests', 'fannkuch.cpp'), 239, 'fannkuch_worker') + do_log_test(path_from_root('tests', 'fannkuch.cpp'), 233, 'fannkuch_worker') diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 9b8da87bf63f1..affdf249fd651 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -143,6 +143,9 @@ 'BRTA', # [cond, 0, 0] [addr] if cond, jump to addr 'BRFA', # [cond, 0, 0] [addr] if !cond, jump to addr + 'COND', # [out, cond, x] [y] out = cond ? x : y, int + 'CONDD', # [out, cond, x] [y] out = cond ? x : y, double + 'GETTDP', # [l, 0, 0] l = tempDoublePtr 'GETTR0', # [l, 0, 0] l = tempRet0 'SETTR0', # [l, 0, 0] tempRet0 = l @@ -333,6 +336,9 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['BRTA']] = 'pc = pc + 4 | 0; if (' + get_coerced_access('lx') + ') { pc = HEAP32[pc >> 2] | 0; continue; }' CASES[ROPCODES['BRFA']] = 'pc = pc + 4 | 0; if (!(' + get_coerced_access('lx') + ')) { pc = HEAP32[pc >> 2] | 0; continue; }' +CASES[ROPCODES['COND']] = 'pc = pc + 4 | 0; ' + get_access('lx') + ' = (' + get_coerced_access('ly') + ') ? (' + get_coerced_access('lz') + ') : (' + get_coerced_access('(HEAPU8[pc >> 0] | 0)') + ');' +CASES[ROPCODES['CONDD']] = 'pc = pc + 4 | 0; ' + get_access('lx', s='d') + ' = (' + get_coerced_access('ly') + ') ? (' + get_coerced_access('lz', s='d') + ') : (' + get_coerced_access('(HEAPU8[pc >> 0] | 0)', s='d') + ');' + CASES[ROPCODES['GETTDP']] = 'HEAP32[sp + (lx << 3) >> 2] = tempDoublePtr;' #CASES[ROPCODES['GETPC']] = 'HEAP32[sp + (lx << 3) >> 2] = pc;' CASES[ROPCODES['GETTR0']] = 'HEAP32[sp + (lx << 3) >> 2] = tempRet0;' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 13e655bcef8a1..f8df17ff252ae 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6342,11 +6342,21 @@ function emterpretify(ast) { return [-1, ret]; } case 'conditional': { - // TODO: optimize // TODO: handle dropIt + var type = detectType(node[2], asmData); + if ((node[2][0] === 'name' || getNum(node[2]) !== null) && + (node[3][0] === 'name' || getNum(node[3]) !== null)) { + // this is a simple choice between concrete values, no need for control flow here + var out = assignTo >= 0 ? assignTo : getFree(); + var condition = getReg(node[1]); + var ifTrue = getReg(node[2]); + var ifFalse = getReg(node[3]); + return [out, condition[1].concat(ifTrue[1]).concat(ifFalse[1]).concat( + [type === ASM_INT ? 'COND' : 'CONDD', out, releaseIfFree(condition[0]), releaseIfFree(ifTrue[0]), releaseIfFree(ifFalse[0]), 0, 0, 0] + )]; + } var otherwise = getRelative('cond-else'), exit = getRelative('cond-exit'); var temp = getFree(); - var type = detectType(node[2], asmData); assert(type !== ASM_NONE); var ret = makeBranchIfFalse(node[1], otherwise); var first = getReg(node[2]); From 4617d660324c41dd6852242c5d40cb59b65869a9 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 2 Oct 2014 11:24:30 -0700 Subject: [PATCH 303/461] disable emterpreter asserts by default --- tools/emterpretify.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index affdf249fd651..1622f85ab5e50 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -411,7 +411,10 @@ def fix_case(case): # we increment pc at the top of the loop. cases doing 'continue' really need to decrement it return case.replace('continue;', 'CONTINUE').replace('break;', 'continue;').replace('CONTINUE', 'pc = pc - 4 | 0; continue;').replace('continue; continue;', 'continue;') - return r''' + def process(code): + return code.replace('assert(', '//assert(') + + return process(r''' function emterpret%s%s(pc) { pc = pc | 0; var sp = 0, inst = 0, lx = 0, ly = 0, lz = 0; @@ -448,7 +451,7 @@ def fix_case(case): json.dumps(OPCODES), '\n'.join([fix_case(' case %d: %s break;' % (k, CASES[k])) for k in sorted(CASES.keys())]), '' if t == 'void' else 'return %s;' % shared.JS.make_initializer(t[0], settings) -) +)) # main From 0185feab74bd7a8a839bb64cb37fca033f8de516 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 2 Oct 2014 12:03:32 -0700 Subject: [PATCH 304/461] refactor emterpreter main loop generation --- tools/emterpretify.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 1622f85ab5e50..148c64cec4771 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -96,7 +96,6 @@ 'STORE8', # [lx, ly, 0] HEAP8[lx >> 2] = ly 'STORE16', # [lx, ly, 0] HEAP16[lx >> 2] = ly 'STORE32', # [lx, ly, 0] HEAP32[lx >> 2] = ly - 'LOADF64', # [lx, ly, 0] lx = HEAPF64[ly >> 3] 'STOREF64', # [lx, ly, 0] HEAPF64[lx >> 3] = ly 'LOADF32', # [lx, ly, 0] lx = HEAPF32[ly >> 3] @@ -110,7 +109,6 @@ 'STORE8A', 'STORE16A', 'STORE32A', - 'LOADF64A', 'STOREF64A', 'LOADF32A', @@ -124,7 +122,6 @@ 'STORE8AV', 'STORE16AV', 'STORE32AV', - 'LOADF64AV', 'STOREF64AV', 'LOADF32AV', @@ -414,6 +411,12 @@ def fix_case(case): def process(code): return code.replace('assert(', '//assert(') + main_loop = r''' switch (inst&255) { +%s + default: assert(0); + } +''' % ('\n'.join([fix_case(' case %d: %s break;' % (k, CASES[k])) for k in sorted(CASES.keys())])) + return process(r''' function emterpret%s%s(pc) { pc = pc | 0; @@ -438,10 +441,7 @@ def process(code): lz = inst >>> 24; //print([pc, inst&255, %s[inst&255], lx, ly, lz, HEAPU8[pc + 4],HEAPU8[pc + 5],HEAPU8[pc + 6],HEAPU8[pc + 7]].join(', ')); //printErr(' ' + Array.prototype.slice.call(HEAPU8, sp, sp+8)); - switch (inst&255) { %s - default: assert(0); - } } %s }''' % ( @@ -449,7 +449,7 @@ def process(code): '' if t == 'void' else t[0], ROPCODES['FUNC'], json.dumps(OPCODES), - '\n'.join([fix_case(' case %d: %s break;' % (k, CASES[k])) for k in sorted(CASES.keys())]), + main_loop, '' if t == 'void' else 'return %s;' % shared.JS.make_initializer(t[0], settings) )) From 67f056d48c42c5d8a743f53376588aa80e85db59 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 2 Oct 2014 12:08:49 -0700 Subject: [PATCH 305/461] do not emit a void emterpreter, reuse the _i and drop the return value --- tools/emterpretify.py | 2 +- tools/js-optimizer.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 148c64cec4771..f61231aba4270 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -649,7 +649,7 @@ def process_code(func, code, absolute_targets): lines[i] = lines[i].replace(call, '(%s)' % (funcs[func] + code_start)) # finalize funcs JS -asm.funcs_js = '\n'.join(['\n'.join(lines), make_emterpreter('void'), make_emterpreter('int'), make_emterpreter('double')]) +asm.funcs_js = '\n'.join(['\n'.join(lines), make_emterpreter('int'), make_emterpreter('double')]) lines = None # set up emterpreter stack top diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index f8df17ff252ae..e784cbd9e32c3 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -7184,14 +7184,14 @@ function emterpretify(ast) { switch (type) { case ASM_INT: theName[1] += '_i'; break; case ASM_DOUBLE: theName[1] += '_d'; break; - case ASM_FLOAT: theName[1] += '_f'; break; default: throw 'bad'; } } return node[0] !== 'var'; }); if (asmData.ret === undefined) { - func[3].push(['stat', theCall]); + theName[1] += '_i'; // void funcs reuse _i, and ignore the return value + func[3].push(['stat', makeAsmCoercion(theCall, ASM_INT)]); } // do some pre-calculation and optimization From 8ae77e4077df27cb2b2a3de17863d14dfd431abc Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 2 Oct 2014 14:10:39 -0700 Subject: [PATCH 306/461] innerterpreter option --- tools/emterpretify.py | 48 +++++++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index f61231aba4270..32a4546f44853 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -11,6 +11,8 @@ # params +INNERTERPRETER_LAST_OPCODE = 0 # 'CONDD' + EMT_STACK_MAX = 1024*1024 LOG_CODE = os.environ.get('EMCC_LOG_EMTERPRETER_CODE') @@ -147,7 +149,7 @@ 'GETTR0', # [l, 0, 0] l = tempRet0 'SETTR0', # [l, 0, 0] tempRet0 = l 'GETGLBI', # [l, vl, vh] get global value, int, indexed by v - 'GETGLBD', # [l, vl, vh] get global value, double, indexed by v + #'GETGLBD', # [l, vl, vh] get global value, double, indexed by v 'SETGLBI', # [vl, vh, l] set global value, int, indexed by v (v = l) 'CALL', # [lx, targetl, targeth] [params...] (lx = ) target(params..) lx's existence and type depend on the target's actual callsig; # this instruction can take multiple 32-bit instruction chunks @@ -411,11 +413,44 @@ def fix_case(case): def process(code): return code.replace('assert(', '//assert(') - main_loop = r''' switch (inst&255) { + main_loop_prefix = r''' //print('last lx (' + lx + '): ' + [HEAP32[sp + (lx << 3) >> 2]|0, +HEAPF64[sp + (lx << 3) >> 3]]); + pc = pc + 4 | 0; + inst = HEAP32[pc>>2]|0; + lx = (inst >> 8) & 255; + ly = (inst >> 16) & 255; + lz = inst >>> 24; + //print([pc, inst&255, %s[inst&255], lx, ly, lz, HEAPU8[pc + 4],HEAPU8[pc + 5],HEAPU8[pc + 6],HEAPU8[pc + 7]].join(', ')); + //printErr(' ' + Array.prototype.slice.call(HEAPU8, sp, sp+8)); +''' % (json.dumps(OPCODES)) + + if not INNERTERPRETER_LAST_OPCODE: + main_loop = main_loop_prefix + r''' + switch (inst&255) { %s default: assert(0); } ''' % ('\n'.join([fix_case(' case %d: %s break;' % (k, CASES[k])) for k in sorted(CASES.keys())])) + else: + # emit an inner interpreter (innerterpreter) loop, of trivial opcodes that hopefully the JS engine will implement with no spills + assert OPCODES[-1] == 'FUNC' # we don't need to emit that one + main_loop = r''' innerterpreter: while (1) { +%s + switch (inst&255) { +%s +%s + default: break innerterpreter; + } + } + switch (inst&255) { +%s + default: assert(0); + } +''' % ( + ' ' + '\n '.join(main_loop_prefix.split('\n')), + '\n'.join([fix_case(' case %d: %s break;' % (ROPCODES[k], CASES[ROPCODES[k]])) for k in OPCODES[:-1][:ROPCODES[INNERTERPRETER_LAST_OPCODE]+1]]), + '\n'.join([fix_case(' case %d:' % (ROPCODES[k])) for k in OPCODES[:-1][ROPCODES[INNERTERPRETER_LAST_OPCODE]+1:]]), + '\n'.join([fix_case(' case %d: %s break;' % (ROPCODES[k], CASES[ROPCODES[k]])) for k in OPCODES[:-1][ROPCODES[INNERTERPRETER_LAST_OPCODE]+1:]]) +) return process(r''' function emterpret%s%s(pc) { @@ -433,14 +468,6 @@ def process(code): } //print('enter func ' + [pc, HEAPU8[pc + 0],HEAPU8[pc + 1],HEAPU8[pc + 2],HEAPU8[pc + 3],HEAPU8[pc + 4],HEAPU8[pc + 5],HEAPU8[pc + 6],HEAPU8[pc + 7]].join(', ')); while (1) { - //print('last lx (' + lx + '): ' + [HEAP32[sp + (lx << 3) >> 2]|0, +HEAPF64[sp + (lx << 3) >> 3]]); - pc = pc + 4 | 0; - inst = HEAP32[pc>>2]|0; - lx = (inst >> 8) & 255; - ly = (inst >> 16) & 255; - lz = inst >>> 24; - //print([pc, inst&255, %s[inst&255], lx, ly, lz, HEAPU8[pc + 4],HEAPU8[pc + 5],HEAPU8[pc + 6],HEAPU8[pc + 7]].join(', ')); - //printErr(' ' + Array.prototype.slice.call(HEAPU8, sp, sp+8)); %s } %s @@ -448,7 +475,6 @@ def process(code): '_' if t != 'void' else '', '' if t == 'void' else t[0], ROPCODES['FUNC'], - json.dumps(OPCODES), main_loop, '' if t == 'void' else 'return %s;' % shared.JS.make_initializer(t[0], settings) )) From f17aaad72a219c1d3d33649b4fa19245c9061aab Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 2 Oct 2014 14:58:24 -0700 Subject: [PATCH 307/461] refactoring --- tests/test_benchmark.py | 4 ++-- tools/emterpretify.py | 22 +++++++++++----------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/tests/test_benchmark.py b/tests/test_benchmark.py index f7e2c828f6349..c86dead681216 100644 --- a/tests/test_benchmark.py +++ b/tests/test_benchmark.py @@ -142,8 +142,8 @@ def run(self, args): #NativeBenchmarker('gcc', 'gcc', 'g++'), #JSBenchmarker('sm-f32', SPIDERMONKEY_ENGINE, ['-s', 'PRECISE_F32=2']), JSBenchmarker('sm', SPIDERMONKEY_ENGINE), - JSBenchmarker('sm-ion', SPIDERMONKEY_ENGINE + ['--no-asmjs']), - JSBenchmarker('sm-baseline', SPIDERMONKEY_ENGINE + ['--no-asmjs', '--no-ion']), + #JSBenchmarker('sm-ion', SPIDERMONKEY_ENGINE + ['--no-asmjs']), + #JSBenchmarker('sm-baseline', SPIDERMONKEY_ENGINE + ['--no-asmjs', '--no-ion']), JSBenchmarker('sm-emterp', SPIDERMONKEY_ENGINE, ['-s', 'EMTERPRETIFY=1']), #JSBenchmarker('sm-interp', SPIDERMONKEY_ENGINE + ['--no-asmjs', '--no-ion', '--no-baseline']), #JSBenchmarker('sm-f32-si', SPIDERMONKEY_ENGINE, ['--profiling', '-s', 'PRECISE_F32=2', '-s', 'SIMPLIFY_IFS=1']), diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 32a4546f44853..0862a0cabcf6e 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -214,9 +214,9 @@ def get_coerced_access(l, s='i', unsigned=False): CASES = {} CASES[ROPCODES['SET']] = get_access('lx') + ' = ' + get_coerced_access('ly') + ';' -CASES[ROPCODES['GETST']] = 'HEAP32[sp + (lx << 3) >> 2] = STACKTOP;' -CASES[ROPCODES['SETST']] = 'STACKTOP = HEAP32[sp + (lx << 3) >> 2]|0;' -CASES[ROPCODES['SETVI']] = 'HEAP32[sp + (lx << 3) >> 2] = inst >> 16;' +CASES[ROPCODES['GETST']] = get_access('lx') + ' = STACKTOP;' +CASES[ROPCODES['SETST']] = 'STACKTOP = ' + get_coerced_access('lx') + ';' +CASES[ROPCODES['SETVI']] = get_access('lx') + ' = inst >> 16;' CASES[ROPCODES['SETVIB']] = 'pc = pc + 4 | 0; ' + get_access('lx') + ' = HEAP32[pc >> 2] | 0;' CASES[ROPCODES['ADD']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') + (' + get_coerced_access('lz') + ') | 0;' @@ -338,9 +338,9 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['COND']] = 'pc = pc + 4 | 0; ' + get_access('lx') + ' = (' + get_coerced_access('ly') + ') ? (' + get_coerced_access('lz') + ') : (' + get_coerced_access('(HEAPU8[pc >> 0] | 0)') + ');' CASES[ROPCODES['CONDD']] = 'pc = pc + 4 | 0; ' + get_access('lx', s='d') + ' = (' + get_coerced_access('ly') + ') ? (' + get_coerced_access('lz', s='d') + ') : (' + get_coerced_access('(HEAPU8[pc >> 0] | 0)', s='d') + ');' -CASES[ROPCODES['GETTDP']] = 'HEAP32[sp + (lx << 3) >> 2] = tempDoublePtr;' -#CASES[ROPCODES['GETPC']] = 'HEAP32[sp + (lx << 3) >> 2] = pc;' -CASES[ROPCODES['GETTR0']] = 'HEAP32[sp + (lx << 3) >> 2] = tempRet0;' +CASES[ROPCODES['GETTDP']] = get_access('lx') + ' = tempDoublePtr;' +#CASES[ROPCODES['GETPC']] = get_access('lx') + ' = pc;' +CASES[ROPCODES['GETTR0']] = get_access('lx') + ' = tempRet0;' CASES[ROPCODES['SETTR0']] = 'tempRet0 = ' + get_coerced_access('lx') + ';' CASES[ROPCODES['SWITCH']] = ''' lz = ''' + get_coerced_access('lz') + '''; @@ -358,9 +358,9 @@ def make_emterpreter(t): if t == 'void': CASES[ROPCODES['RET']] += 'return;' elif t == 'int': - CASES[ROPCODES['RET']] += 'return HEAP32[sp + (lx << 3) >> 2]|0;' + CASES[ROPCODES['RET']] += 'return ' + get_coerced_access('lx') + ';' elif t == 'double': - CASES[ROPCODES['RET']] += 'return +HEAPF64[sp + (lx << 3) >> 3];' + CASES[ROPCODES['RET']] += 'return ' + get_coerced_access('lx', s='d') + ';' # call is generated using information of actual call patterns if ROPCODES['CALL'] not in CASES: @@ -413,14 +413,13 @@ def fix_case(case): def process(code): return code.replace('assert(', '//assert(') - main_loop_prefix = r''' //print('last lx (' + lx + '): ' + [HEAP32[sp + (lx << 3) >> 2]|0, +HEAPF64[sp + (lx << 3) >> 3]]); + main_loop_prefix = r''' //print('last lx (' + lx + '): ' + [''' + get_coerced_access('lx') + ',' + get_coerced_access('lx', s='d') + ''']); pc = pc + 4 | 0; inst = HEAP32[pc>>2]|0; lx = (inst >> 8) & 255; ly = (inst >> 16) & 255; lz = inst >>> 24; //print([pc, inst&255, %s[inst&255], lx, ly, lz, HEAPU8[pc + 4],HEAPU8[pc + 5],HEAPU8[pc + 6],HEAPU8[pc + 7]].join(', ')); - //printErr(' ' + Array.prototype.slice.call(HEAPU8, sp, sp+8)); ''' % (json.dumps(OPCODES)) if not INNERTERPRETER_LAST_OPCODE: @@ -463,7 +462,7 @@ def process(code): assert(((EMTSTACKTOP|0) <= (EMT_STACK_MAX|0))|0); ly = HEAPU8[pc + 2 >> 0] | 0; while ((ly | 0) < (lx | 0)) { // clear the non-param locals - HEAPF64[sp + (ly << 3) >> 3] = +0; + %s = +0; ly = ly + 1 | 0; } //print('enter func ' + [pc, HEAPU8[pc + 0],HEAPU8[pc + 1],HEAPU8[pc + 2],HEAPU8[pc + 3],HEAPU8[pc + 4],HEAPU8[pc + 5],HEAPU8[pc + 6],HEAPU8[pc + 7]].join(', ')); @@ -475,6 +474,7 @@ def process(code): '_' if t != 'void' else '', '' if t == 'void' else t[0], ROPCODES['FUNC'], + get_access('ly', s='d'), main_loop, '' if t == 'void' else 'return %s;' % shared.JS.make_initializer(t[0], settings) )) From e5e4a6aa9800964d2aceb559b9e10f6600fc7fa7 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 2 Oct 2014 17:14:11 -0700 Subject: [PATCH 308/461] fix assert disabling --- tools/emterpretify.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 0862a0cabcf6e..67d4f9f3a8b0a 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -411,7 +411,7 @@ def fix_case(case): return case.replace('continue;', 'CONTINUE').replace('break;', 'continue;').replace('CONTINUE', 'pc = pc - 4 | 0; continue;').replace('continue; continue;', 'continue;') def process(code): - return code.replace('assert(', '//assert(') + return code.replace(' assert(', ' //assert(') main_loop_prefix = r''' //print('last lx (' + lx + '): ' + [''' + get_coerced_access('lx') + ',' + get_coerced_access('lx', s='d') + ''']); pc = pc + 4 | 0; From 160e8049f298791f179027c39c2e14ba10f2e2bd Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 3 Oct 2014 12:12:56 -0700 Subject: [PATCH 309/461] option to customize GLOBAL_BASE --- emscripten.py | 2 ++ src/jsifier.js | 2 +- src/runtime.js | 2 +- src/settings.js | 3 +++ 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/emscripten.py b/emscripten.py index 9d23047e1b450..14d93a92acd08 100755 --- a/emscripten.py +++ b/emscripten.py @@ -782,6 +782,8 @@ def emscript_fast(infile, settings, outfile, libraries=[], compiler_engine=None, backend_args += ['-emscripten-assertions=%d' % settings['ASSERTIONS']] if settings['ALIASING_FUNCTION_POINTERS'] == 0: backend_args += ['-emscripten-no-aliasing-function-pointers'] + if settings['GLOBAL_BASE'] >= 0: + backend_args += ['-emscripten-global-base=%d' % settings['GLOBAL_BASE']] backend_args += ['-O' + str(settings['OPT_LEVEL'])] backend_args += ['-emscripten-max-setjmps=%d' % settings['MAX_SETJMPS']] if DEBUG: diff --git a/src/jsifier.js b/src/jsifier.js index fd75ccc9f36e2..a717b79861942 100644 --- a/src/jsifier.js +++ b/src/jsifier.js @@ -1720,7 +1720,7 @@ function JSify(data, functionsOnly) { if ((phase == 'pre' || phase == 'glue') && !Variables.generatedGlobalBase && !BUILD_AS_SHARED_LIB) { Variables.generatedGlobalBase = true; // Globals are done, here is the rest of static memory - assert((TARGET_ASMJS_UNKNOWN_EMSCRIPTEN && Runtime.GLOBAL_BASE == 8) || (TARGET_X86 && Runtime.GLOBAL_BASE == 4)); // this is assumed in e.g. relocations for linkable modules + assert(TARGET_ASMJS_UNKNOWN_EMSCRIPTEN || (TARGET_X86 && Runtime.GLOBAL_BASE == 4)); // this is assumed in e.g. relocations for linkable modules if (!SIDE_MODULE) { print('STATIC_BASE = ' + Runtime.GLOBAL_BASE + ';\n'); print('STATICTOP = STATIC_BASE + ' + Runtime.alignMemory(Variables.nextIndexedOffset) + ';\n'); diff --git a/src/runtime.js b/src/runtime.js index 3fb56913a63b1..db9bebebd245f 100644 --- a/src/runtime.js +++ b/src/runtime.js @@ -664,7 +664,7 @@ function reSign(value, bits, ignore) { // Above 0 is static memory, starting with globals. // Then the stack. // Then 'dynamic' memory for sbrk. -Runtime.GLOBAL_BASE = TARGET_X86 ? 4 : 8; +Runtime.GLOBAL_BASE = {{{ GLOBAL_BASE }}} < 0 ? (TARGET_X86 ? 4 : 8) : {{{ GLOBAL_BASE }}}; if (RETAIN_COMPILER_SETTINGS) { var blacklist = set('RELOOPER', 'STRUCT_INFO'); diff --git a/src/settings.js b/src/settings.js index f05c439aa25d7..961c9b56ef4e9 100644 --- a/src/settings.js +++ b/src/settings.js @@ -69,6 +69,9 @@ var ALLOW_MEMORY_GROWTH = 0; // If false, we abort with an error if we try to al // arrays. var MAX_SETJMPS = 20; // size of setjmp table allocated in each function invocation (that has setjmp) +var GLOBAL_BASE = -1; // where global data begins; the start of static memory. -1 means use the + // default, any other value will be used as an override + // Code embetterments var MICRO_OPTS = 1; // Various micro-optimizations, like nativizing variables var RELOOP = 0; // Recreate js native loops from llvm data From 848eff209e327a2ab41559d3eabdc8e2015afeee Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 3 Oct 2014 13:25:50 -0700 Subject: [PATCH 310/461] assume we have a full stack frame at the bottom of memory --- emcc | 1 + tests/test_other.py | 4 ++-- tools/emterpretify.py | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/emcc b/emcc index d322c42f5e962..e356ea5db0581 100755 --- a/emcc +++ b/emcc @@ -1010,6 +1010,7 @@ try: if shared.Settings.EMTERPRETIFY: shared.Settings.FINALIZE_ASM_JS = 0 + shared.Settings.GLOBAL_BASE = 8*256 # keep enough space at the bottom for a full stack frame debug_level = max(debug_level, 2) shared.Settings.RUNNING_FASTCOMP = fastcomp diff --git a/tests/test_other.py b/tests/test_other.py index 1de19eddbcc50..9d12321d626db 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4161,7 +4161,7 @@ def do_test(source, args, output): source = 'src.cpp' else: source = path_from_root('tests', source) - Popen([PYTHON, EMCC, source, '-O2', '--profiling', '-s', 'FINALIZE_ASM_JS=0']).communicate() + Popen([PYTHON, EMCC, source, '-O2', '--profiling', '-s', 'FINALIZE_ASM_JS=0', '-s', 'GLOBAL_BASE=2048']).communicate() Popen([PYTHON, path_from_root('tools', 'emterpretify.py'), 'a.out.js', 'em.out.js']).communicate() self.assertContained(output, run_js('a.out.js', args=args)) self.assertContained(output, run_js('em.out.js', args=args)) @@ -4170,7 +4170,7 @@ def do_test(source, args, output): self.validate_asmjs(out) # generate default shell for js test - Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world.c'), '-O2', '--profiling', '-s', 'FINALIZE_ASM_JS=0']).communicate() + Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world.c'), '-O2', '--profiling', '-s', 'FINALIZE_ASM_JS=0', '-s', 'GLOBAL_BASE=2048']).communicate() default = open('a.out.js').read() start = default.index('function _main(') end = default.index('}', start) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 67d4f9f3a8b0a..4cde8fa15e548 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -177,7 +177,7 @@ def randomize_opcodes(): for i in range(len(OPCODES)): ROPCODES[OPCODES[i]] = i -GLOBAL_BASE = 8 +GLOBAL_BASE = 256*8 # utils @@ -517,7 +517,7 @@ def process(code): zero_space = asm.staticbump - len(mem_init) assert zero_space >= 0 # can be positive, if we add a bump of zeros -assert 'GLOBAL_BASE: 8,' in asm.pre_js +assert ('GLOBAL_BASE: %d,' % GLOBAL_BASE) in asm.pre_js, 'we assume a specific global base, and that we can write to all memory below it' # calculate where code will start while len(mem_init) % 8 != 0: From 8b797522ff36e083aa59d8a0db59471fe5676362 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 3 Oct 2014 13:50:52 -0700 Subject: [PATCH 311/461] improve emterpreter testing --- tests/test_core.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tests/test_core.py b/tests/test_core.py index b3eb4e7bb24a7..6360e94376851 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -23,7 +23,16 @@ def test_hello_world(self): if not self.is_emterpreter(): assert 'EMSCRIPTEN_GENERATED_FUNCTIONS' not in src, 'must not emit this unneeded internal thing' else: - assert 'function emterpret(' in src + assert 'function emterpret' in src, 'emterpreter should exist' + assert 'return emterpret' in src, 'emterpreter should be called' + # and removing calls to the emterpreter break, so it was being used + output = open(output).read() + out1 = run_js('src.cpp.o.js') + assert output in out1 + open('src.cpp.o.js', 'w').write(src.replace('return emterpret', 'return no')) + out2 = run_js('src.cpp.o.js', stderr=PIPE, assert_returncode=None) + assert output not in out2, out2 + assert out1 != out2 def test_intvars(self): if self.emcc_args == None: return self.skip('needs ta2') From 36aa5446311a2f12e6068c090d46c1a39e213c7b Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 3 Oct 2014 13:58:33 -0700 Subject: [PATCH 312/461] decide which funcs will be emterpreted in python --- tools/emterpretify.py | 6 +++++- tools/js-optimizer.js | 8 +++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 4cde8fa15e548..a41cd5d02d741 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -494,9 +494,13 @@ def process(code): asm = asm_module.AsmModule(infile) +# decide which functions will be emterpreted + +emterpreted_funcs = [func for func in asm.funcs if func not in BLACKLIST and not func.startswith('dynCall_')] + # process functions, generating bytecode temp = infile + '.tmp.js' -shared.Building.js_optimizer(infile, ['emterpretify'], extra_info={ 'blacklist': list(BLACKLIST), 'opcodes': OPCODES, 'ropcodes': ROPCODES }, output_filename=temp) +shared.Building.js_optimizer(infile, ['emterpretify'], extra_info={ 'emterpretedFuncs': list(emterpreted_funcs), 'opcodes': OPCODES, 'ropcodes': ROPCODES }, output_filename=temp) # load the module and modify it asm = asm_module.AsmModule(temp) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index e784cbd9e32c3..8e96b6b9553f2 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5937,7 +5937,7 @@ function pointerMasking(ast) { function emterpretify(ast) { emitAst = false; - var BLACKLIST = set(extraInfo.blacklist); + var EMTERPRETED_FUNCS = set(extraInfo.emterpretedFuncs); var OPCODES = extraInfo.opcodes; var ROPCODES = extraInfo.ropcodes; @@ -7114,7 +7114,7 @@ function emterpretify(ast) { // walkFunction main - var ignore = (func[1] in BLACKLIST) || /^dynCall_.*/.test(func[1]); // TODO: do not convert small funcs || measureSize(func[3]) < 60; + var ignore = !(func[1] in EMTERPRETED_FUNCS); if (ignore) { prepDotZero(func); @@ -7209,9 +7209,7 @@ function emterpretify(ast) { finalizeJumps(code); - //printErr(JSON.stringify(code)); - - print(astToSrc(func) + ' //' + JSON.stringify([code,absoluteTargets])); + print(astToSrc(func) + ' //' + JSON.stringify([code, absoluteTargets])); } traverseGeneratedFunctions(ast, walkFunction); } From 6efd84f0d2f1815915fd55f9471652b898c01a8c Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 3 Oct 2014 14:32:05 -0700 Subject: [PATCH 313/461] use zero-based emterpreter for leaf funcs --- tools/emterpretify.py | 21 +++++++++-------- tools/js-optimizer.js | 52 ++++++++++++++++++++++++++----------------- 2 files changed, 44 insertions(+), 29 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index a41cd5d02d741..e555f2a49d8cd 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -352,9 +352,9 @@ def get_coerced_access(l, s='i', unsigned=False): pc = HEAP32[pc + 4 + (lx << 2) >> 2] | 0; // load from the jump table which is right after this instruction, and set pc continue;''' -def make_emterpreter(t): +def make_emterpreter(t, zero=False): # return is specialized per interpreter - CASES[ROPCODES['RET']] = 'EMTSTACKTOP = sp; ' + CASES[ROPCODES['RET']] = 'EMTSTACKTOP = sp; ' if not zero else '' if t == 'void': CASES[ROPCODES['RET']] += 'return;' elif t == 'int': @@ -411,7 +411,9 @@ def fix_case(case): return case.replace('continue;', 'CONTINUE').replace('break;', 'continue;').replace('CONTINUE', 'pc = pc - 4 | 0; continue;').replace('continue; continue;', 'continue;') def process(code): - return code.replace(' assert(', ' //assert(') + code = code.replace(' assert(', ' //assert(') + if zero: code = code.replace('sp + ', '') + return code main_loop_prefix = r''' //print('last lx (' + lx + '): ' + [''' + get_coerced_access('lx') + ',' + get_coerced_access('lx', s='d') + ''']); pc = pc + 4 | 0; @@ -452,10 +454,10 @@ def process(code): ) return process(r''' -function emterpret%s%s(pc) { +function emterpret%s(pc) { pc = pc | 0; - var sp = 0, inst = 0, lx = 0, ly = 0, lz = 0; - sp = EMTSTACKTOP; + var %sinst = 0, lx = 0, ly = 0, lz = 0; +%s assert(((HEAPU8[pc>>0]>>>0) == %d)|0); lx = HEAPU8[pc + 1 >> 0] | 0; // num locals EMTSTACKTOP = EMTSTACKTOP + (lx << 3) | 0; @@ -471,8 +473,9 @@ def process(code): } %s }''' % ( - '_' if t != 'void' else '', - '' if t == 'void' else t[0], + ('_' if t != 'void' else '') + ('' if t == 'void' else t[0]) + ('' if not zero else '_z'), + 'sp = 0, ' if not zero else '', + ' sp = EMTSTACKTOP;' if not zero else '', ROPCODES['FUNC'], get_access('ly', s='d'), main_loop, @@ -679,7 +682,7 @@ def process_code(func, code, absolute_targets): lines[i] = lines[i].replace(call, '(%s)' % (funcs[func] + code_start)) # finalize funcs JS -asm.funcs_js = '\n'.join(['\n'.join(lines), make_emterpreter('int'), make_emterpreter('double')]) +asm.funcs_js = '\n'.join(['\n'.join(lines), make_emterpreter('int'), make_emterpreter('double'), make_emterpreter('int', zero=True), make_emterpreter('double', zero=True)]) lines = None # set up emterpreter stack top diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 8e96b6b9553f2..2539b7b29cd2a 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -7158,16 +7158,41 @@ function emterpretify(ast) { } var stats = getStatements(func); - // emit stack assignments, emterpreter assumes params to be in place func[3] = []; + + // do some pre-calculation and optimization + var constants = hoistConstants(stats); + + // walk all the function to emit bytecode, and add a final ret + var code = walkStatements(stats); + assert(code.length % 4 === 0); + if (code.length < 4 || code[code.length-4] != 'RET') { + code.push('RET', 0, 0, 0); // final ret for the function + } + assert(maxLocal < 255, 'too many locals ' + [maxLocal, numLocals]); // maximum local value is 255, for a total of 256 of them + code = ['FUNC', maxLocal+1, func[2].length, 0].concat(constants).concat(code); + verifyCode(code); + + finalizeJumps(code); + + // if this is a leaf method (does no calls to other emterpreted code), we can use the zero-stackbase emterpreter + var leaf = true; + for (var i = 0; i < code.length; i += 4) { + if (code[i] === 'CALL' && code[i+2] in EMTERPRETED_FUNCS) { + leaf = false; + break; + } + } + + // set up trampoline var bump = 0; // we will assert in the emterpreter itself that we did not overflow the emtstack func[2].forEach(function(arg) { var code; - var bumpText = bump ? ' + ' + bump : ''; + var ptr = leaf ? bump : (bump ? 'EMTSTACKTOP + ' + bump : 'EMTSTACKTOP'); switch (asmData.params[arg]) { - case ASM_INT: code = 'HEAP32[EMTSTACKTOP' + bumpText + ' >> 2] = ' + arg + ';'; break; - case ASM_DOUBLE: code = 'HEAPF64[EMTSTACKTOP' + bumpText + ' >> 3] = ' + arg + ';'; break; - case ASM_FLOAT: code = 'HEAPF32[EMTSTACKTOP' + bumpText + ' >> 2] = ' + arg + ';'; break; + case ASM_INT: code = 'HEAP32[' + ptr + ' >> 2] = ' + arg + ';'; break; + case ASM_DOUBLE: code = 'HEAPF64[' + ptr + ' >> 3] = ' + arg + ';'; break; + case ASM_FLOAT: code = 'HEAPF32[' + ptr + ' >> 2] = ' + arg + ';'; break; default: throw 'bad'; } func[3].push(srcToAst(code)[1][0]); @@ -7193,22 +7218,9 @@ function emterpretify(ast) { theName[1] += '_i'; // void funcs reuse _i, and ignore the return value func[3].push(['stat', makeAsmCoercion(theCall, ASM_INT)]); } + if (leaf) theName[1] += '_z'; - // do some pre-calculation and optimization - var constants = hoistConstants(stats); - - // walk all the function to emit bytecode, and add a final ret - var code = walkStatements(stats); - assert(code.length % 4 === 0); - if (code.length < 4 || code[code.length-4] != 'RET') { - code.push('RET', 0, 0, 0); // final ret for the function - } - assert(maxLocal < 255, 'too many locals ' + [maxLocal, numLocals]); // maximum local value is 255, for a total of 256 of them - code = ['FUNC', maxLocal+1, func[2].length, 0].concat(constants).concat(code); - verifyCode(code); - - finalizeJumps(code); - + // emit trampoline and bytecode print(astToSrc(func) + ' //' + JSON.stringify([code, absoluteTargets])); } traverseGeneratedFunctions(ast, walkFunction); From 02a3285a7c8707022144af9a3326c8c4b90d0399 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 3 Oct 2014 15:07:07 -0700 Subject: [PATCH 314/461] functions calling function pointers are not leaves --- tools/js-optimizer.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 2539b7b29cd2a..1b6e2847e2d2b 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -398,6 +398,10 @@ function parseHeap(name, out) { // XXX this uses parseHeapTemp by default, which var USEFUL_BINARY_OPS = set('<<', '>>', '|', '&', '^'); var COMPARE_OPS = set('<', '<=', '>', '>=', '==', '===', '!=', '!=='); +function isFunctionTable(name) { + return /^FUNCTION_TABLE.*/.test(name); +} + function simplifyExpressions(ast) { // Simplify common expressions used to perform integer conversion operations // in cases where no conversion is needed. @@ -521,7 +525,7 @@ function simplifyExpressions(ast) { traverse(ast, function(node, type) { // The "pre" visitor. Useful for detecting trees which should not // be simplified. - if (type == 'sub' && node[1][0] == 'name' && /^FUNCTION_TABLE.*/.exec(node[1][1])) { + if (type == 'sub' && node[1][0] == 'name' && isFunctionTable(node[1][1])) { return null; // do not traverse subchildren here, we should not collapse 55 & 126. } }, function(node, type) { @@ -6854,6 +6858,7 @@ function emterpretify(ast) { // function pointer call through function table assert(node[1][0] === 'sub' && node[1][1][0] === 'name'); target = node[1][1][1]; + assert(isFunctionTable(target)); functionPointer = getReg(node[1][2]); ret = ret.concat(functionPointer[1]); } @@ -7178,7 +7183,8 @@ function emterpretify(ast) { // if this is a leaf method (does no calls to other emterpreted code), we can use the zero-stackbase emterpreter var leaf = true; for (var i = 0; i < code.length; i += 4) { - if (code[i] === 'CALL' && code[i+2] in EMTERPRETED_FUNCS) { + // if this is a call to another emterpreted function, or a function pointer (so we can't tell), it isn't a leaf + if (code[i] === 'CALL' && ((code[i+2] in EMTERPRETED_FUNCS) || isFunctionTable(code[i+2]))) { leaf = false; break; } From 6ae10ab2f2482d0dbcb555490abdeca05eb88181 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 3 Oct 2014 17:43:12 -0700 Subject: [PATCH 315/461] disable lua benchmarks for now --- tests/test_benchmark.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_benchmark.py b/tests/test_benchmark.py index c86dead681216..2d80407e9bebc 100644 --- a/tests/test_benchmark.py +++ b/tests/test_benchmark.py @@ -548,13 +548,13 @@ def lib_builder(name, native, env_init): lib_builder=lib_builder, native_exec=os.path.join('building', 'lua_native', 'src', 'lua'), output_parser=output_parser, args_processor=args_processor) - def test_zzz_lua_scimark(self): + def zzztest_zzz_lua_scimark(self): def output_parser(output): return 100.0/float(re.search('\nSciMark +([\d\.]+) ', output).group(1)) self.lua('scimark', '[small problem sizes]', output_parser=output_parser) - def test_zzz_lua_binarytrees(self): + def zzztest_zzz_lua_binarytrees(self): # js version: ['binarytrees.lua', {0: 0, 1: 9.5, 2: 11.99, 3: 12.85, 4: 14.72, 5: 15.82}[arguments[0]]] self.lua('binarytrees', 'long lived tree of depth') From 1afef7c2a97e9923396fc96d2d6aad3318146a87 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 3 Oct 2014 19:38:20 -0700 Subject: [PATCH 316/461] fix stack handling in zero emterpreters --- tools/emterpretify.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index e555f2a49d8cd..15cd7c038a59a 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -460,8 +460,7 @@ def process(code): %s assert(((HEAPU8[pc>>0]>>>0) == %d)|0); lx = HEAPU8[pc + 1 >> 0] | 0; // num locals - EMTSTACKTOP = EMTSTACKTOP + (lx << 3) | 0; - assert(((EMTSTACKTOP|0) <= (EMT_STACK_MAX|0))|0); +%s ly = HEAPU8[pc + 2 >> 0] | 0; while ((ly | 0) < (lx | 0)) { // clear the non-param locals %s = +0; @@ -471,12 +470,15 @@ def process(code): while (1) { %s } + assert(0); %s }''' % ( ('_' if t != 'void' else '') + ('' if t == 'void' else t[0]) + ('' if not zero else '_z'), 'sp = 0, ' if not zero else '', ' sp = EMTSTACKTOP;' if not zero else '', ROPCODES['FUNC'], + ''' EMTSTACKTOP = EMTSTACKTOP + (lx << 3) | 0; + assert(((EMTSTACKTOP|0) <= (EMT_STACK_MAX|0))|0);''' if not zero else '', get_access('ly', s='d'), main_loop, '' if t == 'void' else 'return %s;' % shared.JS.make_initializer(t[0], settings) From a96ba41ef378c8e73e695a29ef6980186ad56782 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 3 Oct 2014 21:34:24 -0700 Subject: [PATCH 317/461] refactor CALL generation --- tools/emterpretify.py | 49 +++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 15cd7c038a59a..19b7f7333eaa4 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -362,31 +362,30 @@ def make_emterpreter(t, zero=False): elif t == 'double': CASES[ROPCODES['RET']] += 'return ' + get_coerced_access('lx', s='d') + ';' - # call is generated using information of actual call patterns - if ROPCODES['CALL'] not in CASES: - def make_target_call(i): - name = global_func_names[i] - sig = global_func_sigs[i] - - function_pointer_call = name.startswith('FUNCTION_TABLE_') - - ret = name - if function_pointer_call: - ret += '[' + get_access('HEAPU8[pc+4>>0]') + ' & %d]' % (next_power_of_two(asm.tables[name].count(',')+1)-1) - ret += '(' + ', '.join([get_coerced_access('HEAPU8[pc+%d>>0]' % (i+4+int(function_pointer_call)), s=sig[i+1]) for i in range(len(sig)-1)]) + ')' - if sig[0] != 'v': - ret = get_access('lx', sig[0]) + ' = ' + shared.JS.make_coercion(ret, sig[0]) - elif name in actual_return_types and actual_return_types[name] != 'v': - ret = shared.JS.make_coercion(ret, actual_return_types[name]) # return value ignored, but need a coercion - extra = len(sig) - 1 + int(function_pointer_call) # [opcode, lx, target, sig], take the usual 4. params are extra - if extra > 0: - ret += '; pc = pc + %d | 0' % (4*((extra+3)>>2)) - return ' ' + ret + '; break;' - - CASES[ROPCODES['CALL']] = 'switch ((inst>>>16)|0) {\n' + \ - '\n'.join([' case %d: {\n%s\n }' % (i, make_target_call(i)) for i in range(global_func_id)]) + \ - '\n default: assert(0);' + \ - '\n }' + # call is custom generated using information of actual call patterns, and which emterpreter this is + def make_target_call(i): + name = global_func_names[i] + sig = global_func_sigs[i] + + function_pointer_call = name.startswith('FUNCTION_TABLE_') + + ret = name + if function_pointer_call: + ret += '[' + get_access('HEAPU8[pc+4>>0]') + ' & %d]' % (next_power_of_two(asm.tables[name].count(',')+1)-1) + ret += '(' + ', '.join([get_coerced_access('HEAPU8[pc+%d>>0]' % (i+4+int(function_pointer_call)), s=sig[i+1]) for i in range(len(sig)-1)]) + ')' + if sig[0] != 'v': + ret = get_access('lx', sig[0]) + ' = ' + shared.JS.make_coercion(ret, sig[0]) + elif name in actual_return_types and actual_return_types[name] != 'v': + ret = shared.JS.make_coercion(ret, actual_return_types[name]) # return value ignored, but need a coercion + extra = len(sig) - 1 + int(function_pointer_call) # [opcode, lx, target, sig], take the usual 4. params are extra + if extra > 0: + ret += '; pc = pc + %d | 0' % (4*((extra+3)>>2)) + return ' ' + ret + '; break;' + + CASES[ROPCODES['CALL']] = 'switch ((inst>>>16)|0) {\n' + \ + '\n'.join([' case %d: {\n%s\n }' % (i, make_target_call(i)) for i in range(global_func_id)]) + \ + '\n default: assert(0);' + \ + '\n }' if ROPCODES['GETGLBI'] not in CASES: def make_load(i): From 53864a7164f7541a0a67b4677cc17d7f8ba562c6 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 3 Oct 2014 21:41:22 -0700 Subject: [PATCH 318/461] optimize Math_imul --- tools/js-optimizer.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 1b6e2847e2d2b..c4652451efd95 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6854,6 +6854,15 @@ function emterpretify(ast) { if (node[1][0] === 'name') { // normal direct call target = node[1][1]; + // special-case some call targets + switch (target) { + case 'Math_imul': { + assert(node[2].length === 2); + var mul = makeBinary(['binary', '*', node[2][0], node[2][1]], ASM_INT, ASM_SIGNED, lx); + assert(mul[0] === lx); + return mul[1]; + } + } } else { // function pointer call through function table assert(node[1][0] === 'sub' && node[1][1][0] === 'name'); From e8a0fc05c5c84115e6f3e74dfb385c81c9cf05c6 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 4 Oct 2014 11:08:33 -0700 Subject: [PATCH 319/461] reorganize comparisons --- tools/emterpretify.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 19b7f7333eaa4..003ab5df2e54c 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -34,14 +34,16 @@ 'SMOD', # [lx, ly, lz] lx = ly % lz (32-bit signed int) 'UMOD', # [lx, ly, lz] lx = ly % lz (32-bit unsigned int) 'NEG', # [lx, ly, 0] lx = -ly (int) - 'LNOT', # [lx, ly, 0] ly = !ly (int) 'BNOT', # [lx, ly, 0] ly = ~ly (int) + + 'LNOT', # [lx, ly, 0] ly = !ly (int) 'EQ', # [lx, ly, lz] lx = ly == lz (32-bit int) 'NE', # [lx, ly, lz] lx = ly != lz (32-bit int) 'SLT', # [lx, ly, lz] lx = ly < lz (32-bit signed) 'ULT', # [lx, ly, lz] lx = ly < lz (32-bit unsigned) 'SLE', # [lx, ly, lz] lx = ly <= lz (32-bit signed) 'ULE', # [lx, ly, lz] lx = ly <= lz (32-bit unsigned) + 'AND', # [lx, ly, lz] lx = ly & lz 'OR', # [lx, ly, lz] lx = ly | lz 'XOR', # [lx, ly, lz] lx = ly ^ lz From 1900c4c958c69ff08d6e394dd961db280e0284a2 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 4 Oct 2014 13:57:01 -0700 Subject: [PATCH 320/461] use makeBranchIfFalse in makeWhile --- tools/js-optimizer.js | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index c4652451efd95..8617586645493 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6712,14 +6712,7 @@ function emterpretify(ast) { function makeWhile(node, label) { var infinite = node[1][0] === 'num' && node[1][1] === 1; // trivial infinite loops while(1) {..} do not need condition handling var top = getRelative('while-top'), exit = getRelative('while-exit'); - var condition, cond; - if (!infinite) { - condition = getReg(node[1]); - cond = getRelative('while-cond'); - } else { - condition = [-1, []]; - cond = top; // when we reach the condition, we just go right to the top of the loop body - } + var cond = !infinite ? getRelative('while-cond') : top; breakStack.push(exit); continueStack.push(cond); if (label) { @@ -6731,8 +6724,7 @@ function emterpretify(ast) { var ret = []; if (!infinite) { ret.push('relative', cond, 0, 0); - ret = ret.concat(condition[1]); - ret.push('BRF', releaseIfFree(condition[0]), exit, 0); + ret = ret.concat(makeBranchIfFalse(node[1], exit)); } ret = ret.concat(['relative', top, 0, 0]).concat(walkStatements(node[2])); ret.push('BR', 0, cond, 0); From a2deea81d40adac1f4993bce20e9985e7611ec8a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 4 Oct 2014 14:02:31 -0700 Subject: [PATCH 321/461] use makeBranchIfTrue in makeDo --- tools/js-optimizer.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 8617586645493..5834eeeacfee1 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6664,6 +6664,13 @@ function emterpretify(ast) { return condition[1]; } + function makeBranchIfTrue(node, where) { + if (node[0] === 'unary-prefix' && node[1] === '!') { + return makeBranchIfFalse(node[2], where); + } + return makeBranchIfFalse(['unary-prefix', '!', node], where); + } + function makeDo(node, label) { var oneTime = node[1][0] === 'num' && node[1][1] === 0; // trivial one-time loops do {..} while(0) do not need condition handling // TODO: more testing assert(!oneTime); @@ -6693,7 +6700,7 @@ function emterpretify(ast) { } var condition; if (!oneTime) { - condition = getReg(node[1]); + condition = makeBranchIfTrue(node[1], top); } var ret = []; if (!oneTime) { @@ -6702,8 +6709,7 @@ function emterpretify(ast) { ret = ret.concat(body); if (!oneTime) { ret.push('relative', cond, 0, 0); - ret = ret.concat(condition[1]); - ret.push('BRT', releaseIfFree(condition[0]), top, 0); + ret = ret.concat(condition); } ret.push('relative', exit, 0, 0); return [-1, ret]; From 2128f0043a21f22f52bd9153d5e36b39c132342d Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 4 Oct 2014 14:10:24 -0700 Subject: [PATCH 322/461] optimized condition+branch opcodes --- tools/emterpretify.py | 35 ++++++++++++++++++++++++++++- tools/js-optimizer.js | 51 ++++++++++++++++++++++++++++++------------- 2 files changed, 70 insertions(+), 16 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 003ab5df2e54c..aefa25dca2231 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -71,6 +71,21 @@ 'ASHRV', # (v is 8-bit unsigned) 'LSHRV', # (v is 8-bit unsigned) + 'LNOTBRF', # [cond] [absolute-target] cond+branch + 'EQBRF', + 'NEBRF', + 'SLTBRF', + 'ULTBRF', + 'SLEBRF', + 'ULEBRF', + 'LNOTBRT', + 'EQBRT', + 'NEBRT', + 'SLTBRT', + 'ULTBRT', + 'SLEBRT', + 'ULEBRT', + 'SETD', # [lx, ly, lz] lx = ly (double) 'SETVD', # [lx, vl, vh] lx = ly (16 bit signed int, converted into double) 'SETVDI', # [lx, 0, 0] [..v..] lx = v (32 bit signed int, converted into double) @@ -229,14 +244,16 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['SMOD']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') % (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['UMOD']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') % (' + get_coerced_access('lz', unsigned=True) + ') >>> 0;' CASES[ROPCODES['NEG']] = get_access('lx') + ' = -(' + get_coerced_access('ly') + ');' -CASES[ROPCODES['LNOT']] = get_access('lx') + ' = !(' + get_coerced_access('ly') + ');' CASES[ROPCODES['BNOT']] = get_access('lx') + ' = ~(' + get_coerced_access('ly') + ');' + +CASES[ROPCODES['LNOT']] = get_access('lx') + ' = !(' + get_coerced_access('ly') + ');' CASES[ROPCODES['EQ']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') == (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['NE']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') != (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['SLT']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') < (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['ULT']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') < (' + get_coerced_access('lz', unsigned=True) + ') | 0;' CASES[ROPCODES['SLE']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') <= (' + get_coerced_access('lz') + ') | 0;' CASES[ROPCODES['ULE']] = get_access('lx') + ' = (' + get_coerced_access('ly', unsigned=True) + ') <= (' + get_coerced_access('lz', unsigned=True) + ') | 0;' + CASES[ROPCODES['AND']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') & (' + get_coerced_access('lz') + ');' CASES[ROPCODES['OR']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') | (' + get_coerced_access('lz') + ');' CASES[ROPCODES['XOR']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') ^ (' + get_coerced_access('lz') + ');' @@ -264,6 +281,22 @@ def get_coerced_access(l, s='i', unsigned=False): CASES[ROPCODES['ASHRV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') >> lz;' CASES[ROPCODES['LSHRV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') >>> lz;' +CASES[ROPCODES['LNOTBRF']] = 'if (' + get_coerced_access('ly') + ') { pc = HEAP32[pc + 4 >> 2] | 0; continue; } else { pc = pc + 4 | 0; }' +CASES[ROPCODES['EQBRF']] = 'if ((' + get_coerced_access('ly') + ') == (' + get_coerced_access('lz') + ')) { pc = pc + 4 | 0; } else { pc = HEAP32[pc + 4 >> 2] | 0; continue; }' +CASES[ROPCODES['NEBRF']] = 'if ((' + get_coerced_access('ly') + ') != (' + get_coerced_access('lz') + ')) { pc = pc + 4 | 0; } else { pc = HEAP32[pc + 4 >> 2] | 0; continue; }' +CASES[ROPCODES['SLTBRF']] = 'if ((' + get_coerced_access('ly') + ') < (' + get_coerced_access('lz') + ')) { pc = pc + 4 | 0; } else { pc = HEAP32[pc + 4 >> 2] | 0; continue; }' +CASES[ROPCODES['ULTBRF']] = 'if ((' + get_coerced_access('ly', unsigned=True) + ') < (' + get_coerced_access('lz', unsigned=True) + ')) { pc = pc + 4 | 0; } else { pc = HEAP32[pc + 4 >> 2] | 0; continue; }' +CASES[ROPCODES['SLEBRF']] = 'if ((' + get_coerced_access('ly') + ') <= (' + get_coerced_access('lz') + ')) { pc = pc + 4 | 0; } else { pc = HEAP32[pc + 4 >> 2] | 0; continue; }' +CASES[ROPCODES['ULEBRF']] = 'if ((' + get_coerced_access('ly', unsigned=True) + ') <= (' + get_coerced_access('lz', unsigned=True) + ')) { pc = pc + 4 | 0; } else { pc = HEAP32[pc + 4 >> 2] | 0; continue; }' + +CASES[ROPCODES['LNOTBRT']] = 'if (' + get_coerced_access('ly') + ') { pc = pc + 4 | 0; } else { pc = HEAP32[pc + 4 >> 2] | 0; continue; }' +CASES[ROPCODES['EQBRT']] = 'if ((' + get_coerced_access('ly') + ') == (' + get_coerced_access('lz') + ')) { pc = HEAP32[pc + 4 >> 2] | 0; continue; } else { pc = pc + 4 | 0; }' +CASES[ROPCODES['NEBRT']] = 'if ((' + get_coerced_access('ly') + ') != (' + get_coerced_access('lz') + ')) { pc = HEAP32[pc + 4 >> 2] | 0; continue; } else { pc = pc + 4 | 0; }' +CASES[ROPCODES['SLTBRT']] = 'if ((' + get_coerced_access('ly') + ') < (' + get_coerced_access('lz') + ')) { pc = HEAP32[pc + 4 >> 2] | 0; continue; } else { pc = pc + 4 | 0; }' +CASES[ROPCODES['ULTBRT']] = 'if ((' + get_coerced_access('ly', unsigned=True) + ') < (' + get_coerced_access('lz', unsigned=True) + ')) { pc = HEAP32[pc + 4 >> 2] | 0; continue; } else { pc = pc + 4 | 0; }' +CASES[ROPCODES['SLEBRT']] = 'if ((' + get_coerced_access('ly') + ') <= (' + get_coerced_access('lz') + ')) { pc = HEAP32[pc + 4 >> 2] | 0; continue; } else { pc = pc + 4 | 0; }' +CASES[ROPCODES['ULEBRT']] = 'if ((' + get_coerced_access('ly', unsigned=True) + ') <= (' + get_coerced_access('lz', unsigned=True) + ')) { pc = HEAP32[pc + 4 >> 2] | 0; continue; } else { pc = pc + 4 | 0; }' + CASES[ROPCODES['SETD']] = get_access('lx', s='d') + ' = ' + get_coerced_access('ly', s='d') + ';' CASES[ROPCODES['SETVD']] = get_access('lx', s='d') + ' = +(inst >> 16);' CASES[ROPCODES['SETVDI']] = 'pc = pc + 4 | 0; ' + get_access('lx', s='d') + ' = +(HEAP32[pc >> 2] | 0);' diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 5834eeeacfee1..26118922fb573 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5952,6 +5952,8 @@ function emterpretify(ast) { mergeInto(BRANCHES, ABSOLUTE_BRANCHES); var UNCONDITIONAL_BRANCHES = set('BR', 'BRA'); + var COMPARISONS = set('LNOT', 'EQ', 'NE', 'SLT', 'ULT', 'SLE', 'ULE'); + var tempBuffer = new ArrayBuffer(8); var tempFloat64 = new Float64Array(tempBuffer); var tempFloat32 = new Float32Array(tempBuffer); @@ -6660,6 +6662,15 @@ function emterpretify(ast) { opcode = 'BRT'; } var condition = getReg(node); + if (isFree(condition[0]) && condition[1][condition[1].length-4] in COMPARISONS) { + // emit an optimized compare+branch: avoid storing to the free condition[0], and just load the jump address right after us + condition[1][condition[1].length-4] += opcode; + var absolute = getAbsolute('cond+branch'); + absolute.replaceWith = where; // there is only a 'relative', not an 'absolute-target', we will add one later + condition[1].push('absolute-value', absolute, 0, 0); + releaseIfFree(condition[0]); + return condition[1]; + } condition[1].push(opcode, releaseIfFree(condition[0]), where, 0); return condition[1]; } @@ -6913,12 +6924,30 @@ function emterpretify(ast) { } function finalizeJumps(code) { - /*function dump(name) { - printErr('=========='); - printErr(name); - printErr(JSON.stringify(code)); - printErr('=========='); - }*/ + function getI(obj) { + var i = 0; + while (i < code.length) { // find the definition, ignoring uses + i = code.indexOf(obj, i); + if (i < 0) return -1; + if (code[i-1] === 'relative' || code[i-1] === 'absolute-target') return i-1; + i++; + } + return -1; + } + // fill in absolute-targets where needed (optimized condition+branch may lack them) + for (var i = 0; i < code.length; i += 4) { + if (code[i] === 'absolute-value' && code[i+1].replaceWith) { + var absolute = code[i+1]; + if (getI(absolute) < 0) { + var relativeI = getI(absolute.replaceWith); + code.splice(relativeI, 0, 'absolute-target', absolute, 0, 0); + if (relativeI <= i) i += 4; + assert(code[i+1] === absolute); // sanity check on i adjustment + } + code[i+1].replaceWith = null; + } + } + function sanityCheck() { var seenAbsolutes = {}; // every absolute value must have a valid target for (var i = 0; i < code.length; i += 4) { @@ -6929,20 +6958,12 @@ function emterpretify(ast) { for (var i = 0; i < code.length; i += 4) { if (code[i] === 'absolute-value') { assert(code[i+1].id in seenAbsolutes); + assert(!code[i+1].replaceWith); } } } sanityCheck(); // first pass, collect markers and absolute targets, and their uses - function getI(obj) { - var i = 0; - while (1) { // find the definition, ignoring uses - i = code.indexOf(obj, i); - assert(i >= 0); - if (code[i-1] === 'relative' || code[i-1] === 'absolute-target') return i-1; - i++; - } - } for (var i = 0; i < code.length; i += 4) { assert(!(code[i] in ABSOLUTE_BRANCHES)); if (code[i] in RELATIVE_BRANCHES) { From 1f80947c8f47a57e2f037276a0f4ae2a610d1993 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 4 Oct 2014 14:54:39 -0700 Subject: [PATCH 323/461] unify relative and absolute markers --- tools/js-optimizer.js | 173 +++++++++++++++++------------------------- 1 file changed, 68 insertions(+), 105 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 26118922fb573..9d269120a2264 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6023,12 +6023,9 @@ function emterpretify(ast) { return assignTo >= 0 ? assignTo : getFree(); } - function getRelative(name) { - return { what: 'relative', name: name, uses: 0, replaceWith: null, id: -1 }; - } - var absoluteId = 0; - function getAbsolute(name) { - return { what: 'absolute-target', name: name, uses: 0, replaceWith: null, id: absoluteId++ }; + var markerId = 0; + function getMarker(name) { + return { what: 'marker', name: name, relativeUses: 0, absoluteUses: 0, id: markerId++, i: 0 }; } var absoluteTargets = {}; @@ -6334,17 +6331,17 @@ function emterpretify(ast) { return [-1, ['BR', 0, continueLabels[label], 0]]; } case 'if': { - var exit = getRelative('if-exit'); + var exit = getMarker('if-exit'); var ret; if (!node[3]) { ret = makeBranchIfFalse(node[1], exit).concat(walkStatements(node[2])); } else { - var otherwise = getRelative('if-else'); + var otherwise = getMarker('if-else'); ret = makeBranchIfFalse(node[1], otherwise).concat(walkStatements(node[2])); - ret.push('BR', 0, exit, 0, 'relative', otherwise, 0, 0); + ret.push('BR', 0, exit, 0, 'marker', otherwise, 0, 0); ret = ret.concat(walkStatements(node[3])); } - ret.push('relative', exit, 0, 0); + ret.push('marker', exit, 0, 0); return [-1, ret]; } case 'conditional': { @@ -6361,7 +6358,7 @@ function emterpretify(ast) { [type === ASM_INT ? 'COND' : 'CONDD', out, releaseIfFree(condition[0]), releaseIfFree(ifTrue[0]), releaseIfFree(ifFalse[0]), 0, 0, 0] )]; } - var otherwise = getRelative('cond-else'), exit = getRelative('cond-exit'); + var otherwise = getMarker('cond-else'), exit = getMarker('cond-exit'); var temp = getFree(); assert(type !== ASM_NONE); var ret = makeBranchIfFalse(node[1], otherwise); @@ -6369,9 +6366,9 @@ function emterpretify(ast) { ret = ret.concat(first[1]).concat(makeSet(temp, releaseIfFree(first[0]), type)); ret.push('BR', 0, exit, 0); var second = getReg(node[3]); - ret.push('relative', otherwise, 0, 0); + ret.push('marker', otherwise, 0, 0); ret = ret.concat(second[1]).concat(makeSet(temp, releaseIfFree(second[0]), type)); - ret.push('relative', exit, 0, 0); + ret.push('marker', exit, 0, 0); return [temp, ret]; } case 'seq': { @@ -6665,9 +6662,7 @@ function emterpretify(ast) { if (isFree(condition[0]) && condition[1][condition[1].length-4] in COMPARISONS) { // emit an optimized compare+branch: avoid storing to the free condition[0], and just load the jump address right after us condition[1][condition[1].length-4] += opcode; - var absolute = getAbsolute('cond+branch'); - absolute.replaceWith = where; // there is only a 'relative', not an 'absolute-target', we will add one later - condition[1].push('absolute-value', absolute, 0, 0); + condition[1].push('absolute-value', where, 0, 0); releaseIfFree(condition[0]); return condition[1]; } @@ -6685,11 +6680,11 @@ function emterpretify(ast) { function makeDo(node, label) { var oneTime = node[1][0] === 'num' && node[1][1] === 0; // trivial one-time loops do {..} while(0) do not need condition handling // TODO: more testing assert(!oneTime); - var exit = getRelative('do-exit'); + var exit = getMarker('do-exit'); var top, cond; if (!oneTime) { - top = getRelative('do-top'); - cond = getRelative('do-cond'); + top = getMarker('do-top'); + cond = getMarker('do-cond'); } else { top = -1; // no need to even mark the top cond = exit; // when we reach the condition, we just exit @@ -6715,21 +6710,21 @@ function emterpretify(ast) { } var ret = []; if (!oneTime) { - ret.push('relative', top, 0, 0); + ret.push('marker', top, 0, 0); } ret = ret.concat(body); if (!oneTime) { - ret.push('relative', cond, 0, 0); + ret.push('marker', cond, 0, 0); ret = ret.concat(condition); } - ret.push('relative', exit, 0, 0); + ret.push('marker', exit, 0, 0); return [-1, ret]; } function makeWhile(node, label) { var infinite = node[1][0] === 'num' && node[1][1] === 1; // trivial infinite loops while(1) {..} do not need condition handling - var top = getRelative('while-top'), exit = getRelative('while-exit'); - var cond = !infinite ? getRelative('while-cond') : top; + var top = getMarker('while-top'), exit = getMarker('while-exit'); + var cond = !infinite ? getMarker('while-cond') : top; breakStack.push(exit); continueStack.push(cond); if (label) { @@ -6740,10 +6735,10 @@ function emterpretify(ast) { } var ret = []; if (!infinite) { - ret.push('relative', cond, 0, 0); + ret.push('marker', cond, 0, 0); ret = ret.concat(makeBranchIfFalse(node[1], exit)); } - ret = ret.concat(['relative', top, 0, 0]).concat(walkStatements(node[2])); + ret = ret.concat(['marker', top, 0, 0]).concat(walkStatements(node[2])); ret.push('BR', 0, cond, 0); breakStack.pop(); continueStack.pop(); @@ -6751,13 +6746,13 @@ function emterpretify(ast) { delete breakLabels[label]; delete continueLabels[label]; } - ret.push('relative', exit, 0, 0); + ret.push('marker', exit, 0, 0); return [-1, ret]; } function makeSwitch(node, label) { var condition = getReg(node[1]); - var exit = getRelative('switch-exit'); + var exit = getMarker('switch-exit'); // parse cases and emit code breakStack.push(exit); if (label) { @@ -6781,8 +6776,7 @@ function emterpretify(ast) { i: i, // original index id: id, code: walkStatements(c[1]), - absolute: getAbsolute('switch-case'), - relative: getRelative('switch-case'), + marker: getMarker('switch-case'), next: -1 // will be the fall through target }; if (typeof id === 'number') { @@ -6805,7 +6799,7 @@ function emterpretify(ast) { } var nextId = getId(cases[i][0]); assert(nextId in data); - info.next = data[nextId].relative; + info.next = data[nextId].marker; break; // TODO: optimize all this, we don't need a fallthrough branch if we branch anyhow; recurse multiple fallthroughs; etc. } @@ -6813,8 +6807,7 @@ function emterpretify(ast) { // calculate values var range = maxx - minn + 1; assert(minn === (minn | 0) && range === (range | 0)); - var defaultAbsolute = data['default'] ? data['default'].absolute : getAbsolute('switch-default'); - var defaultrelative = data['default'] ? data['default'].relative : getRelative('switch-default'); + var defaultMarker = data['default'] ? data['default'].marker : getMarker('switch-default'); // emit the switch instruction itself var tempMin = getFree(), tempRange = getFree(); var ret = condition[1].concat(makeNum(minn, ASM_INT, tempMin)[1]).concat(makeNum(range, ASM_INT, tempRange)[1]); @@ -6827,14 +6820,13 @@ function emterpretify(ast) { var j = minn + i; var info = data[j]; if (info) { - ret.push('absolute-value', info.absolute, 0, 0); + ret.push('absolute-value', info.marker, 0, 0); } else { - ret.push('absolute-value', defaultAbsolute, 0, 0); + ret.push('absolute-value', defaultMarker, 0, 0); } } // emit the default TODO: optimize when there is no default - ret.push('absolute-target', defaultAbsolute, 0, 0); - ret.push('relative', defaultrelative, 0, 0); + ret.push('marker', defaultMarker, 0, 0); if (data['default']) { ret = ret.concat(data['default'].code); } @@ -6844,13 +6836,12 @@ function emterpretify(ast) { var j = minn + i; var info = data[j]; if (info) { - ret.push('absolute-target', info.absolute, 0, 0); - ret.push('relative', info.relative, 0, 0); + ret.push('marker', info.marker, 0, 0); ret = ret.concat(info.code); ret.push('BR', 0, info.next, 0); } } - ret.push('relative', exit, 0, 0); + ret.push('marker', exit, 0, 0); return [-1, ret]; } @@ -6924,41 +6915,26 @@ function emterpretify(ast) { } function finalizeJumps(code) { - function getI(obj) { + function getI(obj) { // the target of a marker var i = 0; while (i < code.length) { // find the definition, ignoring uses i = code.indexOf(obj, i); if (i < 0) return -1; - if (code[i-1] === 'relative' || code[i-1] === 'absolute-target') return i-1; + if (code[i-1] === 'marker') return i-1; i++; } return -1; } - // fill in absolute-targets where needed (optimized condition+branch may lack them) - for (var i = 0; i < code.length; i += 4) { - if (code[i] === 'absolute-value' && code[i+1].replaceWith) { - var absolute = code[i+1]; - if (getI(absolute) < 0) { - var relativeI = getI(absolute.replaceWith); - code.splice(relativeI, 0, 'absolute-target', absolute, 0, 0); - if (relativeI <= i) i += 4; - assert(code[i+1] === absolute); // sanity check on i adjustment - } - code[i+1].replaceWith = null; - } - } - function sanityCheck() { - var seenAbsolutes = {}; // every absolute value must have a valid target + var seenMarkers = {}; // every absolute value must have a valid target for (var i = 0; i < code.length; i += 4) { - if (code[i] === 'absolute-target') { - seenAbsolutes[code[i+1].id] = 1; + if (code[i] === 'marker') { + seenMarkers[code[i+1].id] = 1; } } for (var i = 0; i < code.length; i += 4) { if (code[i] === 'absolute-value') { - assert(code[i+1].id in seenAbsolutes); - assert(!code[i+1].replaceWith); + assert(code[i+1].id in seenMarkers); } } } @@ -6967,27 +6943,27 @@ function emterpretify(ast) { for (var i = 0; i < code.length; i += 4) { assert(!(code[i] in ABSOLUTE_BRANCHES)); if (code[i] in RELATIVE_BRANCHES) { - code[i+2].uses++; + code[i+2].relativeUses++; } else if (code[i] === 'absolute-value') { - code[i+1].uses++; + code[i+1].absoluteUses++; } } sanityCheck(); // optimization pass, skip over multiple jumps function skipNOPs(i) { - while (code[i] === 'relative' || code[i] === 'absolute-target') i += 4; // jump over all NOPs here + while (code[i] === 'marker') i += 4; // jump over all NOPs here return i; } for (var i = 0; i < code.length; i += 4) { if (code[i] in RELATIVE_BRANCHES) { while (1) { var j = getI(code[i+2]); - assert(code[j] === 'relative'); + assert(code[j] === 'marker'); j = skipNOPs(j); if (code[j] === 'BR' && code[i+2] !== code[j+2]) { - code[i+2].uses--; - assert(code[i+2].uses >= 0); - code[j+2].uses++; + code[i+2].relativeUses--; + assert(code[i+2].relativeUses >= 0); + code[j+2].relativeUses++; code[i+2] = code[j+2]; } else { break; @@ -7002,11 +6978,11 @@ function emterpretify(ast) { for (var j = i; j < i + num; j += 4) { assert(!(code[j] in ABSOLUTE_BRANCHES)); if (code[j] in RELATIVE_BRANCHES) { - code[j+2].uses--; - assert(code[j+2].uses >= 0); + code[j+2].relativeUses--; + assert(code[j+2].relativeUses >= 0); } else if (code[j] === 'absolute-value') { - code[j+1].uses--; - assert(code[j+1].uses >= 0); + code[j+1].absoluteUses--; + assert(code[j+1].absoluteUses >= 0); } } code.splice(i, num); @@ -7015,10 +6991,13 @@ function emterpretify(ast) { if (code[i] in UNCONDITIONAL_BRANCHES) { var j = i + 4; // normal forward control flow cannot reach this position while (j < code.length) { - if (code[j] === 'relative' || code[j] === 'absolute-target') { - var uses = code[j+1].uses; - assert(uses >= 0); - if (uses > 0) break; // this is reachable + if (code[j] === 'marker') { + var relativeUses = code[j+1].relativeUses; + assert(relativeUses >= 0); + if (relativeUses > 0) break; // this is reachable + var absoluteUses = code[j+1].absoluteUses; + assert(absoluteUses >= 0); + if (absoluteUses > 0) break; // this is reachable } j += 4; // this instr is unreachable } @@ -7029,34 +7008,22 @@ function emterpretify(ast) { } sanityCheck(); // second pass, find out which relative branches must be converted to absolutes, because they are too big + // and convert them for (var i = 0; i < code.length; i += 4) { if (code[i] in RELATIVE_BRANCHES) { var obj = code[i+2]; var target = getI(obj); - var offset = target - i; // overestimate, since there are still 'relative' and 'absolute-target' that will be cleaned up + var offset = target - i; // overestimate, since there are still 'marker's that will be cleaned up var storedOffset = offset >> 2; // offsets are divisible by 4, so we ignore the lower bits var maxOffset = storedOffset * 2; // when we convert relative to absolute, we double the size of a branch. // so worst case, we may double offsets (TODO this could be optimized) if ((maxOffset << 16 >> 16) !== maxOffset) { - if (!obj.replaceWith) { - obj.replaceWith = getAbsolute('relative-replacement'); - code.splice(target, 0, 'absolute-target', obj.replaceWith, 0, 0); - } - } - } - } - sanityCheck(); - // convert necessary relative branches to absolutes - for (var i = 0; i < code.length; i += 4) { - if (code[i] in RELATIVE_BRANCHES) { - var obj = code[i+2]; - if (obj.replaceWith) { code[i] += 'A'; // convert branch to absolute code[i+2] = 0; // id is no longer needed, 4 extra bytes in the inst will contain the absolute value - code.splice(i+4, 0, 'absolute-value', obj.replaceWith, 0, 0); // add absolute value after first part of branch inst - obj.replaceWith.uses++; - obj.uses--; - assert(obj.uses >= 0); + code.splice(i+4, 0, 'absolute-value', obj, 0, 0); // add absolute value after first part of branch inst + obj.relativeUses--; + assert(obj.relativeUses >= 0); + obj.absoluteUses++; } } } @@ -7068,7 +7035,7 @@ function emterpretify(ast) { // a BRT. this can happen at the end of while loops, if there is a condition that checks if we should break out if (skipNOPs(i+8) === skipNOPs(getI(code[i+2]))) { code[i] = 'BRT'; - code[i+2].uses--; + code[i+2].relativeUses--; code[i+2] = code[i+6]; code.splice(i+4, 4); } @@ -7076,21 +7043,18 @@ function emterpretify(ast) { } // remove relative and absolute placeholders, after which every instruction is now in its absolute location, and we can write out absolutes for (var i = 0; i < code.length; i += 4) { - if (code[i] === 'relative') { - code[i+1].id = i; // store the i position in the id - assert(i == getI(code[i+1])); - code.splice(i, 4); - i -= 4; - } else if (code[i] === 'absolute-target') { + if (code[i] === 'marker') { var obj = code[i+1]; - if (obj.uses > 0) { + obj.i = i; + assert(i == getI(obj)); + if (obj.absoluteUses > 0) { absoluteTargets[obj.id] = i; } code.splice(i, 4); i -= 4; } else if (code[i] === 'absolute-value') { var obj = code[i+1]; - assert(obj.uses > 0); + assert(obj.absoluteUses > 0); code[i+1] = obj.id; } } @@ -7098,8 +7062,7 @@ function emterpretify(ast) { for (var i = 0; i < code.length; i += 4) { if (code[i] in RELATIVE_BRANCHES) { var obj = code[i+2]; - assert(!obj.replaceWith); - var target = obj.id; + var target = obj.i; assert(target >= 0); var offset = target - i; assert(offset % 4 === 0); From 240d01e1d30e0e9248e08ff7d634011b070f9940 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 4 Oct 2014 15:05:20 -0700 Subject: [PATCH 324/461] optimize condition+BRF=>condition+BRT --- tools/js-optimizer.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 9d269120a2264..031ecb3febc8a 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5951,6 +5951,7 @@ function emterpretify(ast) { mergeInto(BRANCHES, RELATIVE_BRANCHES); mergeInto(BRANCHES, ABSOLUTE_BRANCHES); var UNCONDITIONAL_BRANCHES = set('BR', 'BRA'); + var CONDITION_BRFS = set('LNOTBRF', 'EQBRF', 'NEBRF', 'SLTBRF', 'ULTBRF', 'SLEBRF', 'ULEBRF'); var COMPARISONS = set('LNOT', 'EQ', 'NE', 'SLT', 'ULT', 'SLE', 'ULE'); @@ -7039,6 +7040,18 @@ function emterpretify(ast) { code[i+2] = code[i+6]; code.splice(i+4, 4); } + } else if (code[i] in CONDITION_BRFS && code[i+8] === 'BR') { + // similar optimization, with condition+BRF => condition+BRT + if (skipNOPs(i+12) === skipNOPs(getI(code[i+5]))) { + code[i] = code[i].substr(0, code[i].length-1) + 'T'; // same condition, swap BRF to BRT + code[i+5].absoluteUses--; + assert(code[i+5].absoluteUses >= 0); + code[i+5] = code[i+10]; + code[i+5].relativeUses--; + assert(code[i+5].relativeUses >= 0); + code[i+5].absoluteUses++; + code.splice(i+8, 4); + } } } // remove relative and absolute placeholders, after which every instruction is now in its absolute location, and we can write out absolutes From 45c07d4f9eab1f6372ccc9f2f4859f4f5647451f Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 4 Oct 2014 19:50:53 -0700 Subject: [PATCH 325/461] always run emterpreters at stack frame 0 --- tests/test_core.py | 4 +-- tools/js-optimizer.js | 82 ++++++++++++++++++++++++++----------------- 2 files changed, 51 insertions(+), 35 deletions(-) diff --git a/tests/test_core.py b/tests/test_core.py index 6360e94376851..3d707835790a0 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -24,12 +24,12 @@ def test_hello_world(self): assert 'EMSCRIPTEN_GENERATED_FUNCTIONS' not in src, 'must not emit this unneeded internal thing' else: assert 'function emterpret' in src, 'emterpreter should exist' - assert 'return emterpret' in src, 'emterpreter should be called' + assert ' = emterpret' in src, 'emterpreter should be called' # and removing calls to the emterpreter break, so it was being used output = open(output).read() out1 = run_js('src.cpp.o.js') assert output in out1 - open('src.cpp.o.js', 'w').write(src.replace('return emterpret', 'return no')) + open('src.cpp.o.js', 'w').write(src.replace(' = emterpret', ' = no')) out2 = run_js('src.cpp.o.js', stderr=PIPE, assert_returncode=None) assert output not in out2, out2 assert out1 != out2 diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 031ecb3febc8a..d096f9d3f53a5 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -173,6 +173,10 @@ function astToSrc(ast, minifyWhitespace) { }); } +function srcToStat(src) { + return srcToAst(src)[1][0]; // look into toplevel +} + // Traverses the children of a node. If the traverse function returns an object, // replaces the child. If it returns true, stop the traversal and return true. function traverseChildren(node, traverse, pre, post) { @@ -7178,60 +7182,72 @@ function emterpretify(ast) { if (code.length < 4 || code[code.length-4] != 'RET') { code.push('RET', 0, 0, 0); // final ret for the function } - assert(maxLocal < 255, 'too many locals ' + [maxLocal, numLocals]); // maximum local value is 255, for a total of 256 of them - code = ['FUNC', maxLocal+1, func[2].length, 0].concat(constants).concat(code); + // calculate final count of local variables, and emit func header + var finalLocals = Math.max(numLocals, maxLocal+1); // if no free locals, then numLocals, else the largest free local says how many + assert(finalLocals < 256, 'too many locals ' + [maxLocal, numLocals]); // maximum local value is 255, for a total of 256 of them + code = ['FUNC', finalLocals, func[2].length, 0].concat(constants).concat(code); verifyCode(code); finalizeJumps(code); - // if this is a leaf method (does no calls to other emterpreted code), we can use the zero-stackbase emterpreter - var leaf = true; - for (var i = 0; i < code.length; i += 4) { - // if this is a call to another emterpreted function, or a function pointer (so we can't tell), it isn't a leaf - if (code[i] === 'CALL' && ((code[i+2] in EMTERPRETED_FUNCS) || isFunctionTable(code[i+2]))) { - leaf = false; - break; - } - } + var zero = true; // set up trampoline + asmData.vars = {}; + if (zero) { + // emterpreters run using the stack starting at 0. we must copy it so we can restore it later + asmData.vars['sp'] = ASM_INT; + func[3].push(srcToStat('sp = EMTSTACKTOP;')); + var stackBytes = finalLocals*8; + func[3].push(srcToStat('EMTSTACKTOP = EMTSTACKTOP + ' + stackBytes + ' | 0;')); + func[3].push(srcToStat('assert(((EMTSTACKTOP|0) <= (EMT_STACK_MAX|0))|0);')); + asmData.vars['x'] = ASM_INT; + func[3].push(srcToStat('while ((x | 0) < ' + stackBytes + ') { HEAP32[sp + x >> 2] = HEAP32[x >> 2] | 0; x = x + 4 | 0; }')); + } + // copy our arguments to our stack frame var bump = 0; // we will assert in the emterpreter itself that we did not overflow the emtstack func[2].forEach(function(arg) { var code; - var ptr = leaf ? bump : (bump ? 'EMTSTACKTOP + ' + bump : 'EMTSTACKTOP'); switch (asmData.params[arg]) { - case ASM_INT: code = 'HEAP32[' + ptr + ' >> 2] = ' + arg + ';'; break; - case ASM_DOUBLE: code = 'HEAPF64[' + ptr + ' >> 3] = ' + arg + ';'; break; - case ASM_FLOAT: code = 'HEAPF32[' + ptr + ' >> 2] = ' + arg + ';'; break; + case ASM_INT: code = 'HEAP32[' + (zero ? (bump >> 2) : ('EMTSTACKTOP + ' + bump + ' >> 2')) + '] = ' + arg + ';'; break; + case ASM_DOUBLE: code = 'HEAPF64[' + (zero ? (bump >> 3) : ('EMTSTACKTOP + ' + bump + ' >> 3')) + '] = ' + arg + ';'; break; + case ASM_FLOAT: code = 'HEAPF32[' + (zero ? (bump >> 2) : ('EMTSTACKTOP + ' + bump + ' >> 2')) + '] = ' + arg + ';'; break; default: throw 'bad'; } - func[3].push(srcToAst(code)[1][0]); + func[3].push(srcToStat(code)); bump += 8; // each local is a 64-bit value }); - denormalizeAsm(func, asmData); + // prepare the call into the emterpreter var theName = ['name', 'emterpret']; var theCall = ['call', theName, [['name', 'EMTERPRETER_' + func[1]]]]; // EMTERPRETER_* will be replaced with the absolute bytecode offset later - func[3] = func[3].filter(function(node) { - if (node[0] === 'return') { - assert(asmData.ret !== undefined); - var type = detectType(node[1]); - node[1] = makeAsmCoercion(theCall, type); - switch (type) { - case ASM_INT: theName[1] += '_i'; break; - case ASM_DOUBLE: theName[1] += '_d'; break; - default: throw 'bad'; - } + // add a return if necessary + if (asmData.ret !== undefined) { + switch (asmData.ret) { + case ASM_INT: theName[1] += '_i'; break; + case ASM_DOUBLE: theName[1] += '_d'; break; + default: throw 'bad'; } - return node[0] !== 'var'; - }); - if (asmData.ret === undefined) { + asmData.vars['ret'] = asmData.ret; + func[3].push(['stat', ['assign', true, ['name', 'ret'], makeAsmCoercion(theCall, asmData.ret)]]); + } else { theName[1] += '_i'; // void funcs reuse _i, and ignore the return value func[3].push(['stat', makeAsmCoercion(theCall, ASM_INT)]); } - if (leaf) theName[1] += '_z'; - + if (zero) { + theName[1] += '_z'; + // restore the stack + func[3].push(srcToStat('x = 0;')); + func[3].push(srcToStat('while ((x | 0) < ' + stackBytes + ') { HEAP32[x >> 2] = HEAP32[sp + x >> 2] | 0; x = x + 4 | 0; }')); + func[3].push(srcToStat('EMTSTACKTOP = sp;')); + } + // add the return + if (asmData.ret !== undefined) { + func[3].push(['return', makeAsmCoercion(['name', 'ret'], asmData.ret)]); + } // emit trampoline and bytecode - print(astToSrc(func) + ' //' + JSON.stringify([code, absoluteTargets])); + denormalizeAsm(func, asmData); + prepDotZero(func); + print(fixDotZero(astToSrc(func)) + ' //' + JSON.stringify([code, absoluteTargets])); } traverseGeneratedFunctions(ast, walkFunction); } From 8c3d8768230fda3d77bcaa84c0c673c637ec108f Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 5 Oct 2014 14:05:57 -0700 Subject: [PATCH 326/461] todo --- tools/js-optimizer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index d096f9d3f53a5..05634dc05eccc 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -7190,7 +7190,7 @@ function emterpretify(ast) { finalizeJumps(code); - var zero = true; + var zero = true; // TODO: heuristics // set up trampoline asmData.vars = {}; From 7da4b1832396de5de226180f3202c4d7f43e8dfe Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 6 Oct 2014 11:56:10 -0700 Subject: [PATCH 327/461] ensureLabelSet pass, and use it to avoid zeroing out all local vars in emterpreter --- emcc | 2 +- tests/test_other.py | 2 ++ tools/emterpretify.py | 10 +++--- tools/js-optimizer.js | 25 +++++++++++++ ...test-js-optimizer-ensureLabelSet-output.js | 36 +++++++++++++++++++ tools/test-js-optimizer-ensureLabelSet.js | 34 ++++++++++++++++++ 6 files changed, 103 insertions(+), 6 deletions(-) create mode 100644 tools/test-js-optimizer-ensureLabelSet-output.js create mode 100644 tools/test-js-optimizer-ensureLabelSet.js diff --git a/emcc b/emcc index e356ea5db0581..d3051bda62030 100755 --- a/emcc +++ b/emcc @@ -1412,7 +1412,7 @@ try: js_optimizer_queue += ['simplifyExpressions'] if shared.Settings.EMTERPRETIFY: # emterpreter code will not run through a JS optimizing JIT, do more work ourselves - js_optimizer_queue += ['localCSE'] + js_optimizer_queue += ['localCSE', 'ensureLabelSet'] if shared.Settings.RELOOP and not shared.Settings.ASM_JS: js_optimizer_queue += ['optimizeShiftsAggressive', get_eliminate()] # aggressive shifts optimization requires loops, it breaks on switches diff --git a/tests/test_other.py b/tests/test_other.py index 9d12321d626db..08e2f848d57ca 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -1897,6 +1897,8 @@ def test_js_optimizer(self): ['pointerMasking']), (path_from_root('tools', 'test-js-optimizer-localCSE.js'), open(path_from_root('tools', 'test-js-optimizer-localCSE-output.js')).read(), ['asm', 'localCSE']), + (path_from_root('tools', 'test-js-optimizer-ensureLabelSet.js'), open(path_from_root('tools', 'test-js-optimizer-ensureLabelSet-output.js')).read(), + ['asm', 'ensureLabelSet']), ]: print input output = Popen(listify(NODE_JS) + [path_from_root('tools', 'js-optimizer.js'), input] + passes, stdin=PIPE, stdout=PIPE).communicate()[0] diff --git a/tools/emterpretify.py b/tools/emterpretify.py index aefa25dca2231..dfafc09ca3988 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -19,7 +19,7 @@ # consts -BLACKLIST = set(['_malloc', '_free', '_memcpy', '_memset', 'copyTempDouble', 'copyTempFloat', '_strlen', 'stackAlloc', 'setThrew', 'stackRestore', 'setTempRet0', 'getTempRet0', 'stackSave', 'runPostSets', '_emscripten_autodebug_double', '_emscripten_autodebug_float', '_emscripten_autodebug_i8', '_emscripten_autodebug_i16', '_emscripten_autodebug_i32', '_emscripten_autodebug_i64']) +BLACKLIST = set(['_malloc', '_free', '_memcpy', '_memmove', '_memset', 'copyTempDouble', 'copyTempFloat', '_strlen', 'stackAlloc', 'setThrew', 'stackRestore', 'setTempRet0', 'getTempRet0', 'stackSave', 'runPostSets', '_emscripten_autodebug_double', '_emscripten_autodebug_float', '_emscripten_autodebug_i8', '_emscripten_autodebug_i16', '_emscripten_autodebug_i32', '_emscripten_autodebug_i64', '_strncpy', '_strcpy', '_strcat', '_saveSetjmp', '_testSetjmp', '_emscripten_replace_memory', '_bitshift64Shl', '_bitshift64Ashr', '_bitshift64Lshr']) # XXX this list must contain all functions that rely on asm declarations to zero out variables, which means most asm js library functions. we specifically take care of 'label' in compiler-generated functions. OPCODES = [ # l, lx, ly etc - one of 256 locals 'SET', # [lx, ly, 0] lx = ly (int or float, not double) @@ -496,10 +496,10 @@ def process(code): lx = HEAPU8[pc + 1 >> 0] | 0; // num locals %s ly = HEAPU8[pc + 2 >> 0] | 0; - while ((ly | 0) < (lx | 0)) { // clear the non-param locals - %s = +0; - ly = ly + 1 | 0; - } + //while ((ly | 0) < (lx | 0)) { // clear the non-param locals - XXX should not be needed, unless we relied on an asm declaration to zero out a variable + // %s = +0; + // ly = ly + 1 | 0; + //} //print('enter func ' + [pc, HEAPU8[pc + 0],HEAPU8[pc + 1],HEAPU8[pc + 2],HEAPU8[pc + 3],HEAPU8[pc + 4],HEAPU8[pc + 5],HEAPU8[pc + 6],HEAPU8[pc + 7]].join(', ')); while (1) { %s diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 05634dc05eccc..dba6e3abdc5b6 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5941,6 +5941,30 @@ function pointerMasking(ast) { }); } +// Ensures that if label exists, it is assigned an initial value (to not assume the asm declaration has an effect, which we normally do not) +function ensureLabelSet(ast) { + assert(asm); + traverseGeneratedFunctions(ast, function(func) { + var asmData = normalizeAsm(func); + if ('label' in asmData.vars) { + var stats = getStatements(func); + for (var i = 0; i < stats.length; i++) { + var node = stats[i]; + if (node[0] === 'stat') node = node[1]; + if (node[0] === 'assign' && node[2][0] === 'name' && node[2][1] === 'label') { + break; // all good + } + if (node[0] === 'label' || (node[0] in CONTROL_FLOW)) { + // we haven't seen an assign, and we hit control flow. add an assign + stats.splice(i, 0, ['stat', ['assign', true, ['name', 'label'], ['num', 0]]]); + break; + } + } + } + denormalizeAsm(func, asmData); + }); +} + // Converts functions into binary format to be run by an emterpreter function emterpretify(ast) { emitAst = false; @@ -7405,6 +7429,7 @@ var passes = { safeHeap: safeHeap, optimizeFrounds: optimizeFrounds, pointerMasking: pointerMasking, + ensureLabelSet: ensureLabelSet, emterpretify: emterpretify, asmLastOpts: asmLastOpts, diff --git a/tools/test-js-optimizer-ensureLabelSet-output.js b/tools/test-js-optimizer-ensureLabelSet-output.js new file mode 100644 index 0000000000000..c2a58e1aca2ae --- /dev/null +++ b/tools/test-js-optimizer-ensureLabelSet-output.js @@ -0,0 +1,36 @@ +function noNeed() { + var x = 0; + f(x); +} +function need() { + var x = 0, label = 0; + f(x); + label = 0; + if (y) { + label = 0; + } else { + label = 1; + } + g(label); +} +function noNeed2() { + var x = 0, label = 0; + f(x); + label = 0; + if (y) { + label = 1; + } + g(label); +} +function need2() { + var x = 0, label = 0; + f(x); + label = 0; + waka : if (y) { + label = 0; + } else { + label = 1; + } + g(label); +} + diff --git a/tools/test-js-optimizer-ensureLabelSet.js b/tools/test-js-optimizer-ensureLabelSet.js new file mode 100644 index 0000000000000..1d8fed96c5866 --- /dev/null +++ b/tools/test-js-optimizer-ensureLabelSet.js @@ -0,0 +1,34 @@ +function noNeed() { + var x = 0; + f(x); +} +function need() { + var x = 0, label = 0; + f(x); + if (y) { + label = 0; + } else { + label = 1; + } + g(label); +} +function noNeed2() { + var x = 0, label = 0; + f(x); + label = 0; + if (y) { + label = 1; + } + g(label); +} +function need2() { + var x = 0, label = 0; + f(x); + waka: if (y) { + label = 0; + } else { + label = 1; + } + g(label); +} +// EMSCRIPTEN_GENERATED_FUNCTIONS: ["noNeed", "need", "noNeed2", "need2"] From 8137f2909a6c450bff39addcc160759053ddf0c2 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 6 Oct 2014 14:34:45 -0700 Subject: [PATCH 328/461] debugging help --- tools/emterpretify.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index dfafc09ca3988..6768ff4d95d62 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -449,7 +449,7 @@ def process(code): if zero: code = code.replace('sp + ', '') return code - main_loop_prefix = r''' //print('last lx (' + lx + '): ' + [''' + get_coerced_access('lx') + ',' + get_coerced_access('lx', s='d') + ''']); + main_loop_prefix = r''' //if (first) first = false; else print('last lx (' + lx + '): ' + [''' + get_coerced_access('lx') + ',' + get_coerced_access('lx', s='d') + ''']); pc = pc + 4 | 0; inst = HEAP32[pc>>2]|0; lx = (inst >> 8) & 255; @@ -501,6 +501,7 @@ def process(code): // ly = ly + 1 | 0; //} //print('enter func ' + [pc, HEAPU8[pc + 0],HEAPU8[pc + 1],HEAPU8[pc + 2],HEAPU8[pc + 3],HEAPU8[pc + 4],HEAPU8[pc + 5],HEAPU8[pc + 6],HEAPU8[pc + 7]].join(', ')); + //var first = true; while (1) { %s } From b8a4a285b52e3859b3bd5b214b273d0cf723ecb1 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 6 Oct 2014 15:03:09 -0700 Subject: [PATCH 329/461] only let leaves use zero stack offset, as otherwise hard to support setjmp, exceptions, etc. --- tools/js-optimizer.js | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index dba6e3abdc5b6..2a74e2cf42043 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1576,8 +1576,12 @@ function simplifyNotComps(ast) { simplifyNotCompsPass = false; } +function isMathFunc(name) { + return /^Math_/.test(name); +} + function callHasSideEffects(node) { // checks if the call itself (not the args) has side effects (or is not statically known) - return !(node[1][0] === 'name' && /^Math_/.test(node[1][1])); + return !(node[1][0] === 'name' && isMathFunc(node[1][1])); } function hasSideEffects(node) { // this is 99% incomplete! @@ -7214,11 +7218,26 @@ function emterpretify(ast) { finalizeJumps(code); - var zero = true; // TODO: heuristics + // check if this is a leaf method (does no calls to other emterpreted code) + var DEFINITE_LEAVES = set('_memcpy', '_memmove', '_memset', '_strlen', '_strncpy', '_strcpy', '_strcat', '_printf', '_puts', '_malloc', '_free'); // things we know for sure are leaves XXX hackish, dangerous + + var leaf = true; + for (var i = 0; i < code.length; i += 4) { + // if this is a call that can conceivably reach other emterpreted code, it isn't a leaf + if (code[i] === 'CALL' && !isMathFunc(code[i+2]) && !(code[i+2] in DEFINITE_LEAVES)) { + leaf = false; + //printErr(' NOT leaf ' + func[1] + ' since ' + code[i+2]); + break; + } + } + //if (leaf) printErr(func[1]); + + var zero = leaf; // TODO: heuristics + var onlyLeavesAreZero = true; // if only leaves are zero, then we do not need to save and restore the stack XXX if this is not true, then setjmp and exceptions can fail, as cleanup is skipped! // set up trampoline asmData.vars = {}; - if (zero) { + if (zero && !onlyLeavesAreZero) { // emterpreters run using the stack starting at 0. we must copy it so we can restore it later asmData.vars['sp'] = ASM_INT; func[3].push(srcToStat('sp = EMTSTACKTOP;')); @@ -7259,10 +7278,12 @@ function emterpretify(ast) { } if (zero) { theName[1] += '_z'; - // restore the stack - func[3].push(srcToStat('x = 0;')); - func[3].push(srcToStat('while ((x | 0) < ' + stackBytes + ') { HEAP32[x >> 2] = HEAP32[sp + x >> 2] | 0; x = x + 4 | 0; }')); - func[3].push(srcToStat('EMTSTACKTOP = sp;')); + if (!onlyLeavesAreZero) { + // restore the stack + func[3].push(srcToStat('x = 0;')); + func[3].push(srcToStat('while ((x | 0) < ' + stackBytes + ') { HEAP32[x >> 2] = HEAP32[sp + x >> 2] | 0; x = x + 4 | 0; }')); + func[3].push(srcToStat('EMTSTACKTOP = sp;')); + } } // add the return if (asmData.ret !== undefined) { From da1d2a347e1cec1036a42d29539f63a162c271e1 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 6 Oct 2014 16:43:36 -0700 Subject: [PATCH 330/461] update other.test_emterpreter --- tests/test_other.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_other.py b/tests/test_other.py index 08e2f848d57ca..31d7448fc72a7 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4288,6 +4288,6 @@ def do_log_test(source, expected, func): seen = int(post) assert expected == seen, ['expect', expected, 'but see', seen] - do_log_test(path_from_root('tests', 'primes.cpp'), 85, 'main') + do_log_test(path_from_root('tests', 'primes.cpp'), 86, 'main') do_log_test(path_from_root('tests', 'fannkuch.cpp'), 233, 'fannkuch_worker') From 323583f542bf6ffab02dad6550f8d0772bb1d8bf Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 6 Oct 2014 15:34:15 -0700 Subject: [PATCH 331/461] comment --- tools/js-optimizer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 2a74e2cf42043..8c524836b772f 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -7219,7 +7219,7 @@ function emterpretify(ast) { finalizeJumps(code); // check if this is a leaf method (does no calls to other emterpreted code) - var DEFINITE_LEAVES = set('_memcpy', '_memmove', '_memset', '_strlen', '_strncpy', '_strcpy', '_strcat', '_printf', '_puts', '_malloc', '_free'); // things we know for sure are leaves XXX hackish, dangerous + var DEFINITE_LEAVES = set('_memcpy', '_memmove', '_memset', '_strlen', '_strncpy', '_strcpy', '_strcat', '_printf', '_puts', '_malloc', '_free'); // things we know for sure are leaves XXX hackish, dangerous. To get more stuff in here, it must be either in a JS library, or blacklisted from the emterpreter, and be known to never reach emterpreted code. var leaf = true; for (var i = 0; i < code.length; i += 4) { From 520c85124f1eae426667e4d0c2043c5107bd1392 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 6 Oct 2014 16:37:00 -0700 Subject: [PATCH 332/461] refactor to allow making trampolines optional --- tools/emterpretify.py | 30 ++++++----- tools/js-optimizer.js | 112 ++++++++++++++++++++++-------------------- tools/js_optimizer.py | 56 +++++++++++---------- tools/shared.py | 4 +- 4 files changed, 105 insertions(+), 97 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 6768ff4d95d62..f76a8b2012457 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -537,10 +537,11 @@ def process(code): # decide which functions will be emterpreted emterpreted_funcs = [func for func in asm.funcs if func not in BLACKLIST and not func.startswith('dynCall_')] +exported_emterpreted_funcs = filter(lambda func: func in emterpreted_funcs, [func.split(':')[0] for func in asm.exports]) # process functions, generating bytecode temp = infile + '.tmp.js' -shared.Building.js_optimizer(infile, ['emterpretify'], extra_info={ 'emterpretedFuncs': list(emterpreted_funcs), 'opcodes': OPCODES, 'ropcodes': ROPCODES }, output_filename=temp) +shared.Building.js_optimizer(infile, ['emterpretify'], extra_info={ 'emterpretedFuncs': list(emterpreted_funcs), 'exportedEmterpretedFuncs': list(exported_emterpreted_funcs), 'opcodes': OPCODES, 'ropcodes': ROPCODES }, output_filename=temp, just_concat=True) # load the module and modify it asm = asm_module.AsmModule(temp) @@ -660,23 +661,20 @@ def process_code(func, code, absolute_targets): line = lines[i] if line.startswith('function ') and '}' not in line: assert not func - func = line.split(' ')[1].split('(')[0] - elif line.startswith('}'): - assert func + elif line.startswith('// EMTERPRET_INFO '): try: - curr, absolute_targets = json.loads(line[4:]) - except: - if '[' in line: print >> sys.stderr, 'failed to parse code from', line - curr = None - if curr is not None: - assert len(curr) % 4 == 0, curr - funcs[func] = len(all_code) # no operation here should change the length - if LOG_CODE: print >> sys.stderr, 'raw bytecode for %s:' % func, curr, 'insts:', len(curr)/4 - process_code(func, curr, absolute_targets) - #print >> sys.stderr, 'processed bytecode for %s:' % func, curr - all_code += curr + func, curr, absolute_targets = json.loads(line[len('// EMTERPRET_INFO '):]) + except Exception, e: + print >> sys.stderr, 'failed to parse code from', line + raise e + assert len(curr) % 4 == 0, curr + funcs[func] = len(all_code) # no operation here should change the length + if LOG_CODE: print >> sys.stderr, 'raw bytecode for %s:' % func, curr, 'insts:', len(curr)/4 + process_code(func, curr, absolute_targets) + #print >> sys.stderr, 'processed bytecode for %s:' % func, curr + all_code += curr func = None - lines[i] = '}' + lines[i] = '' elif line.startswith('// return type: ['): name, ret = line.split('[')[1].split(']')[0].split(',') if ret == 'undefined': diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 8c524836b772f..09c623d565b37 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5974,6 +5974,7 @@ function emterpretify(ast) { emitAst = false; var EMTERPRETED_FUNCS = set(extraInfo.emterpretedFuncs); + var EXPORTED_EMTERPRETED_FUNCS = set(extraInfo.exportedEmterpretedFuncs); var OPCODES = extraInfo.opcodes; var ROPCODES = extraInfo.ropcodes; @@ -7235,64 +7236,67 @@ function emterpretify(ast) { var zero = leaf; // TODO: heuristics var onlyLeavesAreZero = true; // if only leaves are zero, then we do not need to save and restore the stack XXX if this is not true, then setjmp and exceptions can fail, as cleanup is skipped! - // set up trampoline - asmData.vars = {}; - if (zero && !onlyLeavesAreZero) { - // emterpreters run using the stack starting at 0. we must copy it so we can restore it later - asmData.vars['sp'] = ASM_INT; - func[3].push(srcToStat('sp = EMTSTACKTOP;')); - var stackBytes = finalLocals*8; - func[3].push(srcToStat('EMTSTACKTOP = EMTSTACKTOP + ' + stackBytes + ' | 0;')); - func[3].push(srcToStat('assert(((EMTSTACKTOP|0) <= (EMT_STACK_MAX|0))|0);')); - asmData.vars['x'] = ASM_INT; - func[3].push(srcToStat('while ((x | 0) < ' + stackBytes + ') { HEAP32[sp + x >> 2] = HEAP32[x >> 2] | 0; x = x + 4 | 0; }')); - } - // copy our arguments to our stack frame - var bump = 0; // we will assert in the emterpreter itself that we did not overflow the emtstack - func[2].forEach(function(arg) { - var code; - switch (asmData.params[arg]) { - case ASM_INT: code = 'HEAP32[' + (zero ? (bump >> 2) : ('EMTSTACKTOP + ' + bump + ' >> 2')) + '] = ' + arg + ';'; break; - case ASM_DOUBLE: code = 'HEAPF64[' + (zero ? (bump >> 3) : ('EMTSTACKTOP + ' + bump + ' >> 3')) + '] = ' + arg + ';'; break; - case ASM_FLOAT: code = 'HEAPF32[' + (zero ? (bump >> 2) : ('EMTSTACKTOP + ' + bump + ' >> 2')) + '] = ' + arg + ';'; break; - default: throw 'bad'; + if (1) { //func[1] in EXPORTED_EMTERPRETED_FUNCS) { + // set up trampoline + asmData.vars = {}; + if (zero && !onlyLeavesAreZero) { + // emterpreters run using the stack starting at 0. we must copy it so we can restore it later + asmData.vars['sp'] = ASM_INT; + func[3].push(srcToStat('sp = EMTSTACKTOP;')); + var stackBytes = finalLocals*8; + func[3].push(srcToStat('EMTSTACKTOP = EMTSTACKTOP + ' + stackBytes + ' | 0;')); + func[3].push(srcToStat('assert(((EMTSTACKTOP|0) <= (EMT_STACK_MAX|0))|0);')); + asmData.vars['x'] = ASM_INT; + func[3].push(srcToStat('while ((x | 0) < ' + stackBytes + ') { HEAP32[sp + x >> 2] = HEAP32[x >> 2] | 0; x = x + 4 | 0; }')); + } + // copy our arguments to our stack frame + var bump = 0; // we will assert in the emterpreter itself that we did not overflow the emtstack + func[2].forEach(function(arg) { + var code; + switch (asmData.params[arg]) { + case ASM_INT: code = 'HEAP32[' + (zero ? (bump >> 2) : ('EMTSTACKTOP + ' + bump + ' >> 2')) + '] = ' + arg + ';'; break; + case ASM_DOUBLE: code = 'HEAPF64[' + (zero ? (bump >> 3) : ('EMTSTACKTOP + ' + bump + ' >> 3')) + '] = ' + arg + ';'; break; + case ASM_FLOAT: code = 'HEAPF32[' + (zero ? (bump >> 2) : ('EMTSTACKTOP + ' + bump + ' >> 2')) + '] = ' + arg + ';'; break; + default: throw 'bad'; + } + func[3].push(srcToStat(code)); + bump += 8; // each local is a 64-bit value + }); + // prepare the call into the emterpreter + var theName = ['name', 'emterpret']; + var theCall = ['call', theName, [['name', 'EMTERPRETER_' + func[1]]]]; // EMTERPRETER_* will be replaced with the absolute bytecode offset later + // add a return if necessary + if (asmData.ret !== undefined) { + switch (asmData.ret) { + case ASM_INT: theName[1] += '_i'; break; + case ASM_DOUBLE: theName[1] += '_d'; break; + default: throw 'bad'; + } + asmData.vars['ret'] = asmData.ret; + func[3].push(['stat', ['assign', true, ['name', 'ret'], makeAsmCoercion(theCall, asmData.ret)]]); + } else { + theName[1] += '_i'; // void funcs reuse _i, and ignore the return value + func[3].push(['stat', makeAsmCoercion(theCall, ASM_INT)]); } - func[3].push(srcToStat(code)); - bump += 8; // each local is a 64-bit value - }); - // prepare the call into the emterpreter - var theName = ['name', 'emterpret']; - var theCall = ['call', theName, [['name', 'EMTERPRETER_' + func[1]]]]; // EMTERPRETER_* will be replaced with the absolute bytecode offset later - // add a return if necessary - if (asmData.ret !== undefined) { - switch (asmData.ret) { - case ASM_INT: theName[1] += '_i'; break; - case ASM_DOUBLE: theName[1] += '_d'; break; - default: throw 'bad'; + if (zero) { + theName[1] += '_z'; + if (!onlyLeavesAreZero) { + // restore the stack + func[3].push(srcToStat('x = 0;')); + func[3].push(srcToStat('while ((x | 0) < ' + stackBytes + ') { HEAP32[x >> 2] = HEAP32[sp + x >> 2] | 0; x = x + 4 | 0; }')); + func[3].push(srcToStat('EMTSTACKTOP = sp;')); + } } - asmData.vars['ret'] = asmData.ret; - func[3].push(['stat', ['assign', true, ['name', 'ret'], makeAsmCoercion(theCall, asmData.ret)]]); - } else { - theName[1] += '_i'; // void funcs reuse _i, and ignore the return value - func[3].push(['stat', makeAsmCoercion(theCall, ASM_INT)]); - } - if (zero) { - theName[1] += '_z'; - if (!onlyLeavesAreZero) { - // restore the stack - func[3].push(srcToStat('x = 0;')); - func[3].push(srcToStat('while ((x | 0) < ' + stackBytes + ') { HEAP32[x >> 2] = HEAP32[sp + x >> 2] | 0; x = x + 4 | 0; }')); - func[3].push(srcToStat('EMTSTACKTOP = sp;')); + // add the return + if (asmData.ret !== undefined) { + func[3].push(['return', makeAsmCoercion(['name', 'ret'], asmData.ret)]); } + // emit trampoline and bytecode + denormalizeAsm(func, asmData); + prepDotZero(func); + print(fixDotZero(astToSrc(func))); } - // add the return - if (asmData.ret !== undefined) { - func[3].push(['return', makeAsmCoercion(['name', 'ret'], asmData.ret)]); - } - // emit trampoline and bytecode - denormalizeAsm(func, asmData); - prepDotZero(func); - print(fixDotZero(astToSrc(func)) + ' //' + JSON.stringify([code, absoluteTargets])); + print('// EMTERPRET_INFO ' + JSON.stringify([func[1], code, absoluteTargets])); } traverseGeneratedFunctions(ast, walkFunction); } diff --git a/tools/js_optimizer.py b/tools/js_optimizer.py index 396184acdf4bb..083504ecc4071 100644 --- a/tools/js_optimizer.py +++ b/tools/js_optimizer.py @@ -100,7 +100,7 @@ def run_on_chunk(command): # avoid throwing keyboard interrupts from a child process raise Exception() -def run_on_js(filename, passes, js_engine, jcache, source_map=False, extra_info=None): +def run_on_js(filename, passes, js_engine, jcache, source_map=False, extra_info=None, just_concat=False): if isinstance(jcache, bool) and jcache: jcache = shared.JCache if jcache: shared.JCache.ensure() @@ -327,28 +327,34 @@ def write_chunk(chunk, i): f.write(pre); pre = None - # sort functions by size, to make diffing easier and to improve aot times - funcses = [] - for out_file in filenames: - funcses.append(split_funcs(open(out_file).read())) - funcs = [item for sublist in funcses for item in sublist] - funcses = None - def sorter(x, y): - diff = len(y[1]) - len(x[1]) - if diff != 0: return diff - if x[0] < y[0]: return 1 - elif x[0] > y[0]: return -1 - return 0 - funcs.sort(sorter) - - if 'last' in passes and len(funcs) > 0: - count = funcs[0][1].count('\n') - if count > 3000: - print >> sys.stderr, 'warning: Output contains some very large functions (%s lines in %s), consider building source files with -Os or -Oz, and/or trying OUTLINING_LIMIT to break them up (see settings.js; note that the parameter there affects AST nodes, while we measure lines here, so the two may not match up)' % (count, funcs[0][0]) - - for func in funcs: - f.write(func[1]) - funcs = None + if not just_concat: + # sort functions by size, to make diffing easier and to improve aot times + funcses = [] + for out_file in filenames: + funcses.append(split_funcs(open(out_file).read())) + funcs = [item for sublist in funcses for item in sublist] + funcses = None + def sorter(x, y): + diff = len(y[1]) - len(x[1]) + if diff != 0: return diff + if x[0] < y[0]: return 1 + elif x[0] > y[0]: return -1 + return 0 + funcs.sort(sorter) + + if 'last' in passes and len(funcs) > 0: + count = funcs[0][1].count('\n') + if count > 3000: + print >> sys.stderr, 'warning: Output contains some very large functions (%s lines in %s), consider building source files with -Os or -Oz, and/or trying OUTLINING_LIMIT to break them up (see settings.js; note that the parameter there affects AST nodes, while we measure lines here, so the two may not match up)' % (count, funcs[0][0]) + + for func in funcs: + f.write(func[1]) + funcs = None + else: + # just concat the outputs + for out_file in filenames: + f.write(open(out_file).read()) + assert not jcache f.write('\n') if jcache: for cached in cached_outputs: @@ -370,9 +376,9 @@ def sorter(x, y): return filename -def run(filename, passes, js_engine=shared.NODE_JS, jcache=False, source_map=False, extra_info=None): +def run(filename, passes, js_engine=shared.NODE_JS, jcache=False, source_map=False, extra_info=None, just_concat=False): js_engine = shared.listify(js_engine) - return temp_files.run_and_clean(lambda: run_on_js(filename, passes, js_engine, jcache, source_map, extra_info)) + return temp_files.run_and_clean(lambda: run_on_js(filename, passes, js_engine, jcache, source_map, extra_info, just_concat)) if __name__ == '__main__': last = sys.argv[-1] diff --git a/tools/shared.py b/tools/shared.py index 8ec7568473404..c95cf6d3689d6 100644 --- a/tools/shared.py +++ b/tools/shared.py @@ -1588,8 +1588,8 @@ def pick_llvm_opts(optimization_level): return opts @staticmethod - def js_optimizer(filename, passes, jcache=False, debug=False, extra_info=None, output_filename=None): - ret = js_optimizer.run(filename, passes, listify(NODE_JS), jcache, debug, extra_info) + def js_optimizer(filename, passes, jcache=False, debug=False, extra_info=None, output_filename=None, just_concat=False): + ret = js_optimizer.run(filename, passes, listify(NODE_JS), jcache, debug, extra_info, just_concat) if output_filename: safe_move(ret, output_filename) ret = output_filename From 75766411a9e63fa3531a75ec1f71123a62c5bb27 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 6 Oct 2014 17:40:41 -0700 Subject: [PATCH 333/461] utility to get all functions in a table, and use that to determine which are all the external emterpreter functions --- tools/asm_module.py | 6 +++++- tools/emterpretify.py | 12 ++++++++---- tools/js-optimizer.js | 6 +++--- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/tools/asm_module.py b/tools/asm_module.py index 945d72a20e355..3014f64a2f528 100644 --- a/tools/asm_module.py +++ b/tools/asm_module.py @@ -1,5 +1,5 @@ -import sys, re +import sys, re, itertools import shared, js_optimizer @@ -286,3 +286,7 @@ def combine_tables(self): for table, data in self.tables.iteritems(): self.tables_js += 'var %s = %s;\n' % (table, data) + def get_table_funcs(self): + return set(itertools.chain.from_iterable(map(lambda x: x[1:-1].split(','), self.tables.values()))) + + diff --git a/tools/emterpretify.py b/tools/emterpretify.py index f76a8b2012457..21b9f707964c0 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -534,14 +534,18 @@ def process(code): asm = asm_module.AsmModule(infile) -# decide which functions will be emterpreted +# decide which functions will be emterpreted, and find which are externally reachable (from outside other emterpreted code; those will need trampolines) -emterpreted_funcs = [func for func in asm.funcs if func not in BLACKLIST and not func.startswith('dynCall_')] -exported_emterpreted_funcs = filter(lambda func: func in emterpreted_funcs, [func.split(':')[0] for func in asm.exports]) +emterpreted_funcs = set([func for func in asm.funcs if func not in BLACKLIST and not func.startswith('dynCall_')]) + +tabled_funcs = asm.get_table_funcs() +exported_funcs = [func.split(':')[0] for func in asm.exports] +external_emterpreted_funcs = filter(lambda func: func in tabled_funcs or func in exported_funcs, emterpreted_funcs) +#print >> sys.stderr, emterpreted_funcs, tabled_funcs, external_emterpreted_funcs # process functions, generating bytecode temp = infile + '.tmp.js' -shared.Building.js_optimizer(infile, ['emterpretify'], extra_info={ 'emterpretedFuncs': list(emterpreted_funcs), 'exportedEmterpretedFuncs': list(exported_emterpreted_funcs), 'opcodes': OPCODES, 'ropcodes': ROPCODES }, output_filename=temp, just_concat=True) +shared.Building.js_optimizer(infile, ['emterpretify'], extra_info={ 'emterpretedFuncs': list(emterpreted_funcs), 'externalEmterpretedFuncs': list(external_emterpreted_funcs), 'opcodes': OPCODES, 'ropcodes': ROPCODES }, output_filename=temp, just_concat=True) # load the module and modify it asm = asm_module.AsmModule(temp) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 09c623d565b37..6ddd61baf57a7 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5974,7 +5974,7 @@ function emterpretify(ast) { emitAst = false; var EMTERPRETED_FUNCS = set(extraInfo.emterpretedFuncs); - var EXPORTED_EMTERPRETED_FUNCS = set(extraInfo.exportedEmterpretedFuncs); + var EXTERNAL_EMTERPRETED_FUNCS = set(extraInfo.externalEmterpretedFuncs); var OPCODES = extraInfo.opcodes; var ROPCODES = extraInfo.ropcodes; @@ -7236,8 +7236,8 @@ function emterpretify(ast) { var zero = leaf; // TODO: heuristics var onlyLeavesAreZero = true; // if only leaves are zero, then we do not need to save and restore the stack XXX if this is not true, then setjmp and exceptions can fail, as cleanup is skipped! - if (1) { //func[1] in EXPORTED_EMTERPRETED_FUNCS) { - // set up trampoline + if (1) { //func[1] in EXTERNAL_EMTERPRETED_FUNCS) { + // this is reachable from outside emterpreter code, set up a trampoline asmData.vars = {}; if (zero && !onlyLeavesAreZero) { // emterpreters run using the stack starting at 0. we must copy it so we can restore it later From e5bd854dde0445471c4f81431c766cc458e70ef4 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 7 Oct 2014 10:52:22 -0700 Subject: [PATCH 334/461] remove statements that have no side effects --- tools/js-optimizer.js | 2 ++ tools/test-js-optimizer-asm-regs-output.js | 4 ++++ tools/test-js-optimizer-asm-regs.js | 8 +++++++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 6ddd61baf57a7..0cdbc8c0bb30f 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1672,6 +1672,8 @@ function vacuum(ast) { case 'stat': { if (node[1][0] === 'block') { return node[1]; + } else if (!hasSideEffects(node[1])) { + return emptyNode(); } } break; case 'defun': { diff --git a/tools/test-js-optimizer-asm-regs-output.js b/tools/test-js-optimizer-asm-regs-output.js index 49e5032fc38ac..c75bbcf74dab3 100644 --- a/tools/test-js-optimizer-asm-regs-output.js +++ b/tools/test-js-optimizer-asm-regs-output.js @@ -103,4 +103,8 @@ function iffey() { } return 0; } +function nops() { + var i1 = 0; + f(i1); +} diff --git a/tools/test-js-optimizer-asm-regs.js b/tools/test-js-optimizer-asm-regs.js index b2d97afc109ae..9c5b49fd13056 100644 --- a/tools/test-js-optimizer-asm-regs.js +++ b/tools/test-js-optimizer-asm-regs.js @@ -106,5 +106,11 @@ function iffey() { } return 0; } -// EMSCRIPTEN_GENERATED_FUNCTIONS: ["asm", "_doit", "stackRestore", "switchey", "switchey2", "iffey"] +function nops() { + var x = 0; + x | 0; + ~x; + f(x); +} +// EMSCRIPTEN_GENERATED_FUNCTIONS: ["asm", "_doit", "stackRestore", "switchey", "switchey2", "iffey", "nops"] From 6c1fd06d3cf9dc94ec25b6fdbb9203798442f7ba Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 7 Oct 2014 11:50:37 -0700 Subject: [PATCH 335/461] simplify emterpreter return ABI --- tools/emterpretify.py | 33 +++++++++++++++------------------ tools/js-optimizer.js | 29 ++++++++++++++--------------- 2 files changed, 29 insertions(+), 33 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 21b9f707964c0..30f9bd07816fb 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -210,22 +210,26 @@ def next_power_of_two(x): while ret < x: ret <<= 1 return ret -def get_access(l, s='i'): +def get_access(l, s='i', offset=None): + if offset is not None: + offset = '+ ' + str(offset) + ' ' + else: + offset = '' if s == 'i': - return 'HEAP32[sp + (' + l + ' << 3) >> 2]' + return 'HEAP32[sp + (' + l + ' << 3) ' + offset + '>> 2]' elif s == 'd': - return 'HEAPF64[sp + (' + l + ' << 3) >> 3]' + return 'HEAPF64[sp + (' + l + ' << 3) ' + offset + '>> 3]' else: assert 0 -def get_coerced_access(l, s='i', unsigned=False): +def get_coerced_access(l, s='i', unsigned=False, offset=None): if s == 'i': if not unsigned: - return get_access(l, s) + '|0' + return get_access(l, s, offset) + '|0' else: - return get_access(l, s) + '>>>0' + return get_access(l, s, offset) + '>>>0' elif s == 'd': - return '+' + get_access(l, s) + return '+' + get_access(l, s, offset) else: assert 0 @@ -387,15 +391,10 @@ def get_coerced_access(l, s='i', unsigned=False): pc = HEAP32[pc + 4 + (lx << 2) >> 2] | 0; // load from the jump table which is right after this instruction, and set pc continue;''' -def make_emterpreter(t, zero=False): +def make_emterpreter(zero=False): # return is specialized per interpreter CASES[ROPCODES['RET']] = 'EMTSTACKTOP = sp; ' if not zero else '' - if t == 'void': - CASES[ROPCODES['RET']] += 'return;' - elif t == 'int': - CASES[ROPCODES['RET']] += 'return ' + get_coerced_access('lx') + ';' - elif t == 'double': - CASES[ROPCODES['RET']] += 'return ' + get_coerced_access('lx', s='d') + ';' + CASES[ROPCODES['RET']] += 'HEAP32[EMTSTACKTOP >> 2] = ' + get_coerced_access('lx') + '; HEAP32[EMTSTACKTOP + 4 >> 2] = ' + get_coerced_access('lx', offset=4) + '; return;' # call is custom generated using information of actual call patterns, and which emterpreter this is def make_target_call(i): @@ -506,9 +505,8 @@ def process(code): %s } assert(0); - %s }''' % ( - ('_' if t != 'void' else '') + ('' if t == 'void' else t[0]) + ('' if not zero else '_z'), + '' if not zero else '_z', 'sp = 0, ' if not zero else '', ' sp = EMTSTACKTOP;' if not zero else '', ROPCODES['FUNC'], @@ -516,7 +514,6 @@ def process(code): assert(((EMTSTACKTOP|0) <= (EMT_STACK_MAX|0))|0);''' if not zero else '', get_access('ly', s='d'), main_loop, - '' if t == 'void' else 'return %s;' % shared.JS.make_initializer(t[0], settings) )) # main @@ -721,7 +718,7 @@ def process_code(func, code, absolute_targets): lines[i] = lines[i].replace(call, '(%s)' % (funcs[func] + code_start)) # finalize funcs JS -asm.funcs_js = '\n'.join(['\n'.join(lines), make_emterpreter('int'), make_emterpreter('double'), make_emterpreter('int', zero=True), make_emterpreter('double', zero=True)]) +asm.funcs_js = '\n'.join(['\n'.join(lines), make_emterpreter(), make_emterpreter(zero=True)]) lines = None # set up emterpreter stack top diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 0cdbc8c0bb30f..d0a72b9cdb562 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -177,6 +177,10 @@ function srcToStat(src) { return srcToAst(src)[1][0]; // look into toplevel } +function srcToExp(src) { + return srcToStat(src)[1]; +} + // Traverses the children of a node. If the traverse function returns an object, // replaces the child. If it returns true, stop the traversal and return true. function traverseChildren(node, traverse, pre, post) { @@ -7267,19 +7271,8 @@ function emterpretify(ast) { // prepare the call into the emterpreter var theName = ['name', 'emterpret']; var theCall = ['call', theName, [['name', 'EMTERPRETER_' + func[1]]]]; // EMTERPRETER_* will be replaced with the absolute bytecode offset later - // add a return if necessary - if (asmData.ret !== undefined) { - switch (asmData.ret) { - case ASM_INT: theName[1] += '_i'; break; - case ASM_DOUBLE: theName[1] += '_d'; break; - default: throw 'bad'; - } - asmData.vars['ret'] = asmData.ret; - func[3].push(['stat', ['assign', true, ['name', 'ret'], makeAsmCoercion(theCall, asmData.ret)]]); - } else { - theName[1] += '_i'; // void funcs reuse _i, and ignore the return value - func[3].push(['stat', makeAsmCoercion(theCall, ASM_INT)]); - } + // add the call + func[3].push(['stat', theCall]); if (zero) { theName[1] += '_z'; if (!onlyLeavesAreZero) { @@ -7289,9 +7282,15 @@ function emterpretify(ast) { func[3].push(srcToStat('EMTSTACKTOP = sp;')); } } - // add the return + // add the return, if necessary if (asmData.ret !== undefined) { - func[3].push(['return', makeAsmCoercion(['name', 'ret'], asmData.ret)]); + var ret; + switch (asmData.ret) { + case ASM_INT: ret = srcToExp('HEAP32[EMTSTACKTOP >> 2]'); break; + case ASM_DOUBLE: ret = srcToExp('HEAPF64[EMTSTACKTOP >> 3]'); break; + default: throw 'bad'; + } + func[3].push(['return', makeAsmCoercion(ret, asmData.ret)]); } // emit trampoline and bytecode denormalizeAsm(func, asmData); From 2a3735d36e54b4f7e3e7c5a7b488d474dbf1a4ca Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 7 Oct 2014 12:05:37 -0700 Subject: [PATCH 336/461] refactor CALL into EXTCALL and INTCALL, in preparation for INTCALL --- tools/emterpretify.py | 9 ++++++--- tools/js-optimizer.js | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 30f9bd07816fb..06a131113e0b6 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -168,7 +168,10 @@ 'GETGLBI', # [l, vl, vh] get global value, int, indexed by v #'GETGLBD', # [l, vl, vh] get global value, double, indexed by v 'SETGLBI', # [vl, vh, l] set global value, int, indexed by v (v = l) - 'CALL', # [lx, targetl, targeth] [params...] (lx = ) target(params..) lx's existence and type depend on the target's actual callsig; + + 'INTCALL', # [lx, 0, 0] [target] [params] (lx = ) target(params..) + # Internal, emterpreter-to-emterpreter call. TODO: use those 2 extra bytes? + 'EXTCALL', # [lx, targetl, targeth] [params...] (lx = ) target(params..) lx's existence and type depend on the target's actual callsig; # this instruction can take multiple 32-bit instruction chunks # if target is a function table, then the first param is the index of the register holding the function pointer @@ -416,7 +419,7 @@ def make_target_call(i): ret += '; pc = pc + %d | 0' % (4*((extra+3)>>2)) return ' ' + ret + '; break;' - CASES[ROPCODES['CALL']] = 'switch ((inst>>>16)|0) {\n' + \ + CASES[ROPCODES['EXTCALL']] = 'switch ((inst>>>16)|0) {\n' + \ '\n'.join([' case %d: {\n%s\n }' % (i, make_target_call(i)) for i in range(global_func_id)]) + \ '\n default: assert(0);' + \ '\n }' @@ -597,7 +600,7 @@ def process_code(func, code, absolute_targets): #print 'processing code', func, absolute_start for i in range(len(code)/4): j = i*4 - if code[j] == 'CALL': + if code[j] == 'EXTCALL': # fix CALL instructions' targets and signatures target = code[j+2] sig = code[j+3] diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index d0a72b9cdb562..297929fd6a76e 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6921,7 +6921,7 @@ function emterpretify(ast) { assert(curr !== 'v');//, JSON.stringify(param) + ' ==> ' + ASM_SIG[detectType(param, asmData)]); sig += curr; }); - ret.push('CALL'); + ret.push('EXTCALL'); ret.push(lx); ret.push(target); assert(sig.indexOf('u') < 0); // no undefined @@ -7231,7 +7231,7 @@ function emterpretify(ast) { var leaf = true; for (var i = 0; i < code.length; i += 4) { // if this is a call that can conceivably reach other emterpreted code, it isn't a leaf - if (code[i] === 'CALL' && !isMathFunc(code[i+2]) && !(code[i+2] in DEFINITE_LEAVES)) { + if (code[i] === 'INTCALL' || (code[i] === 'EXTCALL' && !isMathFunc(code[i+2]) && !(code[i+2] in DEFINITE_LEAVES))) { leaf = false; //printErr(' NOT leaf ' + func[1] + ' since ' + code[i+2]); break; From ab78a6a180c383bd1fca3d7b8c203623eaae42a2 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 7 Oct 2014 14:16:34 -0700 Subject: [PATCH 337/461] implement INTCALL --- tools/emterpretify.py | 90 ++++++++++++++++++++++++++++++++----------- tools/js-optimizer.js | 23 ++++++++--- 2 files changed, 85 insertions(+), 28 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 06a131113e0b6..40b6e56d92cf3 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -170,7 +170,7 @@ 'SETGLBI', # [vl, vh, l] set global value, int, indexed by v (v = l) 'INTCALL', # [lx, 0, 0] [target] [params] (lx = ) target(params..) - # Internal, emterpreter-to-emterpreter call. TODO: use those 2 extra bytes? + # Internal, emterpreter-to-emterpreter call. 'EXTCALL', # [lx, targetl, targeth] [params...] (lx = ) target(params..) lx's existence and type depend on the target's actual callsig; # this instruction can take multiple 32-bit instruction chunks # if target is a function table, then the first param is the index of the register holding the function pointer @@ -180,7 +180,7 @@ 'SWITCH', # [lx, ly, lz] switch (lx) { .. }. followed by a jump table for values in range [ly..ly+lz), after which is the default (which might be empty) 'RET', # [l, 0, 0] return l (depending on which emterpreter_x we are in, has the right type) - 'FUNC', # [total locals, num params, 0] function with n locals (each taking 64 bits), of which the first are params + 'FUNC', # [total locals, num params, which emterpreter (0 = normal, 1 = zero)] function with n locals (each taking 64 bits), of which the first are params ] def randomize_opcodes(): @@ -213,26 +213,26 @@ def next_power_of_two(x): while ret < x: ret <<= 1 return ret -def get_access(l, s='i', offset=None): +def get_access(l, s='i', base='sp', offset=None): if offset is not None: offset = '+ ' + str(offset) + ' ' else: offset = '' if s == 'i': - return 'HEAP32[sp + (' + l + ' << 3) ' + offset + '>> 2]' + return 'HEAP32[' + str(base) + ' + (' + l + ' << 3) ' + offset + '>> 2]' elif s == 'd': - return 'HEAPF64[sp + (' + l + ' << 3) ' + offset + '>> 3]' + return 'HEAPF64[' + str(base) + ' + (' + l + ' << 3) ' + offset + '>> 3]' else: assert 0 -def get_coerced_access(l, s='i', unsigned=False, offset=None): +def get_coerced_access(l, s='i', unsigned=False, base='sp', offset=None): if s == 'i': if not unsigned: - return get_access(l, s, offset) + '|0' + return get_access(l, s, base, offset) + '|0' else: - return get_access(l, s, offset) + '>>>0' + return get_access(l, s, base, offset) + '>>>0' elif s == 'd': - return '+' + get_access(l, s, offset) + return '+' + get_access(l, s, base, offset) else: assert 0 @@ -384,6 +384,37 @@ def get_coerced_access(l, s='i', unsigned=False, offset=None): #CASES[ROPCODES['GETPC']] = get_access('lx') + ' = pc;' CASES[ROPCODES['GETTR0']] = get_access('lx') + ' = tempRet0;' CASES[ROPCODES['SETTR0']] = 'tempRet0 = ' + get_coerced_access('lx') + ';' + +CASES[ROPCODES['INTCALL']] = ''' + inst = HEAP32[HEAP32[pc + 4 >> 2] >> 2] | 0; // FUNC inst: ['FUNC', locals, params, which emterp] + lz = (inst >>> 16) & 255; // params + ly = 0; + if ((inst >>> 24) == 0) { + while ((ly|0) < (lz|0)) { + %s = %s; + %s = %s; + ly = ly + 1 | 0; + } + emterpret(HEAP32[pc + 4 >> 2] | 0); + } else { + while ((ly|0) < (lz|0)) { + %s = %s; + %s = %s; + ly = ly + 1 | 0; + } + emterpret_z(HEAP32[pc + 4 >> 2] | 0); + } + %s = HEAP32[EMTSTACKTOP >> 2] | 0; + %s = HEAP32[EMTSTACKTOP + 4 >> 2] | 0; + pc = pc + (((4 + lz + 3) >> 2) << 2) | 0; +''' % ( + get_access('ly', base='EMTSTACKTOP'), get_coerced_access('HEAPU8[pc + 8 + ly >> 0]'), + get_access('ly', base='EMTSTACKTOP', offset=4), get_coerced_access('HEAPU8[pc + 8 + ly >> 0]', offset=4), + get_access('ly', base=0), get_coerced_access('HEAPU8[pc + 8 + ly >> 0]'), + get_access('ly', base=0, offset=4), get_coerced_access('HEAPU8[pc + 8 + ly >> 0]', offset=4), + get_access('lx'), get_access('lx', offset=4), +) + CASES[ROPCODES['SWITCH']] = ''' lz = ''' + get_coerced_access('lz') + '''; lx = ((''' + get_coerced_access('lx') + ''') - (''' + get_coerced_access('ly') + ''')) >>> 0; // lx is now relative to the base @@ -616,8 +647,8 @@ def process_code(func, code, absolute_targets): code[j+2] = global_funcs[fullname] & 255 code[j+3] = global_funcs[fullname] >> 8 if sig[0] == 'v': - assert code[j+1] == -1 # dummy value for assignment - code[j+1] = 0 # clear it + if code[j+1] == -1: # dummy value for assignment XXX we should not have assignments on void calls + code[j+1] = 0 # clear it else: assert code[j+1] >= 0 # there should be a real target here elif code[j] in ['GETGLBI', 'GETGLBD']: @@ -648,17 +679,6 @@ def process_code(func, code, absolute_targets): for k in range(4): code[j + k] = value[k] - # finalize instruction string names to opcodes - for i in range(len(code)/4): - j = i*4 - if type(code[j]) in (str, unicode): - code[j] = ROPCODES[code[j]] - - # sanity checks - for i in range(len(code)): - v = code[i] - assert type(v) == int and v >= 0 and v < 256, [i, v, 'in', code] - actual_return_types = {} for i in range(len(lines)): @@ -694,6 +714,32 @@ def process_code(func, code, absolute_targets): assert global_func_id < 65536, [global_funcs, global_func_id] assert global_var_id < 256, [global_vars, global_var_id] +def post_process_code(code): + for i in range(len(code)/4): + j = i*4 + if code[j] == 'absolute-funcaddr': + # put the 32-bit absolute value of an abolute function here + absolute_value = code_start + funcs[code[j+1]] + #print ' fixing absolute value', code[j+1], absolute_targets[unicode(code[j+1])], absolute_value + assert absolute_value < (1 << 31) + assert absolute_value % 4 == 0 + value = bytify(absolute_value) + for k in range(4): + code[j + k] = value[k] + + # finalize instruction string names to opcodes + for i in range(len(code)/4): + j = i*4 + if type(code[j]) in (str, unicode): + code[j] = ROPCODES[code[j]] + + # sanity checks + for i in range(len(code)): + v = code[i] + assert type(v) == int and v >= 0 and v < 256, [i, v, 'in', code] + +post_process_code(all_code) + # create new mem init mem_init = mem_init + all_code asm.staticbump += len(all_code) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 297929fd6a76e..73b0c0eb08eaf 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -6316,7 +6316,7 @@ function emterpretify(ast) { var ret; if (dropIt && (typeHint === undefined || typeHint === ASM_NONE)) { type = ASM_NONE; - ret = -1; + ret = getFreeOrAssignTo(assignTo); // get a register that is ok to write to, even if no return value, to simplify ABI XXX } else { assert(typeHint !== ASM_NONE); type = typeHint; @@ -6891,6 +6891,7 @@ function emterpretify(ast) { var ret = []; var target; var functionPointer = null; + var internal = false; if (node[1][0] === 'name') { // normal direct call target = node[1][1]; @@ -6903,6 +6904,7 @@ function emterpretify(ast) { return mul[1]; } } + if (target in EMTERPRETED_FUNCS) internal = true; } else { // function pointer call through function table assert(node[1][0] === 'sub' && node[1][1][0] === 'name'); @@ -6921,15 +6923,22 @@ function emterpretify(ast) { assert(curr !== 'v');//, JSON.stringify(param) + ' ==> ' + ASM_SIG[detectType(param, asmData)]); sig += curr; }); - ret.push('EXTCALL'); + ret.push(internal ? 'INTCALL' : 'EXTCALL'); ret.push(lx); - ret.push(target); - assert(sig.indexOf('u') < 0); // no undefined - ret.push(sig); + if (!internal) { + ret.push(target); + assert(sig.indexOf('u') < 0); // no undefined + ret.push(sig); + } else { + ret.push(0, 0); + } actuals.forEach(function(actual) { releaseIfFree(actual) }); if (functionPointer) { ret.push(releaseIfFree(functionPointer[0])); } + if (internal) { + ret.push('absolute-funcaddr', target, 0, 0); + } ret = ret.concat(actuals); while (ret.length % 4 !== 0) ret.push(0); return ret; @@ -7220,7 +7229,7 @@ function emterpretify(ast) { // calculate final count of local variables, and emit func header var finalLocals = Math.max(numLocals, maxLocal+1); // if no free locals, then numLocals, else the largest free local says how many assert(finalLocals < 256, 'too many locals ' + [maxLocal, numLocals]); // maximum local value is 255, for a total of 256 of them - code = ['FUNC', finalLocals, func[2].length, 0].concat(constants).concat(code); + code = ['FUNC', finalLocals, func[2].length, 0].concat(constants).concat(code); // last FUNC option is filled in later verifyCode(code); finalizeJumps(code); @@ -7242,6 +7251,8 @@ function emterpretify(ast) { var zero = leaf; // TODO: heuristics var onlyLeavesAreZero = true; // if only leaves are zero, then we do not need to save and restore the stack XXX if this is not true, then setjmp and exceptions can fail, as cleanup is skipped! + if (zero) code[3] = 1; + if (1) { //func[1] in EXTERNAL_EMTERPRETED_FUNCS) { // this is reachable from outside emterpreter code, set up a trampoline asmData.vars = {}; From 8cec96a59fe5d61f000a6a732a0cbd8995a65333 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 7 Oct 2014 14:19:55 -0700 Subject: [PATCH 338/461] make asm3i.test_hello_world more robust --- tests/test_core.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/test_core.py b/tests/test_core.py index 3d707835790a0..583e16e087204 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -24,12 +24,11 @@ def test_hello_world(self): assert 'EMSCRIPTEN_GENERATED_FUNCTIONS' not in src, 'must not emit this unneeded internal thing' else: assert 'function emterpret' in src, 'emterpreter should exist' - assert ' = emterpret' in src, 'emterpreter should be called' # and removing calls to the emterpreter break, so it was being used output = open(output).read() out1 = run_js('src.cpp.o.js') assert output in out1 - open('src.cpp.o.js', 'w').write(src.replace(' = emterpret', ' = no')) + open('src.cpp.o.js', 'w').write(src.replace('function emterpret', 'function do_not_find_me')) out2 = run_js('src.cpp.o.js', stderr=PIPE, assert_returncode=None) assert output not in out2, out2 assert out1 != out2 From 3382b64a92eb621ce15a3b646c4ca4a2c999b9b0 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 8 Oct 2014 17:32:44 -0700 Subject: [PATCH 339/461] simple calculation of which variables need a zeroinit --- emcc | 2 +- tests/test_other.py | 2 +- tools/emterpretify.py | 16 +++-- tools/js-optimizer.js | 153 +++++++++++++++++++++++++++++++++++++++++- 4 files changed, 163 insertions(+), 10 deletions(-) diff --git a/emcc b/emcc index d3051bda62030..e356ea5db0581 100755 --- a/emcc +++ b/emcc @@ -1412,7 +1412,7 @@ try: js_optimizer_queue += ['simplifyExpressions'] if shared.Settings.EMTERPRETIFY: # emterpreter code will not run through a JS optimizing JIT, do more work ourselves - js_optimizer_queue += ['localCSE', 'ensureLabelSet'] + js_optimizer_queue += ['localCSE'] if shared.Settings.RELOOP and not shared.Settings.ASM_JS: js_optimizer_queue += ['optimizeShiftsAggressive', get_eliminate()] # aggressive shifts optimization requires loops, it breaks on switches diff --git a/tests/test_other.py b/tests/test_other.py index 31d7448fc72a7..5e4d37e6696a0 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4289,5 +4289,5 @@ def do_log_test(source, expected, func): assert expected == seen, ['expect', expected, 'but see', seen] do_log_test(path_from_root('tests', 'primes.cpp'), 86, 'main') - do_log_test(path_from_root('tests', 'fannkuch.cpp'), 233, 'fannkuch_worker') + do_log_test(path_from_root('tests', 'fannkuch.cpp'), 234, 'fannkuch_worker') diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 40b6e56d92cf3..d23c65f909264 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -19,7 +19,7 @@ # consts -BLACKLIST = set(['_malloc', '_free', '_memcpy', '_memmove', '_memset', 'copyTempDouble', 'copyTempFloat', '_strlen', 'stackAlloc', 'setThrew', 'stackRestore', 'setTempRet0', 'getTempRet0', 'stackSave', 'runPostSets', '_emscripten_autodebug_double', '_emscripten_autodebug_float', '_emscripten_autodebug_i8', '_emscripten_autodebug_i16', '_emscripten_autodebug_i32', '_emscripten_autodebug_i64', '_strncpy', '_strcpy', '_strcat', '_saveSetjmp', '_testSetjmp', '_emscripten_replace_memory', '_bitshift64Shl', '_bitshift64Ashr', '_bitshift64Lshr']) # XXX this list must contain all functions that rely on asm declarations to zero out variables, which means most asm js library functions. we specifically take care of 'label' in compiler-generated functions. +BLACKLIST = set(['_malloc', '_free', '_memcpy', '_memmove', '_memset', 'copyTempDouble', 'copyTempFloat', '_strlen', 'stackAlloc', 'setThrew', 'stackRestore', 'setTempRet0', 'getTempRet0', 'stackSave', 'runPostSets', '_emscripten_autodebug_double', '_emscripten_autodebug_float', '_emscripten_autodebug_i8', '_emscripten_autodebug_i16', '_emscripten_autodebug_i32', '_emscripten_autodebug_i64', '_strncpy', '_strcpy', '_strcat', '_saveSetjmp', '_testSetjmp', '_emscripten_replace_memory', '_bitshift64Shl', '_bitshift64Ashr', '_bitshift64Lshr']) OPCODES = [ # l, lx, ly etc - one of 256 locals 'SET', # [lx, ly, 0] lx = ly (int or float, not double) @@ -180,7 +180,7 @@ 'SWITCH', # [lx, ly, lz] switch (lx) { .. }. followed by a jump table for values in range [ly..ly+lz), after which is the default (which might be empty) 'RET', # [l, 0, 0] return l (depending on which emterpreter_x we are in, has the right type) - 'FUNC', # [total locals, num params, which emterpreter (0 = normal, 1 = zero)] function with n locals (each taking 64 bits), of which the first are params + 'FUNC', # [total locals, num params, which emterpreter (0 = normal, 1 = zero)] [num params + num zero-inits, 0, 0, 0] function with n locals (each taking 64 bits), of which the first are params ] def randomize_opcodes(): @@ -528,13 +528,15 @@ def process(code): assert(((HEAPU8[pc>>0]>>>0) == %d)|0); lx = HEAPU8[pc + 1 >> 0] | 0; // num locals %s - ly = HEAPU8[pc + 2 >> 0] | 0; - //while ((ly | 0) < (lx | 0)) { // clear the non-param locals - XXX should not be needed, unless we relied on an asm declaration to zero out a variable - // %s = +0; - // ly = ly + 1 | 0; - //} + ly = HEAPU8[pc + 2 >> 0] | 0; // first zeroinit (after params) + lz = HEAPU8[pc + 4 >> 0] | 0; // offset of last zeroinit + while ((ly | 0) < (lz | 0)) { // clear the zeroinits + %s = +0; + ly = ly + 1 | 0; + } //print('enter func ' + [pc, HEAPU8[pc + 0],HEAPU8[pc + 1],HEAPU8[pc + 2],HEAPU8[pc + 3],HEAPU8[pc + 4],HEAPU8[pc + 5],HEAPU8[pc + 6],HEAPU8[pc + 7]].join(', ')); //var first = true; + pc = pc + 4 | 0; while (1) { %s } diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 73b0c0eb08eaf..1b8f69ecff85c 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -297,6 +297,112 @@ function astCompare(x, y) { return true; } +// calls definitely on child nodes that will be called, in order, and calls maybe on nodes that might be called. +// a(); if (b) c(); d(); will call definitely(a, arg), maybe(c, arg), definitely(d, arg) +function traverseChildrenInExecutionOrder(node, definitely, maybe, arg) { + switch (node[0]) { + default: throw '!' + node[0]; + case 'num': case 'var': case 'name': case 'toplevel': case 'string': + case 'break': case 'continue': break; // nodes with no interesting children; they themselves have already been definitely or maybe'd + case 'assign': case 'binary': { + definitely(node[2], arg); + definitely(node[3], arg); + break; + } + case 'sub': case 'seq': { + definitely(node[1], arg); + definitely(node[2], arg); + break; + } + case 'while': { + definitely(node[1], arg); + maybe(node[2], arg); // may never enter the loop + maybe(node[1], arg); // may enter the loop a second time + maybe(node[2], arg); + break; + } + case 'do': { + definitely(node[2], arg); + maybe(node[1], arg); // may never reach the condition if we break + maybe(node[2], arg); + maybe(node[1], arg); + break; + } + case 'binary': { + definitely(node[2], arg); + definitely(node[3], arg); + break; + } + case 'unary-prefix': case 'label': { + definitely(node[2], arg); + break; + } + case 'call': { + definitely(node[1], arg); + var args = node[2]; + for (var i = 0; i < args.length; i++) { + definitely(args[i], arg); + } + break; + } + case 'if': case 'conditional': { + definitely(node[1], arg); + maybe(node[2], arg); + if (node[3]) { maybe(node[3], arg); } + break; + } + case 'defun': case 'func': case 'block': { + var stats = getStatements(node); + if (stats.length === 0) break; + for (var i = 0; i < stats.length; i++) { + definitely(stats[i], arg); + // check if we might break, if we have more to do + if (i === stats.length - 1) break; + var labels = {}; + var breakCaptured = 0; + var mightBreak = false; + traverse(stats[i], function(node, type) { + if (type === 'label') labels[node[1]] = true; + else if (type in BREAK_CAPTURERS) { + breakCaptured++; + } else if (type === 'break') { + if (node[1]) { + // labeled break + if (!(node[1] in labels)) mightBreak = true; + } else { + if (!breakCaptured) mightBreak = true; + } + } + }, function(node, type) { + if (type === 'label') delete labels[node[1]]; + else if (type in BREAK_CAPTURERS) { + breakCaptured--; + } + }); + if (mightBreak) { + // all the rest are in one big maybe + return maybe(['block', stats.slice(i+1)], arg); + } + } + break; + } + case 'stat': case 'return': { + definitely(node[1], arg); + break; + } + case 'switch': { + definitely(node[1], arg); + var cases = node[2]; + for (var i = 0; i < cases.length; i++) { + var c = cases[i]; + var stats = c[1]; + var temp = ['block', stats]; + maybe(temp, arg); + } + } + } +} + // Passes // Dump the AST. Useful for debugging. For example, @@ -5975,6 +6081,33 @@ function ensureLabelSet(ast) { }); } +// finds vars that may not be assigned to. misses out on vars that are assigned to in all branches of an if etc. TODO: optimize +function findUninitializedVars(func, asmData) { + var bad = {}; + function definitely(node, uninitialized) { + if (!node) return; + if (node[0] === 'assign' && node[2][0] === 'name') { + var name = node[2][1]; + if (name in uninitialized) { + delete uninitialized[name]; // this one is now ok + } + } else if (node[0] === 'name') { + var name = node[1]; + if (name in uninitialized) { + bad[name] = 1; + delete uninitialized[name]; // this one is now bad, ignore it + } + } + traverseChildrenInExecutionOrder(node, definitely, maybe, uninitialized); + } + function maybe(node, uninitialized) { + uninitialized = copy(uninitialized); // copy it; changes here will not propagate + traverseChildrenInExecutionOrder(node, definitely, maybe, uninitialized); + } + traverseChildrenInExecutionOrder(func, definitely, maybe, copy(asmData.vars)); + return bad; +} + // Converts functions into binary format to be run by an emterpreter function emterpretify(ast) { emitAst = false; @@ -7210,6 +7343,24 @@ function emterpretify(ast) { assert(numLocals <= 256, 'we need <= 256 locals'); } + // put the variables that need a zero-init at the beginning + locals = {}; + numLocals = 0; + for (var i in asmData.params) { + locals[i] = numLocals++; + } + var zeroInits = findUninitializedVars(func, asmData); + var numZeroInits = 0; + for (var zero in zeroInits) { + locals[zero] = numLocals++; + numZeroInits++; + } + for (var i in asmData.vars) { + if (!(i in zeroInits)) { + locals[i] = numLocals++; + } + } + for (var i = 255; i >= numLocals; i--) { freeLocals.push(i); } @@ -7229,7 +7380,7 @@ function emterpretify(ast) { // calculate final count of local variables, and emit func header var finalLocals = Math.max(numLocals, maxLocal+1); // if no free locals, then numLocals, else the largest free local says how many assert(finalLocals < 256, 'too many locals ' + [maxLocal, numLocals]); // maximum local value is 255, for a total of 256 of them - code = ['FUNC', finalLocals, func[2].length, 0].concat(constants).concat(code); // last FUNC option is filled in later + code = ['FUNC', finalLocals, func[2].length, 0, func[2].length + numZeroInits, 0, 0, 0].concat(constants).concat(code); // 3rd FUNC option is filled in later verifyCode(code); finalizeJumps(code); From cb1106ae3d52fec17672cd8e93f0803065bac461 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 8 Oct 2014 21:09:44 -0700 Subject: [PATCH 340/461] only emit trampolines we need, and other small fixes --- tools/asm_module.py | 2 +- tools/emterpretify.py | 1 + tools/js-optimizer.js | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/asm_module.py b/tools/asm_module.py index 3014f64a2f528..d87348df111a5 100644 --- a/tools/asm_module.py +++ b/tools/asm_module.py @@ -287,6 +287,6 @@ def combine_tables(self): self.tables_js += 'var %s = %s;\n' % (table, data) def get_table_funcs(self): - return set(itertools.chain.from_iterable(map(lambda x: x[1:-1].split(','), self.tables.values()))) + return set(itertools.chain.from_iterable(map(lambda x: map(lambda y: y.strip(), x[1:-1].split(',')), self.tables.values()))) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index d23c65f909264..3ec7695203950 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -389,6 +389,7 @@ def get_coerced_access(l, s='i', unsigned=False, base='sp', offset=None): inst = HEAP32[HEAP32[pc + 4 >> 2] >> 2] | 0; // FUNC inst: ['FUNC', locals, params, which emterp] lz = (inst >>> 16) & 255; // params ly = 0; + assert(((EMTSTACKTOP + 8|0) <= (EMT_STACK_MAX|0))|0); // for return value if ((inst >>> 24) == 0) { while ((ly|0) < (lz|0)) { %s = %s; diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 1b8f69ecff85c..2b9523f71c5ac 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -7404,7 +7404,7 @@ function emterpretify(ast) { if (zero) code[3] = 1; - if (1) { //func[1] in EXTERNAL_EMTERPRETED_FUNCS) { + if (func[1] in EXTERNAL_EMTERPRETED_FUNCS) { // this is reachable from outside emterpreter code, set up a trampoline asmData.vars = {}; if (zero && !onlyLeavesAreZero) { From 52b42a71874e6c1ed2f2f12c54552e11d7e41a5a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 9 Oct 2014 16:42:21 -0700 Subject: [PATCH 341/461] fix CSE bug with multiple adjacent replacements getting wrong indexes for the new vars --- tools/js-optimizer.js | 9 ++++++++- tools/test-js-optimizer-localCSE-output.js | 13 +++++++++++++ tools/test-js-optimizer-localCSE.js | 14 +++++++++++++- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 2b9523f71c5ac..7d63e8419480e 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1039,7 +1039,14 @@ function localCSE(ast) { asmData.vars[lookup[2]] = type; overwrite(lookup[1], makeSignedAsmCoercion(['name', lookup[2]], type, sign)); stats.splice(lookup[0], 0, ['stat', ['assign', true, ['name', lookup[2]], makeSignedAsmCoercion(node, type, sign)]]); - i++; + // adjust indexes after that splice + i++; // i must be after lookup[0] + for (var e in exps) { + var curr = exps[e]; + if (curr[2] === null) { + if (curr[0] >= lookup[0]) curr[0]++; + } + } } else { type = lookup[3]; sign = lookup[4]; diff --git a/tools/test-js-optimizer-localCSE-output.js b/tools/test-js-optimizer-localCSE-output.js index 5f6d5696710cf..486d3bd78e20c 100644 --- a/tools/test-js-optimizer-localCSE-output.js +++ b/tools/test-js-optimizer-localCSE-output.js @@ -43,4 +43,17 @@ function _i64Subtract(a, b, c, d) { h = (CSE$0 | 0) - (c >>> 0 > a >>> 0 | 0) >>> 0; return (tempRet0 = h, a - c >>> 0 | 0) | 0; } +function cubeMD5mesh() { + var $15 = 0, $16 = 0, $18 = 0, $20 = 0, $22 = +0, $24 = +0, $27 = +0, $29 = +0, $33 = +0, $36 = +0, $43 = +0, CSE$0 = 0, CSE$1 = 0; + CSE$0 = $15 + ($18 * 20 | 0) | 0; + $20 = HEAP32[CSE$0 >> 2] | 0; + CSE$1 = $16 + ($20 * 28 | 0) | 0; + $22 = +HEAPF32[CSE$1 + 16 >> 2]; + $24 = +HEAPF32[CSE$0 + 16 >> 2]; + $27 = +HEAPF32[CSE$1 + 20 >> 2]; + $29 = +HEAPF32[CSE$0 + 12 >> 2]; + $33 = +HEAPF32[CSE$0 + 8 >> 2]; + $36 = +HEAPF32[CSE$1 + 12 >> 2]; + $43 = +HEAPF32[CSE$1 + 24 >> 2]; +} diff --git a/tools/test-js-optimizer-localCSE.js b/tools/test-js-optimizer-localCSE.js index 1f3c822973a9a..5ef38ac878561 100644 --- a/tools/test-js-optimizer-localCSE.js +++ b/tools/test-js-optimizer-localCSE.js @@ -41,4 +41,16 @@ function _i64Subtract(a, b, c, d) { h = b - d - (c >>> 0 > a >>> 0 | 0) >>> 0; return (tempRet0 = h, a - c >>> 0 | 0) | 0; } -// EMSCRIPTEN_GENERATED_FUNCTIONS: ["skinning", "_i64Subtract"] +function cubeMD5mesh() { + var $15 = 0, $16 = 0, $18 = 0; + var $20 = 0, $22 = +0, $24 = +0, $27 = +0, $29 = +0, $33 = +0, $36 = +0, $43 = +0; + $20 = HEAP32[$15 + ($18 * 20 | 0) >> 2] | 0; + $22 = +HEAPF32[$16 + ($20 * 28 | 0) + 16 >> 2]; + $24 = +HEAPF32[$15 + ($18 * 20 | 0) + 16 >> 2]; + $27 = +HEAPF32[$16 + ($20 * 28 | 0) + 20 >> 2]; + $29 = +HEAPF32[$15 + ($18 * 20 | 0) + 12 >> 2]; + $33 = +HEAPF32[$15 + ($18 * 20 | 0) + 8 >> 2]; + $36 = +HEAPF32[$16 + ($20 * 28 | 0) + 12 >> 2]; + $43 = +HEAPF32[$16 + ($20 * 28 | 0) + 24 >> 2]; +} +// EMSCRIPTEN_GENERATED_FUNCTIONS: ["skinning", "_i64Subtract", "cubeMD5mesh"] From 8fbbce9818ab83b0bb1270fed184d2a653d78c96 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 9 Oct 2014 18:29:01 -0700 Subject: [PATCH 342/461] clean up emterpreter output --- tools/emterpretify.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 3ec7695203950..de474e118192b 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -770,7 +770,7 @@ def post_process_code(code): lines[i] = lines[i].replace(call, '(%s)' % (funcs[func] + code_start)) # finalize funcs JS -asm.funcs_js = '\n'.join(['\n'.join(lines), make_emterpreter(), make_emterpreter(zero=True)]) +asm.funcs_js = '\n'.join(['\n'.join(filter(lambda line: len(line) > 0, lines)), make_emterpreter(), make_emterpreter(zero=True)]) + '\n' lines = None # set up emterpreter stack top From 4a41054452f86d7823bcef14bceb9b7f44f1540f Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 9 Oct 2014 18:30:20 -0700 Subject: [PATCH 343/461] emit emterpreters first --- tools/emterpretify.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index de474e118192b..c6b8b393850fa 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -769,8 +769,8 @@ def post_process_code(code): if call in line: lines[i] = lines[i].replace(call, '(%s)' % (funcs[func] + code_start)) -# finalize funcs JS -asm.funcs_js = '\n'.join(['\n'.join(filter(lambda line: len(line) > 0, lines)), make_emterpreter(), make_emterpreter(zero=True)]) + '\n' +# finalize funcs JS (first line has the marker, add emterpreters right after that) +asm.funcs_js = '\n'.join([lines[0], make_emterpreter(), make_emterpreter(zero=True), '\n'.join(filter(lambda line: len(line) > 0, lines[1:]))]) + '\n' lines = None # set up emterpreter stack top From 4fcace592c8528e7d9de9bc6586e3cf3b7735278 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 9 Oct 2014 19:44:11 -0700 Subject: [PATCH 344/461] make emterpreter optimization story more regular --- emcc | 36 +++++++++++++++++++++++++----------- tests/test_core.py | 13 +------------ tests/test_other.py | 13 +++++++++++-- tools/js-optimizer.js | 6 ++---- 4 files changed, 39 insertions(+), 29 deletions(-) diff --git a/emcc b/emcc index e356ea5db0581..afcaeb18fd366 100755 --- a/emcc +++ b/emcc @@ -1011,7 +1011,7 @@ try: if shared.Settings.EMTERPRETIFY: shared.Settings.FINALIZE_ASM_JS = 0 shared.Settings.GLOBAL_BASE = 8*256 # keep enough space at the bottom for a full stack frame - debug_level = max(debug_level, 2) + shared.Settings.SIMPLIFY_IFS = 0 # this is just harmful for emterpreting shared.Settings.RUNNING_FASTCOMP = fastcomp @@ -1432,6 +1432,21 @@ try: final = shared.Building.closure_compiler(final) if DEBUG: save_intermediate('closure') + def do_minify(): + global js_optimizer_queue + + if opt_level >= 2: + if debug_level < 2 and shared.Settings.ASM_JS and not closure == 2: + js_optimizer_queue += ['minifyNames'] + if emit_symbol_map: js_optimizer_queue += ['symbolMap='+target+'.symbols'] + if debug_level == 0: js_optimizer_queue += ['minifyWhitespace'] + + if shared.Settings.ASM_JS: + if closure == 1: + js_optimizer_queue += ['closure'] + elif debug_level <= 2 and not shared.Settings.MAIN_MODULE and shared.Settings.FINALIZE_ASM_JS and not closure: + js_optimizer_queue += ['cleanup'] + if js_opts: if shared.Settings.ASM_JS and shared.Settings.SAFE_HEAP: js_optimizer_queue += ['safeHeap'] @@ -1447,18 +1462,10 @@ try: if shared.Settings.POINTER_MASKING and shared.Settings.ASM_JS: js_optimizer_queue += ['pointerMasking'] - if opt_level >= 2: - if debug_level < 2 and shared.Settings.ASM_JS and not closure == 2: - js_optimizer_queue += ['minifyNames'] - if emit_symbol_map: js_optimizer_queue += ['symbolMap='+target+'.symbols'] - if debug_level == 0: js_optimizer_queue += ['minifyWhitespace'] + if not shared.Settings.EMTERPRETIFY: + do_minify() if shared.Settings.ASM_JS: - if closure == 1: - js_optimizer_queue += ['closure'] - elif debug_level <= 2 and not shared.Settings.MAIN_MODULE and shared.Settings.FINALIZE_ASM_JS and not closure: - js_optimizer_queue += ['cleanup'] - js_optimizer_queue += ['asmLastOpts'] if shared.Settings.FINALIZE_ASM_JS: js_optimizer_queue += ['last'] @@ -1479,6 +1486,7 @@ try: js_target = unsuffixed(target) + '.js' if shared.Settings.EMTERPRETIFY: + logging.debug('emterpretifying') assert memory_init_file, 'emterpreter requires a mem init file' try: # move temp js to final position, alongside its mem init file @@ -1488,6 +1496,12 @@ try: finally: shared.try_delete(js_target) + # minify (if requested) after emterpreter processing, and finalize output + shared.Settings.FINALIZE_ASM_JS = 1 + do_minify() + js_optimizer_queue += ['last'] + flush_js_optimizer_queue() + # Remove some trivial whitespace # TODO: do not run when compress has already been done on all parts of the code #src = open(final).read() #src = re.sub(r'\n+[ \n]*\n+', '\n', src) diff --git a/tests/test_core.py b/tests/test_core.py index 583e16e087204..387e722e68129 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -20,18 +20,7 @@ def test_hello_world(self): self.do_run_from_file(src, output) src = open(self.in_dir('src.cpp.o.js')).read() - if not self.is_emterpreter(): - assert 'EMSCRIPTEN_GENERATED_FUNCTIONS' not in src, 'must not emit this unneeded internal thing' - else: - assert 'function emterpret' in src, 'emterpreter should exist' - # and removing calls to the emterpreter break, so it was being used - output = open(output).read() - out1 = run_js('src.cpp.o.js') - assert output in out1 - open('src.cpp.o.js', 'w').write(src.replace('function emterpret', 'function do_not_find_me')) - out2 = run_js('src.cpp.o.js', stderr=PIPE, assert_returncode=None) - assert output not in out2, out2 - assert out1 != out2 + assert 'EMSCRIPTEN_GENERATED_FUNCTIONS' not in src, 'must not emit this unneeded internal thing' def test_intvars(self): if self.emcc_args == None: return self.skip('needs ta2') diff --git a/tests/test_other.py b/tests/test_other.py index 5e4d37e6696a0..bcb4d1f6b966a 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4147,12 +4147,21 @@ def do_emcc_test(source, args, output): source = 'src.cpp' else: source = path_from_root('tests', source) - Popen([PYTHON, EMCC, source, '-O2', '-s', 'EMTERPRETIFY=1']).communicate() + Popen([PYTHON, EMCC, source, '-O2', '-s', 'EMTERPRETIFY=1', '-g2']).communicate() self.assertContained(output, run_js('a.out.js', args=args)) out = run_js('a.out.js', engine=SPIDERMONKEY_ENGINE, args=args, stderr=PIPE, full_output=True) self.assertContained(output, out) self.validate_asmjs(out) - assert 'function emterpret' in open('a.out.js').read() + # -g2 enables these + src = open('a.out.js').read() + assert 'function emterpret' in src, 'emterpreter should exist' + # and removing calls to the emterpreter break, so it was being used + out1 = run_js('a.out.js') + assert output in out1 + open('a.out.js', 'w').write(src.replace('function emterpret', 'function do_not_find_me')) + out2 = run_js('a.out.js', stderr=PIPE, assert_returncode=None) + assert output not in out2, out2 + assert out1 != out2 def do_test(source, args, output): print diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 7d63e8419480e..b2d38a8680163 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -7314,8 +7314,7 @@ function emterpretify(ast) { var ignore = !(func[1] in EMTERPRETED_FUNCS); if (ignore) { - prepDotZero(func); - print(fixDotZero(astToSrc(func))); + print(astToSrc(func)); } var asmData = normalizeAsm(func); @@ -7463,8 +7462,7 @@ function emterpretify(ast) { } // emit trampoline and bytecode denormalizeAsm(func, asmData); - prepDotZero(func); - print(fixDotZero(astToSrc(func))); + print(astToSrc(func)); } print('// EMTERPRET_INFO ' + JSON.stringify([func[1], code, absoluteTargets])); } From 722d8d4495fa9890d95443a3efefb4631ca09936 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 10 Oct 2014 11:04:35 -0700 Subject: [PATCH 345/461] allow adding more functions to emterpreter blacklist --- emcc | 3 ++- src/settings.js | 1 + tools/emterpretify.py | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/emcc b/emcc index afcaeb18fd366..968b7ea6ad893 100755 --- a/emcc +++ b/emcc @@ -1488,10 +1488,11 @@ try: if shared.Settings.EMTERPRETIFY: logging.debug('emterpretifying') assert memory_init_file, 'emterpreter requires a mem init file' + import json try: # move temp js to final position, alongside its mem init file shutil.move(final, js_target) - execute([shared.PYTHON, shared.path_from_root('tools', 'emterpretify.py'), js_target, final + '.em.js', memfile]) + execute([shared.PYTHON, shared.path_from_root('tools', 'emterpretify.py'), js_target, final + '.em.js', memfile, json.dumps(shared.Settings.EMTERPRETIFY_BLACKLIST)]) final = final + '.em.js' finally: shared.try_delete(js_target) diff --git a/src/settings.js b/src/settings.js index 961c9b56ef4e9..1c093533f7fe3 100644 --- a/src/settings.js +++ b/src/settings.js @@ -563,6 +563,7 @@ var NO_DYNAMIC_EXECUTION = 0; // When enabled, we do not emit eval() and new Fun // privileged firefox app, etc.) var EMTERPRETIFY = 0; // Runs tools/emterpretify on the compiler output +var EMTERPRETIFY_BLACKLIST = []; // Functions to not emterpret, that is, to run normally at full speed var RUNNING_JS_OPTS = 0; // whether js opts will be run, after the main compiler var RUNNING_FASTCOMP = 1; // whether we are running the fastcomp backend diff --git a/tools/emterpretify.py b/tools/emterpretify.py index c6b8b393850fa..bc3c35ff5d9a6 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -558,6 +558,8 @@ def process(code): infile = sys.argv[1] outfile = sys.argv[2] force_memfile = sys.argv[3] if len(sys.argv) >= 4 else None +if len(sys.argv) >= 5: + BLACKLIST = set(list(BLACKLIST) + json.loads(sys.argv[4])) #print 'emterpretifying %s to %s' % (infile, outfile) From 748020ae97b9ef3de3627f4896baafd56f870c48 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 10 Oct 2014 11:49:37 -0700 Subject: [PATCH 346/461] fix blacklist on blacklisted methods => emterpreted methods, add trampolines as needed --- tests/test_other.py | 11 +++++++---- tools/emterpretify.py | 20 +++++++++++++++++--- tools/js-optimizer.js | 16 ++++++++++++++++ 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/tests/test_other.py b/tests/test_other.py index bcb4d1f6b966a..fa129a7e44b95 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4138,7 +4138,7 @@ def test_stat_fail_alongtheway(self): def test_emterpreter(self): - def do_emcc_test(source, args, output): + def do_emcc_test(source, args, output, emcc_args=[]): print print 'emcc', source[:40], '\n' in source self.clear() @@ -4147,7 +4147,7 @@ def do_emcc_test(source, args, output): source = 'src.cpp' else: source = path_from_root('tests', source) - Popen([PYTHON, EMCC, source, '-O2', '-s', 'EMTERPRETIFY=1', '-g2']).communicate() + Popen([PYTHON, EMCC, source, '-O2', '-s', 'EMTERPRETIFY=1', '-g2'] + emcc_args).communicate() self.assertContained(output, run_js('a.out.js', args=args)) out = run_js('a.out.js', engine=SPIDERMONKEY_ENGINE, args=args, stderr=PIPE, full_output=True) self.assertContained(output, out) @@ -4156,10 +4156,10 @@ def do_emcc_test(source, args, output): src = open('a.out.js').read() assert 'function emterpret' in src, 'emterpreter should exist' # and removing calls to the emterpreter break, so it was being used - out1 = run_js('a.out.js') + out1 = run_js('a.out.js', args=args) assert output in out1 open('a.out.js', 'w').write(src.replace('function emterpret', 'function do_not_find_me')) - out2 = run_js('a.out.js', stderr=PIPE, assert_returncode=None) + out2 = run_js('a.out.js', args=args, stderr=PIPE, assert_returncode=None) assert output not in out2, out2 assert out1 != out2 @@ -4208,6 +4208,9 @@ def do_js_test(name, source, args, output): do_test('hello_world_loop.cpp', [], 'hello, world!') do_test('fannkuch.cpp', ['5'], 'Pfannkuchen(5) = 7.') + # do not emterpret main, but still emterpret worker + do_emcc_test('fannkuch.cpp', ['5'], 'Pfannkuchen(5) = 7.', ['-s', 'EMTERPRETIFY_BLACKLIST=["_main"]']) + do_test(r''' #include diff --git a/tools/emterpretify.py b/tools/emterpretify.py index bc3c35ff5d9a6..0daa2f34f9f81 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -576,11 +576,25 @@ def process(code): tabled_funcs = asm.get_table_funcs() exported_funcs = [func.split(':')[0] for func in asm.exports] -external_emterpreted_funcs = filter(lambda func: func in tabled_funcs or func in exported_funcs, emterpreted_funcs) -#print >> sys.stderr, emterpreted_funcs, tabled_funcs, external_emterpreted_funcs -# process functions, generating bytecode temp = infile + '.tmp.js' + +# find emterpreted functions reachable by non-emterpreted ones, we will force a trampoline for them later + +shared.Building.js_optimizer(infile, ['findReachable'], extra_info={ 'blacklist': list(emterpreted_funcs) }, output_filename=temp, just_concat=True) +asm = asm_module.AsmModule(temp) +lines = asm.funcs_js.split('\n') + +reachable_funcs = set([]) +for i in range(len(lines)): + line = lines[i] + if line.startswith('// REACHABLE '): + curr = json.loads(line[len('// REACHABLE '):]) + reachable_funcs = set(list(reachable_funcs) + curr) + +external_emterpreted_funcs = filter(lambda func: func in tabled_funcs or func in exported_funcs or func in reachable_funcs, emterpreted_funcs) + +# process functions, generating bytecode shared.Building.js_optimizer(infile, ['emterpretify'], extra_info={ 'emterpretedFuncs': list(emterpreted_funcs), 'externalEmterpretedFuncs': list(external_emterpreted_funcs), 'opcodes': OPCODES, 'ropcodes': ROPCODES }, output_filename=temp, just_concat=True) # load the module and modify it diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index b2d38a8680163..6118d99cf13da 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -7469,6 +7469,21 @@ function emterpretify(ast) { traverseGeneratedFunctions(ast, walkFunction); } +// emits which functions are directly reachable from, except for some blacklist +function findReachable(ast) { + var BLACKLIST = set(extraInfo.blacklist); + var reachable = {}; + traverseGeneratedFunctions(ast, function(func) { + if (func[1] in BLACKLIST) return; + traverse(func, function(node, type) { + if (type === 'call' && node[1][0] === 'name') { + reachable[node[1][1]] = 1; + } + }); + }); + print('// REACHABLE ' + JSON.stringify(keys(reachable))); +} + // Last pass utilities // Change +5 to DOT$ZERO(5). We then textually change 5 to 5.0 (uglify's ast cannot differentiate between 5 and 5.0 directly) @@ -7624,6 +7639,7 @@ var passes = { pointerMasking: pointerMasking, ensureLabelSet: ensureLabelSet, emterpretify: emterpretify, + findReachable: findReachable, asmLastOpts: asmLastOpts, // flags From 415c93b8ab63bb6801d5f4f2dac437c8003229fe Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 10 Oct 2014 13:31:17 -0700 Subject: [PATCH 347/461] benchmarking option --- tests/test_benchmark.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_benchmark.py b/tests/test_benchmark.py index 2d80407e9bebc..4b87139b33459 100644 --- a/tests/test_benchmark.py +++ b/tests/test_benchmark.py @@ -145,6 +145,7 @@ def run(self, args): #JSBenchmarker('sm-ion', SPIDERMONKEY_ENGINE + ['--no-asmjs']), #JSBenchmarker('sm-baseline', SPIDERMONKEY_ENGINE + ['--no-asmjs', '--no-ion']), JSBenchmarker('sm-emterp', SPIDERMONKEY_ENGINE, ['-s', 'EMTERPRETIFY=1']), + #JSBenchmarker('sm-emterp-blacklist', SPIDERMONKEY_ENGINE, ['-s', 'EMTERPRETIFY=1', '-s', 'EMTERPRETIFY_BLACKLIST=["__ZN15b2ContactSolver24SolvePositionConstraintsEv", "__ZN24b2PositionSolverManifold10InitializeEP27b2ContactPositionConstraintRK11b2TransformS4_i", "__ZN15b2ContactSolver24SolveVelocityConstraintsEv", "__ZN15b2ContactSolver29InitializeVelocityConstraintsEv", "__ZL16b2EdgeSeparationPK14b2PolygonShapeRK11b2TransformiS1_S4_", "__ZN7b2World8SolveTOIERK10b2TimeStep"]']), #JSBenchmarker('sm-interp', SPIDERMONKEY_ENGINE + ['--no-asmjs', '--no-ion', '--no-baseline']), #JSBenchmarker('sm-f32-si', SPIDERMONKEY_ENGINE, ['--profiling', '-s', 'PRECISE_F32=2', '-s', 'SIMPLIFY_IFS=1']), #JSBenchmarker('sm-f32-aggro', SPIDERMONKEY_ENGINE, ['-s', 'PRECISE_F32=2', '-s', 'AGGRESSIVE_VARIABLE_ELIMINATION=1']), From c6d61af7fa5c2cf2e36690dedae20ae80a0d6f9f Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 10 Oct 2014 14:47:01 -0700 Subject: [PATCH 348/461] refactor break/continue in emterpreter --- tools/emterpretify.py | 56 +++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 0daa2f34f9f81..c3d7d23cc492f 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -288,21 +288,21 @@ def get_coerced_access(l, s='i', unsigned=False, base='sp', offset=None): CASES[ROPCODES['ASHRV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') >> lz;' CASES[ROPCODES['LSHRV']] = get_access('lx') + ' = (' + get_coerced_access('ly') + ') >>> lz;' -CASES[ROPCODES['LNOTBRF']] = 'if (' + get_coerced_access('ly') + ') { pc = HEAP32[pc + 4 >> 2] | 0; continue; } else { pc = pc + 4 | 0; }' -CASES[ROPCODES['EQBRF']] = 'if ((' + get_coerced_access('ly') + ') == (' + get_coerced_access('lz') + ')) { pc = pc + 4 | 0; } else { pc = HEAP32[pc + 4 >> 2] | 0; continue; }' -CASES[ROPCODES['NEBRF']] = 'if ((' + get_coerced_access('ly') + ') != (' + get_coerced_access('lz') + ')) { pc = pc + 4 | 0; } else { pc = HEAP32[pc + 4 >> 2] | 0; continue; }' -CASES[ROPCODES['SLTBRF']] = 'if ((' + get_coerced_access('ly') + ') < (' + get_coerced_access('lz') + ')) { pc = pc + 4 | 0; } else { pc = HEAP32[pc + 4 >> 2] | 0; continue; }' -CASES[ROPCODES['ULTBRF']] = 'if ((' + get_coerced_access('ly', unsigned=True) + ') < (' + get_coerced_access('lz', unsigned=True) + ')) { pc = pc + 4 | 0; } else { pc = HEAP32[pc + 4 >> 2] | 0; continue; }' -CASES[ROPCODES['SLEBRF']] = 'if ((' + get_coerced_access('ly') + ') <= (' + get_coerced_access('lz') + ')) { pc = pc + 4 | 0; } else { pc = HEAP32[pc + 4 >> 2] | 0; continue; }' -CASES[ROPCODES['ULEBRF']] = 'if ((' + get_coerced_access('ly', unsigned=True) + ') <= (' + get_coerced_access('lz', unsigned=True) + ')) { pc = pc + 4 | 0; } else { pc = HEAP32[pc + 4 >> 2] | 0; continue; }' - -CASES[ROPCODES['LNOTBRT']] = 'if (' + get_coerced_access('ly') + ') { pc = pc + 4 | 0; } else { pc = HEAP32[pc + 4 >> 2] | 0; continue; }' -CASES[ROPCODES['EQBRT']] = 'if ((' + get_coerced_access('ly') + ') == (' + get_coerced_access('lz') + ')) { pc = HEAP32[pc + 4 >> 2] | 0; continue; } else { pc = pc + 4 | 0; }' -CASES[ROPCODES['NEBRT']] = 'if ((' + get_coerced_access('ly') + ') != (' + get_coerced_access('lz') + ')) { pc = HEAP32[pc + 4 >> 2] | 0; continue; } else { pc = pc + 4 | 0; }' -CASES[ROPCODES['SLTBRT']] = 'if ((' + get_coerced_access('ly') + ') < (' + get_coerced_access('lz') + ')) { pc = HEAP32[pc + 4 >> 2] | 0; continue; } else { pc = pc + 4 | 0; }' -CASES[ROPCODES['ULTBRT']] = 'if ((' + get_coerced_access('ly', unsigned=True) + ') < (' + get_coerced_access('lz', unsigned=True) + ')) { pc = HEAP32[pc + 4 >> 2] | 0; continue; } else { pc = pc + 4 | 0; }' -CASES[ROPCODES['SLEBRT']] = 'if ((' + get_coerced_access('ly') + ') <= (' + get_coerced_access('lz') + ')) { pc = HEAP32[pc + 4 >> 2] | 0; continue; } else { pc = pc + 4 | 0; }' -CASES[ROPCODES['ULEBRT']] = 'if ((' + get_coerced_access('ly', unsigned=True) + ') <= (' + get_coerced_access('lz', unsigned=True) + ')) { pc = HEAP32[pc + 4 >> 2] | 0; continue; } else { pc = pc + 4 | 0; }' +CASES[ROPCODES['LNOTBRF']] = 'if (' + get_coerced_access('ly') + ') { pc = HEAP32[pc + 4 >> 2] | 0; PROCEED_WITHOUT_PC_BUMP; } else { pc = pc + 4 | 0; }' +CASES[ROPCODES['EQBRF']] = 'if ((' + get_coerced_access('ly') + ') == (' + get_coerced_access('lz') + ')) { pc = pc + 4 | 0; } else { pc = HEAP32[pc + 4 >> 2] | 0; PROCEED_WITHOUT_PC_BUMP; }' +CASES[ROPCODES['NEBRF']] = 'if ((' + get_coerced_access('ly') + ') != (' + get_coerced_access('lz') + ')) { pc = pc + 4 | 0; } else { pc = HEAP32[pc + 4 >> 2] | 0; PROCEED_WITHOUT_PC_BUMP; }' +CASES[ROPCODES['SLTBRF']] = 'if ((' + get_coerced_access('ly') + ') < (' + get_coerced_access('lz') + ')) { pc = pc + 4 | 0; } else { pc = HEAP32[pc + 4 >> 2] | 0; PROCEED_WITHOUT_PC_BUMP; }' +CASES[ROPCODES['ULTBRF']] = 'if ((' + get_coerced_access('ly', unsigned=True) + ') < (' + get_coerced_access('lz', unsigned=True) + ')) { pc = pc + 4 | 0; } else { pc = HEAP32[pc + 4 >> 2] | 0; PROCEED_WITHOUT_PC_BUMP; }' +CASES[ROPCODES['SLEBRF']] = 'if ((' + get_coerced_access('ly') + ') <= (' + get_coerced_access('lz') + ')) { pc = pc + 4 | 0; } else { pc = HEAP32[pc + 4 >> 2] | 0; PROCEED_WITHOUT_PC_BUMP; }' +CASES[ROPCODES['ULEBRF']] = 'if ((' + get_coerced_access('ly', unsigned=True) + ') <= (' + get_coerced_access('lz', unsigned=True) + ')) { pc = pc + 4 | 0; } else { pc = HEAP32[pc + 4 >> 2] | 0; PROCEED_WITHOUT_PC_BUMP; }' + +CASES[ROPCODES['LNOTBRT']] = 'if (' + get_coerced_access('ly') + ') { pc = pc + 4 | 0; } else { pc = HEAP32[pc + 4 >> 2] | 0; PROCEED_WITHOUT_PC_BUMP; }' +CASES[ROPCODES['EQBRT']] = 'if ((' + get_coerced_access('ly') + ') == (' + get_coerced_access('lz') + ')) { pc = HEAP32[pc + 4 >> 2] | 0; PROCEED_WITHOUT_PC_BUMP; } else { pc = pc + 4 | 0; }' +CASES[ROPCODES['NEBRT']] = 'if ((' + get_coerced_access('ly') + ') != (' + get_coerced_access('lz') + ')) { pc = HEAP32[pc + 4 >> 2] | 0; PROCEED_WITHOUT_PC_BUMP; } else { pc = pc + 4 | 0; }' +CASES[ROPCODES['SLTBRT']] = 'if ((' + get_coerced_access('ly') + ') < (' + get_coerced_access('lz') + ')) { pc = HEAP32[pc + 4 >> 2] | 0; PROCEED_WITHOUT_PC_BUMP; } else { pc = pc + 4 | 0; }' +CASES[ROPCODES['ULTBRT']] = 'if ((' + get_coerced_access('ly', unsigned=True) + ') < (' + get_coerced_access('lz', unsigned=True) + ')) { pc = HEAP32[pc + 4 >> 2] | 0; PROCEED_WITHOUT_PC_BUMP; } else { pc = pc + 4 | 0; }' +CASES[ROPCODES['SLEBRT']] = 'if ((' + get_coerced_access('ly') + ') <= (' + get_coerced_access('lz') + ')) { pc = HEAP32[pc + 4 >> 2] | 0; PROCEED_WITHOUT_PC_BUMP; } else { pc = pc + 4 | 0; }' +CASES[ROPCODES['ULEBRT']] = 'if ((' + get_coerced_access('ly', unsigned=True) + ') <= (' + get_coerced_access('lz', unsigned=True) + ')) { pc = HEAP32[pc + 4 >> 2] | 0; PROCEED_WITHOUT_PC_BUMP; } else { pc = pc + 4 | 0; }' CASES[ROPCODES['SETD']] = get_access('lx', s='d') + ' = ' + get_coerced_access('ly', s='d') + ';' CASES[ROPCODES['SETVD']] = get_access('lx', s='d') + ' = +(inst >> 16);' @@ -370,12 +370,12 @@ def get_coerced_access(l, s='i', unsigned=False, base='sp', offset=None): CASES[ROPCODES['STOREF32C']] = 'HEAPF32[' + get_access('lx') + ' >> 2] = +HEAPF32[' + get_access('ly') + ' >> 2];' CASES[ROPCODES['STOREF64C']] = 'HEAPF64[' + get_access('lx') + ' >> 3] = +HEAPF64[' + get_access('ly') + ' >> 3];' -CASES[ROPCODES['BR']] = 'pc = pc + ((inst >> 16) << 2) | 0; continue;' -CASES[ROPCODES['BRT']] = 'if (' + get_coerced_access('lx') + ') { pc = pc + ((inst >> 16) << 2) | 0; continue; }' -CASES[ROPCODES['BRF']] = 'if (!(' + get_coerced_access('lx') + ')) { pc = pc + ((inst >> 16) << 2) | 0; continue; }' -CASES[ROPCODES['BRA']] = 'pc = HEAP32[pc + 4 >> 2] | 0; continue;' -CASES[ROPCODES['BRTA']] = 'pc = pc + 4 | 0; if (' + get_coerced_access('lx') + ') { pc = HEAP32[pc >> 2] | 0; continue; }' -CASES[ROPCODES['BRFA']] = 'pc = pc + 4 | 0; if (!(' + get_coerced_access('lx') + ')) { pc = HEAP32[pc >> 2] | 0; continue; }' +CASES[ROPCODES['BR']] = 'pc = pc + ((inst >> 16) << 2) | 0; PROCEED_WITHOUT_PC_BUMP;' +CASES[ROPCODES['BRT']] = 'if (' + get_coerced_access('lx') + ') { pc = pc + ((inst >> 16) << 2) | 0; PROCEED_WITHOUT_PC_BUMP; }' +CASES[ROPCODES['BRF']] = 'if (!(' + get_coerced_access('lx') + ')) { pc = pc + ((inst >> 16) << 2) | 0; PROCEED_WITHOUT_PC_BUMP; }' +CASES[ROPCODES['BRA']] = 'pc = HEAP32[pc + 4 >> 2] | 0; PROCEED_WITHOUT_PC_BUMP;' +CASES[ROPCODES['BRTA']] = 'pc = pc + 4 | 0; if (' + get_coerced_access('lx') + ') { pc = HEAP32[pc >> 2] | 0; PROCEED_WITHOUT_PC_BUMP; }' +CASES[ROPCODES['BRFA']] = 'pc = pc + 4 | 0; if (!(' + get_coerced_access('lx') + ')) { pc = HEAP32[pc >> 2] | 0; PROCEED_WITHOUT_PC_BUMP; }' CASES[ROPCODES['COND']] = 'pc = pc + 4 | 0; ' + get_access('lx') + ' = (' + get_coerced_access('ly') + ') ? (' + get_coerced_access('lz') + ') : (' + get_coerced_access('(HEAPU8[pc >> 0] | 0)') + ');' CASES[ROPCODES['CONDD']] = 'pc = pc + 4 | 0; ' + get_access('lx', s='d') + ' = (' + get_coerced_access('ly') + ') ? (' + get_coerced_access('lz', s='d') + ') : (' + get_coerced_access('(HEAPU8[pc >> 0] | 0)', s='d') + ');' @@ -421,10 +421,10 @@ def get_coerced_access(l, s='i', unsigned=False, base='sp', offset=None): lx = ((''' + get_coerced_access('lx') + ''') - (''' + get_coerced_access('ly') + ''')) >>> 0; // lx is now relative to the base if ((lx >>> 0) >= (lz >>> 0)) { // is the adjusted value too big? pc = (pc + (lz << 2)) | 0; // jump to right after the table, where the default is - break; // also increment the pc normally, to skip the switch itself + PROCEED_WITH_PC_BUMP; // also increment the pc normally, to skip the switch itself } pc = HEAP32[pc + 4 + (lx << 2) >> 2] | 0; // load from the jump table which is right after this instruction, and set pc - continue;''' + PROCEED_WITHOUT_PC_BUMP;''' def make_emterpreter(zero=False): # return is specialized per interpreter @@ -449,7 +449,7 @@ def make_target_call(i): extra = len(sig) - 1 + int(function_pointer_call) # [opcode, lx, target, sig], take the usual 4. params are extra if extra > 0: ret += '; pc = pc + %d | 0' % (4*((extra+3)>>2)) - return ' ' + ret + '; break;' + return ' ' + ret + '; PROCEED_WITH_PC_BUMP;' CASES[ROPCODES['EXTCALL']] = 'switch ((inst>>>16)|0) {\n' + \ '\n'.join([' case %d: {\n%s\n }' % (i, make_target_call(i)) for i in range(global_func_id)]) + \ @@ -460,7 +460,7 @@ def make_target_call(i): def make_load(i): sig = 'i' name = rglobal_vars[i] - return ' ' + get_access('lx', sig[0]) + ' = ' + name + '; break;' + return ' ' + get_access('lx', sig[0]) + ' = ' + name + '; PROCEED_WITH_PC_BUMP;' CASES[ROPCODES['GETGLBI']] = 'switch (ly|0) {\n' + \ '\n'.join([' case %d: {\n%s\n }' % (i, make_load(i)) for i in range(global_var_id)]) + \ '\n default: assert(0);' + \ @@ -468,15 +468,15 @@ def make_load(i): def make_store(i): sig = 'i' name = rglobal_vars[i] - return ' ' + name + ' = ' + get_coerced_access('lz', sig[0]) + '; break;' + return ' ' + name + ' = ' + get_coerced_access('lz', sig[0]) + '; PROCEED_WITH_PC_BUMP;' CASES[ROPCODES['SETGLBI']] = 'switch ((inst >> 8)&255) {\n' + \ '\n'.join([' case %d: {\n%s\n }' % (i, make_store(i)) for i in range(global_var_id)]) + \ '\n default: assert(0);' + \ '\n }' def fix_case(case): - # we increment pc at the top of the loop. cases doing 'continue' really need to decrement it - return case.replace('continue;', 'CONTINUE').replace('break;', 'continue;').replace('CONTINUE', 'pc = pc - 4 | 0; continue;').replace('continue; continue;', 'continue;') + # we increment pc at the top of the loop. to avoid a pc bump, we decrement it first; this is rare, most opcodes just continue; this avoids any code at the end of the loop + return case.replace('PROCEED_WITH_PC_BUMP', 'continue').replace('PROCEED_WITHOUT_PC_BUMP', 'pc = pc - 4 | 0; continue').replace('continue; continue;', 'continue;') def process(code): code = code.replace(' assert(', ' //assert(') From 17cdbc6130feed1b84272e17692615e092842c16 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 10 Oct 2014 16:00:48 -0700 Subject: [PATCH 349/461] work on bullet startup test --- .../Demos/HelloWorld/HelloWorldFrames.cpp | 154 ++++++++++++++++++ tests/bullet/Demos/HelloWorld/frames.html | 11 ++ 2 files changed, 165 insertions(+) create mode 100644 tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp create mode 100644 tests/bullet/Demos/HelloWorld/frames.html diff --git a/tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp b/tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp new file mode 100644 index 0000000000000..13fbb911a537e --- /dev/null +++ b/tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp @@ -0,0 +1,154 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2007 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +#include "btBulletDynamicsCommon.h" + +#include + +#include + +/// This is a Hello World program for running a basic Bullet physics simulation + +btDiscreteDynamicsWorld* dynamicsWorld; + +int main(int argc, char** argv) +{ + + int i; + + ///collision configuration contains default setup for memory, collision setup. Advanced users can create their own configuration. + btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration(); + + ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) + btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration); + + ///btDbvtBroadphase is a good general purpose broadphase. You can also try out btAxis3Sweep. + btBroadphaseInterface* overlappingPairCache = new btDbvtBroadphase(); + + ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded) + btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver; + + dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,overlappingPairCache,solver,collisionConfiguration); + + dynamicsWorld->setGravity(btVector3(0,-10,0)); + + ///create a few basic rigid bodies + btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.))); + + //keep track of the shapes, we release memory at exit. + //make sure to re-use collision shapes among rigid bodies whenever possible! + btAlignedObjectArray collisionShapes; + + collisionShapes.push_back(groundShape); + + btTransform groundTransform; + groundTransform.setIdentity(); + groundTransform.setOrigin(btVector3(0,-56,0)); + + { + btScalar mass(0.); + + //rigidbody is dynamic if and only if mass is non zero, otherwise static + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + groundShape->calculateLocalInertia(mass,localInertia); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,groundShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + //add the body to the dynamics world + dynamicsWorld->addRigidBody(body); + } + + + for (int i = 0; i < 100; i++) + { + //create a dynamic rigidbody + + //btCollisionShape* colShape = new btBoxShape(btVector3(1,1,1)); + btCollisionShape* colShape = new btSphereShape(btScalar(1.)); + collisionShapes.push_back(colShape); + + /// Create Dynamic Objects + btTransform startTransform; + startTransform.setIdentity(); + + btScalar mass(1.f); + + //rigidbody is dynamic if and only if mass is non zero, otherwise static + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + colShape->calculateLocalInertia(mass,localInertia); + + startTransform.setOrigin(btVector3(2 + 3*i,10,0)); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,colShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + dynamicsWorld->addRigidBody(body); + } + + EM_ASM({ + // try to run a max frame rate + var i = 0; + var lastTime = startTime; + var interval = setInterval(function() { + var curr = Date.now(); + var fps = Math.round(1000/(curr - lastTime)); + lastTime = curr; + console.log('frame ' + [i, fps, curr - startTime]); + Module._simulate(); + if (++i === 30) clearInterval(interval); + }, 0); + }); + + emscripten_exit_with_live_runtime(); +} + +/// Do some simulation + +extern "C" { + +void EMSCRIPTEN_KEEPALIVE simulate() { + dynamicsWorld->stepSimulation(1.f/60.f,10); + + static int i = 0; + if (i++ % 10 == 0) { + //print positions of all objects + for (int j=dynamicsWorld->getNumCollisionObjects()-1; j>=0 ;j--) + { + btCollisionObject* obj = dynamicsWorld->getCollisionObjectArray()[j]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + btTransform trans; + body->getMotionState()->getWorldTransform(trans); + std::cout << ">>>>>>>>>>>>>>>>>>>>> world pos = " << float(trans.getOrigin().getX()) << ", " << float(trans.getOrigin().getY()) << ", " << float(trans.getOrigin().getZ()) << std::endl; + } + } + } +} + +} + diff --git a/tests/bullet/Demos/HelloWorld/frames.html b/tests/bullet/Demos/HelloWorld/frames.html new file mode 100644 index 0000000000000..ca7a2fa6c5109 --- /dev/null +++ b/tests/bullet/Demos/HelloWorld/frames.html @@ -0,0 +1,11 @@ + + + + From d86a2e128e4bc7733fc04cc830ac7187ace7eb18 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 10 Oct 2014 16:34:41 -0700 Subject: [PATCH 350/461] test improvements --- .../Demos/HelloWorld/HelloWorldFrames.cpp | 82 +++++++++++-------- tests/bullet/Demos/HelloWorld/frames.html | 4 +- 2 files changed, 50 insertions(+), 36 deletions(-) diff --git a/tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp b/tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp index 13fbb911a537e..be6efe3965d87 100644 --- a/tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp +++ b/tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp @@ -24,6 +24,10 @@ subject to the following restrictions: btDiscreteDynamicsWorld* dynamicsWorld; +extern "C" { +void EMSCRIPTEN_KEEPALIVE addBody(); +} + int main(int argc, char** argv) { @@ -77,37 +81,7 @@ int main(int argc, char** argv) dynamicsWorld->addRigidBody(body); } - - for (int i = 0; i < 100; i++) - { - //create a dynamic rigidbody - - //btCollisionShape* colShape = new btBoxShape(btVector3(1,1,1)); - btCollisionShape* colShape = new btSphereShape(btScalar(1.)); - collisionShapes.push_back(colShape); - - /// Create Dynamic Objects - btTransform startTransform; - startTransform.setIdentity(); - - btScalar mass(1.f); - - //rigidbody is dynamic if and only if mass is non zero, otherwise static - bool isDynamic = (mass != 0.f); - - btVector3 localInertia(0,0,0); - if (isDynamic) - colShape->calculateLocalInertia(mass,localInertia); - - startTransform.setOrigin(btVector3(2 + 3*i,10,0)); - - //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects - btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); - btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,colShape,localInertia); - btRigidBody* body = new btRigidBody(rbInfo); - - dynamicsWorld->addRigidBody(body); - } + for (int i = 0; i < 20; i++) addBody(); EM_ASM({ // try to run a max frame rate @@ -118,8 +92,10 @@ int main(int argc, char** argv) var fps = Math.round(1000/(curr - lastTime)); lastTime = curr; console.log('frame ' + [i, fps, curr - startTime]); + //for (var j = 0; j < 10; j++) Module._addBody(); Module._simulate(); - if (++i === 30) clearInterval(interval); + if (i === 30) clearInterval(interval); + i++; }, 0); }); @@ -130,12 +106,49 @@ int main(int argc, char** argv) extern "C" { +void EMSCRIPTEN_KEEPALIVE addBody() { + //btCollisionShape* colShape = new btBoxShape(btVector3(1,1,1)); + btCollisionShape* colShape = new btSphereShape(btScalar(1.)); + + /// Create Dynamic Objects + btTransform startTransform; + + btScalar mass(1.f); + + btVector3 localInertia(0,0,0); + colShape->calculateLocalInertia(mass,localInertia); + + static int i = 0, j = 0, k = 0, counter = 0; + counter++; + if (counter % 3 == 0) i++; + else if (counter % 3 == 1) j++; + else k++; + + { + //create a dynamic rigidbody + + startTransform.setIdentity(); + + startTransform.setOrigin(btVector3(i*2, 2 + j*2, k*2)); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,colShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + dynamicsWorld->addRigidBody(body); + } +} + void EMSCRIPTEN_KEEPALIVE simulate() { - dynamicsWorld->stepSimulation(1.f/60.f,10); + for (int k = 0; k < 10; k++) { + dynamicsWorld->stepSimulation(1.f/60.f,10); + } static int i = 0; if (i++ % 10 == 0) { - //print positions of all objects + std::cout << ">>>>>>>>>>>> objs = " << dynamicsWorld->getNumCollisionObjects() << std::endl; + //print positions of an object for (int j=dynamicsWorld->getNumCollisionObjects()-1; j>=0 ;j--) { btCollisionObject* obj = dynamicsWorld->getCollisionObjectArray()[j]; @@ -146,6 +159,7 @@ void EMSCRIPTEN_KEEPALIVE simulate() { body->getMotionState()->getWorldTransform(trans); std::cout << ">>>>>>>>>>>>>>>>>>>>> world pos = " << float(trans.getOrigin().getX()) << ", " << float(trans.getOrigin().getY()) << ", " << float(trans.getOrigin().getZ()) << std::endl; } + break; } } } diff --git a/tests/bullet/Demos/HelloWorld/frames.html b/tests/bullet/Demos/HelloWorld/frames.html index ca7a2fa6c5109..d652bf190f1bb 100644 --- a/tests/bullet/Demos/HelloWorld/frames.html +++ b/tests/bullet/Demos/HelloWorld/frames.html @@ -1,11 +1,11 @@ From ffc39e5782a99854c1b0a6b545fca29718168427 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Oct 2014 09:26:31 -0700 Subject: [PATCH 351/461] refactor bullet startup test --- .../Demos/HelloWorld/HelloWorldFrames.cpp | 14 +------------ tests/bullet/Demos/HelloWorld/frames.html | 20 ++++++++++++++++++- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp b/tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp index be6efe3965d87..0dc8009ee8bd5 100644 --- a/tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp +++ b/tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp @@ -84,19 +84,7 @@ int main(int argc, char** argv) for (int i = 0; i < 20; i++) addBody(); EM_ASM({ - // try to run a max frame rate - var i = 0; - var lastTime = startTime; - var interval = setInterval(function() { - var curr = Date.now(); - var fps = Math.round(1000/(curr - lastTime)); - lastTime = curr; - console.log('frame ' + [i, fps, curr - startTime]); - //for (var j = 0; j < 10; j++) Module._addBody(); - Module._simulate(); - if (i === 30) clearInterval(interval); - i++; - }, 0); + startSimulation(); }); emscripten_exit_with_live_runtime(); diff --git a/tests/bullet/Demos/HelloWorld/frames.html b/tests/bullet/Demos/HelloWorld/frames.html index d652bf190f1bb..c767a75ba9cf2 100644 --- a/tests/bullet/Demos/HelloWorld/frames.html +++ b/tests/bullet/Demos/HelloWorld/frames.html @@ -1,11 +1,29 @@ + + From b9e60e726963d34e5ca2e9da34500b755ed46fd7 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Oct 2014 11:00:35 -0700 Subject: [PATCH 352/461] test restructuring --- .../Demos/HelloWorld/frames.emterp.html | 4 ++++ tests/bullet/Demos/HelloWorld/frames.html | 23 ++----------------- tests/bullet/Demos/HelloWorld/setup.js | 17 ++++++++++++++ 3 files changed, 23 insertions(+), 21 deletions(-) create mode 100644 tests/bullet/Demos/HelloWorld/frames.emterp.html create mode 100644 tests/bullet/Demos/HelloWorld/setup.js diff --git a/tests/bullet/Demos/HelloWorld/frames.emterp.html b/tests/bullet/Demos/HelloWorld/frames.emterp.html new file mode 100644 index 0000000000000..71a72ed1e01d4 --- /dev/null +++ b/tests/bullet/Demos/HelloWorld/frames.emterp.html @@ -0,0 +1,4 @@ + + + + diff --git a/tests/bullet/Demos/HelloWorld/frames.html b/tests/bullet/Demos/HelloWorld/frames.html index c767a75ba9cf2..d2556e634c3a2 100644 --- a/tests/bullet/Demos/HelloWorld/frames.html +++ b/tests/bullet/Demos/HelloWorld/frames.html @@ -1,29 +1,10 @@ - + diff --git a/tests/bullet/Demos/HelloWorld/setup.js b/tests/bullet/Demos/HelloWorld/setup.js new file mode 100644 index 0000000000000..fc5f01c38be66 --- /dev/null +++ b/tests/bullet/Demos/HelloWorld/setup.js @@ -0,0 +1,17 @@ +function startSimulation() { + var i = 0; + var interval = setInterval(function() { + var pre = Date.now(); + Module._simulate(); + var delta = Date.now() - pre; + var fps = Math.round(1000/delta); + console.log('frame ' + [i, fps, pre - startTime].join(', ')); + //for (var j = 0; j < 10; j++) Module._addBody(); + if (i === 30) clearInterval(interval); + i++; + }, 0); +} + +var startTime = Date.now(); +console.log('start at time 0 = ' + startTime); + From 77f2e8cdea67006021bcb90ae55d4faff2bec4d4 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Oct 2014 11:18:32 -0700 Subject: [PATCH 353/461] use bullet benchmark --- .../bullet/Demos/HelloWorld/BenchmarkDemo.cpp | 1329 + tests/bullet/Demos/HelloWorld/BenchmarkDemo.h | 265 + .../Demos/HelloWorld/HelloWorldFrames.cpp | 124 +- tests/bullet/Demos/HelloWorld/Taru.mdl | 49 + tests/bullet/Demos/HelloWorld/frames.html | 2 +- tests/bullet/Demos/HelloWorld/landscape.mdl | 84369 ++++++++++++++++ 6 files changed, 86024 insertions(+), 114 deletions(-) create mode 100644 tests/bullet/Demos/HelloWorld/BenchmarkDemo.cpp create mode 100644 tests/bullet/Demos/HelloWorld/BenchmarkDemo.h create mode 100644 tests/bullet/Demos/HelloWorld/Taru.mdl create mode 100644 tests/bullet/Demos/HelloWorld/landscape.mdl diff --git a/tests/bullet/Demos/HelloWorld/BenchmarkDemo.cpp b/tests/bullet/Demos/HelloWorld/BenchmarkDemo.cpp new file mode 100644 index 0000000000000..8a4eaea4d6ef1 --- /dev/null +++ b/tests/bullet/Demos/HelloWorld/BenchmarkDemo.cpp @@ -0,0 +1,1329 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + + +// Collision Radius +#define COLLISION_RADIUS 0.0f + +#include "BenchmarkDemo.h" +#ifdef USE_GRAPHICAL_BENCHMARK +#include "GlutStuff.h" +#endif //USE_GRAPHICAL_BENCHMARK + +///btBulletDynamicsCommon.h is the main Bullet include file, contains most common include files. +#include "btBulletDynamicsCommon.h" +#include //printf debugging +#include "Taru.mdl" +#include "landscape.mdl" +#include "BulletCollision/BroadphaseCollision/btDbvtBroadphase.h" +#ifdef USE_PARALLEL_DISPATCHER_BENCHMARK +#include "BulletMultiThreaded/SpuGatheringCollisionDispatcher.h" +#include "BulletMultiThreaded/SequentialThreadSupport.h" +#include "BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.h" +#endif + +#include "BulletCollision/CollisionDispatch/btSimulationIslandManager.h" + + +#ifdef USE_PARALLEL_DISPATCHER_BENCHMARK +#ifdef _WIN32 +#include "BulletMultiThreaded/Win32ThreadSupport.h" +#elif defined (USE_PTHREADS) +#include "BulletMultiThreaded/PosixThreadSupport.h" +#endif +#include "BulletMultiThreaded/SpuGatheringCollisionDispatcher.h" +#include "BulletMultiThreaded/btParallelConstraintSolver.h" + + + + +btThreadSupportInterface* createSolverThreadSupport(int maxNumThreads) +{ +//#define SEQUENTIAL +#ifdef SEQUENTIAL + SequentialThreadSupport::SequentialThreadConstructionInfo tci("solverThreads",SolverThreadFunc,SolverlsMemoryFunc); + SequentialThreadSupport* threadSupport = new SequentialThreadSupport(tci); + threadSupport->startSPU(); +#else + +#ifdef _WIN32 + Win32ThreadSupport::Win32ThreadConstructionInfo threadConstructionInfo("solverThreads",SolverThreadFunc,SolverlsMemoryFunc,maxNumThreads); + Win32ThreadSupport* threadSupport = new Win32ThreadSupport(threadConstructionInfo); + threadSupport->startSPU(); +#elif defined (USE_PTHREADS) + PosixThreadSupport::ThreadConstructionInfo solverConstructionInfo("solver", SolverThreadFunc, + SolverlsMemoryFunc, maxNumThreads); + + PosixThreadSupport* threadSupport = new PosixThreadSupport(solverConstructionInfo); + +#else + SequentialThreadSupport::SequentialThreadConstructionInfo tci("solverThreads",SolverThreadFunc,SolverlsMemoryFunc); + SequentialThreadSupport* threadSupport = new SequentialThreadSupport(tci); + threadSupport->startSPU(); +#endif + +#endif + + return threadSupport; +} +#endif + +class btRaycastBar2 +{ +public: + btVector3 source[NUMRAYS]; + btVector3 dest[NUMRAYS]; + btVector3 direction[NUMRAYS]; + btVector3 hit[NUMRAYS]; + btVector3 normal[NUMRAYS]; + + int frame_counter; + int ms; + int sum_ms; + int sum_ms_samples; + int min_ms; + int max_ms; + +#ifdef USE_BT_CLOCK + btClock frame_timer; +#endif //USE_BT_CLOCK + + btScalar dx; + btScalar min_x; + btScalar max_x; + btScalar max_y; + btScalar sign; + + btRaycastBar2 () + { + ms = 0; + max_ms = 0; + min_ms = 9999; + sum_ms_samples = 0; + sum_ms = 0; + } + + + + btRaycastBar2 (btScalar ray_length, btScalar z,btScalar max_y) + { + frame_counter = 0; + ms = 0; + max_ms = 0; + min_ms = 9999; + sum_ms_samples = 0; + sum_ms = 0; + dx = 10.0; + min_x = 0; + max_x = 0; + this->max_y = max_y; + sign = 1.0; + btScalar dalpha = 2*SIMD_2_PI/NUMRAYS; + for (int i = 0; i < NUMRAYS; i++) + { + btScalar alpha = dalpha * i; + // rotate around by alpha degrees y + btQuaternion q(btVector3(0.0, 1.0, 0.0), alpha); + direction[i] = btVector3(1.0, 0.0, 0.0); + direction[i] = quatRotate(q , direction[i]); + direction[i] = direction[i] * ray_length; + + + source[i] = btVector3(min_x, max_y, z); + dest[i] = source[i] + direction[i]; + dest[i][1]=-1000; + normal[i] = btVector3(1.0, 0.0, 0.0); + } + } + + void move (btScalar dt) + { + if (dt > btScalar(1.0/60.0)) + dt = btScalar(1.0/60.0); + for (int i = 0; i < NUMRAYS; i++) + { + source[i][0] += dx * dt * sign; + dest[i][0] += dx * dt * sign; + } + if (source[0][0] < min_x) + sign = 1.0; + else if (source[0][0] > max_x) + sign = -1.0; + } + + void cast (btCollisionWorld* cw) + { +#ifdef USE_BT_CLOCK + frame_timer.reset (); +#endif //USE_BT_CLOCK + +#ifdef BATCH_RAYCASTER + if (!gBatchRaycaster) + return; + + gBatchRaycaster->clearRays (); + for (int i = 0; i < NUMRAYS; i++) + { + gBatchRaycaster->addRay (source[i], dest[i]); + } + gBatchRaycaster->performBatchRaycast (); + for (int i = 0; i < gBatchRaycaster->getNumRays (); i++) + { + const SpuRaycastTaskWorkUnitOut& out = (*gBatchRaycaster)[i]; + hit[i].setInterpolate3(source[i],dest[i],out.hitFraction); + normal[i] = out.hitNormal; + normal[i].normalize (); + } +#else + for (int i = 0; i < NUMRAYS; i++) + { + btCollisionWorld::ClosestRayResultCallback cb(source[i], dest[i]); + + cw->rayTest (source[i], dest[i], cb); + if (cb.hasHit ()) + { + hit[i] = cb.m_hitPointWorld; + normal[i] = cb.m_hitNormalWorld; + normal[i].normalize (); + } else { + hit[i] = dest[i]; + normal[i] = btVector3(1.0, 0.0, 0.0); + } + + } +#ifdef USE_BT_CLOCK + ms += frame_timer.getTimeMilliseconds (); +#endif //USE_BT_CLOCK + frame_counter++; + if (frame_counter > 50) + { + min_ms = ms < min_ms ? ms : min_ms; + max_ms = ms > max_ms ? ms : max_ms; + sum_ms += ms; + sum_ms_samples++; + btScalar mean_ms = (btScalar)sum_ms/(btScalar)sum_ms_samples; + //printf("%d rays in %d ms %d %d %f\n", NUMRAYS * frame_counter, ms, min_ms, max_ms, mean_ms); + ms = 0; + frame_counter = 0; + } +#endif + } + + void draw () + { +#ifdef USE_GRAPHICAL_BENCHMARK + glDisable (GL_LIGHTING); + glColor3f (0.0, 1.0, 0.0); + glBegin (GL_LINES); + int i; + + for (i = 0; i < NUMRAYS; i++) + { + glVertex3f (source[i][0], source[i][1], source[i][2]); + glVertex3f (hit[i][0], hit[i][1], hit[i][2]); + } + glEnd (); + glColor3f (1.0, 1.0, 1.0); + glBegin (GL_LINES); + for (i = 0; i < NUMRAYS; i++) + { + glVertex3f (hit[i][0], hit[i][1], hit[i][2]); + glVertex3f (hit[i][0] + normal[i][0], hit[i][1] + normal[i][1], hit[i][2] + normal[i][2]); + } + glEnd (); + glColor3f (0.0, 1.0, 1.0); + glBegin (GL_POINTS); + for ( i = 0; i < NUMRAYS; i++) + { + glVertex3f (hit[i][0], hit[i][1], hit[i][2]); + } + glEnd (); + glEnable (GL_LIGHTING); +#endif //USE_GRAPHICAL_BENCHMARK + + } +}; + + +static btRaycastBar2 raycastBar; + + +void BenchmarkDemo::clientMoveAndDisplay() +{ +#ifdef USE_GRAPHICAL_BENCHMARK + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); +#endif //USE_GRAPHICAL_BENCHMARK + + //simple dynamics world doesn't handle fixed-time-stepping + //float ms = getDeltaTimeMicroseconds(); + + ///step the simulation + if (m_dynamicsWorld) + { + m_dynamicsWorld->stepSimulation(btScalar(1./60.)); + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + } + + if (m_benchmark==7) + { + castRays(); + + raycastBar.draw(); + + } + + renderme(); + +#ifdef USE_GRAPHICAL_BENCHMARK + glFlush(); + + swapBuffers(); +#endif //USE_GRAPHICAL_BENCHMARK + +} + + + +void BenchmarkDemo::displayCallback(void) +{ + +#ifdef USE_GRAPHICAL_BENCHMARK + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + + //optional but useful: debug drawing to detect problems + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + glFlush(); + swapBuffers(); +#endif //USE_GRAPHICAL_BENCHMARK +} + + + + +void BenchmarkDemo::initPhysics() +{ + + setCameraDistance(btScalar(100.)); + + ///collision configuration contains default setup for memory, collision setup + btDefaultCollisionConstructionInfo cci; + cci.m_defaultMaxPersistentManifoldPoolSize = 32768; + m_collisionConfiguration = new btDefaultCollisionConfiguration(cci); + + ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + + m_dispatcher->setDispatcherFlags(btCollisionDispatcher::CD_DISABLE_CONTACTPOOL_DYNAMIC_ALLOCATION); + +#if USE_PARALLEL_DISPATCHER_BENCHMARK + + int maxNumOutstandingTasks = 4; +#ifdef _WIN32 + Win32ThreadSupport* threadSupportCollision = new Win32ThreadSupport(Win32ThreadSupport::Win32ThreadConstructionInfo( "collision",processCollisionTask, createCollisionLocalStoreMemory,maxNumOutstandingTasks)); +#elif defined (USE_PTHREADS) + PosixThreadSupport::ThreadConstructionInfo collisionConstructionInfo( "collision",processCollisionTask, createCollisionLocalStoreMemory,maxNumOutstandingTasks); + PosixThreadSupport* threadSupportCollision = new PosixThreadSupport(collisionConstructionInfo); +#endif + //SequentialThreadSupport::SequentialThreadConstructionInfo sci("spuCD", processCollisionTask, createCollisionLocalStoreMemory); + //SequentialThreadSupport* seq = new SequentialThreadSupport(sci); + m_dispatcher = new SpuGatheringCollisionDispatcher(threadSupportCollision,1,m_collisionConfiguration); +#endif + + + ///the maximum size of the collision world. Make sure objects stay within these boundaries + ///Don't make the world AABB size too large, it will harm simulation quality and performance + btVector3 worldAabbMin(-1000,-1000,-1000); + btVector3 worldAabbMax(1000,1000,1000); + + btHashedOverlappingPairCache* pairCache = new btHashedOverlappingPairCache(); + m_overlappingPairCache = new btAxisSweep3(worldAabbMin,worldAabbMax,3500,pairCache); +// m_overlappingPairCache = new btSimpleBroadphase(); +// m_overlappingPairCache = new btDbvtBroadphase(); + + + ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded) +#ifdef USE_PARALLEL_DISPATCHER_BENCHMARK + + btThreadSupportInterface* thread = createSolverThreadSupport(4); + btConstraintSolver* sol = new btParallelConstraintSolver(thread); +#else + btSequentialImpulseConstraintSolver* sol = new btSequentialImpulseConstraintSolver; +#endif //USE_PARALLEL_DISPATCHER_BENCHMARK + + + m_solver = sol; + + btDiscreteDynamicsWorld* dynamicsWorld; + m_dynamicsWorld = dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_solver,m_collisionConfiguration); + +#ifdef USE_PARALLEL_DISPATCHER_BENCHMARK + dynamicsWorld->getSimulationIslandManager()->setSplitIslands(false); +#endif //USE_PARALLEL_DISPATCHER_BENCHMARK + + ///the following 3 lines increase the performance dramatically, with a little bit of loss of quality + m_dynamicsWorld->getSolverInfo().m_solverMode |=SOLVER_ENABLE_FRICTION_DIRECTION_CACHING; //don't recalculate friction values each frame + dynamicsWorld->getSolverInfo().m_numIterations = 5; //few solver iterations + m_defaultContactProcessingThreshold = 0.f;//used when creating bodies: body->setContactProcessingThreshold(...); + + + m_dynamicsWorld->setGravity(btVector3(0,-10,0)); + + if (m_benchmark<5) + { + ///create a few basic rigid bodies + btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(250.),btScalar(50.),btScalar(250.))); + // btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),0); + + m_collisionShapes.push_back(groundShape); + + btTransform groundTransform; + groundTransform.setIdentity(); + groundTransform.setOrigin(btVector3(0,-50,0)); + + //We can also use DemoApplication::localCreateRigidBody, but for clarity it is provided here: + { + btScalar mass(0.); + + //rigidbody is dynamic if and only if mass is non zero, otherwise static + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + groundShape->calculateLocalInertia(mass,localInertia); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,groundShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + //add the body to the dynamics world + m_dynamicsWorld->addRigidBody(body); + } + } + + switch (m_benchmark) + { + case 1: + { + createTest1(); + break; + } + case 2: + { + createTest2(); + break; + } + case 3: + { + createTest3(); + break; + } + case 4: + { + createTest4(); + break; + } + case 5: + { + createTest5(); + break; + } + case 6: + { + createTest6(); + break; + } + case 7: + { + createTest7(); + break; + } + + + default: + { + } + } + + + clientResetScene(); +} + + +void BenchmarkDemo::createTest1() +{ + // 3000 + int size = 8; + const float cubeSize = 1.0f; + float spacing = cubeSize; + btVector3 pos(0.0f, cubeSize * 2,0.f); + float offset = -size * (cubeSize * 2.0f + spacing) * 0.5f; + + btBoxShape* blockShape = new btBoxShape(btVector3(cubeSize-COLLISION_RADIUS,cubeSize-COLLISION_RADIUS,cubeSize-COLLISION_RADIUS)); + btVector3 localInertia(0,0,0); + float mass = 2.f; + blockShape->calculateLocalInertia(mass,localInertia); + + btTransform trans; + trans.setIdentity(); + + for(int k=0;k<47;k++) { + for(int j=0;jcalculateLocalInertia(mass,localInertia); + +// btScalar diffX = boxSize[0] * 1.0f; + btScalar diffY = boxSize[1] * 1.0f; + btScalar diffZ = boxSize[2] * 1.0f; + + btScalar offset = -stackSize * (diffZ * 2.0f) * 0.5f; + btVector3 pos(0.0f, diffY, 0.0f); + + btTransform trans; + trans.setIdentity(); + + while(stackSize) { + for(int i=0;icalculateLocalInertia(mass,localInertia); + + + btScalar diffX = boxSize[0]*1.02f; + btScalar diffY = boxSize[1]*1.02f; + btScalar diffZ = boxSize[2]*1.02f; + + btScalar offsetX = -stackSize * (diffX * 2.0f + space) * 0.5f; + btScalar offsetZ = -stackSize * (diffZ * 2.0f + space) * 0.5f; + while(stackSize) { + for(int j=0;jlocalCreateRigidBody(mass,trans,blockShape); + + + } + } + offsetX += diffX; + offsetZ += diffZ; + pos[1] += (diffY * 2.0f + space); + stackSize--; + } + +} + + const btVector3 rotate( const btQuaternion& quat, const btVector3 & vec ) +{ + float tmpX, tmpY, tmpZ, tmpW; + tmpX = ( ( ( quat.getW() * vec.getX() ) + ( quat.getY() * vec.getZ() ) ) - ( quat.getZ() * vec.getY() ) ); + tmpY = ( ( ( quat.getW() * vec.getY() ) + ( quat.getZ() * vec.getX() ) ) - ( quat.getX() * vec.getZ() ) ); + tmpZ = ( ( ( quat.getW() * vec.getZ() ) + ( quat.getX() * vec.getY() ) ) - ( quat.getY() * vec.getX() ) ); + tmpW = ( ( ( quat.getX() * vec.getX() ) + ( quat.getY() * vec.getY() ) ) + ( quat.getZ() * vec.getZ() ) ); + return btVector3( + ( ( ( ( tmpW * quat.getX() ) + ( tmpX * quat.getW() ) ) - ( tmpY * quat.getZ() ) ) + ( tmpZ * quat.getY() ) ), + ( ( ( ( tmpW * quat.getY() ) + ( tmpY * quat.getW() ) ) - ( tmpZ * quat.getX() ) ) + ( tmpX * quat.getZ() ) ), + ( ( ( ( tmpW * quat.getZ() ) + ( tmpZ * quat.getW() ) ) - ( tmpX * quat.getY() ) ) + ( tmpY * quat.getX() ) ) + ); +} + +void BenchmarkDemo::createTowerCircle(const btVector3& offsetPosition,int stackSize,int rotSize,const btVector3& boxSize) +{ + + btBoxShape* blockShape = new btBoxShape(btVector3(boxSize[0]-COLLISION_RADIUS,boxSize[1]-COLLISION_RADIUS,boxSize[2]-COLLISION_RADIUS)); + + btTransform trans; + trans.setIdentity(); + + float mass = 1.f; + btVector3 localInertia(0,0,0); + blockShape->calculateLocalInertia(mass,localInertia); + + + float radius = 1.3f * rotSize * boxSize[0] / SIMD_PI; + + // create active boxes + btQuaternion rotY(0,1,0,0); + float posY = boxSize[1]; + + for(int i=0;icalculateLocalInertia(mass,localInertia); + + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,shape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + m_ownerWorld->addRigidBody(body); + + return body; + } + +public: + RagDoll (btDynamicsWorld* ownerWorld, const btVector3& positionOffset,btScalar scale) + : m_ownerWorld (ownerWorld) + { + // Setup the geometry + m_shapes[BODYPART_PELVIS] = new btCapsuleShape(btScalar(0.15)*scale, btScalar(0.20)*scale); + m_shapes[BODYPART_SPINE] = new btCapsuleShape(btScalar(0.15)*scale, btScalar(0.28)*scale); + m_shapes[BODYPART_HEAD] = new btCapsuleShape(btScalar(0.10)*scale, btScalar(0.05)*scale); + m_shapes[BODYPART_LEFT_UPPER_LEG] = new btCapsuleShape(btScalar(0.07)*scale, btScalar(0.45)*scale); + m_shapes[BODYPART_LEFT_LOWER_LEG] = new btCapsuleShape(btScalar(0.05)*scale, btScalar(0.37)*scale); + m_shapes[BODYPART_RIGHT_UPPER_LEG] = new btCapsuleShape(btScalar(0.07)*scale, btScalar(0.45)*scale); + m_shapes[BODYPART_RIGHT_LOWER_LEG] = new btCapsuleShape(btScalar(0.05)*scale, btScalar(0.37)*scale); + m_shapes[BODYPART_LEFT_UPPER_ARM] = new btCapsuleShape(btScalar(0.05)*scale, btScalar(0.33)*scale); + m_shapes[BODYPART_LEFT_LOWER_ARM] = new btCapsuleShape(btScalar(0.04)*scale, btScalar(0.25)*scale); + m_shapes[BODYPART_RIGHT_UPPER_ARM] = new btCapsuleShape(btScalar(0.05)*scale, btScalar(0.33)*scale); + m_shapes[BODYPART_RIGHT_LOWER_ARM] = new btCapsuleShape(btScalar(0.04)*scale, btScalar(0.25)*scale); + + // Setup all the rigid bodies + btTransform offset; offset.setIdentity(); + offset.setOrigin(positionOffset); + + btTransform transform; + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(0.), btScalar(1.), btScalar(0.))); + m_bodies[BODYPART_PELVIS] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_PELVIS]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(0.), btScalar(1.2), btScalar(0.))); + m_bodies[BODYPART_SPINE] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_SPINE]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(0.), btScalar(1.6), btScalar(0.))); + m_bodies[BODYPART_HEAD] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_HEAD]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(-0.18), btScalar(0.65), btScalar(0.))); + m_bodies[BODYPART_LEFT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_LEG]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(-0.18), btScalar(0.2), btScalar(0.))); + m_bodies[BODYPART_LEFT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_LEG]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(0.18), btScalar(0.65), btScalar(0.))); + m_bodies[BODYPART_RIGHT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_LEG]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(0.18), btScalar(0.2), btScalar(0.))); + m_bodies[BODYPART_RIGHT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_LEG]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(-0.35), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,M_PI_2); + m_bodies[BODYPART_LEFT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_ARM]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(-0.7), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,M_PI_2); + m_bodies[BODYPART_LEFT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_ARM]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(0.35), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,-M_PI_2); + m_bodies[BODYPART_RIGHT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_ARM]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(0.7), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,-M_PI_2); + m_bodies[BODYPART_RIGHT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_ARM]); + + // Setup some damping on the m_bodies + for (int i = 0; i < BODYPART_COUNT; ++i) + { + m_bodies[i]->setDamping(btScalar(0.05), btScalar(0.85)); + m_bodies[i]->setDeactivationTime(btScalar(0.8)); + m_bodies[i]->setSleepingThresholds(btScalar(1.6), btScalar(2.5)); + } + + // Now setup the constraints + btHingeConstraint* hingeC; + btConeTwistConstraint* coneC; + + btTransform localA, localB; + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.15), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.15), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_SPINE], localA, localB); + hingeC->setLimit(btScalar(-M_PI_4), btScalar(M_PI_2)); + m_joints[JOINT_PELVIS_SPINE] = hingeC; + m_ownerWorld->addConstraint(m_joints[JOINT_PELVIS_SPINE], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,M_PI_2); localA.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.30), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_HEAD], localA, localB); + coneC->setLimit(M_PI_4, M_PI_4, M_PI_2); + m_joints[JOINT_SPINE_HEAD] = coneC; + m_ownerWorld->addConstraint(m_joints[JOINT_SPINE_HEAD], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,-M_PI_4*5); localA.setOrigin(scale*btVector3(btScalar(-0.18), btScalar(-0.10), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,-M_PI_4*5); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.225), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_LEFT_UPPER_LEG], localA, localB); + coneC->setLimit(M_PI_4, M_PI_4, 0); + m_joints[JOINT_LEFT_HIP] = coneC; + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_HIP], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.225), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.185), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_LEFT_UPPER_LEG], *m_bodies[BODYPART_LEFT_LOWER_LEG], localA, localB); + hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); + m_joints[JOINT_LEFT_KNEE] = hingeC; + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_KNEE], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,M_PI_4); localA.setOrigin(scale*btVector3(btScalar(0.18), btScalar(-0.10), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_4); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.225), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_RIGHT_UPPER_LEG], localA, localB); + coneC->setLimit(M_PI_4, M_PI_4, 0); + m_joints[JOINT_RIGHT_HIP] = coneC; + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_HIP], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.225), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.185), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_RIGHT_UPPER_LEG], *m_bodies[BODYPART_RIGHT_LOWER_LEG], localA, localB); + hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); + m_joints[JOINT_RIGHT_KNEE] = hingeC; + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_KNEE], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,M_PI); localA.setOrigin(scale*btVector3(btScalar(-0.2), btScalar(0.15), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.18), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_LEFT_UPPER_ARM], localA, localB); + coneC->setLimit(M_PI_2, M_PI_2, 0); + m_joints[JOINT_LEFT_SHOULDER] = coneC; + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_SHOULDER], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.18), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_LEFT_UPPER_ARM], *m_bodies[BODYPART_LEFT_LOWER_ARM], localA, localB); + hingeC->setLimit(btScalar(-M_PI_2), btScalar(0)); + m_joints[JOINT_LEFT_ELBOW] = hingeC; + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_ELBOW], true); + + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,0); localA.setOrigin(scale*btVector3(btScalar(0.2), btScalar(0.15), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.18), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_RIGHT_UPPER_ARM], localA, localB); + coneC->setLimit(M_PI_2, M_PI_2, 0); + m_joints[JOINT_RIGHT_SHOULDER] = coneC; + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_SHOULDER], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.18), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_RIGHT_UPPER_ARM], *m_bodies[BODYPART_RIGHT_LOWER_ARM], localA, localB); + hingeC->setLimit(btScalar(-M_PI_2), btScalar(0)); + m_joints[JOINT_RIGHT_ELBOW] = hingeC; + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_ELBOW], true); + } + + virtual ~RagDoll () + { + int i; + + // Remove all constraints + for ( i = 0; i < JOINT_COUNT; ++i) + { + m_ownerWorld->removeConstraint(m_joints[i]); + delete m_joints[i]; m_joints[i] = 0; + } + + // Remove all bodies and shapes + for ( i = 0; i < BODYPART_COUNT; ++i) + { + m_ownerWorld->removeRigidBody(m_bodies[i]); + + delete m_bodies[i]->getMotionState(); + + delete m_bodies[i]; m_bodies[i] = 0; + delete m_shapes[i]; m_shapes[i] = 0; + } + } +}; + +void BenchmarkDemo::createTest3() +{ + setCameraDistance(btScalar(50.)); + + int size = 16; + + float sizeX = 1.f; + float sizeY = 1.f; + + //int rc=0; + + btScalar scale(3.5); + btVector3 pos(0.0f, sizeY, 0.0f); + while(size) { + float offset = -size * (sizeX * 6.0f) * 0.5f; + for(int i=0;isetLocalScaling(btVector3(scaling,scaling,scaling)); + + for (int i=0;iaddPoint(vtx*btScalar(1./scaling)); + } + + //this will enable polyhedral contact clipping, better quality, slightly slower + //convexHullShape->initializePolyhedralFeatures(); + + btTransform trans; + trans.setIdentity(); + + float mass = 1.f; + btVector3 localInertia(0,0,0); + convexHullShape->calculateLocalInertia(mass,localInertia); + + for(int k=0;k<15;k++) { + for(int j=0;jaddIndexedMesh(part,PHY_SHORT); + + bool useQuantizedAabbCompression = true; + btBvhTriangleMeshShape* trimeshShape = new btBvhTriangleMeshShape(meshInterface,useQuantizedAabbCompression); + btVector3 localInertia(0,0,0); + trans.setOrigin(btVector3(0,-25,0)); + + btRigidBody* body = localCreateRigidBody(0,trans,trimeshShape); + body->setFriction (btScalar(0.9)); + + } + +} + + +void BenchmarkDemo::createTest5() +{ + setCameraDistance(btScalar(250.)); + btVector3 boxSize(1.5f,1.5f,1.5f); + float boxMass = 1.0f; + float sphereRadius = 1.5f; + float sphereMass = 1.0f; + float capsuleHalf = 2.0f; + float capsuleRadius = 1.0f; + float capsuleMass = 1.0f; + + { + int size = 10; + int height = 10; + + const float cubeSize = boxSize[0]; + float spacing = 2.0f; + btVector3 pos(0.0f, 20.0f, 0.0f); + float offset = -size * (cubeSize * 2.0f + spacing) * 0.5f; + + int numBodies = 0; + + for(int k=0;kaddPoint(vtx); + } + + btTransform trans; + trans.setIdentity(); + + float mass = 1.f; + btVector3 localInertia(0,0,0); + convexHullShape->calculateLocalInertia(mass,localInertia); + + + { + int size = 10; + int height = 10; + + const float cubeSize = boxSize[0]; + float spacing = 2.0f; + btVector3 pos(0.0f, 20.0f, 0.0f); + float offset = -size * (cubeSize * 2.0f + spacing) * 0.5f; + + + for(int k=0;kgetNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + } + + //delete collision shapes + for (int j=0;jgetShapeType() != INVALID_SHAPE_PROXYTYPE)); + + //rigidbody is dynamic if and only if mass is non zero, otherwise static + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + shape->calculateLocalInertia(mass,localInertia); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + + btRigidBody* body = new btRigidBody(mass,0,shape,localInertia); + body->setWorldTransform(startTransform); + body->setContactProcessingThreshold(m_defaultContactProcessingThreshold); + m_dynamicsWorld->addRigidBody(body); + + return body; +} +#endif //USE_GRAPHICAL_BENCHMARK + diff --git a/tests/bullet/Demos/HelloWorld/BenchmarkDemo.h b/tests/bullet/Demos/HelloWorld/BenchmarkDemo.h new file mode 100644 index 0000000000000..b9f1052147764 --- /dev/null +++ b/tests/bullet/Demos/HelloWorld/BenchmarkDemo.h @@ -0,0 +1,265 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef BENCHMARK_DEMO_H +#define BENCHMARK_DEMO_H + + +#include "LinearMath/btAlignedObjectArray.h" +#include "LinearMath/btTransform.h" + +class btDynamicsWorld; + +#define NUMRAYS 500 + +class btRigidBody; +class btBroadphaseInterface; +class btCollisionShape; +class btOverlappingPairCache; +class btCollisionDispatcher; +class btConstraintSolver; +struct btCollisionAlgorithmCreateFunc; +class btDefaultCollisionConfiguration; + + +#ifndef USE_GRAPHICAL_BENCHMARK +///empty placeholder +class DemoApplication +{ +protected: + + btDynamicsWorld* m_dynamicsWorld; + btScalar m_defaultContactProcessingThreshold; + +public: + DemoApplication() + :m_defaultContactProcessingThreshold(BT_LARGE_FLOAT) + { + } + virtual void myinit() {} + virtual btDynamicsWorld* getDynamicsWorld() + { + return m_dynamicsWorld; + } + + btScalar getDeltaTimeMicroseconds() + { + return 1.f; + } + + void renderme() {} + void setCameraDistance(btScalar dist){} + void clientResetScene(){} + btRigidBody* localCreateRigidBody(float mass, const btTransform& startTransform,btCollisionShape* shape); + +}; +///BenchmarkDemo is provides several performance tests +#define PlatformDemoApplication DemoApplication +#else //USE_GRAPHICAL_BENCHMARK + +#ifdef _WINDOWS +#include "Win32DemoApplication.h" +#define PlatformDemoApplication Win32DemoApplication +#else +#include "GlutDemoApplication.h" +#define PlatformDemoApplication GlutDemoApplication +#endif + +#endif //USE_GRAPHICAL_BENCHMARK + + +class BenchmarkDemo : public PlatformDemoApplication +{ + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btAlignedObjectArray m_ragdolls; + + btBroadphaseInterface* m_overlappingPairCache; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + int m_benchmark; + + void createTest1(); + void createTest2(); + void createTest3(); + void createTest4(); + void createTest5(); + void createTest6(); + void createTest7(); + + void createWall(const btVector3& offsetPosition,int stackSize,const btVector3& boxSize); + void createPyramid(const btVector3& offsetPosition,int stackSize,const btVector3& boxSize); + void createTowerCircle(const btVector3& offsetPosition,int stackSize,int rotSize,const btVector3& boxSize); + void createLargeMeshBody(); + + + class SpuBatchRaycaster* m_batchRaycaster; + class btThreadSupportInterface* m_batchRaycasterThreadSupport; + + void castRays(); + void initRays(); + + public: + + BenchmarkDemo(int benchmark) + :m_benchmark(benchmark) + { + } + virtual ~BenchmarkDemo() + { + exitPhysics(); + } + void initPhysics(); + + void exitPhysics(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + + + +}; + +class BenchmarkDemo1 : public BenchmarkDemo +{ +public: + BenchmarkDemo1() + :BenchmarkDemo(1) + { + } + + static DemoApplication* Create() + { + BenchmarkDemo1* demo = new BenchmarkDemo1; + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + +class BenchmarkDemo2 : public BenchmarkDemo +{ +public: + BenchmarkDemo2() + :BenchmarkDemo(2) + { + } + + static DemoApplication* Create() + { + BenchmarkDemo2* demo = new BenchmarkDemo2; + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + +class BenchmarkDemo3 : public BenchmarkDemo +{ +public: + BenchmarkDemo3() + :BenchmarkDemo(3) + { + } + + static DemoApplication* Create() + { + BenchmarkDemo3* demo = new BenchmarkDemo3; + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + +class BenchmarkDemo4 : public BenchmarkDemo +{ +public: + BenchmarkDemo4() + :BenchmarkDemo(4) + { + } + + static DemoApplication* Create() + { + BenchmarkDemo4* demo = new BenchmarkDemo4; + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + + +class BenchmarkDemo5 : public BenchmarkDemo +{ +public: + BenchmarkDemo5() + :BenchmarkDemo(5) + { + } + + static DemoApplication* Create() + { + BenchmarkDemo5* demo = new BenchmarkDemo5; + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + + +class BenchmarkDemo6 : public BenchmarkDemo +{ +public: + BenchmarkDemo6() + :BenchmarkDemo(6) + { + } + + static DemoApplication* Create() + { + BenchmarkDemo6* demo = new BenchmarkDemo6; + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + +class BenchmarkDemo7 : public BenchmarkDemo +{ +public: + BenchmarkDemo7() + :BenchmarkDemo(7) + { + } + + static DemoApplication* Create() + { + BenchmarkDemo7* demo = new BenchmarkDemo7; + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + +#endif //BENCHMARK_DEMO_H + diff --git a/tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp b/tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp index 0dc8009ee8bd5..1b26d3a96134f 100644 --- a/tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp +++ b/tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp @@ -15,6 +15,7 @@ subject to the following restrictions: #include "btBulletDynamicsCommon.h" +#include "BenchmarkDemo.h" #include @@ -22,67 +23,10 @@ subject to the following restrictions: /// This is a Hello World program for running a basic Bullet physics simulation -btDiscreteDynamicsWorld* dynamicsWorld; - -extern "C" { -void EMSCRIPTEN_KEEPALIVE addBody(); -} +BenchmarkDemo3 benchmarkDemo3; int main(int argc, char** argv) { - - int i; - - ///collision configuration contains default setup for memory, collision setup. Advanced users can create their own configuration. - btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration(); - - ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) - btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration); - - ///btDbvtBroadphase is a good general purpose broadphase. You can also try out btAxis3Sweep. - btBroadphaseInterface* overlappingPairCache = new btDbvtBroadphase(); - - ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded) - btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver; - - dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,overlappingPairCache,solver,collisionConfiguration); - - dynamicsWorld->setGravity(btVector3(0,-10,0)); - - ///create a few basic rigid bodies - btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.))); - - //keep track of the shapes, we release memory at exit. - //make sure to re-use collision shapes among rigid bodies whenever possible! - btAlignedObjectArray collisionShapes; - - collisionShapes.push_back(groundShape); - - btTransform groundTransform; - groundTransform.setIdentity(); - groundTransform.setOrigin(btVector3(0,-56,0)); - - { - btScalar mass(0.); - - //rigidbody is dynamic if and only if mass is non zero, otherwise static - bool isDynamic = (mass != 0.f); - - btVector3 localInertia(0,0,0); - if (isDynamic) - groundShape->calculateLocalInertia(mass,localInertia); - - //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects - btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform); - btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,groundShape,localInertia); - btRigidBody* body = new btRigidBody(rbInfo); - - //add the body to the dynamics world - dynamicsWorld->addRigidBody(body); - } - - for (int i = 0; i < 20; i++) addBody(); - EM_ASM({ startSimulation(); }); @@ -90,66 +34,20 @@ int main(int argc, char** argv) emscripten_exit_with_live_runtime(); } -/// Do some simulation - extern "C" { -void EMSCRIPTEN_KEEPALIVE addBody() { - //btCollisionShape* colShape = new btBoxShape(btVector3(1,1,1)); - btCollisionShape* colShape = new btSphereShape(btScalar(1.)); - - /// Create Dynamic Objects - btTransform startTransform; - - btScalar mass(1.f); - - btVector3 localInertia(0,0,0); - colShape->calculateLocalInertia(mass,localInertia); - - static int i = 0, j = 0, k = 0, counter = 0; - counter++; - if (counter % 3 == 0) i++; - else if (counter % 3 == 1) j++; - else k++; - - { - //create a dynamic rigidbody - - startTransform.setIdentity(); - - startTransform.setOrigin(btVector3(i*2, 2 + j*2, k*2)); - - //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects - btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); - btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,colShape,localInertia); - btRigidBody* body = new btRigidBody(rbInfo); - - dynamicsWorld->addRigidBody(body); - } -} - void EMSCRIPTEN_KEEPALIVE simulate() { - for (int k = 0; k < 10; k++) { - dynamicsWorld->stepSimulation(1.f/60.f,10); - } - static int i = 0; - if (i++ % 10 == 0) { - std::cout << ">>>>>>>>>>>> objs = " << dynamicsWorld->getNumCollisionObjects() << std::endl; - //print positions of an object - for (int j=dynamicsWorld->getNumCollisionObjects()-1; j>=0 ;j--) - { - btCollisionObject* obj = dynamicsWorld->getCollisionObjectArray()[j]; - btRigidBody* body = btRigidBody::upcast(obj); - if (body && body->getMotionState()) - { - btTransform trans; - body->getMotionState()->getWorldTransform(trans); - std::cout << ">>>>>>>>>>>>>>>>>>>>> world pos = " << float(trans.getOrigin().getX()) << ", " << float(trans.getOrigin().getY()) << ", " << float(trans.getOrigin().getZ()) << std::endl; - } - break; - } + if (i % 10 == 0) std::cout << "frame " << i << "starting" << std::endl; + + benchmarkDemo3.initPhysics(); + for (int i = 0; i < 1; i++) { + benchmarkDemo3.clientMoveAndDisplay(); } + benchmarkDemo3.exitPhysics(); + + if (i % 10 == 0) std::cout << "frame " << i << "complete" << std::endl; + i++; } } diff --git a/tests/bullet/Demos/HelloWorld/Taru.mdl b/tests/bullet/Demos/HelloWorld/Taru.mdl new file mode 100644 index 0000000000000..73f708c822869 --- /dev/null +++ b/tests/bullet/Demos/HelloWorld/Taru.mdl @@ -0,0 +1,49 @@ +#define TaruVtxCount 43 +#define TaruIdxCount 132 + +static float TaruVtx[] = { +1.08664f,-1.99237f,0.0f, +0.768369f,-1.99237f,-0.768369f, +1.28852f,1.34412e-007f,-1.28852f, +1.82224f,1.90735e-007f,0.0f, +0.0f,-1.99237f,-1.08664f, +0.0f,0.0f,-1.82224f, +0.0f,-1.99237f,-1.08664f, +-0.768369f,-1.99237f,-0.768369f, +-1.28852f,1.34412e-007f,-1.28852f, +0.0f,0.0f,-1.82224f, +-1.08664f,-1.99237f,1.82086e-007f, +-1.82224f,1.90735e-007f,1.59305e-007f, +-0.768369f,-1.99237f,0.76837f, +-1.28852f,2.47058e-007f,1.28852f, +1.42495e-007f,-1.99237f,1.08664f, +2.38958e-007f,2.70388e-007f,1.82224f, +0.768369f,-1.99237f,0.768369f, +1.28852f,2.47058e-007f,1.28852f, +0.768369f,1.99237f,-0.768369f, +1.08664f,1.99237f,0.0f, +0.0f,1.99237f,-1.08664f, +-0.768369f,1.99237f,-0.768369f, +0.0f,1.99237f,-1.08664f, +-1.08664f,1.99237f,0.0f, +-0.768369f,1.99237f,0.768369f, +1.42495e-007f,1.99237f,1.08664f, +0.768369f,1.99237f,0.768369f, +1.42495e-007f,-1.99237f,1.08664f, +-0.768369f,-1.99237f,0.76837f, +-1.08664f,-1.99237f,1.82086e-007f, +-0.768369f,-1.99237f,-0.768369f, +0.0f,-1.99237f,-1.08664f, +0.768369f,-1.99237f,-0.768369f, +1.08664f,-1.99237f,0.0f, +0.768369f,-1.99237f,0.768369f, +0.768369f,1.99237f,-0.768369f, +0.0f,1.99237f,-1.08664f, +-0.768369f,1.99237f,-0.768369f, +-1.08664f,1.99237f,0.0f, +-0.768369f,1.99237f,0.768369f, +1.42495e-007f,1.99237f,1.08664f, +0.768369f,1.99237f,0.768369f, +1.08664f,1.99237f,0.0f, +}; + diff --git a/tests/bullet/Demos/HelloWorld/frames.html b/tests/bullet/Demos/HelloWorld/frames.html index d2556e634c3a2..7a194bb8267ee 100644 --- a/tests/bullet/Demos/HelloWorld/frames.html +++ b/tests/bullet/Demos/HelloWorld/frames.html @@ -5,6 +5,6 @@ diff --git a/tests/bullet/Demos/HelloWorld/landscape.mdl b/tests/bullet/Demos/HelloWorld/landscape.mdl new file mode 100644 index 0000000000000..6b879b23eccf1 --- /dev/null +++ b/tests/bullet/Demos/HelloWorld/landscape.mdl @@ -0,0 +1,84369 @@ +#define Landscape02VtxCount 1980 +#define Landscape02IdxCount 11310 +#include "LinearMath/btScalar.h" + +btScalar Landscape02Vtx[] = { +-250.0f,2.99192f,113.281f, +-250.0f,2.18397f,117.188f, +-246.094f,1.62262f,113.281f, +-246.094f,1.51628f,117.188f, +-242.188f,0.847411f,113.281f, +-242.188f,0.628327f,117.188f, +-238.281f,-0.697436f,113.281f, +-238.281f,-0.567933f,117.188f, +-234.375f,-2.65115f,113.281f, +-234.375f,-2.01568f,117.188f, +-230.469f,-3.82201f,113.281f, +-230.469f,-3.41089f,117.188f, +-226.563f,-3.99138f,113.281f, +-226.563f,-3.82758f,117.188f, +-222.656f,-5.51066f,113.281f, +-222.656f,-5.01586f,117.188f, +-218.75f,-5.62904f,113.281f, +-218.75f,-4.74822f,117.188f, +-214.844f,-4.90514f,113.281f, +-214.844f,-3.30853f,117.188f, +-210.938f,-2.9572f,113.281f, +-210.938f,-2.32499f,117.188f, +-207.031f,-2.44242f,113.281f, +-207.031f,-1.71509f,117.188f, +-203.125f,-1.5086f,113.281f, +-203.125f,-1.19203f,117.188f, +-199.219f,-0.130838f,113.281f, +-199.219f,0.219498f,117.188f, +-195.313f,0.985417f,113.281f, +-195.313f,1.66304f,117.188f, +-191.406f,3.20064f,113.281f, +-191.406f,4.35105f,117.188f, +-187.5f,4.6779f,113.281f, +-187.5f,6.33228f,117.188f, +-183.594f,6.16902f,113.281f, +-183.594f,8.00972f,117.188f, +-179.688f,8.18835f,113.281f, +-179.688f,9.71486f,117.188f, +-175.781f,9.35082f,113.281f, +-175.781f,10.7727f,117.188f, +-171.875f,9.50665f,113.281f, +-171.875f,11.358f,117.188f, +-167.969f,12.1301f,113.281f, +-167.969f,12.5239f,117.188f, +-164.063f,14.8728f,113.281f, +-164.063f,14.6278f,117.188f, +-160.156f,16.3761f,113.281f, +-160.156f,17.2069f,117.188f, +-156.25f,18.5367f,113.281f, +-156.25f,19.9779f,117.188f, +-152.344f,22.4636f,113.281f, +-152.344f,23.4607f,117.188f, +-148.438f,26.1459f,113.281f, +-148.438f,26.6108f,117.188f, +-144.531f,28.6071f,113.281f, +-144.531f,28.4635f,117.188f, +-140.625f,30.2795f,113.281f, +-140.625f,29.7705f,117.188f, +-136.719f,32.2229f,113.281f, +-136.719f,31.0684f,117.188f, +-132.813f,32.8919f,113.281f, +-132.813f,31.8395f,117.188f, +-128.906f,33.5143f,113.281f, +-128.906f,32.1658f,117.188f, +-125.0f,34.6963f,113.281f, +-125.0f,34.7478f,117.188f, +-121.094f,37.3995f,113.281f, +-121.094f,36.0624f,117.188f, +-117.188f,38.0464f,113.281f, +-117.188f,37.2702f,117.188f, +-113.281f,37.8506f,113.281f, +-113.281f,37.3474f,117.188f, +-109.375f,37.8984f,113.281f, +-109.375f,37.242f,117.188f, +-105.469f,36.0464f,113.281f, +-105.469f,36.1544f,117.188f, +-101.563f,34.1136f,113.281f, +-101.563f,33.403f,117.188f, +-97.6563f,32.0925f,113.281f, +-97.6563f,31.294f,117.188f, +-93.75f,29.8306f,113.281f, +-93.75f,29.4961f,117.188f, +-89.8438f,30.1499f,113.281f, +-89.8438f,29.0556f,117.188f, +-85.9375f,28.8377f,113.281f, +-85.9375f,28.2757f,117.188f, +-82.0313f,26.9726f,113.281f, +-82.0313f,26.6322f,117.188f, +-78.125f,25.4597f,113.281f, +-78.125f,24.8286f,117.188f, +-74.2188f,23.3572f,113.281f, +-74.2188f,22.7019f,117.188f, +-70.3125f,21.1615f,113.281f, +-70.3125f,20.4725f,117.188f, +-66.4063f,18.1212f,113.281f, +-66.4063f,17.984f,117.188f, +-62.5f,16.3411f,113.281f, +-62.5f,16.3033f,117.188f, +-58.5938f,15.075f,113.281f, +-58.5938f,14.2087f,117.188f, +-54.6875f,14.2482f,113.281f, +-54.6875f,12.8086f,117.188f, +-50.7813f,13.7945f,113.281f, +-50.7813f,12.5463f,117.188f, +-46.875f,12.7086f,113.281f, +-46.875f,12.1781f,117.188f, +-42.9688f,10.5756f,113.281f, +-42.9688f,11.1391f,117.188f, +-39.0625f,9.99343f,113.281f, +-39.0625f,10.4623f,117.188f, +-35.1563f,11.0936f,113.281f, +-35.1563f,11.0528f,117.188f, +-31.25f,11.9553f,113.281f, +-31.25f,11.454f,117.188f, +-27.3438f,11.5734f,113.281f, +-27.3438f,10.5577f,117.188f, +-23.4375f,11.0397f,113.281f, +-23.4375f,10.6328f,117.188f, +-19.5313f,12.5166f,113.281f, +-19.5313f,12.5569f,117.188f, +-15.625f,13.856f,113.281f, +-15.625f,13.5389f,117.188f, +-11.7188f,14.525f,113.281f, +-11.7188f,14.3792f,117.188f, +-7.8125f,14.7554f,113.281f, +-7.8125f,15.4809f,117.188f, +-3.90625f,15.9168f,113.281f, +-3.90625f,16.1008f,117.188f, +0.0f,17.0728f,113.281f, +0.0f,17.3675f,117.188f, +3.90625f,18.3498f,113.281f, +3.90625f,18.919f,117.188f, +-250.0f,4.66213f,109.375f, +-246.094f,2.25542f,109.375f, +-242.188f,0.972654f,109.375f, +-238.281f,-1.95429f,109.375f, +-234.375f,-2.74128f,109.375f, +-230.469f,-3.62525f,109.375f, +-226.563f,-4.55305f,109.375f, +-222.656f,-6.4124f,109.375f, +-218.75f,-6.73329f,109.375f, +-214.844f,-5.91703f,109.375f, +-210.938f,-4.73996f,109.375f, +-207.031f,-3.31105f,109.375f, +-203.125f,-2.06764f,109.375f, +-199.219f,-0.969242f,109.375f, +-195.313f,0.268778f,109.375f, +-191.406f,1.94799f,109.375f, +-187.5f,2.80754f,109.375f, +-183.594f,4.22131f,109.375f, +-179.688f,5.20723f,109.375f, +-175.781f,7.47197f,109.375f, +-171.875f,9.45267f,109.375f, +-167.969f,12.6425f,109.375f, +-164.063f,14.9382f,109.375f, +-160.156f,16.7967f,109.375f, +-156.25f,19.5153f,109.375f, +-152.344f,21.4005f,109.375f, +-148.438f,25.1259f,109.375f, +-144.531f,28.4102f,109.375f, +-140.625f,30.7572f,109.375f, +-136.719f,33.0194f,109.375f, +-132.813f,33.072f,109.375f, +-128.906f,33.1358f,109.375f, +-125.0f,35.0549f,109.375f, +-121.094f,36.4427f,109.375f, +-117.188f,38.3265f,109.375f, +-113.281f,38.5339f,109.375f, +-109.375f,37.0126f,109.375f, +-105.469f,34.9063f,109.375f, +-101.563f,32.9886f,109.375f, +-97.6563f,30.8964f,109.375f, +-93.75f,30.5048f,109.375f, +-89.8438f,30.4943f,109.375f, +-85.9375f,28.8782f,109.375f, +-82.0313f,28.1966f,109.375f, +-78.125f,25.9164f,109.375f, +-74.2188f,23.3428f,109.375f, +-70.3125f,20.9839f,109.375f, +-66.4063f,18.3885f,109.375f, +-62.5f,16.9034f,109.375f, +-58.5938f,15.2602f,109.375f, +-54.6875f,14.3223f,109.375f, +-50.7813f,13.3767f,109.375f, +-46.875f,12.5798f,109.375f, +-42.9688f,11.3276f,109.375f, +-39.0625f,11.0169f,109.375f, +-35.1563f,11.7482f,109.375f, +-31.25f,12.5037f,109.375f, +-27.3438f,12.3832f,109.375f, +-23.4375f,12.3097f,109.375f, +-19.5313f,12.6165f,109.375f, +-15.625f,13.7744f,109.375f, +-11.7188f,14.363f,109.375f, +-7.8125f,14.828f,109.375f, +-3.90625f,15.599f,109.375f, +0.0f,16.3885f,109.375f, +3.90625f,18.0017f,109.375f, +-250.0f,5.23892f,105.469f, +-246.094f,2.90481f,105.469f, +-242.188f,0.264647f,105.469f, +-238.281f,-0.288927f,105.469f, +-234.375f,-0.910295f,105.469f, +-230.469f,-2.20742f,105.469f, +-226.563f,-3.6968f,105.469f, +-222.656f,-5.2145f,105.469f, +-218.75f,-6.07198f,105.469f, +-214.844f,-5.42535f,105.469f, +-210.938f,-4.82182f,105.469f, +-207.031f,-3.22017f,105.469f, +-203.125f,-2.28037f,105.469f, +-199.219f,-1.51966f,105.469f, +-195.313f,-0.0464115f,105.469f, +-191.406f,1.73523f,105.469f, +-187.5f,2.72489f,105.469f, +-183.594f,4.39996f,105.469f, +-179.688f,5.48007f,105.469f, +-175.781f,7.27769f,105.469f, +-171.875f,10.1115f,105.469f, +-167.969f,13.0557f,105.469f, +-164.063f,15.7105f,105.469f, +-160.156f,17.8448f,105.469f, +-156.25f,19.8398f,105.469f, +-152.344f,21.6672f,105.469f, +-148.438f,24.1475f,105.469f, +-144.531f,28.4217f,105.469f, +-140.625f,31.6921f,105.469f, +-136.719f,34.3814f,105.469f, +-132.813f,34.9011f,105.469f, +-128.906f,33.8056f,105.469f, +-125.0f,34.3226f,105.469f, +-121.094f,35.6061f,105.469f, +-117.188f,37.9636f,105.469f, +-113.281f,38.6673f,105.469f, +-109.375f,36.8831f,105.469f, +-105.469f,34.5846f,105.469f, +-101.563f,32.2221f,105.469f, +-97.6563f,30.3826f,105.469f, +-93.75f,30.4243f,105.469f, +-89.8438f,30.7761f,105.469f, +-85.9375f,29.8335f,105.469f, +-82.0313f,28.0208f,105.469f, +-78.125f,25.7215f,105.469f, +-74.2188f,22.9019f,105.469f, +-70.3125f,20.9096f,105.469f, +-66.4063f,18.2558f,105.469f, +-62.5f,16.689f,105.469f, +-58.5938f,15.8032f,105.469f, +-54.6875f,14.8311f,105.469f, +-50.7813f,13.7628f,105.469f, +-46.875f,13.0048f,105.469f, +-42.9688f,11.9222f,105.469f, +-39.0625f,12.021f,105.469f, +-35.1563f,12.2727f,105.469f, +-31.25f,12.6336f,105.469f, +-27.3438f,12.6865f,105.469f, +-23.4375f,12.3758f,105.469f, +-19.5313f,13.0149f,105.469f, +-15.625f,14.0448f,105.469f, +-11.7188f,14.6064f,105.469f, +-7.8125f,15.1105f,105.469f, +-3.90625f,15.8367f,105.469f, +0.0f,16.822f,105.469f, +3.90625f,17.9608f,105.469f, +-250.0f,4.27755f,101.563f, +-246.094f,2.84639f,101.563f, +-242.188f,2.00001f,101.563f, +-238.281f,1.59426f,101.563f, +-234.375f,0.494548f,101.563f, +-230.469f,-1.78619f,101.563f, +-226.563f,-2.8668f,101.563f, +-222.656f,-5.00406f,101.563f, +-218.75f,-6.01721f,101.563f, +-214.844f,-5.29731f,101.563f, +-210.938f,-4.08939f,101.563f, +-207.031f,-3.76734f,101.563f, +-203.125f,-2.53974f,101.563f, +-199.219f,-1.06933f,101.563f, +-195.313f,-0.447271f,101.563f, +-191.406f,1.52362f,101.563f, +-187.5f,3.40783f,101.563f, +-183.594f,4.48418f,101.563f, +-179.688f,6.791f,101.563f, +-175.781f,8.68642f,101.563f, +-171.875f,11.1511f,101.563f, +-167.969f,14.4536f,101.563f, +-164.063f,17.5923f,101.563f, +-160.156f,19.4108f,101.563f, +-156.25f,20.7669f,101.563f, +-152.344f,22.2683f,101.563f, +-148.438f,24.0251f,101.563f, +-144.531f,27.7431f,101.563f, +-140.625f,31.4827f,101.563f, +-136.719f,34.3945f,101.563f, +-132.813f,35.3451f,101.563f, +-128.906f,34.9912f,101.563f, +-125.0f,34.2253f,101.563f, +-121.094f,35.1765f,101.563f, +-117.188f,37.3095f,101.563f, +-113.281f,37.7256f,101.563f, +-109.375f,36.2331f,101.563f, +-105.469f,34.435f,101.563f, +-101.563f,32.1021f,101.563f, +-97.6563f,31.0728f,101.563f, +-93.75f,30.7462f,101.563f, +-89.8438f,30.8125f,101.563f, +-85.9375f,29.6802f,101.563f, +-82.0313f,27.3023f,101.563f, +-78.125f,25.1113f,101.563f, +-74.2188f,22.6475f,101.563f, +-70.3125f,20.1315f,101.563f, +-66.4063f,18.0132f,101.563f, +-62.5f,17.1414f,101.563f, +-58.5938f,16.7884f,101.563f, +-54.6875f,15.7107f,101.563f, +-50.7813f,14.6855f,101.563f, +-46.875f,13.3626f,101.563f, +-42.9688f,11.6073f,101.563f, +-39.0625f,11.3359f,101.563f, +-35.1563f,12.4227f,101.563f, +-31.25f,13.068f,101.563f, +-27.3438f,12.4485f,101.563f, +-23.4375f,11.8491f,101.563f, +-19.5313f,13.6925f,101.563f, +-15.625f,14.7114f,101.563f, +-11.7188f,14.963f,101.563f, +-7.8125f,15.0631f,101.563f, +-3.90625f,16.1214f,101.563f, +0.0f,17.0818f,101.563f, +3.90625f,17.7074f,101.563f, +-250.0f,4.24758f,97.6563f, +-246.094f,3.92716f,97.6563f, +-242.188f,3.12473f,97.6563f, +-238.281f,2.07357f,97.6563f, +-234.375f,0.407895f,97.6563f, +-230.469f,-0.904646f,97.6563f, +-226.563f,-2.62182f,97.6563f, +-222.656f,-3.89204f,97.6563f, +-218.75f,-5.61944f,97.6563f, +-214.844f,-4.00077f,97.6563f, +-210.938f,-2.40041f,97.6563f, +-207.031f,-2.40061f,97.6563f, +-203.125f,-1.96286f,97.6563f, +-199.219f,-1.48062f,97.6563f, +-195.313f,-0.101653f,97.6563f, +-191.406f,1.73583f,97.6563f, +-187.5f,3.67572f,97.6563f, +-183.594f,5.12213f,97.6563f, +-179.688f,7.63637f,97.6563f, +-175.781f,10.1724f,97.6563f, +-171.875f,12.2812f,97.6563f, +-167.969f,15.2851f,97.6563f, +-164.063f,18.2233f,97.6563f, +-160.156f,20.4971f,97.6563f, +-156.25f,21.878f,97.6563f, +-152.344f,23.2306f,97.6563f, +-148.438f,24.2686f,97.6563f, +-144.531f,28.1874f,97.6563f, +-140.625f,31.2597f,97.6563f, +-136.719f,33.3133f,97.6563f, +-132.813f,35.319f,97.6563f, +-128.906f,35.1009f,97.6563f, +-125.0f,34.8265f,97.6563f, +-121.094f,34.2935f,97.6563f, +-117.188f,36.4908f,97.6563f, +-113.281f,37.1964f,97.6563f, +-109.375f,36.1354f,97.6563f, +-105.469f,34.3852f,97.6563f, +-101.563f,30.8829f,97.6563f, +-97.6563f,30.1091f,97.6563f, +-93.75f,30.9329f,97.6563f, +-89.8438f,30.8751f,97.6563f, +-85.9375f,29.018f,97.6563f, +-82.0313f,27.3105f,97.6563f, +-78.125f,25.0087f,97.6563f, +-74.2188f,21.6466f,97.6563f, +-70.3125f,18.5043f,97.6563f, +-66.4063f,18.66f,97.6563f, +-62.5f,18.1592f,97.6563f, +-58.5938f,17.521f,97.6563f, +-54.6875f,16.3389f,97.6563f, +-50.7813f,14.8664f,97.6563f, +-46.875f,13.5991f,97.6563f, +-42.9688f,11.873f,97.6563f, +-39.0625f,11.498f,97.6563f, +-35.1563f,11.5171f,97.6563f, +-31.25f,12.5588f,97.6563f, +-27.3438f,12.2172f,97.6563f, +-23.4375f,11.2491f,97.6563f, +-19.5313f,13.2373f,97.6563f, +-15.625f,13.5683f,97.6563f, +-11.7188f,14.0875f,97.6563f, +-7.8125f,14.6591f,97.6563f, +-3.90625f,15.1275f,97.6563f, +0.0f,15.8243f,97.6563f, +3.90625f,18.0176f,97.6563f, +-250.0f,4.93619f,93.75f, +-246.094f,3.50077f,93.75f, +-242.188f,2.88532f,93.75f, +-238.281f,2.19691f,93.75f, +-234.375f,1.45343f,93.75f, +-230.469f,-0.151238f,93.75f, +-226.563f,-1.0856f,93.75f, +-222.656f,-2.29205f,93.75f, +-218.75f,-3.83678f,93.75f, +-214.844f,-2.73856f,93.75f, +-210.938f,-2.19574f,93.75f, +-207.031f,-0.222008f,93.75f, +-203.125f,-0.117961f,93.75f, +-199.219f,-0.17607f,93.75f, +-195.313f,1.32212f,93.75f, +-191.406f,2.64292f,93.75f, +-187.5f,3.72678f,93.75f, +-183.594f,5.78729f,93.75f, +-179.688f,9.09616f,93.75f, +-175.781f,11.4833f,93.75f, +-171.875f,13.1923f,93.75f, +-167.969f,15.68f,93.75f, +-164.063f,17.9844f,93.75f, +-160.156f,20.7688f,93.75f, +-156.25f,23.4925f,93.75f, +-152.344f,25.2252f,93.75f, +-148.438f,25.9373f,93.75f, +-144.531f,28.1941f,93.75f, +-140.625f,31.9896f,93.75f, +-136.719f,33.5688f,93.75f, +-132.813f,34.7177f,93.75f, +-128.906f,35.1459f,93.75f, +-125.0f,34.9785f,93.75f, +-121.094f,34.3971f,93.75f, +-117.188f,35.2455f,93.75f, +-113.281f,36.0209f,93.75f, +-109.375f,35.244f,93.75f, +-105.469f,33.4542f,93.75f, +-101.563f,30.3707f,93.75f, +-97.6563f,30.709f,93.75f, +-93.75f,31.2489f,93.75f, +-89.8438f,30.5476f,93.75f, +-85.9375f,28.5982f,93.75f, +-82.0313f,26.6838f,93.75f, +-78.125f,24.1646f,93.75f, +-74.2188f,21.261f,93.75f, +-70.3125f,19.8206f,93.75f, +-66.4063f,19.4952f,93.75f, +-62.5f,18.3276f,93.75f, +-58.5938f,18.1028f,93.75f, +-54.6875f,17.0878f,93.75f, +-50.7813f,15.0144f,93.75f, +-46.875f,13.5565f,93.75f, +-42.9688f,11.0211f,93.75f, +-39.0625f,11.1986f,93.75f, +-35.1563f,10.4097f,93.75f, +-31.25f,11.2207f,93.75f, +-27.3438f,11.4539f,93.75f, +-23.4375f,11.4014f,93.75f, +-19.5313f,12.2344f,93.75f, +-15.625f,13.5348f,93.75f, +-11.7188f,14.2772f,93.75f, +-7.8125f,14.0447f,93.75f, +-3.90625f,14.1587f,93.75f, +0.0f,15.3266f,93.75f, +3.90625f,17.1671f,93.75f, +-250.0f,5.40499f,89.8438f, +-246.094f,3.9236f,89.8438f, +-242.188f,2.78029f,89.8438f, +-238.281f,2.337f,89.8438f, +-234.375f,1.45614f,89.8438f, +-230.469f,0.487402f,89.8438f, +-226.563f,0.814658f,89.8438f, +-222.656f,-0.244101f,89.8438f, +-218.75f,-2.09422f,89.8438f, +-214.844f,-1.48441f,89.8438f, +-210.938f,-0.695794f,89.8438f, +-207.031f,0.742314f,89.8438f, +-203.125f,1.30594f,89.8438f, +-199.219f,1.49011f,89.8438f, +-195.313f,2.5687f,89.8438f, +-191.406f,3.72318f,89.8438f, +-187.5f,4.658f,89.8438f, +-183.594f,7.20615f,89.8438f, +-179.688f,9.85211f,89.8438f, +-175.781f,12.8482f,89.8438f, +-171.875f,14.6361f,89.8438f, +-167.969f,16.6036f,89.8438f, +-164.063f,19.7308f,89.8438f, +-160.156f,22.7068f,89.8438f, +-156.25f,24.421f,89.8438f, +-152.344f,25.8961f,89.8438f, +-148.438f,27.1249f,89.8438f, +-144.531f,29.0138f,89.8438f, +-140.625f,31.6384f,89.8438f, +-136.719f,33.9142f,89.8438f, +-132.813f,34.3317f,89.8438f, +-128.906f,36.0856f,89.8438f, +-125.0f,35.5134f,89.8438f, +-121.094f,34.7035f,89.8438f, +-117.188f,33.6847f,89.8438f, +-113.281f,34.2624f,89.8438f, +-109.375f,34.2147f,89.8438f, +-105.469f,32.2925f,89.8438f, +-101.563f,30.4889f,89.8438f, +-97.6563f,30.8562f,89.8438f, +-93.75f,31.4717f,89.8438f, +-89.8438f,30.2623f,89.8438f, +-85.9375f,28.4623f,89.8438f, +-82.0313f,26.6117f,89.8438f, +-78.125f,24.1755f,89.8438f, +-74.2188f,22.4752f,89.8438f, +-70.3125f,20.3246f,89.8438f, +-66.4063f,19.488f,89.8438f, +-62.5f,18.6447f,89.8438f, +-58.5938f,17.8933f,89.8438f, +-54.6875f,16.177f,89.8438f, +-50.7813f,15.2537f,89.8438f, +-46.875f,13.5232f,89.8438f, +-42.9688f,11.842f,89.8438f, +-39.0625f,10.223f,89.8438f, +-35.1563f,9.54441f,89.8438f, +-31.25f,9.73488f,89.8438f, +-27.3438f,10.7057f,89.8438f, +-23.4375f,11.9185f,89.8438f, +-19.5313f,13.2106f,89.8438f, +-15.625f,13.0807f,89.8438f, +-11.7188f,12.8112f,89.8438f, +-7.8125f,12.7972f,89.8438f, +-3.90625f,14.1049f,89.8438f, +0.0f,14.9674f,89.8438f, +3.90625f,15.6427f,89.8438f, +-250.0f,6.21462f,85.9375f, +-246.094f,4.66025f,85.9375f, +-242.188f,3.36279f,85.9375f, +-238.281f,1.97426f,85.9375f, +-234.375f,0.590897f,85.9375f, +-230.469f,2.01222f,85.9375f, +-226.563f,2.15192f,85.9375f, +-222.656f,0.78006f,85.9375f, +-218.75f,-0.424968f,85.9375f, +-214.844f,-0.512869f,85.9375f, +-210.938f,0.00319427f,85.9375f, +-207.031f,1.05715f,85.9375f, +-203.125f,2.11926f,85.9375f, +-199.219f,2.48862f,85.9375f, +-195.313f,3.89944f,85.9375f, +-191.406f,5.71899f,85.9375f, +-187.5f,6.41674f,85.9375f, +-183.594f,7.94295f,85.9375f, +-179.688f,10.9562f,85.9375f, +-175.781f,13.1951f,85.9375f, +-171.875f,15.7827f,85.9375f, +-167.969f,17.6951f,85.9375f, +-164.063f,20.2261f,85.9375f, +-160.156f,22.5211f,85.9375f, +-156.25f,24.8103f,85.9375f, +-152.344f,26.6666f,85.9375f, +-148.438f,27.7052f,85.9375f, +-144.531f,29.2234f,85.9375f, +-140.625f,31.4629f,85.9375f, +-136.719f,34.0955f,85.9375f, +-132.813f,34.7124f,85.9375f, +-128.906f,36.1712f,85.9375f, +-125.0f,36.4743f,85.9375f, +-121.094f,35.3967f,85.9375f, +-117.188f,34.3505f,85.9375f, +-113.281f,33.5175f,85.9375f, +-109.375f,32.9976f,85.9375f, +-105.469f,31.7882f,85.9375f, +-101.563f,31.1746f,85.9375f, +-97.6563f,31.0271f,85.9375f, +-93.75f,31.5303f,85.9375f, +-89.8438f,30.8744f,85.9375f, +-85.9375f,28.1434f,85.9375f, +-82.0313f,25.9196f,85.9375f, +-78.125f,24.4044f,85.9375f, +-74.2188f,21.9984f,85.9375f, +-70.3125f,20.0411f,85.9375f, +-66.4063f,19.9449f,85.9375f, +-62.5f,18.3893f,85.9375f, +-58.5938f,16.9846f,85.9375f, +-54.6875f,15.6155f,85.9375f, +-50.7813f,14.6152f,85.9375f, +-46.875f,12.7358f,85.9375f, +-42.9688f,12.1599f,85.9375f, +-39.0625f,10.1045f,85.9375f, +-35.1563f,9.61416f,85.9375f, +-31.25f,10.0784f,85.9375f, +-27.3438f,10.2188f,85.9375f, +-23.4375f,11.574f,85.9375f, +-19.5313f,11.8712f,85.9375f, +-15.625f,11.9109f,85.9375f, +-11.7188f,11.509f,85.9375f, +-7.8125f,13.9979f,85.9375f, +-3.90625f,14.8453f,85.9375f, +0.0f,14.7941f,85.9375f, +3.90625f,15.5916f,85.9375f, +-250.0f,6.94324f,82.0313f, +-246.094f,4.77131f,82.0313f, +-242.188f,3.62143f,82.0313f, +-238.281f,2.50324f,82.0313f, +-234.375f,1.40345f,82.0313f, +-230.469f,2.05881f,82.0313f, +-226.563f,2.41769f,82.0313f, +-222.656f,1.23736f,82.0313f, +-218.75f,1.59545f,82.0313f, +-214.844f,1.25313f,82.0313f, +-210.938f,1.53594f,82.0313f, +-207.031f,2.33073f,82.0313f, +-203.125f,2.59696f,82.0313f, +-199.219f,4.25487f,82.0313f, +-195.313f,5.86136f,82.0313f, +-191.406f,7.54631f,82.0313f, +-187.5f,8.7315f,82.0313f, +-183.594f,9.65737f,82.0313f, +-179.688f,11.5328f,82.0313f, +-175.781f,14.3069f,82.0313f, +-171.875f,16.2889f,82.0313f, +-167.969f,17.6379f,82.0313f, +-164.063f,20.4422f,82.0313f, +-160.156f,22.9557f,82.0313f, +-156.25f,25.0731f,82.0313f, +-152.344f,27.3881f,82.0313f, +-148.438f,28.7955f,82.0313f, +-144.531f,30.2575f,82.0313f, +-140.625f,32.5888f,82.0313f, +-136.719f,33.9884f,82.0313f, +-132.813f,34.4838f,82.0313f, +-128.906f,35.7672f,82.0313f, +-125.0f,36.1002f,82.0313f, +-121.094f,35.9318f,82.0313f, +-117.188f,34.9715f,82.0313f, +-113.281f,33.3187f,82.0313f, +-109.375f,31.9477f,82.0313f, +-105.469f,31.4437f,82.0313f, +-101.563f,31.2817f,82.0313f, +-97.6563f,32.08f,82.0313f, +-93.75f,31.4037f,82.0313f, +-89.8438f,30.2769f,82.0313f, +-85.9375f,28.1374f,82.0313f, +-82.0313f,25.4814f,82.0313f, +-78.125f,24.1831f,82.0313f, +-74.2188f,22.6148f,82.0313f, +-70.3125f,19.2585f,82.0313f, +-66.4063f,18.6785f,82.0313f, +-62.5f,17.7889f,82.0313f, +-58.5938f,16.5855f,82.0313f, +-54.6875f,14.6918f,82.0313f, +-50.7813f,12.9532f,82.0313f, +-46.875f,12.1502f,82.0313f, +-42.9688f,11.3533f,82.0313f, +-39.0625f,9.8302f,82.0313f, +-35.1563f,9.95311f,82.0313f, +-31.25f,10.7631f,82.0313f, +-27.3438f,10.2187f,82.0313f, +-23.4375f,10.1072f,82.0313f, +-19.5313f,11.299f,82.0313f, +-15.625f,11.5563f,82.0313f, +-11.7188f,13.9188f,82.0313f, +-7.8125f,15.247f,82.0313f, +-3.90625f,15.6866f,82.0313f, +0.0f,15.9694f,82.0313f, +3.90625f,16.9644f,82.0313f, +-250.0f,6.39735f,78.125f, +-246.094f,5.09353f,78.125f, +-242.188f,4.53503f,78.125f, +-238.281f,3.72522f,78.125f, +-234.375f,3.02648f,78.125f, +-230.469f,3.02057f,78.125f, +-226.563f,3.8807f,78.125f, +-222.656f,4.47382f,78.125f, +-218.75f,3.84005f,78.125f, +-214.844f,2.7347f,78.125f, +-210.938f,4.55018f,78.125f, +-207.031f,5.04579f,78.125f, +-203.125f,4.45937f,78.125f, +-199.219f,5.32656f,78.125f, +-195.313f,7.13791f,78.125f, +-191.406f,8.89822f,78.125f, +-187.5f,10.3911f,78.125f, +-183.594f,11.3679f,78.125f, +-179.688f,13.4068f,78.125f, +-175.781f,16.3393f,78.125f, +-171.875f,17.801f,78.125f, +-167.969f,19.0455f,78.125f, +-164.063f,21.4178f,78.125f, +-160.156f,23.555f,78.125f, +-156.25f,25.3953f,78.125f, +-152.344f,26.9657f,78.125f, +-148.438f,28.8194f,78.125f, +-144.531f,31.456f,78.125f, +-140.625f,33.3499f,78.125f, +-136.719f,34.2296f,78.125f, +-132.813f,34.5964f,78.125f, +-128.906f,35.7399f,78.125f, +-125.0f,35.4576f,78.125f, +-121.094f,35.7986f,78.125f, +-117.188f,34.4641f,78.125f, +-113.281f,33.925f,78.125f, +-109.375f,32.0574f,78.125f, +-105.469f,31.6743f,78.125f, +-101.563f,31.65f,78.125f, +-97.6563f,31.9461f,78.125f, +-93.75f,31.2261f,78.125f, +-89.8438f,30.4701f,78.125f, +-85.9375f,27.7569f,78.125f, +-82.0313f,25.4553f,78.125f, +-78.125f,23.3917f,78.125f, +-74.2188f,21.6944f,78.125f, +-70.3125f,18.6818f,78.125f, +-66.4063f,17.4066f,78.125f, +-62.5f,17.1317f,78.125f, +-58.5938f,16.5093f,78.125f, +-54.6875f,14.9512f,78.125f, +-50.7813f,13.228f,78.125f, +-46.875f,11.4638f,78.125f, +-42.9688f,10.3877f,78.125f, +-39.0625f,9.7131f,78.125f, +-35.1563f,10.0477f,78.125f, +-31.25f,10.325f,78.125f, +-27.3438f,10.317f,78.125f, +-23.4375f,10.9076f,78.125f, +-19.5313f,11.7808f,78.125f, +-15.625f,14.1905f,78.125f, +-11.7188f,15.6035f,78.125f, +-7.8125f,16.0979f,78.125f, +-3.90625f,16.6425f,78.125f, +0.0f,17.2837f,78.125f, +3.90625f,18.8244f,78.125f, +-250.0f,6.03592f,74.2188f, +-246.094f,5.17606f,74.2188f, +-242.188f,3.7036f,74.2188f, +-238.281f,3.69f,74.2188f, +-234.375f,4.60611f,74.2188f, +-230.469f,4.52682f,74.2188f, +-226.563f,5.59937f,74.2188f, +-222.656f,6.25837f,74.2188f, +-218.75f,5.11517f,74.2188f, +-214.844f,4.67242f,74.2188f, +-210.938f,5.76173f,74.2188f, +-207.031f,6.80461f,74.2188f, +-203.125f,6.95083f,74.2188f, +-199.219f,7.35893f,74.2188f, +-195.313f,8.63949f,74.2188f, +-191.406f,10.4144f,74.2188f, +-187.5f,11.8105f,74.2188f, +-183.594f,13.4583f,74.2188f, +-179.688f,15.5665f,74.2188f, +-175.781f,18.2568f,74.2188f, +-171.875f,19.1732f,74.2188f, +-167.969f,21.3098f,74.2188f, +-164.063f,23.6359f,74.2188f, +-160.156f,25.3154f,74.2188f, +-156.25f,27.6289f,74.2188f, +-152.344f,28.8953f,74.2188f, +-148.438f,30.5098f,74.2188f, +-144.531f,32.3942f,74.2188f, +-140.625f,33.3325f,74.2188f, +-136.719f,33.8009f,74.2188f, +-132.813f,35.0803f,74.2188f, +-128.906f,34.737f,74.2188f, +-125.0f,34.3656f,74.2188f, +-121.094f,34.2107f,74.2188f, +-117.188f,33.1645f,74.2188f, +-113.281f,32.0615f,74.2188f, +-109.375f,32.0827f,74.2188f, +-105.469f,32.4658f,74.2188f, +-101.563f,31.6315f,74.2188f, +-97.6563f,30.9698f,74.2188f, +-93.75f,30.6464f,74.2188f, +-89.8438f,29.9645f,74.2188f, +-85.9375f,27.4393f,74.2188f, +-82.0313f,25.2807f,74.2188f, +-78.125f,23.57f,74.2188f, +-74.2188f,20.653f,74.2188f, +-70.3125f,18.1395f,74.2188f, +-66.4063f,17.6585f,74.2188f, +-62.5f,17.2798f,74.2188f, +-58.5938f,16.6041f,74.2188f, +-54.6875f,14.6913f,74.2188f, +-50.7813f,13.1416f,74.2188f, +-46.875f,10.9374f,74.2188f, +-42.9688f,9.39485f,74.2188f, +-39.0625f,9.21956f,74.2188f, +-35.1563f,9.74875f,74.2188f, +-31.25f,10.3932f,74.2188f, +-27.3438f,10.7996f,74.2188f, +-23.4375f,11.5538f,74.2188f, +-19.5313f,13.5418f,74.2188f, +-15.625f,15.6336f,74.2188f, +-11.7188f,16.3846f,74.2188f, +-7.8125f,17.738f,74.2188f, +-3.90625f,17.98f,74.2188f, +0.0f,19.1669f,74.2188f, +3.90625f,20.6829f,74.2188f, +-250.0f,5.45149f,70.3125f, +-246.094f,4.83779f,70.3125f, +-242.188f,3.60093f,70.3125f, +-238.281f,3.26469f,70.3125f, +-234.375f,4.06145f,70.3125f, +-230.469f,5.31565f,70.3125f, +-226.563f,6.65809f,70.3125f, +-222.656f,6.70538f,70.3125f, +-218.75f,6.93258f,70.3125f, +-214.844f,6.84841f,70.3125f, +-210.938f,6.9662f,70.3125f, +-207.031f,7.74003f,70.3125f, +-203.125f,8.68749f,70.3125f, +-199.219f,9.06225f,70.3125f, +-195.313f,10.0803f,70.3125f, +-191.406f,12.202f,70.3125f, +-187.5f,14.063f,70.3125f, +-183.594f,15.732f,70.3125f, +-179.688f,18.3972f,70.3125f, +-175.781f,19.5054f,70.3125f, +-171.875f,20.8927f,70.3125f, +-167.969f,23.3843f,70.3125f, +-164.063f,25.5894f,70.3125f, +-160.156f,27.0506f,70.3125f, +-156.25f,28.6483f,70.3125f, +-152.344f,31.3986f,70.3125f, +-148.438f,32.5255f,70.3125f, +-144.531f,33.0315f,70.3125f, +-140.625f,33.0927f,70.3125f, +-136.719f,33.7595f,70.3125f, +-132.813f,34.1872f,70.3125f, +-128.906f,33.4924f,70.3125f, +-125.0f,34.1817f,70.3125f, +-121.094f,33.4642f,70.3125f, +-117.188f,32.3231f,70.3125f, +-113.281f,32.1235f,70.3125f, +-109.375f,32.674f,70.3125f, +-105.469f,32.7558f,70.3125f, +-101.563f,32.4896f,70.3125f, +-97.6563f,30.7945f,70.3125f, +-93.75f,30.1182f,70.3125f, +-89.8438f,28.6969f,70.3125f, +-85.9375f,26.606f,70.3125f, +-82.0313f,24.8053f,70.3125f, +-78.125f,23.3599f,70.3125f, +-74.2188f,20.5363f,70.3125f, +-70.3125f,18.2858f,70.3125f, +-66.4063f,17.647f,70.3125f, +-62.5f,17.3761f,70.3125f, +-58.5938f,16.3124f,70.3125f, +-54.6875f,14.016f,70.3125f, +-50.7813f,11.6317f,70.3125f, +-46.875f,9.68832f,70.3125f, +-42.9688f,8.63692f,70.3125f, +-39.0625f,8.52412f,70.3125f, +-35.1563f,10.3549f,70.3125f, +-31.25f,11.1185f,70.3125f, +-27.3438f,12.8223f,70.3125f, +-23.4375f,14.2548f,70.3125f, +-19.5313f,15.4066f,70.3125f, +-15.625f,16.875f,70.3125f, +-11.7188f,17.7202f,70.3125f, +-7.8125f,18.6716f,70.3125f, +-3.90625f,19.72f,70.3125f, +0.0f,21.3086f,70.3125f, +3.90625f,22.948f,70.3125f, +-250.0f,4.53118f,66.4063f, +-246.094f,3.73568f,66.4063f, +-242.188f,3.80679f,66.4063f, +-238.281f,4.42509f,66.4063f, +-234.375f,5.0317f,66.4063f, +-230.469f,6.63484f,66.4063f, +-226.563f,7.65599f,66.4063f, +-222.656f,8.55305f,66.4063f, +-218.75f,8.71866f,66.4063f, +-214.844f,7.68897f,66.4063f, +-210.938f,8.59141f,66.4063f, +-207.031f,9.73811f,66.4063f, +-203.125f,10.1348f,66.4063f, +-199.219f,10.1075f,66.4063f, +-195.313f,11.1394f,66.4063f, +-191.406f,13.5829f,66.4063f, +-187.5f,15.4951f,66.4063f, +-183.594f,17.5574f,66.4063f, +-179.688f,19.9291f,66.4063f, +-175.781f,21.0567f,66.4063f, +-171.875f,22.5003f,66.4063f, +-167.969f,25.5993f,66.4063f, +-164.063f,27.0097f,66.4063f, +-160.156f,27.9166f,66.4063f, +-156.25f,29.8989f,66.4063f, +-152.344f,32.1785f,66.4063f, +-148.438f,34.0669f,66.4063f, +-144.531f,34.5129f,66.4063f, +-140.625f,34.1795f,66.4063f, +-136.719f,33.3311f,66.4063f, +-132.813f,32.969f,66.4063f, +-128.906f,32.9477f,66.4063f, +-125.0f,33.5186f,66.4063f, +-121.094f,32.9715f,66.4063f, +-117.188f,32.4898f,66.4063f, +-113.281f,33.0858f,66.4063f, +-109.375f,32.6501f,66.4063f, +-105.469f,32.847f,66.4063f, +-101.563f,32.8074f,66.4063f, +-97.6563f,31.5661f,66.4063f, +-93.75f,29.4807f,66.4063f, +-89.8438f,28.6706f,66.4063f, +-85.9375f,26.408f,66.4063f, +-82.0313f,24.3989f,66.4063f, +-78.125f,22.4069f,66.4063f, +-74.2188f,20.2026f,66.4063f, +-70.3125f,18.5513f,66.4063f, +-66.4063f,17.0548f,66.4063f, +-62.5f,17.0623f,66.4063f, +-58.5938f,15.9909f,66.4063f, +-54.6875f,13.3885f,66.4063f, +-50.7813f,11.8657f,66.4063f, +-46.875f,9.02652f,66.4063f, +-42.9688f,8.99046f,66.4063f, +-39.0625f,10.0543f,66.4063f, +-35.1563f,11.7078f,66.4063f, +-31.25f,12.4956f,66.4063f, +-27.3438f,14.0575f,66.4063f, +-23.4375f,15.2147f,66.4063f, +-19.5313f,16.7089f,66.4063f, +-15.625f,17.8009f,66.4063f, +-11.7188f,19.0086f,66.4063f, +-7.8125f,20.9864f,66.4063f, +-3.90625f,22.6943f,66.4063f, +0.0f,23.9641f,66.4063f, +3.90625f,25.5564f,66.4063f, +-250.0f,4.6779f,62.5f, +-246.094f,4.41735f,62.5f, +-242.188f,3.93647f,62.5f, +-238.281f,4.50648f,62.5f, +-234.375f,5.52163f,62.5f, +-230.469f,7.10395f,62.5f, +-226.563f,8.10257f,62.5f, +-222.656f,8.36726f,62.5f, +-218.75f,8.58321f,62.5f, +-214.844f,8.56809f,62.5f, +-210.938f,9.95321f,62.5f, +-207.031f,10.4904f,62.5f, +-203.125f,10.812f,62.5f, +-199.219f,11.5942f,62.5f, +-195.313f,13.0371f,62.5f, +-191.406f,14.6432f,62.5f, +-187.5f,16.7375f,62.5f, +-183.594f,18.4129f,62.5f, +-179.688f,20.9534f,62.5f, +-175.781f,23.1161f,62.5f, +-171.875f,25.0267f,62.5f, +-167.969f,26.7355f,62.5f, +-164.063f,27.6983f,62.5f, +-160.156f,29.1111f,62.5f, +-156.25f,31.1905f,62.5f, +-152.344f,32.9766f,62.5f, +-148.438f,33.4703f,62.5f, +-144.531f,33.714f,62.5f, +-140.625f,33.649f,62.5f, +-136.719f,33.0246f,62.5f, +-132.813f,32.7386f,62.5f, +-128.906f,32.6069f,62.5f, +-125.0f,32.6579f,62.5f, +-121.094f,31.5955f,62.5f, +-117.188f,31.8589f,62.5f, +-113.281f,32.7188f,62.5f, +-109.375f,32.889f,62.5f, +-105.469f,32.7317f,62.5f, +-101.563f,32.4229f,62.5f, +-97.6563f,31.2118f,62.5f, +-93.75f,30.6824f,62.5f, +-89.8438f,28.584f,62.5f, +-85.9375f,26.1183f,62.5f, +-82.0313f,23.8148f,62.5f, +-78.125f,22.0333f,62.5f, +-74.2188f,20.178f,62.5f, +-70.3125f,18.704f,62.5f, +-66.4063f,16.8036f,62.5f, +-62.5f,15.7173f,62.5f, +-58.5938f,13.9284f,62.5f, +-54.6875f,13.0731f,62.5f, +-50.7813f,11.8974f,62.5f, +-46.875f,9.91347f,62.5f, +-42.9688f,10.1439f,62.5f, +-39.0625f,11.304f,62.5f, +-35.1563f,12.5111f,62.5f, +-31.25f,14.112f,62.5f, +-27.3438f,15.3325f,62.5f, +-23.4375f,16.6214f,62.5f, +-19.5313f,17.8469f,62.5f, +-15.625f,19.2987f,62.5f, +-11.7188f,20.9518f,62.5f, +-7.8125f,23.4289f,62.5f, +-3.90625f,24.9379f,62.5f, +0.0f,26.156f,62.5f, +3.90625f,27.1929f,62.5f, +-250.0f,4.23938f,58.5938f, +-246.094f,4.819f,58.5938f, +-242.188f,4.63067f,58.5938f, +-238.281f,5.29023f,58.5938f, +-234.375f,6.48193f,58.5938f, +-230.469f,6.85856f,58.5938f, +-226.563f,8.4748f,58.5938f, +-222.656f,8.76416f,58.5938f, +-218.75f,9.24425f,58.5938f, +-214.844f,9.67654f,58.5938f, +-210.938f,10.8063f,58.5938f, +-207.031f,12.3237f,58.5938f, +-203.125f,12.7409f,58.5938f, +-199.219f,12.7587f,58.5938f, +-195.313f,14.3653f,58.5938f, +-191.406f,16.1467f,58.5938f, +-187.5f,17.0489f,58.5938f, +-183.594f,19.2091f,58.5938f, +-179.688f,21.7856f,58.5938f, +-175.781f,24.7829f,58.5938f, +-171.875f,26.2396f,58.5938f, +-167.969f,27.2756f,58.5938f, +-164.063f,28.2919f,58.5938f, +-160.156f,30.5945f,58.5938f, +-156.25f,32.2617f,58.5938f, +-152.344f,32.9049f,58.5938f, +-148.438f,32.8002f,58.5938f, +-144.531f,32.4751f,58.5938f, +-140.625f,32.4049f,58.5938f, +-136.719f,33.5631f,58.5938f, +-132.813f,33.3828f,58.5938f, +-128.906f,33.1064f,58.5938f, +-125.0f,32.3054f,58.5938f, +-121.094f,32.5047f,58.5938f, +-117.188f,32.3246f,58.5938f, +-113.281f,32.4393f,58.5938f, +-109.375f,32.553f,58.5938f, +-105.469f,32.9281f,58.5938f, +-101.563f,31.8539f,58.5938f, +-97.6563f,30.9253f,58.5938f, +-93.75f,30.4328f,58.5938f, +-89.8438f,28.3295f,58.5938f, +-85.9375f,25.5393f,58.5938f, +-82.0313f,23.0691f,58.5938f, +-78.125f,21.505f,58.5938f, +-74.2188f,21.0748f,58.5938f, +-70.3125f,19.1186f,58.5938f, +-66.4063f,16.7814f,58.5938f, +-62.5f,15.2179f,58.5938f, +-58.5938f,14.1291f,58.5938f, +-54.6875f,13.2351f,58.5938f, +-50.7813f,11.896f,58.5938f, +-46.875f,11.0911f,58.5938f, +-42.9688f,12.7485f,58.5938f, +-39.0625f,13.7045f,58.5938f, +-35.1563f,14.6128f,58.5938f, +-31.25f,15.546f,58.5938f, +-27.3438f,16.7828f,58.5938f, +-23.4375f,18.7578f,58.5938f, +-19.5313f,19.7951f,58.5938f, +-15.625f,21.8594f,58.5938f, +-11.7188f,22.7269f,58.5938f, +-7.8125f,24.983f,58.5938f, +-3.90625f,26.43f,58.5938f, +0.0f,27.4466f,58.5938f, +3.90625f,28.3495f,58.5938f, +-250.0f,3.62748f,54.6875f, +-246.094f,3.83329f,54.6875f, +-242.188f,4.44022f,54.6875f, +-238.281f,5.27514f,54.6875f, +-234.375f,7.43995f,54.6875f, +-230.469f,7.59176f,54.6875f, +-226.563f,8.28985f,54.6875f, +-222.656f,9.62184f,54.6875f, +-218.75f,10.6613f,54.6875f, +-214.844f,11.0914f,54.6875f, +-210.938f,12.2186f,54.6875f, +-207.031f,13.1985f,54.6875f, +-203.125f,13.9982f,54.6875f, +-199.219f,14.3187f,54.6875f, +-195.313f,14.8791f,54.6875f, +-191.406f,16.5829f,54.6875f, +-187.5f,18.231f,54.6875f, +-183.594f,20.0621f,54.6875f, +-179.688f,22.8941f,54.6875f, +-175.781f,25.0841f,54.6875f, +-171.875f,26.5655f,54.6875f, +-167.969f,27.3542f,54.6875f, +-164.063f,29.2247f,54.6875f, +-160.156f,30.91f,54.6875f, +-156.25f,33.3376f,54.6875f, +-152.344f,32.8808f,54.6875f, +-148.438f,32.5783f,54.6875f, +-144.531f,32.6138f,54.6875f, +-140.625f,32.9002f,54.6875f, +-136.719f,34.2312f,54.6875f, +-132.813f,33.8335f,54.6875f, +-128.906f,32.8545f,54.6875f, +-125.0f,33.6683f,54.6875f, +-121.094f,32.9953f,54.6875f, +-117.188f,32.5096f,54.6875f, +-113.281f,32.4307f,54.6875f, +-109.375f,31.8214f,54.6875f, +-105.469f,31.851f,54.6875f, +-101.563f,31.6383f,54.6875f, +-97.6563f,30.4359f,54.6875f, +-93.75f,28.9306f,54.6875f, +-89.8438f,26.5955f,54.6875f, +-85.9375f,24.7234f,54.6875f, +-82.0313f,23.0595f,54.6875f, +-78.125f,21.3558f,54.6875f, +-74.2188f,20.3788f,54.6875f, +-70.3125f,19.3201f,54.6875f, +-66.4063f,16.9597f,54.6875f, +-62.5f,14.6652f,54.6875f, +-58.5938f,14.4899f,54.6875f, +-54.6875f,13.3432f,54.6875f, +-50.7813f,12.3286f,54.6875f, +-46.875f,12.6498f,54.6875f, +-42.9688f,14.2651f,54.6875f, +-39.0625f,15.6887f,54.6875f, +-35.1563f,16.2038f,54.6875f, +-31.25f,17.2337f,54.6875f, +-27.3438f,18.7628f,54.6875f, +-23.4375f,20.2472f,54.6875f, +-19.5313f,21.6809f,54.6875f, +-15.625f,24.084f,54.6875f, +-11.7188f,25.1582f,54.6875f, +-7.8125f,26.7f,54.6875f, +-3.90625f,27.5421f,54.6875f, +0.0f,28.3244f,54.6875f, +3.90625f,29.2057f,54.6875f, +-250.0f,3.74657f,50.7813f, +-246.094f,3.89172f,50.7813f, +-242.188f,4.12295f,50.7813f, +-238.281f,5.16915f,50.7813f, +-234.375f,6.30394f,50.7813f, +-230.469f,7.21975f,50.7813f, +-226.563f,8.61249f,50.7813f, +-222.656f,10.1295f,50.7813f, +-218.75f,12.2813f,50.7813f, +-214.844f,12.3309f,50.7813f, +-210.938f,13.3907f,50.7813f, +-207.031f,14.1528f,50.7813f, +-203.125f,14.0334f,50.7813f, +-199.219f,14.814f,50.7813f, +-195.313f,16.69f,50.7813f, +-191.406f,17.639f,50.7813f, +-187.5f,19.261f,50.7813f, +-183.594f,20.748f,50.7813f, +-179.688f,23.3343f,50.7813f, +-175.781f,25.4837f,50.7813f, +-171.875f,26.8456f,50.7813f, +-167.969f,27.7788f,50.7813f, +-164.063f,30.0174f,50.7813f, +-160.156f,31.0689f,50.7813f, +-156.25f,32.5898f,50.7813f, +-152.344f,32.5672f,50.7813f, +-148.438f,32.4654f,50.7813f, +-144.531f,33.702f,50.7813f, +-140.625f,34.7593f,50.7813f, +-136.719f,33.9086f,50.7813f, +-132.813f,33.681f,50.7813f, +-128.906f,33.6369f,50.7813f, +-125.0f,34.0371f,50.7813f, +-121.094f,34.0479f,50.7813f, +-117.188f,34.513f,50.7813f, +-113.281f,33.7072f,50.7813f, +-109.375f,32.2763f,50.7813f, +-105.469f,32.0608f,50.7813f, +-101.563f,31.0833f,50.7813f, +-97.6563f,29.9168f,50.7813f, +-93.75f,28.7604f,50.7813f, +-89.8438f,26.9563f,50.7813f, +-85.9375f,24.7908f,50.7813f, +-82.0313f,23.7925f,50.7813f, +-78.125f,21.7037f,50.7813f, +-74.2188f,19.5308f,50.7813f, +-70.3125f,19.3367f,50.7813f, +-66.4063f,17.8482f,50.7813f, +-62.5f,14.2491f,50.7813f, +-58.5938f,14.7414f,50.7813f, +-54.6875f,14.0395f,50.7813f, +-50.7813f,12.9738f,50.7813f, +-46.875f,13.9471f,50.7813f, +-42.9688f,15.8319f,50.7813f, +-39.0625f,16.6566f,50.7813f, +-35.1563f,17.1252f,50.7813f, +-31.25f,18.6998f,50.7813f, +-27.3438f,20.877f,50.7813f, +-23.4375f,22.0249f,50.7813f, +-19.5313f,22.9369f,50.7813f, +-15.625f,25.686f,50.7813f, +-11.7188f,26.1758f,50.7813f, +-7.8125f,28.3828f,50.7813f, +-3.90625f,28.7973f,50.7813f, +0.0f,29.7276f,50.7813f, +3.90625f,30.4306f,50.7813f, +-250.0f,3.69244f,46.875f, +-246.094f,3.88583f,46.875f, +-242.188f,3.98468f,46.875f, +-238.281f,5.01772f,46.875f, +-234.375f,7.23791f,46.875f, +-230.469f,7.78117f,46.875f, +-226.563f,8.55298f,46.875f, +-222.656f,10.2684f,46.875f, +-218.75f,11.1917f,46.875f, +-214.844f,12.411f,46.875f, +-210.938f,13.7214f,46.875f, +-207.031f,14.4662f,46.875f, +-203.125f,15.536f,46.875f, +-199.219f,15.6035f,46.875f, +-195.313f,16.8456f,46.875f, +-191.406f,18.4656f,46.875f, +-187.5f,19.415f,46.875f, +-183.594f,20.8504f,46.875f, +-179.688f,23.9388f,46.875f, +-175.781f,26.2956f,46.875f, +-171.875f,27.6728f,46.875f, +-167.969f,28.2497f,46.875f, +-164.063f,29.6503f,46.875f, +-160.156f,31.9344f,46.875f, +-156.25f,33.4163f,46.875f, +-152.344f,33.428f,46.875f, +-148.438f,33.3157f,46.875f, +-144.531f,33.6261f,46.875f, +-140.625f,35.1888f,46.875f, +-136.719f,34.8434f,46.875f, +-132.813f,34.1219f,46.875f, +-128.906f,34.4564f,46.875f, +-125.0f,34.9729f,46.875f, +-121.094f,34.8811f,46.875f, +-117.188f,35.185f,46.875f, +-113.281f,34.138f,46.875f, +-109.375f,32.7077f,46.875f, +-105.469f,32.2219f,46.875f, +-101.563f,31.2475f,46.875f, +-97.6563f,29.9637f,46.875f, +-93.75f,28.1214f,46.875f, +-89.8438f,27.0889f,46.875f, +-85.9375f,25.092f,46.875f, +-82.0313f,23.3983f,46.875f, +-78.125f,22.275f,46.875f, +-74.2188f,19.8598f,46.875f, +-70.3125f,18.8797f,46.875f, +-66.4063f,17.2468f,46.875f, +-62.5f,15.4985f,46.875f, +-58.5938f,14.5357f,46.875f, +-54.6875f,14.6964f,46.875f, +-50.7813f,13.3496f,46.875f, +-46.875f,15.6354f,46.875f, +-42.9688f,16.7177f,46.875f, +-39.0625f,17.4527f,46.875f, +-35.1563f,18.2826f,46.875f, +-31.25f,20.3293f,46.875f, +-27.3438f,22.684f,46.875f, +-23.4375f,23.538f,46.875f, +-19.5313f,24.3046f,46.875f, +-15.625f,26.1113f,46.875f, +-11.7188f,27.4881f,46.875f, +-7.8125f,29.3572f,46.875f, +-3.90625f,29.786f,46.875f, +0.0f,30.3637f,46.875f, +3.90625f,30.8772f,46.875f, +-250.0f,4.08083f,42.9688f, +-246.094f,4.09778f,42.9688f, +-242.188f,3.87631f,42.9688f, +-238.281f,5.12214f,42.9688f, +-234.375f,6.70993f,42.9688f, +-230.469f,7.75806f,42.9688f, +-226.563f,8.13676f,42.9688f, +-222.656f,8.85151f,42.9688f, +-218.75f,10.9378f,42.9688f, +-214.844f,12.4043f,42.9688f, +-210.938f,13.4636f,42.9688f, +-207.031f,14.7352f,42.9688f, +-203.125f,15.605f,42.9688f, +-199.219f,15.7497f,42.9688f, +-195.313f,17.184f,42.9688f, +-191.406f,19.3679f,42.9688f, +-187.5f,21.1701f,42.9688f, +-183.594f,22.7204f,42.9688f, +-179.688f,24.8128f,42.9688f, +-175.781f,26.7707f,42.9688f, +-171.875f,27.7521f,42.9688f, +-167.969f,28.8689f,42.9688f, +-164.063f,31.1205f,42.9688f, +-160.156f,33.289f,42.9688f, +-156.25f,34.2815f,42.9688f, +-152.344f,33.9797f,42.9688f, +-148.438f,34.2527f,42.9688f, +-144.531f,34.1886f,42.9688f, +-140.625f,34.868f,42.9688f, +-136.719f,35.6569f,42.9688f, +-132.813f,35.4999f,42.9688f, +-128.906f,35.4373f,42.9688f, +-125.0f,36.373f,42.9688f, +-121.094f,35.4304f,42.9688f, +-117.188f,34.3543f,42.9688f, +-113.281f,35.0651f,42.9688f, +-109.375f,33.5051f,42.9688f, +-105.469f,32.471f,42.9688f, +-101.563f,31.2764f,42.9688f, +-97.6563f,29.7633f,42.9688f, +-93.75f,27.9107f,42.9688f, +-89.8438f,26.5273f,42.9688f, +-85.9375f,25.2444f,42.9688f, +-82.0313f,23.6093f,42.9688f, +-78.125f,21.9684f,42.9688f, +-74.2188f,19.4992f,42.9688f, +-70.3125f,17.8231f,42.9688f, +-66.4063f,17.4082f,42.9688f, +-62.5f,17.0938f,42.9688f, +-58.5938f,15.3348f,42.9688f, +-54.6875f,14.7964f,42.9688f, +-50.7813f,14.9948f,42.9688f, +-46.875f,17.1807f,42.9688f, +-42.9688f,18.118f,42.9688f, +-39.0625f,19.0809f,42.9688f, +-35.1563f,19.6971f,42.9688f, +-31.25f,21.652f,42.9688f, +-27.3438f,23.4343f,42.9688f, +-23.4375f,24.5708f,42.9688f, +-19.5313f,25.2003f,42.9688f, +-15.625f,26.8391f,42.9688f, +-11.7188f,28.9343f,42.9688f, +-7.8125f,29.9079f,42.9688f, +-3.90625f,31.268f,42.9688f, +0.0f,31.3916f,42.9688f, +3.90625f,31.8945f,42.9688f, +-250.0f,4.27976f,39.0625f, +-246.094f,4.20341f,39.0625f, +-242.188f,3.80298f,39.0625f, +-238.281f,4.79243f,39.0625f, +-234.375f,5.51846f,39.0625f, +-230.469f,6.91597f,39.0625f, +-226.563f,8.25726f,39.0625f, +-222.656f,8.85037f,39.0625f, +-218.75f,9.57429f,39.0625f, +-214.844f,11.3899f,39.0625f, +-210.938f,12.5806f,39.0625f, +-207.031f,14.2509f,39.0625f, +-203.125f,14.7828f,39.0625f, +-199.219f,15.9801f,39.0625f, +-195.313f,17.4225f,39.0625f, +-191.406f,19.6018f,39.0625f, +-187.5f,22.1095f,39.0625f, +-183.594f,23.8333f,39.0625f, +-179.688f,25.0671f,39.0625f, +-175.781f,27.1067f,39.0625f, +-171.875f,28.5f,39.0625f, +-167.969f,29.9625f,39.0625f, +-164.063f,32.3895f,39.0625f, +-160.156f,33.8224f,39.0625f, +-156.25f,34.3349f,39.0625f, +-152.344f,34.4661f,39.0625f, +-148.438f,34.7236f,39.0625f, +-144.531f,34.1129f,39.0625f, +-140.625f,34.9033f,39.0625f, +-136.719f,35.6229f,39.0625f, +-132.813f,35.7143f,39.0625f, +-128.906f,36.7151f,39.0625f, +-125.0f,36.9574f,39.0625f, +-121.094f,36.0729f,39.0625f, +-117.188f,35.2171f,39.0625f, +-113.281f,34.9343f,39.0625f, +-109.375f,34.5707f,39.0625f, +-105.469f,33.5046f,39.0625f, +-101.563f,31.353f,39.0625f, +-97.6563f,30.0283f,39.0625f, +-93.75f,28.6272f,39.0625f, +-89.8438f,26.4389f,39.0625f, +-85.9375f,24.8159f,39.0625f, +-82.0313f,23.0295f,39.0625f, +-78.125f,21.1082f,39.0625f, +-74.2188f,19.1239f,39.0625f, +-70.3125f,18.0914f,39.0625f, +-66.4063f,17.3227f,39.0625f, +-62.5f,17.1022f,39.0625f, +-58.5938f,16.4298f,39.0625f, +-54.6875f,15.6704f,39.0625f, +-50.7813f,16.5664f,39.0625f, +-46.875f,18.478f,39.0625f, +-42.9688f,19.4144f,39.0625f, +-39.0625f,19.9351f,39.0625f, +-35.1563f,20.3447f,39.0625f, +-31.25f,22.4348f,39.0625f, +-27.3438f,24.5713f,39.0625f, +-23.4375f,25.5465f,39.0625f, +-19.5313f,26.485f,39.0625f, +-15.625f,28.292f,39.0625f, +-11.7188f,30.0016f,39.0625f, +-7.8125f,32.2532f,39.0625f, +-3.90625f,33.6327f,39.0625f, +0.0f,33.835f,39.0625f, +3.90625f,34.9171f,39.0625f, +-250.0f,3.91889f,35.1563f, +-246.094f,3.38127f,35.1563f, +-242.188f,3.26935f,35.1563f, +-238.281f,4.06778f,35.1563f, +-234.375f,4.87411f,35.1563f, +-230.469f,6.48873f,35.1563f, +-226.563f,7.17326f,35.1563f, +-222.656f,8.21235f,35.1563f, +-218.75f,8.21965f,35.1563f, +-214.844f,10.417f,35.1563f, +-210.938f,11.9497f,35.1563f, +-207.031f,13.4145f,35.1563f, +-203.125f,14.0876f,35.1563f, +-199.219f,15.5077f,35.1563f, +-195.313f,16.9011f,35.1563f, +-191.406f,20.4395f,35.1563f, +-187.5f,23.001f,35.1563f, +-183.594f,24.0199f,35.1563f, +-179.688f,25.7082f,35.1563f, +-175.781f,27.3018f,35.1563f, +-171.875f,28.9584f,35.1563f, +-167.969f,31.1478f,35.1563f, +-164.063f,32.8635f,35.1563f, +-160.156f,33.5517f,35.1563f, +-156.25f,34.5761f,35.1563f, +-152.344f,34.5761f,35.1563f, +-148.438f,34.2002f,35.1563f, +-144.531f,34.7177f,35.1563f, +-140.625f,35.5653f,35.1563f, +-136.719f,35.7993f,35.1563f, +-132.813f,37.1127f,35.1563f, +-128.906f,37.2477f,35.1563f, +-125.0f,36.8734f,35.1563f, +-121.094f,35.4154f,35.1563f, +-117.188f,34.8545f,35.1563f, +-113.281f,35.4317f,35.1563f, +-109.375f,34.9205f,35.1563f, +-105.469f,33.5115f,35.1563f, +-101.563f,32.2368f,35.1563f, +-97.6563f,30.3601f,35.1563f, +-93.75f,29.2913f,35.1563f, +-89.8438f,27.4791f,35.1563f, +-85.9375f,24.811f,35.1563f, +-82.0313f,23.4984f,35.1563f, +-78.125f,21.456f,35.1563f, +-74.2188f,19.8992f,35.1563f, +-70.3125f,17.7354f,35.1563f, +-66.4063f,17.3066f,35.1563f, +-62.5f,17.1745f,35.1563f, +-58.5938f,16.5285f,35.1563f, +-54.6875f,17.2826f,35.1563f, +-50.7813f,18.6936f,35.1563f, +-46.875f,19.4228f,35.1563f, +-42.9688f,20.2022f,35.1563f, +-39.0625f,21.4261f,35.1563f, +-35.1563f,21.5779f,35.1563f, +-31.25f,24.0097f,35.1563f, +-27.3438f,25.4481f,35.1563f, +-23.4375f,26.0036f,35.1563f, +-19.5313f,27.4346f,35.1563f, +-15.625f,30.2459f,35.1563f, +-11.7188f,32.81f,35.1563f, +-7.8125f,34.7924f,35.1563f, +-3.90625f,35.8907f,35.1563f, +0.0f,36.9755f,35.1563f, +3.90625f,38.5427f,35.1563f, +-250.0f,2.28536f,31.25f, +-246.094f,1.63842f,31.25f, +-242.188f,2.40273f,31.25f, +-238.281f,3.19518f,31.25f, +-234.375f,3.99394f,31.25f, +-230.469f,4.99674f,31.25f, +-226.563f,5.63235f,31.25f, +-222.656f,6.86331f,31.25f, +-218.75f,7.37515f,31.25f, +-214.844f,9.34737f,31.25f, +-210.938f,11.7034f,31.25f, +-207.031f,13.4309f,31.25f, +-203.125f,14.4474f,31.25f, +-199.219f,15.8817f,31.25f, +-195.313f,17.87f,31.25f, +-191.406f,20.9938f,31.25f, +-187.5f,23.5333f,31.25f, +-183.594f,24.4107f,31.25f, +-179.688f,26.0811f,31.25f, +-175.781f,27.9797f,31.25f, +-171.875f,29.4813f,31.25f, +-167.969f,31.7071f,31.25f, +-164.063f,33.0836f,31.25f, +-160.156f,33.5998f,31.25f, +-156.25f,33.5304f,31.25f, +-152.344f,33.9929f,31.25f, +-148.438f,35.4297f,31.25f, +-144.531f,36.4531f,31.25f, +-140.625f,35.9197f,31.25f, +-136.719f,36.6849f,31.25f, +-132.813f,37.8161f,31.25f, +-128.906f,37.6166f,31.25f, +-125.0f,36.9426f,31.25f, +-121.094f,35.6388f,31.25f, +-117.188f,35.0026f,31.25f, +-113.281f,35.386f,31.25f, +-109.375f,34.6287f,31.25f, +-105.469f,33.8962f,31.25f, +-101.563f,32.1844f,31.25f, +-97.6563f,30.7868f,31.25f, +-93.75f,29.267f,31.25f, +-89.8438f,27.2585f,31.25f, +-85.9375f,25.4236f,31.25f, +-82.0313f,23.0281f,31.25f, +-78.125f,21.4593f,31.25f, +-74.2188f,19.4556f,31.25f, +-70.3125f,18.0982f,31.25f, +-66.4063f,17.1214f,31.25f, +-62.5f,17.1751f,31.25f, +-58.5938f,17.1429f,31.25f, +-54.6875f,18.4434f,31.25f, +-50.7813f,19.9422f,31.25f, +-46.875f,21.2124f,31.25f, +-42.9688f,21.2106f,31.25f, +-39.0625f,22.1346f,31.25f, +-35.1563f,23.3082f,31.25f, +-31.25f,24.7044f,31.25f, +-27.3438f,26.2688f,31.25f, +-23.4375f,27.5692f,31.25f, +-19.5313f,30.4099f,31.25f, +-15.625f,33.0453f,31.25f, +-11.7188f,34.9857f,31.25f, +-7.8125f,37.0727f,31.25f, +-3.90625f,39.2219f,31.25f, +0.0f,40.3658f,31.25f, +3.90625f,41.4381f,31.25f, +-250.0f,0.4773f,27.3438f, +-246.094f,0.631847f,27.3438f, +-242.188f,1.21449f,27.3438f, +-238.281f,1.52728f,27.3438f, +-234.375f,2.73146f,27.3438f, +-230.469f,3.65375f,27.3438f, +-226.563f,5.03467f,27.3438f, +-222.656f,6.27065f,27.3438f, +-218.75f,7.56964f,27.3438f, +-214.844f,9.63719f,27.3438f, +-210.938f,11.4022f,27.3438f, +-207.031f,12.7085f,27.3438f, +-203.125f,14.3808f,27.3438f, +-199.219f,15.9121f,27.3438f, +-195.313f,17.8953f,27.3438f, +-191.406f,20.8456f,27.3438f, +-187.5f,22.7705f,27.3438f, +-183.594f,24.5794f,27.3437f, +-179.688f,27.055f,27.3438f, +-175.781f,29.3548f,27.3437f, +-171.875f,30.4534f,27.3438f, +-167.969f,32.4366f,27.3437f, +-164.063f,34.4967f,27.3438f, +-160.156f,34.9614f,27.3437f, +-156.25f,34.9405f,27.3438f, +-152.344f,35.7165f,27.3437f, +-148.438f,37.0387f,27.3438f, +-144.531f,38.0934f,27.3437f, +-140.625f,37.3872f,27.3438f, +-136.719f,36.4336f,27.3437f, +-132.813f,37.0365f,27.3438f, +-128.906f,37.2591f,27.3437f, +-125.0f,36.5502f,27.3438f, +-121.094f,35.4814f,27.3437f, +-117.188f,35.3267f,27.3438f, +-113.281f,34.3757f,27.3437f, +-109.375f,34.2455f,27.3438f, +-105.469f,33.6851f,27.3437f, +-101.563f,32.3527f,27.3438f, +-97.6563f,30.111f,27.3437f, +-93.75f,28.4912f,27.3438f, +-89.8438f,27.0398f,27.3437f, +-85.9375f,24.9699f,27.3438f, +-82.0313f,22.9703f,27.3437f, +-78.125f,21.7502f,27.3438f, +-74.2188f,18.8537f,27.3438f, +-70.3125f,18.2353f,27.3438f, +-66.4063f,18.3708f,27.3438f, +-62.5f,18.6738f,27.3438f, +-58.5938f,18.5559f,27.3438f, +-54.6875f,19.1603f,27.3438f, +-50.7813f,20.8349f,27.3438f, +-46.875f,21.6092f,27.3438f, +-42.9688f,21.9317f,27.3437f, +-39.0625f,23.0486f,27.3438f, +-35.1563f,24.8675f,27.3437f, +-31.25f,25.6906f,27.3438f, +-27.3438f,27.9695f,27.3437f, +-23.4375f,30.3105f,27.3438f, +-19.5313f,33.9897f,27.3437f, +-15.625f,35.6988f,27.3438f, +-11.7188f,37.9213f,27.3437f, +-7.8125f,40.1355f,27.3438f, +-3.90625f,41.6062f,27.3437f, +0.0f,42.273f,27.3438f, +3.90625f,42.7334f,27.3437f, +-250.0f,0.178144f,23.4375f, +-246.094f,1.07943f,23.4375f, +-242.188f,1.52473f,23.4375f, +-238.281f,2.58652f,23.4375f, +-234.375f,3.51451f,23.4375f, +-230.469f,4.23103f,23.4375f, +-226.563f,5.80506f,23.4375f, +-222.656f,7.26086f,23.4375f, +-218.75f,8.85201f,23.4375f, +-214.844f,10.9029f,23.4375f, +-210.938f,12.7138f,23.4375f, +-207.031f,14.9249f,23.4375f, +-203.125f,15.6506f,23.4375f, +-199.219f,16.529f,23.4375f, +-195.313f,17.1535f,23.4375f, +-191.406f,20.5632f,23.4375f, +-187.5f,23.1009f,23.4375f, +-183.594f,24.7859f,23.4375f, +-179.688f,26.8635f,23.4375f, +-175.781f,28.5723f,23.4375f, +-171.875f,30.2918f,23.4375f, +-167.969f,32.7768f,23.4375f, +-164.063f,34.6199f,23.4375f, +-160.156f,35.6902f,23.4375f, +-156.25f,37.1166f,23.4375f, +-152.344f,37.0816f,23.4375f, +-148.438f,37.9995f,23.4375f, +-144.531f,38.687f,23.4375f, +-140.625f,37.9261f,23.4375f, +-136.719f,36.7476f,23.4375f, +-132.813f,37.1839f,23.4375f, +-128.906f,36.8682f,23.4375f, +-125.0f,36.2555f,23.4375f, +-121.094f,34.8461f,23.4375f, +-117.188f,34.5757f,23.4375f, +-113.281f,33.8965f,23.4375f, +-109.375f,33.4987f,23.4375f, +-105.469f,33.02f,23.4375f, +-101.563f,31.4543f,23.4375f, +-97.6563f,29.5899f,23.4375f, +-93.75f,27.8808f,23.4375f, +-89.8438f,26.4886f,23.4375f, +-85.9375f,24.5413f,23.4375f, +-82.0313f,22.6097f,23.4375f, +-78.125f,21.38f,23.4375f, +-74.2188f,19.2574f,23.4375f, +-70.3125f,19.6862f,23.4375f, +-66.4063f,19.3283f,23.4375f, +-62.5f,20.3608f,23.4375f, +-58.5938f,20.9969f,23.4375f, +-54.6875f,20.5645f,23.4375f, +-50.7813f,21.6338f,23.4375f, +-46.875f,22.0705f,23.4375f, +-42.9688f,23.2924f,23.4375f, +-39.0625f,24.8627f,23.4375f, +-35.1563f,25.9292f,23.4375f, +-31.25f,27.2133f,23.4375f, +-27.3438f,29.7296f,23.4375f, +-23.4375f,32.8149f,23.4375f, +-19.5313f,35.5321f,23.4375f, +-15.625f,38.2144f,23.4375f, +-11.7188f,40.2421f,23.4375f, +-7.8125f,41.7479f,23.4375f, +-3.90625f,43.372f,23.4375f, +0.0f,43.7526f,23.4375f, +3.90625f,44.6783f,23.4375f, +-250.0f,0.138221f,19.5313f, +-246.094f,1.4004f,19.5313f, +-242.188f,3.26515f,19.5313f, +-238.281f,3.65276f,19.5313f, +-234.375f,4.90602f,19.5313f, +-230.469f,6.03349f,19.5313f, +-226.563f,7.99773f,19.5313f, +-222.656f,9.41728f,19.5313f, +-218.75f,10.0435f,19.5313f, +-214.844f,12.1613f,19.5313f, +-210.938f,13.6999f,19.5313f, +-207.031f,15.7603f,19.5313f, +-203.125f,16.1549f,19.5313f, +-199.219f,17.1021f,19.5313f, +-195.313f,18.1867f,19.5313f, +-191.406f,20.6836f,19.5313f, +-187.5f,23.0865f,19.5312f, +-183.594f,24.3015f,19.5313f, +-179.688f,26.6623f,19.5312f, +-175.781f,28.232f,19.5313f, +-171.875f,30.6454f,19.5312f, +-167.969f,32.8674f,19.5313f, +-164.063f,35.0881f,19.5312f, +-160.156f,37.2715f,19.5313f, +-156.25f,38.6025f,19.5312f, +-152.344f,38.2781f,19.5313f, +-148.438f,38.4813f,19.5312f, +-144.531f,38.3281f,19.5313f, +-140.625f,38.1441f,19.5312f, +-136.719f,37.6066f,19.5312f, +-132.813f,37.2097f,19.5312f, +-128.906f,36.5694f,19.5312f, +-125.0f,36.2416f,19.5312f, +-121.094f,34.5305f,19.5312f, +-117.188f,33.3684f,19.5312f, +-113.281f,32.7805f,19.5312f, +-109.375f,31.8563f,19.5312f, +-105.469f,31.3398f,19.5312f, +-101.563f,29.7387f,19.5312f, +-97.6563f,28.7121f,19.5312f, +-93.75f,27.8904f,19.5312f, +-89.8438f,26.0256f,19.5312f, +-85.9375f,24.5469f,19.5312f, +-82.0313f,23.3531f,19.5312f, +-78.125f,21.4621f,19.5313f, +-74.2188f,20.3507f,19.5313f, +-70.3125f,20.1879f,19.5313f, +-66.4063f,20.9838f,19.5313f, +-62.5f,22.229f,19.5312f, +-58.5938f,22.355f,19.5312f, +-54.6875f,22.7659f,19.5312f, +-50.7813f,22.9258f,19.5312f, +-46.875f,23.554f,19.5312f, +-42.9688f,24.3861f,19.5312f, +-39.0625f,25.5112f,19.5312f, +-35.1563f,26.8691f,19.5312f, +-31.25f,28.968f,19.5312f, +-27.3438f,31.0124f,19.5312f, +-23.4375f,34.8357f,19.5312f, +-19.5313f,37.2362f,19.5312f, +-15.625f,39.5924f,19.5312f, +-11.7188f,41.5691f,19.5312f, +-7.8125f,43.2441f,19.5312f, +-3.90625f,45.1168f,19.5312f, +0.0f,45.7555f,19.5312f, +3.90625f,46.9055f,19.5312f, +-250.0f,0.462936f,15.625f, +-246.094f,2.15489f,15.625f, +-242.188f,3.69232f,15.625f, +-238.281f,4.89361f,15.625f, +-234.375f,6.95706f,15.625f, +-230.469f,8.37916f,15.625f, +-226.563f,9.21515f,15.625f, +-222.656f,10.0624f,15.625f, +-218.75f,11.6477f,15.625f, +-214.844f,13.257f,15.625f, +-210.938f,14.8699f,15.625f, +-207.031f,15.9852f,15.625f, +-203.125f,17.025f,15.625f, +-199.219f,17.8511f,15.625f, +-195.313f,20.3581f,15.625f, +-191.406f,22.0829f,15.625f, +-187.5f,24.4216f,15.625f, +-183.594f,25.5625f,15.625f, +-179.688f,27.0961f,15.625f, +-175.781f,30.0958f,15.625f, +-171.875f,31.7977f,15.625f, +-167.969f,34.7043f,15.625f, +-164.063f,37.1655f,15.625f, +-160.156f,37.6823f,15.625f, +-156.25f,37.6204f,15.625f, +-152.344f,37.8037f,15.625f, +-148.438f,37.8555f,15.625f, +-144.531f,37.9638f,15.625f, +-140.625f,37.4821f,15.625f, +-136.719f,37.0202f,15.625f, +-132.813f,36.4604f,15.625f, +-128.906f,36.1575f,15.625f, +-125.0f,35.4218f,15.625f, +-121.094f,33.5202f,15.625f, +-117.188f,32.116f,15.625f, +-113.281f,30.9352f,15.625f, +-109.375f,29.8297f,15.625f, +-105.469f,29.9146f,15.625f, +-101.563f,28.7245f,15.625f, +-97.6563f,27.7205f,15.625f, +-93.75f,27.4217f,15.625f, +-89.8438f,25.8557f,15.625f, +-85.9375f,24.0609f,15.625f, +-82.0313f,22.7869f,15.625f, +-78.125f,20.4923f,15.625f, +-74.2188f,21.0025f,15.625f, +-70.3125f,21.2985f,15.625f, +-66.4063f,22.5717f,15.625f, +-62.5f,23.0569f,15.625f, +-58.5938f,23.2123f,15.625f, +-54.6875f,24.1861f,15.625f, +-50.7813f,24.5626f,15.625f, +-46.875f,25.1259f,15.625f, +-42.9688f,25.9995f,15.625f, +-39.0625f,26.8682f,15.625f, +-35.1563f,27.8593f,15.625f, +-31.25f,29.8924f,15.625f, +-27.3438f,32.8894f,15.625f, +-23.4375f,36.2901f,15.625f, +-19.5313f,38.2475f,15.625f, +-15.625f,40.593f,15.625f, +-11.7188f,42.2973f,15.625f, +-7.8125f,45.3308f,15.625f, +-3.90625f,47.345f,15.625f, +0.0f,48.9808f,15.625f, +3.90625f,49.2295f,15.625f, +-250.0f,1.16646f,11.7188f, +-246.094f,2.99331f,11.7188f, +-242.188f,4.37829f,11.7188f, +-238.281f,5.21593f,11.7188f, +-234.375f,6.84374f,11.7188f, +-230.469f,8.34616f,11.7188f, +-226.563f,9.2826f,11.7188f, +-222.656f,9.90104f,11.7188f, +-218.75f,10.9211f,11.7187f, +-214.844f,13.6881f,11.7187f, +-210.938f,15.7745f,11.7187f, +-207.031f,16.2325f,11.7187f, +-203.125f,17.2525f,11.7187f, +-199.219f,19.1108f,11.7187f, +-195.313f,21.4743f,11.7187f, +-191.406f,24.021f,11.7187f, +-187.5f,25.8676f,11.7187f, +-183.594f,27.021f,11.7187f, +-179.688f,28.254f,11.7187f, +-175.781f,31.6036f,11.7187f, +-171.875f,32.629f,11.7187f, +-167.969f,34.9526f,11.7187f, +-164.063f,36.8236f,11.7187f, +-160.156f,37.152f,11.7187f, +-156.25f,37.6659f,11.7187f, +-152.344f,37.4102f,11.7187f, +-148.438f,37.0806f,11.7187f, +-144.531f,37.6299f,11.7187f, +-140.625f,36.7269f,11.7187f, +-136.719f,36.4841f,11.7187f, +-132.813f,35.2557f,11.7187f, +-128.906f,34.7066f,11.7187f, +-125.0f,34.0947f,11.7187f, +-121.094f,32.7343f,11.7187f, +-117.188f,31.5605f,11.7187f, +-113.281f,30.7492f,11.7187f, +-109.375f,30.1608f,11.7187f, +-105.469f,29.9144f,11.7187f, +-101.563f,28.5532f,11.7187f, +-97.6563f,26.2051f,11.7187f, +-93.75f,26.0432f,11.7187f, +-89.8438f,25.1831f,11.7187f, +-85.9375f,23.7935f,11.7187f, +-82.0313f,22.6952f,11.7187f, +-78.125f,21.9812f,11.7187f, +-74.2188f,22.3423f,11.7187f, +-70.3125f,22.4959f,11.7187f, +-66.4063f,22.9438f,11.7187f, +-62.5f,23.6591f,11.7187f, +-58.5938f,24.1634f,11.7187f, +-54.6875f,24.8781f,11.7187f, +-50.7813f,25.3471f,11.7187f, +-46.875f,25.7599f,11.7187f, +-42.9688f,26.61f,11.7187f, +-39.0625f,27.5033f,11.7187f, +-35.1563f,29.2751f,11.7187f, +-31.25f,31.9147f,11.7187f, +-27.3438f,34.1964f,11.7187f, +-23.4375f,36.7734f,11.7187f, +-19.5313f,39.2441f,11.7187f, +-15.625f,41.3269f,11.7187f, +-11.7188f,44.2682f,11.7187f, +-7.8125f,47.2458f,11.7187f, +-3.90625f,49.2199f,11.7187f, +0.0f,50.2546f,11.7187f, +3.90625f,51.1233f,11.7187f, +-250.0f,1.52698f,7.8125f, +-246.094f,2.97227f,7.8125f, +-242.188f,3.77319f,7.8125f, +-238.281f,4.81095f,7.8125f, +-234.375f,5.94458f,7.8125f, +-230.469f,7.45352f,7.8125f, +-226.563f,8.9683f,7.8125f, +-222.656f,9.37348f,7.8125f, +-218.75f,10.3818f,7.8125f, +-214.844f,13.0632f,7.8125f, +-210.938f,15.5836f,7.8125f, +-207.031f,17.1532f,7.8125f, +-203.125f,19.3065f,7.8125f, +-199.219f,21.746f,7.8125f, +-195.313f,23.0026f,7.8125f, +-191.406f,25.1876f,7.8125f, +-187.5f,27.4911f,7.8125f, +-183.594f,28.651f,7.8125f, +-179.688f,28.9685f,7.8125f, +-175.781f,31.1275f,7.8125f, +-171.875f,32.457f,7.8125f, +-167.969f,34.4336f,7.8125f, +-164.063f,35.9124f,7.8125f, +-160.156f,36.5078f,7.8125f, +-156.25f,36.9999f,7.8125f, +-152.344f,36.9517f,7.8125f, +-148.438f,37.9713f,7.8125f, +-144.531f,37.929f,7.8125f, +-140.625f,37.5334f,7.8125f, +-136.719f,36.2798f,7.8125f, +-132.813f,35.1904f,7.8125f, +-128.906f,33.7356f,7.8125f, +-125.0f,34.0968f,7.8125f, +-121.094f,33.5838f,7.8125f, +-117.188f,32.9371f,7.8125f, +-113.281f,32.0353f,7.8125f, +-109.375f,31.4623f,7.8125f, +-105.469f,30.5184f,7.8125f, +-101.563f,28.7396f,7.8125f, +-97.6563f,27.2715f,7.8125f, +-93.75f,26.1242f,7.8125f, +-89.8438f,24.5691f,7.8125f, +-85.9375f,23.931f,7.8125f, +-82.0313f,23.7643f,7.8125f, +-78.125f,22.4588f,7.8125f, +-74.2188f,22.5395f,7.8125f, +-70.3125f,22.9322f,7.8125f, +-66.4063f,23.4361f,7.8125f, +-62.5f,24.2733f,7.8125f, +-58.5938f,24.1873f,7.8125f, +-54.6875f,24.2666f,7.8125f, +-50.7813f,25.2522f,7.8125f, +-46.875f,26.3494f,7.8125f, +-42.9688f,26.8365f,7.8125f, +-39.0625f,27.5515f,7.8125f, +-35.1563f,30.4441f,7.8125f, +-31.25f,33.5547f,7.8125f, +-27.3438f,36.1409f,7.8125f, +-23.4375f,38.1103f,7.8125f, +-19.5313f,39.8171f,7.8125f, +-15.625f,42.1146f,7.8125f, +-11.7188f,45.3603f,7.8125f, +-7.8125f,47.6602f,7.8125f, +-3.90625f,49.963f,7.8125f, +0.0f,51.8119f,7.8125f, +3.90625f,52.2527f,7.8125f, +-250.0f,0.139875f,3.90625f, +-246.094f,1.72995f,3.90625f, +-242.188f,2.60122f,3.90625f, +-238.281f,4.01346f,3.90625f, +-234.375f,5.13654f,3.90625f, +-230.469f,6.69665f,3.90625f, +-226.563f,8.43203f,3.90625f, +-222.656f,9.83442f,3.90625f, +-218.75f,11.3645f,3.90625f, +-214.844f,14.222f,3.90625f, +-210.938f,16.1758f,3.90625f, +-207.031f,18.9127f,3.90625f, +-203.125f,21.2478f,3.90625f, +-199.219f,23.0589f,3.90625f, +-195.313f,24.6025f,3.90625f, +-191.406f,25.8143f,3.90625f, +-187.5f,27.5696f,3.90625f, +-183.594f,29.2176f,3.90625f, +-179.688f,29.6835f,3.90625f, +-175.781f,30.7416f,3.90625f, +-171.875f,31.4405f,3.90625f, +-167.969f,33.0831f,3.90625f, +-164.063f,34.6225f,3.90625f, +-160.156f,35.4992f,3.90625f, +-156.25f,37.4126f,3.90625f, +-152.344f,38.453f,3.90625f, +-148.438f,38.9974f,3.90625f, +-144.531f,38.7871f,3.90625f, +-140.625f,37.6021f,3.90625f, +-136.719f,36.1797f,3.90625f, +-132.813f,34.9906f,3.90625f, +-128.906f,34.1304f,3.90625f, +-125.0f,34.3517f,3.90625f, +-121.094f,33.6612f,3.90625f, +-117.188f,32.7047f,3.90625f, +-113.281f,32.3958f,3.90625f, +-109.375f,31.0818f,3.90625f, +-105.469f,30.9536f,3.90625f, +-101.563f,29.8205f,3.90625f, +-97.6563f,28.4796f,3.90625f, +-93.75f,27.6494f,3.90625f, +-89.8438f,25.5721f,3.90625f, +-85.9375f,24.227f,3.90625f, +-82.0313f,23.2611f,3.90625f, +-78.125f,22.4589f,3.90625f, +-74.2188f,23.2261f,3.90625f, +-70.3125f,23.5025f,3.90625f, +-66.4063f,23.6913f,3.90625f, +-62.5f,24.6785f,3.90625f, +-58.5938f,25.4946f,3.90625f, +-54.6875f,25.9722f,3.90625f, +-50.7813f,26.1977f,3.90625f, +-46.875f,26.8539f,3.90625f, +-42.9688f,27.7268f,3.90625f, +-39.0625f,29.2046f,3.90625f, +-35.1563f,31.79f,3.90625f, +-31.25f,34.2658f,3.90625f, +-27.3438f,35.9914f,3.90625f, +-23.4375f,38.3776f,3.90625f, +-19.5313f,39.8852f,3.90625f, +-15.625f,43.1455f,3.90625f, +-11.7188f,45.5059f,3.90625f, +-7.8125f,47.4257f,3.90625f, +-3.90625f,49.9032f,3.90625f, +0.0f,52.0322f,3.90625f, +3.90625f,52.6186f,3.90625f, +}; + +btScalar Landscape02Nml[] = { +0.376889f,0.897995f,0.227068f, +0.251083f,0.961355f,0.112931f, +0.256071f,0.961946f,0.0953332f, +0.188246f,0.981544f,0.0336933f, +0.321782f,0.946812f,0.00191405f, +0.277829f,0.960055f,0.0332431f, +0.366908f,0.922321f,-0.121252f, +0.346681f,0.936118f,-0.0591191f, +0.34598f,0.936023f,-0.0644918f, +0.326882f,0.934733f,-0.139364f, +0.195537f,0.979014f,-0.0574119f, +0.208421f,0.974173f,-0.0868766f, +0.220158f,0.96963f,-0.106528f, +0.21764f,0.974169f,-0.0602246f, +0.194781f,0.966032f,-0.169831f, +0.137923f,0.97923f,-0.148611f, +-0.0890295f,0.968844f,-0.231118f, +-0.164208f,0.952108f,-0.257926f, +-0.299547f,0.905883f,-0.299413f, +-0.331781f,0.892916f,-0.304338f, +-0.275234f,0.921181f,-0.275086f, +-0.190055f,0.968186f,-0.162776f, +-0.191147f,0.964101f,-0.184313f, +-0.167051f,0.973656f,-0.155201f, +-0.260549f,0.956867f,-0.128527f, +-0.236175f,0.968373f,-0.080466f, +-0.305083f,0.942279f,-0.137969f, +-0.32302f,0.940678f,-0.103844f, +-0.376654f,0.91108f,-0.167524f, +-0.43665f,0.882087f,-0.176802f, +-0.404697f,0.87224f,-0.274621f, +-0.461396f,0.842558f,-0.277868f, +-0.340534f,0.861872f,-0.375783f, +-0.381498f,0.847049f,-0.370091f, +-0.349262f,0.83292f,-0.429255f, +-0.383821f,0.842401f,-0.378209f, +-0.350717f,0.827302f,-0.438826f, +-0.312636f,0.886963f,-0.339934f, +-0.202637f,0.921293f,-0.331899f, +-0.164853f,0.917655f,-0.361571f, +-0.320762f,0.929092f,-0.184116f, +-0.291289f,0.89543f,-0.336684f, +-0.523923f,0.850919f,-0.0379686f, +-0.415222f,0.907809f,-0.0589323f, +-0.464751f,0.884928f,0.030152f, +-0.464228f,0.885715f,0.00114487f, +-0.460666f,0.887573f,-0.00119475f, +-0.527574f,0.824073f,-0.206324f, +-0.569463f,0.819886f,-0.0591577f, +-0.624043f,0.739025f,-0.253797f, +-0.677912f,0.708815f,-0.19498f, +-0.654991f,0.737431f,-0.164874f, +-0.612102f,0.778841f,-0.136883f, +-0.555251f,0.829082f,-0.0657209f, +-0.466796f,0.884362f,-0.00238444f, +-0.393172f,0.917844f,0.0545768f, +-0.415266f,0.902781f,0.111985f, +-0.346174f,0.92512f,0.155936f, +-0.270143f,0.942251f,0.197955f, +-0.242693f,0.931939f,0.269424f, +-0.146828f,0.979561f,0.137484f, +-0.151815f,0.949716f,0.273847f, +-0.23746f,0.962635f,0.130183f, +-0.242269f,0.936807f,0.252385f, +-0.439066f,0.897439f,0.0427119f, +-0.506925f,0.859633f,0.0637107f, +-0.369534f,0.927612f,0.0545955f, +-0.266432f,0.921234f,0.283447f, +-0.0849634f,0.983229f,0.161377f, +-0.142422f,0.97399f,0.176238f, +0.059987f,0.992193f,0.109333f, +-0.00609097f,0.990503f,0.137353f, +0.218751f,0.975042f,-0.0379662f, +0.195675f,0.973574f,0.117747f, +0.412438f,0.903178f,-0.119012f, +0.389829f,0.920771f,0.01463f, +0.471887f,0.878868f,-0.0700914f, +0.512637f,0.843878f,0.158344f, +0.438398f,0.898776f,-0.0028899f, +0.463505f,0.872879f,0.152466f, +0.213581f,0.96879f,0.125817f, +0.217949f,0.966902f,0.132661f, +0.150053f,0.978231f,0.143348f, +0.183142f,0.954792f,0.234161f, +0.324547f,0.937949f,0.122152f, +0.305949f,0.944044f,0.123194f, +0.404781f,0.90011f,0.161105f, +0.386685f,0.917163f,0.0963685f, +0.43511f,0.894378f,0.103764f, +0.444378f,0.884165f,0.144156f, +0.485066f,0.871945f,0.0665013f, +0.480511f,0.864609f,0.146835f, +0.542329f,0.83784f,0.0624783f, +0.538258f,0.834152f,0.120286f, +0.497652f,0.86488f,0.0657686f, +0.471897f,0.881288f,0.0253797f, +0.368509f,0.927548f,0.0620863f, +0.391828f,0.918428f,0.0544149f, +0.284879f,0.953389f,0.0994662f, +0.359932f,0.902669f,0.235877f, +0.19297f,0.969614f,0.150374f, +0.198191f,0.923716f,0.327825f, +0.174784f,0.978101f,0.113003f, +0.121688f,0.95783f,0.260297f, +0.3291f,0.939598f,0.094074f, +0.241925f,0.967997f,0.066744f, +0.275982f,0.959352f,0.0589789f, +0.207349f,0.969048f,-0.133986f, +-0.048418f,0.997403f,0.0533214f, +-0.0214229f,0.995947f,-0.0873486f, +-0.224808f,0.97209f,0.0671032f, +-0.154526f,0.98721f,0.0392114f, +-0.0539424f,0.990401f,0.127262f, +0.0294265f,0.986864f,0.158851f, +0.115045f,0.967726f,0.224212f, +0.135755f,0.967813f,0.211917f, +-0.0987201f,0.976534f,0.191406f, +-0.208734f,0.974954f,0.0767793f, +-0.346094f,0.938088f,0.0144628f, +-0.364883f,0.930977f,0.0119327f, +-0.234075f,0.972082f,0.0162811f, +-0.216489f,0.973875f,0.0685516f, +-0.126585f,0.991898f,0.0107448f, +-0.188432f,0.981937f,-0.0171439f, +-0.186728f,0.980312f,-0.0641921f, +-0.243763f,0.959118f,-0.14378f, +-0.256453f,0.962392f,-0.0896326f, +-0.227009f,0.972481f,-0.0524148f, +-0.308642f,0.945388f,-0.104794f, +-0.322884f,0.94242f,-0.0871231f, +-0.32494f,0.940988f,-0.0946312f, +-0.365791f,0.920972f,-0.134189f, +0.507209f,0.830952f,0.228598f, +0.427157f,0.893788f,0.136676f, +0.390358f,0.920644f,0.00595094f, +0.357f,0.931227f,0.0732586f, +0.253669f,0.95455f,0.156478f, +0.247974f,0.954291f,0.166849f, +0.303694f,0.950352f,0.0678299f, +0.260247f,0.965246f,0.0238949f, +-0.0615746f,0.996768f,-0.0515863f, +-0.225111f,0.970921f,-0.0814727f, +-0.33579f,0.924057f,-0.18266f, +-0.286567f,0.949099f,-0.13073f, +-0.266283f,0.957101f,-0.114241f, +-0.297972f,0.942451f,-0.151651f, +-0.345158f,0.930403f,-0.123358f, +-0.323606f,0.933615f,-0.153759f, +-0.295216f,0.935234f,-0.195409f, +-0.294262f,0.935546f,-0.195355f, +-0.367877f,0.896699f,-0.246165f, +-0.460611f,0.856308f,-0.233612f, +-0.493615f,0.869663f,0.00556421f, +-0.56572f,0.819247f,0.0937815f, +-0.482796f,0.868728f,0.110547f, +-0.473443f,0.870107f,0.136985f, +-0.486628f,0.863931f,0.12968f, +-0.584612f,0.809918f,-0.0475519f, +-0.673803f,0.720247f,-0.165027f, +-0.584438f,0.811258f,-0.0171189f, +-0.49626f,0.855798f,0.146063f, +-0.266763f,0.927018f,0.26358f, +-0.000318467f,0.974136f,0.225963f, +-0.2098f,0.977621f,0.015525f, +-0.363964f,0.929076f,-0.0659462f, +-0.427799f,0.890708f,-0.153708f, +-0.226888f,0.973494f,-0.0288381f, +0.176474f,0.981f,0.080593f, +0.382766f,0.920418f,-0.0794987f, +0.4558f,0.874041f,-0.16822f, +0.44168f,0.87342f,-0.205075f, +0.269141f,0.944688f,-0.187422f, +0.0983269f,0.994746f,0.0285051f, +0.164874f,0.980231f,0.10938f, +0.300398f,0.949423f,0.0914149f, +0.370498f,0.925363f,0.0802133f, +0.51325f,0.857062f,0.0449297f, +0.515688f,0.85628f,-0.0291725f, +0.532902f,0.845818f,-0.0246416f, +0.470584f,0.882352f,0.00224652f, +0.358364f,0.932053f,0.0534101f, +0.299916f,0.948938f,0.0978121f, +0.234125f,0.96956f,0.0716857f, +0.201429f,0.97943f,0.0119968f, +0.257021f,0.965839f,0.0330825f, +0.205585f,0.966488f,0.153741f, +-0.0291083f,0.972977f,0.22906f, +-0.183781f,0.97216f,0.145362f, +-0.0880966f,0.991634f,0.0943445f, +0.0404056f,0.991359f,0.124796f, +-0.0259416f,0.986408f,0.162256f, +-0.213262f,0.97241f,0.0945471f, +-0.221976f,0.974645f,0.0281856f, +-0.137418f,0.990413f,0.014064f, +-0.147111f,0.988464f,0.0360112f, +-0.213681f,0.97687f,0.00813376f, +-0.286716f,0.957516f,-0.0309366f, +-0.362687f,0.929548f,-0.0663186f, +0.471826f,0.881687f,0.00273101f, +0.493844f,0.862721f,0.108764f, +0.305852f,0.940961f,0.145073f, +0.225186f,0.91763f,0.327484f, +0.255894f,0.905552f,0.33837f, +0.302798f,0.922674f,0.238719f, +0.353759f,0.914443f,0.196594f, +0.301669f,0.941039f,0.153105f, +0.00675732f,0.993813f,0.110864f, +-0.180673f,0.978312f,0.101302f, +-0.247784f,0.966857f,0.0615767f, +-0.309703f,0.949482f,-0.0506691f, +-0.243038f,0.969623f,-0.0276337f, +-0.257234f,0.966017f,-0.0253295f, +-0.381367f,0.920413f,-0.0860151f, +-0.354157f,0.93479f,-0.027217f, +-0.299485f,0.952671f,0.0522246f, +-0.356888f,0.9323f,0.0587106f, +-0.335176f,0.924244f,0.182839f, +-0.500593f,0.855036f,0.135351f, +-0.576428f,0.801243f,0.160441f, +-0.583679f,0.788168f,0.195218f, +-0.491918f,0.829821f,0.263465f, +-0.431671f,0.862042f,0.2656f, +-0.443518f,0.883408f,0.151265f, +-0.464317f,0.881859f,0.0820666f, +-0.652068f,0.753609f,-0.0829502f, +-0.681939f,0.728217f,-0.068254f, +-0.591161f,0.804152f,0.0621953f, +-0.352647f,0.921747f,0.161318f, +0.0545396f,0.95959f,0.276065f, +0.0694942f,0.971972f,0.224591f, +-0.253858f,0.964902f,-0.0672354f, +-0.408551f,0.900688f,-0.147807f, +-0.327666f,0.933936f,-0.142825f, +0.129878f,0.985787f,-0.106564f, +0.442239f,0.89421f,-0.0693695f, +0.506959f,0.860716f,-0.0464834f, +0.440087f,0.895465f,-0.0668225f, +0.226441f,0.974021f,0.00265329f, +-0.0272959f,0.999596f,0.00787303f, +0.0903893f,0.995643f,0.0228958f, +0.359925f,0.931179f,0.0579615f, +0.431266f,0.899788f,-0.0662666f, +0.53735f,0.839722f,-0.0782406f, +0.525898f,0.846474f,-0.0831443f, +0.503404f,0.859213f,-0.0913118f, +0.450901f,0.892319f,-0.0213084f, +0.278054f,0.959353f,0.048252f, +0.254295f,0.953824f,0.159853f, +0.246692f,0.953779f,0.171608f, +0.237766f,0.960301f,0.145908f, +0.249319f,0.965473f,0.0755121f, +0.140552f,0.989905f,0.0182753f, +-0.0589195f,0.996842f,0.0532477f, +-0.101426f,0.988847f,0.109061f, +-0.043669f,0.99706f,0.0629708f, +0.0474685f,0.998853f,-0.0063145f, +-0.0867729f,0.996136f,-0.0135299f, +-0.196161f,0.972844f,0.12286f, +-0.192413f,0.974994f,0.111196f, +-0.123107f,0.990318f,0.0641543f, +-0.164426f,0.985628f,0.0387435f, +-0.213922f,0.974633f,0.0657922f, +-0.241049f,0.968373f,0.0644173f, +-0.307154f,0.951627f,-0.00792363f, +0.280771f,0.958227f,-0.0544817f, +0.299035f,0.949091f,0.0990176f, +0.225174f,0.937279f,0.266091f, +0.201765f,0.945847f,0.254291f, +0.341377f,0.920786f,0.18872f, +0.3743f,0.913661f,0.158502f, +0.359138f,0.923211f,0.136755f, +0.36518f,0.919296f,0.146759f, +0.0046348f,0.996002f,0.0892048f, +-0.241229f,0.954179f,0.177061f, +-0.158349f,0.951157f,0.265002f, +-0.207545f,0.971279f,0.116375f, +-0.289845f,0.957072f,0.00156201f, +-0.257416f,0.96626f,0.00885102f, +-0.326801f,0.944936f,0.0172234f, +-0.439204f,0.898379f,-0.00377194f, +-0.336537f,0.936282f,0.100589f, +-0.407285f,0.907139f,0.105914f, +-0.44858f,0.865076f,0.224543f, +-0.454994f,0.838311f,0.300358f, +-0.578424f,0.785375f,0.220483f, +-0.613986f,0.761879f,0.206302f, +-0.509143f,0.819763f,0.262226f, +-0.364105f,0.879908f,0.30527f, +-0.344494f,0.905138f,0.249097f, +-0.369295f,0.913195f,0.172323f, +-0.574832f,0.817482f,0.0359178f, +-0.689125f,0.724332f,-0.0212343f, +-0.619919f,0.781232f,-0.0733212f, +-0.441345f,0.892835f,-0.0897783f, +-0.0649595f,0.996915f,0.0440505f, +0.146397f,0.977716f,0.150467f, +-0.0177868f,0.998167f,0.0578468f, +-0.37006f,0.91802f,-0.14246f, +-0.30849f,0.937533f,-0.160828f, +0.107382f,0.980696f,-0.163415f, +0.392635f,0.914926f,-0.093533f, +0.501877f,0.862749f,-0.0615151f, +0.381618f,0.912204f,-0.14917f, +0.160415f,0.986769f,-0.0235493f, +0.0253729f,0.99703f,0.0727145f, +0.144484f,0.989507f,0.000443305f, +0.379228f,0.922372f,-0.073601f, +0.493599f,0.867009f,-0.0682314f, +0.529895f,0.842151f,-0.099967f, +0.549367f,0.821638f,-0.152008f, +0.439412f,0.876451f,-0.196851f, +0.349224f,0.935858f,0.0470259f, +0.182079f,0.971589f,0.151205f, +0.194383f,0.962201f,0.190749f, +0.266182f,0.94835f,0.172569f, +0.284034f,0.949535f,0.133071f, +0.347472f,0.93345f,0.089069f, +0.226103f,0.974059f,0.00925465f, +-0.0773561f,0.993257f,-0.0863519f, +-0.200366f,0.974099f,-0.104811f, +-0.00292133f,0.99995f,-0.00953497f, +0.144264f,0.988303f,-0.0494442f, +-0.155865f,0.979469f,-0.127857f, +-0.286146f,0.957784f,-0.0277406f, +-0.165259f,0.985103f,-0.0475661f, +-0.069504f,0.996782f,-0.0399387f, +-0.139315f,0.988254f,-0.0628056f, +-0.230813f,0.967463f,-0.103639f, +-0.24543f,0.966984f,-0.0686046f, +-0.189537f,0.981091f,0.0391957f, +0.151487f,0.988375f,0.0128779f, +0.16936f,0.984329f,0.0491336f, +0.218781f,0.968894f,0.115672f, +0.279098f,0.952669f,0.120523f, +0.344688f,0.931221f,0.118397f, +0.359727f,0.914297f,0.186165f, +0.326371f,0.918389f,0.223703f, +0.361839f,0.886899f,0.287197f, +-0.000924981f,0.965442f,0.260617f, +-0.321168f,0.914653f,0.24548f, +-0.23578f,0.933549f,0.269988f, +-0.0519805f,0.910912f,0.409313f, +-0.120702f,0.947306f,0.296721f, +-0.257649f,0.956241f,0.138637f, +-0.340179f,0.924947f,0.169564f, +-0.415425f,0.90289f,0.110507f, +-0.41038f,0.91038f,0.0528755f, +-0.447459f,0.881081f,0.153222f, +-0.521314f,0.820871f,0.233245f, +-0.470597f,0.83806f,0.27603f, +-0.530303f,0.820989f,0.211554f, +-0.59428f,0.795918f,0.11552f, +-0.564828f,0.823165f,0.0580397f, +-0.435129f,0.882511f,0.17843f, +-0.320859f,0.891866f,0.318787f, +-0.272192f,0.902535f,0.33368f, +-0.476067f,0.856837f,0.197967f, +-0.671403f,0.739101f,0.0543033f, +-0.548598f,0.834125f,0.0572312f, +-0.459373f,0.883769f,-0.0890421f, +-0.194341f,0.977153f,-0.0860449f, +0.0638196f,0.997784f,0.0188364f, +0.119241f,0.989813f,0.0777976f, +-0.189205f,0.978439f,-0.0828203f, +-0.328042f,0.913868f,-0.239234f, +0.0439005f,0.976566f,-0.210694f, +0.345392f,0.929362f,-0.130351f, +0.531991f,0.841029f,-0.0982628f, +0.385958f,0.912021f,-0.13876f, +0.00996624f,0.998173f,-0.059598f, +-0.0397997f,0.999182f,0.00710574f, +0.22423f,0.974041f,-0.0310806f, +0.399529f,0.909843f,-0.112084f, +0.472825f,0.876316f,-0.0922302f, +0.567959f,0.818431f,-0.0871407f, +0.591097f,0.802347f,-0.0827227f, +0.294969f,0.954774f,-0.0374031f, +0.136562f,0.986139f,0.0942395f, +0.140836f,0.978895f,0.148089f, +0.208743f,0.962024f,0.175889f, +0.331657f,0.931412f,0.149918f, +0.32318f,0.945148f,0.0474422f, +0.378499f,0.925602f,0.000447487f, +0.240237f,0.969087f,-0.0561752f, +0.0676245f,0.996927f,-0.0395359f, +-0.154966f,0.962822f,-0.221268f, +-0.087338f,0.971663f,-0.219642f, +0.144581f,0.983839f,-0.105631f, +-0.0884322f,0.993076f,-0.0773351f, +-0.293638f,0.94457f,-0.146848f, +-0.135408f,0.983934f,-0.116358f, +-0.103543f,0.987494f,-0.11889f, +-0.104597f,0.98248f,-0.15425f, +-0.176622f,0.962045f,-0.208023f, +-0.325467f,0.923065f,-0.204992f, +-0.403927f,0.903415f,-0.143824f, +0.344389f,0.929213f,0.134014f, +0.233815f,0.972165f,0.0150206f, +0.162621f,0.985815f,-0.0415186f, +0.195602f,0.980526f,0.0175561f, +0.28987f,0.950331f,0.113346f, +0.255987f,0.942074f,0.216718f, +0.263495f,0.890351f,0.371275f, +0.315069f,0.864416f,0.391812f, +0.0646003f,0.916859f,0.39395f, +-0.213657f,0.9234f,0.318877f, +-0.307635f,0.926495f,0.216719f, +-0.201977f,0.923807f,0.325246f, +-0.0210673f,0.916391f,0.399731f, +-0.17042f,0.919713f,0.353674f, +-0.316748f,0.899919f,0.299695f, +-0.294061f,0.92391f,0.244781f, +-0.396636f,0.905857f,0.14867f, +-0.523471f,0.83043f,0.190696f, +-0.568887f,0.791598f,0.223024f, +-0.446362f,0.844948f,0.294659f, +-0.453253f,0.853996f,0.255447f, +-0.541011f,0.824142f,0.167623f, +-0.550736f,0.81694f,0.171169f, +-0.53915f,0.819657f,0.193597f, +-0.444412f,0.862352f,0.242584f, +-0.285315f,0.907749f,0.30755f, +-0.329395f,0.886574f,0.324786f, +-0.610599f,0.78547f,0.101022f, +-0.543486f,0.838015f,0.0485148f, +-0.319704f,0.945394f,0.0634074f, +-0.262212f,0.963421f,-0.055354f, +0.000253525f,0.995852f,0.0909893f, +0.105619f,0.991464f,0.0764441f, +0.0245363f,0.999682f,-0.00586488f, +-0.22917f,0.926966f,-0.29701f, +-0.0159754f,0.943632f,-0.33061f, +0.309925f,0.920539f,-0.237812f, +0.48714f,0.850311f,-0.199165f, +0.288684f,0.955866f,-0.0546085f, +-0.0787222f,0.994967f,0.0619939f, +0.0273777f,0.99772f,0.0616831f, +0.291481f,0.955243f,-0.0505022f, +0.438727f,0.89664f,-0.0596253f, +0.485213f,0.871546f,-0.0705428f, +0.5406f,0.839608f,-0.0530067f, +0.49511f,0.866937f,0.0573254f, +0.280189f,0.947413f,0.154605f, +0.158816f,0.979113f,0.126949f, +0.168625f,0.983554f,0.0647105f, +0.187616f,0.98216f,0.0127302f, +0.334023f,0.942557f,0.00379923f, +0.401318f,0.914355f,0.0538517f, +0.424638f,0.905172f,0.0185914f, +0.289448f,0.956081f,-0.0461475f, +0.0899479f,0.980871f,-0.172633f, +-0.00560791f,0.970967f,-0.23915f, +-0.153691f,0.938842f,-0.308149f, +-0.0450622f,0.984719f,-0.168219f, +-0.0818032f,0.994271f,0.0687937f, +-0.254478f,0.967062f,-0.0056871f, +-0.190127f,0.974114f,-0.122284f, +-0.0615121f,0.986397f,-0.152435f, +-0.0478084f,0.984317f,-0.169808f, +-0.157882f,0.979732f,-0.123284f, +-0.307356f,0.93941f,-0.151791f, +-0.432596f,0.869844f,-0.237133f, +0.35469f,0.923204f,0.147951f, +0.317903f,0.938384f,0.135547f, +0.209784f,0.976723f,0.0447562f, +0.188401f,0.980806f,-0.0502544f, +0.153267f,0.987748f,-0.0293859f, +0.102074f,0.966336f,0.236167f, +0.128463f,0.933972f,0.333456f, +0.308207f,0.882627f,0.354934f, +0.141883f,0.91146f,0.386148f, +-0.174863f,0.945456f,0.274837f, +-0.248524f,0.937312f,0.244299f, +-0.268339f,0.945888f,0.182456f, +-0.0843285f,0.960488f,0.265238f, +-0.151825f,0.934815f,0.321045f, +-0.286064f,0.900967f,0.326231f, +-0.240679f,0.904695f,0.351568f, +-0.362345f,0.88785f,0.2836f, +-0.538142f,0.813225f,0.221511f, +-0.57294f,0.797677f,0.188284f, +-0.51091f,0.838129f,0.191079f, +-0.412611f,0.865658f,0.283528f, +-0.528395f,0.821979f,0.212483f, +-0.579097f,0.792111f,0.192891f, +-0.502268f,0.843036f,0.192398f, +-0.402738f,0.896524f,0.184518f, +-0.323371f,0.930281f,0.173231f, +-0.341027f,0.92193f,0.183699f, +-0.49586f,0.861123f,0.112209f, +-0.562176f,0.82675f,-0.0210484f, +-0.29935f,0.952705f,0.0523715f, +-0.273263f,0.96182f,0.0151701f, +-0.127856f,0.984802f,0.117552f, +0.16681f,0.967622f,0.189425f, +0.219885f,0.966852f,0.1298f, +0.0444925f,0.994595f,-0.093817f, +-0.0559771f,0.948894f,-0.31059f, +0.229668f,0.93439f,-0.272337f, +0.391338f,0.907289f,-0.153889f, +0.215699f,0.975228f,0.0490428f, +-0.1202f,0.992098f,0.0359644f, +0.0568932f,0.997098f,0.0505773f, +0.369571f,0.928802f,0.0272646f, +0.435039f,0.898005f,-0.0657877f, +0.45866f,0.886154f,-0.0660444f, +0.484136f,0.874975f,0.00559808f, +0.464546f,0.884206f,0.0487577f, +0.311084f,0.947795f,0.0700806f, +0.215922f,0.975139f,0.0498078f, +0.229266f,0.973122f,-0.0216826f, +0.269391f,0.956816f,-0.109228f, +0.297276f,0.941247f,-0.160256f, +0.352506f,0.931874f,-0.0857318f, +0.363875f,0.92958f,-0.0589632f, +0.421372f,0.901903f,0.094954f, +0.220959f,0.972251f,-0.0768509f, +0.0552433f,0.994093f,-0.0934223f, +-0.134577f,0.980922f,-0.140288f, +-0.247593f,0.953903f,-0.169607f, +-0.238891f,0.96987f,-0.0477791f, +-0.130123f,0.990325f,-0.0482061f, +0.00814361f,0.986901f,-0.161119f, +-0.0740374f,0.970051f,-0.231345f, +-0.135238f,0.990526f,-0.0238593f, +-0.204897f,0.978574f,0.0202582f, +-0.205889f,0.977122f,-0.0533174f, +-0.236999f,0.963982f,-0.120711f, +0.399314f,0.905653f,0.142621f, +0.334882f,0.936094f,0.107618f, +0.310789f,0.943606f,0.114093f, +0.298988f,0.952609f,0.0560503f, +0.00373107f,0.999894f,-0.0140921f, +-0.127729f,0.983543f,0.12778f, +0.134365f,0.969696f,0.204046f, +0.250753f,0.938877f,0.235867f, +0.172971f,0.901933f,0.395725f, +-0.0661635f,0.938085f,0.340027f, +-0.190026f,0.944561f,0.267758f, +-0.246469f,0.952194f,0.180498f, +-0.199636f,0.962622f,0.183041f, +-0.204824f,0.924659f,0.321019f, +-0.345906f,0.869848f,0.351729f, +-0.272906f,0.86539f,0.420265f, +-0.23738f,0.86577f,0.44056f, +-0.476597f,0.838274f,0.264863f, +-0.549692f,0.815624f,0.180542f, +-0.521659f,0.837826f,0.160993f, +-0.461012f,0.874551f,0.150426f, +-0.498406f,0.858536f,0.120447f, +-0.538861f,0.837113f,0.0941878f, +-0.51696f,0.855065f,0.0401927f, +-0.464195f,0.882878f,0.0710582f, +-0.339798f,0.923706f,0.176929f, +-0.307071f,0.929998f,0.202016f, +-0.435636f,0.887155f,0.152245f, +-0.50925f,0.856289f,0.0862179f, +-0.352613f,0.935762f,-0.00363908f, +-0.24432f,0.969666f,0.0074465f, +-0.223693f,0.974193f,-0.0301471f, +0.0924619f,0.993171f,0.071143f, +0.248444f,0.955155f,0.161104f, +0.25541f,0.957577f,0.133462f, +0.152224f,0.983188f,-0.100846f, +0.175485f,0.954332f,-0.241774f, +0.229817f,0.96697f,-0.110245f, +0.104087f,0.990176f,0.0933667f, +-0.0251916f,0.99085f,0.132593f, +0.0299952f,0.999356f,-0.0197015f, +0.374506f,0.927216f,-0.00387803f, +0.523769f,0.851516f,-0.0242066f, +0.412003f,0.903869f,-0.115217f, +0.44751f,0.89427f,-0.00401492f, +0.502351f,0.864643f,-0.0060566f, +0.261187f,0.953407f,-0.150988f, +0.201827f,0.974066f,-0.102283f, +0.328474f,0.941424f,-0.0763319f, +0.327281f,0.932573f,-0.152297f, +0.312159f,0.927432f,-0.205977f, +0.304739f,0.922289f,-0.237734f, +0.291399f,0.941708f,-0.168142f, +0.325323f,0.94222f,-0.0799213f, +0.270502f,0.962573f,-0.0167793f, +-0.00135827f,0.998382f,0.0568385f, +-0.0464612f,0.993882f,0.100202f, +-0.163616f,0.983349f,-0.0790802f, +-0.219372f,0.956704f,-0.191292f, +-0.0798083f,0.976764f,-0.198904f, +-0.0362508f,0.993161f,-0.11098f, +-0.194493f,0.976824f,0.0893684f, +-0.303508f,0.929002f,0.211751f, +-0.120982f,0.967912f,0.220249f, +-0.126864f,0.979558f,0.156117f, +-0.190168f,0.969475f,0.154773f, +0.442277f,0.894635f,0.0633978f, +0.351901f,0.932017f,0.0866602f, +0.271089f,0.951246f,0.147111f, +0.263373f,0.940704f,0.2138f, +0.0780789f,0.961317f,0.264145f, +-0.165165f,0.972713f,0.162944f, +0.054241f,0.96435f,0.259011f, +0.119009f,0.928226f,0.352467f, +0.062551f,0.905107f,0.420558f, +-0.0376962f,0.903166f,0.427633f, +-0.119235f,0.864868f,0.487634f, +-0.107099f,0.89512f,0.43277f, +-0.228241f,0.933808f,0.275515f, +-0.34367f,0.891778f,0.294319f, +-0.360994f,0.863066f,0.353271f, +-0.329935f,0.870805f,0.364474f, +-0.225803f,0.873787f,0.430708f, +-0.324138f,0.85889f,0.396537f, +-0.511071f,0.812187f,0.281352f, +-0.475013f,0.824987f,0.306202f, +-0.392033f,0.887928f,0.240612f, +-0.45534f,0.876633f,0.155499f, +-0.547025f,0.829694f,0.111226f, +-0.496064f,0.862275f,0.101992f, +-0.479515f,0.87606f,0.0508306f, +-0.424535f,0.90465f,0.0371277f, +-0.362147f,0.919497f,0.152886f, +-0.412742f,0.878092f,0.24207f, +-0.402299f,0.893898f,0.197745f, +-0.26297f,0.963672f,0.0467231f, +-0.219075f,0.975598f,-0.0146319f, +-0.186267f,0.980099f,-0.0686323f, +-0.0357984f,0.992879f,-0.113625f, +0.180598f,0.983509f,0.00973344f, +0.28459f,0.957748f,0.0415635f, +0.350884f,0.934731f,0.0561944f, +0.201029f,0.975728f,-0.0868401f, +0.10163f,0.994331f,-0.0312587f, +-0.0498772f,0.998294f,0.0303674f, +0.0144565f,0.996475f,0.082632f, +0.17671f,0.984206f,0.0105968f, +0.384098f,0.921983f,-0.049144f, +0.526508f,0.848767f,-0.048829f, +0.451141f,0.890087f,-0.0649363f, +0.349978f,0.927792f,-0.129298f, +0.525028f,0.849511f,-0.051734f, +0.403316f,0.902994f,-0.148114f, +0.146493f,0.950082f,-0.275472f, +0.257494f,0.953663f,-0.155639f, +0.363336f,0.930153f,-0.0529431f, +0.407301f,0.911128f,-0.0628641f, +0.309341f,0.935596f,-0.170201f, +0.234661f,0.952473f,-0.194238f, +0.248922f,0.950735f,-0.18477f, +0.176271f,0.982701f,-0.0568089f, +-0.0817466f,0.996475f,0.0188703f, +-0.0390696f,0.99855f,0.0370285f, +0.0392849f,0.997614f,0.0567754f, +-0.165147f,0.985538f,-0.0379532f, +-0.216905f,0.97598f,0.020392f, +-0.25871f,0.942954f,0.209538f, +-0.318314f,0.87576f,0.362933f, +-0.238112f,0.92993f,0.280235f, +-0.11178f,0.963059f,0.244995f, +-0.156033f,0.939968f,0.303502f, +-0.219558f,0.904757f,0.364977f, +0.29059f,0.953077f,-0.0848643f, +0.282679f,0.959209f,-0.00326087f, +0.165956f,0.986031f,0.0141778f, +0.145774f,0.971701f,0.185869f, +0.0971539f,0.92606f,0.364656f, +-0.126893f,0.938591f,0.320851f, +-0.158756f,0.918948f,0.361014f, +0.0576791f,0.877286f,0.47649f, +0.151465f,0.884095f,0.442079f, +-0.0842052f,0.912347f,0.400665f, +-0.236928f,0.870703f,0.430978f, +-0.0173538f,0.858153f,0.513101f, +-0.0453547f,0.868839f,0.493013f, +-0.308698f,0.88215f,0.355692f, +-0.391959f,0.868398f,0.303732f, +-0.360504f,0.877037f,0.317558f, +-0.289644f,0.88703f,0.359561f, +-0.323579f,0.85156f,0.412484f, +-0.483914f,0.781191f,0.39442f, +-0.428744f,0.813324f,0.393297f, +-0.337017f,0.871068f,0.357294f, +-0.382215f,0.837599f,0.390306f, +-0.472752f,0.816976f,0.330237f, +-0.454132f,0.848356f,0.272131f, +-0.386129f,0.879637f,0.277745f, +-0.408175f,0.895196f,0.178931f, +-0.461039f,0.873474f,0.15648f, +-0.444429f,0.876284f,0.186035f, +-0.324725f,0.941951f,0.085336f, +-0.200261f,0.979518f,0.0209972f, +-0.146655f,0.98862f,0.0335086f, +-0.105669f,0.986512f,-0.125016f, +-0.0113758f,0.977088f,-0.21253f, +0.125756f,0.969156f,-0.211948f, +0.231535f,0.947003f,-0.222657f, +0.267937f,0.954488f,-0.131005f, +0.231299f,0.971277f,0.055871f, +0.0809071f,0.991774f,0.0991925f, +0.000207679f,0.999953f,0.00973996f, +0.0247831f,0.993578f,-0.110402f, +0.181304f,0.979201f,-0.0910725f, +0.390907f,0.919373f,-0.0441033f, +0.523664f,0.849877f,-0.0590321f, +0.487061f,0.873094f,-0.0218679f, +0.442794f,0.892691f,-0.0838822f, +0.486459f,0.850567f,-0.199735f, +0.449595f,0.886474f,-0.10967f, +0.172841f,0.979158f,-0.106661f, +0.134151f,0.987388f,-0.084069f, +0.292984f,0.955775f,-0.0255695f, +0.391346f,0.920229f,-0.00512785f, +0.418943f,0.907957f,0.00999318f, +0.324262f,0.936698f,-0.1321f, +0.190686f,0.957473f,-0.216527f, +0.0619887f,0.993289f,-0.097645f, +-0.0829846f,0.99633f,-0.0209901f, +-0.0646754f,0.997763f,-0.0169202f, +-0.0614217f,0.996217f,0.0614677f, +-0.189778f,0.963623f,0.188191f, +-0.363861f,0.896503f,0.25276f, +-0.348308f,0.859996f,0.372945f, +-0.264506f,0.906439f,0.329249f, +-0.140762f,0.939057f,0.31362f, +-0.154941f,0.944783f,0.288752f, +-0.237481f,0.904164f,0.355093f, +-0.314839f,0.867723f,0.38462f, +0.199283f,0.97456f,-0.102566f, +0.290362f,0.956152f,-0.0382605f, +0.163603f,0.98144f,-0.10005f, +-0.0845537f,0.992536f,-0.0878854f, +-0.0995819f,0.988025f,0.117859f, +-0.128698f,0.94862f,0.289062f, +-0.181988f,0.934999f,0.304396f, +0.0121717f,0.953274f,0.301863f, +0.15771f,0.909532f,0.384551f, +-0.030083f,0.904525f,0.425359f, +-0.262213f,0.918561f,0.295788f, +-0.150427f,0.932893f,0.327234f, +-0.0433771f,0.888915f,0.456013f, +-0.194904f,0.882492f,0.428042f, +-0.359771f,0.865678f,0.348089f, +-0.358104f,0.856009f,0.37284f, +-0.334766f,0.853069f,0.400257f, +-0.382047f,0.809514f,0.445788f, +-0.440041f,0.772384f,0.458024f, +-0.392897f,0.847233f,0.357532f, +-0.352962f,0.862399f,0.362885f, +-0.432462f,0.797784f,0.42014f, +-0.40741f,0.807767f,0.426063f, +-0.417686f,0.831448f,0.366378f, +-0.406533f,0.835025f,0.370761f, +-0.302917f,0.831265f,0.466089f, +-0.354465f,0.85583f,0.376708f, +-0.320875f,0.930472f,0.17681f, +-0.210666f,0.977556f,0.00208309f, +-0.202152f,0.976764f,-0.0711849f, +-0.0734606f,0.993473f,-0.0872598f, +0.0104554f,0.979699f,-0.2002f, +0.0812548f,0.981491f,-0.173417f, +0.133484f,0.953074f,-0.271721f, +0.239226f,0.941558f,-0.23715f, +0.0986638f,0.979162f,-0.177504f, +0.0167662f,0.999807f,0.0102821f, +0.0608252f,0.989728f,0.129377f, +0.193478f,0.976369f,0.0962839f, +0.105893f,0.986391f,-0.125774f, +0.159018f,0.972139f,-0.17222f, +0.348199f,0.916375f,-0.197521f, +0.506641f,0.853561f,-0.121441f, +0.438954f,0.895697f,-0.0710352f, +0.508211f,0.861156f,-0.0114456f, +0.538629f,0.837641f,-0.0907543f, +0.350973f,0.934296f,-0.0625226f, +0.130826f,0.991364f,0.00901604f, +0.142249f,0.989581f,0.0222434f, +0.314713f,0.948656f,-0.0317428f, +0.413134f,0.902882f,-0.118849f, +0.421178f,0.889709f,-0.176143f, +0.40304f,0.897538f,-0.178843f, +0.190553f,0.961133f,-0.199782f, +-0.0704956f,0.989551f,-0.125772f, +-0.145721f,0.988685f,0.035603f, +-0.158165f,0.979549f,0.124366f, +-0.141884f,0.945197f,0.294061f, +-0.282634f,0.89813f,0.336869f, +-0.398539f,0.847577f,0.350398f, +-0.326007f,0.891199f,0.31541f, +-0.257935f,0.930645f,0.259558f, +-0.189362f,0.933131f,0.305628f, +-0.181998f,0.908713f,0.375656f, +-0.284451f,0.857477f,0.428743f, +-0.324962f,0.834267f,0.445419f, +0.162722f,0.967013f,-0.19598f, +0.196801f,0.96943f,-0.146541f, +0.171798f,0.98444f,0.0369126f, +-0.0614366f,0.993745f,0.0932502f, +-0.263807f,0.962515f,0.063023f, +-0.262644f,0.943232f,0.203304f, +-0.183229f,0.945939f,0.267632f, +-0.0512022f,0.955564f,0.290302f, +0.0500709f,0.932925f,0.356571f, +-0.017607f,0.930336f,0.366286f, +-0.141345f,0.917863f,0.370876f, +-0.196664f,0.921785f,0.334121f, +-0.123639f,0.931227f,0.342826f, +-0.166673f,0.929929f,0.327799f, +-0.365314f,0.882118f,0.297345f, +-0.422119f,0.842584f,0.334465f, +-0.378137f,0.838603f,0.392119f, +-0.433991f,0.800503f,0.413336f, +-0.373446f,0.819157f,0.435339f, +-0.321191f,0.877582f,0.35593f, +-0.410179f,0.839146f,0.357194f, +-0.450466f,0.792998f,0.410164f, +-0.383405f,0.853385f,0.353178f, +-0.361072f,0.88078f,0.306355f, +-0.471517f,0.844691f,0.253315f, +-0.399349f,0.852332f,0.337713f, +-0.193735f,0.889811f,0.413163f, +-0.0964184f,0.953204f,0.28654f, +-0.0731968f,0.993583f,0.0862245f, +-0.107213f,0.990087f,-0.0907379f, +-0.0139207f,0.976637f,-0.214443f, +-0.00517032f,0.976967f,-0.213328f, +0.032564f,0.990278f,-0.135238f, +0.193406f,0.974103f,-0.117123f, +0.137302f,0.989014f,-0.0547632f, +0.0149454f,0.997504f,0.06901f, +-0.0673257f,0.995987f,0.0589639f, +0.00671915f,0.997834f,0.0654375f, +0.236496f,0.961793f,0.137925f, +0.296243f,0.953456f,0.0562338f, +0.227931f,0.966806f,-0.11547f, +0.392626f,0.909868f,-0.134105f, +0.455312f,0.880641f,-0.131003f, +0.402519f,0.906647f,-0.126375f, +0.459051f,0.879656f,-0.124406f, +0.531911f,0.846049f,-0.0356662f, +0.366681f,0.930218f,0.0155094f, +0.101768f,0.992829f,-0.0627213f, +0.169781f,0.984995f,-0.0309622f, +0.383193f,0.921183f,-0.0677109f, +0.483652f,0.86784f,-0.113728f, +0.481548f,0.864447f,-0.144373f, +0.322376f,0.925659f,-0.198063f, +0.121084f,0.992307f,-0.0257868f, +-0.189201f,0.97803f,0.0875253f, +-0.272481f,0.941614f,0.197779f, +-0.28107f,0.929157f,0.240138f, +-0.316277f,0.890261f,0.327726f, +-0.284096f,0.875896f,0.389994f, +-0.304764f,0.879665f,0.365114f, +-0.295018f,0.913863f,0.278959f, +-0.233864f,0.913909f,0.331779f, +-0.25276f,0.886942f,0.386584f, +-0.254968f,0.846261f,0.467797f, +-0.324913f,0.811645f,0.485452f, +-0.330966f,0.801562f,0.497956f, +0.166281f,0.984047f,-0.0632562f, +0.102172f,0.992786f,-0.0627485f, +-0.0446214f,0.999004f,-0.000325965f, +-0.137659f,0.980871f,0.13763f, +-0.270041f,0.94552f,0.18185f, +-0.300503f,0.932348f,0.201063f, +-0.224552f,0.960314f,0.165452f, +-0.109331f,0.978965f,0.17226f, +0.0684226f,0.972288f,0.223551f, +-0.0281009f,0.965962f,0.257154f, +-0.203983f,0.927334f,0.313757f, +-0.170837f,0.935943f,0.307937f, +-0.0844776f,0.951083f,0.29716f, +-0.140439f,0.935294f,0.32481f, +-0.360713f,0.879742f,0.309743f, +-0.466354f,0.845167f,0.261162f, +-0.425659f,0.859392f,0.283303f, +-0.470194f,0.836884f,0.280256f, +-0.410878f,0.856359f,0.312777f, +-0.293557f,0.864483f,0.408036f, +-0.429097f,0.81157f,0.396523f, +-0.438172f,0.837036f,0.327683f, +-0.303084f,0.911643f,0.277574f, +-0.346895f,0.902405f,0.255594f, +-0.444307f,0.857916f,0.258015f, +-0.440123f,0.885255f,0.150386f, +-0.246442f,0.965625f,0.0826743f, +-0.0242341f,0.995753f,0.0888192f, +0.128537f,0.987977f,0.085905f, +0.10291f,0.993755f,-0.0431449f, +0.0280177f,0.986869f,-0.159076f, +-0.0318503f,0.988236f,-0.149584f, +0.00777626f,0.97932f,-0.202168f, +0.111085f,0.970769f,-0.212762f, +-0.00220326f,0.997417f,-0.0718009f, +-0.0152092f,0.997571f,0.0679693f, +0.0100591f,0.998816f,0.0476033f, +-0.00783919f,0.999851f,-0.0153546f, +0.1632f,0.986482f,-0.0148045f, +0.356551f,0.93118f,0.0760001f, +0.33409f,0.940767f,0.0578066f, +0.378555f,0.924836f,-0.0370621f, +0.481573f,0.874509f,-0.0576253f, +0.443664f,0.890369f,-0.102011f, +0.449245f,0.88434f,-0.126968f, +0.449063f,0.892098f,-0.05003f, +0.400085f,0.916232f,0.0212355f, +0.189459f,0.975149f,-0.114846f, +0.154225f,0.96178f,-0.226258f, +0.36559f,0.902984f,-0.225751f, +0.443305f,0.891814f,-0.0902669f, +0.481296f,0.876165f,0.0262584f, +0.274557f,0.96003f,0.0544047f, +-0.0951468f,0.983236f,0.155547f, +-0.272231f,0.920302f,0.280953f, +-0.309095f,0.909629f,0.277553f, +-0.260629f,0.904898f,0.336501f, +-0.319906f,0.899874f,0.296456f, +-0.309019f,0.910231f,0.275658f, +-0.301457f,0.909911f,0.284931f, +-0.289244f,0.908198f,0.302514f, +-0.349317f,0.867088f,0.355157f, +-0.355035f,0.811266f,0.46454f, +-0.291879f,0.804435f,0.517388f, +-0.292737f,0.815956f,0.498519f, +-0.341117f,0.83204f,0.437434f, +0.012939f,0.999781f,0.0164623f, +0.101117f,0.986501f,0.12881f, +-0.0315137f,0.991787f,0.123953f, +-0.202813f,0.972667f,0.113078f, +-0.267039f,0.954882f,0.129964f, +-0.329248f,0.943109f,0.0462825f, +-0.158801f,0.981787f,0.104294f, +-0.0896983f,0.994441f,0.0551561f, +-0.03797f,0.996172f,0.0787436f, +-0.124773f,0.970658f,0.205561f, +-0.242396f,0.92942f,0.278248f, +-0.1236f,0.936757f,0.327428f, +-0.115597f,0.950099f,0.289742f, +-0.242269f,0.924532f,0.294187f, +-0.335063f,0.873272f,0.353736f, +-0.402827f,0.872268f,0.27727f, +-0.433494f,0.882428f,0.182769f, +-0.472347f,0.860126f,0.192541f, +-0.516304f,0.829671f,0.212311f, +-0.401557f,0.840095f,0.364681f, +-0.365647f,0.853697f,0.370816f, +-0.342203f,0.911984f,0.226234f, +-0.319568f,0.928553f,0.188855f, +-0.368607f,0.886665f,0.279203f, +-0.401013f,0.885839f,0.233406f, +-0.263462f,0.961384f,0.0795548f, +-0.119336f,0.983737f,-0.134243f, +-0.028348f,0.969034f,-0.245295f, +0.0404463f,0.983879f,-0.174201f, +0.11875f,0.992593f,0.0256534f, +0.0602272f,0.997166f,0.0450923f, +0.0340291f,0.999414f,-0.00366965f, +0.0708792f,0.992684f,-0.097743f, +0.0958935f,0.99395f,-0.0535485f, +-0.0943801f,0.993296f,-0.0667466f, +-0.119267f,0.988594f,-0.0919588f, +0.000759128f,0.999891f,-0.0147216f, +0.0724665f,0.997368f,-0.00256206f, +0.170906f,0.979948f,-0.10244f, +0.214916f,0.97339f,-0.079521f, +0.347938f,0.935698f,0.0583811f, +0.479062f,0.877734f,-0.00909944f, +0.517939f,0.850313f,-0.0933121f, +0.446396f,0.884197f,-0.137574f, +0.389313f,0.918353f,-0.0711587f, +0.410982f,0.908412f,0.0766878f, +0.41147f,0.910096f,0.0491837f, +0.356411f,0.933637f,-0.0359751f, +0.291892f,0.941315f,-0.169483f, +0.292525f,0.936947f,-0.191205f, +0.303478f,0.950202f,-0.0708325f, +0.350076f,0.936333f,0.0269695f, +0.186651f,0.94527f,0.26763f, +-0.145022f,0.9031f,0.404201f, +-0.257588f,0.88179f,0.395088f, +-0.316433f,0.892435f,0.321607f, +-0.301856f,0.895088f,0.328177f, +-0.311714f,0.888624f,0.336427f, +-0.275146f,0.879635f,0.387991f, +-0.320358f,0.874704f,0.363681f, +-0.312957f,0.856468f,0.410514f, +-0.417707f,0.826376f,0.377656f, +-0.402058f,0.821773f,0.403779f, +-0.299174f,0.86271f,0.407708f, +-0.252864f,0.886408f,0.387737f, +-0.266831f,0.899401f,0.346235f, +-0.121912f,0.980245f,-0.155747f, +-0.0467045f,0.996241f,-0.0729522f, +-0.0560423f,0.996609f,0.0602479f, +-0.253613f,0.959854f,0.119832f, +-0.17852f,0.958289f,0.223189f, +-0.25091f,0.965294f,0.0724672f, +-0.244405f,0.968888f,0.0390022f, +-0.111828f,0.978686f,0.172245f, +-0.104286f,0.963728f,0.245667f, +-0.172657f,0.941673f,0.288863f, +-0.302965f,0.917419f,0.257981f, +-0.21274f,0.929075f,0.302592f, +-0.0577232f,0.923128f,0.380136f, +-0.183983f,0.930078f,0.31797f, +-0.384056f,0.900387f,0.204463f, +-0.327378f,0.913703f,0.240771f, +-0.374063f,0.905896f,0.198566f, +-0.504219f,0.846296f,0.17189f, +-0.555467f,0.810974f,0.183786f, +-0.456478f,0.86757f,0.197356f, +-0.300554f,0.935674f,0.184881f, +-0.295051f,0.948068f,0.118792f, +-0.362387f,0.917821f,0.162113f, +-0.440667f,0.875232f,0.199453f, +-0.248631f,0.939944f,0.233854f, +-0.0966352f,0.995188f,0.0161918f, +0.0243217f,0.996259f,-0.0829196f, +0.0213875f,0.994057f,-0.106741f, +-0.13683f,0.98707f,-0.0834831f, +-0.0593385f,0.994125f,0.0905282f, +0.0836318f,0.990077f,0.112932f, +0.079675f,0.993049f,0.0866394f, +0.0726138f,0.990126f,0.119908f, +0.0468689f,0.990824f,0.126776f, +0.00048966f,0.99587f,0.0907856f, +-0.0299455f,0.998898f,-0.0361395f, +-0.0528047f,0.988171f,-0.143981f, +0.0771474f,0.992034f,-0.0995875f, +0.233f,0.968973f,-0.0824758f, +0.215078f,0.967265f,-0.134683f, +0.299646f,0.93128f,-0.207193f, +0.500666f,0.844143f,-0.191721f, +0.5316f,0.838001f,-0.123112f, +0.45137f,0.888237f,-0.0854371f, +0.26295f,0.958984f,-0.105862f, +0.297072f,0.954855f,-0.000735176f, +0.467586f,0.880091f,0.0824758f, +0.451683f,0.892137f,0.00862833f, +0.280097f,0.955995f,-0.0872873f, +0.27353f,0.961001f,0.0407195f, +0.263182f,0.963734f,0.044184f, +0.22357f,0.970136f,0.0940863f, +-0.055048f,0.955137f,0.291002f, +-0.267739f,0.863744f,0.426921f, +-0.199104f,0.857693f,0.474046f, +-0.21681f,0.879018f,0.424642f, +-0.270209f,0.885026f,0.379098f, +-0.341336f,0.865644f,0.366267f, +-0.32372f,0.861174f,0.391898f, +-0.34092f,0.838889f,0.42431f, +-0.295898f,0.818794f,0.491956f, +-0.331f,0.829823f,0.449258f, +-0.389842f,0.853312f,0.34624f, +-0.281201f,0.9123f,0.297716f, +-0.234572f,0.935622f,0.263795f, +-0.225355f,0.942001f,0.248696f, +-0.0486057f,0.996635f,-0.0660014f, +-0.101682f,0.988174f,-0.114771f, +-0.162649f,0.983215f,-0.0826606f, +-0.318288f,0.946728f,-0.048975f, +-0.258454f,0.965864f,-0.0175802f, +-0.136613f,0.987862f,0.0739351f, +-0.281595f,0.958211f,0.0503573f, +-0.28706f,0.943479f,0.165663f, +-0.148179f,0.930819f,0.334095f, +-0.182832f,0.931383f,0.314798f, +-0.242578f,0.923022f,0.298642f, +-0.204404f,0.955935f,0.21073f, +-0.142784f,0.976536f,0.161212f, +-0.136962f,0.950722f,0.278153f, +-0.274249f,0.920019f,0.279915f, +-0.389723f,0.904453f,0.173436f, +-0.370261f,0.901011f,0.226022f, +-0.50377f,0.847021f,0.169619f, +-0.52553f,0.835875f,0.158529f, +-0.435894f,0.894864f,0.0959897f, +-0.279872f,0.956869f,0.07793f, +-0.331658f,0.940229f,0.0772765f, +-0.372127f,0.91403f,0.161461f, +-0.456876f,0.888328f,0.0462339f, +-0.204408f,0.978272f,0.0346564f, +0.0554954f,0.998458f,-0.00157713f, +-0.0102256f,0.999947f,0.00149442f, +-0.0507499f,0.985345f,0.162848f, +-0.124313f,0.970082f,0.208536f, +-0.111836f,0.992788f,0.0431796f, +0.135986f,0.987999f,0.0732526f, +0.00980425f,0.997155f,0.0747439f, +0.00734776f,0.982792f,0.184568f, +0.0872171f,0.965097f,0.246944f, +0.0795152f,0.966423f,0.244345f, +0.106439f,0.984803f,0.137237f, +0.0584187f,0.998092f,-0.0199996f, +0.0370568f,0.991888f,-0.121591f, +0.199554f,0.972297f,-0.121727f, +0.308311f,0.945569f,-0.104131f, +0.399439f,0.904394f,-0.150064f, +0.468199f,0.870932f,-0.149223f, +0.412212f,0.907025f,-0.0859413f, +0.425915f,0.903304f,0.0513667f, +0.351639f,0.936099f,-0.00832492f, +0.20857f,0.966693f,-0.148333f, +0.395551f,0.918183f,0.0219088f, +0.538432f,0.838724f,0.0814483f, +0.24402f,0.966591f,-0.0784634f, +0.178953f,0.981938f,0.0614245f, +0.258979f,0.960241f,0.104243f, +0.0759782f,0.986383f,0.145865f, +-0.19655f,0.929601f,0.311786f, +-0.328358f,0.883678f,0.333607f, +-0.21216f,0.920721f,0.327507f, +-0.208125f,0.923292f,0.322823f, +-0.300181f,0.87973f,0.368737f, +-0.312111f,0.847974f,0.428401f, +-0.324858f,0.873038f,0.363693f, +-0.410275f,0.846963f,0.338124f, +-0.346514f,0.853308f,0.389607f, +-0.303825f,0.86928f,0.389926f, +-0.270707f,0.881074f,0.387848f, +-0.213937f,0.928705f,0.302885f, +-0.20202f,0.939889f,0.275312f, +-0.214102f,0.943299f,0.253667f, +-0.0402111f,0.999126f,0.011392f, +-0.0458289f,0.99894f,0.00442323f, +-0.170695f,0.984267f,-0.0456311f, +-0.29333f,0.955986f,-0.00691228f, +-0.274679f,0.961535f,-0.00118788f, +-0.240876f,0.970372f,-0.0188751f, +-0.335158f,0.942005f,0.0172014f, +-0.387782f,0.921031f,0.0364391f, +-0.254694f,0.964339f,0.0719752f, +-0.156383f,0.970864f,0.181569f, +-0.223749f,0.957301f,0.183063f, +-0.122594f,0.972034f,0.200303f, +-0.0910709f,0.976799f,0.193828f, +-0.28429f,0.950625f,0.124466f, +-0.315477f,0.924742f,0.212902f, +-0.305454f,0.925312f,0.224713f, +-0.365063f,0.920836f,0.137077f, +-0.474911f,0.873286f,0.108772f, +-0.523018f,0.843362f,0.123259f, +-0.405348f,0.903149f,0.141474f, +-0.272593f,0.953587f,0.127925f, +-0.342778f,0.935924f,0.0809316f, +-0.402631f,0.912044f,0.0778773f, +-0.324862f,0.935409f,0.139553f, +-0.213356f,0.97623f,0.0381383f, +0.0301299f,0.998064f,0.0544045f, +-0.104927f,0.992798f,0.0578138f, +-0.261101f,0.959724f,0.103713f, +-0.0217785f,0.964552f,0.262994f, +0.0803134f,0.988499f,0.128142f, +0.028164f,0.998669f,0.043203f, +-0.0183001f,0.984341f,0.175323f, +-0.0612635f,0.982917f,0.173556f, +-0.0331225f,0.977326f,0.209135f, +0.0728156f,0.957515f,0.279039f, +0.245559f,0.942697f,0.225881f, +0.183786f,0.974714f,0.127102f, +0.141547f,0.988409f,0.0548866f, +0.245636f,0.968932f,-0.0288843f, +0.304552f,0.94926f,-0.0784495f, +0.340339f,0.936344f,-0.0861948f, +0.460805f,0.886321f,0.0457651f, +0.380493f,0.924294f,0.030084f, +0.352595f,0.93478f,0.0431689f, +0.472573f,0.87479f,0.106851f, +0.264087f,0.962772f,-0.057695f, +0.234368f,0.968348f,-0.0858683f, +0.503248f,0.863251f,0.0392276f, +0.302957f,0.950423f,0.0700943f, +0.0199528f,0.999731f,0.0118377f, +0.239816f,0.960125f,0.143695f, +-0.0259597f,0.9852f,0.16943f, +-0.288371f,0.907451f,0.305574f, +-0.301113f,0.913287f,0.274296f, +-0.184882f,0.952263f,0.242927f, +-0.251998f,0.931999f,0.260528f, +-0.398011f,0.856633f,0.32828f, +-0.335641f,0.851294f,0.403292f, +-0.239383f,0.893387f,0.380205f, +-0.388171f,0.875539f,0.287671f, +-0.364652f,0.897686f,0.247364f, +-0.31107f,0.908317f,0.279636f, +-0.277708f,0.915298f,0.291733f, +-0.164862f,0.947448f,0.274159f, +-0.18884f,0.953184f,0.236178f, +-0.183001f,0.960107f,0.211435f, +-0.0382166f,0.998778f,0.0313295f, +-0.025601f,0.999566f,0.0145695f, +-0.151993f,0.98817f,-0.0204673f, +-0.361566f,0.932093f,-0.021731f, +-0.304279f,0.951825f,0.0379804f, +-0.164708f,0.984119f,0.0661845f, +-0.289794f,0.954555f,-0.0695987f, +-0.339732f,0.933497f,-0.114741f, +-0.304944f,0.945342f,-0.115492f, +-0.266385f,0.963249f,-0.0345067f, +-0.261205f,0.96511f,0.0183122f, +-0.220073f,0.973176f,0.06706f, +-0.108437f,0.981443f,0.158152f, +-0.188668f,0.971426f,0.143996f, +-0.373149f,0.923277f,0.0912126f, +-0.308957f,0.927563f,0.210174f, +-0.302984f,0.922237f,0.240167f, +-0.457665f,0.867903f,0.193102f, +-0.548023f,0.825328f,0.136032f, +-0.407198f,0.903776f,0.131829f, +-0.253292f,0.959077f,0.126545f, +-0.271541f,0.948088f,0.165511f, +-0.43428f,0.889355f,0.142997f, +-0.382973f,0.89965f,0.20967f, +-0.169509f,0.965022f,0.199998f, +0.00160887f,0.982078f,0.188467f, +-0.0137168f,0.977172f,0.212005f, +-0.230009f,0.971053f,0.0644371f, +-0.165502f,0.985539f,0.036359f, +0.129892f,0.967237f,0.218131f, +0.0422409f,0.973374f,0.225299f, +-0.105762f,0.968925f,0.223604f, +-0.0226547f,0.965849f,0.258115f, +0.0138374f,0.990856f,0.134211f, +0.0309349f,0.998739f,0.0395399f, +0.294589f,0.940971f,0.166706f, +0.248856f,0.959421f,0.132596f, +0.181153f,0.982002f,0.053445f, +0.283788f,0.958737f,0.0169453f, +0.366617f,0.930251f,-0.0149969f, +0.332578f,0.93839f,-0.0938972f, +0.358957f,0.931691f,-0.0557027f, +0.429022f,0.901938f,0.0494683f, +0.332897f,0.942781f,-0.0185381f, +0.429131f,0.903242f,-0.000810457f, +0.405301f,0.91403f,-0.0167607f, +0.256936f,0.958211f,-0.12576f, +0.354456f,0.935063f,-0.00433271f, +0.385431f,0.888673f,0.248403f, +0.0742527f,0.992531f,0.0967874f, +0.121836f,0.985927f,0.11447f, +-0.100545f,0.965192f,0.241444f, +-0.337975f,0.881899f,0.328674f, +-0.242866f,0.922974f,0.298555f, +-0.185171f,0.940279f,0.285633f, +-0.313033f,0.906226f,0.28419f, +-0.448562f,0.843983f,0.294082f, +-0.356046f,0.888609f,0.289144f, +-0.196811f,0.931399f,0.306206f, +-0.298585f,0.916744f,0.265384f, +-0.410663f,0.894937f,0.17448f, +-0.325435f,0.90586f,0.271126f, +-0.301755f,0.928362f,0.216998f, +-0.109278f,0.952007f,0.285903f, +-0.14523f,0.965578f,0.215795f, +-0.139372f,0.971047f,0.194018f, +0.00163448f,0.997617f,0.0689798f, +0.026224f,0.998835f,0.04051f, +-0.128032f,0.991559f,-0.0204567f, +-0.309968f,0.948873f,-0.0596736f, +-0.340105f,0.924291f,-0.173245f, +-0.190965f,0.977348f,-0.0912302f, +-0.146645f,0.988782f,-0.028384f, +-0.31072f,0.935549f,-0.167929f, +-0.380234f,0.90209f,-0.204096f, +-0.300275f,0.945729f,-0.124224f, +-0.302914f,0.945705f,-0.117837f, +-0.237161f,0.970049f,-0.0525309f, +-0.165718f,0.984724f,-0.0534418f, +-0.190643f,0.98063f,0.0449474f, +-0.411915f,0.909141f,0.0615588f, +-0.453396f,0.88136f,0.1328f, +-0.362905f,0.886473f,0.287169f, +-0.380477f,0.872742f,0.305874f, +-0.476636f,0.866585f,0.147809f, +-0.366115f,0.923073f,0.117878f, +-0.278065f,0.952821f,0.121709f, +-0.370509f,0.910147f,0.18535f, +-0.442894f,0.857435f,0.26201f, +-0.347292f,0.915122f,0.204794f, +-0.111317f,0.983727f,0.141034f, +-0.00583658f,0.989977f,0.14111f, +0.00293304f,0.989031f,0.147679f, +-0.0932614f,0.992658f,0.0770272f, +-0.209442f,0.977765f,-0.0104574f, +-0.0521744f,0.996134f,0.0706788f, +0.0111918f,0.977173f,0.21215f, +-0.0985288f,0.958328f,0.268141f, +0.0097532f,0.972945f,0.23083f, +0.214151f,0.960047f,0.180136f, +0.0316331f,0.999392f,0.014672f, +0.114623f,0.990459f,0.0765015f, +0.302992f,0.926463f,0.223298f, +0.283203f,0.948444f,0.142303f, +0.315435f,0.948621f,0.0248881f, +0.37741f,0.92565f,0.0270755f, +0.401819f,0.915069f,0.0345122f, +0.321768f,0.943567f,-0.0784028f, +0.371664f,0.926589f,-0.0574381f, +0.394659f,0.917373f,-0.0516908f, +0.434962f,0.894125f,-0.106531f, +0.447382f,0.892016f,-0.0644733f, +0.241542f,0.966428f,-0.0876093f, +0.127706f,0.991493f,-0.0251536f, +0.250404f,0.953051f,0.170269f, +0.250954f,0.937023f,0.242919f, +-0.000559693f,0.986358f,0.164614f, +-0.211006f,0.922632f,0.32284f, +-0.34675f,0.881023f,0.321811f, +-0.216454f,0.925604f,0.310492f, +-0.177379f,0.942447f,0.283426f, +-0.307121f,0.917748f,0.251824f, +-0.427987f,0.86998f,0.244872f, +-0.348579f,0.908707f,0.229659f, +-0.214211f,0.945769f,0.244201f, +-0.272299f,0.924949f,0.265184f, +-0.413173f,0.878684f,0.239168f, +-0.359354f,0.883418f,0.300728f, +-0.292273f,0.892332f,0.343978f, +-0.146355f,0.897543f,0.415929f, +-0.0984727f,0.903088f,0.418013f, +-0.114958f,0.888054f,0.445134f, +0.0486539f,0.997583f,-0.0496084f, +0.0486095f,0.995772f,-0.0779487f, +-0.0727955f,0.994312f,-0.0777426f, +-0.222675f,0.967501f,-0.119823f, +-0.286744f,0.93984f,-0.185682f, +-0.296641f,0.937378f,-0.182555f, +-0.219022f,0.967026f,-0.12996f, +-0.147314f,0.984117f,-0.0990538f, +-0.3428f,0.902622f,-0.26031f, +-0.347893f,0.908635f,-0.230983f, +-0.327008f,0.925901f,-0.189136f, +-0.254527f,0.952486f,-0.167289f, +-0.228332f,0.958887f,-0.168522f, +-0.287734f,0.955666f,-0.0625468f, +-0.451431f,0.892304f,0.00185963f, +-0.510909f,0.851571f,0.11747f, +-0.434919f,0.884052f,0.171166f, +-0.355658f,0.920763f,0.16032f, +-0.392075f,0.91242f,0.117331f, +-0.40418f,0.912194f,0.0673793f, +-0.347001f,0.925636f,0.15096f, +-0.406528f,0.883834f,0.231457f, +-0.406378f,0.897555f,0.171031f, +-0.271349f,0.960134f,0.0671726f, +-0.0926357f,0.994526f,0.0483373f, +-0.0156467f,0.998994f,0.0420269f, +0.00801384f,0.999533f,0.0295044f, +-0.0412004f,0.995482f,0.0855485f, +-0.171347f,0.982792f,0.068987f, +-0.142796f,0.988044f,0.0581328f, +-0.101871f,0.981247f,0.163632f, +-0.103189f,0.979569f,0.172615f, +0.0761964f,0.994828f,0.0671726f, +0.210538f,0.977574f,0.00485915f, +0.123577f,0.988892f,0.0825912f, +0.0553491f,0.995759f,0.0734865f, +0.223203f,0.966768f,0.124662f, +0.344575f,0.927512f,0.144881f, +0.388873f,0.91351f,0.119485f, +0.324349f,0.942843f,0.0764535f, +0.411999f,0.8978f,0.155603f, +0.440079f,0.892774f,0.0963553f, +0.378616f,0.925121f,-0.0283174f, +0.428515f,0.90345f,-0.0123871f, +0.429626f,0.902172f,-0.0388249f, +0.396609f,0.917987f,-0.000717735f, +0.233551f,0.972137f,-0.020091f, +0.111169f,0.993801f,0.000982701f, +0.115357f,0.993291f,0.00809163f, +0.164275f,0.973308f,0.160266f, +-0.0349159f,0.947849f,0.316803f, +-0.267423f,0.890391f,0.368361f, +-0.327503f,0.90805f,0.261125f, +-0.196107f,0.942247f,0.271499f, +-0.118776f,0.949723f,0.289686f, +-0.296931f,0.925681f,0.234405f, +-0.445051f,0.862967f,0.239201f, +-0.335704f,0.917243f,0.2144f, +-0.25181f,0.948438f,0.1925f, +-0.329983f,0.903347f,0.274f, +-0.391867f,0.838521f,0.378579f, +-0.417038f,0.817641f,0.396917f, +-0.341558f,0.812981f,0.471594f, +-0.188106f,0.834488f,0.517925f, +-0.137025f,0.804598f,0.577794f, +-0.18711f,0.76127f,0.620852f, +0.138194f,0.960364f,-0.242082f, +0.0401358f,0.96162f,-0.271434f, +-0.076195f,0.979732f,-0.185256f, +-0.203103f,0.960439f,-0.190543f, +-0.267864f,0.941416f,-0.2049f, +-0.261748f,0.936741f,-0.232388f, +-0.231434f,0.930091f,-0.285254f, +-0.126583f,0.962607f,-0.239509f, +-0.258776f,0.934905f,-0.242872f, +-0.430322f,0.876496f,-0.215819f, +-0.353956f,0.929119f,-0.107016f, +-0.27861f,0.956787f,-0.0832819f, +-0.250796f,0.967007f,-0.0447179f, +-0.348257f,0.937394f,-0.0030026f, +-0.497787f,0.866258f,0.0424905f, +-0.584411f,0.803193f,0.115522f, +-0.394257f,0.905213f,0.158588f, +-0.343138f,0.935038f,0.0892179f, +-0.380878f,0.917442f,0.115034f, +-0.389256f,0.914513f,0.11021f, +-0.431967f,0.895633f,0.10605f, +-0.414636f,0.893675f,0.171528f, +-0.300214f,0.948969f,0.0965901f, +-0.20281f,0.978452f,-0.0387339f, +-0.123855f,0.987388f,-0.098611f, +-0.0140563f,0.999899f,0.0019046f, +-0.052066f,0.991601f,0.118388f, +-0.0936165f,0.973604f,0.208163f, +-0.149626f,0.978491f,0.142013f, +-0.198198f,0.970011f,0.140699f, +-0.130637f,0.968649f,0.211313f, +0.013631f,0.991214f,0.131563f, +0.20118f,0.979295f,0.0225449f, +0.231889f,0.971935f,-0.0396138f, +0.0131145f,0.999014f,-0.0424166f, +0.0264969f,0.999403f,0.0221517f, +0.210411f,0.977103f,0.0315571f, +0.327081f,0.943965f,0.0441437f, +0.381166f,0.920813f,0.0825546f, +0.346088f,0.933621f,0.0925967f, +0.356105f,0.932513f,0.0600724f, +0.479238f,0.87232f,0.0968908f, +0.446186f,0.89276f,0.062428f, +0.391504f,0.920172f,-0.00287489f, +0.426134f,0.9041f,0.0318405f, +0.417296f,0.907685f,0.0444148f, +0.286592f,0.957965f,0.012947f, +0.07628f,0.996621f,-0.030475f, +0.0820652f,0.99629f,0.0259114f, +-0.0280556f,0.994071f,0.105053f, +-0.213977f,0.933546f,0.287585f, +-0.245374f,0.890565f,0.382995f, +-0.189692f,0.923736f,0.332759f, +-0.238316f,0.94737f,0.213765f, +-0.176209f,0.945132f,0.275092f, +-0.265622f,0.907592f,0.32515f, +-0.420635f,0.873046f,0.246691f, +-0.275407f,0.930254f,0.242441f, +-0.273955f,0.921146f,0.276474f, +-0.415501f,0.828882f,0.374585f, +-0.488833f,0.76092f,0.426664f, +-0.43149f,0.76785f,0.473522f, +-0.33634f,0.787599f,0.516297f, +-0.228347f,0.790629f,0.568123f, +-0.231089f,0.763668f,0.602835f, +-0.28515f,0.752352f,0.593849f, +0.109283f,0.926796f,-0.359314f, +-0.0105223f,0.944186f,-0.329244f, +-0.147017f,0.945286f,-0.29124f, +-0.202823f,0.935685f,-0.288714f, +-0.214861f,0.941374f,-0.260095f, +-0.2356f,0.926477f,-0.293483f, +-0.224333f,0.941495f,-0.251519f, +-0.230404f,0.948768f,-0.216226f, +-0.277442f,0.956386f,-0.0913908f, +-0.472179f,0.876647f,-0.0923929f, +-0.428177f,0.898465f,-0.0970806f, +-0.3387f,0.938243f,-0.0705803f, +-0.291725f,0.956079f,0.0284457f, +-0.399526f,0.915525f,0.0468393f, +-0.527082f,0.845186f,0.0885769f, +-0.577694f,0.815576f,0.0332458f, +-0.408723f,0.912647f,0.00457497f, +-0.331162f,0.938989f,0.0929031f, +-0.4185f,0.893481f,0.162938f, +-0.372755f,0.902119f,0.217335f, +-0.419905f,0.891761f,0.168648f, +-0.426162f,0.889671f,0.163929f, +-0.238048f,0.949403f,0.20486f, +-0.0631417f,0.981494f,0.180781f, +-0.0934621f,0.991987f,0.0850084f, +-0.209815f,0.971464f,0.110612f, +-0.239382f,0.928806f,0.282871f, +-0.0385152f,0.924665f,0.378829f, +-0.0229585f,0.976683f,0.213458f, +-0.204415f,0.977814f,0.0457583f, +-0.131276f,0.991302f,0.00937849f, +0.100844f,0.99484f,0.0110965f, +0.227419f,0.973508f,-0.0237273f, +0.22975f,0.97307f,0.0187244f, +0.0718328f,0.997222f,0.0197173f, +0.0214849f,0.994143f,-0.105917f, +0.174121f,0.982096f,-0.0718949f, +0.303053f,0.952921f,0.010044f, +0.38012f,0.924935f,0.00218727f, +0.364895f,0.929903f,-0.0461611f, +0.383009f,0.921386f,-0.0659776f, +0.441676f,0.895702f,-0.0513817f, +0.484548f,0.87476f,0.00284626f, +0.413676f,0.910113f,-0.0237944f, +0.449057f,0.893501f,-0.00212143f, +0.360983f,0.928147f,-0.090746f, +0.274993f,0.958661f,0.0731286f, +0.0881261f,0.984394f,0.15232f, +0.00584658f,0.984704f,0.174138f, +-0.113749f,0.971528f,0.207834f, +-0.320112f,0.923512f,0.211313f, +-0.308899f,0.921582f,0.23509f, +-0.147069f,0.956187f,0.253135f, +-0.14137f,0.959806f,0.242461f, +-0.277438f,0.935166f,0.220209f, +-0.254545f,0.906523f,0.336782f, +-0.385464f,0.89189f,0.236535f, +-0.346902f,0.887297f,0.303913f, +-0.404152f,0.809818f,0.425271f, +-0.45263f,0.705418f,0.545446f, +-0.436346f,0.733679f,0.520882f, +-0.40606f,0.758487f,0.509719f, +-0.399991f,0.76519f,0.504471f, +-0.29927f,0.789873f,0.535292f, +-0.216265f,0.823324f,0.524754f, +-0.25441f,0.854784f,0.452349f, +-0.0876585f,0.974972f,-0.204317f, +-0.064531f,0.993199f,-0.096908f, +-0.142906f,0.98657f,-0.0790982f, +-0.190225f,0.979959f,-0.0591132f, +-0.245075f,0.966633f,-0.0745641f, +-0.286525f,0.954682f,-0.0805399f, +-0.302328f,0.953201f,0.00253574f, +-0.315251f,0.947498f,0.0535207f, +-0.363913f,0.92013f,0.144666f, +-0.433014f,0.884677f,0.172759f, +-0.39903f,0.904384f,0.151207f, +-0.340877f,0.927749f,0.15194f, +-0.34367f,0.933336f,0.103799f, +-0.371228f,0.927804f,0.0370044f, +-0.540653f,0.838686f,-0.0655789f, +-0.541683f,0.840171f,-0.0263209f, +-0.443789f,0.895468f,-0.0344719f, +-0.446175f,0.894923f,0.00646964f, +-0.489716f,0.870366f,0.0513954f, +-0.393228f,0.91623f,0.0767741f, +-0.386844f,0.914535f,0.118231f, +-0.456614f,0.881467f,0.1205f, +-0.291641f,0.939064f,0.181947f, +-0.0983466f,0.949337f,0.298474f, +-0.0663966f,0.917799f,0.391455f, +-0.225097f,0.912905f,0.340494f, +-0.270333f,0.917625f,0.291349f, +-0.0378823f,0.963845f,0.263756f, +0.203246f,0.94956f,0.238803f, +-0.00658121f,0.998329f,0.057403f, +-0.104339f,0.991332f,-0.0798442f, +0.0714998f,0.99184f,-0.105548f, +0.229254f,0.968801f,-0.0941692f, +0.162963f,0.980447f,-0.110304f, +0.144794f,0.987619f,-0.0603599f, +0.1028f,0.982727f,-0.153883f, +0.103742f,0.981824f,-0.158931f, +0.242509f,0.962807f,-0.119129f, +0.409757f,0.908112f,-0.0862081f, +0.420763f,0.899369f,-0.118717f, +0.356993f,0.920491f,-0.158908f, +0.417923f,0.902816f,-0.101306f, +0.45294f,0.886743f,-0.0923743f, +0.388277f,0.919595f,-0.0598771f, +0.442705f,0.896663f,-0.00260706f, +0.330753f,0.943188f,0.0316099f, +0.0976556f,0.983098f,0.154858f, +-0.0408134f,0.964902f,0.259421f, +-0.0353778f,0.920067f,0.39016f, +-0.0336634f,0.909873f,0.413518f, +-0.27131f,0.928078f,0.255075f, +-0.276299f,0.942343f,0.188808f, +-0.178846f,0.97249f,0.149254f, +-0.173925f,0.95192f,0.252185f, +-0.312455f,0.905292f,0.287781f, +-0.299358f,0.905887f,0.299588f, +-0.361522f,0.88183f,0.302783f, +-0.474485f,0.805519f,0.35497f, +-0.514467f,0.728892f,0.451708f, +-0.495653f,0.729457f,0.471404f, +-0.395267f,0.75904f,0.517322f, +-0.414244f,0.765988f,0.491594f, +-0.375453f,0.800102f,0.467837f, +-0.23686f,0.857078f,0.457509f, +-0.153599f,0.897001f,0.414483f, +-0.139778f,0.900978f,0.410733f, +-0.246424f,0.968956f,-0.0200009f, +-0.187575f,0.975459f,0.115309f, +-0.169324f,0.958565f,0.229092f, +-0.227196f,0.942917f,0.243495f, +-0.216356f,0.935609f,0.278972f, +-0.279085f,0.916546f,0.286453f, +-0.337088f,0.885038f,0.32106f, +-0.317388f,0.891504f,0.323242f, +-0.400555f,0.875243f,0.271117f, +-0.420396f,0.865286f,0.273034f, +-0.438864f,0.863369f,0.248983f, +-0.296161f,0.903481f,0.309855f, +-0.22181f,0.945018f,0.240296f, +-0.217483f,0.959525f,0.178924f, +-0.432196f,0.899705f,0.0611361f, +-0.592514f,0.805005f,-0.029893f, +-0.445437f,0.89528f,0.00770123f, +-0.444106f,0.895735f,-0.0207082f, +-0.441178f,0.89658f,-0.0387967f, +-0.433316f,0.896401f,-0.0932815f, +-0.448061f,0.893999f,-0.00273746f, +-0.479681f,0.876222f,0.046264f, +-0.38049f,0.918735f,0.105607f, +-0.274091f,0.928692f,0.249812f, +-0.115693f,0.919238f,0.37632f, +-0.109076f,0.943601f,0.312601f, +-0.183297f,0.969532f,0.162513f, +-0.0200265f,0.998099f,0.0582807f, +0.217564f,0.969248f,0.114995f, +0.107422f,0.986137f,0.126469f, +-0.0101958f,0.999802f,0.0170616f, +0.0917708f,0.993871f,-0.0616322f, +0.259886f,0.964354f,-0.049807f, +0.22181f,0.965636f,-0.135454f, +0.11068f,0.965795f,-0.234499f, +0.156396f,0.962982f,-0.219561f, +0.0996902f,0.954613f,-0.28067f, +0.240821f,0.930419f,-0.276271f, +0.362585f,0.892287f,-0.268992f, +0.39828f,0.905306f,-0.147629f, +0.377219f,0.92249f,-0.0819651f, +0.379471f,0.918832f,-0.108391f, +0.428571f,0.902988f,-0.0306522f, +0.390587f,0.920304f,0.0219829f, +0.365451f,0.930816f,-0.00527733f, +0.226127f,0.963781f,0.141399f, +-0.014879f,0.969939f,0.242893f, +-0.0990439f,0.938525f,0.330697f, +-0.160986f,0.911469f,0.37856f, +-0.0311141f,0.900531f,0.433676f, +-0.0818559f,0.904519f,0.418503f, +-0.202897f,0.939947f,0.274469f, +-0.199596f,0.951915f,0.232421f, +-0.290928f,0.922977f,0.251942f, +-0.30301f,0.91121f,0.279072f, +-0.315746f,0.908229f,0.274635f, +-0.386173f,0.858884f,0.336435f, +-0.56045f,0.768828f,0.307894f, +-0.529456f,0.742805f,0.409776f, +-0.545227f,0.770059f,0.331265f, +-0.460487f,0.804404f,0.375346f, +-0.384041f,0.835484f,0.393038f, +-0.366328f,0.856374f,0.363907f, +-0.227066f,0.886912f,0.40228f, +-0.162423f,0.896635f,0.411903f, +-0.18398f,0.877261f,0.443356f, +-0.33059f,0.941987f,0.0580528f, +-0.349053f,0.930827f,0.108275f, +-0.250298f,0.937413f,0.242089f, +-0.231173f,0.921233f,0.312871f, +-0.267366f,0.883285f,0.385127f, +-0.300638f,0.858727f,0.414975f, +-0.348846f,0.869854f,0.348799f, +-0.262698f,0.902187f,0.342122f, +-0.319043f,0.887638f,0.33213f, +-0.407631f,0.874264f,0.263628f, +-0.391131f,0.891388f,0.229006f, +-0.306387f,0.939971f,0.150271f, +-0.172289f,0.969062f,0.176734f, +-0.280735f,0.939942f,0.194158f, +-0.35822f,0.876748f,0.320922f, +-0.540223f,0.822439f,0.178196f, +-0.415201f,0.897062f,0.151285f, +-0.398489f,0.913332f,0.0838552f, +-0.47388f,0.879024f,0.052479f, +-0.430994f,0.889287f,0.153011f, +-0.501585f,0.850518f,0.158213f, +-0.493115f,0.843586f,0.212601f, +-0.437044f,0.869936f,0.228482f, +-0.335665f,0.928238f,0.160321f, +-0.135997f,0.987913f,0.0743886f, +0.0115105f,0.995614f,0.0928467f, +-0.0367985f,0.999249f,0.0121783f, +0.0254956f,0.996874f,-0.0747791f, +0.107382f,0.991622f,-0.0717932f, +0.144184f,0.989518f,0.00810907f, +0.0943487f,0.994079f,-0.0539027f, +0.124876f,0.987862f,-0.0923827f, +0.25534f,0.960035f,-0.114602f, +0.339105f,0.927956f,-0.154613f, +0.200588f,0.937015f,-0.285951f, +0.184172f,0.917658f,-0.352115f, +0.137125f,0.909076f,-0.393417f, +0.231522f,0.90798f,-0.349242f, +0.299652f,0.902049f,-0.310671f, +0.23061f,0.944613f,-0.233507f, +0.336481f,0.938772f,-0.0740748f, +0.38792f,0.918977f,-0.070704f, +0.337723f,0.938393f,-0.073227f, +0.392706f,0.919584f,-0.012147f, +0.294051f,0.954956f,-0.0399037f, +0.173344f,0.964432f,0.199555f, +-0.108669f,0.967119f,0.22994f, +-0.18728f,0.925976f,0.327863f, +-0.156223f,0.937505f,0.310931f, +-0.0961609f,0.948752f,0.301037f, +-0.051031f,0.914222f,0.401987f, +-0.116652f,0.921592f,0.370216f, +-0.16747f,0.919727f,0.355044f, +-0.233888f,0.917713f,0.321092f, +-0.296558f,0.924646f,0.23892f, +-0.384099f,0.898594f,0.212122f, +-0.451252f,0.843433f,0.291535f, +-0.561019f,0.766309f,0.313095f, +-0.56702f,0.761029f,0.315156f, +-0.502958f,0.815049f,0.287624f, +-0.46769f,0.845823f,0.256612f, +-0.438846f,0.860082f,0.260142f, +-0.380472f,0.841841f,0.382812f, +-0.286801f,0.84573f,0.449984f, +-0.166497f,0.837941f,0.519744f, +-0.237954f,0.844014f,0.480644f, +-0.400938f,0.907575f,0.124721f, +-0.36178f,0.91645f,0.170983f, +-0.326178f,0.936068f,0.131852f, +-0.348093f,0.925471f,0.149445f, +-0.380521f,0.903785f,0.195901f, +-0.261965f,0.932138f,0.249988f, +-0.229009f,0.957451f,0.175621f, +-0.296226f,0.953377f,0.0576446f, +-0.385007f,0.916429f,0.109216f, +-0.396898f,0.895963f,0.199304f, +-0.30002f,0.927264f,0.223985f, +-0.290512f,0.953204f,0.083697f, +-0.240862f,0.959505f,0.146069f, +-0.368638f,0.900621f,0.230189f, +-0.437205f,0.833732f,0.337256f, +-0.435531f,0.825298f,0.359438f, +-0.382764f,0.869714f,0.311593f, +-0.302351f,0.902083f,0.307944f, +-0.504704f,0.84016f,0.198507f, +-0.44412f,0.839306f,0.313565f, +-0.494888f,0.841296f,0.217503f, +-0.530329f,0.827106f,0.186138f, +-0.314084f,0.933199f,0.174614f, +-0.124034f,0.990967f,0.050983f, +-0.0452003f,0.995178f,-0.0870557f, +-0.00182424f,0.990385f,-0.138326f, +-0.0388611f,0.986686f,-0.157927f, +0.0684221f,0.991564f,-0.11009f, +0.102533f,0.981475f,-0.161848f, +0.149983f,0.975213f,-0.162681f, +0.108711f,0.963953f,-0.24285f, +0.134579f,0.963238f,-0.232511f, +0.280754f,0.932346f,-0.227832f, +0.370391f,0.907723f,-0.197103f, +0.290987f,0.936165f,-0.197286f, +0.244643f,0.947659f,-0.205165f, +0.12819f,0.972148f,-0.196204f, +0.159014f,0.967422f,-0.197002f, +0.312607f,0.930748f,-0.189697f, +0.153027f,0.941997f,-0.298704f, +0.218578f,0.950985f,-0.218748f, +0.390534f,0.915543f,-0.0962525f, +0.350134f,0.933592f,-0.0762398f, +0.369694f,0.928637f,-0.030973f, +0.182224f,0.981373f,0.0608345f, +-0.0452136f,0.980467f,0.191416f, +-0.152401f,0.95767f,0.244216f, +-0.205784f,0.951891f,0.22706f, +-0.112228f,0.971017f,0.211022f, +-0.130106f,0.967854f,0.215247f, +-0.151633f,0.958079f,0.243087f, +-0.104162f,0.953804f,0.281796f, +-0.17561f,0.947845f,0.265989f, +-0.209606f,0.941523f,0.263816f, +-0.251275f,0.930745f,0.265659f, +-0.361f,0.884718f,0.294879f, +-0.50281f,0.813876f,0.291185f, +-0.583247f,0.763934f,0.276094f, +-0.556622f,0.802134f,0.216224f, +-0.473532f,0.851987f,0.223352f, +-0.473757f,0.85285f,0.219548f, +-0.491496f,0.823107f,0.284477f, +-0.477559f,0.793154f,0.377946f, +-0.368868f,0.830921f,0.416542f, +-0.202419f,0.861608f,0.465466f, +-0.095407f,0.855544f,0.508864f, +-0.40239f,0.909528f,0.104118f, +-0.357524f,0.930915f,0.0746555f, +-0.280797f,0.959558f,0.0200349f, +-0.296463f,0.954936f,-0.0143765f, +-0.381172f,0.918388f,-0.106166f, +-0.308734f,0.946435f,-0.094572f, +-0.184864f,0.981918f,-0.0407667f, +-0.211096f,0.97426f,-0.0790985f, +-0.431269f,0.892976f,-0.128847f, +-0.508723f,0.860224f,-0.0348507f, +-0.315588f,0.942693f,0.108326f, +-0.229963f,0.954167f,0.191527f, +-0.338476f,0.90391f,0.261495f, +-0.399866f,0.843393f,0.358882f, +-0.508212f,0.817205f,0.271838f, +-0.45663f,0.829465f,0.321678f, +-0.343829f,0.869846f,0.353765f, +-0.25214f,0.908629f,0.332893f, +-0.465924f,0.864347f,0.189262f, +-0.451321f,0.885092f,0.11367f, +-0.398038f,0.913426f,0.0849568f, +-0.473433f,0.880353f,-0.0289816f, +-0.282123f,0.951018f,-0.126376f, +-0.111297f,0.983512f,-0.142537f, +-0.0203568f,0.995748f,-0.089847f, +0.0177076f,0.998505f,-0.0517153f, +-0.0210973f,0.999746f,0.00787929f, +0.0422415f,0.999104f,-0.00245387f, +0.162083f,0.986673f,-0.0143034f, +0.184873f,0.978111f,-0.0954998f, +0.225836f,0.960454f,-0.162869f, +0.105652f,0.960265f,-0.25832f, +0.22096f,0.965567f,-0.137321f, +0.306187f,0.951906f,0.0111556f, +0.252563f,0.963728f,0.0862585f, +0.185211f,0.975091f,0.122044f, +0.141716f,0.976503f,0.162355f, +0.200688f,0.976886f,0.0736112f, +0.398894f,0.916482f,0.0307355f, +0.27456f,0.96012f,-0.0527967f, +0.152825f,0.971043f,-0.183632f, +0.271211f,0.950001f,-0.154736f, +0.286301f,0.958137f,0.00244849f, +0.246502f,0.96458f,0.0939299f, +0.102065f,0.977178f,0.186298f, +-0.0761105f,0.976837f,0.19999f, +-0.0810786f,0.974651f,0.208524f, +-0.174214f,0.975155f,0.136831f, +-0.127689f,0.983595f,0.127422f, +-0.123239f,0.988203f,0.0909257f, +-0.173027f,0.984333f,0.033919f, +-0.13019f,0.985916f,0.104975f, +-0.151236f,0.977557f,0.146665f, +-0.212082f,0.972216f,0.0990861f, +-0.346196f,0.93167f,0.110181f, +-0.461867f,0.845088f,0.269268f, +-0.491314f,0.790968f,0.364663f, +-0.499721f,0.798886f,0.334753f, +-0.533877f,0.823302f,0.192741f, +-0.489959f,0.855912f,0.165393f, +-0.540105f,0.823669f,0.172786f, +-0.55174f,0.789596f,0.268553f, +-0.518837f,0.818462f,0.246838f, +-0.35793f,0.879679f,0.31313f, +-0.226645f,0.914368f,0.335505f, +-0.174062f,0.93173f,0.31872f, +-0.352372f,0.928926f,-0.113715f, +-0.283164f,0.949292f,-0.13661f, +-0.253833f,0.949289f,-0.185523f, +-0.258433f,0.953837f,-0.152994f, +-0.329686f,0.925665f,-0.185613f, +-0.360482f,0.913899f,-0.186657f, +-0.246398f,0.964945f,-0.0903879f, +-0.197613f,0.98019f,0.013309f, +-0.409684f,0.910684f,0.0530475f, +-0.545574f,0.83677f,0.0465257f, +-0.477964f,0.876264f,0.060934f, +-0.386247f,0.882258f,0.269135f, +-0.437443f,0.816448f,0.376904f, +-0.381546f,0.830459f,0.405906f, +-0.378931f,0.857772f,0.347329f, +-0.484349f,0.854204f,0.189053f, +-0.391934f,0.899277f,0.194136f, +-0.180618f,0.947297f,0.264585f, +-0.285059f,0.943094f,0.171219f, +-0.41449f,0.905591f,-0.0900102f, +-0.367364f,0.916679f,-0.157298f, +-0.4046f,0.892318f,-0.200168f, +-0.265207f,0.933534f,-0.241204f, +-0.171437f,0.970625f,-0.168809f, +-0.091648f,0.995789f,0.00231266f, +-0.0988725f,0.989781f,0.102747f, +-0.0749525f,0.978356f,0.192877f, +0.0618361f,0.988236f,0.139875f, +0.222758f,0.971067f,0.0860673f, +0.260459f,0.965435f,-0.00983276f, +0.296216f,0.954928f,-0.0191894f, +0.108089f,0.992937f,-0.0489145f, +0.0559635f,0.998425f,-0.00391097f, +0.182072f,0.980129f,0.0787236f, +0.189029f,0.972269f,0.137697f, +0.20292f,0.962368f,0.180751f, +0.162611f,0.977583f,0.133749f, +0.283117f,0.944546f,0.166365f, +0.362781f,0.917623f,0.162352f, +0.322808f,0.912852f,0.249991f, +0.306817f,0.930382f,0.200629f, +0.265368f,0.963264f,0.0412725f, +0.150516f,0.988588f,0.00624705f, +0.192187f,0.980013f,0.0513622f, +0.111093f,0.98864f,0.101236f, +-0.0652663f,0.990994f,0.116922f, +-0.0960853f,0.989279f,0.109972f, +-0.171018f,0.980514f,0.0966674f, +-0.118023f,0.981194f,0.152737f, +-0.0297124f,0.980668f,0.19341f, +-0.130364f,0.983461f,0.125733f, +-0.228583f,0.970632f,0.0749913f, +-0.187681f,0.973906f,0.127608f, +-0.18184f,0.968481f,0.170233f, +-0.382626f,0.904754f,0.187128f, +-0.565004f,0.795638f,0.218473f, +-0.54964f,0.808473f,0.210397f, +-0.494188f,0.848001f,0.191501f, +-0.42417f,0.88632f,0.185785f, +-0.490729f,0.864039f,0.112346f, +-0.547278f,0.819965f,0.167765f, +-0.555649f,0.823683f,0.113141f, +-0.525063f,0.850181f,0.0387426f, +-0.465555f,0.881687f,0.0767294f, +-0.25104f,0.948586f,0.19278f, +-0.134177f,0.968986f,0.207515f, +-0.358148f,0.879839f,-0.31243f, +-0.281248f,0.911984f,-0.298639f, +-0.261128f,0.923339f,-0.281526f, +-0.281121f,0.935581f,-0.213678f, +-0.316696f,0.928992f,-0.191515f, +-0.378661f,0.908066f,-0.178974f, +-0.357733f,0.923356f,-0.139433f, +-0.295419f,0.953886f,0.0531873f, +-0.456379f,0.869265f,0.18999f, +-0.492836f,0.836159f,0.240731f, +-0.533039f,0.832034f,0.153586f, +-0.471339f,0.822176f,0.319166f, +-0.417097f,0.817012f,0.398149f, +-0.397475f,0.860419f,0.318894f, +-0.295585f,0.889222f,0.349162f, +-0.397825f,0.896297f,0.195927f, +-0.426121f,0.903442f,0.0470364f, +-0.225108f,0.967792f,0.11272f, +-0.180332f,0.969123f,0.168172f, +-0.283694f,0.958436f,-0.0303046f, +-0.31011f,0.929142f,-0.201316f, +-0.379988f,0.880118f,-0.284609f, +-0.280631f,0.91033f,-0.304213f, +-0.299273f,0.919298f,-0.255591f, +-0.271669f,0.962178f,0.0202533f, +-0.127278f,0.946024f,0.298058f, +-0.0668081f,0.957542f,0.280447f, +0.156177f,0.962373f,0.222366f, +0.269377f,0.960799f,0.0655824f, +0.307217f,0.951527f,-0.0146071f, +0.247019f,0.968029f,-0.0436127f, +0.117286f,0.99106f,0.0635867f, +0.0498813f,0.996011f,0.0739844f, +0.194956f,0.980335f,0.0305971f, +0.139483f,0.989424f,-0.0398183f, +0.235447f,0.970519f,0.0515568f, +0.132445f,0.989845f,-0.05162f, +0.206421f,0.976844f,0.0562743f, +0.330371f,0.919083f,0.214804f, +0.266375f,0.922982f,0.277756f, +0.331232f,0.885792f,0.325049f, +0.36267f,0.895106f,0.259337f, +0.240431f,0.963714f,0.115964f, +0.171746f,0.982113f,-0.0771883f, +0.0351621f,0.99889f,-0.0313443f, +-0.0882653f,0.987488f,0.130674f, +-0.0658856f,0.986287f,0.151318f, +-0.167193f,0.982329f,0.0841182f, +-0.21476f,0.97234f,0.0918338f, +-0.104496f,0.958461f,0.265392f, +-0.0605561f,0.923444f,0.378926f, +-0.152497f,0.949101f,0.275594f, +-0.216118f,0.964594f,0.151167f, +-0.26219f,0.945639f,0.192413f, +-0.408309f,0.854572f,0.320922f, +-0.530012f,0.797788f,0.28744f, +-0.48417f,0.855541f,0.183383f, +-0.504616f,0.863257f,0.012294f, +-0.421367f,0.905956f,0.0411587f, +-0.517653f,0.855189f,0.0262018f, +-0.533316f,0.826853f,0.178574f, +-0.514944f,0.854185f,0.0721125f, +-0.506113f,0.861889f,-0.0315744f, +-0.499639f,0.865958f,-0.0218358f, +-0.302149f,0.952465f,0.038937f, +-0.129933f,0.988738f,0.0742583f, +}; + +btScalar Landscape02Tex[] = { +0.0f,0.273438f, +0.0f,0.265625f, +0.0078125f,0.273438f, +0.0078125f,0.265625f, +0.015625f,0.273438f, +0.015625f,0.265625f, +0.0234375f,0.273438f, +0.0234375f,0.265625f, +0.03125f,0.273438f, +0.03125f,0.265625f, +0.0390625f,0.273438f, +0.0390625f,0.265625f, +0.046875f,0.273438f, +0.046875f,0.265625f, +0.0546875f,0.273438f, +0.0546875f,0.265625f, +0.0625f,0.273438f, +0.0625f,0.265625f, +0.0703125f,0.273438f, +0.0703125f,0.265625f, +0.078125f,0.273438f, +0.078125f,0.265625f, +0.0859375f,0.273438f, +0.0859375f,0.265625f, +0.09375f,0.273438f, +0.09375f,0.265625f, +0.101563f,0.273438f, +0.101563f,0.265625f, +0.109375f,0.273438f, +0.109375f,0.265625f, +0.117188f,0.273438f, +0.117188f,0.265625f, +0.125f,0.273438f, +0.125f,0.265625f, +0.132813f,0.273438f, +0.132813f,0.265625f, +0.140625f,0.273438f, +0.140625f,0.265625f, +0.148438f,0.273438f, +0.148438f,0.265625f, +0.15625f,0.273438f, +0.15625f,0.265625f, +0.164063f,0.273438f, +0.164063f,0.265625f, +0.171875f,0.273438f, +0.171875f,0.265625f, +0.179688f,0.273438f, +0.179688f,0.265625f, +0.1875f,0.273438f, +0.1875f,0.265625f, +0.195313f,0.273438f, +0.195313f,0.265625f, +0.203125f,0.273438f, +0.203125f,0.265625f, +0.210938f,0.273438f, +0.210938f,0.265625f, +0.21875f,0.273438f, +0.21875f,0.265625f, +0.226563f,0.273438f, +0.226563f,0.265625f, +0.234375f,0.273438f, +0.234375f,0.265625f, +0.242188f,0.273438f, +0.242188f,0.265625f, +0.25f,0.273438f, +0.25f,0.265625f, +0.257813f,0.273438f, +0.257813f,0.265625f, +0.265625f,0.273438f, +0.265625f,0.265625f, +0.273438f,0.273438f, +0.273438f,0.265625f, +0.28125f,0.273438f, +0.28125f,0.265625f, +0.289063f,0.273438f, +0.289063f,0.265625f, +0.296875f,0.273438f, +0.296875f,0.265625f, +0.304688f,0.273438f, +0.304688f,0.265625f, +0.3125f,0.273438f, +0.3125f,0.265625f, +0.320313f,0.273438f, +0.320313f,0.265625f, +0.328125f,0.273438f, +0.328125f,0.265625f, +0.335938f,0.273438f, +0.335938f,0.265625f, +0.34375f,0.273438f, +0.34375f,0.265625f, +0.351563f,0.273438f, +0.351563f,0.265625f, +0.359375f,0.273438f, +0.359375f,0.265625f, +0.367188f,0.273438f, +0.367188f,0.265625f, +0.375f,0.273438f, +0.375f,0.265625f, +0.382813f,0.273438f, +0.382813f,0.265625f, +0.390625f,0.273438f, +0.390625f,0.265625f, +0.398438f,0.273438f, +0.398438f,0.265625f, +0.40625f,0.273438f, +0.40625f,0.265625f, +0.414063f,0.273438f, +0.414063f,0.265625f, +0.421875f,0.273438f, +0.421875f,0.265625f, +0.429688f,0.273438f, +0.429688f,0.265625f, +0.4375f,0.273438f, +0.4375f,0.265625f, +0.445313f,0.273438f, +0.445313f,0.265625f, +0.453125f,0.273438f, +0.453125f,0.265625f, +0.460938f,0.273438f, +0.460938f,0.265625f, +0.46875f,0.273438f, +0.46875f,0.265625f, +0.476563f,0.273438f, +0.476563f,0.265625f, +0.484375f,0.273438f, +0.484375f,0.265625f, +0.492188f,0.273438f, +0.492188f,0.265625f, +0.5f,0.273438f, +0.5f,0.265625f, +0.507813f,0.273438f, +0.507813f,0.265625f, +0.0f,0.28125f, +0.0078125f,0.28125f, +0.015625f,0.28125f, +0.0234375f,0.28125f, +0.03125f,0.28125f, +0.0390625f,0.28125f, +0.046875f,0.28125f, +0.0546875f,0.28125f, +0.0625f,0.28125f, +0.0703125f,0.28125f, +0.078125f,0.28125f, +0.0859375f,0.28125f, +0.09375f,0.28125f, +0.101563f,0.28125f, +0.109375f,0.28125f, +0.117188f,0.28125f, +0.125f,0.28125f, +0.132813f,0.28125f, +0.140625f,0.28125f, +0.148438f,0.28125f, +0.15625f,0.28125f, +0.164063f,0.28125f, +0.171875f,0.28125f, +0.179688f,0.28125f, +0.1875f,0.28125f, +0.195313f,0.28125f, +0.203125f,0.28125f, +0.210938f,0.28125f, +0.21875f,0.28125f, +0.226563f,0.28125f, +0.234375f,0.28125f, +0.242188f,0.28125f, +0.25f,0.28125f, +0.257813f,0.28125f, +0.265625f,0.28125f, +0.273438f,0.28125f, +0.28125f,0.28125f, +0.289063f,0.28125f, +0.296875f,0.28125f, +0.304688f,0.28125f, +0.3125f,0.28125f, +0.320313f,0.28125f, +0.328125f,0.28125f, +0.335938f,0.28125f, +0.34375f,0.28125f, +0.351563f,0.28125f, +0.359375f,0.28125f, +0.367188f,0.28125f, +0.375f,0.28125f, +0.382813f,0.28125f, +0.390625f,0.28125f, +0.398438f,0.28125f, +0.40625f,0.28125f, +0.414063f,0.28125f, +0.421875f,0.28125f, +0.429688f,0.28125f, +0.4375f,0.28125f, +0.445313f,0.28125f, +0.453125f,0.28125f, +0.460938f,0.28125f, +0.46875f,0.28125f, +0.476563f,0.28125f, +0.484375f,0.28125f, +0.492188f,0.28125f, +0.5f,0.28125f, +0.507813f,0.28125f, +0.0f,0.289063f, +0.0078125f,0.289063f, +0.015625f,0.289063f, +0.0234375f,0.289063f, +0.03125f,0.289063f, +0.0390625f,0.289063f, +0.046875f,0.289063f, +0.0546875f,0.289063f, +0.0625f,0.289063f, +0.0703125f,0.289063f, +0.078125f,0.289063f, +0.0859375f,0.289063f, +0.09375f,0.289063f, +0.101563f,0.289063f, +0.109375f,0.289063f, +0.117188f,0.289063f, +0.125f,0.289063f, +0.132813f,0.289063f, +0.140625f,0.289063f, +0.148438f,0.289063f, +0.15625f,0.289063f, +0.164063f,0.289063f, +0.171875f,0.289063f, +0.179688f,0.289063f, +0.1875f,0.289063f, +0.195313f,0.289063f, +0.203125f,0.289063f, +0.210938f,0.289063f, +0.21875f,0.289063f, +0.226563f,0.289063f, +0.234375f,0.289063f, +0.242188f,0.289063f, +0.25f,0.289063f, +0.257813f,0.289063f, +0.265625f,0.289063f, +0.273438f,0.289063f, +0.28125f,0.289063f, +0.289063f,0.289063f, +0.296875f,0.289063f, +0.304688f,0.289063f, +0.3125f,0.289063f, +0.320313f,0.289063f, +0.328125f,0.289063f, +0.335938f,0.289063f, +0.34375f,0.289063f, +0.351563f,0.289063f, +0.359375f,0.289063f, +0.367188f,0.289063f, +0.375f,0.289063f, +0.382813f,0.289063f, +0.390625f,0.289063f, +0.398438f,0.289063f, +0.40625f,0.289063f, +0.414063f,0.289063f, +0.421875f,0.289063f, +0.429688f,0.289063f, +0.4375f,0.289063f, +0.445313f,0.289063f, +0.453125f,0.289063f, +0.460938f,0.289063f, +0.46875f,0.289063f, +0.476563f,0.289063f, +0.484375f,0.289063f, +0.492188f,0.289063f, +0.5f,0.289063f, +0.507813f,0.289063f, +0.0f,0.296875f, +0.0078125f,0.296875f, +0.015625f,0.296875f, +0.0234375f,0.296875f, +0.03125f,0.296875f, +0.0390625f,0.296875f, +0.046875f,0.296875f, +0.0546875f,0.296875f, +0.0625f,0.296875f, +0.0703125f,0.296875f, +0.078125f,0.296875f, +0.0859375f,0.296875f, +0.09375f,0.296875f, +0.101563f,0.296875f, +0.109375f,0.296875f, +0.117188f,0.296875f, +0.125f,0.296875f, +0.132813f,0.296875f, +0.140625f,0.296875f, +0.148438f,0.296875f, +0.15625f,0.296875f, +0.164063f,0.296875f, +0.171875f,0.296875f, +0.179688f,0.296875f, +0.1875f,0.296875f, +0.195313f,0.296875f, +0.203125f,0.296875f, +0.210938f,0.296875f, +0.21875f,0.296875f, +0.226563f,0.296875f, +0.234375f,0.296875f, +0.242188f,0.296875f, +0.25f,0.296875f, +0.257813f,0.296875f, +0.265625f,0.296875f, +0.273438f,0.296875f, +0.28125f,0.296875f, +0.289063f,0.296875f, +0.296875f,0.296875f, +0.304688f,0.296875f, +0.3125f,0.296875f, +0.320313f,0.296875f, +0.328125f,0.296875f, +0.335938f,0.296875f, +0.34375f,0.296875f, +0.351563f,0.296875f, +0.359375f,0.296875f, +0.367188f,0.296875f, +0.375f,0.296875f, +0.382813f,0.296875f, +0.390625f,0.296875f, +0.398438f,0.296875f, +0.40625f,0.296875f, +0.414063f,0.296875f, +0.421875f,0.296875f, +0.429688f,0.296875f, +0.4375f,0.296875f, +0.445313f,0.296875f, +0.453125f,0.296875f, +0.460938f,0.296875f, +0.46875f,0.296875f, +0.476563f,0.296875f, +0.484375f,0.296875f, +0.492188f,0.296875f, +0.5f,0.296875f, +0.507813f,0.296875f, +0.0f,0.304688f, +0.0078125f,0.304688f, +0.015625f,0.304688f, +0.0234375f,0.304688f, +0.03125f,0.304688f, +0.0390625f,0.304688f, +0.046875f,0.304688f, +0.0546875f,0.304688f, +0.0625f,0.304688f, +0.0703125f,0.304688f, +0.078125f,0.304688f, +0.0859375f,0.304688f, +0.09375f,0.304688f, +0.101563f,0.304688f, +0.109375f,0.304688f, +0.117188f,0.304688f, +0.125f,0.304688f, +0.132813f,0.304688f, +0.140625f,0.304688f, +0.148438f,0.304688f, +0.15625f,0.304688f, +0.164063f,0.304688f, +0.171875f,0.304688f, +0.179688f,0.304688f, +0.1875f,0.304688f, +0.195313f,0.304688f, +0.203125f,0.304688f, +0.210938f,0.304688f, +0.21875f,0.304688f, +0.226563f,0.304688f, +0.234375f,0.304688f, +0.242188f,0.304688f, +0.25f,0.304688f, +0.257813f,0.304688f, +0.265625f,0.304688f, +0.273438f,0.304688f, +0.28125f,0.304688f, +0.289063f,0.304688f, +0.296875f,0.304688f, +0.304688f,0.304688f, +0.3125f,0.304688f, +0.320313f,0.304688f, +0.328125f,0.304688f, +0.335938f,0.304688f, +0.34375f,0.304688f, +0.351563f,0.304688f, +0.359375f,0.304688f, +0.367188f,0.304688f, +0.375f,0.304688f, +0.382813f,0.304688f, +0.390625f,0.304688f, +0.398438f,0.304688f, +0.40625f,0.304688f, +0.414063f,0.304688f, +0.421875f,0.304688f, +0.429688f,0.304688f, +0.4375f,0.304688f, +0.445313f,0.304688f, +0.453125f,0.304688f, +0.460938f,0.304688f, +0.46875f,0.304688f, +0.476563f,0.304688f, +0.484375f,0.304688f, +0.492188f,0.304688f, +0.5f,0.304688f, +0.507813f,0.304688f, +0.0f,0.3125f, +0.0078125f,0.3125f, +0.015625f,0.3125f, +0.0234375f,0.3125f, +0.03125f,0.3125f, +0.0390625f,0.3125f, +0.046875f,0.3125f, +0.0546875f,0.3125f, +0.0625f,0.3125f, +0.0703125f,0.3125f, +0.078125f,0.3125f, +0.0859375f,0.3125f, +0.09375f,0.3125f, +0.101563f,0.3125f, +0.109375f,0.3125f, +0.117188f,0.3125f, +0.125f,0.3125f, +0.132813f,0.3125f, +0.140625f,0.3125f, +0.148438f,0.3125f, +0.15625f,0.3125f, +0.164063f,0.3125f, +0.171875f,0.3125f, +0.179688f,0.3125f, +0.1875f,0.3125f, +0.195313f,0.3125f, +0.203125f,0.3125f, +0.210938f,0.3125f, +0.21875f,0.3125f, +0.226563f,0.3125f, +0.234375f,0.3125f, +0.242188f,0.3125f, +0.25f,0.3125f, +0.257813f,0.3125f, +0.265625f,0.3125f, +0.273438f,0.3125f, +0.28125f,0.3125f, +0.289063f,0.3125f, +0.296875f,0.3125f, +0.304688f,0.3125f, +0.3125f,0.3125f, +0.320313f,0.3125f, +0.328125f,0.3125f, +0.335938f,0.3125f, +0.34375f,0.3125f, +0.351563f,0.3125f, +0.359375f,0.3125f, +0.367188f,0.3125f, +0.375f,0.3125f, +0.382813f,0.3125f, +0.390625f,0.3125f, +0.398438f,0.3125f, +0.40625f,0.3125f, +0.414063f,0.3125f, +0.421875f,0.3125f, +0.429688f,0.3125f, +0.4375f,0.3125f, +0.445313f,0.3125f, +0.453125f,0.3125f, +0.460938f,0.3125f, +0.46875f,0.3125f, +0.476563f,0.3125f, +0.484375f,0.3125f, +0.492188f,0.3125f, +0.5f,0.3125f, +0.507813f,0.3125f, +0.0f,0.320313f, +0.0078125f,0.320313f, +0.015625f,0.320313f, +0.0234375f,0.320313f, +0.03125f,0.320313f, +0.0390625f,0.320313f, +0.046875f,0.320313f, +0.0546875f,0.320313f, +0.0625f,0.320313f, +0.0703125f,0.320313f, +0.078125f,0.320313f, +0.0859375f,0.320313f, +0.09375f,0.320313f, +0.101563f,0.320313f, +0.109375f,0.320313f, +0.117188f,0.320313f, +0.125f,0.320313f, +0.132813f,0.320313f, +0.140625f,0.320313f, +0.148438f,0.320313f, +0.15625f,0.320313f, +0.164063f,0.320313f, +0.171875f,0.320313f, +0.179688f,0.320313f, +0.1875f,0.320313f, +0.195313f,0.320313f, +0.203125f,0.320313f, +0.210938f,0.320313f, +0.21875f,0.320313f, +0.226563f,0.320313f, +0.234375f,0.320313f, +0.242188f,0.320313f, +0.25f,0.320313f, +0.257813f,0.320313f, +0.265625f,0.320313f, +0.273438f,0.320313f, +0.28125f,0.320313f, +0.289063f,0.320313f, +0.296875f,0.320313f, +0.304688f,0.320313f, +0.3125f,0.320313f, +0.320313f,0.320313f, +0.328125f,0.320313f, +0.335938f,0.320313f, +0.34375f,0.320313f, +0.351563f,0.320313f, +0.359375f,0.320313f, +0.367188f,0.320313f, +0.375f,0.320313f, +0.382813f,0.320313f, +0.390625f,0.320313f, +0.398438f,0.320313f, +0.40625f,0.320313f, +0.414063f,0.320313f, +0.421875f,0.320313f, +0.429688f,0.320313f, +0.4375f,0.320313f, +0.445313f,0.320313f, +0.453125f,0.320313f, +0.460938f,0.320313f, +0.46875f,0.320313f, +0.476563f,0.320313f, +0.484375f,0.320313f, +0.492188f,0.320313f, +0.5f,0.320313f, +0.507813f,0.320313f, +0.0f,0.328125f, +0.0078125f,0.328125f, +0.015625f,0.328125f, +0.0234375f,0.328125f, +0.03125f,0.328125f, +0.0390625f,0.328125f, +0.046875f,0.328125f, +0.0546875f,0.328125f, +0.0625f,0.328125f, +0.0703125f,0.328125f, +0.078125f,0.328125f, +0.0859375f,0.328125f, +0.09375f,0.328125f, +0.101563f,0.328125f, +0.109375f,0.328125f, +0.117188f,0.328125f, +0.125f,0.328125f, +0.132813f,0.328125f, +0.140625f,0.328125f, +0.148438f,0.328125f, +0.15625f,0.328125f, +0.164063f,0.328125f, +0.171875f,0.328125f, +0.179688f,0.328125f, +0.1875f,0.328125f, +0.195313f,0.328125f, +0.203125f,0.328125f, +0.210938f,0.328125f, +0.21875f,0.328125f, +0.226563f,0.328125f, +0.234375f,0.328125f, +0.242188f,0.328125f, +0.25f,0.328125f, +0.257813f,0.328125f, +0.265625f,0.328125f, +0.273438f,0.328125f, +0.28125f,0.328125f, +0.289063f,0.328125f, +0.296875f,0.328125f, +0.304688f,0.328125f, +0.3125f,0.328125f, +0.320313f,0.328125f, +0.328125f,0.328125f, +0.335938f,0.328125f, +0.34375f,0.328125f, +0.351563f,0.328125f, +0.359375f,0.328125f, +0.367188f,0.328125f, +0.375f,0.328125f, +0.382813f,0.328125f, +0.390625f,0.328125f, +0.398438f,0.328125f, +0.40625f,0.328125f, +0.414063f,0.328125f, +0.421875f,0.328125f, +0.429688f,0.328125f, +0.4375f,0.328125f, +0.445313f,0.328125f, +0.453125f,0.328125f, +0.460938f,0.328125f, +0.46875f,0.328125f, +0.476563f,0.328125f, +0.484375f,0.328125f, +0.492188f,0.328125f, +0.5f,0.328125f, +0.507813f,0.328125f, +0.0f,0.335938f, +0.0078125f,0.335938f, +0.015625f,0.335938f, +0.0234375f,0.335938f, +0.03125f,0.335938f, +0.0390625f,0.335938f, +0.046875f,0.335938f, +0.0546875f,0.335938f, +0.0625f,0.335938f, +0.0703125f,0.335938f, +0.078125f,0.335938f, +0.0859375f,0.335938f, +0.09375f,0.335938f, +0.101563f,0.335938f, +0.109375f,0.335938f, +0.117188f,0.335938f, +0.125f,0.335938f, +0.132813f,0.335938f, +0.140625f,0.335938f, +0.148438f,0.335938f, +0.15625f,0.335938f, +0.164063f,0.335938f, +0.171875f,0.335938f, +0.179688f,0.335938f, +0.1875f,0.335938f, +0.195313f,0.335938f, +0.203125f,0.335938f, +0.210938f,0.335938f, +0.21875f,0.335938f, +0.226563f,0.335938f, +0.234375f,0.335938f, +0.242188f,0.335938f, +0.25f,0.335938f, +0.257813f,0.335938f, +0.265625f,0.335938f, +0.273438f,0.335938f, +0.28125f,0.335938f, +0.289063f,0.335938f, +0.296875f,0.335938f, +0.304688f,0.335938f, +0.3125f,0.335938f, +0.320313f,0.335938f, +0.328125f,0.335938f, +0.335938f,0.335938f, +0.34375f,0.335938f, +0.351563f,0.335938f, +0.359375f,0.335938f, +0.367188f,0.335938f, +0.375f,0.335938f, +0.382813f,0.335938f, +0.390625f,0.335938f, +0.398438f,0.335938f, +0.40625f,0.335938f, +0.414063f,0.335938f, +0.421875f,0.335938f, +0.429688f,0.335938f, +0.4375f,0.335938f, +0.445313f,0.335938f, +0.453125f,0.335938f, +0.460938f,0.335938f, +0.46875f,0.335938f, +0.476563f,0.335938f, +0.484375f,0.335938f, +0.492188f,0.335938f, +0.5f,0.335938f, +0.507813f,0.335938f, +0.0f,0.34375f, +0.0078125f,0.34375f, +0.015625f,0.34375f, +0.0234375f,0.34375f, +0.03125f,0.34375f, +0.0390625f,0.34375f, +0.046875f,0.34375f, +0.0546875f,0.34375f, +0.0625f,0.34375f, +0.0703125f,0.34375f, +0.078125f,0.34375f, +0.0859375f,0.34375f, +0.09375f,0.34375f, +0.101563f,0.34375f, +0.109375f,0.34375f, +0.117188f,0.34375f, +0.125f,0.34375f, +0.132813f,0.34375f, +0.140625f,0.34375f, +0.148438f,0.34375f, +0.15625f,0.34375f, +0.164063f,0.34375f, +0.171875f,0.34375f, +0.179688f,0.34375f, +0.1875f,0.34375f, +0.195313f,0.34375f, +0.203125f,0.34375f, +0.210938f,0.34375f, +0.21875f,0.34375f, +0.226563f,0.34375f, +0.234375f,0.34375f, +0.242188f,0.34375f, +0.25f,0.34375f, +0.257813f,0.34375f, +0.265625f,0.34375f, +0.273438f,0.34375f, +0.28125f,0.34375f, +0.289063f,0.34375f, +0.296875f,0.34375f, +0.304688f,0.34375f, +0.3125f,0.34375f, +0.320313f,0.34375f, +0.328125f,0.34375f, +0.335938f,0.34375f, +0.34375f,0.34375f, +0.351563f,0.34375f, +0.359375f,0.34375f, +0.367188f,0.34375f, +0.375f,0.34375f, +0.382813f,0.34375f, +0.390625f,0.34375f, +0.398438f,0.34375f, +0.40625f,0.34375f, +0.414063f,0.34375f, +0.421875f,0.34375f, +0.429688f,0.34375f, +0.4375f,0.34375f, +0.445313f,0.34375f, +0.453125f,0.34375f, +0.460938f,0.34375f, +0.46875f,0.34375f, +0.476563f,0.34375f, +0.484375f,0.34375f, +0.492188f,0.34375f, +0.5f,0.34375f, +0.507813f,0.34375f, +0.0f,0.351563f, +0.0078125f,0.351563f, +0.015625f,0.351563f, +0.0234375f,0.351563f, +0.03125f,0.351563f, +0.0390625f,0.351563f, +0.046875f,0.351563f, +0.0546875f,0.351563f, +0.0625f,0.351563f, +0.0703125f,0.351563f, +0.078125f,0.351563f, +0.0859375f,0.351563f, +0.09375f,0.351563f, +0.101563f,0.351563f, +0.109375f,0.351563f, +0.117188f,0.351563f, +0.125f,0.351563f, +0.132813f,0.351563f, +0.140625f,0.351563f, +0.148438f,0.351563f, +0.15625f,0.351563f, +0.164063f,0.351563f, +0.171875f,0.351563f, +0.179688f,0.351563f, +0.1875f,0.351563f, +0.195313f,0.351563f, +0.203125f,0.351563f, +0.210938f,0.351563f, +0.21875f,0.351563f, +0.226563f,0.351563f, +0.234375f,0.351563f, +0.242188f,0.351563f, +0.25f,0.351563f, +0.257813f,0.351563f, +0.265625f,0.351563f, +0.273438f,0.351563f, +0.28125f,0.351563f, +0.289063f,0.351563f, +0.296875f,0.351563f, +0.304688f,0.351563f, +0.3125f,0.351563f, +0.320313f,0.351563f, +0.328125f,0.351563f, +0.335938f,0.351563f, +0.34375f,0.351563f, +0.351563f,0.351563f, +0.359375f,0.351563f, +0.367188f,0.351563f, +0.375f,0.351563f, +0.382813f,0.351563f, +0.390625f,0.351563f, +0.398438f,0.351563f, +0.40625f,0.351563f, +0.414063f,0.351563f, +0.421875f,0.351563f, +0.429688f,0.351563f, +0.4375f,0.351563f, +0.445313f,0.351563f, +0.453125f,0.351563f, +0.460938f,0.351563f, +0.46875f,0.351563f, +0.476563f,0.351563f, +0.484375f,0.351563f, +0.492188f,0.351563f, +0.5f,0.351563f, +0.507813f,0.351563f, +0.0f,0.359375f, +0.0078125f,0.359375f, +0.015625f,0.359375f, +0.0234375f,0.359375f, +0.03125f,0.359375f, +0.0390625f,0.359375f, +0.046875f,0.359375f, +0.0546875f,0.359375f, +0.0625f,0.359375f, +0.0703125f,0.359375f, +0.078125f,0.359375f, +0.0859375f,0.359375f, +0.09375f,0.359375f, +0.101563f,0.359375f, +0.109375f,0.359375f, +0.117188f,0.359375f, +0.125f,0.359375f, +0.132813f,0.359375f, +0.140625f,0.359375f, +0.148438f,0.359375f, +0.15625f,0.359375f, +0.164063f,0.359375f, +0.171875f,0.359375f, +0.179688f,0.359375f, +0.1875f,0.359375f, +0.195313f,0.359375f, +0.203125f,0.359375f, +0.210938f,0.359375f, +0.21875f,0.359375f, +0.226563f,0.359375f, +0.234375f,0.359375f, +0.242188f,0.359375f, +0.25f,0.359375f, +0.257813f,0.359375f, +0.265625f,0.359375f, +0.273438f,0.359375f, +0.28125f,0.359375f, +0.289063f,0.359375f, +0.296875f,0.359375f, +0.304688f,0.359375f, +0.3125f,0.359375f, +0.320313f,0.359375f, +0.328125f,0.359375f, +0.335938f,0.359375f, +0.34375f,0.359375f, +0.351563f,0.359375f, +0.359375f,0.359375f, +0.367188f,0.359375f, +0.375f,0.359375f, +0.382813f,0.359375f, +0.390625f,0.359375f, +0.398438f,0.359375f, +0.40625f,0.359375f, +0.414063f,0.359375f, +0.421875f,0.359375f, +0.429688f,0.359375f, +0.4375f,0.359375f, +0.445313f,0.359375f, +0.453125f,0.359375f, +0.460938f,0.359375f, +0.46875f,0.359375f, +0.476563f,0.359375f, +0.484375f,0.359375f, +0.492188f,0.359375f, +0.5f,0.359375f, +0.507813f,0.359375f, +0.0f,0.367188f, +0.0078125f,0.367188f, +0.015625f,0.367188f, +0.0234375f,0.367188f, +0.03125f,0.367188f, +0.0390625f,0.367188f, +0.046875f,0.367188f, +0.0546875f,0.367188f, +0.0625f,0.367188f, +0.0703125f,0.367188f, +0.078125f,0.367188f, +0.0859375f,0.367188f, +0.09375f,0.367188f, +0.101563f,0.367188f, +0.109375f,0.367188f, +0.117188f,0.367188f, +0.125f,0.367188f, +0.132813f,0.367188f, +0.140625f,0.367188f, +0.148438f,0.367188f, +0.15625f,0.367188f, +0.164063f,0.367188f, +0.171875f,0.367188f, +0.179688f,0.367188f, +0.1875f,0.367188f, +0.195313f,0.367188f, +0.203125f,0.367188f, +0.210938f,0.367188f, +0.21875f,0.367188f, +0.226563f,0.367188f, +0.234375f,0.367188f, +0.242188f,0.367188f, +0.25f,0.367188f, +0.257813f,0.367188f, +0.265625f,0.367188f, +0.273438f,0.367188f, +0.28125f,0.367188f, +0.289063f,0.367188f, +0.296875f,0.367188f, +0.304688f,0.367188f, +0.3125f,0.367188f, +0.320313f,0.367188f, +0.328125f,0.367188f, +0.335938f,0.367188f, +0.34375f,0.367188f, +0.351563f,0.367188f, +0.359375f,0.367188f, +0.367188f,0.367188f, +0.375f,0.367188f, +0.382813f,0.367188f, +0.390625f,0.367188f, +0.398438f,0.367188f, +0.40625f,0.367188f, +0.414063f,0.367188f, +0.421875f,0.367188f, +0.429688f,0.367188f, +0.4375f,0.367188f, +0.445313f,0.367188f, +0.453125f,0.367188f, +0.460938f,0.367188f, +0.46875f,0.367188f, +0.476563f,0.367188f, +0.484375f,0.367188f, +0.492188f,0.367188f, +0.5f,0.367188f, +0.507813f,0.367188f, +0.0f,0.375f, +0.0078125f,0.375f, +0.015625f,0.375f, +0.0234375f,0.375f, +0.03125f,0.375f, +0.0390625f,0.375f, +0.046875f,0.375f, +0.0546875f,0.375f, +0.0625f,0.375f, +0.0703125f,0.375f, +0.078125f,0.375f, +0.0859375f,0.375f, +0.09375f,0.375f, +0.101563f,0.375f, +0.109375f,0.375f, +0.117188f,0.375f, +0.125f,0.375f, +0.132813f,0.375f, +0.140625f,0.375f, +0.148438f,0.375f, +0.15625f,0.375f, +0.164063f,0.375f, +0.171875f,0.375f, +0.179688f,0.375f, +0.1875f,0.375f, +0.195313f,0.375f, +0.203125f,0.375f, +0.210938f,0.375f, +0.21875f,0.375f, +0.226563f,0.375f, +0.234375f,0.375f, +0.242188f,0.375f, +0.25f,0.375f, +0.257813f,0.375f, +0.265625f,0.375f, +0.273438f,0.375f, +0.28125f,0.375f, +0.289063f,0.375f, +0.296875f,0.375f, +0.304688f,0.375f, +0.3125f,0.375f, +0.320313f,0.375f, +0.328125f,0.375f, +0.335938f,0.375f, +0.34375f,0.375f, +0.351563f,0.375f, +0.359375f,0.375f, +0.367188f,0.375f, +0.375f,0.375f, +0.382813f,0.375f, +0.390625f,0.375f, +0.398438f,0.375f, +0.40625f,0.375f, +0.414063f,0.375f, +0.421875f,0.375f, +0.429688f,0.375f, +0.4375f,0.375f, +0.445313f,0.375f, +0.453125f,0.375f, +0.460938f,0.375f, +0.46875f,0.375f, +0.476563f,0.375f, +0.484375f,0.375f, +0.492188f,0.375f, +0.5f,0.375f, +0.507813f,0.375f, +0.0f,0.382813f, +0.0078125f,0.382813f, +0.015625f,0.382813f, +0.0234375f,0.382813f, +0.03125f,0.382813f, +0.0390625f,0.382813f, +0.046875f,0.382813f, +0.0546875f,0.382813f, +0.0625f,0.382813f, +0.0703125f,0.382813f, +0.078125f,0.382813f, +0.0859375f,0.382813f, +0.09375f,0.382813f, +0.101563f,0.382813f, +0.109375f,0.382813f, +0.117188f,0.382813f, +0.125f,0.382813f, +0.132813f,0.382813f, +0.140625f,0.382813f, +0.148438f,0.382813f, +0.15625f,0.382813f, +0.164063f,0.382813f, +0.171875f,0.382813f, +0.179688f,0.382813f, +0.1875f,0.382813f, +0.195313f,0.382813f, +0.203125f,0.382813f, +0.210938f,0.382813f, +0.21875f,0.382813f, +0.226563f,0.382813f, +0.234375f,0.382813f, +0.242188f,0.382813f, +0.25f,0.382813f, +0.257813f,0.382813f, +0.265625f,0.382813f, +0.273438f,0.382813f, +0.28125f,0.382813f, +0.289063f,0.382813f, +0.296875f,0.382813f, +0.304688f,0.382813f, +0.3125f,0.382813f, +0.320313f,0.382813f, +0.328125f,0.382813f, +0.335938f,0.382813f, +0.34375f,0.382813f, +0.351563f,0.382813f, +0.359375f,0.382813f, +0.367188f,0.382813f, +0.375f,0.382813f, +0.382813f,0.382813f, +0.390625f,0.382813f, +0.398438f,0.382813f, +0.40625f,0.382813f, +0.414063f,0.382813f, +0.421875f,0.382813f, +0.429688f,0.382813f, +0.4375f,0.382813f, +0.445313f,0.382813f, +0.453125f,0.382813f, +0.460938f,0.382813f, +0.46875f,0.382813f, +0.476563f,0.382813f, +0.484375f,0.382813f, +0.492188f,0.382813f, +0.5f,0.382813f, +0.507813f,0.382813f, +0.0f,0.390625f, +0.0078125f,0.390625f, +0.015625f,0.390625f, +0.0234375f,0.390625f, +0.03125f,0.390625f, +0.0390625f,0.390625f, +0.046875f,0.390625f, +0.0546875f,0.390625f, +0.0625f,0.390625f, +0.0703125f,0.390625f, +0.078125f,0.390625f, +0.0859375f,0.390625f, +0.09375f,0.390625f, +0.101563f,0.390625f, +0.109375f,0.390625f, +0.117188f,0.390625f, +0.125f,0.390625f, +0.132813f,0.390625f, +0.140625f,0.390625f, +0.148438f,0.390625f, +0.15625f,0.390625f, +0.164063f,0.390625f, +0.171875f,0.390625f, +0.179688f,0.390625f, +0.1875f,0.390625f, +0.195313f,0.390625f, +0.203125f,0.390625f, +0.210938f,0.390625f, +0.21875f,0.390625f, +0.226563f,0.390625f, +0.234375f,0.390625f, +0.242188f,0.390625f, +0.25f,0.390625f, +0.257813f,0.390625f, +0.265625f,0.390625f, +0.273438f,0.390625f, +0.28125f,0.390625f, +0.289063f,0.390625f, +0.296875f,0.390625f, +0.304688f,0.390625f, +0.3125f,0.390625f, +0.320313f,0.390625f, +0.328125f,0.390625f, +0.335938f,0.390625f, +0.34375f,0.390625f, +0.351563f,0.390625f, +0.359375f,0.390625f, +0.367188f,0.390625f, +0.375f,0.390625f, +0.382813f,0.390625f, +0.390625f,0.390625f, +0.398438f,0.390625f, +0.40625f,0.390625f, +0.414063f,0.390625f, +0.421875f,0.390625f, +0.429688f,0.390625f, +0.4375f,0.390625f, +0.445313f,0.390625f, +0.453125f,0.390625f, +0.460938f,0.390625f, +0.46875f,0.390625f, +0.476563f,0.390625f, +0.484375f,0.390625f, +0.492188f,0.390625f, +0.5f,0.390625f, +0.507813f,0.390625f, +0.0f,0.398438f, +0.0078125f,0.398438f, +0.015625f,0.398438f, +0.0234375f,0.398438f, +0.03125f,0.398438f, +0.0390625f,0.398438f, +0.046875f,0.398438f, +0.0546875f,0.398438f, +0.0625f,0.398438f, +0.0703125f,0.398438f, +0.078125f,0.398438f, +0.0859375f,0.398438f, +0.09375f,0.398438f, +0.101563f,0.398438f, +0.109375f,0.398438f, +0.117188f,0.398438f, +0.125f,0.398438f, +0.132813f,0.398438f, +0.140625f,0.398438f, +0.148438f,0.398438f, +0.15625f,0.398438f, +0.164063f,0.398438f, +0.171875f,0.398438f, +0.179688f,0.398438f, +0.1875f,0.398438f, +0.195313f,0.398438f, +0.203125f,0.398438f, +0.210938f,0.398438f, +0.21875f,0.398438f, +0.226563f,0.398438f, +0.234375f,0.398438f, +0.242188f,0.398438f, +0.25f,0.398438f, +0.257813f,0.398438f, +0.265625f,0.398438f, +0.273438f,0.398438f, +0.28125f,0.398438f, +0.289063f,0.398438f, +0.296875f,0.398438f, +0.304688f,0.398438f, +0.3125f,0.398438f, +0.320313f,0.398438f, +0.328125f,0.398438f, +0.335938f,0.398438f, +0.34375f,0.398438f, +0.351563f,0.398438f, +0.359375f,0.398438f, +0.367188f,0.398438f, +0.375f,0.398438f, +0.382813f,0.398438f, +0.390625f,0.398438f, +0.398438f,0.398438f, +0.40625f,0.398438f, +0.414063f,0.398438f, +0.421875f,0.398438f, +0.429688f,0.398438f, +0.4375f,0.398438f, +0.445313f,0.398438f, +0.453125f,0.398438f, +0.460938f,0.398438f, +0.46875f,0.398438f, +0.476563f,0.398438f, +0.484375f,0.398438f, +0.492188f,0.398438f, +0.5f,0.398438f, +0.507813f,0.398438f, +0.0f,0.40625f, +0.0078125f,0.40625f, +0.015625f,0.40625f, +0.0234375f,0.40625f, +0.03125f,0.40625f, +0.0390625f,0.40625f, +0.046875f,0.40625f, +0.0546875f,0.40625f, +0.0625f,0.40625f, +0.0703125f,0.40625f, +0.078125f,0.40625f, +0.0859375f,0.40625f, +0.09375f,0.40625f, +0.101563f,0.40625f, +0.109375f,0.40625f, +0.117188f,0.40625f, +0.125f,0.40625f, +0.132813f,0.40625f, +0.140625f,0.40625f, +0.148438f,0.40625f, +0.15625f,0.40625f, +0.164063f,0.40625f, +0.171875f,0.40625f, +0.179688f,0.40625f, +0.1875f,0.40625f, +0.195313f,0.40625f, +0.203125f,0.40625f, +0.210938f,0.40625f, +0.21875f,0.40625f, +0.226563f,0.40625f, +0.234375f,0.40625f, +0.242188f,0.40625f, +0.25f,0.40625f, +0.257813f,0.40625f, +0.265625f,0.40625f, +0.273438f,0.40625f, +0.28125f,0.40625f, +0.289063f,0.40625f, +0.296875f,0.40625f, +0.304688f,0.40625f, +0.3125f,0.40625f, +0.320313f,0.40625f, +0.328125f,0.40625f, +0.335938f,0.40625f, +0.34375f,0.40625f, +0.351563f,0.40625f, +0.359375f,0.40625f, +0.367188f,0.40625f, +0.375f,0.40625f, +0.382813f,0.40625f, +0.390625f,0.40625f, +0.398438f,0.40625f, +0.40625f,0.40625f, +0.414063f,0.40625f, +0.421875f,0.40625f, +0.429688f,0.40625f, +0.4375f,0.40625f, +0.445313f,0.40625f, +0.453125f,0.40625f, +0.460938f,0.40625f, +0.46875f,0.40625f, +0.476563f,0.40625f, +0.484375f,0.40625f, +0.492188f,0.40625f, +0.5f,0.40625f, +0.507813f,0.40625f, +0.0f,0.414063f, +0.0078125f,0.414063f, +0.015625f,0.414063f, +0.0234375f,0.414063f, +0.03125f,0.414063f, +0.0390625f,0.414063f, +0.046875f,0.414063f, +0.0546875f,0.414063f, +0.0625f,0.414063f, +0.0703125f,0.414063f, +0.078125f,0.414063f, +0.0859375f,0.414063f, +0.09375f,0.414063f, +0.101563f,0.414063f, +0.109375f,0.414063f, +0.117188f,0.414063f, +0.125f,0.414063f, +0.132813f,0.414063f, +0.140625f,0.414063f, +0.148438f,0.414063f, +0.15625f,0.414063f, +0.164063f,0.414063f, +0.171875f,0.414063f, +0.179688f,0.414063f, +0.1875f,0.414063f, +0.195313f,0.414063f, +0.203125f,0.414063f, +0.210938f,0.414063f, +0.21875f,0.414063f, +0.226563f,0.414063f, +0.234375f,0.414063f, +0.242188f,0.414063f, +0.25f,0.414063f, +0.257813f,0.414063f, +0.265625f,0.414063f, +0.273438f,0.414063f, +0.28125f,0.414063f, +0.289063f,0.414063f, +0.296875f,0.414063f, +0.304688f,0.414063f, +0.3125f,0.414063f, +0.320313f,0.414063f, +0.328125f,0.414063f, +0.335938f,0.414063f, +0.34375f,0.414063f, +0.351563f,0.414063f, +0.359375f,0.414063f, +0.367188f,0.414063f, +0.375f,0.414063f, +0.382813f,0.414063f, +0.390625f,0.414063f, +0.398438f,0.414063f, +0.40625f,0.414063f, +0.414063f,0.414063f, +0.421875f,0.414063f, +0.429688f,0.414063f, +0.4375f,0.414063f, +0.445313f,0.414063f, +0.453125f,0.414063f, +0.460938f,0.414063f, +0.46875f,0.414063f, +0.476563f,0.414063f, +0.484375f,0.414063f, +0.492188f,0.414063f, +0.5f,0.414063f, +0.507813f,0.414063f, +0.0f,0.421875f, +0.0078125f,0.421875f, +0.015625f,0.421875f, +0.0234375f,0.421875f, +0.03125f,0.421875f, +0.0390625f,0.421875f, +0.046875f,0.421875f, +0.0546875f,0.421875f, +0.0625f,0.421875f, +0.0703125f,0.421875f, +0.078125f,0.421875f, +0.0859375f,0.421875f, +0.09375f,0.421875f, +0.101563f,0.421875f, +0.109375f,0.421875f, +0.117188f,0.421875f, +0.125f,0.421875f, +0.132813f,0.421875f, +0.140625f,0.421875f, +0.148438f,0.421875f, +0.15625f,0.421875f, +0.164063f,0.421875f, +0.171875f,0.421875f, +0.179688f,0.421875f, +0.1875f,0.421875f, +0.195313f,0.421875f, +0.203125f,0.421875f, +0.210938f,0.421875f, +0.21875f,0.421875f, +0.226563f,0.421875f, +0.234375f,0.421875f, +0.242188f,0.421875f, +0.25f,0.421875f, +0.257813f,0.421875f, +0.265625f,0.421875f, +0.273438f,0.421875f, +0.28125f,0.421875f, +0.289063f,0.421875f, +0.296875f,0.421875f, +0.304688f,0.421875f, +0.3125f,0.421875f, +0.320313f,0.421875f, +0.328125f,0.421875f, +0.335938f,0.421875f, +0.34375f,0.421875f, +0.351563f,0.421875f, +0.359375f,0.421875f, +0.367188f,0.421875f, +0.375f,0.421875f, +0.382813f,0.421875f, +0.390625f,0.421875f, +0.398438f,0.421875f, +0.40625f,0.421875f, +0.414063f,0.421875f, +0.421875f,0.421875f, +0.429688f,0.421875f, +0.4375f,0.421875f, +0.445313f,0.421875f, +0.453125f,0.421875f, +0.460938f,0.421875f, +0.46875f,0.421875f, +0.476563f,0.421875f, +0.484375f,0.421875f, +0.492188f,0.421875f, +0.5f,0.421875f, +0.507813f,0.421875f, +0.0f,0.429688f, +0.0078125f,0.429688f, +0.015625f,0.429688f, +0.0234375f,0.429688f, +0.03125f,0.429688f, +0.0390625f,0.429688f, +0.046875f,0.429688f, +0.0546875f,0.429688f, +0.0625f,0.429688f, +0.0703125f,0.429688f, +0.078125f,0.429688f, +0.0859375f,0.429688f, +0.09375f,0.429688f, +0.101563f,0.429688f, +0.109375f,0.429688f, +0.117188f,0.429688f, +0.125f,0.429688f, +0.132813f,0.429688f, +0.140625f,0.429688f, +0.148438f,0.429688f, +0.15625f,0.429688f, +0.164063f,0.429688f, +0.171875f,0.429688f, +0.179688f,0.429688f, +0.1875f,0.429688f, +0.195313f,0.429688f, +0.203125f,0.429688f, +0.210938f,0.429688f, +0.21875f,0.429688f, +0.226563f,0.429688f, +0.234375f,0.429688f, +0.242188f,0.429688f, +0.25f,0.429688f, +0.257813f,0.429688f, +0.265625f,0.429688f, +0.273438f,0.429688f, +0.28125f,0.429688f, +0.289063f,0.429688f, +0.296875f,0.429688f, +0.304688f,0.429688f, +0.3125f,0.429688f, +0.320313f,0.429688f, +0.328125f,0.429688f, +0.335938f,0.429688f, +0.34375f,0.429688f, +0.351563f,0.429688f, +0.359375f,0.429688f, +0.367188f,0.429688f, +0.375f,0.429688f, +0.382813f,0.429688f, +0.390625f,0.429688f, +0.398438f,0.429688f, +0.40625f,0.429688f, +0.414063f,0.429688f, +0.421875f,0.429688f, +0.429688f,0.429688f, +0.4375f,0.429688f, +0.445313f,0.429688f, +0.453125f,0.429688f, +0.460938f,0.429688f, +0.46875f,0.429688f, +0.476563f,0.429688f, +0.484375f,0.429688f, +0.492188f,0.429688f, +0.5f,0.429688f, +0.507813f,0.429688f, +0.0f,0.4375f, +0.0078125f,0.4375f, +0.015625f,0.4375f, +0.0234375f,0.4375f, +0.03125f,0.4375f, +0.0390625f,0.4375f, +0.046875f,0.4375f, +0.0546875f,0.4375f, +0.0625f,0.4375f, +0.0703125f,0.4375f, +0.078125f,0.4375f, +0.0859375f,0.4375f, +0.09375f,0.4375f, +0.101563f,0.4375f, +0.109375f,0.4375f, +0.117188f,0.4375f, +0.125f,0.4375f, +0.132813f,0.4375f, +0.140625f,0.4375f, +0.148438f,0.4375f, +0.15625f,0.4375f, +0.164063f,0.4375f, +0.171875f,0.4375f, +0.179688f,0.4375f, +0.1875f,0.4375f, +0.195313f,0.4375f, +0.203125f,0.4375f, +0.210938f,0.4375f, +0.21875f,0.4375f, +0.226563f,0.4375f, +0.234375f,0.4375f, +0.242188f,0.4375f, +0.25f,0.4375f, +0.257813f,0.4375f, +0.265625f,0.4375f, +0.273438f,0.4375f, +0.28125f,0.4375f, +0.289063f,0.4375f, +0.296875f,0.4375f, +0.304688f,0.4375f, +0.3125f,0.4375f, +0.320313f,0.4375f, +0.328125f,0.4375f, +0.335938f,0.4375f, +0.34375f,0.4375f, +0.351563f,0.4375f, +0.359375f,0.4375f, +0.367188f,0.4375f, +0.375f,0.4375f, +0.382813f,0.4375f, +0.390625f,0.4375f, +0.398438f,0.4375f, +0.40625f,0.4375f, +0.414063f,0.4375f, +0.421875f,0.4375f, +0.429688f,0.4375f, +0.4375f,0.4375f, +0.445313f,0.4375f, +0.453125f,0.4375f, +0.460938f,0.4375f, +0.46875f,0.4375f, +0.476563f,0.4375f, +0.484375f,0.4375f, +0.492188f,0.4375f, +0.5f,0.4375f, +0.507813f,0.4375f, +0.0f,0.445313f, +0.0078125f,0.445313f, +0.015625f,0.445313f, +0.0234375f,0.445313f, +0.03125f,0.445313f, +0.0390625f,0.445313f, +0.046875f,0.445313f, +0.0546875f,0.445313f, +0.0625f,0.445313f, +0.0703125f,0.445313f, +0.078125f,0.445313f, +0.0859375f,0.445313f, +0.09375f,0.445313f, +0.101563f,0.445313f, +0.109375f,0.445313f, +0.117188f,0.445313f, +0.125f,0.445313f, +0.132813f,0.445313f, +0.140625f,0.445313f, +0.148438f,0.445313f, +0.15625f,0.445313f, +0.164063f,0.445313f, +0.171875f,0.445313f, +0.179688f,0.445313f, +0.1875f,0.445313f, +0.195313f,0.445313f, +0.203125f,0.445313f, +0.210938f,0.445313f, +0.21875f,0.445313f, +0.226563f,0.445313f, +0.234375f,0.445313f, +0.242188f,0.445313f, +0.25f,0.445313f, +0.257813f,0.445313f, +0.265625f,0.445313f, +0.273438f,0.445313f, +0.28125f,0.445313f, +0.289063f,0.445313f, +0.296875f,0.445313f, +0.304688f,0.445313f, +0.3125f,0.445313f, +0.320313f,0.445313f, +0.328125f,0.445313f, +0.335938f,0.445313f, +0.34375f,0.445313f, +0.351563f,0.445313f, +0.359375f,0.445313f, +0.367188f,0.445313f, +0.375f,0.445313f, +0.382813f,0.445313f, +0.390625f,0.445313f, +0.398438f,0.445313f, +0.40625f,0.445313f, +0.414063f,0.445313f, +0.421875f,0.445313f, +0.429688f,0.445313f, +0.4375f,0.445313f, +0.445313f,0.445313f, +0.453125f,0.445313f, +0.460938f,0.445313f, +0.46875f,0.445313f, +0.476563f,0.445313f, +0.484375f,0.445313f, +0.492188f,0.445313f, +0.5f,0.445313f, +0.507813f,0.445313f, +0.0f,0.453125f, +0.0078125f,0.453125f, +0.015625f,0.453125f, +0.0234375f,0.453125f, +0.03125f,0.453125f, +0.0390625f,0.453125f, +0.046875f,0.453125f, +0.0546875f,0.453125f, +0.0625f,0.453125f, +0.0703125f,0.453125f, +0.078125f,0.453125f, +0.0859375f,0.453125f, +0.09375f,0.453125f, +0.101563f,0.453125f, +0.109375f,0.453125f, +0.117188f,0.453125f, +0.125f,0.453125f, +0.132813f,0.453125f, +0.140625f,0.453125f, +0.148438f,0.453125f, +0.15625f,0.453125f, +0.164063f,0.453125f, +0.171875f,0.453125f, +0.179688f,0.453125f, +0.1875f,0.453125f, +0.195313f,0.453125f, +0.203125f,0.453125f, +0.210938f,0.453125f, +0.21875f,0.453125f, +0.226563f,0.453125f, +0.234375f,0.453125f, +0.242188f,0.453125f, +0.25f,0.453125f, +0.257813f,0.453125f, +0.265625f,0.453125f, +0.273438f,0.453125f, +0.28125f,0.453125f, +0.289063f,0.453125f, +0.296875f,0.453125f, +0.304688f,0.453125f, +0.3125f,0.453125f, +0.320313f,0.453125f, +0.328125f,0.453125f, +0.335938f,0.453125f, +0.34375f,0.453125f, +0.351563f,0.453125f, +0.359375f,0.453125f, +0.367188f,0.453125f, +0.375f,0.453125f, +0.382813f,0.453125f, +0.390625f,0.453125f, +0.398438f,0.453125f, +0.40625f,0.453125f, +0.414063f,0.453125f, +0.421875f,0.453125f, +0.429688f,0.453125f, +0.4375f,0.453125f, +0.445313f,0.453125f, +0.453125f,0.453125f, +0.460938f,0.453125f, +0.46875f,0.453125f, +0.476563f,0.453125f, +0.484375f,0.453125f, +0.492188f,0.453125f, +0.5f,0.453125f, +0.507813f,0.453125f, +0.0f,0.460938f, +0.0078125f,0.460938f, +0.015625f,0.460938f, +0.0234375f,0.460938f, +0.03125f,0.460938f, +0.0390625f,0.460938f, +0.046875f,0.460938f, +0.0546875f,0.460938f, +0.0625f,0.460938f, +0.0703125f,0.460938f, +0.078125f,0.460938f, +0.0859375f,0.460938f, +0.09375f,0.460938f, +0.101563f,0.460938f, +0.109375f,0.460938f, +0.117188f,0.460938f, +0.125f,0.460938f, +0.132813f,0.460938f, +0.140625f,0.460938f, +0.148438f,0.460938f, +0.15625f,0.460938f, +0.164063f,0.460938f, +0.171875f,0.460938f, +0.179688f,0.460938f, +0.1875f,0.460938f, +0.195313f,0.460938f, +0.203125f,0.460938f, +0.210938f,0.460938f, +0.21875f,0.460938f, +0.226563f,0.460938f, +0.234375f,0.460938f, +0.242188f,0.460938f, +0.25f,0.460938f, +0.257813f,0.460938f, +0.265625f,0.460938f, +0.273438f,0.460938f, +0.28125f,0.460938f, +0.289063f,0.460938f, +0.296875f,0.460938f, +0.304688f,0.460938f, +0.3125f,0.460938f, +0.320313f,0.460938f, +0.328125f,0.460938f, +0.335938f,0.460938f, +0.34375f,0.460938f, +0.351563f,0.460938f, +0.359375f,0.460938f, +0.367188f,0.460938f, +0.375f,0.460938f, +0.382813f,0.460938f, +0.390625f,0.460938f, +0.398438f,0.460938f, +0.40625f,0.460938f, +0.414063f,0.460938f, +0.421875f,0.460938f, +0.429688f,0.460938f, +0.4375f,0.460938f, +0.445313f,0.460938f, +0.453125f,0.460938f, +0.460938f,0.460938f, +0.46875f,0.460938f, +0.476563f,0.460938f, +0.484375f,0.460938f, +0.492188f,0.460938f, +0.5f,0.460938f, +0.507813f,0.460938f, +0.0f,0.46875f, +0.0078125f,0.46875f, +0.015625f,0.46875f, +0.0234375f,0.46875f, +0.03125f,0.46875f, +0.0390625f,0.46875f, +0.046875f,0.46875f, +0.0546875f,0.46875f, +0.0625f,0.46875f, +0.0703125f,0.46875f, +0.078125f,0.46875f, +0.0859375f,0.46875f, +0.09375f,0.46875f, +0.101563f,0.46875f, +0.109375f,0.46875f, +0.117188f,0.46875f, +0.125f,0.46875f, +0.132813f,0.46875f, +0.140625f,0.46875f, +0.148438f,0.46875f, +0.15625f,0.46875f, +0.164063f,0.46875f, +0.171875f,0.46875f, +0.179688f,0.46875f, +0.1875f,0.46875f, +0.195313f,0.46875f, +0.203125f,0.46875f, +0.210938f,0.46875f, +0.21875f,0.46875f, +0.226563f,0.46875f, +0.234375f,0.46875f, +0.242188f,0.46875f, +0.25f,0.46875f, +0.257813f,0.46875f, +0.265625f,0.46875f, +0.273438f,0.46875f, +0.28125f,0.46875f, +0.289063f,0.46875f, +0.296875f,0.46875f, +0.304688f,0.46875f, +0.3125f,0.46875f, +0.320313f,0.46875f, +0.328125f,0.46875f, +0.335938f,0.46875f, +0.34375f,0.46875f, +0.351563f,0.46875f, +0.359375f,0.46875f, +0.367188f,0.46875f, +0.375f,0.46875f, +0.382813f,0.46875f, +0.390625f,0.46875f, +0.398438f,0.46875f, +0.40625f,0.46875f, +0.414063f,0.46875f, +0.421875f,0.46875f, +0.429688f,0.46875f, +0.4375f,0.46875f, +0.445313f,0.46875f, +0.453125f,0.46875f, +0.460938f,0.46875f, +0.46875f,0.46875f, +0.476563f,0.46875f, +0.484375f,0.46875f, +0.492188f,0.46875f, +0.5f,0.46875f, +0.507813f,0.46875f, +0.0f,0.476563f, +0.0078125f,0.476563f, +0.015625f,0.476563f, +0.0234375f,0.476563f, +0.03125f,0.476563f, +0.0390625f,0.476563f, +0.046875f,0.476563f, +0.0546875f,0.476563f, +0.0625f,0.476563f, +0.0703125f,0.476563f, +0.078125f,0.476563f, +0.0859375f,0.476563f, +0.09375f,0.476563f, +0.101563f,0.476563f, +0.109375f,0.476563f, +0.117188f,0.476563f, +0.125f,0.476563f, +0.132813f,0.476563f, +0.140625f,0.476563f, +0.148438f,0.476563f, +0.15625f,0.476563f, +0.164063f,0.476563f, +0.171875f,0.476563f, +0.179688f,0.476563f, +0.1875f,0.476563f, +0.195313f,0.476563f, +0.203125f,0.476563f, +0.210938f,0.476563f, +0.21875f,0.476563f, +0.226563f,0.476563f, +0.234375f,0.476563f, +0.242188f,0.476563f, +0.25f,0.476563f, +0.257813f,0.476563f, +0.265625f,0.476563f, +0.273438f,0.476563f, +0.28125f,0.476563f, +0.289063f,0.476563f, +0.296875f,0.476563f, +0.304688f,0.476563f, +0.3125f,0.476563f, +0.320313f,0.476563f, +0.328125f,0.476563f, +0.335938f,0.476563f, +0.34375f,0.476563f, +0.351563f,0.476563f, +0.359375f,0.476563f, +0.367188f,0.476563f, +0.375f,0.476563f, +0.382813f,0.476563f, +0.390625f,0.476563f, +0.398438f,0.476563f, +0.40625f,0.476563f, +0.414063f,0.476563f, +0.421875f,0.476563f, +0.429688f,0.476563f, +0.4375f,0.476563f, +0.445313f,0.476563f, +0.453125f,0.476563f, +0.460938f,0.476563f, +0.46875f,0.476563f, +0.476563f,0.476563f, +0.484375f,0.476563f, +0.492188f,0.476563f, +0.5f,0.476563f, +0.507813f,0.476563f, +0.0f,0.484375f, +0.0078125f,0.484375f, +0.015625f,0.484375f, +0.0234375f,0.484375f, +0.03125f,0.484375f, +0.0390625f,0.484375f, +0.046875f,0.484375f, +0.0546875f,0.484375f, +0.0625f,0.484375f, +0.0703125f,0.484375f, +0.078125f,0.484375f, +0.0859375f,0.484375f, +0.09375f,0.484375f, +0.101563f,0.484375f, +0.109375f,0.484375f, +0.117188f,0.484375f, +0.125f,0.484375f, +0.132813f,0.484375f, +0.140625f,0.484375f, +0.148438f,0.484375f, +0.15625f,0.484375f, +0.164063f,0.484375f, +0.171875f,0.484375f, +0.179688f,0.484375f, +0.1875f,0.484375f, +0.195313f,0.484375f, +0.203125f,0.484375f, +0.210938f,0.484375f, +0.21875f,0.484375f, +0.226563f,0.484375f, +0.234375f,0.484375f, +0.242188f,0.484375f, +0.25f,0.484375f, +0.257813f,0.484375f, +0.265625f,0.484375f, +0.273438f,0.484375f, +0.28125f,0.484375f, +0.289063f,0.484375f, +0.296875f,0.484375f, +0.304688f,0.484375f, +0.3125f,0.484375f, +0.320313f,0.484375f, +0.328125f,0.484375f, +0.335938f,0.484375f, +0.34375f,0.484375f, +0.351563f,0.484375f, +0.359375f,0.484375f, +0.367188f,0.484375f, +0.375f,0.484375f, +0.382813f,0.484375f, +0.390625f,0.484375f, +0.398438f,0.484375f, +0.40625f,0.484375f, +0.414063f,0.484375f, +0.421875f,0.484375f, +0.429688f,0.484375f, +0.4375f,0.484375f, +0.445313f,0.484375f, +0.453125f,0.484375f, +0.460938f,0.484375f, +0.46875f,0.484375f, +0.476563f,0.484375f, +0.484375f,0.484375f, +0.492188f,0.484375f, +0.5f,0.484375f, +0.507813f,0.484375f, +0.0f,0.492188f, +0.0078125f,0.492188f, +0.015625f,0.492188f, +0.0234375f,0.492188f, +0.03125f,0.492188f, +0.0390625f,0.492188f, +0.046875f,0.492188f, +0.0546875f,0.492188f, +0.0625f,0.492188f, +0.0703125f,0.492188f, +0.078125f,0.492188f, +0.0859375f,0.492188f, +0.09375f,0.492188f, +0.101563f,0.492188f, +0.109375f,0.492188f, +0.117188f,0.492188f, +0.125f,0.492188f, +0.132813f,0.492188f, +0.140625f,0.492188f, +0.148438f,0.492188f, +0.15625f,0.492188f, +0.164063f,0.492188f, +0.171875f,0.492188f, +0.179688f,0.492188f, +0.1875f,0.492188f, +0.195313f,0.492188f, +0.203125f,0.492188f, +0.210938f,0.492188f, +0.21875f,0.492188f, +0.226563f,0.492188f, +0.234375f,0.492188f, +0.242188f,0.492188f, +0.25f,0.492188f, +0.257813f,0.492188f, +0.265625f,0.492188f, +0.273438f,0.492188f, +0.28125f,0.492188f, +0.289063f,0.492188f, +0.296875f,0.492188f, +0.304688f,0.492188f, +0.3125f,0.492188f, +0.320313f,0.492188f, +0.328125f,0.492188f, +0.335938f,0.492188f, +0.34375f,0.492188f, +0.351563f,0.492188f, +0.359375f,0.492188f, +0.367188f,0.492188f, +0.375f,0.492188f, +0.382813f,0.492188f, +0.390625f,0.492188f, +0.398438f,0.492188f, +0.40625f,0.492188f, +0.414063f,0.492188f, +0.421875f,0.492188f, +0.429688f,0.492188f, +0.4375f,0.492188f, +0.445313f,0.492188f, +0.453125f,0.492188f, +0.460938f,0.492188f, +0.46875f,0.492188f, +0.476563f,0.492188f, +0.484375f,0.492188f, +0.492188f,0.492188f, +0.5f,0.492188f, +0.507813f,0.492188f, +}; + +unsigned short Landscape02Idx[] = { +0,1,2, +3,2,1, +2,3,4, +5,4,3, +4,5,6, +7,6,5, +6,7,8, +9,8,7, +8,9,10, +11,10,9, +10,11,12, +13,12,11, +12,13,14, +15,14,13, +14,15,16, +17,16,15, +16,17,18, +19,18,17, +18,19,20, +21,20,19, +20,21,22, +23,22,21, +22,23,24, +25,24,23, +24,25,26, +27,26,25, +26,27,28, +29,28,27, +28,29,30, +31,30,29, +30,31,32, +33,32,31, +32,33,34, +35,34,33, +34,35,36, +37,36,35, +36,37,38, +39,38,37, +38,39,40, +41,40,39, +40,41,42, +43,42,41, +42,43,44, +45,44,43, +44,45,46, +47,46,45, +46,47,48, +49,48,47, +48,49,50, +51,50,49, +50,51,52, +53,52,51, +52,53,54, +55,54,53, +54,55,56, +57,56,55, +56,57,58, +59,58,57, +58,59,60, +61,60,59, +60,61,62, +63,62,61, +62,63,64, +65,64,63, +64,65,66, +67,66,65, +66,67,68, +69,68,67, +68,69,70, +71,70,69, +70,71,72, +73,72,71, +72,73,74, +75,74,73, +74,75,76, +77,76,75, +76,77,78, +79,78,77, +78,79,80, +81,80,79, +80,81,82, +83,82,81, +82,83,84, +85,84,83, +84,85,86, +87,86,85, +86,87,88, +89,88,87, +88,89,90, +91,90,89, +90,91,92, +93,92,91, +92,93,94, +95,94,93, +94,95,96, +97,96,95, +96,97,98, +99,98,97, +98,99,100, +101,100,99, +100,101,102, +103,102,101, +102,103,104, +105,104,103, +104,105,106, +107,106,105, +106,107,108, +109,108,107, +108,109,110, +111,110,109, +110,111,112, +113,112,111, +112,113,114, +115,114,113, +114,115,116, +117,116,115, +116,117,118, +119,118,117, +118,119,120, +121,120,119, +120,121,122, +123,122,121, +122,123,124, +125,124,123, +124,125,126, +127,126,125, +126,127,128, +129,128,127, +128,129,130, +131,130,129, +132,0,133, +2,133,0, +133,2,134, +4,134,2, +134,4,135, +6,135,4, +135,6,136, +8,136,6, +136,8,137, +10,137,8, +137,10,138, +12,138,10, +138,12,139, +14,139,12, +139,14,140, +16,140,14, +140,16,141, +18,141,16, +141,18,142, +20,142,18, +142,20,143, +22,143,20, +143,22,144, +24,144,22, +144,24,145, +26,145,24, +145,26,146, +28,146,26, +146,28,147, +30,147,28, +147,30,148, +32,148,30, +148,32,149, +34,149,32, +149,34,150, +36,150,34, +150,36,151, +38,151,36, +151,38,152, +40,152,38, +152,40,153, +42,153,40, +153,42,154, +44,154,42, +154,44,155, +46,155,44, +155,46,156, +48,156,46, +156,48,157, +50,157,48, +157,50,158, +52,158,50, +158,52,159, +54,159,52, +159,54,160, +56,160,54, +160,56,161, +58,161,56, +161,58,162, +60,162,58, +162,60,163, +62,163,60, +163,62,164, +64,164,62, +164,64,165, +66,165,64, +165,66,166, +68,166,66, +166,68,167, +70,167,68, +167,70,168, +72,168,70, +168,72,169, +74,169,72, +169,74,170, +76,170,74, +170,76,171, +78,171,76, +171,78,172, +80,172,78, +172,80,173, +82,173,80, +173,82,174, +84,174,82, +174,84,175, +86,175,84, +175,86,176, +88,176,86, +176,88,177, +90,177,88, +177,90,178, +92,178,90, +178,92,179, +94,179,92, +179,94,180, +96,180,94, +180,96,181, +98,181,96, +181,98,182, +100,182,98, +182,100,183, +102,183,100, +183,102,184, +104,184,102, +184,104,185, +106,185,104, +185,106,186, +108,186,106, +186,108,187, +110,187,108, +187,110,188, +112,188,110, +188,112,189, +114,189,112, +189,114,190, +116,190,114, +190,116,191, +118,191,116, +191,118,192, +120,192,118, +192,120,193, +122,193,120, +193,122,194, +124,194,122, +194,124,195, +126,195,124, +195,126,196, +128,196,126, +196,128,197, +130,197,128, +198,132,199, +133,199,132, +199,133,200, +134,200,133, +200,134,201, +135,201,134, +201,135,202, +136,202,135, +202,136,203, +137,203,136, +203,137,204, +138,204,137, +204,138,205, +139,205,138, +205,139,206, +140,206,139, +206,140,207, +141,207,140, +207,141,208, +142,208,141, +208,142,209, +143,209,142, +209,143,210, +144,210,143, +210,144,211, +145,211,144, +211,145,212, +146,212,145, +212,146,213, +147,213,146, +213,147,214, +148,214,147, +214,148,215, +149,215,148, +215,149,216, +150,216,149, +216,150,217, +151,217,150, +217,151,218, +152,218,151, +218,152,219, +153,219,152, +219,153,220, +154,220,153, +220,154,221, +155,221,154, +221,155,222, +156,222,155, +222,156,223, +157,223,156, +223,157,224, +158,224,157, +224,158,225, +159,225,158, +225,159,226, +160,226,159, +226,160,227, +161,227,160, +227,161,228, +162,228,161, +228,162,229, +163,229,162, +229,163,230, +164,230,163, +230,164,231, +165,231,164, +231,165,232, +166,232,165, +232,166,233, +167,233,166, +233,167,234, +168,234,167, +234,168,235, +169,235,168, +235,169,236, +170,236,169, +236,170,237, +171,237,170, +237,171,238, +172,238,171, +238,172,239, +173,239,172, +239,173,240, +174,240,173, +240,174,241, +175,241,174, +241,175,242, +176,242,175, +242,176,243, +177,243,176, +243,177,244, +178,244,177, +244,178,245, +179,245,178, +245,179,246, +180,246,179, +246,180,247, +181,247,180, +247,181,248, +182,248,181, +248,182,249, +183,249,182, +249,183,250, +184,250,183, +250,184,251, +185,251,184, +251,185,252, +186,252,185, +252,186,253, +187,253,186, +253,187,254, +188,254,187, +254,188,255, +189,255,188, +255,189,256, +190,256,189, +256,190,257, +191,257,190, +257,191,258, +192,258,191, +258,192,259, +193,259,192, +259,193,260, +194,260,193, +260,194,261, +195,261,194, +261,195,262, +196,262,195, +262,196,263, +197,263,196, +264,198,265, +199,265,198, +265,199,266, +200,266,199, +266,200,267, +201,267,200, +267,201,268, +202,268,201, +268,202,269, +203,269,202, +269,203,270, +204,270,203, +270,204,271, +205,271,204, +271,205,272, +206,272,205, +272,206,273, +207,273,206, +273,207,274, +208,274,207, +274,208,275, +209,275,208, +275,209,276, +210,276,209, +276,210,277, +211,277,210, +277,211,278, +212,278,211, +278,212,279, +213,279,212, +279,213,280, +214,280,213, +280,214,281, +215,281,214, +281,215,282, +216,282,215, +282,216,283, +217,283,216, +283,217,284, +218,284,217, +284,218,285, +219,285,218, +285,219,286, +220,286,219, +286,220,287, +221,287,220, +287,221,288, +222,288,221, +288,222,289, +223,289,222, +289,223,290, +224,290,223, +290,224,291, +225,291,224, +291,225,292, +226,292,225, +292,226,293, +227,293,226, +293,227,294, +228,294,227, +294,228,295, +229,295,228, +295,229,296, +230,296,229, +296,230,297, +231,297,230, +297,231,298, +232,298,231, +298,232,299, +233,299,232, +299,233,300, +234,300,233, +300,234,301, +235,301,234, +301,235,302, +236,302,235, +302,236,303, +237,303,236, +303,237,304, +238,304,237, +304,238,305, +239,305,238, +305,239,306, +240,306,239, +306,240,307, +241,307,240, +307,241,308, +242,308,241, +308,242,309, +243,309,242, +309,243,310, +244,310,243, +310,244,311, +245,311,244, +311,245,312, +246,312,245, +312,246,313, +247,313,246, +313,247,314, +248,314,247, +314,248,315, +249,315,248, +315,249,316, +250,316,249, +316,250,317, +251,317,250, +317,251,318, +252,318,251, +318,252,319, +253,319,252, +319,253,320, +254,320,253, +320,254,321, +255,321,254, +321,255,322, +256,322,255, +322,256,323, +257,323,256, +323,257,324, +258,324,257, +324,258,325, +259,325,258, +325,259,326, +260,326,259, +326,260,327, +261,327,260, +327,261,328, +262,328,261, +328,262,329, +263,329,262, +330,264,331, +265,331,264, +331,265,332, +266,332,265, +332,266,333, +267,333,266, +333,267,334, +268,334,267, +334,268,335, +269,335,268, +335,269,336, +270,336,269, +336,270,337, +271,337,270, +337,271,338, +272,338,271, +338,272,339, +273,339,272, +339,273,340, +274,340,273, +340,274,341, +275,341,274, +341,275,342, +276,342,275, +342,276,343, +277,343,276, +343,277,344, +278,344,277, +344,278,345, +279,345,278, +345,279,346, +280,346,279, +346,280,347, +281,347,280, +347,281,348, +282,348,281, +348,282,349, +283,349,282, +349,283,350, +284,350,283, +350,284,351, +285,351,284, +351,285,352, +286,352,285, +352,286,353, +287,353,286, +353,287,354, +288,354,287, +354,288,355, +289,355,288, +355,289,356, +290,356,289, +356,290,357, +291,357,290, +357,291,358, +292,358,291, +358,292,359, +293,359,292, +359,293,360, +294,360,293, +360,294,361, +295,361,294, +361,295,362, +296,362,295, +362,296,363, +297,363,296, +363,297,364, +298,364,297, +364,298,365, +299,365,298, +365,299,366, +300,366,299, +366,300,367, +301,367,300, +367,301,368, +302,368,301, +368,302,369, +303,369,302, +369,303,370, +304,370,303, +370,304,371, +305,371,304, +371,305,372, +306,372,305, +372,306,373, +307,373,306, +373,307,374, +308,374,307, +374,308,375, +309,375,308, +375,309,376, +310,376,309, +376,310,377, +311,377,310, +377,311,378, +312,378,311, +378,312,379, +313,379,312, +379,313,380, +314,380,313, +380,314,381, +315,381,314, +381,315,382, +316,382,315, +382,316,383, +317,383,316, +383,317,384, +318,384,317, +384,318,385, +319,385,318, +385,319,386, +320,386,319, +386,320,387, +321,387,320, +387,321,388, +322,388,321, +388,322,389, +323,389,322, +389,323,390, +324,390,323, +390,324,391, +325,391,324, +391,325,392, +326,392,325, +392,326,393, +327,393,326, +393,327,394, +328,394,327, +394,328,395, +329,395,328, +396,330,397, +331,397,330, +397,331,398, +332,398,331, +398,332,399, +333,399,332, +399,333,400, +334,400,333, +400,334,401, +335,401,334, +401,335,402, +336,402,335, +402,336,403, +337,403,336, +403,337,404, +338,404,337, +404,338,405, +339,405,338, +405,339,406, +340,406,339, +406,340,407, +341,407,340, +407,341,408, +342,408,341, +408,342,409, +343,409,342, +409,343,410, +344,410,343, +410,344,411, +345,411,344, +411,345,412, +346,412,345, +412,346,413, +347,413,346, +413,347,414, +348,414,347, +414,348,415, +349,415,348, +415,349,416, +350,416,349, +416,350,417, +351,417,350, +417,351,418, +352,418,351, +418,352,419, +353,419,352, +419,353,420, +354,420,353, +420,354,421, +355,421,354, +421,355,422, +356,422,355, +422,356,423, +357,423,356, +423,357,424, +358,424,357, +424,358,425, +359,425,358, +425,359,426, +360,426,359, +426,360,427, +361,427,360, +427,361,428, +362,428,361, +428,362,429, +363,429,362, +429,363,430, +364,430,363, +430,364,431, +365,431,364, +431,365,432, +366,432,365, +432,366,433, +367,433,366, +433,367,434, +368,434,367, +434,368,435, +369,435,368, +435,369,436, +370,436,369, +436,370,437, +371,437,370, +437,371,438, +372,438,371, +438,372,439, +373,439,372, +439,373,440, +374,440,373, +440,374,441, +375,441,374, +441,375,442, +376,442,375, +442,376,443, +377,443,376, +443,377,444, +378,444,377, +444,378,445, +379,445,378, +445,379,446, +380,446,379, +446,380,447, +381,447,380, +447,381,448, +382,448,381, +448,382,449, +383,449,382, +449,383,450, +384,450,383, +450,384,451, +385,451,384, +451,385,452, +386,452,385, +452,386,453, +387,453,386, +453,387,454, +388,454,387, +454,388,455, +389,455,388, +455,389,456, +390,456,389, +456,390,457, +391,457,390, +457,391,458, +392,458,391, +458,392,459, +393,459,392, +459,393,460, +394,460,393, +460,394,461, +395,461,394, +462,396,463, +397,463,396, +463,397,464, +398,464,397, +464,398,465, +399,465,398, +465,399,466, +400,466,399, +466,400,467, +401,467,400, +467,401,468, +402,468,401, +468,402,469, +403,469,402, +469,403,470, +404,470,403, +470,404,471, +405,471,404, +471,405,472, +406,472,405, +472,406,473, +407,473,406, +473,407,474, +408,474,407, +474,408,475, +409,475,408, +475,409,476, +410,476,409, +476,410,477, +411,477,410, +477,411,478, +412,478,411, +478,412,479, +413,479,412, +479,413,480, +414,480,413, +480,414,481, +415,481,414, +481,415,482, +416,482,415, +482,416,483, +417,483,416, +483,417,484, +418,484,417, +484,418,485, +419,485,418, +485,419,486, +420,486,419, +486,420,487, +421,487,420, +487,421,488, +422,488,421, +488,422,489, +423,489,422, +489,423,490, +424,490,423, +490,424,491, +425,491,424, +491,425,492, +426,492,425, +492,426,493, +427,493,426, +493,427,494, +428,494,427, +494,428,495, +429,495,428, +495,429,496, +430,496,429, +496,430,497, +431,497,430, +497,431,498, +432,498,431, +498,432,499, +433,499,432, +499,433,500, +434,500,433, +500,434,501, +435,501,434, +501,435,502, +436,502,435, +502,436,503, +437,503,436, +503,437,504, +438,504,437, +504,438,505, +439,505,438, +505,439,506, +440,506,439, +506,440,507, +441,507,440, +507,441,508, +442,508,441, +508,442,509, +443,509,442, +509,443,510, +444,510,443, +510,444,511, +445,511,444, +511,445,512, +446,512,445, +512,446,513, +447,513,446, +513,447,514, +448,514,447, +514,448,515, +449,515,448, +515,449,516, +450,516,449, +516,450,517, +451,517,450, +517,451,518, +452,518,451, +518,452,519, +453,519,452, +519,453,520, +454,520,453, +520,454,521, +455,521,454, +521,455,522, +456,522,455, +522,456,523, +457,523,456, +523,457,524, +458,524,457, +524,458,525, +459,525,458, +525,459,526, +460,526,459, +526,460,527, +461,527,460, +528,462,529, +463,529,462, +529,463,530, +464,530,463, +530,464,531, +465,531,464, +531,465,532, +466,532,465, +532,466,533, +467,533,466, +533,467,534, +468,534,467, +534,468,535, +469,535,468, +535,469,536, +470,536,469, +536,470,537, +471,537,470, +537,471,538, +472,538,471, +538,472,539, +473,539,472, +539,473,540, +474,540,473, +540,474,541, +475,541,474, +541,475,542, +476,542,475, +542,476,543, +477,543,476, +543,477,544, +478,544,477, +544,478,545, +479,545,478, +545,479,546, +480,546,479, +546,480,547, +481,547,480, +547,481,548, +482,548,481, +548,482,549, +483,549,482, +549,483,550, +484,550,483, +550,484,551, +485,551,484, +551,485,552, +486,552,485, +552,486,553, +487,553,486, +553,487,554, +488,554,487, +554,488,555, +489,555,488, +555,489,556, +490,556,489, +556,490,557, +491,557,490, +557,491,558, +492,558,491, +558,492,559, +493,559,492, +559,493,560, +494,560,493, +560,494,561, +495,561,494, +561,495,562, +496,562,495, +562,496,563, +497,563,496, +563,497,564, +498,564,497, +564,498,565, +499,565,498, +565,499,566, +500,566,499, +566,500,567, +501,567,500, +567,501,568, +502,568,501, +568,502,569, +503,569,502, +569,503,570, +504,570,503, +570,504,571, +505,571,504, +571,505,572, +506,572,505, +572,506,573, +507,573,506, +573,507,574, +508,574,507, +574,508,575, +509,575,508, +575,509,576, +510,576,509, +576,510,577, +511,577,510, +577,511,578, +512,578,511, +578,512,579, +513,579,512, +579,513,580, +514,580,513, +580,514,581, +515,581,514, +581,515,582, +516,582,515, +582,516,583, +517,583,516, +583,517,584, +518,584,517, +584,518,585, +519,585,518, +585,519,586, +520,586,519, +586,520,587, +521,587,520, +587,521,588, +522,588,521, +588,522,589, +523,589,522, +589,523,590, +524,590,523, +590,524,591, +525,591,524, +591,525,592, +526,592,525, +592,526,593, +527,593,526, +594,528,595, +529,595,528, +595,529,596, +530,596,529, +596,530,597, +531,597,530, +597,531,598, +532,598,531, +598,532,599, +533,599,532, +599,533,600, +534,600,533, +600,534,601, +535,601,534, +601,535,602, +536,602,535, +602,536,603, +537,603,536, +603,537,604, +538,604,537, +604,538,605, +539,605,538, +605,539,606, +540,606,539, +606,540,607, +541,607,540, +607,541,608, +542,608,541, +608,542,609, +543,609,542, +609,543,610, +544,610,543, +610,544,611, +545,611,544, +611,545,612, +546,612,545, +612,546,613, +547,613,546, +613,547,614, +548,614,547, +614,548,615, +549,615,548, +615,549,616, +550,616,549, +616,550,617, +551,617,550, +617,551,618, +552,618,551, +618,552,619, +553,619,552, +619,553,620, +554,620,553, +620,554,621, +555,621,554, +621,555,622, +556,622,555, +622,556,623, +557,623,556, +623,557,624, +558,624,557, +624,558,625, +559,625,558, +625,559,626, +560,626,559, +626,560,627, +561,627,560, +627,561,628, +562,628,561, +628,562,629, +563,629,562, +629,563,630, +564,630,563, +630,564,631, +565,631,564, +631,565,632, +566,632,565, +632,566,633, +567,633,566, +633,567,634, +568,634,567, +634,568,635, +569,635,568, +635,569,636, +570,636,569, +636,570,637, +571,637,570, +637,571,638, +572,638,571, +638,572,639, +573,639,572, +639,573,640, +574,640,573, +640,574,641, +575,641,574, +641,575,642, +576,642,575, +642,576,643, +577,643,576, +643,577,644, +578,644,577, +644,578,645, +579,645,578, +645,579,646, +580,646,579, +646,580,647, +581,647,580, +647,581,648, +582,648,581, +648,582,649, +583,649,582, +649,583,650, +584,650,583, +650,584,651, +585,651,584, +651,585,652, +586,652,585, +652,586,653, +587,653,586, +653,587,654, +588,654,587, +654,588,655, +589,655,588, +655,589,656, +590,656,589, +656,590,657, +591,657,590, +657,591,658, +592,658,591, +658,592,659, +593,659,592, +660,594,661, +595,661,594, +661,595,662, +596,662,595, +662,596,663, +597,663,596, +663,597,664, +598,664,597, +664,598,665, +599,665,598, +665,599,666, +600,666,599, +666,600,667, +601,667,600, +667,601,668, +602,668,601, +668,602,669, +603,669,602, +669,603,670, +604,670,603, +670,604,671, +605,671,604, +671,605,672, +606,672,605, +672,606,673, +607,673,606, +673,607,674, +608,674,607, +674,608,675, +609,675,608, +675,609,676, +610,676,609, +676,610,677, +611,677,610, +677,611,678, +612,678,611, +678,612,679, +613,679,612, +679,613,680, +614,680,613, +680,614,681, +615,681,614, +681,615,682, +616,682,615, +682,616,683, +617,683,616, +683,617,684, +618,684,617, +684,618,685, +619,685,618, +685,619,686, +620,686,619, +686,620,687, +621,687,620, +687,621,688, +622,688,621, +688,622,689, +623,689,622, +689,623,690, +624,690,623, +690,624,691, +625,691,624, +691,625,692, +626,692,625, +692,626,693, +627,693,626, +693,627,694, +628,694,627, +694,628,695, +629,695,628, +695,629,696, +630,696,629, +696,630,697, +631,697,630, +697,631,698, +632,698,631, +698,632,699, +633,699,632, +699,633,700, +634,700,633, +700,634,701, +635,701,634, +701,635,702, +636,702,635, +702,636,703, +637,703,636, +703,637,704, +638,704,637, +704,638,705, +639,705,638, +705,639,706, +640,706,639, +706,640,707, +641,707,640, +707,641,708, +642,708,641, +708,642,709, +643,709,642, +709,643,710, +644,710,643, +710,644,711, +645,711,644, +711,645,712, +646,712,645, +712,646,713, +647,713,646, +713,647,714, +648,714,647, +714,648,715, +649,715,648, +715,649,716, +650,716,649, +716,650,717, +651,717,650, +717,651,718, +652,718,651, +718,652,719, +653,719,652, +719,653,720, +654,720,653, +720,654,721, +655,721,654, +721,655,722, +656,722,655, +722,656,723, +657,723,656, +723,657,724, +658,724,657, +724,658,725, +659,725,658, +726,660,727, +661,727,660, +727,661,728, +662,728,661, +728,662,729, +663,729,662, +729,663,730, +664,730,663, +730,664,731, +665,731,664, +731,665,732, +666,732,665, +732,666,733, +667,733,666, +733,667,734, +668,734,667, +734,668,735, +669,735,668, +735,669,736, +670,736,669, +736,670,737, +671,737,670, +737,671,738, +672,738,671, +738,672,739, +673,739,672, +739,673,740, +674,740,673, +740,674,741, +675,741,674, +741,675,742, +676,742,675, +742,676,743, +677,743,676, +743,677,744, +678,744,677, +744,678,745, +679,745,678, +745,679,746, +680,746,679, +746,680,747, +681,747,680, +747,681,748, +682,748,681, +748,682,749, +683,749,682, +749,683,750, +684,750,683, +750,684,751, +685,751,684, +751,685,752, +686,752,685, +752,686,753, +687,753,686, +753,687,754, +688,754,687, +754,688,755, +689,755,688, +755,689,756, +690,756,689, +756,690,757, +691,757,690, +757,691,758, +692,758,691, +758,692,759, +693,759,692, +759,693,760, +694,760,693, +760,694,761, +695,761,694, +761,695,762, +696,762,695, +762,696,763, +697,763,696, +763,697,764, +698,764,697, +764,698,765, +699,765,698, +765,699,766, +700,766,699, +766,700,767, +701,767,700, +767,701,768, +702,768,701, +768,702,769, +703,769,702, +769,703,770, +704,770,703, +770,704,771, +705,771,704, +771,705,772, +706,772,705, +772,706,773, +707,773,706, +773,707,774, +708,774,707, +774,708,775, +709,775,708, +775,709,776, +710,776,709, +776,710,777, +711,777,710, +777,711,778, +712,778,711, +778,712,779, +713,779,712, +779,713,780, +714,780,713, +780,714,781, +715,781,714, +781,715,782, +716,782,715, +782,716,783, +717,783,716, +783,717,784, +718,784,717, +784,718,785, +719,785,718, +785,719,786, +720,786,719, +786,720,787, +721,787,720, +787,721,788, +722,788,721, +788,722,789, +723,789,722, +789,723,790, +724,790,723, +790,724,791, +725,791,724, +792,726,793, +727,793,726, +793,727,794, +728,794,727, +794,728,795, +729,795,728, +795,729,796, +730,796,729, +796,730,797, +731,797,730, +797,731,798, +732,798,731, +798,732,799, +733,799,732, +799,733,800, +734,800,733, +800,734,801, +735,801,734, +801,735,802, +736,802,735, +802,736,803, +737,803,736, +803,737,804, +738,804,737, +804,738,805, +739,805,738, +805,739,806, +740,806,739, +806,740,807, +741,807,740, +807,741,808, +742,808,741, +808,742,809, +743,809,742, +809,743,810, +744,810,743, +810,744,811, +745,811,744, +811,745,812, +746,812,745, +812,746,813, +747,813,746, +813,747,814, +748,814,747, +814,748,815, +749,815,748, +815,749,816, +750,816,749, +816,750,817, +751,817,750, +817,751,818, +752,818,751, +818,752,819, +753,819,752, +819,753,820, +754,820,753, +820,754,821, +755,821,754, +821,755,822, +756,822,755, +822,756,823, +757,823,756, +823,757,824, +758,824,757, +824,758,825, +759,825,758, +825,759,826, +760,826,759, +826,760,827, +761,827,760, +827,761,828, +762,828,761, +828,762,829, +763,829,762, +829,763,830, +764,830,763, +830,764,831, +765,831,764, +831,765,832, +766,832,765, +832,766,833, +767,833,766, +833,767,834, +768,834,767, +834,768,835, +769,835,768, +835,769,836, +770,836,769, +836,770,837, +771,837,770, +837,771,838, +772,838,771, +838,772,839, +773,839,772, +839,773,840, +774,840,773, +840,774,841, +775,841,774, +841,775,842, +776,842,775, +842,776,843, +777,843,776, +843,777,844, +778,844,777, +844,778,845, +779,845,778, +845,779,846, +780,846,779, +846,780,847, +781,847,780, +847,781,848, +782,848,781, +848,782,849, +783,849,782, +849,783,850, +784,850,783, +850,784,851, +785,851,784, +851,785,852, +786,852,785, +852,786,853, +787,853,786, +853,787,854, +788,854,787, +854,788,855, +789,855,788, +855,789,856, +790,856,789, +856,790,857, +791,857,790, +858,792,859, +793,859,792, +859,793,860, +794,860,793, +860,794,861, +795,861,794, +861,795,862, +796,862,795, +862,796,863, +797,863,796, +863,797,864, +798,864,797, +864,798,865, +799,865,798, +865,799,866, +800,866,799, +866,800,867, +801,867,800, +867,801,868, +802,868,801, +868,802,869, +803,869,802, +869,803,870, +804,870,803, +870,804,871, +805,871,804, +871,805,872, +806,872,805, +872,806,873, +807,873,806, +873,807,874, +808,874,807, +874,808,875, +809,875,808, +875,809,876, +810,876,809, +876,810,877, +811,877,810, +877,811,878, +812,878,811, +878,812,879, +813,879,812, +879,813,880, +814,880,813, +880,814,881, +815,881,814, +881,815,882, +816,882,815, +882,816,883, +817,883,816, +883,817,884, +818,884,817, +884,818,885, +819,885,818, +885,819,886, +820,886,819, +886,820,887, +821,887,820, +887,821,888, +822,888,821, +888,822,889, +823,889,822, +889,823,890, +824,890,823, +890,824,891, +825,891,824, +891,825,892, +826,892,825, +892,826,893, +827,893,826, +893,827,894, +828,894,827, +894,828,895, +829,895,828, +895,829,896, +830,896,829, +896,830,897, +831,897,830, +897,831,898, +832,898,831, +898,832,899, +833,899,832, +899,833,900, +834,900,833, +900,834,901, +835,901,834, +901,835,902, +836,902,835, +902,836,903, +837,903,836, +903,837,904, +838,904,837, +904,838,905, +839,905,838, +905,839,906, +840,906,839, +906,840,907, +841,907,840, +907,841,908, +842,908,841, +908,842,909, +843,909,842, +909,843,910, +844,910,843, +910,844,911, +845,911,844, +911,845,912, +846,912,845, +912,846,913, +847,913,846, +913,847,914, +848,914,847, +914,848,915, +849,915,848, +915,849,916, +850,916,849, +916,850,917, +851,917,850, +917,851,918, +852,918,851, +918,852,919, +853,919,852, +919,853,920, +854,920,853, +920,854,921, +855,921,854, +921,855,922, +856,922,855, +922,856,923, +857,923,856, +924,858,925, +859,925,858, +925,859,926, +860,926,859, +926,860,927, +861,927,860, +927,861,928, +862,928,861, +928,862,929, +863,929,862, +929,863,930, +864,930,863, +930,864,931, +865,931,864, +931,865,932, +866,932,865, +932,866,933, +867,933,866, +933,867,934, +868,934,867, +934,868,935, +869,935,868, +935,869,936, +870,936,869, +936,870,937, +871,937,870, +937,871,938, +872,938,871, +938,872,939, +873,939,872, +939,873,940, +874,940,873, +940,874,941, +875,941,874, +941,875,942, +876,942,875, +942,876,943, +877,943,876, +943,877,944, +878,944,877, +944,878,945, +879,945,878, +945,879,946, +880,946,879, +946,880,947, +881,947,880, +947,881,948, +882,948,881, +948,882,949, +883,949,882, +949,883,950, +884,950,883, +950,884,951, +885,951,884, +951,885,952, +886,952,885, +952,886,953, +887,953,886, +953,887,954, +888,954,887, +954,888,955, +889,955,888, +955,889,956, +890,956,889, +956,890,957, +891,957,890, +957,891,958, +892,958,891, +958,892,959, +893,959,892, +959,893,960, +894,960,893, +960,894,961, +895,961,894, +961,895,962, +896,962,895, +962,896,963, +897,963,896, +963,897,964, +898,964,897, +964,898,965, +899,965,898, +965,899,966, +900,966,899, +966,900,967, +901,967,900, +967,901,968, +902,968,901, +968,902,969, +903,969,902, +969,903,970, +904,970,903, +970,904,971, +905,971,904, +971,905,972, +906,972,905, +972,906,973, +907,973,906, +973,907,974, +908,974,907, +974,908,975, +909,975,908, +975,909,976, +910,976,909, +976,910,977, +911,977,910, +977,911,978, +912,978,911, +978,912,979, +913,979,912, +979,913,980, +914,980,913, +980,914,981, +915,981,914, +981,915,982, +916,982,915, +982,916,983, +917,983,916, +983,917,984, +918,984,917, +984,918,985, +919,985,918, +985,919,986, +920,986,919, +986,920,987, +921,987,920, +987,921,988, +922,988,921, +988,922,989, +923,989,922, +990,924,991, +925,991,924, +991,925,992, +926,992,925, +992,926,993, +927,993,926, +993,927,994, +928,994,927, +994,928,995, +929,995,928, +995,929,996, +930,996,929, +996,930,997, +931,997,930, +997,931,998, +932,998,931, +998,932,999, +933,999,932, +999,933,1000, +934,1000,933, +1000,934,1001, +935,1001,934, +1001,935,1002, +936,1002,935, +1002,936,1003, +937,1003,936, +1003,937,1004, +938,1004,937, +1004,938,1005, +939,1005,938, +1005,939,1006, +940,1006,939, +1006,940,1007, +941,1007,940, +1007,941,1008, +942,1008,941, +1008,942,1009, +943,1009,942, +1009,943,1010, +944,1010,943, +1010,944,1011, +945,1011,944, +1011,945,1012, +946,1012,945, +1012,946,1013, +947,1013,946, +1013,947,1014, +948,1014,947, +1014,948,1015, +949,1015,948, +1015,949,1016, +950,1016,949, +1016,950,1017, +951,1017,950, +1017,951,1018, +952,1018,951, +1018,952,1019, +953,1019,952, +1019,953,1020, +954,1020,953, +1020,954,1021, +955,1021,954, +1021,955,1022, +956,1022,955, +1022,956,1023, +957,1023,956, +1023,957,1024, +958,1024,957, +1024,958,1025, +959,1025,958, +1025,959,1026, +960,1026,959, +1026,960,1027, +961,1027,960, +1027,961,1028, +962,1028,961, +1028,962,1029, +963,1029,962, +1029,963,1030, +964,1030,963, +1030,964,1031, +965,1031,964, +1031,965,1032, +966,1032,965, +1032,966,1033, +967,1033,966, +1033,967,1034, +968,1034,967, +1034,968,1035, +969,1035,968, +1035,969,1036, +970,1036,969, +1036,970,1037, +971,1037,970, +1037,971,1038, +972,1038,971, +1038,972,1039, +973,1039,972, +1039,973,1040, +974,1040,973, +1040,974,1041, +975,1041,974, +1041,975,1042, +976,1042,975, +1042,976,1043, +977,1043,976, +1043,977,1044, +978,1044,977, +1044,978,1045, +979,1045,978, +1045,979,1046, +980,1046,979, +1046,980,1047, +981,1047,980, +1047,981,1048, +982,1048,981, +1048,982,1049, +983,1049,982, +1049,983,1050, +984,1050,983, +1050,984,1051, +985,1051,984, +1051,985,1052, +986,1052,985, +1052,986,1053, +987,1053,986, +1053,987,1054, +988,1054,987, +1054,988,1055, +989,1055,988, +1056,990,1057, +991,1057,990, +1057,991,1058, +992,1058,991, +1058,992,1059, +993,1059,992, +1059,993,1060, +994,1060,993, +1060,994,1061, +995,1061,994, +1061,995,1062, +996,1062,995, +1062,996,1063, +997,1063,996, +1063,997,1064, +998,1064,997, +1064,998,1065, +999,1065,998, +1065,999,1066, +1000,1066,999, +1066,1000,1067, +1001,1067,1000, +1067,1001,1068, +1002,1068,1001, +1068,1002,1069, +1003,1069,1002, +1069,1003,1070, +1004,1070,1003, +1070,1004,1071, +1005,1071,1004, +1071,1005,1072, +1006,1072,1005, +1072,1006,1073, +1007,1073,1006, +1073,1007,1074, +1008,1074,1007, +1074,1008,1075, +1009,1075,1008, +1075,1009,1076, +1010,1076,1009, +1076,1010,1077, +1011,1077,1010, +1077,1011,1078, +1012,1078,1011, +1078,1012,1079, +1013,1079,1012, +1079,1013,1080, +1014,1080,1013, +1080,1014,1081, +1015,1081,1014, +1081,1015,1082, +1016,1082,1015, +1082,1016,1083, +1017,1083,1016, +1083,1017,1084, +1018,1084,1017, +1084,1018,1085, +1019,1085,1018, +1085,1019,1086, +1020,1086,1019, +1086,1020,1087, +1021,1087,1020, +1087,1021,1088, +1022,1088,1021, +1088,1022,1089, +1023,1089,1022, +1089,1023,1090, +1024,1090,1023, +1090,1024,1091, +1025,1091,1024, +1091,1025,1092, +1026,1092,1025, +1092,1026,1093, +1027,1093,1026, +1093,1027,1094, +1028,1094,1027, +1094,1028,1095, +1029,1095,1028, +1095,1029,1096, +1030,1096,1029, +1096,1030,1097, +1031,1097,1030, +1097,1031,1098, +1032,1098,1031, +1098,1032,1099, +1033,1099,1032, +1099,1033,1100, +1034,1100,1033, +1100,1034,1101, +1035,1101,1034, +1101,1035,1102, +1036,1102,1035, +1102,1036,1103, +1037,1103,1036, +1103,1037,1104, +1038,1104,1037, +1104,1038,1105, +1039,1105,1038, +1105,1039,1106, +1040,1106,1039, +1106,1040,1107, +1041,1107,1040, +1107,1041,1108, +1042,1108,1041, +1108,1042,1109, +1043,1109,1042, +1109,1043,1110, +1044,1110,1043, +1110,1044,1111, +1045,1111,1044, +1111,1045,1112, +1046,1112,1045, +1112,1046,1113, +1047,1113,1046, +1113,1047,1114, +1048,1114,1047, +1114,1048,1115, +1049,1115,1048, +1115,1049,1116, +1050,1116,1049, +1116,1050,1117, +1051,1117,1050, +1117,1051,1118, +1052,1118,1051, +1118,1052,1119, +1053,1119,1052, +1119,1053,1120, +1054,1120,1053, +1120,1054,1121, +1055,1121,1054, +1122,1056,1123, +1057,1123,1056, +1123,1057,1124, +1058,1124,1057, +1124,1058,1125, +1059,1125,1058, +1125,1059,1126, +1060,1126,1059, +1126,1060,1127, +1061,1127,1060, +1127,1061,1128, +1062,1128,1061, +1128,1062,1129, +1063,1129,1062, +1129,1063,1130, +1064,1130,1063, +1130,1064,1131, +1065,1131,1064, +1131,1065,1132, +1066,1132,1065, +1132,1066,1133, +1067,1133,1066, +1133,1067,1134, +1068,1134,1067, +1134,1068,1135, +1069,1135,1068, +1135,1069,1136, +1070,1136,1069, +1136,1070,1137, +1071,1137,1070, +1137,1071,1138, +1072,1138,1071, +1138,1072,1139, +1073,1139,1072, +1139,1073,1140, +1074,1140,1073, +1140,1074,1141, +1075,1141,1074, +1141,1075,1142, +1076,1142,1075, +1142,1076,1143, +1077,1143,1076, +1143,1077,1144, +1078,1144,1077, +1144,1078,1145, +1079,1145,1078, +1145,1079,1146, +1080,1146,1079, +1146,1080,1147, +1081,1147,1080, +1147,1081,1148, +1082,1148,1081, +1148,1082,1149, +1083,1149,1082, +1149,1083,1150, +1084,1150,1083, +1150,1084,1151, +1085,1151,1084, +1151,1085,1152, +1086,1152,1085, +1152,1086,1153, +1087,1153,1086, +1153,1087,1154, +1088,1154,1087, +1154,1088,1155, +1089,1155,1088, +1155,1089,1156, +1090,1156,1089, +1156,1090,1157, +1091,1157,1090, +1157,1091,1158, +1092,1158,1091, +1158,1092,1159, +1093,1159,1092, +1159,1093,1160, +1094,1160,1093, +1160,1094,1161, +1095,1161,1094, +1161,1095,1162, +1096,1162,1095, +1162,1096,1163, +1097,1163,1096, +1163,1097,1164, +1098,1164,1097, +1164,1098,1165, +1099,1165,1098, +1165,1099,1166, +1100,1166,1099, +1166,1100,1167, +1101,1167,1100, +1167,1101,1168, +1102,1168,1101, +1168,1102,1169, +1103,1169,1102, +1169,1103,1170, +1104,1170,1103, +1170,1104,1171, +1105,1171,1104, +1171,1105,1172, +1106,1172,1105, +1172,1106,1173, +1107,1173,1106, +1173,1107,1174, +1108,1174,1107, +1174,1108,1175, +1109,1175,1108, +1175,1109,1176, +1110,1176,1109, +1176,1110,1177, +1111,1177,1110, +1177,1111,1178, +1112,1178,1111, +1178,1112,1179, +1113,1179,1112, +1179,1113,1180, +1114,1180,1113, +1180,1114,1181, +1115,1181,1114, +1181,1115,1182, +1116,1182,1115, +1182,1116,1183, +1117,1183,1116, +1183,1117,1184, +1118,1184,1117, +1184,1118,1185, +1119,1185,1118, +1185,1119,1186, +1120,1186,1119, +1186,1120,1187, +1121,1187,1120, +1188,1122,1189, +1123,1189,1122, +1189,1123,1190, +1124,1190,1123, +1190,1124,1191, +1125,1191,1124, +1191,1125,1192, +1126,1192,1125, +1192,1126,1193, +1127,1193,1126, +1193,1127,1194, +1128,1194,1127, +1194,1128,1195, +1129,1195,1128, +1195,1129,1196, +1130,1196,1129, +1196,1130,1197, +1131,1197,1130, +1197,1131,1198, +1132,1198,1131, +1198,1132,1199, +1133,1199,1132, +1199,1133,1200, +1134,1200,1133, +1200,1134,1201, +1135,1201,1134, +1201,1135,1202, +1136,1202,1135, +1202,1136,1203, +1137,1203,1136, +1203,1137,1204, +1138,1204,1137, +1204,1138,1205, +1139,1205,1138, +1205,1139,1206, +1140,1206,1139, +1206,1140,1207, +1141,1207,1140, +1207,1141,1208, +1142,1208,1141, +1208,1142,1209, +1143,1209,1142, +1209,1143,1210, +1144,1210,1143, +1210,1144,1211, +1145,1211,1144, +1211,1145,1212, +1146,1212,1145, +1212,1146,1213, +1147,1213,1146, +1213,1147,1214, +1148,1214,1147, +1214,1148,1215, +1149,1215,1148, +1215,1149,1216, +1150,1216,1149, +1216,1150,1217, +1151,1217,1150, +1217,1151,1218, +1152,1218,1151, +1218,1152,1219, +1153,1219,1152, +1219,1153,1220, +1154,1220,1153, +1220,1154,1221, +1155,1221,1154, +1221,1155,1222, +1156,1222,1155, +1222,1156,1223, +1157,1223,1156, +1223,1157,1224, +1158,1224,1157, +1224,1158,1225, +1159,1225,1158, +1225,1159,1226, +1160,1226,1159, +1226,1160,1227, +1161,1227,1160, +1227,1161,1228, +1162,1228,1161, +1228,1162,1229, +1163,1229,1162, +1229,1163,1230, +1164,1230,1163, +1230,1164,1231, +1165,1231,1164, +1231,1165,1232, +1166,1232,1165, +1232,1166,1233, +1167,1233,1166, +1233,1167,1234, +1168,1234,1167, +1234,1168,1235, +1169,1235,1168, +1235,1169,1236, +1170,1236,1169, +1236,1170,1237, +1171,1237,1170, +1237,1171,1238, +1172,1238,1171, +1238,1172,1239, +1173,1239,1172, +1239,1173,1240, +1174,1240,1173, +1240,1174,1241, +1175,1241,1174, +1241,1175,1242, +1176,1242,1175, +1242,1176,1243, +1177,1243,1176, +1243,1177,1244, +1178,1244,1177, +1244,1178,1245, +1179,1245,1178, +1245,1179,1246, +1180,1246,1179, +1246,1180,1247, +1181,1247,1180, +1247,1181,1248, +1182,1248,1181, +1248,1182,1249, +1183,1249,1182, +1249,1183,1250, +1184,1250,1183, +1250,1184,1251, +1185,1251,1184, +1251,1185,1252, +1186,1252,1185, +1252,1186,1253, +1187,1253,1186, +1254,1188,1255, +1189,1255,1188, +1255,1189,1256, +1190,1256,1189, +1256,1190,1257, +1191,1257,1190, +1257,1191,1258, +1192,1258,1191, +1258,1192,1259, +1193,1259,1192, +1259,1193,1260, +1194,1260,1193, +1260,1194,1261, +1195,1261,1194, +1261,1195,1262, +1196,1262,1195, +1262,1196,1263, +1197,1263,1196, +1263,1197,1264, +1198,1264,1197, +1264,1198,1265, +1199,1265,1198, +1265,1199,1266, +1200,1266,1199, +1266,1200,1267, +1201,1267,1200, +1267,1201,1268, +1202,1268,1201, +1268,1202,1269, +1203,1269,1202, +1269,1203,1270, +1204,1270,1203, +1270,1204,1271, +1205,1271,1204, +1271,1205,1272, +1206,1272,1205, +1272,1206,1273, +1207,1273,1206, +1273,1207,1274, +1208,1274,1207, +1274,1208,1275, +1209,1275,1208, +1275,1209,1276, +1210,1276,1209, +1276,1210,1277, +1211,1277,1210, +1277,1211,1278, +1212,1278,1211, +1278,1212,1279, +1213,1279,1212, +1279,1213,1280, +1214,1280,1213, +1280,1214,1281, +1215,1281,1214, +1281,1215,1282, +1216,1282,1215, +1282,1216,1283, +1217,1283,1216, +1283,1217,1284, +1218,1284,1217, +1284,1218,1285, +1219,1285,1218, +1285,1219,1286, +1220,1286,1219, +1286,1220,1287, +1221,1287,1220, +1287,1221,1288, +1222,1288,1221, +1288,1222,1289, +1223,1289,1222, +1289,1223,1290, +1224,1290,1223, +1290,1224,1291, +1225,1291,1224, +1291,1225,1292, +1226,1292,1225, +1292,1226,1293, +1227,1293,1226, +1293,1227,1294, +1228,1294,1227, +1294,1228,1295, +1229,1295,1228, +1295,1229,1296, +1230,1296,1229, +1296,1230,1297, +1231,1297,1230, +1297,1231,1298, +1232,1298,1231, +1298,1232,1299, +1233,1299,1232, +1299,1233,1300, +1234,1300,1233, +1300,1234,1301, +1235,1301,1234, +1301,1235,1302, +1236,1302,1235, +1302,1236,1303, +1237,1303,1236, +1303,1237,1304, +1238,1304,1237, +1304,1238,1305, +1239,1305,1238, +1305,1239,1306, +1240,1306,1239, +1306,1240,1307, +1241,1307,1240, +1307,1241,1308, +1242,1308,1241, +1308,1242,1309, +1243,1309,1242, +1309,1243,1310, +1244,1310,1243, +1310,1244,1311, +1245,1311,1244, +1311,1245,1312, +1246,1312,1245, +1312,1246,1313, +1247,1313,1246, +1313,1247,1314, +1248,1314,1247, +1314,1248,1315, +1249,1315,1248, +1315,1249,1316, +1250,1316,1249, +1316,1250,1317, +1251,1317,1250, +1317,1251,1318, +1252,1318,1251, +1318,1252,1319, +1253,1319,1252, +1320,1254,1321, +1255,1321,1254, +1321,1255,1322, +1256,1322,1255, +1322,1256,1323, +1257,1323,1256, +1323,1257,1324, +1258,1324,1257, +1324,1258,1325, +1259,1325,1258, +1325,1259,1326, +1260,1326,1259, +1326,1260,1327, +1261,1327,1260, +1327,1261,1328, +1262,1328,1261, +1328,1262,1329, +1263,1329,1262, +1329,1263,1330, +1264,1330,1263, +1330,1264,1331, +1265,1331,1264, +1331,1265,1332, +1266,1332,1265, +1332,1266,1333, +1267,1333,1266, +1333,1267,1334, +1268,1334,1267, +1334,1268,1335, +1269,1335,1268, +1335,1269,1336, +1270,1336,1269, +1336,1270,1337, +1271,1337,1270, +1337,1271,1338, +1272,1338,1271, +1338,1272,1339, +1273,1339,1272, +1339,1273,1340, +1274,1340,1273, +1340,1274,1341, +1275,1341,1274, +1341,1275,1342, +1276,1342,1275, +1342,1276,1343, +1277,1343,1276, +1343,1277,1344, +1278,1344,1277, +1344,1278,1345, +1279,1345,1278, +1345,1279,1346, +1280,1346,1279, +1346,1280,1347, +1281,1347,1280, +1347,1281,1348, +1282,1348,1281, +1348,1282,1349, +1283,1349,1282, +1349,1283,1350, +1284,1350,1283, +1350,1284,1351, +1285,1351,1284, +1351,1285,1352, +1286,1352,1285, +1352,1286,1353, +1287,1353,1286, +1353,1287,1354, +1288,1354,1287, +1354,1288,1355, +1289,1355,1288, +1355,1289,1356, +1290,1356,1289, +1356,1290,1357, +1291,1357,1290, +1357,1291,1358, +1292,1358,1291, +1358,1292,1359, +1293,1359,1292, +1359,1293,1360, +1294,1360,1293, +1360,1294,1361, +1295,1361,1294, +1361,1295,1362, +1296,1362,1295, +1362,1296,1363, +1297,1363,1296, +1363,1297,1364, +1298,1364,1297, +1364,1298,1365, +1299,1365,1298, +1365,1299,1366, +1300,1366,1299, +1366,1300,1367, +1301,1367,1300, +1367,1301,1368, +1302,1368,1301, +1368,1302,1369, +1303,1369,1302, +1369,1303,1370, +1304,1370,1303, +1370,1304,1371, +1305,1371,1304, +1371,1305,1372, +1306,1372,1305, +1372,1306,1373, +1307,1373,1306, +1373,1307,1374, +1308,1374,1307, +1374,1308,1375, +1309,1375,1308, +1375,1309,1376, +1310,1376,1309, +1376,1310,1377, +1311,1377,1310, +1377,1311,1378, +1312,1378,1311, +1378,1312,1379, +1313,1379,1312, +1379,1313,1380, +1314,1380,1313, +1380,1314,1381, +1315,1381,1314, +1381,1315,1382, +1316,1382,1315, +1382,1316,1383, +1317,1383,1316, +1383,1317,1384, +1318,1384,1317, +1384,1318,1385, +1319,1385,1318, +1386,1320,1387, +1321,1387,1320, +1387,1321,1388, +1322,1388,1321, +1388,1322,1389, +1323,1389,1322, +1389,1323,1390, +1324,1390,1323, +1390,1324,1391, +1325,1391,1324, +1391,1325,1392, +1326,1392,1325, +1392,1326,1393, +1327,1393,1326, +1393,1327,1394, +1328,1394,1327, +1394,1328,1395, +1329,1395,1328, +1395,1329,1396, +1330,1396,1329, +1396,1330,1397, +1331,1397,1330, +1397,1331,1398, +1332,1398,1331, +1398,1332,1399, +1333,1399,1332, +1399,1333,1400, +1334,1400,1333, +1400,1334,1401, +1335,1401,1334, +1401,1335,1402, +1336,1402,1335, +1402,1336,1403, +1337,1403,1336, +1403,1337,1404, +1338,1404,1337, +1404,1338,1405, +1339,1405,1338, +1405,1339,1406, +1340,1406,1339, +1406,1340,1407, +1341,1407,1340, +1407,1341,1408, +1342,1408,1341, +1408,1342,1409, +1343,1409,1342, +1409,1343,1410, +1344,1410,1343, +1410,1344,1411, +1345,1411,1344, +1411,1345,1412, +1346,1412,1345, +1412,1346,1413, +1347,1413,1346, +1413,1347,1414, +1348,1414,1347, +1414,1348,1415, +1349,1415,1348, +1415,1349,1416, +1350,1416,1349, +1416,1350,1417, +1351,1417,1350, +1417,1351,1418, +1352,1418,1351, +1418,1352,1419, +1353,1419,1352, +1419,1353,1420, +1354,1420,1353, +1420,1354,1421, +1355,1421,1354, +1421,1355,1422, +1356,1422,1355, +1422,1356,1423, +1357,1423,1356, +1423,1357,1424, +1358,1424,1357, +1424,1358,1425, +1359,1425,1358, +1425,1359,1426, +1360,1426,1359, +1426,1360,1427, +1361,1427,1360, +1427,1361,1428, +1362,1428,1361, +1428,1362,1429, +1363,1429,1362, +1429,1363,1430, +1364,1430,1363, +1430,1364,1431, +1365,1431,1364, +1431,1365,1432, +1366,1432,1365, +1432,1366,1433, +1367,1433,1366, +1433,1367,1434, +1368,1434,1367, +1434,1368,1435, +1369,1435,1368, +1435,1369,1436, +1370,1436,1369, +1436,1370,1437, +1371,1437,1370, +1437,1371,1438, +1372,1438,1371, +1438,1372,1439, +1373,1439,1372, +1439,1373,1440, +1374,1440,1373, +1440,1374,1441, +1375,1441,1374, +1441,1375,1442, +1376,1442,1375, +1442,1376,1443, +1377,1443,1376, +1443,1377,1444, +1378,1444,1377, +1444,1378,1445, +1379,1445,1378, +1445,1379,1446, +1380,1446,1379, +1446,1380,1447, +1381,1447,1380, +1447,1381,1448, +1382,1448,1381, +1448,1382,1449, +1383,1449,1382, +1449,1383,1450, +1384,1450,1383, +1450,1384,1451, +1385,1451,1384, +1452,1386,1453, +1387,1453,1386, +1453,1387,1454, +1388,1454,1387, +1454,1388,1455, +1389,1455,1388, +1455,1389,1456, +1390,1456,1389, +1456,1390,1457, +1391,1457,1390, +1457,1391,1458, +1392,1458,1391, +1458,1392,1459, +1393,1459,1392, +1459,1393,1460, +1394,1460,1393, +1460,1394,1461, +1395,1461,1394, +1461,1395,1462, +1396,1462,1395, +1462,1396,1463, +1397,1463,1396, +1463,1397,1464, +1398,1464,1397, +1464,1398,1465, +1399,1465,1398, +1465,1399,1466, +1400,1466,1399, +1466,1400,1467, +1401,1467,1400, +1467,1401,1468, +1402,1468,1401, +1468,1402,1469, +1403,1469,1402, +1469,1403,1470, +1404,1470,1403, +1470,1404,1471, +1405,1471,1404, +1471,1405,1472, +1406,1472,1405, +1472,1406,1473, +1407,1473,1406, +1473,1407,1474, +1408,1474,1407, +1474,1408,1475, +1409,1475,1408, +1475,1409,1476, +1410,1476,1409, +1476,1410,1477, +1411,1477,1410, +1477,1411,1478, +1412,1478,1411, +1478,1412,1479, +1413,1479,1412, +1479,1413,1480, +1414,1480,1413, +1480,1414,1481, +1415,1481,1414, +1481,1415,1482, +1416,1482,1415, +1482,1416,1483, +1417,1483,1416, +1483,1417,1484, +1418,1484,1417, +1484,1418,1485, +1419,1485,1418, +1485,1419,1486, +1420,1486,1419, +1486,1420,1487, +1421,1487,1420, +1487,1421,1488, +1422,1488,1421, +1488,1422,1489, +1423,1489,1422, +1489,1423,1490, +1424,1490,1423, +1490,1424,1491, +1425,1491,1424, +1491,1425,1492, +1426,1492,1425, +1492,1426,1493, +1427,1493,1426, +1493,1427,1494, +1428,1494,1427, +1494,1428,1495, +1429,1495,1428, +1495,1429,1496, +1430,1496,1429, +1496,1430,1497, +1431,1497,1430, +1497,1431,1498, +1432,1498,1431, +1498,1432,1499, +1433,1499,1432, +1499,1433,1500, +1434,1500,1433, +1500,1434,1501, +1435,1501,1434, +1501,1435,1502, +1436,1502,1435, +1502,1436,1503, +1437,1503,1436, +1503,1437,1504, +1438,1504,1437, +1504,1438,1505, +1439,1505,1438, +1505,1439,1506, +1440,1506,1439, +1506,1440,1507, +1441,1507,1440, +1507,1441,1508, +1442,1508,1441, +1508,1442,1509, +1443,1509,1442, +1509,1443,1510, +1444,1510,1443, +1510,1444,1511, +1445,1511,1444, +1511,1445,1512, +1446,1512,1445, +1512,1446,1513, +1447,1513,1446, +1513,1447,1514, +1448,1514,1447, +1514,1448,1515, +1449,1515,1448, +1515,1449,1516, +1450,1516,1449, +1516,1450,1517, +1451,1517,1450, +1518,1452,1519, +1453,1519,1452, +1519,1453,1520, +1454,1520,1453, +1520,1454,1521, +1455,1521,1454, +1521,1455,1522, +1456,1522,1455, +1522,1456,1523, +1457,1523,1456, +1523,1457,1524, +1458,1524,1457, +1524,1458,1525, +1459,1525,1458, +1525,1459,1526, +1460,1526,1459, +1526,1460,1527, +1461,1527,1460, +1527,1461,1528, +1462,1528,1461, +1528,1462,1529, +1463,1529,1462, +1529,1463,1530, +1464,1530,1463, +1530,1464,1531, +1465,1531,1464, +1531,1465,1532, +1466,1532,1465, +1532,1466,1533, +1467,1533,1466, +1533,1467,1534, +1468,1534,1467, +1534,1468,1535, +1469,1535,1468, +1535,1469,1536, +1470,1536,1469, +1536,1470,1537, +1471,1537,1470, +1537,1471,1538, +1472,1538,1471, +1538,1472,1539, +1473,1539,1472, +1539,1473,1540, +1474,1540,1473, +1540,1474,1541, +1475,1541,1474, +1541,1475,1542, +1476,1542,1475, +1542,1476,1543, +1477,1543,1476, +1543,1477,1544, +1478,1544,1477, +1544,1478,1545, +1479,1545,1478, +1545,1479,1546, +1480,1546,1479, +1546,1480,1547, +1481,1547,1480, +1547,1481,1548, +1482,1548,1481, +1548,1482,1549, +1483,1549,1482, +1549,1483,1550, +1484,1550,1483, +1550,1484,1551, +1485,1551,1484, +1551,1485,1552, +1486,1552,1485, +1552,1486,1553, +1487,1553,1486, +1553,1487,1554, +1488,1554,1487, +1554,1488,1555, +1489,1555,1488, +1555,1489,1556, +1490,1556,1489, +1556,1490,1557, +1491,1557,1490, +1557,1491,1558, +1492,1558,1491, +1558,1492,1559, +1493,1559,1492, +1559,1493,1560, +1494,1560,1493, +1560,1494,1561, +1495,1561,1494, +1561,1495,1562, +1496,1562,1495, +1562,1496,1563, +1497,1563,1496, +1563,1497,1564, +1498,1564,1497, +1564,1498,1565, +1499,1565,1498, +1565,1499,1566, +1500,1566,1499, +1566,1500,1567, +1501,1567,1500, +1567,1501,1568, +1502,1568,1501, +1568,1502,1569, +1503,1569,1502, +1569,1503,1570, +1504,1570,1503, +1570,1504,1571, +1505,1571,1504, +1571,1505,1572, +1506,1572,1505, +1572,1506,1573, +1507,1573,1506, +1573,1507,1574, +1508,1574,1507, +1574,1508,1575, +1509,1575,1508, +1575,1509,1576, +1510,1576,1509, +1576,1510,1577, +1511,1577,1510, +1577,1511,1578, +1512,1578,1511, +1578,1512,1579, +1513,1579,1512, +1579,1513,1580, +1514,1580,1513, +1580,1514,1581, +1515,1581,1514, +1581,1515,1582, +1516,1582,1515, +1582,1516,1583, +1517,1583,1516, +1584,1518,1585, +1519,1585,1518, +1585,1519,1586, +1520,1586,1519, +1586,1520,1587, +1521,1587,1520, +1587,1521,1588, +1522,1588,1521, +1588,1522,1589, +1523,1589,1522, +1589,1523,1590, +1524,1590,1523, +1590,1524,1591, +1525,1591,1524, +1591,1525,1592, +1526,1592,1525, +1592,1526,1593, +1527,1593,1526, +1593,1527,1594, +1528,1594,1527, +1594,1528,1595, +1529,1595,1528, +1595,1529,1596, +1530,1596,1529, +1596,1530,1597, +1531,1597,1530, +1597,1531,1598, +1532,1598,1531, +1598,1532,1599, +1533,1599,1532, +1599,1533,1600, +1534,1600,1533, +1600,1534,1601, +1535,1601,1534, +1601,1535,1602, +1536,1602,1535, +1602,1536,1603, +1537,1603,1536, +1603,1537,1604, +1538,1604,1537, +1604,1538,1605, +1539,1605,1538, +1605,1539,1606, +1540,1606,1539, +1606,1540,1607, +1541,1607,1540, +1607,1541,1608, +1542,1608,1541, +1608,1542,1609, +1543,1609,1542, +1609,1543,1610, +1544,1610,1543, +1610,1544,1611, +1545,1611,1544, +1611,1545,1612, +1546,1612,1545, +1612,1546,1613, +1547,1613,1546, +1613,1547,1614, +1548,1614,1547, +1614,1548,1615, +1549,1615,1548, +1615,1549,1616, +1550,1616,1549, +1616,1550,1617, +1551,1617,1550, +1617,1551,1618, +1552,1618,1551, +1618,1552,1619, +1553,1619,1552, +1619,1553,1620, +1554,1620,1553, +1620,1554,1621, +1555,1621,1554, +1621,1555,1622, +1556,1622,1555, +1622,1556,1623, +1557,1623,1556, +1623,1557,1624, +1558,1624,1557, +1624,1558,1625, +1559,1625,1558, +1625,1559,1626, +1560,1626,1559, +1626,1560,1627, +1561,1627,1560, +1627,1561,1628, +1562,1628,1561, +1628,1562,1629, +1563,1629,1562, +1629,1563,1630, +1564,1630,1563, +1630,1564,1631, +1565,1631,1564, +1631,1565,1632, +1566,1632,1565, +1632,1566,1633, +1567,1633,1566, +1633,1567,1634, +1568,1634,1567, +1634,1568,1635, +1569,1635,1568, +1635,1569,1636, +1570,1636,1569, +1636,1570,1637, +1571,1637,1570, +1637,1571,1638, +1572,1638,1571, +1638,1572,1639, +1573,1639,1572, +1639,1573,1640, +1574,1640,1573, +1640,1574,1641, +1575,1641,1574, +1641,1575,1642, +1576,1642,1575, +1642,1576,1643, +1577,1643,1576, +1643,1577,1644, +1578,1644,1577, +1644,1578,1645, +1579,1645,1578, +1645,1579,1646, +1580,1646,1579, +1646,1580,1647, +1581,1647,1580, +1647,1581,1648, +1582,1648,1581, +1648,1582,1649, +1583,1649,1582, +1650,1584,1651, +1585,1651,1584, +1651,1585,1652, +1586,1652,1585, +1652,1586,1653, +1587,1653,1586, +1653,1587,1654, +1588,1654,1587, +1654,1588,1655, +1589,1655,1588, +1655,1589,1656, +1590,1656,1589, +1656,1590,1657, +1591,1657,1590, +1657,1591,1658, +1592,1658,1591, +1658,1592,1659, +1593,1659,1592, +1659,1593,1660, +1594,1660,1593, +1660,1594,1661, +1595,1661,1594, +1661,1595,1662, +1596,1662,1595, +1662,1596,1663, +1597,1663,1596, +1663,1597,1664, +1598,1664,1597, +1664,1598,1665, +1599,1665,1598, +1665,1599,1666, +1600,1666,1599, +1666,1600,1667, +1601,1667,1600, +1667,1601,1668, +1602,1668,1601, +1668,1602,1669, +1603,1669,1602, +1669,1603,1670, +1604,1670,1603, +1670,1604,1671, +1605,1671,1604, +1671,1605,1672, +1606,1672,1605, +1672,1606,1673, +1607,1673,1606, +1673,1607,1674, +1608,1674,1607, +1674,1608,1675, +1609,1675,1608, +1675,1609,1676, +1610,1676,1609, +1676,1610,1677, +1611,1677,1610, +1677,1611,1678, +1612,1678,1611, +1678,1612,1679, +1613,1679,1612, +1679,1613,1680, +1614,1680,1613, +1680,1614,1681, +1615,1681,1614, +1681,1615,1682, +1616,1682,1615, +1682,1616,1683, +1617,1683,1616, +1683,1617,1684, +1618,1684,1617, +1684,1618,1685, +1619,1685,1618, +1685,1619,1686, +1620,1686,1619, +1686,1620,1687, +1621,1687,1620, +1687,1621,1688, +1622,1688,1621, +1688,1622,1689, +1623,1689,1622, +1689,1623,1690, +1624,1690,1623, +1690,1624,1691, +1625,1691,1624, +1691,1625,1692, +1626,1692,1625, +1692,1626,1693, +1627,1693,1626, +1693,1627,1694, +1628,1694,1627, +1694,1628,1695, +1629,1695,1628, +1695,1629,1696, +1630,1696,1629, +1696,1630,1697, +1631,1697,1630, +1697,1631,1698, +1632,1698,1631, +1698,1632,1699, +1633,1699,1632, +1699,1633,1700, +1634,1700,1633, +1700,1634,1701, +1635,1701,1634, +1701,1635,1702, +1636,1702,1635, +1702,1636,1703, +1637,1703,1636, +1703,1637,1704, +1638,1704,1637, +1704,1638,1705, +1639,1705,1638, +1705,1639,1706, +1640,1706,1639, +1706,1640,1707, +1641,1707,1640, +1707,1641,1708, +1642,1708,1641, +1708,1642,1709, +1643,1709,1642, +1709,1643,1710, +1644,1710,1643, +1710,1644,1711, +1645,1711,1644, +1711,1645,1712, +1646,1712,1645, +1712,1646,1713, +1647,1713,1646, +1713,1647,1714, +1648,1714,1647, +1714,1648,1715, +1649,1715,1648, +1716,1650,1717, +1651,1717,1650, +1717,1651,1718, +1652,1718,1651, +1718,1652,1719, +1653,1719,1652, +1719,1653,1720, +1654,1720,1653, +1720,1654,1721, +1655,1721,1654, +1721,1655,1722, +1656,1722,1655, +1722,1656,1723, +1657,1723,1656, +1723,1657,1724, +1658,1724,1657, +1724,1658,1725, +1659,1725,1658, +1725,1659,1726, +1660,1726,1659, +1726,1660,1727, +1661,1727,1660, +1727,1661,1728, +1662,1728,1661, +1728,1662,1729, +1663,1729,1662, +1729,1663,1730, +1664,1730,1663, +1730,1664,1731, +1665,1731,1664, +1731,1665,1732, +1666,1732,1665, +1732,1666,1733, +1667,1733,1666, +1733,1667,1734, +1668,1734,1667, +1734,1668,1735, +1669,1735,1668, +1735,1669,1736, +1670,1736,1669, +1736,1670,1737, +1671,1737,1670, +1737,1671,1738, +1672,1738,1671, +1738,1672,1739, +1673,1739,1672, +1739,1673,1740, +1674,1740,1673, +1740,1674,1741, +1675,1741,1674, +1741,1675,1742, +1676,1742,1675, +1742,1676,1743, +1677,1743,1676, +1743,1677,1744, +1678,1744,1677, +1744,1678,1745, +1679,1745,1678, +1745,1679,1746, +1680,1746,1679, +1746,1680,1747, +1681,1747,1680, +1747,1681,1748, +1682,1748,1681, +1748,1682,1749, +1683,1749,1682, +1749,1683,1750, +1684,1750,1683, +1750,1684,1751, +1685,1751,1684, +1751,1685,1752, +1686,1752,1685, +1752,1686,1753, +1687,1753,1686, +1753,1687,1754, +1688,1754,1687, +1754,1688,1755, +1689,1755,1688, +1755,1689,1756, +1690,1756,1689, +1756,1690,1757, +1691,1757,1690, +1757,1691,1758, +1692,1758,1691, +1758,1692,1759, +1693,1759,1692, +1759,1693,1760, +1694,1760,1693, +1760,1694,1761, +1695,1761,1694, +1761,1695,1762, +1696,1762,1695, +1762,1696,1763, +1697,1763,1696, +1763,1697,1764, +1698,1764,1697, +1764,1698,1765, +1699,1765,1698, +1765,1699,1766, +1700,1766,1699, +1766,1700,1767, +1701,1767,1700, +1767,1701,1768, +1702,1768,1701, +1768,1702,1769, +1703,1769,1702, +1769,1703,1770, +1704,1770,1703, +1770,1704,1771, +1705,1771,1704, +1771,1705,1772, +1706,1772,1705, +1772,1706,1773, +1707,1773,1706, +1773,1707,1774, +1708,1774,1707, +1774,1708,1775, +1709,1775,1708, +1775,1709,1776, +1710,1776,1709, +1776,1710,1777, +1711,1777,1710, +1777,1711,1778, +1712,1778,1711, +1778,1712,1779, +1713,1779,1712, +1779,1713,1780, +1714,1780,1713, +1780,1714,1781, +1715,1781,1714, +1782,1716,1783, +1717,1783,1716, +1783,1717,1784, +1718,1784,1717, +1784,1718,1785, +1719,1785,1718, +1785,1719,1786, +1720,1786,1719, +1786,1720,1787, +1721,1787,1720, +1787,1721,1788, +1722,1788,1721, +1788,1722,1789, +1723,1789,1722, +1789,1723,1790, +1724,1790,1723, +1790,1724,1791, +1725,1791,1724, +1791,1725,1792, +1726,1792,1725, +1792,1726,1793, +1727,1793,1726, +1793,1727,1794, +1728,1794,1727, +1794,1728,1795, +1729,1795,1728, +1795,1729,1796, +1730,1796,1729, +1796,1730,1797, +1731,1797,1730, +1797,1731,1798, +1732,1798,1731, +1798,1732,1799, +1733,1799,1732, +1799,1733,1800, +1734,1800,1733, +1800,1734,1801, +1735,1801,1734, +1801,1735,1802, +1736,1802,1735, +1802,1736,1803, +1737,1803,1736, +1803,1737,1804, +1738,1804,1737, +1804,1738,1805, +1739,1805,1738, +1805,1739,1806, +1740,1806,1739, +1806,1740,1807, +1741,1807,1740, +1807,1741,1808, +1742,1808,1741, +1808,1742,1809, +1743,1809,1742, +1809,1743,1810, +1744,1810,1743, +1810,1744,1811, +1745,1811,1744, +1811,1745,1812, +1746,1812,1745, +1812,1746,1813, +1747,1813,1746, +1813,1747,1814, +1748,1814,1747, +1814,1748,1815, +1749,1815,1748, +1815,1749,1816, +1750,1816,1749, +1816,1750,1817, +1751,1817,1750, +1817,1751,1818, +1752,1818,1751, +1818,1752,1819, +1753,1819,1752, +1819,1753,1820, +1754,1820,1753, +1820,1754,1821, +1755,1821,1754, +1821,1755,1822, +1756,1822,1755, +1822,1756,1823, +1757,1823,1756, +1823,1757,1824, +1758,1824,1757, +1824,1758,1825, +1759,1825,1758, +1825,1759,1826, +1760,1826,1759, +1826,1760,1827, +1761,1827,1760, +1827,1761,1828, +1762,1828,1761, +1828,1762,1829, +1763,1829,1762, +1829,1763,1830, +1764,1830,1763, +1830,1764,1831, +1765,1831,1764, +1831,1765,1832, +1766,1832,1765, +1832,1766,1833, +1767,1833,1766, +1833,1767,1834, +1768,1834,1767, +1834,1768,1835, +1769,1835,1768, +1835,1769,1836, +1770,1836,1769, +1836,1770,1837, +1771,1837,1770, +1837,1771,1838, +1772,1838,1771, +1838,1772,1839, +1773,1839,1772, +1839,1773,1840, +1774,1840,1773, +1840,1774,1841, +1775,1841,1774, +1841,1775,1842, +1776,1842,1775, +1842,1776,1843, +1777,1843,1776, +1843,1777,1844, +1778,1844,1777, +1844,1778,1845, +1779,1845,1778, +1845,1779,1846, +1780,1846,1779, +1846,1780,1847, +1781,1847,1780, +1848,1782,1849, +1783,1849,1782, +1849,1783,1850, +1784,1850,1783, +1850,1784,1851, +1785,1851,1784, +1851,1785,1852, +1786,1852,1785, +1852,1786,1853, +1787,1853,1786, +1853,1787,1854, +1788,1854,1787, +1854,1788,1855, +1789,1855,1788, +1855,1789,1856, +1790,1856,1789, +1856,1790,1857, +1791,1857,1790, +1857,1791,1858, +1792,1858,1791, +1858,1792,1859, +1793,1859,1792, +1859,1793,1860, +1794,1860,1793, +1860,1794,1861, +1795,1861,1794, +1861,1795,1862, +1796,1862,1795, +1862,1796,1863, +1797,1863,1796, +1863,1797,1864, +1798,1864,1797, +1864,1798,1865, +1799,1865,1798, +1865,1799,1866, +1800,1866,1799, +1866,1800,1867, +1801,1867,1800, +1867,1801,1868, +1802,1868,1801, +1868,1802,1869, +1803,1869,1802, +1869,1803,1870, +1804,1870,1803, +1870,1804,1871, +1805,1871,1804, +1871,1805,1872, +1806,1872,1805, +1872,1806,1873, +1807,1873,1806, +1873,1807,1874, +1808,1874,1807, +1874,1808,1875, +1809,1875,1808, +1875,1809,1876, +1810,1876,1809, +1876,1810,1877, +1811,1877,1810, +1877,1811,1878, +1812,1878,1811, +1878,1812,1879, +1813,1879,1812, +1879,1813,1880, +1814,1880,1813, +1880,1814,1881, +1815,1881,1814, +1881,1815,1882, +1816,1882,1815, +1882,1816,1883, +1817,1883,1816, +1883,1817,1884, +1818,1884,1817, +1884,1818,1885, +1819,1885,1818, +1885,1819,1886, +1820,1886,1819, +1886,1820,1887, +1821,1887,1820, +1887,1821,1888, +1822,1888,1821, +1888,1822,1889, +1823,1889,1822, +1889,1823,1890, +1824,1890,1823, +1890,1824,1891, +1825,1891,1824, +1891,1825,1892, +1826,1892,1825, +1892,1826,1893, +1827,1893,1826, +1893,1827,1894, +1828,1894,1827, +1894,1828,1895, +1829,1895,1828, +1895,1829,1896, +1830,1896,1829, +1896,1830,1897, +1831,1897,1830, +1897,1831,1898, +1832,1898,1831, +1898,1832,1899, +1833,1899,1832, +1899,1833,1900, +1834,1900,1833, +1900,1834,1901, +1835,1901,1834, +1901,1835,1902, +1836,1902,1835, +1902,1836,1903, +1837,1903,1836, +1903,1837,1904, +1838,1904,1837, +1904,1838,1905, +1839,1905,1838, +1905,1839,1906, +1840,1906,1839, +1906,1840,1907, +1841,1907,1840, +1907,1841,1908, +1842,1908,1841, +1908,1842,1909, +1843,1909,1842, +1909,1843,1910, +1844,1910,1843, +1910,1844,1911, +1845,1911,1844, +1911,1845,1912, +1846,1912,1845, +1912,1846,1913, +1847,1913,1846, +1914,1848,1915, +1849,1915,1848, +1915,1849,1916, +1850,1916,1849, +1916,1850,1917, +1851,1917,1850, +1917,1851,1918, +1852,1918,1851, +1918,1852,1919, +1853,1919,1852, +1919,1853,1920, +1854,1920,1853, +1920,1854,1921, +1855,1921,1854, +1921,1855,1922, +1856,1922,1855, +1922,1856,1923, +1857,1923,1856, +1923,1857,1924, +1858,1924,1857, +1924,1858,1925, +1859,1925,1858, +1925,1859,1926, +1860,1926,1859, +1926,1860,1927, +1861,1927,1860, +1927,1861,1928, +1862,1928,1861, +1928,1862,1929, +1863,1929,1862, +1929,1863,1930, +1864,1930,1863, +1930,1864,1931, +1865,1931,1864, +1931,1865,1932, +1866,1932,1865, +1932,1866,1933, +1867,1933,1866, +1933,1867,1934, +1868,1934,1867, +1934,1868,1935, +1869,1935,1868, +1935,1869,1936, +1870,1936,1869, +1936,1870,1937, +1871,1937,1870, +1937,1871,1938, +1872,1938,1871, +1938,1872,1939, +1873,1939,1872, +1939,1873,1940, +1874,1940,1873, +1940,1874,1941, +1875,1941,1874, +1941,1875,1942, +1876,1942,1875, +1942,1876,1943, +1877,1943,1876, +1943,1877,1944, +1878,1944,1877, +1944,1878,1945, +1879,1945,1878, +1945,1879,1946, +1880,1946,1879, +1946,1880,1947, +1881,1947,1880, +1947,1881,1948, +1882,1948,1881, +1948,1882,1949, +1883,1949,1882, +1949,1883,1950, +1884,1950,1883, +1950,1884,1951, +1885,1951,1884, +1951,1885,1952, +1886,1952,1885, +1952,1886,1953, +1887,1953,1886, +1953,1887,1954, +1888,1954,1887, +1954,1888,1955, +1889,1955,1888, +1955,1889,1956, +1890,1956,1889, +1956,1890,1957, +1891,1957,1890, +1957,1891,1958, +1892,1958,1891, +1958,1892,1959, +1893,1959,1892, +1959,1893,1960, +1894,1960,1893, +1960,1894,1961, +1895,1961,1894, +1961,1895,1962, +1896,1962,1895, +1962,1896,1963, +1897,1963,1896, +1963,1897,1964, +1898,1964,1897, +1964,1898,1965, +1899,1965,1898, +1965,1899,1966, +1900,1966,1899, +1966,1900,1967, +1901,1967,1900, +1967,1901,1968, +1902,1968,1901, +1968,1902,1969, +1903,1969,1902, +1969,1903,1970, +1904,1970,1903, +1970,1904,1971, +1905,1971,1904, +1971,1905,1972, +1906,1972,1905, +1972,1906,1973, +1907,1973,1906, +1973,1907,1974, +1908,1974,1907, +1974,1908,1975, +1909,1975,1908, +1975,1909,1976, +1910,1976,1909, +1976,1910,1977, +1911,1977,1910, +1977,1911,1978, +1912,1978,1911, +1978,1912,1979, +1913,1979,1912, +}; + +#define Landscape03VtxCount 2048 +#define Landscape03IdxCount 11718 + +btScalar Landscape03Vtx[] = { +3.90625f,50.3865f,-2.20246e-006f, +3.90625f,52.6186f,3.90625f, +7.8125f,50.3905f,-2.20264e-006f, +7.8125f,51.8648f,3.90625f, +11.7188f,49.8171f,-2.17758e-006f, +11.7188f,51.1949f,3.90625f, +15.625f,50.595f,-2.21158e-006f, +15.625f,50.2102f,3.90625f, +19.5313f,50.405f,-2.20327e-006f, +19.5313f,50.6058f,3.90625f, +23.4375f,50.9679f,-2.22788e-006f, +23.4375f,50.7008f,3.90625f, +27.3438f,52.4635f,-2.29325e-006f, +27.3438f,51.2163f,3.90625f, +31.25f,53.1505f,-2.32328e-006f, +31.25f,51.4263f,3.90625f, +35.1563f,53.061f,-2.31937e-006f, +35.1563f,52.1968f,3.90625f, +39.0625f,53.6772f,-2.34631e-006f, +39.0625f,53.9783f,3.90625f, +42.9688f,54.3062f,-2.3738e-006f, +42.9688f,53.8927f,3.90625f, +46.875f,54.6795f,-2.39012e-006f, +46.875f,53.3266f,3.90625f, +50.7813f,55.3188f,-2.41806e-006f, +50.7813f,53.5901f,3.90625f, +54.6875f,56.913f,-2.48775e-006f, +54.6875f,55.5679f,3.90625f, +58.5938f,57.4575f,-2.51155e-006f, +58.5938f,55.1819f,3.90625f, +62.5f,56.5398f,-2.47143e-006f, +62.5f,53.6891f,3.90625f, +66.4063f,55.8786f,-2.44253e-006f, +66.4063f,53.0541f,3.90625f, +70.3125f,53.6497f,-2.3451e-006f, +70.3125f,51.6665f,3.90625f, +74.2188f,51.6447f,-2.25746e-006f, +74.2188f,51.4469f,3.90625f, +78.125f,51.8145f,-2.26488e-006f, +78.125f,51.9591f,3.90625f, +82.0313f,51.335f,-2.24392e-006f, +82.0313f,51.0418f,3.90625f, +85.9375f,50.1836f,-2.1936e-006f, +85.9375f,49.7513f,3.90625f, +89.8438f,49.0536f,-2.1442e-006f, +89.8438f,48.7329f,3.90625f, +93.75f,47.3968f,-2.07178e-006f, +93.75f,46.8713f,3.90625f, +97.6563f,45.8014f,-2.00204e-006f, +97.6563f,46.3905f,3.90625f, +101.563f,45.2347f,-1.97727e-006f, +101.563f,45.4241f,3.90625f, +105.469f,44.6501f,-1.95172e-006f, +105.469f,45.6811f,3.90625f, +109.375f,44.3569f,-1.9389e-006f, +109.375f,45.3238f,3.90625f, +113.281f,44.1147f,-1.92831e-006f, +113.281f,43.6112f,3.90625f, +117.188f,43.4037f,-1.89723e-006f, +117.188f,42.1291f,3.90625f, +121.094f,41.1606f,-1.79919e-006f, +121.094f,40.4747f,3.90625f, +125.0f,40.195f,-1.75698e-006f, +125.0f,39.3351f,3.90625f, +128.906f,39.5659f,-1.72948e-006f, +128.906f,38.0742f,3.90625f, +132.813f,38.2592f,-1.67236e-006f, +132.813f,36.7758f,3.90625f, +136.719f,36.4337f,-1.59257e-006f, +136.719f,34.9213f,3.90625f, +140.625f,34.1507f,-1.49277e-006f, +140.625f,32.3643f,3.90625f, +144.531f,31.5531f,-1.37923e-006f, +144.531f,31.7157f,3.90625f, +148.438f,29.9056f,-1.30722e-006f, +148.438f,30.6005f,3.90625f, +152.344f,30.5219f,-1.33416e-006f, +152.344f,31.6034f,3.90625f, +156.25f,31.1254f,-1.36053e-006f, +156.25f,32.6503f,3.90625f, +160.156f,31.8976f,-1.39429e-006f, +160.156f,33.3131f,3.90625f, +164.063f,31.5364f,-1.3785e-006f, +164.063f,32.5745f,3.90625f, +167.969f,30.5585f,-1.33575e-006f, +167.969f,31.5017f,3.90625f, +171.875f,30.0528f,-1.31365e-006f, +171.875f,30.6842f,3.90625f, +175.781f,29.2833f,-1.28002e-006f, +175.781f,29.8734f,3.90625f, +179.688f,28.3316f,-1.23841e-006f, +179.688f,28.6537f,3.90625f, +183.594f,27.0177f,-1.18098e-006f, +183.594f,27.2073f,3.90625f, +187.5f,24.7626f,-1.08241e-006f, +187.5f,25.4367f,3.90625f, +191.406f,22.7371f,-9.9387e-007f, +191.406f,24.1609f,3.90625f, +195.313f,21.6497f,-9.46338e-007f, +195.313f,23.9724f,3.90625f, +199.219f,21.3313f,-9.32422e-007f, +199.219f,23.7702f,3.90625f, +203.125f,20.9148f,-9.14215e-007f, +203.125f,22.4031f,3.90625f, +207.031f,19.4875f,-8.51826e-007f, +207.031f,22.1587f,3.90625f, +210.938f,19.0037f,-8.30679e-007f, +210.938f,21.6154f,3.90625f, +214.844f,18.408f,-8.0464e-007f, +214.844f,21.8202f,3.90625f, +218.75f,18.7855f,-8.2114e-007f, +218.75f,21.017f,3.90625f, +222.656f,18.1497f,-7.9335e-007f, +222.656f,19.3736f,3.90625f, +226.563f,17.6889f,-7.73205e-007f, +226.563f,18.2127f,3.90625f, +230.469f,16.8429f,-7.36228e-007f, +230.469f,17.2263f,3.90625f, +234.375f,16.3712f,-7.15609e-007f, +234.375f,16.2938f,3.90625f, +238.281f,14.3259f,-6.26204e-007f, +238.281f,14.4518f,3.90625f, +242.188f,12.4394f,-5.43742e-007f, +242.188f,13.6398f,3.90625f, +246.094f,12.3876f,-5.41479e-007f, +246.094f,13.2404f,3.90625f, +250.0f,11.9236f,-5.21196e-007f, +250.0f,12.7102f,3.90625f, +3.90625f,48.8559f,-3.90625f, +7.8125f,49.3575f,-3.90625f, +11.7188f,49.963f,-3.90625f, +15.625f,50.1126f,-3.90625f, +19.5313f,51.6247f,-3.90625f, +23.4375f,52.1716f,-3.90625f, +27.3438f,52.8679f,-3.90625f, +31.25f,53.978f,-3.90625f, +35.1563f,53.8948f,-3.90625f, +39.0625f,54.8492f,-3.90625f, +42.9688f,56.1714f,-3.90625f, +46.875f,56.4915f,-3.90625f, +50.7813f,56.5729f,-3.90625f, +54.6875f,57.9767f,-3.90625f, +58.5938f,58.6125f,-3.90625f, +62.5f,58.0023f,-3.90625f, +66.4063f,57.5742f,-3.90625f, +70.3125f,55.4949f,-3.90625f, +74.2188f,53.7219f,-3.90625f, +78.125f,53.233f,-3.90625f, +82.0313f,52.5499f,-3.90625f, +85.9375f,51.1842f,-3.90625f, +89.8438f,49.6534f,-3.90625f, +93.75f,47.6829f,-3.90625f, +97.6563f,45.813f,-3.90625f, +101.563f,44.7099f,-3.90625f, +105.469f,45.0932f,-3.90625f, +109.375f,44.8326f,-3.90625f, +113.281f,44.5197f,-3.90625f, +117.188f,43.7399f,-3.90625f, +121.094f,42.3088f,-3.90625f, +125.0f,40.4224f,-3.90625f, +128.906f,39.437f,-3.90625f, +132.813f,39.825f,-3.90625f, +136.719f,38.2979f,-3.90625f, +140.625f,35.2095f,-3.90625f, +144.531f,32.0692f,-3.90625f, +148.438f,31.1765f,-3.90625f, +152.344f,32.2065f,-3.90625f, +156.25f,31.4774f,-3.90625f, +160.156f,31.7166f,-3.90625f, +164.063f,31.7667f,-3.90625f, +167.969f,31.1742f,-3.90625f, +171.875f,29.6515f,-3.90625f, +175.781f,28.7845f,-3.90625f, +179.688f,28.3154f,-3.90625f, +183.594f,26.6187f,-3.90625f, +187.5f,24.7363f,-3.90625f, +191.406f,22.9162f,-3.90625f, +195.313f,21.5211f,-3.90625f, +199.219f,19.7693f,-3.90625f, +203.125f,18.9792f,-3.90625f, +207.031f,18.8399f,-3.90625f, +210.938f,18.8797f,-3.90625f, +214.844f,18.8123f,-3.90625f, +218.75f,18.5136f,-3.90625f, +222.656f,18.5607f,-3.90625f, +226.563f,17.5053f,-3.90625f, +230.469f,17.4838f,-3.90625f, +234.375f,16.6728f,-3.90625f, +238.281f,14.8594f,-3.90625f, +242.188f,12.9613f,-3.90625f, +246.094f,12.8624f,-3.90625f, +250.0f,11.5894f,-3.90625f, +3.90625f,48.7225f,-7.8125f, +7.8125f,49.1281f,-7.8125f, +11.7188f,50.0005f,-7.8125f, +15.625f,50.5896f,-7.8125f, +19.5313f,51.5499f,-7.8125f, +23.4375f,52.9511f,-7.8125f, +27.3438f,53.117f,-7.8125f, +31.25f,54.0682f,-7.8125f, +35.1563f,55.2353f,-7.8125f, +39.0625f,57.2741f,-7.8125f, +42.9688f,57.4338f,-7.8125f, +46.875f,57.766f,-7.8125f, +50.7813f,57.2724f,-7.8125f, +54.6875f,58.0147f,-7.8125f, +58.5938f,58.764f,-7.8125f, +62.5f,58.6375f,-7.8125f, +66.4063f,57.2699f,-7.8125f, +70.3125f,55.9883f,-7.8125f, +74.2188f,54.8767f,-7.8125f, +78.125f,54.5266f,-7.8125f, +82.0313f,53.7148f,-7.8125f, +85.9375f,52.3735f,-7.8125f, +89.8438f,50.9637f,-7.8125f, +93.75f,48.4983f,-7.8125f, +97.6563f,45.9034f,-7.8125f, +101.563f,45.0863f,-7.8125f, +105.469f,44.2432f,-7.8125f, +109.375f,43.9561f,-7.8125f, +113.281f,43.3015f,-7.8125f, +117.188f,43.254f,-7.8125f, +121.094f,42.7388f,-7.8125f, +125.0f,41.1851f,-7.8125f, +128.906f,39.7522f,-7.8125f, +132.813f,39.8116f,-7.8125f, +136.719f,38.7148f,-7.8125f, +140.625f,36.0845f,-7.8125f, +144.531f,34.0308f,-7.8125f, +148.438f,33.0368f,-7.8125f, +152.344f,32.5867f,-7.8125f, +156.25f,32.8758f,-7.8125f, +160.156f,32.65f,-7.8125f, +164.063f,32.6826f,-7.8125f, +167.969f,31.5243f,-7.8125f, +171.875f,30.4061f,-7.8125f, +175.781f,29.2721f,-7.8125f, +179.688f,28.0417f,-7.8125f, +183.594f,26.2041f,-7.8125f, +187.5f,24.2168f,-7.8125f, +191.406f,22.7847f,-7.8125f, +195.313f,20.5069f,-7.8125f, +199.219f,18.6189f,-7.8125f, +203.125f,17.5296f,-7.8125f, +207.031f,18.0846f,-7.8125f, +210.938f,18.4802f,-7.8125f, +214.844f,18.5436f,-7.8125f, +218.75f,18.3296f,-7.8125f, +222.656f,17.9158f,-7.8125f, +226.563f,17.0318f,-7.8125f, +230.469f,16.2818f,-7.8125f, +234.375f,15.4949f,-7.8125f, +238.281f,13.4891f,-7.8125f, +242.188f,13.3349f,-7.8125f, +246.094f,12.2716f,-7.8125f, +250.0f,10.9901f,-7.8125f, +3.90625f,49.6298f,-11.7188f, +7.8125f,50.0683f,-11.7188f, +11.7188f,50.6295f,-11.7188f, +15.625f,51.0495f,-11.7188f, +19.5313f,52.4884f,-11.7188f, +23.4375f,53.3147f,-11.7188f, +27.3438f,54.4311f,-11.7188f, +31.25f,55.2874f,-11.7188f, +35.1563f,56.5549f,-11.7188f, +39.0625f,57.9376f,-11.7188f, +42.9688f,58.2302f,-11.7188f, +46.875f,59.1419f,-11.7188f, +50.7813f,58.8724f,-11.7188f, +54.6875f,58.5393f,-11.7188f, +58.5938f,58.6416f,-11.7188f, +62.5f,58.1973f,-11.7188f, +66.4063f,57.9168f,-11.7188f, +70.3125f,56.4347f,-11.7188f, +74.2188f,55.7911f,-11.7188f, +78.125f,55.946f,-11.7188f, +82.0313f,54.9033f,-11.7188f, +85.9375f,53.0954f,-11.7188f, +89.8438f,51.7428f,-11.7188f, +93.75f,49.2198f,-11.7188f, +97.6563f,46.1127f,-11.7188f, +101.563f,43.9953f,-11.7188f, +105.469f,43.5777f,-11.7188f, +109.375f,43.3284f,-11.7188f, +113.281f,43.5152f,-11.7188f, +117.188f,43.6687f,-11.7188f, +121.094f,42.5477f,-11.7188f, +125.0f,41.4079f,-11.7188f, +128.906f,39.4512f,-11.7188f, +132.813f,39.5183f,-11.7188f, +136.719f,37.8068f,-11.7188f, +140.625f,36.5652f,-11.7188f, +144.531f,34.8202f,-11.7188f, +148.438f,34.0166f,-11.7188f, +152.344f,33.5311f,-11.7188f, +156.25f,34.1672f,-11.7188f, +160.156f,33.8602f,-11.7188f, +164.063f,33.8717f,-11.7188f, +167.969f,33.1703f,-11.7188f, +171.875f,31.0241f,-11.7188f, +175.781f,30.2798f,-11.7188f, +179.688f,28.3241f,-11.7188f, +183.594f,26.4432f,-11.7188f, +187.5f,24.9758f,-11.7188f, +191.406f,22.2834f,-11.7188f, +195.313f,19.3875f,-11.7188f, +199.219f,18.4079f,-11.7188f, +203.125f,16.6498f,-11.7188f, +207.031f,16.1235f,-11.7188f, +210.938f,16.9462f,-11.7188f, +214.844f,17.2638f,-11.7188f, +218.75f,17.0386f,-11.7188f, +222.656f,16.7666f,-11.7188f, +226.563f,15.3591f,-11.7188f, +230.469f,14.4048f,-11.7188f, +234.375f,13.3079f,-11.7188f, +238.281f,13.0895f,-11.7188f, +242.188f,12.8462f,-11.7188f, +246.094f,12.6287f,-11.7188f, +250.0f,11.4682f,-11.7188f, +3.90625f,50.6915f,-15.625f, +7.8125f,51.2382f,-15.625f, +11.7188f,52.3659f,-15.625f, +15.625f,52.3873f,-15.625f, +19.5313f,53.1083f,-15.625f, +23.4375f,54.652f,-15.625f, +27.3438f,56.0359f,-15.625f, +31.25f,56.4398f,-15.625f, +35.1563f,57.3156f,-15.625f, +39.0625f,58.2355f,-15.625f, +42.9688f,59.4547f,-15.625f, +46.875f,59.9176f,-15.625f, +50.7813f,60.0789f,-15.625f, +54.6875f,59.004f,-15.625f, +58.5938f,59.3361f,-15.625f, +62.5f,59.2681f,-15.625f, +66.4063f,58.5571f,-15.625f, +70.3125f,57.1801f,-15.625f, +74.2188f,56.2048f,-15.625f, +78.125f,56.9427f,-15.625f, +82.0313f,55.401f,-15.625f, +85.9375f,53.0457f,-15.625f, +89.8438f,51.6378f,-15.625f, +93.75f,49.1297f,-15.625f, +97.6563f,46.6267f,-15.625f, +101.563f,44.7255f,-15.625f, +105.469f,43.3819f,-15.625f, +109.375f,42.8703f,-15.625f, +113.281f,42.7636f,-15.625f, +117.188f,42.1897f,-15.625f, +121.094f,41.9269f,-15.625f, +125.0f,41.5365f,-15.625f, +128.906f,39.5408f,-15.625f, +132.813f,38.9178f,-15.625f, +136.719f,38.1447f,-15.625f, +140.625f,36.5145f,-15.625f, +144.531f,34.8696f,-15.625f, +148.438f,34.8203f,-15.625f, +152.344f,34.409f,-15.625f, +156.25f,35.1394f,-15.625f, +160.156f,35.619f,-15.625f, +164.063f,34.7784f,-15.625f, +167.969f,33.6548f,-15.625f, +171.875f,32.1822f,-15.625f, +175.781f,31.1666f,-15.625f, +179.688f,28.9574f,-15.625f, +183.594f,27.3989f,-15.625f, +187.5f,24.7201f,-15.625f, +191.406f,21.7859f,-15.625f, +195.313f,19.2508f,-15.625f, +199.219f,18.0209f,-15.625f, +203.125f,16.8441f,-15.625f, +207.031f,15.8846f,-15.625f, +210.938f,15.6902f,-15.625f, +214.844f,15.3143f,-15.625f, +218.75f,15.3862f,-15.625f, +222.656f,14.2743f,-15.625f, +226.563f,13.5791f,-15.625f, +230.469f,13.4953f,-15.625f, +234.375f,13.3484f,-15.625f, +238.281f,13.2722f,-15.625f, +242.188f,13.4455f,-15.625f, +246.094f,13.0725f,-15.625f, +250.0f,11.5558f,-15.625f, +3.90625f,52.1028f,-19.5313f, +7.8125f,52.877f,-19.5313f, +11.7188f,54.5397f,-19.5313f, +15.625f,54.8941f,-19.5313f, +19.5313f,54.9009f,-19.5313f, +23.4375f,56.1681f,-19.5313f, +27.3438f,56.5579f,-19.5313f, +31.25f,57.7962f,-19.5313f, +35.1563f,58.728f,-19.5313f, +39.0625f,59.4794f,-19.5313f, +42.9688f,60.2636f,-19.5313f, +46.875f,61.2139f,-19.5313f, +50.7813f,60.4636f,-19.5313f, +54.6875f,59.681f,-19.5313f, +58.5938f,60.2068f,-19.5313f, +62.5f,59.1055f,-19.5313f, +66.4063f,57.6126f,-19.5313f, +70.3125f,56.6416f,-19.5313f, +74.2188f,56.4864f,-19.5313f, +78.125f,56.1784f,-19.5313f, +82.0313f,54.8451f,-19.5313f, +85.9375f,53.4094f,-19.5313f, +89.8438f,51.7161f,-19.5313f, +93.75f,48.9933f,-19.5313f, +97.6563f,47.5116f,-19.5313f, +101.563f,45.7701f,-19.5313f, +105.469f,44.0377f,-19.5313f, +109.375f,43.0918f,-19.5313f, +113.281f,42.3992f,-19.5313f, +117.188f,42.0928f,-19.5313f, +121.094f,42.0543f,-19.5313f, +125.0f,41.793f,-19.5313f, +128.906f,39.3232f,-19.5313f, +132.813f,39.1149f,-19.5313f, +136.719f,38.2381f,-19.5313f, +140.625f,36.1019f,-19.5313f, +144.531f,36.4503f,-19.5313f, +148.438f,35.6809f,-19.5313f, +152.344f,35.8022f,-19.5313f, +156.25f,36.4955f,-19.5313f, +160.156f,36.3187f,-19.5313f, +164.063f,35.0268f,-19.5313f, +167.969f,34.0134f,-19.5313f, +171.875f,33.6455f,-19.5313f, +175.781f,31.5932f,-19.5313f, +179.688f,30.0326f,-19.5313f, +183.594f,28.3453f,-19.5313f, +187.5f,25.3719f,-19.5313f, +191.406f,22.0833f,-19.5313f, +195.313f,18.7475f,-19.5313f, +199.219f,17.5517f,-19.5313f, +203.125f,16.1528f,-19.5313f, +207.031f,15.6144f,-19.5313f, +210.938f,14.9281f,-19.5313f, +214.844f,14.5711f,-19.5313f, +218.75f,13.8446f,-19.5313f, +222.656f,13.6892f,-19.5313f, +226.563f,13.1595f,-19.5313f, +230.469f,13.2872f,-19.5313f, +234.375f,13.6153f,-19.5313f, +238.281f,12.8725f,-19.5313f, +242.188f,12.7128f,-19.5313f, +246.094f,13.0658f,-19.5313f, +250.0f,11.5414f,-19.5313f, +3.90625f,54.332f,-23.4375f, +7.8125f,55.636f,-23.4375f, +11.7188f,56.3899f,-23.4375f, +15.625f,56.3763f,-23.4375f, +19.5313f,56.9523f,-23.4375f, +23.4375f,57.5593f,-23.4375f, +27.3438f,57.8056f,-23.4375f, +31.25f,58.5489f,-23.4375f, +35.1563f,59.2321f,-23.4375f, +39.0625f,60.5971f,-23.4375f, +42.9688f,60.1728f,-23.4375f, +46.875f,60.9341f,-23.4375f, +50.7813f,59.5118f,-23.4375f, +54.6875f,59.7552f,-23.4375f, +58.5938f,59.9126f,-23.4375f, +62.5f,58.501f,-23.4375f, +66.4063f,57.8539f,-23.4375f, +70.3125f,56.8693f,-23.4375f, +74.2188f,56.0687f,-23.4375f, +78.125f,55.4392f,-23.4375f, +82.0313f,53.7167f,-23.4375f, +85.9375f,52.1078f,-23.4375f, +89.8438f,50.8869f,-23.4375f, +93.75f,49.9812f,-23.4375f, +97.6563f,47.9233f,-23.4375f, +101.563f,46.1166f,-23.4375f, +105.469f,44.4826f,-23.4375f, +109.375f,42.8924f,-23.4375f, +113.281f,41.9991f,-23.4375f, +117.188f,41.1759f,-23.4375f, +121.094f,41.1189f,-23.4375f, +125.0f,39.9128f,-23.4375f, +128.906f,39.8641f,-23.4375f, +132.813f,39.8777f,-23.4375f, +136.719f,38.3567f,-23.4375f, +140.625f,37.4926f,-23.4375f, +144.531f,37.0275f,-23.4375f, +148.438f,36.7211f,-23.4375f, +152.344f,36.9355f,-23.4375f, +156.25f,37.7455f,-23.4375f, +160.156f,37.3585f,-23.4375f, +164.063f,36.1837f,-23.4375f, +167.969f,34.768f,-23.4375f, +171.875f,33.2179f,-23.4375f, +175.781f,31.6883f,-23.4375f, +179.688f,30.1136f,-23.4375f, +183.594f,28.1155f,-23.4375f, +187.5f,25.4881f,-23.4375f, +191.406f,22.8498f,-23.4375f, +195.313f,19.4425f,-23.4375f, +199.219f,17.1253f,-23.4375f, +203.125f,14.8354f,-23.4375f, +207.031f,14.1771f,-23.4375f, +210.938f,13.9227f,-23.4375f, +214.844f,13.3404f,-23.4375f, +218.75f,13.0525f,-23.4375f, +222.656f,13.0744f,-23.4375f, +226.563f,13.0432f,-23.4375f, +230.469f,13.3341f,-23.4375f, +234.375f,13.6022f,-23.4375f, +238.281f,13.3878f,-23.4375f, +242.188f,12.5812f,-23.4375f, +246.094f,11.8699f,-23.4375f, +250.0f,11.3395f,-23.4375f, +3.90625f,57.5273f,-27.3438f, +7.8125f,57.8217f,-27.3438f, +11.7188f,57.5626f,-27.3438f, +15.625f,57.7794f,-27.3438f, +19.5313f,58.7949f,-27.3438f, +23.4375f,59.3547f,-27.3438f, +27.3438f,59.2359f,-27.3438f, +31.25f,58.8772f,-27.3438f, +35.1563f,58.7149f,-27.3438f, +39.0625f,59.7221f,-27.3438f, +42.9688f,60.0457f,-27.3438f, +46.875f,59.6559f,-27.3438f, +50.7813f,59.9346f,-27.3438f, +54.6875f,60.4095f,-27.3438f, +58.5938f,59.3107f,-27.3438f, +62.5f,57.9086f,-27.3438f, +66.4063f,57.3034f,-27.3438f, +70.3125f,55.5758f,-27.3438f, +74.2188f,54.7167f,-27.3438f, +78.125f,54.405f,-27.3438f, +82.0313f,53.0644f,-27.3438f, +85.9375f,50.9689f,-27.3438f, +89.8438f,49.5959f,-27.3438f, +93.75f,49.2817f,-27.3438f, +97.6563f,48.9188f,-27.3438f, +101.563f,47.0066f,-27.3438f, +105.469f,44.4266f,-27.3438f, +109.375f,42.4539f,-27.3438f, +113.281f,41.5486f,-27.3438f, +117.188f,41.4419f,-27.3438f, +121.094f,41.2039f,-27.3438f, +125.0f,40.188f,-27.3438f, +128.906f,40.4744f,-27.3438f, +132.813f,40.1187f,-27.3438f, +136.719f,38.8055f,-27.3438f, +140.625f,38.024f,-27.3438f, +144.531f,37.5255f,-27.3438f, +148.438f,36.8676f,-27.3438f, +152.344f,37.8967f,-27.3438f, +156.25f,38.4708f,-27.3438f, +160.156f,37.8284f,-27.3438f, +164.063f,36.6094f,-27.3438f, +167.969f,34.4523f,-27.3438f, +171.875f,32.2936f,-27.3438f, +175.781f,31.7467f,-27.3438f, +179.688f,29.9455f,-27.3438f, +183.594f,27.7546f,-27.3438f, +187.5f,25.1902f,-27.3438f, +191.406f,22.537f,-27.3438f, +195.313f,19.5657f,-27.3438f, +199.219f,17.4406f,-27.3438f, +203.125f,15.5459f,-27.3438f, +207.031f,14.92f,-27.3438f, +210.938f,13.472f,-27.3438f, +214.844f,12.9933f,-27.3438f, +218.75f,13.2849f,-27.3438f, +222.656f,12.3375f,-27.3438f, +226.563f,12.0553f,-27.3438f, +230.469f,12.4756f,-27.3438f, +234.375f,12.0857f,-27.3438f, +238.281f,12.1988f,-27.3438f, +242.188f,11.9091f,-27.3438f, +246.094f,10.7301f,-27.3438f, +250.0f,10.1068f,-27.3438f, +3.90625f,59.4204f,-31.25f, +7.8125f,59.5424f,-31.25f, +11.7188f,58.7785f,-31.25f, +15.625f,59.7851f,-31.25f, +19.5313f,60.4897f,-31.25f, +23.4375f,60.6095f,-31.25f, +27.3438f,60.3384f,-31.25f, +31.25f,59.5445f,-31.25f, +35.1563f,58.6838f,-31.25f, +39.0625f,58.847f,-31.25f, +42.9688f,59.3885f,-31.25f, +46.875f,59.447f,-31.25f, +50.7813f,59.5998f,-31.25f, +54.6875f,58.9947f,-31.25f, +58.5938f,58.7482f,-31.25f, +62.5f,56.5947f,-31.25f, +66.4063f,56.2941f,-31.25f, +70.3125f,54.6423f,-31.25f, +74.2188f,53.7392f,-31.25f, +78.125f,53.2955f,-31.25f, +82.0313f,52.8233f,-31.25f, +85.9375f,52.1194f,-31.25f, +89.8438f,51.3335f,-31.25f, +93.75f,49.9201f,-31.25f, +97.6563f,49.1642f,-31.25f, +101.563f,47.4466f,-31.25f, +105.469f,44.6086f,-31.25f, +109.375f,42.885f,-31.25f, +113.281f,42.947f,-31.25f, +117.188f,42.2436f,-31.25f, +121.094f,41.6479f,-31.25f, +125.0f,41.6151f,-31.25f, +128.906f,41.2079f,-31.25f, +132.813f,40.7975f,-31.25f, +136.719f,39.8341f,-31.25f, +140.625f,38.7649f,-31.25f, +144.531f,37.7387f,-31.25f, +148.438f,37.2112f,-31.25f, +152.344f,38.3278f,-31.25f, +156.25f,38.7659f,-31.25f, +160.156f,37.5608f,-31.25f, +164.063f,35.9966f,-31.25f, +167.969f,33.737f,-31.25f, +171.875f,32.0109f,-31.25f, +175.781f,31.1169f,-31.25f, +179.688f,30.0211f,-31.25f, +183.594f,27.5633f,-31.25f, +187.5f,25.0292f,-31.25f, +191.406f,22.8265f,-31.25f, +195.313f,19.8972f,-31.25f, +199.219f,17.6714f,-31.25f, +203.125f,16.2679f,-31.25f, +207.031f,15.0546f,-31.25f, +210.938f,14.037f,-31.25f, +214.844f,12.5501f,-31.25f, +218.75f,12.1528f,-31.25f, +222.656f,12.0576f,-31.25f, +226.563f,11.2847f,-31.25f, +230.469f,11.5946f,-31.25f, +234.375f,10.9216f,-31.25f, +238.281f,10.9182f,-31.25f, +242.188f,11.2826f,-31.25f, +246.094f,11.5781f,-31.25f, +250.0f,11.536f,-31.25f, +3.90625f,60.2212f,-35.1563f, +7.8125f,59.3731f,-35.1563f, +11.7188f,58.5327f,-35.1563f, +15.625f,59.5785f,-35.1563f, +19.5313f,60.1491f,-35.1563f, +23.4375f,60.5297f,-35.1563f, +27.3438f,60.5336f,-35.1563f, +31.25f,60.162f,-35.1563f, +35.1563f,58.5927f,-35.1563f, +39.0625f,57.9369f,-35.1563f, +42.9688f,58.4405f,-35.1563f, +46.875f,58.7374f,-35.1563f, +50.7813f,57.6198f,-35.1563f, +54.6875f,57.3277f,-35.1563f, +58.5938f,56.6423f,-35.1563f, +62.5f,56.2444f,-35.1563f, +66.4063f,56.132f,-35.1563f, +70.3125f,54.6673f,-35.1563f, +74.2188f,53.2924f,-35.1563f, +78.125f,53.2569f,-35.1563f, +82.0313f,52.0828f,-35.1563f, +85.9375f,51.9661f,-35.1563f, +89.8438f,50.9045f,-35.1563f, +93.75f,49.4997f,-35.1563f, +97.6563f,48.0748f,-35.1563f, +101.563f,46.3182f,-35.1563f, +105.469f,44.0878f,-35.1563f, +109.375f,42.863f,-35.1563f, +113.281f,42.8044f,-35.1563f, +117.188f,42.9648f,-35.1563f, +121.094f,42.3221f,-35.1563f, +125.0f,41.6576f,-35.1563f, +128.906f,41.1606f,-35.1563f, +132.813f,39.59f,-35.1563f, +136.719f,38.5602f,-35.1563f, +140.625f,37.9389f,-35.1563f, +144.531f,37.2602f,-35.1563f, +148.438f,37.3784f,-35.1563f, +152.344f,37.8906f,-35.1563f, +156.25f,37.8221f,-35.1563f, +160.156f,36.3088f,-35.1563f, +164.063f,35.1881f,-35.1563f, +167.969f,33.2601f,-35.1563f, +171.875f,31.8157f,-35.1563f, +175.781f,31.3416f,-35.1563f, +179.688f,30.0265f,-35.1563f, +183.594f,27.3943f,-35.1563f, +187.5f,24.641f,-35.1563f, +191.406f,22.2525f,-35.1563f, +195.313f,20.2011f,-35.1563f, +199.219f,18.7104f,-35.1563f, +203.125f,17.3459f,-35.1563f, +207.031f,15.2838f,-35.1563f, +210.938f,13.6157f,-35.1563f, +214.844f,13.3893f,-35.1563f, +218.75f,12.9319f,-35.1563f, +222.656f,11.5191f,-35.1563f, +226.563f,10.4878f,-35.1563f, +230.469f,9.83031f,-35.1563f, +234.375f,9.91945f,-35.1563f, +238.281f,10.9647f,-35.1563f, +242.188f,11.5866f,-35.1563f, +246.094f,11.8313f,-35.1563f, +250.0f,11.9419f,-35.1563f, +3.90625f,59.9094f,-39.0625f, +7.8125f,58.6207f,-39.0625f, +11.7188f,57.735f,-39.0625f, +15.625f,58.9909f,-39.0625f, +19.5313f,60.0678f,-39.0625f, +23.4375f,60.5419f,-39.0625f, +27.3438f,60.4672f,-39.0625f, +31.25f,59.5824f,-39.0625f, +35.1563f,58.4068f,-39.0625f, +39.0625f,57.5098f,-39.0625f, +42.9688f,57.6631f,-39.0625f, +46.875f,57.8211f,-39.0625f, +50.7813f,57.1897f,-39.0625f, +54.6875f,55.6789f,-39.0625f, +58.5938f,55.3212f,-39.0625f, +62.5f,55.2941f,-39.0625f, +66.4063f,55.8101f,-39.0625f, +70.3125f,54.309f,-39.0625f, +74.2188f,53.6313f,-39.0625f, +78.125f,52.7246f,-39.0625f, +82.0313f,51.5473f,-39.0625f, +85.9375f,51.5315f,-39.0625f, +89.8438f,50.6121f,-39.0625f, +93.75f,50.3734f,-39.0625f, +97.6563f,48.8877f,-39.0625f, +101.563f,47.0081f,-39.0625f, +105.469f,44.4827f,-39.0625f, +109.375f,43.5851f,-39.0625f, +113.281f,43.2668f,-39.0625f, +117.188f,43.4016f,-39.0625f, +121.094f,41.962f,-39.0625f, +125.0f,41.4641f,-39.0625f, +128.906f,40.2221f,-39.0625f, +132.813f,38.9234f,-39.0625f, +136.719f,37.7062f,-39.0625f, +140.625f,37.6455f,-39.0625f, +144.531f,37.8691f,-39.0625f, +148.438f,37.4139f,-39.0625f, +152.344f,37.204f,-39.0625f, +156.25f,36.7774f,-39.0625f, +160.156f,35.8962f,-39.0625f, +164.063f,34.5247f,-39.0625f, +167.969f,32.7322f,-39.0625f, +171.875f,32.1044f,-39.0625f, +175.781f,31.321f,-39.0625f, +179.688f,29.7775f,-39.0625f, +183.594f,26.7381f,-39.0625f, +187.5f,24.0216f,-39.0625f, +191.406f,22.277f,-39.0625f, +195.313f,21.2497f,-39.0625f, +199.219f,19.9529f,-39.0625f, +203.125f,18.3349f,-39.0625f, +207.031f,16.7961f,-39.0625f, +210.938f,15.071f,-39.0625f, +214.844f,13.5616f,-39.0625f, +218.75f,13.1679f,-39.0625f, +222.656f,11.2729f,-39.0625f, +226.563f,10.5025f,-39.0625f, +230.469f,9.72086f,-39.0625f, +234.375f,9.90489f,-39.0625f, +238.281f,10.7231f,-39.0625f, +242.188f,11.2573f,-39.0625f, +246.094f,12.0761f,-39.0625f, +250.0f,11.902f,-39.0625f, +3.90625f,59.5207f,-42.9688f, +7.8125f,58.2483f,-42.9688f, +11.7188f,58.069f,-42.9688f, +15.625f,59.4248f,-42.9688f, +19.5313f,60.5261f,-42.9688f, +23.4375f,60.668f,-42.9688f, +27.3438f,60.0252f,-42.9688f, +31.25f,58.0523f,-42.9688f, +35.1563f,56.7426f,-42.9688f, +39.0625f,57.2045f,-42.9688f, +42.9688f,57.166f,-42.9688f, +46.875f,56.9465f,-42.9688f, +50.7813f,55.7381f,-42.9688f, +54.6875f,55.2924f,-42.9688f, +58.5938f,54.6074f,-42.9688f, +62.5f,54.1882f,-42.9688f, +66.4063f,53.672f,-42.9688f, +70.3125f,53.3122f,-42.9688f, +74.2188f,53.0852f,-42.9688f, +78.125f,52.6173f,-42.9688f, +82.0313f,51.616f,-42.9688f, +85.9375f,50.148f,-42.9688f, +89.8438f,49.4823f,-42.9688f, +93.75f,50.0221f,-42.9688f, +97.6563f,48.9931f,-42.9688f, +101.563f,47.1045f,-42.9688f, +105.469f,44.442f,-42.9688f, +109.375f,44.5071f,-42.9688f, +113.281f,44.1005f,-42.9688f, +117.188f,42.8414f,-42.9688f, +121.094f,42.5419f,-42.9688f, +125.0f,41.5451f,-42.9688f, +128.906f,39.4272f,-42.9688f, +132.813f,39.8815f,-42.9688f, +136.719f,39.1366f,-42.9688f, +140.625f,38.7457f,-42.9688f, +144.531f,38.4257f,-42.9688f, +148.438f,37.9899f,-42.9688f, +152.344f,37.1716f,-42.9688f, +156.25f,36.0431f,-42.9688f, +160.156f,35.0784f,-42.9688f, +164.063f,33.3564f,-42.9688f, +167.969f,32.1522f,-42.9688f, +171.875f,30.9698f,-42.9688f, +175.781f,29.7186f,-42.9688f, +179.688f,28.0509f,-42.9688f, +183.594f,25.8254f,-42.9688f, +187.5f,24.8502f,-42.9688f, +191.406f,22.9031f,-42.9688f, +195.313f,20.8135f,-42.9688f, +199.219f,19.6651f,-42.9688f, +203.125f,18.4753f,-42.9688f, +207.031f,17.2259f,-42.9688f, +210.938f,15.6171f,-42.9688f, +214.844f,13.2953f,-42.9688f, +218.75f,13.1679f,-42.9688f, +222.656f,10.7772f,-42.9688f, +226.563f,9.62294f,-42.9688f, +230.469f,9.27609f,-42.9688f, +234.375f,9.47241f,-42.9688f, +238.281f,10.2411f,-42.9688f, +242.188f,11.3745f,-42.9688f, +246.094f,10.981f,-42.9688f, +250.0f,9.93179f,-42.9688f, +3.90625f,58.9086f,-46.875f, +7.8125f,58.895f,-46.875f, +11.7188f,59.1807f,-46.875f, +15.625f,60.2442f,-46.875f, +19.5313f,60.6114f,-46.875f, +23.4375f,59.9439f,-46.875f, +27.3438f,58.704f,-46.875f, +31.25f,58.3729f,-46.875f, +35.1563f,57.0256f,-46.875f, +39.0625f,57.069f,-46.875f, +42.9688f,57.0536f,-46.875f, +46.875f,55.7912f,-46.875f, +50.7813f,54.8674f,-46.875f, +54.6875f,53.8265f,-46.875f, +58.5938f,53.563f,-46.875f, +62.5f,52.5979f,-46.875f, +66.4063f,52.3986f,-46.875f, +70.3125f,52.1891f,-46.875f, +74.2188f,52.2468f,-46.875f, +78.125f,52.3398f,-46.875f, +82.0313f,50.9875f,-46.875f, +85.9375f,49.4072f,-46.875f, +89.8438f,48.3295f,-46.875f, +93.75f,48.9009f,-46.875f, +97.6563f,47.6633f,-46.875f, +101.563f,44.4101f,-46.875f, +105.469f,44.0249f,-46.875f, +109.375f,43.7395f,-46.875f, +113.281f,44.0967f,-46.875f, +117.188f,43.3593f,-46.875f, +121.094f,42.11f,-46.875f, +125.0f,40.8903f,-46.875f, +128.906f,40.3861f,-46.875f, +132.813f,40.075f,-46.875f, +136.719f,39.6347f,-46.875f, +140.625f,38.7369f,-46.875f, +144.531f,37.9042f,-46.875f, +148.438f,36.8546f,-46.875f, +152.344f,36.4012f,-46.875f, +156.25f,35.3977f,-46.875f, +160.156f,34.0947f,-46.875f, +164.063f,32.2545f,-46.875f, +167.969f,30.0086f,-46.875f, +171.875f,29.202f,-46.875f, +175.781f,28.0362f,-46.875f, +179.688f,26.7114f,-46.875f, +183.594f,25.9577f,-46.875f, +187.5f,25.3242f,-46.875f, +191.406f,23.8586f,-46.875f, +195.313f,20.6056f,-46.875f, +199.219f,19.3835f,-46.875f, +203.125f,17.4503f,-46.875f, +207.031f,16.5736f,-46.875f, +210.938f,14.945f,-46.875f, +214.844f,12.5914f,-46.875f, +218.75f,11.835f,-46.875f, +222.656f,10.1636f,-46.875f, +226.563f,9.71281f,-46.875f, +230.469f,9.27988f,-46.875f, +234.375f,8.50394f,-46.875f, +238.281f,9.20978f,-46.875f, +242.188f,9.21707f,-46.875f, +246.094f,9.40089f,-46.875f, +250.0f,8.55411f,-46.875f, +3.90625f,59.8509f,-50.7813f, +7.8125f,59.6141f,-50.7813f, +11.7188f,59.7453f,-50.7813f, +15.625f,60.4259f,-50.7813f, +19.5313f,59.4314f,-50.7813f, +23.4375f,59.033f,-50.7813f, +27.3438f,57.561f,-50.7813f, +31.25f,57.9511f,-50.7813f, +35.1563f,57.0088f,-50.7813f, +39.0625f,56.2469f,-50.7813f, +42.9688f,55.8604f,-50.7813f, +46.875f,55.2326f,-50.7813f, +50.7813f,54.8965f,-50.7813f, +54.6875f,53.1713f,-50.7813f, +58.5938f,52.6122f,-50.7813f, +62.5f,50.9097f,-50.7813f, +66.4063f,50.8144f,-50.7813f, +70.3125f,50.2702f,-50.7813f, +74.2188f,51.4962f,-50.7813f, +78.125f,50.7879f,-50.7813f, +82.0313f,49.5502f,-50.7813f, +85.9375f,48.3386f,-50.7813f, +89.8438f,48.0143f,-50.7813f, +93.75f,46.7527f,-50.7813f, +97.6563f,45.5374f,-50.7813f, +101.563f,44.3542f,-50.7813f, +105.469f,44.8366f,-50.7813f, +109.375f,45.0192f,-50.7813f, +113.281f,44.4763f,-50.7813f, +117.188f,43.4751f,-50.7813f, +121.094f,42.029f,-50.7813f, +125.0f,40.9708f,-50.7813f, +128.906f,40.3658f,-50.7813f, +132.813f,40.0768f,-50.7813f, +136.719f,40.0333f,-50.7813f, +140.625f,38.2667f,-50.7813f, +144.531f,36.5326f,-50.7813f, +148.438f,35.8183f,-50.7813f, +152.344f,35.3934f,-50.7813f, +156.25f,34.9787f,-50.7813f, +160.156f,33.4969f,-50.7813f, +164.063f,31.7517f,-50.7813f, +167.969f,29.499f,-50.7813f, +171.875f,27.1729f,-50.7813f, +175.781f,25.4931f,-50.7813f, +179.688f,25.2745f,-50.7813f, +183.594f,25.2315f,-50.7813f, +187.5f,24.531f,-50.7813f, +191.406f,23.4387f,-50.7813f, +195.313f,21.3665f,-50.7813f, +199.219f,19.2834f,-50.7813f, +203.125f,17.7694f,-50.7813f, +207.031f,16.0247f,-50.7813f, +210.938f,13.9451f,-50.7813f, +214.844f,12.3369f,-50.7813f, +218.75f,10.9033f,-50.7813f, +222.656f,10.0734f,-50.7813f, +226.563f,9.08212f,-50.7813f, +230.469f,9.04527f,-50.7813f, +234.375f,8.83458f,-50.7813f, +238.281f,9.03578f,-50.7813f, +242.188f,9.06782f,-50.7813f, +246.094f,9.03068f,-50.7813f, +250.0f,9.66685f,-50.7813f, +3.90625f,60.3928f,-54.6875f, +7.8125f,60.9235f,-54.6875f, +11.7188f,60.8946f,-54.6875f, +15.625f,60.5131f,-54.6875f, +19.5313f,58.455f,-54.6875f, +23.4375f,57.9712f,-54.6875f, +27.3438f,57.0716f,-54.6875f, +31.25f,56.9372f,-54.6875f, +35.1563f,57.5607f,-54.6875f, +39.0625f,56.6778f,-54.6875f, +42.9688f,56.24f,-54.6875f, +46.875f,55.0661f,-54.6875f, +50.7813f,54.3546f,-54.6875f, +54.6875f,52.1641f,-54.6875f, +58.5938f,51.2643f,-54.6875f, +62.5f,49.4484f,-54.6875f, +66.4063f,48.4401f,-54.6875f, +70.3125f,48.0181f,-54.6875f, +74.2188f,48.8036f,-54.6875f, +78.125f,48.2106f,-54.6875f, +82.0313f,47.8181f,-54.6875f, +85.9375f,47.3982f,-54.6875f, +89.8438f,46.4776f,-54.6875f, +93.75f,45.3848f,-54.6875f, +97.6563f,44.5336f,-54.6875f, +101.563f,45.1445f,-54.6875f, +105.469f,45.5775f,-54.6875f, +109.375f,45.4274f,-54.6875f, +113.281f,44.4184f,-54.6875f, +117.188f,43.6208f,-54.6875f, +121.094f,43.0133f,-54.6875f, +125.0f,41.2193f,-54.6875f, +128.906f,40.0465f,-54.6875f, +132.813f,40.3451f,-54.6875f, +136.719f,39.4272f,-54.6875f, +140.625f,37.2935f,-54.6875f, +144.531f,35.9597f,-54.6875f, +148.438f,34.766f,-54.6875f, +152.344f,33.3503f,-54.6875f, +156.25f,33.6732f,-54.6875f, +160.156f,32.5764f,-54.6875f, +164.063f,30.6942f,-54.6875f, +167.969f,28.8727f,-54.6875f, +171.875f,26.8203f,-54.6875f, +175.781f,24.7162f,-54.6875f, +179.688f,23.5533f,-54.6875f, +183.594f,23.5154f,-54.6875f, +187.5f,23.3554f,-54.6875f, +191.406f,22.7735f,-54.6875f, +195.313f,22.2741f,-54.6875f, +199.219f,20.9717f,-54.6875f, +203.125f,18.5469f,-54.6875f, +207.031f,16.0531f,-54.6875f, +210.938f,13.6058f,-54.6875f, +214.844f,11.0674f,-54.6875f, +218.75f,9.89862f,-54.6875f, +222.656f,9.6172f,-54.6875f, +226.563f,8.63026f,-54.6875f, +230.469f,8.95799f,-54.6875f, +234.375f,8.84522f,-54.6875f, +238.281f,8.9176f,-54.6875f, +242.188f,9.19248f,-54.6875f, +246.094f,9.16691f,-54.6875f, +250.0f,9.42022f,-54.6875f, +3.90625f,61.5747f,-58.5938f, +7.8125f,61.244f,-58.5938f, +11.7188f,60.3982f,-58.5938f, +15.625f,59.4267f,-58.5938f, +19.5313f,58.5294f,-58.5938f, +23.4375f,56.6412f,-58.5938f, +27.3438f,56.0648f,-58.5938f, +31.25f,56.4883f,-58.5938f, +35.1563f,56.5562f,-58.5938f, +39.0625f,56.745f,-58.5938f, +42.9688f,55.6505f,-58.5938f, +46.875f,54.6622f,-58.5938f, +50.7813f,53.7206f,-58.5938f, +54.6875f,51.9309f,-58.5938f, +58.5938f,50.4214f,-58.5938f, +62.5f,48.4353f,-58.5938f, +66.4063f,47.1373f,-58.5938f, +70.3125f,46.0037f,-58.5938f, +74.2188f,45.9795f,-58.5938f, +78.125f,45.2396f,-58.5938f, +82.0313f,45.264f,-58.5938f, +85.9375f,45.2603f,-58.5938f, +89.8438f,45.3076f,-58.5938f, +93.75f,44.8744f,-58.5938f, +97.6563f,44.3646f,-58.5938f, +101.563f,45.1043f,-58.5938f, +105.469f,45.6336f,-58.5938f, +109.375f,44.6129f,-58.5938f, +113.281f,44.3333f,-58.5938f, +117.188f,44.3267f,-58.5938f, +121.094f,42.9064f,-58.5938f, +125.0f,40.63f,-58.5938f, +128.906f,41.2828f,-58.5938f, +132.813f,40.2801f,-58.5938f, +136.719f,39.4089f,-58.5938f, +140.625f,37.0919f,-58.5938f, +144.531f,34.889f,-58.5938f, +148.438f,32.5161f,-58.5938f, +152.344f,31.9597f,-58.5938f, +156.25f,31.5986f,-58.5938f, +160.156f,31.1966f,-58.5938f, +164.063f,30.4149f,-58.5938f, +167.969f,29.0304f,-58.5938f, +171.875f,27.2929f,-58.5938f, +175.781f,26.0835f,-58.5938f, +179.688f,24.7373f,-58.5938f, +183.594f,23.6409f,-58.5938f, +187.5f,23.3059f,-58.5938f, +191.406f,22.8781f,-58.5938f, +195.313f,22.319f,-58.5938f, +199.219f,21.2986f,-58.5938f, +203.125f,19.8613f,-58.5938f, +207.031f,16.8941f,-58.5938f, +210.938f,13.7519f,-58.5938f, +214.844f,11.895f,-58.5938f, +218.75f,9.64673f,-58.5938f, +222.656f,9.27102f,-58.5938f, +226.563f,9.40316f,-58.5938f, +230.469f,8.90628f,-58.5938f, +234.375f,8.63691f,-58.5938f, +238.281f,9.10736f,-58.5938f, +242.188f,9.6506f,-58.5938f, +246.094f,9.20945f,-58.5938f, +250.0f,10.1973f,-58.5938f, +3.90625f,62.1111f,-62.5f, +7.8125f,60.6401f,-62.5f, +11.7188f,59.5734f,-62.5f, +15.625f,59.219f,-62.5f, +19.5313f,57.489f,-62.5f, +23.4375f,55.7813f,-62.5f, +27.3438f,55.9775f,-62.5f, +31.25f,55.9857f,-62.5f, +35.1563f,55.7053f,-62.5f, +39.0625f,55.9712f,-62.5f, +42.9688f,54.6904f,-62.5f, +46.875f,53.8065f,-62.5f, +50.7813f,52.4182f,-62.5f, +54.6875f,50.8531f,-62.5f, +58.5938f,49.1994f,-62.5f, +62.5f,47.7017f,-62.5f, +66.4063f,45.469f,-62.5f, +70.3125f,44.3384f,-62.5f, +74.2188f,43.2272f,-62.5f, +78.125f,43.8591f,-62.5f, +82.0313f,44.3452f,-62.5f, +85.9375f,44.3048f,-62.5f, +89.8438f,44.2242f,-62.5f, +93.75f,44.0587f,-62.5f, +97.6563f,43.7317f,-62.5f, +101.563f,44.5392f,-62.5f, +105.469f,44.5257f,-62.5f, +109.375f,43.5595f,-62.5f, +113.281f,44.5114f,-62.5f, +117.188f,43.2895f,-62.5f, +121.094f,41.6188f,-62.5f, +125.0f,39.9989f,-62.5f, +128.906f,40.9613f,-62.5f, +132.813f,39.8454f,-62.5f, +136.719f,38.9499f,-62.5f, +140.625f,36.7405f,-62.5f, +144.531f,34.8983f,-62.5f, +148.438f,33.5172f,-62.5f, +152.344f,31.5497f,-62.5f, +156.25f,31.3001f,-62.5f, +160.156f,30.8035f,-62.5f, +164.063f,30.3361f,-62.5f, +167.969f,29.7129f,-62.5f, +171.875f,28.9356f,-62.5f, +175.781f,27.3605f,-62.5f, +179.688f,26.5354f,-62.5f, +183.594f,25.1923f,-62.5f, +187.5f,23.8745f,-62.5f, +191.406f,22.6444f,-62.5f, +195.313f,22.0412f,-62.5f, +199.219f,20.9675f,-62.5f, +203.125f,18.5243f,-62.5f, +207.031f,15.5154f,-62.5f, +210.938f,13.2419f,-62.5f, +214.844f,11.0082f,-62.5f, +218.75f,9.92645f,-62.5f, +222.656f,9.66787f,-62.5f, +226.563f,10.141f,-62.5f, +230.469f,9.5559f,-62.5f, +234.375f,8.93799f,-62.5f, +238.281f,9.36179f,-62.5f, +242.188f,9.32325f,-62.5f, +246.094f,9.89448f,-62.5f, +250.0f,11.3062f,-62.5f, +3.90625f,60.8569f,-66.4063f, +7.8125f,59.3087f,-66.4063f, +11.7188f,58.6192f,-66.4063f, +15.625f,57.567f,-66.4063f, +19.5313f,54.6351f,-66.4063f, +23.4375f,53.6183f,-66.4063f, +27.3438f,54.0844f,-66.4063f, +31.25f,54.4962f,-66.4063f, +35.1563f,53.9539f,-66.4063f, +39.0625f,53.4324f,-66.4063f, +42.9688f,52.6655f,-66.4063f, +46.875f,51.9681f,-66.4063f, +50.7813f,51.1623f,-66.4063f, +54.6875f,50.0114f,-66.4063f, +58.5938f,47.9598f,-66.4063f, +62.5f,46.2999f,-66.4063f, +66.4063f,44.4466f,-66.4063f, +70.3125f,42.2001f,-66.4063f, +74.2188f,41.2192f,-66.4063f, +78.125f,41.7209f,-66.4063f, +82.0313f,42.7363f,-66.4063f, +85.9375f,42.9552f,-66.4063f, +89.8438f,43.0346f,-66.4063f, +93.75f,43.4604f,-66.4063f, +97.6563f,42.6437f,-66.4063f, +101.563f,42.6894f,-66.4063f, +105.469f,43.1054f,-66.4063f, +109.375f,42.7138f,-66.4063f, +113.281f,42.4744f,-66.4063f, +117.188f,42.2299f,-66.4063f, +121.094f,41.2421f,-66.4063f, +125.0f,40.3737f,-66.4063f, +128.906f,40.1758f,-66.4063f, +132.813f,39.5421f,-66.4063f, +136.719f,39.0437f,-66.4063f, +140.625f,37.1531f,-66.4063f, +144.531f,34.9841f,-66.4063f, +148.438f,33.2713f,-66.4063f, +152.344f,32.4185f,-66.4063f, +156.25f,31.779f,-66.4063f, +160.156f,30.7377f,-66.4063f, +164.063f,30.5524f,-66.4063f, +167.969f,29.5693f,-66.4063f, +171.875f,28.9756f,-66.4063f, +175.781f,27.4499f,-66.4063f, +179.688f,26.7907f,-66.4063f, +183.594f,25.5886f,-66.4063f, +187.5f,24.2807f,-66.4063f, +191.406f,22.1754f,-66.4063f, +195.313f,20.7766f,-66.4063f, +199.219f,19.914f,-66.4063f, +203.125f,17.149f,-66.4063f, +207.031f,14.0043f,-66.4063f, +210.938f,11.404f,-66.4063f, +214.844f,10.0012f,-66.4063f, +218.75f,8.65109f,-66.4063f, +222.656f,9.38897f,-66.4063f, +226.563f,9.4612f,-66.4063f, +230.469f,8.86613f,-66.4063f, +234.375f,8.68429f,-66.4063f, +238.281f,9.75985f,-66.4063f, +242.188f,10.3807f,-66.4063f, +246.094f,10.966f,-66.4063f, +250.0f,11.4354f,-66.4063f, +3.90625f,59.1482f,-70.3125f, +7.8125f,57.7892f,-70.3125f, +11.7188f,55.5839f,-70.3125f, +15.625f,54.3451f,-70.3125f, +19.5313f,52.0576f,-70.3125f, +23.4375f,50.5935f,-70.3125f, +27.3438f,50.8648f,-70.3125f, +31.25f,51.3182f,-70.3125f, +35.1563f,51.6726f,-70.3125f, +39.0625f,51.1264f,-70.3125f, +42.9688f,51.6239f,-70.3125f, +46.875f,49.728f,-70.3125f, +50.7813f,48.7924f,-70.3125f, +54.6875f,47.3884f,-70.3125f, +58.5938f,46.4477f,-70.3125f, +62.5f,45.2447f,-70.3125f, +66.4063f,42.8677f,-70.3125f, +70.3125f,40.9023f,-70.3125f, +74.2188f,39.5284f,-70.3125f, +78.125f,39.6524f,-70.3125f, +82.0313f,40.5173f,-70.3125f, +85.9375f,41.0204f,-70.3125f, +89.8438f,41.9366f,-70.3125f, +93.75f,42.1341f,-70.3125f, +97.6563f,41.4699f,-70.3125f, +101.563f,40.6754f,-70.3125f, +105.469f,41.2206f,-70.3125f, +109.375f,40.9668f,-70.3125f, +113.281f,41.1079f,-70.3125f, +117.188f,40.7056f,-70.3125f, +121.094f,39.8305f,-70.3125f, +125.0f,40.959f,-70.3125f, +128.906f,41.7481f,-70.3125f, +132.813f,41.1255f,-70.3125f, +136.719f,39.8634f,-70.3125f, +140.625f,37.8454f,-70.3125f, +144.531f,35.3914f,-70.3125f, +148.438f,33.8462f,-70.3125f, +152.344f,33.0994f,-70.3125f, +156.25f,32.4757f,-70.3125f, +160.156f,31.4779f,-70.3125f, +164.063f,29.4211f,-70.3125f, +167.969f,28.0779f,-70.3125f, +171.875f,27.802f,-70.3125f, +175.781f,26.7406f,-70.3125f, +179.688f,25.4777f,-70.3125f, +183.594f,24.7569f,-70.3125f, +187.5f,22.9331f,-70.3125f, +191.406f,21.2419f,-70.3125f, +195.313f,19.5082f,-70.3125f, +199.219f,17.6022f,-70.3125f, +203.125f,15.316f,-70.3125f, +207.031f,12.7546f,-70.3125f, +210.938f,10.3646f,-70.3125f, +214.844f,8.2502f,-70.3125f, +218.75f,8.14317f,-70.3125f, +222.656f,8.65089f,-70.3125f, +226.563f,8.60005f,-70.3125f, +230.469f,8.58165f,-70.3125f, +234.375f,9.40162f,-70.3125f, +238.281f,9.96281f,-70.3125f, +242.188f,9.81934f,-70.3125f, +246.094f,10.3078f,-70.3125f, +250.0f,10.4404f,-70.3125f, +3.90625f,56.5167f,-74.2188f, +7.8125f,55.7237f,-74.2188f, +11.7188f,53.4039f,-74.2188f, +15.625f,51.0313f,-74.2188f, +19.5313f,49.1141f,-74.2188f, +23.4375f,47.8398f,-74.2188f, +27.3438f,47.778f,-74.2188f, +31.25f,48.3917f,-74.2188f, +35.1563f,48.2503f,-74.2188f, +39.0625f,49.1497f,-74.2188f, +42.9688f,48.8224f,-74.2188f, +46.875f,47.4358f,-74.2188f, +50.7813f,47.051f,-74.2188f, +54.6875f,45.4218f,-74.2188f, +58.5938f,44.3385f,-74.2188f, +62.5f,42.9758f,-74.2188f, +66.4063f,41.4743f,-74.2188f, +70.3125f,39.4251f,-74.2188f, +74.2188f,37.5972f,-74.2188f, +78.125f,37.8246f,-74.2188f, +82.0313f,38.9578f,-74.2188f, +85.9375f,40.148f,-74.2188f, +89.8438f,41.1035f,-74.2188f, +93.75f,40.631f,-74.2188f, +97.6563f,40.0863f,-74.2188f, +101.563f,40.3273f,-74.2188f, +105.469f,40.0413f,-74.2188f, +109.375f,40.0514f,-74.2188f, +113.281f,39.4849f,-74.2188f, +117.188f,39.5903f,-74.2188f, +121.094f,40.1543f,-74.2188f, +125.0f,40.3424f,-74.2188f, +128.906f,41.779f,-74.2188f, +132.813f,41.4976f,-74.2188f, +136.719f,41.1475f,-74.2188f, +140.625f,38.8105f,-74.2188f, +144.531f,35.834f,-74.2188f, +148.438f,34.6385f,-74.2188f, +152.344f,33.7088f,-74.2188f, +156.25f,32.7137f,-74.2188f, +160.156f,30.7745f,-74.2188f, +164.063f,28.172f,-74.2188f, +167.969f,27.1433f,-74.2188f, +171.875f,26.7248f,-74.2188f, +175.781f,25.7807f,-74.2188f, +179.688f,24.8758f,-74.2188f, +183.594f,23.4994f,-74.2188f, +187.5f,23.3209f,-74.2188f, +191.406f,22.3523f,-74.2188f, +195.313f,20.3275f,-74.2188f, +199.219f,17.2927f,-74.2188f, +203.125f,15.0486f,-74.2188f, +207.031f,12.2721f,-74.2188f, +210.938f,9.60109f,-74.2188f, +214.844f,7.36411f,-74.2188f, +218.75f,7.27514f,-74.2188f, +222.656f,8.35951f,-74.2188f, +226.563f,8.18334f,-74.2188f, +230.469f,8.98708f,-74.2188f, +234.375f,8.98011f,-74.2188f, +238.281f,9.03329f,-74.2188f, +242.188f,8.88664f,-74.2188f, +246.094f,8.62938f,-74.2188f, +250.0f,9.6823f,-74.2188f, +3.90625f,54.4402f,-78.125f, +7.8125f,53.0525f,-78.125f, +11.7188f,51.2204f,-78.125f, +15.625f,48.7251f,-78.125f, +19.5313f,45.9841f,-78.125f, +23.4375f,45.0227f,-78.125f, +27.3438f,45.3099f,-78.125f, +31.25f,45.9225f,-78.125f, +35.1563f,46.8025f,-78.125f, +39.0625f,46.8434f,-78.125f, +42.9688f,46.0024f,-78.125f, +46.875f,45.6669f,-78.125f, +50.7813f,45.4624f,-78.125f, +54.6875f,43.4573f,-78.125f, +58.5938f,42.1273f,-78.125f, +62.5f,41.0088f,-78.125f, +66.4063f,38.8967f,-78.125f, +70.3125f,38.002f,-78.125f, +74.2188f,36.5282f,-78.125f, +78.125f,37.0499f,-78.125f, +82.0313f,37.3419f,-78.125f, +85.9375f,38.6056f,-78.125f, +89.8438f,39.7527f,-78.125f, +93.75f,40.3513f,-78.125f, +97.6563f,40.6919f,-78.125f, +101.563f,40.7736f,-78.125f, +105.469f,40.3007f,-78.125f, +109.375f,39.3023f,-78.125f, +113.281f,39.1369f,-78.125f, +117.188f,39.884f,-78.125f, +121.094f,40.5674f,-78.125f, +125.0f,40.8192f,-78.125f, +128.906f,41.893f,-78.125f, +132.813f,42.3647f,-78.125f, +136.719f,41.2455f,-78.125f, +140.625f,38.7064f,-78.125f, +144.531f,36.9679f,-78.125f, +148.438f,36.03f,-78.125f, +152.344f,33.9946f,-78.125f, +156.25f,32.2274f,-78.125f, +160.156f,30.474f,-78.125f, +164.063f,28.4739f,-78.125f, +167.969f,27.222f,-78.125f, +171.875f,26.6935f,-78.125f, +175.781f,25.0624f,-78.125f, +179.688f,24.162f,-78.125f, +183.594f,24.0176f,-78.125f, +187.5f,24.0379f,-78.125f, +191.406f,22.4301f,-78.125f, +195.313f,19.7078f,-78.125f, +199.219f,17.0911f,-78.125f, +203.125f,14.784f,-78.125f, +207.031f,11.8835f,-78.125f, +210.938f,9.34715f,-78.125f, +214.844f,7.23075f,-78.125f, +218.75f,7.91637f,-78.125f, +222.656f,8.69702f,-78.125f, +226.563f,8.56112f,-78.125f, +230.469f,9.86446f,-78.125f, +234.375f,9.26431f,-78.125f, +238.281f,8.47473f,-78.125f, +242.188f,7.8386f,-78.125f, +246.094f,7.82236f,-78.125f, +250.0f,8.68625f,-78.125f, +3.90625f,51.949f,-82.0313f, +7.8125f,50.1159f,-82.0313f, +11.7188f,48.9067f,-82.0313f, +15.625f,46.6417f,-82.0313f, +19.5313f,44.5725f,-82.0313f, +23.4375f,43.435f,-82.0313f, +27.3438f,43.6749f,-82.0313f, +31.25f,44.8399f,-82.0313f, +35.1563f,45.0253f,-82.0313f, +39.0625f,44.7335f,-82.0313f, +42.9688f,44.4485f,-82.0313f, +46.875f,44.8284f,-82.0313f, +50.7813f,43.5547f,-82.0313f, +54.6875f,41.2266f,-82.0313f, +58.5938f,40.4716f,-82.0313f, +62.5f,38.4361f,-82.0313f, +66.4063f,36.3554f,-82.0313f, +70.3125f,35.5722f,-82.0313f, +74.2188f,35.0069f,-82.0313f, +78.125f,35.8289f,-82.0313f, +82.0313f,37.0933f,-82.0313f, +85.9375f,38.1008f,-82.0313f, +89.8438f,38.9582f,-82.0313f, +93.75f,40.0751f,-82.0313f, +97.6563f,40.3989f,-82.0313f, +101.563f,40.2487f,-82.0313f, +105.469f,39.9234f,-82.0313f, +109.375f,40.0277f,-82.0313f, +113.281f,40.6647f,-82.0313f, +117.188f,40.69f,-82.0313f, +121.094f,40.7857f,-82.0313f, +125.0f,41.5688f,-82.0313f, +128.906f,41.836f,-82.0313f, +132.813f,41.6054f,-82.0313f, +136.719f,39.6237f,-82.0313f, +140.625f,38.6765f,-82.0313f, +144.531f,36.9959f,-82.0313f, +148.438f,35.8215f,-82.0313f, +152.344f,34.799f,-82.0313f, +156.25f,33.2398f,-82.0313f, +160.156f,30.7864f,-82.0313f, +164.063f,28.6776f,-82.0313f, +167.969f,26.6558f,-82.0313f, +171.875f,25.8282f,-82.0313f, +175.781f,24.7932f,-82.0313f, +179.688f,22.3283f,-82.0313f, +183.594f,23.1666f,-82.0313f, +187.5f,23.1721f,-82.0313f, +191.406f,21.3358f,-82.0313f, +195.313f,18.8226f,-82.0313f, +199.219f,16.5471f,-82.0313f, +203.125f,14.4667f,-82.0313f, +207.031f,11.1533f,-82.0313f, +210.938f,8.28389f,-82.0313f, +214.844f,8.02411f,-82.0313f, +218.75f,8.03784f,-82.0313f, +222.656f,8.27638f,-82.0313f, +226.563f,8.14824f,-82.0313f, +230.469f,8.45286f,-82.0313f, +234.375f,8.21959f,-82.0313f, +238.281f,8.25224f,-82.0313f, +242.188f,7.67129f,-82.0313f, +246.094f,8.04143f,-82.0313f, +250.0f,8.6199f,-82.0313f, +3.90625f,50.007f,-85.9375f, +7.8125f,48.4593f,-85.9375f, +11.7188f,46.0233f,-85.9375f, +15.625f,44.0556f,-85.9375f, +19.5313f,42.3324f,-85.9375f, +23.4375f,41.8982f,-85.9375f, +27.3438f,42.3931f,-85.9375f, +31.25f,43.1153f,-85.9375f, +35.1563f,43.1285f,-85.9375f, +39.0625f,43.422f,-85.9375f, +42.9688f,43.5417f,-85.9375f, +46.875f,42.2294f,-85.9375f, +50.7813f,40.9068f,-85.9375f, +54.6875f,39.4177f,-85.9375f, +58.5938f,37.2575f,-85.9375f, +62.5f,35.2254f,-85.9375f, +66.4063f,33.8821f,-85.9375f, +70.3125f,33.1531f,-85.9375f, +74.2188f,34.2747f,-85.9375f, +78.125f,35.599f,-85.9375f, +82.0313f,37.007f,-85.9375f, +85.9375f,37.5018f,-85.9375f, +89.8438f,38.1376f,-85.9375f, +93.75f,38.9449f,-85.9375f, +97.6563f,38.9221f,-85.9375f, +101.563f,38.8555f,-85.9375f, +105.469f,39.5572f,-85.9375f, +109.375f,40.1231f,-85.9375f, +113.281f,40.7416f,-85.9375f, +117.188f,40.3888f,-85.9375f, +121.094f,40.6715f,-85.9375f, +125.0f,40.7246f,-85.9375f, +128.906f,40.6124f,-85.9375f, +132.813f,39.685f,-85.9375f, +136.719f,39.2043f,-85.9375f, +140.625f,38.1816f,-85.9375f, +144.531f,36.598f,-85.9375f, +148.438f,36.2907f,-85.9375f, +152.344f,34.8832f,-85.9375f, +156.25f,33.4024f,-85.9375f, +160.156f,31.2463f,-85.9375f, +164.063f,29.1669f,-85.9375f, +167.969f,26.7298f,-85.9375f, +171.875f,24.3407f,-85.9375f, +175.781f,23.4854f,-85.9375f, +179.688f,21.3474f,-85.9375f, +183.594f,21.2953f,-85.9375f, +187.5f,21.7398f,-85.9375f, +191.406f,20.4218f,-85.9375f, +195.313f,17.9433f,-85.9375f, +199.219f,15.3133f,-85.9375f, +203.125f,13.0586f,-85.9375f, +207.031f,9.24996f,-85.9375f, +210.938f,7.18408f,-85.9375f, +214.844f,7.59758f,-85.9375f, +218.75f,8.04641f,-85.9375f, +222.656f,8.01634f,-85.9375f, +226.563f,7.95015f,-85.9375f, +230.469f,7.86343f,-85.9375f, +234.375f,6.21751f,-85.9375f, +238.281f,7.40112f,-85.9375f, +242.188f,7.60481f,-85.9375f, +246.094f,6.77129f,-85.9375f, +250.0f,7.87753f,-85.9375f, +3.90625f,47.6596f,-89.8438f, +7.8125f,45.9136f,-89.8438f, +11.7188f,44.0495f,-89.8438f, +15.625f,42.5127f,-89.8438f, +19.5313f,41.5996f,-89.8438f, +23.4375f,41.2638f,-89.8438f, +27.3438f,41.2672f,-89.8438f, +31.25f,41.5402f,-89.8438f, +35.1563f,42.558f,-89.8438f, +39.0625f,42.49f,-89.8438f, +42.9688f,42.2839f,-89.8438f, +46.875f,40.9401f,-89.8438f, +50.7813f,38.7346f,-89.8438f, +54.6875f,36.624f,-89.8438f, +58.5938f,35.1978f,-89.8438f, +62.5f,34.9272f,-89.8438f, +66.4063f,32.893f,-89.8438f, +70.3125f,32.4101f,-89.8438f, +74.2188f,33.9814f,-89.8438f, +78.125f,35.8825f,-89.8438f, +82.0313f,37.1245f,-89.8438f, +85.9375f,37.3954f,-89.8438f, +89.8438f,38.0118f,-89.8438f, +93.75f,37.5426f,-89.8438f, +97.6563f,38.0776f,-89.8438f, +101.563f,37.9785f,-89.8438f, +105.469f,38.6389f,-89.8438f, +109.375f,39.284f,-89.8438f, +113.281f,40.0027f,-89.8438f, +117.188f,41.2412f,-89.8438f, +121.094f,41.2301f,-89.8438f, +125.0f,40.7611f,-89.8438f, +128.906f,39.7426f,-89.8438f, +132.813f,39.1387f,-89.8438f, +136.719f,38.499f,-89.8438f, +140.625f,37.714f,-89.8438f, +144.531f,36.6379f,-89.8438f, +148.438f,36.1196f,-89.8438f, +152.344f,35.7001f,-89.8438f, +156.25f,33.9038f,-89.8438f, +160.156f,32.0706f,-89.8438f, +164.063f,29.746f,-89.8438f, +167.969f,26.4482f,-89.8438f, +171.875f,23.8046f,-89.8438f, +175.781f,21.9675f,-89.8438f, +179.688f,20.7011f,-89.8438f, +183.594f,20.6699f,-89.8438f, +187.5f,20.1508f,-89.8438f, +191.406f,17.8245f,-89.8438f, +195.313f,16.2785f,-89.8438f, +199.219f,13.4596f,-89.8438f, +203.125f,9.54647f,-89.8438f, +207.031f,6.02727f,-89.8438f, +210.938f,5.88903f,-89.8438f, +214.844f,6.47568f,-89.8438f, +218.75f,6.20004f,-89.8438f, +222.656f,6.0849f,-89.8438f, +226.563f,6.84648f,-89.8438f, +230.469f,6.3424f,-89.8438f, +234.375f,5.81853f,-89.8438f, +238.281f,5.89205f,-89.8438f, +242.188f,6.84078f,-89.8438f, +246.094f,6.32426f,-89.8438f, +250.0f,6.29368f,-89.8438f, +3.90625f,45.4182f,-93.75f, +7.8125f,44.5664f,-93.75f, +11.7188f,44.0207f,-93.75f, +15.625f,42.2553f,-93.75f, +19.5313f,40.8951f,-93.75f, +23.4375f,40.7665f,-93.75f, +27.3438f,40.5756f,-93.75f, +31.25f,41.2988f,-93.75f, +35.1563f,40.6862f,-93.75f, +39.0625f,40.6007f,-93.75f, +42.9688f,39.5329f,-93.75f, +46.875f,38.2364f,-93.75f, +50.7813f,36.1442f,-93.75f, +54.6875f,34.7353f,-93.75f, +58.5938f,34.4214f,-93.75f, +62.5f,33.9528f,-93.75f, +66.4063f,32.4931f,-93.75f, +70.3125f,32.5145f,-93.75f, +74.2188f,33.393f,-93.75f, +78.125f,34.9658f,-93.75f, +82.0313f,36.3611f,-93.75f, +85.9375f,37.568f,-93.75f, +89.8438f,37.012f,-93.75f, +93.75f,37.6392f,-93.75f, +97.6563f,38.4371f,-93.75f, +101.563f,38.3719f,-93.75f, +105.469f,39.1179f,-93.75f, +109.375f,38.5168f,-93.75f, +113.281f,40.0403f,-93.75f, +117.188f,40.2277f,-93.75f, +121.094f,40.8985f,-93.75f, +125.0f,40.189f,-93.75f, +128.906f,39.9435f,-93.75f, +132.813f,39.6824f,-93.75f, +136.719f,38.844f,-93.75f, +140.625f,37.4579f,-93.75f, +144.531f,36.8375f,-93.75f, +148.438f,36.2601f,-93.75f, +152.344f,35.6484f,-93.75f, +156.25f,34.179f,-93.75f, +160.156f,32.0651f,-93.75f, +164.063f,28.6431f,-93.75f, +167.969f,25.1239f,-93.75f, +171.875f,22.4459f,-93.75f, +175.781f,19.5301f,-93.75f, +179.688f,18.4371f,-93.75f, +183.594f,18.6076f,-93.75f, +187.5f,17.488f,-93.75f, +191.406f,15.1604f,-93.75f, +195.313f,13.0197f,-93.75f, +199.219f,9.4702f,-93.75f, +203.125f,5.597f,-93.75f, +207.031f,3.59409f,-93.75f, +210.938f,4.28966f,-93.75f, +214.844f,4.21811f,-93.75f, +218.75f,4.11546f,-93.75f, +222.656f,5.40815f,-93.75f, +226.563f,5.56249f,-93.75f, +230.469f,5.35075f,-93.75f, +234.375f,5.24306f,-93.75f, +238.281f,4.85548f,-93.75f, +242.188f,5.02825f,-93.75f, +246.094f,5.32318f,-93.75f, +250.0f,5.59512f,-93.75f, +3.90625f,44.9637f,-97.6563f, +7.8125f,44.7813f,-97.6563f, +11.7188f,43.457f,-97.6563f, +15.625f,42.5329f,-97.6563f, +19.5313f,40.506f,-97.6563f, +23.4375f,39.8146f,-97.6563f, +27.3438f,40.2245f,-97.6563f, +31.25f,39.497f,-97.6563f, +35.1563f,38.8152f,-97.6563f, +39.0625f,38.3406f,-97.6563f, +42.9688f,37.57f,-97.6563f, +46.875f,36.3128f,-97.6563f, +50.7813f,34.2277f,-97.6563f, +54.6875f,33.3395f,-97.6563f, +58.5938f,32.972f,-97.6563f, +62.5f,32.6315f,-97.6563f, +66.4063f,32.4796f,-97.6563f, +70.3125f,31.6472f,-97.6563f, +74.2188f,32.2256f,-97.6563f, +78.125f,33.8073f,-97.6563f, +82.0313f,35.7591f,-97.6563f, +85.9375f,36.5001f,-97.6563f, +89.8438f,36.9113f,-97.6563f, +93.75f,37.6902f,-97.6563f, +97.6563f,37.9643f,-97.6563f, +101.563f,38.9556f,-97.6563f, +105.469f,39.6823f,-97.6563f, +109.375f,38.9917f,-97.6563f, +113.281f,40.0872f,-97.6563f, +117.188f,40.44f,-97.6563f, +121.094f,39.6877f,-97.6563f, +125.0f,39.0011f,-97.6563f, +128.906f,39.8735f,-97.6563f, +132.813f,39.5503f,-97.6563f, +136.719f,37.743f,-97.6563f, +140.625f,36.4691f,-97.6563f, +144.531f,36.1765f,-97.6563f, +148.438f,35.9476f,-97.6563f, +152.344f,35.1141f,-97.6563f, +156.25f,33.2516f,-97.6563f, +160.156f,30.654f,-97.6563f, +164.063f,27.2318f,-97.6563f, +167.969f,23.3975f,-97.6563f, +171.875f,20.6722f,-97.6563f, +175.781f,18.394f,-97.6563f, +179.688f,17.6475f,-97.6563f, +183.594f,16.1037f,-97.6563f, +187.5f,14.761f,-97.6563f, +191.406f,12.2456f,-97.6563f, +195.313f,9.43327f,-97.6563f, +199.219f,6.9118f,-97.6563f, +203.125f,4.26334f,-97.6563f, +207.031f,3.47413f,-97.6563f, +210.938f,3.74872f,-97.6563f, +214.844f,3.7631f,-97.6563f, +218.75f,3.80513f,-97.6563f, +222.656f,4.23443f,-97.6563f, +226.563f,3.71016f,-97.6563f, +230.469f,3.772f,-97.6563f, +234.375f,3.80374f,-97.6563f, +238.281f,3.70762f,-97.6563f, +242.188f,4.23931f,-97.6563f, +246.094f,4.40519f,-97.6563f, +250.0f,4.5119f,-97.6563f, +3.90625f,44.5311f,-101.563f, +7.8125f,44.4181f,-101.563f, +11.7188f,43.4864f,-101.563f, +15.625f,42.259f,-101.563f, +19.5313f,41.0558f,-101.563f, +23.4375f,39.9996f,-101.563f, +27.3438f,39.3917f,-101.563f, +31.25f,39.5691f,-101.563f, +35.1563f,37.0889f,-101.563f, +39.0625f,36.4296f,-101.563f, +42.9688f,36.543f,-101.563f, +46.875f,35.4365f,-101.563f, +50.7813f,33.3641f,-101.563f, +54.6875f,32.0629f,-101.563f, +58.5938f,32.175f,-101.563f, +62.5f,32.775f,-101.563f, +66.4063f,31.6335f,-101.563f, +70.3125f,32.1001f,-101.563f, +74.2188f,32.5906f,-101.563f, +78.125f,33.1502f,-101.563f, +82.0313f,35.1972f,-101.563f, +85.9375f,36.0132f,-101.563f, +89.8438f,37.3442f,-101.563f, +93.75f,37.6109f,-101.563f, +97.6563f,38.1601f,-101.563f, +101.563f,39.77f,-101.563f, +105.469f,39.6862f,-101.563f, +109.375f,39.4829f,-101.563f, +113.281f,40.1383f,-101.563f, +117.188f,40.8908f,-101.563f, +121.094f,39.3517f,-101.563f, +125.0f,38.9321f,-101.563f, +128.906f,39.2537f,-101.563f, +132.813f,38.4876f,-101.563f, +136.719f,36.6755f,-101.563f, +140.625f,35.2803f,-101.563f, +144.531f,35.8754f,-101.563f, +148.438f,36.2761f,-101.563f, +152.344f,34.7815f,-101.563f, +156.25f,32.2662f,-101.563f, +160.156f,29.8191f,-101.563f, +164.063f,25.8929f,-101.563f, +167.969f,22.552f,-101.563f, +171.875f,20.3186f,-101.563f, +175.781f,17.2917f,-101.563f, +179.688f,16.8305f,-101.563f, +183.594f,14.7168f,-101.563f, +187.5f,12.0609f,-101.563f, +191.406f,9.91022f,-101.563f, +195.313f,7.22029f,-101.563f, +199.219f,5.48379f,-101.563f, +203.125f,3.03759f,-101.563f, +207.031f,3.02148f,-101.563f, +210.938f,2.88667f,-101.563f, +214.844f,3.08795f,-101.563f, +218.75f,3.43814f,-101.563f, +222.656f,3.58591f,-101.563f, +226.563f,3.17855f,-101.563f, +230.469f,2.48711f,-101.563f, +234.375f,2.66471f,-101.563f, +238.281f,2.06432f,-101.563f, +242.188f,2.49704f,-101.563f, +246.094f,3.05219f,-101.563f, +250.0f,3.69155f,-101.563f, +3.90625f,44.8466f,-105.469f, +7.8125f,44.3102f,-105.469f, +11.7188f,43.8936f,-105.469f, +15.625f,43.2285f,-105.469f, +19.5313f,42.7384f,-105.469f, +23.4375f,41.2954f,-105.469f, +27.3438f,39.4813f,-105.469f, +31.25f,38.4483f,-105.469f, +35.1563f,35.8264f,-105.469f, +39.0625f,35.0991f,-105.469f, +42.9688f,35.1929f,-105.469f, +46.875f,34.3044f,-105.469f, +50.7813f,31.4169f,-105.469f, +54.6875f,30.8206f,-105.469f, +58.5938f,31.2902f,-105.469f, +62.5f,32.2869f,-105.469f, +66.4063f,32.5121f,-105.469f, +70.3125f,32.772f,-105.469f, +74.2188f,32.5422f,-105.469f, +78.125f,34.0506f,-105.469f, +82.0313f,35.4894f,-105.469f, +85.9375f,36.753f,-105.469f, +89.8438f,37.6901f,-105.469f, +93.75f,37.848f,-105.469f, +97.6563f,38.9724f,-105.469f, +101.563f,40.0724f,-105.469f, +105.469f,39.7381f,-105.469f, +109.375f,39.3905f,-105.469f, +113.281f,39.8577f,-105.469f, +117.188f,40.4957f,-105.469f, +121.094f,39.554f,-105.469f, +125.0f,39.0384f,-105.469f, +128.906f,38.2112f,-105.469f, +132.813f,36.7141f,-105.469f, +136.719f,34.736f,-105.469f, +140.625f,34.2236f,-105.469f, +144.531f,35.4181f,-105.469f, +148.438f,35.4456f,-105.469f, +152.344f,33.4389f,-105.469f, +156.25f,29.9708f,-105.469f, +160.156f,27.2392f,-105.469f, +164.063f,24.3409f,-105.469f, +167.969f,22.4438f,-105.469f, +171.875f,19.5326f,-105.469f, +175.781f,16.9951f,-105.469f, +179.688f,14.77f,-105.469f, +183.594f,13.1816f,-105.469f, +187.5f,10.3711f,-105.469f, +191.406f,7.10511f,-105.469f, +195.313f,5.43711f,-105.469f, +199.219f,3.35463f,-105.469f, +203.125f,2.41276f,-105.469f, +207.031f,2.35357f,-105.469f, +210.938f,2.28627f,-105.469f, +214.844f,1.61561f,-105.469f, +218.75f,2.61087f,-105.469f, +222.656f,2.34638f,-105.469f, +226.563f,1.47074f,-105.469f, +230.469f,0.63025f,-105.469f, +234.375f,0.847991f,-105.469f, +238.281f,1.35199f,-105.469f, +242.188f,2.21032f,-105.469f, +246.094f,3.01323f,-105.469f, +250.0f,3.12713f,-105.469f, +3.90625f,45.3987f,-109.375f, +7.8125f,44.6273f,-109.375f, +11.7188f,44.5674f,-109.375f, +15.625f,44.2998f,-109.375f, +19.5313f,43.5383f,-109.375f, +23.4375f,42.0306f,-109.375f, +27.3438f,40.7068f,-109.375f, +31.25f,39.6497f,-109.375f, +35.1563f,36.2161f,-109.375f, +39.0625f,34.8769f,-109.375f, +42.9688f,35.1989f,-109.375f, +46.875f,33.9714f,-109.375f, +50.7813f,30.9979f,-109.375f, +54.6875f,31.9366f,-109.375f, +58.5938f,31.5755f,-109.375f, +62.5f,31.572f,-109.375f, +66.4063f,33.0668f,-109.375f, +70.3125f,33.6444f,-109.375f, +74.2188f,32.5467f,-109.375f, +78.125f,34.2686f,-109.375f, +82.0313f,36.0633f,-109.375f, +85.9375f,37.5569f,-109.375f, +89.8438f,38.5599f,-109.375f, +93.75f,38.6708f,-109.375f, +97.6563f,39.2558f,-109.375f, +101.563f,39.9111f,-109.375f, +105.469f,39.9236f,-109.375f, +109.375f,39.5666f,-109.375f, +113.281f,40.1532f,-109.375f, +117.188f,40.8773f,-109.375f, +121.094f,40.133f,-109.375f, +125.0f,38.348f,-109.375f, +128.906f,36.9174f,-109.375f, +132.813f,34.8975f,-109.375f, +136.719f,32.9097f,-109.375f, +140.625f,32.6666f,-109.375f, +144.531f,33.1207f,-109.375f, +148.438f,32.6024f,-109.375f, +152.344f,31.1149f,-109.375f, +156.25f,27.7885f,-109.375f, +160.156f,24.9665f,-109.375f, +164.063f,22.789f,-109.375f, +167.969f,20.4907f,-109.375f, +171.875f,18.2402f,-109.375f, +175.781f,15.9409f,-109.375f, +179.688f,12.7122f,-109.375f, +183.594f,10.9582f,-109.375f, +187.5f,7.47226f,-109.375f, +191.406f,4.87747f,-109.375f, +195.313f,2.78589f,-109.375f, +199.219f,1.53429f,-109.375f, +203.125f,1.61775f,-109.375f, +207.031f,1.772f,-109.375f, +210.938f,1.15444f,-109.375f, +214.844f,0.342505f,-109.375f, +218.75f,0.510183f,-109.375f, +222.656f,0.254977f,-109.375f, +226.563f,-0.22727f,-109.375f, +230.469f,-0.840625f,-109.375f, +234.375f,-0.282154f,-109.375f, +238.281f,0.424945f,-109.375f, +242.188f,1.73577f,-109.375f, +246.094f,1.80217f,-109.375f, +250.0f,1.60105f,-109.375f, +3.90625f,47.4869f,-113.281f, +7.8125f,46.3185f,-113.281f, +11.7188f,46.4911f,-113.281f, +15.625f,45.2506f,-113.281f, +19.5313f,43.7939f,-113.281f, +23.4375f,42.6062f,-113.281f, +27.3438f,41.6674f,-113.281f, +31.25f,39.5196f,-113.281f, +35.1563f,36.6784f,-113.281f, +39.0625f,35.8546f,-113.281f, +42.9688f,35.2647f,-113.281f, +46.875f,33.0882f,-113.281f, +50.7813f,31.1331f,-113.281f, +54.6875f,31.9095f,-113.281f, +58.5938f,31.5715f,-113.281f, +62.5f,32.3642f,-113.281f, +66.4063f,33.2578f,-113.281f, +70.3125f,33.1847f,-113.281f, +74.2188f,33.6624f,-113.281f, +78.125f,35.6582f,-113.281f, +82.0313f,36.7989f,-113.281f, +85.9375f,37.9951f,-113.281f, +89.8438f,38.7063f,-113.281f, +93.75f,39.9727f,-113.281f, +97.6563f,39.641f,-113.281f, +101.563f,40.1318f,-113.281f, +105.469f,40.117f,-113.281f, +109.375f,40.0678f,-113.281f, +113.281f,40.1534f,-113.281f, +117.188f,40.7841f,-113.281f, +121.094f,39.3312f,-113.281f, +125.0f,38.1823f,-113.281f, +128.906f,37.0921f,-113.281f, +132.813f,34.9687f,-113.281f, +136.719f,32.6631f,-113.281f, +140.625f,30.9601f,-113.281f, +144.531f,31.0644f,-113.281f, +148.438f,29.6495f,-113.281f, +152.344f,27.5095f,-113.281f, +156.25f,24.9361f,-113.281f, +160.156f,22.6206f,-113.281f, +164.063f,20.1136f,-113.281f, +167.969f,17.9862f,-113.281f, +171.875f,16.1252f,-113.281f, +175.781f,14.2991f,-113.281f, +179.688f,11.4262f,-113.281f, +183.594f,8.55749f,-113.281f, +187.5f,6.02067f,-113.281f, +191.406f,3.1883f,-113.281f, +195.313f,1.54808f,-113.281f, +199.219f,0.0223479f,-113.281f, +203.125f,-0.0807506f,-113.281f, +207.031f,-0.420855f,-113.281f, +210.938f,-0.531322f,-113.281f, +214.844f,-1.34393f,-113.281f, +218.75f,-2.28346f,-113.281f, +222.656f,-2.245f,-113.281f, +226.563f,-2.22932f,-113.281f, +230.469f,-1.47268f,-113.281f, +234.375f,-0.543695f,-113.281f, +238.281f,-0.391948f,-113.281f, +242.188f,-0.270077f,-113.281f, +246.094f,-0.650629f,-113.281f, +250.0f,0.111517f,-113.281f, +3.90625f,48.3887f,-117.188f, +7.8125f,48.004f,-117.188f, +11.7188f,46.8723f,-117.188f, +15.625f,45.5005f,-117.188f, +19.5313f,43.3644f,-117.188f, +23.4375f,42.3352f,-117.188f, +27.3438f,41.1562f,-117.188f, +31.25f,39.1736f,-117.188f, +35.1563f,38.0627f,-117.188f, +39.0625f,36.4728f,-117.188f, +42.9688f,34.8001f,-117.188f, +46.875f,32.5103f,-117.188f, +50.7813f,31.6328f,-117.188f, +54.6875f,31.6106f,-117.188f, +58.5938f,32.3004f,-117.188f, +62.5f,32.696f,-117.188f, +66.4063f,33.3795f,-117.188f, +70.3125f,33.9696f,-117.188f, +74.2188f,34.9211f,-117.188f, +78.125f,36.7686f,-117.188f, +82.0313f,37.7676f,-117.188f, +85.9375f,37.8174f,-117.188f, +89.8438f,38.2878f,-117.188f, +93.75f,39.6151f,-117.188f, +97.6563f,39.7422f,-117.188f, +101.563f,40.9611f,-117.188f, +105.469f,40.8932f,-117.188f, +109.375f,40.6603f,-117.188f, +113.281f,40.2935f,-117.188f, +117.188f,39.8681f,-117.188f, +121.094f,39.0965f,-117.188f, +125.0f,37.1333f,-117.188f, +128.906f,35.5222f,-117.188f, +132.813f,33.9068f,-117.188f, +136.719f,32.2618f,-117.188f, +140.625f,29.8657f,-117.188f, +144.531f,28.1704f,-117.188f, +148.438f,27.1495f,-117.188f, +152.344f,24.5217f,-117.188f, +156.25f,22.0419f,-117.188f, +160.156f,19.9238f,-117.188f, +164.063f,17.6875f,-117.188f, +167.969f,15.5636f,-117.188f, +171.875f,13.5497f,-117.188f, +175.781f,11.2761f,-117.188f, +179.688f,8.95864f,-117.188f, +183.594f,7.04623f,-117.188f, +187.5f,4.83635f,-117.188f, +191.406f,2.76046f,-117.188f, +195.313f,0.190119f,-117.188f, +199.219f,-0.558379f,-117.188f, +203.125f,-1.03303f,-117.188f, +207.031f,-2.17563f,-117.188f, +210.938f,-1.91155f,-117.188f, +214.844f,-3.00018f,-117.188f, +218.75f,-4.26691f,-117.188f, +222.656f,-5.15855f,-117.188f, +226.563f,-3.46348f,-117.188f, +230.469f,-2.16077f,-117.188f, +234.375f,-1.47785f,-117.188f, +238.281f,-1.78424f,-117.188f, +242.188f,-1.00317f,-117.188f, +246.094f,-1.97981f,-117.188f, +250.0f,-2.29372f,-117.188f, +}; + +btScalar Landscape03Nml[] = { +-0.0301669f,0.913898f,-0.404822f, +0.0925944f,0.901922f,-0.421856f, +0.0550338f,0.955133f,-0.291019f, +0.163554f,0.924847f,-0.343379f, +-0.00160556f,0.985516f,-0.169577f, +0.0975687f,0.967908f,-0.23159f, +-0.0718641f,0.997324f,-0.0134097f, +0.108884f,0.992259f,0.0597208f, +-0.0649193f,0.987727f,0.142057f, +-0.0923076f,0.995503f,-0.0212622f, +-0.212176f,0.966905f,0.141687f, +-0.135924f,0.982555f,0.126925f, +-0.248136f,0.950917f,0.184892f, +-0.114969f,0.937595f,0.328173f, +-0.0596382f,0.954355f,0.292661f, +-0.0673134f,0.931098f,0.358506f, +-0.100514f,0.963905f,0.246544f, +-0.237357f,0.960335f,0.146353f, +-0.210275f,0.964506f,0.159726f, +-0.243879f,0.969407f,-0.027797f, +-0.0995316f,0.963559f,0.248291f, +0.0232774f,0.986211f,0.163848f, +-0.0780955f,0.939808f,0.33266f, +0.0143543f,0.937354f,0.348083f, +-0.242603f,0.911487f,0.332166f, +-0.217791f,0.899583f,0.378572f, +-0.259297f,0.919695f,0.294833f, +-0.235372f,0.900382f,0.365939f, +0.0548314f,0.924698f,0.376733f, +0.17577f,0.83537f,0.520828f, +0.183628f,0.8685f,0.460423f, +0.206319f,0.791195f,0.57571f, +0.291585f,0.831097f,0.473557f, +0.258977f,0.806104f,0.532097f, +0.406441f,0.807616f,0.427274f, +0.279416f,0.89888f,0.337552f, +0.161449f,0.944511f,0.286064f, +-0.0153595f,0.999467f,0.0288015f, +0.0344442f,0.986316f,0.16123f, +0.0228147f,0.999694f,-0.00950936f, +0.221267f,0.961345f,0.163882f, +0.262982f,0.961437f,0.0804904f, +0.292545f,0.943495f,0.155677f, +0.287728f,0.952627f,0.0985627f, +0.338791f,0.935036f,0.104535f, +0.332042f,0.939101f,0.0885263f, +0.395865f,0.914692f,0.0814219f, +0.342439f,0.937891f,0.0556409f, +0.24643f,0.967531f,-0.0561722f, +0.155524f,0.980084f,-0.12348f, +0.12756f,0.989194f,-0.0722747f, +0.141529f,0.984734f,-0.10133f, +0.0842668f,0.99539f,-0.0458028f, +0.00840046f,0.967846f,-0.251403f, +0.0723924f,0.995277f,-0.0646756f, +0.161395f,0.974624f,-0.155111f, +0.168526f,0.983485f,0.0660013f, +0.32936f,0.929371f,0.166709f, +0.334018f,0.924548f,0.18342f, +0.39263f,0.883836f,0.254313f, +0.373683f,0.906029f,0.198675f, +0.318503f,0.931732f,0.174444f, +0.214891f,0.969497f,0.117891f, +0.248914f,0.936934f,0.245348f, +0.199074f,0.96113f,0.19131f, +0.293417f,0.893252f,0.340597f, +0.339667f,0.873015f,0.349959f, +0.354613f,0.873548f,0.333412f, +0.457963f,0.824157f,0.333219f, +0.455319f,0.825254f,0.334127f, +0.52695f,0.805593f,0.270821f, +0.439193f,0.858556f,0.264557f, +0.401282f,0.908751f,0.114652f, +0.249111f,0.965853f,-0.0712114f, +0.0897089f,0.991664f,0.0924929f, +0.0376765f,0.979393f,-0.19842f, +-0.126991f,0.990951f,0.0434627f, +-0.217753f,0.933113f,-0.286154f, +-0.167574f,0.97576f,-0.140749f, +-0.203937f,0.914317f,-0.349907f, +-0.0608955f,0.980207f,-0.188379f, +-0.0120075f,0.947447f,-0.319686f, +0.167601f,0.980952f,-0.0982003f, +0.212052f,0.945824f,-0.245868f, +0.218606f,0.972968f,-0.0744646f, +0.212851f,0.953898f,-0.211596f, +0.171647f,0.974969f,-0.141323f, +0.199197f,0.967793f,-0.153938f, +0.200412f,0.972091f,-0.121957f, +0.23265f,0.963849f,-0.129883f, +0.296235f,0.953212f,-0.060261f, +0.314311f,0.946698f,-0.0705058f, +0.404868f,0.912189f,-0.0631982f, +0.403087f,0.912504f,-0.0696997f, +0.463227f,0.884095f,-0.0616207f, +0.39479f,0.897802f,-0.195171f, +0.35121f,0.926619f,-0.13427f, +0.220773f,0.898508f,-0.379398f, +0.189824f,0.93595f,-0.296589f, +0.0483901f,0.855509f,-0.515522f, +0.0904515f,0.884685f,-0.457329f, +0.120283f,0.865017f,-0.487112f, +0.203986f,0.900002f,-0.385209f, +0.248454f,0.881227f,-0.402131f, +0.178575f,0.929214f,-0.323532f, +0.0792679f,0.824417f,-0.560404f, +0.115378f,0.950213f,-0.289454f, +0.0725597f,0.807744f,-0.585051f, +0.0327706f,0.953791f,-0.298679f, +0.0099385f,0.78612f,-0.617994f, +0.0403637f,0.952173f,-0.302881f, +0.215114f,0.87002f,-0.443611f, +0.182967f,0.972742f,-0.142465f, +0.292542f,0.923312f,-0.248827f, +0.159782f,0.983577f,-0.0839386f, +0.255356f,0.959339f,-0.120256f, +0.180088f,0.983508f,0.0167535f, +0.210595f,0.975243f,-0.0674566f, +0.305089f,0.951559f,0.0381592f, +0.342154f,0.939613f,0.00764387f, +0.44387f,0.894627f,0.0512048f, +0.377004f,0.921573f,-0.0925792f, +0.197535f,0.978807f,-0.0540106f, +0.128094f,0.953819f,-0.271702f, +0.10228f,0.991256f,-0.0833686f, +0.111348f,0.971755f,-0.208074f, +0.120727f,0.982203f,-0.143886f, +0.131919f,0.971754f,-0.195681f, +-0.118481f,0.971727f,-0.204228f, +-0.131824f,0.977685f,-0.163569f, +-0.0725384f,0.997366f,-0.000133281f, +-0.204047f,0.978951f,0.00446862f, +-0.227431f,0.966677f,0.117515f, +-0.137601f,0.963906f,0.227929f, +-0.242399f,0.965055f,0.0995586f, +-0.153062f,0.97808f,0.141178f, +-0.129415f,0.948353f,0.289617f, +-0.22442f,0.902886f,0.366649f, +-0.173979f,0.92147f,0.34731f, +-0.0318649f,0.93595f,0.350687f, +-0.176397f,0.955508f,0.236408f, +-0.254551f,0.956811f,0.140418f, +-0.0162894f,0.984782f,0.173032f, +0.167302f,0.961803f,0.216667f, +0.267797f,0.948626f,0.168505f, +0.412955f,0.869957f,0.269525f, +0.258065f,0.893814f,0.366742f, +0.124905f,0.932115f,0.339941f, +0.234805f,0.927845f,0.289777f, +0.325979f,0.90761f,0.264542f, +0.401458f,0.890435f,0.214374f, +0.44845f,0.886659f,0.112823f, +0.337292f,0.940965f,0.0286028f, +0.110729f,0.992952f,-0.0422648f, +0.0165495f,0.996512f,-0.0817925f, +0.0843804f,0.994583f,-0.0606957f, +0.1131f,0.990749f,-0.0749933f, +0.241223f,0.970417f,0.0100747f, +0.396578f,0.902933f,0.165644f, +0.324808f,0.936808f,0.129963f, +0.0728626f,0.997053f,0.0240034f, +0.167633f,0.975741f,0.140815f, +0.474631f,0.846984f,0.239465f, +0.567824f,0.786908f,0.24156f, +0.402496f,0.873451f,0.274008f, +0.0459982f,0.950641f,0.306865f, +-0.0582337f,0.962437f,0.265188f, +0.030037f,0.970181f,0.240514f, +-0.0533502f,0.992438f,0.110548f, +0.0995416f,0.988544f,0.11346f, +0.255626f,0.959556f,0.11793f, +0.26735f,0.961569f,0.0625254f, +0.18836f,0.981833f,-0.0228855f, +0.278864f,0.958778f,-0.0545789f, +0.407529f,0.909061f,-0.086769f, +0.427129f,0.902011f,-0.0627458f, +0.408272f,0.912551f,-0.0237565f, +0.36375f,0.922794f,-0.127037f, +0.266363f,0.919721f,-0.28838f, +0.0788795f,0.927162f,-0.366263f, +0.0391177f,0.978258f,-0.20367f, +0.0160429f,0.996725f,-0.0792609f, +0.0608773f,0.998141f,0.00292939f, +0.025245f,0.998361f,-0.0513526f, +0.140845f,0.988959f,-0.046063f, +0.138979f,0.986427f,-0.0874468f, +0.128983f,0.987322f,-0.0925141f, +0.303074f,0.948227f,-0.0949297f, +0.392011f,0.918105f,-0.0584085f, +0.26566f,0.960779f,0.0795528f, +0.166068f,0.98603f,-0.0129125f, +0.262845f,0.962536f,-0.0666132f, +-0.104783f,0.989703f,0.0975085f, +-0.153604f,0.984769f,0.0814646f, +-0.17021f,0.98292f,0.0699758f, +-0.192965f,0.974203f,0.117018f, +-0.286836f,0.952199f,0.105086f, +-0.195248f,0.969752f,0.146488f, +-0.150662f,0.967412f,0.203504f, +-0.264752f,0.950334f,0.163619f, +-0.315905f,0.913283f,0.257134f, +-0.224744f,0.91965f,0.322078f, +-0.108929f,0.947464f,0.300743f, +0.0128823f,0.944776f,0.327463f, +-0.0190359f,0.964202f,0.264485f, +-0.187346f,0.97974f,0.0707926f, +-0.0647113f,0.997854f,-0.0100069f, +0.163923f,0.98566f,0.0400324f, +0.299244f,0.952147f,0.0622031f, +0.300231f,0.948028f,0.105378f, +0.182306f,0.951449f,0.248009f, +0.15023f,0.937487f,0.313924f, +0.264855f,0.926023f,0.268948f, +0.322593f,0.919374f,0.225135f, +0.43093f,0.873406f,0.22685f, +0.536094f,0.828094f,0.163899f, +0.40435f,0.914491f,0.0144028f, +0.203744f,0.975451f,-0.0835749f, +0.102706f,0.983162f,-0.151145f, +0.0912494f,0.98262f,-0.161654f, +0.0714052f,0.991795f,-0.106042f, +0.113839f,0.992199f,-0.0508211f, +0.266818f,0.963676f,0.0116937f, +0.379059f,0.920849f,0.091386f, +0.155245f,0.98775f,0.0158058f, +0.135484f,0.989724f,-0.0457313f, +0.394833f,0.917954f,-0.0383045f, +0.510875f,0.847518f,0.143943f, +0.369724f,0.884704f,0.283906f, +0.16927f,0.926331f,0.336538f, +-0.0368298f,0.974452f,0.221557f, +0.0247064f,0.955492f,0.293981f, +0.0101397f,0.960739f,0.27727f, +0.120365f,0.954563f,0.272621f, +0.285189f,0.933274f,0.218327f, +0.27356f,0.947401f,0.16612f, +0.298803f,0.939862f,0.165455f, +0.344494f,0.938521f,0.0223999f, +0.423232f,0.90602f,-0.00171397f, +0.428479f,0.903517f,-0.00795118f, +0.445837f,0.889867f,-0.0967762f, +0.420806f,0.885752f,-0.195872f, +0.361482f,0.916002f,-0.173987f, +0.0888846f,0.94798f,-0.305668f, +-0.104291f,0.938663f,-0.328687f, +-0.0525896f,0.969771f,-0.238281f, +0.0233793f,0.980465f,-0.1953f, +0.0772242f,0.980658f,-0.179852f, +0.158397f,0.962723f,-0.219259f, +0.207852f,0.94171f,-0.264536f, +0.167471f,0.922973f,-0.346518f, +0.273321f,0.900673f,-0.337764f, +0.244245f,0.947327f,-0.207161f, +0.179974f,0.982676f,-0.0442354f, +0.256056f,0.966655f,0.00369743f, +0.311224f,0.950239f,-0.0136096f, +-0.114346f,0.96184f,0.248574f, +-0.136601f,0.952445f,0.272377f, +-0.118024f,0.9521f,0.282091f, +-0.208962f,0.956737f,0.20246f, +-0.278994f,0.940284f,0.195009f, +-0.257672f,0.939434f,0.225986f, +-0.195307f,0.931658f,0.306381f, +-0.244185f,0.930201f,0.274044f, +-0.297894f,0.926606f,0.229479f, +-0.247712f,0.954952f,0.163421f, +-0.130651f,0.964187f,0.230812f, +-0.0752954f,0.962878f,0.259223f, +0.102408f,0.945859f,0.308f, +-0.0116154f,0.986031f,0.166158f, +0.0110135f,0.994405f,0.105056f, +0.0951503f,0.992756f,0.0733669f, +0.243797f,0.961487f,0.12691f, +0.260872f,0.955085f,0.140567f, +0.0581113f,0.983556f,0.170998f, +0.136043f,0.955475f,0.261839f, +0.341254f,0.920705f,0.189336f, +0.362462f,0.927476f,0.0917096f, +0.434756f,0.897441f,0.0747436f, +0.56712f,0.819757f,0.0798336f, +0.532941f,0.840799f,0.0950342f, +0.285812f,0.957415f,-0.0408404f, +0.105292f,0.985973f,-0.129498f, +0.0183827f,0.988838f,-0.147857f, +0.00614806f,0.993133f,-0.116825f, +0.099955f,0.989102f,-0.108098f, +0.238003f,0.969438f,-0.0595305f, +0.37769f,0.925502f,0.0282058f, +0.22782f,0.973089f,-0.0345812f, +0.169707f,0.981804f,-0.085208f, +0.345833f,0.936168f,-0.0631539f, +0.390375f,0.920563f,0.0130624f, +0.292594f,0.949139f,0.116291f, +0.162356f,0.962761f,0.216174f, +-0.0222207f,0.972687f,0.231055f, +-0.0543181f,0.955402f,0.290271f, +0.0573363f,0.941579f,0.331875f, +0.0971816f,0.964596f,0.245172f, +0.31345f,0.917083f,0.246388f, +0.307384f,0.923753f,0.228463f, +0.331585f,0.921188f,0.203628f, +0.40966f,0.902178f,0.135106f, +0.421265f,0.901117f,0.102585f, +0.477285f,0.878068f,0.0345826f, +0.547818f,0.833857f,-0.0676607f, +0.41388f,0.899953f,-0.13707f, +0.336726f,0.938017f,-0.0820957f, +0.267129f,0.960427f,-0.0788775f, +-0.0301028f,0.966021f,-0.256704f, +-0.102361f,0.925067f,-0.36575f, +-0.0109209f,0.925593f,-0.378364f, +0.0802595f,0.925005f,-0.371381f, +0.178475f,0.901809f,-0.393558f, +0.234643f,0.9031f,-0.359657f, +0.21073f,0.932522f,-0.29325f, +0.145492f,0.962309f,-0.22977f, +0.0986234f,0.992893f,-0.0666048f, +0.0609779f,0.998071f,0.0116837f, +0.208222f,0.976086f,0.0624398f, +0.291247f,0.954621f,0.0622453f, +-0.144182f,0.940028f,0.309126f, +-0.205006f,0.91833f,0.33859f, +-0.12423f,0.88968f,0.43936f, +-0.080186f,0.900963f,0.426423f, +-0.276852f,0.915664f,0.291398f, +-0.294009f,0.912157f,0.285532f, +-0.229314f,0.935643f,0.268306f, +-0.167187f,0.934278f,0.314918f, +-0.22242f,0.937858f,0.266367f, +-0.260643f,0.947201f,0.186748f, +-0.191964f,0.952786f,0.235261f, +-0.0626162f,0.968356f,0.24159f, +0.113658f,0.975135f,0.190246f, +0.0609991f,0.983083f,0.172707f, +0.00661942f,0.987494f,0.157516f, +0.132957f,0.988179f,0.0763221f, +0.229975f,0.973129f,-0.011475f, +0.267568f,0.962445f,0.0458956f, +0.0512446f,0.996521f,0.0657221f, +0.10251f,0.994623f,0.0147167f, +0.405413f,0.913613f,0.0308412f, +0.422693f,0.905322f,0.0415123f, +0.446493f,0.894763f,-0.00665318f, +0.517619f,0.855611f,0.00103599f, +0.493254f,0.857934f,0.143698f, +0.391227f,0.901201f,0.186488f, +0.212519f,0.97466f,0.0698119f, +0.0889638f,0.99521f,-0.0405254f, +0.0684633f,0.989971f,-0.123576f, +0.0764325f,0.983592f,-0.163418f, +0.104882f,0.990961f,-0.0836475f, +0.31755f,0.948184f,0.0104726f, +0.297752f,0.954642f,-0.00148102f, +0.157954f,0.986909f,-0.0325777f, +0.331713f,0.943333f,0.00940707f, +0.320973f,0.946975f,0.014661f, +0.220471f,0.961455f,0.164306f, +0.0647366f,0.977455f,0.200976f, +-0.0349474f,0.961311f,0.273238f, +-0.125874f,0.956852f,0.261896f, +0.0785055f,0.963364f,0.256449f, +0.211427f,0.962249f,0.171395f, +0.267083f,0.952021f,0.149409f, +0.340455f,0.905998f,0.251512f, +0.343062f,0.921876f,0.180149f, +0.420249f,0.886024f,0.195835f, +0.477229f,0.85754f,0.192034f, +0.564804f,0.822942f,0.0613434f, +0.583206f,0.811559f,-0.0352364f, +0.433319f,0.897576f,-0.0811897f, +0.291913f,0.950865f,-0.103166f, +0.268144f,0.961121f,-0.065914f, +0.14681f,0.986926f,-0.0665068f, +0.0393351f,0.975019f,-0.218612f, +0.042722f,0.945279f,-0.323454f, +0.104892f,0.926937f,-0.360257f, +0.188153f,0.928382f,-0.320477f, +0.104479f,0.956869f,-0.271082f, +0.039684f,0.98773f,-0.151046f, +0.0798596f,0.996734f,-0.0120106f, +0.0027229f,0.999081f,-0.0427778f, +0.0156228f,0.999853f,-0.00700924f, +0.224664f,0.97266f,0.058815f, +0.342188f,0.939164f,0.029646f, +-0.199093f,0.881081f,0.429019f, +-0.240385f,0.861587f,0.447083f, +-0.200309f,0.881599f,0.427386f, +-0.0492643f,0.888913f,0.455419f, +-0.146605f,0.886582f,0.438724f, +-0.194932f,0.91844f,0.344193f, +-0.212452f,0.949737f,0.229922f, +-0.231229f,0.946978f,0.223083f, +-0.22018f,0.943947f,0.245937f, +-0.155384f,0.954263f,0.255419f, +-0.222552f,0.970336f,0.0944332f, +0.0103498f,0.996133f,0.0872447f, +0.133012f,0.991064f,-0.00997971f, +0.0530236f,0.995787f,0.0748093f, +0.0840279f,0.994917f,0.0554967f, +0.25995f,0.964887f,-0.0376792f, +0.277109f,0.958722f,-0.0637373f, +0.172083f,0.982525f,-0.0709421f, +0.0951551f,0.994032f,-0.0533466f, +0.177084f,0.970483f,-0.163718f, +0.336303f,0.91861f,-0.207499f, +0.381503f,0.916211f,-0.122527f, +0.437128f,0.898759f,-0.0339342f, +0.471093f,0.8784f,0.0805223f, +0.407138f,0.905658f,0.118413f, +0.402844f,0.901612f,0.157519f, +0.327464f,0.936685f,0.124046f, +0.19809f,0.980129f,0.0103207f, +0.123868f,0.987803f,-0.0943524f, +0.0527864f,0.989238f,-0.136459f, +0.072462f,0.988213f,-0.134849f, +0.248671f,0.959688f,-0.131005f, +0.280617f,0.958078f,0.0577984f, +0.169552f,0.981657f,0.0871871f, +0.315169f,0.946806f,0.0650122f, +0.205308f,0.973708f,0.0986977f, +0.0950386f,0.972165f,0.214158f, +0.053629f,0.964124f,0.259978f, +-0.0859535f,0.951705f,0.294738f, +-0.0564482f,0.948883f,0.31054f, +0.154105f,0.958817f,0.238582f, +0.276457f,0.946116f,0.168629f, +0.211552f,0.972531f,0.0971047f, +0.294402f,0.951062f,0.0938527f, +0.390766f,0.916003f,0.0907783f, +0.406836f,0.907458f,0.104904f, +0.487803f,0.868421f,0.0888414f, +0.60401f,0.790886f,0.0983406f, +0.637938f,0.762279f,0.109387f, +0.4874f,0.873178f,0.00117935f, +0.336067f,0.93258f,-0.131735f, +0.229766f,0.943375f,-0.239272f, +0.152224f,0.966237f,-0.207882f, +0.121199f,0.969969f,-0.210883f, +0.121425f,0.965511f,-0.230314f, +0.0800447f,0.963578f,-0.255166f, +0.0996944f,0.981315f,-0.164563f, +0.0506382f,0.996401f,-0.0679735f, +-0.049503f,0.998346f,-0.0292297f, +0.050214f,0.998168f,0.0337586f, +0.113307f,0.993459f,0.014176f, +-0.000723347f,0.991208f,-0.132313f, +0.134265f,0.980729f,-0.141929f, +0.363008f,0.931437f,-0.0254801f, +-0.23486f,0.827656f,0.509732f, +-0.18483f,0.851106f,0.491383f, +-0.113579f,0.917253f,0.381767f, +-0.0885467f,0.926234f,0.366401f, +-0.119506f,0.895756f,0.428181f, +-0.107176f,0.917761f,0.382398f, +-0.0925542f,0.950614f,0.296253f, +-0.166069f,0.978511f,0.12222f, +-0.250375f,0.968134f,-0.00545859f, +-0.116612f,0.99254f,0.0355817f, +-0.0441586f,0.99869f,-0.0258397f, +0.0237183f,0.990591f,-0.134786f, +0.114156f,0.992737f,-0.0379611f, +0.0216237f,0.999568f,0.0199155f, +0.13918f,0.98521f,-0.0999564f, +0.240654f,0.960885f,-0.137059f, +0.249305f,0.964708f,-0.0847689f, +0.222546f,0.966381f,-0.128771f, +0.148234f,0.971026f,-0.187443f, +0.258813f,0.946284f,-0.193812f, +0.386195f,0.898799f,-0.207397f, +0.325896f,0.902531f,-0.281478f, +0.250321f,0.93543f,-0.249621f, +0.351402f,0.936022f,0.01949f, +0.42413f,0.889134f,0.171914f, +0.422963f,0.898638f,0.116411f, +0.393976f,0.918547f,0.0324739f, +0.283361f,0.957155f,-0.0596804f, +0.186222f,0.979389f,-0.0782236f, +0.100294f,0.99243f,-0.0708823f, +0.151138f,0.983442f,-0.0999959f, +0.115742f,0.982035f,-0.149033f, +0.0920961f,0.993962f,0.0596489f, +0.180728f,0.97583f,0.122852f, +0.267575f,0.959234f,0.0909572f, +0.204025f,0.959594f,0.193785f, +0.0830398f,0.98516f,0.150214f, +0.000808908f,0.987078f,0.160239f, +-0.115905f,0.961815f,0.247948f, +-0.0397732f,0.972025f,0.231484f, +0.185186f,0.964166f,0.189976f, +0.333936f,0.928543f,0.162155f, +0.358439f,0.932281f,0.0487095f, +0.30639f,0.946624f,-0.100142f, +0.389119f,0.921183f,-0.00273847f, +0.418957f,0.907889f,-0.0145855f, +0.498018f,0.86538f,-0.05563f, +0.565975f,0.823958f,-0.0276542f, +0.61235f,0.789736f,0.0366549f, +0.580326f,0.809292f,0.0909313f, +0.472624f,0.880866f,0.0264734f, +0.31167f,0.948991f,-0.0477351f, +0.149242f,0.981946f,-0.116226f, +0.114121f,0.974963f,-0.190851f, +0.0836789f,0.981905f,-0.169884f, +0.0779767f,0.990421f,-0.113957f, +0.0144442f,0.982901f,-0.183565f, +-0.021091f,0.988398f,-0.150415f, +-0.0454971f,0.990828f,-0.127242f, +-0.0180398f,0.984723f,-0.173189f, +0.129331f,0.988095f,-0.0833159f, +0.183553f,0.978578f,-0.0932403f, +0.123107f,0.958699f,-0.256402f, +0.189949f,0.953063f,-0.235775f, +-0.0544616f,0.84489f,0.53216f, +-0.0113297f,0.890886f,0.454085f, +-0.0462225f,0.938549f,0.342038f, +-0.128436f,0.915911f,0.380277f, +-0.159132f,0.90887f,0.385529f, +-0.0486608f,0.932565f,0.357708f, +0.0612592f,0.9505f,0.304627f, +0.0533898f,0.988914f,0.138559f, +-0.104607f,0.992177f,-0.0681298f, +-0.180998f,0.963403f,-0.197725f, +0.0184775f,0.993878f,-0.108929f, +-0.0166014f,0.988229f,-0.152078f, +-0.0077365f,0.996975f,-0.0773314f, +0.0579939f,0.995726f,-0.071872f, +0.284878f,0.950639f,-0.123003f, +0.233331f,0.946766f,-0.221789f, +0.274724f,0.943287f,-0.186374f, +0.284827f,0.926731f,-0.245036f, +0.143673f,0.947988f,-0.284037f, +0.183874f,0.951741f,-0.245725f, +0.373811f,0.924384f,-0.0760214f, +0.370847f,0.928183f,0.0307872f, +0.230777f,0.972874f,0.0160428f, +0.116854f,0.992434f,-0.0376857f, +0.311514f,0.945104f,0.0986779f, +0.493623f,0.85792f,0.14251f, +0.47336f,0.879733f,0.0447334f, +0.299829f,0.953139f,0.0403417f, +0.142324f,0.985386f,0.0935816f, +0.0780161f,0.991843f,0.100799f, +0.120483f,0.987279f,0.10375f, +0.113666f,0.977351f,0.178507f, +0.020827f,0.987302f,0.157484f, +0.18308f,0.973453f,0.137371f, +0.268344f,0.949436f,0.162981f, +0.178652f,0.97403f,0.139099f, +0.140521f,0.985536f,0.0947243f, +-0.0588959f,0.995353f,0.0761881f, +-0.17043f,0.974748f,0.144293f, +0.0194468f,0.992819f,0.118038f, +0.23167f,0.972512f,0.0234243f, +0.390625f,0.920274f,-0.0225152f, +0.45457f,0.886543f,-0.086066f, +0.307368f,0.941264f,-0.13981f, +0.289942f,0.953608f,-0.0810322f, +0.455218f,0.890309f,-0.0112281f, +0.513837f,0.856124f,-0.0549855f, +0.546925f,0.836241f,-0.0396788f, +0.583367f,0.812208f,-0.00110721f, +0.552934f,0.832422f,0.0365798f, +0.448406f,0.891004f,0.0710176f, +0.325547f,0.934833f,0.141795f, +0.239603f,0.963586f,0.118709f, +0.230453f,0.97295f,0.0160981f, +0.0486317f,0.9909f,-0.125509f, +0.0743177f,0.991871f,-0.103291f, +0.139517f,0.9837f,-0.11344f, +-0.0210587f,0.976395f,-0.214963f, +0.00854959f,0.97326f,-0.229548f, +0.0184659f,0.95097f,-0.308733f, +0.0120962f,0.95636f,-0.291939f, +0.153044f,0.979201f,-0.1332f, +0.190748f,0.981634f,-0.00308124f, +0.151842f,0.988041f,0.0268087f, +0.0319983f,0.964154f,0.263409f, +0.0761375f,0.979983f,0.183946f, +-0.0471561f,0.98918f,0.13892f, +-0.184804f,0.965808f,0.181831f, +-0.118202f,0.977652f,0.173852f, +-0.00263192f,0.986244f,0.165277f, +0.113935f,0.977488f,0.177586f, +0.213178f,0.965311f,0.150764f, +0.0917926f,0.995582f,-0.0197448f, +-0.112968f,0.973922f,-0.196759f, +-0.0750323f,0.977001f,-0.199598f, +0.0257774f,0.985322f,-0.168747f, +0.042721f,0.964979f,-0.258825f, +0.0821835f,0.934135f,-0.34733f, +0.254423f,0.923351f,-0.287563f, +0.255965f,0.951062f,-0.173101f, +0.240055f,0.959513f,-0.147338f, +0.319995f,0.939284f,-0.123892f, +0.15271f,0.974885f,-0.162111f, +0.132954f,0.978157f,-0.159787f, +0.156062f,0.978958f,-0.131476f, +0.237325f,0.969005f,0.0685979f, +0.280555f,0.951122f,0.129056f, +0.254605f,0.966124f,0.0421956f, +0.282663f,0.955227f,-0.087427f, +0.484968f,0.871846f,-0.0684877f, +0.483506f,0.87515f,-0.0182894f, +0.210764f,0.97671f,0.0402119f, +0.0804806f,0.985666f,0.148275f, +0.143859f,0.967897f,0.206108f, +0.0874346f,0.987357f,0.132215f, +0.0878227f,0.985433f,0.145635f, +0.118466f,0.990277f,0.0729134f, +0.170426f,0.983396f,-0.0623508f, +0.249461f,0.967984f,-0.0278496f, +0.240586f,0.970589f,0.00866192f, +0.158755f,0.987312f,0.00339798f, +-0.0496588f,0.997869f,0.0423253f, +-0.174436f,0.984473f,-0.0196346f, +0.0953847f,0.991998f,-0.0827112f, +0.301757f,0.941321f,-0.151184f, +0.416386f,0.897492f,-0.145363f, +0.439988f,0.889223f,-0.125274f, +0.313047f,0.948071f,-0.0562344f, +0.243151f,0.96888f,-0.0463665f, +0.428373f,0.903467f,-0.0156432f, +0.536849f,0.842847f,-0.0374461f, +0.521753f,0.850621f,-0.0649361f, +0.537565f,0.842885f,-0.02384f, +0.530522f,0.843125f,0.087673f, +0.408082f,0.90082f,0.148295f, +0.350282f,0.920762f,0.171756f, +0.275878f,0.960222f,0.0431791f, +0.279727f,0.959242f,0.0400889f, +0.199403f,0.977085f,0.0744484f, +0.0837631f,0.994427f,-0.0640234f, +0.142714f,0.98022f,-0.137117f, +0.0724844f,0.974795f,-0.211f, +0.0199047f,0.956284f,-0.29176f, +0.0419923f,0.973015f,-0.226887f, +-0.0571486f,0.988577f,-0.139464f, +-0.0620153f,0.996095f,-0.0628396f, +0.00941635f,0.995205f,0.097359f, +0.0452536f,0.980521f,0.191132f, +0.238692f,0.970551f,0.032497f, +0.18188f,0.979621f,-0.0852148f, +-0.0338772f,0.991689f,-0.124115f, +-0.215207f,0.972977f,-0.0836781f, +-0.127875f,0.990711f,-0.0462653f, +-0.0382254f,0.999079f,-0.0194842f, +0.0717625f,0.997386f,-0.00848587f, +0.235337f,0.971913f,0.00129577f, +0.258073f,0.965901f,-0.0208375f, +0.00563659f,0.988134f,-0.153488f, +-0.0963466f,0.971245f,-0.217715f, +0.0933449f,0.976181f,-0.19585f, +0.172697f,0.943118f,-0.284084f, +0.114064f,0.91464f,-0.387844f, +0.105309f,0.920749f,-0.375675f, +0.0952503f,0.976152f,-0.195075f, +0.198665f,0.977736f,-0.0675672f, +0.327274f,0.944589f,-0.0253815f, +0.185125f,0.982311f,-0.0281882f, +0.161734f,0.983206f,-0.0845435f, +0.135269f,0.981463f,-0.135765f, +0.160555f,0.98307f,-0.0882893f, +0.258909f,0.96483f,-0.0454967f, +0.342126f,0.938267f,0.0510447f, +0.36458f,0.930989f,-0.0184394f, +0.461971f,0.885156f,-0.0555142f, +0.401049f,0.915892f,-0.0173601f, +0.179695f,0.981649f,0.0638365f, +-0.0160491f,0.998918f,0.0436388f, +0.112643f,0.989219f,0.093583f, +0.158223f,0.986353f,0.0455405f, +0.150051f,0.988439f,-0.0217303f, +0.238384f,0.964999f,-0.10932f, +0.283357f,0.938433f,-0.197616f, +0.1814f,0.953903f,-0.239086f, +0.147672f,0.981223f,-0.124073f, +0.0988803f,0.99502f,-0.0125399f, +-0.0367309f,0.999167f,-0.0177995f, +-0.0641669f,0.988893f,-0.134067f, +0.155868f,0.964972f,-0.211032f, +0.311449f,0.929937f,-0.195488f, +0.363438f,0.913854f,-0.181064f, +0.379108f,0.919625f,-0.102794f, +0.251516f,0.967833f,-0.00624272f, +0.239964f,0.970767f,0.0053561f, +0.444229f,0.895407f,-0.0301255f, +0.561208f,0.823627f,-0.0817525f, +0.529532f,0.843694f,-0.0881851f, +0.463417f,0.885698f,-0.0280076f, +0.42264f,0.895689f,0.138263f, +0.360725f,0.902736f,0.234403f, +0.374064f,0.893088f,0.249939f, +0.398158f,0.891769f,0.214982f, +0.241834f,0.965676f,0.0947983f, +0.124224f,0.988267f,0.0888664f, +0.239364f,0.964398f,0.112437f, +0.252174f,0.966402f,-0.0497516f, +0.205848f,0.974166f,-0.0928869f, +0.0402048f,0.980488f,-0.192421f, +-0.109787f,0.981783f,-0.155076f, +-0.172809f,0.983136f,-0.0598348f, +-0.119927f,0.992756f,0.00723519f, +-0.0378691f,0.997707f,0.0560999f, +-0.018583f,0.999146f,0.0369096f, +0.311296f,0.946614f,-0.0837655f, +0.23235f,0.967065f,-0.103921f, +-0.0472012f,0.997512f,-0.0523709f, +-0.280913f,0.95942f,-0.0245033f, +-0.168558f,0.985462f,0.0212842f, +-0.0297654f,0.999551f,-0.00345095f, +0.14783f,0.984722f,-0.0920209f, +0.234818f,0.942556f,-0.23759f, +0.226f,0.954601f,-0.194065f, +0.0915505f,0.991576f,-0.0916283f, +-0.0384295f,0.986109f,-0.161594f, +0.0699749f,0.969463f,-0.235043f, +0.242042f,0.947128f,-0.210628f, +0.200696f,0.954776f,-0.21937f, +0.0684629f,0.960296f,-0.270452f, +-0.0178037f,0.955193f,-0.295449f, +0.106419f,0.956511f,-0.271592f, +0.250177f,0.956337f,-0.151101f, +0.206468f,0.977841f,-0.0346042f, +0.226301f,0.972897f,-0.047521f, +0.19172f,0.975927f,-0.103973f, +0.110286f,0.969903f,-0.217085f, +0.124805f,0.979571f,-0.157684f, +0.230362f,0.972377f,0.0376307f, +0.390327f,0.9143f,0.108165f, +0.486088f,0.869528f,0.0874049f, +0.355552f,0.931184f,0.0804947f, +0.162837f,0.968115f,0.190362f, +0.0587916f,0.990094f,0.127507f, +0.122084f,0.99234f,0.0189101f, +0.227899f,0.973107f,0.0335246f, +0.245712f,0.968327f,-0.0443735f, +0.235392f,0.962107f,-0.137626f, +0.299512f,0.953154f,0.0423112f, +0.158421f,0.985528f,0.0603087f, +0.0139537f,0.99778f,0.0651181f, +0.05695f,0.991196f,0.119526f, +0.0853993f,0.993434f,0.0761332f, +0.0800124f,0.992698f,-0.0902652f, +0.152744f,0.965412f,-0.211303f, +0.298303f,0.938225f,-0.175354f, +0.346617f,0.918158f,-0.191946f, +0.306791f,0.939305f,-0.153575f, +0.213668f,0.966817f,-0.140039f, +0.269123f,0.94608f,-0.180294f, +0.462084f,0.866259f,-0.189928f, +0.547323f,0.828917f,-0.11547f, +0.492713f,0.870051f,0.0156307f, +0.377637f,0.925543f,0.0275792f, +0.309374f,0.94993f,0.0438272f, +0.339128f,0.933648f,0.115296f, +0.355844f,0.92275f,0.148012f, +0.387104f,0.898496f,0.207015f, +0.394935f,0.895155f,0.206698f, +0.187014f,0.981688f,0.0362499f, +0.286474f,0.957988f,0.0138101f, +0.315633f,0.944806f,-0.0878444f, +0.189054f,0.976628f,-0.102261f, +0.071001f,0.995263f,-0.066411f, +-0.121993f,0.990638f,-0.0612738f, +-0.195423f,0.978588f,-0.0646113f, +-0.134933f,0.988908f,-0.0620808f, +-0.0362027f,0.9885f,-0.146822f, +0.0247852f,0.975168f,-0.220074f, +0.236634f,0.970435f,-0.0475491f, +0.163622f,0.985347f,0.0481553f, +-0.110204f,0.98299f,0.146921f, +-0.274076f,0.953125f,0.128197f, +-0.127913f,0.990913f,0.0415925f, +0.0693505f,0.994264f,-0.081428f, +0.246728f,0.957329f,-0.15049f, +0.356012f,0.927656f,-0.112735f, +0.108926f,0.979602f,-0.168863f, +-0.0117435f,0.995074f,-0.0984399f, +0.0591802f,0.992813f,-0.104017f, +0.152983f,0.961405f,-0.228683f, +0.199436f,0.939216f,-0.279462f, +0.158919f,0.956661f,-0.244017f, +0.142246f,0.964436f,-0.222776f, +0.0928224f,0.948092f,-0.304146f, +0.072096f,0.927878f,-0.365849f, +0.0949024f,0.954182f,-0.28378f, +0.0839904f,0.981792f,-0.17038f, +0.207123f,0.975655f,-0.0720922f, +0.306863f,0.948734f,-0.075756f, +0.227677f,0.946857f,-0.22721f, +0.0209281f,0.957849f,-0.28651f, +0.0889558f,0.973432f,-0.210993f, +0.377519f,0.908654f,-0.178401f, +0.444767f,0.867771f,-0.22171f, +0.296477f,0.952876f,-0.0642486f, +0.049587f,0.998699f,0.0118749f, +0.185088f,0.975344f,0.120192f, +0.179316f,0.983776f,0.00553586f, +0.203508f,0.978758f,-0.0248474f, +0.30632f,0.951877f,-0.00993344f, +0.182507f,0.983075f,0.0159703f, +0.0804506f,0.991985f,0.0974322f, +0.170994f,0.963788f,0.204629f, +0.0962731f,0.986887f,0.12956f, +0.097797f,0.995201f,0.00337759f, +0.147003f,0.987459f,-0.0575677f, +0.218112f,0.972969f,-0.0758899f, +0.244949f,0.956598f,-0.157862f, +0.315584f,0.924587f,-0.213415f, +0.352441f,0.893692f,-0.277668f, +0.28482f,0.905458f,-0.31468f, +0.265138f,0.910445f,-0.317477f, +0.308383f,0.884493f,-0.350102f, +0.390084f,0.870652f,-0.299665f, +0.373263f,0.922794f,-0.0955261f, +0.378781f,0.918384f,0.114439f, +0.476669f,0.866105f,0.150494f, +0.353048f,0.93424f,-0.0505168f, +0.309942f,0.946077f,-0.0942048f, +0.298518f,0.948219f,-0.108479f, +0.350416f,0.935917f,-0.0356219f, +0.447907f,0.893892f,-0.0183155f, +0.280155f,0.95286f,-0.116492f, +0.270748f,0.951225f,-0.147871f, +0.374052f,0.922269f,-0.0974917f, +0.176754f,0.980223f,-0.0889943f, +0.0634799f,0.992926f,-0.100339f, +-0.11806f,0.977045f,-0.177329f, +-0.199746f,0.955239f,-0.218219f, +-0.0812223f,0.969857f,-0.229739f, +0.130179f,0.951543f,-0.278602f, +0.200559f,0.919086f,-0.339202f, +0.0174361f,0.999489f,0.0268061f, +0.0105554f,0.991703f,0.128113f, +-0.141198f,0.973013f,0.182506f, +-0.142313f,0.985833f,0.0887713f, +0.00597934f,0.99465f,-0.103131f, +0.213448f,0.959986f,-0.181295f, +0.150446f,0.953754f,-0.260228f, +0.244008f,0.968351f,-0.0525036f, +0.184758f,0.982743f,0.00893989f, +-0.00567918f,0.992902f,-0.118797f, +0.138037f,0.98016f,-0.142241f, +0.21929f,0.962205f,-0.16147f, +0.269703f,0.95408f,-0.13035f, +0.150911f,0.956731f,-0.24878f, +0.180021f,0.944452f,-0.27496f, +0.119147f,0.92214f,-0.368051f, +0.0669033f,0.930661f,-0.359714f, +-0.0113587f,0.942765f,-0.333265f, +0.0142182f,0.972628f,-0.231934f, +0.163413f,0.959027f,-0.231437f, +0.324001f,0.919871f,-0.221046f, +0.291919f,0.93701f,-0.19182f, +0.107512f,0.968299f,-0.225473f, +0.0749887f,0.923898f,-0.375218f, +0.415609f,0.849812f,-0.324172f, +0.314994f,0.92041f,-0.231569f, +0.136459f,0.990645f,0.000905767f, +0.00734966f,0.998995f,0.0442195f, +0.0805668f,0.996634f,0.0151596f, +0.266119f,0.962333f,0.0556322f, +0.269187f,0.962624f,-0.0298845f, +0.209195f,0.975524f,-0.0677535f, +0.153299f,0.985902f,0.0670637f, +0.0587395f,0.996349f,0.0619523f, +0.20348f,0.97612f,0.0760684f, +0.225978f,0.971688f,-0.0689656f, +0.204562f,0.957442f,-0.203617f, +0.164418f,0.955123f,-0.246386f, +0.1725f,0.961839f,-0.212392f, +0.288653f,0.947463f,-0.137816f, +0.355829f,0.918236f,-0.173863f, +0.453757f,0.873536f,-0.176182f, +0.355645f,0.881401f,-0.310884f, +0.238917f,0.864251f,-0.442706f, +0.251593f,0.863453f,-0.437206f, +0.231383f,0.92049f,-0.314896f, +0.219172f,0.968344f,-0.119471f, +0.254773f,0.966196f,-0.0394394f, +0.482542f,0.873342f,0.0665443f, +0.470019f,0.880685f,0.0589576f, +0.359563f,0.932576f,-0.0318683f, +0.336062f,0.937393f,-0.0914179f, +0.320744f,0.932455f,-0.166285f, +0.428106f,0.887361f,-0.171217f, +0.372336f,0.918652f,-0.132074f, +0.247289f,0.941171f,-0.230314f, +0.287477f,0.950239f,-0.120008f, +0.121799f,0.989487f,-0.0779795f, +0.132326f,0.991166f,-0.00888466f, +-0.00459516f,0.997934f,-0.0640824f, +-0.0924696f,0.984613f,-0.148277f, +-0.0479758f,0.968834f,-0.243019f, +0.052427f,0.976364f,-0.209677f, +0.223214f,0.97397f,-0.0394671f, +0.0112214f,0.972418f,0.232975f, +0.0106355f,0.967748f,0.251694f, +-0.0743183f,0.979789f,0.185717f, +0.0581795f,0.9982f,0.01459f, +0.133434f,0.964693f,-0.227076f, +0.215981f,0.948544f,-0.231554f, +0.137408f,0.968029f,-0.209856f, +0.0442022f,0.987042f,-0.154256f, +0.228305f,0.972284f,0.0504f, +0.121617f,0.992241f,-0.0258404f, +0.134527f,0.985242f,-0.105833f, +0.151618f,0.980953f,-0.121423f, +0.275183f,0.956894f,-0.092891f, +0.263324f,0.945384f,-0.192117f, +0.25647f,0.929449f,-0.26523f, +0.21073f,0.904026f,-0.371926f, +0.0728135f,0.89169f,-0.446751f, +-0.0691284f,0.877831f,-0.473955f, +-0.019884f,0.913569f,-0.406197f, +0.178205f,0.891525f,-0.416444f, +0.263993f,0.900279f,-0.34613f, +0.210305f,0.939702f,-0.269689f, +0.208408f,0.948624f,-0.238074f, +0.229275f,0.910156f,-0.345036f, +0.227512f,0.924458f,-0.305966f, +0.142229f,0.989234f,0.0344507f, +-0.0464441f,0.986357f,0.157934f, +0.073391f,0.981122f,0.178921f, +0.158555f,0.984472f,0.0753311f, +0.265489f,0.961878f,0.0656237f, +0.318063f,0.94383f,0.0895592f, +0.229589f,0.973115f,0.0183382f, +0.0918017f,0.995548f,-0.0213497f, +0.0710209f,0.997458f,0.00582691f, +0.234172f,0.971044f,-0.0473045f, +0.373198f,0.918081f,-0.133603f, +0.27855f,0.93462f,-0.221124f, +0.174681f,0.94082f,-0.290421f, +0.0816739f,0.936818f,-0.34015f, +0.233666f,0.948403f,-0.214319f, +0.373882f,0.91082f,-0.174984f, +0.44036f,0.88198f,-0.16791f, +0.496092f,0.86017f,-0.118324f, +0.420226f,0.875748f,-0.237645f, +0.228936f,0.896528f,-0.379243f, +0.0594423f,0.913794f,-0.401806f, +0.0971839f,0.949435f,-0.298544f, +0.201575f,0.953775f,-0.222894f, +0.339139f,0.935667f,-0.0975326f, +0.471026f,0.864094f,0.177416f, +0.409402f,0.896788f,0.167814f, +0.414181f,0.90532f,0.0940739f, +0.426161f,0.903473f,-0.0460849f, +0.431652f,0.886771f,-0.165266f, +0.36903f,0.909898f,-0.189479f, +0.237762f,0.950577f,-0.199683f, +0.250405f,0.963718f,-0.0924377f, +0.100123f,0.989034f,-0.108572f, +0.0410755f,0.997876f,-0.0505615f, +0.0233843f,0.999496f,0.0214792f, +-0.0536722f,0.998467f,-0.0135057f, +0.00107433f,0.999993f,-0.00356525f, +-0.0705196f,0.996911f,-0.0345704f, +-0.0688919f,0.997514f,0.0148223f, +-0.0812179f,0.983535f,0.161436f, +-0.0138011f,0.988231f,0.152344f, +0.0655184f,0.995642f,0.0663652f, +0.220598f,0.973784f,-0.0554998f, +0.309629f,0.942731f,-0.124049f, +0.155774f,0.947975f,-0.27763f, +0.127196f,0.974249f,-0.186174f, +-0.058769f,0.981296f,-0.183314f, +0.0497615f,0.99612f,-0.0725919f, +0.182926f,0.98205f,0.0460018f, +0.19209f,0.981195f,-0.0189005f, +0.224403f,0.972569f,-0.0612647f, +0.315645f,0.941316f,-0.119552f, +0.360736f,0.920207f,-0.151949f, +0.310465f,0.916626f,-0.251809f, +0.327403f,0.899549f,-0.28917f, +0.161725f,0.896729f,-0.411973f, +-0.0141039f,0.865769f,-0.500245f, +-0.0292484f,0.82172f,-0.56914f, +0.0961328f,0.815723f,-0.570398f, +0.101793f,0.868026f,-0.485972f, +0.156302f,0.922247f,-0.353597f, +0.205267f,0.935719f,-0.286871f, +0.229076f,0.948515f,-0.218729f, +0.0347356f,0.987904f,-0.151126f, +-0.079026f,0.996018f,0.0412683f, +-0.00943989f,0.997185f,0.0743796f, +0.111542f,0.993598f,-0.0179121f, +0.186771f,0.982172f,0.0213291f, +0.207496f,0.975443f,0.0738717f, +0.321818f,0.944637f,0.0639911f, +0.281397f,0.958917f,0.0359716f, +0.126766f,0.988281f,0.0850327f, +0.0940702f,0.995531f,0.0082479f, +0.338235f,0.93955f,-0.0533163f, +0.410978f,0.899199f,-0.150126f, +0.338008f,0.912085f,-0.232059f, +0.265939f,0.902685f,-0.338284f, +0.120839f,0.912428f,-0.39099f, +0.0943411f,0.91428f,-0.393944f, +0.326367f,0.911608f,-0.24991f, +0.410002f,0.90171f,-0.137175f, +0.446036f,0.89335f,-0.054576f, +0.453415f,0.890674f,0.0333893f, +0.369882f,0.926554f,0.0684487f, +0.15305f,0.985829f,-0.0686756f, +0.0307343f,0.980172f,-0.195752f, +0.104404f,0.981192f,-0.162361f, +0.153412f,0.984343f,-0.086793f, +0.259868f,0.962798f,0.0740869f, +0.405239f,0.886729f,0.222469f, +0.507863f,0.829218f,0.233395f, +0.530784f,0.842353f,0.0933228f, +0.515092f,0.857118f,0.0053912f, +0.421652f,0.904509f,-0.0638277f, +0.186762f,0.968676f,-0.16367f, +0.141357f,0.986443f,-0.0833539f, +0.10637f,0.994244f,0.0127965f, +-0.010764f,0.999348f,-0.0344492f, +-0.00443345f,0.999867f,-0.0156939f, +-0.0569297f,0.998142f,0.0217125f, +-0.0108274f,0.998516f,0.0533776f, +-0.0518054f,0.997615f,0.0456197f, +-0.08879f,0.991878f,0.0910736f, +0.15627f,0.9777f,0.14029f, +0.127078f,0.991794f,-0.0140045f, +0.182153f,0.975854f,-0.12054f, +0.236919f,0.957374f,-0.165238f, +0.354425f,0.924081f,-0.143031f, +0.22947f,0.95204f,-0.202395f, +0.0414456f,0.986576f,-0.157956f, +-0.0334694f,0.988237f,-0.149222f, +-0.0516418f,0.976013f,-0.2115f, +0.149794f,0.980531f,-0.126967f, +0.232135f,0.958309f,-0.166606f, +0.253821f,0.951991f,-0.171138f, +0.306434f,0.927336f,-0.214818f, +0.397399f,0.902704f,-0.164923f, +0.371523f,0.904625f,-0.208864f, +0.394746f,0.892045f,-0.220071f, +0.272791f,0.90211f,-0.334339f, +0.143123f,0.890975f,-0.430905f, +0.0302622f,0.843122f,-0.53687f, +0.0628652f,0.888185f,-0.455165f, +0.00848379f,0.914478f,-0.404546f, +0.009201f,0.926788f,-0.375473f, +0.0671766f,0.952807f,-0.296052f, +0.132209f,0.974746f,-0.179973f, +-0.0203291f,0.99362f,-0.110936f, +-0.138553f,0.985569f,-0.0972441f, +0.0605753f,0.989699f,-0.129717f, +0.0968295f,0.980926f,-0.168548f, +0.0979519f,0.993956f,-0.0495753f, +0.201443f,0.976928f,-0.0709446f, +0.381986f,0.916436f,-0.119294f, +0.157625f,0.97891f,-0.12996f, +0.10065f,0.993729f,0.0486956f, +0.194299f,0.980695f,-0.0220253f, +0.364962f,0.929379f,-0.0552881f, +0.487949f,0.871552f,-0.0479875f, +0.462417f,0.883871f,-0.0702998f, +0.341292f,0.927621f,-0.151788f, +0.13195f,0.962323f,-0.237746f, +0.0784249f,0.961522f,-0.263298f, +0.155522f,0.961843f,-0.225101f, +0.275269f,0.959916f,-0.0528088f, +0.354301f,0.927858f,0.116403f, +0.359914f,0.906647f,0.22012f, +0.307706f,0.904557f,0.295117f, +0.281691f,0.897787f,0.338569f, +0.169122f,0.964903f,0.200898f, +0.116857f,0.992098f,0.045666f, +0.131422f,0.991068f,-0.0226175f, +0.19688f,0.980005f,-0.0287978f, +0.332698f,0.942383f,-0.0350149f, +0.49437f,0.868541f,-0.0351363f, +0.591151f,0.806162f,-0.0253575f, +0.528595f,0.848271f,-0.0319893f, +0.452945f,0.891538f,3.96151e-005f, +0.269718f,0.962267f,0.0359679f, +0.0172075f,0.99965f,0.0201157f, +0.0836306f,0.98488f,0.151715f, +0.0817519f,0.992549f,0.0903531f, +-0.0289252f,0.999464f,0.015311f, +-0.0977995f,0.99488f,0.0254794f, +-0.0368101f,0.998502f,0.0404932f, +-0.0917396f,0.988968f,0.116306f, +-0.19824f,0.961924f,0.188156f, +0.355147f,0.931267f,-0.0813196f, +0.261709f,0.946669f,-0.187953f, +0.187089f,0.954576f,-0.23191f, +0.281523f,0.925027f,-0.255086f, +0.340665f,0.862289f,-0.374707f, +0.168991f,0.920317f,-0.352786f, +-0.0114217f,0.969014f,-0.246743f, +0.0275027f,0.971061f,-0.237244f, +0.0127748f,0.945787f,-0.324537f, +0.106685f,0.927276f,-0.358857f, +0.242554f,0.910981f,-0.333589f, +0.254201f,0.919334f,-0.300346f, +0.319051f,0.907348f,-0.273727f, +0.384836f,0.892504f,-0.235241f, +0.359386f,0.889916f,-0.280877f, +0.418755f,0.87516f,-0.242361f, +0.378513f,0.873068f,-0.307377f, +0.247447f,0.872868f,-0.420561f, +0.0334574f,0.868028f,-0.495387f, +-0.104393f,0.897693f,-0.428077f, +-0.0466408f,0.949283f,-0.310944f, +0.00907853f,0.960916f,-0.276691f, +0.00868667f,0.966036f,-0.258261f, +0.0845957f,0.976098f,-0.200192f, +-0.0296926f,0.969375f,-0.243785f, +-0.104852f,0.955765f,-0.274807f, +0.0855702f,0.957819f,-0.274336f, +0.0411396f,0.961225f,-0.272681f, +0.0481708f,0.973933f,-0.221661f, +0.28909f,0.93695f,-0.196346f, +0.356766f,0.919532f,-0.164859f, +0.126757f,0.9882f,-0.0859897f, +0.0144124f,0.990867f,-0.134068f, +0.233251f,0.969449f,-0.075909f, +0.354937f,0.93426f,-0.034317f, +0.469402f,0.882971f,-0.00493066f, +0.398385f,0.917184f,-0.00790304f, +0.386606f,0.918227f,0.0859925f, +0.228789f,0.970147f,0.0804364f, +0.115903f,0.993259f,0.0019484f, +0.110471f,0.992802f,-0.0462595f, +0.159257f,0.98723f,-0.00373461f, +0.193831f,0.979844f,0.0483161f, +0.304703f,0.938233f,0.163935f, +0.27363f,0.944953f,0.179417f, +0.268196f,0.936861f,0.224416f, +0.306571f,0.922686f,0.233806f, +0.304362f,0.944561f,0.123164f, +0.226364f,0.97021f,-0.0863264f, +0.198019f,0.963611f,-0.179562f, +0.39862f,0.902547f,-0.162819f, +0.534677f,0.804719f,-0.257967f, +0.537872f,0.788638f,-0.297899f, +0.486148f,0.837034f,-0.251066f, +0.374822f,0.901369f,-0.216893f, +0.171725f,0.976903f,-0.127168f, +-0.0108013f,0.999941f,-0.00151679f, +0.0247265f,0.999687f,-0.00377037f, +0.135958f,0.990654f,0.0109791f, +-0.00717425f,0.999252f,0.0379956f, +-0.0710711f,0.991911f,0.105175f, +-0.0859239f,0.990395f,0.108328f, +-0.18335f,0.97033f,0.157612f, +-0.315275f,0.941315f,0.120535f, +0.340669f,0.883831f,-0.320605f, +0.289176f,0.886429f,-0.361416f, +0.20883f,0.874721f,-0.437325f, +0.364068f,0.812937f,-0.454519f, +0.367133f,0.769647f,-0.522357f, +0.0748495f,0.818621f,-0.569436f, +-0.0872921f,0.835085f,-0.543151f, +0.00846427f,0.872897f,-0.48783f, +0.114223f,0.886407f,-0.448593f, +0.0920189f,0.872463f,-0.479939f, +0.2125f,0.893929f,-0.394633f, +0.175058f,0.869572f,-0.461735f, +0.23988f,0.874417f,-0.421725f, +0.3397f,0.869601f,-0.358326f, +0.392151f,0.874231f,-0.286248f, +0.401032f,0.871377f,-0.282622f, +0.447169f,0.847971f,-0.28458f, +0.337548f,0.868339f,-0.363386f, +0.0674983f,0.896564f,-0.437742f, +-0.167145f,0.867884f,-0.467804f, +-0.130341f,0.888597f,-0.43978f, +-0.0513088f,0.927515f,-0.370248f, +-0.0499693f,0.955154f,-0.291861f, +0.0619562f,0.966501f,-0.249073f, +0.104114f,0.952328f,-0.28676f, +-0.0782617f,0.904542f,-0.419141f, +0.00654125f,0.918336f,-0.395747f, +0.0825819f,0.944757f,-0.317199f, +0.028702f,0.9283f,-0.370722f, +0.170752f,0.927761f,-0.331819f, +0.188742f,0.965638f,-0.178664f, +0.126613f,0.983535f,0.12895f, +0.0677004f,0.989289f,0.129321f, +0.179931f,0.977134f,0.113286f, +0.301628f,0.94869f,0.0949132f, +0.473083f,0.874439f,0.107469f, +0.430087f,0.900068f,0.0700241f, +0.294529f,0.954232f,0.0519033f, +0.218538f,0.963065f,0.157309f, +0.194139f,0.967934f,0.159416f, +0.193754f,0.980213f,0.0405318f, +0.162395f,0.97825f,-0.129057f, +0.175319f,0.968352f,-0.177646f, +0.248014f,0.960103f,-0.129196f, +0.28568f,0.95369f,-0.0941428f, +0.21993f,0.968315f,-0.118312f, +0.322085f,0.944206f,-0.068818f, +0.382868f,0.918715f,-0.0968289f, +0.390317f,0.908769f,-0.147618f, +0.269935f,0.914207f,-0.30226f, +0.374262f,0.856519f,-0.355391f, +0.561588f,0.771614f,-0.298716f, +0.563679f,0.781086f,-0.268646f, +0.435393f,0.841674f,-0.319402f, +0.305805f,0.901875f,-0.305133f, +0.0714141f,0.973517f,-0.217175f, +-0.0655193f,0.984454f,-0.162963f, +0.0352485f,0.985949f,-0.163286f, +0.0657594f,0.9937f,-0.0907542f, +-0.080707f,0.996331f,0.0284757f, +-0.168129f,0.985261f,0.0315202f, +-0.129479f,0.990858f,0.0378905f, +-0.12231f,0.991737f,0.0387141f, +-0.178343f,0.98279f,-0.0481504f, +0.273318f,0.858026f,-0.434843f, +0.385091f,0.836836f,-0.389114f, +0.340339f,0.786413f,-0.515483f, +0.318221f,0.733035f,-0.601161f, +0.367621f,0.755443f,-0.542366f, +0.119455f,0.799665f,-0.588444f, +-0.0802011f,0.78091f,-0.619473f, +-0.0688818f,0.778398f,-0.623981f, +0.0140135f,0.818686f,-0.574071f, +0.0274992f,0.866697f,-0.498077f, +0.177071f,0.88196f,-0.436797f, +0.265217f,0.852958f,-0.449581f, +0.257768f,0.854407f,-0.45116f, +0.248846f,0.837431f,-0.486605f, +0.267639f,0.861569f,-0.431356f, +0.378672f,0.856274f,-0.351288f, +0.453357f,0.836299f,-0.308337f, +0.386424f,0.863215f,-0.324865f, +0.128686f,0.904609f,-0.406352f, +-0.130252f,0.895612f,-0.425338f, +-0.18148f,0.896143f,-0.40496f, +-0.161324f,0.928509f,-0.334435f, +-0.0897102f,0.95467f,-0.283825f, +0.0454642f,0.942898f,-0.329963f, +0.150896f,0.947175f,-0.283f, +0.0358472f,0.960013f,-0.277651f, +-0.0385071f,0.932002f,-0.360402f, +0.0386813f,0.938718f,-0.342507f, +0.0283698f,0.934985f,-0.353551f, +0.108122f,0.956069f,-0.272473f, +0.00374271f,0.987226f,-0.159284f, +-0.196358f,0.979545f,-0.0439957f, +-0.00408304f,0.984849f,0.173364f, +0.19648f,0.945984f,0.257896f, +0.360526f,0.896905f,0.256092f, +0.497904f,0.850304f,0.170515f, +0.432778f,0.894142f,0.114953f, +0.285493f,0.945844f,0.154508f, +0.185631f,0.971794f,0.145459f, +0.230083f,0.969236f,0.0874248f, +0.368311f,0.929659f,-0.00905859f, +0.334163f,0.916764f,-0.218814f, +0.186339f,0.940464f,-0.284262f, +0.166871f,0.945707f,-0.278912f, +0.282007f,0.937612f,-0.20336f, +0.24104f,0.942322f,-0.232226f, +0.269154f,0.937876f,-0.218962f, +0.376707f,0.923358f,-0.0741695f, +0.419282f,0.907855f,0.00132882f, +0.443207f,0.893334f,-0.0743096f, +0.437794f,0.862232f,-0.254741f, +0.526311f,0.818963f,-0.228685f, +0.539618f,0.818293f,-0.198015f, +0.495179f,0.844909f,-0.202303f, +0.231134f,0.928947f,-0.289195f, +-0.0315579f,0.980647f,-0.193222f, +-0.0610949f,0.990009f,-0.12708f, +-0.0213691f,0.991115f,-0.131279f, +-0.0564833f,0.997988f,-0.0288065f, +-0.126885f,0.991868f,-0.0099403f, +-0.0683923f,0.994887f,-0.0743097f, +-0.0443491f,0.981445f,-0.186542f, +-0.106156f,0.962217f,-0.250737f, +-0.0540242f,0.978674f,-0.198191f, +0.194886f,0.824241f,-0.531645f, +0.320074f,0.809438f,-0.492303f, +0.464438f,0.773143f,-0.431911f, +0.405677f,0.746051f,-0.528047f, +0.305674f,0.751501f,-0.584645f, +0.130892f,0.809782f,-0.571944f, +-0.0644176f,0.819769f,-0.56906f, +-0.0714323f,0.833301f,-0.548185f, +-0.0643631f,0.853923f,-0.516404f, +-0.0107306f,0.851684f,-0.523946f, +0.13746f,0.827954f,-0.543688f, +0.198685f,0.868523f,-0.454084f, +0.246871f,0.881894f,-0.401644f, +0.296117f,0.852853f,-0.430066f, +0.256816f,0.850031f,-0.459883f, +0.314177f,0.830121f,-0.460643f, +0.37334f,0.830673f,-0.413038f, +0.413553f,0.857071f,-0.30725f, +0.158679f,0.931259f,-0.327989f, +-0.130088f,0.933779f,-0.333368f, +-0.259668f,0.892475f,-0.368866f, +-0.237565f,0.924215f,-0.298981f, +-0.0871208f,0.968004f,-0.235327f, +0.0797031f,0.982117f,-0.17057f, +0.0461708f,0.99392f,-0.0999594f, +0.0445161f,0.998669f,-0.0260401f, +0.0420509f,0.9919f,-0.119856f, +0.0652827f,0.976809f,-0.203917f, +0.0163117f,0.980129f,-0.197692f, +-0.0727832f,0.991022f,-0.112154f, +-0.0519999f,0.997388f,0.0501216f, +-0.215497f,0.976498f,0.00360735f, +-0.144793f,0.989191f,0.023161f, +0.11495f,0.986032f,0.120527f, +0.332155f,0.934954f,0.124633f, +0.520936f,0.843883f,0.128405f, +0.426058f,0.883139f,0.196317f, +0.297882f,0.930389f,0.213643f, +0.255462f,0.962333f,0.0930293f, +0.330201f,0.94382f,-0.0130553f, +0.464814f,0.88236f,-0.0734001f, +0.396624f,0.912293f,-0.10203f, +0.190826f,0.974675f,-0.116592f, +0.186045f,0.970537f,-0.153119f, +0.228366f,0.951236f,-0.207361f, +0.252282f,0.958154f,-0.135261f, +0.163352f,0.984522f,-0.0635096f, +0.214627f,0.974395f,0.066997f, +0.385854f,0.917468f,0.096793f, +0.519216f,0.853803f,0.0378886f, +0.535665f,0.843867f,-0.0308472f, +0.541689f,0.838373f,-0.060851f, +0.563197f,0.822059f,-0.0838289f, +0.51966f,0.848391f,-0.100928f, +0.236369f,0.967062f,-0.0944536f, +-0.111969f,0.993037f,-0.0366171f, +-0.0968965f,0.995233f,-0.011032f, +-0.0970566f,0.995182f,0.013894f, +-0.0559363f,0.991458f,0.117821f, +-0.00538008f,0.999824f,-0.0179674f, +0.0108998f,0.982438f,-0.186268f, +0.0427996f,0.970253f,-0.238279f, +-0.10823f,0.95386f,-0.280066f, +-0.196538f,0.942983f,-0.26862f, +0.307908f,0.814842f,-0.491147f, +0.299308f,0.78907f,-0.536455f, +0.435133f,0.777699f,-0.453699f, +0.495126f,0.764316f,-0.413124f, +0.362871f,0.81835f,-0.445676f, +0.0803271f,0.871076f,-0.484534f, +-0.110099f,0.885293f,-0.451812f, +-0.149245f,0.895891f,-0.418456f, +-0.0670569f,0.907151f,-0.415428f, +0.0527044f,0.88691f,-0.458926f, +0.100471f,0.888224f,-0.448291f, +0.121208f,0.922825f,-0.365653f, +0.249787f,0.879883f,-0.404243f, +0.334334f,0.839973f,-0.427396f, +0.283757f,0.852792f,-0.438437f, +0.337422f,0.812854f,-0.474778f, +0.291967f,0.807546f,-0.512469f, +0.269633f,0.862064f,-0.429119f, +0.108203f,0.943068f,-0.314506f, +-0.121343f,0.966872f,-0.224575f, +-0.202731f,0.95836f,-0.201115f, +-0.275106f,0.928104f,-0.25088f, +-0.220959f,0.943196f,-0.248108f, +-0.0845259f,0.990859f,-0.105139f, +-0.0183112f,0.999824f,0.00404228f, +0.0398541f,0.999205f,-0.000234289f, +0.144105f,0.989245f,0.0250549f, +0.0887732f,0.994681f,0.052239f, +-0.0385311f,0.993554f,0.106613f, +-0.141743f,0.984863f,0.099766f, +-0.130913f,0.987043f,0.0927824f, +-0.138468f,0.982136f,0.12742f, +-0.181593f,0.983362f,-0.00473479f, +0.124018f,0.991703f,-0.0338209f, +0.350394f,0.929846f,-0.112294f, +0.471172f,0.881999f,-0.00866642f, +0.362692f,0.927143f,0.0941279f, +0.321547f,0.934446f,0.153031f, +0.39706f,0.903274f,0.162601f, +0.408629f,0.910814f,0.0586596f, +0.440544f,0.897708f,-0.00641084f, +0.417743f,0.90832f,0.0210971f, +0.223429f,0.972702f,-0.0626924f, +0.239878f,0.966667f,-0.0895152f, +0.326998f,0.934073f,-0.143454f, +0.0984577f,0.955256f,-0.278913f, +0.055814f,0.995135f,-0.081185f, +0.198837f,0.979583f,-0.0296926f, +0.452343f,0.887429f,-0.0886289f, +0.538988f,0.831253f,-0.136052f, +0.534759f,0.840783f,-0.084361f, +0.557911f,0.827063f,-0.0685738f, +0.570718f,0.812258f,-0.120488f, +0.469437f,0.877038f,-0.102147f, +0.179725f,0.982175f,0.0550563f, +-0.143773f,0.988083f,0.054972f, +-0.0900032f,0.995941f,-0.00107895f, +-0.112639f,0.992937f,-0.0372634f, +-0.0770822f,0.995012f,-0.0633234f, +0.131283f,0.990073f,-0.0501953f, +0.151552f,0.985928f,-0.0705498f, +0.0547644f,0.990744f,-0.124209f, +-0.0889999f,0.992043f,-0.0890439f, +-0.225525f,0.966809f,-0.120075f, +0.367815f,0.812209f,-0.4528f, +0.333749f,0.806687f,-0.487716f, +0.350467f,0.776679f,-0.523395f, +0.428661f,0.776887f,-0.461189f, +0.344028f,0.851962f,-0.394722f, +0.0917588f,0.929121f,-0.35821f, +-0.151193f,0.922445f,-0.355297f, +-0.135334f,0.926245f,-0.351788f, +-0.0236046f,0.919658f,-0.39201f, +0.0475929f,0.924342f,-0.378586f, +0.0534474f,0.931533f,-0.359707f, +0.122967f,0.908442f,-0.399514f, +0.333531f,0.836829f,-0.434137f, +0.345062f,0.821786f,-0.45343f, +0.298405f,0.81077f,-0.503594f, +0.369796f,0.765054f,-0.527202f, +0.289381f,0.806079f,-0.516232f, +0.106326f,0.866117f,-0.488402f, +-0.0247184f,0.959589f,-0.280318f, +-0.247885f,0.952117f,-0.178958f, +-0.233969f,0.968302f,-0.0874651f, +-0.230973f,0.963517f,-0.135224f, +-0.23946f,0.950685f,-0.197121f, +-0.148981f,0.968772f,-0.198205f, +-0.0244446f,0.976892f,-0.212332f, +0.0214143f,0.979888f,-0.198397f, +0.0179015f,0.996249f,-0.084666f, +-0.0584671f,0.995927f,0.0686411f, +-0.0472317f,0.986168f,0.158874f, +-0.0434315f,0.994906f,0.0909663f, +-0.106857f,0.994237f,0.00858694f, +-0.103595f,0.993848f,-0.0391609f, +-0.0110181f,0.988269f,-0.152323f, +0.194953f,0.947451f,-0.253632f, +0.318956f,0.92262f,-0.216885f, +0.355303f,0.928796f,-0.105349f, +0.319482f,0.947371f,-0.0204796f, +0.274811f,0.961125f,0.0267891f, +0.33758f,0.938163f,0.0767414f, +0.445225f,0.885597f,0.132261f, +0.483843f,0.868855f,0.104815f, +0.473616f,0.877987f,0.069475f, +0.358094f,0.929841f,-0.0846442f, +0.209896f,0.940516f,-0.267156f, +0.398687f,0.89746f,-0.188715f, +0.164362f,0.933368f,-0.319075f, +-0.0806345f,0.937721f,-0.337901f, +0.19678f,0.945117f,-0.26083f, +0.467829f,0.857531f,-0.213953f, +0.522616f,0.828828f,-0.199792f, +0.48751f,0.848849f,-0.204424f, +0.559553f,0.806974f,-0.18893f, +0.585339f,0.775984f,-0.235006f, +0.309037f,0.923705f,-0.22642f, +0.0763335f,0.997082f,0.00115348f, +-0.0450053f,0.998556f,0.0293498f, +-0.0333568f,0.997154f,-0.0676115f, +-0.00964185f,0.995848f,-0.0905243f, +0.000956175f,0.96601f,-0.258503f, +0.00169255f,0.940578f,-0.339574f, +0.0710047f,0.988076f,-0.136617f, +0.0666563f,0.995318f,-0.0699874f, +-0.123764f,0.98454f,-0.123946f, +-0.163961f,0.983022f,-0.0823738f, +0.335205f,0.824436f,-0.456008f, +0.40434f,0.809075f,-0.426506f, +0.410475f,0.791681f,-0.452494f, +0.374361f,0.829194f,-0.41508f, +0.245781f,0.909811f,-0.33442f, +0.0263815f,0.954919f,-0.295693f, +-0.125325f,0.941665f,-0.312348f, +-0.129375f,0.929134f,-0.346369f, +-0.0304152f,0.953686f,-0.299263f, +-0.0235504f,0.953092f,-0.301762f, +0.153775f,0.94901f,-0.275197f, +0.274986f,0.871191f,-0.406705f, +0.301999f,0.805469f,-0.509919f, +0.376419f,0.798039f,-0.470576f, +0.361388f,0.809968f,-0.461899f, +0.38255f,0.848875f,-0.364783f, +0.240129f,0.889938f,-0.387747f, +-0.0576931f,0.937865f,-0.342172f, +-0.263371f,0.95113f,-0.161204f, +-0.310954f,0.950327f,-0.0136276f, +-0.223147f,0.974756f,-0.00746382f, +-0.15809f,0.984734f,-0.0728478f, +-0.146587f,0.977645f,-0.150739f, +-0.120405f,0.952352f,-0.280228f, +0.00186508f,0.961595f,-0.274467f, +-0.0732237f,0.95724f,-0.279876f, +-0.12777f,0.973556f,-0.189377f, +-0.137722f,0.985013f,-0.103834f, +-0.0840689f,0.995964f,-0.0314252f, +0.00572333f,0.997438f,0.0713008f, +-0.0203309f,0.999218f,0.033924f, +0.0131655f,0.994107f,-0.107599f, +0.106442f,0.965608f,-0.237214f, +0.156613f,0.948157f,-0.276534f, +0.221784f,0.959186f,-0.175425f, +0.297839f,0.94933f,-0.100322f, +0.237415f,0.96993f,-0.0535752f, +0.206724f,0.977649f,0.0383141f, +0.342833f,0.933108f,0.108513f, +0.413098f,0.906827f,0.0837554f, +0.485601f,0.86482f,0.127586f, +0.517433f,0.850444f,0.0949105f, +0.521609f,0.853001f,-0.0177076f, +0.35462f,0.907818f,-0.223854f, +0.320255f,0.896065f,-0.307417f, +0.254422f,0.945666f,-0.202447f, +-0.0420832f,0.95285f,-0.300511f, +0.132146f,0.911038f,-0.390572f, +0.397135f,0.84337f,-0.361954f, +0.530962f,0.805014f,-0.264634f, +0.518015f,0.788476f,-0.331612f, +0.536794f,0.726368f,-0.429234f, +0.499189f,0.748129f,-0.437165f, +0.193048f,0.933972f,-0.300713f, +-0.0642143f,0.969885f,-0.234947f, +-0.0349143f,0.97216f,-0.231701f, +-0.020308f,0.973327f,-0.22852f, +0.0335645f,0.983758f,-0.176336f, +0.162495f,0.963807f,-0.211356f, +0.0549435f,0.960153f,-0.274021f, +-0.150243f,0.943756f,-0.294538f, +0.093877f,0.988384f,-0.119518f, +-0.0288967f,0.977445f,-0.209205f, +-0.228292f,0.925763f,-0.301406f, +0.329933f,0.832357f,-0.445339f, +0.354113f,0.855807f,-0.377092f, +0.402588f,0.885182f,-0.233185f, +0.310305f,0.922327f,-0.23027f, +0.169674f,0.966179f,-0.194188f, +0.0510686f,0.987038f,-0.152145f, +-0.0638218f,0.978386f,-0.196689f, +-0.116946f,0.960297f,-0.253286f, +-0.0788814f,0.945056f,-0.317249f, +0.0429532f,0.937478f,-0.345383f, +0.160798f,0.890341f,-0.425953f, +0.370061f,0.833359f,-0.410569f, +0.405144f,0.796477f,-0.448867f, +0.330775f,0.831238f,-0.446802f, +0.214187f,0.914592f,-0.342995f, +0.302956f,0.933789f,-0.190409f, +0.260411f,0.956162f,-0.13394f, +-0.0987797f,0.989363f,-0.106786f, +-0.381946f,0.915584f,-0.125788f, +-0.356892f,0.930397f,-0.0835967f, +-0.219462f,0.974624f,-0.0441002f, +-0.0826206f,0.996346f,-0.0216629f, +-0.0522166f,0.993096f,-0.10504f, +-0.0544454f,0.992373f,-0.110596f, +-0.0392289f,0.996233f,-0.0773398f, +-0.0738534f,0.995703f,-0.0558676f, +-0.126249f,0.987782f,-0.0913672f, +-0.191576f,0.965578f,-0.17595f, +-0.204819f,0.971278f,-0.121116f, +-0.121301f,0.991656f,-0.0436452f, +0.0591737f,0.997785f,0.0303762f, +0.146031f,0.988908f,-0.0271181f, +0.164489f,0.985353f,-0.0449734f, +0.1732f,0.984753f,-0.0162076f, +0.192999f,0.97944f,-0.0587201f, +0.224284f,0.970976f,-0.0830781f, +0.215597f,0.976395f,0.0130766f, +0.11857f,0.99294f,-0.00337615f, +0.283009f,0.956652f,0.0687283f, +0.418445f,0.903636f,0.0913547f, +0.498249f,0.865176f,0.0567366f, +0.572218f,0.818628f,-0.0491444f, +0.584595f,0.798602f,-0.143119f, +0.499999f,0.838004f,-0.218521f, +0.312173f,0.860973f,-0.401589f, +0.169015f,0.918853f,-0.356571f, +0.0805256f,0.94115f,-0.328258f, +0.268694f,0.864193f,-0.42541f, +0.373719f,0.773399f,-0.512044f, +0.442856f,0.749728f,-0.491717f, +0.564815f,0.671761f,-0.479293f, +0.549235f,0.627986f,-0.551338f, +0.305274f,0.788247f,-0.534298f, +0.0146963f,0.910216f,-0.413874f, +-0.0347141f,0.920746f,-0.388614f, +-0.0142092f,0.918584f,-0.394971f, +-0.0593092f,0.944757f,-0.32236f, +-0.0129026f,0.951456f,-0.307515f, +0.101136f,0.954598f,-0.280203f, +0.103786f,0.979836f,-0.170731f, +-0.130724f,0.946294f,-0.2957f, +-0.0475497f,0.951312f,-0.30454f, +0.068843f,0.980898f,-0.181933f, +-0.0601749f,0.975587f,-0.21121f, +0.164088f,0.946673f,-0.277283f, +0.219167f,0.958752f,-0.180996f, +0.292116f,0.952214f,-0.0892046f, +0.382294f,0.923975f,-0.0110254f, +0.185963f,0.972429f,-0.140709f, +0.0282036f,0.98507f,-0.16983f, +-0.0260978f,0.984942f,-0.170904f, +0.00347731f,0.966818f,-0.255444f, +0.046523f,0.915606f,-0.399376f, +0.121249f,0.881024f,-0.457269f, +0.234655f,0.843553f,-0.483069f, +0.349259f,0.806387f,-0.47724f, +0.352024f,0.817545f,-0.455741f, +0.21f,0.895765f,-0.391796f, +0.123731f,0.946466f,-0.298149f, +0.189246f,0.953263f,-0.235533f, +0.21574f,0.971887f,-0.0943018f, +-0.0878709f,0.988681f,-0.12161f, +-0.31365f,0.930831f,-0.187554f, +-0.370884f,0.90378f,-0.213602f, +-0.292833f,0.938489f,-0.182993f, +-0.076513f,0.991298f,-0.107116f, +-0.0492348f,0.994225f,-0.0953508f, +-0.128831f,0.991129f,-0.0326479f, +-0.117178f,0.99304f,0.0118732f, +-0.0834857f,0.989043f,0.12175f, +-0.0124631f,0.991817f,0.127061f, +-0.133134f,0.991073f,-0.00703918f, +-0.190067f,0.981738f,-0.00811131f, +-0.0950662f,0.989352f,-0.110206f, +0.0262188f,0.977376f,-0.209877f, +0.0774906f,0.981033f,-0.177679f, +0.0911686f,0.995787f,-0.00982619f, +0.177517f,0.984043f,0.0121696f, +0.260966f,0.962001f,-0.0803208f, +0.219093f,0.96759f,-0.12557f, +0.15488f,0.986019f,-0.06147f, +0.155325f,0.987507f,-0.0265508f, +0.257438f,0.9633f,-0.0760109f, +0.429699f,0.898131f,-0.0933795f, +0.553938f,0.821258f,-0.136702f, +0.635333f,0.740056f,-0.220611f, +0.590775f,0.752696f,-0.290577f, +0.544721f,0.782975f,-0.300381f, +0.386007f,0.854199f,-0.348343f, +0.159868f,0.903698f,-0.397205f, +0.111475f,0.854344f,-0.507613f, +0.32886f,0.783243f,-0.527619f, +0.428722f,0.729381f,-0.533105f, +0.463071f,0.680849f,-0.567459f, +0.578683f,0.643078f,-0.501575f, +0.498776f,0.750313f,-0.433881f, +0.172367f,0.935224f,-0.309265f, +-0.0549105f,0.957697f,-0.282492f, +-0.000989137f,0.955961f,-0.293491f, +-0.105185f,0.947134f,-0.303107f, +-0.108598f,0.951252f,-0.288662f, +-0.0192021f,0.937992f,-0.346125f, +0.0434621f,0.947915f,-0.315545f, +0.0658084f,0.965866f,-0.250542f, +0.00168367f,0.969468f,-0.245211f, +-0.0752902f,0.953259f,-0.292624f, +-0.0406571f,0.962797f,-0.267151f, +-0.0486067f,0.969651f,-0.239615f, +0.0419974f,0.993223f,-0.108371f, +0.194169f,0.980548f,-0.0286949f, +0.261981f,0.963651f,-0.0523696f, +0.349136f,0.937066f,-0.00343362f, +0.31121f,0.950026f,0.0244779f, +0.0510089f,0.992585f,-0.110335f, +0.0314098f,0.989653f,-0.140003f, +0.185979f,0.958236f,-0.217244f, +0.136104f,0.898638f,-0.417044f, +0.108771f,0.892335f,-0.438072f, +0.238757f,0.906785f,-0.34747f, +0.373646f,0.87379f,-0.311256f, +0.340425f,0.883999f,-0.320402f, +0.14853f,0.93597f,-0.319217f, +0.0564088f,0.968057f,-0.244304f, +0.0971116f,0.979187f,-0.17822f, +0.12449f,0.986246f,-0.108724f, +0.00791995f,0.999591f,-0.0274806f, +-0.236925f,0.964883f,-0.113439f, +-0.404549f,0.891486f,-0.203944f, +-0.302952f,0.940514f,-0.153798f, +-0.187243f,0.970939f,-0.149055f, +-0.103813f,0.994585f,-0.00480558f, +-0.136945f,0.990579f,0.00047278f, +-0.192386f,0.981319f,0.000301484f, +-0.157118f,0.980577f,0.117404f, +-0.0205849f,0.995936f,0.0876826f, +-0.0389376f,0.992928f,0.112147f, +-0.205589f,0.977918f,0.0375515f, +0.0799477f,0.995293f,0.0547661f, +0.128711f,0.981689f,-0.140426f, +-0.00377139f,0.985264f,-0.170999f, +-0.0186288f,0.990563f,-0.135788f, +0.247861f,0.95847f,-0.141069f, +0.335397f,0.913398f,-0.230679f, +0.164127f,0.956335f,-0.241837f, +0.0560549f,0.992155f,-0.111746f, +0.165621f,0.985752f,-0.0293729f, +0.329655f,0.93718f,-0.114108f, +0.47188f,0.859421f,-0.196784f, +0.593068f,0.774119f,-0.22138f, +0.65363f,0.716422f,-0.24394f, +0.606788f,0.760352f,-0.231675f, +0.536399f,0.810894f,-0.23394f, +0.343135f,0.901586f,-0.263439f, +0.295862f,0.930397f,-0.216396f, +0.307346f,0.85762f,-0.412342f, +0.36437f,0.770675f,-0.522776f, +0.48977f,0.726784f,-0.481571f, +0.467664f,0.727396f,-0.50218f, +0.516451f,0.759976f,-0.394608f, +0.369408f,0.883578f,-0.287798f, +0.11272f,0.986131f,-0.121821f, +-0.0556185f,0.985996f,-0.157218f, +-0.0141506f,0.99059f,-0.13613f, +-0.0462718f,0.993931f,-0.099801f, +-0.0190733f,0.9801f,-0.197584f, +0.0617351f,0.955747f,-0.287639f, +-0.00791345f,0.937814f,-0.347049f, +0.0263533f,0.943249f,-0.331038f, +-0.0408223f,0.937006f,-0.34692f, +-0.0840519f,0.9495f,-0.302299f, +-0.0536227f,0.964498f,-0.25859f, +-0.0366453f,0.973297f,-0.226607f, +0.0559372f,0.997556f,-0.0418806f, +0.117658f,0.99199f,-0.0459629f, +0.260816f,0.963552f,0.059517f, +0.265721f,0.95723f,0.114473f, +0.305022f,0.92568f,0.223781f, +0.229311f,0.961539f,0.151192f, +0.0614828f,0.993074f,-0.10012f, +0.279787f,0.947394f,-0.15545f, +0.307005f,0.902601f,-0.301762f, +0.0599313f,0.924785f,-0.375741f, +0.138459f,0.941623f,-0.306881f, +0.380474f,0.890209f,-0.250536f, +0.362157f,0.883362f,-0.297512f, +0.118666f,0.951617f,-0.283449f, +-0.0864913f,0.973386f,-0.212226f, +0.0535968f,0.99807f,-0.0313783f, +0.0571748f,0.998014f,0.026449f, +-0.0576417f,0.995225f,0.0787756f, +-0.164671f,0.983729f,0.0718444f, +-0.317398f,0.947117f,0.0472105f, +-0.350813f,0.936189f,-0.0219157f, +-0.249283f,0.968275f,0.0173648f, +-0.166219f,0.983818f,0.0668861f, +-0.137263f,0.989074f,0.0537794f, +-0.237615f,0.966132f,0.100634f, +-0.156805f,0.98112f,0.113207f, +0.0155394f,0.999476f,0.0283817f, +-0.0358194f,0.998926f,0.0293752f, +-0.187269f,0.982125f,-0.01898f, +0.0856923f,0.996255f,0.0114998f, +0.21812f,0.975918f,0.00295422f, +0.0575266f,0.997525f,-0.0404377f, +0.0557844f,0.976324f,-0.208997f, +0.282723f,0.906166f,-0.314533f, +0.34017f,0.885713f,-0.315906f, +0.0703654f,0.964786f,-0.253451f, +-0.0857039f,0.987005f,-0.135924f, +0.161068f,0.982423f,-0.0943491f, +0.439921f,0.879468f,-0.181673f, +0.499341f,0.805071f,-0.320185f, +0.581376f,0.752639f,-0.309089f, +0.634744f,0.735927f,-0.235609f, +0.590228f,0.797974f,-0.121932f, +0.552123f,0.824777f,-0.122079f, +0.403254f,0.893687f,-0.196749f, +0.282279f,0.904426f,-0.319896f, +0.487441f,0.821419f,-0.296095f, +0.471414f,0.771013f,-0.428146f, +0.452383f,0.750947f,-0.48107f, +0.453351f,0.789814f,-0.413117f, +0.426317f,0.829282f,-0.361311f, +0.274227f,0.935292f,-0.223671f, +0.0409647f,0.985686f,-0.16354f, +0.00611451f,0.980211f,-0.19786f, +-0.0818346f,0.965065f,-0.248905f, +-0.0402149f,0.984168f,-0.172615f, +0.0358772f,0.970818f,-0.237119f, +0.140843f,0.951316f,-0.274156f, +0.0386407f,0.935491f,-0.351232f, +0.02521f,0.945244f,-0.325388f, +-0.00704123f,0.966541f,-0.256414f, +-0.132543f,0.963814f,-0.231288f, +-0.120001f,0.972985f,-0.197233f, +-0.125856f,0.970406f,-0.20609f, +0.150068f,0.984139f,0.0946078f, +0.0962514f,0.994035f,0.0512922f, +0.139768f,0.98134f,0.132051f, +0.167943f,0.959948f,0.224265f, +0.248876f,0.931236f,0.266197f, +0.347088f,0.901338f,0.259075f, +0.298327f,0.935934f,0.187161f, +0.410224f,0.911771f,0.0197232f, +0.382392f,0.916875f,-0.11453f, +0.0687189f,0.981224f,-0.180215f, +0.109108f,0.978331f,-0.175964f, +0.423091f,0.889035f,-0.17496f, +0.308023f,0.9305f,-0.198221f, +0.0610242f,0.996399f,-0.0588678f, +-0.139679f,0.983461f,-0.1153f, +-0.178862f,0.976278f,-0.122024f, +-0.0279755f,0.98865f,0.147609f, +0.0175582f,0.984678f,0.173494f, +-0.182965f,0.982824f,0.0240987f, +-0.334982f,0.934918f,0.117109f, +-0.346361f,0.929574f,0.126201f, +-0.256073f,0.950373f,0.176686f, +-0.14622f,0.975847f,0.162306f, +-0.145894f,0.982033f,0.119692f, +-0.243091f,0.96438f,0.104295f, +-0.119399f,0.991881f,0.0437603f, +0.0792305f,0.996134f,0.0379462f, +-0.0234512f,0.999544f,0.0190445f, +-0.148416f,0.988869f,0.0105176f, +0.0279419f,0.999576f,0.00824062f, +0.239276f,0.970159f,0.0392311f, +0.182184f,0.979477f,-0.086222f, +0.251919f,0.933495f,-0.255194f, +0.359782f,0.855042f,-0.373444f, +0.260041f,0.87469f,-0.409017f, +-0.0332083f,0.931159f,-0.363099f, +-0.108678f,0.933514f,-0.341673f, +0.191287f,0.909011f,-0.370282f, +0.516055f,0.783319f,-0.346553f, +0.557568f,0.726461f,-0.401711f, +0.511814f,0.738467f,-0.438991f, +0.509794f,0.789775f,-0.341125f, +0.522098f,0.819729f,-0.235496f, +0.54438f,0.815602f,-0.196071f, +0.540927f,0.823066f,-0.173089f, +0.36892f,0.838043f,-0.401972f, +0.461826f,0.790802f,-0.401684f, +0.549439f,0.728653f,-0.408878f, +0.455853f,0.753497f,-0.473751f, +0.389397f,0.799772f,-0.456875f, +0.293181f,0.868874f,-0.398878f, +0.155589f,0.965139f,-0.210473f, +0.031565f,0.984349f,-0.173382f, +0.0970165f,0.970686f,-0.219901f, +-0.0352366f,0.943342f,-0.329946f, +-0.0636858f,0.931929f,-0.357006f, +0.111555f,0.924517f,-0.364451f, +0.180963f,0.908751f,-0.376064f, +0.0582409f,0.924666f,-0.376299f, +-0.091325f,0.934476f,-0.344113f, +-0.148498f,0.963415f,-0.223113f, +-0.170646f,0.976481f,-0.131776f, +-0.0961794f,0.980781f,-0.169761f, +-0.06221f,0.973089f,-0.221874f, +0.206636f,0.934831f,0.288777f, +0.0869406f,0.963592f,0.252847f, +0.0799701f,0.959241f,0.271038f, +0.160525f,0.963414f,0.21463f, +0.255681f,0.955661f,0.146082f, +0.323027f,0.93103f,0.169812f, +0.330118f,0.920313f,0.209873f, +0.447578f,0.884885f,0.12904f, +0.467368f,0.874534f,0.129448f, +0.130174f,0.988207f,0.0806387f, +0.145402f,0.989036f,-0.0258009f, +0.425216f,0.898822f,-0.106345f, +0.205136f,0.977985f,-0.0382811f, +-0.0258123f,0.995757f,0.0883314f, +-0.00518813f,0.996132f,0.0877124f, +-0.192412f,0.980974f,0.0258233f, +-0.196114f,0.979963f,0.0348015f, +0.0217983f,0.995754f,0.0894399f, +-0.10216f,0.980256f,0.169296f, +-0.384424f,0.908881f,0.161723f, +-0.367551f,0.91996f,0.136309f, +-0.285788f,0.948719f,0.135118f, +-0.171256f,0.972185f,0.159771f, +-0.0605854f,0.969905f,0.235826f, +-0.167372f,0.981266f,0.0954134f, +-0.0977838f,0.994994f,0.0206294f, +0.0451608f,0.997867f,0.0471292f, +-0.0136124f,0.997411f,0.0706177f, +-0.158818f,0.986831f,0.0306748f, +0.0267005f,0.99957f,0.0121357f, +0.289361f,0.957076f,-0.0166175f, +0.336393f,0.939976f,-0.0573177f, +0.390118f,0.913466f,-0.115702f, +0.445853f,0.875576f,-0.185959f, +0.293335f,0.914816f,-0.277609f, +-0.00739937f,0.915657f,-0.401893f, +0.00533725f,0.872492f,-0.488599f, +0.197734f,0.788261f,-0.582705f, +0.43334f,0.722538f,-0.53866f, +0.548408f,0.706281f,-0.447678f, +0.484095f,0.751007f,-0.449045f, +0.458828f,0.77804f,-0.429103f, +0.441245f,0.787203f,-0.430829f, +0.474553f,0.805707f,-0.354451f, +0.550933f,0.789486f,-0.270526f, +0.502032f,0.792798f,-0.345594f, +0.478273f,0.764634f,-0.43196f, +0.556872f,0.730832f,-0.394687f, +0.471855f,0.788619f,-0.394251f, +0.354943f,0.841801f,-0.406677f, +0.154029f,0.899791f,-0.40823f, +0.0155123f,0.938951f,-0.343701f, +0.0497714f,0.948037f,-0.314243f, +0.154285f,0.935402f,-0.31815f, +0.101927f,0.920411f,-0.377432f, +-0.0203862f,0.864666f,-0.501933f, +0.070179f,0.866621f,-0.494007f, +0.100294f,0.910674f,-0.400766f, +0.000402101f,0.968295f,-0.249809f, +-0.128961f,0.971456f,-0.199105f, +-0.199723f,0.946207f,-0.254564f, +-0.134113f,0.940975f,-0.310772f, +-0.0316747f,0.927512f,-0.372449f, +0.0302907f,0.938917f,-0.342807f, +0.218976f,0.899032f,0.379198f, +0.139079f,0.919337f,0.368072f, +0.135024f,0.957047f,0.256573f, +0.313512f,0.936875f,0.154838f, +0.29644f,0.95504f,0.00476296f, +0.279277f,0.959996f,0.0202722f, +0.3625f,0.931007f,0.0426625f, +0.472022f,0.881367f,0.0196857f, +0.429567f,0.887347f,0.167594f, +0.224991f,0.963227f,0.146879f, +0.296133f,0.954919f,-0.0208476f, +0.415966f,0.902166f,-0.114319f, +0.183129f,0.982743f,0.0260829f, +-0.0925135f,0.995706f,-0.00325499f, +-0.0437431f,0.995986f,0.0780946f, +-0.179713f,0.977607f,0.109486f, +-0.141385f,0.986823f,0.0786845f, +-0.085949f,0.993479f,0.0749198f, +-0.233157f,0.944593f,0.231044f, +-0.345216f,0.897121f,0.275681f, +-0.266518f,0.944857f,0.190296f, +-0.236509f,0.971079f,0.032684f, +-0.255527f,0.96653f,-0.0229239f, +-0.0941044f,0.991025f,0.0949427f, +-0.0715158f,0.990946f,0.113625f, +-0.0636481f,0.988651f,0.136079f, +0.0130078f,0.992968f,0.11767f, +0.0194535f,0.99321f,0.114698f, +-0.0733749f,0.997304f,0.000320173f, +0.0745089f,0.991949f,-0.102398f, +0.316045f,0.940065f,-0.128038f, +0.302503f,0.936628f,-0.176692f, +0.365578f,0.917629f,-0.155918f, +0.474055f,0.875706f,-0.091714f, +0.462666f,0.882661f,-0.0827679f, +0.197672f,0.918824f,-0.341598f, +0.1211f,0.851979f,-0.509379f, +0.340562f,0.776445f,-0.530237f, +0.411588f,0.704014f,-0.578756f, +0.454493f,0.713166f,-0.533695f, +0.463114f,0.742631f,-0.483761f, +0.44079f,0.754688f,-0.485953f, +0.400302f,0.772025f,-0.493696f, +0.38659f,0.783016f,-0.487272f, +0.457033f,0.766931f,-0.450487f, +0.547084f,0.759757f,-0.351382f, +0.508566f,0.782012f,-0.360303f, +0.54699f,0.792915f,-0.268492f, +0.489855f,0.837224f,-0.243102f, +0.350988f,0.891534f,-0.286312f, +0.195385f,0.947495f,-0.253137f, +0.0709694f,0.939176f,-0.336023f, +0.0288377f,0.903143f,-0.42837f, +0.128806f,0.91498f,-0.382389f, +0.209123f,0.895775f,-0.392243f, +0.0981301f,0.852621f,-0.513233f, +-0.0414306f,0.841347f,-0.538906f, +-0.0951984f,0.922571f,-0.373899f, +-0.157973f,0.963972f,-0.214014f, +-0.107909f,0.978829f,-0.173926f, +-0.0713291f,0.969594f,-0.234092f, +0.0141898f,0.950434f,-0.310602f, +-0.0202439f,0.895649f,-0.4443f, +-0.114151f,0.867225f,-0.484655f, +0.0955354f,0.969912f,0.223927f, +0.218114f,0.913651f,0.343028f, +0.223104f,0.958808f,0.175816f, +0.39761f,0.915149f,0.0663907f, +0.332649f,0.940641f,-0.0673772f, +0.280455f,0.956871f,-0.0757854f, +0.359446f,0.926985f,-0.107225f, +0.369482f,0.924827f,-0.0904272f, +0.410746f,0.887001f,0.210991f, +0.335823f,0.922126f,0.192112f, +0.395669f,0.917218f,-0.0464346f, +0.353697f,0.926083f,-0.131407f, +0.179534f,0.981887f,0.0605388f, +-0.13479f,0.99057f,-0.0245515f, +-0.0725996f,0.990136f,0.119831f, +-0.160567f,0.981095f,0.108036f, +-0.173547f,0.983858f,0.0436428f, +-0.151709f,0.976244f,0.154697f, +-0.302597f,0.914896f,0.267208f, +-0.328732f,0.906446f,0.265123f, +-0.132663f,0.960039f,0.246424f, +-0.138673f,0.989957f,0.0274833f, +-0.234284f,0.968151f,-0.0882923f, +-0.176173f,0.979923f,-0.0933525f, +-0.138089f,0.990412f,-0.00402308f, +-0.0957719f,0.981754f,0.164279f, +0.0343111f,0.979592f,0.198047f, +0.0638942f,0.984862f,0.161133f, +0.0719687f,0.995312f,0.0646062f, +0.0847007f,0.982914f,-0.163422f, +0.363247f,0.926697f,-0.0963506f, +0.36667f,0.908341f,-0.201173f, +0.337169f,0.882657f,-0.327465f, +0.394509f,0.879929f,-0.264742f, +0.48646f,0.864989f,-0.123088f, +0.417344f,0.883151f,-0.21417f, +0.20086f,0.830272f,-0.519907f, +0.38892f,0.767179f,-0.510077f, +0.449414f,0.718324f,-0.531072f, +0.423477f,0.726204f,-0.541567f, +0.422958f,0.74196f,-0.520194f, +0.433204f,0.760712f,-0.483374f, +0.409051f,0.775415f,-0.481049f, +0.416047f,0.762178f,-0.495973f, +0.412818f,0.728929f,-0.546117f, +0.422596f,0.756339f,-0.499363f, +0.473538f,0.806572f,-0.353841f, +0.474731f,0.838081f,-0.268794f, +0.539079f,0.832631f,-0.126962f, +0.311124f,0.910644f,-0.271898f, +0.195648f,0.962321f,-0.18884f, +0.177086f,0.961235f,-0.211349f, +0.0559264f,0.927874f,-0.368677f, +0.121016f,0.928529f,-0.350982f, +0.256538f,0.895264f,-0.364269f, +0.222607f,0.876269f,-0.427317f, +-0.106542f,0.82471f,-0.55543f, +-0.245122f,0.890501f,-0.383305f, +-0.209725f,0.956698f,-0.201855f, +-0.0624605f,0.97406f,-0.2175f, +-0.0812465f,0.947824f,-0.308266f, +0.0649824f,0.972455f,-0.223851f, +0.119957f,0.950206f,-0.287609f, +-0.0414767f,0.905483f,-0.422351f, +}; + +btScalar Landscape03Tex[] = { +0.507813f,0.5f, +0.507813f,0.492188f, +0.515625f,0.5f, +0.515625f,0.492188f, +0.523438f,0.5f, +0.523438f,0.492188f, +0.53125f,0.5f, +0.53125f,0.492188f, +0.539063f,0.5f, +0.539063f,0.492188f, +0.546875f,0.5f, +0.546875f,0.492188f, +0.554688f,0.5f, +0.554688f,0.492188f, +0.5625f,0.5f, +0.5625f,0.492188f, +0.570313f,0.5f, +0.570313f,0.492188f, +0.578125f,0.5f, +0.578125f,0.492188f, +0.585938f,0.5f, +0.585938f,0.492188f, +0.59375f,0.5f, +0.59375f,0.492188f, +0.601563f,0.5f, +0.601563f,0.492188f, +0.609375f,0.5f, +0.609375f,0.492188f, +0.617188f,0.5f, +0.617188f,0.492188f, +0.625f,0.5f, +0.625f,0.492188f, +0.632813f,0.5f, +0.632813f,0.492188f, +0.640625f,0.5f, +0.640625f,0.492188f, +0.648438f,0.5f, +0.648438f,0.492188f, +0.65625f,0.5f, +0.65625f,0.492188f, +0.664063f,0.5f, +0.664063f,0.492188f, +0.671875f,0.5f, +0.671875f,0.492188f, +0.679688f,0.5f, +0.679688f,0.492188f, +0.6875f,0.5f, +0.6875f,0.492188f, +0.695313f,0.5f, +0.695313f,0.492188f, +0.703125f,0.5f, +0.703125f,0.492188f, +0.710938f,0.5f, +0.710938f,0.492188f, +0.71875f,0.5f, +0.71875f,0.492188f, +0.726563f,0.5f, +0.726563f,0.492188f, +0.734375f,0.5f, +0.734375f,0.492188f, +0.742188f,0.5f, +0.742188f,0.492188f, +0.75f,0.5f, +0.75f,0.492188f, +0.757813f,0.5f, +0.757813f,0.492188f, +0.765625f,0.5f, +0.765625f,0.492188f, +0.773438f,0.5f, +0.773438f,0.492188f, +0.78125f,0.5f, +0.78125f,0.492188f, +0.789063f,0.5f, +0.789063f,0.492188f, +0.796875f,0.5f, +0.796875f,0.492188f, +0.804688f,0.5f, +0.804688f,0.492188f, +0.8125f,0.5f, +0.8125f,0.492188f, +0.820313f,0.5f, +0.820313f,0.492188f, +0.828125f,0.5f, +0.828125f,0.492188f, +0.835938f,0.5f, +0.835938f,0.492188f, +0.84375f,0.5f, +0.84375f,0.492188f, +0.851563f,0.5f, +0.851563f,0.492188f, +0.859375f,0.5f, +0.859375f,0.492188f, +0.867188f,0.5f, +0.867188f,0.492188f, +0.875f,0.5f, +0.875f,0.492188f, +0.882813f,0.5f, +0.882813f,0.492188f, +0.890625f,0.5f, +0.890625f,0.492188f, +0.898438f,0.5f, +0.898438f,0.492188f, +0.90625f,0.5f, +0.90625f,0.492188f, +0.914063f,0.5f, +0.914063f,0.492188f, +0.921875f,0.5f, +0.921875f,0.492188f, +0.929688f,0.5f, +0.929688f,0.492188f, +0.9375f,0.5f, +0.9375f,0.492188f, +0.945313f,0.5f, +0.945313f,0.492188f, +0.953125f,0.5f, +0.953125f,0.492188f, +0.960938f,0.5f, +0.960938f,0.492188f, +0.96875f,0.5f, +0.96875f,0.492188f, +0.976563f,0.5f, +0.976563f,0.492188f, +0.984375f,0.5f, +0.984375f,0.492188f, +0.992188f,0.5f, +0.992188f,0.492188f, +1.0f,0.5f, +1.0f,0.492188f, +0.507813f,0.507813f, +0.515625f,0.507813f, +0.523438f,0.507813f, +0.53125f,0.507813f, +0.539063f,0.507813f, +0.546875f,0.507813f, +0.554688f,0.507813f, +0.5625f,0.507813f, +0.570313f,0.507813f, +0.578125f,0.507813f, +0.585938f,0.507813f, +0.59375f,0.507813f, +0.601563f,0.507813f, +0.609375f,0.507813f, +0.617188f,0.507813f, +0.625f,0.507813f, +0.632813f,0.507813f, +0.640625f,0.507813f, +0.648438f,0.507813f, +0.65625f,0.507813f, +0.664063f,0.507813f, +0.671875f,0.507813f, +0.679688f,0.507813f, +0.6875f,0.507813f, +0.695313f,0.507813f, +0.703125f,0.507813f, +0.710938f,0.507813f, +0.71875f,0.507813f, +0.726563f,0.507813f, +0.734375f,0.507813f, +0.742188f,0.507813f, +0.75f,0.507813f, +0.757813f,0.507813f, +0.765625f,0.507813f, +0.773438f,0.507813f, +0.78125f,0.507813f, +0.789063f,0.507813f, +0.796875f,0.507813f, +0.804688f,0.507813f, +0.8125f,0.507813f, +0.820313f,0.507813f, +0.828125f,0.507813f, +0.835938f,0.507813f, +0.84375f,0.507813f, +0.851563f,0.507813f, +0.859375f,0.507813f, +0.867188f,0.507813f, +0.875f,0.507813f, +0.882813f,0.507813f, +0.890625f,0.507813f, +0.898438f,0.507813f, +0.90625f,0.507813f, +0.914063f,0.507813f, +0.921875f,0.507813f, +0.929688f,0.507813f, +0.9375f,0.507813f, +0.945313f,0.507813f, +0.953125f,0.507813f, +0.960938f,0.507813f, +0.96875f,0.507813f, +0.976563f,0.507813f, +0.984375f,0.507813f, +0.992188f,0.507813f, +1.0f,0.507813f, +0.507813f,0.515625f, +0.515625f,0.515625f, +0.523438f,0.515625f, +0.53125f,0.515625f, +0.539063f,0.515625f, +0.546875f,0.515625f, +0.554688f,0.515625f, +0.5625f,0.515625f, +0.570313f,0.515625f, +0.578125f,0.515625f, +0.585938f,0.515625f, +0.59375f,0.515625f, +0.601563f,0.515625f, +0.609375f,0.515625f, +0.617188f,0.515625f, +0.625f,0.515625f, +0.632813f,0.515625f, +0.640625f,0.515625f, +0.648438f,0.515625f, +0.65625f,0.515625f, +0.664063f,0.515625f, +0.671875f,0.515625f, +0.679688f,0.515625f, +0.6875f,0.515625f, +0.695313f,0.515625f, +0.703125f,0.515625f, +0.710938f,0.515625f, +0.71875f,0.515625f, +0.726563f,0.515625f, +0.734375f,0.515625f, +0.742188f,0.515625f, +0.75f,0.515625f, +0.757813f,0.515625f, +0.765625f,0.515625f, +0.773438f,0.515625f, +0.78125f,0.515625f, +0.789063f,0.515625f, +0.796875f,0.515625f, +0.804688f,0.515625f, +0.8125f,0.515625f, +0.820313f,0.515625f, +0.828125f,0.515625f, +0.835938f,0.515625f, +0.84375f,0.515625f, +0.851563f,0.515625f, +0.859375f,0.515625f, +0.867188f,0.515625f, +0.875f,0.515625f, +0.882813f,0.515625f, +0.890625f,0.515625f, +0.898438f,0.515625f, +0.90625f,0.515625f, +0.914063f,0.515625f, +0.921875f,0.515625f, +0.929688f,0.515625f, +0.9375f,0.515625f, +0.945313f,0.515625f, +0.953125f,0.515625f, +0.960938f,0.515625f, +0.96875f,0.515625f, +0.976563f,0.515625f, +0.984375f,0.515625f, +0.992188f,0.515625f, +1.0f,0.515625f, +0.507813f,0.523438f, +0.515625f,0.523438f, +0.523438f,0.523438f, +0.53125f,0.523438f, +0.539063f,0.523438f, +0.546875f,0.523438f, +0.554688f,0.523438f, +0.5625f,0.523438f, +0.570313f,0.523438f, +0.578125f,0.523438f, +0.585938f,0.523438f, +0.59375f,0.523438f, +0.601563f,0.523438f, +0.609375f,0.523438f, +0.617188f,0.523438f, +0.625f,0.523438f, +0.632813f,0.523438f, +0.640625f,0.523438f, +0.648438f,0.523438f, +0.65625f,0.523438f, +0.664063f,0.523438f, +0.671875f,0.523438f, +0.679688f,0.523438f, +0.6875f,0.523438f, +0.695313f,0.523438f, +0.703125f,0.523438f, +0.710938f,0.523438f, +0.71875f,0.523438f, +0.726563f,0.523438f, +0.734375f,0.523438f, +0.742188f,0.523438f, +0.75f,0.523438f, +0.757813f,0.523438f, +0.765625f,0.523438f, +0.773438f,0.523438f, +0.78125f,0.523438f, +0.789063f,0.523438f, +0.796875f,0.523438f, +0.804688f,0.523438f, +0.8125f,0.523438f, +0.820313f,0.523438f, +0.828125f,0.523438f, +0.835938f,0.523438f, +0.84375f,0.523438f, +0.851563f,0.523438f, +0.859375f,0.523438f, +0.867188f,0.523438f, +0.875f,0.523438f, +0.882813f,0.523438f, +0.890625f,0.523438f, +0.898438f,0.523438f, +0.90625f,0.523438f, +0.914063f,0.523438f, +0.921875f,0.523438f, +0.929688f,0.523438f, +0.9375f,0.523438f, +0.945313f,0.523438f, +0.953125f,0.523438f, +0.960938f,0.523438f, +0.96875f,0.523438f, +0.976563f,0.523438f, +0.984375f,0.523438f, +0.992188f,0.523438f, +1.0f,0.523438f, +0.507813f,0.53125f, +0.515625f,0.53125f, +0.523438f,0.53125f, +0.53125f,0.53125f, +0.539063f,0.53125f, +0.546875f,0.53125f, +0.554688f,0.53125f, +0.5625f,0.53125f, +0.570313f,0.53125f, +0.578125f,0.53125f, +0.585938f,0.53125f, +0.59375f,0.53125f, +0.601563f,0.53125f, +0.609375f,0.53125f, +0.617188f,0.53125f, +0.625f,0.53125f, +0.632813f,0.53125f, +0.640625f,0.53125f, +0.648438f,0.53125f, +0.65625f,0.53125f, +0.664063f,0.53125f, +0.671875f,0.53125f, +0.679688f,0.53125f, +0.6875f,0.53125f, +0.695313f,0.53125f, +0.703125f,0.53125f, +0.710938f,0.53125f, +0.71875f,0.53125f, +0.726563f,0.53125f, +0.734375f,0.53125f, +0.742188f,0.53125f, +0.75f,0.53125f, +0.757813f,0.53125f, +0.765625f,0.53125f, +0.773438f,0.53125f, +0.78125f,0.53125f, +0.789063f,0.53125f, +0.796875f,0.53125f, +0.804688f,0.53125f, +0.8125f,0.53125f, +0.820313f,0.53125f, +0.828125f,0.53125f, +0.835938f,0.53125f, +0.84375f,0.53125f, +0.851563f,0.53125f, +0.859375f,0.53125f, +0.867188f,0.53125f, +0.875f,0.53125f, +0.882813f,0.53125f, +0.890625f,0.53125f, +0.898438f,0.53125f, +0.90625f,0.53125f, +0.914063f,0.53125f, +0.921875f,0.53125f, +0.929688f,0.53125f, +0.9375f,0.53125f, +0.945313f,0.53125f, +0.953125f,0.53125f, +0.960938f,0.53125f, +0.96875f,0.53125f, +0.976563f,0.53125f, +0.984375f,0.53125f, +0.992188f,0.53125f, +1.0f,0.53125f, +0.507813f,0.539063f, +0.515625f,0.539063f, +0.523438f,0.539063f, +0.53125f,0.539063f, +0.539063f,0.539063f, +0.546875f,0.539063f, +0.554688f,0.539063f, +0.5625f,0.539063f, +0.570313f,0.539063f, +0.578125f,0.539063f, +0.585938f,0.539063f, +0.59375f,0.539063f, +0.601563f,0.539063f, +0.609375f,0.539063f, +0.617188f,0.539063f, +0.625f,0.539063f, +0.632813f,0.539063f, +0.640625f,0.539063f, +0.648438f,0.539063f, +0.65625f,0.539063f, +0.664063f,0.539063f, +0.671875f,0.539063f, +0.679688f,0.539063f, +0.6875f,0.539063f, +0.695313f,0.539063f, +0.703125f,0.539063f, +0.710938f,0.539063f, +0.71875f,0.539063f, +0.726563f,0.539063f, +0.734375f,0.539063f, +0.742188f,0.539063f, +0.75f,0.539063f, +0.757813f,0.539063f, +0.765625f,0.539063f, +0.773438f,0.539063f, +0.78125f,0.539063f, +0.789063f,0.539063f, +0.796875f,0.539063f, +0.804688f,0.539063f, +0.8125f,0.539063f, +0.820313f,0.539063f, +0.828125f,0.539063f, +0.835938f,0.539063f, +0.84375f,0.539063f, +0.851563f,0.539063f, +0.859375f,0.539063f, +0.867188f,0.539063f, +0.875f,0.539063f, +0.882813f,0.539063f, +0.890625f,0.539063f, +0.898438f,0.539063f, +0.90625f,0.539063f, +0.914063f,0.539063f, +0.921875f,0.539063f, +0.929688f,0.539063f, +0.9375f,0.539063f, +0.945313f,0.539063f, +0.953125f,0.539063f, +0.960938f,0.539063f, +0.96875f,0.539063f, +0.976563f,0.539063f, +0.984375f,0.539063f, +0.992188f,0.539063f, +1.0f,0.539063f, +0.507813f,0.546875f, +0.515625f,0.546875f, +0.523438f,0.546875f, +0.53125f,0.546875f, +0.539063f,0.546875f, +0.546875f,0.546875f, +0.554688f,0.546875f, +0.5625f,0.546875f, +0.570313f,0.546875f, +0.578125f,0.546875f, +0.585938f,0.546875f, +0.59375f,0.546875f, +0.601563f,0.546875f, +0.609375f,0.546875f, +0.617188f,0.546875f, +0.625f,0.546875f, +0.632813f,0.546875f, +0.640625f,0.546875f, +0.648438f,0.546875f, +0.65625f,0.546875f, +0.664063f,0.546875f, +0.671875f,0.546875f, +0.679688f,0.546875f, +0.6875f,0.546875f, +0.695313f,0.546875f, +0.703125f,0.546875f, +0.710938f,0.546875f, +0.71875f,0.546875f, +0.726563f,0.546875f, +0.734375f,0.546875f, +0.742188f,0.546875f, +0.75f,0.546875f, +0.757813f,0.546875f, +0.765625f,0.546875f, +0.773438f,0.546875f, +0.78125f,0.546875f, +0.789063f,0.546875f, +0.796875f,0.546875f, +0.804688f,0.546875f, +0.8125f,0.546875f, +0.820313f,0.546875f, +0.828125f,0.546875f, +0.835938f,0.546875f, +0.84375f,0.546875f, +0.851563f,0.546875f, +0.859375f,0.546875f, +0.867188f,0.546875f, +0.875f,0.546875f, +0.882813f,0.546875f, +0.890625f,0.546875f, +0.898438f,0.546875f, +0.90625f,0.546875f, +0.914063f,0.546875f, +0.921875f,0.546875f, +0.929688f,0.546875f, +0.9375f,0.546875f, +0.945313f,0.546875f, +0.953125f,0.546875f, +0.960938f,0.546875f, +0.96875f,0.546875f, +0.976563f,0.546875f, +0.984375f,0.546875f, +0.992188f,0.546875f, +1.0f,0.546875f, +0.507813f,0.554688f, +0.515625f,0.554688f, +0.523438f,0.554688f, +0.53125f,0.554688f, +0.539063f,0.554688f, +0.546875f,0.554688f, +0.554688f,0.554688f, +0.5625f,0.554688f, +0.570313f,0.554688f, +0.578125f,0.554688f, +0.585938f,0.554688f, +0.59375f,0.554688f, +0.601563f,0.554688f, +0.609375f,0.554688f, +0.617188f,0.554688f, +0.625f,0.554688f, +0.632813f,0.554688f, +0.640625f,0.554688f, +0.648438f,0.554688f, +0.65625f,0.554688f, +0.664063f,0.554688f, +0.671875f,0.554688f, +0.679688f,0.554688f, +0.6875f,0.554688f, +0.695313f,0.554688f, +0.703125f,0.554688f, +0.710938f,0.554688f, +0.71875f,0.554688f, +0.726563f,0.554688f, +0.734375f,0.554688f, +0.742188f,0.554688f, +0.75f,0.554688f, +0.757813f,0.554688f, +0.765625f,0.554688f, +0.773438f,0.554688f, +0.78125f,0.554688f, +0.789063f,0.554688f, +0.796875f,0.554688f, +0.804688f,0.554688f, +0.8125f,0.554688f, +0.820313f,0.554688f, +0.828125f,0.554688f, +0.835938f,0.554688f, +0.84375f,0.554688f, +0.851563f,0.554688f, +0.859375f,0.554688f, +0.867188f,0.554688f, +0.875f,0.554688f, +0.882813f,0.554688f, +0.890625f,0.554688f, +0.898438f,0.554688f, +0.90625f,0.554688f, +0.914063f,0.554688f, +0.921875f,0.554688f, +0.929688f,0.554688f, +0.9375f,0.554688f, +0.945313f,0.554688f, +0.953125f,0.554688f, +0.960938f,0.554688f, +0.96875f,0.554688f, +0.976563f,0.554688f, +0.984375f,0.554688f, +0.992188f,0.554688f, +1.0f,0.554688f, +0.507813f,0.5625f, +0.515625f,0.5625f, +0.523438f,0.5625f, +0.53125f,0.5625f, +0.539063f,0.5625f, +0.546875f,0.5625f, +0.554688f,0.5625f, +0.5625f,0.5625f, +0.570313f,0.5625f, +0.578125f,0.5625f, +0.585938f,0.5625f, +0.59375f,0.5625f, +0.601563f,0.5625f, +0.609375f,0.5625f, +0.617188f,0.5625f, +0.625f,0.5625f, +0.632813f,0.5625f, +0.640625f,0.5625f, +0.648438f,0.5625f, +0.65625f,0.5625f, +0.664063f,0.5625f, +0.671875f,0.5625f, +0.679688f,0.5625f, +0.6875f,0.5625f, +0.695313f,0.5625f, +0.703125f,0.5625f, +0.710938f,0.5625f, +0.71875f,0.5625f, +0.726563f,0.5625f, +0.734375f,0.5625f, +0.742188f,0.5625f, +0.75f,0.5625f, +0.757813f,0.5625f, +0.765625f,0.5625f, +0.773438f,0.5625f, +0.78125f,0.5625f, +0.789063f,0.5625f, +0.796875f,0.5625f, +0.804688f,0.5625f, +0.8125f,0.5625f, +0.820313f,0.5625f, +0.828125f,0.5625f, +0.835938f,0.5625f, +0.84375f,0.5625f, +0.851563f,0.5625f, +0.859375f,0.5625f, +0.867188f,0.5625f, +0.875f,0.5625f, +0.882813f,0.5625f, +0.890625f,0.5625f, +0.898438f,0.5625f, +0.90625f,0.5625f, +0.914063f,0.5625f, +0.921875f,0.5625f, +0.929688f,0.5625f, +0.9375f,0.5625f, +0.945313f,0.5625f, +0.953125f,0.5625f, +0.960938f,0.5625f, +0.96875f,0.5625f, +0.976563f,0.5625f, +0.984375f,0.5625f, +0.992188f,0.5625f, +1.0f,0.5625f, +0.507813f,0.570313f, +0.515625f,0.570313f, +0.523438f,0.570313f, +0.53125f,0.570313f, +0.539063f,0.570313f, +0.546875f,0.570313f, +0.554688f,0.570313f, +0.5625f,0.570313f, +0.570313f,0.570313f, +0.578125f,0.570313f, +0.585938f,0.570313f, +0.59375f,0.570313f, +0.601563f,0.570313f, +0.609375f,0.570313f, +0.617188f,0.570313f, +0.625f,0.570313f, +0.632813f,0.570313f, +0.640625f,0.570313f, +0.648438f,0.570313f, +0.65625f,0.570313f, +0.664063f,0.570313f, +0.671875f,0.570313f, +0.679688f,0.570313f, +0.6875f,0.570313f, +0.695313f,0.570313f, +0.703125f,0.570313f, +0.710938f,0.570313f, +0.71875f,0.570313f, +0.726563f,0.570313f, +0.734375f,0.570313f, +0.742188f,0.570313f, +0.75f,0.570313f, +0.757813f,0.570313f, +0.765625f,0.570313f, +0.773438f,0.570313f, +0.78125f,0.570313f, +0.789063f,0.570313f, +0.796875f,0.570313f, +0.804688f,0.570313f, +0.8125f,0.570313f, +0.820313f,0.570313f, +0.828125f,0.570313f, +0.835938f,0.570313f, +0.84375f,0.570313f, +0.851563f,0.570313f, +0.859375f,0.570313f, +0.867188f,0.570313f, +0.875f,0.570313f, +0.882813f,0.570313f, +0.890625f,0.570313f, +0.898438f,0.570313f, +0.90625f,0.570313f, +0.914063f,0.570313f, +0.921875f,0.570313f, +0.929688f,0.570313f, +0.9375f,0.570313f, +0.945313f,0.570313f, +0.953125f,0.570313f, +0.960938f,0.570313f, +0.96875f,0.570313f, +0.976563f,0.570313f, +0.984375f,0.570313f, +0.992188f,0.570313f, +1.0f,0.570313f, +0.507813f,0.578125f, +0.515625f,0.578125f, +0.523438f,0.578125f, +0.53125f,0.578125f, +0.539063f,0.578125f, +0.546875f,0.578125f, +0.554688f,0.578125f, +0.5625f,0.578125f, +0.570313f,0.578125f, +0.578125f,0.578125f, +0.585938f,0.578125f, +0.59375f,0.578125f, +0.601563f,0.578125f, +0.609375f,0.578125f, +0.617188f,0.578125f, +0.625f,0.578125f, +0.632813f,0.578125f, +0.640625f,0.578125f, +0.648438f,0.578125f, +0.65625f,0.578125f, +0.664063f,0.578125f, +0.671875f,0.578125f, +0.679688f,0.578125f, +0.6875f,0.578125f, +0.695313f,0.578125f, +0.703125f,0.578125f, +0.710938f,0.578125f, +0.71875f,0.578125f, +0.726563f,0.578125f, +0.734375f,0.578125f, +0.742188f,0.578125f, +0.75f,0.578125f, +0.757813f,0.578125f, +0.765625f,0.578125f, +0.773438f,0.578125f, +0.78125f,0.578125f, +0.789063f,0.578125f, +0.796875f,0.578125f, +0.804688f,0.578125f, +0.8125f,0.578125f, +0.820313f,0.578125f, +0.828125f,0.578125f, +0.835938f,0.578125f, +0.84375f,0.578125f, +0.851563f,0.578125f, +0.859375f,0.578125f, +0.867188f,0.578125f, +0.875f,0.578125f, +0.882813f,0.578125f, +0.890625f,0.578125f, +0.898438f,0.578125f, +0.90625f,0.578125f, +0.914063f,0.578125f, +0.921875f,0.578125f, +0.929688f,0.578125f, +0.9375f,0.578125f, +0.945313f,0.578125f, +0.953125f,0.578125f, +0.960938f,0.578125f, +0.96875f,0.578125f, +0.976563f,0.578125f, +0.984375f,0.578125f, +0.992188f,0.578125f, +1.0f,0.578125f, +0.507813f,0.585938f, +0.515625f,0.585938f, +0.523438f,0.585938f, +0.53125f,0.585938f, +0.539063f,0.585938f, +0.546875f,0.585938f, +0.554688f,0.585938f, +0.5625f,0.585938f, +0.570313f,0.585938f, +0.578125f,0.585938f, +0.585938f,0.585938f, +0.59375f,0.585938f, +0.601563f,0.585938f, +0.609375f,0.585938f, +0.617188f,0.585938f, +0.625f,0.585938f, +0.632813f,0.585938f, +0.640625f,0.585938f, +0.648438f,0.585938f, +0.65625f,0.585938f, +0.664063f,0.585938f, +0.671875f,0.585938f, +0.679688f,0.585938f, +0.6875f,0.585938f, +0.695313f,0.585938f, +0.703125f,0.585938f, +0.710938f,0.585938f, +0.71875f,0.585938f, +0.726563f,0.585938f, +0.734375f,0.585938f, +0.742188f,0.585938f, +0.75f,0.585938f, +0.757813f,0.585938f, +0.765625f,0.585938f, +0.773438f,0.585938f, +0.78125f,0.585938f, +0.789063f,0.585938f, +0.796875f,0.585938f, +0.804688f,0.585938f, +0.8125f,0.585938f, +0.820313f,0.585938f, +0.828125f,0.585938f, +0.835938f,0.585938f, +0.84375f,0.585938f, +0.851563f,0.585938f, +0.859375f,0.585938f, +0.867188f,0.585938f, +0.875f,0.585938f, +0.882813f,0.585938f, +0.890625f,0.585938f, +0.898438f,0.585938f, +0.90625f,0.585938f, +0.914063f,0.585938f, +0.921875f,0.585938f, +0.929688f,0.585938f, +0.9375f,0.585938f, +0.945313f,0.585938f, +0.953125f,0.585938f, +0.960938f,0.585938f, +0.96875f,0.585938f, +0.976563f,0.585938f, +0.984375f,0.585938f, +0.992188f,0.585938f, +1.0f,0.585938f, +0.507813f,0.59375f, +0.515625f,0.59375f, +0.523438f,0.59375f, +0.53125f,0.59375f, +0.539063f,0.59375f, +0.546875f,0.59375f, +0.554688f,0.59375f, +0.5625f,0.59375f, +0.570313f,0.59375f, +0.578125f,0.59375f, +0.585938f,0.59375f, +0.59375f,0.59375f, +0.601563f,0.59375f, +0.609375f,0.59375f, +0.617188f,0.59375f, +0.625f,0.59375f, +0.632813f,0.59375f, +0.640625f,0.59375f, +0.648438f,0.59375f, +0.65625f,0.59375f, +0.664063f,0.59375f, +0.671875f,0.59375f, +0.679688f,0.59375f, +0.6875f,0.59375f, +0.695313f,0.59375f, +0.703125f,0.59375f, +0.710938f,0.59375f, +0.71875f,0.59375f, +0.726563f,0.59375f, +0.734375f,0.59375f, +0.742188f,0.59375f, +0.75f,0.59375f, +0.757813f,0.59375f, +0.765625f,0.59375f, +0.773438f,0.59375f, +0.78125f,0.59375f, +0.789063f,0.59375f, +0.796875f,0.59375f, +0.804688f,0.59375f, +0.8125f,0.59375f, +0.820313f,0.59375f, +0.828125f,0.59375f, +0.835938f,0.59375f, +0.84375f,0.59375f, +0.851563f,0.59375f, +0.859375f,0.59375f, +0.867188f,0.59375f, +0.875f,0.59375f, +0.882813f,0.59375f, +0.890625f,0.59375f, +0.898438f,0.59375f, +0.90625f,0.59375f, +0.914063f,0.59375f, +0.921875f,0.59375f, +0.929688f,0.59375f, +0.9375f,0.59375f, +0.945313f,0.59375f, +0.953125f,0.59375f, +0.960938f,0.59375f, +0.96875f,0.59375f, +0.976563f,0.59375f, +0.984375f,0.59375f, +0.992188f,0.59375f, +1.0f,0.59375f, +0.507813f,0.601563f, +0.515625f,0.601563f, +0.523438f,0.601563f, +0.53125f,0.601563f, +0.539063f,0.601563f, +0.546875f,0.601563f, +0.554688f,0.601563f, +0.5625f,0.601563f, +0.570313f,0.601563f, +0.578125f,0.601563f, +0.585938f,0.601563f, +0.59375f,0.601563f, +0.601563f,0.601563f, +0.609375f,0.601563f, +0.617188f,0.601563f, +0.625f,0.601563f, +0.632813f,0.601563f, +0.640625f,0.601563f, +0.648438f,0.601563f, +0.65625f,0.601563f, +0.664063f,0.601563f, +0.671875f,0.601563f, +0.679688f,0.601563f, +0.6875f,0.601563f, +0.695313f,0.601563f, +0.703125f,0.601563f, +0.710938f,0.601563f, +0.71875f,0.601563f, +0.726563f,0.601563f, +0.734375f,0.601563f, +0.742188f,0.601563f, +0.75f,0.601563f, +0.757813f,0.601563f, +0.765625f,0.601563f, +0.773438f,0.601563f, +0.78125f,0.601563f, +0.789063f,0.601563f, +0.796875f,0.601563f, +0.804688f,0.601563f, +0.8125f,0.601563f, +0.820313f,0.601563f, +0.828125f,0.601563f, +0.835938f,0.601563f, +0.84375f,0.601563f, +0.851563f,0.601563f, +0.859375f,0.601563f, +0.867188f,0.601563f, +0.875f,0.601563f, +0.882813f,0.601563f, +0.890625f,0.601563f, +0.898438f,0.601563f, +0.90625f,0.601563f, +0.914063f,0.601563f, +0.921875f,0.601563f, +0.929688f,0.601563f, +0.9375f,0.601563f, +0.945313f,0.601563f, +0.953125f,0.601563f, +0.960938f,0.601563f, +0.96875f,0.601563f, +0.976563f,0.601563f, +0.984375f,0.601563f, +0.992188f,0.601563f, +1.0f,0.601563f, +0.507813f,0.609375f, +0.515625f,0.609375f, +0.523438f,0.609375f, +0.53125f,0.609375f, +0.539063f,0.609375f, +0.546875f,0.609375f, +0.554688f,0.609375f, +0.5625f,0.609375f, +0.570313f,0.609375f, +0.578125f,0.609375f, +0.585938f,0.609375f, +0.59375f,0.609375f, +0.601563f,0.609375f, +0.609375f,0.609375f, +0.617188f,0.609375f, +0.625f,0.609375f, +0.632813f,0.609375f, +0.640625f,0.609375f, +0.648438f,0.609375f, +0.65625f,0.609375f, +0.664063f,0.609375f, +0.671875f,0.609375f, +0.679688f,0.609375f, +0.6875f,0.609375f, +0.695313f,0.609375f, +0.703125f,0.609375f, +0.710938f,0.609375f, +0.71875f,0.609375f, +0.726563f,0.609375f, +0.734375f,0.609375f, +0.742188f,0.609375f, +0.75f,0.609375f, +0.757813f,0.609375f, +0.765625f,0.609375f, +0.773438f,0.609375f, +0.78125f,0.609375f, +0.789063f,0.609375f, +0.796875f,0.609375f, +0.804688f,0.609375f, +0.8125f,0.609375f, +0.820313f,0.609375f, +0.828125f,0.609375f, +0.835938f,0.609375f, +0.84375f,0.609375f, +0.851563f,0.609375f, +0.859375f,0.609375f, +0.867188f,0.609375f, +0.875f,0.609375f, +0.882813f,0.609375f, +0.890625f,0.609375f, +0.898438f,0.609375f, +0.90625f,0.609375f, +0.914063f,0.609375f, +0.921875f,0.609375f, +0.929688f,0.609375f, +0.9375f,0.609375f, +0.945313f,0.609375f, +0.953125f,0.609375f, +0.960938f,0.609375f, +0.96875f,0.609375f, +0.976563f,0.609375f, +0.984375f,0.609375f, +0.992188f,0.609375f, +1.0f,0.609375f, +0.507813f,0.617188f, +0.515625f,0.617188f, +0.523438f,0.617188f, +0.53125f,0.617188f, +0.539063f,0.617188f, +0.546875f,0.617188f, +0.554688f,0.617188f, +0.5625f,0.617188f, +0.570313f,0.617188f, +0.578125f,0.617188f, +0.585938f,0.617188f, +0.59375f,0.617188f, +0.601563f,0.617188f, +0.609375f,0.617188f, +0.617188f,0.617188f, +0.625f,0.617188f, +0.632813f,0.617188f, +0.640625f,0.617188f, +0.648438f,0.617188f, +0.65625f,0.617188f, +0.664063f,0.617188f, +0.671875f,0.617188f, +0.679688f,0.617188f, +0.6875f,0.617188f, +0.695313f,0.617188f, +0.703125f,0.617188f, +0.710938f,0.617188f, +0.71875f,0.617188f, +0.726563f,0.617188f, +0.734375f,0.617188f, +0.742188f,0.617188f, +0.75f,0.617188f, +0.757813f,0.617188f, +0.765625f,0.617188f, +0.773438f,0.617188f, +0.78125f,0.617188f, +0.789063f,0.617188f, +0.796875f,0.617188f, +0.804688f,0.617188f, +0.8125f,0.617188f, +0.820313f,0.617188f, +0.828125f,0.617188f, +0.835938f,0.617188f, +0.84375f,0.617188f, +0.851563f,0.617188f, +0.859375f,0.617188f, +0.867188f,0.617188f, +0.875f,0.617188f, +0.882813f,0.617188f, +0.890625f,0.617188f, +0.898438f,0.617188f, +0.90625f,0.617188f, +0.914063f,0.617188f, +0.921875f,0.617188f, +0.929688f,0.617188f, +0.9375f,0.617188f, +0.945313f,0.617188f, +0.953125f,0.617188f, +0.960938f,0.617188f, +0.96875f,0.617188f, +0.976563f,0.617188f, +0.984375f,0.617188f, +0.992188f,0.617188f, +1.0f,0.617188f, +0.507813f,0.625f, +0.515625f,0.625f, +0.523438f,0.625f, +0.53125f,0.625f, +0.539063f,0.625f, +0.546875f,0.625f, +0.554688f,0.625f, +0.5625f,0.625f, +0.570313f,0.625f, +0.578125f,0.625f, +0.585938f,0.625f, +0.59375f,0.625f, +0.601563f,0.625f, +0.609375f,0.625f, +0.617188f,0.625f, +0.625f,0.625f, +0.632813f,0.625f, +0.640625f,0.625f, +0.648438f,0.625f, +0.65625f,0.625f, +0.664063f,0.625f, +0.671875f,0.625f, +0.679688f,0.625f, +0.6875f,0.625f, +0.695313f,0.625f, +0.703125f,0.625f, +0.710938f,0.625f, +0.71875f,0.625f, +0.726563f,0.625f, +0.734375f,0.625f, +0.742188f,0.625f, +0.75f,0.625f, +0.757813f,0.625f, +0.765625f,0.625f, +0.773438f,0.625f, +0.78125f,0.625f, +0.789063f,0.625f, +0.796875f,0.625f, +0.804688f,0.625f, +0.8125f,0.625f, +0.820313f,0.625f, +0.828125f,0.625f, +0.835938f,0.625f, +0.84375f,0.625f, +0.851563f,0.625f, +0.859375f,0.625f, +0.867188f,0.625f, +0.875f,0.625f, +0.882813f,0.625f, +0.890625f,0.625f, +0.898438f,0.625f, +0.90625f,0.625f, +0.914063f,0.625f, +0.921875f,0.625f, +0.929688f,0.625f, +0.9375f,0.625f, +0.945313f,0.625f, +0.953125f,0.625f, +0.960938f,0.625f, +0.96875f,0.625f, +0.976563f,0.625f, +0.984375f,0.625f, +0.992188f,0.625f, +1.0f,0.625f, +0.507813f,0.632813f, +0.515625f,0.632813f, +0.523438f,0.632813f, +0.53125f,0.632813f, +0.539063f,0.632813f, +0.546875f,0.632813f, +0.554688f,0.632813f, +0.5625f,0.632813f, +0.570313f,0.632813f, +0.578125f,0.632813f, +0.585938f,0.632813f, +0.59375f,0.632813f, +0.601563f,0.632813f, +0.609375f,0.632813f, +0.617188f,0.632813f, +0.625f,0.632813f, +0.632813f,0.632813f, +0.640625f,0.632813f, +0.648438f,0.632813f, +0.65625f,0.632813f, +0.664063f,0.632813f, +0.671875f,0.632813f, +0.679688f,0.632813f, +0.6875f,0.632813f, +0.695313f,0.632813f, +0.703125f,0.632813f, +0.710938f,0.632813f, +0.71875f,0.632813f, +0.726563f,0.632813f, +0.734375f,0.632813f, +0.742188f,0.632813f, +0.75f,0.632813f, +0.757813f,0.632813f, +0.765625f,0.632813f, +0.773438f,0.632813f, +0.78125f,0.632813f, +0.789063f,0.632813f, +0.796875f,0.632813f, +0.804688f,0.632813f, +0.8125f,0.632813f, +0.820313f,0.632813f, +0.828125f,0.632813f, +0.835938f,0.632813f, +0.84375f,0.632813f, +0.851563f,0.632813f, +0.859375f,0.632813f, +0.867188f,0.632813f, +0.875f,0.632813f, +0.882813f,0.632813f, +0.890625f,0.632813f, +0.898438f,0.632813f, +0.90625f,0.632813f, +0.914063f,0.632813f, +0.921875f,0.632813f, +0.929688f,0.632813f, +0.9375f,0.632813f, +0.945313f,0.632813f, +0.953125f,0.632813f, +0.960938f,0.632813f, +0.96875f,0.632813f, +0.976563f,0.632813f, +0.984375f,0.632813f, +0.992188f,0.632813f, +1.0f,0.632813f, +0.507813f,0.640625f, +0.515625f,0.640625f, +0.523438f,0.640625f, +0.53125f,0.640625f, +0.539063f,0.640625f, +0.546875f,0.640625f, +0.554688f,0.640625f, +0.5625f,0.640625f, +0.570313f,0.640625f, +0.578125f,0.640625f, +0.585938f,0.640625f, +0.59375f,0.640625f, +0.601563f,0.640625f, +0.609375f,0.640625f, +0.617188f,0.640625f, +0.625f,0.640625f, +0.632813f,0.640625f, +0.640625f,0.640625f, +0.648438f,0.640625f, +0.65625f,0.640625f, +0.664063f,0.640625f, +0.671875f,0.640625f, +0.679688f,0.640625f, +0.6875f,0.640625f, +0.695313f,0.640625f, +0.703125f,0.640625f, +0.710938f,0.640625f, +0.71875f,0.640625f, +0.726563f,0.640625f, +0.734375f,0.640625f, +0.742188f,0.640625f, +0.75f,0.640625f, +0.757813f,0.640625f, +0.765625f,0.640625f, +0.773438f,0.640625f, +0.78125f,0.640625f, +0.789063f,0.640625f, +0.796875f,0.640625f, +0.804688f,0.640625f, +0.8125f,0.640625f, +0.820313f,0.640625f, +0.828125f,0.640625f, +0.835938f,0.640625f, +0.84375f,0.640625f, +0.851563f,0.640625f, +0.859375f,0.640625f, +0.867188f,0.640625f, +0.875f,0.640625f, +0.882813f,0.640625f, +0.890625f,0.640625f, +0.898438f,0.640625f, +0.90625f,0.640625f, +0.914063f,0.640625f, +0.921875f,0.640625f, +0.929688f,0.640625f, +0.9375f,0.640625f, +0.945313f,0.640625f, +0.953125f,0.640625f, +0.960938f,0.640625f, +0.96875f,0.640625f, +0.976563f,0.640625f, +0.984375f,0.640625f, +0.992188f,0.640625f, +1.0f,0.640625f, +0.507813f,0.648438f, +0.515625f,0.648438f, +0.523438f,0.648438f, +0.53125f,0.648438f, +0.539063f,0.648438f, +0.546875f,0.648438f, +0.554688f,0.648438f, +0.5625f,0.648438f, +0.570313f,0.648438f, +0.578125f,0.648438f, +0.585938f,0.648438f, +0.59375f,0.648438f, +0.601563f,0.648438f, +0.609375f,0.648438f, +0.617188f,0.648438f, +0.625f,0.648438f, +0.632813f,0.648438f, +0.640625f,0.648438f, +0.648438f,0.648438f, +0.65625f,0.648438f, +0.664063f,0.648438f, +0.671875f,0.648438f, +0.679688f,0.648438f, +0.6875f,0.648438f, +0.695313f,0.648438f, +0.703125f,0.648438f, +0.710938f,0.648438f, +0.71875f,0.648438f, +0.726563f,0.648438f, +0.734375f,0.648438f, +0.742188f,0.648438f, +0.75f,0.648438f, +0.757813f,0.648438f, +0.765625f,0.648438f, +0.773438f,0.648438f, +0.78125f,0.648438f, +0.789063f,0.648438f, +0.796875f,0.648438f, +0.804688f,0.648438f, +0.8125f,0.648438f, +0.820313f,0.648438f, +0.828125f,0.648438f, +0.835938f,0.648438f, +0.84375f,0.648438f, +0.851563f,0.648438f, +0.859375f,0.648438f, +0.867188f,0.648438f, +0.875f,0.648438f, +0.882813f,0.648438f, +0.890625f,0.648438f, +0.898438f,0.648438f, +0.90625f,0.648438f, +0.914063f,0.648438f, +0.921875f,0.648438f, +0.929688f,0.648438f, +0.9375f,0.648438f, +0.945313f,0.648438f, +0.953125f,0.648438f, +0.960938f,0.648438f, +0.96875f,0.648438f, +0.976563f,0.648438f, +0.984375f,0.648438f, +0.992188f,0.648438f, +1.0f,0.648438f, +0.507813f,0.65625f, +0.515625f,0.65625f, +0.523438f,0.65625f, +0.53125f,0.65625f, +0.539063f,0.65625f, +0.546875f,0.65625f, +0.554688f,0.65625f, +0.5625f,0.65625f, +0.570313f,0.65625f, +0.578125f,0.65625f, +0.585938f,0.65625f, +0.59375f,0.65625f, +0.601563f,0.65625f, +0.609375f,0.65625f, +0.617188f,0.65625f, +0.625f,0.65625f, +0.632813f,0.65625f, +0.640625f,0.65625f, +0.648438f,0.65625f, +0.65625f,0.65625f, +0.664063f,0.65625f, +0.671875f,0.65625f, +0.679688f,0.65625f, +0.6875f,0.65625f, +0.695313f,0.65625f, +0.703125f,0.65625f, +0.710938f,0.65625f, +0.71875f,0.65625f, +0.726563f,0.65625f, +0.734375f,0.65625f, +0.742188f,0.65625f, +0.75f,0.65625f, +0.757813f,0.65625f, +0.765625f,0.65625f, +0.773438f,0.65625f, +0.78125f,0.65625f, +0.789063f,0.65625f, +0.796875f,0.65625f, +0.804688f,0.65625f, +0.8125f,0.65625f, +0.820313f,0.65625f, +0.828125f,0.65625f, +0.835938f,0.65625f, +0.84375f,0.65625f, +0.851563f,0.65625f, +0.859375f,0.65625f, +0.867188f,0.65625f, +0.875f,0.65625f, +0.882813f,0.65625f, +0.890625f,0.65625f, +0.898438f,0.65625f, +0.90625f,0.65625f, +0.914063f,0.65625f, +0.921875f,0.65625f, +0.929688f,0.65625f, +0.9375f,0.65625f, +0.945313f,0.65625f, +0.953125f,0.65625f, +0.960938f,0.65625f, +0.96875f,0.65625f, +0.976563f,0.65625f, +0.984375f,0.65625f, +0.992188f,0.65625f, +1.0f,0.65625f, +0.507813f,0.664063f, +0.515625f,0.664063f, +0.523438f,0.664063f, +0.53125f,0.664063f, +0.539063f,0.664063f, +0.546875f,0.664063f, +0.554688f,0.664063f, +0.5625f,0.664063f, +0.570313f,0.664063f, +0.578125f,0.664063f, +0.585938f,0.664063f, +0.59375f,0.664063f, +0.601563f,0.664063f, +0.609375f,0.664063f, +0.617188f,0.664063f, +0.625f,0.664063f, +0.632813f,0.664063f, +0.640625f,0.664063f, +0.648438f,0.664063f, +0.65625f,0.664063f, +0.664063f,0.664063f, +0.671875f,0.664063f, +0.679688f,0.664063f, +0.6875f,0.664063f, +0.695313f,0.664063f, +0.703125f,0.664063f, +0.710938f,0.664063f, +0.71875f,0.664063f, +0.726563f,0.664063f, +0.734375f,0.664063f, +0.742188f,0.664063f, +0.75f,0.664063f, +0.757813f,0.664063f, +0.765625f,0.664063f, +0.773438f,0.664063f, +0.78125f,0.664063f, +0.789063f,0.664063f, +0.796875f,0.664063f, +0.804688f,0.664063f, +0.8125f,0.664063f, +0.820313f,0.664063f, +0.828125f,0.664063f, +0.835938f,0.664063f, +0.84375f,0.664063f, +0.851563f,0.664063f, +0.859375f,0.664063f, +0.867188f,0.664063f, +0.875f,0.664063f, +0.882813f,0.664063f, +0.890625f,0.664063f, +0.898438f,0.664063f, +0.90625f,0.664063f, +0.914063f,0.664063f, +0.921875f,0.664063f, +0.929688f,0.664063f, +0.9375f,0.664063f, +0.945313f,0.664063f, +0.953125f,0.664063f, +0.960938f,0.664063f, +0.96875f,0.664063f, +0.976563f,0.664063f, +0.984375f,0.664063f, +0.992188f,0.664063f, +1.0f,0.664063f, +0.507813f,0.671875f, +0.515625f,0.671875f, +0.523438f,0.671875f, +0.53125f,0.671875f, +0.539063f,0.671875f, +0.546875f,0.671875f, +0.554688f,0.671875f, +0.5625f,0.671875f, +0.570313f,0.671875f, +0.578125f,0.671875f, +0.585938f,0.671875f, +0.59375f,0.671875f, +0.601563f,0.671875f, +0.609375f,0.671875f, +0.617188f,0.671875f, +0.625f,0.671875f, +0.632813f,0.671875f, +0.640625f,0.671875f, +0.648438f,0.671875f, +0.65625f,0.671875f, +0.664063f,0.671875f, +0.671875f,0.671875f, +0.679688f,0.671875f, +0.6875f,0.671875f, +0.695313f,0.671875f, +0.703125f,0.671875f, +0.710938f,0.671875f, +0.71875f,0.671875f, +0.726563f,0.671875f, +0.734375f,0.671875f, +0.742188f,0.671875f, +0.75f,0.671875f, +0.757813f,0.671875f, +0.765625f,0.671875f, +0.773438f,0.671875f, +0.78125f,0.671875f, +0.789063f,0.671875f, +0.796875f,0.671875f, +0.804688f,0.671875f, +0.8125f,0.671875f, +0.820313f,0.671875f, +0.828125f,0.671875f, +0.835938f,0.671875f, +0.84375f,0.671875f, +0.851563f,0.671875f, +0.859375f,0.671875f, +0.867188f,0.671875f, +0.875f,0.671875f, +0.882813f,0.671875f, +0.890625f,0.671875f, +0.898438f,0.671875f, +0.90625f,0.671875f, +0.914063f,0.671875f, +0.921875f,0.671875f, +0.929688f,0.671875f, +0.9375f,0.671875f, +0.945313f,0.671875f, +0.953125f,0.671875f, +0.960938f,0.671875f, +0.96875f,0.671875f, +0.976563f,0.671875f, +0.984375f,0.671875f, +0.992188f,0.671875f, +1.0f,0.671875f, +0.507813f,0.679688f, +0.515625f,0.679688f, +0.523438f,0.679688f, +0.53125f,0.679688f, +0.539063f,0.679688f, +0.546875f,0.679688f, +0.554688f,0.679688f, +0.5625f,0.679688f, +0.570313f,0.679688f, +0.578125f,0.679688f, +0.585938f,0.679688f, +0.59375f,0.679688f, +0.601563f,0.679688f, +0.609375f,0.679688f, +0.617188f,0.679688f, +0.625f,0.679688f, +0.632813f,0.679688f, +0.640625f,0.679688f, +0.648438f,0.679688f, +0.65625f,0.679688f, +0.664063f,0.679688f, +0.671875f,0.679688f, +0.679688f,0.679688f, +0.6875f,0.679688f, +0.695313f,0.679688f, +0.703125f,0.679688f, +0.710938f,0.679688f, +0.71875f,0.679688f, +0.726563f,0.679688f, +0.734375f,0.679688f, +0.742188f,0.679688f, +0.75f,0.679688f, +0.757813f,0.679688f, +0.765625f,0.679688f, +0.773438f,0.679688f, +0.78125f,0.679688f, +0.789063f,0.679688f, +0.796875f,0.679688f, +0.804688f,0.679688f, +0.8125f,0.679688f, +0.820313f,0.679688f, +0.828125f,0.679688f, +0.835938f,0.679688f, +0.84375f,0.679688f, +0.851563f,0.679688f, +0.859375f,0.679688f, +0.867188f,0.679688f, +0.875f,0.679688f, +0.882813f,0.679688f, +0.890625f,0.679688f, +0.898438f,0.679688f, +0.90625f,0.679688f, +0.914063f,0.679688f, +0.921875f,0.679688f, +0.929688f,0.679688f, +0.9375f,0.679688f, +0.945313f,0.679688f, +0.953125f,0.679688f, +0.960938f,0.679688f, +0.96875f,0.679688f, +0.976563f,0.679688f, +0.984375f,0.679688f, +0.992188f,0.679688f, +1.0f,0.679688f, +0.507813f,0.6875f, +0.515625f,0.6875f, +0.523438f,0.6875f, +0.53125f,0.6875f, +0.539063f,0.6875f, +0.546875f,0.6875f, +0.554688f,0.6875f, +0.5625f,0.6875f, +0.570313f,0.6875f, +0.578125f,0.6875f, +0.585938f,0.6875f, +0.59375f,0.6875f, +0.601563f,0.6875f, +0.609375f,0.6875f, +0.617188f,0.6875f, +0.625f,0.6875f, +0.632813f,0.6875f, +0.640625f,0.6875f, +0.648438f,0.6875f, +0.65625f,0.6875f, +0.664063f,0.6875f, +0.671875f,0.6875f, +0.679688f,0.6875f, +0.6875f,0.6875f, +0.695313f,0.6875f, +0.703125f,0.6875f, +0.710938f,0.6875f, +0.71875f,0.6875f, +0.726563f,0.6875f, +0.734375f,0.6875f, +0.742188f,0.6875f, +0.75f,0.6875f, +0.757813f,0.6875f, +0.765625f,0.6875f, +0.773438f,0.6875f, +0.78125f,0.6875f, +0.789063f,0.6875f, +0.796875f,0.6875f, +0.804688f,0.6875f, +0.8125f,0.6875f, +0.820313f,0.6875f, +0.828125f,0.6875f, +0.835938f,0.6875f, +0.84375f,0.6875f, +0.851563f,0.6875f, +0.859375f,0.6875f, +0.867188f,0.6875f, +0.875f,0.6875f, +0.882813f,0.6875f, +0.890625f,0.6875f, +0.898438f,0.6875f, +0.90625f,0.6875f, +0.914063f,0.6875f, +0.921875f,0.6875f, +0.929688f,0.6875f, +0.9375f,0.6875f, +0.945313f,0.6875f, +0.953125f,0.6875f, +0.960938f,0.6875f, +0.96875f,0.6875f, +0.976563f,0.6875f, +0.984375f,0.6875f, +0.992188f,0.6875f, +1.0f,0.6875f, +0.507813f,0.695313f, +0.515625f,0.695313f, +0.523438f,0.695313f, +0.53125f,0.695313f, +0.539063f,0.695313f, +0.546875f,0.695313f, +0.554688f,0.695313f, +0.5625f,0.695313f, +0.570313f,0.695313f, +0.578125f,0.695313f, +0.585938f,0.695313f, +0.59375f,0.695313f, +0.601563f,0.695313f, +0.609375f,0.695313f, +0.617188f,0.695313f, +0.625f,0.695313f, +0.632813f,0.695313f, +0.640625f,0.695313f, +0.648438f,0.695313f, +0.65625f,0.695313f, +0.664063f,0.695313f, +0.671875f,0.695313f, +0.679688f,0.695313f, +0.6875f,0.695313f, +0.695313f,0.695313f, +0.703125f,0.695313f, +0.710938f,0.695313f, +0.71875f,0.695313f, +0.726563f,0.695313f, +0.734375f,0.695313f, +0.742188f,0.695313f, +0.75f,0.695313f, +0.757813f,0.695313f, +0.765625f,0.695313f, +0.773438f,0.695313f, +0.78125f,0.695313f, +0.789063f,0.695313f, +0.796875f,0.695313f, +0.804688f,0.695313f, +0.8125f,0.695313f, +0.820313f,0.695313f, +0.828125f,0.695313f, +0.835938f,0.695313f, +0.84375f,0.695313f, +0.851563f,0.695313f, +0.859375f,0.695313f, +0.867188f,0.695313f, +0.875f,0.695313f, +0.882813f,0.695313f, +0.890625f,0.695313f, +0.898438f,0.695313f, +0.90625f,0.695313f, +0.914063f,0.695313f, +0.921875f,0.695313f, +0.929688f,0.695313f, +0.9375f,0.695313f, +0.945313f,0.695313f, +0.953125f,0.695313f, +0.960938f,0.695313f, +0.96875f,0.695313f, +0.976563f,0.695313f, +0.984375f,0.695313f, +0.992188f,0.695313f, +1.0f,0.695313f, +0.507813f,0.703125f, +0.515625f,0.703125f, +0.523438f,0.703125f, +0.53125f,0.703125f, +0.539063f,0.703125f, +0.546875f,0.703125f, +0.554688f,0.703125f, +0.5625f,0.703125f, +0.570313f,0.703125f, +0.578125f,0.703125f, +0.585938f,0.703125f, +0.59375f,0.703125f, +0.601563f,0.703125f, +0.609375f,0.703125f, +0.617188f,0.703125f, +0.625f,0.703125f, +0.632813f,0.703125f, +0.640625f,0.703125f, +0.648438f,0.703125f, +0.65625f,0.703125f, +0.664063f,0.703125f, +0.671875f,0.703125f, +0.679688f,0.703125f, +0.6875f,0.703125f, +0.695313f,0.703125f, +0.703125f,0.703125f, +0.710938f,0.703125f, +0.71875f,0.703125f, +0.726563f,0.703125f, +0.734375f,0.703125f, +0.742188f,0.703125f, +0.75f,0.703125f, +0.757813f,0.703125f, +0.765625f,0.703125f, +0.773438f,0.703125f, +0.78125f,0.703125f, +0.789063f,0.703125f, +0.796875f,0.703125f, +0.804688f,0.703125f, +0.8125f,0.703125f, +0.820313f,0.703125f, +0.828125f,0.703125f, +0.835938f,0.703125f, +0.84375f,0.703125f, +0.851563f,0.703125f, +0.859375f,0.703125f, +0.867188f,0.703125f, +0.875f,0.703125f, +0.882813f,0.703125f, +0.890625f,0.703125f, +0.898438f,0.703125f, +0.90625f,0.703125f, +0.914063f,0.703125f, +0.921875f,0.703125f, +0.929688f,0.703125f, +0.9375f,0.703125f, +0.945313f,0.703125f, +0.953125f,0.703125f, +0.960938f,0.703125f, +0.96875f,0.703125f, +0.976563f,0.703125f, +0.984375f,0.703125f, +0.992188f,0.703125f, +1.0f,0.703125f, +0.507813f,0.710938f, +0.515625f,0.710938f, +0.523438f,0.710938f, +0.53125f,0.710938f, +0.539063f,0.710938f, +0.546875f,0.710938f, +0.554688f,0.710938f, +0.5625f,0.710938f, +0.570313f,0.710938f, +0.578125f,0.710938f, +0.585938f,0.710938f, +0.59375f,0.710938f, +0.601563f,0.710938f, +0.609375f,0.710938f, +0.617188f,0.710938f, +0.625f,0.710938f, +0.632813f,0.710938f, +0.640625f,0.710938f, +0.648438f,0.710938f, +0.65625f,0.710938f, +0.664063f,0.710938f, +0.671875f,0.710938f, +0.679688f,0.710938f, +0.6875f,0.710938f, +0.695313f,0.710938f, +0.703125f,0.710938f, +0.710938f,0.710938f, +0.71875f,0.710938f, +0.726563f,0.710938f, +0.734375f,0.710938f, +0.742188f,0.710938f, +0.75f,0.710938f, +0.757813f,0.710938f, +0.765625f,0.710938f, +0.773438f,0.710938f, +0.78125f,0.710938f, +0.789063f,0.710938f, +0.796875f,0.710938f, +0.804688f,0.710938f, +0.8125f,0.710938f, +0.820313f,0.710938f, +0.828125f,0.710938f, +0.835938f,0.710938f, +0.84375f,0.710938f, +0.851563f,0.710938f, +0.859375f,0.710938f, +0.867188f,0.710938f, +0.875f,0.710938f, +0.882813f,0.710938f, +0.890625f,0.710938f, +0.898438f,0.710938f, +0.90625f,0.710938f, +0.914063f,0.710938f, +0.921875f,0.710938f, +0.929688f,0.710938f, +0.9375f,0.710938f, +0.945313f,0.710938f, +0.953125f,0.710938f, +0.960938f,0.710938f, +0.96875f,0.710938f, +0.976563f,0.710938f, +0.984375f,0.710938f, +0.992188f,0.710938f, +1.0f,0.710938f, +0.507813f,0.71875f, +0.515625f,0.71875f, +0.523438f,0.71875f, +0.53125f,0.71875f, +0.539063f,0.71875f, +0.546875f,0.71875f, +0.554688f,0.71875f, +0.5625f,0.71875f, +0.570313f,0.71875f, +0.578125f,0.71875f, +0.585938f,0.71875f, +0.59375f,0.71875f, +0.601563f,0.71875f, +0.609375f,0.71875f, +0.617188f,0.71875f, +0.625f,0.71875f, +0.632813f,0.71875f, +0.640625f,0.71875f, +0.648438f,0.71875f, +0.65625f,0.71875f, +0.664063f,0.71875f, +0.671875f,0.71875f, +0.679688f,0.71875f, +0.6875f,0.71875f, +0.695313f,0.71875f, +0.703125f,0.71875f, +0.710938f,0.71875f, +0.71875f,0.71875f, +0.726563f,0.71875f, +0.734375f,0.71875f, +0.742188f,0.71875f, +0.75f,0.71875f, +0.757813f,0.71875f, +0.765625f,0.71875f, +0.773438f,0.71875f, +0.78125f,0.71875f, +0.789063f,0.71875f, +0.796875f,0.71875f, +0.804688f,0.71875f, +0.8125f,0.71875f, +0.820313f,0.71875f, +0.828125f,0.71875f, +0.835938f,0.71875f, +0.84375f,0.71875f, +0.851563f,0.71875f, +0.859375f,0.71875f, +0.867188f,0.71875f, +0.875f,0.71875f, +0.882813f,0.71875f, +0.890625f,0.71875f, +0.898438f,0.71875f, +0.90625f,0.71875f, +0.914063f,0.71875f, +0.921875f,0.71875f, +0.929688f,0.71875f, +0.9375f,0.71875f, +0.945313f,0.71875f, +0.953125f,0.71875f, +0.960938f,0.71875f, +0.96875f,0.71875f, +0.976563f,0.71875f, +0.984375f,0.71875f, +0.992188f,0.71875f, +1.0f,0.71875f, +0.507813f,0.726563f, +0.515625f,0.726563f, +0.523438f,0.726563f, +0.53125f,0.726563f, +0.539063f,0.726563f, +0.546875f,0.726563f, +0.554688f,0.726563f, +0.5625f,0.726563f, +0.570313f,0.726563f, +0.578125f,0.726563f, +0.585938f,0.726563f, +0.59375f,0.726563f, +0.601563f,0.726563f, +0.609375f,0.726563f, +0.617188f,0.726563f, +0.625f,0.726563f, +0.632813f,0.726563f, +0.640625f,0.726563f, +0.648438f,0.726563f, +0.65625f,0.726563f, +0.664063f,0.726563f, +0.671875f,0.726563f, +0.679688f,0.726563f, +0.6875f,0.726563f, +0.695313f,0.726563f, +0.703125f,0.726563f, +0.710938f,0.726563f, +0.71875f,0.726563f, +0.726563f,0.726563f, +0.734375f,0.726563f, +0.742188f,0.726563f, +0.75f,0.726563f, +0.757813f,0.726563f, +0.765625f,0.726563f, +0.773438f,0.726563f, +0.78125f,0.726563f, +0.789063f,0.726563f, +0.796875f,0.726563f, +0.804688f,0.726563f, +0.8125f,0.726563f, +0.820313f,0.726563f, +0.828125f,0.726563f, +0.835938f,0.726563f, +0.84375f,0.726563f, +0.851563f,0.726563f, +0.859375f,0.726563f, +0.867188f,0.726563f, +0.875f,0.726563f, +0.882813f,0.726563f, +0.890625f,0.726563f, +0.898438f,0.726563f, +0.90625f,0.726563f, +0.914063f,0.726563f, +0.921875f,0.726563f, +0.929688f,0.726563f, +0.9375f,0.726563f, +0.945313f,0.726563f, +0.953125f,0.726563f, +0.960938f,0.726563f, +0.96875f,0.726563f, +0.976563f,0.726563f, +0.984375f,0.726563f, +0.992188f,0.726563f, +1.0f,0.726563f, +0.507813f,0.734375f, +0.515625f,0.734375f, +0.523438f,0.734375f, +0.53125f,0.734375f, +0.539063f,0.734375f, +0.546875f,0.734375f, +0.554688f,0.734375f, +0.5625f,0.734375f, +0.570313f,0.734375f, +0.578125f,0.734375f, +0.585938f,0.734375f, +0.59375f,0.734375f, +0.601563f,0.734375f, +0.609375f,0.734375f, +0.617188f,0.734375f, +0.625f,0.734375f, +0.632813f,0.734375f, +0.640625f,0.734375f, +0.648438f,0.734375f, +0.65625f,0.734375f, +0.664063f,0.734375f, +0.671875f,0.734375f, +0.679688f,0.734375f, +0.6875f,0.734375f, +0.695313f,0.734375f, +0.703125f,0.734375f, +0.710938f,0.734375f, +0.71875f,0.734375f, +0.726563f,0.734375f, +0.734375f,0.734375f, +0.742188f,0.734375f, +0.75f,0.734375f, +0.757813f,0.734375f, +0.765625f,0.734375f, +0.773438f,0.734375f, +0.78125f,0.734375f, +0.789063f,0.734375f, +0.796875f,0.734375f, +0.804688f,0.734375f, +0.8125f,0.734375f, +0.820313f,0.734375f, +0.828125f,0.734375f, +0.835938f,0.734375f, +0.84375f,0.734375f, +0.851563f,0.734375f, +0.859375f,0.734375f, +0.867188f,0.734375f, +0.875f,0.734375f, +0.882813f,0.734375f, +0.890625f,0.734375f, +0.898438f,0.734375f, +0.90625f,0.734375f, +0.914063f,0.734375f, +0.921875f,0.734375f, +0.929688f,0.734375f, +0.9375f,0.734375f, +0.945313f,0.734375f, +0.953125f,0.734375f, +0.960938f,0.734375f, +0.96875f,0.734375f, +0.976563f,0.734375f, +0.984375f,0.734375f, +0.992188f,0.734375f, +1.0f,0.734375f, +}; + +unsigned short Landscape03Idx[] = { +0,1,2, +3,2,1, +2,3,4, +5,4,3, +4,5,6, +7,6,5, +6,7,8, +9,8,7, +8,9,10, +11,10,9, +10,11,12, +13,12,11, +12,13,14, +15,14,13, +14,15,16, +17,16,15, +16,17,18, +19,18,17, +18,19,20, +21,20,19, +20,21,22, +23,22,21, +22,23,24, +25,24,23, +24,25,26, +27,26,25, +26,27,28, +29,28,27, +28,29,30, +31,30,29, +30,31,32, +33,32,31, +32,33,34, +35,34,33, +34,35,36, +37,36,35, +36,37,38, +39,38,37, +38,39,40, +41,40,39, +40,41,42, +43,42,41, +42,43,44, +45,44,43, +44,45,46, +47,46,45, +46,47,48, +49,48,47, +48,49,50, +51,50,49, +50,51,52, +53,52,51, +52,53,54, +55,54,53, +54,55,56, +57,56,55, +56,57,58, +59,58,57, +58,59,60, +61,60,59, +60,61,62, +63,62,61, +62,63,64, +65,64,63, +64,65,66, +67,66,65, +66,67,68, +69,68,67, +68,69,70, +71,70,69, +70,71,72, +73,72,71, +72,73,74, +75,74,73, +74,75,76, +77,76,75, +76,77,78, +79,78,77, +78,79,80, +81,80,79, +80,81,82, +83,82,81, +82,83,84, +85,84,83, +84,85,86, +87,86,85, +86,87,88, +89,88,87, +88,89,90, +91,90,89, +90,91,92, +93,92,91, +92,93,94, +95,94,93, +94,95,96, +97,96,95, +96,97,98, +99,98,97, +98,99,100, +101,100,99, +100,101,102, +103,102,101, +102,103,104, +105,104,103, +104,105,106, +107,106,105, +106,107,108, +109,108,107, +108,109,110, +111,110,109, +110,111,112, +113,112,111, +112,113,114, +115,114,113, +114,115,116, +117,116,115, +116,117,118, +119,118,117, +118,119,120, +121,120,119, +120,121,122, +123,122,121, +122,123,124, +125,124,123, +124,125,126, +127,126,125, +128,0,129, +2,129,0, +129,2,130, +4,130,2, +130,4,131, +6,131,4, +131,6,132, +8,132,6, +132,8,133, +10,133,8, +133,10,134, +12,134,10, +134,12,135, +14,135,12, +135,14,136, +16,136,14, +136,16,137, +18,137,16, +137,18,138, +20,138,18, +138,20,139, +22,139,20, +139,22,140, +24,140,22, +140,24,141, +26,141,24, +141,26,142, +28,142,26, +142,28,143, +30,143,28, +143,30,144, +32,144,30, +144,32,145, +34,145,32, +145,34,146, +36,146,34, +146,36,147, +38,147,36, +147,38,148, +40,148,38, +148,40,149, +42,149,40, +149,42,150, +44,150,42, +150,44,151, +46,151,44, +151,46,152, +48,152,46, +152,48,153, +50,153,48, +153,50,154, +52,154,50, +154,52,155, +54,155,52, +155,54,156, +56,156,54, +156,56,157, +58,157,56, +157,58,158, +60,158,58, +158,60,159, +62,159,60, +159,62,160, +64,160,62, +160,64,161, +66,161,64, +161,66,162, +68,162,66, +162,68,163, +70,163,68, +163,70,164, +72,164,70, +164,72,165, +74,165,72, +165,74,166, +76,166,74, +166,76,167, +78,167,76, +167,78,168, +80,168,78, +168,80,169, +82,169,80, +169,82,170, +84,170,82, +170,84,171, +86,171,84, +171,86,172, +88,172,86, +172,88,173, +90,173,88, +173,90,174, +92,174,90, +174,92,175, +94,175,92, +175,94,176, +96,176,94, +176,96,177, +98,177,96, +177,98,178, +100,178,98, +178,100,179, +102,179,100, +179,102,180, +104,180,102, +180,104,181, +106,181,104, +181,106,182, +108,182,106, +182,108,183, +110,183,108, +183,110,184, +112,184,110, +184,112,185, +114,185,112, +185,114,186, +116,186,114, +186,116,187, +118,187,116, +187,118,188, +120,188,118, +188,120,189, +122,189,120, +189,122,190, +124,190,122, +190,124,191, +126,191,124, +192,128,193, +129,193,128, +193,129,194, +130,194,129, +194,130,195, +131,195,130, +195,131,196, +132,196,131, +196,132,197, +133,197,132, +197,133,198, +134,198,133, +198,134,199, +135,199,134, +199,135,200, +136,200,135, +200,136,201, +137,201,136, +201,137,202, +138,202,137, +202,138,203, +139,203,138, +203,139,204, +140,204,139, +204,140,205, +141,205,140, +205,141,206, +142,206,141, +206,142,207, +143,207,142, +207,143,208, +144,208,143, +208,144,209, +145,209,144, +209,145,210, +146,210,145, +210,146,211, +147,211,146, +211,147,212, +148,212,147, +212,148,213, +149,213,148, +213,149,214, +150,214,149, +214,150,215, +151,215,150, +215,151,216, +152,216,151, +216,152,217, +153,217,152, +217,153,218, +154,218,153, +218,154,219, +155,219,154, +219,155,220, +156,220,155, +220,156,221, +157,221,156, +221,157,222, +158,222,157, +222,158,223, +159,223,158, +223,159,224, +160,224,159, +224,160,225, +161,225,160, +225,161,226, +162,226,161, +226,162,227, +163,227,162, +227,163,228, +164,228,163, +228,164,229, +165,229,164, +229,165,230, +166,230,165, +230,166,231, +167,231,166, +231,167,232, +168,232,167, +232,168,233, +169,233,168, +233,169,234, +170,234,169, +234,170,235, +171,235,170, +235,171,236, +172,236,171, +236,172,237, +173,237,172, +237,173,238, +174,238,173, +238,174,239, +175,239,174, +239,175,240, +176,240,175, +240,176,241, +177,241,176, +241,177,242, +178,242,177, +242,178,243, +179,243,178, +243,179,244, +180,244,179, +244,180,245, +181,245,180, +245,181,246, +182,246,181, +246,182,247, +183,247,182, +247,183,248, +184,248,183, +248,184,249, +185,249,184, +249,185,250, +186,250,185, +250,186,251, +187,251,186, +251,187,252, +188,252,187, +252,188,253, +189,253,188, +253,189,254, +190,254,189, +254,190,255, +191,255,190, +256,192,257, +193,257,192, +257,193,258, +194,258,193, +258,194,259, +195,259,194, +259,195,260, +196,260,195, +260,196,261, +197,261,196, +261,197,262, +198,262,197, +262,198,263, +199,263,198, +263,199,264, +200,264,199, +264,200,265, +201,265,200, +265,201,266, +202,266,201, +266,202,267, +203,267,202, +267,203,268, +204,268,203, +268,204,269, +205,269,204, +269,205,270, +206,270,205, +270,206,271, +207,271,206, +271,207,272, +208,272,207, +272,208,273, +209,273,208, +273,209,274, +210,274,209, +274,210,275, +211,275,210, +275,211,276, +212,276,211, +276,212,277, +213,277,212, +277,213,278, +214,278,213, +278,214,279, +215,279,214, +279,215,280, +216,280,215, +280,216,281, +217,281,216, +281,217,282, +218,282,217, +282,218,283, +219,283,218, +283,219,284, +220,284,219, +284,220,285, +221,285,220, +285,221,286, +222,286,221, +286,222,287, +223,287,222, +287,223,288, +224,288,223, +288,224,289, +225,289,224, +289,225,290, +226,290,225, +290,226,291, +227,291,226, +291,227,292, +228,292,227, +292,228,293, +229,293,228, +293,229,294, +230,294,229, +294,230,295, +231,295,230, +295,231,296, +232,296,231, +296,232,297, +233,297,232, +297,233,298, +234,298,233, +298,234,299, +235,299,234, +299,235,300, +236,300,235, +300,236,301, +237,301,236, +301,237,302, +238,302,237, +302,238,303, +239,303,238, +303,239,304, +240,304,239, +304,240,305, +241,305,240, +305,241,306, +242,306,241, +306,242,307, +243,307,242, +307,243,308, +244,308,243, +308,244,309, +245,309,244, +309,245,310, +246,310,245, +310,246,311, +247,311,246, +311,247,312, +248,312,247, +312,248,313, +249,313,248, +313,249,314, +250,314,249, +314,250,315, +251,315,250, +315,251,316, +252,316,251, +316,252,317, +253,317,252, +317,253,318, +254,318,253, +318,254,319, +255,319,254, +320,256,321, +257,321,256, +321,257,322, +258,322,257, +322,258,323, +259,323,258, +323,259,324, +260,324,259, +324,260,325, +261,325,260, +325,261,326, +262,326,261, +326,262,327, +263,327,262, +327,263,328, +264,328,263, +328,264,329, +265,329,264, +329,265,330, +266,330,265, +330,266,331, +267,331,266, +331,267,332, +268,332,267, +332,268,333, +269,333,268, +333,269,334, +270,334,269, +334,270,335, +271,335,270, +335,271,336, +272,336,271, +336,272,337, +273,337,272, +337,273,338, +274,338,273, +338,274,339, +275,339,274, +339,275,340, +276,340,275, +340,276,341, +277,341,276, +341,277,342, +278,342,277, +342,278,343, +279,343,278, +343,279,344, +280,344,279, +344,280,345, +281,345,280, +345,281,346, +282,346,281, +346,282,347, +283,347,282, +347,283,348, +284,348,283, +348,284,349, +285,349,284, +349,285,350, +286,350,285, +350,286,351, +287,351,286, +351,287,352, +288,352,287, +352,288,353, +289,353,288, +353,289,354, +290,354,289, +354,290,355, +291,355,290, +355,291,356, +292,356,291, +356,292,357, +293,357,292, +357,293,358, +294,358,293, +358,294,359, +295,359,294, +359,295,360, +296,360,295, +360,296,361, +297,361,296, +361,297,362, +298,362,297, +362,298,363, +299,363,298, +363,299,364, +300,364,299, +364,300,365, +301,365,300, +365,301,366, +302,366,301, +366,302,367, +303,367,302, +367,303,368, +304,368,303, +368,304,369, +305,369,304, +369,305,370, +306,370,305, +370,306,371, +307,371,306, +371,307,372, +308,372,307, +372,308,373, +309,373,308, +373,309,374, +310,374,309, +374,310,375, +311,375,310, +375,311,376, +312,376,311, +376,312,377, +313,377,312, +377,313,378, +314,378,313, +378,314,379, +315,379,314, +379,315,380, +316,380,315, +380,316,381, +317,381,316, +381,317,382, +318,382,317, +382,318,383, +319,383,318, +384,320,385, +321,385,320, +385,321,386, +322,386,321, +386,322,387, +323,387,322, +387,323,388, +324,388,323, +388,324,389, +325,389,324, +389,325,390, +326,390,325, +390,326,391, +327,391,326, +391,327,392, +328,392,327, +392,328,393, +329,393,328, +393,329,394, +330,394,329, +394,330,395, +331,395,330, +395,331,396, +332,396,331, +396,332,397, +333,397,332, +397,333,398, +334,398,333, +398,334,399, +335,399,334, +399,335,400, +336,400,335, +400,336,401, +337,401,336, +401,337,402, +338,402,337, +402,338,403, +339,403,338, +403,339,404, +340,404,339, +404,340,405, +341,405,340, +405,341,406, +342,406,341, +406,342,407, +343,407,342, +407,343,408, +344,408,343, +408,344,409, +345,409,344, +409,345,410, +346,410,345, +410,346,411, +347,411,346, +411,347,412, +348,412,347, +412,348,413, +349,413,348, +413,349,414, +350,414,349, +414,350,415, +351,415,350, +415,351,416, +352,416,351, +416,352,417, +353,417,352, +417,353,418, +354,418,353, +418,354,419, +355,419,354, +419,355,420, +356,420,355, +420,356,421, +357,421,356, +421,357,422, +358,422,357, +422,358,423, +359,423,358, +423,359,424, +360,424,359, +424,360,425, +361,425,360, +425,361,426, +362,426,361, +426,362,427, +363,427,362, +427,363,428, +364,428,363, +428,364,429, +365,429,364, +429,365,430, +366,430,365, +430,366,431, +367,431,366, +431,367,432, +368,432,367, +432,368,433, +369,433,368, +433,369,434, +370,434,369, +434,370,435, +371,435,370, +435,371,436, +372,436,371, +436,372,437, +373,437,372, +437,373,438, +374,438,373, +438,374,439, +375,439,374, +439,375,440, +376,440,375, +440,376,441, +377,441,376, +441,377,442, +378,442,377, +442,378,443, +379,443,378, +443,379,444, +380,444,379, +444,380,445, +381,445,380, +445,381,446, +382,446,381, +446,382,447, +383,447,382, +448,384,449, +385,449,384, +449,385,450, +386,450,385, +450,386,451, +387,451,386, +451,387,452, +388,452,387, +452,388,453, +389,453,388, +453,389,454, +390,454,389, +454,390,455, +391,455,390, +455,391,456, +392,456,391, +456,392,457, +393,457,392, +457,393,458, +394,458,393, +458,394,459, +395,459,394, +459,395,460, +396,460,395, +460,396,461, +397,461,396, +461,397,462, +398,462,397, +462,398,463, +399,463,398, +463,399,464, +400,464,399, +464,400,465, +401,465,400, +465,401,466, +402,466,401, +466,402,467, +403,467,402, +467,403,468, +404,468,403, +468,404,469, +405,469,404, +469,405,470, +406,470,405, +470,406,471, +407,471,406, +471,407,472, +408,472,407, +472,408,473, +409,473,408, +473,409,474, +410,474,409, +474,410,475, +411,475,410, +475,411,476, +412,476,411, +476,412,477, +413,477,412, +477,413,478, +414,478,413, +478,414,479, +415,479,414, +479,415,480, +416,480,415, +480,416,481, +417,481,416, +481,417,482, +418,482,417, +482,418,483, +419,483,418, +483,419,484, +420,484,419, +484,420,485, +421,485,420, +485,421,486, +422,486,421, +486,422,487, +423,487,422, +487,423,488, +424,488,423, +488,424,489, +425,489,424, +489,425,490, +426,490,425, +490,426,491, +427,491,426, +491,427,492, +428,492,427, +492,428,493, +429,493,428, +493,429,494, +430,494,429, +494,430,495, +431,495,430, +495,431,496, +432,496,431, +496,432,497, +433,497,432, +497,433,498, +434,498,433, +498,434,499, +435,499,434, +499,435,500, +436,500,435, +500,436,501, +437,501,436, +501,437,502, +438,502,437, +502,438,503, +439,503,438, +503,439,504, +440,504,439, +504,440,505, +441,505,440, +505,441,506, +442,506,441, +506,442,507, +443,507,442, +507,443,508, +444,508,443, +508,444,509, +445,509,444, +509,445,510, +446,510,445, +510,446,511, +447,511,446, +512,448,513, +449,513,448, +513,449,514, +450,514,449, +514,450,515, +451,515,450, +515,451,516, +452,516,451, +516,452,517, +453,517,452, +517,453,518, +454,518,453, +518,454,519, +455,519,454, +519,455,520, +456,520,455, +520,456,521, +457,521,456, +521,457,522, +458,522,457, +522,458,523, +459,523,458, +523,459,524, +460,524,459, +524,460,525, +461,525,460, +525,461,526, +462,526,461, +526,462,527, +463,527,462, +527,463,528, +464,528,463, +528,464,529, +465,529,464, +529,465,530, +466,530,465, +530,466,531, +467,531,466, +531,467,532, +468,532,467, +532,468,533, +469,533,468, +533,469,534, +470,534,469, +534,470,535, +471,535,470, +535,471,536, +472,536,471, +536,472,537, +473,537,472, +537,473,538, +474,538,473, +538,474,539, +475,539,474, +539,475,540, +476,540,475, +540,476,541, +477,541,476, +541,477,542, +478,542,477, +542,478,543, +479,543,478, +543,479,544, +480,544,479, +544,480,545, +481,545,480, +545,481,546, +482,546,481, +546,482,547, +483,547,482, +547,483,548, +484,548,483, +548,484,549, +485,549,484, +549,485,550, +486,550,485, +550,486,551, +487,551,486, +551,487,552, +488,552,487, +552,488,553, +489,553,488, +553,489,554, +490,554,489, +554,490,555, +491,555,490, +555,491,556, +492,556,491, +556,492,557, +493,557,492, +557,493,558, +494,558,493, +558,494,559, +495,559,494, +559,495,560, +496,560,495, +560,496,561, +497,561,496, +561,497,562, +498,562,497, +562,498,563, +499,563,498, +563,499,564, +500,564,499, +564,500,565, +501,565,500, +565,501,566, +502,566,501, +566,502,567, +503,567,502, +567,503,568, +504,568,503, +568,504,569, +505,569,504, +569,505,570, +506,570,505, +570,506,571, +507,571,506, +571,507,572, +508,572,507, +572,508,573, +509,573,508, +573,509,574, +510,574,509, +574,510,575, +511,575,510, +576,512,577, +513,577,512, +577,513,578, +514,578,513, +578,514,579, +515,579,514, +579,515,580, +516,580,515, +580,516,581, +517,581,516, +581,517,582, +518,582,517, +582,518,583, +519,583,518, +583,519,584, +520,584,519, +584,520,585, +521,585,520, +585,521,586, +522,586,521, +586,522,587, +523,587,522, +587,523,588, +524,588,523, +588,524,589, +525,589,524, +589,525,590, +526,590,525, +590,526,591, +527,591,526, +591,527,592, +528,592,527, +592,528,593, +529,593,528, +593,529,594, +530,594,529, +594,530,595, +531,595,530, +595,531,596, +532,596,531, +596,532,597, +533,597,532, +597,533,598, +534,598,533, +598,534,599, +535,599,534, +599,535,600, +536,600,535, +600,536,601, +537,601,536, +601,537,602, +538,602,537, +602,538,603, +539,603,538, +603,539,604, +540,604,539, +604,540,605, +541,605,540, +605,541,606, +542,606,541, +606,542,607, +543,607,542, +607,543,608, +544,608,543, +608,544,609, +545,609,544, +609,545,610, +546,610,545, +610,546,611, +547,611,546, +611,547,612, +548,612,547, +612,548,613, +549,613,548, +613,549,614, +550,614,549, +614,550,615, +551,615,550, +615,551,616, +552,616,551, +616,552,617, +553,617,552, +617,553,618, +554,618,553, +618,554,619, +555,619,554, +619,555,620, +556,620,555, +620,556,621, +557,621,556, +621,557,622, +558,622,557, +622,558,623, +559,623,558, +623,559,624, +560,624,559, +624,560,625, +561,625,560, +625,561,626, +562,626,561, +626,562,627, +563,627,562, +627,563,628, +564,628,563, +628,564,629, +565,629,564, +629,565,630, +566,630,565, +630,566,631, +567,631,566, +631,567,632, +568,632,567, +632,568,633, +569,633,568, +633,569,634, +570,634,569, +634,570,635, +571,635,570, +635,571,636, +572,636,571, +636,572,637, +573,637,572, +637,573,638, +574,638,573, +638,574,639, +575,639,574, +640,576,641, +577,641,576, +641,577,642, +578,642,577, +642,578,643, +579,643,578, +643,579,644, +580,644,579, +644,580,645, +581,645,580, +645,581,646, +582,646,581, +646,582,647, +583,647,582, +647,583,648, +584,648,583, +648,584,649, +585,649,584, +649,585,650, +586,650,585, +650,586,651, +587,651,586, +651,587,652, +588,652,587, +652,588,653, +589,653,588, +653,589,654, +590,654,589, +654,590,655, +591,655,590, +655,591,656, +592,656,591, +656,592,657, +593,657,592, +657,593,658, +594,658,593, +658,594,659, +595,659,594, +659,595,660, +596,660,595, +660,596,661, +597,661,596, +661,597,662, +598,662,597, +662,598,663, +599,663,598, +663,599,664, +600,664,599, +664,600,665, +601,665,600, +665,601,666, +602,666,601, +666,602,667, +603,667,602, +667,603,668, +604,668,603, +668,604,669, +605,669,604, +669,605,670, +606,670,605, +670,606,671, +607,671,606, +671,607,672, +608,672,607, +672,608,673, +609,673,608, +673,609,674, +610,674,609, +674,610,675, +611,675,610, +675,611,676, +612,676,611, +676,612,677, +613,677,612, +677,613,678, +614,678,613, +678,614,679, +615,679,614, +679,615,680, +616,680,615, +680,616,681, +617,681,616, +681,617,682, +618,682,617, +682,618,683, +619,683,618, +683,619,684, +620,684,619, +684,620,685, +621,685,620, +685,621,686, +622,686,621, +686,622,687, +623,687,622, +687,623,688, +624,688,623, +688,624,689, +625,689,624, +689,625,690, +626,690,625, +690,626,691, +627,691,626, +691,627,692, +628,692,627, +692,628,693, +629,693,628, +693,629,694, +630,694,629, +694,630,695, +631,695,630, +695,631,696, +632,696,631, +696,632,697, +633,697,632, +697,633,698, +634,698,633, +698,634,699, +635,699,634, +699,635,700, +636,700,635, +700,636,701, +637,701,636, +701,637,702, +638,702,637, +702,638,703, +639,703,638, +704,640,705, +641,705,640, +705,641,706, +642,706,641, +706,642,707, +643,707,642, +707,643,708, +644,708,643, +708,644,709, +645,709,644, +709,645,710, +646,710,645, +710,646,711, +647,711,646, +711,647,712, +648,712,647, +712,648,713, +649,713,648, +713,649,714, +650,714,649, +714,650,715, +651,715,650, +715,651,716, +652,716,651, +716,652,717, +653,717,652, +717,653,718, +654,718,653, +718,654,719, +655,719,654, +719,655,720, +656,720,655, +720,656,721, +657,721,656, +721,657,722, +658,722,657, +722,658,723, +659,723,658, +723,659,724, +660,724,659, +724,660,725, +661,725,660, +725,661,726, +662,726,661, +726,662,727, +663,727,662, +727,663,728, +664,728,663, +728,664,729, +665,729,664, +729,665,730, +666,730,665, +730,666,731, +667,731,666, +731,667,732, +668,732,667, +732,668,733, +669,733,668, +733,669,734, +670,734,669, +734,670,735, +671,735,670, +735,671,736, +672,736,671, +736,672,737, +673,737,672, +737,673,738, +674,738,673, +738,674,739, +675,739,674, +739,675,740, +676,740,675, +740,676,741, +677,741,676, +741,677,742, +678,742,677, +742,678,743, +679,743,678, +743,679,744, +680,744,679, +744,680,745, +681,745,680, +745,681,746, +682,746,681, +746,682,747, +683,747,682, +747,683,748, +684,748,683, +748,684,749, +685,749,684, +749,685,750, +686,750,685, +750,686,751, +687,751,686, +751,687,752, +688,752,687, +752,688,753, +689,753,688, +753,689,754, +690,754,689, +754,690,755, +691,755,690, +755,691,756, +692,756,691, +756,692,757, +693,757,692, +757,693,758, +694,758,693, +758,694,759, +695,759,694, +759,695,760, +696,760,695, +760,696,761, +697,761,696, +761,697,762, +698,762,697, +762,698,763, +699,763,698, +763,699,764, +700,764,699, +764,700,765, +701,765,700, +765,701,766, +702,766,701, +766,702,767, +703,767,702, +768,704,769, +705,769,704, +769,705,770, +706,770,705, +770,706,771, +707,771,706, +771,707,772, +708,772,707, +772,708,773, +709,773,708, +773,709,774, +710,774,709, +774,710,775, +711,775,710, +775,711,776, +712,776,711, +776,712,777, +713,777,712, +777,713,778, +714,778,713, +778,714,779, +715,779,714, +779,715,780, +716,780,715, +780,716,781, +717,781,716, +781,717,782, +718,782,717, +782,718,783, +719,783,718, +783,719,784, +720,784,719, +784,720,785, +721,785,720, +785,721,786, +722,786,721, +786,722,787, +723,787,722, +787,723,788, +724,788,723, +788,724,789, +725,789,724, +789,725,790, +726,790,725, +790,726,791, +727,791,726, +791,727,792, +728,792,727, +792,728,793, +729,793,728, +793,729,794, +730,794,729, +794,730,795, +731,795,730, +795,731,796, +732,796,731, +796,732,797, +733,797,732, +797,733,798, +734,798,733, +798,734,799, +735,799,734, +799,735,800, +736,800,735, +800,736,801, +737,801,736, +801,737,802, +738,802,737, +802,738,803, +739,803,738, +803,739,804, +740,804,739, +804,740,805, +741,805,740, +805,741,806, +742,806,741, +806,742,807, +743,807,742, +807,743,808, +744,808,743, +808,744,809, +745,809,744, +809,745,810, +746,810,745, +810,746,811, +747,811,746, +811,747,812, +748,812,747, +812,748,813, +749,813,748, +813,749,814, +750,814,749, +814,750,815, +751,815,750, +815,751,816, +752,816,751, +816,752,817, +753,817,752, +817,753,818, +754,818,753, +818,754,819, +755,819,754, +819,755,820, +756,820,755, +820,756,821, +757,821,756, +821,757,822, +758,822,757, +822,758,823, +759,823,758, +823,759,824, +760,824,759, +824,760,825, +761,825,760, +825,761,826, +762,826,761, +826,762,827, +763,827,762, +827,763,828, +764,828,763, +828,764,829, +765,829,764, +829,765,830, +766,830,765, +830,766,831, +767,831,766, +832,768,833, +769,833,768, +833,769,834, +770,834,769, +834,770,835, +771,835,770, +835,771,836, +772,836,771, +836,772,837, +773,837,772, +837,773,838, +774,838,773, +838,774,839, +775,839,774, +839,775,840, +776,840,775, +840,776,841, +777,841,776, +841,777,842, +778,842,777, +842,778,843, +779,843,778, +843,779,844, +780,844,779, +844,780,845, +781,845,780, +845,781,846, +782,846,781, +846,782,847, +783,847,782, +847,783,848, +784,848,783, +848,784,849, +785,849,784, +849,785,850, +786,850,785, +850,786,851, +787,851,786, +851,787,852, +788,852,787, +852,788,853, +789,853,788, +853,789,854, +790,854,789, +854,790,855, +791,855,790, +855,791,856, +792,856,791, +856,792,857, +793,857,792, +857,793,858, +794,858,793, +858,794,859, +795,859,794, +859,795,860, +796,860,795, +860,796,861, +797,861,796, +861,797,862, +798,862,797, +862,798,863, +799,863,798, +863,799,864, +800,864,799, +864,800,865, +801,865,800, +865,801,866, +802,866,801, +866,802,867, +803,867,802, +867,803,868, +804,868,803, +868,804,869, +805,869,804, +869,805,870, +806,870,805, +870,806,871, +807,871,806, +871,807,872, +808,872,807, +872,808,873, +809,873,808, +873,809,874, +810,874,809, +874,810,875, +811,875,810, +875,811,876, +812,876,811, +876,812,877, +813,877,812, +877,813,878, +814,878,813, +878,814,879, +815,879,814, +879,815,880, +816,880,815, +880,816,881, +817,881,816, +881,817,882, +818,882,817, +882,818,883, +819,883,818, +883,819,884, +820,884,819, +884,820,885, +821,885,820, +885,821,886, +822,886,821, +886,822,887, +823,887,822, +887,823,888, +824,888,823, +888,824,889, +825,889,824, +889,825,890, +826,890,825, +890,826,891, +827,891,826, +891,827,892, +828,892,827, +892,828,893, +829,893,828, +893,829,894, +830,894,829, +894,830,895, +831,895,830, +896,832,897, +833,897,832, +897,833,898, +834,898,833, +898,834,899, +835,899,834, +899,835,900, +836,900,835, +900,836,901, +837,901,836, +901,837,902, +838,902,837, +902,838,903, +839,903,838, +903,839,904, +840,904,839, +904,840,905, +841,905,840, +905,841,906, +842,906,841, +906,842,907, +843,907,842, +907,843,908, +844,908,843, +908,844,909, +845,909,844, +909,845,910, +846,910,845, +910,846,911, +847,911,846, +911,847,912, +848,912,847, +912,848,913, +849,913,848, +913,849,914, +850,914,849, +914,850,915, +851,915,850, +915,851,916, +852,916,851, +916,852,917, +853,917,852, +917,853,918, +854,918,853, +918,854,919, +855,919,854, +919,855,920, +856,920,855, +920,856,921, +857,921,856, +921,857,922, +858,922,857, +922,858,923, +859,923,858, +923,859,924, +860,924,859, +924,860,925, +861,925,860, +925,861,926, +862,926,861, +926,862,927, +863,927,862, +927,863,928, +864,928,863, +928,864,929, +865,929,864, +929,865,930, +866,930,865, +930,866,931, +867,931,866, +931,867,932, +868,932,867, +932,868,933, +869,933,868, +933,869,934, +870,934,869, +934,870,935, +871,935,870, +935,871,936, +872,936,871, +936,872,937, +873,937,872, +937,873,938, +874,938,873, +938,874,939, +875,939,874, +939,875,940, +876,940,875, +940,876,941, +877,941,876, +941,877,942, +878,942,877, +942,878,943, +879,943,878, +943,879,944, +880,944,879, +944,880,945, +881,945,880, +945,881,946, +882,946,881, +946,882,947, +883,947,882, +947,883,948, +884,948,883, +948,884,949, +885,949,884, +949,885,950, +886,950,885, +950,886,951, +887,951,886, +951,887,952, +888,952,887, +952,888,953, +889,953,888, +953,889,954, +890,954,889, +954,890,955, +891,955,890, +955,891,956, +892,956,891, +956,892,957, +893,957,892, +957,893,958, +894,958,893, +958,894,959, +895,959,894, +960,896,961, +897,961,896, +961,897,962, +898,962,897, +962,898,963, +899,963,898, +963,899,964, +900,964,899, +964,900,965, +901,965,900, +965,901,966, +902,966,901, +966,902,967, +903,967,902, +967,903,968, +904,968,903, +968,904,969, +905,969,904, +969,905,970, +906,970,905, +970,906,971, +907,971,906, +971,907,972, +908,972,907, +972,908,973, +909,973,908, +973,909,974, +910,974,909, +974,910,975, +911,975,910, +975,911,976, +912,976,911, +976,912,977, +913,977,912, +977,913,978, +914,978,913, +978,914,979, +915,979,914, +979,915,980, +916,980,915, +980,916,981, +917,981,916, +981,917,982, +918,982,917, +982,918,983, +919,983,918, +983,919,984, +920,984,919, +984,920,985, +921,985,920, +985,921,986, +922,986,921, +986,922,987, +923,987,922, +987,923,988, +924,988,923, +988,924,989, +925,989,924, +989,925,990, +926,990,925, +990,926,991, +927,991,926, +991,927,992, +928,992,927, +992,928,993, +929,993,928, +993,929,994, +930,994,929, +994,930,995, +931,995,930, +995,931,996, +932,996,931, +996,932,997, +933,997,932, +997,933,998, +934,998,933, +998,934,999, +935,999,934, +999,935,1000, +936,1000,935, +1000,936,1001, +937,1001,936, +1001,937,1002, +938,1002,937, +1002,938,1003, +939,1003,938, +1003,939,1004, +940,1004,939, +1004,940,1005, +941,1005,940, +1005,941,1006, +942,1006,941, +1006,942,1007, +943,1007,942, +1007,943,1008, +944,1008,943, +1008,944,1009, +945,1009,944, +1009,945,1010, +946,1010,945, +1010,946,1011, +947,1011,946, +1011,947,1012, +948,1012,947, +1012,948,1013, +949,1013,948, +1013,949,1014, +950,1014,949, +1014,950,1015, +951,1015,950, +1015,951,1016, +952,1016,951, +1016,952,1017, +953,1017,952, +1017,953,1018, +954,1018,953, +1018,954,1019, +955,1019,954, +1019,955,1020, +956,1020,955, +1020,956,1021, +957,1021,956, +1021,957,1022, +958,1022,957, +1022,958,1023, +959,1023,958, +1024,960,1025, +961,1025,960, +1025,961,1026, +962,1026,961, +1026,962,1027, +963,1027,962, +1027,963,1028, +964,1028,963, +1028,964,1029, +965,1029,964, +1029,965,1030, +966,1030,965, +1030,966,1031, +967,1031,966, +1031,967,1032, +968,1032,967, +1032,968,1033, +969,1033,968, +1033,969,1034, +970,1034,969, +1034,970,1035, +971,1035,970, +1035,971,1036, +972,1036,971, +1036,972,1037, +973,1037,972, +1037,973,1038, +974,1038,973, +1038,974,1039, +975,1039,974, +1039,975,1040, +976,1040,975, +1040,976,1041, +977,1041,976, +1041,977,1042, +978,1042,977, +1042,978,1043, +979,1043,978, +1043,979,1044, +980,1044,979, +1044,980,1045, +981,1045,980, +1045,981,1046, +982,1046,981, +1046,982,1047, +983,1047,982, +1047,983,1048, +984,1048,983, +1048,984,1049, +985,1049,984, +1049,985,1050, +986,1050,985, +1050,986,1051, +987,1051,986, +1051,987,1052, +988,1052,987, +1052,988,1053, +989,1053,988, +1053,989,1054, +990,1054,989, +1054,990,1055, +991,1055,990, +1055,991,1056, +992,1056,991, +1056,992,1057, +993,1057,992, +1057,993,1058, +994,1058,993, +1058,994,1059, +995,1059,994, +1059,995,1060, +996,1060,995, +1060,996,1061, +997,1061,996, +1061,997,1062, +998,1062,997, +1062,998,1063, +999,1063,998, +1063,999,1064, +1000,1064,999, +1064,1000,1065, +1001,1065,1000, +1065,1001,1066, +1002,1066,1001, +1066,1002,1067, +1003,1067,1002, +1067,1003,1068, +1004,1068,1003, +1068,1004,1069, +1005,1069,1004, +1069,1005,1070, +1006,1070,1005, +1070,1006,1071, +1007,1071,1006, +1071,1007,1072, +1008,1072,1007, +1072,1008,1073, +1009,1073,1008, +1073,1009,1074, +1010,1074,1009, +1074,1010,1075, +1011,1075,1010, +1075,1011,1076, +1012,1076,1011, +1076,1012,1077, +1013,1077,1012, +1077,1013,1078, +1014,1078,1013, +1078,1014,1079, +1015,1079,1014, +1079,1015,1080, +1016,1080,1015, +1080,1016,1081, +1017,1081,1016, +1081,1017,1082, +1018,1082,1017, +1082,1018,1083, +1019,1083,1018, +1083,1019,1084, +1020,1084,1019, +1084,1020,1085, +1021,1085,1020, +1085,1021,1086, +1022,1086,1021, +1086,1022,1087, +1023,1087,1022, +1088,1024,1089, +1025,1089,1024, +1089,1025,1090, +1026,1090,1025, +1090,1026,1091, +1027,1091,1026, +1091,1027,1092, +1028,1092,1027, +1092,1028,1093, +1029,1093,1028, +1093,1029,1094, +1030,1094,1029, +1094,1030,1095, +1031,1095,1030, +1095,1031,1096, +1032,1096,1031, +1096,1032,1097, +1033,1097,1032, +1097,1033,1098, +1034,1098,1033, +1098,1034,1099, +1035,1099,1034, +1099,1035,1100, +1036,1100,1035, +1100,1036,1101, +1037,1101,1036, +1101,1037,1102, +1038,1102,1037, +1102,1038,1103, +1039,1103,1038, +1103,1039,1104, +1040,1104,1039, +1104,1040,1105, +1041,1105,1040, +1105,1041,1106, +1042,1106,1041, +1106,1042,1107, +1043,1107,1042, +1107,1043,1108, +1044,1108,1043, +1108,1044,1109, +1045,1109,1044, +1109,1045,1110, +1046,1110,1045, +1110,1046,1111, +1047,1111,1046, +1111,1047,1112, +1048,1112,1047, +1112,1048,1113, +1049,1113,1048, +1113,1049,1114, +1050,1114,1049, +1114,1050,1115, +1051,1115,1050, +1115,1051,1116, +1052,1116,1051, +1116,1052,1117, +1053,1117,1052, +1117,1053,1118, +1054,1118,1053, +1118,1054,1119, +1055,1119,1054, +1119,1055,1120, +1056,1120,1055, +1120,1056,1121, +1057,1121,1056, +1121,1057,1122, +1058,1122,1057, +1122,1058,1123, +1059,1123,1058, +1123,1059,1124, +1060,1124,1059, +1124,1060,1125, +1061,1125,1060, +1125,1061,1126, +1062,1126,1061, +1126,1062,1127, +1063,1127,1062, +1127,1063,1128, +1064,1128,1063, +1128,1064,1129, +1065,1129,1064, +1129,1065,1130, +1066,1130,1065, +1130,1066,1131, +1067,1131,1066, +1131,1067,1132, +1068,1132,1067, +1132,1068,1133, +1069,1133,1068, +1133,1069,1134, +1070,1134,1069, +1134,1070,1135, +1071,1135,1070, +1135,1071,1136, +1072,1136,1071, +1136,1072,1137, +1073,1137,1072, +1137,1073,1138, +1074,1138,1073, +1138,1074,1139, +1075,1139,1074, +1139,1075,1140, +1076,1140,1075, +1140,1076,1141, +1077,1141,1076, +1141,1077,1142, +1078,1142,1077, +1142,1078,1143, +1079,1143,1078, +1143,1079,1144, +1080,1144,1079, +1144,1080,1145, +1081,1145,1080, +1145,1081,1146, +1082,1146,1081, +1146,1082,1147, +1083,1147,1082, +1147,1083,1148, +1084,1148,1083, +1148,1084,1149, +1085,1149,1084, +1149,1085,1150, +1086,1150,1085, +1150,1086,1151, +1087,1151,1086, +1152,1088,1153, +1089,1153,1088, +1153,1089,1154, +1090,1154,1089, +1154,1090,1155, +1091,1155,1090, +1155,1091,1156, +1092,1156,1091, +1156,1092,1157, +1093,1157,1092, +1157,1093,1158, +1094,1158,1093, +1158,1094,1159, +1095,1159,1094, +1159,1095,1160, +1096,1160,1095, +1160,1096,1161, +1097,1161,1096, +1161,1097,1162, +1098,1162,1097, +1162,1098,1163, +1099,1163,1098, +1163,1099,1164, +1100,1164,1099, +1164,1100,1165, +1101,1165,1100, +1165,1101,1166, +1102,1166,1101, +1166,1102,1167, +1103,1167,1102, +1167,1103,1168, +1104,1168,1103, +1168,1104,1169, +1105,1169,1104, +1169,1105,1170, +1106,1170,1105, +1170,1106,1171, +1107,1171,1106, +1171,1107,1172, +1108,1172,1107, +1172,1108,1173, +1109,1173,1108, +1173,1109,1174, +1110,1174,1109, +1174,1110,1175, +1111,1175,1110, +1175,1111,1176, +1112,1176,1111, +1176,1112,1177, +1113,1177,1112, +1177,1113,1178, +1114,1178,1113, +1178,1114,1179, +1115,1179,1114, +1179,1115,1180, +1116,1180,1115, +1180,1116,1181, +1117,1181,1116, +1181,1117,1182, +1118,1182,1117, +1182,1118,1183, +1119,1183,1118, +1183,1119,1184, +1120,1184,1119, +1184,1120,1185, +1121,1185,1120, +1185,1121,1186, +1122,1186,1121, +1186,1122,1187, +1123,1187,1122, +1187,1123,1188, +1124,1188,1123, +1188,1124,1189, +1125,1189,1124, +1189,1125,1190, +1126,1190,1125, +1190,1126,1191, +1127,1191,1126, +1191,1127,1192, +1128,1192,1127, +1192,1128,1193, +1129,1193,1128, +1193,1129,1194, +1130,1194,1129, +1194,1130,1195, +1131,1195,1130, +1195,1131,1196, +1132,1196,1131, +1196,1132,1197, +1133,1197,1132, +1197,1133,1198, +1134,1198,1133, +1198,1134,1199, +1135,1199,1134, +1199,1135,1200, +1136,1200,1135, +1200,1136,1201, +1137,1201,1136, +1201,1137,1202, +1138,1202,1137, +1202,1138,1203, +1139,1203,1138, +1203,1139,1204, +1140,1204,1139, +1204,1140,1205, +1141,1205,1140, +1205,1141,1206, +1142,1206,1141, +1206,1142,1207, +1143,1207,1142, +1207,1143,1208, +1144,1208,1143, +1208,1144,1209, +1145,1209,1144, +1209,1145,1210, +1146,1210,1145, +1210,1146,1211, +1147,1211,1146, +1211,1147,1212, +1148,1212,1147, +1212,1148,1213, +1149,1213,1148, +1213,1149,1214, +1150,1214,1149, +1214,1150,1215, +1151,1215,1150, +1216,1152,1217, +1153,1217,1152, +1217,1153,1218, +1154,1218,1153, +1218,1154,1219, +1155,1219,1154, +1219,1155,1220, +1156,1220,1155, +1220,1156,1221, +1157,1221,1156, +1221,1157,1222, +1158,1222,1157, +1222,1158,1223, +1159,1223,1158, +1223,1159,1224, +1160,1224,1159, +1224,1160,1225, +1161,1225,1160, +1225,1161,1226, +1162,1226,1161, +1226,1162,1227, +1163,1227,1162, +1227,1163,1228, +1164,1228,1163, +1228,1164,1229, +1165,1229,1164, +1229,1165,1230, +1166,1230,1165, +1230,1166,1231, +1167,1231,1166, +1231,1167,1232, +1168,1232,1167, +1232,1168,1233, +1169,1233,1168, +1233,1169,1234, +1170,1234,1169, +1234,1170,1235, +1171,1235,1170, +1235,1171,1236, +1172,1236,1171, +1236,1172,1237, +1173,1237,1172, +1237,1173,1238, +1174,1238,1173, +1238,1174,1239, +1175,1239,1174, +1239,1175,1240, +1176,1240,1175, +1240,1176,1241, +1177,1241,1176, +1241,1177,1242, +1178,1242,1177, +1242,1178,1243, +1179,1243,1178, +1243,1179,1244, +1180,1244,1179, +1244,1180,1245, +1181,1245,1180, +1245,1181,1246, +1182,1246,1181, +1246,1182,1247, +1183,1247,1182, +1247,1183,1248, +1184,1248,1183, +1248,1184,1249, +1185,1249,1184, +1249,1185,1250, +1186,1250,1185, +1250,1186,1251, +1187,1251,1186, +1251,1187,1252, +1188,1252,1187, +1252,1188,1253, +1189,1253,1188, +1253,1189,1254, +1190,1254,1189, +1254,1190,1255, +1191,1255,1190, +1255,1191,1256, +1192,1256,1191, +1256,1192,1257, +1193,1257,1192, +1257,1193,1258, +1194,1258,1193, +1258,1194,1259, +1195,1259,1194, +1259,1195,1260, +1196,1260,1195, +1260,1196,1261, +1197,1261,1196, +1261,1197,1262, +1198,1262,1197, +1262,1198,1263, +1199,1263,1198, +1263,1199,1264, +1200,1264,1199, +1264,1200,1265, +1201,1265,1200, +1265,1201,1266, +1202,1266,1201, +1266,1202,1267, +1203,1267,1202, +1267,1203,1268, +1204,1268,1203, +1268,1204,1269, +1205,1269,1204, +1269,1205,1270, +1206,1270,1205, +1270,1206,1271, +1207,1271,1206, +1271,1207,1272, +1208,1272,1207, +1272,1208,1273, +1209,1273,1208, +1273,1209,1274, +1210,1274,1209, +1274,1210,1275, +1211,1275,1210, +1275,1211,1276, +1212,1276,1211, +1276,1212,1277, +1213,1277,1212, +1277,1213,1278, +1214,1278,1213, +1278,1214,1279, +1215,1279,1214, +1280,1216,1281, +1217,1281,1216, +1281,1217,1282, +1218,1282,1217, +1282,1218,1283, +1219,1283,1218, +1283,1219,1284, +1220,1284,1219, +1284,1220,1285, +1221,1285,1220, +1285,1221,1286, +1222,1286,1221, +1286,1222,1287, +1223,1287,1222, +1287,1223,1288, +1224,1288,1223, +1288,1224,1289, +1225,1289,1224, +1289,1225,1290, +1226,1290,1225, +1290,1226,1291, +1227,1291,1226, +1291,1227,1292, +1228,1292,1227, +1292,1228,1293, +1229,1293,1228, +1293,1229,1294, +1230,1294,1229, +1294,1230,1295, +1231,1295,1230, +1295,1231,1296, +1232,1296,1231, +1296,1232,1297, +1233,1297,1232, +1297,1233,1298, +1234,1298,1233, +1298,1234,1299, +1235,1299,1234, +1299,1235,1300, +1236,1300,1235, +1300,1236,1301, +1237,1301,1236, +1301,1237,1302, +1238,1302,1237, +1302,1238,1303, +1239,1303,1238, +1303,1239,1304, +1240,1304,1239, +1304,1240,1305, +1241,1305,1240, +1305,1241,1306, +1242,1306,1241, +1306,1242,1307, +1243,1307,1242, +1307,1243,1308, +1244,1308,1243, +1308,1244,1309, +1245,1309,1244, +1309,1245,1310, +1246,1310,1245, +1310,1246,1311, +1247,1311,1246, +1311,1247,1312, +1248,1312,1247, +1312,1248,1313, +1249,1313,1248, +1313,1249,1314, +1250,1314,1249, +1314,1250,1315, +1251,1315,1250, +1315,1251,1316, +1252,1316,1251, +1316,1252,1317, +1253,1317,1252, +1317,1253,1318, +1254,1318,1253, +1318,1254,1319, +1255,1319,1254, +1319,1255,1320, +1256,1320,1255, +1320,1256,1321, +1257,1321,1256, +1321,1257,1322, +1258,1322,1257, +1322,1258,1323, +1259,1323,1258, +1323,1259,1324, +1260,1324,1259, +1324,1260,1325, +1261,1325,1260, +1325,1261,1326, +1262,1326,1261, +1326,1262,1327, +1263,1327,1262, +1327,1263,1328, +1264,1328,1263, +1328,1264,1329, +1265,1329,1264, +1329,1265,1330, +1266,1330,1265, +1330,1266,1331, +1267,1331,1266, +1331,1267,1332, +1268,1332,1267, +1332,1268,1333, +1269,1333,1268, +1333,1269,1334, +1270,1334,1269, +1334,1270,1335, +1271,1335,1270, +1335,1271,1336, +1272,1336,1271, +1336,1272,1337, +1273,1337,1272, +1337,1273,1338, +1274,1338,1273, +1338,1274,1339, +1275,1339,1274, +1339,1275,1340, +1276,1340,1275, +1340,1276,1341, +1277,1341,1276, +1341,1277,1342, +1278,1342,1277, +1342,1278,1343, +1279,1343,1278, +1344,1280,1345, +1281,1345,1280, +1345,1281,1346, +1282,1346,1281, +1346,1282,1347, +1283,1347,1282, +1347,1283,1348, +1284,1348,1283, +1348,1284,1349, +1285,1349,1284, +1349,1285,1350, +1286,1350,1285, +1350,1286,1351, +1287,1351,1286, +1351,1287,1352, +1288,1352,1287, +1352,1288,1353, +1289,1353,1288, +1353,1289,1354, +1290,1354,1289, +1354,1290,1355, +1291,1355,1290, +1355,1291,1356, +1292,1356,1291, +1356,1292,1357, +1293,1357,1292, +1357,1293,1358, +1294,1358,1293, +1358,1294,1359, +1295,1359,1294, +1359,1295,1360, +1296,1360,1295, +1360,1296,1361, +1297,1361,1296, +1361,1297,1362, +1298,1362,1297, +1362,1298,1363, +1299,1363,1298, +1363,1299,1364, +1300,1364,1299, +1364,1300,1365, +1301,1365,1300, +1365,1301,1366, +1302,1366,1301, +1366,1302,1367, +1303,1367,1302, +1367,1303,1368, +1304,1368,1303, +1368,1304,1369, +1305,1369,1304, +1369,1305,1370, +1306,1370,1305, +1370,1306,1371, +1307,1371,1306, +1371,1307,1372, +1308,1372,1307, +1372,1308,1373, +1309,1373,1308, +1373,1309,1374, +1310,1374,1309, +1374,1310,1375, +1311,1375,1310, +1375,1311,1376, +1312,1376,1311, +1376,1312,1377, +1313,1377,1312, +1377,1313,1378, +1314,1378,1313, +1378,1314,1379, +1315,1379,1314, +1379,1315,1380, +1316,1380,1315, +1380,1316,1381, +1317,1381,1316, +1381,1317,1382, +1318,1382,1317, +1382,1318,1383, +1319,1383,1318, +1383,1319,1384, +1320,1384,1319, +1384,1320,1385, +1321,1385,1320, +1385,1321,1386, +1322,1386,1321, +1386,1322,1387, +1323,1387,1322, +1387,1323,1388, +1324,1388,1323, +1388,1324,1389, +1325,1389,1324, +1389,1325,1390, +1326,1390,1325, +1390,1326,1391, +1327,1391,1326, +1391,1327,1392, +1328,1392,1327, +1392,1328,1393, +1329,1393,1328, +1393,1329,1394, +1330,1394,1329, +1394,1330,1395, +1331,1395,1330, +1395,1331,1396, +1332,1396,1331, +1396,1332,1397, +1333,1397,1332, +1397,1333,1398, +1334,1398,1333, +1398,1334,1399, +1335,1399,1334, +1399,1335,1400, +1336,1400,1335, +1400,1336,1401, +1337,1401,1336, +1401,1337,1402, +1338,1402,1337, +1402,1338,1403, +1339,1403,1338, +1403,1339,1404, +1340,1404,1339, +1404,1340,1405, +1341,1405,1340, +1405,1341,1406, +1342,1406,1341, +1406,1342,1407, +1343,1407,1342, +1408,1344,1409, +1345,1409,1344, +1409,1345,1410, +1346,1410,1345, +1410,1346,1411, +1347,1411,1346, +1411,1347,1412, +1348,1412,1347, +1412,1348,1413, +1349,1413,1348, +1413,1349,1414, +1350,1414,1349, +1414,1350,1415, +1351,1415,1350, +1415,1351,1416, +1352,1416,1351, +1416,1352,1417, +1353,1417,1352, +1417,1353,1418, +1354,1418,1353, +1418,1354,1419, +1355,1419,1354, +1419,1355,1420, +1356,1420,1355, +1420,1356,1421, +1357,1421,1356, +1421,1357,1422, +1358,1422,1357, +1422,1358,1423, +1359,1423,1358, +1423,1359,1424, +1360,1424,1359, +1424,1360,1425, +1361,1425,1360, +1425,1361,1426, +1362,1426,1361, +1426,1362,1427, +1363,1427,1362, +1427,1363,1428, +1364,1428,1363, +1428,1364,1429, +1365,1429,1364, +1429,1365,1430, +1366,1430,1365, +1430,1366,1431, +1367,1431,1366, +1431,1367,1432, +1368,1432,1367, +1432,1368,1433, +1369,1433,1368, +1433,1369,1434, +1370,1434,1369, +1434,1370,1435, +1371,1435,1370, +1435,1371,1436, +1372,1436,1371, +1436,1372,1437, +1373,1437,1372, +1437,1373,1438, +1374,1438,1373, +1438,1374,1439, +1375,1439,1374, +1439,1375,1440, +1376,1440,1375, +1440,1376,1441, +1377,1441,1376, +1441,1377,1442, +1378,1442,1377, +1442,1378,1443, +1379,1443,1378, +1443,1379,1444, +1380,1444,1379, +1444,1380,1445, +1381,1445,1380, +1445,1381,1446, +1382,1446,1381, +1446,1382,1447, +1383,1447,1382, +1447,1383,1448, +1384,1448,1383, +1448,1384,1449, +1385,1449,1384, +1449,1385,1450, +1386,1450,1385, +1450,1386,1451, +1387,1451,1386, +1451,1387,1452, +1388,1452,1387, +1452,1388,1453, +1389,1453,1388, +1453,1389,1454, +1390,1454,1389, +1454,1390,1455, +1391,1455,1390, +1455,1391,1456, +1392,1456,1391, +1456,1392,1457, +1393,1457,1392, +1457,1393,1458, +1394,1458,1393, +1458,1394,1459, +1395,1459,1394, +1459,1395,1460, +1396,1460,1395, +1460,1396,1461, +1397,1461,1396, +1461,1397,1462, +1398,1462,1397, +1462,1398,1463, +1399,1463,1398, +1463,1399,1464, +1400,1464,1399, +1464,1400,1465, +1401,1465,1400, +1465,1401,1466, +1402,1466,1401, +1466,1402,1467, +1403,1467,1402, +1467,1403,1468, +1404,1468,1403, +1468,1404,1469, +1405,1469,1404, +1469,1405,1470, +1406,1470,1405, +1470,1406,1471, +1407,1471,1406, +1472,1408,1473, +1409,1473,1408, +1473,1409,1474, +1410,1474,1409, +1474,1410,1475, +1411,1475,1410, +1475,1411,1476, +1412,1476,1411, +1476,1412,1477, +1413,1477,1412, +1477,1413,1478, +1414,1478,1413, +1478,1414,1479, +1415,1479,1414, +1479,1415,1480, +1416,1480,1415, +1480,1416,1481, +1417,1481,1416, +1481,1417,1482, +1418,1482,1417, +1482,1418,1483, +1419,1483,1418, +1483,1419,1484, +1420,1484,1419, +1484,1420,1485, +1421,1485,1420, +1485,1421,1486, +1422,1486,1421, +1486,1422,1487, +1423,1487,1422, +1487,1423,1488, +1424,1488,1423, +1488,1424,1489, +1425,1489,1424, +1489,1425,1490, +1426,1490,1425, +1490,1426,1491, +1427,1491,1426, +1491,1427,1492, +1428,1492,1427, +1492,1428,1493, +1429,1493,1428, +1493,1429,1494, +1430,1494,1429, +1494,1430,1495, +1431,1495,1430, +1495,1431,1496, +1432,1496,1431, +1496,1432,1497, +1433,1497,1432, +1497,1433,1498, +1434,1498,1433, +1498,1434,1499, +1435,1499,1434, +1499,1435,1500, +1436,1500,1435, +1500,1436,1501, +1437,1501,1436, +1501,1437,1502, +1438,1502,1437, +1502,1438,1503, +1439,1503,1438, +1503,1439,1504, +1440,1504,1439, +1504,1440,1505, +1441,1505,1440, +1505,1441,1506, +1442,1506,1441, +1506,1442,1507, +1443,1507,1442, +1507,1443,1508, +1444,1508,1443, +1508,1444,1509, +1445,1509,1444, +1509,1445,1510, +1446,1510,1445, +1510,1446,1511, +1447,1511,1446, +1511,1447,1512, +1448,1512,1447, +1512,1448,1513, +1449,1513,1448, +1513,1449,1514, +1450,1514,1449, +1514,1450,1515, +1451,1515,1450, +1515,1451,1516, +1452,1516,1451, +1516,1452,1517, +1453,1517,1452, +1517,1453,1518, +1454,1518,1453, +1518,1454,1519, +1455,1519,1454, +1519,1455,1520, +1456,1520,1455, +1520,1456,1521, +1457,1521,1456, +1521,1457,1522, +1458,1522,1457, +1522,1458,1523, +1459,1523,1458, +1523,1459,1524, +1460,1524,1459, +1524,1460,1525, +1461,1525,1460, +1525,1461,1526, +1462,1526,1461, +1526,1462,1527, +1463,1527,1462, +1527,1463,1528, +1464,1528,1463, +1528,1464,1529, +1465,1529,1464, +1529,1465,1530, +1466,1530,1465, +1530,1466,1531, +1467,1531,1466, +1531,1467,1532, +1468,1532,1467, +1532,1468,1533, +1469,1533,1468, +1533,1469,1534, +1470,1534,1469, +1534,1470,1535, +1471,1535,1470, +1536,1472,1537, +1473,1537,1472, +1537,1473,1538, +1474,1538,1473, +1538,1474,1539, +1475,1539,1474, +1539,1475,1540, +1476,1540,1475, +1540,1476,1541, +1477,1541,1476, +1541,1477,1542, +1478,1542,1477, +1542,1478,1543, +1479,1543,1478, +1543,1479,1544, +1480,1544,1479, +1544,1480,1545, +1481,1545,1480, +1545,1481,1546, +1482,1546,1481, +1546,1482,1547, +1483,1547,1482, +1547,1483,1548, +1484,1548,1483, +1548,1484,1549, +1485,1549,1484, +1549,1485,1550, +1486,1550,1485, +1550,1486,1551, +1487,1551,1486, +1551,1487,1552, +1488,1552,1487, +1552,1488,1553, +1489,1553,1488, +1553,1489,1554, +1490,1554,1489, +1554,1490,1555, +1491,1555,1490, +1555,1491,1556, +1492,1556,1491, +1556,1492,1557, +1493,1557,1492, +1557,1493,1558, +1494,1558,1493, +1558,1494,1559, +1495,1559,1494, +1559,1495,1560, +1496,1560,1495, +1560,1496,1561, +1497,1561,1496, +1561,1497,1562, +1498,1562,1497, +1562,1498,1563, +1499,1563,1498, +1563,1499,1564, +1500,1564,1499, +1564,1500,1565, +1501,1565,1500, +1565,1501,1566, +1502,1566,1501, +1566,1502,1567, +1503,1567,1502, +1567,1503,1568, +1504,1568,1503, +1568,1504,1569, +1505,1569,1504, +1569,1505,1570, +1506,1570,1505, +1570,1506,1571, +1507,1571,1506, +1571,1507,1572, +1508,1572,1507, +1572,1508,1573, +1509,1573,1508, +1573,1509,1574, +1510,1574,1509, +1574,1510,1575, +1511,1575,1510, +1575,1511,1576, +1512,1576,1511, +1576,1512,1577, +1513,1577,1512, +1577,1513,1578, +1514,1578,1513, +1578,1514,1579, +1515,1579,1514, +1579,1515,1580, +1516,1580,1515, +1580,1516,1581, +1517,1581,1516, +1581,1517,1582, +1518,1582,1517, +1582,1518,1583, +1519,1583,1518, +1583,1519,1584, +1520,1584,1519, +1584,1520,1585, +1521,1585,1520, +1585,1521,1586, +1522,1586,1521, +1586,1522,1587, +1523,1587,1522, +1587,1523,1588, +1524,1588,1523, +1588,1524,1589, +1525,1589,1524, +1589,1525,1590, +1526,1590,1525, +1590,1526,1591, +1527,1591,1526, +1591,1527,1592, +1528,1592,1527, +1592,1528,1593, +1529,1593,1528, +1593,1529,1594, +1530,1594,1529, +1594,1530,1595, +1531,1595,1530, +1595,1531,1596, +1532,1596,1531, +1596,1532,1597, +1533,1597,1532, +1597,1533,1598, +1534,1598,1533, +1598,1534,1599, +1535,1599,1534, +1600,1536,1601, +1537,1601,1536, +1601,1537,1602, +1538,1602,1537, +1602,1538,1603, +1539,1603,1538, +1603,1539,1604, +1540,1604,1539, +1604,1540,1605, +1541,1605,1540, +1605,1541,1606, +1542,1606,1541, +1606,1542,1607, +1543,1607,1542, +1607,1543,1608, +1544,1608,1543, +1608,1544,1609, +1545,1609,1544, +1609,1545,1610, +1546,1610,1545, +1610,1546,1611, +1547,1611,1546, +1611,1547,1612, +1548,1612,1547, +1612,1548,1613, +1549,1613,1548, +1613,1549,1614, +1550,1614,1549, +1614,1550,1615, +1551,1615,1550, +1615,1551,1616, +1552,1616,1551, +1616,1552,1617, +1553,1617,1552, +1617,1553,1618, +1554,1618,1553, +1618,1554,1619, +1555,1619,1554, +1619,1555,1620, +1556,1620,1555, +1620,1556,1621, +1557,1621,1556, +1621,1557,1622, +1558,1622,1557, +1622,1558,1623, +1559,1623,1558, +1623,1559,1624, +1560,1624,1559, +1624,1560,1625, +1561,1625,1560, +1625,1561,1626, +1562,1626,1561, +1626,1562,1627, +1563,1627,1562, +1627,1563,1628, +1564,1628,1563, +1628,1564,1629, +1565,1629,1564, +1629,1565,1630, +1566,1630,1565, +1630,1566,1631, +1567,1631,1566, +1631,1567,1632, +1568,1632,1567, +1632,1568,1633, +1569,1633,1568, +1633,1569,1634, +1570,1634,1569, +1634,1570,1635, +1571,1635,1570, +1635,1571,1636, +1572,1636,1571, +1636,1572,1637, +1573,1637,1572, +1637,1573,1638, +1574,1638,1573, +1638,1574,1639, +1575,1639,1574, +1639,1575,1640, +1576,1640,1575, +1640,1576,1641, +1577,1641,1576, +1641,1577,1642, +1578,1642,1577, +1642,1578,1643, +1579,1643,1578, +1643,1579,1644, +1580,1644,1579, +1644,1580,1645, +1581,1645,1580, +1645,1581,1646, +1582,1646,1581, +1646,1582,1647, +1583,1647,1582, +1647,1583,1648, +1584,1648,1583, +1648,1584,1649, +1585,1649,1584, +1649,1585,1650, +1586,1650,1585, +1650,1586,1651, +1587,1651,1586, +1651,1587,1652, +1588,1652,1587, +1652,1588,1653, +1589,1653,1588, +1653,1589,1654, +1590,1654,1589, +1654,1590,1655, +1591,1655,1590, +1655,1591,1656, +1592,1656,1591, +1656,1592,1657, +1593,1657,1592, +1657,1593,1658, +1594,1658,1593, +1658,1594,1659, +1595,1659,1594, +1659,1595,1660, +1596,1660,1595, +1660,1596,1661, +1597,1661,1596, +1661,1597,1662, +1598,1662,1597, +1662,1598,1663, +1599,1663,1598, +1664,1600,1665, +1601,1665,1600, +1665,1601,1666, +1602,1666,1601, +1666,1602,1667, +1603,1667,1602, +1667,1603,1668, +1604,1668,1603, +1668,1604,1669, +1605,1669,1604, +1669,1605,1670, +1606,1670,1605, +1670,1606,1671, +1607,1671,1606, +1671,1607,1672, +1608,1672,1607, +1672,1608,1673, +1609,1673,1608, +1673,1609,1674, +1610,1674,1609, +1674,1610,1675, +1611,1675,1610, +1675,1611,1676, +1612,1676,1611, +1676,1612,1677, +1613,1677,1612, +1677,1613,1678, +1614,1678,1613, +1678,1614,1679, +1615,1679,1614, +1679,1615,1680, +1616,1680,1615, +1680,1616,1681, +1617,1681,1616, +1681,1617,1682, +1618,1682,1617, +1682,1618,1683, +1619,1683,1618, +1683,1619,1684, +1620,1684,1619, +1684,1620,1685, +1621,1685,1620, +1685,1621,1686, +1622,1686,1621, +1686,1622,1687, +1623,1687,1622, +1687,1623,1688, +1624,1688,1623, +1688,1624,1689, +1625,1689,1624, +1689,1625,1690, +1626,1690,1625, +1690,1626,1691, +1627,1691,1626, +1691,1627,1692, +1628,1692,1627, +1692,1628,1693, +1629,1693,1628, +1693,1629,1694, +1630,1694,1629, +1694,1630,1695, +1631,1695,1630, +1695,1631,1696, +1632,1696,1631, +1696,1632,1697, +1633,1697,1632, +1697,1633,1698, +1634,1698,1633, +1698,1634,1699, +1635,1699,1634, +1699,1635,1700, +1636,1700,1635, +1700,1636,1701, +1637,1701,1636, +1701,1637,1702, +1638,1702,1637, +1702,1638,1703, +1639,1703,1638, +1703,1639,1704, +1640,1704,1639, +1704,1640,1705, +1641,1705,1640, +1705,1641,1706, +1642,1706,1641, +1706,1642,1707, +1643,1707,1642, +1707,1643,1708, +1644,1708,1643, +1708,1644,1709, +1645,1709,1644, +1709,1645,1710, +1646,1710,1645, +1710,1646,1711, +1647,1711,1646, +1711,1647,1712, +1648,1712,1647, +1712,1648,1713, +1649,1713,1648, +1713,1649,1714, +1650,1714,1649, +1714,1650,1715, +1651,1715,1650, +1715,1651,1716, +1652,1716,1651, +1716,1652,1717, +1653,1717,1652, +1717,1653,1718, +1654,1718,1653, +1718,1654,1719, +1655,1719,1654, +1719,1655,1720, +1656,1720,1655, +1720,1656,1721, +1657,1721,1656, +1721,1657,1722, +1658,1722,1657, +1722,1658,1723, +1659,1723,1658, +1723,1659,1724, +1660,1724,1659, +1724,1660,1725, +1661,1725,1660, +1725,1661,1726, +1662,1726,1661, +1726,1662,1727, +1663,1727,1662, +1728,1664,1729, +1665,1729,1664, +1729,1665,1730, +1666,1730,1665, +1730,1666,1731, +1667,1731,1666, +1731,1667,1732, +1668,1732,1667, +1732,1668,1733, +1669,1733,1668, +1733,1669,1734, +1670,1734,1669, +1734,1670,1735, +1671,1735,1670, +1735,1671,1736, +1672,1736,1671, +1736,1672,1737, +1673,1737,1672, +1737,1673,1738, +1674,1738,1673, +1738,1674,1739, +1675,1739,1674, +1739,1675,1740, +1676,1740,1675, +1740,1676,1741, +1677,1741,1676, +1741,1677,1742, +1678,1742,1677, +1742,1678,1743, +1679,1743,1678, +1743,1679,1744, +1680,1744,1679, +1744,1680,1745, +1681,1745,1680, +1745,1681,1746, +1682,1746,1681, +1746,1682,1747, +1683,1747,1682, +1747,1683,1748, +1684,1748,1683, +1748,1684,1749, +1685,1749,1684, +1749,1685,1750, +1686,1750,1685, +1750,1686,1751, +1687,1751,1686, +1751,1687,1752, +1688,1752,1687, +1752,1688,1753, +1689,1753,1688, +1753,1689,1754, +1690,1754,1689, +1754,1690,1755, +1691,1755,1690, +1755,1691,1756, +1692,1756,1691, +1756,1692,1757, +1693,1757,1692, +1757,1693,1758, +1694,1758,1693, +1758,1694,1759, +1695,1759,1694, +1759,1695,1760, +1696,1760,1695, +1760,1696,1761, +1697,1761,1696, +1761,1697,1762, +1698,1762,1697, +1762,1698,1763, +1699,1763,1698, +1763,1699,1764, +1700,1764,1699, +1764,1700,1765, +1701,1765,1700, +1765,1701,1766, +1702,1766,1701, +1766,1702,1767, +1703,1767,1702, +1767,1703,1768, +1704,1768,1703, +1768,1704,1769, +1705,1769,1704, +1769,1705,1770, +1706,1770,1705, +1770,1706,1771, +1707,1771,1706, +1771,1707,1772, +1708,1772,1707, +1772,1708,1773, +1709,1773,1708, +1773,1709,1774, +1710,1774,1709, +1774,1710,1775, +1711,1775,1710, +1775,1711,1776, +1712,1776,1711, +1776,1712,1777, +1713,1777,1712, +1777,1713,1778, +1714,1778,1713, +1778,1714,1779, +1715,1779,1714, +1779,1715,1780, +1716,1780,1715, +1780,1716,1781, +1717,1781,1716, +1781,1717,1782, +1718,1782,1717, +1782,1718,1783, +1719,1783,1718, +1783,1719,1784, +1720,1784,1719, +1784,1720,1785, +1721,1785,1720, +1785,1721,1786, +1722,1786,1721, +1786,1722,1787, +1723,1787,1722, +1787,1723,1788, +1724,1788,1723, +1788,1724,1789, +1725,1789,1724, +1789,1725,1790, +1726,1790,1725, +1790,1726,1791, +1727,1791,1726, +1792,1728,1793, +1729,1793,1728, +1793,1729,1794, +1730,1794,1729, +1794,1730,1795, +1731,1795,1730, +1795,1731,1796, +1732,1796,1731, +1796,1732,1797, +1733,1797,1732, +1797,1733,1798, +1734,1798,1733, +1798,1734,1799, +1735,1799,1734, +1799,1735,1800, +1736,1800,1735, +1800,1736,1801, +1737,1801,1736, +1801,1737,1802, +1738,1802,1737, +1802,1738,1803, +1739,1803,1738, +1803,1739,1804, +1740,1804,1739, +1804,1740,1805, +1741,1805,1740, +1805,1741,1806, +1742,1806,1741, +1806,1742,1807, +1743,1807,1742, +1807,1743,1808, +1744,1808,1743, +1808,1744,1809, +1745,1809,1744, +1809,1745,1810, +1746,1810,1745, +1810,1746,1811, +1747,1811,1746, +1811,1747,1812, +1748,1812,1747, +1812,1748,1813, +1749,1813,1748, +1813,1749,1814, +1750,1814,1749, +1814,1750,1815, +1751,1815,1750, +1815,1751,1816, +1752,1816,1751, +1816,1752,1817, +1753,1817,1752, +1817,1753,1818, +1754,1818,1753, +1818,1754,1819, +1755,1819,1754, +1819,1755,1820, +1756,1820,1755, +1820,1756,1821, +1757,1821,1756, +1821,1757,1822, +1758,1822,1757, +1822,1758,1823, +1759,1823,1758, +1823,1759,1824, +1760,1824,1759, +1824,1760,1825, +1761,1825,1760, +1825,1761,1826, +1762,1826,1761, +1826,1762,1827, +1763,1827,1762, +1827,1763,1828, +1764,1828,1763, +1828,1764,1829, +1765,1829,1764, +1829,1765,1830, +1766,1830,1765, +1830,1766,1831, +1767,1831,1766, +1831,1767,1832, +1768,1832,1767, +1832,1768,1833, +1769,1833,1768, +1833,1769,1834, +1770,1834,1769, +1834,1770,1835, +1771,1835,1770, +1835,1771,1836, +1772,1836,1771, +1836,1772,1837, +1773,1837,1772, +1837,1773,1838, +1774,1838,1773, +1838,1774,1839, +1775,1839,1774, +1839,1775,1840, +1776,1840,1775, +1840,1776,1841, +1777,1841,1776, +1841,1777,1842, +1778,1842,1777, +1842,1778,1843, +1779,1843,1778, +1843,1779,1844, +1780,1844,1779, +1844,1780,1845, +1781,1845,1780, +1845,1781,1846, +1782,1846,1781, +1846,1782,1847, +1783,1847,1782, +1847,1783,1848, +1784,1848,1783, +1848,1784,1849, +1785,1849,1784, +1849,1785,1850, +1786,1850,1785, +1850,1786,1851, +1787,1851,1786, +1851,1787,1852, +1788,1852,1787, +1852,1788,1853, +1789,1853,1788, +1853,1789,1854, +1790,1854,1789, +1854,1790,1855, +1791,1855,1790, +1856,1792,1857, +1793,1857,1792, +1857,1793,1858, +1794,1858,1793, +1858,1794,1859, +1795,1859,1794, +1859,1795,1860, +1796,1860,1795, +1860,1796,1861, +1797,1861,1796, +1861,1797,1862, +1798,1862,1797, +1862,1798,1863, +1799,1863,1798, +1863,1799,1864, +1800,1864,1799, +1864,1800,1865, +1801,1865,1800, +1865,1801,1866, +1802,1866,1801, +1866,1802,1867, +1803,1867,1802, +1867,1803,1868, +1804,1868,1803, +1868,1804,1869, +1805,1869,1804, +1869,1805,1870, +1806,1870,1805, +1870,1806,1871, +1807,1871,1806, +1871,1807,1872, +1808,1872,1807, +1872,1808,1873, +1809,1873,1808, +1873,1809,1874, +1810,1874,1809, +1874,1810,1875, +1811,1875,1810, +1875,1811,1876, +1812,1876,1811, +1876,1812,1877, +1813,1877,1812, +1877,1813,1878, +1814,1878,1813, +1878,1814,1879, +1815,1879,1814, +1879,1815,1880, +1816,1880,1815, +1880,1816,1881, +1817,1881,1816, +1881,1817,1882, +1818,1882,1817, +1882,1818,1883, +1819,1883,1818, +1883,1819,1884, +1820,1884,1819, +1884,1820,1885, +1821,1885,1820, +1885,1821,1886, +1822,1886,1821, +1886,1822,1887, +1823,1887,1822, +1887,1823,1888, +1824,1888,1823, +1888,1824,1889, +1825,1889,1824, +1889,1825,1890, +1826,1890,1825, +1890,1826,1891, +1827,1891,1826, +1891,1827,1892, +1828,1892,1827, +1892,1828,1893, +1829,1893,1828, +1893,1829,1894, +1830,1894,1829, +1894,1830,1895, +1831,1895,1830, +1895,1831,1896, +1832,1896,1831, +1896,1832,1897, +1833,1897,1832, +1897,1833,1898, +1834,1898,1833, +1898,1834,1899, +1835,1899,1834, +1899,1835,1900, +1836,1900,1835, +1900,1836,1901, +1837,1901,1836, +1901,1837,1902, +1838,1902,1837, +1902,1838,1903, +1839,1903,1838, +1903,1839,1904, +1840,1904,1839, +1904,1840,1905, +1841,1905,1840, +1905,1841,1906, +1842,1906,1841, +1906,1842,1907, +1843,1907,1842, +1907,1843,1908, +1844,1908,1843, +1908,1844,1909, +1845,1909,1844, +1909,1845,1910, +1846,1910,1845, +1910,1846,1911, +1847,1911,1846, +1911,1847,1912, +1848,1912,1847, +1912,1848,1913, +1849,1913,1848, +1913,1849,1914, +1850,1914,1849, +1914,1850,1915, +1851,1915,1850, +1915,1851,1916, +1852,1916,1851, +1916,1852,1917, +1853,1917,1852, +1917,1853,1918, +1854,1918,1853, +1918,1854,1919, +1855,1919,1854, +1920,1856,1921, +1857,1921,1856, +1921,1857,1922, +1858,1922,1857, +1922,1858,1923, +1859,1923,1858, +1923,1859,1924, +1860,1924,1859, +1924,1860,1925, +1861,1925,1860, +1925,1861,1926, +1862,1926,1861, +1926,1862,1927, +1863,1927,1862, +1927,1863,1928, +1864,1928,1863, +1928,1864,1929, +1865,1929,1864, +1929,1865,1930, +1866,1930,1865, +1930,1866,1931, +1867,1931,1866, +1931,1867,1932, +1868,1932,1867, +1932,1868,1933, +1869,1933,1868, +1933,1869,1934, +1870,1934,1869, +1934,1870,1935, +1871,1935,1870, +1935,1871,1936, +1872,1936,1871, +1936,1872,1937, +1873,1937,1872, +1937,1873,1938, +1874,1938,1873, +1938,1874,1939, +1875,1939,1874, +1939,1875,1940, +1876,1940,1875, +1940,1876,1941, +1877,1941,1876, +1941,1877,1942, +1878,1942,1877, +1942,1878,1943, +1879,1943,1878, +1943,1879,1944, +1880,1944,1879, +1944,1880,1945, +1881,1945,1880, +1945,1881,1946, +1882,1946,1881, +1946,1882,1947, +1883,1947,1882, +1947,1883,1948, +1884,1948,1883, +1948,1884,1949, +1885,1949,1884, +1949,1885,1950, +1886,1950,1885, +1950,1886,1951, +1887,1951,1886, +1951,1887,1952, +1888,1952,1887, +1952,1888,1953, +1889,1953,1888, +1953,1889,1954, +1890,1954,1889, +1954,1890,1955, +1891,1955,1890, +1955,1891,1956, +1892,1956,1891, +1956,1892,1957, +1893,1957,1892, +1957,1893,1958, +1894,1958,1893, +1958,1894,1959, +1895,1959,1894, +1959,1895,1960, +1896,1960,1895, +1960,1896,1961, +1897,1961,1896, +1961,1897,1962, +1898,1962,1897, +1962,1898,1963, +1899,1963,1898, +1963,1899,1964, +1900,1964,1899, +1964,1900,1965, +1901,1965,1900, +1965,1901,1966, +1902,1966,1901, +1966,1902,1967, +1903,1967,1902, +1967,1903,1968, +1904,1968,1903, +1968,1904,1969, +1905,1969,1904, +1969,1905,1970, +1906,1970,1905, +1970,1906,1971, +1907,1971,1906, +1971,1907,1972, +1908,1972,1907, +1972,1908,1973, +1909,1973,1908, +1973,1909,1974, +1910,1974,1909, +1974,1910,1975, +1911,1975,1910, +1975,1911,1976, +1912,1976,1911, +1976,1912,1977, +1913,1977,1912, +1977,1913,1978, +1914,1978,1913, +1978,1914,1979, +1915,1979,1914, +1979,1915,1980, +1916,1980,1915, +1980,1916,1981, +1917,1981,1916, +1981,1917,1982, +1918,1982,1917, +1982,1918,1983, +1919,1983,1918, +1984,1920,1985, +1921,1985,1920, +1985,1921,1986, +1922,1986,1921, +1986,1922,1987, +1923,1987,1922, +1987,1923,1988, +1924,1988,1923, +1988,1924,1989, +1925,1989,1924, +1989,1925,1990, +1926,1990,1925, +1990,1926,1991, +1927,1991,1926, +1991,1927,1992, +1928,1992,1927, +1992,1928,1993, +1929,1993,1928, +1993,1929,1994, +1930,1994,1929, +1994,1930,1995, +1931,1995,1930, +1995,1931,1996, +1932,1996,1931, +1996,1932,1997, +1933,1997,1932, +1997,1933,1998, +1934,1998,1933, +1998,1934,1999, +1935,1999,1934, +1999,1935,2000, +1936,2000,1935, +2000,1936,2001, +1937,2001,1936, +2001,1937,2002, +1938,2002,1937, +2002,1938,2003, +1939,2003,1938, +2003,1939,2004, +1940,2004,1939, +2004,1940,2005, +1941,2005,1940, +2005,1941,2006, +1942,2006,1941, +2006,1942,2007, +1943,2007,1942, +2007,1943,2008, +1944,2008,1943, +2008,1944,2009, +1945,2009,1944, +2009,1945,2010, +1946,2010,1945, +2010,1946,2011, +1947,2011,1946, +2011,1947,2012, +1948,2012,1947, +2012,1948,2013, +1949,2013,1948, +2013,1949,2014, +1950,2014,1949, +2014,1950,2015, +1951,2015,1950, +2015,1951,2016, +1952,2016,1951, +2016,1952,2017, +1953,2017,1952, +2017,1953,2018, +1954,2018,1953, +2018,1954,2019, +1955,2019,1954, +2019,1955,2020, +1956,2020,1955, +2020,1956,2021, +1957,2021,1956, +2021,1957,2022, +1958,2022,1957, +2022,1958,2023, +1959,2023,1958, +2023,1959,2024, +1960,2024,1959, +2024,1960,2025, +1961,2025,1960, +2025,1961,2026, +1962,2026,1961, +2026,1962,2027, +1963,2027,1962, +2027,1963,2028, +1964,2028,1963, +2028,1964,2029, +1965,2029,1964, +2029,1965,2030, +1966,2030,1965, +2030,1966,2031, +1967,2031,1966, +2031,1967,2032, +1968,2032,1967, +2032,1968,2033, +1969,2033,1968, +2033,1969,2034, +1970,2034,1969, +2034,1970,2035, +1971,2035,1970, +2035,1971,2036, +1972,2036,1971, +2036,1972,2037, +1973,2037,1972, +2037,1973,2038, +1974,2038,1973, +2038,1974,2039, +1975,2039,1974, +2039,1975,2040, +1976,2040,1975, +2040,1976,2041, +1977,2041,1976, +2041,1977,2042, +1978,2042,1977, +2042,1978,2043, +1979,2043,1978, +2043,1979,2044, +1980,2044,1979, +2044,1980,2045, +1981,2045,1980, +2045,1981,2046, +1982,2046,1981, +2046,1982,2047, +1983,2047,1982, +}; + +#define Landscape04VtxCount 2112 +#define Landscape04IdxCount 12096 + +btScalar Landscape04Vtx[] = { +3.90625f,18.9654f,125.0f, +3.90625f,20.0876f,128.906f, +7.8125f,20.5764f,125.0f, +7.8125f,21.0764f,128.906f, +11.7188f,21.5489f,125.0f, +11.7188f,21.4076f,128.906f, +15.625f,22.4963f,125.0f, +15.625f,22.6299f,128.906f, +19.5313f,22.3264f,125.0f, +19.5313f,22.1174f,128.906f, +23.4375f,20.3987f,125.0f, +23.4375f,20.3977f,128.906f, +27.3438f,18.6622f,125.0f, +27.3438f,18.7343f,128.906f, +31.25f,17.4724f,125.0f, +31.25f,17.9144f,128.906f, +35.1563f,16.4832f,125.0f, +35.1563f,17.2941f,128.906f, +39.0625f,15.2653f,125.0f, +39.0625f,16.5386f,128.906f, +42.9688f,14.379f,125.0f, +42.9688f,15.6892f,128.906f, +46.875f,13.9872f,125.0f, +46.875f,14.6414f,128.906f, +50.7813f,14.7002f,125.0f, +50.7813f,14.3505f,128.906f, +54.6875f,15.1119f,125.0f, +54.6875f,14.1604f,128.906f, +58.5938f,14.6638f,125.0f, +58.5938f,14.517f,128.906f, +62.5f,14.668f,125.0f, +62.5f,15.1057f,128.906f, +66.4063f,14.9792f,125.0f, +66.4063f,16.0684f,128.906f, +70.3125f,15.4776f,125.0f, +70.3125f,16.6251f,128.906f, +74.2188f,15.0939f,125.0f, +74.2188f,15.9689f,128.906f, +78.125f,15.5318f,125.0f, +78.125f,16.0234f,128.906f, +82.0313f,16.0777f,125.0f, +82.0313f,16.205f,128.906f, +85.9375f,17.8753f,125.0f, +85.9375f,18.8167f,128.906f, +89.8438f,18.8786f,125.0f, +89.8438f,19.6433f,128.906f, +93.75f,19.8208f,125.0f, +93.75f,20.2916f,128.906f, +97.6563f,23.2578f,125.0f, +97.6563f,23.2308f,128.906f, +101.563f,25.3117f,125.0f, +101.563f,25.882f,128.906f, +105.469f,26.8718f,125.0f, +105.469f,27.5736f,128.906f, +109.375f,28.7414f,125.0f, +109.375f,28.9662f,128.906f, +113.281f,29.9339f,125.0f, +113.281f,30.5702f,128.906f, +117.188f,30.6849f,125.0f, +117.188f,31.8627f,128.906f, +121.094f,32.4202f,125.0f, +121.094f,32.5216f,128.906f, +125.0f,34.7495f,125.0f, +125.0f,34.1918f,128.906f, +128.906f,37.137f,125.0f, +128.906f,37.0161f,128.906f, +132.813f,38.4113f,125.0f, +132.813f,38.5084f,128.906f, +136.719f,38.1788f,125.0f, +136.719f,39.1631f,128.906f, +140.625f,38.7652f,125.0f, +140.625f,39.0529f,128.906f, +144.531f,37.9353f,125.0f, +144.531f,38.9229f,128.906f, +148.438f,38.5681f,125.0f, +148.438f,38.4312f,128.906f, +152.344f,38.6243f,125.0f, +152.344f,39.1086f,128.906f, +156.25f,39.6341f,125.0f, +156.25f,39.7022f,128.906f, +160.156f,39.762f,125.0f, +160.156f,39.3007f,128.906f, +164.063f,38.5385f,125.0f, +164.063f,38.2318f,128.906f, +167.969f,36.3551f,125.0f, +167.969f,36.7493f,128.906f, +171.875f,36.1936f,125.0f, +171.875f,35.9781f,128.906f, +175.781f,35.5636f,125.0f, +175.781f,35.7712f,128.906f, +179.688f,34.6544f,125.0f, +179.688f,35.6247f,128.906f, +183.594f,34.1597f,125.0f, +183.594f,35.4808f,128.906f, +187.5f,33.5567f,125.0f, +187.5f,35.6102f,128.906f, +191.406f,33.0138f,125.0f, +191.406f,34.0305f,128.906f, +195.313f,31.2722f,125.0f, +195.313f,32.0227f,128.906f, +199.219f,29.2529f,125.0f, +199.219f,29.7666f,128.906f, +203.125f,26.9435f,125.0f, +203.125f,27.3968f,128.906f, +207.031f,25.0844f,125.0f, +207.031f,25.1642f,128.906f, +210.938f,23.6605f,125.0f, +210.938f,24.279f,128.906f, +214.844f,22.0745f,125.0f, +214.844f,22.4357f,128.906f, +218.75f,20.3206f,125.0f, +218.75f,21.7754f,128.906f, +222.656f,20.0402f,125.0f, +222.656f,19.6381f,128.906f, +226.563f,20.1162f,125.0f, +226.563f,19.78f,128.906f, +230.469f,20.2399f,125.0f, +230.469f,20.0349f,128.906f, +234.375f,19.6142f,125.0f, +234.375f,19.1534f,128.906f, +238.281f,18.6118f,125.0f, +238.281f,17.863f,128.906f, +242.188f,17.3711f,125.0f, +242.188f,17.658f,128.906f, +246.094f,17.675f,125.0f, +246.094f,16.951f,128.906f, +250.0f,17.3999f,125.0f, +250.0f,16.2961f,128.906f, +3.90625f,18.5327f,121.094f, +7.8125f,19.7267f,121.094f, +11.7188f,20.9891f,121.094f, +15.625f,22.237f,121.094f, +19.5313f,22.3238f,121.094f, +23.4375f,20.1525f,121.094f, +27.3438f,17.9536f,121.094f, +31.25f,17.647f,121.094f, +35.1563f,16.241f,121.094f, +39.0625f,14.6821f,121.094f, +42.9688f,14.4948f,121.094f, +46.875f,15.0351f,121.094f, +50.7813f,15.3893f,121.094f, +54.6875f,15.1531f,121.094f, +58.5938f,14.9284f,121.094f, +62.5f,15.1197f,121.094f, +66.4063f,15.1561f,121.094f, +70.3125f,15.1593f,121.094f, +74.2188f,15.0707f,121.094f, +78.125f,16.0455f,121.094f, +82.0313f,16.6186f,121.094f, +85.9375f,17.4149f,121.094f, +89.8438f,18.746f,121.094f, +93.75f,18.8475f,121.094f, +97.6563f,21.6899f,121.094f, +101.563f,24.567f,121.094f, +105.469f,25.7581f,121.094f, +109.375f,27.437f,121.094f, +113.281f,29.1226f,121.094f, +117.188f,30.137f,121.094f, +121.094f,32.1062f,121.094f, +125.0f,34.674f,121.094f, +128.906f,37.1044f,121.094f, +132.813f,37.8111f,121.094f, +136.719f,37.7901f,121.094f, +140.625f,37.5727f,121.094f, +144.531f,37.1561f,121.094f, +148.438f,38.1976f,121.094f, +152.344f,38.9227f,121.094f, +156.25f,40.3124f,121.094f, +160.156f,40.6867f,121.094f, +164.063f,39.5374f,121.094f, +167.969f,38.019f,121.094f, +171.875f,36.4573f,121.094f, +175.781f,35.2509f,121.094f, +179.688f,34.6709f,121.094f, +183.594f,33.5584f,121.094f, +187.5f,33.2411f,121.094f, +191.406f,31.7588f,121.094f, +195.313f,30.3558f,121.094f, +199.219f,28.879f,121.094f, +203.125f,26.7589f,121.094f, +207.031f,25.0535f,121.094f, +210.938f,23.0477f,121.094f, +214.844f,20.6897f,121.094f, +218.75f,19.3676f,121.094f, +222.656f,19.2985f,121.094f, +226.563f,20.2312f,121.094f, +230.469f,20.317f,121.094f, +234.375f,20.2468f,121.094f, +238.281f,20.3734f,121.094f, +242.188f,18.3676f,121.094f, +246.094f,16.642f,121.094f, +250.0f,17.5995f,121.094f, +3.90625f,18.919f,117.188f, +7.8125f,19.2124f,117.188f, +11.7188f,20.7659f,117.188f, +15.625f,20.5809f,117.188f, +19.5313f,20.3134f,117.188f, +23.4375f,18.6669f,117.188f, +27.3438f,17.5145f,117.188f, +31.25f,17.0813f,117.188f, +35.1563f,15.6789f,117.188f, +39.0625f,14.7581f,117.188f, +42.9688f,14.4424f,117.188f, +46.875f,14.7991f,117.188f, +50.7813f,15.0726f,117.188f, +54.6875f,14.8056f,117.188f, +58.5938f,15.756f,117.188f, +62.5f,16.3024f,117.188f, +66.4063f,16.0449f,117.188f, +70.3125f,15.9115f,117.188f, +74.2188f,16.1633f,117.188f, +78.125f,17.3323f,117.188f, +82.0313f,17.2659f,117.188f, +85.9375f,17.987f,117.188f, +89.8438f,18.3044f,117.188f, +93.75f,18.2665f,117.188f, +97.6563f,19.5364f,117.188f, +101.563f,21.7536f,117.188f, +105.469f,23.6545f,117.188f, +109.375f,25.5212f,117.188f, +113.281f,28.1179f,117.188f, +117.188f,29.5931f,117.188f, +121.094f,31.8126f,117.188f, +125.0f,34.0227f,117.188f, +128.906f,36.3895f,117.188f, +132.813f,37.0423f,117.188f, +136.719f,36.8278f,117.188f, +140.625f,36.2349f,117.188f, +144.531f,36.8825f,117.188f, +148.438f,39.6492f,117.188f, +152.344f,41.6626f,117.188f, +156.25f,42.5091f,117.188f, +160.156f,43.0711f,117.188f, +164.063f,41.7733f,117.188f, +167.969f,40.5985f,117.188f, +171.875f,38.1852f,117.188f, +175.781f,37.023f,117.188f, +179.688f,35.8533f,117.188f, +183.594f,34.5754f,117.188f, +187.5f,33.6585f,117.188f, +191.406f,32.534f,117.188f, +195.313f,31.0632f,117.188f, +199.219f,29.0243f,117.188f, +203.125f,27.0248f,117.188f, +207.031f,25.1597f,117.188f, +210.938f,22.6282f,117.188f, +214.844f,20.6205f,117.188f, +218.75f,19.2556f,117.188f, +222.656f,18.8259f,117.188f, +226.563f,19.2235f,117.188f, +230.469f,20.4441f,117.188f, +234.375f,20.5373f,117.188f, +238.281f,20.3082f,117.188f, +242.188f,19.4397f,117.188f, +246.094f,17.9806f,117.188f, +250.0f,17.3395f,117.188f, +3.90625f,18.3498f,113.281f, +7.8125f,18.7009f,113.281f, +11.7188f,19.3704f,113.281f, +15.625f,19.5203f,113.281f, +19.5313f,18.5704f,113.281f, +23.4375f,17.6697f,113.281f, +27.3438f,16.8001f,113.281f, +31.25f,16.54f,113.281f, +35.1563f,15.8558f,113.281f, +39.0625f,15.1296f,113.281f, +42.9688f,15.8599f,113.281f, +46.875f,16.437f,113.281f, +50.7813f,16.2977f,113.281f, +54.6875f,16.7076f,113.281f, +58.5938f,16.8187f,113.281f, +62.5f,17.1513f,113.281f, +66.4063f,16.5296f,113.281f, +70.3125f,15.8782f,113.281f, +74.2188f,16.614f,113.281f, +78.125f,17.0474f,113.281f, +82.0313f,17.3371f,113.281f, +85.9375f,17.9565f,113.281f, +89.8438f,18.3918f,113.281f, +93.75f,19.0258f,113.281f, +97.6563f,19.2791f,113.281f, +101.563f,20.1533f,113.281f, +105.469f,22.2922f,113.281f, +109.375f,24.6835f,113.281f, +113.281f,25.7755f,113.281f, +117.188f,28.8805f,113.281f, +121.094f,31.2119f,113.281f, +125.0f,33.4657f,113.281f, +128.906f,35.1055f,113.281f, +132.813f,36.4197f,113.281f, +136.719f,37.3017f,113.281f, +140.625f,37.1796f,113.281f, +144.531f,38.2037f,113.281f, +148.438f,41.4383f,113.281f, +152.344f,43.9714f,113.281f, +156.25f,45.0067f,113.281f, +160.156f,45.1491f,113.281f, +164.063f,43.8042f,113.281f, +167.969f,42.5165f,113.281f, +171.875f,40.361f,113.281f, +175.781f,38.3494f,113.281f, +179.688f,37.4529f,113.281f, +183.594f,35.5766f,113.281f, +187.5f,34.2438f,113.281f, +191.406f,32.0218f,113.281f, +195.313f,30.2021f,113.281f, +199.219f,28.8256f,113.281f, +203.125f,27.2081f,113.281f, +207.031f,24.992f,113.281f, +210.938f,22.5332f,113.281f, +214.844f,19.7765f,113.281f, +218.75f,18.5573f,113.281f, +222.656f,18.1469f,113.281f, +226.563f,17.9659f,113.281f, +230.469f,19.2f,113.281f, +234.375f,20.0741f,113.281f, +238.281f,20.1159f,113.281f, +242.188f,19.0382f,113.281f, +246.094f,18.3417f,113.281f, +250.0f,18.7603f,113.281f, +3.90625f,18.0017f,109.375f, +7.8125f,18.1552f,109.375f, +11.7188f,18.2026f,109.375f, +15.625f,18.2042f,109.375f, +19.5313f,17.7806f,109.375f, +23.4375f,17.5378f,109.375f, +27.3438f,16.8627f,109.375f, +31.25f,15.9329f,109.375f, +35.1563f,15.192f,109.375f, +39.0625f,16.0796f,109.375f, +42.9688f,16.1895f,109.375f, +46.875f,15.9774f,109.375f, +50.7813f,16.9529f,109.375f, +54.6875f,17.0901f,109.375f, +58.5938f,17.3722f,109.375f, +62.5f,16.5809f,109.375f, +66.4063f,16.8111f,109.375f, +70.3125f,16.9238f,109.375f, +74.2188f,16.8422f,109.375f, +78.125f,17.0401f,109.375f, +82.0313f,16.8637f,109.375f, +85.9375f,17.4071f,109.375f, +89.8438f,17.944f,109.375f, +93.75f,18.5255f,109.375f, +97.6563f,18.2829f,109.375f, +101.563f,19.0975f,109.375f, +105.469f,20.4292f,109.375f, +109.375f,22.163f,109.375f, +113.281f,25.6773f,109.375f, +117.188f,27.8617f,109.375f, +121.094f,30.6543f,109.375f, +125.0f,33.4226f,109.375f, +128.906f,34.4263f,109.375f, +132.813f,36.8747f,109.375f, +136.719f,37.4551f,109.375f, +140.625f,37.4975f,109.375f, +144.531f,40.0751f,109.375f, +148.438f,42.7524f,109.375f, +152.344f,44.7756f,109.375f, +156.25f,46.1787f,109.375f, +160.156f,46.3753f,109.375f, +164.063f,45.2089f,109.375f, +167.969f,43.7487f,109.375f, +171.875f,41.6365f,109.375f, +175.781f,39.7459f,109.375f, +179.688f,36.9804f,109.375f, +183.594f,35.6688f,109.375f, +187.5f,35.0212f,109.375f, +191.406f,32.4383f,109.375f, +195.313f,29.6046f,109.375f, +199.219f,28.1822f,109.375f, +203.125f,26.2444f,109.375f, +207.031f,24.1442f,109.375f, +210.938f,22.1072f,109.375f, +214.844f,20.0401f,109.375f, +218.75f,18.0663f,109.375f, +222.656f,16.866f,109.375f, +226.563f,16.9372f,109.375f, +230.469f,16.9853f,109.375f, +234.375f,17.6761f,109.375f, +238.281f,18.3669f,109.375f, +242.188f,18.4156f,109.375f, +246.094f,18.2171f,109.375f, +250.0f,18.5941f,109.375f, +3.90625f,17.9608f,105.469f, +7.8125f,18.4369f,105.469f, +11.7188f,18.4406f,105.469f, +15.625f,17.8685f,105.469f, +19.5313f,17.7519f,105.469f, +23.4375f,17.5734f,105.469f, +27.3438f,16.3397f,105.469f, +31.25f,15.8618f,105.469f, +35.1563f,16.1194f,105.469f, +39.0625f,16.889f,105.469f, +42.9688f,16.2804f,105.469f, +46.875f,15.8474f,105.469f, +50.7813f,16.2892f,105.469f, +54.6875f,16.2854f,105.469f, +58.5938f,16.7368f,105.469f, +62.5f,17.4055f,105.469f, +66.4063f,16.8808f,105.469f, +70.3125f,17.3183f,105.469f, +74.2188f,17.7166f,105.469f, +78.125f,17.0657f,105.469f, +82.0313f,16.7305f,105.469f, +85.9375f,16.3929f,105.469f, +89.8438f,16.6475f,105.469f, +93.75f,17.7645f,105.469f, +97.6563f,18.4212f,105.469f, +101.563f,18.4107f,105.469f, +105.469f,19.3751f,105.469f, +109.375f,21.843f,105.469f, +113.281f,25.0143f,105.469f, +117.188f,26.9168f,105.469f, +121.094f,29.8403f,105.469f, +125.0f,32.4937f,105.469f, +128.906f,34.4076f,105.469f, +132.813f,35.2497f,105.469f, +136.719f,36.4785f,105.469f, +140.625f,37.7983f,105.469f, +144.531f,40.5712f,105.469f, +148.438f,43.3698f,105.469f, +152.344f,45.784f,105.469f, +156.25f,46.9835f,105.469f, +160.156f,47.2774f,105.469f, +164.063f,46.7695f,105.469f, +167.969f,45.0199f,105.469f, +171.875f,42.588f,105.469f, +175.781f,39.988f,105.469f, +179.688f,38.0653f,105.469f, +183.594f,37.5754f,105.469f, +187.5f,35.6316f,105.469f, +191.406f,32.4143f,105.469f, +195.313f,29.5342f,105.469f, +199.219f,27.2795f,105.469f, +203.125f,26.065f,105.469f, +207.031f,24.8633f,105.469f, +210.938f,23.0216f,105.469f, +214.844f,21.1684f,105.469f, +218.75f,18.9315f,105.469f, +222.656f,17.7013f,105.469f, +226.563f,16.9466f,105.469f, +230.469f,17.1437f,105.469f, +234.375f,17.6691f,105.469f, +238.281f,17.9243f,105.469f, +242.188f,18.0005f,105.469f, +246.094f,18.6179f,105.469f, +250.0f,19.2165f,105.469f, +3.90625f,17.7074f,101.563f, +7.8125f,18.411f,101.563f, +11.7188f,17.9916f,101.563f, +15.625f,18.5349f,101.563f, +19.5313f,18.6607f,101.563f, +23.4375f,17.406f,101.563f, +27.3438f,17.2356f,101.563f, +31.25f,17.0395f,101.563f, +35.1563f,17.9903f,101.563f, +39.0625f,18.2603f,101.563f, +42.9688f,17.9037f,101.563f, +46.875f,17.2358f,101.563f, +50.7813f,16.1089f,101.563f, +54.6875f,16.6043f,101.563f, +58.5938f,16.5656f,101.563f, +62.5f,16.8655f,101.563f, +66.4063f,17.0123f,101.563f, +70.3125f,17.4985f,101.563f, +74.2188f,18.0195f,101.563f, +78.125f,17.3417f,101.563f, +82.0313f,16.8477f,101.563f, +85.9375f,15.4602f,101.563f, +89.8438f,15.6001f,101.563f, +93.75f,16.8889f,101.563f, +97.6563f,17.2944f,101.563f, +101.563f,17.3431f,101.563f, +105.469f,18.2306f,101.563f, +109.375f,20.5556f,101.563f, +113.281f,22.5598f,101.563f, +117.188f,25.0997f,101.563f, +121.094f,28.2048f,101.563f, +125.0f,30.46f,101.563f, +128.906f,32.5729f,101.563f, +132.813f,34.5568f,101.563f, +136.719f,36.463f,101.563f, +140.625f,37.8259f,101.563f, +144.531f,40.4357f,101.563f, +148.438f,43.6544f,101.563f, +152.344f,46.204f,101.563f, +156.25f,47.3874f,101.563f, +160.156f,47.5222f,101.563f, +164.063f,46.8312f,101.563f, +167.969f,44.5065f,101.563f, +171.875f,43.7648f,101.563f, +175.781f,41.9789f,101.563f, +179.688f,40.785f,101.563f, +183.594f,38.7639f,101.563f, +187.5f,36.1589f,101.563f, +191.406f,33.4197f,101.563f, +195.313f,29.7568f,101.563f, +199.219f,27.2343f,101.563f, +203.125f,26.3845f,101.563f, +207.031f,25.3149f,101.563f, +210.938f,23.4896f,101.563f, +214.844f,22.229f,101.563f, +218.75f,20.0014f,101.563f, +222.656f,19.0955f,101.563f, +226.563f,17.971f,101.563f, +230.469f,16.9303f,101.563f, +234.375f,17.3619f,101.563f, +238.281f,17.0337f,101.563f, +242.188f,17.1424f,101.563f, +246.094f,18.334f,101.563f, +250.0f,19.2744f,101.563f, +3.90625f,18.0176f,97.6563f, +7.8125f,18.1916f,97.6563f, +11.7188f,17.72f,97.6563f, +15.625f,18.3444f,97.6563f, +19.5313f,18.7102f,97.6563f, +23.4375f,17.4143f,97.6563f, +27.3438f,18.0085f,97.6563f, +31.25f,18.4924f,97.6563f, +35.1563f,19.4324f,97.6563f, +39.0625f,19.7998f,97.6563f, +42.9688f,19.5444f,97.6563f, +46.875f,19.5513f,97.6563f, +50.7813f,17.9397f,97.6563f, +54.6875f,16.6383f,97.6563f, +58.5938f,16.0619f,97.6563f, +62.5f,16.7402f,97.6563f, +66.4063f,16.955f,97.6563f, +70.3125f,17.5912f,97.6563f, +74.2188f,17.1181f,97.6563f, +78.125f,16.9063f,97.6563f, +82.0313f,16.3988f,97.6563f, +85.9375f,15.935f,97.6563f, +89.8438f,16.0664f,97.6563f, +93.75f,16.1926f,97.6563f, +97.6563f,16.5004f,97.6563f, +101.563f,17.1185f,97.6563f, +105.469f,17.2859f,97.6563f, +109.375f,19.0026f,97.6563f, +113.281f,21.0018f,97.6563f, +117.188f,23.6336f,97.6563f, +121.094f,26.4831f,97.6563f, +125.0f,29.3075f,97.6563f, +128.906f,32.5702f,97.6563f, +132.813f,34.5711f,97.6563f, +136.719f,36.1666f,97.6563f, +140.625f,37.5909f,97.6563f, +144.531f,40.3232f,97.6563f, +148.438f,42.661f,97.6563f, +152.344f,45.5604f,97.6563f, +156.25f,47.6984f,97.6563f, +160.156f,47.4129f,97.6563f, +164.063f,47.1564f,97.6563f, +167.969f,45.3058f,97.6563f, +171.875f,44.8069f,97.6563f, +175.781f,43.6847f,97.6563f, +179.688f,41.6831f,97.6563f, +183.594f,39.4072f,97.6563f, +187.5f,36.6118f,97.6563f, +191.406f,33.396f,97.6563f, +195.313f,29.9372f,97.6563f, +199.219f,28.0616f,97.6563f, +203.125f,27.3957f,97.6563f, +207.031f,25.6934f,97.6563f, +210.938f,24.4412f,97.6563f, +214.844f,23.2356f,97.6563f, +218.75f,21.445f,97.6563f, +222.656f,19.5412f,97.6563f, +226.563f,18.4898f,97.6563f, +230.469f,17.727f,97.6563f, +234.375f,16.5139f,97.6563f, +238.281f,16.2579f,97.6563f, +242.188f,16.1539f,97.6563f, +246.094f,17.0856f,97.6563f, +250.0f,18.5151f,97.6563f, +3.90625f,17.1671f,93.75f, +7.8125f,16.817f,93.75f, +11.7188f,17.5293f,93.75f, +15.625f,18.7701f,93.75f, +19.5313f,18.3362f,93.75f, +23.4375f,19.0869f,93.75f, +27.3438f,19.7557f,93.75f, +31.25f,20.0113f,93.75f, +35.1563f,20.3441f,93.75f, +39.0625f,21.4434f,93.75f, +42.9688f,21.6008f,93.75f, +46.875f,21.5423f,93.75f, +50.7813f,20.7592f,93.75f, +54.6875f,18.9207f,93.75f, +58.5938f,17.6772f,93.75f, +62.5f,17.5409f,93.75f, +66.4063f,17.599f,93.75f, +70.3125f,18.2626f,93.75f, +74.2188f,18.4046f,93.75f, +78.125f,18.215f,93.75f, +82.0313f,18.4743f,93.75f, +85.9375f,17.6579f,93.75f, +89.8438f,17.732f,93.75f, +93.75f,18.4172f,93.75f, +97.6563f,19.0439f,93.75f, +101.563f,19.7437f,93.75f, +105.469f,19.8588f,93.75f, +109.375f,19.7414f,93.75f, +113.281f,21.4756f,93.75f, +117.188f,24.1862f,93.75f, +121.094f,26.8351f,93.75f, +125.0f,29.9621f,93.75f, +128.906f,32.8267f,93.75f, +132.813f,34.6779f,93.75f, +136.719f,36.0083f,93.75f, +140.625f,36.9812f,93.75f, +144.531f,39.6087f,93.75f, +148.438f,42.2269f,93.75f, +152.344f,44.492f,93.75f, +156.25f,47.1767f,93.75f, +160.156f,47.5667f,93.75f, +164.063f,46.9625f,93.75f, +167.969f,45.6865f,93.75f, +171.875f,45.7668f,93.75f, +175.781f,44.8303f,93.75f, +179.688f,42.5904f,93.75f, +183.594f,40.3536f,93.75f, +187.5f,37.9498f,93.75f, +191.406f,35.1415f,93.75f, +195.313f,31.5011f,93.75f, +199.219f,29.695f,93.75f, +203.125f,27.7988f,93.75f, +207.031f,26.3522f,93.75f, +210.938f,25.8544f,93.75f, +214.844f,24.7269f,93.75f, +218.75f,23.7697f,93.75f, +222.656f,20.9249f,93.75f, +226.563f,19.1368f,93.75f, +230.469f,18.5704f,93.75f, +234.375f,17.554f,93.75f, +238.281f,14.9004f,93.75f, +242.188f,16.3253f,93.75f, +246.094f,16.0037f,93.75f, +250.0f,15.9921f,93.75f, +3.90625f,15.6427f,89.8438f, +7.8125f,16.2722f,89.8438f, +11.7188f,17.6471f,89.8438f, +15.625f,18.8565f,89.8438f, +19.5313f,19.651f,89.8438f, +23.4375f,20.9243f,89.8438f, +27.3438f,20.8045f,89.8438f, +31.25f,20.2274f,89.8438f, +35.1563f,21.5768f,89.8438f, +39.0625f,22.566f,89.8438f, +42.9688f,23.4111f,89.8438f, +46.875f,23.5063f,89.8438f, +50.7813f,22.9631f,89.8438f, +54.6875f,21.5642f,89.8438f, +58.5938f,20.3649f,89.8438f, +62.5f,19.6177f,89.8438f, +66.4063f,18.6758f,89.8438f, +70.3125f,18.6837f,89.8438f, +74.2188f,19.7593f,89.8438f, +78.125f,20.4356f,89.8438f, +82.0313f,20.1806f,89.8438f, +85.9375f,19.4513f,89.8438f, +89.8438f,19.2942f,89.8438f, +93.75f,19.9864f,89.8438f, +97.6563f,20.6569f,89.8438f, +101.563f,20.8985f,89.8438f, +105.469f,20.8027f,89.8438f, +109.375f,21.5099f,89.8438f, +113.281f,22.7491f,89.8438f, +117.188f,24.1938f,89.8438f, +121.094f,27.3472f,89.8438f, +125.0f,29.9546f,89.8438f, +128.906f,32.3821f,89.8438f, +132.813f,34.2078f,89.8438f, +136.719f,35.7419f,89.8438f, +140.625f,36.6408f,89.8438f, +144.531f,39.1756f,89.8438f, +148.438f,42.1721f,89.8438f, +152.344f,43.7891f,89.8438f, +156.25f,45.9566f,89.8438f, +160.156f,47.5521f,89.8438f, +164.063f,47.0165f,89.8438f, +167.969f,46.0084f,89.8438f, +171.875f,46.0374f,89.8438f, +175.781f,45.9301f,89.8438f, +179.688f,43.5326f,89.8438f, +183.594f,40.5203f,89.8438f, +187.5f,38.133f,89.8438f, +191.406f,35.8688f,89.8438f, +195.313f,33.0648f,89.8438f, +199.219f,31.0451f,89.8438f, +203.125f,27.691f,89.8438f, +207.031f,26.7927f,89.8438f, +210.938f,26.334f,89.8438f, +214.844f,25.0669f,89.8438f, +218.75f,23.4149f,89.8438f, +222.656f,20.9786f,89.8438f, +226.563f,18.963f,89.8438f, +230.469f,18.7894f,89.8438f, +234.375f,17.2683f,89.8438f, +238.281f,14.98f,89.8438f, +242.188f,15.4163f,89.8438f, +246.094f,15.4238f,89.8438f, +250.0f,15.9208f,89.8438f, +3.90625f,15.5916f,85.9375f, +7.8125f,16.3916f,85.9375f, +11.7188f,18.2047f,85.9375f, +15.625f,19.1861f,85.9375f, +19.5313f,20.7525f,85.9375f, +23.4375f,21.6364f,85.9375f, +27.3438f,21.9262f,85.9375f, +31.25f,21.6225f,85.9375f, +35.1563f,22.4806f,85.9375f, +39.0625f,23.7973f,85.9375f, +42.9688f,24.6135f,85.9375f, +46.875f,24.8421f,85.9375f, +50.7813f,24.5451f,85.9375f, +54.6875f,23.688f,85.9375f, +58.5938f,22.221f,85.9375f, +62.5f,21.5009f,85.9375f, +66.4063f,21.2241f,85.9375f, +70.3125f,20.2058f,85.9375f, +74.2188f,20.3437f,85.9375f, +78.125f,21.8786f,85.9375f, +82.0313f,21.9425f,85.9375f, +85.9375f,20.6496f,85.9375f, +89.8438f,20.6855f,85.9375f, +93.75f,20.6495f,85.9375f, +97.6563f,21.0738f,85.9375f, +101.563f,21.7991f,85.9375f, +105.469f,22.3795f,85.9375f, +109.375f,22.4292f,85.9375f, +113.281f,23.6451f,85.9375f, +117.188f,24.8457f,85.9375f, +121.094f,26.7121f,85.9375f, +125.0f,29.2236f,85.9375f, +128.906f,31.5942f,85.9375f, +132.813f,33.8517f,85.9375f, +136.719f,35.7145f,85.9375f, +140.625f,36.6808f,85.9375f, +144.531f,38.8926f,85.9375f, +148.438f,41.6484f,85.9375f, +152.344f,44.2035f,85.9375f, +156.25f,45.1997f,85.9375f, +160.156f,46.1921f,85.9375f, +164.063f,47.2097f,85.9375f, +167.969f,47.0691f,85.9375f, +171.875f,45.5257f,85.9375f, +175.781f,44.6746f,85.9375f, +179.688f,43.6223f,85.9375f, +183.594f,40.2395f,85.9375f, +187.5f,38.445f,85.9375f, +191.406f,36.5002f,85.9375f, +195.313f,33.7977f,85.9375f, +199.219f,31.5943f,85.9375f, +203.125f,28.8305f,85.9375f, +207.031f,27.4922f,85.9375f, +210.938f,26.0386f,85.9375f, +214.844f,24.1792f,85.9375f, +218.75f,22.1567f,85.9375f, +222.656f,20.1169f,85.9375f, +226.563f,19.3603f,85.9375f, +230.469f,17.7703f,85.9375f, +234.375f,16.3147f,85.9375f, +238.281f,15.0886f,85.9375f, +242.188f,15.1332f,85.9375f, +246.094f,14.7802f,85.9375f, +250.0f,15.2259f,85.9375f, +3.90625f,16.9644f,82.0313f, +7.8125f,17.8f,82.0313f, +11.7188f,19.2943f,82.0313f, +15.625f,21.0269f,82.0313f, +19.5313f,22.3312f,82.0313f, +23.4375f,23.0871f,82.0313f, +27.3438f,23.1115f,82.0313f, +31.25f,23.5304f,82.0313f, +35.1563f,24.1493f,82.0313f, +39.0625f,25.0848f,82.0313f, +42.9688f,26.0789f,82.0313f, +46.875f,26.3399f,82.0313f, +50.7813f,25.4397f,82.0313f, +54.6875f,24.894f,82.0313f, +58.5938f,24.1026f,82.0313f, +62.5f,24.0749f,82.0313f, +66.4063f,23.5256f,82.0313f, +70.3125f,21.9612f,82.0313f, +74.2188f,21.932f,82.0313f, +78.125f,22.6241f,82.0313f, +82.0313f,22.672f,82.0313f, +85.9375f,21.4303f,82.0313f, +89.8438f,21.6964f,82.0313f, +93.75f,21.7198f,82.0313f, +97.6563f,22.4953f,82.0313f, +101.563f,23.0451f,82.0313f, +105.469f,23.0285f,82.0313f, +109.375f,23.24f,82.0313f, +113.281f,23.6861f,82.0313f, +117.188f,24.7685f,82.0313f, +121.094f,26.4466f,82.0313f, +125.0f,28.8315f,82.0313f, +128.906f,30.9624f,82.0313f, +132.813f,33.7991f,82.0313f, +136.719f,35.8079f,82.0313f, +140.625f,37.0254f,82.0313f, +144.531f,38.7479f,82.0313f, +148.438f,42.0473f,82.0313f, +152.344f,43.7879f,82.0313f, +156.25f,45.1826f,82.0313f, +160.156f,46.2454f,82.0313f, +164.063f,47.0196f,82.0313f, +167.969f,47.2872f,82.0313f, +171.875f,46.2496f,82.0313f, +175.781f,44.3338f,82.0313f, +179.688f,43.1095f,82.0313f, +183.594f,40.7857f,82.0313f, +187.5f,39.646f,82.0313f, +191.406f,37.5425f,82.0313f, +195.313f,35.2951f,82.0313f, +199.219f,33.6324f,82.0313f, +203.125f,30.8911f,82.0313f, +207.031f,27.2798f,82.0313f, +210.938f,25.4308f,82.0313f, +214.844f,23.8814f,82.0313f, +218.75f,22.4441f,82.0313f, +222.656f,20.3771f,82.0313f, +226.563f,19.2073f,82.0313f, +230.469f,19.0082f,82.0313f, +234.375f,17.769f,82.0313f, +238.281f,15.8302f,82.0313f, +242.188f,14.2967f,82.0313f, +246.094f,15.1365f,82.0313f, +250.0f,14.9159f,82.0313f, +3.90625f,18.8244f,78.125f, +7.8125f,19.5283f,78.125f, +11.7188f,20.9466f,78.125f, +15.625f,22.0951f,78.125f, +19.5313f,23.2483f,78.125f, +23.4375f,23.8238f,78.125f, +27.3438f,24.6236f,78.125f, +31.25f,24.0856f,78.125f, +35.1563f,25.6129f,78.125f, +39.0625f,26.8525f,78.125f, +42.9688f,26.9859f,78.125f, +46.875f,26.6403f,78.125f, +50.7813f,26.6419f,78.125f, +54.6875f,27.4236f,78.125f, +58.5938f,26.5989f,78.125f, +62.5f,26.137f,78.125f, +66.4063f,24.8717f,78.125f, +70.3125f,23.8694f,78.125f, +74.2188f,23.2668f,78.125f, +78.125f,23.1081f,78.125f, +82.0313f,23.3134f,78.125f, +85.9375f,23.0903f,78.125f, +89.8438f,23.2822f,78.125f, +93.75f,24.291f,78.125f, +97.6563f,24.5546f,78.125f, +101.563f,24.4216f,78.125f, +105.469f,24.6379f,78.125f, +109.375f,24.5235f,78.125f, +113.281f,24.88f,78.125f, +117.188f,25.6988f,78.125f, +121.094f,26.9155f,78.125f, +125.0f,29.7499f,78.125f, +128.906f,31.361f,78.125f, +132.813f,33.9367f,78.125f, +136.719f,35.4066f,78.125f, +140.625f,36.6153f,78.125f, +144.531f,38.6091f,78.125f, +148.438f,41.2276f,78.125f, +152.344f,43.2187f,78.125f, +156.25f,45.2494f,78.125f, +160.156f,46.5334f,78.125f, +164.063f,47.1659f,78.125f, +167.969f,47.5409f,78.125f, +171.875f,46.3778f,78.125f, +175.781f,44.8935f,78.125f, +179.688f,43.7429f,78.125f, +183.594f,42.4748f,78.125f, +187.5f,40.5234f,78.125f, +191.406f,38.2806f,78.125f, +195.313f,36.297f,78.125f, +199.219f,35.0641f,78.125f, +203.125f,32.4145f,78.125f, +207.031f,29.4539f,78.125f, +210.938f,25.7399f,78.125f, +214.844f,23.157f,78.125f, +218.75f,20.9425f,78.125f, +222.656f,19.2349f,78.125f, +226.563f,18.5576f,78.125f, +230.469f,18.8407f,78.125f, +234.375f,17.6562f,78.125f, +238.281f,15.7207f,78.125f, +242.188f,14.3385f,78.125f, +246.094f,13.9958f,78.125f, +250.0f,14.6888f,78.125f, +3.90625f,20.6829f,74.2188f, +7.8125f,22.7393f,74.2188f, +11.7188f,22.9007f,74.2188f, +15.625f,23.3717f,74.2188f, +19.5313f,23.7991f,74.2188f, +23.4375f,24.5576f,74.2188f, +27.3438f,25.3464f,74.2188f, +31.25f,25.8349f,74.2188f, +35.1563f,26.2326f,74.2188f, +39.0625f,27.8003f,74.2188f, +42.9688f,28.502f,74.2188f, +46.875f,28.7947f,74.2188f, +50.7813f,29.109f,74.2188f, +54.6875f,29.4315f,74.2188f, +58.5938f,29.1948f,74.2188f, +62.5f,28.241f,74.2188f, +66.4063f,26.6727f,74.2188f, +70.3125f,25.5496f,74.2188f, +74.2188f,24.2265f,74.2188f, +78.125f,24.8641f,74.2188f, +82.0313f,24.8692f,74.2188f, +85.9375f,23.8066f,74.2188f, +89.8438f,24.5827f,74.2188f, +93.75f,25.5885f,74.2188f, +97.6563f,25.005f,74.2188f, +101.563f,25.4768f,74.2188f, +105.469f,25.8326f,74.2188f, +109.375f,25.8587f,74.2188f, +113.281f,26.8029f,74.2188f, +117.188f,27.8764f,74.2188f, +121.094f,28.8835f,74.2188f, +125.0f,30.0077f,74.2188f, +128.906f,31.9776f,74.2188f, +132.813f,34.2008f,74.2188f, +136.719f,35.4023f,74.2188f, +140.625f,36.3754f,74.2188f, +144.531f,38.9991f,74.2188f, +148.438f,41.295f,74.2188f, +152.344f,44.1131f,74.2188f, +156.25f,46.2221f,74.2188f, +160.156f,46.7797f,74.2188f, +164.063f,47.446f,74.2188f, +167.969f,47.1396f,74.2188f, +171.875f,45.9937f,74.2188f, +175.781f,45.4284f,74.2188f, +179.688f,45.018f,74.2188f, +183.594f,43.1233f,74.2188f, +187.5f,41.2272f,74.2188f, +191.406f,37.8072f,74.2188f, +195.313f,36.5304f,74.2188f, +199.219f,35.1638f,74.2188f, +203.125f,33.1538f,74.2188f, +207.031f,30.2207f,74.2188f, +210.938f,26.1665f,74.2188f, +214.844f,22.1619f,74.2188f, +218.75f,18.452f,74.2188f, +222.656f,17.0925f,74.2188f, +226.563f,17.3468f,74.2188f, +230.469f,16.447f,74.2188f, +234.375f,15.7197f,74.2188f, +238.281f,14.7889f,74.2188f, +242.188f,13.641f,74.2188f, +246.094f,12.7728f,74.2188f, +250.0f,13.3875f,74.2188f, +3.90625f,22.948f,70.3125f, +7.8125f,24.3431f,70.3125f, +11.7188f,24.6307f,70.3125f, +15.625f,24.9963f,70.3125f, +19.5313f,25.2034f,70.3125f, +23.4375f,25.2791f,70.3125f, +27.3438f,25.8257f,70.3125f, +31.25f,27.1123f,70.3125f, +35.1563f,27.8795f,70.3125f, +39.0625f,28.8437f,70.3125f, +42.9688f,29.8883f,70.3125f, +46.875f,30.6548f,70.3125f, +50.7813f,31.0396f,70.3125f, +54.6875f,31.6324f,70.3125f, +58.5938f,31.5222f,70.3125f, +62.5f,30.4696f,70.3125f, +66.4063f,28.7208f,70.3125f, +70.3125f,26.8611f,70.3125f, +74.2188f,25.6776f,70.3125f, +78.125f,26.1193f,70.3125f, +82.0313f,25.1971f,70.3125f, +85.9375f,24.4814f,70.3125f, +89.8438f,25.1213f,70.3125f, +93.75f,26.1411f,70.3125f, +97.6563f,26.4276f,70.3125f, +101.563f,26.0728f,70.3125f, +105.469f,26.113f,70.3125f, +109.375f,27.5702f,70.3125f, +113.281f,28.6199f,70.3125f, +117.188f,30.054f,70.3125f, +121.094f,30.255f,70.3125f, +125.0f,30.9839f,70.3125f, +128.906f,32.4045f,70.3125f, +132.813f,33.9858f,70.3125f, +136.719f,35.8568f,70.3125f, +140.625f,37.5803f,70.3125f, +144.531f,40.2984f,70.3125f, +148.438f,41.9326f,70.3125f, +152.344f,44.1607f,70.3125f, +156.25f,45.6454f,70.3125f, +160.156f,47.3567f,70.3125f, +164.063f,48.1147f,70.3125f, +167.969f,47.7671f,70.3125f, +171.875f,46.1009f,70.3125f, +175.781f,45.3829f,70.3125f, +179.688f,44.3458f,70.3125f, +183.594f,42.818f,70.3125f, +187.5f,40.5253f,70.3125f, +191.406f,37.6731f,70.3125f, +195.313f,36.7234f,70.3125f, +199.219f,35.0848f,70.3125f, +203.125f,33.0857f,70.3125f, +207.031f,30.0508f,70.3125f, +210.938f,26.741f,70.3125f, +214.844f,22.7613f,70.3125f, +218.75f,18.5375f,70.3125f, +222.656f,15.6052f,70.3125f, +226.563f,14.6945f,70.3125f, +230.469f,15.0013f,70.3125f, +234.375f,13.9965f,70.3125f, +238.281f,12.4404f,70.3125f, +242.188f,12.4448f,70.3125f, +246.094f,11.7446f,70.3125f, +250.0f,11.7886f,70.3125f, +3.90625f,25.5564f,66.4063f, +7.8125f,26.1216f,66.4063f, +11.7188f,26.234f,66.4063f, +15.625f,26.4553f,66.4063f, +19.5313f,26.9827f,66.4063f, +23.4375f,27.0173f,66.4063f, +27.3438f,27.3577f,66.4063f, +31.25f,28.895f,66.4063f, +35.1563f,30.1057f,66.4063f, +39.0625f,30.249f,66.4063f, +42.9688f,31.1394f,66.4063f, +46.875f,31.7197f,66.4063f, +50.7813f,33.2905f,66.4063f, +54.6875f,33.6208f,66.4063f, +58.5938f,33.5152f,66.4063f, +62.5f,31.5128f,66.4063f, +66.4063f,30.1049f,66.4063f, +70.3125f,28.9139f,66.4063f, +74.2188f,27.093f,66.4063f, +78.125f,26.8272f,66.4063f, +82.0313f,25.8777f,66.4063f, +85.9375f,25.2597f,66.4063f, +89.8438f,25.8742f,66.4063f, +93.75f,27.4783f,66.4063f, +97.6563f,27.1897f,66.4063f, +101.563f,26.8406f,66.4063f, +105.469f,27.2889f,66.4063f, +109.375f,28.6616f,66.4063f, +113.281f,29.2852f,66.4063f, +117.188f,30.3362f,66.4063f, +121.094f,32.0648f,66.4063f, +125.0f,32.6693f,66.4063f, +128.906f,33.7239f,66.4063f, +132.813f,34.8193f,66.4063f, +136.719f,36.6878f,66.4063f, +140.625f,38.5422f,66.4063f, +144.531f,40.5193f,66.4063f, +148.438f,42.0434f,66.4063f, +152.344f,43.692f,66.4063f, +156.25f,46.2f,66.4063f, +160.156f,47.7247f,66.4063f, +164.063f,48.3486f,66.4063f, +167.969f,48.4057f,66.4063f, +171.875f,47.4141f,66.4063f, +175.781f,45.925f,66.4063f, +179.688f,44.0772f,66.4063f, +183.594f,42.0866f,66.4063f, +187.5f,40.2687f,66.4063f, +191.406f,38.0236f,66.4063f, +195.313f,36.9223f,66.4063f, +199.219f,35.6323f,66.4063f, +203.125f,33.0001f,66.4063f, +207.031f,30.1425f,66.4063f, +210.938f,26.4551f,66.4063f, +214.844f,22.4224f,66.4063f, +218.75f,18.5557f,66.4063f, +222.656f,16.1428f,66.4063f, +226.563f,14.9942f,66.4063f, +230.469f,14.9221f,66.4063f, +234.375f,13.3816f,66.4063f, +238.281f,10.9914f,66.4063f, +242.188f,10.6094f,66.4063f, +246.094f,9.77905f,66.4063f, +250.0f,9.99853f,66.4063f, +3.90625f,27.1929f,62.5f, +7.8125f,28.1411f,62.5f, +11.7188f,27.9312f,62.5f, +15.625f,27.692f,62.5f, +19.5313f,27.8511f,62.5f, +23.4375f,28.2162f,62.5f, +27.3438f,29.5518f,62.5f, +31.25f,30.2367f,62.5f, +35.1563f,31.1075f,62.5f, +39.0625f,31.6239f,62.5f, +42.9688f,32.8498f,62.5f, +46.875f,33.1521f,62.5f, +50.7813f,34.6411f,62.5f, +54.6875f,35.0063f,62.5f, +58.5938f,33.8006f,62.5f, +62.5f,33.1029f,62.5f, +66.4063f,32.1466f,62.5f, +70.3125f,30.2614f,62.5f, +74.2188f,28.2978f,62.5f, +78.125f,28.0764f,62.5f, +82.0313f,27.2473f,62.5f, +85.9375f,26.2769f,62.5f, +89.8438f,26.2922f,62.5f, +93.75f,27.1235f,62.5f, +97.6563f,27.498f,62.5f, +101.563f,27.2257f,62.5f, +105.469f,28.2897f,62.5f, +109.375f,28.8921f,62.5f, +113.281f,30.563f,62.5f, +117.188f,32.1298f,62.5f, +121.094f,32.8639f,62.5f, +125.0f,34.6537f,62.5f, +128.906f,35.4867f,62.5f, +132.813f,36.6181f,62.5f, +136.719f,37.6418f,62.5f, +140.625f,39.2228f,62.5f, +144.531f,40.5105f,62.5f, +148.438f,42.215f,62.5f, +152.344f,43.5394f,62.5f, +156.25f,45.1171f,62.5f, +160.156f,46.6711f,62.5f, +164.063f,47.4274f,62.5f, +167.969f,47.6821f,62.5f, +171.875f,48.0762f,62.5f, +175.781f,46.4607f,62.5f, +179.688f,44.7623f,62.5f, +183.594f,42.6372f,62.5f, +187.5f,40.3231f,62.5f, +191.406f,38.4371f,62.5f, +195.313f,36.1978f,62.5f, +199.219f,35.38f,62.5f, +203.125f,32.0325f,62.5f, +207.031f,29.2047f,62.5f, +210.938f,27.481f,62.5f, +214.844f,24.0627f,62.5f, +218.75f,20.6235f,62.5f, +222.656f,18.5468f,62.5f, +226.563f,17.2736f,62.5f, +230.469f,15.4125f,62.5f, +234.375f,13.6775f,62.5f, +238.281f,11.4407f,62.5f, +242.188f,9.73154f,62.5f, +246.094f,8.55197f,62.5f, +250.0f,8.43693f,62.5f, +3.90625f,28.3495f,58.5938f, +7.8125f,28.8832f,58.5938f, +11.7188f,28.5512f,58.5938f, +15.625f,28.8533f,58.5938f, +19.5313f,29.0576f,58.5938f, +23.4375f,30.3079f,58.5938f, +27.3438f,31.3861f,58.5938f, +31.25f,33.0252f,58.5938f, +35.1563f,33.4087f,58.5938f, +39.0625f,34.3736f,58.5938f, +42.9688f,34.6944f,58.5938f, +46.875f,34.1156f,58.5938f, +50.7813f,34.7246f,58.5938f, +54.6875f,35.3934f,58.5938f, +58.5938f,34.9508f,58.5938f, +62.5f,34.469f,58.5938f, +66.4063f,33.1584f,58.5938f, +70.3125f,30.5913f,58.5938f, +74.2188f,30.4147f,58.5938f, +78.125f,30.821f,58.5938f, +82.0313f,29.9244f,58.5938f, +85.9375f,28.365f,58.5938f, +89.8438f,27.8694f,58.5938f, +93.75f,27.7517f,58.5938f, +97.6563f,27.9188f,58.5938f, +101.563f,27.7605f,58.5938f, +105.469f,28.252f,58.5938f, +109.375f,29.4592f,58.5938f, +113.281f,31.2608f,58.5938f, +117.188f,33.5373f,58.5938f, +121.094f,34.4995f,58.5938f, +125.0f,35.1593f,58.5938f, +128.906f,36.6148f,58.5938f, +132.813f,37.1425f,58.5938f, +136.719f,38.2148f,58.5938f, +140.625f,38.9964f,58.5938f, +144.531f,40.3196f,58.5938f, +148.438f,42.4959f,58.5938f, +152.344f,43.37f,58.5938f, +156.25f,44.3488f,58.5938f, +160.156f,45.6441f,58.5937f, +164.063f,45.6597f,58.5937f, +167.969f,46.9631f,58.5938f, +171.875f,47.0933f,58.5938f, +175.781f,45.839f,58.5937f, +179.688f,44.0491f,58.5937f, +183.594f,41.6462f,58.5938f, +187.5f,39.9012f,58.5938f, +191.406f,37.8373f,58.5938f, +195.313f,35.0871f,58.5938f, +199.219f,34.6045f,58.5938f, +203.125f,32.4469f,58.5938f, +207.031f,30.5103f,58.5938f, +210.938f,28.7194f,58.5938f, +214.844f,26.3358f,58.5938f, +218.75f,24.3668f,58.5938f, +222.656f,22.1719f,58.5938f, +226.563f,20.1708f,58.5938f, +230.469f,18.1384f,58.5938f, +234.375f,15.6994f,58.5938f, +238.281f,12.6124f,58.5938f, +242.188f,11.2279f,58.5938f, +246.094f,10.4938f,58.5938f, +250.0f,9.45058f,58.5938f, +3.90625f,29.2057f,54.6875f, +7.8125f,29.4161f,54.6875f, +11.7188f,29.6274f,54.6875f, +15.625f,29.8747f,54.6875f, +19.5313f,31.3353f,54.6875f, +23.4375f,32.5261f,54.6875f, +27.3438f,34.3893f,54.6875f, +31.25f,34.9525f,54.6875f, +35.1563f,35.8992f,54.6875f, +39.0625f,36.2066f,54.6875f, +42.9688f,36.4212f,54.6875f, +46.875f,36.1377f,54.6875f, +50.7813f,35.4213f,54.6875f, +54.6875f,35.5045f,54.6875f, +58.5938f,36.0891f,54.6875f, +62.5f,36.0244f,54.6875f, +66.4063f,34.9086f,54.6875f, +70.3125f,32.8671f,54.6875f, +74.2188f,33.5578f,54.6875f, +78.125f,33.8468f,54.6875f, +82.0313f,32.868f,54.6875f, +85.9375f,31.2245f,54.6875f, +89.8438f,29.442f,54.6875f, +93.75f,28.9144f,54.6875f, +97.6563f,27.6797f,54.6875f, +101.563f,27.9585f,54.6875f, +105.469f,28.5492f,54.6875f, +109.375f,29.119f,54.6875f, +113.281f,30.7234f,54.6875f, +117.188f,32.402f,54.6875f, +121.094f,34.3605f,54.6875f, +125.0f,35.6614f,54.6875f, +128.906f,37.1814f,54.6875f, +132.813f,37.8509f,54.6875f, +136.719f,38.3282f,54.6875f, +140.625f,39.021f,54.6875f, +144.531f,39.8455f,54.6875f, +148.438f,41.3547f,54.6875f, +152.344f,42.0848f,54.6875f, +156.25f,42.4546f,54.6875f, +160.156f,43.3035f,54.6875f, +164.063f,44.2757f,54.6875f, +167.969f,45.0917f,54.6875f, +171.875f,44.9479f,54.6875f, +175.781f,44.386f,54.6875f, +179.688f,43.1031f,54.6875f, +183.594f,41.5243f,54.6875f, +187.5f,39.9976f,54.6875f, +191.406f,37.1931f,54.6875f, +195.313f,35.2297f,54.6875f, +199.219f,34.439f,54.6875f, +203.125f,32.7399f,54.6875f, +207.031f,31.4766f,54.6875f, +210.938f,29.9402f,54.6875f, +214.844f,28.6752f,54.6875f, +218.75f,27.0387f,54.6875f, +222.656f,24.4777f,54.6875f, +226.563f,21.7169f,54.6875f, +230.469f,20.0299f,54.6875f, +234.375f,17.3103f,54.6875f, +238.281f,14.1891f,54.6875f, +242.188f,12.1605f,54.6875f, +246.094f,10.9065f,54.6875f, +250.0f,10.6619f,54.6875f, +3.90625f,30.4306f,50.7813f, +7.8125f,30.9679f,50.7813f, +11.7188f,31.3065f,50.7813f, +15.625f,32.0527f,50.7813f, +19.5313f,33.9185f,50.7813f, +23.4375f,34.6834f,50.7813f, +27.3438f,35.8025f,50.7813f, +31.25f,36.824f,50.7813f, +35.1563f,37.9949f,50.7813f, +39.0625f,38.2428f,50.7813f, +42.9688f,37.3912f,50.7813f, +46.875f,37.2849f,50.7813f, +50.7813f,36.4441f,50.7813f, +54.6875f,36.5986f,50.7813f, +58.5938f,36.7371f,50.7813f, +62.5f,36.6154f,50.7813f, +66.4063f,35.9475f,50.7813f, +70.3125f,35.1832f,50.7813f, +74.2188f,35.7876f,50.7813f, +78.125f,35.9086f,50.7813f, +82.0313f,35.0048f,50.7813f, +85.9375f,33.7202f,50.7813f, +89.8438f,32.6473f,50.7813f, +93.75f,30.9552f,50.7813f, +97.6563f,28.7453f,50.7813f, +101.563f,29.1526f,50.7813f, +105.469f,29.9957f,50.7813f, +109.375f,30.5544f,50.7813f, +113.281f,31.6947f,50.7813f, +117.188f,32.7584f,50.7813f, +121.094f,34.2518f,50.7813f, +125.0f,36.3694f,50.7813f, +128.906f,36.9477f,50.7813f, +132.813f,37.2918f,50.7813f, +136.719f,37.8325f,50.7813f, +140.625f,38.0845f,50.7813f, +144.531f,40.0088f,50.7813f, +148.438f,40.8219f,50.7813f, +152.344f,42.4039f,50.7813f, +156.25f,42.6086f,50.7813f, +160.156f,43.5487f,50.7813f, +164.063f,43.5328f,50.7813f, +167.969f,44.212f,50.7812f, +171.875f,43.6744f,50.7813f, +175.781f,43.198f,50.7813f, +179.688f,42.957f,50.7813f, +183.594f,41.4993f,50.7813f, +187.5f,39.5101f,50.7813f, +191.406f,38.1729f,50.7813f, +195.313f,35.4881f,50.7813f, +199.219f,34.6384f,50.7813f, +203.125f,34.1873f,50.7813f, +207.031f,32.1155f,50.7813f, +210.938f,30.912f,50.7813f, +214.844f,30.3391f,50.7813f, +218.75f,28.1256f,50.7813f, +222.656f,24.902f,50.7813f, +226.563f,22.2443f,50.7813f, +230.469f,20.9172f,50.7813f, +234.375f,18.8508f,50.7813f, +238.281f,15.9912f,50.7813f, +242.188f,12.7716f,50.7813f, +246.094f,11.6189f,50.7813f, +250.0f,12.2688f,50.7813f, +3.90625f,30.8772f,46.875f, +7.8125f,32.4754f,46.875f, +11.7188f,33.6983f,46.875f, +15.625f,35.14f,46.875f, +19.5313f,37.0369f,46.875f, +23.4375f,38.369f,46.875f, +27.3438f,38.6134f,46.875f, +31.25f,38.9784f,46.875f, +35.1563f,39.9891f,46.875f, +39.0625f,40.3197f,46.875f, +42.9688f,39.9692f,46.875f, +46.875f,39.6994f,46.875f, +50.7813f,39.4183f,46.875f, +54.6875f,38.2948f,46.875f, +58.5938f,38.32f,46.875f, +62.5f,38.621f,46.875f, +66.4063f,38.2134f,46.875f, +70.3125f,36.9577f,46.875f, +74.2188f,37.2936f,46.875f, +78.125f,37.8653f,46.875f, +82.0313f,36.9058f,46.875f, +85.9375f,36.1841f,46.875f, +89.8438f,34.8143f,46.875f, +93.75f,33.0783f,46.875f, +97.6563f,30.9854f,46.875f, +101.563f,30.934f,46.875f, +105.469f,32.108f,46.875f, +109.375f,33.0462f,46.875f, +113.281f,32.9253f,46.875f, +117.188f,33.3377f,46.875f, +121.094f,34.2153f,46.875f, +125.0f,35.0739f,46.875f, +128.906f,36.8239f,46.875f, +132.813f,37.1463f,46.875f, +136.719f,37.5409f,46.875f, +140.625f,38.8265f,46.875f, +144.531f,40.7241f,46.875f, +148.438f,40.9349f,46.875f, +152.344f,42.4491f,46.875f, +156.25f,43.9695f,46.875f, +160.156f,44.2191f,46.875f, +164.063f,44.9265f,46.875f, +167.969f,43.9423f,46.875f, +171.875f,43.273f,46.875f, +175.781f,43.2543f,46.875f, +179.688f,42.5328f,46.875f, +183.594f,41.1777f,46.875f, +187.5f,39.3553f,46.875f, +191.406f,37.8242f,46.875f, +195.313f,36.4649f,46.875f, +199.219f,35.6955f,46.875f, +203.125f,35.1878f,46.875f, +207.031f,32.9438f,46.875f, +210.938f,31.3677f,46.875f, +214.844f,30.7282f,46.875f, +218.75f,28.3328f,46.875f, +222.656f,25.0599f,46.875f, +226.563f,24.1932f,46.875f, +230.469f,22.3853f,46.875f, +234.375f,19.4896f,46.875f, +238.281f,16.8753f,46.875f, +242.188f,13.9469f,46.875f, +246.094f,13.2975f,46.875f, +250.0f,13.2524f,46.875f, +3.90625f,31.8945f,42.9688f, +7.8125f,34.0117f,42.9688f, +11.7188f,36.2441f,42.9688f, +15.625f,37.3622f,42.9688f, +19.5313f,39.5877f,42.9688f, +23.4375f,41.0994f,42.9688f, +27.3438f,42.0864f,42.9688f, +31.25f,42.0849f,42.9688f, +35.1563f,42.2038f,42.9688f, +39.0625f,43.473f,42.9688f, +42.9688f,42.7754f,42.9688f, +46.875f,42.3177f,42.9688f, +50.7813f,42.209f,42.9688f, +54.6875f,41.3095f,42.9688f, +58.5938f,40.8629f,42.9688f, +62.5f,40.4776f,42.9688f, +66.4063f,40.1396f,42.9688f, +70.3125f,39.1169f,42.9688f, +74.2188f,39.1382f,42.9688f, +78.125f,39.1421f,42.9688f, +82.0313f,38.9022f,42.9688f, +85.9375f,37.5711f,42.9688f, +89.8438f,36.7924f,42.9688f, +93.75f,34.7734f,42.9688f, +97.6563f,33.167f,42.9688f, +101.563f,32.4173f,42.9688f, +105.469f,33.0466f,42.9688f, +109.375f,33.3882f,42.9688f, +113.281f,33.7538f,42.9688f, +117.188f,33.5661f,42.9688f, +121.094f,33.9051f,42.9688f, +125.0f,34.9181f,42.9688f, +128.906f,35.2925f,42.9688f, +132.813f,37.1741f,42.9688f, +136.719f,38.0993f,42.9688f, +140.625f,38.7621f,42.9688f, +144.531f,39.712f,42.9688f, +148.438f,40.7257f,42.9688f, +152.344f,42.2465f,42.9688f, +156.25f,43.5331f,42.9688f, +160.156f,44.6745f,42.9687f, +164.063f,44.564f,42.9688f, +167.969f,44.6075f,42.9688f, +171.875f,43.2227f,42.9688f, +175.781f,42.5688f,42.9688f, +179.688f,41.9742f,42.9688f, +183.594f,40.3484f,42.9688f, +187.5f,38.9109f,42.9688f, +191.406f,37.7273f,42.9688f, +195.313f,36.5287f,42.9688f, +199.219f,35.9361f,42.9688f, +203.125f,35.1638f,42.9688f, +207.031f,33.6615f,42.9688f, +210.938f,31.2785f,42.9688f, +214.844f,30.1259f,42.9688f, +218.75f,28.6143f,42.9688f, +222.656f,26.1162f,42.9688f, +226.563f,24.2882f,42.9688f, +230.469f,22.5195f,42.9688f, +234.375f,20.1462f,42.9688f, +238.281f,17.4811f,42.9688f, +242.188f,15.2736f,42.9688f, +246.094f,13.788f,42.9688f, +250.0f,13.1723f,42.9688f, +3.90625f,34.9171f,39.0625f, +7.8125f,36.7711f,39.0625f, +11.7188f,38.5677f,39.0625f, +15.625f,40.0524f,39.0625f, +19.5313f,42.2392f,39.0625f, +23.4375f,43.2332f,39.0625f, +27.3438f,44.8254f,39.0625f, +31.25f,45.1808f,39.0625f, +35.1563f,44.9684f,39.0625f, +39.0625f,45.0647f,39.0625f, +42.9688f,45.0888f,39.0625f, +46.875f,45.5266f,39.0625f, +50.7813f,45.2542f,39.0625f, +54.6875f,44.1797f,39.0625f, +58.5938f,43.2658f,39.0625f, +62.5f,42.7568f,39.0625f, +66.4063f,42.4159f,39.0625f, +70.3125f,41.3883f,39.0625f, +74.2188f,41.1975f,39.0625f, +78.125f,41.3073f,39.0625f, +82.0313f,41.0587f,39.0625f, +85.9375f,40.0611f,39.0625f, +89.8438f,38.7299f,39.0625f, +93.75f,37.2923f,39.0625f, +97.6563f,35.7971f,39.0625f, +101.563f,35.1982f,39.0625f, +105.469f,33.6408f,39.0625f, +109.375f,33.2619f,39.0625f, +113.281f,33.8387f,39.0625f, +117.188f,34.7554f,39.0625f, +121.094f,33.8569f,39.0625f, +125.0f,34.7741f,39.0625f, +128.906f,35.7319f,39.0625f, +132.813f,36.6023f,39.0625f, +136.719f,37.7084f,39.0625f, +140.625f,38.2513f,39.0625f, +144.531f,39.1992f,39.0625f, +148.438f,40.2336f,39.0625f, +152.344f,41.0883f,39.0625f, +156.25f,42.4004f,39.0625f, +160.156f,42.8753f,39.0625f, +164.063f,43.1631f,39.0625f, +167.969f,43.6378f,39.0625f, +171.875f,43.2113f,39.0625f, +175.781f,42.5474f,39.0625f, +179.688f,41.3413f,39.0625f, +183.594f,39.4383f,39.0625f, +187.5f,38.9723f,39.0625f, +191.406f,37.3549f,39.0625f, +195.313f,35.8615f,39.0625f, +199.219f,34.9243f,39.0625f, +203.125f,34.598f,39.0625f, +207.031f,33.6592f,39.0625f, +210.938f,32.2347f,39.0625f, +214.844f,30.4117f,39.0625f, +218.75f,28.4787f,39.0625f, +222.656f,26.6538f,39.0625f, +226.563f,24.4892f,39.0625f, +230.469f,22.9637f,39.0625f, +234.375f,20.6363f,39.0625f, +238.281f,18.4584f,39.0625f, +242.188f,16.293f,39.0625f, +246.094f,13.7473f,39.0625f, +250.0f,13.2449f,39.0625f, +3.90625f,38.5427f,35.1563f, +7.8125f,39.2771f,35.1563f, +11.7188f,40.4801f,35.1563f, +15.625f,42.2714f,35.1563f, +19.5313f,44.0743f,35.1562f, +23.4375f,45.9071f,35.1562f, +27.3438f,47.4425f,35.1563f, +31.25f,47.765f,35.1563f, +35.1563f,46.8453f,35.1562f, +39.0625f,47.1161f,35.1562f, +42.9688f,46.591f,35.1563f, +46.875f,47.4064f,35.1563f, +50.7813f,47.2001f,35.1562f, +54.6875f,47.2372f,35.1562f, +58.5938f,46.9666f,35.1563f, +62.5f,45.3322f,35.1563f, +66.4063f,44.4351f,35.1562f, +70.3125f,43.869f,35.1562f, +74.2188f,43.7604f,35.1563f, +78.125f,43.6414f,35.1563f, +82.0313f,43.6044f,35.1563f, +85.9375f,41.9765f,35.1563f, +89.8438f,40.597f,35.1563f, +93.75f,38.8088f,35.1563f, +97.6563f,37.4254f,35.1563f, +101.563f,36.4869f,35.1563f, +105.469f,34.7975f,35.1563f, +109.375f,32.6051f,35.1563f, +113.281f,32.3929f,35.1563f, +117.188f,33.3906f,35.1563f, +121.094f,33.728f,35.1563f, +125.0f,33.8089f,35.1563f, +128.906f,35.2443f,35.1563f, +132.813f,35.9877f,35.1563f, +136.719f,36.3747f,35.1563f, +140.625f,37.6045f,35.1563f, +144.531f,38.3698f,35.1563f, +148.438f,39.393f,35.1563f, +152.344f,40.0115f,35.1563f, +156.25f,40.8722f,35.1563f, +160.156f,40.7302f,35.1563f, +164.063f,41.6767f,35.1563f, +167.969f,42.1719f,35.1563f, +171.875f,41.924f,35.1563f, +175.781f,40.9628f,35.1563f, +179.688f,39.3209f,35.1563f, +183.594f,37.9615f,35.1563f, +187.5f,37.2902f,35.1563f, +191.406f,36.1521f,35.1563f, +195.313f,35.5697f,35.1563f, +199.219f,35.0547f,35.1563f, +203.125f,33.8422f,35.1563f, +207.031f,33.1699f,35.1563f, +210.938f,32.4197f,35.1563f, +214.844f,31.0723f,35.1563f, +218.75f,29.1069f,35.1563f, +222.656f,26.4015f,35.1563f, +226.563f,23.6862f,35.1563f, +230.469f,22.3142f,35.1563f, +234.375f,20.9225f,35.1563f, +238.281f,18.6533f,35.1563f, +242.188f,16.5438f,35.1563f, +246.094f,14.5457f,35.1563f, +250.0f,13.5112f,35.1563f, +3.90625f,41.4381f,31.25f, +7.8125f,41.4661f,31.25f, +11.7188f,42.5211f,31.25f, +15.625f,44.1517f,31.25f, +19.5313f,45.8301f,31.25f, +23.4375f,47.3213f,31.25f, +27.3438f,49.1504f,31.25f, +31.25f,49.1313f,31.25f, +35.1563f,48.4621f,31.25f, +39.0625f,48.0866f,31.25f, +42.9688f,47.5259f,31.25f, +46.875f,48.2042f,31.25f, +50.7813f,48.2678f,31.25f, +54.6875f,48.6796f,31.25f, +58.5938f,49.1508f,31.25f, +62.5f,48.5261f,31.25f, +66.4063f,47.2699f,31.25f, +70.3125f,46.3239f,31.25f, +74.2188f,45.9053f,31.25f, +78.125f,45.2948f,31.25f, +82.0313f,45.1222f,31.25f, +85.9375f,44.1773f,31.25f, +89.8438f,42.0751f,31.25f, +93.75f,39.8181f,31.25f, +97.6563f,38.1904f,31.25f, +101.563f,36.9029f,31.25f, +105.469f,35.9897f,31.25f, +109.375f,34.1082f,31.25f, +113.281f,33.9882f,31.25f, +117.188f,33.4544f,31.25f, +121.094f,32.7435f,31.25f, +125.0f,32.2982f,31.25f, +128.906f,33.2893f,31.25f, +132.813f,34.4302f,31.25f, +136.719f,35.501f,31.25f, +140.625f,36.4162f,31.25f, +144.531f,38.0795f,31.25f, +148.438f,38.4184f,31.25f, +152.344f,38.1695f,31.25f, +156.25f,39.1334f,31.25f, +160.156f,39.8018f,31.25f, +164.063f,40.4009f,31.25f, +167.969f,40.6662f,31.25f, +171.875f,40.6389f,31.25f, +175.781f,40.0005f,31.25f, +179.688f,38.1437f,31.25f, +183.594f,36.1677f,31.25f, +187.5f,35.7553f,31.25f, +191.406f,35.2539f,31.25f, +195.313f,34.5258f,31.25f, +199.219f,33.9511f,31.25f, +203.125f,33.8209f,31.25f, +207.031f,32.5194f,31.25f, +210.938f,31.6797f,31.25f, +214.844f,30.494f,31.25f, +218.75f,28.9089f,31.25f, +222.656f,27.096f,31.25f, +226.563f,23.5752f,31.25f, +230.469f,22.5423f,31.25f, +234.375f,20.8438f,31.25f, +238.281f,18.7938f,31.25f, +242.188f,16.7022f,31.25f, +246.094f,14.6115f,31.25f, +250.0f,12.7758f,31.25f, +3.90625f,42.7334f,27.3437f, +7.8125f,43.3658f,27.3438f, +11.7188f,44.93f,27.3437f, +15.625f,46.7113f,27.3438f, +19.5313f,48.1031f,27.3437f, +23.4375f,48.7173f,27.3438f, +27.3438f,49.0875f,27.3437f, +31.25f,50.1272f,27.3438f, +35.1563f,49.1784f,27.3437f, +39.0625f,50.4569f,27.3438f, +42.9688f,49.7216f,27.3437f, +46.875f,49.0563f,27.3438f, +50.7813f,48.7494f,27.3437f, +54.6875f,49.0519f,27.3438f, +58.5938f,49.8264f,27.3437f, +62.5f,49.8194f,27.3438f, +66.4063f,48.9033f,27.3437f, +70.3125f,47.5002f,27.3438f, +74.2188f,46.7308f,27.3437f, +78.125f,45.8132f,27.3438f, +82.0313f,45.4303f,27.3437f, +85.9375f,44.4837f,27.3438f, +89.8438f,42.6706f,27.3437f, +93.75f,40.5108f,27.3438f, +97.6563f,38.4748f,27.3437f, +101.563f,38.2458f,27.3438f, +105.469f,37.8191f,27.3437f, +109.375f,37.5503f,27.3438f, +113.281f,36.4883f,27.3437f, +117.188f,35.7025f,27.3438f, +121.094f,34.3569f,27.3437f, +125.0f,34.052f,27.3438f, +128.906f,34.3166f,27.3437f, +132.813f,33.9873f,27.3438f, +136.719f,33.8326f,27.3437f, +140.625f,35.5138f,27.3438f, +144.531f,35.9847f,27.3437f, +148.438f,36.3159f,27.3438f, +152.344f,38.1026f,27.3437f, +156.25f,39.0191f,27.3438f, +160.156f,39.0705f,27.3437f, +164.063f,38.9644f,27.3438f, +167.969f,38.0972f,27.3437f, +171.875f,38.277f,27.3438f, +175.781f,37.5686f,27.3437f, +179.688f,35.9897f,27.3438f, +183.594f,34.1554f,27.3437f, +187.5f,33.9646f,27.3438f, +191.406f,33.9556f,27.3437f, +195.313f,33.7374f,27.3438f, +199.219f,33.3736f,27.3437f, +203.125f,32.1967f,27.3438f, +207.031f,32.2131f,27.3437f, +210.938f,30.4757f,27.3438f, +214.844f,29.0495f,27.3437f, +218.75f,27.539f,27.3438f, +222.656f,25.7435f,27.3437f, +226.563f,23.5358f,27.3438f, +230.469f,22.5305f,27.3437f, +234.375f,20.3466f,27.3438f, +238.281f,18.5956f,27.3438f, +242.188f,16.6554f,27.3438f, +246.094f,14.7633f,27.3438f, +250.0f,12.979f,27.3438f, +3.90625f,44.6783f,23.4375f, +7.8125f,46.1279f,23.4375f, +11.7188f,47.9921f,23.4375f, +15.625f,48.593f,23.4375f, +19.5313f,49.826f,23.4375f, +23.4375f,50.0111f,23.4375f, +27.3438f,49.773f,23.4375f, +31.25f,50.6443f,23.4375f, +35.1563f,50.242f,23.4375f, +39.0625f,51.5289f,23.4375f, +42.9688f,51.3905f,23.4375f, +46.875f,50.5543f,23.4375f, +50.7813f,49.96f,23.4375f, +54.6875f,51.029f,23.4375f, +58.5938f,50.4996f,23.4375f, +62.5f,50.0508f,23.4375f, +66.4063f,49.4463f,23.4375f, +70.3125f,48.7613f,23.4375f, +74.2188f,48.0188f,23.4375f, +78.125f,48.0992f,23.4375f, +82.0313f,47.1947f,23.4375f, +85.9375f,45.1889f,23.4375f, +89.8438f,43.9247f,23.4375f, +93.75f,41.7965f,23.4375f, +97.6563f,40.363f,23.4375f, +101.563f,40.3201f,23.4375f, +105.469f,39.2422f,23.4375f, +109.375f,38.6318f,23.4375f, +113.281f,37.9263f,23.4375f, +117.188f,37.113f,23.4375f, +121.094f,35.4884f,23.4375f, +125.0f,35.8385f,23.4375f, +128.906f,35.4941f,23.4375f, +132.813f,34.1911f,23.4375f, +136.719f,33.6791f,23.4375f, +140.625f,33.4506f,23.4375f, +144.531f,35.4822f,23.4375f, +148.438f,36.0187f,23.4375f, +152.344f,38.231f,23.4375f, +156.25f,39.1197f,23.4375f, +160.156f,38.9095f,23.4375f, +164.063f,38.1737f,23.4375f, +167.969f,36.7498f,23.4375f, +171.875f,36.6113f,23.4375f, +175.781f,35.5895f,23.4375f, +179.688f,34.7415f,23.4375f, +183.594f,32.6574f,23.4375f, +187.5f,32.5837f,23.4375f, +191.406f,32.5272f,23.4375f, +195.313f,32.3611f,23.4375f, +199.219f,31.4784f,23.4375f, +203.125f,30.8078f,23.4375f, +207.031f,29.9524f,23.4375f, +210.938f,29.9998f,23.4375f, +214.844f,28.4828f,23.4375f, +218.75f,26.6709f,23.4375f, +222.656f,24.9874f,23.4375f, +226.563f,23.0213f,23.4375f, +230.469f,21.3587f,23.4375f, +234.375f,19.0527f,23.4375f, +238.281f,18.1056f,23.4375f, +242.188f,16.7916f,23.4375f, +246.094f,14.9561f,23.4375f, +250.0f,13.0063f,23.4375f, +3.90625f,46.9055f,19.5312f, +7.8125f,48.3769f,19.5312f, +11.7188f,50.0613f,19.5312f, +15.625f,50.9962f,19.5312f, +19.5313f,51.161f,19.5312f, +23.4375f,51.7721f,19.5312f, +27.3438f,51.5823f,19.5312f, +31.25f,51.5274f,19.5312f, +35.1563f,51.5913f,19.5312f, +39.0625f,52.4399f,19.5312f, +42.9688f,52.5999f,19.5312f, +46.875f,51.9309f,19.5312f, +50.7813f,51.6062f,19.5312f, +54.6875f,50.86f,19.5312f, +58.5938f,51.1496f,19.5312f, +62.5f,50.1957f,19.5312f, +66.4063f,49.8047f,19.5312f, +70.3125f,49.1838f,19.5312f, +74.2188f,48.7276f,19.5312f, +78.125f,48.4967f,19.5312f, +82.0313f,47.4515f,19.5312f, +85.9375f,46.2594f,19.5312f, +89.8438f,44.6756f,19.5312f, +93.75f,43.0377f,19.5312f, +97.6563f,41.3508f,19.5312f, +101.563f,40.8261f,19.5312f, +105.469f,40.5524f,19.5312f, +109.375f,39.7289f,19.5312f, +113.281f,38.9437f,19.5312f, +117.188f,38.3781f,19.5312f, +121.094f,36.9618f,19.5312f, +125.0f,35.9735f,19.5312f, +128.906f,35.3887f,19.5312f, +132.813f,34.5133f,19.5312f, +136.719f,34.7253f,19.5312f, +140.625f,33.9228f,19.5312f, +144.531f,34.2826f,19.5312f, +148.438f,35.5643f,19.5312f, +152.344f,37.7492f,19.5312f, +156.25f,38.7871f,19.5312f, +160.156f,38.6036f,19.5312f, +164.063f,38.2702f,19.5312f, +167.969f,35.931f,19.5312f, +171.875f,34.8252f,19.5312f, +175.781f,33.99f,19.5312f, +179.688f,33.664f,19.5312f, +183.594f,31.6973f,19.5312f, +187.5f,31.3559f,19.5312f, +191.406f,31.3589f,19.5312f, +195.313f,30.7614f,19.5312f, +199.219f,29.2596f,19.5312f, +203.125f,28.7711f,19.5312f, +207.031f,27.9455f,19.5312f, +210.938f,28.3339f,19.5312f, +214.844f,28.3863f,19.5312f, +218.75f,27.4513f,19.5312f, +222.656f,25.0652f,19.5312f, +226.563f,23.2291f,19.5312f, +230.469f,20.8477f,19.5313f, +234.375f,19.424f,19.5313f, +238.281f,17.7051f,19.5313f, +242.188f,16.5977f,19.5313f, +246.094f,14.7851f,19.5313f, +250.0f,12.8344f,19.5313f, +3.90625f,49.2295f,15.625f, +7.8125f,50.0754f,15.625f, +11.7188f,51.5873f,15.625f, +15.625f,52.0525f,15.625f, +19.5313f,51.4269f,15.625f, +23.4375f,51.8405f,15.625f, +27.3438f,52.3327f,15.625f, +31.25f,53.011f,15.625f, +35.1563f,52.7359f,15.625f, +39.0625f,53.2852f,15.625f, +42.9688f,53.6617f,15.625f, +46.875f,52.4883f,15.625f, +50.7813f,51.9362f,15.625f, +54.6875f,50.8372f,15.625f, +58.5938f,50.1782f,15.625f, +62.5f,49.0401f,15.625f, +66.4063f,49.1011f,15.625f, +70.3125f,48.7903f,15.625f, +74.2188f,48.6124f,15.625f, +78.125f,48.1259f,15.625f, +82.0313f,47.7267f,15.625f, +85.9375f,46.9214f,15.625f, +89.8438f,45.0939f,15.625f, +93.75f,43.6563f,15.625f, +97.6563f,42.5709f,15.625f, +101.563f,41.9572f,15.625f, +105.469f,40.973f,15.625f, +109.375f,40.7682f,15.625f, +113.281f,39.3641f,15.625f, +117.188f,39.2768f,15.625f, +121.094f,37.5977f,15.625f, +125.0f,36.0608f,15.625f, +128.906f,36.045f,15.625f, +132.813f,35.1379f,15.625f, +136.719f,34.9875f,15.625f, +140.625f,34.0482f,15.625f, +144.531f,33.8104f,15.625f, +148.438f,34.9994f,15.625f, +152.344f,36.2664f,15.625f, +156.25f,37.7694f,15.625f, +160.156f,37.6584f,15.625f, +164.063f,36.9226f,15.625f, +167.969f,34.7519f,15.625f, +171.875f,33.2827f,15.625f, +175.781f,32.8949f,15.625f, +179.688f,32.1339f,15.625f, +183.594f,30.407f,15.625f, +187.5f,28.996f,15.625f, +191.406f,29.3357f,15.625f, +195.313f,29.1098f,15.625f, +199.219f,27.8354f,15.625f, +203.125f,26.4739f,15.625f, +207.031f,26.1829f,15.625f, +210.938f,27.387f,15.625f, +214.844f,27.4944f,15.625f, +218.75f,26.4893f,15.625f, +222.656f,24.7764f,15.625f, +226.563f,22.9689f,15.625f, +230.469f,20.4237f,15.625f, +234.375f,18.8049f,15.625f, +238.281f,17.4547f,15.625f, +242.188f,16.2758f,15.625f, +246.094f,14.2192f,15.625f, +250.0f,11.8103f,15.625f, +3.90625f,51.1233f,11.7187f, +7.8125f,51.8127f,11.7187f, +11.7188f,52.0971f,11.7187f, +15.625f,51.8317f,11.7187f, +19.5313f,52.1213f,11.7187f, +23.4375f,51.7889f,11.7187f, +27.3438f,52.2065f,11.7187f, +31.25f,52.438f,11.7187f, +35.1563f,52.6021f,11.7187f, +39.0625f,53.2864f,11.7187f, +42.9688f,52.8882f,11.7187f, +46.875f,52.6009f,11.7187f, +50.7813f,52.8442f,11.7187f, +54.6875f,52.6512f,11.7187f, +58.5938f,51.6436f,11.7187f, +62.5f,50.4271f,11.7187f, +66.4063f,49.3264f,11.7187f, +70.3125f,48.6522f,11.7187f, +74.2188f,49.5854f,11.7187f, +78.125f,50.3492f,11.7187f, +82.0313f,49.035f,11.7187f, +85.9375f,47.6474f,11.7187f, +89.8438f,46.0472f,11.7187f, +93.75f,44.7337f,11.7187f, +97.6563f,44.3349f,11.7187f, +101.563f,43.475f,11.7187f, +105.469f,42.9461f,11.7187f, +109.375f,41.7731f,11.7187f, +113.281f,40.717f,11.7187f, +117.188f,39.399f,11.7187f, +121.094f,38.1327f,11.7187f, +125.0f,36.3286f,11.7187f, +128.906f,36.2512f,11.7187f, +132.813f,35.1997f,11.7187f, +136.719f,33.9406f,11.7187f, +140.625f,33.3109f,11.7187f, +144.531f,33.8153f,11.7187f, +148.438f,33.6823f,11.7187f, +152.344f,34.7077f,11.7187f, +156.25f,35.4472f,11.7187f, +160.156f,35.6332f,11.7187f, +164.063f,34.3651f,11.7187f, +167.969f,32.9876f,11.7187f, +171.875f,32.2858f,11.7187f, +175.781f,32.1374f,11.7187f, +179.688f,30.9575f,11.7187f, +183.594f,29.1111f,11.7187f, +187.5f,28.149f,11.7187f, +191.406f,27.4443f,11.7187f, +195.313f,27.3781f,11.7187f, +199.219f,26.4413f,11.7187f, +203.125f,24.9734f,11.7187f, +207.031f,25.0959f,11.7187f, +210.938f,26.2472f,11.7187f, +214.844f,26.1569f,11.7187f, +218.75f,24.8556f,11.7187f, +222.656f,22.8797f,11.7187f, +226.563f,21.8102f,11.7187f, +230.469f,19.294f,11.7187f, +234.375f,17.5291f,11.7187f, +238.281f,16.242f,11.7187f, +242.188f,15.2738f,11.7187f, +246.094f,13.8715f,11.7187f, +250.0f,12.3043f,11.7187f, +3.90625f,52.2527f,7.8125f, +7.8125f,52.7759f,7.8125f, +11.7188f,52.1635f,7.8125f, +15.625f,52.2016f,7.8125f, +19.5313f,51.9832f,7.8125f, +23.4375f,51.4669f,7.8125f, +27.3438f,51.0033f,7.8125f, +31.25f,50.7124f,7.8125f, +35.1563f,51.6427f,7.8125f, +39.0625f,52.5008f,7.8125f, +42.9688f,53.2834f,7.8125f, +46.875f,52.5339f,7.8125f, +50.7813f,52.627f,7.8125f, +54.6875f,52.9017f,7.8125f, +58.5938f,52.8616f,7.8125f, +62.5f,51.7566f,7.8125f, +66.4063f,51.3268f,7.8125f, +70.3125f,50.6108f,7.8125f, +74.2188f,50.9277f,7.8125f, +78.125f,51.701f,7.8125f, +82.0313f,50.5549f,7.8125f, +85.9375f,48.4345f,7.8125f, +89.8438f,47.3592f,7.8125f, +93.75f,45.7216f,7.8125f, +97.6563f,45.75f,7.8125f, +101.563f,44.4249f,7.8125f, +105.469f,44.7192f,7.8125f, +109.375f,44.4938f,7.8125f, +113.281f,43.252f,7.8125f, +117.188f,41.3735f,7.8125f, +121.094f,39.8664f,7.8125f, +125.0f,37.025f,7.8125f, +128.906f,36.5094f,7.8125f, +132.813f,35.3554f,7.8125f, +136.719f,33.9389f,7.8125f, +140.625f,32.7715f,7.8125f, +144.531f,32.8295f,7.8125f, +148.438f,32.4513f,7.8125f, +152.344f,33.4598f,7.8125f, +156.25f,34.3434f,7.8125f, +160.156f,34.8633f,7.8125f, +164.063f,33.7043f,7.8125f, +167.969f,32.5629f,7.8125f, +171.875f,31.5117f,7.8125f, +175.781f,30.9816f,7.8125f, +179.688f,30.2039f,7.8125f, +183.594f,28.5054f,7.8125f, +187.5f,26.8519f,7.8125f, +191.406f,25.6078f,7.8125f, +195.313f,26.0906f,7.8125f, +199.219f,25.313f,7.8125f, +203.125f,24.0014f,7.8125f, +207.031f,24.066f,7.8125f, +210.938f,24.4935f,7.8125f, +214.844f,24.3803f,7.8125f, +218.75f,23.0075f,7.8125f, +222.656f,21.1023f,7.8125f, +226.563f,19.0418f,7.8125f, +230.469f,17.9588f,7.8125f, +234.375f,16.5211f,7.8125f, +238.281f,15.4949f,7.8125f, +242.188f,14.0938f,7.8125f, +246.094f,13.3141f,7.8125f, +250.0f,12.9595f,7.8125f, +3.90625f,52.6186f,3.90625f, +7.8125f,51.8648f,3.90625f, +11.7188f,51.1949f,3.90625f, +15.625f,50.2102f,3.90625f, +19.5313f,50.6058f,3.90625f, +23.4375f,50.7008f,3.90625f, +27.3438f,51.2163f,3.90625f, +31.25f,51.4263f,3.90625f, +35.1563f,52.1968f,3.90625f, +39.0625f,53.9783f,3.90625f, +42.9688f,53.8927f,3.90625f, +46.875f,53.3266f,3.90625f, +50.7813f,53.5901f,3.90625f, +54.6875f,55.5679f,3.90625f, +58.5938f,55.1819f,3.90625f, +62.5f,53.6891f,3.90625f, +66.4063f,53.0541f,3.90625f, +70.3125f,51.6665f,3.90625f, +74.2188f,51.4469f,3.90625f, +78.125f,51.9591f,3.90625f, +82.0313f,51.0418f,3.90625f, +85.9375f,49.7513f,3.90625f, +89.8438f,48.7329f,3.90625f, +93.75f,46.8713f,3.90625f, +97.6563f,46.3905f,3.90625f, +101.563f,45.4241f,3.90625f, +105.469f,45.6811f,3.90625f, +109.375f,45.3238f,3.90625f, +113.281f,43.6112f,3.90625f, +117.188f,42.1291f,3.90625f, +121.094f,40.4747f,3.90625f, +125.0f,39.3351f,3.90625f, +128.906f,38.0742f,3.90625f, +132.813f,36.7758f,3.90625f, +136.719f,34.9213f,3.90625f, +140.625f,32.3643f,3.90625f, +144.531f,31.7157f,3.90625f, +148.438f,30.6005f,3.90625f, +152.344f,31.6034f,3.90625f, +156.25f,32.6503f,3.90625f, +160.156f,33.3131f,3.90625f, +164.063f,32.5745f,3.90625f, +167.969f,31.5017f,3.90625f, +171.875f,30.6842f,3.90625f, +175.781f,29.8734f,3.90625f, +179.688f,28.6537f,3.90625f, +183.594f,27.2073f,3.90625f, +187.5f,25.4367f,3.90625f, +191.406f,24.1609f,3.90625f, +195.313f,23.9724f,3.90625f, +199.219f,23.7702f,3.90625f, +203.125f,22.4031f,3.90625f, +207.031f,22.1587f,3.90625f, +210.938f,21.6154f,3.90625f, +214.844f,21.8202f,3.90625f, +218.75f,21.017f,3.90625f, +222.656f,19.3736f,3.90625f, +226.563f,18.2127f,3.90625f, +230.469f,17.2263f,3.90625f, +234.375f,16.2938f,3.90625f, +238.281f,14.4518f,3.90625f, +242.188f,13.6398f,3.90625f, +246.094f,13.2404f,3.90625f, +250.0f,12.7102f,3.90625f, +}; + +btScalar Landscape04Nml[] = { +-0.350125f,0.914758f,-0.201568f, +-0.310159f,0.930741f,-0.193707f, +-0.297809f,0.93918f,-0.171025f, +-0.203808f,0.975413f,-0.083855f, +-0.227869f,0.971729f,-0.0617958f, +-0.175976f,0.984209f,0.0190985f, +-0.113434f,0.992992f,-0.0331636f, +-0.10748f,0.994138f,-0.0117748f, +0.264437f,0.964372f,0.00769155f, +0.281666f,0.958691f,0.0397075f, +0.430486f,0.901936f,-0.0345351f, +0.401178f,0.915992f,-0.00383073f, +0.323069f,0.944057f,-0.0662002f, +0.321744f,0.945983f,-0.039967f, +0.269775f,0.962292f,-0.0348534f, +0.20193f,0.970428f,-0.132266f, +0.268889f,0.954681f,-0.127604f, +0.194635f,0.954618f,-0.225435f, +0.221506f,0.956393f,-0.190387f, +0.193103f,0.932235f,-0.306022f, +0.127904f,0.985279f,-0.113427f, +0.190082f,0.941797f,-0.277285f, +-0.00897869f,0.999816f,0.0169309f, +0.104995f,0.98929f,-0.101393f, +-0.0904331f,0.992726f,0.0794834f, +0.0230108f,0.991613f,0.127174f, +0.0155488f,0.993572f,0.11213f, +0.0288983f,0.981821f,0.187597f, +0.0247864f,0.996149f,0.0840949f, +-0.0831472f,0.996537f,0.000391199f, +-0.0501709f,0.99867f,0.0118531f, +-0.153f,0.976743f,-0.15021f, +-0.106591f,0.988499f,-0.107277f, +-0.178503f,0.946807f,-0.267757f, +-0.0254657f,0.984638f,-0.172739f, +-0.00387521f,0.963955f,-0.266035f, +-0.0158619f,0.994497f,-0.103554f, +0.0516719f,0.979433f,-0.195043f, +-0.113536f,0.993496f,-0.00869834f, +-0.0532458f,0.993386f,-0.101726f, +-0.240923f,0.970479f,0.0112676f, +-0.272825f,0.959264f,-0.0733371f, +-0.364171f,0.921854f,-0.132533f, +-0.38043f,0.901643f,-0.205699f, +-0.208475f,0.967633f,-0.142215f, +-0.200209f,0.964847f,-0.170257f, +-0.436593f,0.880066f,-0.186734f, +-0.420663f,0.90307f,-0.0866427f, +-0.564169f,0.813693f,-0.140058f, +-0.556718f,0.83037f,-0.0234562f, +-0.419122f,0.896066f,-0.146295f, +-0.466908f,0.873897f,-0.135282f, +-0.39151f,0.89596f,-0.209704f, +-0.388383f,0.911455f,-0.135677f, +-0.356022f,0.918213f,-0.173589f, +-0.334437f,0.939184f,-0.0780065f, +-0.257665f,0.953587f,-0.155824f, +-0.309301f,0.93272f,-0.185382f, +-0.315034f,0.931862f,-0.179961f, +-0.295926f,0.931298f,-0.212393f, +-0.436779f,0.896592f,-0.0731173f, +-0.317368f,0.948237f,0.0111289f, +-0.503169f,0.863334f,0.0383931f, +-0.468116f,0.877337f,0.105583f, +-0.41232f,0.911034f,0.00307775f, +-0.465256f,0.885053f,0.0147642f, +-0.139311f,0.987488f,-0.0738976f, +-0.20689f,0.974976f,-0.0813499f, +-0.0453849f,0.98457f,-0.169006f, +-0.109269f,0.973649f,-0.20017f, +0.0405907f,0.980595f,-0.191794f, +0.0742781f,0.990348f,-0.117022f, +-0.00934593f,0.982385f,-0.186633f, +0.00811898f,0.984163f,-0.177079f, +-0.0726933f,0.996391f,-0.043832f, +0.0160265f,0.999861f,-0.00453309f, +-0.163053f,0.986585f,0.00801872f, +-0.185529f,0.978031f,-0.0950467f, +-0.137829f,0.987875f,0.0714611f, +-0.0578854f,0.998186f,0.0165557f, +0.148249f,0.976119f,0.158788f, +0.193139f,0.975453f,0.10578f, +0.369772f,0.912299f,0.176006f, +0.348645f,0.936628f,0.0342667f, +0.282769f,0.952501f,0.113063f, +0.239504f,0.96906f,-0.059674f, +0.137712f,0.990197f,0.0233582f, +0.149987f,0.988306f,0.0274647f, +0.169834f,0.984573f,-0.0420991f, +0.0927723f,0.990592f,-0.100603f, +0.171676f,0.97845f,-0.114732f, +0.0567364f,0.963622f,-0.261179f, +0.117062f,0.969073f,-0.217242f, +0.0434058f,0.931949f,-0.359981f, +0.148347f,0.946865f,-0.285375f, +0.103327f,0.903437f,-0.416082f, +0.28421f,0.914779f,-0.287061f, +0.391793f,0.893555f,-0.21922f, +0.419866f,0.888994f,-0.182764f, +0.461528f,0.873246f,-0.156313f, +0.483081f,0.869853f,-0.099941f, +0.503438f,0.857022f,-0.109831f, +0.46584f,0.882166f,-0.0691099f, +0.489623f,0.868073f,-0.0819641f, +0.410796f,0.910896f,-0.0389227f, +0.393119f,0.918063f,-0.0511611f, +0.359627f,0.921042f,-0.1495f, +0.306646f,0.942147f,-0.135377f, +0.381773f,0.903228f,-0.196033f, +0.360002f,0.920948f,-0.149176f, +0.203221f,0.945872f,-0.253037f, +0.218471f,0.943498f,-0.249162f, +0.0567054f,0.995659f,-0.0738017f, +0.229305f,0.968679f,0.0952866f, +-0.0263963f,0.99794f,0.0584726f, +-0.0422212f,0.996107f,0.0773806f, +0.0415928f,0.997459f,0.0578396f, +0.0625406f,0.995706f,0.0682456f, +0.174866f,0.970931f,0.163448f, +0.248971f,0.959664f,0.13061f, +0.296526f,0.91909f,0.259511f, +0.244457f,0.962524f,0.117427f, +0.144028f,0.988219f,0.0517682f, +0.0516566f,0.998622f,-0.00921711f, +-0.0100473f,0.999479f,-0.0306849f, +0.144821f,0.968281f,0.203614f, +0.0927686f,0.985877f,0.139429f, +0.159268f,0.950036f,0.268448f, +-0.238265f,0.969366f,-0.0596594f, +-0.317162f,0.937667f,-0.14209f, +-0.252226f,0.956124f,-0.149026f, +-0.139275f,0.959516f,-0.244809f, +0.225678f,0.948782f,-0.221092f, +0.454598f,0.876109f,-0.160545f, +0.280777f,0.950726f,-0.131467f, +0.235562f,0.968875f,-0.076101f, +0.32523f,0.943278f,-0.0667146f, +0.204883f,0.977104f,-0.0573623f, +-0.016814f,0.999658f,-0.0200258f, +-0.0821474f,0.994185f,0.0696248f, +-0.0248008f,0.998098f,0.0564331f, +0.000698274f,0.999817f,0.0191283f, +0.0007523f,0.989994f,0.141106f, +-0.0137951f,0.98192f,0.188792f, +-0.00956379f,0.990301f,0.138609f, +-0.0156365f,0.996604f,0.0808513f, +-0.104293f,0.986463f,0.126542f, +-0.156424f,0.969975f,0.186228f, +-0.167617f,0.975111f,0.145129f, +-0.261339f,0.965118f,0.0157997f, +-0.160877f,0.9832f,-0.0862302f, +-0.296054f,0.934306f,-0.198555f, +-0.550185f,0.752769f,-0.361436f, +-0.408582f,0.840233f,-0.356467f, +-0.339245f,0.876729f,-0.340968f, +-0.402741f,0.85772f,-0.319556f, +-0.316164f,0.924069f,-0.214795f, +-0.348907f,0.927941f,-0.131109f, +-0.48502f,0.870548f,-0.0830789f, +-0.53006f,0.843646f,-0.085433f, +-0.352226f,0.931519f,-0.0906107f, +-0.0975811f,0.982258f,-0.160146f, +0.0477418f,0.981235f,-0.186812f, +0.0219054f,0.966987f,-0.253882f, +-0.115057f,0.988784f,-0.0952266f, +-0.238673f,0.960258f,0.144707f, +-0.213447f,0.931011f,0.296071f, +-0.201955f,0.923284f,0.326742f, +0.101325f,0.921693f,0.374453f, +0.294403f,0.882174f,0.367555f, +0.373397f,0.835094f,0.403971f, +0.278351f,0.921647f,0.270347f, +0.215461f,0.962466f,0.16503f, +0.225302f,0.965479f,0.13073f, +0.175997f,0.983214f,0.0481225f, +0.220124f,0.97536f,0.0147531f, +0.32343f,0.94566f,-0.0334783f, +0.369971f,0.927728f,-0.0494253f, +0.427777f,0.903113f,-0.037328f, +0.446874f,0.894597f,9.72625e-005f, +0.445338f,0.895316f,-0.00910111f, +0.463955f,0.88101f,-0.0925573f, +0.398143f,0.905258f,-0.148289f, +0.190091f,0.969836f,-0.152589f, +-0.0830374f,0.980972f,-0.175495f, +-0.1343f,0.985908f,-0.0997463f, +-0.00843053f,0.999434f,0.0325608f, +0.021819f,0.995847f,0.0883913f, +0.206682f,0.96009f,0.188439f, +0.388829f,0.882727f,0.263827f, +0.0707915f,0.996578f,0.0426701f, +-0.161491f,0.983232f,-0.0847068f, +-0.0785342f,0.996721f,-0.0194704f, +-0.224473f,0.966422f,-0.125062f, +-0.159666f,0.968511f,-0.191032f, +0.0318558f,0.951557f,-0.305817f, +0.187349f,0.896729f,-0.400972f, +0.324927f,0.900628f,-0.288602f, +0.217775f,0.961772f,-0.16604f, +0.20019f,0.973241f,-0.112807f, +0.277242f,0.959937f,-0.0407145f, +0.14204f,0.987332f,0.0707153f, +-0.0153938f,0.984428f,0.175114f, +-0.0735255f,0.984081f,0.161796f, +-0.0237909f,0.990594f,0.134749f, +-0.0614906f,0.985818f,0.156146f, +-0.143236f,0.970943f,0.191711f, +-0.0137498f,0.973243f,0.229369f, +0.0567477f,0.984597f,0.165372f, +-0.0347212f,0.993259f,0.110594f, +-0.143386f,0.976741f,0.159429f, +-0.139502f,0.982211f,0.125705f, +-0.0993842f,0.989216f,0.107588f, +-0.136731f,0.987843f,0.0739654f, +-0.0893069f,0.995969f,0.00840628f, +-0.123862f,0.992294f,-0.00315825f, +-0.391175f,0.886683f,-0.246529f, +-0.44403f,0.793263f,-0.41662f, +-0.399761f,0.83626f,-0.375315f, +-0.422675f,0.841058f,-0.33759f, +-0.445112f,0.835127f,-0.323168f, +-0.410733f,0.898417f,-0.155389f, +-0.485628f,0.867891f,-0.104549f, +-0.491383f,0.859111f,-0.143077f, +-0.358033f,0.910383f,-0.207399f, +-0.0910122f,0.986127f,-0.138818f, +0.0820594f,0.995842f,-0.039567f, +-0.0287013f,0.999312f,-0.0234726f, +-0.346268f,0.933835f,0.0897299f, +-0.471073f,0.825151f,0.311795f, +-0.27505f,0.819541f,0.502693f, +-0.154238f,0.84574f,0.510818f, +0.0836929f,0.869512f,0.48677f, +0.266688f,0.84547f,0.462663f, +0.365749f,0.809921f,0.458537f, +0.371864f,0.832105f,0.411483f, +0.260242f,0.895369f,0.361371f, +0.283389f,0.903576f,0.321311f, +0.269874f,0.934168f,0.233448f, +0.265321f,0.957928f,0.10945f, +0.333071f,0.942841f,0.0106961f, +0.387903f,0.9217f,0.000193271f, +0.435792f,0.899834f,0.0195967f, +0.454676f,0.88982f,0.0386129f, +0.482276f,0.876019f,-0.000723308f, +0.505259f,0.860654f,-0.0631586f, +0.398328f,0.910448f,-0.111444f, +0.21929f,0.970647f,-0.0987756f, +0.0111053f,0.988208f,-0.152714f, +-0.210805f,0.943357f,-0.256201f, +-0.146846f,0.978658f,-0.143755f, +0.0139602f,0.999731f,-0.0184963f, +0.133096f,0.990721f,-0.0275154f, +0.2933f,0.953875f,0.0640122f, +0.228393f,0.945969f,0.230173f, +0.0546169f,0.969859f,0.237467f, +-0.0762534f,0.988779f,-0.128459f, +-0.106647f,0.982213f,-0.154543f, +-0.122396f,0.949634f,-0.28847f, +0.0920652f,0.954226f,-0.284566f, +0.185259f,0.946785f,-0.263206f, +0.232314f,0.960849f,-0.150996f, +0.169992f,0.979263f,-0.110207f, +0.125326f,0.980516f,-0.151267f, +0.149673f,0.98818f,-0.0331477f, +0.0238199f,0.989878f,0.139909f, +-0.107594f,0.981438f,0.158754f, +-0.0846643f,0.982313f,0.167013f, +-0.0375415f,0.970751f,0.237134f, +-0.0510768f,0.964816f,0.257917f, +-0.0443365f,0.980593f,0.190977f, +0.00242513f,0.997744f,0.0670872f, +0.124335f,0.983389f,0.132238f, +-0.00301992f,0.993206f,0.116332f, +-0.125192f,0.990103f,0.0634287f, +-0.100487f,0.994519f,-0.0288746f, +-0.101663f,0.992712f,-0.0647098f, +-0.139647f,0.987963f,-0.0665471f, +-0.130136f,0.990189f,-0.0508981f, +-0.0756901f,0.997123f,-0.00415316f, +-0.171558f,0.977059f,-0.126185f, +-0.351855f,0.892529f,-0.282117f, +-0.447333f,0.817645f,-0.362422f, +-0.423851f,0.857249f,-0.29236f, +-0.448058f,0.866215f,-0.221171f, +-0.531086f,0.820738f,-0.210565f, +-0.511898f,0.851158f,-0.116153f, +-0.425868f,0.900461f,-0.0883553f, +-0.399025f,0.900598f,-0.172345f, +-0.24223f,0.968919f,-0.0502012f, +-0.0663613f,0.996507f,0.0506899f, +-0.138021f,0.972657f,0.186782f, +-0.4139f,0.851097f,0.322987f, +-0.550512f,0.782849f,0.289973f, +-0.380287f,0.863038f,0.332486f, +-0.131533f,0.903571f,0.407748f, +0.119586f,0.9109f,0.394918f, +0.299052f,0.87558f,0.379379f, +0.370047f,0.8611f,0.348671f, +0.442832f,0.822723f,0.356408f, +0.35885f,0.890772f,0.278839f, +0.314791f,0.940053f,0.131179f, +0.339464f,0.925728f,0.166711f, +0.403599f,0.900778f,0.160334f, +0.45653f,0.889636f,-0.0113152f, +0.365242f,0.916509f,-0.163124f, +0.379822f,0.91652f,-0.125407f, +0.442125f,0.891797f,-0.096041f, +0.493888f,0.864551f,-0.0928755f, +0.541781f,0.83947f,-0.041994f, +0.441424f,0.894377f,-0.0723577f, +0.226514f,0.958331f,-0.174048f, +0.0664964f,0.969681f,-0.235153f, +-0.103823f,0.949537f,-0.295973f, +-0.233692f,0.889012f,-0.39376f, +-0.0987171f,0.939339f,-0.328477f, +0.103986f,0.972613f,-0.207871f, +0.198802f,0.974287f,-0.106033f, +0.0601774f,0.998175f,0.00500958f, +-0.0421158f,0.995212f,0.0882012f, +-0.0598721f,0.997785f,-0.0289851f, +-0.030607f,0.999125f,-0.0285146f, +-0.00697633f,0.993471f,-0.113875f, +0.0388611f,0.980882f,-0.190686f, +0.0977483f,0.98843f,-0.115983f, +0.15403f,0.986798f,-0.0500538f, +0.193054f,0.979913f,-0.0500083f, +0.157678f,0.98694f,-0.0329733f, +-0.0158549f,0.999428f,0.0298765f, +-0.0525571f,0.987534f,0.14837f, +0.000720533f,0.997813f,0.0660913f, +-0.102677f,0.99254f,-0.0657426f, +-0.099341f,0.994285f,-0.0391091f, +-0.0676495f,0.996952f,-0.0388727f, +0.0225146f,0.999293f,0.0301014f, +0.0577235f,0.997453f,0.0418936f, +-0.0269869f,0.999243f,0.0280361f, +0.00446401f,0.985157f,0.171599f, +-0.0141502f,0.990326f,0.138035f, +-0.00518586f,0.999975f,0.00477817f, +-0.0328139f,0.995381f,-0.09022f, +-0.128063f,0.971338f,-0.200254f, +-0.151852f,0.967914f,-0.200209f, +-0.0720493f,0.989055f,-0.128759f, +-0.0591129f,0.991504f,-0.115868f, +-0.248059f,0.943661f,-0.219024f, +-0.389946f,0.877483f,-0.279225f, +-0.523332f,0.810744f,-0.262332f, +-0.51839f,0.842544f,-0.146256f, +-0.550368f,0.815716f,-0.178051f, +-0.560732f,0.813038f,-0.156683f, +-0.427123f,0.899415f,-0.0928351f, +-0.366593f,0.924495f,-0.104494f, +-0.322547f,0.93696f,-0.134426f, +-0.128035f,0.99042f,-0.0517317f, +-0.291376f,0.953688f,0.0746902f, +-0.520094f,0.826135f,0.216802f, +-0.516864f,0.826474f,0.22314f, +-0.396988f,0.892552f,0.213897f, +-0.184148f,0.954818f,0.233263f, +0.0957205f,0.95579f,0.278034f, +0.314018f,0.892294f,0.32435f, +0.401668f,0.873128f,0.276243f, +0.463054f,0.857596f,0.223851f, +0.480022f,0.855973f,0.192066f, +0.375927f,0.916106f,0.13939f, +0.288789f,0.941864f,0.171735f, +0.396643f,0.909563f,0.123974f, +0.561623f,0.825897f,0.0497286f, +0.465605f,0.881752f,-0.0756653f, +0.370044f,0.915005f,-0.160728f, +0.427822f,0.898624f,-0.0971747f, +0.465206f,0.885137f,-0.0107503f, +0.468824f,0.88183f,0.0507874f, +0.478143f,0.868746f,0.12907f, +0.351411f,0.934208f,0.0613665f, +0.140442f,0.98844f,-0.0571117f, +-0.0122878f,0.991421f,-0.130131f, +-0.117862f,0.972142f,-0.202603f, +-0.15815f,0.947613f,-0.27752f, +-0.0729629f,0.95654f,-0.282325f, +0.0272484f,0.989771f,-0.14004f, +-0.0137333f,0.999563f,0.0261849f, +-0.0985129f,0.993299f,0.0604412f, +-0.135233f,0.990548f,-0.0229695f, +-0.0373153f,0.999264f,0.00888433f, +0.0352261f,0.99933f,0.00994916f, +0.061219f,0.99588f,0.0668911f, +0.0815695f,0.99444f,0.0665983f, +0.144386f,0.989424f,0.0139045f, +0.184662f,0.980318f,0.0698361f, +0.0224217f,0.989677f,0.14155f, +-0.0794321f,0.954058f,0.288901f, +-0.0304562f,0.959461f,0.280192f, +0.112423f,0.968918f,0.220359f, +0.0390938f,0.993037f,0.111126f, +-0.0885962f,0.9933f,-0.0741985f, +-0.0453085f,0.996418f,-0.0714089f, +-0.123875f,0.985221f,-0.118298f, +0.00670832f,0.999925f,0.010273f, +-0.0146906f,0.998569f,0.0514303f, +-0.0998092f,0.992773f,0.0666264f, +0.0466126f,0.990197f,0.131669f, +0.103009f,0.992862f,0.0601126f, +0.113553f,0.993084f,-0.0298385f, +-0.0128779f,0.975704f,-0.218713f, +-0.177855f,0.94662f,-0.268846f, +-0.191482f,0.955424f,-0.224722f, +-0.0532043f,0.987628f,-0.147512f, +-0.140744f,0.970833f,-0.194099f, +-0.387395f,0.889373f,-0.242778f, +-0.531553f,0.818908f,-0.216427f, +-0.531571f,0.799354f,-0.280115f, +-0.51407f,0.81292f,-0.273666f, +-0.549112f,0.793924f,-0.261078f, +-0.484709f,0.822384f,-0.297895f, +-0.322663f,0.926066f,-0.195678f, +-0.315438f,0.927311f,-0.201479f, +-0.289702f,0.947148f,-0.13778f, +-0.417457f,0.908684f,-0.00477603f, +-0.584599f,0.810188f,0.0428868f, +-0.55194f,0.828316f,0.0962071f, +-0.397599f,0.904432f,0.154656f, +-0.183216f,0.971572f,0.149931f, +0.0355131f,0.990243f,0.134751f, +0.298837f,0.942288f,0.150964f, +0.413659f,0.900634f,0.133206f, +0.498073f,0.828388f,0.256313f, +0.444018f,0.853405f,0.273035f, +0.327561f,0.881897f,0.339061f, +0.313826f,0.898686f,0.306392f, +0.495157f,0.851292f,0.173556f, +0.614747f,0.78345f,0.0910662f, +0.55187f,0.833866f,0.0103585f, +0.367713f,0.926545f,-0.0793776f, +0.311567f,0.950223f,0.00108255f, +0.382947f,0.917094f,0.110859f, +0.410945f,0.895808f,0.169272f, +0.455231f,0.858878f,0.234721f, +0.373673f,0.896264f,0.238911f, +0.246571f,0.935158f,0.254328f, +0.0808975f,0.990111f,0.114608f, +-0.0843211f,0.99633f,-0.0147289f, +-0.0859474f,0.994869f,-0.0533687f, +-0.0567528f,0.986639f,-0.152718f, +-0.104487f,0.984189f,-0.143019f, +-0.139027f,0.990289f,8.5057e-005f, +-0.137547f,0.987918f,0.0714029f, +-0.144256f,0.989201f,-0.0259182f, +-0.026694f,0.998838f,-0.0401331f, +-0.0313342f,0.99664f,-0.0756769f, +-0.0574884f,0.99781f,0.0327011f, +0.145005f,0.983413f,0.108961f, +0.119257f,0.992151f,0.0376122f, +0.0587452f,0.978725f,0.196585f, +-0.0803833f,0.947865f,0.308369f, +-0.127827f,0.919581f,0.371526f, +-0.00616421f,0.930831f,0.365399f, +0.107639f,0.912609f,0.394409f, +0.210572f,0.88729f,0.410336f, +0.0740329f,0.980065f,0.184368f, +-0.0250926f,0.999613f,0.0120275f, +-0.0610433f,0.996433f,-0.05826f, +-0.0708404f,0.994984f,-0.0706271f, +-0.0640037f,0.997923f,-0.00726403f, +-0.0949547f,0.99548f,0.00148231f, +0.00929451f,0.997943f,-0.0634315f, +0.147986f,0.988795f,-0.0195964f, +0.19874f,0.98001f,-0.00909425f, +0.119683f,0.99247f,-0.0260466f, +-0.140841f,0.984951f,-0.10018f, +-0.197496f,0.959342f,-0.201637f, +-0.0821482f,0.973605f,-0.212945f, +-0.090387f,0.978841f,-0.18358f, +-0.34459f,0.903344f,-0.255395f, +-0.465169f,0.833236f,-0.29889f, +-0.493353f,0.789348f,-0.365421f, +-0.529455f,0.773394f,-0.348624f, +-0.541108f,0.776645f,-0.322528f, +-0.503238f,0.814279f,-0.289312f, +-0.451111f,0.869282f,-0.202106f, +-0.405307f,0.906179f,-0.120689f, +-0.367499f,0.92846f,-0.0539062f, +-0.448648f,0.893437f,-0.0220131f, +-0.582415f,0.811815f,-0.0418214f, +-0.587857f,0.805915f,-0.0701802f, +-0.440963f,0.897524f,0.00144435f, +-0.150082f,0.985674f,0.0769547f, +0.0512849f,0.998035f,0.0359923f, +0.331471f,0.9412f,0.0653422f, +0.327057f,0.943418f,0.0547333f, +0.325027f,0.917755f,0.228216f, +0.374201f,0.856118f,0.35642f, +0.374565f,0.858588f,0.350039f, +0.460817f,0.854058f,0.241312f, +0.556465f,0.823608f,0.109619f, +0.63153f,0.770458f,0.0869767f, +0.587056f,0.806123f,0.074369f, +0.365958f,0.924908f,0.10305f, +0.26636f,0.954918f,0.131089f, +0.330741f,0.937061f,0.111923f, +0.358992f,0.918233f,0.167249f, +0.397317f,0.888574f,0.229294f, +0.378918f,0.890078f,0.253343f, +0.252398f,0.944302f,0.211161f, +0.242388f,0.947895f,0.206744f, +0.0865865f,0.99456f,0.0579091f, +-0.0181168f,0.990006f,-0.139854f, +0.0162661f,0.98021f,-0.197289f, +-0.148111f,0.960303f,-0.236394f, +-0.255052f,0.949006f,-0.185302f, +-0.211751f,0.971559f,-0.105997f, +-0.0120621f,0.994912f,-0.100021f, +-0.015173f,0.98959f,-0.143115f, +-0.0401151f,0.99847f,-0.0380528f, +-0.0979763f,0.995187f,0.00194195f, +0.0571375f,0.998251f,0.0151643f, +0.0776787f,0.976915f,0.199006f, +-0.101892f,0.95655f,0.273185f, +-0.133768f,0.938598f,0.318024f, +-0.177801f,0.93623f,0.303084f, +-0.022321f,0.922329f,0.385761f, +0.0333931f,0.905943f,0.422081f, +0.163361f,0.862964f,0.478127f, +0.305267f,0.821497f,0.481617f, +0.18106f,0.939243f,0.291615f, +-0.00700511f,0.992472f,0.122275f, +-0.0966012f,0.992994f,0.068052f, +-0.106034f,0.991731f,0.0722919f, +-0.0353039f,0.993084f,0.11197f, +0.0541772f,0.995603f,0.0764134f, +0.08347f,0.989853f,0.114994f, +0.130868f,0.975887f,0.174696f, +0.0723356f,0.969665f,0.23349f, +-0.0470347f,0.960948f,0.272703f, +-0.10077f,0.971805f,0.213169f, +-0.119566f,0.974584f,0.189448f, +-0.0774738f,0.965859f,0.247214f, +-0.198029f,0.968836f,0.1488f, +-0.435505f,0.897132f,-0.0740912f, +-0.502708f,0.857298f,-0.111019f, +-0.564282f,0.819749f,-0.0979722f, +-0.594236f,0.795147f,-0.120937f, +-0.591492f,0.803058f,-0.0723546f, +-0.526826f,0.849968f,-0.0029614f, +-0.410127f,0.912007f,0.00617969f, +-0.355675f,0.932755f,-0.0588432f, +-0.457125f,0.883759f,-0.100032f, +-0.544765f,0.834451f,-0.0832032f, +-0.554858f,0.819866f,-0.141253f, +-0.535218f,0.826621f,-0.173894f, +-0.203549f,0.978635f,-0.0289948f, +0.0668755f,0.997729f,0.00799418f, +0.247034f,0.968844f,0.017759f, +0.275407f,0.949712f,0.148988f, +0.19759f,0.950103f,0.241375f, +0.374575f,0.880138f,0.291635f, +0.446827f,0.865948f,0.224675f, +0.519968f,0.833624f,0.186291f, +0.587008f,0.786117f,0.193499f, +0.636373f,0.75334f,0.165857f, +0.540728f,0.822377f,0.176944f, +0.345338f,0.910903f,0.225828f, +0.278322f,0.945193f,0.170723f, +0.30876f,0.936535f,0.166043f, +0.303863f,0.916063f,0.261719f, +0.319419f,0.895614f,0.309591f, +0.43277f,0.828092f,0.356332f, +0.333077f,0.917687f,0.216587f, +0.219655f,0.964319f,0.147787f, +0.242228f,0.95005f,0.196802f, +0.204875f,0.978767f,-0.00640881f, +-0.000192716f,0.97566f,-0.219288f, +-0.0681124f,0.988809f,-0.132732f, +-0.241144f,0.919453f,-0.310573f, +-0.290276f,0.882193f,-0.370776f, +0.0292627f,0.97223f,-0.232189f, +-0.0803803f,0.976804f,-0.198478f, +-0.203999f,0.977793f,-0.0480039f, +-0.118856f,0.989202f,0.0857425f, +-0.0783112f,0.985397f,0.151198f, +-0.0878718f,0.938803f,0.333059f, +-0.083435f,0.948159f,0.30665f, +-0.110585f,0.962509f,0.247682f, +-0.186686f,0.943514f,0.273733f, +-0.149516f,0.932553f,0.32862f, +-0.00475332f,0.899494f,0.436906f, +0.0862131f,0.885009f,0.457522f, +0.277459f,0.815555f,0.507825f, +0.298118f,0.799955f,0.520766f, +0.14455f,0.869997f,0.471392f, +0.0121492f,0.942115f,0.335071f, +-0.0752209f,0.977077f,0.199154f, +-0.128636f,0.97789f,0.164878f, +-0.000660482f,0.945164f,0.326595f, +0.00550592f,0.919316f,0.393482f, +0.0803772f,0.905979f,0.415621f, +0.0810259f,0.907487f,0.412192f, +-0.090779f,0.919652f,0.382099f, +-0.137864f,0.897436f,0.419048f, +-0.130404f,0.886486f,0.444001f, +-0.0852724f,0.906321f,0.413897f, +-0.0259127f,0.906615f,0.421163f, +-0.225351f,0.915922f,0.332119f, +-0.462548f,0.869686f,0.172323f, +-0.572668f,0.816922f,0.0684804f, +-0.585929f,0.806118f,0.0828267f, +-0.593406f,0.803366f,0.0497268f, +-0.516762f,0.856027f,-0.0132014f, +-0.38427f,0.922646f,-0.0325731f, +-0.287245f,0.956724f,-0.0465863f, +-0.413146f,0.905396f,-0.097823f, +-0.564236f,0.818421f,-0.108744f, +-0.507227f,0.858315f,-0.0775611f, +-0.527754f,0.82927f,-0.183811f, +-0.354765f,0.918321f,-0.175582f, +0.0463007f,0.998926f,-0.00175561f, +0.214268f,0.976774f,0.00151756f, +0.165544f,0.983729f,0.0698077f, +0.096445f,0.982342f,0.16032f, +0.366991f,0.896711f,0.24744f, +0.500788f,0.845195f,0.186699f, +0.507012f,0.85355f,0.119965f, +0.542994f,0.824496f,0.159261f, +0.605757f,0.757486f,0.243463f, +0.532123f,0.786802f,0.312711f, +0.44869f,0.847812f,0.282652f, +0.34333f,0.935092f,0.0879082f, +0.24319f,0.961353f,0.129073f, +0.223708f,0.954136f,0.198946f, +0.276144f,0.94134f,0.193965f, +0.41277f,0.892522f,0.181731f, +0.485836f,0.856185f,0.175815f, +0.251109f,0.963495f,0.0928509f, +0.217377f,0.969921f,0.109544f, +0.402023f,0.911537f,0.0864706f, +0.0930878f,0.988366f,-0.120284f, +-0.0926141f,0.987658f,-0.126311f, +-0.0129498f,0.988134f,-0.153049f, +-0.0752509f,0.973537f,-0.215783f, +-0.167591f,0.970187f,-0.175075f, +-0.227938f,0.971032f,-0.0717025f, +-0.288377f,0.95589f,0.0557925f, +-0.2706f,0.959797f,0.0746015f, +-0.201821f,0.948409f,0.244517f, +-0.135104f,0.944724f,0.298737f, +0.0536332f,0.953012f,0.298147f, +-0.104499f,0.972769f,0.206883f, +-0.26012f,0.936243f,0.236192f, +-0.221301f,0.933098f,0.283468f, +-0.0976008f,0.934678f,0.341835f, +0.0488135f,0.920165f,0.388475f, +0.20566f,0.878417f,0.431379f, +0.294052f,0.82595f,0.480979f, +0.211093f,0.846234f,0.489211f, +0.1526f,0.86506f,0.477897f, +0.100541f,0.907805f,0.407163f, +-0.126416f,0.965258f,0.228683f, +-0.211306f,0.949302f,0.232755f, +-0.037039f,0.912463f,0.40748f, +0.117233f,0.908378f,0.401379f, +0.101997f,0.928038f,0.35825f, +-0.0502775f,0.939056f,0.340069f, +-0.158243f,0.952358f,0.260718f, +-0.125329f,0.958222f,0.257106f, +-0.051336f,0.956723f,0.286436f, +-0.0625203f,0.954305f,0.29222f, +-0.207996f,0.932703f,0.294623f, +-0.319481f,0.91161f,0.258649f, +-0.495077f,0.865137f,0.0802322f, +-0.579132f,0.814857f,-0.0247929f, +-0.549115f,0.83292f,-0.0686783f, +-0.493373f,0.86244f,-0.113053f, +-0.402759f,0.911225f,-0.0863345f, +-0.292096f,0.955556f,-0.0399004f, +-0.382523f,0.923047f,-0.0407488f, +-0.572187f,0.816414f,-0.0779103f, +-0.512485f,0.857517f,-0.0449819f, +-0.420369f,0.906318f,-0.0433336f, +-0.419207f,0.879291f,-0.22608f, +-0.129012f,0.980121f,-0.150729f, +0.168538f,0.98409f,0.056222f, +0.177285f,0.97778f,0.111881f, +0.0313595f,0.998166f,-0.0517722f, +0.266622f,0.963684f,-0.0150476f, +0.566513f,0.817464f,0.103999f, +0.539244f,0.841888f,0.0209898f, +0.503392f,0.861782f,0.0626771f, +0.548011f,0.825978f,0.132075f, +0.53464f,0.817691f,0.213407f, +0.52656f,0.822061f,0.21668f, +0.418461f,0.898681f,0.131391f, +0.217077f,0.97168f,0.0933593f, +0.230073f,0.97316f,0.00512693f, +0.352039f,0.933499f,-0.0681773f, +0.427612f,0.891089f,-0.152014f, +0.47402f,0.877861f,-0.0682997f, +0.292505f,0.956178f,-0.0128375f, +0.212998f,0.971167f,-0.107084f, +0.394409f,0.913171f,-0.102761f, +0.229015f,0.973422f,0.000912976f, +-0.0760893f,0.988509f,-0.130618f, +-0.0515625f,0.984716f,-0.166362f, +-0.0928406f,0.987408f,-0.128086f, +-0.200115f,0.967117f,0.156969f, +-0.29324f,0.941681f,0.165066f, +-0.336305f,0.919935f,0.201539f, +-0.298108f,0.921775f,0.247915f, +-0.262609f,0.920325f,0.289892f, +-0.146209f,0.952657f,0.266586f, +-0.00778438f,0.956339f,0.292158f, +-0.050022f,0.92665f,0.372583f, +-0.258705f,0.916977f,0.303687f, +-0.247478f,0.923305f,0.293706f, +-0.126717f,0.938107f,0.322331f, +0.0303988f,0.946862f,0.320201f, +0.135735f,0.944675f,0.298606f, +0.25669f,0.889672f,0.377616f, +0.215508f,0.868916f,0.44558f, +0.117717f,0.868155f,0.482129f, +0.172493f,0.853951f,0.490931f, +0.0744588f,0.909987f,0.407897f, +-0.203499f,0.942765f,0.264163f, +-0.165852f,0.956441f,0.240237f, +0.150303f,0.946565f,0.285349f, +0.126121f,0.955231f,0.267632f, +0.00383767f,0.957166f,0.289515f, +-0.0803601f,0.965694f,0.246937f, +-0.14415f,0.963474f,0.225698f, +-0.128772f,0.964294f,0.231421f, +-0.0634991f,0.964707f,0.255554f, +-0.15178f,0.96554f,0.211412f, +-0.290877f,0.950446f,0.109737f, +-0.365587f,0.928197f,0.069257f, +-0.512709f,0.855901f,-0.0675528f, +-0.522587f,0.843414f,-0.12472f, +-0.519355f,0.843468f,-0.13723f, +-0.458617f,0.886978f,-0.054221f, +-0.335795f,0.941914f,0.00633015f, +-0.354719f,0.934449f,0.0312872f, +-0.552854f,0.83289f,-0.025441f, +-0.550469f,0.834453f,-0.0259307f, +-0.388185f,0.921529f,-0.00983026f, +-0.282899f,0.957493f,-0.056358f, +-0.256814f,0.955751f,-0.143483f, +-0.0731312f,0.996697f,-0.0353254f, +0.211397f,0.967055f,0.141832f, +0.27554f,0.960583f,0.0368595f, +0.217196f,0.959783f,-0.177882f, +0.479261f,0.875236f,-0.0653524f, +0.513664f,0.856169f,0.0558883f, +0.446145f,0.882397f,0.149434f, +0.498219f,0.84712f,0.184837f, +0.503236f,0.827823f,0.247916f, +0.51285f,0.815024f,0.269666f, +0.506381f,0.824734f,0.251778f, +0.333663f,0.940706f,0.0611746f, +0.353215f,0.932965f,-0.069389f, +0.414309f,0.904024f,-0.105298f, +0.451897f,0.886486f,-0.0996557f, +0.345824f,0.933767f,-0.0921138f, +0.280994f,0.95917f,0.0321915f, +0.317081f,0.945948f,0.0681282f, +0.344866f,0.938141f,0.0309596f, +0.224406f,0.974203f,0.0238892f, +-0.0108486f,0.995761f,-0.0913323f, +-0.00158176f,0.998953f,-0.0457292f, +-0.115676f,0.985559f,-0.123663f, +-0.188171f,0.911466f,0.365816f, +-0.262724f,0.896783f,0.356029f, +-0.358149f,0.883197f,0.302807f, +-0.323424f,0.894918f,0.307438f, +-0.242922f,0.924564f,0.293548f, +-0.121147f,0.94907f,0.290844f, +-0.0341414f,0.951299f,0.306374f, +-0.132493f,0.945016f,0.298983f, +-0.194216f,0.905093f,0.378268f, +-0.212944f,0.914784f,0.343257f, +-0.127802f,0.956235f,0.263215f, +0.0483659f,0.968777f,0.243172f, +0.117573f,0.942608f,0.312517f, +0.164225f,0.89741f,0.409494f, +0.122313f,0.88201f,0.455081f, +0.101965f,0.875392f,0.472537f, +0.209339f,0.879095f,0.428217f, +0.174899f,0.892224f,0.416349f, +-0.060088f,0.941634f,0.331231f, +-0.120508f,0.975773f,0.182606f, +0.112168f,0.972734f,0.202994f, +0.117253f,0.950933f,0.286318f, +-0.0544328f,0.941394f,0.332887f, +-0.0790068f,0.915303f,0.394942f, +-0.127609f,0.917525f,0.376648f, +-0.0756868f,0.941409f,0.328666f, +-0.0332439f,0.958716f,0.282415f, +-0.0735168f,0.965505f,0.249792f, +-0.203882f,0.964791f,0.166163f, +-0.320453f,0.94269f,0.0929826f, +-0.471247f,0.881185f,0.0379224f, +-0.492278f,0.869051f,0.0491152f, +-0.532259f,0.846256f,-0.0234739f, +-0.499446f,0.866138f,-0.0189645f, +-0.373407f,0.92679f,-0.0403466f, +-0.352534f,0.935772f,-0.00715155f, +-0.527726f,0.848793f,-0.0324855f, +-0.520812f,0.852354f,-0.0474108f, +-0.409147f,0.909436f,-0.0743255f, +-0.294722f,0.955583f,0.000817458f, +-0.222255f,0.974321f,0.0360744f, +-0.14278f,0.989739f,0.00545783f, +0.112175f,0.992761f,0.0429195f, +0.349968f,0.931754f,0.0967357f, +0.338116f,0.939385f,0.056869f, +0.379594f,0.923814f,0.0497667f, +0.434257f,0.879279f,0.195674f, +0.391146f,0.89525f,0.213383f, +0.465582f,0.860371f,0.207352f, +0.429826f,0.860017f,0.274991f, +0.465148f,0.815034f,0.34548f, +0.575943f,0.73808f,0.351465f, +0.535537f,0.824709f,0.181813f, +0.414278f,0.908562f,-0.0537569f, +0.380258f,0.913027f,-0.147599f, +0.408447f,0.90132f,-0.144197f, +0.367806f,0.925659f,-0.0887431f, +0.142987f,0.986995f,-0.073455f, +0.215691f,0.972786f,0.0846483f, +0.373384f,0.916381f,0.144331f, +0.381582f,0.918997f,0.0991966f, +0.0727073f,0.993287f,-0.0899678f, +-0.0658262f,0.992454f,-0.103446f, +0.0138596f,0.999564f,-0.0260736f, +-0.215981f,0.852322f,0.47634f, +-0.206677f,0.845053f,0.493123f, +-0.272991f,0.879681f,0.389406f, +-0.267376f,0.924267f,0.272471f, +-0.22026f,0.956955f,0.189003f, +-0.175208f,0.966589f,0.187106f, +-0.043064f,0.959071f,0.279872f, +-0.116589f,0.955061f,0.272519f, +-0.310776f,0.922421f,0.229257f, +-0.169995f,0.929299f,0.32788f, +-0.0175005f,0.941141f,0.337561f, +0.0138751f,0.95035f,0.310874f, +-0.0519487f,0.924056f,0.37871f, +0.0171204f,0.875115f,0.483613f, +0.148666f,0.835016f,0.529761f, +0.187668f,0.864969f,0.465412f, +0.241037f,0.89408f,0.377521f, +0.22255f,0.900707f,0.373093f, +0.0517034f,0.945752f,0.320749f, +-0.0271248f,0.957046f,0.288665f, +0.0325916f,0.970401f,0.239289f, +0.0171507f,0.960836f,0.276588f, +-0.143534f,0.9275f,0.345169f, +-0.0983366f,0.916766f,0.38713f, +-0.0476997f,0.944806f,0.32414f, +-0.0337303f,0.946895f,0.319767f, +-0.0100366f,0.942379f,0.334396f, +-0.0544901f,0.938102f,0.342046f, +-0.14598f,0.916868f,0.371541f, +-0.23743f,0.904478f,0.354324f, +-0.411826f,0.87795f,0.244136f, +-0.481531f,0.866693f,0.130273f, +-0.469337f,0.874903f,0.119446f, +-0.452816f,0.890509f,0.0441746f, +-0.332275f,0.942324f,-0.0402274f, +-0.391441f,0.91825f,-0.0599172f, +-0.492183f,0.870395f,0.0129854f, +-0.540952f,0.839903f,-0.0439814f, +-0.452633f,0.891182f,0.0302916f, +-0.353037f,0.931758f,0.0848037f, +-0.230998f,0.971043f,0.0609518f, +-0.110559f,0.993184f,0.0368984f, +0.0985994f,0.994896f,-0.0214387f, +0.290703f,0.956813f,-0.000841556f, +0.306742f,0.941069f,0.142471f, +0.309512f,0.928678f,0.20435f, +0.393276f,0.890035f,0.23059f, +0.472781f,0.864565f,0.170309f, +0.455511f,0.888755f,0.0512287f, +0.387199f,0.912459f,0.13227f, +0.420125f,0.891345f,0.170293f, +0.568557f,0.791084f,0.225676f, +0.642678f,0.725845f,0.245181f, +0.61301f,0.785525f,0.0846683f, +0.519083f,0.833826f,-0.187849f, +0.390386f,0.832025f,-0.394123f, +0.254733f,0.897839f,-0.359161f, +0.0968538f,0.955535f,-0.278518f, +0.110338f,0.951183f,-0.288231f, +0.337547f,0.917961f,-0.20835f, +0.382401f,0.916771f,-0.115327f, +0.232755f,0.967238f,-0.101374f, +-0.075544f,0.963631f,-0.256338f, +-0.111861f,0.963998f,-0.241238f, +-0.403631f,0.823611f,0.398431f, +-0.211285f,0.853176f,0.476917f, +-0.0996818f,0.887327f,0.450237f, +-0.119017f,0.926423f,0.357178f, +-0.147962f,0.959424f,0.240027f, +-0.17904f,0.969453f,0.167646f, +-0.182698f,0.967757f,0.173402f, +-0.0875162f,0.935774f,0.341566f, +-0.247354f,0.926662f,0.283043f, +-0.269706f,0.932828f,0.238937f, +-0.116046f,0.932011f,0.34335f, +-0.054572f,0.895119f,0.442474f, +-0.0702883f,0.870311f,0.487462f, +-0.0238769f,0.872685f,0.4877f, +0.145141f,0.847062f,0.511292f, +0.26226f,0.839585f,0.475728f, +0.307436f,0.859155f,0.409067f, +0.272452f,0.896089f,0.35042f, +0.0602872f,0.949936f,0.306572f, +-0.0269541f,0.950357f,0.309992f, +0.110161f,0.964193f,0.241239f, +0.0112822f,0.980274f,0.19732f, +-0.201697f,0.957263f,0.207282f, +-0.0780713f,0.964435f,0.252529f, +0.00973745f,0.973101f,0.230172f, +-0.0755968f,0.981149f,0.177855f, +-0.0876613f,0.97114f,0.221817f, +-0.111729f,0.927016f,0.357991f, +-0.221124f,0.882386f,0.41533f, +-0.204491f,0.867297f,0.45385f, +-0.238609f,0.89578f,0.375026f, +-0.38933f,0.904206f,0.175592f, +-0.447525f,0.889442f,0.0928077f, +-0.421271f,0.9063f,0.0339399f, +-0.295839f,0.951557f,0.0837779f, +-0.40469f,0.90695f,0.116906f, +-0.500893f,0.852054f,0.152018f, +-0.539765f,0.838827f,0.0708671f, +-0.497421f,0.864837f,0.068037f, +-0.338953f,0.937284f,0.0813017f, +-0.178116f,0.975677f,0.127782f, +-0.0428295f,0.992057f,0.118272f, +0.176596f,0.983706f,0.0336999f, +0.217356f,0.975284f,-0.0397137f, +0.172156f,0.984981f,0.0131952f, +0.279801f,0.958586f,0.0531518f, +0.429228f,0.901897f,0.0484305f, +0.537427f,0.843269f,0.00840869f, +0.461159f,0.886671f,-0.0338697f, +0.347666f,0.937337f,0.022966f, +0.390524f,0.920568f,0.00669632f, +0.544615f,0.837115f,0.0513162f, +0.64737f,0.75903f,0.0691749f, +0.709483f,0.698136f,0.0961199f, +0.69002f,0.723355f,-0.0250988f, +0.510759f,0.819636f,-0.259464f, +0.161066f,0.87948f,-0.447854f, +0.0742832f,0.901252f,-0.426881f, +0.164688f,0.896506f,-0.411284f, +0.211827f,0.873436f,-0.43845f, +0.238498f,0.898773f,-0.367868f, +0.244991f,0.941894f,-0.229815f, +0.0339169f,0.959887f,-0.278328f, +-0.150927f,0.928909f,-0.338156f, +-0.262269f,0.839002f,0.47675f, +-0.199453f,0.89484f,0.39935f, +-0.0695117f,0.920513f,0.384478f, +-0.0794509f,0.922822f,0.376943f, +-0.0384813f,0.923599f,0.381424f, +-0.0906334f,0.946866f,0.308593f, +-0.231342f,0.940055f,0.250554f, +-0.228342f,0.910605f,0.344468f, +-0.168052f,0.897027f,0.408779f, +-0.249241f,0.920512f,0.300892f, +-0.201125f,0.932701f,0.29936f, +-0.156169f,0.918655f,0.362882f, +-0.101964f,0.881359f,0.461314f, +-0.0479674f,0.88379f,0.465418f, +0.160937f,0.878499f,0.449821f, +0.298148f,0.878819f,0.372539f, +0.363972f,0.843945f,0.394059f, +0.330687f,0.867316f,0.372033f, +0.109951f,0.941418f,0.318814f, +0.0530775f,0.967978f,0.245361f, +0.171035f,0.972595f,0.157499f, +0.0211384f,0.985036f,0.171048f, +-0.223743f,0.958122f,0.178723f, +-0.143003f,0.966115f,0.214875f, +0.0335442f,0.969798f,0.24159f, +0.00108957f,0.977785f,0.209606f, +-0.185748f,0.96522f,0.183978f, +-0.245345f,0.928456f,0.278881f, +-0.278935f,0.920412f,0.273928f, +-0.227379f,0.922009f,0.313367f, +-0.127558f,0.911679f,0.390603f, +-0.252363f,0.916101f,0.311563f, +-0.353299f,0.912723f,0.205222f, +-0.418007f,0.90407f,0.089031f, +-0.400603f,0.906481f,0.133452f, +-0.448512f,0.870078f,0.204452f, +-0.467166f,0.869433f,0.160757f, +-0.442544f,0.892618f,0.0859534f, +-0.465336f,0.885122f,-0.00451183f, +-0.389888f,0.920791f,0.0114409f, +-0.26105f,0.96208f,0.079086f, +-0.0611649f,0.990413f,0.123862f, +0.218817f,0.959555f,0.177126f, +0.289447f,0.944291f,0.156638f, +0.238555f,0.970242f,0.0415028f, +0.303951f,0.946528f,-0.108164f, +0.431424f,0.894504f,-0.117199f, +0.527248f,0.845956f,-0.0797999f, +0.433918f,0.900916f,0.0081213f, +0.311993f,0.948885f,0.0477355f, +0.430547f,0.901487f,0.0441572f, +0.533619f,0.845624f,-0.013065f, +0.634808f,0.772557f,-0.013228f, +0.691864f,0.721963f,0.00965866f, +0.719067f,0.694383f,0.0278453f, +0.653183f,0.756562f,0.0310991f, +0.386363f,0.918778f,-0.0810638f, +0.0570874f,0.970389f,-0.234704f, +0.136394f,0.961794f,-0.237379f, +0.31236f,0.906525f,-0.283977f, +0.169471f,0.890916f,-0.421365f, +0.117142f,0.913195f,-0.390323f, +0.0777866f,0.931625f,-0.354998f, +-0.0437682f,0.92941f,-0.366443f, +-0.144429f,0.859889f,0.489623f, +-0.0880742f,0.890372f,0.446633f, +-0.0314378f,0.923882f,0.381384f, +-0.0838814f,0.944139f,0.318693f, +-0.0693885f,0.945887f,0.316991f, +-0.0723769f,0.923178f,0.377496f, +-0.19706f,0.892458f,0.405815f, +-0.297386f,0.892332f,0.339566f, +-0.156962f,0.91638f,0.368254f, +-0.15276f,0.919794f,0.361447f, +-0.17017f,0.922781f,0.345714f, +-0.253151f,0.920843f,0.296586f, +-0.189094f,0.905109f,0.380816f, +0.00126887f,0.929197f,0.369582f, +0.193396f,0.936415f,0.292787f, +0.338227f,0.878943f,0.336247f, +0.32269f,0.878938f,0.351198f, +0.355444f,0.867037f,0.34915f, +0.217316f,0.918786f,0.329554f, +0.123007f,0.956146f,0.265807f, +0.19987f,0.950731f,0.236986f, +0.0209731f,0.979076f,0.202411f, +-0.247784f,0.961065f,0.122302f, +-0.158935f,0.979718f,0.122036f, +0.0602949f,0.986043f,0.155188f, +-0.0308065f,0.985867f,0.164674f, +-0.185866f,0.954971f,0.231267f, +-0.272851f,0.942767f,0.191682f, +-0.226832f,0.938998f,0.258516f, +-0.311155f,0.923351f,0.224958f, +-0.264965f,0.917378f,0.297004f, +-0.186536f,0.890461f,0.41507f, +-0.257136f,0.895376f,0.363569f, +-0.330368f,0.897563f,0.291955f, +-0.415623f,0.888172f,0.19598f, +-0.414839f,0.89462f,0.166025f, +-0.429244f,0.901932f,0.0476213f, +-0.370358f,0.92848f,0.0275516f, +-0.456696f,0.886215f,-0.0777874f, +-0.424934f,0.901633f,-0.0805556f, +-0.26755f,0.960865f,-0.0718042f, +-0.0958709f,0.992595f,-0.0745981f, +0.0853594f,0.996177f,0.0185983f, +0.317006f,0.925486f,0.207323f, +0.362438f,0.919121f,0.154455f, +0.423147f,0.903697f,0.0654098f, +0.439077f,0.898135f,-0.0237805f, +0.463592f,0.885685f,-0.0253961f, +0.432904f,0.900567f,0.0396714f, +0.274262f,0.960561f,-0.0458644f, +0.460874f,0.887433f,0.00757752f, +0.557878f,0.824691f,-0.0930446f, +0.608392f,0.791916f,-0.0522232f, +0.68605f,0.722282f,0.0874302f, +0.697187f,0.705867f,0.125228f, +0.597474f,0.77589f,0.202532f, +0.400677f,0.868028f,0.293233f, +0.18602f,0.951589f,0.244694f, +0.190924f,0.979879f,0.0581851f, +0.431268f,0.902043f,-0.01807f, +0.329374f,0.934061f,-0.137997f, +0.144406f,0.935772f,-0.321679f, +0.0779514f,0.92222f,-0.378727f, +-0.0417532f,0.914206f,-0.403093f, +-0.201619f,0.929423f,0.309066f, +-0.0738258f,0.948242f,0.308847f, +0.0288118f,0.952024f,0.304665f, +-0.00526808f,0.951397f,0.307922f, +-0.0992485f,0.952014f,0.289515f, +-0.179425f,0.914994f,0.361376f, +-0.223397f,0.866943f,0.445538f, +-0.185005f,0.868122f,0.460584f, +-0.180405f,0.90051f,0.395646f, +-0.165976f,0.891215f,0.422122f, +-0.142635f,0.91411f,0.37955f, +-0.196593f,0.942079f,0.271733f, +-0.231892f,0.955708f,0.181242f, +0.0754625f,0.968764f,0.236224f, +0.189929f,0.95814f,0.214232f, +0.245783f,0.922809f,0.29667f, +0.350212f,0.885135f,0.30641f, +0.361791f,0.894635f,0.262174f, +0.218601f,0.892888f,0.393656f, +0.122578f,0.888731f,0.441737f, +0.221602f,0.877963f,0.42435f, +0.113111f,0.927784f,0.355561f, +-0.0962286f,0.967788f,0.232652f, +-0.169743f,0.984124f,0.0518298f, +0.00440837f,0.997134f,0.0755295f, +-0.0780505f,0.992255f,0.096638f, +-0.206915f,0.971074f,0.119173f, +-0.298261f,0.946469f,0.123437f, +-0.365054f,0.904843f,0.219077f, +-0.255666f,0.897337f,0.35975f, +-0.290965f,0.914197f,0.282104f, +-0.292271f,0.916518f,0.27308f, +-0.219619f,0.919339f,0.326472f, +-0.256286f,0.928086f,0.270137f, +-0.310598f,0.93305f,0.18151f, +-0.350728f,0.934452f,0.0615507f, +-0.388138f,0.92156f,0.00876308f, +-0.343471f,0.93847f,0.0360903f, +-0.339947f,0.939272f,-0.0469463f, +-0.382902f,0.903055f,-0.19462f, +-0.249239f,0.929446f,-0.272047f, +-0.147764f,0.944907f,-0.29209f, +-0.0668186f,0.978447f,-0.19539f, +0.17553f,0.981686f,-0.0740426f, +0.388973f,0.921211f,-0.00833323f, +0.44678f,0.894539f,-0.0136777f, +0.47739f,0.878112f,-0.0318964f, +0.465567f,0.884409f,-0.0326842f, +0.484387f,0.873859f,-0.0417148f, +0.315003f,0.932104f,-0.178762f, +0.426472f,0.898104f,-0.107381f, +0.587094f,0.80929f,-0.0192587f, +0.491946f,0.869904f,0.0354452f, +0.550379f,0.808299f,0.209131f, +0.597166f,0.706874f,0.379107f, +0.503286f,0.706664f,0.497322f, +0.349603f,0.761935f,0.545191f, +0.317931f,0.791281f,0.522298f, +0.357034f,0.859818f,0.365021f, +0.457671f,0.859336f,0.22821f, +0.436038f,0.880267f,0.187085f, +0.291237f,0.949467f,0.117016f, +0.172846f,0.983353f,0.0560389f, +0.00924155f,0.999014f,-0.043417f, +-0.112379f,0.966854f,0.22927f, +-0.0543436f,0.980353f,0.189616f, +0.0014105f,0.977032f,0.213089f, +-0.0810261f,0.954455f,0.287143f, +-0.162384f,0.905883f,0.391161f, +-0.248623f,0.850337f,0.463803f, +-0.272281f,0.829594f,0.48748f, +-0.210534f,0.842738f,0.495447f, +-0.142516f,0.845822f,0.514076f, +-0.128959f,0.864859f,0.485168f, +-0.000520612f,0.895905f,0.444245f, +0.00320439f,0.940529f,0.339698f, +-0.169376f,0.979765f,0.106637f, +-0.0517963f,0.994886f,0.0867084f, +0.124214f,0.955178f,0.268711f, +0.208945f,0.916166f,0.342027f, +0.39407f,0.858275f,0.328745f, +0.248342f,0.913565f,0.322063f, +0.031165f,0.861455f,0.506877f, +0.0654094f,0.812115f,0.57982f, +0.246891f,0.786687f,0.565834f, +0.230643f,0.834381f,0.500612f, +0.069509f,0.924157f,0.375637f, +0.0080049f,0.977951f,0.208681f, +-0.0216545f,0.998818f,0.043521f, +-0.0416834f,0.994806f,0.0928633f, +-0.209164f,0.977378f,0.0313447f, +-0.33727f,0.941399f,0.00405643f, +-0.445763f,0.895148f,-0.00236945f, +-0.379089f,0.924127f,0.0477591f, +-0.212534f,0.958583f,0.189598f, +-0.289703f,0.944216f,0.156615f, +-0.225857f,0.954875f,0.19288f, +-0.19812f,0.968114f,0.153308f, +-0.225491f,0.970896f,0.0807165f, +-0.268028f,0.963292f,-0.0151842f, +-0.386115f,0.917249f,-0.0978197f, +-0.332792f,0.935954f,-0.115065f, +-0.223332f,0.957817f,-0.180856f, +-0.272615f,0.913397f,-0.302304f, +-0.182015f,0.92061f,-0.345468f, +-0.156497f,0.91949f,-0.36062f, +-0.125465f,0.931751f,-0.340733f, +0.1054f,0.935905f,-0.336114f, +0.348771f,0.906917f,-0.236346f, +0.444797f,0.880373f,-0.164617f, +0.451025f,0.885434f,-0.112171f, +0.467976f,0.880983f,-0.0697667f, +0.499335f,0.858868f,-0.114062f, +0.349601f,0.930335f,-0.110707f, +0.307802f,0.944888f,-0.11156f, +0.473394f,0.878106f,0.0694821f, +0.43441f,0.869457f,0.23523f, +0.41901f,0.855868f,0.303184f, +0.452664f,0.775597f,0.439937f, +0.432369f,0.72522f,0.535829f, +0.415514f,0.737038f,0.533032f, +0.381011f,0.793693f,0.474217f, +0.445314f,0.773558f,0.450892f, +0.520117f,0.767192f,0.375359f, +0.457464f,0.838846f,0.295064f, +0.276432f,0.924946f,0.260884f, +0.199394f,0.937964f,0.283664f, +0.190897f,0.927436f,0.32159f, +-0.0705492f,0.959049f,0.274315f, +-0.0655623f,0.961527f,0.266772f, +-0.0518964f,0.943387f,0.32761f, +-0.202287f,0.906319f,0.371032f, +-0.245861f,0.842829f,0.478739f, +-0.310342f,0.836362f,0.451869f, +-0.256381f,0.850522f,0.459219f, +-0.198762f,0.867072f,0.456815f, +-0.12379f,0.863897f,0.48822f, +-0.0469651f,0.900623f,0.432056f, +-8.11553e-005f,0.943721f,0.330744f, +0.129628f,0.925055f,0.357028f, +0.0340614f,0.966037f,0.256151f, +-0.0890995f,0.983963f,0.154524f, +-0.0322587f,0.981394f,0.189278f, +0.138447f,0.956229f,0.257794f, +0.317932f,0.883665f,0.343592f, +0.154174f,0.859961f,0.486516f, +-0.0823702f,0.837125f,0.540774f, +0.067942f,0.838652f,0.540413f, +0.256779f,0.806501f,0.532561f, +0.317316f,0.771073f,0.552047f, +0.228943f,0.837474f,0.496208f, +0.221417f,0.908583f,0.354192f, +0.0661321f,0.986936f,0.146917f, +-0.101631f,0.981129f,0.164493f, +-0.140334f,0.967949f,0.20828f, +-0.26644f,0.954208f,0.136f, +-0.376833f,0.92539f,0.0406146f, +-0.423125f,0.902479f,-0.0805992f, +-0.378547f,0.924929f,-0.0347556f, +-0.294214f,0.950388f,0.101004f, +-0.253707f,0.966868f,0.0282789f, +-0.1425f,0.989661f,0.0162607f, +-0.152778f,0.987285f,-0.0438961f, +-0.226417f,0.971142f,-0.0749508f, +-0.278106f,0.959626f,-0.0421373f, +-0.315252f,0.936348f,-0.154492f, +-0.13807f,0.983353f,-0.118124f, +-0.169891f,0.968928f,-0.179762f, +-0.200272f,0.947942f,-0.247583f, +-0.182846f,0.93983f,-0.288594f, +-0.0836086f,0.941177f,-0.327408f, +0.0732417f,0.918516f,-0.388542f, +0.208177f,0.929929f,-0.303139f, +0.350352f,0.926406f,-0.137933f, +0.401951f,0.914196f,-0.0517823f, +0.448456f,0.893661f,-0.0160636f, +0.515556f,0.856358f,0.0291996f, +0.347689f,0.937245f,0.0261378f, +0.255909f,0.965329f,0.0514824f, +0.382053f,0.909938f,0.161395f, +0.340926f,0.922929f,0.178808f, +0.312845f,0.910786f,0.269439f, +0.364196f,0.849776f,0.381106f, +0.45928f,0.814969f,0.353394f, +0.52951f,0.800019f,0.282116f, +0.449914f,0.855375f,0.256731f, +0.454599f,0.838858f,0.299428f, +0.555327f,0.766362f,0.322957f, +0.54417f,0.781393f,0.305455f, +0.357615f,0.911759f,0.202005f, +0.139813f,0.972952f,0.183891f, +0.109083f,0.950848f,0.289808f, +-0.192892f,0.944314f,0.266579f, +-0.117537f,0.919218f,0.375796f, +-0.132138f,0.875254f,0.465263f, +-0.253971f,0.812679f,0.524453f, +-0.263136f,0.777105f,0.571723f, +-0.18663f,0.797568f,0.573633f, +-0.239071f,0.855961f,0.458449f, +-0.228946f,0.872463f,0.431732f, +-0.154745f,0.876861f,0.455159f, +0.0511929f,0.876307f,0.479025f, +0.079622f,0.902874f,0.422468f, +0.0999946f,0.903351f,0.417083f, +0.103272f,0.908778f,0.404299f, +-0.0300958f,0.943633f,0.329622f, +-0.0276233f,0.954592f,0.296632f, +0.0865379f,0.944508f,0.316884f, +0.19572f,0.915809f,0.350694f, +0.0629871f,0.902785f,0.425456f, +-0.0973105f,0.893058f,0.439293f, +0.0850344f,0.884912f,0.45793f, +0.226219f,0.859273f,0.458775f, +0.265876f,0.822998f,0.50198f, +0.299522f,0.800365f,0.519329f, +0.365936f,0.804413f,0.467986f, +0.167843f,0.908094f,0.383659f, +-0.151292f,0.923022f,0.353753f, +-0.16349f,0.897488f,0.409618f, +-0.164454f,0.89713f,0.410016f, +-0.256833f,0.931773f,0.256583f, +-0.308509f,0.944441f,0.11337f, +-0.397192f,0.916896f,-0.0392391f, +-0.321804f,0.945652f,-0.046751f, +-0.145617f,0.989197f,-0.0168656f, +-0.117605f,0.989571f,-0.083174f, +-0.131213f,0.988938f,-0.0691672f, +-0.264465f,0.964357f,-0.00857016f, +-0.279285f,0.95849f,0.0574115f, +-0.308064f,0.950873f,-0.0306128f, +-0.232189f,0.97071f,0.0617333f, +-0.126956f,0.977263f,0.169823f, +-0.134913f,0.981643f,0.134817f, +-0.0643092f,0.996192f,0.0588766f, +-0.0179518f,0.989177f,-0.145623f, +0.100718f,0.978365f,-0.180716f, +0.107842f,0.981772f,-0.156502f, +0.235537f,0.96668f,-0.100264f, +0.400696f,0.915349f,-0.0397433f, +0.382123f,0.921514f,-0.0692327f, +0.451191f,0.890657f,0.0561954f, +0.368356f,0.915308f,0.162865f, +0.16123f,0.974745f,0.154523f, +0.326647f,0.914341f,0.239337f, +0.365189f,0.91282f,0.182749f, +0.230086f,0.959458f,0.162792f, +0.336546f,0.918886f,0.205876f, +0.545838f,0.824177f,0.150977f, +0.544526f,0.829407f,0.124801f, +0.442013f,0.862414f,0.24671f, +0.417167f,0.87901f,0.230894f, +0.525918f,0.823184f,0.213956f, +0.591278f,0.763502f,0.259719f, +0.412761f,0.877728f,0.243355f, +0.079495f,0.961838f,0.261818f, +-0.108191f,0.959339f,0.260698f, +-0.395968f,0.898347f,0.190215f, +-0.315805f,0.885393f,0.341095f, +-0.255081f,0.831656f,0.493236f, +-0.32798f,0.786298f,0.523607f, +-0.31899f,0.766541f,0.557369f, +-0.160414f,0.763167f,0.625974f, +-0.0711111f,0.771377f,0.632393f, +-0.143173f,0.825852f,0.545409f, +-0.172278f,0.854223f,0.490534f, +0.0123154f,0.838365f,0.544971f, +0.0830743f,0.830631f,0.550592f, +0.0507686f,0.835031f,0.547855f, +0.149519f,0.800804f,0.579962f, +0.0893025f,0.847618f,0.523038f, +-0.0238205f,0.893087f,0.449253f, +0.0209713f,0.900623f,0.434095f, +0.182588f,0.867377f,0.462945f, +0.0933756f,0.88802f,0.450223f, +-0.0988317f,0.917919f,0.384262f, +0.0323919f,0.922001f,0.38583f, +0.205498f,0.882674f,0.422678f, +0.228981f,0.875897f,0.424702f, +0.330967f,0.833446f,0.442526f, +0.386545f,0.82285f,0.416534f, +0.244254f,0.85459f,0.458275f, +-0.128515f,0.915454f,0.381351f, +-0.221592f,0.919582f,0.324447f, +-0.103305f,0.941351f,0.321226f, +-0.0534104f,0.960954f,0.271504f, +-0.164863f,0.980806f,0.104112f, +-0.239884f,0.970598f,-0.0198681f, +-0.303213f,0.937604f,-0.170178f, +-0.252015f,0.951441f,-0.176773f, +-0.108694f,0.994072f,0.00232095f, +-0.192935f,0.981013f,0.0197642f, +-0.322908f,0.946132f,0.0237552f, +-0.269028f,0.963107f,-0.00704542f, +-0.230013f,0.973161f,0.00722315f, +-0.357365f,0.933662f,-0.0237822f, +-0.204315f,0.973479f,0.102922f, +-0.115797f,0.983778f,0.137007f, +0.0200406f,0.991033f,0.132107f, +0.176509f,0.981212f,0.0778953f, +0.102914f,0.991977f,-0.0734239f, +0.103634f,0.990563f,-0.0896973f, +0.246302f,0.962545f,-0.113327f, +0.365449f,0.921945f,-0.12831f, +0.388572f,0.919102f,-0.0652967f, +0.33675f,0.940592f,-0.0434361f, +0.294334f,0.951251f,0.0921318f, +0.170376f,0.973956f,0.149605f, +0.291052f,0.946977f,0.136102f, +0.448607f,0.879963f,0.156258f, +0.275208f,0.960522f,0.0407201f, +0.320727f,0.94717f,-0.00171267f, +0.563867f,0.822582f,0.0735748f, +0.458264f,0.882692f,0.104155f, +0.35932f,0.917336f,0.171414f, +0.473577f,0.85831f,0.197555f, +0.552768f,0.818756f,0.155195f, +0.56022f,0.811568f,0.165865f, +0.410483f,0.877955f,0.246373f, +0.119318f,0.965792f,0.230239f, +-0.0302464f,0.98755f,0.15437f, +-0.434902f,0.821345f,0.369123f, +-0.425801f,0.804682f,0.41374f, +-0.330648f,0.807018f,0.489278f, +-0.341863f,0.793213f,0.503928f, +-0.356504f,0.786512f,0.504286f, +-0.269874f,0.813284f,0.515498f, +-0.0937663f,0.786137f,0.610898f, +-0.0122488f,0.782782f,0.622176f, +-0.145176f,0.838097f,0.525849f, +-0.0659853f,0.863648f,0.499758f, +0.0911511f,0.81559f,0.571406f, +0.0567409f,0.801208f,0.59569f, +0.110855f,0.801019f,0.588286f, +0.153854f,0.799367f,0.580811f, +0.0810561f,0.837494f,0.540401f, +0.0627084f,0.873537f,0.482702f, +0.153028f,0.87118f,0.466506f, +0.121758f,0.869515f,0.478663f, +-0.0139367f,0.889364f,0.456987f, +0.0116753f,0.909652f,0.415206f, +0.182976f,0.873078f,0.451946f, +0.230254f,0.874104f,0.427698f, +0.299542f,0.853577f,0.42624f, +0.365816f,0.815944f,0.447677f, +0.258135f,0.828321f,0.497243f, +0.0438733f,0.899999f,0.433678f, +-0.113551f,0.976415f,0.183628f, +-0.115165f,0.991964f,0.0523877f, +-0.0427249f,0.989973f,0.134639f, +-0.000526251f,0.987641f,0.156735f, +-0.182878f,0.982656f,-0.0306907f, +-0.187196f,0.982029f,-0.0240342f, +-0.272847f,0.956238f,-0.105656f, +-0.292658f,0.95046f,-0.104775f, +-0.178909f,0.983865f,0.00116467f, +-0.22078f,0.973898f,-0.0527095f, +-0.269354f,0.950491f,-0.154966f, +-0.262457f,0.956005f,-0.131038f, +-0.333574f,0.929233f,-0.158915f, +-0.27846f,0.93913f,-0.201231f, +-0.105722f,0.98028f,-0.166954f, +-0.03086f,0.983393f,-0.178845f, +0.166296f,0.985117f,-0.0434662f, +0.22991f,0.973119f,0.0134671f, +0.156605f,0.983722f,-0.0881293f, +0.276714f,0.94824f,-0.155787f, +0.32696f,0.929339f,-0.171541f, +0.339039f,0.938238f,-0.0690071f, +0.308789f,0.948131f,-0.0754727f, +0.23717f,0.967343f,-0.0894326f, +0.163558f,0.982662f,-0.0873214f, +0.252735f,0.966333f,-0.0482272f, +0.434287f,0.896865f,0.0838305f, +0.398093f,0.912104f,0.0979158f, +0.320154f,0.94669f,-0.0357668f, +0.45783f,0.889003f,0.00810452f, +0.504235f,0.85135f,0.144742f, +0.385352f,0.920157f,0.0693918f, +0.466232f,0.882239f,0.0654287f, +0.538345f,0.833943f,0.121343f, +0.517827f,0.838051f,0.171829f, +0.46128f,0.862173f,0.209471f, +0.229103f,0.969676f,0.085091f, +0.119821f,0.992172f,0.0351865f, +-0.316654f,0.75101f,0.579409f, +-0.356062f,0.779142f,0.515904f, +-0.357471f,0.814286f,0.457331f, +-0.357809f,0.798452f,0.484198f, +-0.344344f,0.806376f,0.480818f, +-0.279175f,0.813317f,0.510467f, +-0.188283f,0.817533f,0.544233f, +0.0108927f,0.825394f,0.564451f, +0.000505664f,0.854739f,0.519058f, +-0.0291193f,0.899152f,0.436667f, +-0.043893f,0.902469f,0.428513f, +-0.00142614f,0.854428f,0.519568f, +0.10644f,0.82426f,0.556117f, +0.17821f,0.772022f,0.610101f, +0.155558f,0.792656f,0.58949f, +0.103298f,0.851042f,0.514837f, +0.136998f,0.86222f,0.487656f, +0.128814f,0.846529f,0.516522f, +0.0086465f,0.861582f,0.507544f, +0.0126115f,0.865086f,0.501464f, +0.152876f,0.854998f,0.495588f, +0.261992f,0.846686f,0.463122f, +0.298132f,0.855648f,0.423065f, +0.330245f,0.846388f,0.417811f, +0.241868f,0.85891f,0.451412f, +0.243399f,0.870337f,0.428102f, +0.218863f,0.950296f,0.221442f, +-0.0230145f,0.994562f,-0.101567f, +-0.18143f,0.968994f,-0.167732f, +-0.00536077f,0.999859f,-0.0158957f, +-0.0149312f,0.999841f,-0.00972481f, +-0.248945f,0.961384f,-0.11733f, +-0.206226f,0.978121f,-0.0273758f, +-0.251569f,0.958037f,-0.137399f, +-0.215501f,0.957565f,-0.191386f, +-0.183194f,0.972176f,-0.145991f, +-0.242363f,0.956164f,-0.164351f, +-0.223675f,0.959477f,-0.171387f, +-0.263678f,0.929229f,-0.25886f, +-0.190809f,0.923444f,-0.332932f, +-0.125476f,0.902264f,-0.412524f, +-0.0800599f,0.931052f,-0.355994f, +0.00289679f,0.952892f,-0.303297f, +0.173027f,0.965415f,-0.195025f, +0.23552f,0.951626f,-0.197328f, +0.324166f,0.90746f,-0.26727f, +0.272213f,0.920502f,-0.280314f, +0.263103f,0.942676f,-0.205278f, +0.331376f,0.931643f,-0.1491f, +0.273621f,0.957062f,-0.0957296f, +0.174678f,0.976512f,-0.126141f, +0.162465f,0.97193f,-0.170168f, +0.285207f,0.956722f,-0.0577913f, +0.392887f,0.912166f,0.116586f, +0.413213f,0.901715f,0.127138f, +0.444428f,0.894805f,0.0425078f, +0.482399f,0.875952f,0.000225918f, +0.414394f,0.908379f,-0.0559034f, +0.421361f,0.906852f,-0.00856344f, +0.501069f,0.86151f,0.0820434f, +0.492896f,0.86226f,0.116453f, +0.497628f,0.854344f,0.149874f, +0.327901f,0.939568f,0.0984569f, +0.134608f,0.990256f,0.0356963f, +-0.115732f,0.781457f,0.613132f, +-0.224646f,0.82464f,0.519137f, +-0.330602f,0.837584f,0.434919f, +-0.37055f,0.826801f,0.423193f, +-0.389755f,0.836631f,0.38489f, +-0.35019f,0.83732f,0.419835f, +-0.192063f,0.866433f,0.460875f, +0.0577661f,0.893053f,0.446228f, +0.0715028f,0.909685f,0.409097f, +0.0355467f,0.937027f,0.347443f, +-0.0473295f,0.949618f,0.309815f, +-0.0714543f,0.946618f,0.31434f, +0.0109848f,0.930588f,0.365903f, +0.0306039f,0.876434f,0.480548f, +0.171338f,0.790427f,0.588106f, +0.228263f,0.773415f,0.591376f, +0.15062f,0.839076f,0.522748f, +0.0933237f,0.852392f,0.514508f, +0.0403687f,0.864191f,0.501542f, +0.0159293f,0.89067f,0.454371f, +0.162582f,0.873944f,0.458028f, +0.324998f,0.838057f,0.438219f, +0.361417f,0.861814f,0.355886f, +0.357364f,0.88789f,0.289727f, +0.288052f,0.920034f,0.265637f, +0.274707f,0.932706f,0.233657f, +0.415911f,0.867317f,0.273456f, +0.214502f,0.965967f,0.144559f, +-0.0739208f,0.997262f,-0.00212715f, +-0.130316f,0.972201f,-0.194533f, +0.00262571f,0.981048f,-0.193747f, +-0.190851f,0.93935f,-0.284951f, +-0.250649f,0.92646f,-0.280798f, +-0.16238f,0.957944f,-0.236595f, +-0.204897f,0.9457f,-0.252327f, +-0.246487f,0.945291f,-0.213705f, +-0.204741f,0.966747f,-0.153234f, +-0.173965f,0.952924f,-0.248341f, +-0.185492f,0.924696f,-0.332461f, +-0.120486f,0.929748f,-0.347926f, +-0.0981061f,0.932335f,-0.348033f, +-0.143961f,0.923839f,-0.354678f, +-0.0348514f,0.936175f,-0.349804f, +0.141193f,0.941481f,-0.306069f, +0.298926f,0.908144f,-0.293117f, +0.339558f,0.869399f,-0.35895f, +0.236934f,0.893673f,-0.381064f, +0.188986f,0.916304f,-0.353088f, +0.222126f,0.937284f,-0.268624f, +0.165461f,0.966952f,-0.193976f, +0.194618f,0.975642f,-0.101229f, +0.225585f,0.970105f,-0.0894815f, +0.18757f,0.970367f,-0.152331f, +0.271776f,0.9587f,-0.0838549f, +0.390134f,0.920749f,0.00399703f, +0.487191f,0.870564f,0.0690114f, +0.567845f,0.821826f,0.0464111f, +0.430596f,0.898843f,-0.0816633f, +0.345462f,0.936301f,-0.063213f, +0.439054f,0.898457f,0.0025505f, +0.485886f,0.873093f,0.040301f, +0.468523f,0.882438f,0.0422951f, +0.395695f,0.916215f,0.0630502f, +0.224264f,0.974198f,-0.0253916f, +-0.04074f,0.869731f,0.491842f, +-0.147521f,0.861626f,0.485632f, +-0.290306f,0.828918f,0.47814f, +-0.344291f,0.81826f,0.460342f, +-0.325822f,0.848235f,0.417537f, +-0.347006f,0.892025f,0.289618f, +-0.23289f,0.9484f,0.215175f, +0.0826503f,0.953848f,0.288692f, +0.0849803f,0.942357f,0.323639f, +0.0946367f,0.912864f,0.397143f, +0.0188563f,0.944615f,0.327637f, +-0.0844647f,0.976435f,0.198596f, +-0.0480441f,0.982086f,0.182207f, +-0.108246f,0.969423f,0.220233f, +0.0163534f,0.944153f,0.329102f, +0.218936f,0.864112f,0.453186f, +0.243602f,0.846524f,0.473344f, +0.157715f,0.898021f,0.410713f, +0.124101f,0.930824f,0.343753f, +0.0887369f,0.958556f,0.270731f, +0.13199f,0.965856f,0.222935f, +0.34996f,0.900513f,0.258077f, +0.45204f,0.856515f,0.249081f, +0.434574f,0.879659f,0.19325f, +0.307812f,0.936972f,0.165332f, +0.238408f,0.942387f,0.234669f, +0.292411f,0.883524f,0.365897f, +0.235944f,0.851222f,0.468777f, +0.0834983f,0.888208f,0.45179f, +0.120252f,0.948234f,0.293925f, +0.107426f,0.988487f,0.106553f, +-0.0604958f,0.997925f,0.0220282f, +-0.22861f,0.965114f,-0.127644f, +-0.213845f,0.934088f,-0.285919f, +-0.236679f,0.925441f,-0.295876f, +-0.274282f,0.922231f,-0.272506f, +-0.200442f,0.934584f,-0.293896f, +-0.0905439f,0.955043f,-0.282301f, +-0.107977f,0.974204f,-0.198159f, +-0.176859f,0.954188f,-0.241343f, +-0.109412f,0.961464f,-0.252221f, +-0.0832631f,0.934053f,-0.347292f, +-0.0389646f,0.894623f,-0.44512f, +0.0844722f,0.90285f,-0.421576f, +0.278944f,0.884527f,-0.373902f, +0.405411f,0.845478f,-0.347577f, +0.241979f,0.880406f,-0.407837f, +0.10107f,0.917999f,-0.383487f, +0.153454f,0.950374f,-0.270631f, +0.150056f,0.964994f,-0.215103f, +0.116981f,0.964373f,-0.237277f, +0.171185f,0.966068f,-0.19341f, +0.269303f,0.954896f,-0.1251f, +0.246577f,0.939836f,-0.236448f, +0.325998f,0.915178f,-0.237011f, +0.400262f,0.89707f,-0.18723f, +0.540095f,0.838463f,-0.0726465f, +0.4591f,0.888384f,0.000734802f, +0.350121f,0.936701f,0.00262749f, +0.415959f,0.907987f,-0.0503785f, +0.469999f,0.882626f,-0.00849165f, +0.46759f,0.883776f,0.0172864f, +0.444948f,0.895095f,0.0287648f, +0.38429f,0.923043f,-0.0176926f, +-0.184131f,0.893945f,0.408605f, +-0.22256f,0.84592f,0.484651f, +-0.306803f,0.799127f,0.516979f, +-0.327467f,0.825975f,0.458836f, +-0.215523f,0.873324f,0.43687f, +-0.122358f,0.93676f,0.327886f, +-0.214245f,0.969738f,0.117081f, +0.00165628f,0.984816f,0.173596f, +-0.0471807f,0.97232f,0.228838f, +-0.042786f,0.929182f,0.367137f, +0.159108f,0.885534f,0.43648f, +0.0848362f,0.945025f,0.315803f, +-0.0323525f,0.969808f,0.241716f, +-0.0998895f,0.964402f,0.244849f, +-0.0727123f,0.986494f,0.146772f, +0.121392f,0.97688f,0.175982f, +0.260802f,0.928486f,0.264378f, +0.24004f,0.922405f,0.302572f, +0.162896f,0.94112f,0.296239f, +0.158069f,0.936377f,0.313389f, +0.18876f,0.956613f,0.221947f, +0.312407f,0.939867f,0.138025f, +0.450948f,0.870255f,0.198248f, +0.44762f,0.863366f,0.232885f, +0.235953f,0.935784f,0.261983f, +0.128819f,0.928252f,0.348933f, +0.106701f,0.927182f,0.359094f, +0.172918f,0.882203f,0.437968f, +0.183128f,0.868984f,0.459707f, +0.240959f,0.881259f,0.406597f, +0.154256f,0.918617f,0.363797f, +0.0253035f,0.919137f,0.393124f, +0.0182377f,0.964511f,0.263413f, +0.0263571f,0.99964f,0.00499089f, +-0.149002f,0.961331f,-0.231604f, +-0.264821f,0.912849f,-0.310769f, +-0.139498f,0.954507f,-0.263548f, +-0.253683f,0.93262f,-0.25664f, +-0.265231f,0.9626f,-0.0552561f, +-0.114883f,0.993341f,-0.00868247f, +0.0072742f,0.99351f,-0.113513f, +0.112563f,0.957036f,-0.26723f, +0.0621414f,0.905176f,-0.420469f, +0.0722297f,0.880288f,-0.468909f, +0.230329f,0.856327f,-0.462225f, +0.381575f,0.843927f,-0.377079f, +0.221134f,0.891315f,-0.395799f, +0.0308171f,0.923698f,-0.381879f, +0.0400222f,0.939112f,-0.341272f, +0.100477f,0.950816f,-0.293006f, +0.177047f,0.942783f,-0.282515f, +0.133298f,0.926135f,-0.352852f, +0.196525f,0.937661f,-0.286653f, +0.349249f,0.920399f,-0.17576f, +0.344233f,0.909171f,-0.234334f, +0.376056f,0.891226f,-0.25357f, +0.439076f,0.869021f,-0.228069f, +0.419906f,0.900431f,-0.113589f, +0.367672f,0.919513f,-0.13897f, +0.413581f,0.894358f,-0.170514f, +0.417856f,0.905717f,-0.0712231f, +0.442627f,0.896671f,0.00788109f, +0.434719f,0.900071f,0.0298519f, +0.417993f,0.908131f,0.0240916f, +-0.312333f,0.839022f,0.445522f, +-0.320499f,0.80841f,0.493714f, +-0.254519f,0.811123f,0.526593f, +-0.204612f,0.85744f,0.472156f, +-0.178862f,0.910868f,0.371925f, +-0.00702334f,0.926328f,0.376653f, +-0.0708828f,0.954444f,0.289847f, +-0.0771525f,0.977635f,0.195648f, +-0.0751036f,0.961343f,0.264914f, +-0.145577f,0.95681f,0.25164f, +0.127391f,0.9356f,0.329278f, +0.155803f,0.922417f,0.353372f, +-0.0158909f,0.953782f,0.300078f, +-0.071615f,0.974742f,0.211541f, +0.0985463f,0.976728f,0.190504f, +0.112633f,0.991267f,0.0685771f, +0.169574f,0.979892f,0.105153f, +0.189025f,0.96308f,0.191696f, +0.0919285f,0.967342f,0.236218f, +0.12853f,0.953507f,0.272588f, +0.291986f,0.918653f,0.266123f, +0.353363f,0.907675f,0.226407f, +0.385555f,0.89484f,0.224962f, +0.404454f,0.872627f,0.273752f, +0.205311f,0.929054f,0.307743f, +0.110161f,0.942272f,0.316208f, +0.185964f,0.923078f,0.336668f, +0.152054f,0.949861f,0.273212f, +0.185461f,0.938647f,0.290768f, +0.273329f,0.907935f,0.317718f, +0.1744f,0.944567f,0.278169f, +0.0252708f,0.979111f,0.20175f, +0.168508f,0.972599f,0.160178f, +0.171022f,0.978059f,0.118964f, +0.0998107f,0.989636f,0.103241f, +-0.201522f,0.966723f,-0.157591f, +-0.270475f,0.936595f,-0.222784f, +-0.312657f,0.944755f,-0.0984088f, +-0.352005f,0.934773f,-0.0478632f, +-0.0861214f,0.995901f,-0.0276381f, +0.0987576f,0.994369f,-0.0384345f, +0.271502f,0.95802f,-0.0921061f, +0.198786f,0.941001f,-0.273863f, +0.12025f,0.91375f,-0.388073f, +0.19318f,0.901312f,-0.38771f, +0.347672f,0.893681f,-0.283653f, +0.243349f,0.925421f,-0.290477f, +0.0173943f,0.947888f,-0.318129f, +0.037959f,0.944705f,-0.325718f, +0.138906f,0.919468f,-0.36781f, +0.157447f,0.882137f,-0.443897f, +0.187757f,0.895179f,-0.404229f, +0.0607904f,0.891083f,-0.44975f, +0.186006f,0.945946f,-0.265685f, +0.365887f,0.929282f,-0.0506235f, +0.41897f,0.907686f,-0.0238758f, +0.421784f,0.903427f,-0.0769231f, +0.443234f,0.894342f,-0.0608035f, +0.410975f,0.898831f,-0.152323f, +0.386797f,0.913648f,-0.125039f, +0.291947f,0.94823f,-0.125004f, +0.388472f,0.921139f,-0.0243475f, +0.43729f,0.89932f,0.000909095f, +0.438439f,0.898727f,-0.00777216f, +-0.28789f,0.841477f,0.457204f, +-0.335895f,0.843138f,0.419871f, +-0.2812f,0.876582f,0.390553f, +-0.0955224f,0.927302f,0.361922f, +-0.12003f,0.968207f,0.219473f, +-0.0624603f,0.972133f,0.225956f, +0.00876105f,0.944888f,0.327276f, +-0.0188296f,0.951986f,0.305562f, +-0.0880524f,0.955492f,0.28157f, +-0.14211f,0.96142f,0.235533f, +0.0867118f,0.963277f,0.254122f, +0.135173f,0.965034f,0.224584f, +0.150393f,0.96446f,0.217252f, +0.0301773f,0.99954f,0.00289386f, +0.112215f,0.991225f,-0.0698593f, +0.139936f,0.985559f,-0.0953439f, +0.125274f,0.991296f,-0.0404889f, +0.130003f,0.991461f,0.0102436f, +0.104702f,0.992835f,0.0575904f, +0.129192f,0.991077f,0.0328109f, +0.258743f,0.962487f,0.0816753f, +0.358319f,0.917773f,0.171175f, +0.362543f,0.919373f,0.152698f, +0.379026f,0.899795f,0.216122f, +0.252574f,0.930076f,0.266767f, +0.106065f,0.974915f,0.195683f, +0.13953f,0.968709f,0.205267f, +0.207814f,0.946678f,0.246198f, +0.149976f,0.969192f,0.195383f, +0.250422f,0.937237f,0.242644f, +0.308573f,0.924236f,0.224878f, +0.137327f,0.986571f,0.0884273f, +0.176869f,0.981357f,0.0752039f, +0.106914f,0.989761f,0.0945676f, +0.0990876f,0.985862f,0.135123f, +0.0562231f,0.995571f,0.0753513f, +-0.246892f,0.957072f,-0.15185f, +-0.351837f,0.92065f,-0.169157f, +-0.377614f,0.902561f,-0.206862f, +-0.10132f,0.980362f,-0.169188f, +0.0776454f,0.98254f,-0.169077f, +0.306304f,0.93954f,-0.153108f, +0.377181f,0.900422f,-0.216738f, +0.189257f,0.917577f,-0.349621f, +0.154953f,0.928643f,-0.337063f, +0.267717f,0.911458f,-0.312367f, +0.294676f,0.908518f,-0.296244f, +0.0231864f,0.917435f,-0.39721f, +0.0626224f,0.928776f,-0.365314f, +0.222796f,0.906686f,-0.358165f, +0.23143f,0.87959f,-0.415646f, +0.13808f,0.870415f,-0.472559f, +0.025291f,0.910796f,-0.412081f, +-0.0453254f,0.945277f,-0.323104f, +0.159501f,0.971914f,-0.17304f, +0.38445f,0.922508f,-0.0343154f, +0.457445f,0.889226f,-0.00452937f, +0.479545f,0.877417f,-0.0132742f, +0.420093f,0.902443f,-0.0954967f, +0.386091f,0.921349f,-0.0452663f, +0.319162f,0.945851f,-0.059174f, +0.358596f,0.930564f,-0.0738904f, +0.442653f,0.891593f,-0.0955061f, +0.442432f,0.88607f,-0.138327f, +-0.180108f,0.868506f,0.461799f, +-0.252344f,0.891893f,0.375298f, +-0.214515f,0.951228f,0.221693f, +-0.0232238f,0.989215f,0.144618f, +0.0240637f,0.992144f,0.122761f, +-0.119024f,0.992873f,0.00598183f, +-0.113037f,0.992656f,0.0430988f, +-0.0429691f,0.994091f,0.0996822f, +-0.0494378f,0.98881f,0.140751f, +-0.101045f,0.990831f,0.0896877f, +0.0748729f,0.995782f,0.0530223f, +0.173588f,0.976877f,0.124814f, +0.168744f,0.967443f,0.188628f, +0.211654f,0.955224f,0.206761f, +0.198232f,0.976689f,0.0823528f, +0.160641f,0.986993f,-0.00630407f, +0.0575905f,0.994633f,-0.0859521f, +0.0365841f,0.998447f,-0.0420043f, +0.0556411f,0.989086f,0.136432f, +0.127974f,0.973486f,0.1896f, +0.188609f,0.96964f,0.155643f, +0.316079f,0.935031f,0.16066f, +0.368833f,0.913789f,0.170151f, +0.28567f,0.933317f,0.217512f, +0.224877f,0.919424f,0.322631f, +0.173372f,0.927466f,0.331284f, +0.14641f,0.951279f,0.271352f, +0.199618f,0.950197f,0.239328f, +0.194716f,0.961761f,0.192616f, +0.211001f,0.970026f,0.12053f, +0.377145f,0.915922f,0.137289f, +0.173279f,0.983115f,0.0588147f, +0.137169f,0.986854f,0.085457f, +0.167124f,0.984519f,0.0528309f, +0.114693f,0.990538f,-0.0753596f, +0.120988f,0.991416f,-0.0495523f, +-0.0934722f,0.99234f,-0.0807704f, +-0.28812f,0.930265f,-0.227141f, +-0.319246f,0.884516f,-0.340167f, +-0.147049f,0.912977f,-0.380591f, +0.113837f,0.925954f,-0.360071f, +0.286328f,0.873071f,-0.394668f, +0.386305f,0.86841f,-0.310857f, +0.201568f,0.937185f,-0.284702f, +0.165365f,0.953527f,-0.251875f, +0.277218f,0.910704f,-0.306215f, +0.350715f,0.890932f,-0.288511f, +0.130261f,0.920935f,-0.367302f, +-0.00793534f,0.891743f,-0.452472f, +0.173424f,0.90309f,-0.392878f, +0.309572f,0.891597f,-0.330484f, +0.155483f,0.904383f,-0.397387f, +-0.0901615f,0.931774f,-0.351664f, +-0.12522f,0.950283f,-0.285102f, +0.116309f,0.952999f,-0.279758f, +0.314059f,0.900664f,-0.300285f, +0.399484f,0.884115f,-0.242388f, +0.476487f,0.865346f,-0.155359f, +0.461331f,0.87037f,-0.172132f, +0.340659f,0.915541f,-0.213858f, +0.307988f,0.934535f,-0.178292f, +0.356904f,0.924065f,-0.136833f, +0.470016f,0.879468f,-0.0749671f, +0.505067f,0.862447f,-0.0330571f, +-0.15355f,0.924768f,0.348175f, +-0.09321f,0.949622f,0.299215f, +-0.0484808f,0.991662f,0.1194f, +-0.0103305f,0.999605f,0.0261285f, +0.0401188f,0.998578f,0.0351042f, +-0.00661539f,0.998628f,-0.0519471f, +-0.0683745f,0.981776f,-0.177318f, +-0.0856989f,0.966825f,-0.240633f, +-0.0983519f,0.984458f,-0.145499f, +-0.0680709f,0.995572f,-0.0648268f, +0.0777629f,0.996246f,-0.0380386f, +0.0383267f,0.998901f,-0.0269619f, +0.00333347f,0.997094f,0.0761077f, +0.139217f,0.959624f,0.244419f, +0.245721f,0.912381f,0.327386f, +0.246821f,0.907772f,0.339159f, +0.175417f,0.940931f,0.289617f, +-0.027159f,0.9789f,0.202525f, +-0.173424f,0.953226f,0.247557f, +0.0844967f,0.921276f,0.37962f, +0.304261f,0.89366f,0.329845f, +0.31812f,0.923926f,0.21251f, +0.353311f,0.902952f,0.244642f, +0.195957f,0.945525f,0.25997f, +0.182247f,0.923305f,0.338075f, +0.134205f,0.934918f,0.328507f, +0.176553f,0.881734f,0.437463f, +0.22427f,0.87574f,0.42753f, +0.29074f,0.869795f,0.398657f, +0.272684f,0.924539f,0.266215f, +0.39631f,0.892935f,0.213556f, +0.227086f,0.96746f,0.111597f, +0.14196f,0.988195f,0.0576051f, +0.283679f,0.958555f,0.0264133f, +0.216474f,0.969698f,-0.113251f, +0.0386649f,0.982201f,-0.183812f, +-0.0151491f,0.988164f,-0.152652f, +-0.145516f,0.952277f,-0.268316f, +-0.219857f,0.921944f,-0.318875f, +-0.140821f,0.920717f,-0.363936f, +0.13255f,0.932146f,-0.33695f, +0.285156f,0.898104f,-0.334807f, +0.270867f,0.921389f,-0.278701f, +0.136545f,0.958362f,-0.250793f, +0.156889f,0.960437f,-0.230103f, +0.337521f,0.917391f,-0.210889f, +0.340375f,0.909959f,-0.236896f, +0.226521f,0.931852f,-0.283443f, +0.0467156f,0.919678f,-0.389885f, +0.11829f,0.926104f,-0.358244f, +0.284734f,0.910765f,-0.299055f, +0.155007f,0.943096f,-0.294183f, +-0.117772f,0.948884f,-0.29283f, +-0.124268f,0.932168f,-0.340029f, +0.155477f,0.92011f,-0.359477f, +0.348711f,0.859859f,-0.372885f, +0.344156f,0.842199f,-0.415039f, +0.367487f,0.839547f,-0.400142f, +0.45537f,0.851179f,-0.261021f, +0.340771f,0.905445f,-0.25307f, +0.281592f,0.927438f,-0.246101f, +0.270207f,0.930215f,-0.248371f, +0.337751f,0.936799f,-0.0912801f, +0.415821f,0.905383f,0.085868f, +-0.0508816f,0.992949f,0.107064f, +0.00772943f,0.999926f,0.0093874f, +0.0748585f,0.990585f,-0.114623f, +0.0155266f,0.983672f,-0.179298f, +0.0579395f,0.986738f,-0.15163f, +0.0876255f,0.991018f,-0.10102f, +0.0527296f,0.995461f,-0.0792264f, +-0.086898f,0.99085f,-0.103274f, +-0.226618f,0.972789f,-0.0482267f, +-0.175193f,0.983195f,0.0513344f, +0.0267808f,0.994997f,0.0962477f, +0.0618698f,0.991981f,0.110211f, +-0.098328f,0.984739f,0.143601f, +-0.00458312f,0.952299f,0.305132f, +0.173153f,0.913691f,0.367678f, +0.186464f,0.911194f,0.367365f, +0.171431f,0.905309f,0.388622f, +0.0620384f,0.93682f,0.344266f, +-0.143644f,0.960893f,0.23675f, +0.0362541f,0.97893f,0.200951f, +0.349667f,0.904284f,0.244957f, +0.338175f,0.903327f,0.26389f, +0.333852f,0.898218f,0.285914f, +0.192181f,0.948404f,0.252183f, +0.15408f,0.957234f,0.244873f, +0.108314f,0.961372f,0.253046f, +0.0186373f,0.953687f,0.300223f, +0.205839f,0.914416f,0.34853f, +0.331275f,0.886521f,0.323015f, +0.368345f,0.875165f,0.313702f, +0.405591f,0.862022f,0.303997f, +0.335644f,0.884308f,0.324566f, +0.194457f,0.953987f,0.228245f, +0.317589f,0.932139f,0.173936f, +0.34707f,0.93458f,0.0781131f, +0.1429f,0.981779f,-0.125256f, +0.0457434f,0.962864f,-0.266085f, +-0.0800896f,0.929514f,-0.359987f, +-0.224976f,0.908098f,-0.353191f, +-0.16594f,0.929111f,-0.330481f, +0.0749763f,0.957672f,-0.277928f, +0.277052f,0.936424f,-0.215295f, +0.266206f,0.947023f,-0.17967f, +0.192217f,0.96172f,-0.195315f, +0.159333f,0.947925f,-0.275775f, +0.291985f,0.916673f,-0.272864f, +0.390644f,0.893072f,-0.223205f, +0.316013f,0.901654f,-0.295223f, +0.0938304f,0.916417f,-0.38907f, +0.0371906f,0.918056f,-0.394702f, +0.249356f,0.914822f,-0.317682f, +0.159281f,0.933374f,-0.321625f, +-0.034507f,0.927426f,-0.372412f, +-0.0639276f,0.876921f,-0.476365f, +0.150154f,0.87361f,-0.462881f, +0.34577f,0.845394f,-0.407127f, +0.406017f,0.841234f,-0.357037f, +0.322181f,0.876026f,-0.358855f, +0.315882f,0.91236f,-0.260417f, +0.325378f,0.928704f,-0.177873f, +0.281437f,0.937288f,-0.205633f, +0.23991f,0.955112f,-0.173792f, +0.165717f,0.980838f,-0.102443f, +0.16591f,0.98582f,-0.0251575f, +0.188672f,0.97776f,0.0915829f, +0.0994257f,0.983812f,-0.14909f, +0.199087f,0.95198f,-0.232593f, +0.0121878f,0.914874f,-0.403556f, +-0.0234414f,0.930265f,-0.36614f, +-0.038124f,0.972539f,-0.229595f, +-0.0300917f,0.999515f,-0.00796094f, +-0.092201f,0.984658f,0.148144f, +-0.315366f,0.938181f,0.142688f, +-0.138968f,0.942311f,0.304528f, +0.0277459f,0.977812f,0.207641f, +0.0496201f,0.98101f,0.187502f, +-0.256039f,0.940975f,0.22138f, +-0.0796386f,0.864833f,0.495703f, +0.172206f,0.836979f,0.519434f, +0.218401f,0.8652f,0.451365f, +0.211231f,0.888948f,0.406391f, +0.153922f,0.942863f,0.295494f, +-0.0705923f,0.983817f,0.164685f, +0.0334153f,0.99603f,0.0825054f, +0.282635f,0.9535f,0.104667f, +0.322121f,0.91103f,0.257413f, +0.32296f,0.89395f,0.310726f, +0.263681f,0.921808f,0.284152f, +0.145976f,0.970498f,0.191897f, +0.110214f,0.967993f,0.225482f, +0.0100073f,0.970397f,0.241307f, +0.231259f,0.94984f,0.210532f, +0.350804f,0.929639f,0.112731f, +0.388908f,0.908557f,0.152559f, +0.325259f,0.933029f,0.153831f, +0.358244f,0.845843f,0.395235f, +0.245479f,0.88292f,0.400241f, +0.340078f,0.880829f,0.329372f, +0.448713f,0.860203f,0.242295f, +0.291253f,0.956268f,-0.0268833f, +0.174446f,0.957532f,-0.229565f, +-0.0246181f,0.920367f,-0.390281f, +-0.230596f,0.878986f,-0.417383f, +-0.188847f,0.897269f,-0.399054f, +0.0175328f,0.926292f,-0.376398f, +0.23985f,0.925856f,-0.291997f, +0.22945f,0.938275f,-0.258829f, +0.212396f,0.953082f,-0.21569f, +0.229329f,0.940641f,-0.250204f, +0.284501f,0.899212f,-0.33238f, +0.376241f,0.875275f,-0.30387f, +0.33476f,0.887829f,-0.315744f, +0.163808f,0.925647f,-0.341094f, +0.00890663f,0.895805f,-0.444357f, +0.214972f,0.896442f,-0.38753f, +0.17587f,0.912162f,-0.370177f, +0.075136f,0.903308f,-0.422362f, +-0.00910936f,0.832148f,-0.55448f, +0.080579f,0.825188f,-0.559082f, +0.296201f,0.838595f,-0.457191f, +0.316267f,0.8627f,-0.39462f, +0.301959f,0.9215f,-0.24425f, +0.239667f,0.953185f,-0.184387f, +0.359606f,0.929321f,-0.0839473f, +0.264487f,0.941897f,-0.207066f, +0.184815f,0.971569f,-0.147976f, +0.141833f,0.988976f,-0.0425335f, +0.112364f,0.992816f,-0.0411276f, +}; + +btScalar Landscape04Tex[] = { +0.507813f,0.25f, +0.507813f,0.242188f, +0.515625f,0.25f, +0.515625f,0.242188f, +0.523438f,0.25f, +0.523438f,0.242188f, +0.53125f,0.25f, +0.53125f,0.242188f, +0.539063f,0.25f, +0.539063f,0.242188f, +0.546875f,0.25f, +0.546875f,0.242188f, +0.554688f,0.25f, +0.554688f,0.242188f, +0.5625f,0.25f, +0.5625f,0.242188f, +0.570313f,0.25f, +0.570313f,0.242188f, +0.578125f,0.25f, +0.578125f,0.242188f, +0.585938f,0.25f, +0.585938f,0.242188f, +0.59375f,0.25f, +0.59375f,0.242188f, +0.601563f,0.25f, +0.601563f,0.242188f, +0.609375f,0.25f, +0.609375f,0.242188f, +0.617188f,0.25f, +0.617188f,0.242188f, +0.625f,0.25f, +0.625f,0.242188f, +0.632813f,0.25f, +0.632813f,0.242188f, +0.640625f,0.25f, +0.640625f,0.242188f, +0.648438f,0.25f, +0.648438f,0.242188f, +0.65625f,0.25f, +0.65625f,0.242188f, +0.664063f,0.25f, +0.664063f,0.242188f, +0.671875f,0.25f, +0.671875f,0.242188f, +0.679688f,0.25f, +0.679688f,0.242188f, +0.6875f,0.25f, +0.6875f,0.242188f, +0.695313f,0.25f, +0.695313f,0.242188f, +0.703125f,0.25f, +0.703125f,0.242188f, +0.710938f,0.25f, +0.710938f,0.242188f, +0.71875f,0.25f, +0.71875f,0.242188f, +0.726563f,0.25f, +0.726563f,0.242188f, +0.734375f,0.25f, +0.734375f,0.242188f, +0.742188f,0.25f, +0.742188f,0.242188f, +0.75f,0.25f, +0.75f,0.242188f, +0.757813f,0.25f, +0.757813f,0.242188f, +0.765625f,0.25f, +0.765625f,0.242188f, +0.773438f,0.25f, +0.773438f,0.242188f, +0.78125f,0.25f, +0.78125f,0.242188f, +0.789063f,0.25f, +0.789063f,0.242188f, +0.796875f,0.25f, +0.796875f,0.242188f, +0.804688f,0.25f, +0.804688f,0.242188f, +0.8125f,0.25f, +0.8125f,0.242188f, +0.820313f,0.25f, +0.820313f,0.242188f, +0.828125f,0.25f, +0.828125f,0.242188f, +0.835938f,0.25f, +0.835938f,0.242188f, +0.84375f,0.25f, +0.84375f,0.242188f, +0.851563f,0.25f, +0.851563f,0.242188f, +0.859375f,0.25f, +0.859375f,0.242188f, +0.867188f,0.25f, +0.867188f,0.242188f, +0.875f,0.25f, +0.875f,0.242188f, +0.882813f,0.25f, +0.882813f,0.242188f, +0.890625f,0.25f, +0.890625f,0.242188f, +0.898438f,0.25f, +0.898438f,0.242188f, +0.90625f,0.25f, +0.90625f,0.242188f, +0.914063f,0.25f, +0.914063f,0.242188f, +0.921875f,0.25f, +0.921875f,0.242188f, +0.929688f,0.25f, +0.929688f,0.242188f, +0.9375f,0.25f, +0.9375f,0.242188f, +0.945313f,0.25f, +0.945313f,0.242188f, +0.953125f,0.25f, +0.953125f,0.242188f, +0.960938f,0.25f, +0.960938f,0.242188f, +0.96875f,0.25f, +0.96875f,0.242188f, +0.976563f,0.25f, +0.976563f,0.242188f, +0.984375f,0.25f, +0.984375f,0.242188f, +0.992188f,0.25f, +0.992188f,0.242188f, +1.0f,0.25f, +1.0f,0.242188f, +0.507813f,0.257813f, +0.515625f,0.257813f, +0.523438f,0.257813f, +0.53125f,0.257813f, +0.539063f,0.257813f, +0.546875f,0.257813f, +0.554688f,0.257813f, +0.5625f,0.257813f, +0.570313f,0.257813f, +0.578125f,0.257813f, +0.585938f,0.257813f, +0.59375f,0.257813f, +0.601563f,0.257813f, +0.609375f,0.257813f, +0.617188f,0.257813f, +0.625f,0.257813f, +0.632813f,0.257813f, +0.640625f,0.257813f, +0.648438f,0.257813f, +0.65625f,0.257813f, +0.664063f,0.257813f, +0.671875f,0.257813f, +0.679688f,0.257813f, +0.6875f,0.257813f, +0.695313f,0.257813f, +0.703125f,0.257813f, +0.710938f,0.257813f, +0.71875f,0.257813f, +0.726563f,0.257813f, +0.734375f,0.257813f, +0.742188f,0.257813f, +0.75f,0.257813f, +0.757813f,0.257813f, +0.765625f,0.257813f, +0.773438f,0.257813f, +0.78125f,0.257813f, +0.789063f,0.257813f, +0.796875f,0.257813f, +0.804688f,0.257813f, +0.8125f,0.257813f, +0.820313f,0.257813f, +0.828125f,0.257813f, +0.835938f,0.257813f, +0.84375f,0.257813f, +0.851563f,0.257813f, +0.859375f,0.257813f, +0.867188f,0.257813f, +0.875f,0.257813f, +0.882813f,0.257813f, +0.890625f,0.257813f, +0.898438f,0.257813f, +0.90625f,0.257813f, +0.914063f,0.257813f, +0.921875f,0.257813f, +0.929688f,0.257813f, +0.9375f,0.257813f, +0.945313f,0.257813f, +0.953125f,0.257813f, +0.960938f,0.257813f, +0.96875f,0.257813f, +0.976563f,0.257813f, +0.984375f,0.257813f, +0.992188f,0.257813f, +1.0f,0.257813f, +0.507813f,0.265625f, +0.515625f,0.265625f, +0.523438f,0.265625f, +0.53125f,0.265625f, +0.539063f,0.265625f, +0.546875f,0.265625f, +0.554688f,0.265625f, +0.5625f,0.265625f, +0.570313f,0.265625f, +0.578125f,0.265625f, +0.585938f,0.265625f, +0.59375f,0.265625f, +0.601563f,0.265625f, +0.609375f,0.265625f, +0.617188f,0.265625f, +0.625f,0.265625f, +0.632813f,0.265625f, +0.640625f,0.265625f, +0.648438f,0.265625f, +0.65625f,0.265625f, +0.664063f,0.265625f, +0.671875f,0.265625f, +0.679688f,0.265625f, +0.6875f,0.265625f, +0.695313f,0.265625f, +0.703125f,0.265625f, +0.710938f,0.265625f, +0.71875f,0.265625f, +0.726563f,0.265625f, +0.734375f,0.265625f, +0.742188f,0.265625f, +0.75f,0.265625f, +0.757813f,0.265625f, +0.765625f,0.265625f, +0.773438f,0.265625f, +0.78125f,0.265625f, +0.789063f,0.265625f, +0.796875f,0.265625f, +0.804688f,0.265625f, +0.8125f,0.265625f, +0.820313f,0.265625f, +0.828125f,0.265625f, +0.835938f,0.265625f, +0.84375f,0.265625f, +0.851563f,0.265625f, +0.859375f,0.265625f, +0.867188f,0.265625f, +0.875f,0.265625f, +0.882813f,0.265625f, +0.890625f,0.265625f, +0.898438f,0.265625f, +0.90625f,0.265625f, +0.914063f,0.265625f, +0.921875f,0.265625f, +0.929688f,0.265625f, +0.9375f,0.265625f, +0.945313f,0.265625f, +0.953125f,0.265625f, +0.960938f,0.265625f, +0.96875f,0.265625f, +0.976563f,0.265625f, +0.984375f,0.265625f, +0.992188f,0.265625f, +1.0f,0.265625f, +0.507813f,0.273438f, +0.515625f,0.273438f, +0.523438f,0.273438f, +0.53125f,0.273438f, +0.539063f,0.273438f, +0.546875f,0.273438f, +0.554688f,0.273438f, +0.5625f,0.273438f, +0.570313f,0.273438f, +0.578125f,0.273438f, +0.585938f,0.273438f, +0.59375f,0.273438f, +0.601563f,0.273438f, +0.609375f,0.273438f, +0.617188f,0.273438f, +0.625f,0.273438f, +0.632813f,0.273438f, +0.640625f,0.273438f, +0.648438f,0.273438f, +0.65625f,0.273438f, +0.664063f,0.273438f, +0.671875f,0.273438f, +0.679688f,0.273438f, +0.6875f,0.273438f, +0.695313f,0.273438f, +0.703125f,0.273438f, +0.710938f,0.273438f, +0.71875f,0.273438f, +0.726563f,0.273438f, +0.734375f,0.273438f, +0.742188f,0.273438f, +0.75f,0.273438f, +0.757813f,0.273438f, +0.765625f,0.273438f, +0.773438f,0.273438f, +0.78125f,0.273438f, +0.789063f,0.273438f, +0.796875f,0.273438f, +0.804688f,0.273438f, +0.8125f,0.273438f, +0.820313f,0.273438f, +0.828125f,0.273438f, +0.835938f,0.273438f, +0.84375f,0.273438f, +0.851563f,0.273438f, +0.859375f,0.273438f, +0.867188f,0.273438f, +0.875f,0.273438f, +0.882813f,0.273438f, +0.890625f,0.273438f, +0.898438f,0.273438f, +0.90625f,0.273438f, +0.914063f,0.273438f, +0.921875f,0.273438f, +0.929688f,0.273438f, +0.9375f,0.273438f, +0.945313f,0.273438f, +0.953125f,0.273438f, +0.960938f,0.273438f, +0.96875f,0.273438f, +0.976563f,0.273438f, +0.984375f,0.273438f, +0.992188f,0.273438f, +1.0f,0.273438f, +0.507813f,0.28125f, +0.515625f,0.28125f, +0.523438f,0.28125f, +0.53125f,0.28125f, +0.539063f,0.28125f, +0.546875f,0.28125f, +0.554688f,0.28125f, +0.5625f,0.28125f, +0.570313f,0.28125f, +0.578125f,0.28125f, +0.585938f,0.28125f, +0.59375f,0.28125f, +0.601563f,0.28125f, +0.609375f,0.28125f, +0.617188f,0.28125f, +0.625f,0.28125f, +0.632813f,0.28125f, +0.640625f,0.28125f, +0.648438f,0.28125f, +0.65625f,0.28125f, +0.664063f,0.28125f, +0.671875f,0.28125f, +0.679688f,0.28125f, +0.6875f,0.28125f, +0.695313f,0.28125f, +0.703125f,0.28125f, +0.710938f,0.28125f, +0.71875f,0.28125f, +0.726563f,0.28125f, +0.734375f,0.28125f, +0.742188f,0.28125f, +0.75f,0.28125f, +0.757813f,0.28125f, +0.765625f,0.28125f, +0.773438f,0.28125f, +0.78125f,0.28125f, +0.789063f,0.28125f, +0.796875f,0.28125f, +0.804688f,0.28125f, +0.8125f,0.28125f, +0.820313f,0.28125f, +0.828125f,0.28125f, +0.835938f,0.28125f, +0.84375f,0.28125f, +0.851563f,0.28125f, +0.859375f,0.28125f, +0.867188f,0.28125f, +0.875f,0.28125f, +0.882813f,0.28125f, +0.890625f,0.28125f, +0.898438f,0.28125f, +0.90625f,0.28125f, +0.914063f,0.28125f, +0.921875f,0.28125f, +0.929688f,0.28125f, +0.9375f,0.28125f, +0.945313f,0.28125f, +0.953125f,0.28125f, +0.960938f,0.28125f, +0.96875f,0.28125f, +0.976563f,0.28125f, +0.984375f,0.28125f, +0.992188f,0.28125f, +1.0f,0.28125f, +0.507813f,0.289063f, +0.515625f,0.289063f, +0.523438f,0.289063f, +0.53125f,0.289063f, +0.539063f,0.289063f, +0.546875f,0.289063f, +0.554688f,0.289063f, +0.5625f,0.289063f, +0.570313f,0.289063f, +0.578125f,0.289063f, +0.585938f,0.289063f, +0.59375f,0.289063f, +0.601563f,0.289063f, +0.609375f,0.289063f, +0.617188f,0.289063f, +0.625f,0.289063f, +0.632813f,0.289063f, +0.640625f,0.289063f, +0.648438f,0.289063f, +0.65625f,0.289063f, +0.664063f,0.289063f, +0.671875f,0.289063f, +0.679688f,0.289063f, +0.6875f,0.289063f, +0.695313f,0.289063f, +0.703125f,0.289063f, +0.710938f,0.289063f, +0.71875f,0.289063f, +0.726563f,0.289063f, +0.734375f,0.289063f, +0.742188f,0.289063f, +0.75f,0.289063f, +0.757813f,0.289063f, +0.765625f,0.289063f, +0.773438f,0.289063f, +0.78125f,0.289063f, +0.789063f,0.289063f, +0.796875f,0.289063f, +0.804688f,0.289063f, +0.8125f,0.289063f, +0.820313f,0.289063f, +0.828125f,0.289063f, +0.835938f,0.289063f, +0.84375f,0.289063f, +0.851563f,0.289063f, +0.859375f,0.289063f, +0.867188f,0.289063f, +0.875f,0.289063f, +0.882813f,0.289063f, +0.890625f,0.289063f, +0.898438f,0.289063f, +0.90625f,0.289063f, +0.914063f,0.289063f, +0.921875f,0.289063f, +0.929688f,0.289063f, +0.9375f,0.289063f, +0.945313f,0.289063f, +0.953125f,0.289063f, +0.960938f,0.289063f, +0.96875f,0.289063f, +0.976563f,0.289063f, +0.984375f,0.289063f, +0.992188f,0.289063f, +1.0f,0.289063f, +0.507813f,0.296875f, +0.515625f,0.296875f, +0.523438f,0.296875f, +0.53125f,0.296875f, +0.539063f,0.296875f, +0.546875f,0.296875f, +0.554688f,0.296875f, +0.5625f,0.296875f, +0.570313f,0.296875f, +0.578125f,0.296875f, +0.585938f,0.296875f, +0.59375f,0.296875f, +0.601563f,0.296875f, +0.609375f,0.296875f, +0.617188f,0.296875f, +0.625f,0.296875f, +0.632813f,0.296875f, +0.640625f,0.296875f, +0.648438f,0.296875f, +0.65625f,0.296875f, +0.664063f,0.296875f, +0.671875f,0.296875f, +0.679688f,0.296875f, +0.6875f,0.296875f, +0.695313f,0.296875f, +0.703125f,0.296875f, +0.710938f,0.296875f, +0.71875f,0.296875f, +0.726563f,0.296875f, +0.734375f,0.296875f, +0.742188f,0.296875f, +0.75f,0.296875f, +0.757813f,0.296875f, +0.765625f,0.296875f, +0.773438f,0.296875f, +0.78125f,0.296875f, +0.789063f,0.296875f, +0.796875f,0.296875f, +0.804688f,0.296875f, +0.8125f,0.296875f, +0.820313f,0.296875f, +0.828125f,0.296875f, +0.835938f,0.296875f, +0.84375f,0.296875f, +0.851563f,0.296875f, +0.859375f,0.296875f, +0.867188f,0.296875f, +0.875f,0.296875f, +0.882813f,0.296875f, +0.890625f,0.296875f, +0.898438f,0.296875f, +0.90625f,0.296875f, +0.914063f,0.296875f, +0.921875f,0.296875f, +0.929688f,0.296875f, +0.9375f,0.296875f, +0.945313f,0.296875f, +0.953125f,0.296875f, +0.960938f,0.296875f, +0.96875f,0.296875f, +0.976563f,0.296875f, +0.984375f,0.296875f, +0.992188f,0.296875f, +1.0f,0.296875f, +0.507813f,0.304688f, +0.515625f,0.304688f, +0.523438f,0.304688f, +0.53125f,0.304688f, +0.539063f,0.304688f, +0.546875f,0.304688f, +0.554688f,0.304688f, +0.5625f,0.304688f, +0.570313f,0.304688f, +0.578125f,0.304688f, +0.585938f,0.304688f, +0.59375f,0.304688f, +0.601563f,0.304688f, +0.609375f,0.304688f, +0.617188f,0.304688f, +0.625f,0.304688f, +0.632813f,0.304688f, +0.640625f,0.304688f, +0.648438f,0.304688f, +0.65625f,0.304688f, +0.664063f,0.304688f, +0.671875f,0.304688f, +0.679688f,0.304688f, +0.6875f,0.304688f, +0.695313f,0.304688f, +0.703125f,0.304688f, +0.710938f,0.304688f, +0.71875f,0.304688f, +0.726563f,0.304688f, +0.734375f,0.304688f, +0.742188f,0.304688f, +0.75f,0.304688f, +0.757813f,0.304688f, +0.765625f,0.304688f, +0.773438f,0.304688f, +0.78125f,0.304688f, +0.789063f,0.304688f, +0.796875f,0.304688f, +0.804688f,0.304688f, +0.8125f,0.304688f, +0.820313f,0.304688f, +0.828125f,0.304688f, +0.835938f,0.304688f, +0.84375f,0.304688f, +0.851563f,0.304688f, +0.859375f,0.304688f, +0.867188f,0.304688f, +0.875f,0.304688f, +0.882813f,0.304688f, +0.890625f,0.304688f, +0.898438f,0.304688f, +0.90625f,0.304688f, +0.914063f,0.304688f, +0.921875f,0.304688f, +0.929688f,0.304688f, +0.9375f,0.304688f, +0.945313f,0.304688f, +0.953125f,0.304688f, +0.960938f,0.304688f, +0.96875f,0.304688f, +0.976563f,0.304688f, +0.984375f,0.304688f, +0.992188f,0.304688f, +1.0f,0.304688f, +0.507813f,0.3125f, +0.515625f,0.3125f, +0.523438f,0.3125f, +0.53125f,0.3125f, +0.539063f,0.3125f, +0.546875f,0.3125f, +0.554688f,0.3125f, +0.5625f,0.3125f, +0.570313f,0.3125f, +0.578125f,0.3125f, +0.585938f,0.3125f, +0.59375f,0.3125f, +0.601563f,0.3125f, +0.609375f,0.3125f, +0.617188f,0.3125f, +0.625f,0.3125f, +0.632813f,0.3125f, +0.640625f,0.3125f, +0.648438f,0.3125f, +0.65625f,0.3125f, +0.664063f,0.3125f, +0.671875f,0.3125f, +0.679688f,0.3125f, +0.6875f,0.3125f, +0.695313f,0.3125f, +0.703125f,0.3125f, +0.710938f,0.3125f, +0.71875f,0.3125f, +0.726563f,0.3125f, +0.734375f,0.3125f, +0.742188f,0.3125f, +0.75f,0.3125f, +0.757813f,0.3125f, +0.765625f,0.3125f, +0.773438f,0.3125f, +0.78125f,0.3125f, +0.789063f,0.3125f, +0.796875f,0.3125f, +0.804688f,0.3125f, +0.8125f,0.3125f, +0.820313f,0.3125f, +0.828125f,0.3125f, +0.835938f,0.3125f, +0.84375f,0.3125f, +0.851563f,0.3125f, +0.859375f,0.3125f, +0.867188f,0.3125f, +0.875f,0.3125f, +0.882813f,0.3125f, +0.890625f,0.3125f, +0.898438f,0.3125f, +0.90625f,0.3125f, +0.914063f,0.3125f, +0.921875f,0.3125f, +0.929688f,0.3125f, +0.9375f,0.3125f, +0.945313f,0.3125f, +0.953125f,0.3125f, +0.960938f,0.3125f, +0.96875f,0.3125f, +0.976563f,0.3125f, +0.984375f,0.3125f, +0.992188f,0.3125f, +1.0f,0.3125f, +0.507813f,0.320313f, +0.515625f,0.320313f, +0.523438f,0.320313f, +0.53125f,0.320313f, +0.539063f,0.320313f, +0.546875f,0.320313f, +0.554688f,0.320313f, +0.5625f,0.320313f, +0.570313f,0.320313f, +0.578125f,0.320313f, +0.585938f,0.320313f, +0.59375f,0.320313f, +0.601563f,0.320313f, +0.609375f,0.320313f, +0.617188f,0.320313f, +0.625f,0.320313f, +0.632813f,0.320313f, +0.640625f,0.320313f, +0.648438f,0.320313f, +0.65625f,0.320313f, +0.664063f,0.320313f, +0.671875f,0.320313f, +0.679688f,0.320313f, +0.6875f,0.320313f, +0.695313f,0.320313f, +0.703125f,0.320313f, +0.710938f,0.320313f, +0.71875f,0.320313f, +0.726563f,0.320313f, +0.734375f,0.320313f, +0.742188f,0.320313f, +0.75f,0.320313f, +0.757813f,0.320313f, +0.765625f,0.320313f, +0.773438f,0.320313f, +0.78125f,0.320313f, +0.789063f,0.320313f, +0.796875f,0.320313f, +0.804688f,0.320313f, +0.8125f,0.320313f, +0.820313f,0.320313f, +0.828125f,0.320313f, +0.835938f,0.320313f, +0.84375f,0.320313f, +0.851563f,0.320313f, +0.859375f,0.320313f, +0.867188f,0.320313f, +0.875f,0.320313f, +0.882813f,0.320313f, +0.890625f,0.320313f, +0.898438f,0.320313f, +0.90625f,0.320313f, +0.914063f,0.320313f, +0.921875f,0.320313f, +0.929688f,0.320313f, +0.9375f,0.320313f, +0.945313f,0.320313f, +0.953125f,0.320313f, +0.960938f,0.320313f, +0.96875f,0.320313f, +0.976563f,0.320313f, +0.984375f,0.320313f, +0.992188f,0.320313f, +1.0f,0.320313f, +0.507813f,0.328125f, +0.515625f,0.328125f, +0.523438f,0.328125f, +0.53125f,0.328125f, +0.539063f,0.328125f, +0.546875f,0.328125f, +0.554688f,0.328125f, +0.5625f,0.328125f, +0.570313f,0.328125f, +0.578125f,0.328125f, +0.585938f,0.328125f, +0.59375f,0.328125f, +0.601563f,0.328125f, +0.609375f,0.328125f, +0.617188f,0.328125f, +0.625f,0.328125f, +0.632813f,0.328125f, +0.640625f,0.328125f, +0.648438f,0.328125f, +0.65625f,0.328125f, +0.664063f,0.328125f, +0.671875f,0.328125f, +0.679688f,0.328125f, +0.6875f,0.328125f, +0.695313f,0.328125f, +0.703125f,0.328125f, +0.710938f,0.328125f, +0.71875f,0.328125f, +0.726563f,0.328125f, +0.734375f,0.328125f, +0.742188f,0.328125f, +0.75f,0.328125f, +0.757813f,0.328125f, +0.765625f,0.328125f, +0.773438f,0.328125f, +0.78125f,0.328125f, +0.789063f,0.328125f, +0.796875f,0.328125f, +0.804688f,0.328125f, +0.8125f,0.328125f, +0.820313f,0.328125f, +0.828125f,0.328125f, +0.835938f,0.328125f, +0.84375f,0.328125f, +0.851563f,0.328125f, +0.859375f,0.328125f, +0.867188f,0.328125f, +0.875f,0.328125f, +0.882813f,0.328125f, +0.890625f,0.328125f, +0.898438f,0.328125f, +0.90625f,0.328125f, +0.914063f,0.328125f, +0.921875f,0.328125f, +0.929688f,0.328125f, +0.9375f,0.328125f, +0.945313f,0.328125f, +0.953125f,0.328125f, +0.960938f,0.328125f, +0.96875f,0.328125f, +0.976563f,0.328125f, +0.984375f,0.328125f, +0.992188f,0.328125f, +1.0f,0.328125f, +0.507813f,0.335938f, +0.515625f,0.335938f, +0.523438f,0.335938f, +0.53125f,0.335938f, +0.539063f,0.335938f, +0.546875f,0.335938f, +0.554688f,0.335938f, +0.5625f,0.335938f, +0.570313f,0.335938f, +0.578125f,0.335938f, +0.585938f,0.335938f, +0.59375f,0.335938f, +0.601563f,0.335938f, +0.609375f,0.335938f, +0.617188f,0.335938f, +0.625f,0.335938f, +0.632813f,0.335938f, +0.640625f,0.335938f, +0.648438f,0.335938f, +0.65625f,0.335938f, +0.664063f,0.335938f, +0.671875f,0.335938f, +0.679688f,0.335938f, +0.6875f,0.335938f, +0.695313f,0.335938f, +0.703125f,0.335938f, +0.710938f,0.335938f, +0.71875f,0.335938f, +0.726563f,0.335938f, +0.734375f,0.335938f, +0.742188f,0.335938f, +0.75f,0.335938f, +0.757813f,0.335938f, +0.765625f,0.335938f, +0.773438f,0.335938f, +0.78125f,0.335938f, +0.789063f,0.335938f, +0.796875f,0.335938f, +0.804688f,0.335938f, +0.8125f,0.335938f, +0.820313f,0.335938f, +0.828125f,0.335938f, +0.835938f,0.335938f, +0.84375f,0.335938f, +0.851563f,0.335938f, +0.859375f,0.335938f, +0.867188f,0.335938f, +0.875f,0.335938f, +0.882813f,0.335938f, +0.890625f,0.335938f, +0.898438f,0.335938f, +0.90625f,0.335938f, +0.914063f,0.335938f, +0.921875f,0.335938f, +0.929688f,0.335938f, +0.9375f,0.335938f, +0.945313f,0.335938f, +0.953125f,0.335938f, +0.960938f,0.335938f, +0.96875f,0.335938f, +0.976563f,0.335938f, +0.984375f,0.335938f, +0.992188f,0.335938f, +1.0f,0.335938f, +0.507813f,0.34375f, +0.515625f,0.34375f, +0.523438f,0.34375f, +0.53125f,0.34375f, +0.539063f,0.34375f, +0.546875f,0.34375f, +0.554688f,0.34375f, +0.5625f,0.34375f, +0.570313f,0.34375f, +0.578125f,0.34375f, +0.585938f,0.34375f, +0.59375f,0.34375f, +0.601563f,0.34375f, +0.609375f,0.34375f, +0.617188f,0.34375f, +0.625f,0.34375f, +0.632813f,0.34375f, +0.640625f,0.34375f, +0.648438f,0.34375f, +0.65625f,0.34375f, +0.664063f,0.34375f, +0.671875f,0.34375f, +0.679688f,0.34375f, +0.6875f,0.34375f, +0.695313f,0.34375f, +0.703125f,0.34375f, +0.710938f,0.34375f, +0.71875f,0.34375f, +0.726563f,0.34375f, +0.734375f,0.34375f, +0.742188f,0.34375f, +0.75f,0.34375f, +0.757813f,0.34375f, +0.765625f,0.34375f, +0.773438f,0.34375f, +0.78125f,0.34375f, +0.789063f,0.34375f, +0.796875f,0.34375f, +0.804688f,0.34375f, +0.8125f,0.34375f, +0.820313f,0.34375f, +0.828125f,0.34375f, +0.835938f,0.34375f, +0.84375f,0.34375f, +0.851563f,0.34375f, +0.859375f,0.34375f, +0.867188f,0.34375f, +0.875f,0.34375f, +0.882813f,0.34375f, +0.890625f,0.34375f, +0.898438f,0.34375f, +0.90625f,0.34375f, +0.914063f,0.34375f, +0.921875f,0.34375f, +0.929688f,0.34375f, +0.9375f,0.34375f, +0.945313f,0.34375f, +0.953125f,0.34375f, +0.960938f,0.34375f, +0.96875f,0.34375f, +0.976563f,0.34375f, +0.984375f,0.34375f, +0.992188f,0.34375f, +1.0f,0.34375f, +0.507813f,0.351563f, +0.515625f,0.351563f, +0.523438f,0.351563f, +0.53125f,0.351563f, +0.539063f,0.351563f, +0.546875f,0.351563f, +0.554688f,0.351563f, +0.5625f,0.351563f, +0.570313f,0.351563f, +0.578125f,0.351563f, +0.585938f,0.351563f, +0.59375f,0.351563f, +0.601563f,0.351563f, +0.609375f,0.351563f, +0.617188f,0.351563f, +0.625f,0.351563f, +0.632813f,0.351563f, +0.640625f,0.351563f, +0.648438f,0.351563f, +0.65625f,0.351563f, +0.664063f,0.351563f, +0.671875f,0.351563f, +0.679688f,0.351563f, +0.6875f,0.351563f, +0.695313f,0.351563f, +0.703125f,0.351563f, +0.710938f,0.351563f, +0.71875f,0.351563f, +0.726563f,0.351563f, +0.734375f,0.351563f, +0.742188f,0.351563f, +0.75f,0.351563f, +0.757813f,0.351563f, +0.765625f,0.351563f, +0.773438f,0.351563f, +0.78125f,0.351563f, +0.789063f,0.351563f, +0.796875f,0.351563f, +0.804688f,0.351563f, +0.8125f,0.351563f, +0.820313f,0.351563f, +0.828125f,0.351563f, +0.835938f,0.351563f, +0.84375f,0.351563f, +0.851563f,0.351563f, +0.859375f,0.351563f, +0.867188f,0.351563f, +0.875f,0.351563f, +0.882813f,0.351563f, +0.890625f,0.351563f, +0.898438f,0.351563f, +0.90625f,0.351563f, +0.914063f,0.351563f, +0.921875f,0.351563f, +0.929688f,0.351563f, +0.9375f,0.351563f, +0.945313f,0.351563f, +0.953125f,0.351563f, +0.960938f,0.351563f, +0.96875f,0.351563f, +0.976563f,0.351563f, +0.984375f,0.351563f, +0.992188f,0.351563f, +1.0f,0.351563f, +0.507813f,0.359375f, +0.515625f,0.359375f, +0.523438f,0.359375f, +0.53125f,0.359375f, +0.539063f,0.359375f, +0.546875f,0.359375f, +0.554688f,0.359375f, +0.5625f,0.359375f, +0.570313f,0.359375f, +0.578125f,0.359375f, +0.585938f,0.359375f, +0.59375f,0.359375f, +0.601563f,0.359375f, +0.609375f,0.359375f, +0.617188f,0.359375f, +0.625f,0.359375f, +0.632813f,0.359375f, +0.640625f,0.359375f, +0.648438f,0.359375f, +0.65625f,0.359375f, +0.664063f,0.359375f, +0.671875f,0.359375f, +0.679688f,0.359375f, +0.6875f,0.359375f, +0.695313f,0.359375f, +0.703125f,0.359375f, +0.710938f,0.359375f, +0.71875f,0.359375f, +0.726563f,0.359375f, +0.734375f,0.359375f, +0.742188f,0.359375f, +0.75f,0.359375f, +0.757813f,0.359375f, +0.765625f,0.359375f, +0.773438f,0.359375f, +0.78125f,0.359375f, +0.789063f,0.359375f, +0.796875f,0.359375f, +0.804688f,0.359375f, +0.8125f,0.359375f, +0.820313f,0.359375f, +0.828125f,0.359375f, +0.835938f,0.359375f, +0.84375f,0.359375f, +0.851563f,0.359375f, +0.859375f,0.359375f, +0.867188f,0.359375f, +0.875f,0.359375f, +0.882813f,0.359375f, +0.890625f,0.359375f, +0.898438f,0.359375f, +0.90625f,0.359375f, +0.914063f,0.359375f, +0.921875f,0.359375f, +0.929688f,0.359375f, +0.9375f,0.359375f, +0.945313f,0.359375f, +0.953125f,0.359375f, +0.960938f,0.359375f, +0.96875f,0.359375f, +0.976563f,0.359375f, +0.984375f,0.359375f, +0.992188f,0.359375f, +1.0f,0.359375f, +0.507813f,0.367188f, +0.515625f,0.367188f, +0.523438f,0.367188f, +0.53125f,0.367188f, +0.539063f,0.367188f, +0.546875f,0.367188f, +0.554688f,0.367188f, +0.5625f,0.367188f, +0.570313f,0.367188f, +0.578125f,0.367188f, +0.585938f,0.367188f, +0.59375f,0.367188f, +0.601563f,0.367188f, +0.609375f,0.367188f, +0.617188f,0.367188f, +0.625f,0.367188f, +0.632813f,0.367188f, +0.640625f,0.367188f, +0.648438f,0.367188f, +0.65625f,0.367188f, +0.664063f,0.367188f, +0.671875f,0.367188f, +0.679688f,0.367188f, +0.6875f,0.367188f, +0.695313f,0.367188f, +0.703125f,0.367188f, +0.710938f,0.367188f, +0.71875f,0.367188f, +0.726563f,0.367188f, +0.734375f,0.367188f, +0.742188f,0.367188f, +0.75f,0.367188f, +0.757813f,0.367188f, +0.765625f,0.367188f, +0.773438f,0.367188f, +0.78125f,0.367188f, +0.789063f,0.367188f, +0.796875f,0.367188f, +0.804688f,0.367188f, +0.8125f,0.367188f, +0.820313f,0.367188f, +0.828125f,0.367188f, +0.835938f,0.367188f, +0.84375f,0.367188f, +0.851563f,0.367188f, +0.859375f,0.367188f, +0.867188f,0.367188f, +0.875f,0.367188f, +0.882813f,0.367188f, +0.890625f,0.367188f, +0.898438f,0.367188f, +0.90625f,0.367188f, +0.914063f,0.367188f, +0.921875f,0.367188f, +0.929688f,0.367188f, +0.9375f,0.367188f, +0.945313f,0.367188f, +0.953125f,0.367188f, +0.960938f,0.367188f, +0.96875f,0.367188f, +0.976563f,0.367188f, +0.984375f,0.367188f, +0.992188f,0.367188f, +1.0f,0.367188f, +0.507813f,0.375f, +0.515625f,0.375f, +0.523438f,0.375f, +0.53125f,0.375f, +0.539063f,0.375f, +0.546875f,0.375f, +0.554688f,0.375f, +0.5625f,0.375f, +0.570313f,0.375f, +0.578125f,0.375f, +0.585938f,0.375f, +0.59375f,0.375f, +0.601563f,0.375f, +0.609375f,0.375f, +0.617188f,0.375f, +0.625f,0.375f, +0.632813f,0.375f, +0.640625f,0.375f, +0.648438f,0.375f, +0.65625f,0.375f, +0.664063f,0.375f, +0.671875f,0.375f, +0.679688f,0.375f, +0.6875f,0.375f, +0.695313f,0.375f, +0.703125f,0.375f, +0.710938f,0.375f, +0.71875f,0.375f, +0.726563f,0.375f, +0.734375f,0.375f, +0.742188f,0.375f, +0.75f,0.375f, +0.757813f,0.375f, +0.765625f,0.375f, +0.773438f,0.375f, +0.78125f,0.375f, +0.789063f,0.375f, +0.796875f,0.375f, +0.804688f,0.375f, +0.8125f,0.375f, +0.820313f,0.375f, +0.828125f,0.375f, +0.835938f,0.375f, +0.84375f,0.375f, +0.851563f,0.375f, +0.859375f,0.375f, +0.867188f,0.375f, +0.875f,0.375f, +0.882813f,0.375f, +0.890625f,0.375f, +0.898438f,0.375f, +0.90625f,0.375f, +0.914063f,0.375f, +0.921875f,0.375f, +0.929688f,0.375f, +0.9375f,0.375f, +0.945313f,0.375f, +0.953125f,0.375f, +0.960938f,0.375f, +0.96875f,0.375f, +0.976563f,0.375f, +0.984375f,0.375f, +0.992188f,0.375f, +1.0f,0.375f, +0.507813f,0.382813f, +0.515625f,0.382813f, +0.523438f,0.382813f, +0.53125f,0.382813f, +0.539063f,0.382813f, +0.546875f,0.382813f, +0.554688f,0.382813f, +0.5625f,0.382813f, +0.570313f,0.382813f, +0.578125f,0.382813f, +0.585938f,0.382813f, +0.59375f,0.382813f, +0.601563f,0.382813f, +0.609375f,0.382813f, +0.617188f,0.382813f, +0.625f,0.382813f, +0.632813f,0.382813f, +0.640625f,0.382813f, +0.648438f,0.382813f, +0.65625f,0.382813f, +0.664063f,0.382813f, +0.671875f,0.382813f, +0.679688f,0.382813f, +0.6875f,0.382813f, +0.695313f,0.382813f, +0.703125f,0.382813f, +0.710938f,0.382813f, +0.71875f,0.382813f, +0.726563f,0.382813f, +0.734375f,0.382813f, +0.742188f,0.382813f, +0.75f,0.382813f, +0.757813f,0.382813f, +0.765625f,0.382813f, +0.773438f,0.382813f, +0.78125f,0.382813f, +0.789063f,0.382813f, +0.796875f,0.382813f, +0.804688f,0.382813f, +0.8125f,0.382813f, +0.820313f,0.382813f, +0.828125f,0.382813f, +0.835938f,0.382813f, +0.84375f,0.382813f, +0.851563f,0.382813f, +0.859375f,0.382813f, +0.867188f,0.382813f, +0.875f,0.382813f, +0.882813f,0.382813f, +0.890625f,0.382813f, +0.898438f,0.382813f, +0.90625f,0.382813f, +0.914063f,0.382813f, +0.921875f,0.382813f, +0.929688f,0.382813f, +0.9375f,0.382813f, +0.945313f,0.382813f, +0.953125f,0.382813f, +0.960938f,0.382813f, +0.96875f,0.382813f, +0.976563f,0.382813f, +0.984375f,0.382813f, +0.992188f,0.382813f, +1.0f,0.382813f, +0.507813f,0.390625f, +0.515625f,0.390625f, +0.523438f,0.390625f, +0.53125f,0.390625f, +0.539063f,0.390625f, +0.546875f,0.390625f, +0.554688f,0.390625f, +0.5625f,0.390625f, +0.570313f,0.390625f, +0.578125f,0.390625f, +0.585938f,0.390625f, +0.59375f,0.390625f, +0.601563f,0.390625f, +0.609375f,0.390625f, +0.617188f,0.390625f, +0.625f,0.390625f, +0.632813f,0.390625f, +0.640625f,0.390625f, +0.648438f,0.390625f, +0.65625f,0.390625f, +0.664063f,0.390625f, +0.671875f,0.390625f, +0.679688f,0.390625f, +0.6875f,0.390625f, +0.695313f,0.390625f, +0.703125f,0.390625f, +0.710938f,0.390625f, +0.71875f,0.390625f, +0.726563f,0.390625f, +0.734375f,0.390625f, +0.742188f,0.390625f, +0.75f,0.390625f, +0.757813f,0.390625f, +0.765625f,0.390625f, +0.773438f,0.390625f, +0.78125f,0.390625f, +0.789063f,0.390625f, +0.796875f,0.390625f, +0.804688f,0.390625f, +0.8125f,0.390625f, +0.820313f,0.390625f, +0.828125f,0.390625f, +0.835938f,0.390625f, +0.84375f,0.390625f, +0.851563f,0.390625f, +0.859375f,0.390625f, +0.867188f,0.390625f, +0.875f,0.390625f, +0.882813f,0.390625f, +0.890625f,0.390625f, +0.898438f,0.390625f, +0.90625f,0.390625f, +0.914063f,0.390625f, +0.921875f,0.390625f, +0.929688f,0.390625f, +0.9375f,0.390625f, +0.945313f,0.390625f, +0.953125f,0.390625f, +0.960938f,0.390625f, +0.96875f,0.390625f, +0.976563f,0.390625f, +0.984375f,0.390625f, +0.992188f,0.390625f, +1.0f,0.390625f, +0.507813f,0.398438f, +0.515625f,0.398438f, +0.523438f,0.398438f, +0.53125f,0.398438f, +0.539063f,0.398438f, +0.546875f,0.398438f, +0.554688f,0.398438f, +0.5625f,0.398438f, +0.570313f,0.398438f, +0.578125f,0.398438f, +0.585938f,0.398438f, +0.59375f,0.398438f, +0.601563f,0.398438f, +0.609375f,0.398438f, +0.617188f,0.398438f, +0.625f,0.398438f, +0.632813f,0.398438f, +0.640625f,0.398438f, +0.648438f,0.398438f, +0.65625f,0.398438f, +0.664063f,0.398438f, +0.671875f,0.398438f, +0.679688f,0.398438f, +0.6875f,0.398438f, +0.695313f,0.398438f, +0.703125f,0.398438f, +0.710938f,0.398438f, +0.71875f,0.398438f, +0.726563f,0.398438f, +0.734375f,0.398438f, +0.742188f,0.398438f, +0.75f,0.398438f, +0.757813f,0.398438f, +0.765625f,0.398438f, +0.773438f,0.398438f, +0.78125f,0.398438f, +0.789063f,0.398438f, +0.796875f,0.398438f, +0.804688f,0.398438f, +0.8125f,0.398438f, +0.820313f,0.398438f, +0.828125f,0.398438f, +0.835938f,0.398438f, +0.84375f,0.398438f, +0.851563f,0.398438f, +0.859375f,0.398438f, +0.867188f,0.398438f, +0.875f,0.398438f, +0.882813f,0.398438f, +0.890625f,0.398438f, +0.898438f,0.398438f, +0.90625f,0.398438f, +0.914063f,0.398438f, +0.921875f,0.398438f, +0.929688f,0.398438f, +0.9375f,0.398438f, +0.945313f,0.398438f, +0.953125f,0.398438f, +0.960938f,0.398438f, +0.96875f,0.398438f, +0.976563f,0.398438f, +0.984375f,0.398438f, +0.992188f,0.398438f, +1.0f,0.398438f, +0.507813f,0.40625f, +0.515625f,0.40625f, +0.523438f,0.40625f, +0.53125f,0.40625f, +0.539063f,0.40625f, +0.546875f,0.40625f, +0.554688f,0.40625f, +0.5625f,0.40625f, +0.570313f,0.40625f, +0.578125f,0.40625f, +0.585938f,0.40625f, +0.59375f,0.40625f, +0.601563f,0.40625f, +0.609375f,0.40625f, +0.617188f,0.40625f, +0.625f,0.40625f, +0.632813f,0.40625f, +0.640625f,0.40625f, +0.648438f,0.40625f, +0.65625f,0.40625f, +0.664063f,0.40625f, +0.671875f,0.40625f, +0.679688f,0.40625f, +0.6875f,0.40625f, +0.695313f,0.40625f, +0.703125f,0.40625f, +0.710938f,0.40625f, +0.71875f,0.40625f, +0.726563f,0.40625f, +0.734375f,0.40625f, +0.742188f,0.40625f, +0.75f,0.40625f, +0.757813f,0.40625f, +0.765625f,0.40625f, +0.773438f,0.40625f, +0.78125f,0.40625f, +0.789063f,0.40625f, +0.796875f,0.40625f, +0.804688f,0.40625f, +0.8125f,0.40625f, +0.820313f,0.40625f, +0.828125f,0.40625f, +0.835938f,0.40625f, +0.84375f,0.40625f, +0.851563f,0.40625f, +0.859375f,0.40625f, +0.867188f,0.40625f, +0.875f,0.40625f, +0.882813f,0.40625f, +0.890625f,0.40625f, +0.898438f,0.40625f, +0.90625f,0.40625f, +0.914063f,0.40625f, +0.921875f,0.40625f, +0.929688f,0.40625f, +0.9375f,0.40625f, +0.945313f,0.40625f, +0.953125f,0.40625f, +0.960938f,0.40625f, +0.96875f,0.40625f, +0.976563f,0.40625f, +0.984375f,0.40625f, +0.992188f,0.40625f, +1.0f,0.40625f, +0.507813f,0.414063f, +0.515625f,0.414063f, +0.523438f,0.414063f, +0.53125f,0.414063f, +0.539063f,0.414063f, +0.546875f,0.414063f, +0.554688f,0.414063f, +0.5625f,0.414063f, +0.570313f,0.414063f, +0.578125f,0.414063f, +0.585938f,0.414063f, +0.59375f,0.414063f, +0.601563f,0.414063f, +0.609375f,0.414063f, +0.617188f,0.414063f, +0.625f,0.414063f, +0.632813f,0.414063f, +0.640625f,0.414063f, +0.648438f,0.414063f, +0.65625f,0.414063f, +0.664063f,0.414063f, +0.671875f,0.414063f, +0.679688f,0.414063f, +0.6875f,0.414063f, +0.695313f,0.414063f, +0.703125f,0.414063f, +0.710938f,0.414063f, +0.71875f,0.414063f, +0.726563f,0.414063f, +0.734375f,0.414063f, +0.742188f,0.414063f, +0.75f,0.414063f, +0.757813f,0.414063f, +0.765625f,0.414063f, +0.773438f,0.414063f, +0.78125f,0.414063f, +0.789063f,0.414063f, +0.796875f,0.414063f, +0.804688f,0.414063f, +0.8125f,0.414063f, +0.820313f,0.414063f, +0.828125f,0.414063f, +0.835938f,0.414063f, +0.84375f,0.414063f, +0.851563f,0.414063f, +0.859375f,0.414063f, +0.867188f,0.414063f, +0.875f,0.414063f, +0.882813f,0.414063f, +0.890625f,0.414063f, +0.898438f,0.414063f, +0.90625f,0.414063f, +0.914063f,0.414063f, +0.921875f,0.414063f, +0.929688f,0.414063f, +0.9375f,0.414063f, +0.945313f,0.414063f, +0.953125f,0.414063f, +0.960938f,0.414063f, +0.96875f,0.414063f, +0.976563f,0.414063f, +0.984375f,0.414063f, +0.992188f,0.414063f, +1.0f,0.414063f, +0.507813f,0.421875f, +0.515625f,0.421875f, +0.523438f,0.421875f, +0.53125f,0.421875f, +0.539063f,0.421875f, +0.546875f,0.421875f, +0.554688f,0.421875f, +0.5625f,0.421875f, +0.570313f,0.421875f, +0.578125f,0.421875f, +0.585938f,0.421875f, +0.59375f,0.421875f, +0.601563f,0.421875f, +0.609375f,0.421875f, +0.617188f,0.421875f, +0.625f,0.421875f, +0.632813f,0.421875f, +0.640625f,0.421875f, +0.648438f,0.421875f, +0.65625f,0.421875f, +0.664063f,0.421875f, +0.671875f,0.421875f, +0.679688f,0.421875f, +0.6875f,0.421875f, +0.695313f,0.421875f, +0.703125f,0.421875f, +0.710938f,0.421875f, +0.71875f,0.421875f, +0.726563f,0.421875f, +0.734375f,0.421875f, +0.742188f,0.421875f, +0.75f,0.421875f, +0.757813f,0.421875f, +0.765625f,0.421875f, +0.773438f,0.421875f, +0.78125f,0.421875f, +0.789063f,0.421875f, +0.796875f,0.421875f, +0.804688f,0.421875f, +0.8125f,0.421875f, +0.820313f,0.421875f, +0.828125f,0.421875f, +0.835938f,0.421875f, +0.84375f,0.421875f, +0.851563f,0.421875f, +0.859375f,0.421875f, +0.867188f,0.421875f, +0.875f,0.421875f, +0.882813f,0.421875f, +0.890625f,0.421875f, +0.898438f,0.421875f, +0.90625f,0.421875f, +0.914063f,0.421875f, +0.921875f,0.421875f, +0.929688f,0.421875f, +0.9375f,0.421875f, +0.945313f,0.421875f, +0.953125f,0.421875f, +0.960938f,0.421875f, +0.96875f,0.421875f, +0.976563f,0.421875f, +0.984375f,0.421875f, +0.992188f,0.421875f, +1.0f,0.421875f, +0.507813f,0.429688f, +0.515625f,0.429688f, +0.523438f,0.429688f, +0.53125f,0.429688f, +0.539063f,0.429688f, +0.546875f,0.429688f, +0.554688f,0.429688f, +0.5625f,0.429688f, +0.570313f,0.429688f, +0.578125f,0.429688f, +0.585938f,0.429688f, +0.59375f,0.429688f, +0.601563f,0.429688f, +0.609375f,0.429688f, +0.617188f,0.429688f, +0.625f,0.429688f, +0.632813f,0.429688f, +0.640625f,0.429688f, +0.648438f,0.429688f, +0.65625f,0.429688f, +0.664063f,0.429688f, +0.671875f,0.429688f, +0.679688f,0.429688f, +0.6875f,0.429688f, +0.695313f,0.429688f, +0.703125f,0.429688f, +0.710938f,0.429688f, +0.71875f,0.429688f, +0.726563f,0.429688f, +0.734375f,0.429688f, +0.742188f,0.429688f, +0.75f,0.429688f, +0.757813f,0.429688f, +0.765625f,0.429688f, +0.773438f,0.429688f, +0.78125f,0.429688f, +0.789063f,0.429688f, +0.796875f,0.429688f, +0.804688f,0.429688f, +0.8125f,0.429688f, +0.820313f,0.429688f, +0.828125f,0.429688f, +0.835938f,0.429688f, +0.84375f,0.429688f, +0.851563f,0.429688f, +0.859375f,0.429688f, +0.867188f,0.429688f, +0.875f,0.429688f, +0.882813f,0.429688f, +0.890625f,0.429688f, +0.898438f,0.429688f, +0.90625f,0.429688f, +0.914063f,0.429688f, +0.921875f,0.429688f, +0.929688f,0.429688f, +0.9375f,0.429688f, +0.945313f,0.429688f, +0.953125f,0.429688f, +0.960938f,0.429688f, +0.96875f,0.429688f, +0.976563f,0.429688f, +0.984375f,0.429688f, +0.992188f,0.429688f, +1.0f,0.429688f, +0.507813f,0.4375f, +0.515625f,0.4375f, +0.523438f,0.4375f, +0.53125f,0.4375f, +0.539063f,0.4375f, +0.546875f,0.4375f, +0.554688f,0.4375f, +0.5625f,0.4375f, +0.570313f,0.4375f, +0.578125f,0.4375f, +0.585938f,0.4375f, +0.59375f,0.4375f, +0.601563f,0.4375f, +0.609375f,0.4375f, +0.617188f,0.4375f, +0.625f,0.4375f, +0.632813f,0.4375f, +0.640625f,0.4375f, +0.648438f,0.4375f, +0.65625f,0.4375f, +0.664063f,0.4375f, +0.671875f,0.4375f, +0.679688f,0.4375f, +0.6875f,0.4375f, +0.695313f,0.4375f, +0.703125f,0.4375f, +0.710938f,0.4375f, +0.71875f,0.4375f, +0.726563f,0.4375f, +0.734375f,0.4375f, +0.742188f,0.4375f, +0.75f,0.4375f, +0.757813f,0.4375f, +0.765625f,0.4375f, +0.773438f,0.4375f, +0.78125f,0.4375f, +0.789063f,0.4375f, +0.796875f,0.4375f, +0.804688f,0.4375f, +0.8125f,0.4375f, +0.820313f,0.4375f, +0.828125f,0.4375f, +0.835938f,0.4375f, +0.84375f,0.4375f, +0.851563f,0.4375f, +0.859375f,0.4375f, +0.867188f,0.4375f, +0.875f,0.4375f, +0.882813f,0.4375f, +0.890625f,0.4375f, +0.898438f,0.4375f, +0.90625f,0.4375f, +0.914063f,0.4375f, +0.921875f,0.4375f, +0.929688f,0.4375f, +0.9375f,0.4375f, +0.945313f,0.4375f, +0.953125f,0.4375f, +0.960938f,0.4375f, +0.96875f,0.4375f, +0.976563f,0.4375f, +0.984375f,0.4375f, +0.992188f,0.4375f, +1.0f,0.4375f, +0.507813f,0.445313f, +0.515625f,0.445313f, +0.523438f,0.445313f, +0.53125f,0.445313f, +0.539063f,0.445313f, +0.546875f,0.445313f, +0.554688f,0.445313f, +0.5625f,0.445313f, +0.570313f,0.445313f, +0.578125f,0.445313f, +0.585938f,0.445313f, +0.59375f,0.445313f, +0.601563f,0.445313f, +0.609375f,0.445313f, +0.617188f,0.445313f, +0.625f,0.445313f, +0.632813f,0.445313f, +0.640625f,0.445313f, +0.648438f,0.445313f, +0.65625f,0.445313f, +0.664063f,0.445313f, +0.671875f,0.445313f, +0.679688f,0.445313f, +0.6875f,0.445313f, +0.695313f,0.445313f, +0.703125f,0.445313f, +0.710938f,0.445313f, +0.71875f,0.445313f, +0.726563f,0.445313f, +0.734375f,0.445313f, +0.742188f,0.445313f, +0.75f,0.445313f, +0.757813f,0.445313f, +0.765625f,0.445313f, +0.773438f,0.445313f, +0.78125f,0.445313f, +0.789063f,0.445313f, +0.796875f,0.445313f, +0.804688f,0.445313f, +0.8125f,0.445313f, +0.820313f,0.445313f, +0.828125f,0.445313f, +0.835938f,0.445313f, +0.84375f,0.445313f, +0.851563f,0.445313f, +0.859375f,0.445313f, +0.867188f,0.445313f, +0.875f,0.445313f, +0.882813f,0.445313f, +0.890625f,0.445313f, +0.898438f,0.445313f, +0.90625f,0.445313f, +0.914063f,0.445313f, +0.921875f,0.445313f, +0.929688f,0.445313f, +0.9375f,0.445313f, +0.945313f,0.445313f, +0.953125f,0.445313f, +0.960938f,0.445313f, +0.96875f,0.445313f, +0.976563f,0.445313f, +0.984375f,0.445313f, +0.992188f,0.445313f, +1.0f,0.445313f, +0.507813f,0.453125f, +0.515625f,0.453125f, +0.523438f,0.453125f, +0.53125f,0.453125f, +0.539063f,0.453125f, +0.546875f,0.453125f, +0.554688f,0.453125f, +0.5625f,0.453125f, +0.570313f,0.453125f, +0.578125f,0.453125f, +0.585938f,0.453125f, +0.59375f,0.453125f, +0.601563f,0.453125f, +0.609375f,0.453125f, +0.617188f,0.453125f, +0.625f,0.453125f, +0.632813f,0.453125f, +0.640625f,0.453125f, +0.648438f,0.453125f, +0.65625f,0.453125f, +0.664063f,0.453125f, +0.671875f,0.453125f, +0.679688f,0.453125f, +0.6875f,0.453125f, +0.695313f,0.453125f, +0.703125f,0.453125f, +0.710938f,0.453125f, +0.71875f,0.453125f, +0.726563f,0.453125f, +0.734375f,0.453125f, +0.742188f,0.453125f, +0.75f,0.453125f, +0.757813f,0.453125f, +0.765625f,0.453125f, +0.773438f,0.453125f, +0.78125f,0.453125f, +0.789063f,0.453125f, +0.796875f,0.453125f, +0.804688f,0.453125f, +0.8125f,0.453125f, +0.820313f,0.453125f, +0.828125f,0.453125f, +0.835938f,0.453125f, +0.84375f,0.453125f, +0.851563f,0.453125f, +0.859375f,0.453125f, +0.867188f,0.453125f, +0.875f,0.453125f, +0.882813f,0.453125f, +0.890625f,0.453125f, +0.898438f,0.453125f, +0.90625f,0.453125f, +0.914063f,0.453125f, +0.921875f,0.453125f, +0.929688f,0.453125f, +0.9375f,0.453125f, +0.945313f,0.453125f, +0.953125f,0.453125f, +0.960938f,0.453125f, +0.96875f,0.453125f, +0.976563f,0.453125f, +0.984375f,0.453125f, +0.992188f,0.453125f, +1.0f,0.453125f, +0.507813f,0.460938f, +0.515625f,0.460938f, +0.523438f,0.460938f, +0.53125f,0.460938f, +0.539063f,0.460938f, +0.546875f,0.460938f, +0.554688f,0.460938f, +0.5625f,0.460938f, +0.570313f,0.460938f, +0.578125f,0.460938f, +0.585938f,0.460938f, +0.59375f,0.460938f, +0.601563f,0.460938f, +0.609375f,0.460938f, +0.617188f,0.460938f, +0.625f,0.460938f, +0.632813f,0.460938f, +0.640625f,0.460938f, +0.648438f,0.460938f, +0.65625f,0.460938f, +0.664063f,0.460938f, +0.671875f,0.460938f, +0.679688f,0.460938f, +0.6875f,0.460938f, +0.695313f,0.460938f, +0.703125f,0.460938f, +0.710938f,0.460938f, +0.71875f,0.460938f, +0.726563f,0.460938f, +0.734375f,0.460938f, +0.742188f,0.460938f, +0.75f,0.460938f, +0.757813f,0.460938f, +0.765625f,0.460938f, +0.773438f,0.460938f, +0.78125f,0.460938f, +0.789063f,0.460938f, +0.796875f,0.460938f, +0.804688f,0.460938f, +0.8125f,0.460938f, +0.820313f,0.460938f, +0.828125f,0.460938f, +0.835938f,0.460938f, +0.84375f,0.460938f, +0.851563f,0.460938f, +0.859375f,0.460938f, +0.867188f,0.460938f, +0.875f,0.460938f, +0.882813f,0.460938f, +0.890625f,0.460938f, +0.898438f,0.460938f, +0.90625f,0.460938f, +0.914063f,0.460938f, +0.921875f,0.460938f, +0.929688f,0.460938f, +0.9375f,0.460938f, +0.945313f,0.460938f, +0.953125f,0.460938f, +0.960938f,0.460938f, +0.96875f,0.460938f, +0.976563f,0.460938f, +0.984375f,0.460938f, +0.992188f,0.460938f, +1.0f,0.460938f, +0.507813f,0.46875f, +0.515625f,0.46875f, +0.523438f,0.46875f, +0.53125f,0.46875f, +0.539063f,0.46875f, +0.546875f,0.46875f, +0.554688f,0.46875f, +0.5625f,0.46875f, +0.570313f,0.46875f, +0.578125f,0.46875f, +0.585938f,0.46875f, +0.59375f,0.46875f, +0.601563f,0.46875f, +0.609375f,0.46875f, +0.617188f,0.46875f, +0.625f,0.46875f, +0.632813f,0.46875f, +0.640625f,0.46875f, +0.648438f,0.46875f, +0.65625f,0.46875f, +0.664063f,0.46875f, +0.671875f,0.46875f, +0.679688f,0.46875f, +0.6875f,0.46875f, +0.695313f,0.46875f, +0.703125f,0.46875f, +0.710938f,0.46875f, +0.71875f,0.46875f, +0.726563f,0.46875f, +0.734375f,0.46875f, +0.742188f,0.46875f, +0.75f,0.46875f, +0.757813f,0.46875f, +0.765625f,0.46875f, +0.773438f,0.46875f, +0.78125f,0.46875f, +0.789063f,0.46875f, +0.796875f,0.46875f, +0.804688f,0.46875f, +0.8125f,0.46875f, +0.820313f,0.46875f, +0.828125f,0.46875f, +0.835938f,0.46875f, +0.84375f,0.46875f, +0.851563f,0.46875f, +0.859375f,0.46875f, +0.867188f,0.46875f, +0.875f,0.46875f, +0.882813f,0.46875f, +0.890625f,0.46875f, +0.898438f,0.46875f, +0.90625f,0.46875f, +0.914063f,0.46875f, +0.921875f,0.46875f, +0.929688f,0.46875f, +0.9375f,0.46875f, +0.945313f,0.46875f, +0.953125f,0.46875f, +0.960938f,0.46875f, +0.96875f,0.46875f, +0.976563f,0.46875f, +0.984375f,0.46875f, +0.992188f,0.46875f, +1.0f,0.46875f, +0.507813f,0.476563f, +0.515625f,0.476563f, +0.523438f,0.476563f, +0.53125f,0.476563f, +0.539063f,0.476563f, +0.546875f,0.476563f, +0.554688f,0.476563f, +0.5625f,0.476563f, +0.570313f,0.476563f, +0.578125f,0.476563f, +0.585938f,0.476563f, +0.59375f,0.476563f, +0.601563f,0.476563f, +0.609375f,0.476563f, +0.617188f,0.476563f, +0.625f,0.476563f, +0.632813f,0.476563f, +0.640625f,0.476563f, +0.648438f,0.476563f, +0.65625f,0.476563f, +0.664063f,0.476563f, +0.671875f,0.476563f, +0.679688f,0.476563f, +0.6875f,0.476563f, +0.695313f,0.476563f, +0.703125f,0.476563f, +0.710938f,0.476563f, +0.71875f,0.476563f, +0.726563f,0.476563f, +0.734375f,0.476563f, +0.742188f,0.476563f, +0.75f,0.476563f, +0.757813f,0.476563f, +0.765625f,0.476563f, +0.773438f,0.476563f, +0.78125f,0.476563f, +0.789063f,0.476563f, +0.796875f,0.476563f, +0.804688f,0.476563f, +0.8125f,0.476563f, +0.820313f,0.476563f, +0.828125f,0.476563f, +0.835938f,0.476563f, +0.84375f,0.476563f, +0.851563f,0.476563f, +0.859375f,0.476563f, +0.867188f,0.476563f, +0.875f,0.476563f, +0.882813f,0.476563f, +0.890625f,0.476563f, +0.898438f,0.476563f, +0.90625f,0.476563f, +0.914063f,0.476563f, +0.921875f,0.476563f, +0.929688f,0.476563f, +0.9375f,0.476563f, +0.945313f,0.476563f, +0.953125f,0.476563f, +0.960938f,0.476563f, +0.96875f,0.476563f, +0.976563f,0.476563f, +0.984375f,0.476563f, +0.992188f,0.476563f, +1.0f,0.476563f, +0.507813f,0.484375f, +0.515625f,0.484375f, +0.523438f,0.484375f, +0.53125f,0.484375f, +0.539063f,0.484375f, +0.546875f,0.484375f, +0.554688f,0.484375f, +0.5625f,0.484375f, +0.570313f,0.484375f, +0.578125f,0.484375f, +0.585938f,0.484375f, +0.59375f,0.484375f, +0.601563f,0.484375f, +0.609375f,0.484375f, +0.617188f,0.484375f, +0.625f,0.484375f, +0.632813f,0.484375f, +0.640625f,0.484375f, +0.648438f,0.484375f, +0.65625f,0.484375f, +0.664063f,0.484375f, +0.671875f,0.484375f, +0.679688f,0.484375f, +0.6875f,0.484375f, +0.695313f,0.484375f, +0.703125f,0.484375f, +0.710938f,0.484375f, +0.71875f,0.484375f, +0.726563f,0.484375f, +0.734375f,0.484375f, +0.742188f,0.484375f, +0.75f,0.484375f, +0.757813f,0.484375f, +0.765625f,0.484375f, +0.773438f,0.484375f, +0.78125f,0.484375f, +0.789063f,0.484375f, +0.796875f,0.484375f, +0.804688f,0.484375f, +0.8125f,0.484375f, +0.820313f,0.484375f, +0.828125f,0.484375f, +0.835938f,0.484375f, +0.84375f,0.484375f, +0.851563f,0.484375f, +0.859375f,0.484375f, +0.867188f,0.484375f, +0.875f,0.484375f, +0.882813f,0.484375f, +0.890625f,0.484375f, +0.898438f,0.484375f, +0.90625f,0.484375f, +0.914063f,0.484375f, +0.921875f,0.484375f, +0.929688f,0.484375f, +0.9375f,0.484375f, +0.945313f,0.484375f, +0.953125f,0.484375f, +0.960938f,0.484375f, +0.96875f,0.484375f, +0.976563f,0.484375f, +0.984375f,0.484375f, +0.992188f,0.484375f, +1.0f,0.484375f, +0.507813f,0.492188f, +0.515625f,0.492188f, +0.523438f,0.492188f, +0.53125f,0.492188f, +0.539063f,0.492188f, +0.546875f,0.492188f, +0.554688f,0.492188f, +0.5625f,0.492188f, +0.570313f,0.492188f, +0.578125f,0.492188f, +0.585938f,0.492188f, +0.59375f,0.492188f, +0.601563f,0.492188f, +0.609375f,0.492188f, +0.617188f,0.492188f, +0.625f,0.492188f, +0.632813f,0.492188f, +0.640625f,0.492188f, +0.648438f,0.492188f, +0.65625f,0.492188f, +0.664063f,0.492188f, +0.671875f,0.492188f, +0.679688f,0.492188f, +0.6875f,0.492188f, +0.695313f,0.492188f, +0.703125f,0.492188f, +0.710938f,0.492188f, +0.71875f,0.492188f, +0.726563f,0.492188f, +0.734375f,0.492188f, +0.742188f,0.492188f, +0.75f,0.492188f, +0.757813f,0.492188f, +0.765625f,0.492188f, +0.773438f,0.492188f, +0.78125f,0.492188f, +0.789063f,0.492188f, +0.796875f,0.492188f, +0.804688f,0.492188f, +0.8125f,0.492188f, +0.820313f,0.492188f, +0.828125f,0.492188f, +0.835938f,0.492188f, +0.84375f,0.492188f, +0.851563f,0.492188f, +0.859375f,0.492188f, +0.867188f,0.492188f, +0.875f,0.492188f, +0.882813f,0.492188f, +0.890625f,0.492188f, +0.898438f,0.492188f, +0.90625f,0.492188f, +0.914063f,0.492188f, +0.921875f,0.492188f, +0.929688f,0.492188f, +0.9375f,0.492188f, +0.945313f,0.492188f, +0.953125f,0.492188f, +0.960938f,0.492188f, +0.96875f,0.492188f, +0.976563f,0.492188f, +0.984375f,0.492188f, +0.992188f,0.492188f, +1.0f,0.492188f, +}; + +unsigned short Landscape04Idx[] = { +0,1,2, +3,2,1, +2,3,4, +5,4,3, +4,5,6, +7,6,5, +6,7,8, +9,8,7, +8,9,10, +11,10,9, +10,11,12, +13,12,11, +12,13,14, +15,14,13, +14,15,16, +17,16,15, +16,17,18, +19,18,17, +18,19,20, +21,20,19, +20,21,22, +23,22,21, +22,23,24, +25,24,23, +24,25,26, +27,26,25, +26,27,28, +29,28,27, +28,29,30, +31,30,29, +30,31,32, +33,32,31, +32,33,34, +35,34,33, +34,35,36, +37,36,35, +36,37,38, +39,38,37, +38,39,40, +41,40,39, +40,41,42, +43,42,41, +42,43,44, +45,44,43, +44,45,46, +47,46,45, +46,47,48, +49,48,47, +48,49,50, +51,50,49, +50,51,52, +53,52,51, +52,53,54, +55,54,53, +54,55,56, +57,56,55, +56,57,58, +59,58,57, +58,59,60, +61,60,59, +60,61,62, +63,62,61, +62,63,64, +65,64,63, +64,65,66, +67,66,65, +66,67,68, +69,68,67, +68,69,70, +71,70,69, +70,71,72, +73,72,71, +72,73,74, +75,74,73, +74,75,76, +77,76,75, +76,77,78, +79,78,77, +78,79,80, +81,80,79, +80,81,82, +83,82,81, +82,83,84, +85,84,83, +84,85,86, +87,86,85, +86,87,88, +89,88,87, +88,89,90, +91,90,89, +90,91,92, +93,92,91, +92,93,94, +95,94,93, +94,95,96, +97,96,95, +96,97,98, +99,98,97, +98,99,100, +101,100,99, +100,101,102, +103,102,101, +102,103,104, +105,104,103, +104,105,106, +107,106,105, +106,107,108, +109,108,107, +108,109,110, +111,110,109, +110,111,112, +113,112,111, +112,113,114, +115,114,113, +114,115,116, +117,116,115, +116,117,118, +119,118,117, +118,119,120, +121,120,119, +120,121,122, +123,122,121, +122,123,124, +125,124,123, +124,125,126, +127,126,125, +128,0,129, +2,129,0, +129,2,130, +4,130,2, +130,4,131, +6,131,4, +131,6,132, +8,132,6, +132,8,133, +10,133,8, +133,10,134, +12,134,10, +134,12,135, +14,135,12, +135,14,136, +16,136,14, +136,16,137, +18,137,16, +137,18,138, +20,138,18, +138,20,139, +22,139,20, +139,22,140, +24,140,22, +140,24,141, +26,141,24, +141,26,142, +28,142,26, +142,28,143, +30,143,28, +143,30,144, +32,144,30, +144,32,145, +34,145,32, +145,34,146, +36,146,34, +146,36,147, +38,147,36, +147,38,148, +40,148,38, +148,40,149, +42,149,40, +149,42,150, +44,150,42, +150,44,151, +46,151,44, +151,46,152, +48,152,46, +152,48,153, +50,153,48, +153,50,154, +52,154,50, +154,52,155, +54,155,52, +155,54,156, +56,156,54, +156,56,157, +58,157,56, +157,58,158, +60,158,58, +158,60,159, +62,159,60, +159,62,160, +64,160,62, +160,64,161, +66,161,64, +161,66,162, +68,162,66, +162,68,163, +70,163,68, +163,70,164, +72,164,70, +164,72,165, +74,165,72, +165,74,166, +76,166,74, +166,76,167, +78,167,76, +167,78,168, +80,168,78, +168,80,169, +82,169,80, +169,82,170, +84,170,82, +170,84,171, +86,171,84, +171,86,172, +88,172,86, +172,88,173, +90,173,88, +173,90,174, +92,174,90, +174,92,175, +94,175,92, +175,94,176, +96,176,94, +176,96,177, +98,177,96, +177,98,178, +100,178,98, +178,100,179, +102,179,100, +179,102,180, +104,180,102, +180,104,181, +106,181,104, +181,106,182, +108,182,106, +182,108,183, +110,183,108, +183,110,184, +112,184,110, +184,112,185, +114,185,112, +185,114,186, +116,186,114, +186,116,187, +118,187,116, +187,118,188, +120,188,118, +188,120,189, +122,189,120, +189,122,190, +124,190,122, +190,124,191, +126,191,124, +192,128,193, +129,193,128, +193,129,194, +130,194,129, +194,130,195, +131,195,130, +195,131,196, +132,196,131, +196,132,197, +133,197,132, +197,133,198, +134,198,133, +198,134,199, +135,199,134, +199,135,200, +136,200,135, +200,136,201, +137,201,136, +201,137,202, +138,202,137, +202,138,203, +139,203,138, +203,139,204, +140,204,139, +204,140,205, +141,205,140, +205,141,206, +142,206,141, +206,142,207, +143,207,142, +207,143,208, +144,208,143, +208,144,209, +145,209,144, +209,145,210, +146,210,145, +210,146,211, +147,211,146, +211,147,212, +148,212,147, +212,148,213, +149,213,148, +213,149,214, +150,214,149, +214,150,215, +151,215,150, +215,151,216, +152,216,151, +216,152,217, +153,217,152, +217,153,218, +154,218,153, +218,154,219, +155,219,154, +219,155,220, +156,220,155, +220,156,221, +157,221,156, +221,157,222, +158,222,157, +222,158,223, +159,223,158, +223,159,224, +160,224,159, +224,160,225, +161,225,160, +225,161,226, +162,226,161, +226,162,227, +163,227,162, +227,163,228, +164,228,163, +228,164,229, +165,229,164, +229,165,230, +166,230,165, +230,166,231, +167,231,166, +231,167,232, +168,232,167, +232,168,233, +169,233,168, +233,169,234, +170,234,169, +234,170,235, +171,235,170, +235,171,236, +172,236,171, +236,172,237, +173,237,172, +237,173,238, +174,238,173, +238,174,239, +175,239,174, +239,175,240, +176,240,175, +240,176,241, +177,241,176, +241,177,242, +178,242,177, +242,178,243, +179,243,178, +243,179,244, +180,244,179, +244,180,245, +181,245,180, +245,181,246, +182,246,181, +246,182,247, +183,247,182, +247,183,248, +184,248,183, +248,184,249, +185,249,184, +249,185,250, +186,250,185, +250,186,251, +187,251,186, +251,187,252, +188,252,187, +252,188,253, +189,253,188, +253,189,254, +190,254,189, +254,190,255, +191,255,190, +256,192,257, +193,257,192, +257,193,258, +194,258,193, +258,194,259, +195,259,194, +259,195,260, +196,260,195, +260,196,261, +197,261,196, +261,197,262, +198,262,197, +262,198,263, +199,263,198, +263,199,264, +200,264,199, +264,200,265, +201,265,200, +265,201,266, +202,266,201, +266,202,267, +203,267,202, +267,203,268, +204,268,203, +268,204,269, +205,269,204, +269,205,270, +206,270,205, +270,206,271, +207,271,206, +271,207,272, +208,272,207, +272,208,273, +209,273,208, +273,209,274, +210,274,209, +274,210,275, +211,275,210, +275,211,276, +212,276,211, +276,212,277, +213,277,212, +277,213,278, +214,278,213, +278,214,279, +215,279,214, +279,215,280, +216,280,215, +280,216,281, +217,281,216, +281,217,282, +218,282,217, +282,218,283, +219,283,218, +283,219,284, +220,284,219, +284,220,285, +221,285,220, +285,221,286, +222,286,221, +286,222,287, +223,287,222, +287,223,288, +224,288,223, +288,224,289, +225,289,224, +289,225,290, +226,290,225, +290,226,291, +227,291,226, +291,227,292, +228,292,227, +292,228,293, +229,293,228, +293,229,294, +230,294,229, +294,230,295, +231,295,230, +295,231,296, +232,296,231, +296,232,297, +233,297,232, +297,233,298, +234,298,233, +298,234,299, +235,299,234, +299,235,300, +236,300,235, +300,236,301, +237,301,236, +301,237,302, +238,302,237, +302,238,303, +239,303,238, +303,239,304, +240,304,239, +304,240,305, +241,305,240, +305,241,306, +242,306,241, +306,242,307, +243,307,242, +307,243,308, +244,308,243, +308,244,309, +245,309,244, +309,245,310, +246,310,245, +310,246,311, +247,311,246, +311,247,312, +248,312,247, +312,248,313, +249,313,248, +313,249,314, +250,314,249, +314,250,315, +251,315,250, +315,251,316, +252,316,251, +316,252,317, +253,317,252, +317,253,318, +254,318,253, +318,254,319, +255,319,254, +320,256,321, +257,321,256, +321,257,322, +258,322,257, +322,258,323, +259,323,258, +323,259,324, +260,324,259, +324,260,325, +261,325,260, +325,261,326, +262,326,261, +326,262,327, +263,327,262, +327,263,328, +264,328,263, +328,264,329, +265,329,264, +329,265,330, +266,330,265, +330,266,331, +267,331,266, +331,267,332, +268,332,267, +332,268,333, +269,333,268, +333,269,334, +270,334,269, +334,270,335, +271,335,270, +335,271,336, +272,336,271, +336,272,337, +273,337,272, +337,273,338, +274,338,273, +338,274,339, +275,339,274, +339,275,340, +276,340,275, +340,276,341, +277,341,276, +341,277,342, +278,342,277, +342,278,343, +279,343,278, +343,279,344, +280,344,279, +344,280,345, +281,345,280, +345,281,346, +282,346,281, +346,282,347, +283,347,282, +347,283,348, +284,348,283, +348,284,349, +285,349,284, +349,285,350, +286,350,285, +350,286,351, +287,351,286, +351,287,352, +288,352,287, +352,288,353, +289,353,288, +353,289,354, +290,354,289, +354,290,355, +291,355,290, +355,291,356, +292,356,291, +356,292,357, +293,357,292, +357,293,358, +294,358,293, +358,294,359, +295,359,294, +359,295,360, +296,360,295, +360,296,361, +297,361,296, +361,297,362, +298,362,297, +362,298,363, +299,363,298, +363,299,364, +300,364,299, +364,300,365, +301,365,300, +365,301,366, +302,366,301, +366,302,367, +303,367,302, +367,303,368, +304,368,303, +368,304,369, +305,369,304, +369,305,370, +306,370,305, +370,306,371, +307,371,306, +371,307,372, +308,372,307, +372,308,373, +309,373,308, +373,309,374, +310,374,309, +374,310,375, +311,375,310, +375,311,376, +312,376,311, +376,312,377, +313,377,312, +377,313,378, +314,378,313, +378,314,379, +315,379,314, +379,315,380, +316,380,315, +380,316,381, +317,381,316, +381,317,382, +318,382,317, +382,318,383, +319,383,318, +384,320,385, +321,385,320, +385,321,386, +322,386,321, +386,322,387, +323,387,322, +387,323,388, +324,388,323, +388,324,389, +325,389,324, +389,325,390, +326,390,325, +390,326,391, +327,391,326, +391,327,392, +328,392,327, +392,328,393, +329,393,328, +393,329,394, +330,394,329, +394,330,395, +331,395,330, +395,331,396, +332,396,331, +396,332,397, +333,397,332, +397,333,398, +334,398,333, +398,334,399, +335,399,334, +399,335,400, +336,400,335, +400,336,401, +337,401,336, +401,337,402, +338,402,337, +402,338,403, +339,403,338, +403,339,404, +340,404,339, +404,340,405, +341,405,340, +405,341,406, +342,406,341, +406,342,407, +343,407,342, +407,343,408, +344,408,343, +408,344,409, +345,409,344, +409,345,410, +346,410,345, +410,346,411, +347,411,346, +411,347,412, +348,412,347, +412,348,413, +349,413,348, +413,349,414, +350,414,349, +414,350,415, +351,415,350, +415,351,416, +352,416,351, +416,352,417, +353,417,352, +417,353,418, +354,418,353, +418,354,419, +355,419,354, +419,355,420, +356,420,355, +420,356,421, +357,421,356, +421,357,422, +358,422,357, +422,358,423, +359,423,358, +423,359,424, +360,424,359, +424,360,425, +361,425,360, +425,361,426, +362,426,361, +426,362,427, +363,427,362, +427,363,428, +364,428,363, +428,364,429, +365,429,364, +429,365,430, +366,430,365, +430,366,431, +367,431,366, +431,367,432, +368,432,367, +432,368,433, +369,433,368, +433,369,434, +370,434,369, +434,370,435, +371,435,370, +435,371,436, +372,436,371, +436,372,437, +373,437,372, +437,373,438, +374,438,373, +438,374,439, +375,439,374, +439,375,440, +376,440,375, +440,376,441, +377,441,376, +441,377,442, +378,442,377, +442,378,443, +379,443,378, +443,379,444, +380,444,379, +444,380,445, +381,445,380, +445,381,446, +382,446,381, +446,382,447, +383,447,382, +448,384,449, +385,449,384, +449,385,450, +386,450,385, +450,386,451, +387,451,386, +451,387,452, +388,452,387, +452,388,453, +389,453,388, +453,389,454, +390,454,389, +454,390,455, +391,455,390, +455,391,456, +392,456,391, +456,392,457, +393,457,392, +457,393,458, +394,458,393, +458,394,459, +395,459,394, +459,395,460, +396,460,395, +460,396,461, +397,461,396, +461,397,462, +398,462,397, +462,398,463, +399,463,398, +463,399,464, +400,464,399, +464,400,465, +401,465,400, +465,401,466, +402,466,401, +466,402,467, +403,467,402, +467,403,468, +404,468,403, +468,404,469, +405,469,404, +469,405,470, +406,470,405, +470,406,471, +407,471,406, +471,407,472, +408,472,407, +472,408,473, +409,473,408, +473,409,474, +410,474,409, +474,410,475, +411,475,410, +475,411,476, +412,476,411, +476,412,477, +413,477,412, +477,413,478, +414,478,413, +478,414,479, +415,479,414, +479,415,480, +416,480,415, +480,416,481, +417,481,416, +481,417,482, +418,482,417, +482,418,483, +419,483,418, +483,419,484, +420,484,419, +484,420,485, +421,485,420, +485,421,486, +422,486,421, +486,422,487, +423,487,422, +487,423,488, +424,488,423, +488,424,489, +425,489,424, +489,425,490, +426,490,425, +490,426,491, +427,491,426, +491,427,492, +428,492,427, +492,428,493, +429,493,428, +493,429,494, +430,494,429, +494,430,495, +431,495,430, +495,431,496, +432,496,431, +496,432,497, +433,497,432, +497,433,498, +434,498,433, +498,434,499, +435,499,434, +499,435,500, +436,500,435, +500,436,501, +437,501,436, +501,437,502, +438,502,437, +502,438,503, +439,503,438, +503,439,504, +440,504,439, +504,440,505, +441,505,440, +505,441,506, +442,506,441, +506,442,507, +443,507,442, +507,443,508, +444,508,443, +508,444,509, +445,509,444, +509,445,510, +446,510,445, +510,446,511, +447,511,446, +512,448,513, +449,513,448, +513,449,514, +450,514,449, +514,450,515, +451,515,450, +515,451,516, +452,516,451, +516,452,517, +453,517,452, +517,453,518, +454,518,453, +518,454,519, +455,519,454, +519,455,520, +456,520,455, +520,456,521, +457,521,456, +521,457,522, +458,522,457, +522,458,523, +459,523,458, +523,459,524, +460,524,459, +524,460,525, +461,525,460, +525,461,526, +462,526,461, +526,462,527, +463,527,462, +527,463,528, +464,528,463, +528,464,529, +465,529,464, +529,465,530, +466,530,465, +530,466,531, +467,531,466, +531,467,532, +468,532,467, +532,468,533, +469,533,468, +533,469,534, +470,534,469, +534,470,535, +471,535,470, +535,471,536, +472,536,471, +536,472,537, +473,537,472, +537,473,538, +474,538,473, +538,474,539, +475,539,474, +539,475,540, +476,540,475, +540,476,541, +477,541,476, +541,477,542, +478,542,477, +542,478,543, +479,543,478, +543,479,544, +480,544,479, +544,480,545, +481,545,480, +545,481,546, +482,546,481, +546,482,547, +483,547,482, +547,483,548, +484,548,483, +548,484,549, +485,549,484, +549,485,550, +486,550,485, +550,486,551, +487,551,486, +551,487,552, +488,552,487, +552,488,553, +489,553,488, +553,489,554, +490,554,489, +554,490,555, +491,555,490, +555,491,556, +492,556,491, +556,492,557, +493,557,492, +557,493,558, +494,558,493, +558,494,559, +495,559,494, +559,495,560, +496,560,495, +560,496,561, +497,561,496, +561,497,562, +498,562,497, +562,498,563, +499,563,498, +563,499,564, +500,564,499, +564,500,565, +501,565,500, +565,501,566, +502,566,501, +566,502,567, +503,567,502, +567,503,568, +504,568,503, +568,504,569, +505,569,504, +569,505,570, +506,570,505, +570,506,571, +507,571,506, +571,507,572, +508,572,507, +572,508,573, +509,573,508, +573,509,574, +510,574,509, +574,510,575, +511,575,510, +576,512,577, +513,577,512, +577,513,578, +514,578,513, +578,514,579, +515,579,514, +579,515,580, +516,580,515, +580,516,581, +517,581,516, +581,517,582, +518,582,517, +582,518,583, +519,583,518, +583,519,584, +520,584,519, +584,520,585, +521,585,520, +585,521,586, +522,586,521, +586,522,587, +523,587,522, +587,523,588, +524,588,523, +588,524,589, +525,589,524, +589,525,590, +526,590,525, +590,526,591, +527,591,526, +591,527,592, +528,592,527, +592,528,593, +529,593,528, +593,529,594, +530,594,529, +594,530,595, +531,595,530, +595,531,596, +532,596,531, +596,532,597, +533,597,532, +597,533,598, +534,598,533, +598,534,599, +535,599,534, +599,535,600, +536,600,535, +600,536,601, +537,601,536, +601,537,602, +538,602,537, +602,538,603, +539,603,538, +603,539,604, +540,604,539, +604,540,605, +541,605,540, +605,541,606, +542,606,541, +606,542,607, +543,607,542, +607,543,608, +544,608,543, +608,544,609, +545,609,544, +609,545,610, +546,610,545, +610,546,611, +547,611,546, +611,547,612, +548,612,547, +612,548,613, +549,613,548, +613,549,614, +550,614,549, +614,550,615, +551,615,550, +615,551,616, +552,616,551, +616,552,617, +553,617,552, +617,553,618, +554,618,553, +618,554,619, +555,619,554, +619,555,620, +556,620,555, +620,556,621, +557,621,556, +621,557,622, +558,622,557, +622,558,623, +559,623,558, +623,559,624, +560,624,559, +624,560,625, +561,625,560, +625,561,626, +562,626,561, +626,562,627, +563,627,562, +627,563,628, +564,628,563, +628,564,629, +565,629,564, +629,565,630, +566,630,565, +630,566,631, +567,631,566, +631,567,632, +568,632,567, +632,568,633, +569,633,568, +633,569,634, +570,634,569, +634,570,635, +571,635,570, +635,571,636, +572,636,571, +636,572,637, +573,637,572, +637,573,638, +574,638,573, +638,574,639, +575,639,574, +640,576,641, +577,641,576, +641,577,642, +578,642,577, +642,578,643, +579,643,578, +643,579,644, +580,644,579, +644,580,645, +581,645,580, +645,581,646, +582,646,581, +646,582,647, +583,647,582, +647,583,648, +584,648,583, +648,584,649, +585,649,584, +649,585,650, +586,650,585, +650,586,651, +587,651,586, +651,587,652, +588,652,587, +652,588,653, +589,653,588, +653,589,654, +590,654,589, +654,590,655, +591,655,590, +655,591,656, +592,656,591, +656,592,657, +593,657,592, +657,593,658, +594,658,593, +658,594,659, +595,659,594, +659,595,660, +596,660,595, +660,596,661, +597,661,596, +661,597,662, +598,662,597, +662,598,663, +599,663,598, +663,599,664, +600,664,599, +664,600,665, +601,665,600, +665,601,666, +602,666,601, +666,602,667, +603,667,602, +667,603,668, +604,668,603, +668,604,669, +605,669,604, +669,605,670, +606,670,605, +670,606,671, +607,671,606, +671,607,672, +608,672,607, +672,608,673, +609,673,608, +673,609,674, +610,674,609, +674,610,675, +611,675,610, +675,611,676, +612,676,611, +676,612,677, +613,677,612, +677,613,678, +614,678,613, +678,614,679, +615,679,614, +679,615,680, +616,680,615, +680,616,681, +617,681,616, +681,617,682, +618,682,617, +682,618,683, +619,683,618, +683,619,684, +620,684,619, +684,620,685, +621,685,620, +685,621,686, +622,686,621, +686,622,687, +623,687,622, +687,623,688, +624,688,623, +688,624,689, +625,689,624, +689,625,690, +626,690,625, +690,626,691, +627,691,626, +691,627,692, +628,692,627, +692,628,693, +629,693,628, +693,629,694, +630,694,629, +694,630,695, +631,695,630, +695,631,696, +632,696,631, +696,632,697, +633,697,632, +697,633,698, +634,698,633, +698,634,699, +635,699,634, +699,635,700, +636,700,635, +700,636,701, +637,701,636, +701,637,702, +638,702,637, +702,638,703, +639,703,638, +704,640,705, +641,705,640, +705,641,706, +642,706,641, +706,642,707, +643,707,642, +707,643,708, +644,708,643, +708,644,709, +645,709,644, +709,645,710, +646,710,645, +710,646,711, +647,711,646, +711,647,712, +648,712,647, +712,648,713, +649,713,648, +713,649,714, +650,714,649, +714,650,715, +651,715,650, +715,651,716, +652,716,651, +716,652,717, +653,717,652, +717,653,718, +654,718,653, +718,654,719, +655,719,654, +719,655,720, +656,720,655, +720,656,721, +657,721,656, +721,657,722, +658,722,657, +722,658,723, +659,723,658, +723,659,724, +660,724,659, +724,660,725, +661,725,660, +725,661,726, +662,726,661, +726,662,727, +663,727,662, +727,663,728, +664,728,663, +728,664,729, +665,729,664, +729,665,730, +666,730,665, +730,666,731, +667,731,666, +731,667,732, +668,732,667, +732,668,733, +669,733,668, +733,669,734, +670,734,669, +734,670,735, +671,735,670, +735,671,736, +672,736,671, +736,672,737, +673,737,672, +737,673,738, +674,738,673, +738,674,739, +675,739,674, +739,675,740, +676,740,675, +740,676,741, +677,741,676, +741,677,742, +678,742,677, +742,678,743, +679,743,678, +743,679,744, +680,744,679, +744,680,745, +681,745,680, +745,681,746, +682,746,681, +746,682,747, +683,747,682, +747,683,748, +684,748,683, +748,684,749, +685,749,684, +749,685,750, +686,750,685, +750,686,751, +687,751,686, +751,687,752, +688,752,687, +752,688,753, +689,753,688, +753,689,754, +690,754,689, +754,690,755, +691,755,690, +755,691,756, +692,756,691, +756,692,757, +693,757,692, +757,693,758, +694,758,693, +758,694,759, +695,759,694, +759,695,760, +696,760,695, +760,696,761, +697,761,696, +761,697,762, +698,762,697, +762,698,763, +699,763,698, +763,699,764, +700,764,699, +764,700,765, +701,765,700, +765,701,766, +702,766,701, +766,702,767, +703,767,702, +768,704,769, +705,769,704, +769,705,770, +706,770,705, +770,706,771, +707,771,706, +771,707,772, +708,772,707, +772,708,773, +709,773,708, +773,709,774, +710,774,709, +774,710,775, +711,775,710, +775,711,776, +712,776,711, +776,712,777, +713,777,712, +777,713,778, +714,778,713, +778,714,779, +715,779,714, +779,715,780, +716,780,715, +780,716,781, +717,781,716, +781,717,782, +718,782,717, +782,718,783, +719,783,718, +783,719,784, +720,784,719, +784,720,785, +721,785,720, +785,721,786, +722,786,721, +786,722,787, +723,787,722, +787,723,788, +724,788,723, +788,724,789, +725,789,724, +789,725,790, +726,790,725, +790,726,791, +727,791,726, +791,727,792, +728,792,727, +792,728,793, +729,793,728, +793,729,794, +730,794,729, +794,730,795, +731,795,730, +795,731,796, +732,796,731, +796,732,797, +733,797,732, +797,733,798, +734,798,733, +798,734,799, +735,799,734, +799,735,800, +736,800,735, +800,736,801, +737,801,736, +801,737,802, +738,802,737, +802,738,803, +739,803,738, +803,739,804, +740,804,739, +804,740,805, +741,805,740, +805,741,806, +742,806,741, +806,742,807, +743,807,742, +807,743,808, +744,808,743, +808,744,809, +745,809,744, +809,745,810, +746,810,745, +810,746,811, +747,811,746, +811,747,812, +748,812,747, +812,748,813, +749,813,748, +813,749,814, +750,814,749, +814,750,815, +751,815,750, +815,751,816, +752,816,751, +816,752,817, +753,817,752, +817,753,818, +754,818,753, +818,754,819, +755,819,754, +819,755,820, +756,820,755, +820,756,821, +757,821,756, +821,757,822, +758,822,757, +822,758,823, +759,823,758, +823,759,824, +760,824,759, +824,760,825, +761,825,760, +825,761,826, +762,826,761, +826,762,827, +763,827,762, +827,763,828, +764,828,763, +828,764,829, +765,829,764, +829,765,830, +766,830,765, +830,766,831, +767,831,766, +832,768,833, +769,833,768, +833,769,834, +770,834,769, +834,770,835, +771,835,770, +835,771,836, +772,836,771, +836,772,837, +773,837,772, +837,773,838, +774,838,773, +838,774,839, +775,839,774, +839,775,840, +776,840,775, +840,776,841, +777,841,776, +841,777,842, +778,842,777, +842,778,843, +779,843,778, +843,779,844, +780,844,779, +844,780,845, +781,845,780, +845,781,846, +782,846,781, +846,782,847, +783,847,782, +847,783,848, +784,848,783, +848,784,849, +785,849,784, +849,785,850, +786,850,785, +850,786,851, +787,851,786, +851,787,852, +788,852,787, +852,788,853, +789,853,788, +853,789,854, +790,854,789, +854,790,855, +791,855,790, +855,791,856, +792,856,791, +856,792,857, +793,857,792, +857,793,858, +794,858,793, +858,794,859, +795,859,794, +859,795,860, +796,860,795, +860,796,861, +797,861,796, +861,797,862, +798,862,797, +862,798,863, +799,863,798, +863,799,864, +800,864,799, +864,800,865, +801,865,800, +865,801,866, +802,866,801, +866,802,867, +803,867,802, +867,803,868, +804,868,803, +868,804,869, +805,869,804, +869,805,870, +806,870,805, +870,806,871, +807,871,806, +871,807,872, +808,872,807, +872,808,873, +809,873,808, +873,809,874, +810,874,809, +874,810,875, +811,875,810, +875,811,876, +812,876,811, +876,812,877, +813,877,812, +877,813,878, +814,878,813, +878,814,879, +815,879,814, +879,815,880, +816,880,815, +880,816,881, +817,881,816, +881,817,882, +818,882,817, +882,818,883, +819,883,818, +883,819,884, +820,884,819, +884,820,885, +821,885,820, +885,821,886, +822,886,821, +886,822,887, +823,887,822, +887,823,888, +824,888,823, +888,824,889, +825,889,824, +889,825,890, +826,890,825, +890,826,891, +827,891,826, +891,827,892, +828,892,827, +892,828,893, +829,893,828, +893,829,894, +830,894,829, +894,830,895, +831,895,830, +896,832,897, +833,897,832, +897,833,898, +834,898,833, +898,834,899, +835,899,834, +899,835,900, +836,900,835, +900,836,901, +837,901,836, +901,837,902, +838,902,837, +902,838,903, +839,903,838, +903,839,904, +840,904,839, +904,840,905, +841,905,840, +905,841,906, +842,906,841, +906,842,907, +843,907,842, +907,843,908, +844,908,843, +908,844,909, +845,909,844, +909,845,910, +846,910,845, +910,846,911, +847,911,846, +911,847,912, +848,912,847, +912,848,913, +849,913,848, +913,849,914, +850,914,849, +914,850,915, +851,915,850, +915,851,916, +852,916,851, +916,852,917, +853,917,852, +917,853,918, +854,918,853, +918,854,919, +855,919,854, +919,855,920, +856,920,855, +920,856,921, +857,921,856, +921,857,922, +858,922,857, +922,858,923, +859,923,858, +923,859,924, +860,924,859, +924,860,925, +861,925,860, +925,861,926, +862,926,861, +926,862,927, +863,927,862, +927,863,928, +864,928,863, +928,864,929, +865,929,864, +929,865,930, +866,930,865, +930,866,931, +867,931,866, +931,867,932, +868,932,867, +932,868,933, +869,933,868, +933,869,934, +870,934,869, +934,870,935, +871,935,870, +935,871,936, +872,936,871, +936,872,937, +873,937,872, +937,873,938, +874,938,873, +938,874,939, +875,939,874, +939,875,940, +876,940,875, +940,876,941, +877,941,876, +941,877,942, +878,942,877, +942,878,943, +879,943,878, +943,879,944, +880,944,879, +944,880,945, +881,945,880, +945,881,946, +882,946,881, +946,882,947, +883,947,882, +947,883,948, +884,948,883, +948,884,949, +885,949,884, +949,885,950, +886,950,885, +950,886,951, +887,951,886, +951,887,952, +888,952,887, +952,888,953, +889,953,888, +953,889,954, +890,954,889, +954,890,955, +891,955,890, +955,891,956, +892,956,891, +956,892,957, +893,957,892, +957,893,958, +894,958,893, +958,894,959, +895,959,894, +960,896,961, +897,961,896, +961,897,962, +898,962,897, +962,898,963, +899,963,898, +963,899,964, +900,964,899, +964,900,965, +901,965,900, +965,901,966, +902,966,901, +966,902,967, +903,967,902, +967,903,968, +904,968,903, +968,904,969, +905,969,904, +969,905,970, +906,970,905, +970,906,971, +907,971,906, +971,907,972, +908,972,907, +972,908,973, +909,973,908, +973,909,974, +910,974,909, +974,910,975, +911,975,910, +975,911,976, +912,976,911, +976,912,977, +913,977,912, +977,913,978, +914,978,913, +978,914,979, +915,979,914, +979,915,980, +916,980,915, +980,916,981, +917,981,916, +981,917,982, +918,982,917, +982,918,983, +919,983,918, +983,919,984, +920,984,919, +984,920,985, +921,985,920, +985,921,986, +922,986,921, +986,922,987, +923,987,922, +987,923,988, +924,988,923, +988,924,989, +925,989,924, +989,925,990, +926,990,925, +990,926,991, +927,991,926, +991,927,992, +928,992,927, +992,928,993, +929,993,928, +993,929,994, +930,994,929, +994,930,995, +931,995,930, +995,931,996, +932,996,931, +996,932,997, +933,997,932, +997,933,998, +934,998,933, +998,934,999, +935,999,934, +999,935,1000, +936,1000,935, +1000,936,1001, +937,1001,936, +1001,937,1002, +938,1002,937, +1002,938,1003, +939,1003,938, +1003,939,1004, +940,1004,939, +1004,940,1005, +941,1005,940, +1005,941,1006, +942,1006,941, +1006,942,1007, +943,1007,942, +1007,943,1008, +944,1008,943, +1008,944,1009, +945,1009,944, +1009,945,1010, +946,1010,945, +1010,946,1011, +947,1011,946, +1011,947,1012, +948,1012,947, +1012,948,1013, +949,1013,948, +1013,949,1014, +950,1014,949, +1014,950,1015, +951,1015,950, +1015,951,1016, +952,1016,951, +1016,952,1017, +953,1017,952, +1017,953,1018, +954,1018,953, +1018,954,1019, +955,1019,954, +1019,955,1020, +956,1020,955, +1020,956,1021, +957,1021,956, +1021,957,1022, +958,1022,957, +1022,958,1023, +959,1023,958, +1024,960,1025, +961,1025,960, +1025,961,1026, +962,1026,961, +1026,962,1027, +963,1027,962, +1027,963,1028, +964,1028,963, +1028,964,1029, +965,1029,964, +1029,965,1030, +966,1030,965, +1030,966,1031, +967,1031,966, +1031,967,1032, +968,1032,967, +1032,968,1033, +969,1033,968, +1033,969,1034, +970,1034,969, +1034,970,1035, +971,1035,970, +1035,971,1036, +972,1036,971, +1036,972,1037, +973,1037,972, +1037,973,1038, +974,1038,973, +1038,974,1039, +975,1039,974, +1039,975,1040, +976,1040,975, +1040,976,1041, +977,1041,976, +1041,977,1042, +978,1042,977, +1042,978,1043, +979,1043,978, +1043,979,1044, +980,1044,979, +1044,980,1045, +981,1045,980, +1045,981,1046, +982,1046,981, +1046,982,1047, +983,1047,982, +1047,983,1048, +984,1048,983, +1048,984,1049, +985,1049,984, +1049,985,1050, +986,1050,985, +1050,986,1051, +987,1051,986, +1051,987,1052, +988,1052,987, +1052,988,1053, +989,1053,988, +1053,989,1054, +990,1054,989, +1054,990,1055, +991,1055,990, +1055,991,1056, +992,1056,991, +1056,992,1057, +993,1057,992, +1057,993,1058, +994,1058,993, +1058,994,1059, +995,1059,994, +1059,995,1060, +996,1060,995, +1060,996,1061, +997,1061,996, +1061,997,1062, +998,1062,997, +1062,998,1063, +999,1063,998, +1063,999,1064, +1000,1064,999, +1064,1000,1065, +1001,1065,1000, +1065,1001,1066, +1002,1066,1001, +1066,1002,1067, +1003,1067,1002, +1067,1003,1068, +1004,1068,1003, +1068,1004,1069, +1005,1069,1004, +1069,1005,1070, +1006,1070,1005, +1070,1006,1071, +1007,1071,1006, +1071,1007,1072, +1008,1072,1007, +1072,1008,1073, +1009,1073,1008, +1073,1009,1074, +1010,1074,1009, +1074,1010,1075, +1011,1075,1010, +1075,1011,1076, +1012,1076,1011, +1076,1012,1077, +1013,1077,1012, +1077,1013,1078, +1014,1078,1013, +1078,1014,1079, +1015,1079,1014, +1079,1015,1080, +1016,1080,1015, +1080,1016,1081, +1017,1081,1016, +1081,1017,1082, +1018,1082,1017, +1082,1018,1083, +1019,1083,1018, +1083,1019,1084, +1020,1084,1019, +1084,1020,1085, +1021,1085,1020, +1085,1021,1086, +1022,1086,1021, +1086,1022,1087, +1023,1087,1022, +1088,1024,1089, +1025,1089,1024, +1089,1025,1090, +1026,1090,1025, +1090,1026,1091, +1027,1091,1026, +1091,1027,1092, +1028,1092,1027, +1092,1028,1093, +1029,1093,1028, +1093,1029,1094, +1030,1094,1029, +1094,1030,1095, +1031,1095,1030, +1095,1031,1096, +1032,1096,1031, +1096,1032,1097, +1033,1097,1032, +1097,1033,1098, +1034,1098,1033, +1098,1034,1099, +1035,1099,1034, +1099,1035,1100, +1036,1100,1035, +1100,1036,1101, +1037,1101,1036, +1101,1037,1102, +1038,1102,1037, +1102,1038,1103, +1039,1103,1038, +1103,1039,1104, +1040,1104,1039, +1104,1040,1105, +1041,1105,1040, +1105,1041,1106, +1042,1106,1041, +1106,1042,1107, +1043,1107,1042, +1107,1043,1108, +1044,1108,1043, +1108,1044,1109, +1045,1109,1044, +1109,1045,1110, +1046,1110,1045, +1110,1046,1111, +1047,1111,1046, +1111,1047,1112, +1048,1112,1047, +1112,1048,1113, +1049,1113,1048, +1113,1049,1114, +1050,1114,1049, +1114,1050,1115, +1051,1115,1050, +1115,1051,1116, +1052,1116,1051, +1116,1052,1117, +1053,1117,1052, +1117,1053,1118, +1054,1118,1053, +1118,1054,1119, +1055,1119,1054, +1119,1055,1120, +1056,1120,1055, +1120,1056,1121, +1057,1121,1056, +1121,1057,1122, +1058,1122,1057, +1122,1058,1123, +1059,1123,1058, +1123,1059,1124, +1060,1124,1059, +1124,1060,1125, +1061,1125,1060, +1125,1061,1126, +1062,1126,1061, +1126,1062,1127, +1063,1127,1062, +1127,1063,1128, +1064,1128,1063, +1128,1064,1129, +1065,1129,1064, +1129,1065,1130, +1066,1130,1065, +1130,1066,1131, +1067,1131,1066, +1131,1067,1132, +1068,1132,1067, +1132,1068,1133, +1069,1133,1068, +1133,1069,1134, +1070,1134,1069, +1134,1070,1135, +1071,1135,1070, +1135,1071,1136, +1072,1136,1071, +1136,1072,1137, +1073,1137,1072, +1137,1073,1138, +1074,1138,1073, +1138,1074,1139, +1075,1139,1074, +1139,1075,1140, +1076,1140,1075, +1140,1076,1141, +1077,1141,1076, +1141,1077,1142, +1078,1142,1077, +1142,1078,1143, +1079,1143,1078, +1143,1079,1144, +1080,1144,1079, +1144,1080,1145, +1081,1145,1080, +1145,1081,1146, +1082,1146,1081, +1146,1082,1147, +1083,1147,1082, +1147,1083,1148, +1084,1148,1083, +1148,1084,1149, +1085,1149,1084, +1149,1085,1150, +1086,1150,1085, +1150,1086,1151, +1087,1151,1086, +1152,1088,1153, +1089,1153,1088, +1153,1089,1154, +1090,1154,1089, +1154,1090,1155, +1091,1155,1090, +1155,1091,1156, +1092,1156,1091, +1156,1092,1157, +1093,1157,1092, +1157,1093,1158, +1094,1158,1093, +1158,1094,1159, +1095,1159,1094, +1159,1095,1160, +1096,1160,1095, +1160,1096,1161, +1097,1161,1096, +1161,1097,1162, +1098,1162,1097, +1162,1098,1163, +1099,1163,1098, +1163,1099,1164, +1100,1164,1099, +1164,1100,1165, +1101,1165,1100, +1165,1101,1166, +1102,1166,1101, +1166,1102,1167, +1103,1167,1102, +1167,1103,1168, +1104,1168,1103, +1168,1104,1169, +1105,1169,1104, +1169,1105,1170, +1106,1170,1105, +1170,1106,1171, +1107,1171,1106, +1171,1107,1172, +1108,1172,1107, +1172,1108,1173, +1109,1173,1108, +1173,1109,1174, +1110,1174,1109, +1174,1110,1175, +1111,1175,1110, +1175,1111,1176, +1112,1176,1111, +1176,1112,1177, +1113,1177,1112, +1177,1113,1178, +1114,1178,1113, +1178,1114,1179, +1115,1179,1114, +1179,1115,1180, +1116,1180,1115, +1180,1116,1181, +1117,1181,1116, +1181,1117,1182, +1118,1182,1117, +1182,1118,1183, +1119,1183,1118, +1183,1119,1184, +1120,1184,1119, +1184,1120,1185, +1121,1185,1120, +1185,1121,1186, +1122,1186,1121, +1186,1122,1187, +1123,1187,1122, +1187,1123,1188, +1124,1188,1123, +1188,1124,1189, +1125,1189,1124, +1189,1125,1190, +1126,1190,1125, +1190,1126,1191, +1127,1191,1126, +1191,1127,1192, +1128,1192,1127, +1192,1128,1193, +1129,1193,1128, +1193,1129,1194, +1130,1194,1129, +1194,1130,1195, +1131,1195,1130, +1195,1131,1196, +1132,1196,1131, +1196,1132,1197, +1133,1197,1132, +1197,1133,1198, +1134,1198,1133, +1198,1134,1199, +1135,1199,1134, +1199,1135,1200, +1136,1200,1135, +1200,1136,1201, +1137,1201,1136, +1201,1137,1202, +1138,1202,1137, +1202,1138,1203, +1139,1203,1138, +1203,1139,1204, +1140,1204,1139, +1204,1140,1205, +1141,1205,1140, +1205,1141,1206, +1142,1206,1141, +1206,1142,1207, +1143,1207,1142, +1207,1143,1208, +1144,1208,1143, +1208,1144,1209, +1145,1209,1144, +1209,1145,1210, +1146,1210,1145, +1210,1146,1211, +1147,1211,1146, +1211,1147,1212, +1148,1212,1147, +1212,1148,1213, +1149,1213,1148, +1213,1149,1214, +1150,1214,1149, +1214,1150,1215, +1151,1215,1150, +1216,1152,1217, +1153,1217,1152, +1217,1153,1218, +1154,1218,1153, +1218,1154,1219, +1155,1219,1154, +1219,1155,1220, +1156,1220,1155, +1220,1156,1221, +1157,1221,1156, +1221,1157,1222, +1158,1222,1157, +1222,1158,1223, +1159,1223,1158, +1223,1159,1224, +1160,1224,1159, +1224,1160,1225, +1161,1225,1160, +1225,1161,1226, +1162,1226,1161, +1226,1162,1227, +1163,1227,1162, +1227,1163,1228, +1164,1228,1163, +1228,1164,1229, +1165,1229,1164, +1229,1165,1230, +1166,1230,1165, +1230,1166,1231, +1167,1231,1166, +1231,1167,1232, +1168,1232,1167, +1232,1168,1233, +1169,1233,1168, +1233,1169,1234, +1170,1234,1169, +1234,1170,1235, +1171,1235,1170, +1235,1171,1236, +1172,1236,1171, +1236,1172,1237, +1173,1237,1172, +1237,1173,1238, +1174,1238,1173, +1238,1174,1239, +1175,1239,1174, +1239,1175,1240, +1176,1240,1175, +1240,1176,1241, +1177,1241,1176, +1241,1177,1242, +1178,1242,1177, +1242,1178,1243, +1179,1243,1178, +1243,1179,1244, +1180,1244,1179, +1244,1180,1245, +1181,1245,1180, +1245,1181,1246, +1182,1246,1181, +1246,1182,1247, +1183,1247,1182, +1247,1183,1248, +1184,1248,1183, +1248,1184,1249, +1185,1249,1184, +1249,1185,1250, +1186,1250,1185, +1250,1186,1251, +1187,1251,1186, +1251,1187,1252, +1188,1252,1187, +1252,1188,1253, +1189,1253,1188, +1253,1189,1254, +1190,1254,1189, +1254,1190,1255, +1191,1255,1190, +1255,1191,1256, +1192,1256,1191, +1256,1192,1257, +1193,1257,1192, +1257,1193,1258, +1194,1258,1193, +1258,1194,1259, +1195,1259,1194, +1259,1195,1260, +1196,1260,1195, +1260,1196,1261, +1197,1261,1196, +1261,1197,1262, +1198,1262,1197, +1262,1198,1263, +1199,1263,1198, +1263,1199,1264, +1200,1264,1199, +1264,1200,1265, +1201,1265,1200, +1265,1201,1266, +1202,1266,1201, +1266,1202,1267, +1203,1267,1202, +1267,1203,1268, +1204,1268,1203, +1268,1204,1269, +1205,1269,1204, +1269,1205,1270, +1206,1270,1205, +1270,1206,1271, +1207,1271,1206, +1271,1207,1272, +1208,1272,1207, +1272,1208,1273, +1209,1273,1208, +1273,1209,1274, +1210,1274,1209, +1274,1210,1275, +1211,1275,1210, +1275,1211,1276, +1212,1276,1211, +1276,1212,1277, +1213,1277,1212, +1277,1213,1278, +1214,1278,1213, +1278,1214,1279, +1215,1279,1214, +1280,1216,1281, +1217,1281,1216, +1281,1217,1282, +1218,1282,1217, +1282,1218,1283, +1219,1283,1218, +1283,1219,1284, +1220,1284,1219, +1284,1220,1285, +1221,1285,1220, +1285,1221,1286, +1222,1286,1221, +1286,1222,1287, +1223,1287,1222, +1287,1223,1288, +1224,1288,1223, +1288,1224,1289, +1225,1289,1224, +1289,1225,1290, +1226,1290,1225, +1290,1226,1291, +1227,1291,1226, +1291,1227,1292, +1228,1292,1227, +1292,1228,1293, +1229,1293,1228, +1293,1229,1294, +1230,1294,1229, +1294,1230,1295, +1231,1295,1230, +1295,1231,1296, +1232,1296,1231, +1296,1232,1297, +1233,1297,1232, +1297,1233,1298, +1234,1298,1233, +1298,1234,1299, +1235,1299,1234, +1299,1235,1300, +1236,1300,1235, +1300,1236,1301, +1237,1301,1236, +1301,1237,1302, +1238,1302,1237, +1302,1238,1303, +1239,1303,1238, +1303,1239,1304, +1240,1304,1239, +1304,1240,1305, +1241,1305,1240, +1305,1241,1306, +1242,1306,1241, +1306,1242,1307, +1243,1307,1242, +1307,1243,1308, +1244,1308,1243, +1308,1244,1309, +1245,1309,1244, +1309,1245,1310, +1246,1310,1245, +1310,1246,1311, +1247,1311,1246, +1311,1247,1312, +1248,1312,1247, +1312,1248,1313, +1249,1313,1248, +1313,1249,1314, +1250,1314,1249, +1314,1250,1315, +1251,1315,1250, +1315,1251,1316, +1252,1316,1251, +1316,1252,1317, +1253,1317,1252, +1317,1253,1318, +1254,1318,1253, +1318,1254,1319, +1255,1319,1254, +1319,1255,1320, +1256,1320,1255, +1320,1256,1321, +1257,1321,1256, +1321,1257,1322, +1258,1322,1257, +1322,1258,1323, +1259,1323,1258, +1323,1259,1324, +1260,1324,1259, +1324,1260,1325, +1261,1325,1260, +1325,1261,1326, +1262,1326,1261, +1326,1262,1327, +1263,1327,1262, +1327,1263,1328, +1264,1328,1263, +1328,1264,1329, +1265,1329,1264, +1329,1265,1330, +1266,1330,1265, +1330,1266,1331, +1267,1331,1266, +1331,1267,1332, +1268,1332,1267, +1332,1268,1333, +1269,1333,1268, +1333,1269,1334, +1270,1334,1269, +1334,1270,1335, +1271,1335,1270, +1335,1271,1336, +1272,1336,1271, +1336,1272,1337, +1273,1337,1272, +1337,1273,1338, +1274,1338,1273, +1338,1274,1339, +1275,1339,1274, +1339,1275,1340, +1276,1340,1275, +1340,1276,1341, +1277,1341,1276, +1341,1277,1342, +1278,1342,1277, +1342,1278,1343, +1279,1343,1278, +1344,1280,1345, +1281,1345,1280, +1345,1281,1346, +1282,1346,1281, +1346,1282,1347, +1283,1347,1282, +1347,1283,1348, +1284,1348,1283, +1348,1284,1349, +1285,1349,1284, +1349,1285,1350, +1286,1350,1285, +1350,1286,1351, +1287,1351,1286, +1351,1287,1352, +1288,1352,1287, +1352,1288,1353, +1289,1353,1288, +1353,1289,1354, +1290,1354,1289, +1354,1290,1355, +1291,1355,1290, +1355,1291,1356, +1292,1356,1291, +1356,1292,1357, +1293,1357,1292, +1357,1293,1358, +1294,1358,1293, +1358,1294,1359, +1295,1359,1294, +1359,1295,1360, +1296,1360,1295, +1360,1296,1361, +1297,1361,1296, +1361,1297,1362, +1298,1362,1297, +1362,1298,1363, +1299,1363,1298, +1363,1299,1364, +1300,1364,1299, +1364,1300,1365, +1301,1365,1300, +1365,1301,1366, +1302,1366,1301, +1366,1302,1367, +1303,1367,1302, +1367,1303,1368, +1304,1368,1303, +1368,1304,1369, +1305,1369,1304, +1369,1305,1370, +1306,1370,1305, +1370,1306,1371, +1307,1371,1306, +1371,1307,1372, +1308,1372,1307, +1372,1308,1373, +1309,1373,1308, +1373,1309,1374, +1310,1374,1309, +1374,1310,1375, +1311,1375,1310, +1375,1311,1376, +1312,1376,1311, +1376,1312,1377, +1313,1377,1312, +1377,1313,1378, +1314,1378,1313, +1378,1314,1379, +1315,1379,1314, +1379,1315,1380, +1316,1380,1315, +1380,1316,1381, +1317,1381,1316, +1381,1317,1382, +1318,1382,1317, +1382,1318,1383, +1319,1383,1318, +1383,1319,1384, +1320,1384,1319, +1384,1320,1385, +1321,1385,1320, +1385,1321,1386, +1322,1386,1321, +1386,1322,1387, +1323,1387,1322, +1387,1323,1388, +1324,1388,1323, +1388,1324,1389, +1325,1389,1324, +1389,1325,1390, +1326,1390,1325, +1390,1326,1391, +1327,1391,1326, +1391,1327,1392, +1328,1392,1327, +1392,1328,1393, +1329,1393,1328, +1393,1329,1394, +1330,1394,1329, +1394,1330,1395, +1331,1395,1330, +1395,1331,1396, +1332,1396,1331, +1396,1332,1397, +1333,1397,1332, +1397,1333,1398, +1334,1398,1333, +1398,1334,1399, +1335,1399,1334, +1399,1335,1400, +1336,1400,1335, +1400,1336,1401, +1337,1401,1336, +1401,1337,1402, +1338,1402,1337, +1402,1338,1403, +1339,1403,1338, +1403,1339,1404, +1340,1404,1339, +1404,1340,1405, +1341,1405,1340, +1405,1341,1406, +1342,1406,1341, +1406,1342,1407, +1343,1407,1342, +1408,1344,1409, +1345,1409,1344, +1409,1345,1410, +1346,1410,1345, +1410,1346,1411, +1347,1411,1346, +1411,1347,1412, +1348,1412,1347, +1412,1348,1413, +1349,1413,1348, +1413,1349,1414, +1350,1414,1349, +1414,1350,1415, +1351,1415,1350, +1415,1351,1416, +1352,1416,1351, +1416,1352,1417, +1353,1417,1352, +1417,1353,1418, +1354,1418,1353, +1418,1354,1419, +1355,1419,1354, +1419,1355,1420, +1356,1420,1355, +1420,1356,1421, +1357,1421,1356, +1421,1357,1422, +1358,1422,1357, +1422,1358,1423, +1359,1423,1358, +1423,1359,1424, +1360,1424,1359, +1424,1360,1425, +1361,1425,1360, +1425,1361,1426, +1362,1426,1361, +1426,1362,1427, +1363,1427,1362, +1427,1363,1428, +1364,1428,1363, +1428,1364,1429, +1365,1429,1364, +1429,1365,1430, +1366,1430,1365, +1430,1366,1431, +1367,1431,1366, +1431,1367,1432, +1368,1432,1367, +1432,1368,1433, +1369,1433,1368, +1433,1369,1434, +1370,1434,1369, +1434,1370,1435, +1371,1435,1370, +1435,1371,1436, +1372,1436,1371, +1436,1372,1437, +1373,1437,1372, +1437,1373,1438, +1374,1438,1373, +1438,1374,1439, +1375,1439,1374, +1439,1375,1440, +1376,1440,1375, +1440,1376,1441, +1377,1441,1376, +1441,1377,1442, +1378,1442,1377, +1442,1378,1443, +1379,1443,1378, +1443,1379,1444, +1380,1444,1379, +1444,1380,1445, +1381,1445,1380, +1445,1381,1446, +1382,1446,1381, +1446,1382,1447, +1383,1447,1382, +1447,1383,1448, +1384,1448,1383, +1448,1384,1449, +1385,1449,1384, +1449,1385,1450, +1386,1450,1385, +1450,1386,1451, +1387,1451,1386, +1451,1387,1452, +1388,1452,1387, +1452,1388,1453, +1389,1453,1388, +1453,1389,1454, +1390,1454,1389, +1454,1390,1455, +1391,1455,1390, +1455,1391,1456, +1392,1456,1391, +1456,1392,1457, +1393,1457,1392, +1457,1393,1458, +1394,1458,1393, +1458,1394,1459, +1395,1459,1394, +1459,1395,1460, +1396,1460,1395, +1460,1396,1461, +1397,1461,1396, +1461,1397,1462, +1398,1462,1397, +1462,1398,1463, +1399,1463,1398, +1463,1399,1464, +1400,1464,1399, +1464,1400,1465, +1401,1465,1400, +1465,1401,1466, +1402,1466,1401, +1466,1402,1467, +1403,1467,1402, +1467,1403,1468, +1404,1468,1403, +1468,1404,1469, +1405,1469,1404, +1469,1405,1470, +1406,1470,1405, +1470,1406,1471, +1407,1471,1406, +1472,1408,1473, +1409,1473,1408, +1473,1409,1474, +1410,1474,1409, +1474,1410,1475, +1411,1475,1410, +1475,1411,1476, +1412,1476,1411, +1476,1412,1477, +1413,1477,1412, +1477,1413,1478, +1414,1478,1413, +1478,1414,1479, +1415,1479,1414, +1479,1415,1480, +1416,1480,1415, +1480,1416,1481, +1417,1481,1416, +1481,1417,1482, +1418,1482,1417, +1482,1418,1483, +1419,1483,1418, +1483,1419,1484, +1420,1484,1419, +1484,1420,1485, +1421,1485,1420, +1485,1421,1486, +1422,1486,1421, +1486,1422,1487, +1423,1487,1422, +1487,1423,1488, +1424,1488,1423, +1488,1424,1489, +1425,1489,1424, +1489,1425,1490, +1426,1490,1425, +1490,1426,1491, +1427,1491,1426, +1491,1427,1492, +1428,1492,1427, +1492,1428,1493, +1429,1493,1428, +1493,1429,1494, +1430,1494,1429, +1494,1430,1495, +1431,1495,1430, +1495,1431,1496, +1432,1496,1431, +1496,1432,1497, +1433,1497,1432, +1497,1433,1498, +1434,1498,1433, +1498,1434,1499, +1435,1499,1434, +1499,1435,1500, +1436,1500,1435, +1500,1436,1501, +1437,1501,1436, +1501,1437,1502, +1438,1502,1437, +1502,1438,1503, +1439,1503,1438, +1503,1439,1504, +1440,1504,1439, +1504,1440,1505, +1441,1505,1440, +1505,1441,1506, +1442,1506,1441, +1506,1442,1507, +1443,1507,1442, +1507,1443,1508, +1444,1508,1443, +1508,1444,1509, +1445,1509,1444, +1509,1445,1510, +1446,1510,1445, +1510,1446,1511, +1447,1511,1446, +1511,1447,1512, +1448,1512,1447, +1512,1448,1513, +1449,1513,1448, +1513,1449,1514, +1450,1514,1449, +1514,1450,1515, +1451,1515,1450, +1515,1451,1516, +1452,1516,1451, +1516,1452,1517, +1453,1517,1452, +1517,1453,1518, +1454,1518,1453, +1518,1454,1519, +1455,1519,1454, +1519,1455,1520, +1456,1520,1455, +1520,1456,1521, +1457,1521,1456, +1521,1457,1522, +1458,1522,1457, +1522,1458,1523, +1459,1523,1458, +1523,1459,1524, +1460,1524,1459, +1524,1460,1525, +1461,1525,1460, +1525,1461,1526, +1462,1526,1461, +1526,1462,1527, +1463,1527,1462, +1527,1463,1528, +1464,1528,1463, +1528,1464,1529, +1465,1529,1464, +1529,1465,1530, +1466,1530,1465, +1530,1466,1531, +1467,1531,1466, +1531,1467,1532, +1468,1532,1467, +1532,1468,1533, +1469,1533,1468, +1533,1469,1534, +1470,1534,1469, +1534,1470,1535, +1471,1535,1470, +1536,1472,1537, +1473,1537,1472, +1537,1473,1538, +1474,1538,1473, +1538,1474,1539, +1475,1539,1474, +1539,1475,1540, +1476,1540,1475, +1540,1476,1541, +1477,1541,1476, +1541,1477,1542, +1478,1542,1477, +1542,1478,1543, +1479,1543,1478, +1543,1479,1544, +1480,1544,1479, +1544,1480,1545, +1481,1545,1480, +1545,1481,1546, +1482,1546,1481, +1546,1482,1547, +1483,1547,1482, +1547,1483,1548, +1484,1548,1483, +1548,1484,1549, +1485,1549,1484, +1549,1485,1550, +1486,1550,1485, +1550,1486,1551, +1487,1551,1486, +1551,1487,1552, +1488,1552,1487, +1552,1488,1553, +1489,1553,1488, +1553,1489,1554, +1490,1554,1489, +1554,1490,1555, +1491,1555,1490, +1555,1491,1556, +1492,1556,1491, +1556,1492,1557, +1493,1557,1492, +1557,1493,1558, +1494,1558,1493, +1558,1494,1559, +1495,1559,1494, +1559,1495,1560, +1496,1560,1495, +1560,1496,1561, +1497,1561,1496, +1561,1497,1562, +1498,1562,1497, +1562,1498,1563, +1499,1563,1498, +1563,1499,1564, +1500,1564,1499, +1564,1500,1565, +1501,1565,1500, +1565,1501,1566, +1502,1566,1501, +1566,1502,1567, +1503,1567,1502, +1567,1503,1568, +1504,1568,1503, +1568,1504,1569, +1505,1569,1504, +1569,1505,1570, +1506,1570,1505, +1570,1506,1571, +1507,1571,1506, +1571,1507,1572, +1508,1572,1507, +1572,1508,1573, +1509,1573,1508, +1573,1509,1574, +1510,1574,1509, +1574,1510,1575, +1511,1575,1510, +1575,1511,1576, +1512,1576,1511, +1576,1512,1577, +1513,1577,1512, +1577,1513,1578, +1514,1578,1513, +1578,1514,1579, +1515,1579,1514, +1579,1515,1580, +1516,1580,1515, +1580,1516,1581, +1517,1581,1516, +1581,1517,1582, +1518,1582,1517, +1582,1518,1583, +1519,1583,1518, +1583,1519,1584, +1520,1584,1519, +1584,1520,1585, +1521,1585,1520, +1585,1521,1586, +1522,1586,1521, +1586,1522,1587, +1523,1587,1522, +1587,1523,1588, +1524,1588,1523, +1588,1524,1589, +1525,1589,1524, +1589,1525,1590, +1526,1590,1525, +1590,1526,1591, +1527,1591,1526, +1591,1527,1592, +1528,1592,1527, +1592,1528,1593, +1529,1593,1528, +1593,1529,1594, +1530,1594,1529, +1594,1530,1595, +1531,1595,1530, +1595,1531,1596, +1532,1596,1531, +1596,1532,1597, +1533,1597,1532, +1597,1533,1598, +1534,1598,1533, +1598,1534,1599, +1535,1599,1534, +1600,1536,1601, +1537,1601,1536, +1601,1537,1602, +1538,1602,1537, +1602,1538,1603, +1539,1603,1538, +1603,1539,1604, +1540,1604,1539, +1604,1540,1605, +1541,1605,1540, +1605,1541,1606, +1542,1606,1541, +1606,1542,1607, +1543,1607,1542, +1607,1543,1608, +1544,1608,1543, +1608,1544,1609, +1545,1609,1544, +1609,1545,1610, +1546,1610,1545, +1610,1546,1611, +1547,1611,1546, +1611,1547,1612, +1548,1612,1547, +1612,1548,1613, +1549,1613,1548, +1613,1549,1614, +1550,1614,1549, +1614,1550,1615, +1551,1615,1550, +1615,1551,1616, +1552,1616,1551, +1616,1552,1617, +1553,1617,1552, +1617,1553,1618, +1554,1618,1553, +1618,1554,1619, +1555,1619,1554, +1619,1555,1620, +1556,1620,1555, +1620,1556,1621, +1557,1621,1556, +1621,1557,1622, +1558,1622,1557, +1622,1558,1623, +1559,1623,1558, +1623,1559,1624, +1560,1624,1559, +1624,1560,1625, +1561,1625,1560, +1625,1561,1626, +1562,1626,1561, +1626,1562,1627, +1563,1627,1562, +1627,1563,1628, +1564,1628,1563, +1628,1564,1629, +1565,1629,1564, +1629,1565,1630, +1566,1630,1565, +1630,1566,1631, +1567,1631,1566, +1631,1567,1632, +1568,1632,1567, +1632,1568,1633, +1569,1633,1568, +1633,1569,1634, +1570,1634,1569, +1634,1570,1635, +1571,1635,1570, +1635,1571,1636, +1572,1636,1571, +1636,1572,1637, +1573,1637,1572, +1637,1573,1638, +1574,1638,1573, +1638,1574,1639, +1575,1639,1574, +1639,1575,1640, +1576,1640,1575, +1640,1576,1641, +1577,1641,1576, +1641,1577,1642, +1578,1642,1577, +1642,1578,1643, +1579,1643,1578, +1643,1579,1644, +1580,1644,1579, +1644,1580,1645, +1581,1645,1580, +1645,1581,1646, +1582,1646,1581, +1646,1582,1647, +1583,1647,1582, +1647,1583,1648, +1584,1648,1583, +1648,1584,1649, +1585,1649,1584, +1649,1585,1650, +1586,1650,1585, +1650,1586,1651, +1587,1651,1586, +1651,1587,1652, +1588,1652,1587, +1652,1588,1653, +1589,1653,1588, +1653,1589,1654, +1590,1654,1589, +1654,1590,1655, +1591,1655,1590, +1655,1591,1656, +1592,1656,1591, +1656,1592,1657, +1593,1657,1592, +1657,1593,1658, +1594,1658,1593, +1658,1594,1659, +1595,1659,1594, +1659,1595,1660, +1596,1660,1595, +1660,1596,1661, +1597,1661,1596, +1661,1597,1662, +1598,1662,1597, +1662,1598,1663, +1599,1663,1598, +1664,1600,1665, +1601,1665,1600, +1665,1601,1666, +1602,1666,1601, +1666,1602,1667, +1603,1667,1602, +1667,1603,1668, +1604,1668,1603, +1668,1604,1669, +1605,1669,1604, +1669,1605,1670, +1606,1670,1605, +1670,1606,1671, +1607,1671,1606, +1671,1607,1672, +1608,1672,1607, +1672,1608,1673, +1609,1673,1608, +1673,1609,1674, +1610,1674,1609, +1674,1610,1675, +1611,1675,1610, +1675,1611,1676, +1612,1676,1611, +1676,1612,1677, +1613,1677,1612, +1677,1613,1678, +1614,1678,1613, +1678,1614,1679, +1615,1679,1614, +1679,1615,1680, +1616,1680,1615, +1680,1616,1681, +1617,1681,1616, +1681,1617,1682, +1618,1682,1617, +1682,1618,1683, +1619,1683,1618, +1683,1619,1684, +1620,1684,1619, +1684,1620,1685, +1621,1685,1620, +1685,1621,1686, +1622,1686,1621, +1686,1622,1687, +1623,1687,1622, +1687,1623,1688, +1624,1688,1623, +1688,1624,1689, +1625,1689,1624, +1689,1625,1690, +1626,1690,1625, +1690,1626,1691, +1627,1691,1626, +1691,1627,1692, +1628,1692,1627, +1692,1628,1693, +1629,1693,1628, +1693,1629,1694, +1630,1694,1629, +1694,1630,1695, +1631,1695,1630, +1695,1631,1696, +1632,1696,1631, +1696,1632,1697, +1633,1697,1632, +1697,1633,1698, +1634,1698,1633, +1698,1634,1699, +1635,1699,1634, +1699,1635,1700, +1636,1700,1635, +1700,1636,1701, +1637,1701,1636, +1701,1637,1702, +1638,1702,1637, +1702,1638,1703, +1639,1703,1638, +1703,1639,1704, +1640,1704,1639, +1704,1640,1705, +1641,1705,1640, +1705,1641,1706, +1642,1706,1641, +1706,1642,1707, +1643,1707,1642, +1707,1643,1708, +1644,1708,1643, +1708,1644,1709, +1645,1709,1644, +1709,1645,1710, +1646,1710,1645, +1710,1646,1711, +1647,1711,1646, +1711,1647,1712, +1648,1712,1647, +1712,1648,1713, +1649,1713,1648, +1713,1649,1714, +1650,1714,1649, +1714,1650,1715, +1651,1715,1650, +1715,1651,1716, +1652,1716,1651, +1716,1652,1717, +1653,1717,1652, +1717,1653,1718, +1654,1718,1653, +1718,1654,1719, +1655,1719,1654, +1719,1655,1720, +1656,1720,1655, +1720,1656,1721, +1657,1721,1656, +1721,1657,1722, +1658,1722,1657, +1722,1658,1723, +1659,1723,1658, +1723,1659,1724, +1660,1724,1659, +1724,1660,1725, +1661,1725,1660, +1725,1661,1726, +1662,1726,1661, +1726,1662,1727, +1663,1727,1662, +1728,1664,1729, +1665,1729,1664, +1729,1665,1730, +1666,1730,1665, +1730,1666,1731, +1667,1731,1666, +1731,1667,1732, +1668,1732,1667, +1732,1668,1733, +1669,1733,1668, +1733,1669,1734, +1670,1734,1669, +1734,1670,1735, +1671,1735,1670, +1735,1671,1736, +1672,1736,1671, +1736,1672,1737, +1673,1737,1672, +1737,1673,1738, +1674,1738,1673, +1738,1674,1739, +1675,1739,1674, +1739,1675,1740, +1676,1740,1675, +1740,1676,1741, +1677,1741,1676, +1741,1677,1742, +1678,1742,1677, +1742,1678,1743, +1679,1743,1678, +1743,1679,1744, +1680,1744,1679, +1744,1680,1745, +1681,1745,1680, +1745,1681,1746, +1682,1746,1681, +1746,1682,1747, +1683,1747,1682, +1747,1683,1748, +1684,1748,1683, +1748,1684,1749, +1685,1749,1684, +1749,1685,1750, +1686,1750,1685, +1750,1686,1751, +1687,1751,1686, +1751,1687,1752, +1688,1752,1687, +1752,1688,1753, +1689,1753,1688, +1753,1689,1754, +1690,1754,1689, +1754,1690,1755, +1691,1755,1690, +1755,1691,1756, +1692,1756,1691, +1756,1692,1757, +1693,1757,1692, +1757,1693,1758, +1694,1758,1693, +1758,1694,1759, +1695,1759,1694, +1759,1695,1760, +1696,1760,1695, +1760,1696,1761, +1697,1761,1696, +1761,1697,1762, +1698,1762,1697, +1762,1698,1763, +1699,1763,1698, +1763,1699,1764, +1700,1764,1699, +1764,1700,1765, +1701,1765,1700, +1765,1701,1766, +1702,1766,1701, +1766,1702,1767, +1703,1767,1702, +1767,1703,1768, +1704,1768,1703, +1768,1704,1769, +1705,1769,1704, +1769,1705,1770, +1706,1770,1705, +1770,1706,1771, +1707,1771,1706, +1771,1707,1772, +1708,1772,1707, +1772,1708,1773, +1709,1773,1708, +1773,1709,1774, +1710,1774,1709, +1774,1710,1775, +1711,1775,1710, +1775,1711,1776, +1712,1776,1711, +1776,1712,1777, +1713,1777,1712, +1777,1713,1778, +1714,1778,1713, +1778,1714,1779, +1715,1779,1714, +1779,1715,1780, +1716,1780,1715, +1780,1716,1781, +1717,1781,1716, +1781,1717,1782, +1718,1782,1717, +1782,1718,1783, +1719,1783,1718, +1783,1719,1784, +1720,1784,1719, +1784,1720,1785, +1721,1785,1720, +1785,1721,1786, +1722,1786,1721, +1786,1722,1787, +1723,1787,1722, +1787,1723,1788, +1724,1788,1723, +1788,1724,1789, +1725,1789,1724, +1789,1725,1790, +1726,1790,1725, +1790,1726,1791, +1727,1791,1726, +1792,1728,1793, +1729,1793,1728, +1793,1729,1794, +1730,1794,1729, +1794,1730,1795, +1731,1795,1730, +1795,1731,1796, +1732,1796,1731, +1796,1732,1797, +1733,1797,1732, +1797,1733,1798, +1734,1798,1733, +1798,1734,1799, +1735,1799,1734, +1799,1735,1800, +1736,1800,1735, +1800,1736,1801, +1737,1801,1736, +1801,1737,1802, +1738,1802,1737, +1802,1738,1803, +1739,1803,1738, +1803,1739,1804, +1740,1804,1739, +1804,1740,1805, +1741,1805,1740, +1805,1741,1806, +1742,1806,1741, +1806,1742,1807, +1743,1807,1742, +1807,1743,1808, +1744,1808,1743, +1808,1744,1809, +1745,1809,1744, +1809,1745,1810, +1746,1810,1745, +1810,1746,1811, +1747,1811,1746, +1811,1747,1812, +1748,1812,1747, +1812,1748,1813, +1749,1813,1748, +1813,1749,1814, +1750,1814,1749, +1814,1750,1815, +1751,1815,1750, +1815,1751,1816, +1752,1816,1751, +1816,1752,1817, +1753,1817,1752, +1817,1753,1818, +1754,1818,1753, +1818,1754,1819, +1755,1819,1754, +1819,1755,1820, +1756,1820,1755, +1820,1756,1821, +1757,1821,1756, +1821,1757,1822, +1758,1822,1757, +1822,1758,1823, +1759,1823,1758, +1823,1759,1824, +1760,1824,1759, +1824,1760,1825, +1761,1825,1760, +1825,1761,1826, +1762,1826,1761, +1826,1762,1827, +1763,1827,1762, +1827,1763,1828, +1764,1828,1763, +1828,1764,1829, +1765,1829,1764, +1829,1765,1830, +1766,1830,1765, +1830,1766,1831, +1767,1831,1766, +1831,1767,1832, +1768,1832,1767, +1832,1768,1833, +1769,1833,1768, +1833,1769,1834, +1770,1834,1769, +1834,1770,1835, +1771,1835,1770, +1835,1771,1836, +1772,1836,1771, +1836,1772,1837, +1773,1837,1772, +1837,1773,1838, +1774,1838,1773, +1838,1774,1839, +1775,1839,1774, +1839,1775,1840, +1776,1840,1775, +1840,1776,1841, +1777,1841,1776, +1841,1777,1842, +1778,1842,1777, +1842,1778,1843, +1779,1843,1778, +1843,1779,1844, +1780,1844,1779, +1844,1780,1845, +1781,1845,1780, +1845,1781,1846, +1782,1846,1781, +1846,1782,1847, +1783,1847,1782, +1847,1783,1848, +1784,1848,1783, +1848,1784,1849, +1785,1849,1784, +1849,1785,1850, +1786,1850,1785, +1850,1786,1851, +1787,1851,1786, +1851,1787,1852, +1788,1852,1787, +1852,1788,1853, +1789,1853,1788, +1853,1789,1854, +1790,1854,1789, +1854,1790,1855, +1791,1855,1790, +1856,1792,1857, +1793,1857,1792, +1857,1793,1858, +1794,1858,1793, +1858,1794,1859, +1795,1859,1794, +1859,1795,1860, +1796,1860,1795, +1860,1796,1861, +1797,1861,1796, +1861,1797,1862, +1798,1862,1797, +1862,1798,1863, +1799,1863,1798, +1863,1799,1864, +1800,1864,1799, +1864,1800,1865, +1801,1865,1800, +1865,1801,1866, +1802,1866,1801, +1866,1802,1867, +1803,1867,1802, +1867,1803,1868, +1804,1868,1803, +1868,1804,1869, +1805,1869,1804, +1869,1805,1870, +1806,1870,1805, +1870,1806,1871, +1807,1871,1806, +1871,1807,1872, +1808,1872,1807, +1872,1808,1873, +1809,1873,1808, +1873,1809,1874, +1810,1874,1809, +1874,1810,1875, +1811,1875,1810, +1875,1811,1876, +1812,1876,1811, +1876,1812,1877, +1813,1877,1812, +1877,1813,1878, +1814,1878,1813, +1878,1814,1879, +1815,1879,1814, +1879,1815,1880, +1816,1880,1815, +1880,1816,1881, +1817,1881,1816, +1881,1817,1882, +1818,1882,1817, +1882,1818,1883, +1819,1883,1818, +1883,1819,1884, +1820,1884,1819, +1884,1820,1885, +1821,1885,1820, +1885,1821,1886, +1822,1886,1821, +1886,1822,1887, +1823,1887,1822, +1887,1823,1888, +1824,1888,1823, +1888,1824,1889, +1825,1889,1824, +1889,1825,1890, +1826,1890,1825, +1890,1826,1891, +1827,1891,1826, +1891,1827,1892, +1828,1892,1827, +1892,1828,1893, +1829,1893,1828, +1893,1829,1894, +1830,1894,1829, +1894,1830,1895, +1831,1895,1830, +1895,1831,1896, +1832,1896,1831, +1896,1832,1897, +1833,1897,1832, +1897,1833,1898, +1834,1898,1833, +1898,1834,1899, +1835,1899,1834, +1899,1835,1900, +1836,1900,1835, +1900,1836,1901, +1837,1901,1836, +1901,1837,1902, +1838,1902,1837, +1902,1838,1903, +1839,1903,1838, +1903,1839,1904, +1840,1904,1839, +1904,1840,1905, +1841,1905,1840, +1905,1841,1906, +1842,1906,1841, +1906,1842,1907, +1843,1907,1842, +1907,1843,1908, +1844,1908,1843, +1908,1844,1909, +1845,1909,1844, +1909,1845,1910, +1846,1910,1845, +1910,1846,1911, +1847,1911,1846, +1911,1847,1912, +1848,1912,1847, +1912,1848,1913, +1849,1913,1848, +1913,1849,1914, +1850,1914,1849, +1914,1850,1915, +1851,1915,1850, +1915,1851,1916, +1852,1916,1851, +1916,1852,1917, +1853,1917,1852, +1917,1853,1918, +1854,1918,1853, +1918,1854,1919, +1855,1919,1854, +1920,1856,1921, +1857,1921,1856, +1921,1857,1922, +1858,1922,1857, +1922,1858,1923, +1859,1923,1858, +1923,1859,1924, +1860,1924,1859, +1924,1860,1925, +1861,1925,1860, +1925,1861,1926, +1862,1926,1861, +1926,1862,1927, +1863,1927,1862, +1927,1863,1928, +1864,1928,1863, +1928,1864,1929, +1865,1929,1864, +1929,1865,1930, +1866,1930,1865, +1930,1866,1931, +1867,1931,1866, +1931,1867,1932, +1868,1932,1867, +1932,1868,1933, +1869,1933,1868, +1933,1869,1934, +1870,1934,1869, +1934,1870,1935, +1871,1935,1870, +1935,1871,1936, +1872,1936,1871, +1936,1872,1937, +1873,1937,1872, +1937,1873,1938, +1874,1938,1873, +1938,1874,1939, +1875,1939,1874, +1939,1875,1940, +1876,1940,1875, +1940,1876,1941, +1877,1941,1876, +1941,1877,1942, +1878,1942,1877, +1942,1878,1943, +1879,1943,1878, +1943,1879,1944, +1880,1944,1879, +1944,1880,1945, +1881,1945,1880, +1945,1881,1946, +1882,1946,1881, +1946,1882,1947, +1883,1947,1882, +1947,1883,1948, +1884,1948,1883, +1948,1884,1949, +1885,1949,1884, +1949,1885,1950, +1886,1950,1885, +1950,1886,1951, +1887,1951,1886, +1951,1887,1952, +1888,1952,1887, +1952,1888,1953, +1889,1953,1888, +1953,1889,1954, +1890,1954,1889, +1954,1890,1955, +1891,1955,1890, +1955,1891,1956, +1892,1956,1891, +1956,1892,1957, +1893,1957,1892, +1957,1893,1958, +1894,1958,1893, +1958,1894,1959, +1895,1959,1894, +1959,1895,1960, +1896,1960,1895, +1960,1896,1961, +1897,1961,1896, +1961,1897,1962, +1898,1962,1897, +1962,1898,1963, +1899,1963,1898, +1963,1899,1964, +1900,1964,1899, +1964,1900,1965, +1901,1965,1900, +1965,1901,1966, +1902,1966,1901, +1966,1902,1967, +1903,1967,1902, +1967,1903,1968, +1904,1968,1903, +1968,1904,1969, +1905,1969,1904, +1969,1905,1970, +1906,1970,1905, +1970,1906,1971, +1907,1971,1906, +1971,1907,1972, +1908,1972,1907, +1972,1908,1973, +1909,1973,1908, +1973,1909,1974, +1910,1974,1909, +1974,1910,1975, +1911,1975,1910, +1975,1911,1976, +1912,1976,1911, +1976,1912,1977, +1913,1977,1912, +1977,1913,1978, +1914,1978,1913, +1978,1914,1979, +1915,1979,1914, +1979,1915,1980, +1916,1980,1915, +1980,1916,1981, +1917,1981,1916, +1981,1917,1982, +1918,1982,1917, +1982,1918,1983, +1919,1983,1918, +1984,1920,1985, +1921,1985,1920, +1985,1921,1986, +1922,1986,1921, +1986,1922,1987, +1923,1987,1922, +1987,1923,1988, +1924,1988,1923, +1988,1924,1989, +1925,1989,1924, +1989,1925,1990, +1926,1990,1925, +1990,1926,1991, +1927,1991,1926, +1991,1927,1992, +1928,1992,1927, +1992,1928,1993, +1929,1993,1928, +1993,1929,1994, +1930,1994,1929, +1994,1930,1995, +1931,1995,1930, +1995,1931,1996, +1932,1996,1931, +1996,1932,1997, +1933,1997,1932, +1997,1933,1998, +1934,1998,1933, +1998,1934,1999, +1935,1999,1934, +1999,1935,2000, +1936,2000,1935, +2000,1936,2001, +1937,2001,1936, +2001,1937,2002, +1938,2002,1937, +2002,1938,2003, +1939,2003,1938, +2003,1939,2004, +1940,2004,1939, +2004,1940,2005, +1941,2005,1940, +2005,1941,2006, +1942,2006,1941, +2006,1942,2007, +1943,2007,1942, +2007,1943,2008, +1944,2008,1943, +2008,1944,2009, +1945,2009,1944, +2009,1945,2010, +1946,2010,1945, +2010,1946,2011, +1947,2011,1946, +2011,1947,2012, +1948,2012,1947, +2012,1948,2013, +1949,2013,1948, +2013,1949,2014, +1950,2014,1949, +2014,1950,2015, +1951,2015,1950, +2015,1951,2016, +1952,2016,1951, +2016,1952,2017, +1953,2017,1952, +2017,1953,2018, +1954,2018,1953, +2018,1954,2019, +1955,2019,1954, +2019,1955,2020, +1956,2020,1955, +2020,1956,2021, +1957,2021,1956, +2021,1957,2022, +1958,2022,1957, +2022,1958,2023, +1959,2023,1958, +2023,1959,2024, +1960,2024,1959, +2024,1960,2025, +1961,2025,1960, +2025,1961,2026, +1962,2026,1961, +2026,1962,2027, +1963,2027,1962, +2027,1963,2028, +1964,2028,1963, +2028,1964,2029, +1965,2029,1964, +2029,1965,2030, +1966,2030,1965, +2030,1966,2031, +1967,2031,1966, +2031,1967,2032, +1968,2032,1967, +2032,1968,2033, +1969,2033,1968, +2033,1969,2034, +1970,2034,1969, +2034,1970,2035, +1971,2035,1970, +2035,1971,2036, +1972,2036,1971, +2036,1972,2037, +1973,2037,1972, +2037,1973,2038, +1974,2038,1973, +2038,1974,2039, +1975,2039,1974, +2039,1975,2040, +1976,2040,1975, +2040,1976,2041, +1977,2041,1976, +2041,1977,2042, +1978,2042,1977, +2042,1978,2043, +1979,2043,1978, +2043,1979,2044, +1980,2044,1979, +2044,1980,2045, +1981,2045,1980, +2045,1981,2046, +1982,2046,1981, +2046,1982,2047, +1983,2047,1982, +2048,1984,2049, +1985,2049,1984, +2049,1985,2050, +1986,2050,1985, +2050,1986,2051, +1987,2051,1986, +2051,1987,2052, +1988,2052,1987, +2052,1988,2053, +1989,2053,1988, +2053,1989,2054, +1990,2054,1989, +2054,1990,2055, +1991,2055,1990, +2055,1991,2056, +1992,2056,1991, +2056,1992,2057, +1993,2057,1992, +2057,1993,2058, +1994,2058,1993, +2058,1994,2059, +1995,2059,1994, +2059,1995,2060, +1996,2060,1995, +2060,1996,2061, +1997,2061,1996, +2061,1997,2062, +1998,2062,1997, +2062,1998,2063, +1999,2063,1998, +2063,1999,2064, +2000,2064,1999, +2064,2000,2065, +2001,2065,2000, +2065,2001,2066, +2002,2066,2001, +2066,2002,2067, +2003,2067,2002, +2067,2003,2068, +2004,2068,2003, +2068,2004,2069, +2005,2069,2004, +2069,2005,2070, +2006,2070,2005, +2070,2006,2071, +2007,2071,2006, +2071,2007,2072, +2008,2072,2007, +2072,2008,2073, +2009,2073,2008, +2073,2009,2074, +2010,2074,2009, +2074,2010,2075, +2011,2075,2010, +2075,2011,2076, +2012,2076,2011, +2076,2012,2077, +2013,2077,2012, +2077,2013,2078, +2014,2078,2013, +2078,2014,2079, +2015,2079,2014, +2079,2015,2080, +2016,2080,2015, +2080,2016,2081, +2017,2081,2016, +2081,2017,2082, +2018,2082,2017, +2082,2018,2083, +2019,2083,2018, +2083,2019,2084, +2020,2084,2019, +2084,2020,2085, +2021,2085,2020, +2085,2021,2086, +2022,2086,2021, +2086,2022,2087, +2023,2087,2022, +2087,2023,2088, +2024,2088,2023, +2088,2024,2089, +2025,2089,2024, +2089,2025,2090, +2026,2090,2025, +2090,2026,2091, +2027,2091,2026, +2091,2027,2092, +2028,2092,2027, +2092,2028,2093, +2029,2093,2028, +2093,2029,2094, +2030,2094,2029, +2094,2030,2095, +2031,2095,2030, +2095,2031,2096, +2032,2096,2031, +2096,2032,2097, +2033,2097,2032, +2097,2033,2098, +2034,2098,2033, +2098,2034,2099, +2035,2099,2034, +2099,2035,2100, +2036,2100,2035, +2100,2036,2101, +2037,2101,2036, +2101,2037,2102, +2038,2102,2037, +2102,2038,2103, +2039,2103,2038, +2103,2039,2104, +2040,2104,2039, +2104,2040,2105, +2041,2105,2040, +2105,2041,2106, +2042,2106,2041, +2106,2042,2107, +2043,2107,2042, +2107,2043,2108, +2044,2108,2043, +2108,2044,2109, +2045,2109,2044, +2109,2045,2110, +2046,2110,2045, +2110,2046,2111, +2047,2111,2046, +}; + +#define Landscape05VtxCount 2244 +#define Landscape05IdxCount 12870 + +btScalar Landscape05Vtx[] = { +-250.0f,-0.990273f,0.0f, +-250.0f,0.139875f,3.90625f, +-246.094f,0.671004f,0.0f, +-246.094f,1.72995f,3.90625f, +-242.188f,1.84097f,0.0f, +-242.188f,2.60122f,3.90625f, +-238.281f,3.67319f,-1.6056e-007f, +-238.281f,4.01346f,3.90625f, +-234.375f,4.96849f,-2.1718e-007f, +-234.375f,5.13654f,3.90625f, +-230.469f,6.56215f,-2.86841e-007f, +-230.469f,6.69665f,3.90625f, +-226.563f,8.30102f,-3.62849e-007f, +-226.563f,8.43203f,3.90625f, +-222.656f,9.94385f,-4.3466e-007f, +-222.656f,9.83442f,3.90625f, +-218.75f,11.5986f,-5.06992e-007f, +-218.75f,11.3645f,3.90625f, +-214.844f,14.3141f,-6.2569e-007f, +-214.844f,14.222f,3.90625f, +-210.938f,16.5538f,-7.2359e-007f, +-210.938f,16.1758f,3.90625f, +-207.031f,18.852f,-8.24046e-007f, +-207.031f,18.9127f,3.90625f, +-203.125f,21.5344f,-9.41301e-007f, +-203.125f,21.2478f,3.90625f, +-199.219f,22.7337f,-9.93723e-007f, +-199.219f,23.0589f,3.90625f, +-195.313f,24.4712f,-1.06967e-006f, +-195.313f,24.6025f,3.90625f, +-191.406f,26.1169f,-1.14161e-006f, +-191.406f,25.8143f,3.90625f, +-187.5f,26.9988f,-1.18015e-006f, +-187.5f,27.5696f,3.90625f, +-183.594f,28.3854f,-1.24077e-006f, +-183.594f,29.2176f,3.90625f, +-179.688f,29.0457f,-1.26963e-006f, +-179.688f,29.6835f,3.90625f, +-175.781f,29.802f,-1.30269e-006f, +-175.781f,30.7416f,3.90625f, +-171.875f,30.1559f,-1.31816e-006f, +-171.875f,31.4405f,3.90625f, +-167.969f,32.3708f,-1.41497e-006f, +-167.969f,33.0831f,3.90625f, +-164.063f,34.9705f,-1.52861e-006f, +-164.063f,34.6225f,3.90625f, +-160.156f,36.396f,-1.59092e-006f, +-160.156f,35.4992f,3.90625f, +-156.25f,37.2947f,-1.6302e-006f, +-156.25f,37.4126f,3.90625f, +-152.344f,38.248f,-1.67187e-006f, +-152.344f,38.453f,3.90625f, +-148.438f,38.3176f,-1.67491e-006f, +-148.438f,38.9974f,3.90625f, +-144.531f,38.1589f,-1.66798e-006f, +-144.531f,38.7871f,3.90625f, +-140.625f,36.5895f,-1.59938e-006f, +-140.625f,37.6021f,3.90625f, +-136.719f,35.718f,-1.56128e-006f, +-136.719f,36.1797f,3.90625f, +-132.813f,33.7519f,-1.47534e-006f, +-132.813f,34.9906f,3.90625f, +-128.906f,33.2853f,-1.45495e-006f, +-128.906f,34.1304f,3.90625f, +-125.0f,33.4003f,-1.45997e-006f, +-125.0f,34.3517f,3.90625f, +-121.094f,33.1132f,-1.44742e-006f, +-121.094f,33.6612f,3.90625f, +-117.188f,32.7861f,-1.43313e-006f, +-117.188f,32.7047f,3.90625f, +-113.281f,33.0037f,-1.44264e-006f, +-113.281f,32.3958f,3.90625f, +-109.375f,32.508f,-1.42097e-006f, +-109.375f,31.0818f,3.90625f, +-105.469f,31.8384f,-1.3917e-006f, +-105.469f,30.9536f,3.90625f, +-101.563f,31.1858f,-1.36317e-006f, +-101.563f,29.8205f,3.90625f, +-97.6563f,29.6739f,-1.29709e-006f, +-97.6563f,28.4796f,3.90625f, +-93.75f,27.8258f,-1.2163e-006f, +-93.75f,27.6494f,3.90625f, +-89.8438f,25.9046f,-1.13232e-006f, +-89.8438f,25.5721f,3.90625f, +-85.9375f,23.4229f,-1.02385e-006f, +-85.9375f,24.227f,3.90625f, +-82.0313f,23.3671f,-1.02141e-006f, +-82.0313f,23.2611f,3.90625f, +-78.125f,23.0585f,-1.00792e-006f, +-78.125f,22.4589f,3.90625f, +-74.2188f,23.9226f,-1.04569e-006f, +-74.2188f,23.2261f,3.90625f, +-70.3125f,23.6449f,-1.03355e-006f, +-70.3125f,23.5025f,3.90625f, +-66.4063f,23.2789f,-1.01755e-006f, +-66.4063f,23.6913f,3.90625f, +-62.5f,24.5841f,-1.07461e-006f, +-62.5f,24.6785f,3.90625f, +-58.5938f,25.71f,-1.12382e-006f, +-58.5938f,25.4946f,3.90625f, +-54.6875f,26.9872f,-1.17965e-006f, +-54.6875f,25.9722f,3.90625f, +-50.7813f,27.8632f,-1.21794e-006f, +-50.7813f,26.1977f,3.90625f, +-46.875f,28.0326f,-1.22534e-006f, +-46.875f,26.8539f,3.90625f, +-42.9688f,28.0866f,-1.2277e-006f, +-42.9688f,27.7268f,3.90625f, +-39.0625f,30.1482f,-1.31782e-006f, +-39.0625f,29.2046f,3.90625f, +-35.1563f,32.4049f,-1.41646e-006f, +-35.1563f,31.79f,3.90625f, +-31.25f,34.4714f,-1.50679e-006f, +-31.25f,34.2658f,3.90625f, +-27.3438f,37.2668f,-1.62898e-006f, +-27.3438f,35.9914f,3.90625f, +-23.4375f,38.7934f,-1.69571e-006f, +-23.4375f,38.3776f,3.90625f, +-19.5313f,40.4024f,-1.76605e-006f, +-19.5313f,39.8852f,3.90625f, +-15.625f,42.8177f,-1.87162e-006f, +-15.625f,43.1455f,3.90625f, +-11.7188f,45.0198f,-1.96788e-006f, +-11.7188f,45.5059f,3.90625f, +-7.8125f,46.7349f,-2.04285e-006f, +-7.8125f,47.4257f,3.90625f, +-3.90625f,48.376f,-2.11458e-006f, +-3.90625f,49.9032f,3.90625f, +0.0f,49.9016f,-2.18127e-006f, +0.0f,52.0322f,3.90625f, +3.90625f,50.3865f,-2.20246e-006f, +3.90625f,52.6186f,3.90625f, +-250.0f,-0.818988f,-3.90625f, +-246.094f,0.671433f,-3.90625f, +-242.188f,2.83415f,-3.90625f, +-238.281f,4.19978f,-3.90625f, +-234.375f,5.59158f,-3.90625f, +-230.469f,6.94041f,-3.90625f, +-226.563f,8.34599f,-3.90625f, +-222.656f,9.85416f,-3.90625f, +-218.75f,10.8989f,-3.90625f, +-214.844f,13.6339f,-3.90625f, +-210.938f,16.5116f,-3.90625f, +-207.031f,17.7111f,-3.90625f, +-203.125f,20.7442f,-3.90625f, +-199.219f,22.5356f,-3.90625f, +-195.313f,24.3988f,-3.90625f, +-191.406f,25.8062f,-3.90625f, +-187.5f,26.9714f,-3.90625f, +-183.594f,27.7397f,-3.90625f, +-179.688f,28.8632f,-3.90625f, +-175.781f,29.9688f,-3.90625f, +-171.875f,32.154f,-3.90625f, +-167.969f,33.3799f,-3.90625f, +-164.063f,35.3882f,-3.90625f, +-160.156f,35.9765f,-3.90625f, +-156.25f,36.5306f,-3.90625f, +-152.344f,37.3214f,-3.90625f, +-148.438f,36.8126f,-3.90625f, +-144.531f,36.5407f,-3.90625f, +-140.625f,35.696f,-3.90625f, +-136.719f,35.1152f,-3.90625f, +-132.813f,34.1963f,-3.90625f, +-128.906f,34.0796f,-3.90625f, +-125.0f,34.2398f,-3.90625f, +-121.094f,34.1503f,-3.90625f, +-117.188f,33.7958f,-3.90625f, +-113.281f,33.856f,-3.90625f, +-109.375f,33.2705f,-3.90625f, +-105.469f,32.5804f,-3.90625f, +-101.563f,31.911f,-3.90625f, +-97.6563f,30.3705f,-3.90625f, +-93.75f,29.0627f,-3.90625f, +-89.8438f,26.6822f,-3.90625f, +-85.9375f,24.8309f,-3.90625f, +-82.0313f,23.8581f,-3.90625f, +-78.125f,23.3764f,-3.90625f, +-74.2188f,23.9582f,-3.90625f, +-70.3125f,24.13f,-3.90625f, +-66.4063f,24.4426f,-3.90625f, +-62.5f,25.5839f,-3.90625f, +-58.5938f,26.6899f,-3.90625f, +-54.6875f,27.9086f,-3.90625f, +-50.7813f,28.5131f,-3.90625f, +-46.875f,29.2612f,-3.90625f, +-42.9688f,29.4581f,-3.90625f, +-39.0625f,30.8972f,-3.90625f, +-35.1563f,32.9085f,-3.90625f, +-31.25f,34.9204f,-3.90625f, +-27.3438f,37.7223f,-3.90625f, +-23.4375f,38.921f,-3.90625f, +-19.5313f,40.2983f,-3.90625f, +-15.625f,41.7689f,-3.90625f, +-11.7188f,43.8388f,-3.90625f, +-7.8125f,44.7599f,-3.90625f, +-3.90625f,46.53f,-3.90625f, +0.0f,48.2498f,-3.90625f, +3.90625f,48.8559f,-3.90625f, +-250.0f,0.432867f,-7.8125f, +-246.094f,1.93096f,-7.8125f, +-242.188f,3.28774f,-7.8125f, +-238.281f,4.53112f,-7.8125f, +-234.375f,5.67699f,-7.8125f, +-230.469f,7.34068f,-7.8125f, +-226.563f,8.48553f,-7.8125f, +-222.656f,10.127f,-7.8125f, +-218.75f,11.3267f,-7.8125f, +-214.844f,13.3914f,-7.8125f, +-210.938f,15.5197f,-7.8125f, +-207.031f,17.9403f,-7.8125f, +-203.125f,20.5644f,-7.8125f, +-199.219f,22.8796f,-7.8125f, +-195.313f,23.715f,-7.8125f, +-191.406f,26.1312f,-7.8125f, +-187.5f,28.0754f,-7.8125f, +-183.594f,29.1199f,-7.8125f, +-179.688f,29.5774f,-7.8125f, +-175.781f,30.2676f,-7.8125f, +-171.875f,31.8275f,-7.8125f, +-167.969f,33.4969f,-7.8125f, +-164.063f,34.4445f,-7.8125f, +-160.156f,35.3881f,-7.8125f, +-156.25f,36.0267f,-7.8125f, +-152.344f,36.1221f,-7.8125f, +-148.438f,36.7707f,-7.8125f, +-144.531f,36.3067f,-7.8125f, +-140.625f,36.2295f,-7.8125f, +-136.719f,35.6858f,-7.8125f, +-132.813f,34.6232f,-7.8125f, +-128.906f,34.1675f,-7.8125f, +-125.0f,34.1756f,-7.8125f, +-121.094f,33.6453f,-7.8125f, +-117.188f,34.2516f,-7.8125f, +-113.281f,34.228f,-7.8125f, +-109.375f,34.253f,-7.8125f, +-105.469f,33.1798f,-7.8125f, +-101.563f,32.238f,-7.8125f, +-97.6563f,31.0377f,-7.8125f, +-93.75f,29.6795f,-7.8125f, +-89.8438f,27.5934f,-7.8125f, +-85.9375f,25.7426f,-7.8125f, +-82.0313f,24.4001f,-7.8125f, +-78.125f,24.4095f,-7.8125f, +-74.2188f,25.1494f,-7.8125f, +-70.3125f,25.0193f,-7.8125f, +-66.4063f,25.3902f,-7.8125f, +-62.5f,25.8612f,-7.8125f, +-58.5938f,26.8169f,-7.8125f, +-54.6875f,28.0698f,-7.8125f, +-50.7813f,28.978f,-7.8125f, +-46.875f,29.1063f,-7.8125f, +-42.9688f,30.6071f,-7.8125f, +-39.0625f,31.7015f,-7.8125f, +-35.1563f,32.6112f,-7.8125f, +-31.25f,34.6006f,-7.8125f, +-27.3438f,36.3005f,-7.8125f, +-23.4375f,38.4757f,-7.8125f, +-19.5313f,39.7014f,-7.8125f, +-15.625f,40.7762f,-7.8125f, +-11.7188f,42.6458f,-7.8125f, +-7.8125f,45.0307f,-7.8125f, +-3.90625f,47.2861f,-7.8125f, +0.0f,48.5591f,-7.8125f, +3.90625f,48.7225f,-7.8125f, +-250.0f,0.568294f,-11.7188f, +-246.094f,1.83097f,-11.7188f, +-242.188f,3.32037f,-11.7188f, +-238.281f,4.29184f,-11.7188f, +-234.375f,6.04113f,-11.7188f, +-230.469f,7.01872f,-11.7188f, +-226.563f,8.96731f,-11.7188f, +-222.656f,10.3749f,-11.7188f, +-218.75f,11.568f,-11.7188f, +-214.844f,13.9092f,-11.7188f, +-210.938f,15.6547f,-11.7188f, +-207.031f,18.2156f,-11.7188f, +-203.125f,20.0116f,-11.7188f, +-199.219f,21.5443f,-11.7188f, +-195.313f,23.4553f,-11.7188f, +-191.406f,26.2778f,-11.7188f, +-187.5f,28.0543f,-11.7188f, +-183.594f,29.2657f,-11.7188f, +-179.688f,29.6454f,-11.7188f, +-175.781f,30.699f,-11.7188f, +-171.875f,30.8229f,-11.7188f, +-167.969f,32.9874f,-11.7188f, +-164.063f,33.581f,-11.7188f, +-160.156f,34.6365f,-11.7188f, +-156.25f,35.6153f,-11.7188f, +-152.344f,36.2491f,-11.7188f, +-148.438f,36.2996f,-11.7188f, +-144.531f,36.5456f,-11.7188f, +-140.625f,36.3803f,-11.7188f, +-136.719f,35.2403f,-11.7188f, +-132.813f,34.0595f,-11.7188f, +-128.906f,34.1384f,-11.7188f, +-125.0f,33.59f,-11.7188f, +-121.094f,33.7745f,-11.7188f, +-117.188f,33.7284f,-11.7188f, +-113.281f,33.7013f,-11.7188f, +-109.375f,33.6335f,-11.7188f, +-105.469f,33.2451f,-11.7188f, +-101.563f,32.8691f,-11.7188f, +-97.6563f,31.1343f,-11.7188f, +-93.75f,29.5843f,-11.7188f, +-89.8438f,27.5891f,-11.7188f, +-85.9375f,25.75f,-11.7188f, +-82.0313f,25.4336f,-11.7188f, +-78.125f,25.6207f,-11.7188f, +-74.2188f,25.1627f,-11.7188f, +-70.3125f,25.542f,-11.7188f, +-66.4063f,25.5384f,-11.7188f, +-62.5f,25.9238f,-11.7188f, +-58.5938f,26.0718f,-11.7188f, +-54.6875f,27.4395f,-11.7188f, +-50.7813f,28.8032f,-11.7188f, +-46.875f,29.9667f,-11.7188f, +-42.9688f,31.7598f,-11.7188f, +-39.0625f,32.2636f,-11.7188f, +-35.1563f,32.5734f,-11.7188f, +-31.25f,33.543f,-11.7188f, +-27.3438f,35.1143f,-11.7188f, +-23.4375f,37.3147f,-11.7188f, +-19.5313f,39.2413f,-11.7188f, +-15.625f,41.8344f,-11.7188f, +-11.7188f,43.9992f,-11.7188f, +-7.8125f,46.8581f,-11.7188f, +-3.90625f,48.5977f,-11.7188f, +0.0f,48.7029f,-11.7188f, +3.90625f,49.6298f,-11.7188f, +-250.0f,1.50235f,-15.625f, +-246.094f,1.79115f,-15.625f, +-242.188f,2.52523f,-15.625f, +-238.281f,4.09278f,-15.625f, +-234.375f,6.21068f,-15.625f, +-230.469f,7.49819f,-15.625f, +-226.563f,8.56548f,-15.625f, +-222.656f,9.98954f,-15.625f, +-218.75f,12.3263f,-15.625f, +-214.844f,14.495f,-15.625f, +-210.938f,15.3551f,-15.625f, +-207.031f,17.6989f,-15.625f, +-203.125f,19.2847f,-15.625f, +-199.219f,21.1027f,-15.625f, +-195.313f,23.3408f,-15.625f, +-191.406f,25.3739f,-15.625f, +-187.5f,27.368f,-15.625f, +-183.594f,28.3731f,-15.625f, +-179.688f,29.5532f,-15.625f, +-175.781f,30.0011f,-15.625f, +-171.875f,31.0216f,-15.625f, +-167.969f,32.5546f,-15.625f, +-164.063f,32.6717f,-15.625f, +-160.156f,33.8465f,-15.625f, +-156.25f,35.1272f,-15.625f, +-152.344f,35.5572f,-15.625f, +-148.438f,36.643f,-15.625f, +-144.531f,36.4283f,-15.625f, +-140.625f,35.6122f,-15.625f, +-136.719f,35.358f,-15.625f, +-132.813f,34.1938f,-15.625f, +-128.906f,34.3913f,-15.625f, +-125.0f,33.2147f,-15.625f, +-121.094f,32.799f,-15.625f, +-117.188f,33.1385f,-15.625f, +-113.281f,33.1487f,-15.625f, +-109.375f,33.6564f,-15.625f, +-105.469f,33.2315f,-15.625f, +-101.563f,32.6066f,-15.625f, +-97.6563f,30.6926f,-15.625f, +-93.75f,28.534f,-15.625f, +-89.8438f,27.6738f,-15.625f, +-85.9375f,27.4216f,-15.625f, +-82.0313f,26.0324f,-15.625f, +-78.125f,25.775f,-15.625f, +-74.2188f,25.909f,-15.625f, +-70.3125f,25.0198f,-15.625f, +-66.4063f,25.9376f,-15.625f, +-62.5f,26.0382f,-15.625f, +-58.5938f,25.856f,-15.625f, +-54.6875f,27.3648f,-15.625f, +-50.7813f,28.9059f,-15.625f, +-46.875f,30.6601f,-15.625f, +-42.9688f,32.6996f,-15.625f, +-39.0625f,32.6909f,-15.625f, +-35.1563f,33.1697f,-15.625f, +-31.25f,34.6947f,-15.625f, +-27.3438f,35.6982f,-15.625f, +-23.4375f,38.2946f,-15.625f, +-19.5313f,40.6765f,-15.625f, +-15.625f,43.5894f,-15.625f, +-11.7188f,46.3071f,-15.625f, +-7.8125f,48.6578f,-15.625f, +-3.90625f,49.0003f,-15.625f, +0.0f,50.5123f,-15.625f, +3.90625f,50.6915f,-15.625f, +-250.0f,1.44302f,-19.5313f, +-246.094f,1.65093f,-19.5313f, +-242.188f,2.94233f,-19.5313f, +-238.281f,4.72065f,-19.5313f, +-234.375f,6.57861f,-19.5313f, +-230.469f,7.31849f,-19.5313f, +-226.563f,7.90567f,-19.5313f, +-222.656f,9.84414f,-19.5313f, +-218.75f,12.1574f,-19.5313f, +-214.844f,13.2825f,-19.5313f, +-210.938f,15.2284f,-19.5313f, +-207.031f,17.2765f,-19.5313f, +-203.125f,19.1565f,-19.5313f, +-199.219f,20.3098f,-19.5313f, +-195.313f,21.9346f,-19.5313f, +-191.406f,23.8549f,-19.5313f, +-187.5f,26.133f,-19.5313f, +-183.594f,27.5858f,-19.5313f, +-179.688f,28.557f,-19.5313f, +-175.781f,28.9754f,-19.5313f, +-171.875f,29.9709f,-19.5313f, +-167.969f,31.2632f,-19.5313f, +-164.063f,31.4957f,-19.5313f, +-160.156f,33.6753f,-19.5313f, +-156.25f,35.1342f,-19.5313f, +-152.344f,35.0617f,-19.5313f, +-148.438f,34.9467f,-19.5313f, +-144.531f,35.1042f,-19.5313f, +-140.625f,35.0842f,-19.5313f, +-136.719f,34.7766f,-19.5313f, +-132.813f,33.8305f,-19.5313f, +-128.906f,33.3013f,-19.5313f, +-125.0f,32.5726f,-19.5313f, +-121.094f,31.5139f,-19.5313f, +-117.188f,31.4576f,-19.5313f, +-113.281f,31.6546f,-19.5313f, +-109.375f,32.4663f,-19.5313f, +-105.469f,32.6148f,-19.5313f, +-101.563f,31.253f,-19.5313f, +-97.6563f,29.5875f,-19.5313f, +-93.75f,28.4866f,-19.5313f, +-89.8438f,29.106f,-19.5313f, +-85.9375f,28.7092f,-19.5313f, +-82.0313f,27.4567f,-19.5313f, +-78.125f,26.5225f,-19.5313f, +-74.2188f,26.7534f,-19.5313f, +-70.3125f,26.278f,-19.5313f, +-66.4063f,25.6949f,-19.5313f, +-62.5f,25.7385f,-19.5313f, +-58.5938f,25.8791f,-19.5313f, +-54.6875f,27.42f,-19.5313f, +-50.7813f,29.0777f,-19.5313f, +-46.875f,31.016f,-19.5313f, +-42.9688f,32.5331f,-19.5313f, +-39.0625f,33.213f,-19.5313f, +-35.1563f,33.9437f,-19.5313f, +-31.25f,35.6737f,-19.5313f, +-27.3438f,37.8841f,-19.5313f, +-23.4375f,40.5289f,-19.5313f, +-19.5313f,43.6786f,-19.5313f, +-15.625f,47.2945f,-19.5313f, +-11.7188f,49.7082f,-19.5313f, +-7.8125f,51.1285f,-19.5313f, +-3.90625f,51.5532f,-19.5313f, +0.0f,52.3342f,-19.5313f, +3.90625f,52.1028f,-19.5313f, +-250.0f,1.05337f,-23.4375f, +-246.094f,1.28315f,-23.4375f, +-242.188f,3.38102f,-23.4375f, +-238.281f,4.51357f,-23.4375f, +-234.375f,5.63288f,-23.4375f, +-230.469f,6.49498f,-23.4375f, +-226.563f,7.71248f,-23.4375f, +-222.656f,8.83716f,-23.4375f, +-218.75f,10.4002f,-23.4375f, +-214.844f,11.8049f,-23.4375f, +-210.938f,13.7948f,-23.4375f, +-207.031f,16.5066f,-23.4375f, +-203.125f,18.598f,-23.4375f, +-199.219f,20.3069f,-23.4375f, +-195.313f,21.6868f,-23.4375f, +-191.406f,22.5781f,-23.4375f, +-187.5f,25.0292f,-23.4375f, +-183.594f,26.5386f,-23.4375f, +-179.688f,27.1952f,-23.4375f, +-175.781f,28.4023f,-23.4375f, +-171.875f,29.0264f,-23.4375f, +-167.969f,29.9302f,-23.4375f, +-164.063f,31.7992f,-23.4375f, +-160.156f,33.4902f,-23.4375f, +-156.25f,34.4307f,-23.4375f, +-152.344f,34.1463f,-23.4375f, +-148.438f,33.5881f,-23.4375f, +-144.531f,34.0515f,-23.4375f, +-140.625f,33.7128f,-23.4375f, +-136.719f,33.2076f,-23.4375f, +-132.813f,32.0419f,-23.4375f, +-128.906f,31.3464f,-23.4375f, +-125.0f,31.3552f,-23.4375f, +-121.094f,30.6713f,-23.4375f, +-117.188f,30.1403f,-23.4375f, +-113.281f,30.1753f,-23.4375f, +-109.375f,30.6182f,-23.4375f, +-105.469f,31.2785f,-23.4375f, +-101.563f,30.4839f,-23.4375f, +-97.6563f,28.9907f,-23.4375f, +-93.75f,29.3427f,-23.4375f, +-89.8438f,29.5539f,-23.4375f, +-85.9375f,29.4313f,-23.4375f, +-82.0313f,28.0148f,-23.4375f, +-78.125f,27.3569f,-23.4375f, +-74.2188f,26.8569f,-23.4375f, +-70.3125f,25.6193f,-23.4375f, +-66.4063f,25.8188f,-23.4375f, +-62.5f,25.458f,-23.4375f, +-58.5938f,26.5128f,-23.4375f, +-54.6875f,27.2598f,-23.4375f, +-50.7813f,28.4912f,-23.4375f, +-46.875f,31.0376f,-23.4375f, +-42.9688f,33.0941f,-23.4375f, +-39.0625f,34.4933f,-23.4375f, +-35.1563f,37.1957f,-23.4375f, +-31.25f,39.4612f,-23.4375f, +-27.3438f,41.4598f,-23.4375f, +-23.4375f,43.5893f,-23.4375f, +-19.5313f,46.8054f,-23.4375f, +-15.625f,49.4177f,-23.4375f, +-11.7188f,51.7957f,-23.4375f, +-7.8125f,53.1306f,-23.4375f, +-3.90625f,53.4872f,-23.4375f, +0.0f,53.6348f,-23.4375f, +3.90625f,54.332f,-23.4375f, +-250.0f,1.05459f,-27.3438f, +-246.094f,2.15725f,-27.3438f, +-242.188f,3.16747f,-27.3438f, +-238.281f,4.17562f,-27.3438f, +-234.375f,5.17097f,-27.3438f, +-230.469f,6.61997f,-27.3438f, +-226.563f,7.25727f,-27.3438f, +-222.656f,9.26302f,-27.3438f, +-218.75f,10.7606f,-27.3438f, +-214.844f,11.6966f,-27.3438f, +-210.938f,13.0425f,-27.3438f, +-207.031f,15.0672f,-27.3438f, +-203.125f,17.5971f,-27.3438f, +-199.219f,19.3182f,-27.3438f, +-195.313f,20.4505f,-27.3438f, +-191.406f,20.7017f,-27.3438f, +-187.5f,22.8054f,-27.3438f, +-183.594f,24.7406f,-27.3438f, +-179.688f,25.7957f,-27.3438f, +-175.781f,28.4608f,-27.3438f, +-171.875f,29.5031f,-27.3438f, +-167.969f,29.8812f,-27.3438f, +-164.063f,31.4954f,-27.3438f, +-160.156f,32.6053f,-27.3438f, +-156.25f,32.9274f,-27.3438f, +-152.344f,32.6481f,-27.3438f, +-148.438f,32.4456f,-27.3438f, +-144.531f,32.0065f,-27.3438f, +-140.625f,31.7655f,-27.3438f, +-136.719f,31.6836f,-27.3438f, +-132.813f,30.9994f,-27.3438f, +-128.906f,30.4065f,-27.3438f, +-125.0f,29.7478f,-27.3438f, +-121.094f,29.3871f,-27.3438f, +-117.188f,28.6628f,-27.3438f, +-113.281f,28.88f,-27.3438f, +-109.375f,29.3757f,-27.3438f, +-105.469f,29.7372f,-27.3438f, +-101.563f,28.9035f,-27.3438f, +-97.6563f,29.0842f,-27.3438f, +-93.75f,28.969f,-27.3438f, +-89.8438f,29.282f,-27.3438f, +-85.9375f,29.4429f,-27.3438f, +-82.0313f,29.2385f,-27.3438f, +-78.125f,28.2845f,-27.3438f, +-74.2188f,26.9413f,-27.3438f, +-70.3125f,26.3888f,-27.3438f, +-66.4063f,26.4127f,-27.3438f, +-62.5f,27.4297f,-27.3438f, +-58.5938f,28.0301f,-27.3438f, +-54.6875f,28.3682f,-27.3438f, +-50.7813f,30.4624f,-27.3438f, +-46.875f,32.6469f,-27.3438f, +-42.9688f,34.7681f,-27.3438f, +-39.0625f,37.3677f,-27.3438f, +-35.1563f,40.0943f,-27.3438f, +-31.25f,42.4424f,-27.3438f, +-27.3438f,44.5954f,-27.3438f, +-23.4375f,48.1538f,-27.3438f, +-19.5313f,50.5809f,-27.3438f, +-15.625f,52.7959f,-27.3438f, +-11.7188f,53.9779f,-27.3438f, +-7.8125f,55.2657f,-27.3438f, +-3.90625f,55.7427f,-27.3438f, +0.0f,56.6047f,-27.3438f, +3.90625f,57.5273f,-27.3438f, +-250.0f,1.91243f,-31.25f, +-246.094f,1.77508f,-31.25f, +-242.188f,2.89721f,-31.25f, +-238.281f,4.82177f,-31.25f, +-234.375f,5.57483f,-31.25f, +-230.469f,6.15697f,-31.25f, +-226.563f,7.43219f,-31.25f, +-222.656f,9.10752f,-31.25f, +-218.75f,10.7345f,-31.25f, +-214.844f,11.7298f,-31.25f, +-210.938f,13.0008f,-31.25f, +-207.031f,14.4465f,-31.25f, +-203.125f,16.7635f,-31.25f, +-199.219f,18.7095f,-31.25f, +-195.313f,19.057f,-31.25f, +-191.406f,19.522f,-31.25f, +-187.5f,21.0252f,-31.25f, +-183.594f,22.477f,-31.25f, +-179.688f,24.9456f,-31.25f, +-175.781f,27.5579f,-31.25f, +-171.875f,28.9367f,-31.25f, +-167.969f,29.5938f,-31.25f, +-164.063f,29.9491f,-31.25f, +-160.156f,31.1043f,-31.25f, +-156.25f,31.898f,-31.25f, +-152.344f,32.025f,-31.25f, +-148.438f,32.2848f,-31.25f, +-144.531f,31.4433f,-31.25f, +-140.625f,29.9423f,-31.25f, +-136.719f,30.2535f,-31.25f, +-132.813f,30.4668f,-31.25f, +-128.906f,30.1261f,-31.25f, +-125.0f,29.2612f,-31.25f, +-121.094f,27.5496f,-31.25f, +-117.188f,27.0659f,-31.25f, +-113.281f,27.3359f,-31.25f, +-109.375f,27.8418f,-31.25f, +-105.469f,28.9814f,-31.25f, +-101.563f,28.4429f,-31.25f, +-97.6563f,28.5833f,-31.25f, +-93.75f,28.9986f,-31.25f, +-89.8438f,30.3273f,-31.25f, +-85.9375f,30.5898f,-31.25f, +-82.0313f,29.8768f,-31.25f, +-78.125f,28.7278f,-31.25f, +-74.2188f,28.2599f,-31.25f, +-70.3125f,27.5942f,-31.25f, +-66.4063f,28.2721f,-31.25f, +-62.5f,28.9526f,-31.25f, +-58.5938f,29.4527f,-31.25f, +-54.6875f,30.1605f,-31.25f, +-50.7813f,32.6242f,-31.25f, +-46.875f,35.2708f,-31.25f, +-42.9688f,37.6696f,-31.25f, +-39.0625f,40.1477f,-31.25f, +-35.1563f,42.5127f,-31.25f, +-31.25f,45.655f,-31.25f, +-27.3438f,48.5747f,-31.25f, +-23.4375f,51.2069f,-31.25f, +-19.5313f,53.5599f,-31.25f, +-15.625f,55.3726f,-31.25f, +-11.7188f,56.4687f,-31.25f, +-7.8125f,56.313f,-31.25f, +-3.90625f,58.0363f,-31.25f, +0.0f,59.422f,-31.25f, +3.90625f,59.4204f,-31.25f, +-250.0f,1.80637f,-35.1563f, +-246.094f,1.14243f,-35.1563f, +-242.188f,2.08309f,-35.1563f, +-238.281f,3.66548f,-35.1563f, +-234.375f,4.49251f,-35.1563f, +-230.469f,5.63985f,-35.1563f, +-226.563f,7.33778f,-35.1563f, +-222.656f,9.15183f,-35.1563f, +-218.75f,10.0463f,-35.1563f, +-214.844f,11.7521f,-35.1563f, +-210.938f,12.6919f,-35.1563f, +-207.031f,14.0216f,-35.1563f, +-203.125f,14.9825f,-35.1563f, +-199.219f,16.2286f,-35.1563f, +-195.313f,17.2153f,-35.1563f, +-191.406f,18.0692f,-35.1563f, +-187.5f,19.858f,-35.1563f, +-183.594f,22.2715f,-35.1563f, +-179.688f,25.6457f,-35.1563f, +-175.781f,27.6627f,-35.1563f, +-171.875f,28.6491f,-35.1563f, +-167.969f,29.5869f,-35.1563f, +-164.063f,29.5582f,-35.1563f, +-160.156f,30.7619f,-35.1563f, +-156.25f,31.372f,-35.1563f, +-152.344f,31.4423f,-35.1563f, +-148.438f,31.7578f,-35.1563f, +-144.531f,31.1339f,-35.1563f, +-140.625f,29.3454f,-35.1563f, +-136.719f,28.0675f,-35.1563f, +-132.813f,28.1828f,-35.1563f, +-128.906f,28.2649f,-35.1563f, +-125.0f,27.2326f,-35.1563f, +-121.094f,26.2567f,-35.1563f, +-117.188f,25.4914f,-35.1563f, +-113.281f,25.5444f,-35.1563f, +-109.375f,25.8703f,-35.1563f, +-105.469f,27.9373f,-35.1563f, +-101.563f,27.9306f,-35.1563f, +-97.6563f,27.9282f,-35.1563f, +-93.75f,28.9199f,-35.1563f, +-89.8438f,30.142f,-35.1563f, +-85.9375f,30.3479f,-35.1563f, +-82.0313f,29.749f,-35.1563f, +-78.125f,29.2656f,-35.1563f, +-74.2188f,28.8561f,-35.1563f, +-70.3125f,28.7144f,-35.1563f, +-66.4063f,29.3204f,-35.1563f, +-62.5f,29.6751f,-35.1563f, +-58.5938f,31.0647f,-35.1563f, +-54.6875f,32.3243f,-35.1563f, +-50.7813f,34.476f,-35.1563f, +-46.875f,37.0984f,-35.1563f, +-42.9688f,40.1281f,-35.1563f, +-39.0625f,42.4472f,-35.1563f, +-35.1563f,45.6772f,-35.1563f, +-31.25f,49.5655f,-35.1563f, +-27.3438f,51.5783f,-35.1563f, +-23.4375f,53.3f,-35.1563f, +-19.5313f,55.4127f,-35.1563f, +-15.625f,56.8152f,-35.1563f, +-11.7188f,56.8985f,-35.1563f, +-7.8125f,57.5886f,-35.1563f, +-3.90625f,58.9321f,-35.1563f, +0.0f,60.2297f,-35.1563f, +3.90625f,60.2212f,-35.1563f, +-250.0f,2.59935f,-39.0625f, +-246.094f,1.55278f,-39.0625f, +-242.188f,1.42243f,-39.0625f, +-238.281f,2.78238f,-39.0625f, +-234.375f,3.85918f,-39.0625f, +-230.469f,5.01321f,-39.0625f, +-226.563f,6.56707f,-39.0625f, +-222.656f,7.99762f,-39.0625f, +-218.75f,9.72642f,-39.0625f, +-214.844f,11.975f,-39.0625f, +-210.938f,12.8008f,-39.0625f, +-207.031f,13.6902f,-39.0625f, +-203.125f,14.2017f,-39.0625f, +-199.219f,14.8784f,-39.0625f, +-195.313f,16.6265f,-39.0625f, +-191.406f,17.066f,-39.0625f, +-187.5f,19.3153f,-39.0625f, +-183.594f,23.4017f,-39.0625f, +-179.688f,26.2073f,-39.0625f, +-175.781f,27.92f,-39.0625f, +-171.875f,29.0435f,-39.0625f, +-167.969f,28.8537f,-39.0625f, +-164.063f,29.6445f,-39.0625f, +-160.156f,30.2119f,-39.0625f, +-156.25f,30.4693f,-39.0625f, +-152.344f,30.6063f,-39.0625f, +-148.438f,30.8716f,-39.0625f, +-144.531f,30.3253f,-39.0625f, +-140.625f,29.3941f,-39.0625f, +-136.719f,27.7606f,-39.0625f, +-132.813f,26.806f,-39.0625f, +-128.906f,26.6501f,-39.0625f, +-125.0f,25.6992f,-39.0625f, +-121.094f,24.4674f,-39.0625f, +-117.188f,24.1124f,-39.0625f, +-113.281f,24.9142f,-39.0625f, +-109.375f,25.5696f,-39.0625f, +-105.469f,25.4691f,-39.0625f, +-101.563f,26.7147f,-39.0625f, +-97.6563f,26.7558f,-39.0625f, +-93.75f,27.9278f,-39.0625f, +-89.8438f,29.0149f,-39.0625f, +-85.9375f,29.3557f,-39.0625f, +-82.0313f,29.6134f,-39.0625f, +-78.125f,29.4742f,-39.0625f, +-74.2188f,29.3377f,-39.0625f, +-70.3125f,29.6082f,-39.0625f, +-66.4063f,29.4634f,-39.0625f, +-62.5f,31.1775f,-39.0625f, +-58.5938f,32.7227f,-39.0625f, +-54.6875f,34.2233f,-39.0625f, +-50.7813f,36.1862f,-39.0625f, +-46.875f,38.7123f,-39.0625f, +-42.9688f,41.2396f,-39.0625f, +-39.0625f,44.5857f,-39.0625f, +-35.1563f,47.0183f,-39.0625f, +-31.25f,50.9933f,-39.0625f, +-27.3438f,53.2967f,-39.0625f, +-23.4375f,55.2026f,-39.0625f, +-19.5313f,56.3858f,-39.0625f, +-15.625f,57.8615f,-39.0625f, +-11.7188f,57.7515f,-39.0625f, +-7.8125f,58.8071f,-39.0625f, +-3.90625f,59.73f,-39.0625f, +0.0f,59.8999f,-39.0625f, +3.90625f,59.9094f,-39.0625f, +-250.0f,2.73015f,-42.9688f, +-246.094f,1.9296f,-42.9688f, +-242.188f,2.00835f,-42.9688f, +-238.281f,3.16245f,-42.9688f, +-234.375f,3.35198f,-42.9688f, +-230.469f,4.50732f,-42.9688f, +-226.563f,6.28971f,-42.9688f, +-222.656f,7.89723f,-42.9688f, +-218.75f,9.28447f,-42.9688f, +-214.844f,11.4302f,-42.9688f, +-210.938f,12.7156f,-42.9688f, +-207.031f,13.6281f,-42.9688f, +-203.125f,14.5932f,-42.9688f, +-199.219f,14.8129f,-42.9688f, +-195.313f,15.7965f,-42.9688f, +-191.406f,16.3571f,-42.9688f, +-187.5f,20.257f,-42.9688f, +-183.594f,23.2993f,-42.9688f, +-179.688f,25.4583f,-42.9688f, +-175.781f,27.2887f,-42.9688f, +-171.875f,27.9862f,-42.9688f, +-167.969f,28.274f,-42.9688f, +-164.063f,28.9264f,-42.9688f, +-160.156f,29.1855f,-42.9688f, +-156.25f,29.8898f,-42.9688f, +-152.344f,29.4922f,-42.9688f, +-148.438f,29.257f,-42.9688f, +-144.531f,28.9137f,-42.9688f, +-140.625f,27.618f,-42.9688f, +-136.719f,26.8539f,-42.9688f, +-132.813f,26.2806f,-42.9688f, +-128.906f,25.1378f,-42.9688f, +-125.0f,24.508f,-42.9688f, +-121.094f,23.8458f,-42.9688f, +-117.188f,23.501f,-42.9688f, +-113.281f,24.0593f,-42.9688f, +-109.375f,24.1366f,-42.9688f, +-105.469f,24.075f,-42.9688f, +-101.563f,24.5025f,-42.9688f, +-97.6563f,24.8457f,-42.9688f, +-93.75f,26.5028f,-42.9688f, +-89.8438f,26.9842f,-42.9688f, +-85.9375f,28.5672f,-42.9688f, +-82.0313f,28.9848f,-42.9688f, +-78.125f,29.1484f,-42.9688f, +-74.2188f,28.8735f,-42.9688f, +-70.3125f,29.9085f,-42.9688f, +-66.4063f,31.647f,-42.9688f, +-62.5f,32.8553f,-42.9688f, +-58.5938f,34.4488f,-42.9688f, +-54.6875f,35.7724f,-42.9688f, +-50.7813f,38.5181f,-42.9688f, +-46.875f,40.619f,-42.9688f, +-42.9688f,42.6158f,-42.9688f, +-39.0625f,45.9557f,-42.9688f, +-35.1563f,48.8071f,-42.9688f, +-31.25f,51.5425f,-42.9688f, +-27.3438f,54.1461f,-42.9688f, +-23.4375f,56.6935f,-42.9688f, +-19.5313f,57.353f,-42.9688f, +-15.625f,58.289f,-42.9688f, +-11.7188f,58.4633f,-42.9688f, +-7.8125f,59.0033f,-42.9688f, +-3.90625f,59.61f,-42.9688f, +0.0f,59.6115f,-42.9688f, +3.90625f,59.5207f,-42.9688f, +-250.0f,2.05499f,-46.875f, +-246.094f,1.44228f,-46.875f, +-242.188f,1.95946f,-46.875f, +-238.281f,2.50642f,-46.875f, +-234.375f,3.23732f,-46.875f, +-230.469f,4.46051f,-46.875f, +-226.563f,6.17815f,-46.875f, +-222.656f,7.58101f,-46.875f, +-218.75f,9.4063f,-46.875f, +-214.844f,11.394f,-46.875f, +-210.938f,12.4493f,-46.875f, +-207.031f,13.1281f,-46.875f, +-203.125f,13.8316f,-46.875f, +-199.219f,14.1574f,-46.875f, +-195.313f,15.0289f,-46.875f, +-191.406f,17.2095f,-46.875f, +-187.5f,20.3326f,-46.875f, +-183.594f,22.5046f,-46.875f, +-179.688f,24.7998f,-46.875f, +-175.781f,26.3728f,-46.875f, +-171.875f,27.3394f,-46.875f, +-167.969f,27.2989f,-46.875f, +-164.063f,27.5191f,-46.875f, +-160.156f,28.1581f,-46.875f, +-156.25f,28.357f,-46.875f, +-152.344f,27.2465f,-46.875f, +-148.438f,27.6591f,-46.875f, +-144.531f,26.7196f,-46.875f, +-140.625f,25.3776f,-46.875f, +-136.719f,25.1174f,-46.875f, +-132.813f,24.6913f,-46.875f, +-128.906f,23.828f,-46.875f, +-125.0f,22.7885f,-46.875f, +-121.094f,23.6316f,-46.875f, +-117.188f,23.288f,-46.875f, +-113.281f,22.8849f,-46.875f, +-109.375f,22.6367f,-46.875f, +-105.469f,22.2282f,-46.875f, +-101.563f,22.7539f,-46.875f, +-97.6563f,23.4319f,-46.875f, +-93.75f,25.0494f,-46.875f, +-89.8438f,25.7759f,-46.875f, +-85.9375f,27.2287f,-46.875f, +-82.0313f,28.1554f,-46.875f, +-78.125f,28.6794f,-46.875f, +-74.2188f,30.4763f,-46.875f, +-70.3125f,32.23f,-46.875f, +-66.4063f,33.6868f,-46.875f, +-62.5f,34.7841f,-46.875f, +-58.5938f,36.2585f,-46.875f, +-54.6875f,38.2534f,-46.875f, +-50.7813f,39.5261f,-46.875f, +-46.875f,41.7676f,-46.875f, +-42.9688f,44.8849f,-46.875f, +-39.0625f,47.6394f,-46.875f, +-35.1563f,49.5783f,-46.875f, +-31.25f,52.3871f,-46.875f, +-27.3438f,54.9333f,-46.875f, +-23.4375f,56.6705f,-46.875f, +-19.5313f,56.898f,-46.875f, +-15.625f,58.678f,-46.875f, +-11.7188f,59.6595f,-46.875f, +-7.8125f,59.0163f,-46.875f, +-3.90625f,59.3587f,-46.875f, +0.0f,58.5405f,-46.875f, +3.90625f,58.9086f,-46.875f, +-250.0f,2.57742f,-50.7813f, +-246.094f,2.06275f,-50.7813f, +-242.188f,2.26453f,-50.7813f, +-238.281f,2.43527f,-50.7813f, +-234.375f,2.63858f,-50.7813f, +-230.469f,4.44964f,-50.7813f, +-226.563f,6.50192f,-50.7813f, +-222.656f,8.11006f,-50.7813f, +-218.75f,10.1023f,-50.7813f, +-214.844f,11.3708f,-50.7813f, +-210.938f,12.7395f,-50.7813f, +-207.031f,13.6541f,-50.7813f, +-203.125f,13.6317f,-50.7813f, +-199.219f,13.4823f,-50.7813f, +-195.313f,15.3032f,-50.7813f, +-191.406f,17.5085f,-50.7813f, +-187.5f,19.5731f,-50.7813f, +-183.594f,22.0894f,-50.7813f, +-179.688f,23.8927f,-50.7813f, +-175.781f,24.9335f,-50.7813f, +-171.875f,26.1125f,-50.7813f, +-167.969f,25.9034f,-50.7813f, +-164.063f,26.9549f,-50.7813f, +-160.156f,26.7939f,-50.7813f, +-156.25f,26.3447f,-50.7813f, +-152.344f,25.6085f,-50.7813f, +-148.438f,25.2823f,-50.7813f, +-144.531f,25.4854f,-50.7813f, +-140.625f,23.906f,-50.7813f, +-136.719f,23.7094f,-50.7813f, +-132.813f,22.9599f,-50.7813f, +-128.906f,22.3089f,-50.7813f, +-125.0f,22.302f,-50.7813f, +-121.094f,23.3289f,-50.7813f, +-117.188f,23.1804f,-50.7813f, +-113.281f,22.6693f,-50.7813f, +-109.375f,21.2587f,-50.7813f, +-105.469f,20.4638f,-50.7813f, +-101.563f,21.4819f,-50.7813f, +-97.6563f,22.0137f,-50.7813f, +-93.75f,23.4763f,-50.7813f, +-89.8438f,25.2125f,-50.7813f, +-85.9375f,26.446f,-50.7813f, +-82.0313f,27.5614f,-50.7813f, +-78.125f,29.5641f,-50.7813f, +-74.2188f,31.1552f,-50.7813f, +-70.3125f,33.5337f,-50.7813f, +-66.4063f,35.653f,-50.7813f, +-62.5f,36.2419f,-50.7813f, +-58.5938f,37.4297f,-50.7813f, +-54.6875f,39.7492f,-50.7813f, +-50.7813f,41.494f,-50.7813f, +-46.875f,44.5449f,-50.7813f, +-42.9688f,47.2689f,-50.7813f, +-39.0625f,49.6705f,-50.7813f, +-35.1563f,51.8942f,-50.7813f, +-31.25f,53.9483f,-50.7813f, +-27.3438f,55.2444f,-50.7813f, +-23.4375f,56.5482f,-50.7813f, +-19.5313f,58.5545f,-50.7813f, +-15.625f,59.5559f,-50.7813f, +-11.7188f,58.8699f,-50.7813f, +-7.8125f,59.0373f,-50.7813f, +-3.90625f,59.5884f,-50.7813f, +0.0f,59.6491f,-50.7813f, +3.90625f,59.8509f,-50.7813f, +-250.0f,2.04136f,-54.6875f, +-246.094f,2.5492f,-54.6875f, +-242.188f,2.70952f,-54.6875f, +-238.281f,3.00758f,-54.6875f, +-234.375f,3.54707f,-54.6875f, +-230.469f,5.09851f,-54.6875f, +-226.563f,7.09409f,-54.6875f, +-222.656f,8.40975f,-54.6875f, +-218.75f,10.0555f,-54.6875f, +-214.844f,11.4962f,-54.6875f, +-210.938f,12.1806f,-54.6875f, +-207.031f,12.7217f,-54.6875f, +-203.125f,12.6935f,-54.6875f, +-199.219f,14.0259f,-54.6875f, +-195.313f,16.1147f,-54.6875f, +-191.406f,18.3888f,-54.6875f, +-187.5f,19.3549f,-54.6875f, +-183.594f,21.6563f,-54.6875f, +-179.688f,22.9906f,-54.6875f, +-175.781f,23.7728f,-54.6875f, +-171.875f,25.2286f,-54.6875f, +-167.969f,26.0764f,-54.6875f, +-164.063f,26.746f,-54.6875f, +-160.156f,26.3029f,-54.6875f, +-156.25f,25.6172f,-54.6875f, +-152.344f,24.537f,-54.6875f, +-148.438f,23.8458f,-54.6875f, +-144.531f,23.3726f,-54.6875f, +-140.625f,22.8694f,-54.6875f, +-136.719f,22.5247f,-54.6875f, +-132.813f,21.436f,-54.6875f, +-128.906f,21.4712f,-54.6875f, +-125.0f,22.1621f,-54.6875f, +-121.094f,22.4599f,-54.6875f, +-117.188f,21.4148f,-54.6875f, +-113.281f,20.8237f,-54.6875f, +-109.375f,19.6257f,-54.6875f, +-105.469f,20.1462f,-54.6875f, +-101.563f,21.5895f,-54.6875f, +-97.6563f,22.2376f,-54.6875f, +-93.75f,23.679f,-54.6875f, +-89.8438f,24.9403f,-54.6875f, +-85.9375f,26.4205f,-54.6875f, +-82.0313f,27.9125f,-54.6875f, +-78.125f,30.0689f,-54.6875f, +-74.2188f,32.7388f,-54.6875f, +-70.3125f,34.3502f,-54.6875f, +-66.4063f,35.6763f,-54.6875f, +-62.5f,37.4625f,-54.6875f, +-58.5938f,38.3448f,-54.6875f, +-54.6875f,40.6027f,-54.6875f, +-50.7813f,44.4532f,-54.6875f, +-46.875f,47.6182f,-54.6875f, +-42.9688f,49.7683f,-54.6875f, +-39.0625f,52.1875f,-54.6875f, +-35.1563f,54.4951f,-54.6875f, +-31.25f,55.9437f,-54.6875f, +-27.3438f,57.1353f,-54.6875f, +-23.4375f,58.016f,-54.6875f, +-19.5313f,59.6013f,-54.6875f, +-15.625f,59.9872f,-54.6875f, +-11.7188f,59.8299f,-54.6875f, +-7.8125f,60.1035f,-54.6875f, +-3.90625f,60.8558f,-54.6875f, +0.0f,60.5619f,-54.6875f, +3.90625f,60.3928f,-54.6875f, +-250.0f,4.01167f,-58.5938f, +-246.094f,3.0694f,-58.5938f, +-242.188f,3.37661f,-58.5938f, +-238.281f,3.71931f,-58.5938f, +-234.375f,4.08816f,-58.5938f, +-230.469f,5.56386f,-58.5938f, +-226.563f,7.3314f,-58.5938f, +-222.656f,8.61323f,-58.5938f, +-218.75f,9.77849f,-58.5938f, +-214.844f,11.9744f,-58.5938f, +-210.938f,12.9366f,-58.5938f, +-207.031f,13.5175f,-58.5938f, +-203.125f,13.948f,-58.5938f, +-199.219f,14.4053f,-58.5938f, +-195.313f,16.1496f,-58.5938f, +-191.406f,17.8653f,-58.5938f, +-187.5f,18.9853f,-58.5938f, +-183.594f,21.2985f,-58.5938f, +-179.688f,23.4932f,-58.5938f, +-175.781f,25.3544f,-58.5938f, +-171.875f,26.1087f,-58.5938f, +-167.969f,26.5864f,-58.5938f, +-164.063f,25.8729f,-58.5938f, +-160.156f,25.0068f,-58.5938f, +-156.25f,25.2867f,-58.5938f, +-152.344f,23.9482f,-58.5938f, +-148.438f,23.23f,-58.5938f, +-144.531f,22.6171f,-58.5938f, +-140.625f,21.4991f,-58.5938f, +-136.719f,21.0822f,-58.5938f, +-132.813f,21.0037f,-58.5938f, +-128.906f,21.8362f,-58.5938f, +-125.0f,21.5985f,-58.5938f, +-121.094f,20.951f,-58.5938f, +-117.188f,21.2066f,-58.5938f, +-113.281f,19.7479f,-58.5938f, +-109.375f,18.5787f,-58.5938f, +-105.469f,20.3984f,-58.5938f, +-101.563f,22.257f,-58.5938f, +-97.6563f,23.3411f,-58.5938f, +-93.75f,24.362f,-58.5938f, +-89.8438f,25.7544f,-58.5938f, +-85.9375f,27.7522f,-58.5938f, +-82.0313f,28.9204f,-58.5938f, +-78.125f,30.8124f,-58.5938f, +-74.2188f,32.9097f,-58.5938f, +-70.3125f,34.8737f,-58.5938f, +-66.4063f,36.0518f,-58.5938f, +-62.5f,38.506f,-58.5938f, +-58.5938f,41.2951f,-58.5938f, +-54.6875f,43.3387f,-58.5938f, +-50.7813f,46.5457f,-58.5938f, +-46.875f,49.2409f,-58.5938f, +-42.9688f,51.3946f,-58.5938f, +-39.0625f,54.0957f,-58.5938f, +-35.1563f,55.8205f,-58.5938f, +-31.25f,57.094f,-58.5938f, +-27.3438f,58.0636f,-58.5938f, +-23.4375f,58.8159f,-58.5938f, +-19.5313f,59.9761f,-58.5938f, +-15.625f,60.2094f,-58.5938f, +-11.7188f,60.0275f,-58.5938f, +-7.8125f,61.0991f,-58.5938f, +-3.90625f,61.4786f,-58.5938f, +0.0f,61.4895f,-58.5938f, +3.90625f,61.5747f,-58.5938f, +-250.0f,5.54938f,-62.5f, +-246.094f,4.18374f,-62.5f, +-242.188f,3.90057f,-62.5f, +-238.281f,4.25951f,-62.5f, +-234.375f,4.82365f,-62.5f, +-230.469f,6.03197f,-62.5f, +-226.563f,7.69909f,-62.5f, +-222.656f,8.80826f,-62.5f, +-218.75f,10.8241f,-62.5f, +-214.844f,13.5771f,-62.5f, +-210.938f,14.456f,-62.5f, +-207.031f,15.0395f,-62.5f, +-203.125f,14.5505f,-62.5f, +-199.219f,16.1706f,-62.5f, +-195.313f,16.9508f,-62.5f, +-191.406f,18.2016f,-62.5f, +-187.5f,19.8694f,-62.5f, +-183.594f,22.6167f,-62.5f, +-179.688f,24.5727f,-62.5f, +-175.781f,26.0063f,-62.5f, +-171.875f,26.0399f,-62.5f, +-167.969f,26.6416f,-62.5f, +-164.063f,25.6476f,-62.5f, +-160.156f,24.4615f,-62.5f, +-156.25f,23.5295f,-62.5f, +-152.344f,23.7879f,-62.5f, +-148.438f,22.8826f,-62.5f, +-144.531f,21.6558f,-62.5f, +-140.625f,20.6405f,-62.5f, +-136.719f,20.1695f,-62.5f, +-132.813f,20.7715f,-62.5f, +-128.906f,20.5918f,-62.5f, +-125.0f,20.4476f,-62.5f, +-121.094f,19.9068f,-62.5f, +-117.188f,19.4838f,-62.5f, +-113.281f,17.843f,-62.5f, +-109.375f,18.5661f,-62.5f, +-105.469f,20.1106f,-62.5f, +-101.563f,21.3182f,-62.5f, +-97.6563f,23.2851f,-62.5f, +-93.75f,24.3601f,-62.5f, +-89.8438f,26.3742f,-62.5f, +-85.9375f,27.7409f,-62.5f, +-82.0313f,29.533f,-62.5f, +-78.125f,31.5622f,-62.5f, +-74.2188f,33.2773f,-62.5f, +-70.3125f,35.6025f,-62.5f, +-66.4063f,38.4255f,-62.5f, +-62.5f,40.916f,-62.5f, +-58.5938f,43.9378f,-62.5f, +-54.6875f,45.9116f,-62.5f, +-50.7813f,48.3177f,-62.5f, +-46.875f,50.1977f,-62.5f, +-42.9688f,52.4552f,-62.5f, +-39.0625f,54.6779f,-62.5f, +-35.1563f,56.1564f,-62.5f, +-31.25f,57.5665f,-62.5f, +-27.3438f,58.7762f,-62.5f, +-23.4375f,59.115f,-62.5f, +-19.5313f,58.5535f,-62.5f, +-15.625f,58.2117f,-62.5f, +-11.7188f,59.0863f,-62.5f, +-7.8125f,60.3775f,-62.5f, +-3.90625f,61.0192f,-62.5f, +0.0f,61.864f,-62.5f, +3.90625f,62.1111f,-62.5f, +-250.0f,6.08003f,-66.4063f, +-246.094f,5.13458f,-66.4063f, +-242.188f,5.0967f,-66.4063f, +-238.281f,5.36926f,-66.4063f, +-234.375f,5.21926f,-66.4063f, +-230.469f,6.37997f,-66.4063f, +-226.563f,7.85032f,-66.4063f, +-222.656f,9.36117f,-66.4063f, +-218.75f,11.896f,-66.4063f, +-214.844f,13.9549f,-66.4063f, +-210.938f,15.4673f,-66.4063f, +-207.031f,15.9885f,-66.4063f, +-203.125f,16.4425f,-66.4063f, +-199.219f,17.4253f,-66.4063f, +-195.313f,18.1385f,-66.4063f, +-191.406f,18.8676f,-66.4063f, +-187.5f,20.1316f,-66.4063f, +-183.594f,22.8534f,-66.4063f, +-179.688f,24.5364f,-66.4063f, +-175.781f,25.6234f,-66.4063f, +-171.875f,25.9362f,-66.4063f, +-167.969f,25.7735f,-66.4063f, +-164.063f,25.1524f,-66.4063f, +-160.156f,24.4245f,-66.4063f, +-156.25f,22.8769f,-66.4063f, +-152.344f,22.8762f,-66.4063f, +-148.438f,21.9008f,-66.4063f, +-144.531f,20.9242f,-66.4063f, +-140.625f,20.1022f,-66.4063f, +-136.719f,19.5823f,-66.4063f, +-132.813f,19.4415f,-66.4063f, +-128.906f,18.9513f,-66.4063f, +-125.0f,18.9264f,-66.4063f, +-121.094f,18.6878f,-66.4063f, +-117.188f,17.8998f,-66.4063f, +-113.281f,17.9815f,-66.4063f, +-109.375f,18.2652f,-66.4063f, +-105.469f,19.533f,-66.4063f, +-101.563f,21.0045f,-66.4063f, +-97.6563f,22.2461f,-66.4063f, +-93.75f,23.7189f,-66.4063f, +-89.8438f,25.574f,-66.4063f, +-85.9375f,27.55f,-66.4063f, +-82.0313f,29.733f,-66.4063f, +-78.125f,31.0763f,-66.4063f, +-74.2188f,33.9607f,-66.4063f, +-70.3125f,37.3595f,-66.4063f, +-66.4063f,41.019f,-66.4063f, +-62.5f,43.7286f,-66.4063f, +-58.5938f,46.5077f,-66.4063f, +-54.6875f,47.985f,-66.4063f, +-50.7813f,49.2623f,-66.4063f, +-46.875f,50.9465f,-66.4063f, +-42.9688f,52.912f,-66.4063f, +-39.0625f,55.0349f,-66.4063f, +-35.1563f,56.428f,-66.4063f, +-31.25f,57.3951f,-66.4063f, +-27.3438f,58.5332f,-66.4063f, +-23.4375f,58.3328f,-66.4063f, +-19.5313f,56.9549f,-66.4063f, +-15.625f,56.9387f,-66.4063f, +-11.7188f,58.3656f,-66.4063f, +-7.8125f,59.6577f,-66.4063f, +-3.90625f,59.8566f,-66.4063f, +0.0f,60.693f,-66.4063f, +3.90625f,60.8569f,-66.4063f, +-250.0f,6.38861f,-70.3125f, +-246.094f,6.37976f,-70.3125f, +-242.188f,6.52455f,-70.3125f, +-238.281f,6.93657f,-70.3125f, +-234.375f,6.77321f,-70.3125f, +-230.469f,7.26034f,-70.3125f, +-226.563f,8.99316f,-70.3125f, +-222.656f,10.5015f,-70.3125f, +-218.75f,11.631f,-70.3125f, +-214.844f,14.0548f,-70.3125f, +-210.938f,15.9163f,-70.3125f, +-207.031f,16.6824f,-70.3125f, +-203.125f,17.1063f,-70.3125f, +-199.219f,18.066f,-70.3125f, +-195.313f,18.5539f,-70.3125f, +-191.406f,18.8425f,-70.3125f, +-187.5f,20.7731f,-70.3125f, +-183.594f,22.8929f,-70.3125f, +-179.688f,24.2011f,-70.3125f, +-175.781f,24.5512f,-70.3125f, +-171.875f,24.651f,-70.3125f, +-167.969f,23.9906f,-70.3125f, +-164.063f,23.6279f,-70.3125f, +-160.156f,23.6162f,-70.3125f, +-156.25f,22.3196f,-70.3125f, +-152.344f,22.173f,-70.3125f, +-148.438f,20.6833f,-70.3125f, +-144.531f,19.6848f,-70.3125f, +-140.625f,18.4633f,-70.3125f, +-136.719f,18.2692f,-70.3125f, +-132.813f,18.0595f,-70.3125f, +-128.906f,17.2062f,-70.3125f, +-125.0f,17.0103f,-70.3125f, +-121.094f,17.1584f,-70.3125f, +-117.188f,17.5441f,-70.3125f, +-113.281f,17.5669f,-70.3125f, +-109.375f,17.7536f,-70.3125f, +-105.469f,18.3913f,-70.3125f, +-101.563f,19.7264f,-70.3125f, +-97.6563f,20.8943f,-70.3125f, +-93.75f,22.7517f,-70.3125f, +-89.8438f,25.1479f,-70.3125f, +-85.9375f,27.3953f,-70.3125f, +-82.0313f,29.5127f,-70.3125f, +-78.125f,31.2816f,-70.3125f, +-74.2188f,34.6589f,-70.3125f, +-70.3125f,38.2161f,-70.3125f, +-66.4063f,42.3872f,-70.3125f, +-62.5f,45.4363f,-70.3125f, +-58.5938f,47.0181f,-70.3125f, +-54.6875f,48.7348f,-70.3125f, +-50.7813f,49.8739f,-70.3125f, +-46.875f,51.2434f,-70.3125f, +-42.9688f,52.9444f,-70.3125f, +-39.0625f,54.8413f,-70.3125f, +-35.1563f,55.8776f,-70.3125f, +-31.25f,56.9088f,-70.3125f, +-27.3438f,56.8827f,-70.3125f, +-23.4375f,56.1649f,-70.3125f, +-19.5313f,54.9828f,-70.3125f, +-15.625f,56.5543f,-70.3125f, +-11.7188f,58.0071f,-70.3125f, +-7.8125f,58.1204f,-70.3125f, +-3.90625f,58.8019f,-70.3125f, +0.0f,59.3765f,-70.3125f, +3.90625f,59.1482f,-70.3125f, +-250.0f,7.29753f,-74.2188f, +-246.094f,6.9318f,-74.2188f, +-242.188f,7.9493f,-74.2188f, +-238.281f,7.61482f,-74.2188f, +-234.375f,8.38948f,-74.2188f, +-230.469f,8.85034f,-74.2188f, +-226.563f,10.783f,-74.2188f, +-222.656f,12.203f,-74.2188f, +-218.75f,12.7122f,-74.2188f, +-214.844f,14.2813f,-74.2188f, +-210.938f,16.1159f,-74.2188f, +-207.031f,16.8501f,-74.2188f, +-203.125f,17.728f,-74.2188f, +-199.219f,18.6948f,-74.2188f, +-195.313f,19.0254f,-74.2188f, +-191.406f,18.9874f,-74.2188f, +-187.5f,20.7575f,-74.2188f, +-183.594f,22.4682f,-74.2188f, +-179.688f,23.785f,-74.2188f, +-175.781f,23.136f,-74.2188f, +-171.875f,22.2872f,-74.2188f, +-167.969f,21.9381f,-74.2188f, +-164.063f,22.818f,-74.2188f, +-160.156f,21.8019f,-74.2188f, +-156.25f,21.3496f,-74.2188f, +-152.344f,19.9092f,-74.2188f, +-148.438f,19.5338f,-74.2188f, +-144.531f,19.2227f,-74.2188f, +-140.625f,17.2583f,-74.2188f, +-136.719f,15.7727f,-74.2188f, +-132.813f,15.2069f,-74.2188f, +-128.906f,15.0929f,-74.2188f, +-125.0f,15.3066f,-74.2188f, +-121.094f,15.1161f,-74.2188f, +-117.188f,16.1171f,-74.2188f, +-113.281f,17.2851f,-74.2188f, +-109.375f,16.8359f,-74.2188f, +-105.469f,17.6612f,-74.2188f, +-101.563f,18.1651f,-74.2188f, +-97.6563f,18.9354f,-74.2188f, +-93.75f,21.1152f,-74.2188f, +-89.8438f,23.9267f,-74.2188f, +-85.9375f,26.5361f,-74.2188f, +-82.0313f,29.6007f,-74.2188f, +-78.125f,31.8355f,-74.2188f, +-74.2188f,34.5711f,-74.2188f, +-70.3125f,37.6211f,-74.2188f, +-66.4063f,41.978f,-74.2188f, +-62.5f,44.757f,-74.2188f, +-58.5938f,47.2561f,-74.2188f, +-54.6875f,48.796f,-74.2188f, +-50.7813f,50.085f,-74.2188f, +-46.875f,51.427f,-74.2188f, +-42.9688f,52.9103f,-74.2188f, +-39.0625f,53.6345f,-74.2188f, +-35.1563f,55.5589f,-74.2188f, +-31.25f,56.4557f,-74.2188f, +-27.3438f,55.8259f,-74.2188f, +-23.4375f,55.2472f,-74.2188f, +-19.5313f,54.9161f,-74.2188f, +-15.625f,56.2403f,-74.2188f, +-11.7188f,57.7266f,-74.2188f, +-7.8125f,57.6855f,-74.2188f, +-3.90625f,57.4796f,-74.2188f, +0.0f,56.3955f,-74.2188f, +3.90625f,56.5167f,-74.2188f, +-250.0f,8.88618f,-78.125f, +-246.094f,8.31776f,-78.125f, +-242.188f,8.67289f,-78.125f, +-238.281f,9.52219f,-78.125f, +-234.375f,9.78196f,-78.125f, +-230.469f,11.3032f,-78.125f, +-226.563f,13.1558f,-78.125f, +-222.656f,14.4361f,-78.125f, +-218.75f,15.5721f,-78.125f, +-214.844f,14.3491f,-78.125f, +-210.938f,15.6393f,-78.125f, +-207.031f,16.9133f,-78.125f, +-203.125f,18.1402f,-78.125f, +-199.219f,19.179f,-78.125f, +-195.313f,18.9448f,-78.125f, +-191.406f,19.5289f,-78.125f, +-187.5f,20.8547f,-78.125f, +-183.594f,22.7611f,-78.125f, +-179.688f,22.8314f,-78.125f, +-175.781f,21.815f,-78.125f, +-171.875f,22.2112f,-78.125f, +-167.969f,21.9322f,-78.125f, +-164.063f,21.3024f,-78.125f, +-160.156f,20.354f,-78.125f, +-156.25f,19.8588f,-78.125f, +-152.344f,17.8458f,-78.125f, +-148.438f,18.0613f,-78.125f, +-144.531f,17.0664f,-78.125f, +-140.625f,16.2256f,-78.125f, +-136.719f,14.3082f,-78.125f, +-132.813f,13.3463f,-78.125f, +-128.906f,14.3881f,-78.125f, +-125.0f,14.6865f,-78.125f, +-121.094f,14.2011f,-78.125f, +-117.188f,15.4562f,-78.125f, +-113.281f,16.6171f,-78.125f, +-109.375f,16.2869f,-78.125f, +-105.469f,15.9406f,-78.125f, +-101.563f,17.5579f,-78.125f, +-97.6563f,19.157f,-78.125f, +-93.75f,21.0678f,-78.125f, +-89.8438f,23.1633f,-78.125f, +-85.9375f,25.2991f,-78.125f, +-82.0313f,28.9462f,-78.125f, +-78.125f,31.8594f,-78.125f, +-74.2188f,35.2294f,-78.125f, +-70.3125f,36.9557f,-78.125f, +-66.4063f,40.692f,-78.125f, +-62.5f,44.5904f,-78.125f, +-58.5938f,46.9805f,-78.125f, +-54.6875f,48.3073f,-78.125f, +-50.7813f,49.8001f,-78.125f, +-46.875f,51.4881f,-78.125f, +-42.9688f,52.7488f,-78.125f, +-39.0625f,53.0994f,-78.125f, +-35.1563f,54.6505f,-78.125f, +-31.25f,55.3393f,-78.125f, +-27.3438f,55.3608f,-78.125f, +-23.4375f,54.3833f,-78.125f, +-19.5313f,53.9595f,-78.125f, +-15.625f,55.0695f,-78.125f, +-11.7188f,56.423f,-78.125f, +-7.8125f,56.1568f,-78.125f, +-3.90625f,56.2841f,-78.125f, +0.0f,54.7508f,-78.125f, +3.90625f,54.4402f,-78.125f, +-250.0f,10.7839f,-82.0313f, +-246.094f,10.1255f,-82.0313f, +-242.188f,10.6621f,-82.0313f, +-238.281f,11.4172f,-82.0313f, +-234.375f,12.3063f,-82.0313f, +-230.469f,13.4915f,-82.0313f, +-226.563f,14.9113f,-82.0313f, +-222.656f,16.5463f,-82.0313f, +-218.75f,17.3752f,-82.0313f, +-214.844f,16.6701f,-82.0313f, +-210.938f,15.5847f,-82.0313f, +-207.031f,16.6988f,-82.0313f, +-203.125f,17.6449f,-82.0313f, +-199.219f,18.4976f,-82.0313f, +-195.313f,18.033f,-82.0313f, +-191.406f,19.1758f,-82.0313f, +-187.5f,20.7116f,-82.0313f, +-183.594f,21.5492f,-82.0313f, +-179.688f,20.7908f,-82.0313f, +-175.781f,20.6891f,-82.0313f, +-171.875f,21.6368f,-82.0313f, +-167.969f,21.6862f,-82.0313f, +-164.063f,20.4236f,-82.0313f, +-160.156f,19.4449f,-82.0313f, +-156.25f,17.8718f,-82.0313f, +-152.344f,16.0984f,-82.0313f, +-148.438f,16.1225f,-82.0313f, +-144.531f,15.3001f,-82.0313f, +-140.625f,14.0113f,-82.0313f, +-136.719f,12.7128f,-82.0313f, +-132.813f,13.1695f,-82.0313f, +-128.906f,14.1608f,-82.0313f, +-125.0f,14.006f,-82.0313f, +-121.094f,13.5671f,-82.0313f, +-117.188f,14.799f,-82.0313f, +-113.281f,15.6819f,-82.0313f, +-109.375f,15.1047f,-82.0313f, +-105.469f,15.4826f,-82.0313f, +-101.563f,17.2178f,-82.0313f, +-97.6563f,19.1794f,-82.0313f, +-93.75f,21.3021f,-82.0313f, +-89.8438f,21.9981f,-82.0313f, +-85.9375f,24.4031f,-82.0313f, +-82.0313f,28.8062f,-82.0313f, +-78.125f,31.7576f,-82.0313f, +-74.2188f,34.6198f,-82.0313f, +-70.3125f,37.0145f,-82.0313f, +-66.4063f,39.5952f,-82.0313f, +-62.5f,43.4294f,-82.0313f, +-58.5938f,45.9611f,-82.0313f, +-54.6875f,47.398f,-82.0313f, +-50.7813f,49.5672f,-82.0313f, +-46.875f,51.4863f,-82.0313f, +-42.9688f,52.3277f,-82.0313f, +-39.0625f,52.6736f,-82.0313f, +-35.1563f,53.5554f,-82.0313f, +-31.25f,54.4611f,-82.0313f, +-27.3438f,53.3151f,-82.0313f, +-23.4375f,52.9631f,-82.0313f, +-19.5313f,52.3147f,-82.0313f, +-15.625f,53.7891f,-82.0313f, +-11.7188f,54.3962f,-82.0313f, +-7.8125f,54.2326f,-82.0313f, +-3.90625f,53.6717f,-82.0313f, +0.0f,52.8681f,-82.0313f, +3.90625f,51.949f,-82.0313f, +-250.0f,12.2756f,-85.9375f, +-246.094f,11.9011f,-85.9375f, +-242.188f,13.4495f,-85.9375f, +-238.281f,14.3858f,-85.9375f, +-234.375f,14.855f,-85.9375f, +-230.469f,15.3384f,-85.9375f, +-226.563f,17.3357f,-85.9375f, +-222.656f,18.7108f,-85.9375f, +-218.75f,18.0095f,-85.9375f, +-214.844f,17.4308f,-85.9375f, +-210.938f,17.0565f,-85.9375f, +-207.031f,16.4039f,-85.9375f, +-203.125f,17.3449f,-85.9375f, +-199.219f,17.5816f,-85.9375f, +-195.313f,17.7511f,-85.9375f, +-191.406f,18.792f,-85.9375f, +-187.5f,19.7983f,-85.9375f, +-183.594f,19.6069f,-85.9375f, +-179.688f,19.1396f,-85.9375f, +-175.781f,19.0184f,-85.9375f, +-171.875f,19.7492f,-85.9375f, +-167.969f,19.6428f,-85.9375f, +-164.063f,18.6091f,-85.9375f, +-160.156f,18.1998f,-85.9375f, +-156.25f,16.6809f,-85.9375f, +-152.344f,15.0269f,-85.9375f, +-148.438f,13.3773f,-85.9375f, +-144.531f,12.7371f,-85.9375f, +-140.625f,12.2537f,-85.9375f, +-136.719f,12.6536f,-85.9375f, +-132.813f,12.7798f,-85.9375f, +-128.906f,13.2089f,-85.9375f, +-125.0f,12.8356f,-85.9375f, +-121.094f,12.5484f,-85.9375f, +-117.188f,13.5275f,-85.9375f, +-113.281f,13.5387f,-85.9375f, +-109.375f,13.6111f,-85.9375f, +-105.469f,14.7023f,-85.9375f, +-101.563f,16.6526f,-85.9375f, +-97.6563f,17.9729f,-85.9375f, +-93.75f,19.8258f,-85.9375f, +-89.8438f,21.7903f,-85.9375f, +-85.9375f,23.4003f,-85.9375f, +-82.0313f,27.4381f,-85.9375f, +-78.125f,30.1644f,-85.9375f, +-74.2188f,33.7682f,-85.9375f, +-70.3125f,36.1779f,-85.9375f, +-66.4063f,38.1368f,-85.9375f, +-62.5f,41.5768f,-85.9375f, +-58.5938f,43.7832f,-85.9375f, +-54.6875f,45.866f,-85.9375f, +-50.7813f,48.5751f,-85.9375f, +-46.875f,50.4188f,-85.9375f, +-42.9688f,51.0239f,-85.9375f, +-39.0625f,51.2389f,-85.9375f, +-35.1563f,51.8865f,-85.9375f, +-31.25f,52.9036f,-85.9375f, +-27.3438f,52.5405f,-85.9375f, +-23.4375f,52.3296f,-85.9375f, +-19.5313f,52.5889f,-85.9375f, +-15.625f,52.3033f,-85.9375f, +-11.7188f,52.1239f,-85.9375f, +-7.8125f,52.0608f,-85.9375f, +-3.90625f,51.0213f,-85.9375f, +0.0f,50.5601f,-85.9375f, +3.90625f,50.007f,-85.9375f, +-250.0f,13.6424f,-89.8438f, +-246.094f,14.2919f,-89.8438f, +-242.188f,15.9647f,-89.8438f, +-238.281f,17.1274f,-89.8438f, +-234.375f,17.9206f,-89.8438f, +-230.469f,17.9917f,-89.8438f, +-226.563f,19.3423f,-89.8438f, +-222.656f,20.1401f,-89.8438f, +-218.75f,19.295f,-89.8438f, +-214.844f,18.1101f,-89.8438f, +-210.938f,17.3485f,-89.8438f, +-207.031f,17.1077f,-89.8438f, +-203.125f,17.7413f,-89.8438f, +-199.219f,17.2325f,-89.8438f, +-195.313f,17.6696f,-89.8438f, +-191.406f,18.8437f,-89.8438f, +-187.5f,19.1808f,-89.8438f, +-183.594f,18.6366f,-89.8438f, +-179.688f,17.3251f,-89.8438f, +-175.781f,17.5752f,-89.8438f, +-171.875f,18.1005f,-89.8438f, +-167.969f,18.0907f,-89.8438f, +-164.063f,16.519f,-89.8438f, +-160.156f,15.5225f,-89.8438f, +-156.25f,14.3937f,-89.8438f, +-152.344f,13.4199f,-89.8438f, +-148.438f,12.8584f,-89.8438f, +-144.531f,12.8604f,-89.8438f, +-140.625f,12.2817f,-89.8438f, +-136.719f,12.4113f,-89.8438f, +-132.813f,12.9949f,-89.8438f, +-128.906f,11.9716f,-89.8438f, +-125.0f,11.8348f,-89.8438f, +-121.094f,12.2532f,-89.8438f, +-117.188f,12.5983f,-89.8438f, +-113.281f,13.2095f,-89.8438f, +-109.375f,13.7209f,-89.8438f, +-105.469f,13.8655f,-89.8438f, +-101.563f,14.8679f,-89.8438f, +-97.6563f,16.1039f,-89.8438f, +-93.75f,17.9997f,-89.8438f, +-89.8438f,20.0247f,-89.8438f, +-85.9375f,22.8012f,-89.8438f, +-82.0313f,25.8255f,-89.8438f, +-78.125f,29.0288f,-89.8438f, +-74.2188f,31.8325f,-89.8438f, +-70.3125f,34.2688f,-89.8438f, +-66.4063f,37.2576f,-89.8438f, +-62.5f,40.8036f,-89.8438f, +-58.5938f,43.0354f,-89.8438f, +-54.6875f,44.5176f,-89.8438f, +-50.7813f,47.4827f,-89.8438f, +-46.875f,48.9307f,-89.8438f, +-42.9688f,48.82f,-89.8438f, +-39.0625f,48.8887f,-89.8438f, +-35.1563f,50.05f,-89.8438f, +-31.25f,50.9253f,-89.8438f, +-27.3438f,52.3859f,-89.8438f, +-23.4375f,52.2702f,-89.8438f, +-19.5313f,52.0708f,-89.8438f, +-15.625f,51.2832f,-89.8438f, +-11.7188f,50.0989f,-89.8438f, +-7.8125f,49.6111f,-89.8438f, +-3.90625f,48.7785f,-89.8438f, +0.0f,48.7183f,-89.8438f, +3.90625f,47.6596f,-89.8438f, +-250.0f,15.247f,-93.75f, +-246.094f,17.6018f,-93.75f, +-242.188f,19.2494f,-93.75f, +-238.281f,20.8362f,-93.75f, +-234.375f,20.4345f,-93.75f, +-230.469f,21.1572f,-93.75f, +-226.563f,21.3131f,-93.75f, +-222.656f,20.8797f,-93.75f, +-218.75f,20.5347f,-93.75f, +-214.844f,19.3559f,-93.75f, +-210.938f,18.2443f,-93.75f, +-207.031f,17.5994f,-93.75f, +-203.125f,18.0336f,-93.75f, +-199.219f,18.0561f,-93.75f, +-195.313f,17.673f,-93.75f, +-191.406f,18.7132f,-93.75f, +-187.5f,18.4272f,-93.75f, +-183.594f,18.078f,-93.75f, +-179.688f,16.7984f,-93.75f, +-175.781f,16.1827f,-93.75f, +-171.875f,16.5937f,-93.75f, +-167.969f,16.0698f,-93.75f, +-164.063f,14.9813f,-93.75f, +-160.156f,13.1718f,-93.75f, +-156.25f,12.1738f,-93.75f, +-152.344f,12.229f,-93.75f, +-148.438f,12.2803f,-93.75f, +-144.531f,12.526f,-93.75f, +-140.625f,11.9028f,-93.75f, +-136.719f,12.3491f,-93.75f, +-132.813f,11.7412f,-93.75f, +-128.906f,11.5455f,-93.75f, +-125.0f,11.6285f,-93.75f, +-121.094f,11.478f,-93.75f, +-117.188f,11.536f,-93.75f, +-113.281f,11.8722f,-93.75f, +-109.375f,12.61f,-93.75f, +-105.469f,12.6899f,-93.75f, +-101.563f,13.1659f,-93.75f, +-97.6563f,14.5994f,-93.75f, +-93.75f,16.6015f,-93.75f, +-89.8438f,19.9429f,-93.75f, +-85.9375f,22.8876f,-93.75f, +-82.0313f,26.3209f,-93.75f, +-78.125f,28.8526f,-93.75f, +-74.2188f,30.2969f,-93.75f, +-70.3125f,33.1597f,-93.75f, +-66.4063f,36.2648f,-93.75f, +-62.5f,39.1918f,-93.75f, +-58.5938f,41.4171f,-93.75f, +-54.6875f,43.4299f,-93.75f, +-50.7813f,45.5438f,-93.75f, +-46.875f,46.6281f,-93.75f, +-42.9688f,46.784f,-93.75f, +-39.0625f,47.3415f,-93.75f, +-35.1563f,48.5539f,-93.75f, +-31.25f,50.5714f,-93.75f, +-27.3438f,51.0532f,-93.75f, +-23.4375f,51.7685f,-93.75f, +-19.5313f,51.3638f,-93.75f, +-15.625f,49.6289f,-93.75f, +-11.7188f,50.0322f,-93.75f, +-7.8125f,48.6289f,-93.75f, +-3.90625f,46.7733f,-93.75f, +0.0f,45.5993f,-93.75f, +3.90625f,45.4182f,-93.75f, +-250.0f,18.5038f,-97.6563f, +-246.094f,20.1199f,-97.6563f, +-242.188f,22.7365f,-97.6563f, +-238.281f,24.311f,-97.6563f, +-234.375f,24.2572f,-97.6563f, +-230.469f,24.3322f,-97.6563f, +-226.563f,24.3501f,-97.6563f, +-222.656f,23.3494f,-97.6563f, +-218.75f,21.7677f,-97.6563f, +-214.844f,20.6573f,-97.6563f, +-210.938f,18.8509f,-97.6563f, +-207.031f,18.1355f,-97.6563f, +-203.125f,18.5785f,-97.6563f, +-199.219f,18.2049f,-97.6563f, +-195.313f,17.4136f,-97.6563f, +-191.406f,18.6105f,-97.6563f, +-187.5f,18.0859f,-97.6563f, +-183.594f,17.3286f,-97.6563f, +-179.688f,16.66f,-97.6563f, +-175.781f,15.1619f,-97.6563f, +-171.875f,14.271f,-97.6563f, +-167.969f,13.4801f,-97.6563f, +-164.063f,12.6373f,-97.6563f, +-160.156f,11.4464f,-97.6563f, +-156.25f,11.5423f,-97.6563f, +-152.344f,11.795f,-97.6563f, +-148.438f,10.9108f,-97.6563f, +-144.531f,11.2217f,-97.6563f, +-140.625f,11.0533f,-97.6563f, +-136.719f,11.5512f,-97.6563f, +-132.813f,11.6628f,-97.6563f, +-128.906f,10.9589f,-97.6563f, +-125.0f,10.3779f,-97.6563f, +-121.094f,9.96294f,-97.6563f, +-117.188f,10.6728f,-97.6563f, +-113.281f,11.2587f,-97.6563f, +-109.375f,11.2512f,-97.6563f, +-105.469f,12.1215f,-97.6563f, +-101.563f,12.0908f,-97.6563f, +-97.6563f,13.5835f,-97.6563f, +-93.75f,16.6536f,-97.6563f, +-89.8438f,19.7104f,-97.6563f, +-85.9375f,22.8325f,-97.6563f, +-82.0313f,26.7422f,-97.6563f, +-78.125f,29.4762f,-97.6563f, +-74.2188f,30.148f,-97.6563f, +-70.3125f,33.5961f,-97.6563f, +-66.4063f,36.1685f,-97.6563f, +-62.5f,37.3648f,-97.6563f, +-58.5938f,39.4445f,-97.6563f, +-54.6875f,40.3698f,-97.6563f, +-50.7813f,43.2595f,-97.6563f, +-46.875f,43.8006f,-97.6563f, +-42.9688f,44.8371f,-97.6563f, +-39.0625f,46.8993f,-97.6563f, +-35.1563f,48.8152f,-97.6563f, +-31.25f,50.2801f,-97.6563f, +-27.3438f,49.7242f,-97.6563f, +-23.4375f,49.8502f,-97.6563f, +-19.5313f,49.8568f,-97.6563f, +-15.625f,48.3267f,-97.6563f, +-11.7188f,47.8521f,-97.6563f, +-7.8125f,47.3364f,-97.6563f, +-3.90625f,46.156f,-97.6563f, +0.0f,44.8966f,-97.6563f, +3.90625f,44.9637f,-97.6563f, +-250.0f,21.0334f,-101.563f, +-246.094f,23.093f,-101.563f, +-242.188f,25.4189f,-101.563f, +-238.281f,27.31f,-101.563f, +-234.375f,26.8223f,-101.563f, +-230.469f,26.375f,-101.563f, +-226.563f,26.7718f,-101.563f, +-222.656f,25.3642f,-101.563f, +-218.75f,23.7619f,-101.563f, +-214.844f,21.4458f,-101.563f, +-210.938f,19.7809f,-101.563f, +-207.031f,19.054f,-101.563f, +-203.125f,19.6087f,-101.563f, +-199.219f,19.2503f,-101.563f, +-195.313f,18.0809f,-101.563f, +-191.406f,17.75f,-101.563f, +-187.5f,17.1292f,-101.563f, +-183.594f,16.2151f,-101.563f, +-179.688f,15.8928f,-101.563f, +-175.781f,14.4866f,-101.563f, +-171.875f,13.9039f,-101.563f, +-167.969f,12.278f,-101.563f, +-164.063f,11.5804f,-101.563f, +-160.156f,12.0152f,-101.563f, +-156.25f,11.7113f,-101.563f, +-152.344f,10.7496f,-101.563f, +-148.438f,9.67121f,-101.563f, +-144.531f,9.72628f,-101.563f, +-140.625f,9.99849f,-101.563f, +-136.719f,10.504f,-101.563f, +-132.813f,11.0917f,-101.563f, +-128.906f,10.4997f,-101.563f, +-125.0f,9.12306f,-101.563f, +-121.094f,8.34841f,-101.563f, +-117.188f,8.92074f,-101.563f, +-113.281f,9.44857f,-101.563f, +-109.375f,10.5456f,-101.563f, +-105.469f,10.7435f,-101.563f, +-101.563f,11.6413f,-101.563f, +-97.6563f,14.2233f,-101.563f, +-93.75f,17.0641f,-101.563f, +-89.8438f,20.5963f,-101.563f, +-85.9375f,22.9601f,-101.563f, +-82.0313f,26.0881f,-101.563f, +-78.125f,28.3451f,-101.563f, +-74.2188f,30.4473f,-101.563f, +-70.3125f,33.7644f,-101.563f, +-66.4063f,36.3074f,-101.563f, +-62.5f,38.0683f,-101.563f, +-58.5938f,39.1597f,-101.563f, +-54.6875f,40.3396f,-101.563f, +-50.7813f,41.4946f,-101.563f, +-46.875f,43.0029f,-101.563f, +-42.9688f,44.8434f,-101.563f, +-39.0625f,47.2094f,-101.563f, +-35.1563f,47.3449f,-101.563f, +-31.25f,49.1989f,-101.563f, +-27.3438f,48.845f,-101.563f, +-23.4375f,47.635f,-101.563f, +-19.5313f,47.9355f,-101.563f, +-15.625f,47.1439f,-101.563f, +-11.7188f,45.929f,-101.563f, +-7.8125f,46.9058f,-101.563f, +-3.90625f,46.1235f,-101.563f, +0.0f,45.2655f,-101.563f, +3.90625f,44.5311f,-101.563f, +-250.0f,24.0006f,-105.469f, +-246.094f,26.733f,-105.469f, +-242.188f,28.4305f,-105.469f, +-238.281f,29.0431f,-105.469f, +-234.375f,28.1582f,-105.469f, +-230.469f,28.0178f,-105.469f, +-226.563f,27.4417f,-105.469f, +-222.656f,27.0081f,-105.469f, +-218.75f,24.9646f,-105.469f, +-214.844f,22.8713f,-105.469f, +-210.938f,21.4507f,-105.469f, +-207.031f,21.2058f,-105.469f, +-203.125f,20.8114f,-105.469f, +-199.219f,20.7281f,-105.469f, +-195.313f,19.7358f,-105.469f, +-191.406f,18.4733f,-105.469f, +-187.5f,17.1875f,-105.469f, +-183.594f,15.4383f,-105.469f, +-179.688f,14.151f,-105.469f, +-175.781f,13.882f,-105.469f, +-171.875f,12.9008f,-105.469f, +-167.969f,11.246f,-105.469f, +-164.063f,11.1287f,-105.469f, +-160.156f,10.748f,-105.469f, +-156.25f,11.5003f,-105.469f, +-152.344f,10.3683f,-105.469f, +-148.438f,9.87346f,-105.469f, +-144.531f,9.6524f,-105.469f, +-140.625f,8.36957f,-105.469f, +-136.719f,9.12242f,-105.469f, +-132.813f,9.41585f,-105.469f, +-128.906f,8.97735f,-105.469f, +-125.0f,7.89593f,-105.469f, +-121.094f,7.20155f,-105.469f, +-117.188f,6.63681f,-105.469f, +-113.281f,8.27572f,-105.469f, +-109.375f,8.39126f,-105.469f, +-105.469f,9.69363f,-105.469f, +-101.563f,12.2269f,-105.469f, +-97.6563f,15.3785f,-105.469f, +-93.75f,18.1643f,-105.469f, +-89.8438f,20.8715f,-105.469f, +-85.9375f,23.5096f,-105.469f, +-82.0313f,25.2072f,-105.469f, +-78.125f,27.8536f,-105.469f, +-74.2188f,30.8436f,-105.469f, +-70.3125f,33.8966f,-105.469f, +-66.4063f,36.3107f,-105.469f, +-62.5f,37.9291f,-105.469f, +-58.5938f,39.7963f,-105.469f, +-54.6875f,40.5554f,-105.469f, +-50.7813f,42.1374f,-105.469f, +-46.875f,42.7622f,-105.469f, +-42.9688f,44.5703f,-105.469f, +-39.0625f,46.4665f,-105.469f, +-35.1563f,46.6101f,-105.469f, +-31.25f,47.1188f,-105.469f, +-27.3438f,48.052f,-105.469f, +-23.4375f,47.7845f,-105.469f, +-19.5313f,47.8159f,-105.469f, +-15.625f,46.7772f,-105.469f, +-11.7188f,46.0033f,-105.469f, +-7.8125f,47.2861f,-105.469f, +-3.90625f,46.9832f,-105.469f, +0.0f,45.6472f,-105.469f, +3.90625f,44.8466f,-105.469f, +-250.0f,27.0053f,-109.375f, +-246.094f,28.4873f,-109.375f, +-242.188f,29.8219f,-109.375f, +-238.281f,30.0561f,-109.375f, +-234.375f,29.2892f,-109.375f, +-230.469f,29.5933f,-109.375f, +-226.563f,28.8697f,-109.375f, +-222.656f,27.4881f,-109.375f, +-218.75f,25.7165f,-109.375f, +-214.844f,23.9985f,-109.375f, +-210.938f,23.3958f,-109.375f, +-207.031f,23.3567f,-109.375f, +-203.125f,23.3311f,-109.375f, +-199.219f,22.2114f,-109.375f, +-195.313f,21.0452f,-109.375f, +-191.406f,20.2153f,-109.375f, +-187.5f,18.8202f,-109.375f, +-183.594f,16.7998f,-109.375f, +-179.688f,15.8942f,-109.375f, +-175.781f,14.8638f,-109.375f, +-171.875f,13.1475f,-109.375f, +-167.969f,12.7375f,-109.375f, +-164.063f,10.7456f,-109.375f, +-160.156f,10.2908f,-109.375f, +-156.25f,9.65347f,-109.375f, +-152.344f,10.1273f,-109.375f, +-148.438f,9.91826f,-109.375f, +-144.531f,8.92229f,-109.375f, +-140.625f,8.34112f,-109.375f, +-136.719f,7.82043f,-109.375f, +-132.813f,7.17703f,-109.375f, +-128.906f,7.28288f,-109.375f, +-125.0f,6.94364f,-109.375f, +-121.094f,6.57742f,-109.375f, +-117.188f,5.68794f,-109.375f, +-113.281f,5.66654f,-109.375f, +-109.375f,6.9457f,-109.375f, +-105.469f,9.81036f,-109.375f, +-101.563f,12.6651f,-109.375f, +-97.6563f,15.2246f,-109.375f, +-93.75f,18.3914f,-109.375f, +-89.8438f,21.0454f,-109.375f, +-85.9375f,23.3579f,-109.375f, +-82.0313f,25.0292f,-109.375f, +-78.125f,28.9637f,-109.375f, +-74.2188f,31.9858f,-109.375f, +-70.3125f,34.5815f,-109.375f, +-66.4063f,37.1495f,-109.375f, +-62.5f,38.5371f,-109.375f, +-58.5938f,39.6993f,-109.375f, +-54.6875f,41.3314f,-109.375f, +-50.7813f,42.3279f,-109.375f, +-46.875f,43.399f,-109.375f, +-42.9688f,44.8971f,-109.375f, +-39.0625f,46.4515f,-109.375f, +-35.1563f,46.6684f,-109.375f, +-31.25f,47.2696f,-109.375f, +-27.3438f,48.2082f,-109.375f, +-23.4375f,47.2707f,-109.375f, +-19.5313f,47.952f,-109.375f, +-15.625f,47.4088f,-109.375f, +-11.7188f,47.3981f,-109.375f, +-7.8125f,48.0766f,-109.375f, +-3.90625f,47.4974f,-109.375f, +0.0f,46.1817f,-109.375f, +3.90625f,45.3987f,-109.375f, +-250.0f,28.5243f,-113.281f, +-246.094f,30.3032f,-113.281f, +-242.188f,31.2443f,-113.281f, +-238.281f,30.733f,-113.281f, +-234.375f,31.2433f,-113.281f, +-230.469f,31.5829f,-113.281f, +-226.563f,30.3008f,-113.281f, +-222.656f,28.2348f,-113.281f, +-218.75f,25.8116f,-113.281f, +-214.844f,25.3702f,-113.281f, +-210.938f,24.8435f,-113.281f, +-207.031f,25.7524f,-113.281f, +-203.125f,26.0021f,-113.281f, +-199.219f,24.9024f,-113.281f, +-195.313f,23.7348f,-113.281f, +-191.406f,21.9608f,-113.281f, +-187.5f,20.2108f,-113.281f, +-183.594f,18.963f,-113.281f, +-179.688f,17.7929f,-113.281f, +-175.781f,16.3625f,-113.281f, +-171.875f,14.6525f,-113.281f, +-167.969f,13.4453f,-113.281f, +-164.063f,11.5352f,-113.281f, +-160.156f,10.457f,-113.281f, +-156.25f,9.86849f,-113.281f, +-152.344f,9.76379f,-113.281f, +-148.438f,9.40799f,-113.281f, +-144.531f,8.38098f,-113.281f, +-140.625f,8.03078f,-113.281f, +-136.719f,7.4536f,-113.281f, +-132.813f,6.32375f,-113.281f, +-128.906f,5.90846f,-113.281f, +-125.0f,5.44126f,-113.281f, +-121.094f,5.53385f,-113.281f, +-117.188f,5.35081f,-113.281f, +-113.281f,6.14244f,-113.281f, +-109.375f,7.72509f,-113.281f, +-105.469f,9.98969f,-113.281f, +-101.563f,12.8924f,-113.281f, +-97.6563f,15.6605f,-113.281f, +-93.75f,18.4427f,-113.281f, +-89.8438f,20.4633f,-113.281f, +-85.9375f,22.3484f,-113.281f, +-82.0313f,25.7434f,-113.281f, +-78.125f,29.5649f,-113.281f, +-74.2188f,32.7377f,-113.281f, +-70.3125f,34.4529f,-113.281f, +-66.4063f,37.0096f,-113.281f, +-62.5f,38.2565f,-113.281f, +-58.5938f,39.8951f,-113.281f, +-54.6875f,41.291f,-113.281f, +-50.7813f,42.6018f,-113.281f, +-46.875f,43.3624f,-113.281f, +-42.9688f,44.3449f,-113.281f, +-39.0625f,45.4446f,-113.281f, +-35.1563f,46.0157f,-113.281f, +-31.25f,47.6632f,-113.281f, +-27.3438f,47.6934f,-113.281f, +-23.4375f,46.4824f,-113.281f, +-19.5313f,48.2708f,-113.281f, +-15.625f,48.5036f,-113.281f, +-11.7188f,47.6795f,-113.281f, +-7.8125f,48.4742f,-113.281f, +-3.90625f,48.509f,-113.281f, +0.0f,47.4037f,-113.281f, +3.90625f,47.4869f,-113.281f, +-250.0f,30.7007f,-117.188f, +-246.094f,31.6625f,-117.188f, +-242.188f,31.8246f,-117.188f, +-238.281f,32.4951f,-117.188f, +-234.375f,33.3552f,-117.188f, +-230.469f,32.7471f,-117.188f, +-226.563f,30.8092f,-117.188f, +-222.656f,28.3135f,-117.188f, +-218.75f,27.0912f,-117.188f, +-214.844f,27.0184f,-117.188f, +-210.938f,27.5702f,-117.188f, +-207.031f,27.9311f,-117.188f, +-203.125f,28.0909f,-117.188f, +-199.219f,26.6916f,-117.188f, +-195.313f,25.6983f,-117.188f, +-191.406f,24.0617f,-117.188f, +-187.5f,22.1476f,-117.188f, +-183.594f,20.964f,-117.188f, +-179.688f,19.1417f,-117.188f, +-175.781f,18.0941f,-117.188f, +-171.875f,16.3483f,-117.188f, +-167.969f,13.8969f,-117.188f, +-164.063f,12.2065f,-117.188f, +-160.156f,10.4346f,-117.188f, +-156.25f,9.28283f,-117.188f, +-152.344f,8.20933f,-117.188f, +-148.438f,7.69157f,-117.188f, +-144.531f,7.05251f,-117.188f, +-140.625f,6.38685f,-117.188f, +-136.719f,5.88862f,-117.188f, +-132.813f,4.48007f,-117.188f, +-128.906f,4.03049f,-117.188f, +-125.0f,4.96603f,-117.188f, +-121.094f,6.08105f,-117.188f, +-117.188f,6.76315f,-117.188f, +-113.281f,7.41087f,-117.188f, +-109.375f,7.5353f,-117.188f, +-105.469f,9.88018f,-117.188f, +-101.563f,11.8887f,-117.188f, +-97.6563f,14.4702f,-117.188f, +-93.75f,17.2187f,-117.188f, +-89.8438f,20.2241f,-117.188f, +-85.9375f,22.2766f,-117.188f, +-82.0313f,25.968f,-117.188f, +-78.125f,29.2923f,-117.188f, +-74.2188f,31.9825f,-117.188f, +-70.3125f,34.0756f,-117.188f, +-66.4063f,35.9202f,-117.188f, +-62.5f,37.9131f,-117.188f, +-58.5938f,39.2288f,-117.188f, +-54.6875f,40.591f,-117.188f, +-50.7813f,42.5191f,-117.188f, +-46.875f,42.7237f,-117.188f, +-42.9688f,43.8388f,-117.188f, +-39.0625f,45.2151f,-117.188f, +-35.1563f,45.096f,-117.188f, +-31.25f,45.9904f,-117.188f, +-27.3438f,45.2594f,-117.188f, +-23.4375f,45.7333f,-117.188f, +-19.5313f,47.4248f,-117.188f, +-15.625f,48.122f,-117.188f, +-11.7188f,48.0312f,-117.188f, +-7.8125f,49.0431f,-117.188f, +-3.90625f,49.2804f,-117.188f, +0.0f,48.803f,-117.188f, +3.90625f,48.3887f,-117.188f, +-250.0f,31.7497f,-121.094f, +-246.094f,31.3973f,-121.094f, +-242.188f,32.0742f,-121.094f, +-238.281f,33.1521f,-121.094f, +-234.375f,33.6068f,-121.094f, +-230.469f,31.9815f,-121.094f, +-226.563f,30.2957f,-121.094f, +-222.656f,28.5699f,-121.094f, +-218.75f,28.3353f,-121.094f, +-214.844f,28.8422f,-121.094f, +-210.938f,29.4292f,-121.094f, +-207.031f,29.2833f,-121.094f, +-203.125f,28.4123f,-121.094f, +-199.219f,27.4455f,-121.094f, +-195.313f,26.9053f,-121.094f, +-191.406f,24.8164f,-121.094f, +-187.5f,22.4409f,-121.094f, +-183.594f,21.5447f,-121.094f, +-179.688f,20.6668f,-121.094f, +-175.781f,18.9757f,-121.094f, +-171.875f,16.8092f,-121.094f, +-167.969f,14.4997f,-121.094f, +-164.063f,13.0122f,-121.094f, +-160.156f,11.2904f,-121.094f, +-156.25f,9.63825f,-121.094f, +-152.344f,8.62771f,-121.094f, +-148.438f,7.36842f,-121.094f, +-144.531f,6.44275f,-121.094f, +-140.625f,5.50805f,-121.094f, +-136.719f,6.00349f,-121.094f, +-132.813f,4.67796f,-121.094f, +-128.906f,3.93081f,-121.094f, +-125.0f,5.39329f,-121.094f, +-121.094f,6.95361f,-121.094f, +-117.188f,8.00676f,-121.094f, +-113.281f,7.76936f,-121.094f, +-109.375f,8.598f,-121.094f, +-105.469f,9.71941f,-121.094f, +-101.563f,11.4789f,-121.094f, +-97.6563f,13.572f,-121.094f, +-93.75f,16.0296f,-121.094f, +-89.8438f,18.5079f,-121.094f, +-85.9375f,22.5232f,-121.094f, +-82.0313f,25.7298f,-121.094f, +-78.125f,29.0421f,-121.094f, +-74.2188f,31.8936f,-121.094f, +-70.3125f,33.6857f,-121.094f, +-66.4063f,35.8951f,-121.094f, +-62.5f,37.4244f,-121.094f, +-58.5938f,39.1337f,-121.094f, +-54.6875f,40.6842f,-121.094f, +-50.7813f,41.8829f,-121.094f, +-46.875f,42.9851f,-121.094f, +-42.9688f,42.3613f,-121.094f, +-39.0625f,44.0627f,-121.094f, +-35.1563f,43.3741f,-121.094f, +-31.25f,43.2393f,-121.094f, +-27.3438f,44.1982f,-121.094f, +-23.4375f,45.2747f,-121.094f, +-19.5313f,46.6461f,-121.094f, +-15.625f,47.338f,-121.094f, +-11.7188f,48.1318f,-121.094f, +-7.8125f,49.3601f,-121.094f, +-3.90625f,49.6752f,-121.094f, +0.0f,49.3611f,-121.094f, +3.90625f,49.6769f,-121.094f, +-250.0f,31.4025f,-125.0f, +-246.094f,31.4165f,-125.0f, +-242.188f,32.314f,-125.0f, +-238.281f,32.9822f,-125.0f, +-234.375f,32.6962f,-125.0f, +-230.469f,31.3632f,-125.0f, +-226.563f,29.4391f,-125.0f, +-222.656f,29.519f,-125.0f, +-218.75f,29.4481f,-125.0f, +-214.844f,29.8481f,-125.0f, +-210.938f,30.408f,-125.0f, +-207.031f,30.291f,-125.0f, +-203.125f,28.7473f,-125.0f, +-199.219f,28.1816f,-125.0f, +-195.313f,27.2839f,-125.0f, +-191.406f,25.7018f,-125.0f, +-187.5f,23.2882f,-125.0f, +-183.594f,22.1614f,-125.0f, +-179.688f,20.658f,-125.0f, +-175.781f,18.8433f,-125.0f, +-171.875f,16.364f,-125.0f, +-167.969f,14.7298f,-125.0f, +-164.063f,12.9859f,-125.0f, +-160.156f,11.3306f,-125.0f, +-156.25f,10.1916f,-125.0f, +-152.344f,8.3967f,-125.0f, +-148.438f,6.23292f,-125.0f, +-144.531f,5.48985f,-125.0f, +-140.625f,5.18276f,-125.0f, +-136.719f,5.56059f,-125.0f, +-132.813f,5.75157f,-125.0f, +-128.906f,5.32154f,-125.0f, +-125.0f,6.15672f,-125.0f, +-121.094f,7.53373f,-125.0f, +-117.188f,8.38676f,-125.0f, +-113.281f,8.64274f,-125.0f, +-109.375f,8.49941f,-125.0f, +-105.469f,9.24481f,-125.0f, +-101.563f,11.5178f,-125.0f, +-97.6563f,13.4113f,-125.0f, +-93.75f,15.4997f,-125.0f, +-89.8438f,17.3502f,-125.0f, +-85.9375f,20.8168f,-125.0f, +-82.0313f,24.9405f,-125.0f, +-78.125f,27.8681f,-125.0f, +-74.2188f,30.1495f,-125.0f, +-70.3125f,32.4402f,-125.0f, +-66.4063f,34.2537f,-125.0f, +-62.5f,36.5623f,-125.0f, +-58.5938f,38.9027f,-125.0f, +-54.6875f,40.1192f,-125.0f, +-50.7813f,41.9393f,-125.0f, +-46.875f,41.8765f,-125.0f, +-42.9688f,41.6371f,-125.0f, +-39.0625f,41.6432f,-125.0f, +-35.1563f,41.2852f,-125.0f, +-31.25f,41.5629f,-125.0f, +-27.3438f,42.2956f,-125.0f, +-23.4375f,43.9719f,-125.0f, +-19.5313f,46.2232f,-125.0f, +-15.625f,47.3104f,-125.0f, +-11.7188f,47.5943f,-125.0f, +-7.8125f,49.1192f,-125.0f, +-3.90625f,49.6341f,-125.0f, +0.0f,50.3481f,-125.0f, +3.90625f,50.3021f,-125.0f, +}; + +btScalar Landscape05Nml[] = { +-0.379368f,0.918093f,-0.114827f, +-0.372144f,0.893697f,-0.250627f, +-0.36483f,0.925769f,-0.0992527f, +-0.303739f,0.924201f,-0.231506f, +-0.333317f,0.942796f,0.0059764f, +-0.301915f,0.940094f,-0.158338f, +-0.363026f,0.931698f,0.0122604f, +-0.316966f,0.945703f,-0.0719588f, +-0.334188f,0.941548f,0.0424963f, +-0.326039f,0.944563f,-0.0387196f, +-0.382515f,0.923758f,0.0188291f, +-0.388659f,0.920843f,-0.0315106f, +-0.393577f,0.919186f,-0.013971f, +-0.384968f,0.922772f,-0.0170923f, +-0.36589f,0.930393f,-0.0222354f, +-0.357745f,0.933231f,0.0331438f, +-0.482959f,0.873942f,-0.0545559f, +-0.473203f,0.879732f,0.0463645f, +-0.550088f,0.834035f,-0.0423024f, +-0.534007f,0.844766f,0.0347315f, +-0.469703f,0.882824f,0.000376011f, +-0.490919f,0.868868f,0.0637728f, +-0.552202f,0.826862f,-0.106641f, +-0.558464f,0.829519f,0.00395409f, +-0.437742f,0.897949f,-0.0454837f, +-0.437659f,0.898576f,0.0318733f, +-0.370538f,0.927929f,-0.0406078f, +-0.403245f,0.912789f,-0.064878f, +-0.385648f,0.921933f,-0.0362754f, +-0.356223f,0.934382f,-0.00604283f, +-0.30076f,0.953691f,-0.00400305f, +-0.305622f,0.951852f,0.0239231f, +-0.284526f,0.956527f,-0.0640436f, +-0.380428f,0.91278f,-0.148684f, +-0.270228f,0.949845f,-0.157392f, +-0.258662f,0.947281f,-0.189085f, +-0.182234f,0.978377f,-0.0978241f, +-0.170558f,0.969333f,-0.176927f, +-0.205282f,0.978149f,-0.0329196f, +-0.190223f,0.949267f,-0.250415f, +-0.274135f,0.959498f,0.0649128f, +-0.310884f,0.912161f,-0.267046f, +-0.496348f,0.868119f,0.00275513f, +-0.43081f,0.896388f,-0.104358f, +-0.405094f,0.913485f,0.0380057f, +-0.324068f,0.9389f,0.115955f, +-0.25697f,0.965908f,0.0314342f, +-0.271227f,0.948776f,0.162051f, +-0.254963f,0.963309f,-0.0838379f, +-0.344475f,0.938191f,-0.03368f, +-0.111765f,0.981495f,-0.15549f, +-0.167507f,0.982459f,-0.0819529f, +-0.0010222f,0.966945f,-0.254984f, +-0.0444844f,0.98477f,-0.168075f, +0.186055f,0.950323f,-0.249537f, +0.1896f,0.965697f,-0.177427f, +0.271688f,0.939248f,-0.209761f, +0.279232f,0.936599f,-0.211687f, +0.322549f,0.939459f,-0.115666f, +0.354799f,0.922502f,-0.152013f, +0.252542f,0.965579f,-0.0622893f, +0.223889f,0.935481f,-0.273404f, +0.054661f,0.998373f,-0.0162575f, +0.0861707f,0.972348f,-0.217056f, +0.0124775f,0.999913f,-0.00421609f, +0.0330599f,0.976575f,-0.212621f, +0.0918366f,0.994675f,0.046771f, +0.166973f,0.980978f,-0.0990035f, +0.0387017f,0.993028f,0.111346f, +0.125297f,0.990619f,0.054541f, +0.0541059f,0.984899f,0.164456f, +0.149711f,0.968151f,0.200673f, +0.168008f,0.956272f,0.239411f, +0.195367f,0.93223f,0.304595f, +0.147118f,0.96491f,0.217497f, +0.125818f,0.960755f,0.247225f, +0.270517f,0.934497f,0.23138f, +0.29818f,0.904256f,0.305629f, +0.363841f,0.900609f,0.237745f, +0.316827f,0.923009f,0.218347f, +0.413166f,0.893779f,0.17451f, +0.334815f,0.940911f,0.0508378f, +0.474676f,0.869519f,0.136452f, +0.456974f,0.889396f,0.0122055f, +0.272216f,0.960219f,0.0622813f, +0.228855f,0.962963f,-0.142573f, +0.0810211f,0.995842f,0.0416494f, +0.189938f,0.980101f,0.0576713f, +-0.0449078f,0.994712f,0.0923629f, +-0.00155869f,0.98749f,0.157671f, +-0.0840704f,0.991095f,0.103263f, +-0.0968834f,0.985327f,0.140515f, +0.0427121f,0.991995f,0.118832f, +-0.0240058f,0.999711f,0.000939081f, +-0.124569f,0.986858f,0.10293f, +-0.167243f,0.982306f,-0.0842863f, +-0.286295f,0.953093f,0.0982316f, +-0.243406f,0.969914f,-0.00444377f, +-0.280466f,0.950626f,0.132851f, +-0.21091f,0.972115f,0.102516f, +-0.230061f,0.951476f,0.204368f, +-0.123921f,0.950092f,0.286301f, +-0.126792f,0.952499f,0.276893f, +-0.0764868f,0.927481f,0.365962f, +-0.0452811f,0.949055f,0.31184f, +-0.138647f,0.960819f,0.240008f, +-0.25036f,0.943892f,0.215377f, +-0.314158f,0.941939f,0.118561f, +-0.458647f,0.872527f,0.168342f, +-0.427047f,0.882261f,0.198106f, +-0.485467f,0.864542f,0.129958f, +-0.523912f,0.844181f,0.113461f, +-0.532843f,0.842328f,0.081008f, +-0.518838f,0.84918f,0.0984888f, +-0.439028f,0.883929f,0.16101f, +-0.409166f,0.878784f,0.245606f, +-0.386543f,0.918859f,0.0792661f, +-0.447749f,0.88853f,0.100178f, +-0.431191f,0.90206f,0.0190184f, +-0.467639f,0.880276f,0.0801789f, +-0.518882f,0.844495f,-0.132623f, +-0.570181f,0.817923f,-0.076789f, +-0.420368f,0.883342f,-0.207357f, +-0.464447f,0.877342f,-0.120667f, +-0.386958f,0.877414f,-0.283564f, +-0.442101f,0.874511f,-0.199442f, +-0.380012f,0.859996f,-0.340584f, +-0.442865f,0.822467f,-0.356959f, +-0.24551f,0.880879f,-0.404695f, +-0.263304f,0.844058f,-0.467159f, +-0.116714f,0.897206f,-0.425909f, +-0.129252f,0.860962f,-0.491974f, +-0.352237f,0.922053f,0.160457f, +-0.402553f,0.906198f,0.129446f, +-0.377478f,0.915341f,0.140219f, +-0.336315f,0.935519f,0.10815f, +-0.335675f,0.937548f,0.0912505f, +-0.330532f,0.939201f,0.0930086f, +-0.361761f,0.931606f,0.035208f, +-0.318172f,0.947538f,0.0306247f, +-0.418525f,0.907834f,-0.0259689f, +-0.56364f,0.818048f,-0.114485f, +-0.461029f,0.882661f,-0.0914388f, +-0.472492f,0.87835f,-0.0724725f, +-0.523319f,0.846244f,-0.100037f, +-0.381187f,0.924062f,-0.0283799f, +-0.407557f,0.911105f,-0.0615298f, +-0.340677f,0.939702f,0.0299913f, +-0.237849f,0.962659f,0.129291f, +-0.233755f,0.968303f,0.0880164f, +-0.248597f,0.967837f,0.0386268f, +-0.357032f,0.933656f,0.0285478f, +-0.359392f,0.919937f,0.156695f, +-0.375075f,0.918577f,0.12464f, +-0.326685f,0.944457f,-0.0357437f, +-0.172605f,0.980131f,-0.0977257f, +-0.156177f,0.9732f,-0.168789f, +-0.0732432f,0.97238f,-0.221612f, +0.0871915f,0.980367f,-0.176858f, +0.1118f,0.973873f,-0.197667f, +0.197176f,0.978426f,-0.0616824f, +0.202039f,0.979229f,-0.0170475f, +0.172249f,0.982761f,0.0671591f, +0.0103709f,0.995351f,0.095751f, +0.00657151f,0.996617f,0.0819183f, +0.0314022f,0.995508f,0.0893156f, +0.0387801f,0.982532f,0.182011f, +0.0412148f,0.983254f,0.177521f, +0.166642f,0.964252f,0.20603f, +0.177047f,0.971307f,0.1588f, +0.255603f,0.956785f,0.138671f, +0.338465f,0.927074f,0.161166f, +0.418264f,0.886168f,0.199401f, +0.454161f,0.868211f,0.199869f, +0.355471f,0.903694f,0.2387f, +0.136408f,0.975339f,0.173515f, +-0.0223692f,0.983821f,0.177753f, +-0.0947578f,0.983833f,0.151964f, +-0.0484831f,0.985895f,0.16019f, +-0.137652f,0.965784f,0.219802f, +-0.273035f,0.949633f,0.153782f, +-0.284296f,0.949219f,0.134753f, +-0.233616f,0.961781f,0.142834f, +-0.158293f,0.979011f,0.128376f, +-0.142079f,0.977628f,0.155106f, +-0.179667f,0.940095f,0.289726f, +-0.385363f,0.907468f,0.167324f, +-0.462662f,0.886082f,0.0283396f, +-0.500483f,0.865637f,-0.0137244f, +-0.459387f,0.885328f,-0.0718224f, +-0.318003f,0.947491f,-0.0336944f, +-0.336522f,0.937427f,-0.0893505f, +-0.421711f,0.882359f,-0.208814f, +-0.386976f,0.894588f,-0.223522f, +-0.348564f,0.925302f,-0.149395f, +-0.389936f,0.911457f,-0.131135f, +-0.262418f,0.94867f,-0.17653f, +-0.142966f,0.967048f,-0.210661f, +-0.341303f,0.927435f,0.152892f, +-0.342877f,0.929169f,0.138133f, +-0.327958f,0.941991f,0.0713955f, +-0.312837f,0.949244f,0.0326933f, +-0.32505f,0.944749f,0.0423311f, +-0.35038f,0.936272f,0.0250833f, +-0.334661f,0.939274f,0.0759313f, +-0.336592f,0.939816f,0.0587454f, +-0.383743f,0.919849f,0.0813597f, +-0.479391f,0.876726f,0.0391772f, +-0.521184f,0.850742f,-0.0678625f, +-0.496942f,0.867777f,0.00353465f, +-0.521763f,0.848113f,-0.0920201f, +-0.373289f,0.923494f,-0.0883984f, +-0.40896f,0.910065f,-0.067337f, +-0.458758f,0.888254f,0.0233657f, +-0.335137f,0.935384f,0.112868f, +-0.174079f,0.969266f,0.173839f, +-0.174994f,0.976179f,0.128265f, +-0.244694f,0.967717f,0.0603988f, +-0.409093f,0.90433f,-0.121779f, +-0.290803f,0.954139f,-0.0710763f, +-0.266076f,0.946406f,-0.183082f, +-0.19492f,0.966664f,-0.166031f, +-0.107014f,0.989078f,-0.101359f, +-0.0950037f,0.987234f,-0.127838f, +-0.0081899f,0.996807f,-0.0794301f, +0.0655685f,0.997841f,0.0038314f, +0.121704f,0.991617f,0.0433953f, +0.204125f,0.978885f,0.010797f, +0.169834f,0.985465f,0.00398161f, +0.0639966f,0.99795f,0.000581677f, +0.0389498f,0.997722f,-0.0550831f, +-0.00230315f,0.998522f,-0.0543072f, +-0.0428959f,0.99833f,-0.0386874f, +8.35518e-005f,0.999804f,-0.0198162f, +0.12638f,0.991004f,0.0440296f, +0.219728f,0.969155f,0.111616f, +0.270292f,0.956521f,0.109589f, +0.325159f,0.942616f,0.0758083f, +0.394886f,0.91647f,0.0644013f, +0.455483f,0.885289f,0.0937962f, +0.346134f,0.927862f,0.13879f, +0.142703f,0.967217f,0.210065f, +-0.0417806f,0.973195f,0.226154f, +-0.0873343f,0.983405f,0.159022f, +-0.027932f,0.984118f,0.175304f, +-0.101812f,0.985941f,0.132496f, +-0.174734f,0.983884f,0.037939f, +-0.279511f,0.957793f,-0.0671252f, +-0.277834f,0.959638f,-0.04362f, +-0.153076f,0.986374f,0.0602763f, +-0.221825f,0.968529f,0.112897f, +-0.256381f,0.940693f,0.222182f, +-0.236646f,0.958592f,0.158432f, +-0.345917f,0.937587f,-0.0356594f, +-0.417749f,0.894423f,-0.159665f, +-0.456832f,0.853011f,-0.252341f, +-0.379407f,0.905637f,-0.189399f, +-0.328991f,0.940983f,-0.0794707f, +-0.363362f,0.931271f,0.0264943f, +-0.48653f,0.873119f,0.0308429f, +-0.459174f,0.871133f,0.174033f, +-0.359639f,0.91236f,0.1956f, +-0.2127f,0.972657f,0.0932592f, +-0.0697188f,0.989689f,0.12512f, +-0.251887f,0.965064f,0.0721469f, +-0.317161f,0.947815f,-0.0324826f, +-0.311043f,0.947329f,-0.076288f, +-0.343705f,0.938452f,-0.0342691f, +-0.318958f,0.946045f,0.0571365f, +-0.341405f,0.939767f,0.0167816f, +-0.371963f,0.928183f,-0.0109617f, +-0.353511f,0.935132f,0.0236193f, +-0.398287f,0.910412f,0.111881f, +-0.43162f,0.897024f,0.0951448f, +-0.485116f,0.874338f,-0.0140269f, +-0.473699f,0.879939f,-0.03627f, +-0.417805f,0.900966f,-0.117046f, +-0.424936f,0.889519f,-0.167884f, +-0.467852f,0.878936f,-0.0926624f, +-0.493825f,0.865439f,-0.0845782f, +-0.351989f,0.932075f,-0.0856709f, +-0.214961f,0.974111f,-0.0700008f, +-0.163285f,0.986387f,-0.0194449f, +-0.162841f,0.986548f,-0.0143588f, +-0.285987f,0.956112f,-0.0637334f, +-0.292441f,0.94548f,-0.143341f, +-0.215932f,0.955314f,-0.201864f, +-0.253415f,0.950159f,-0.181603f, +-0.183417f,0.974504f,-0.129231f, +-0.101906f,0.993299f,-0.0545242f, +-0.042238f,0.99904f,-0.0116303f, +0.0329811f,0.99907f,-0.0277622f, +0.132201f,0.990073f,-0.0477429f, +0.267032f,0.963432f,-0.0221792f, +0.1278f,0.990718f,-0.0463084f, +0.0964891f,0.995299f,-0.00830296f, +0.0476853f,0.991211f,-0.123396f, +-0.00640997f,0.993203f,-0.116222f, +-0.0126443f,0.992773f,-0.119338f, +-0.00631822f,0.992917f,-0.118638f, +0.0563885f,0.995667f,-0.073943f, +0.12664f,0.991687f,-0.022778f, +0.273262f,0.961705f,0.021246f, +0.388375f,0.920615f,-0.0403992f, +0.37695f,0.920931f,-0.0989673f, +0.400211f,0.914808f,0.0543818f, +0.279689f,0.947142f,0.15715f, +0.0626591f,0.985325f,0.158772f, +0.0197159f,0.983213f,0.181391f, +0.0112307f,0.995546f,0.0936022f, +-0.0611233f,0.998037f,0.013638f, +-0.0515369f,0.996025f,0.0726543f, +-0.060221f,0.998076f,0.0147593f, +-0.21333f,0.972986f,-0.0882534f, +-0.330599f,0.94012f,-0.0829391f, +-0.311254f,0.950309f,-0.00575056f, +-0.324983f,0.931955f,0.160768f, +-0.245964f,0.942146f,0.227736f, +-0.125195f,0.981121f,0.147403f, +-0.193437f,0.975595f,0.103908f, +-0.319958f,0.946961f,0.029845f, +-0.440983f,0.895915f,-0.0535662f, +-0.477838f,0.878381f,-0.0108058f, +-0.480471f,0.872693f,0.0869201f, +-0.478968f,0.83494f,0.271043f, +-0.490257f,0.796981f,0.352803f, +-0.434277f,0.834185f,0.339909f, +-0.265882f,0.929328f,0.256236f, +-0.142385f,0.958793f,0.245852f, +-0.182126f,0.963412f,0.196642f, +-0.0681643f,0.992157f,0.104781f, +-0.176883f,0.983918f,0.024857f, +-0.305513f,0.952069f,-0.0150524f, +-0.401485f,0.91552f,0.0251517f, +-0.372509f,0.927256f,0.0378572f, +-0.265017f,0.964159f,0.0127972f, +-0.342134f,0.935688f,-0.0862078f, +-0.427338f,0.901948f,-0.062226f, +-0.447549f,0.894216f,0.00877894f, +-0.382185f,0.923573f,-0.0307708f, +-0.386509f,0.921774f,-0.0307138f, +-0.457766f,0.884255f,-0.0924303f, +-0.384262f,0.916404f,-0.11201f, +-0.431623f,0.886784f,-0.165273f, +-0.460575f,0.869789f,-0.177024f, +-0.471547f,0.850265f,-0.233865f, +-0.351048f,0.911491f,-0.214361f, +-0.263539f,0.9431f,-0.202755f, +-0.173283f,0.972074f,-0.158258f, +-0.19847f,0.960809f,-0.193536f, +-0.275034f,0.951707f,-0.136422f, +-0.217032f,0.958372f,-0.185526f, +-0.201987f,0.95666f,-0.209771f, +-0.299318f,0.94727f,-0.114406f, +-0.187056f,0.978613f,-0.0855959f, +-0.155621f,0.97153f,-0.178637f, +-0.0810385f,0.981009f,-0.176221f, +0.0905036f,0.986207f,-0.138581f, +0.115825f,0.982705f,-0.14448f, +0.19636f,0.97731f,-0.0794224f, +0.143519f,0.988245f,-0.0526749f, +0.109744f,0.989619f,-0.0927937f, +0.197571f,0.972036f,-0.12693f, +0.00332495f,0.962309f,-0.271939f, +-0.0356976f,0.959351f,-0.279948f, +-0.0721767f,0.96735f,-0.242948f, +-0.00843005f,0.989549f,-0.143952f, +0.152572f,0.983317f,-0.0990425f, +0.281378f,0.943362f,-0.175768f, +0.428891f,0.891683f,-0.144753f, +0.290445f,0.954517f,-0.0673633f, +0.176401f,0.973557f,0.145155f, +0.232983f,0.924473f,0.301776f, +0.181127f,0.950255f,0.253393f, +-0.00165339f,0.991402f,0.130837f, +0.0981935f,0.976268f,0.193027f, +0.000170743f,0.996657f,0.0816968f, +-0.0970384f,0.995225f,-0.0105345f, +-0.00895717f,0.999951f,-0.00426387f, +-0.170944f,0.985202f,-0.0124686f, +-0.362907f,0.93182f,-0.00317037f, +-0.388121f,0.921046f,0.0322033f, +-0.407598f,0.90852f,0.0919578f, +-0.247403f,0.962759f,0.109032f, +-0.0829823f,0.986114f,0.143848f, +-0.240859f,0.956011f,0.167424f, +-0.312142f,0.912012f,0.266086f, +-0.398269f,0.862926f,0.311032f, +-0.511957f,0.795091f,0.325161f, +-0.506846f,0.755093f,0.415864f, +-0.506747f,0.718735f,0.476054f, +-0.45002f,0.736589f,0.504895f, +-0.287855f,0.833759f,0.471153f, +-0.237765f,0.90713f,0.34725f, +-0.146865f,0.915961f,0.373425f, +-0.0859218f,0.935714f,0.342136f, +-0.054455f,0.996952f,-0.0558782f, +-0.211499f,0.976662f,-0.0374149f, +-0.331452f,0.940975f,0.0686022f, +-0.397421f,0.917381f,0.0216451f, +-0.316207f,0.946964f,-0.0572054f, +-0.202804f,0.975284f,-0.0877067f, +-0.28846f,0.951091f,-0.110532f, +-0.440756f,0.882415f,-0.164552f, +-0.391159f,0.897816f,-0.202288f, +-0.37945f,0.884355f,-0.27191f, +-0.436492f,0.880924f,-0.182888f, +-0.458204f,0.880643f,-0.12049f, +-0.365575f,0.927969f,-0.0723085f, +-0.344164f,0.93545f,-0.0805227f, +-0.392565f,0.898448f,-0.196683f, +-0.458844f,0.839155f,-0.292028f, +-0.406986f,0.873305f,-0.267769f, +-0.264536f,0.933458f,-0.242234f, +-0.197907f,0.946975f,-0.253123f, +-0.162416f,0.964761f,-0.207018f, +-0.261287f,0.932524f,-0.249254f, +-0.237723f,0.937266f,-0.25499f, +-0.255938f,0.959549f,-0.117312f, +-0.378394f,0.921703f,-0.0853291f, +-0.154569f,0.983106f,-0.098032f, +0.020864f,0.98441f,-0.174648f, +-0.0493076f,0.945704f,-0.321268f, +0.00354211f,0.950539f,-0.310586f, +0.0705741f,0.962405f,-0.262289f, +0.155003f,0.952815f,-0.260992f, +0.190084f,0.945182f,-0.265518f, +0.109466f,0.94166f,-0.318268f, +0.219465f,0.948713f,-0.227551f, +0.131592f,0.95776f,-0.255694f, +-0.023132f,0.936016f,-0.351196f, +-0.102398f,0.923738f,-0.369083f, +-0.11778f,0.928743f,-0.351518f, +0.14699f,0.959781f,-0.239196f, +0.329451f,0.917295f,-0.223678f, +0.290403f,0.942778f,-0.163815f, +0.10086f,0.993272f,0.056896f, +0.00690717f,0.980954f,0.194116f, +0.198478f,0.949829f,0.241726f, +0.257584f,0.935998f,0.239913f, +0.0870031f,0.976807f,0.195647f, +0.0578083f,0.994066f,0.0921449f, +0.121554f,0.989161f,0.0823711f, +0.0335983f,0.999242f,0.0196737f, +-0.0544848f,0.997579f,-0.0432265f, +-0.170331f,0.98419f,0.0485619f, +-0.366378f,0.930108f,-0.0258115f, +-0.430564f,0.901925f,-0.0338598f, +-0.412156f,0.909498f,0.0542308f, +-0.303685f,0.949097f,0.0836093f, +-0.198153f,0.949404f,0.243656f, +-0.267445f,0.871756f,0.410506f, +-0.393769f,0.805932f,0.442062f, +-0.427473f,0.750775f,0.50359f, +-0.522691f,0.707231f,0.476044f, +-0.550081f,0.670741f,0.497511f, +-0.518356f,0.695815f,0.49714f, +-0.372017f,0.764162f,0.526934f, +-0.210863f,0.841692f,0.497082f, +-0.116051f,0.87101f,0.477362f, +-0.106872f,0.906726f,0.407954f, +0.0295506f,0.897687f,0.439643f, +-0.11391f,0.993475f,0.00559176f, +-0.238885f,0.970513f,0.0322297f, +-0.352278f,0.935893f,0.00201985f, +-0.29155f,0.955165f,-0.0515582f, +-0.283012f,0.950207f,-0.130422f, +-0.233718f,0.966509f,-0.105997f, +-0.293314f,0.953293f,-0.0721f, +-0.344057f,0.937935f,-0.0436188f, +-0.359338f,0.921856f,-0.145114f, +-0.361988f,0.90939f,-0.204876f, +-0.478777f,0.840974f,-0.252063f, +-0.501126f,0.832032f,-0.237897f, +-0.42396f,0.887247f,-0.1818f, +-0.340692f,0.929815f,-0.13919f, +-0.261328f,0.946412f,-0.189766f, +-0.383135f,0.863856f,-0.327048f, +-0.4248f,0.838392f,-0.341533f, +-0.258907f,0.912327f,-0.317216f, +-0.273875f,0.922352f,-0.272505f, +-0.216284f,0.973372f,-0.0759435f, +-0.186061f,0.980681f,-0.0603919f, +-0.327344f,0.93227f,-0.15401f, +-0.354135f,0.933013f,-0.0638423f, +-0.30838f,0.94174f,-0.13427f, +-0.0952482f,0.963393f,-0.250602f, +0.0864929f,0.957116f,-0.276491f, +0.0265645f,0.947809f,-0.31773f, +-0.00743162f,0.929747f,-0.368124f, +0.0794584f,0.926075f,-0.368877f, +0.177698f,0.921503f,-0.345334f, +0.210118f,0.923104f,-0.322071f, +0.0972314f,0.929984f,-0.354507f, +0.0931107f,0.932401f,-0.349226f, +0.163846f,0.947557f,-0.274392f, +0.04099f,0.947023f,-0.318539f, +-0.0637185f,0.942657f,-0.327625f, +-0.131539f,0.923216f,-0.361068f, +0.0323928f,0.932437f,-0.359877f, +0.242794f,0.937436f,-0.249528f, +0.154647f,0.984538f,-0.0822692f, +-0.0290139f,0.999421f,0.0177744f, +-0.0330797f,0.998482f,0.0440283f, +0.157195f,0.980432f,0.118503f, +0.251646f,0.94505f,0.208697f, +0.178529f,0.966849f,0.182568f, +0.171641f,0.982807f,0.0680498f, +0.107902f,0.993714f,0.0298233f, +0.00302695f,0.994036f,0.109006f, +-0.0844358f,0.977656f,0.19251f, +-0.18119f,0.958323f,0.220878f, +-0.285317f,0.945377f,0.157659f, +-0.419121f,0.895183f,0.151606f, +-0.490039f,0.857134f,0.158693f, +-0.402244f,0.878123f,0.259038f, +-0.398659f,0.825161f,0.400226f, +-0.427626f,0.728675f,0.534948f, +-0.378859f,0.704334f,0.600316f, +-0.386613f,0.684959f,0.617545f, +-0.440363f,0.648556f,0.62085f, +-0.484249f,0.659981f,0.574394f, +-0.462576f,0.728741f,0.504936f, +-0.380875f,0.811463f,0.443241f, +-0.190303f,0.865049f,0.464193f, +-0.0749094f,0.86956f,0.488113f, +-0.11614f,0.868815f,0.481323f, +-0.102623f,0.843113f,0.527854f, +-0.198362f,0.979655f,0.0304707f, +-0.238942f,0.970277f,0.0383318f, +-0.308109f,0.951351f,-0.000213496f, +-0.245044f,0.968893f,0.0346459f, +-0.275786f,0.960816f,-0.0278198f, +-0.256726f,0.965729f,-0.0381932f, +-0.318964f,0.947473f,-0.0236049f, +-0.388409f,0.921405f,0.0123096f, +-0.298771f,0.953298f,0.0442638f, +-0.291187f,0.956662f,0.00282226f, +-0.39367f,0.915026f,-0.0880448f, +-0.501897f,0.840236f,-0.20519f, +-0.460271f,0.863055f,-0.208055f, +-0.311786f,0.925724f,-0.214066f, +-0.177876f,0.937081f,-0.300397f, +-0.256831f,0.902901f,-0.344683f, +-0.413909f,0.808626f,-0.418096f, +-0.347694f,0.845102f,-0.406092f, +-0.390269f,0.881564f,-0.265585f, +-0.38258f,0.915768f,-0.122479f, +-0.172737f,0.984864f,-0.0142896f, +-0.221138f,0.97315f,-0.0638528f, +-0.32806f,0.922266f,-0.204454f, +-0.20334f,0.945769f,-0.253326f, +-0.0362109f,0.959773f,-0.278433f, +0.0451082f,0.968522f,-0.244806f, +0.103574f,0.977375f,-0.184421f, +0.095607f,0.942862f,-0.319172f, +0.028855f,0.903939f,-0.426688f, +0.0781753f,0.937277f,-0.339707f, +0.163597f,0.966118f,-0.199631f, +0.165445f,0.973063f,-0.160553f, +0.145787f,0.95097f,-0.272767f, +0.130591f,0.92029f,-0.368799f, +0.0531207f,0.931628f,-0.35951f, +-0.0802666f,0.935074f,-0.345244f, +-0.124987f,0.942063f,-0.311281f, +0.0397165f,0.963525f,-0.264653f, +0.0790619f,0.96623f,-0.245254f, +0.0277086f,0.995754f,-0.0877838f, +-0.0718135f,0.997414f,0.00271225f, +-0.0601764f,0.993596f,0.0956336f, +0.0305316f,0.992338f,0.119724f, +0.184993f,0.96549f,0.183324f, +0.240982f,0.949316f,0.20181f, +0.205406f,0.960305f,0.188739f, +0.0685231f,0.967991f,0.241448f, +-0.121139f,0.95072f,0.285408f, +-0.150135f,0.918283f,0.366355f, +-0.132611f,0.919499f,0.370048f, +-0.285199f,0.893271f,0.34746f, +-0.428415f,0.803512f,0.413316f, +-0.445474f,0.783214f,0.433738f, +-0.459983f,0.771026f,0.44038f, +-0.467611f,0.730475f,0.497741f, +-0.48066f,0.718458f,0.502777f, +-0.417628f,0.706128f,0.571814f, +-0.464585f,0.665035f,0.584713f, +-0.472738f,0.646587f,0.598702f, +-0.412146f,0.689264f,0.595861f, +-0.326825f,0.752406f,0.5719f, +-0.254151f,0.834713f,0.48853f, +-0.235109f,0.888903f,0.39316f, +-0.153581f,0.849492f,0.504753f, +-0.150095f,0.815518f,0.558929f, +-0.18873f,0.837012f,0.513607f, +0.0689174f,0.995773f,0.0607139f, +-0.155258f,0.983404f,-0.0938683f, +-0.345692f,0.927547f,-0.141961f, +-0.289881f,0.953783f,-0.079168f, +-0.192407f,0.979661f,-0.0569578f, +-0.267677f,0.960104f,-0.0809323f, +-0.338627f,0.940905f,-0.0054102f, +-0.378143f,0.925406f,-0.0251327f, +-0.331689f,0.941021f,-0.0667991f, +-0.266964f,0.963694f,-0.00485284f, +-0.326986f,0.944023f,-0.0435962f, +-0.406544f,0.902607f,-0.141498f, +-0.445264f,0.84532f,-0.295253f, +-0.261882f,0.90946f,-0.322956f, +-0.131634f,0.928868f,-0.346231f, +-0.231876f,0.922232f,-0.30939f, +-0.381112f,0.87967f,-0.284489f, +-0.459513f,0.85999f,-0.22196f, +-0.498013f,0.864257f,-0.0710131f, +-0.440544f,0.89211f,-0.100303f, +-0.247938f,0.96287f,-0.106806f, +-0.10732f,0.992504f,-0.0584663f, +-0.221465f,0.956592f,-0.189431f, +-0.229248f,0.946541f,-0.22695f, +-0.0978243f,0.972744f,-0.210239f, +-0.0379465f,0.985853f,-0.163259f, +0.0806013f,0.992194f,-0.0951546f, +0.280296f,0.95443f,-0.102456f, +0.155799f,0.941292f,-0.299494f, +-0.0466248f,0.90184f,-0.429548f, +0.0333539f,0.93989f,-0.339845f, +0.15766f,0.95203f,-0.262264f, +0.275219f,0.92494f,-0.262186f, +0.226492f,0.914035f,-0.336513f, +0.0375497f,0.921004f,-0.387739f, +-0.0841489f,0.913809f,-0.39733f, +-0.216548f,0.901013f,-0.375874f, +-0.0617755f,0.971104f,-0.230524f, +0.0635289f,0.988552f,-0.136856f, +-0.0898172f,0.987883f,-0.126568f, +-0.195744f,0.9803f,-0.0263689f, +-0.163398f,0.98375f,0.0744142f, +0.0549941f,0.99236f,0.110438f, +0.19398f,0.975972f,0.0992507f, +0.191759f,0.972804f,0.129928f, +0.149866f,0.963222f,0.223034f, +-0.00306242f,0.957956f,0.286898f, +-0.13576f,0.938575f,0.317249f, +-0.176601f,0.936485f,0.303f, +-0.158083f,0.914215f,0.373122f, +-0.316693f,0.854194f,0.412381f, +-0.498069f,0.774619f,0.389733f, +-0.492142f,0.755365f,0.432688f, +-0.453311f,0.739293f,0.49795f, +-0.471661f,0.730931f,0.49323f, +-0.504596f,0.695479f,0.511558f, +-0.486075f,0.660592f,0.572145f, +-0.455536f,0.681017f,0.573326f, +-0.475459f,0.732851f,0.486691f, +-0.40679f,0.784517f,0.468032f, +-0.294511f,0.862991f,0.410499f, +-0.137096f,0.926626f,0.350098f, +-0.212171f,0.92693f,0.30949f, +-0.320702f,0.890591f,0.322488f, +-0.144781f,0.913051f,0.381284f, +-0.0467088f,0.929255f,0.366475f, +0.190524f,0.979715f,0.0621193f, +-0.0159571f,0.99888f,-0.0445494f, +-0.299493f,0.937414f,-0.177647f, +-0.30245f,0.926474f,-0.223986f, +-0.236991f,0.948637f,-0.209579f, +-0.316653f,0.935173f,-0.15869f, +-0.385652f,0.9143f,-0.123807f, +-0.33937f,0.934637f,-0.106213f, +-0.347064f,0.934195f,-0.0826249f, +-0.295744f,0.955249f,0.00583919f, +-0.275005f,0.961059f,-0.0271544f, +-0.269439f,0.957464f,-0.103275f, +-0.282112f,0.919833f,-0.272616f, +-0.294141f,0.877255f,-0.379347f, +-0.188084f,0.929949f,-0.315942f, +-0.305781f,0.908958f,-0.283361f, +-0.494244f,0.854771f,-0.158396f, +-0.556326f,0.828917f,0.0582992f, +-0.534005f,0.83843f,0.108964f, +-0.372194f,0.92607f,0.0621723f, +-0.216902f,0.97615f,-0.00922891f, +-0.129625f,0.988755f,-0.0745716f, +-0.137022f,0.98954f,-0.0451077f, +-0.210914f,0.969697f,-0.123297f, +-0.0927848f,0.980946f,-0.170691f, +-0.0487293f,0.98279f,-0.178186f, +0.0377154f,0.983594f,-0.176409f, +0.270827f,0.95519f,-0.119436f, +0.365037f,0.928517f,-0.0678507f, +0.131842f,0.951604f,-0.277612f, +-0.0185121f,0.905238f,-0.424502f, +0.118166f,0.903064f,-0.412931f, +0.230045f,0.8849f,-0.405008f, +0.2101f,0.906634f,-0.365886f, +0.0544702f,0.94453f,-0.323878f, +-0.0630069f,0.9598f,-0.273522f, +-0.203027f,0.928033f,-0.312304f, +-0.22235f,0.90002f,-0.374866f, +0.0164141f,0.973192f,-0.229407f, +-0.131299f,0.967472f,-0.216237f, +-0.248586f,0.95668f,-0.151553f, +-0.180678f,0.971697f,-0.152182f, +0.021506f,0.991774f,-0.126182f, +0.129882f,0.991187f,-0.0260519f, +0.125479f,0.988703f,0.0819803f, +0.0585413f,0.987325f,0.14752f, +-0.0186301f,0.977162f,0.211676f, +-0.162972f,0.968132f,0.19016f, +-0.218545f,0.935778f,0.276691f, +-0.284144f,0.890895f,0.354356f, +-0.345593f,0.839997f,0.418295f, +-0.488331f,0.792258f,0.36587f, +-0.545891f,0.770241f,0.329746f, +-0.533891f,0.766492f,0.357002f, +-0.51665f,0.749346f,0.414189f, +-0.616561f,0.690345f,0.37852f, +-0.519109f,0.719346f,0.461593f, +-0.392236f,0.782177f,0.484097f, +-0.398436f,0.817816f,0.415241f, +-0.392025f,0.864189f,0.315428f, +-0.176475f,0.937288f,0.300577f, +-0.137444f,0.969881f,0.201097f, +-0.206545f,0.942409f,0.263066f, +-0.293185f,0.938992f,0.179823f, +-0.159029f,0.985376f,0.0611911f, +0.00174953f,0.998094f,0.0616789f, +0.241821f,0.962041f,0.126492f, +0.127737f,0.984773f,0.117921f, +-0.17559f,0.984255f,0.0202494f, +-0.277772f,0.957333f,-0.0797282f, +-0.264237f,0.953214f,-0.146839f, +-0.330132f,0.935063f,-0.129113f, +-0.363469f,0.924563f,-0.114338f, +-0.371034f,0.917638f,-0.142388f, +-0.425424f,0.897691f,-0.114736f, +-0.353654f,0.934652f,-0.0368062f, +-0.218582f,0.975792f,0.007136f, +-0.203676f,0.978799f,-0.0216238f, +-0.149661f,0.987587f,-0.0476727f, +-0.278943f,0.945373f,-0.1687f, +-0.239375f,0.951961f,-0.190969f, +-0.360119f,0.921099f,-0.147955f, +-0.584157f,0.811569f,0.0107674f, +-0.61484f,0.786528f,0.0578414f, +-0.504089f,0.86363f,-0.00605437f, +-0.333455f,0.94143f,-0.0501755f, +-0.123418f,0.989972f,-0.0687344f, +-0.105519f,0.985418f,-0.133478f, +-0.134701f,0.9843f,-0.114061f, +-0.137014f,0.977235f,-0.161985f, +-0.0439551f,0.980481f,-0.191638f, +-0.0327274f,0.96544f,-0.258561f, +0.0268923f,0.955378f,-0.294159f, +0.189265f,0.941783f,-0.277892f, +0.306008f,0.930356f,-0.201982f, +0.2909f,0.948465f,-0.12566f, +0.135694f,0.963424f,-0.231086f, +0.114996f,0.92781f,-0.354886f, +0.243157f,0.920361f,-0.306286f, +0.181493f,0.943785f,-0.27628f, +-0.0348676f,0.964621f,-0.261325f, +-0.138397f,0.964431f,-0.225208f, +-0.0584572f,0.973863f,-0.219483f, +-0.160488f,0.904663f,-0.394751f, +-0.113572f,0.901558f,-0.417487f, +-0.155065f,0.923521f,-0.350803f, +-0.242307f,0.919914f,-0.308295f, +-0.206106f,0.923371f,-0.323891f, +-0.0753677f,0.972428f,-0.220691f, +0.00286078f,0.993423f,-0.114469f, +0.0506503f,0.998257f,-0.0302924f, +-0.0328546f,0.999299f,0.017926f, +-0.060813f,0.979003f,0.194565f, +-0.19049f,0.94338f,0.271567f, +-0.332962f,0.885593f,0.323821f, +-0.330466f,0.869145f,0.367938f, +-0.383415f,0.840587f,0.382632f, +-0.450848f,0.795155f,0.405542f, +-0.50223f,0.7918f,0.347589f, +-0.586371f,0.768822f,0.255112f, +-0.550176f,0.765625f,0.333355f, +-0.594581f,0.747662f,0.295761f, +-0.604774f,0.771025f,0.199423f, +-0.461798f,0.840354f,0.283809f, +-0.323989f,0.875237f,0.359155f, +-0.321766f,0.916629f,0.23719f, +-0.168943f,0.967667f,0.187293f, +-0.107108f,0.976625f,0.186366f, +-0.222921f,0.963011f,0.151379f, +-0.142187f,0.985732f,0.0900906f, +-0.0555822f,0.997373f,-0.0464466f, +-0.00128055f,0.995901f,-0.0904418f, +0.189226f,0.980362f,-0.0555288f, +0.085267f,0.996327f,-0.00782177f, +-0.128918f,0.990746f,0.042464f, +-0.188312f,0.982054f,-0.0104463f, +-0.196136f,0.979449f,-0.0470074f, +-0.346836f,0.935484f,-0.0676365f, +-0.385817f,0.920741f,-0.0581445f, +-0.364523f,0.930255f,-0.0418259f, +-0.413227f,0.910109f,-0.0307546f, +-0.395357f,0.915702f,-0.071985f, +-0.249105f,0.966325f,-0.0645241f, +-0.224404f,0.97132f,-0.0786097f, +-0.136636f,0.989057f,-0.0556425f, +-0.161967f,0.98357f,-0.0797312f, +-0.264069f,0.956689f,-0.122532f, +-0.415862f,0.909427f,-0.00117779f, +-0.618635f,0.784039f,0.0507281f, +-0.569525f,0.818988f,-0.0700017f, +-0.458442f,0.876243f,-0.148424f, +-0.301532f,0.936403f,-0.179521f, +-0.125352f,0.969963f,-0.208469f, +-0.0885456f,0.971015f,-0.222014f, +-0.127345f,0.96169f,-0.242765f, +-0.111865f,0.95953f,-0.258434f, +-0.00408963f,0.957803f,-0.287396f, +0.0423217f,0.932535f,-0.358592f, +0.0695614f,0.921939f,-0.381037f, +0.190852f,0.890613f,-0.412775f, +0.209386f,0.879353f,-0.427663f, +0.178912f,0.925963f,-0.332541f, +0.21012f,0.943847f,-0.254954f, +0.194248f,0.92787f,-0.318316f, +0.12116f,0.941808f,-0.313556f, +0.143074f,0.982238f,-0.121399f, +0.00445755f,0.990826f,-0.135068f, +-0.0763662f,0.964673f,-0.252139f, +-0.00960064f,0.938734f,-0.34451f, +-0.0448775f,0.923487f,-0.380997f, +-0.121038f,0.899958f,-0.418839f, +-0.214432f,0.896136f,-0.388536f, +-0.236628f,0.909444f,-0.341933f, +-0.245801f,0.902665f,-0.353239f, +-0.210816f,0.938091f,-0.274848f, +-0.0790665f,0.981118f,-0.17651f, +-0.0418777f,0.998086f,-0.0455073f, +-0.112513f,0.981903f,0.152339f, +-0.289647f,0.921573f,0.258473f, +-0.276284f,0.866929f,0.414851f, +-0.316808f,0.857367f,0.405653f, +-0.333206f,0.853137f,0.401412f, +-0.396081f,0.828088f,0.396725f, +-0.485909f,0.809843f,0.328705f, +-0.463328f,0.813789f,0.350819f, +-0.520203f,0.774122f,0.360725f, +-0.581754f,0.763678f,0.279925f, +-0.55781f,0.791203f,0.250691f, +-0.576356f,0.800103f,0.166282f, +-0.522214f,0.839566f,0.149738f, +-0.327667f,0.934488f,0.139166f, +-0.239893f,0.965369f,0.102537f, +-0.178401f,0.973537f,0.142826f, +-0.0446164f,0.980327f,0.192274f, +-0.152707f,0.98769f,0.0338934f, +-0.061376f,0.996098f,-0.0634113f, +-0.00816896f,0.988579f,-0.150483f, +0.0167009f,0.992551f,-0.120678f, +0.148875f,0.988771f,-0.0129578f, +0.0273451f,0.999626f,0.000950796f, +-0.109359f,0.99398f,0.00672756f, +-0.162948f,0.982686f,-0.0881845f, +-0.242271f,0.966262f,-0.0874275f, +-0.357996f,0.933723f,0.000140943f, +-0.377863f,0.925289f,0.0325572f, +-0.389424f,0.920391f,0.0350616f, +-0.408888f,0.910343f,0.0639282f, +-0.371945f,0.928232f,0.00649489f, +-0.230632f,0.97289f,0.0171594f, +-0.159091f,0.987197f,-0.0114848f, +-0.122759f,0.984183f,-0.127724f, +-0.175251f,0.974473f,-0.14032f, +-0.35571f,0.933079f,-0.0532364f, +-0.501387f,0.863164f,0.0596562f, +-0.575441f,0.816492f,-0.0470046f, +-0.501056f,0.856673f,-0.122698f, +-0.414992f,0.888139f,-0.19746f, +-0.309585f,0.914677f,-0.259854f, +-0.0986663f,0.965073f,-0.242693f, +-0.0576728f,0.965088f,-0.255499f, +-0.0928316f,0.963296f,-0.251879f, +-0.0710107f,0.944633f,-0.320352f, +0.0799711f,0.918771f,-0.386606f, +0.0834923f,0.89273f,-0.442789f, +0.0521243f,0.897343f,-0.438246f, +0.251171f,0.890827f,-0.378604f, +0.176541f,0.892631f,-0.414781f, +0.102505f,0.91423f,-0.392015f, +0.148543f,0.910792f,-0.385219f, +0.204336f,0.92739f,-0.313361f, +0.00672261f,0.969577f,-0.244696f, +-0.0203828f,0.994006f,-0.10741f, +0.0984818f,0.994155f,-0.0442492f, +0.0884297f,0.979853f,-0.179077f, +0.079756f,0.934869f,-0.345919f, +-0.0373135f,0.916973f,-0.3972f, +-0.13475f,0.922044f,-0.362873f, +-0.248554f,0.90561f,-0.343645f, +-0.298871f,0.900649f,-0.315447f, +-0.245556f,0.942684f,-0.225941f, +-0.29156f,0.92569f,-0.241018f, +-0.210251f,0.966564f,-0.146796f, +-0.258034f,0.965595f,0.0323199f, +-0.368176f,0.902709f,0.22263f, +-0.350064f,0.851117f,0.391223f, +-0.273287f,0.858969f,0.432996f, +-0.285306f,0.881397f,0.376483f, +-0.391023f,0.856564f,0.336748f, +-0.346592f,0.838969f,0.419529f, +-0.422742f,0.829366f,0.365295f, +-0.513303f,0.775065f,0.368504f, +-0.526999f,0.742246f,0.413935f, +-0.485934f,0.782442f,0.389426f, +-0.494091f,0.808005f,0.32094f, +-0.527377f,0.820007f,0.222402f, +-0.463863f,0.878834f,0.111725f, +-0.310302f,0.94881f,0.0589178f, +-0.228025f,0.964645f,0.132153f, +-0.25901f,0.96255f,0.080067f, +-0.0424596f,0.997867f,0.0495831f, +-0.00646979f,0.998786f,0.048831f, +0.0235108f,0.999153f,0.033786f, +0.0350773f,0.999112f,0.0233587f, +-0.06489f,0.99782f,0.0120079f, +0.0653571f,0.99589f,0.0626978f, +0.0437681f,0.989758f,0.13588f, +-0.0612591f,0.992124f,0.109253f, +-0.0700659f,0.993846f,0.085792f, +-0.245254f,0.968292f,0.0475526f, +-0.425333f,0.903383f,0.0546907f, +-0.406557f,0.90921f,0.0897132f, +-0.40303f,0.911526f,0.0817765f, +-0.380881f,0.92142f,0.0769048f, +-0.320213f,0.947262f,0.0126033f, +-0.2583f,0.964583f,-0.0534921f, +-0.102892f,0.993091f,-0.0564197f, +-0.0482689f,0.996133f,-0.0734163f, +-0.214829f,0.976629f,0.00662477f, +-0.431775f,0.896672f,0.0977224f, +-0.451215f,0.886255f,0.104672f, +-0.522087f,0.848838f,-0.0830587f, +-0.458286f,0.880944f,-0.117949f, +-0.338524f,0.917937f,-0.206865f, +-0.285281f,0.916752f,-0.279607f, +-0.142352f,0.962006f,-0.232982f, +-0.0943041f,0.983891f,-0.151875f, +-0.0753867f,0.988192f,-0.133394f, +0.0592214f,0.975378f,-0.212437f, +0.135178f,0.93923f,-0.315553f, +0.146098f,0.928461f,-0.34149f, +0.0154593f,0.901088f,-0.433361f, +0.163565f,0.906515f,-0.389201f, +0.204593f,0.933049f,-0.295907f, +0.124274f,0.938076f,-0.323371f, +0.137407f,0.92485f,-0.354642f, +0.063168f,0.960879f,-0.269671f, +-0.0720239f,0.98835f,-0.134077f, +-0.0757271f,0.981006f,-0.178587f, +0.0897227f,0.968994f,-0.23022f, +0.219073f,0.948381f,-0.229303f, +0.192275f,0.938149f,-0.287936f, +-0.0492263f,0.973953f,-0.221343f, +-0.181885f,0.971294f,-0.153316f, +-0.242476f,0.960686f,-0.135229f, +-0.363624f,0.917475f,-0.161301f, +-0.330978f,0.935565f,-0.12317f, +-0.30439f,0.949195f,-0.0798413f, +-0.362853f,0.931339f,-0.0307322f, +-0.401675f,0.903644f,0.148607f, +-0.425736f,0.872787f,0.238731f, +-0.458216f,0.866256f,0.199096f, +-0.325646f,0.913769f,0.242862f, +-0.214745f,0.922085f,0.321938f, +-0.398463f,0.884492f,0.242694f, +-0.475038f,0.830832f,0.289927f, +-0.448294f,0.764081f,0.463909f, +-0.497042f,0.7065f,0.503792f, +-0.489906f,0.735868f,0.467431f, +-0.460921f,0.76339f,0.452535f, +-0.40897f,0.781052f,0.471913f, +-0.371818f,0.839399f,0.396435f, +-0.326758f,0.904742f,0.27326f, +-0.383198f,0.91056f,0.155045f, +-0.284609f,0.924825f,0.252383f, +-0.0749114f,0.976737f,0.200932f, +0.00799324f,0.997093f,0.0757729f, +-0.0700844f,0.990942f,0.114551f, +-0.0596966f,0.983848f,0.168758f, +0.00586433f,0.977052f,0.212922f, +-0.0605914f,0.978841f,0.195443f, +-0.0438257f,0.995801f,0.0803703f, +-0.0570689f,0.993344f,0.100052f, +-0.0606116f,0.987839f,0.143177f, +-0.0960986f,0.983658f,0.152253f, +-0.240218f,0.956553f,0.16523f, +-0.410215f,0.902731f,0.129617f, +-0.38596f,0.917352f,0.0974681f, +-0.348531f,0.935694f,0.0547901f, +-0.396424f,0.918039f,-0.00721866f, +-0.26358f,0.961512f,0.0775866f, +-0.177577f,0.982975f,0.0471779f, +-0.0921077f,0.995708f,0.00907831f, +-0.131805f,0.991186f,0.0133294f, +-0.348565f,0.935587f,0.0563885f, +-0.467549f,0.880933f,0.0731775f, +-0.372581f,0.926945f,0.0442312f, +-0.408929f,0.911847f,-0.0362219f, +-0.445009f,0.893478f,-0.0605312f, +-0.306432f,0.951885f,-0.00384437f, +-0.259351f,0.965029f,0.0381644f, +-0.265204f,0.963994f,-0.0195798f, +-0.114808f,0.993343f,0.00942441f, +-0.0279481f,0.990324f,-0.135929f, +0.103339f,0.977655f,-0.18306f, +0.218767f,0.966894f,-0.131368f, +0.207579f,0.958824f,-0.193824f, +0.136905f,0.960239f,-0.243308f, +0.117272f,0.934734f,-0.335438f, +0.133403f,0.937193f,-0.322294f, +0.140113f,0.948531f,-0.284001f, +0.0924439f,0.975124f,-0.201463f, +-0.0405443f,0.993271f,-0.108481f, +-0.0729426f,0.987394f,-0.140474f, +0.0307633f,0.972795f,-0.229615f, +0.200951f,0.951021f,-0.2349f, +0.206873f,0.91785f,-0.338755f, +0.0409109f,0.957201f,-0.286518f, +-0.211311f,0.976629f,-0.0392802f, +-0.256735f,0.961768f,0.0953371f, +-0.237528f,0.960421f,0.145504f, +-0.329105f,0.937835f,0.110248f, +-0.355083f,0.930437f,0.0905737f, +-0.33751f,0.931415f,0.13621f, +-0.400013f,0.905919f,0.138928f, +-0.505595f,0.854442f,0.119596f, +-0.452675f,0.873473f,0.179247f, +-0.360085f,0.917004f,0.17159f, +-0.404496f,0.910531f,0.0855373f, +-0.324231f,0.903855f,0.279141f, +-0.336075f,0.852068f,0.40129f, +-0.562491f,0.75864f,0.328737f, +-0.580482f,0.703244f,0.410473f, +-0.499356f,0.747889f,0.437385f, +-0.47057f,0.77436f,0.423001f, +-0.457721f,0.780273f,0.426221f, +-0.387043f,0.830428f,0.400733f, +-0.304454f,0.882516f,0.358431f, +-0.240482f,0.915056f,0.323791f, +-0.289179f,0.919765f,0.265345f, +-0.239541f,0.954664f,0.176742f, +-0.0468358f,0.993768f,0.10115f, +-0.0227943f,0.987776f,0.154204f, +-0.112093f,0.964309f,0.239881f, +-0.0599845f,0.969963f,0.235741f, +0.0387578f,0.968143f,0.24738f, +0.0187191f,0.971458f,0.236471f, +0.242021f,0.896343f,0.371478f, +0.0480335f,0.972296f,0.228765f, +-0.0779729f,0.986176f,0.146206f, +-0.0941394f,0.982277f,0.16208f, +-0.22083f,0.962927f,0.154936f, +-0.380194f,0.918443f,0.109152f, +-0.362825f,0.928988f,0.0730715f, +-0.322334f,0.943799f,0.0731113f, +-0.408658f,0.905696f,0.112752f, +-0.342623f,0.91378f,0.218209f, +-0.178962f,0.947287f,0.265744f, +-0.0963031f,0.962264f,0.254507f, +-0.129686f,0.959928f,0.248434f, +-0.25861f,0.932715f,0.251325f, +-0.400538f,0.911394f,0.0944958f, +-0.371118f,0.928542f,0.00899351f, +-0.395096f,0.916517f,0.0624194f, +-0.492959f,0.864551f,0.097688f, +-0.425957f,0.892844f,0.146255f, +-0.256791f,0.9425f,0.213898f, +-0.177422f,0.976398f,0.123157f, +0.0269208f,0.996881f,0.0741829f, +0.164645f,0.980831f,-0.104223f, +0.0973784f,0.963273f,-0.250244f, +0.114359f,0.965463f,-0.234102f, +0.250084f,0.96398f,-0.0905583f, +0.183861f,0.973241f,-0.137829f, +0.203921f,0.957737f,-0.202868f, +0.170155f,0.95208f,-0.254149f, +0.0373443f,0.963666f,-0.264487f, +-0.0311132f,0.98854f,-0.147717f, +-0.0500681f,0.990616f,-0.127173f, +0.0774781f,0.980584f,-0.180143f, +0.0416659f,0.952342f,-0.302174f, +0.183971f,0.945491f,-0.268702f, +0.234504f,0.932825f,-0.27358f, +-0.0611848f,0.988685f,-0.13696f, +-0.37387f,0.925543f,-0.059925f, +-0.361069f,0.932447f,-0.0130774f, +-0.247932f,0.961796f,0.1161f, +-0.321909f,0.940217f,0.111206f, +-0.373794f,0.915694f,0.147587f, +-0.370927f,0.915202f,0.157537f, +-0.367344f,0.908177f,0.20068f, +-0.445687f,0.879826f,0.165134f, +-0.480845f,0.872838f,0.0833169f, +-0.396228f,0.900984f,0.176722f, +-0.39533f,0.870559f,0.292987f, +-0.514705f,0.791717f,0.329034f, +-0.426478f,0.754312f,0.49913f, +-0.476928f,0.731476f,0.487321f, +-0.555203f,0.748777f,0.362053f, +-0.513793f,0.811828f,0.277402f, +-0.498737f,0.823176f,0.271372f, +-0.459197f,0.851815f,0.252089f, +-0.364638f,0.907849f,0.207f, +-0.280535f,0.937686f,0.205051f, +-0.204645f,0.959273f,0.194721f, +-0.188424f,0.978285f,0.0863425f, +-0.16576f,0.97773f,-0.128717f, +-0.0413953f,0.984504f,-0.170405f, +-0.119175f,0.989154f,-0.0858603f, +-0.164393f,0.986215f,0.018821f, +-0.0876541f,0.994439f,0.0583851f, +-0.00781607f,0.987179f,0.159428f, +-0.00608226f,0.980142f,0.198203f, +0.294056f,0.919888f,0.259494f, +0.176099f,0.946212f,0.271426f, +-0.0256669f,0.973237f,0.228366f, +-0.0934761f,0.978631f,0.183149f, +-0.211202f,0.968374f,0.132837f, +-0.345036f,0.933287f,0.0996237f, +-0.346043f,0.935088f,0.0765773f, +-0.381385f,0.918419f,0.105127f, +-0.476923f,0.857096f,0.19476f, +-0.397907f,0.88874f,0.227622f, +-0.175271f,0.936954f,0.30232f, +-0.040477f,0.944541f,0.325889f, +-0.142418f,0.942444f,0.302518f, +-0.246569f,0.91514f,0.318938f, +-0.255277f,0.933873f,0.25043f, +-0.348488f,0.92941f,0.121466f, +-0.472178f,0.874219f,0.113089f, +-0.490306f,0.858256f,0.151645f, +-0.38804f,0.914553f,0.114097f, +-0.196584f,0.979051f,0.0530513f, +-0.0793551f,0.996572f,-0.0234008f, +0.0406197f,0.994776f,-0.0936505f, +0.24653f,0.966821f,-0.0669378f, +0.269235f,0.959692f,-0.0806517f, +0.0569112f,0.963296f,-0.26234f, +0.131503f,0.973945f,-0.184764f, +0.24729f,0.957434f,-0.148892f, +0.248779f,0.951221f,-0.18245f, +0.18718f,0.966303f,-0.176696f, +0.00607471f,0.977895f,-0.20901f, +-0.0210706f,0.975074f,-0.220878f, +0.00501251f,0.949574f,-0.313502f, +0.0771251f,0.945518f,-0.316304f, +0.130553f,0.948445f,-0.288805f, +0.175519f,0.929764f,-0.323623f, +0.111769f,0.971665f,-0.208266f, +-0.210844f,0.971563f,-0.107753f, +-0.345299f,0.9344f,-0.087551f, +-0.367127f,0.918607f,-0.146212f, +-0.340753f,0.929779f,-0.139279f, +-0.358585f,0.929839f,-0.0825605f, +-0.393886f,0.919008f,-0.0166963f, +-0.401193f,0.915983f,0.00451588f, +-0.406108f,0.91192f,0.0589777f, +-0.45609f,0.887954f,0.0593294f, +-0.481921f,0.86351f,0.148669f, +-0.533578f,0.80576f,0.256994f, +-0.480795f,0.753832f,0.447854f, +-0.502576f,0.721353f,0.476516f, +-0.457582f,0.746697f,0.482766f, +-0.419108f,0.791496f,0.44484f, +-0.465376f,0.834036f,0.296325f, +-0.468919f,0.860429f,0.199442f, +-0.486627f,0.858618f,0.161151f, +-0.430227f,0.89524f,0.115972f, +-0.34028f,0.937953f,0.066739f, +-0.311486f,0.949765f,0.0303886f, +-0.166884f,0.985403f,0.0336267f, +0.0381647f,0.996782f,-0.0704869f, +0.0486826f,0.951753f,-0.302979f, +-0.0940893f,0.932244f,-0.349383f, +-0.229015f,0.944857f,-0.234089f, +-0.214421f,0.956596f,-0.19735f, +-0.17466f,0.962579f,-0.207209f, +-0.106663f,0.986513f,-0.124157f, +-0.0523564f,0.993983f,-0.0962102f, +0.1751f,0.970986f,0.162867f, +0.126838f,0.957099f,0.260524f, +-0.0248407f,0.948904f,0.314587f, +-0.0169284f,0.94527f,0.325849f, +-0.126002f,0.963121f,0.237743f, +-0.322368f,0.933961f,0.154262f, +-0.357267f,0.920847f,0.156206f, +-0.40825f,0.900639f,0.148934f, +-0.500408f,0.86145f,0.0865774f, +-0.437173f,0.895731f,0.0809122f, +-0.234862f,0.957423f,0.167871f, +-0.122112f,0.971133f,0.204913f, +-0.146988f,0.949325f,0.277805f, +-0.214866f,0.947227f,0.237893f, +-0.166781f,0.968529f,0.184757f, +-0.279132f,0.953637f,0.112522f, +-0.438908f,0.892826f,0.101101f, +-0.476448f,0.878957f,0.0207741f, +-0.317496f,0.946313f,-0.0607282f, +-0.175675f,0.968847f,-0.174568f, +0.00443594f,0.981128f,-0.193308f, +0.0639918f,0.955901f,-0.286634f, +0.156615f,0.959233f,-0.235253f, +0.281138f,0.953388f,-0.109604f, +0.173642f,0.975105f,-0.137905f, +0.125725f,0.970112f,-0.207546f, +0.23259f,0.936622f,-0.261996f, +0.234534f,0.938208f,-0.25448f, +0.160485f,0.952598f,-0.258459f, +0.0824642f,0.968528f,-0.234849f, +0.0634583f,0.946763f,-0.315614f, +0.0567562f,0.917557f,-0.393532f, +0.0240187f,0.918352f,-0.395035f, +0.0995244f,0.946786f,-0.30609f, +0.0782245f,0.971194f,-0.225085f, +0.0104903f,0.995647f,-0.0926114f, +-0.185802f,0.976721f,-0.107212f, +-0.328502f,0.923412f,-0.198486f, +-0.311331f,0.92975f,-0.196566f, +-0.349149f,0.904891f,-0.24345f, +-0.388436f,0.90322f,-0.182515f, +-0.447323f,0.88531f,-0.126995f, +-0.452109f,0.890067f,-0.0581177f, +-0.409043f,0.912515f,0.000312055f, +-0.489105f,0.872225f,-0.000401423f, +-0.602394f,0.789815f,0.115381f, +-0.644891f,0.727938f,0.232857f, +-0.581256f,0.729671f,0.360168f, +-0.503025f,0.763549f,0.404917f, +-0.449741f,0.833702f,0.320428f, +-0.320295f,0.891402f,0.320645f, +-0.365897f,0.908793f,0.200535f, +-0.418513f,0.900509f,0.118029f, +-0.464312f,0.883882f,0.0562756f, +-0.399182f,0.916811f,0.0105308f, +-0.291715f,0.956056f,-0.0293054f, +-0.237447f,0.965751f,-0.104617f, +-0.100041f,0.966568f,-0.236091f, +0.160871f,0.934989f,-0.316096f, +0.093049f,0.931221f,-0.352375f, +-0.15859f,0.964926f,-0.209204f, +-0.273524f,0.944194f,-0.183526f, +-0.190425f,0.948278f,-0.253984f, +-0.130985f,0.95529f,-0.265074f, +-0.109109f,0.943759f,-0.312112f, +-0.0442587f,0.936376f,-0.348197f, +0.0244075f,0.991066f,0.131121f, +-0.0145509f,0.975134f,0.221137f, +-0.0404534f,0.947565f,0.316994f, +-0.0554847f,0.953641f,0.295787f, +-0.0378486f,0.926136f,0.375287f, +-0.276884f,0.909741f,0.309364f, +-0.35531f,0.878584f,0.319132f, +-0.28855f,0.905318f,0.311668f, +-0.418654f,0.900829f,0.115051f, +-0.470621f,0.881923f,0.0269622f, +-0.302456f,0.950707f,0.0683814f, +-0.155931f,0.981097f,0.114601f, +-0.172528f,0.971746f,0.161072f, +-0.175279f,0.972437f,0.153763f, +-0.0948884f,0.989506f,0.108971f, +-0.271832f,0.96203f,0.0246161f, +-0.434113f,0.899816f,0.0433328f, +-0.41192f,0.910729f,-0.0299284f, +-0.184465f,0.976107f,-0.114836f, +-0.0519711f,0.950434f,-0.306552f, +0.0510061f,0.914254f,-0.401918f, +0.0714878f,0.915457f,-0.396015f, +0.0823148f,0.944294f,-0.318643f, +0.154376f,0.938672f,-0.308322f, +0.218285f,0.948145f,-0.231024f, +0.158935f,0.938404f,-0.306818f, +0.261223f,0.9329f,-0.247912f, +0.285998f,0.932056f,-0.222434f, +0.190198f,0.913869f,-0.358703f, +0.0636773f,0.892218f,-0.447094f, +0.10205f,0.889697f,-0.445f, +0.100031f,0.900986f,-0.422159f, +0.0104969f,0.905423f,-0.424381f, +-0.0688464f,0.910262f,-0.408268f, +-0.0482237f,0.974352f,-0.219802f, +-0.0083558f,0.994225f,-0.106992f, +-0.112134f,0.979056f,-0.169927f, +-0.229912f,0.945374f,-0.231102f, +-0.280533f,0.899591f,-0.334719f, +-0.346884f,0.867971f,-0.355384f, +-0.459064f,0.843199f,-0.279779f, +-0.497889f,0.848119f,-0.181111f, +-0.501207f,0.860371f,-0.0924901f, +-0.458162f,0.888868f,-0.00122281f, +-0.514613f,0.855463f,0.0579275f, +-0.647763f,0.760835f,0.0391491f, +-0.704753f,0.709026f,0.0246046f, +-0.656653f,0.750377f,0.0757771f, +-0.504188f,0.854115f,0.127601f, +-0.41033f,0.905141f,0.111126f, +-0.337511f,0.936543f,0.0947305f, +-0.307169f,0.946112f,0.10256f, +-0.367429f,0.928128f,0.0597776f, +-0.393986f,0.91872f,-0.0269814f, +-0.373766f,0.918684f,-0.127743f, +-0.26114f,0.960116f,-0.0999132f, +-0.103927f,0.984722f,-0.139723f, +0.0511518f,0.955672f,-0.289956f, +0.187205f,0.928701f,-0.320109f, +-0.0295799f,0.970029f,-0.241182f, +-0.314429f,0.940081f,-0.13184f, +-0.185337f,0.978913f,-0.0859053f, +-0.104364f,0.967564f,-0.230061f, +-0.0895833f,0.932754f,-0.349206f, +-0.054587f,0.891296f,-0.450124f, +0.0297567f,0.885691f,-0.463321f, +0.100841f,0.951386f,0.291024f, +-0.0719364f,0.970866f,0.22857f, +-0.0950354f,0.957535f,0.272204f, +-0.063148f,0.9475f,0.313457f, +-0.147905f,0.922206f,0.357295f, +-0.255052f,0.862392f,0.437296f, +-0.348295f,0.831026f,0.433689f, +-0.228735f,0.861593f,0.453141f, +-0.189137f,0.904176f,0.383004f, +-0.40614f,0.912877f,0.041313f, +-0.322035f,0.946605f,-0.0152552f, +-0.213289f,0.976152f,0.0404333f, +-0.216957f,0.96919f,0.116619f, +-0.143471f,0.982181f,0.121395f, +-0.0619809f,0.995307f,0.0743149f, +-0.20303f,0.975599f,0.0835793f, +-0.415979f,0.909172f,0.0191678f, +-0.336954f,0.94062f,-0.0411873f, +-0.0679584f,0.981162f,-0.180839f, +0.116786f,0.956914f,-0.265849f, +0.119526f,0.96094f,-0.249616f, +-0.00488697f,0.95735f,-0.288889f, +0.0539017f,0.947486f,-0.315223f, +0.147321f,0.922615f,-0.35648f, +0.255572f,0.910786f,-0.324272f, +0.156463f,0.885962f,-0.436566f, +0.1301f,0.92297f,-0.362215f, +0.25276f,0.923086f,-0.289871f, +0.383737f,0.889757f,-0.247141f, +0.211205f,0.883014f,-0.419141f, +0.0342331f,0.879599f,-0.474482f, +0.00319575f,0.938694f,-0.344735f, +0.0177214f,0.953292f,-0.301529f, +-0.111253f,0.93857f,-0.326663f, +-0.240335f,0.933381f,-0.26653f, +-0.0538188f,0.987001f,-0.151433f, +-0.0274864f,0.979377f,-0.200162f, +-0.187631f,0.946384f,-0.262966f, +-0.206926f,0.955659f,-0.209519f, +-0.334901f,0.924406f,-0.182523f, +-0.500035f,0.842333f,-0.201099f, +-0.536058f,0.812568f,-0.228857f, +-0.57838f,0.789021f,-0.207176f, +-0.551453f,0.831854f,-0.0625953f, +-0.537806f,0.840551f,0.0651045f, +-0.581123f,0.812541f,0.0455343f, +-0.677773f,0.725811f,-0.117567f, +-0.674512f,0.726391f,-0.131871f, +-0.561194f,0.823313f,-0.0849523f, +-0.426155f,0.904036f,-0.0333265f, +-0.350057f,0.935877f,-0.0399208f, +-0.324764f,0.94579f,-0.0029281f, +-0.334572f,0.942069f,0.0238272f, +-0.264187f,0.96401f,-0.0298196f, +-0.331302f,0.926674f,-0.177522f, +-0.297768f,0.937944f,-0.177749f, +-0.0551409f,0.983889f,-0.170067f, +0.144484f,0.972505f,-0.182644f, +0.119335f,0.96645f,-0.227451f, +-0.0885992f,0.982619f,-0.163126f, +-0.33707f,0.92576f,-0.171324f, +-0.162854f,0.966557f,-0.198108f, +0.0162126f,0.974218f,-0.225026f, +0.138436f,0.947057f,-0.289688f, +0.0835536f,0.876982f,-0.473204f, +-0.010237f,0.848096f,-0.529743f, +0.136921f,0.906371f,0.399681f, +0.0140824f,0.922185f,0.386492f, +-0.160268f,0.929321f,0.33268f, +-0.112451f,0.900092f,0.420938f, +-0.203296f,0.876433f,0.436504f, +-0.322996f,0.829667f,0.455332f, +-0.340765f,0.827757f,0.445755f, +-0.257344f,0.84669f,0.465715f, +0.00366351f,0.865541f,0.500825f, +-0.0425812f,0.956742f,0.287804f, +-0.322344f,0.945159f,-0.052618f, +-0.280797f,0.958795f,-0.0431994f, +-0.262333f,0.964629f,-0.0259446f, +-0.0891831f,0.995449f,-0.0335709f, +-0.0801038f,0.992742f,-0.0896982f, +-0.224206f,0.974484f,0.0105758f, +-0.364477f,0.9309f,-0.0241328f, +-0.198506f,0.970273f,-0.138443f, +0.0492304f,0.955815f,-0.289816f, +0.0465241f,0.961334f,-0.271428f, +0.0147498f,0.993644f,-0.111598f, +0.136409f,0.989222f,-0.0532271f, +0.148553f,0.957532f,-0.247113f, +0.203722f,0.927854f,-0.312384f, +0.268253f,0.883803f,-0.383317f, +0.18614f,0.887058f,-0.422469f, +0.10218f,0.907566f,-0.407286f, +0.200645f,0.878358f,-0.433854f, +0.320433f,0.870875f,-0.372692f, +0.278243f,0.911383f,-0.303252f, +-0.0169368f,0.97379f,-0.226818f, +-0.116502f,0.978925f,-0.16773f, +0.0246686f,0.985931f,-0.165321f, +-0.099417f,0.977857f,-0.184152f, +-0.275352f,0.945128f,-0.175824f, +-0.0928967f,0.974055f,-0.206368f, +0.0664566f,0.97817f,-0.196893f, +-0.180659f,0.959555f,-0.21591f, +-0.356529f,0.924348f,-0.135896f, +-0.392702f,0.919607f,0.0104344f, +-0.427591f,0.903919f,-0.00980201f, +-0.491673f,0.851131f,-0.183941f, +-0.597871f,0.779934f,-0.185076f, +-0.630214f,0.771159f,-0.0902474f, +-0.603795f,0.796392f,-0.0345128f, +-0.532942f,0.846043f,0.013577f, +-0.560658f,0.826581f,-0.049261f, +-0.693149f,0.692482f,-0.200033f, +-0.591049f,0.792583f,-0.14991f, +-0.423413f,0.894971f,-0.14053f, +-0.360923f,0.922234f,-0.138633f, +-0.376728f,0.924323f,-0.0608465f, +-0.330964f,0.94352f,-0.0152562f, +-0.205049f,0.976512f,-0.0661789f, +-0.221147f,0.966952f,-0.126878f, +-0.282753f,0.933366f,-0.221083f, +-0.0599842f,0.959615f,-0.274846f, +0.119046f,0.947951f,-0.295324f, +0.164559f,0.948383f,-0.27109f, +-0.0951076f,0.948417f,-0.302424f, +-0.271887f,0.913351f,-0.303098f, +-0.128933f,0.917201f,-0.376985f, +0.0280066f,0.909443f,-0.414885f, +0.150608f,0.898143f,-0.413106f, +0.212115f,0.88838f,-0.407172f, +0.0467869f,0.87371f,-0.484191f, +0.135605f,0.903203f,0.407228f, +-0.01172f,0.896648f,0.44259f, +-0.138887f,0.847422f,0.512432f, +-0.170991f,0.843044f,0.50994f, +-0.191878f,0.839246f,0.508772f, +-0.300268f,0.838171f,0.455311f, +-0.32966f,0.831286f,0.447535f, +-0.223175f,0.877254f,0.424992f, +-0.0256774f,0.953915f,0.298977f, +0.199545f,0.913698f,0.354031f, +-0.0319727f,0.980881f,0.191963f, +-0.258985f,0.964126f,-0.0582107f, +-0.212788f,0.970943f,-0.109502f, +-0.0721792f,0.982085f,-0.174064f, +-0.0849627f,0.985898f,-0.144175f, +-0.290021f,0.949136f,-0.122591f, +-0.248272f,0.954348f,-0.166075f, +-0.0507313f,0.942327f,-0.330828f, +0.0792104f,0.910775f,-0.405234f, +-0.0679775f,0.927432f,-0.367762f, +-0.0963141f,0.945938f,-0.309718f, +0.147422f,0.952479f,-0.266555f, +0.232988f,0.930423f,-0.282895f, +0.296671f,0.921407f,-0.250989f, +0.346023f,0.880014f,-0.325337f, +0.246011f,0.893818f,-0.374924f, +0.0779935f,0.862828f,-0.499444f, +0.218748f,0.861753f,-0.457746f, +0.236169f,0.890523f,-0.388836f, +0.122215f,0.968128f,-0.218613f, +-0.119249f,0.983741f,-0.134288f, +-0.0975043f,0.983669f,-0.151287f, +0.0551556f,0.975975f,-0.210786f, +-0.0858442f,0.972611f,-0.216008f, +-0.228301f,0.939116f,-0.256789f, +-0.0600278f,0.94195f,-0.330342f, +-0.00498162f,0.954835f,-0.297095f, +-0.236752f,0.956732f,-0.169151f, +-0.404481f,0.905728f,-0.126698f, +-0.442956f,0.884106f,-0.148815f, +-0.353117f,0.929811f,-0.103732f, +-0.367684f,0.920274f,-0.133808f, +-0.620195f,0.758926f,-0.19847f, +-0.650875f,0.742352f,-0.158981f, +-0.60395f,0.783223f,-0.147668f, +-0.562027f,0.815077f,-0.140626f, +-0.504739f,0.855197f,-0.117796f, +-0.629314f,0.743816f,-0.22517f, +-0.590837f,0.750634f,-0.295736f, +-0.432954f,0.842346f,-0.320942f, +-0.414184f,0.8722f,-0.260227f, +-0.438355f,0.884876f,-0.157606f, +-0.309198f,0.940747f,-0.13925f, +-0.155389f,0.967122f,-0.20132f, +-0.14424f,0.961525f,-0.233805f, +-0.235758f,0.924f,-0.301067f, +0.0151186f,0.960375f,-0.278299f, +0.144315f,0.944571f,-0.294888f, +0.112415f,0.964242f,-0.239999f, +-0.0426025f,0.977992f,-0.204249f, +-0.206795f,0.910666f,-0.357663f, +-0.0742651f,0.885367f,-0.458922f, +0.0946583f,0.875247f,-0.474324f, +0.121834f,0.836586f,-0.534117f, +0.198513f,0.859849f,-0.470374f, +0.17646f,0.872184f,-0.456242f, +0.0304109f,0.916616f,0.39861f, +-0.119037f,0.881644f,0.456655f, +-0.241587f,0.81204f,0.53125f, +-0.146676f,0.796898f,0.586037f, +-0.0991089f,0.808485f,0.580111f, +-0.265015f,0.835696f,0.481019f, +-0.330941f,0.833473f,0.442495f, +-0.0736129f,0.908742f,0.410816f, +0.128357f,0.956244f,0.26291f, +0.135386f,0.977167f,0.163754f, +0.135126f,0.969499f,0.204482f, +-0.0826833f,0.991706f,0.0984031f, +-0.125203f,0.992066f,-0.0113628f, +-0.0793175f,0.988189f,-0.131112f, +-0.135148f,0.988869f,-0.0622353f, +-0.236045f,0.96998f,-0.0584937f, +-0.106098f,0.976702f,-0.186536f, +0.0734477f,0.937214f,-0.340932f, +0.0657813f,0.913127f,-0.402333f, +-0.0656411f,0.925185f,-0.373797f, +-0.0812155f,0.911514f,-0.403169f, +0.138018f,0.895606f,-0.422895f, +0.180346f,0.87052f,-0.457898f, +0.220345f,0.874256f,-0.43258f, +0.337626f,0.867122f,-0.366208f, +0.351448f,0.893332f,-0.280076f, +0.206919f,0.931373f,-0.299548f, +0.143612f,0.950749f,-0.274684f, +0.0388897f,0.972032f,-0.231606f, +-0.0281782f,0.996586f,-0.077599f, +-0.0348963f,0.997716f,-0.0578427f, +-0.0315338f,0.968969f,-0.245163f, +0.0536322f,0.969299f,-0.239965f, +-0.0592746f,0.980608f,-0.186802f, +-0.146447f,0.958871f,-0.243144f, +-0.0489008f,0.966653f,-0.251379f, +-0.0921771f,0.973026f,-0.211482f, +-0.303489f,0.921788f,-0.24125f, +-0.360359f,0.892722f,-0.270533f, +-0.374413f,0.86994f,-0.320965f, +-0.420297f,0.839321f,-0.344805f, +-0.400389f,0.890168f,-0.217463f, +-0.5519f,0.817694f,-0.163655f, +-0.641175f,0.723209f,-0.25664f, +-0.591295f,0.757829f,-0.275801f, +-0.562781f,0.775127f,-0.287152f, +-0.492934f,0.830818f,-0.258375f, +-0.559738f,0.799568f,-0.21768f, +-0.572862f,0.78051f,-0.250266f, +-0.449965f,0.836305f,-0.31325f, +-0.485973f,0.815927f,-0.313197f, +-0.461831f,0.850292f,-0.252418f, +-0.261301f,0.911823f,-0.316702f, +-0.0988633f,0.911184f,-0.399961f, +-0.117544f,0.902602f,-0.414118f, +-0.193385f,0.896249f,-0.399173f, +-0.121448f,0.924471f,-0.361392f, +0.0924319f,0.986306f,-0.136592f, +0.0129691f,0.994218f,-0.106593f, +0.0478938f,0.996018f,-0.0752017f, +0.0322924f,0.95892f,-0.281832f, +0.0176709f,0.880909f,-0.472956f, +0.117774f,0.85642f,-0.502666f, +0.141956f,0.850649f,-0.506206f, +0.133057f,0.865588f,-0.482757f, +0.139695f,0.858438f,-0.493528f, +-0.227309f,0.878161f,0.420907f, +-0.208802f,0.809453f,0.548805f, +-0.283627f,0.767885f,0.574377f, +-0.166581f,0.77975f,0.603523f, +-0.0979994f,0.806409f,0.583181f, +-0.132228f,0.805326f,0.577898f, +-0.219374f,0.878043f,0.425342f, +-0.024745f,0.955845f,0.292828f, +0.235018f,0.923494f,0.303193f, +0.225806f,0.944421f,0.238915f, +0.125193f,0.981151f,0.147203f, +-0.0300197f,0.990754f,0.132305f, +-0.0418198f,0.992604f,0.113964f, +0.010498f,0.998335f,0.0567192f, +-0.187859f,0.981941f,-0.0223995f, +-0.164152f,0.985849f,-0.0340039f, +-0.00148231f,0.989313f,-0.145799f, +0.214865f,0.96059f,-0.176353f, +0.130927f,0.950976f,-0.280185f, +-0.0784848f,0.932131f,-0.353513f, +-0.05291f,0.922588f,-0.382142f, +0.16861f,0.90111f,-0.399463f, +0.291627f,0.864919f,-0.408495f, +0.209787f,0.830907f,-0.515347f, +0.211969f,0.855025f,-0.473287f, +0.179371f,0.927145f,-0.328982f, +0.0938016f,0.98223f,-0.162562f, +0.0948278f,0.994302f,-0.0487031f, +0.0439203f,0.998532f,-0.0316906f, +-0.0612398f,0.9958f,-0.0680553f, +0.0442323f,0.992295f,-0.115732f, +0.0938163f,0.983362f,-0.155559f, +-0.00984882f,0.984434f,-0.175479f, +-0.064778f,0.984002f,-0.165961f, +-0.129271f,0.96358f,-0.234101f, +-0.126642f,0.968315f,-0.215238f, +-0.066296f,0.988071f,-0.138997f, +-0.153283f,0.960153f,-0.233691f, +-0.288259f,0.887225f,-0.360193f, +-0.349196f,0.862768f,-0.365641f, +-0.457337f,0.833523f,-0.309971f, +-0.510223f,0.838902f,-0.189514f, +-0.576482f,0.813491f,-0.0768136f, +-0.627022f,0.773599f,-0.0915885f, +-0.562811f,0.806938f,-0.179152f, +-0.554556f,0.77173f,-0.31129f, +-0.544029f,0.784112f,-0.298665f, +-0.593089f,0.773019f,-0.225135f, +-0.565758f,0.788678f,-0.240633f, +-0.424914f,0.871459f,-0.244963f, +-0.461935f,0.845882f,-0.266647f, +-0.437432f,0.833935f,-0.336461f, +-0.166572f,0.89804f,-0.407159f, +-0.027465f,0.893903f,-0.447419f, +-0.142495f,0.890824f,-0.431426f, +-0.254187f,0.896659f,-0.36248f, +-0.245781f,0.925153f,-0.289282f, +-0.124728f,0.970098f,-0.208211f, +0.0496061f,0.995502f,-0.0807218f, +0.134453f,0.977049f,-0.165221f, +0.178593f,0.948688f,-0.260952f, +0.203783f,0.948389f,-0.242962f, +0.169172f,0.89845f,-0.405178f, +0.129822f,0.855112f,-0.501925f, +0.114157f,0.849198f,-0.515587f, +0.207913f,0.855521f,-0.47419f, +-0.447508f,0.787815f,0.423184f, +-0.372189f,0.752087f,0.543911f, +-0.298757f,0.721076f,0.625135f, +-0.109779f,0.732409f,0.671956f, +-0.05023f,0.773443f,0.631872f, +-0.0721375f,0.784971f,0.615319f, +0.0161123f,0.834678f,0.550503f, +0.0881584f,0.925537f,0.368252f, +0.194291f,0.939133f,0.283338f, +0.290284f,0.915951f,0.277072f, +0.206501f,0.959193f,0.193147f, +0.0129994f,0.989588f,0.143339f, +-0.0515539f,0.993638f,0.100126f, +0.0752528f,0.992857f,0.0925807f, +-0.11243f,0.993659f,-0.00132253f, +-0.0900456f,0.995381f,-0.0332891f, +0.0735618f,0.988585f,-0.131483f, +0.187914f,0.97058f,-0.150539f, +0.259537f,0.959521f,-0.109363f, +0.039582f,0.950958f,-0.306778f, +0.0151247f,0.899216f,-0.437243f, +0.157602f,0.861329f,-0.482984f, +0.313265f,0.852495f,-0.41847f, +0.26241f,0.877515f,-0.401384f, +0.106606f,0.940488f,-0.322671f, +0.0451106f,0.964729f,-0.259351f, +-0.0198008f,0.966294f,-0.256677f, +0.0415355f,0.979836f,-0.195439f, +0.019077f,0.98811f,-0.15256f, +0.00843283f,0.995377f,-0.095676f, +0.0813095f,0.98616f,-0.14449f, +0.0601215f,0.98288f,-0.174159f, +0.0231889f,0.98066f,-0.194342f, +-0.0257967f,0.969536f,-0.243588f, +-0.0655874f,0.972755f,-0.222364f, +-0.116074f,0.960607f,-0.252509f, +-0.11539f,0.952331f,-0.282402f, +-0.0547002f,0.971779f,-0.229464f, +-0.238443f,0.921749f,-0.305817f, +-0.409013f,0.87493f,-0.259242f, +-0.537403f,0.830349f,-0.147369f, +-0.604026f,0.794872f,-0.0577237f, +-0.636334f,0.771366f,0.00856593f, +-0.598176f,0.796287f,0.0900769f, +-0.445184f,0.894265f,0.0458439f, +-0.510078f,0.851049f,-0.124644f, +-0.584904f,0.80616f,-0.0894032f, +-0.566358f,0.809139f,-0.156631f, +-0.526778f,0.78194f,-0.333278f, +-0.411595f,0.815587f,-0.406703f, +-0.430581f,0.806825f,-0.404517f, +-0.346574f,0.828739f,-0.439406f, +-0.163187f,0.84355f,-0.511658f, +-0.120565f,0.900123f,-0.41862f, +-0.22033f,0.94784f,-0.230335f, +-0.354954f,0.922144f,-0.15381f, +-0.229701f,0.962171f,-0.146509f, +-0.156358f,0.938689f,-0.30727f, +-0.0202846f,0.954287f,-0.298202f, +0.237025f,0.938874f,-0.24967f, +0.153523f,0.923965f,-0.350312f, +0.146234f,0.948682f,-0.280389f, +0.334575f,0.915861f,-0.221942f, +0.32488f,0.905199f,-0.273985f, +0.124349f,0.918374f,-0.375668f, +0.0853809f,0.932635f,-0.350575f, +-0.326098f,0.745953f,0.580702f, +-0.408924f,0.742079f,0.53113f, +-0.380928f,0.732802f,0.563822f, +-0.135265f,0.771831f,0.621274f, +0.0172939f,0.791015f,0.611552f, +-0.0321407f,0.821651f,0.569084f, +0.110827f,0.821493f,0.559345f, +0.260047f,0.831043f,0.491674f, +0.30077f,0.882298f,0.362061f, +0.33436f,0.910333f,0.243922f, +0.27591f,0.939307f,0.203903f, +0.0278945f,0.981912f,0.18727f, +-0.00885636f,0.980185f,0.197887f, +0.145141f,0.978135f,0.148949f, +-0.0144219f,0.999761f,0.0164012f, +-0.0725846f,0.989236f,-0.127057f, +0.156537f,0.975005f,-0.157677f, +0.153594f,0.966224f,-0.206929f, +0.277291f,0.95249f,-0.125986f, +0.254121f,0.951784f,-0.171844f, +0.192884f,0.934802f,-0.298229f, +0.176671f,0.893747f,-0.412315f, +0.195208f,0.917965f,-0.345303f, +0.157451f,0.974963f,-0.157023f, +0.0279983f,0.991052f,-0.13051f, +0.088609f,0.976865f,-0.194637f, +0.0507072f,0.953301f,-0.297735f, +-0.0277167f,0.944799f,-0.326477f, +-0.027462f,0.967827f,-0.250115f, +-0.0885824f,0.972427f,-0.215728f, +0.0938124f,0.990405f,-0.101477f, +0.168783f,0.975825f,-0.138845f, +0.111665f,0.949064f,-0.294633f, +-0.0373777f,0.928827f,-0.368623f, +-0.132876f,0.934016f,-0.3316f, +-0.0938993f,0.959978f,-0.263865f, +-0.105226f,0.962669f,-0.249392f, +-0.104341f,0.966883f,-0.232916f, +-0.220802f,0.965347f,-0.13911f, +-0.478375f,0.876928f,-0.0464122f, +-0.604444f,0.796064f,0.0305022f, +-0.611643f,0.789038f,0.0575453f, +-0.651561f,0.758511f,-0.0113831f, +-0.622019f,0.781788f,-0.0435906f, +-0.406862f,0.913403f,-0.012587f, +-0.447294f,0.893518f,0.0394196f, +-0.595605f,0.801728f,0.049859f, +-0.453119f,0.890822f,0.0334497f, +-0.397535f,0.913376f,-0.0878049f, +-0.358743f,0.901381f,-0.242521f, +-0.368468f,0.876571f,-0.309604f, +-0.3524f,0.834147f,-0.42428f, +-0.221095f,0.907887f,-0.356171f, +-0.336012f,0.912731f,-0.232418f, +-0.365521f,0.924164f,-0.110978f, +-0.381997f,0.913352f,-0.140951f, +-0.128103f,0.980976f,-0.145863f, +0.0620369f,0.958271f,-0.279048f, +-0.0393717f,0.894694f,-0.44494f, +0.166576f,0.906235f,-0.388576f, +0.257306f,0.912784f,-0.317204f, +0.0500832f,0.912737f,-0.405466f, +0.219062f,0.950498f,-0.220374f, +0.303476f,0.949102f,-0.0843104f, +0.167756f,0.983709f,-0.0646101f, +-0.00137806f,0.991718f,-0.128423f, +-0.411803f,0.737245f,0.535619f, +-0.383529f,0.716567f,0.582612f, +-0.385829f,0.756694f,0.527779f, +-0.125894f,0.866623f,0.482821f, +0.0864817f,0.885592f,0.456341f, +0.0185611f,0.909875f,0.414467f, +0.0890012f,0.92755f,0.362947f, +0.3312f,0.85507f,0.39895f, +0.411118f,0.842585f,0.347898f, +0.395768f,0.87253f,0.286458f, +0.265631f,0.912624f,0.310738f, +0.0432866f,0.942781f,0.330591f, +-0.0291247f,0.959608f,0.279829f, +0.17674f,0.935093f,0.307187f, +0.194038f,0.946511f,0.25781f, +0.0938941f,0.995535f,0.00965941f, +0.2133f,0.967919f,-0.132802f, +0.174202f,0.951285f,-0.254382f, +0.185706f,0.942688f,-0.277223f, +0.254853f,0.951817f,-0.170569f, +0.272452f,0.946195f,-0.174599f, +0.236374f,0.944357f,-0.228728f, +0.0622104f,0.974295f,-0.216517f, +0.00421412f,0.994674f,-0.102989f, +0.150974f,0.988535f,0.00252771f, +0.198367f,0.972494f,-0.122094f, +0.128147f,0.983415f,-0.128347f, +0.00128047f,0.972843f,-0.231463f, +-0.0877992f,0.94046f,-0.328368f, +-0.123322f,0.945018f,-0.302876f, +0.0120775f,0.960206f,-0.279033f, +0.230563f,0.945381f,-0.230424f, +0.231597f,0.934072f,-0.271795f, +0.0492688f,0.934225f,-0.353265f, +-0.160672f,0.892999f,-0.4204f, +-0.160391f,0.913064f,-0.374951f, +-0.146451f,0.932705f,-0.329565f, +-0.203905f,0.952995f,-0.224107f, +-0.374034f,0.927408f,-0.00361175f, +-0.538909f,0.826945f,0.160435f, +-0.614792f,0.776175f,0.139939f, +-0.589081f,0.79961f,0.116649f, +-0.558852f,0.827241f,0.0579274f, +-0.582196f,0.802416f,-0.131063f, +-0.51435f,0.846005f,-0.140428f, +-0.52517f,0.850476f,0.0297862f, +-0.596917f,0.80173f,0.0303285f, +-0.476386f,0.879145f,0.0126877f, +-0.346071f,0.935165f,0.0755073f, +-0.29506f,0.953573f,0.0603189f, +-0.290873f,0.956376f,0.0271545f, +-0.342792f,0.934849f,-0.0924672f, +-0.36131f,0.919889f,-0.152511f, +-0.440677f,0.895263f,-0.0656364f, +-0.27224f,0.960453f,-0.0584458f, +-0.239345f,0.939791f,-0.243941f, +-0.184322f,0.924268f,-0.334296f, +0.170265f,0.967851f,-0.185131f, +0.0831722f,0.975078f,-0.205681f, +0.0764752f,0.962386f,-0.2607f, +0.25092f,0.948574f,-0.192995f, +-0.000511184f,0.983325f,-0.181855f, +0.00805518f,0.99922f,-0.0386666f, +0.231558f,0.969957f,0.0745867f, +0.213284f,0.97378f,0.0791335f, +0.134707f,0.990255f,0.0353415f, +-0.461887f,0.727903f,0.506772f, +-0.409704f,0.769768f,0.48949f, +-0.245031f,0.85373f,0.459461f, +-0.000652498f,0.933053f,0.359739f, +0.0977619f,0.940993f,0.323999f, +0.0976539f,0.925223f,0.366641f, +0.122528f,0.958779f,0.256377f, +0.300256f,0.92807f,0.220301f, +0.434057f,0.868364f,0.239872f, +0.373936f,0.875783f,0.305249f, +0.188752f,0.892291f,0.41011f, +0.0749298f,0.875078f,0.478146f, +0.0539526f,0.905587f,0.420716f, +0.139771f,0.930537f,0.338475f, +0.252071f,0.902374f,0.349544f, +0.271241f,0.91149f,0.309214f, +0.343876f,0.91657f,0.204082f, +0.324141f,0.940857f,0.098591f, +0.18373f,0.982977f,-0.000581414f, +0.215424f,0.976468f,-0.0101277f, +0.272942f,0.961141f,-0.0413737f, +0.263192f,0.964688f,-0.010384f, +0.0834313f,0.988492f,-0.126183f, +-0.0244777f,0.972824f,-0.230248f, +0.037395f,0.972598f,-0.229465f, +0.188221f,0.98005f,-0.0638298f, +0.133895f,0.99093f,-0.0113778f, +0.15553f,0.985289f,-0.0708293f, +0.062154f,0.97927f,-0.19279f, +-0.0906565f,0.929896f,-0.356476f, +-0.00537849f,0.905315f,-0.424706f, +0.162604f,0.918237f,-0.361109f, +0.211297f,0.942163f,-0.260159f, +0.166674f,0.959094f,-0.22882f, +-0.0900843f,0.919646f,-0.382278f, +-0.185542f,0.891522f,-0.413234f, +-0.236454f,0.911319f,-0.337026f, +-0.404129f,0.904849f,-0.133894f, +-0.540771f,0.839361f,0.0551279f, +-0.598434f,0.794978f,0.0994372f, +-0.56944f,0.810652f,0.136315f, +-0.572323f,0.818089f,0.0563579f, +-0.472334f,0.880613f,0.0376913f, +-0.539685f,0.840552f,-0.0470301f, +-0.574258f,0.816988f,0.0525225f, +-0.582793f,0.802613f,0.127141f, +-0.577964f,0.810669f,0.0936681f, +-0.453297f,0.886551f,0.0924669f, +-0.392456f,0.918879f,0.0405067f, +-0.316387f,0.94595f,0.0712573f, +-0.278453f,0.953269f,0.117224f, +-0.268053f,0.957793f,0.103824f, +-0.307148f,0.94927f,0.0674248f, +-0.42059f,0.907249f,-0.00173726f, +-0.259446f,0.962613f,-0.0778756f, +-0.0851837f,0.992966f,-0.082236f, +-0.215247f,0.960313f,-0.177393f, +-0.0219544f,0.989556f,-0.14247f, +0.0391647f,0.99769f,-0.0555004f, +0.102045f,0.994433f,0.0262785f, +0.194292f,0.978837f,0.0642512f, +-0.0292693f,0.988875f,0.145839f, +-0.101853f,0.986247f,0.130166f, +0.212882f,0.964861f,0.15403f, +0.245798f,0.960888f,0.127587f, +0.195444f,0.974318f,0.111832f, +-0.321858f,0.809731f,0.490656f, +-0.324834f,0.8531f,0.408293f, +-0.169338f,0.931652f,0.321478f, +0.0137661f,0.965459f,0.260189f, +0.0568655f,0.931751f,0.358619f, +0.0773718f,0.91837f,0.388084f, +0.261047f,0.911575f,0.317625f, +0.360487f,0.919759f,0.155217f, +0.377368f,0.917164f,0.128078f, +0.276887f,0.917903f,0.284232f, +0.0739314f,0.913495f,0.400076f, +0.00592871f,0.863726f,0.503926f, +0.12818f,0.830694f,0.541773f, +0.218813f,0.849726f,0.479673f, +0.242686f,0.877276f,0.414115f, +0.274843f,0.886896f,0.371318f, +0.349234f,0.864992f,0.360313f, +0.316807f,0.866747f,0.385206f, +0.243026f,0.8884f,0.389467f, +0.293176f,0.904042f,0.311057f, +0.24905f,0.947495f,0.200568f, +0.307601f,0.926121f,0.21836f, +0.250581f,0.964737f,0.0805682f, +0.134636f,0.99035f,-0.0328548f, +0.000251354f,0.985828f,-0.167762f, +0.0218107f,0.990992f,-0.132131f, +0.159951f,0.984761f,-0.068279f, +0.165852f,0.977778f,-0.128229f, +0.162621f,0.98447f,-0.06613f, +0.121502f,0.975682f,-0.182435f, +0.0565286f,0.935574f,-0.348576f, +0.0461029f,0.9227f,-0.382752f, +0.0939341f,0.947555f,-0.305477f, +0.144515f,0.970016f,-0.195409f, +0.0775217f,0.989125f,-0.124991f, +-0.200827f,0.965332f,-0.16674f, +-0.401609f,0.907839f,-0.120577f, +-0.559375f,0.828885f,-0.00699655f, +-0.565805f,0.821746f,0.0678162f, +-0.593147f,0.804311f,0.0354918f, +-0.576294f,0.817225f,0.00543077f, +-0.525544f,0.848999f,-0.0548173f, +-0.499547f,0.863338f,-0.0714126f, +-0.553806f,0.830814f,0.0551944f, +-0.639015f,0.755184f,0.146141f, +-0.555848f,0.812796f,0.174341f, +-0.558245f,0.826947f,0.0672363f, +-0.433561f,0.898303f,0.0712505f, +-0.328723f,0.942541f,0.0596481f, +-0.348698f,0.936876f,0.0259581f, +-0.301092f,0.95068f,0.0745005f, +-0.263015f,0.962594f,0.0650869f, +-0.284818f,0.957539f,0.0446894f, +-0.359379f,0.932627f,-0.032449f, +-0.231945f,0.967322f,-0.102417f, +-0.134462f,0.989922f,-0.0444264f, +-0.162306f,0.986023f,0.0376183f, +0.00794699f,0.998548f,-0.0532871f, +-0.0239448f,0.993657f,-0.109874f, +-0.0216422f,0.99782f,0.0623378f, +0.109723f,0.978713f,0.173443f, +-0.0637399f,0.980084f,0.188075f, +-0.0488189f,0.981371f,0.185814f, +0.215314f,0.95546f,0.201833f, +0.226954f,0.944659f,0.236876f, +0.18874f,0.93582f,0.297688f, +-0.35388f,0.863488f,0.359384f, +-0.279389f,0.900607f,0.332938f, +-0.0980507f,0.952584f,0.288043f, +-0.0324622f,0.946395f,0.321377f, +-0.0380375f,0.913004f,0.406173f, +0.128955f,0.929408f,0.345792f, +0.375928f,0.898621f,0.226181f, +0.446257f,0.883274f,0.143813f, +0.289683f,0.938589f,0.187442f, +0.125289f,0.928145f,0.350499f, +-0.0288389f,0.895239f,0.444652f, +-0.103894f,0.871209f,0.479793f, +0.105997f,0.859294f,0.500378f, +0.239743f,0.842088f,0.483127f, +0.302444f,0.818919f,0.48775f, +0.351983f,0.830309f,0.432082f, +0.318807f,0.868172f,0.380315f, +0.306771f,0.857612f,0.412787f, +0.273726f,0.881543f,0.384651f, +0.337032f,0.866043f,0.369295f, +0.363605f,0.874829f,0.320103f, +0.334634f,0.927168f,0.168463f, +0.372292f,0.916204f,0.148217f, +0.206342f,0.978274f,0.0200943f, +0.119354f,0.989819f,-0.077546f, +0.042858f,0.974765f,-0.21908f, +0.15227f,0.956258f,-0.24977f, +0.17642f,0.955622f,-0.235928f, +0.119264f,0.963567f,-0.239406f, +0.210452f,0.949288f,-0.233584f, +0.171674f,0.93622f,-0.306626f, +0.0511268f,0.942128f,-0.331333f, +0.00960037f,0.978635f,-0.205381f, +-0.00181509f,0.99884f,-0.048118f, +-0.0483779f,0.993619f,0.101885f, +-0.221067f,0.964285f,0.145887f, +-0.435375f,0.898142f,0.0615596f, +-0.544434f,0.838804f,-0.00062539f, +-0.579913f,0.810216f,-0.0851529f, +-0.5726f,0.815766f,-0.0815813f, +-0.546649f,0.832873f,-0.0865884f, +-0.465735f,0.88205f,-0.071268f, +-0.55864f,0.824018f,-0.0944285f, +-0.642115f,0.765228f,0.0459774f, +-0.656804f,0.753752f,0.0216163f, +-0.520592f,0.853762f,0.00863503f, +-0.481258f,0.875004f,-0.0525228f, +-0.443379f,0.889071f,-0.113874f, +-0.339817f,0.937077f,-0.0800719f, +-0.346478f,0.935462f,-0.0697409f, +-0.350474f,0.934462f,-0.0628307f, +-0.228751f,0.97348f,-0.00313391f, +-0.230759f,0.970493f,-0.0699589f, +-0.279469f,0.954379f,-0.105155f, +-0.198889f,0.96686f,-0.16008f, +-0.230529f,0.946681f,-0.225058f, +-0.14204f,0.970201f,-0.196301f, +0.0687794f,0.962113f,-0.263834f, +-0.0677159f,0.979986f,-0.187196f, +-0.220027f,0.972288f,-0.0790245f, +0.07326f,0.993712f,0.0846721f, +-0.0289367f,0.993146f,0.113239f, +-0.106822f,0.986395f,0.124957f, +0.128381f,0.967004f,0.22005f, +0.141757f,0.945235f,0.293998f, +0.0274083f,0.95189f,0.30521f, +-0.150915f,0.940582f,0.304189f, +-0.174369f,0.970549f,0.166222f, +-0.140821f,0.979995f,0.140639f, +-0.141606f,0.959082f,0.245171f, +0.011894f,0.972798f,0.23135f, +0.262326f,0.961504f,0.0818187f, +0.456393f,0.889018f,0.036791f, +0.382632f,0.920315f,0.0813253f, +0.174752f,0.942069f,0.286301f, +-0.045852f,0.917014f,0.396211f, +-0.0633233f,0.882412f,0.466197f, +-0.0422981f,0.919143f,0.391647f, +0.126089f,0.949054f,0.288786f, +0.256733f,0.912921f,0.317275f, +0.315104f,0.887032f,0.337468f, +0.409846f,0.864148f,0.292018f, +0.343944f,0.901166f,0.263823f, +0.312798f,0.897029f,0.312244f, +0.323227f,0.888441f,0.325879f, +0.342446f,0.89904f,0.272869f, +0.451059f,0.860524f,0.236736f, +0.423682f,0.891569f,0.159992f, +0.404089f,0.899665f,0.165275f, +0.34072f,0.934631f,0.101855f, +0.255675f,0.966712f,-0.00994645f, +0.192495f,0.972523f,-0.130939f, +0.146493f,0.95759f,-0.248115f, +0.177747f,0.950895f,-0.253387f, +0.10258f,0.958737f,-0.265144f, +0.233714f,0.956929f,-0.172236f, +0.223818f,0.95591f,-0.190111f, +-0.0753718f,0.974181f,-0.212814f, +-0.223858f,0.97386f,-0.0385406f, +-0.201603f,0.967155f,0.154817f, +-0.110966f,0.95618f,0.270934f, +-0.121146f,0.966863f,0.224722f, +-0.291476f,0.94891f,0.120877f, +-0.477923f,0.877529f,-0.0391374f, +-0.509066f,0.849204f,-0.140369f, +-0.547573f,0.807834f,-0.218101f, +-0.563212f,0.785973f,-0.255028f, +-0.550783f,0.817799f,-0.166865f, +-0.567941f,0.823056f,0.00472398f, +-0.662541f,0.748994f,-0.00687841f, +-0.61971f,0.78387f,-0.03883f, +-0.523314f,0.847679f,-0.0870804f, +-0.447797f,0.889814f,-0.0877948f, +-0.443749f,0.888577f,-0.116264f, +-0.376466f,0.920201f,-0.107257f, +-0.337652f,0.938208f,-0.0758775f, +-0.365552f,0.926461f,-0.0896778f, +-0.259904f,0.962681f,-0.0754604f, +-0.126151f,0.988548f,-0.0828222f, +-0.30144f,0.926166f,-0.226606f, +-0.124801f,0.973148f,-0.193411f, +-0.0842547f,0.941418f,-0.326548f, +-0.0799027f,0.902475f,-0.423267f, +-0.00736616f,0.932864f,-0.360152f, +-0.199402f,0.957181f,-0.209865f, +-0.285967f,0.938676f,-0.192641f, +-0.0884894f,0.987166f,-0.132941f, +-0.0982017f,0.994337f,0.0406204f, +-0.151395f,0.982648f,0.107153f, +0.0310104f,0.988838f,0.14573f, +0.106405f,0.964191f,0.242925f, +0.070474f,0.952157f,0.297374f, +0.0656706f,0.9919f,0.108725f, +-0.0894851f,0.995828f,0.0178395f, +-0.190523f,0.981135f,0.0327999f, +-0.155304f,0.987556f,0.0247798f, +0.115224f,0.991572f,-0.0592235f, +0.36579f,0.920032f,-0.140496f, +0.356271f,0.926984f,-0.117348f, +0.248335f,0.959842f,0.130508f, +0.000801886f,0.966476f,0.256755f, +-0.114974f,0.940419f,0.319989f, +-0.0524682f,0.940494f,0.335734f, +0.129742f,0.951002f,0.280646f, +0.183656f,0.974747f,0.127042f, +0.210533f,0.964529f,0.159247f, +0.299776f,0.935816f,0.185429f, +0.476652f,0.857927f,0.191739f, +0.365421f,0.920615f,0.137608f, +0.247354f,0.961561f,0.119232f, +0.333488f,0.932256f,0.140299f, +0.428629f,0.898219f,0.0973634f, +0.470887f,0.881687f,0.0298847f, +0.443595f,0.892268f,0.0841461f, +0.38152f,0.920309f,0.0864469f, +0.381462f,0.916941f,0.117074f, +0.327497f,0.93955f,0.099957f, +0.304803f,0.952409f,-0.00357992f, +0.239937f,0.959204f,-0.149528f, +0.202117f,0.965308f,-0.165315f, +0.0495866f,0.988011f,-0.146203f, +0.0854477f,0.995976f,-0.027023f, +0.244078f,0.956317f,0.160886f, +-0.0753613f,0.986424f,0.145905f, +-0.339089f,0.932874f,0.12151f, +-0.294837f,0.942606f,0.15673f, +-0.104304f,0.973462f,0.203698f, +-0.0723227f,0.985619f,0.152724f, +-0.210009f,0.973927f,0.0858055f, +-0.391811f,0.919671f,-0.0262484f, +-0.442429f,0.895892f,-0.0404195f, +-0.501975f,0.857758f,-0.11078f, +-0.516547f,0.834688f,-0.190982f, +-0.606461f,0.747704f,-0.270451f, +-0.650373f,0.745527f,-0.145618f, +-0.638901f,0.762805f,-0.0996673f, +-0.598555f,0.785548f,-0.156994f, +-0.501024f,0.846694f,-0.179123f, +-0.446137f,0.875545f,-0.185426f, +-0.431282f,0.886668f,-0.16678f, +-0.409115f,0.903871f,-0.125073f, +-0.364534f,0.929271f,-0.0597475f, +-0.342967f,0.93838f,-0.0426101f, +-0.26831f,0.95962f,-0.0844963f, +-0.0393852f,0.992201f,-0.118264f, +-0.116204f,0.958118f,-0.261737f, +-0.10396f,0.911216f,-0.398596f, +0.0690263f,0.90803f,-0.41318f, +-0.107766f,0.879323f,-0.463872f, +-0.204112f,0.904181f,-0.375227f, +-0.300499f,0.93243f,-0.200683f, +-0.27347f,0.953749f,-0.124807f, +-0.169754f,0.978593f,-0.116359f, +-0.231778f,0.970053f,-0.072634f, +-0.190395f,0.98166f,0.00964305f, +-0.0305984f,0.996687f,0.0753532f, +0.015862f,0.984083f,0.177002f, +-0.0353434f,0.980638f,0.192612f, +-0.00358253f,0.996067f,-0.0885361f, +-0.091201f,0.995656f,-0.0187243f, +-0.182622f,0.982071f,0.0467509f, +-0.0739202f,0.997106f,-0.017751f, +0.154438f,0.971547f,-0.179571f, +0.395535f,0.904532f,-0.159291f, +0.194508f,0.960754f,-0.197781f, +0.113269f,0.98581f,0.123894f, +-0.030891f,0.963944f,0.264306f, +-0.124571f,0.959262f,0.253572f, +-0.0553429f,0.968125f,0.244277f, +0.192328f,0.950681f,0.243343f, +0.217769f,0.968216f,0.123025f, +0.205296f,0.966103f,0.156522f, +0.276023f,0.954237f,0.11508f, +0.467224f,0.868183f,0.167212f, +0.402263f,0.894308f,0.195955f, +0.299601f,0.940084f,0.162733f, +0.355906f,0.933872f,0.0348486f, +0.474044f,0.880198f,-0.0230946f, +0.444725f,0.891474f,-0.0865651f, +0.431452f,0.901988f,0.0163334f, +0.385491f,0.922676f,0.00810292f, +0.339313f,0.940655f,0.00595024f, +0.37483f,0.92173f,0.099581f, +0.41171f,0.911266f,-0.00949356f, +0.281208f,0.933096f,-0.224175f, +0.138066f,0.959634f,-0.245031f, +0.0299217f,0.992057f,-0.122182f, +-0.0797424f,0.99128f,-0.104905f, +0.124146f,0.977522f,0.170405f, +-0.0302976f,0.947743f,0.317594f, +-0.301142f,0.928457f,0.21744f, +-0.278579f,0.94845f,0.151119f, +-0.150217f,0.982764f,0.107745f, +0.0163995f,0.982022f,0.188052f, +-0.137431f,0.989816f,0.0370977f, +-0.36652f,0.926186f,-0.0885568f, +-0.445397f,0.895157f,-0.0177851f, +-0.463397f,0.885777f,-0.0257252f, +-0.466469f,0.878885f,-0.099842f, +-0.557948f,0.804805f,-0.202443f, +-0.681509f,0.679149f,-0.272587f, +-0.629296f,0.753928f,-0.188625f, +-0.5596f,0.798482f,-0.221976f, +-0.503025f,0.800303f,-0.326313f, +-0.422254f,0.855253f,-0.300408f, +-0.454716f,0.829192f,-0.325075f, +-0.46025f,0.856807f,-0.232488f, +-0.37729f,0.921922f,-0.0878209f, +-0.375084f,0.920087f,-0.112928f, +-0.173161f,0.984659f,-0.0214944f, +-0.0348229f,0.978528f,-0.20315f, +0.0523603f,0.977312f,-0.205229f, +-0.0533357f,0.893335f,-0.446215f, +0.0246713f,0.873256f,-0.486637f, +-0.0923807f,0.905308f,-0.414587f, +-0.269958f,0.871402f,-0.409612f, +-0.388686f,0.862358f,-0.324442f, +-0.340148f,0.928537f,-0.148722f, +-0.147166f,0.988619f,-0.0312327f, +-0.248059f,0.963625f,-0.099463f, +-0.232297f,0.969578f,-0.0771772f, +-0.142695f,0.989498f,-0.02308f, +-0.0198137f,0.98287f,0.18323f, +-0.0333475f,0.978727f,0.202438f, +}; + +btScalar Landscape05Tex[] = { +0.0f,0.5f, +0.0f,0.492188f, +0.0078125f,0.5f, +0.0078125f,0.492188f, +0.015625f,0.5f, +0.015625f,0.492188f, +0.0234375f,0.5f, +0.0234375f,0.492188f, +0.03125f,0.5f, +0.03125f,0.492188f, +0.0390625f,0.5f, +0.0390625f,0.492188f, +0.046875f,0.5f, +0.046875f,0.492188f, +0.0546875f,0.5f, +0.0546875f,0.492188f, +0.0625f,0.5f, +0.0625f,0.492188f, +0.0703125f,0.5f, +0.0703125f,0.492188f, +0.078125f,0.5f, +0.078125f,0.492188f, +0.0859375f,0.5f, +0.0859375f,0.492188f, +0.09375f,0.5f, +0.09375f,0.492188f, +0.101563f,0.5f, +0.101563f,0.492188f, +0.109375f,0.5f, +0.109375f,0.492188f, +0.117188f,0.5f, +0.117188f,0.492188f, +0.125f,0.5f, +0.125f,0.492188f, +0.132813f,0.5f, +0.132813f,0.492188f, +0.140625f,0.5f, +0.140625f,0.492188f, +0.148438f,0.5f, +0.148438f,0.492188f, +0.15625f,0.5f, +0.15625f,0.492188f, +0.164063f,0.5f, +0.164063f,0.492188f, +0.171875f,0.5f, +0.171875f,0.492188f, +0.179688f,0.5f, +0.179688f,0.492188f, +0.1875f,0.5f, +0.1875f,0.492188f, +0.195313f,0.5f, +0.195313f,0.492188f, +0.203125f,0.5f, +0.203125f,0.492188f, +0.210938f,0.5f, +0.210938f,0.492188f, +0.21875f,0.5f, +0.21875f,0.492188f, +0.226563f,0.5f, +0.226563f,0.492188f, +0.234375f,0.5f, +0.234375f,0.492188f, +0.242188f,0.5f, +0.242188f,0.492188f, +0.25f,0.5f, +0.25f,0.492188f, +0.257813f,0.5f, +0.257813f,0.492188f, +0.265625f,0.5f, +0.265625f,0.492188f, +0.273438f,0.5f, +0.273438f,0.492188f, +0.28125f,0.5f, +0.28125f,0.492188f, +0.289063f,0.5f, +0.289063f,0.492188f, +0.296875f,0.5f, +0.296875f,0.492188f, +0.304688f,0.5f, +0.304688f,0.492188f, +0.3125f,0.5f, +0.3125f,0.492188f, +0.320313f,0.5f, +0.320313f,0.492188f, +0.328125f,0.5f, +0.328125f,0.492188f, +0.335938f,0.5f, +0.335938f,0.492188f, +0.34375f,0.5f, +0.34375f,0.492188f, +0.351563f,0.5f, +0.351563f,0.492188f, +0.359375f,0.5f, +0.359375f,0.492188f, +0.367188f,0.5f, +0.367188f,0.492188f, +0.375f,0.5f, +0.375f,0.492188f, +0.382813f,0.5f, +0.382813f,0.492188f, +0.390625f,0.5f, +0.390625f,0.492188f, +0.398438f,0.5f, +0.398438f,0.492188f, +0.40625f,0.5f, +0.40625f,0.492188f, +0.414063f,0.5f, +0.414063f,0.492188f, +0.421875f,0.5f, +0.421875f,0.492188f, +0.429688f,0.5f, +0.429688f,0.492188f, +0.4375f,0.5f, +0.4375f,0.492188f, +0.445313f,0.5f, +0.445313f,0.492188f, +0.453125f,0.5f, +0.453125f,0.492188f, +0.460938f,0.5f, +0.460938f,0.492188f, +0.46875f,0.5f, +0.46875f,0.492188f, +0.476563f,0.5f, +0.476563f,0.492188f, +0.484375f,0.5f, +0.484375f,0.492188f, +0.492188f,0.5f, +0.492188f,0.492188f, +0.5f,0.5f, +0.5f,0.492188f, +0.507813f,0.5f, +0.507813f,0.492188f, +0.0f,0.507813f, +0.0078125f,0.507813f, +0.015625f,0.507813f, +0.0234375f,0.507813f, +0.03125f,0.507813f, +0.0390625f,0.507813f, +0.046875f,0.507813f, +0.0546875f,0.507813f, +0.0625f,0.507813f, +0.0703125f,0.507813f, +0.078125f,0.507813f, +0.0859375f,0.507813f, +0.09375f,0.507813f, +0.101563f,0.507813f, +0.109375f,0.507813f, +0.117188f,0.507813f, +0.125f,0.507813f, +0.132813f,0.507813f, +0.140625f,0.507813f, +0.148438f,0.507813f, +0.15625f,0.507813f, +0.164063f,0.507813f, +0.171875f,0.507813f, +0.179688f,0.507813f, +0.1875f,0.507813f, +0.195313f,0.507813f, +0.203125f,0.507813f, +0.210938f,0.507813f, +0.21875f,0.507813f, +0.226563f,0.507813f, +0.234375f,0.507813f, +0.242188f,0.507813f, +0.25f,0.507813f, +0.257813f,0.507813f, +0.265625f,0.507813f, +0.273438f,0.507813f, +0.28125f,0.507813f, +0.289063f,0.507813f, +0.296875f,0.507813f, +0.304688f,0.507813f, +0.3125f,0.507813f, +0.320313f,0.507813f, +0.328125f,0.507813f, +0.335938f,0.507813f, +0.34375f,0.507813f, +0.351563f,0.507813f, +0.359375f,0.507813f, +0.367188f,0.507813f, +0.375f,0.507813f, +0.382813f,0.507813f, +0.390625f,0.507813f, +0.398438f,0.507813f, +0.40625f,0.507813f, +0.414063f,0.507813f, +0.421875f,0.507813f, +0.429688f,0.507813f, +0.4375f,0.507813f, +0.445313f,0.507813f, +0.453125f,0.507813f, +0.460938f,0.507813f, +0.46875f,0.507813f, +0.476563f,0.507813f, +0.484375f,0.507813f, +0.492188f,0.507813f, +0.5f,0.507813f, +0.507813f,0.507813f, +0.0f,0.515625f, +0.0078125f,0.515625f, +0.015625f,0.515625f, +0.0234375f,0.515625f, +0.03125f,0.515625f, +0.0390625f,0.515625f, +0.046875f,0.515625f, +0.0546875f,0.515625f, +0.0625f,0.515625f, +0.0703125f,0.515625f, +0.078125f,0.515625f, +0.0859375f,0.515625f, +0.09375f,0.515625f, +0.101563f,0.515625f, +0.109375f,0.515625f, +0.117188f,0.515625f, +0.125f,0.515625f, +0.132813f,0.515625f, +0.140625f,0.515625f, +0.148438f,0.515625f, +0.15625f,0.515625f, +0.164063f,0.515625f, +0.171875f,0.515625f, +0.179688f,0.515625f, +0.1875f,0.515625f, +0.195313f,0.515625f, +0.203125f,0.515625f, +0.210938f,0.515625f, +0.21875f,0.515625f, +0.226563f,0.515625f, +0.234375f,0.515625f, +0.242188f,0.515625f, +0.25f,0.515625f, +0.257813f,0.515625f, +0.265625f,0.515625f, +0.273438f,0.515625f, +0.28125f,0.515625f, +0.289063f,0.515625f, +0.296875f,0.515625f, +0.304688f,0.515625f, +0.3125f,0.515625f, +0.320313f,0.515625f, +0.328125f,0.515625f, +0.335938f,0.515625f, +0.34375f,0.515625f, +0.351563f,0.515625f, +0.359375f,0.515625f, +0.367188f,0.515625f, +0.375f,0.515625f, +0.382813f,0.515625f, +0.390625f,0.515625f, +0.398438f,0.515625f, +0.40625f,0.515625f, +0.414063f,0.515625f, +0.421875f,0.515625f, +0.429688f,0.515625f, +0.4375f,0.515625f, +0.445313f,0.515625f, +0.453125f,0.515625f, +0.460938f,0.515625f, +0.46875f,0.515625f, +0.476563f,0.515625f, +0.484375f,0.515625f, +0.492188f,0.515625f, +0.5f,0.515625f, +0.507813f,0.515625f, +0.0f,0.523438f, +0.0078125f,0.523438f, +0.015625f,0.523438f, +0.0234375f,0.523438f, +0.03125f,0.523438f, +0.0390625f,0.523438f, +0.046875f,0.523438f, +0.0546875f,0.523438f, +0.0625f,0.523438f, +0.0703125f,0.523438f, +0.078125f,0.523438f, +0.0859375f,0.523438f, +0.09375f,0.523438f, +0.101563f,0.523438f, +0.109375f,0.523438f, +0.117188f,0.523438f, +0.125f,0.523438f, +0.132813f,0.523438f, +0.140625f,0.523438f, +0.148438f,0.523438f, +0.15625f,0.523438f, +0.164063f,0.523438f, +0.171875f,0.523438f, +0.179688f,0.523438f, +0.1875f,0.523438f, +0.195313f,0.523438f, +0.203125f,0.523438f, +0.210938f,0.523438f, +0.21875f,0.523438f, +0.226563f,0.523438f, +0.234375f,0.523438f, +0.242188f,0.523438f, +0.25f,0.523438f, +0.257813f,0.523438f, +0.265625f,0.523438f, +0.273438f,0.523438f, +0.28125f,0.523438f, +0.289063f,0.523438f, +0.296875f,0.523438f, +0.304688f,0.523438f, +0.3125f,0.523438f, +0.320313f,0.523438f, +0.328125f,0.523438f, +0.335938f,0.523438f, +0.34375f,0.523438f, +0.351563f,0.523438f, +0.359375f,0.523438f, +0.367188f,0.523438f, +0.375f,0.523438f, +0.382813f,0.523438f, +0.390625f,0.523438f, +0.398438f,0.523438f, +0.40625f,0.523438f, +0.414063f,0.523438f, +0.421875f,0.523438f, +0.429688f,0.523438f, +0.4375f,0.523438f, +0.445313f,0.523438f, +0.453125f,0.523438f, +0.460938f,0.523438f, +0.46875f,0.523438f, +0.476563f,0.523438f, +0.484375f,0.523438f, +0.492188f,0.523438f, +0.5f,0.523438f, +0.507813f,0.523438f, +0.0f,0.53125f, +0.0078125f,0.53125f, +0.015625f,0.53125f, +0.0234375f,0.53125f, +0.03125f,0.53125f, +0.0390625f,0.53125f, +0.046875f,0.53125f, +0.0546875f,0.53125f, +0.0625f,0.53125f, +0.0703125f,0.53125f, +0.078125f,0.53125f, +0.0859375f,0.53125f, +0.09375f,0.53125f, +0.101563f,0.53125f, +0.109375f,0.53125f, +0.117188f,0.53125f, +0.125f,0.53125f, +0.132813f,0.53125f, +0.140625f,0.53125f, +0.148438f,0.53125f, +0.15625f,0.53125f, +0.164063f,0.53125f, +0.171875f,0.53125f, +0.179688f,0.53125f, +0.1875f,0.53125f, +0.195313f,0.53125f, +0.203125f,0.53125f, +0.210938f,0.53125f, +0.21875f,0.53125f, +0.226563f,0.53125f, +0.234375f,0.53125f, +0.242188f,0.53125f, +0.25f,0.53125f, +0.257813f,0.53125f, +0.265625f,0.53125f, +0.273438f,0.53125f, +0.28125f,0.53125f, +0.289063f,0.53125f, +0.296875f,0.53125f, +0.304688f,0.53125f, +0.3125f,0.53125f, +0.320313f,0.53125f, +0.328125f,0.53125f, +0.335938f,0.53125f, +0.34375f,0.53125f, +0.351563f,0.53125f, +0.359375f,0.53125f, +0.367188f,0.53125f, +0.375f,0.53125f, +0.382813f,0.53125f, +0.390625f,0.53125f, +0.398438f,0.53125f, +0.40625f,0.53125f, +0.414063f,0.53125f, +0.421875f,0.53125f, +0.429688f,0.53125f, +0.4375f,0.53125f, +0.445313f,0.53125f, +0.453125f,0.53125f, +0.460938f,0.53125f, +0.46875f,0.53125f, +0.476563f,0.53125f, +0.484375f,0.53125f, +0.492188f,0.53125f, +0.5f,0.53125f, +0.507813f,0.53125f, +0.0f,0.539063f, +0.0078125f,0.539063f, +0.015625f,0.539063f, +0.0234375f,0.539063f, +0.03125f,0.539063f, +0.0390625f,0.539063f, +0.046875f,0.539063f, +0.0546875f,0.539063f, +0.0625f,0.539063f, +0.0703125f,0.539063f, +0.078125f,0.539063f, +0.0859375f,0.539063f, +0.09375f,0.539063f, +0.101563f,0.539063f, +0.109375f,0.539063f, +0.117188f,0.539063f, +0.125f,0.539063f, +0.132813f,0.539063f, +0.140625f,0.539063f, +0.148438f,0.539063f, +0.15625f,0.539063f, +0.164063f,0.539063f, +0.171875f,0.539063f, +0.179688f,0.539063f, +0.1875f,0.539063f, +0.195313f,0.539063f, +0.203125f,0.539063f, +0.210938f,0.539063f, +0.21875f,0.539063f, +0.226563f,0.539063f, +0.234375f,0.539063f, +0.242188f,0.539063f, +0.25f,0.539063f, +0.257813f,0.539063f, +0.265625f,0.539063f, +0.273438f,0.539063f, +0.28125f,0.539063f, +0.289063f,0.539063f, +0.296875f,0.539063f, +0.304688f,0.539063f, +0.3125f,0.539063f, +0.320313f,0.539063f, +0.328125f,0.539063f, +0.335938f,0.539063f, +0.34375f,0.539063f, +0.351563f,0.539063f, +0.359375f,0.539063f, +0.367188f,0.539063f, +0.375f,0.539063f, +0.382813f,0.539063f, +0.390625f,0.539063f, +0.398438f,0.539063f, +0.40625f,0.539063f, +0.414063f,0.539063f, +0.421875f,0.539063f, +0.429688f,0.539063f, +0.4375f,0.539063f, +0.445313f,0.539063f, +0.453125f,0.539063f, +0.460938f,0.539063f, +0.46875f,0.539063f, +0.476563f,0.539063f, +0.484375f,0.539063f, +0.492188f,0.539063f, +0.5f,0.539063f, +0.507813f,0.539063f, +0.0f,0.546875f, +0.0078125f,0.546875f, +0.015625f,0.546875f, +0.0234375f,0.546875f, +0.03125f,0.546875f, +0.0390625f,0.546875f, +0.046875f,0.546875f, +0.0546875f,0.546875f, +0.0625f,0.546875f, +0.0703125f,0.546875f, +0.078125f,0.546875f, +0.0859375f,0.546875f, +0.09375f,0.546875f, +0.101563f,0.546875f, +0.109375f,0.546875f, +0.117188f,0.546875f, +0.125f,0.546875f, +0.132813f,0.546875f, +0.140625f,0.546875f, +0.148438f,0.546875f, +0.15625f,0.546875f, +0.164063f,0.546875f, +0.171875f,0.546875f, +0.179688f,0.546875f, +0.1875f,0.546875f, +0.195313f,0.546875f, +0.203125f,0.546875f, +0.210938f,0.546875f, +0.21875f,0.546875f, +0.226563f,0.546875f, +0.234375f,0.546875f, +0.242188f,0.546875f, +0.25f,0.546875f, +0.257813f,0.546875f, +0.265625f,0.546875f, +0.273438f,0.546875f, +0.28125f,0.546875f, +0.289063f,0.546875f, +0.296875f,0.546875f, +0.304688f,0.546875f, +0.3125f,0.546875f, +0.320313f,0.546875f, +0.328125f,0.546875f, +0.335938f,0.546875f, +0.34375f,0.546875f, +0.351563f,0.546875f, +0.359375f,0.546875f, +0.367188f,0.546875f, +0.375f,0.546875f, +0.382813f,0.546875f, +0.390625f,0.546875f, +0.398438f,0.546875f, +0.40625f,0.546875f, +0.414063f,0.546875f, +0.421875f,0.546875f, +0.429688f,0.546875f, +0.4375f,0.546875f, +0.445313f,0.546875f, +0.453125f,0.546875f, +0.460938f,0.546875f, +0.46875f,0.546875f, +0.476563f,0.546875f, +0.484375f,0.546875f, +0.492188f,0.546875f, +0.5f,0.546875f, +0.507813f,0.546875f, +0.0f,0.554688f, +0.0078125f,0.554688f, +0.015625f,0.554688f, +0.0234375f,0.554688f, +0.03125f,0.554688f, +0.0390625f,0.554688f, +0.046875f,0.554688f, +0.0546875f,0.554688f, +0.0625f,0.554688f, +0.0703125f,0.554688f, +0.078125f,0.554688f, +0.0859375f,0.554688f, +0.09375f,0.554688f, +0.101563f,0.554688f, +0.109375f,0.554688f, +0.117188f,0.554688f, +0.125f,0.554688f, +0.132813f,0.554688f, +0.140625f,0.554688f, +0.148438f,0.554688f, +0.15625f,0.554688f, +0.164063f,0.554688f, +0.171875f,0.554688f, +0.179688f,0.554688f, +0.1875f,0.554688f, +0.195313f,0.554688f, +0.203125f,0.554688f, +0.210938f,0.554688f, +0.21875f,0.554688f, +0.226563f,0.554688f, +0.234375f,0.554688f, +0.242188f,0.554688f, +0.25f,0.554688f, +0.257813f,0.554688f, +0.265625f,0.554688f, +0.273438f,0.554688f, +0.28125f,0.554688f, +0.289063f,0.554688f, +0.296875f,0.554688f, +0.304688f,0.554688f, +0.3125f,0.554688f, +0.320313f,0.554688f, +0.328125f,0.554688f, +0.335938f,0.554688f, +0.34375f,0.554688f, +0.351563f,0.554688f, +0.359375f,0.554688f, +0.367188f,0.554688f, +0.375f,0.554688f, +0.382813f,0.554688f, +0.390625f,0.554688f, +0.398438f,0.554688f, +0.40625f,0.554688f, +0.414063f,0.554688f, +0.421875f,0.554688f, +0.429688f,0.554688f, +0.4375f,0.554688f, +0.445313f,0.554688f, +0.453125f,0.554688f, +0.460938f,0.554688f, +0.46875f,0.554688f, +0.476563f,0.554688f, +0.484375f,0.554688f, +0.492188f,0.554688f, +0.5f,0.554688f, +0.507813f,0.554688f, +0.0f,0.5625f, +0.0078125f,0.5625f, +0.015625f,0.5625f, +0.0234375f,0.5625f, +0.03125f,0.5625f, +0.0390625f,0.5625f, +0.046875f,0.5625f, +0.0546875f,0.5625f, +0.0625f,0.5625f, +0.0703125f,0.5625f, +0.078125f,0.5625f, +0.0859375f,0.5625f, +0.09375f,0.5625f, +0.101563f,0.5625f, +0.109375f,0.5625f, +0.117188f,0.5625f, +0.125f,0.5625f, +0.132813f,0.5625f, +0.140625f,0.5625f, +0.148438f,0.5625f, +0.15625f,0.5625f, +0.164063f,0.5625f, +0.171875f,0.5625f, +0.179688f,0.5625f, +0.1875f,0.5625f, +0.195313f,0.5625f, +0.203125f,0.5625f, +0.210938f,0.5625f, +0.21875f,0.5625f, +0.226563f,0.5625f, +0.234375f,0.5625f, +0.242188f,0.5625f, +0.25f,0.5625f, +0.257813f,0.5625f, +0.265625f,0.5625f, +0.273438f,0.5625f, +0.28125f,0.5625f, +0.289063f,0.5625f, +0.296875f,0.5625f, +0.304688f,0.5625f, +0.3125f,0.5625f, +0.320313f,0.5625f, +0.328125f,0.5625f, +0.335938f,0.5625f, +0.34375f,0.5625f, +0.351563f,0.5625f, +0.359375f,0.5625f, +0.367188f,0.5625f, +0.375f,0.5625f, +0.382813f,0.5625f, +0.390625f,0.5625f, +0.398438f,0.5625f, +0.40625f,0.5625f, +0.414063f,0.5625f, +0.421875f,0.5625f, +0.429688f,0.5625f, +0.4375f,0.5625f, +0.445313f,0.5625f, +0.453125f,0.5625f, +0.460938f,0.5625f, +0.46875f,0.5625f, +0.476563f,0.5625f, +0.484375f,0.5625f, +0.492188f,0.5625f, +0.5f,0.5625f, +0.507813f,0.5625f, +0.0f,0.570313f, +0.0078125f,0.570313f, +0.015625f,0.570313f, +0.0234375f,0.570313f, +0.03125f,0.570313f, +0.0390625f,0.570313f, +0.046875f,0.570313f, +0.0546875f,0.570313f, +0.0625f,0.570313f, +0.0703125f,0.570313f, +0.078125f,0.570313f, +0.0859375f,0.570313f, +0.09375f,0.570313f, +0.101563f,0.570313f, +0.109375f,0.570313f, +0.117188f,0.570313f, +0.125f,0.570313f, +0.132813f,0.570313f, +0.140625f,0.570313f, +0.148438f,0.570313f, +0.15625f,0.570313f, +0.164063f,0.570313f, +0.171875f,0.570313f, +0.179688f,0.570313f, +0.1875f,0.570313f, +0.195313f,0.570313f, +0.203125f,0.570313f, +0.210938f,0.570313f, +0.21875f,0.570313f, +0.226563f,0.570313f, +0.234375f,0.570313f, +0.242188f,0.570313f, +0.25f,0.570313f, +0.257813f,0.570313f, +0.265625f,0.570313f, +0.273438f,0.570313f, +0.28125f,0.570313f, +0.289063f,0.570313f, +0.296875f,0.570313f, +0.304688f,0.570313f, +0.3125f,0.570313f, +0.320313f,0.570313f, +0.328125f,0.570313f, +0.335938f,0.570313f, +0.34375f,0.570313f, +0.351563f,0.570313f, +0.359375f,0.570313f, +0.367188f,0.570313f, +0.375f,0.570313f, +0.382813f,0.570313f, +0.390625f,0.570313f, +0.398438f,0.570313f, +0.40625f,0.570313f, +0.414063f,0.570313f, +0.421875f,0.570313f, +0.429688f,0.570313f, +0.4375f,0.570313f, +0.445313f,0.570313f, +0.453125f,0.570313f, +0.460938f,0.570313f, +0.46875f,0.570313f, +0.476563f,0.570313f, +0.484375f,0.570313f, +0.492188f,0.570313f, +0.5f,0.570313f, +0.507813f,0.570313f, +0.0f,0.578125f, +0.0078125f,0.578125f, +0.015625f,0.578125f, +0.0234375f,0.578125f, +0.03125f,0.578125f, +0.0390625f,0.578125f, +0.046875f,0.578125f, +0.0546875f,0.578125f, +0.0625f,0.578125f, +0.0703125f,0.578125f, +0.078125f,0.578125f, +0.0859375f,0.578125f, +0.09375f,0.578125f, +0.101563f,0.578125f, +0.109375f,0.578125f, +0.117188f,0.578125f, +0.125f,0.578125f, +0.132813f,0.578125f, +0.140625f,0.578125f, +0.148438f,0.578125f, +0.15625f,0.578125f, +0.164063f,0.578125f, +0.171875f,0.578125f, +0.179688f,0.578125f, +0.1875f,0.578125f, +0.195313f,0.578125f, +0.203125f,0.578125f, +0.210938f,0.578125f, +0.21875f,0.578125f, +0.226563f,0.578125f, +0.234375f,0.578125f, +0.242188f,0.578125f, +0.25f,0.578125f, +0.257813f,0.578125f, +0.265625f,0.578125f, +0.273438f,0.578125f, +0.28125f,0.578125f, +0.289063f,0.578125f, +0.296875f,0.578125f, +0.304688f,0.578125f, +0.3125f,0.578125f, +0.320313f,0.578125f, +0.328125f,0.578125f, +0.335938f,0.578125f, +0.34375f,0.578125f, +0.351563f,0.578125f, +0.359375f,0.578125f, +0.367188f,0.578125f, +0.375f,0.578125f, +0.382813f,0.578125f, +0.390625f,0.578125f, +0.398438f,0.578125f, +0.40625f,0.578125f, +0.414063f,0.578125f, +0.421875f,0.578125f, +0.429688f,0.578125f, +0.4375f,0.578125f, +0.445313f,0.578125f, +0.453125f,0.578125f, +0.460938f,0.578125f, +0.46875f,0.578125f, +0.476563f,0.578125f, +0.484375f,0.578125f, +0.492188f,0.578125f, +0.5f,0.578125f, +0.507813f,0.578125f, +0.0f,0.585938f, +0.0078125f,0.585938f, +0.015625f,0.585938f, +0.0234375f,0.585938f, +0.03125f,0.585938f, +0.0390625f,0.585938f, +0.046875f,0.585938f, +0.0546875f,0.585938f, +0.0625f,0.585938f, +0.0703125f,0.585938f, +0.078125f,0.585938f, +0.0859375f,0.585938f, +0.09375f,0.585938f, +0.101563f,0.585938f, +0.109375f,0.585938f, +0.117188f,0.585938f, +0.125f,0.585938f, +0.132813f,0.585938f, +0.140625f,0.585938f, +0.148438f,0.585938f, +0.15625f,0.585938f, +0.164063f,0.585938f, +0.171875f,0.585938f, +0.179688f,0.585938f, +0.1875f,0.585938f, +0.195313f,0.585938f, +0.203125f,0.585938f, +0.210938f,0.585938f, +0.21875f,0.585938f, +0.226563f,0.585938f, +0.234375f,0.585938f, +0.242188f,0.585938f, +0.25f,0.585938f, +0.257813f,0.585938f, +0.265625f,0.585938f, +0.273438f,0.585938f, +0.28125f,0.585938f, +0.289063f,0.585938f, +0.296875f,0.585938f, +0.304688f,0.585938f, +0.3125f,0.585938f, +0.320313f,0.585938f, +0.328125f,0.585938f, +0.335938f,0.585938f, +0.34375f,0.585938f, +0.351563f,0.585938f, +0.359375f,0.585938f, +0.367188f,0.585938f, +0.375f,0.585938f, +0.382813f,0.585938f, +0.390625f,0.585938f, +0.398438f,0.585938f, +0.40625f,0.585938f, +0.414063f,0.585938f, +0.421875f,0.585938f, +0.429688f,0.585938f, +0.4375f,0.585938f, +0.445313f,0.585938f, +0.453125f,0.585938f, +0.460938f,0.585938f, +0.46875f,0.585938f, +0.476563f,0.585938f, +0.484375f,0.585938f, +0.492188f,0.585938f, +0.5f,0.585938f, +0.507813f,0.585938f, +0.0f,0.59375f, +0.0078125f,0.59375f, +0.015625f,0.59375f, +0.0234375f,0.59375f, +0.03125f,0.59375f, +0.0390625f,0.59375f, +0.046875f,0.59375f, +0.0546875f,0.59375f, +0.0625f,0.59375f, +0.0703125f,0.59375f, +0.078125f,0.59375f, +0.0859375f,0.59375f, +0.09375f,0.59375f, +0.101563f,0.59375f, +0.109375f,0.59375f, +0.117188f,0.59375f, +0.125f,0.59375f, +0.132813f,0.59375f, +0.140625f,0.59375f, +0.148438f,0.59375f, +0.15625f,0.59375f, +0.164063f,0.59375f, +0.171875f,0.59375f, +0.179688f,0.59375f, +0.1875f,0.59375f, +0.195313f,0.59375f, +0.203125f,0.59375f, +0.210938f,0.59375f, +0.21875f,0.59375f, +0.226563f,0.59375f, +0.234375f,0.59375f, +0.242188f,0.59375f, +0.25f,0.59375f, +0.257813f,0.59375f, +0.265625f,0.59375f, +0.273438f,0.59375f, +0.28125f,0.59375f, +0.289063f,0.59375f, +0.296875f,0.59375f, +0.304688f,0.59375f, +0.3125f,0.59375f, +0.320313f,0.59375f, +0.328125f,0.59375f, +0.335938f,0.59375f, +0.34375f,0.59375f, +0.351563f,0.59375f, +0.359375f,0.59375f, +0.367188f,0.59375f, +0.375f,0.59375f, +0.382813f,0.59375f, +0.390625f,0.59375f, +0.398438f,0.59375f, +0.40625f,0.59375f, +0.414063f,0.59375f, +0.421875f,0.59375f, +0.429688f,0.59375f, +0.4375f,0.59375f, +0.445313f,0.59375f, +0.453125f,0.59375f, +0.460938f,0.59375f, +0.46875f,0.59375f, +0.476563f,0.59375f, +0.484375f,0.59375f, +0.492188f,0.59375f, +0.5f,0.59375f, +0.507813f,0.59375f, +0.0f,0.601563f, +0.0078125f,0.601563f, +0.015625f,0.601563f, +0.0234375f,0.601563f, +0.03125f,0.601563f, +0.0390625f,0.601563f, +0.046875f,0.601563f, +0.0546875f,0.601563f, +0.0625f,0.601563f, +0.0703125f,0.601563f, +0.078125f,0.601563f, +0.0859375f,0.601563f, +0.09375f,0.601563f, +0.101563f,0.601563f, +0.109375f,0.601563f, +0.117188f,0.601563f, +0.125f,0.601563f, +0.132813f,0.601563f, +0.140625f,0.601563f, +0.148438f,0.601563f, +0.15625f,0.601563f, +0.164063f,0.601563f, +0.171875f,0.601563f, +0.179688f,0.601563f, +0.1875f,0.601563f, +0.195313f,0.601563f, +0.203125f,0.601563f, +0.210938f,0.601563f, +0.21875f,0.601563f, +0.226563f,0.601563f, +0.234375f,0.601563f, +0.242188f,0.601563f, +0.25f,0.601563f, +0.257813f,0.601563f, +0.265625f,0.601563f, +0.273438f,0.601563f, +0.28125f,0.601563f, +0.289063f,0.601563f, +0.296875f,0.601563f, +0.304688f,0.601563f, +0.3125f,0.601563f, +0.320313f,0.601563f, +0.328125f,0.601563f, +0.335938f,0.601563f, +0.34375f,0.601563f, +0.351563f,0.601563f, +0.359375f,0.601563f, +0.367188f,0.601563f, +0.375f,0.601563f, +0.382813f,0.601563f, +0.390625f,0.601563f, +0.398438f,0.601563f, +0.40625f,0.601563f, +0.414063f,0.601563f, +0.421875f,0.601563f, +0.429688f,0.601563f, +0.4375f,0.601563f, +0.445313f,0.601563f, +0.453125f,0.601563f, +0.460938f,0.601563f, +0.46875f,0.601563f, +0.476563f,0.601563f, +0.484375f,0.601563f, +0.492188f,0.601563f, +0.5f,0.601563f, +0.507813f,0.601563f, +0.0f,0.609375f, +0.0078125f,0.609375f, +0.015625f,0.609375f, +0.0234375f,0.609375f, +0.03125f,0.609375f, +0.0390625f,0.609375f, +0.046875f,0.609375f, +0.0546875f,0.609375f, +0.0625f,0.609375f, +0.0703125f,0.609375f, +0.078125f,0.609375f, +0.0859375f,0.609375f, +0.09375f,0.609375f, +0.101563f,0.609375f, +0.109375f,0.609375f, +0.117188f,0.609375f, +0.125f,0.609375f, +0.132813f,0.609375f, +0.140625f,0.609375f, +0.148438f,0.609375f, +0.15625f,0.609375f, +0.164063f,0.609375f, +0.171875f,0.609375f, +0.179688f,0.609375f, +0.1875f,0.609375f, +0.195313f,0.609375f, +0.203125f,0.609375f, +0.210938f,0.609375f, +0.21875f,0.609375f, +0.226563f,0.609375f, +0.234375f,0.609375f, +0.242188f,0.609375f, +0.25f,0.609375f, +0.257813f,0.609375f, +0.265625f,0.609375f, +0.273438f,0.609375f, +0.28125f,0.609375f, +0.289063f,0.609375f, +0.296875f,0.609375f, +0.304688f,0.609375f, +0.3125f,0.609375f, +0.320313f,0.609375f, +0.328125f,0.609375f, +0.335938f,0.609375f, +0.34375f,0.609375f, +0.351563f,0.609375f, +0.359375f,0.609375f, +0.367188f,0.609375f, +0.375f,0.609375f, +0.382813f,0.609375f, +0.390625f,0.609375f, +0.398438f,0.609375f, +0.40625f,0.609375f, +0.414063f,0.609375f, +0.421875f,0.609375f, +0.429688f,0.609375f, +0.4375f,0.609375f, +0.445313f,0.609375f, +0.453125f,0.609375f, +0.460938f,0.609375f, +0.46875f,0.609375f, +0.476563f,0.609375f, +0.484375f,0.609375f, +0.492188f,0.609375f, +0.5f,0.609375f, +0.507813f,0.609375f, +0.0f,0.617188f, +0.0078125f,0.617188f, +0.015625f,0.617188f, +0.0234375f,0.617188f, +0.03125f,0.617188f, +0.0390625f,0.617188f, +0.046875f,0.617188f, +0.0546875f,0.617188f, +0.0625f,0.617188f, +0.0703125f,0.617188f, +0.078125f,0.617188f, +0.0859375f,0.617188f, +0.09375f,0.617188f, +0.101563f,0.617188f, +0.109375f,0.617188f, +0.117188f,0.617188f, +0.125f,0.617188f, +0.132813f,0.617188f, +0.140625f,0.617188f, +0.148438f,0.617188f, +0.15625f,0.617188f, +0.164063f,0.617188f, +0.171875f,0.617188f, +0.179688f,0.617188f, +0.1875f,0.617188f, +0.195313f,0.617188f, +0.203125f,0.617188f, +0.210938f,0.617188f, +0.21875f,0.617188f, +0.226563f,0.617188f, +0.234375f,0.617188f, +0.242188f,0.617188f, +0.25f,0.617188f, +0.257813f,0.617188f, +0.265625f,0.617188f, +0.273438f,0.617188f, +0.28125f,0.617188f, +0.289063f,0.617188f, +0.296875f,0.617188f, +0.304688f,0.617188f, +0.3125f,0.617188f, +0.320313f,0.617188f, +0.328125f,0.617188f, +0.335938f,0.617188f, +0.34375f,0.617188f, +0.351563f,0.617188f, +0.359375f,0.617188f, +0.367188f,0.617188f, +0.375f,0.617188f, +0.382813f,0.617188f, +0.390625f,0.617188f, +0.398438f,0.617188f, +0.40625f,0.617188f, +0.414063f,0.617188f, +0.421875f,0.617188f, +0.429688f,0.617188f, +0.4375f,0.617188f, +0.445313f,0.617188f, +0.453125f,0.617188f, +0.460938f,0.617188f, +0.46875f,0.617188f, +0.476563f,0.617188f, +0.484375f,0.617188f, +0.492188f,0.617188f, +0.5f,0.617188f, +0.507813f,0.617188f, +0.0f,0.625f, +0.0078125f,0.625f, +0.015625f,0.625f, +0.0234375f,0.625f, +0.03125f,0.625f, +0.0390625f,0.625f, +0.046875f,0.625f, +0.0546875f,0.625f, +0.0625f,0.625f, +0.0703125f,0.625f, +0.078125f,0.625f, +0.0859375f,0.625f, +0.09375f,0.625f, +0.101563f,0.625f, +0.109375f,0.625f, +0.117188f,0.625f, +0.125f,0.625f, +0.132813f,0.625f, +0.140625f,0.625f, +0.148438f,0.625f, +0.15625f,0.625f, +0.164063f,0.625f, +0.171875f,0.625f, +0.179688f,0.625f, +0.1875f,0.625f, +0.195313f,0.625f, +0.203125f,0.625f, +0.210938f,0.625f, +0.21875f,0.625f, +0.226563f,0.625f, +0.234375f,0.625f, +0.242188f,0.625f, +0.25f,0.625f, +0.257813f,0.625f, +0.265625f,0.625f, +0.273438f,0.625f, +0.28125f,0.625f, +0.289063f,0.625f, +0.296875f,0.625f, +0.304688f,0.625f, +0.3125f,0.625f, +0.320313f,0.625f, +0.328125f,0.625f, +0.335938f,0.625f, +0.34375f,0.625f, +0.351563f,0.625f, +0.359375f,0.625f, +0.367188f,0.625f, +0.375f,0.625f, +0.382813f,0.625f, +0.390625f,0.625f, +0.398438f,0.625f, +0.40625f,0.625f, +0.414063f,0.625f, +0.421875f,0.625f, +0.429688f,0.625f, +0.4375f,0.625f, +0.445313f,0.625f, +0.453125f,0.625f, +0.460938f,0.625f, +0.46875f,0.625f, +0.476563f,0.625f, +0.484375f,0.625f, +0.492188f,0.625f, +0.5f,0.625f, +0.507813f,0.625f, +0.0f,0.632813f, +0.0078125f,0.632813f, +0.015625f,0.632813f, +0.0234375f,0.632813f, +0.03125f,0.632813f, +0.0390625f,0.632813f, +0.046875f,0.632813f, +0.0546875f,0.632813f, +0.0625f,0.632813f, +0.0703125f,0.632813f, +0.078125f,0.632813f, +0.0859375f,0.632813f, +0.09375f,0.632813f, +0.101563f,0.632813f, +0.109375f,0.632813f, +0.117188f,0.632813f, +0.125f,0.632813f, +0.132813f,0.632813f, +0.140625f,0.632813f, +0.148438f,0.632813f, +0.15625f,0.632813f, +0.164063f,0.632813f, +0.171875f,0.632813f, +0.179688f,0.632813f, +0.1875f,0.632813f, +0.195313f,0.632813f, +0.203125f,0.632813f, +0.210938f,0.632813f, +0.21875f,0.632813f, +0.226563f,0.632813f, +0.234375f,0.632813f, +0.242188f,0.632813f, +0.25f,0.632813f, +0.257813f,0.632813f, +0.265625f,0.632813f, +0.273438f,0.632813f, +0.28125f,0.632813f, +0.289063f,0.632813f, +0.296875f,0.632813f, +0.304688f,0.632813f, +0.3125f,0.632813f, +0.320313f,0.632813f, +0.328125f,0.632813f, +0.335938f,0.632813f, +0.34375f,0.632813f, +0.351563f,0.632813f, +0.359375f,0.632813f, +0.367188f,0.632813f, +0.375f,0.632813f, +0.382813f,0.632813f, +0.390625f,0.632813f, +0.398438f,0.632813f, +0.40625f,0.632813f, +0.414063f,0.632813f, +0.421875f,0.632813f, +0.429688f,0.632813f, +0.4375f,0.632813f, +0.445313f,0.632813f, +0.453125f,0.632813f, +0.460938f,0.632813f, +0.46875f,0.632813f, +0.476563f,0.632813f, +0.484375f,0.632813f, +0.492188f,0.632813f, +0.5f,0.632813f, +0.507813f,0.632813f, +0.0f,0.640625f, +0.0078125f,0.640625f, +0.015625f,0.640625f, +0.0234375f,0.640625f, +0.03125f,0.640625f, +0.0390625f,0.640625f, +0.046875f,0.640625f, +0.0546875f,0.640625f, +0.0625f,0.640625f, +0.0703125f,0.640625f, +0.078125f,0.640625f, +0.0859375f,0.640625f, +0.09375f,0.640625f, +0.101563f,0.640625f, +0.109375f,0.640625f, +0.117188f,0.640625f, +0.125f,0.640625f, +0.132813f,0.640625f, +0.140625f,0.640625f, +0.148438f,0.640625f, +0.15625f,0.640625f, +0.164063f,0.640625f, +0.171875f,0.640625f, +0.179688f,0.640625f, +0.1875f,0.640625f, +0.195313f,0.640625f, +0.203125f,0.640625f, +0.210938f,0.640625f, +0.21875f,0.640625f, +0.226563f,0.640625f, +0.234375f,0.640625f, +0.242188f,0.640625f, +0.25f,0.640625f, +0.257813f,0.640625f, +0.265625f,0.640625f, +0.273438f,0.640625f, +0.28125f,0.640625f, +0.289063f,0.640625f, +0.296875f,0.640625f, +0.304688f,0.640625f, +0.3125f,0.640625f, +0.320313f,0.640625f, +0.328125f,0.640625f, +0.335938f,0.640625f, +0.34375f,0.640625f, +0.351563f,0.640625f, +0.359375f,0.640625f, +0.367188f,0.640625f, +0.375f,0.640625f, +0.382813f,0.640625f, +0.390625f,0.640625f, +0.398438f,0.640625f, +0.40625f,0.640625f, +0.414063f,0.640625f, +0.421875f,0.640625f, +0.429688f,0.640625f, +0.4375f,0.640625f, +0.445313f,0.640625f, +0.453125f,0.640625f, +0.460938f,0.640625f, +0.46875f,0.640625f, +0.476563f,0.640625f, +0.484375f,0.640625f, +0.492188f,0.640625f, +0.5f,0.640625f, +0.507813f,0.640625f, +0.0f,0.648438f, +0.0078125f,0.648438f, +0.015625f,0.648438f, +0.0234375f,0.648438f, +0.03125f,0.648438f, +0.0390625f,0.648438f, +0.046875f,0.648438f, +0.0546875f,0.648438f, +0.0625f,0.648438f, +0.0703125f,0.648438f, +0.078125f,0.648438f, +0.0859375f,0.648438f, +0.09375f,0.648438f, +0.101563f,0.648438f, +0.109375f,0.648438f, +0.117188f,0.648438f, +0.125f,0.648438f, +0.132813f,0.648438f, +0.140625f,0.648438f, +0.148438f,0.648438f, +0.15625f,0.648438f, +0.164063f,0.648438f, +0.171875f,0.648438f, +0.179688f,0.648438f, +0.1875f,0.648438f, +0.195313f,0.648438f, +0.203125f,0.648438f, +0.210938f,0.648438f, +0.21875f,0.648438f, +0.226563f,0.648438f, +0.234375f,0.648438f, +0.242188f,0.648438f, +0.25f,0.648438f, +0.257813f,0.648438f, +0.265625f,0.648438f, +0.273438f,0.648438f, +0.28125f,0.648438f, +0.289063f,0.648438f, +0.296875f,0.648438f, +0.304688f,0.648438f, +0.3125f,0.648438f, +0.320313f,0.648438f, +0.328125f,0.648438f, +0.335938f,0.648438f, +0.34375f,0.648438f, +0.351563f,0.648438f, +0.359375f,0.648438f, +0.367188f,0.648438f, +0.375f,0.648438f, +0.382813f,0.648438f, +0.390625f,0.648438f, +0.398438f,0.648438f, +0.40625f,0.648438f, +0.414063f,0.648438f, +0.421875f,0.648438f, +0.429688f,0.648438f, +0.4375f,0.648438f, +0.445313f,0.648438f, +0.453125f,0.648438f, +0.460938f,0.648438f, +0.46875f,0.648438f, +0.476563f,0.648438f, +0.484375f,0.648438f, +0.492188f,0.648438f, +0.5f,0.648438f, +0.507813f,0.648438f, +0.0f,0.65625f, +0.0078125f,0.65625f, +0.015625f,0.65625f, +0.0234375f,0.65625f, +0.03125f,0.65625f, +0.0390625f,0.65625f, +0.046875f,0.65625f, +0.0546875f,0.65625f, +0.0625f,0.65625f, +0.0703125f,0.65625f, +0.078125f,0.65625f, +0.0859375f,0.65625f, +0.09375f,0.65625f, +0.101563f,0.65625f, +0.109375f,0.65625f, +0.117188f,0.65625f, +0.125f,0.65625f, +0.132813f,0.65625f, +0.140625f,0.65625f, +0.148438f,0.65625f, +0.15625f,0.65625f, +0.164063f,0.65625f, +0.171875f,0.65625f, +0.179688f,0.65625f, +0.1875f,0.65625f, +0.195313f,0.65625f, +0.203125f,0.65625f, +0.210938f,0.65625f, +0.21875f,0.65625f, +0.226563f,0.65625f, +0.234375f,0.65625f, +0.242188f,0.65625f, +0.25f,0.65625f, +0.257813f,0.65625f, +0.265625f,0.65625f, +0.273438f,0.65625f, +0.28125f,0.65625f, +0.289063f,0.65625f, +0.296875f,0.65625f, +0.304688f,0.65625f, +0.3125f,0.65625f, +0.320313f,0.65625f, +0.328125f,0.65625f, +0.335938f,0.65625f, +0.34375f,0.65625f, +0.351563f,0.65625f, +0.359375f,0.65625f, +0.367188f,0.65625f, +0.375f,0.65625f, +0.382813f,0.65625f, +0.390625f,0.65625f, +0.398438f,0.65625f, +0.40625f,0.65625f, +0.414063f,0.65625f, +0.421875f,0.65625f, +0.429688f,0.65625f, +0.4375f,0.65625f, +0.445313f,0.65625f, +0.453125f,0.65625f, +0.460938f,0.65625f, +0.46875f,0.65625f, +0.476563f,0.65625f, +0.484375f,0.65625f, +0.492188f,0.65625f, +0.5f,0.65625f, +0.507813f,0.65625f, +0.0f,0.664063f, +0.0078125f,0.664063f, +0.015625f,0.664063f, +0.0234375f,0.664063f, +0.03125f,0.664063f, +0.0390625f,0.664063f, +0.046875f,0.664063f, +0.0546875f,0.664063f, +0.0625f,0.664063f, +0.0703125f,0.664063f, +0.078125f,0.664063f, +0.0859375f,0.664063f, +0.09375f,0.664063f, +0.101563f,0.664063f, +0.109375f,0.664063f, +0.117188f,0.664063f, +0.125f,0.664063f, +0.132813f,0.664063f, +0.140625f,0.664063f, +0.148438f,0.664063f, +0.15625f,0.664063f, +0.164063f,0.664063f, +0.171875f,0.664063f, +0.179688f,0.664063f, +0.1875f,0.664063f, +0.195313f,0.664063f, +0.203125f,0.664063f, +0.210938f,0.664063f, +0.21875f,0.664063f, +0.226563f,0.664063f, +0.234375f,0.664063f, +0.242188f,0.664063f, +0.25f,0.664063f, +0.257813f,0.664063f, +0.265625f,0.664063f, +0.273438f,0.664063f, +0.28125f,0.664063f, +0.289063f,0.664063f, +0.296875f,0.664063f, +0.304688f,0.664063f, +0.3125f,0.664063f, +0.320313f,0.664063f, +0.328125f,0.664063f, +0.335938f,0.664063f, +0.34375f,0.664063f, +0.351563f,0.664063f, +0.359375f,0.664063f, +0.367188f,0.664063f, +0.375f,0.664063f, +0.382813f,0.664063f, +0.390625f,0.664063f, +0.398438f,0.664063f, +0.40625f,0.664063f, +0.414063f,0.664063f, +0.421875f,0.664063f, +0.429688f,0.664063f, +0.4375f,0.664063f, +0.445313f,0.664063f, +0.453125f,0.664063f, +0.460938f,0.664063f, +0.46875f,0.664063f, +0.476563f,0.664063f, +0.484375f,0.664063f, +0.492188f,0.664063f, +0.5f,0.664063f, +0.507813f,0.664063f, +0.0f,0.671875f, +0.0078125f,0.671875f, +0.015625f,0.671875f, +0.0234375f,0.671875f, +0.03125f,0.671875f, +0.0390625f,0.671875f, +0.046875f,0.671875f, +0.0546875f,0.671875f, +0.0625f,0.671875f, +0.0703125f,0.671875f, +0.078125f,0.671875f, +0.0859375f,0.671875f, +0.09375f,0.671875f, +0.101563f,0.671875f, +0.109375f,0.671875f, +0.117188f,0.671875f, +0.125f,0.671875f, +0.132813f,0.671875f, +0.140625f,0.671875f, +0.148438f,0.671875f, +0.15625f,0.671875f, +0.164063f,0.671875f, +0.171875f,0.671875f, +0.179688f,0.671875f, +0.1875f,0.671875f, +0.195313f,0.671875f, +0.203125f,0.671875f, +0.210938f,0.671875f, +0.21875f,0.671875f, +0.226563f,0.671875f, +0.234375f,0.671875f, +0.242188f,0.671875f, +0.25f,0.671875f, +0.257813f,0.671875f, +0.265625f,0.671875f, +0.273438f,0.671875f, +0.28125f,0.671875f, +0.289063f,0.671875f, +0.296875f,0.671875f, +0.304688f,0.671875f, +0.3125f,0.671875f, +0.320313f,0.671875f, +0.328125f,0.671875f, +0.335938f,0.671875f, +0.34375f,0.671875f, +0.351563f,0.671875f, +0.359375f,0.671875f, +0.367188f,0.671875f, +0.375f,0.671875f, +0.382813f,0.671875f, +0.390625f,0.671875f, +0.398438f,0.671875f, +0.40625f,0.671875f, +0.414063f,0.671875f, +0.421875f,0.671875f, +0.429688f,0.671875f, +0.4375f,0.671875f, +0.445313f,0.671875f, +0.453125f,0.671875f, +0.460938f,0.671875f, +0.46875f,0.671875f, +0.476563f,0.671875f, +0.484375f,0.671875f, +0.492188f,0.671875f, +0.5f,0.671875f, +0.507813f,0.671875f, +0.0f,0.679688f, +0.0078125f,0.679688f, +0.015625f,0.679688f, +0.0234375f,0.679688f, +0.03125f,0.679688f, +0.0390625f,0.679688f, +0.046875f,0.679688f, +0.0546875f,0.679688f, +0.0625f,0.679688f, +0.0703125f,0.679688f, +0.078125f,0.679688f, +0.0859375f,0.679688f, +0.09375f,0.679688f, +0.101563f,0.679688f, +0.109375f,0.679688f, +0.117188f,0.679688f, +0.125f,0.679688f, +0.132813f,0.679688f, +0.140625f,0.679688f, +0.148438f,0.679688f, +0.15625f,0.679688f, +0.164063f,0.679688f, +0.171875f,0.679688f, +0.179688f,0.679688f, +0.1875f,0.679688f, +0.195313f,0.679688f, +0.203125f,0.679688f, +0.210938f,0.679688f, +0.21875f,0.679688f, +0.226563f,0.679688f, +0.234375f,0.679688f, +0.242188f,0.679688f, +0.25f,0.679688f, +0.257813f,0.679688f, +0.265625f,0.679688f, +0.273438f,0.679688f, +0.28125f,0.679688f, +0.289063f,0.679688f, +0.296875f,0.679688f, +0.304688f,0.679688f, +0.3125f,0.679688f, +0.320313f,0.679688f, +0.328125f,0.679688f, +0.335938f,0.679688f, +0.34375f,0.679688f, +0.351563f,0.679688f, +0.359375f,0.679688f, +0.367188f,0.679688f, +0.375f,0.679688f, +0.382813f,0.679688f, +0.390625f,0.679688f, +0.398438f,0.679688f, +0.40625f,0.679688f, +0.414063f,0.679688f, +0.421875f,0.679688f, +0.429688f,0.679688f, +0.4375f,0.679688f, +0.445313f,0.679688f, +0.453125f,0.679688f, +0.460938f,0.679688f, +0.46875f,0.679688f, +0.476563f,0.679688f, +0.484375f,0.679688f, +0.492188f,0.679688f, +0.5f,0.679688f, +0.507813f,0.679688f, +0.0f,0.6875f, +0.0078125f,0.6875f, +0.015625f,0.6875f, +0.0234375f,0.6875f, +0.03125f,0.6875f, +0.0390625f,0.6875f, +0.046875f,0.6875f, +0.0546875f,0.6875f, +0.0625f,0.6875f, +0.0703125f,0.6875f, +0.078125f,0.6875f, +0.0859375f,0.6875f, +0.09375f,0.6875f, +0.101563f,0.6875f, +0.109375f,0.6875f, +0.117188f,0.6875f, +0.125f,0.6875f, +0.132813f,0.6875f, +0.140625f,0.6875f, +0.148438f,0.6875f, +0.15625f,0.6875f, +0.164063f,0.6875f, +0.171875f,0.6875f, +0.179688f,0.6875f, +0.1875f,0.6875f, +0.195313f,0.6875f, +0.203125f,0.6875f, +0.210938f,0.6875f, +0.21875f,0.6875f, +0.226563f,0.6875f, +0.234375f,0.6875f, +0.242188f,0.6875f, +0.25f,0.6875f, +0.257813f,0.6875f, +0.265625f,0.6875f, +0.273438f,0.6875f, +0.28125f,0.6875f, +0.289063f,0.6875f, +0.296875f,0.6875f, +0.304688f,0.6875f, +0.3125f,0.6875f, +0.320313f,0.6875f, +0.328125f,0.6875f, +0.335938f,0.6875f, +0.34375f,0.6875f, +0.351563f,0.6875f, +0.359375f,0.6875f, +0.367188f,0.6875f, +0.375f,0.6875f, +0.382813f,0.6875f, +0.390625f,0.6875f, +0.398438f,0.6875f, +0.40625f,0.6875f, +0.414063f,0.6875f, +0.421875f,0.6875f, +0.429688f,0.6875f, +0.4375f,0.6875f, +0.445313f,0.6875f, +0.453125f,0.6875f, +0.460938f,0.6875f, +0.46875f,0.6875f, +0.476563f,0.6875f, +0.484375f,0.6875f, +0.492188f,0.6875f, +0.5f,0.6875f, +0.507813f,0.6875f, +0.0f,0.695313f, +0.0078125f,0.695313f, +0.015625f,0.695313f, +0.0234375f,0.695313f, +0.03125f,0.695313f, +0.0390625f,0.695313f, +0.046875f,0.695313f, +0.0546875f,0.695313f, +0.0625f,0.695313f, +0.0703125f,0.695313f, +0.078125f,0.695313f, +0.0859375f,0.695313f, +0.09375f,0.695313f, +0.101563f,0.695313f, +0.109375f,0.695313f, +0.117188f,0.695313f, +0.125f,0.695313f, +0.132813f,0.695313f, +0.140625f,0.695313f, +0.148438f,0.695313f, +0.15625f,0.695313f, +0.164063f,0.695313f, +0.171875f,0.695313f, +0.179688f,0.695313f, +0.1875f,0.695313f, +0.195313f,0.695313f, +0.203125f,0.695313f, +0.210938f,0.695313f, +0.21875f,0.695313f, +0.226563f,0.695313f, +0.234375f,0.695313f, +0.242188f,0.695313f, +0.25f,0.695313f, +0.257813f,0.695313f, +0.265625f,0.695313f, +0.273438f,0.695313f, +0.28125f,0.695313f, +0.289063f,0.695313f, +0.296875f,0.695313f, +0.304688f,0.695313f, +0.3125f,0.695313f, +0.320313f,0.695313f, +0.328125f,0.695313f, +0.335938f,0.695313f, +0.34375f,0.695313f, +0.351563f,0.695313f, +0.359375f,0.695313f, +0.367188f,0.695313f, +0.375f,0.695313f, +0.382813f,0.695313f, +0.390625f,0.695313f, +0.398438f,0.695313f, +0.40625f,0.695313f, +0.414063f,0.695313f, +0.421875f,0.695313f, +0.429688f,0.695313f, +0.4375f,0.695313f, +0.445313f,0.695313f, +0.453125f,0.695313f, +0.460938f,0.695313f, +0.46875f,0.695313f, +0.476563f,0.695313f, +0.484375f,0.695313f, +0.492188f,0.695313f, +0.5f,0.695313f, +0.507813f,0.695313f, +0.0f,0.703125f, +0.0078125f,0.703125f, +0.015625f,0.703125f, +0.0234375f,0.703125f, +0.03125f,0.703125f, +0.0390625f,0.703125f, +0.046875f,0.703125f, +0.0546875f,0.703125f, +0.0625f,0.703125f, +0.0703125f,0.703125f, +0.078125f,0.703125f, +0.0859375f,0.703125f, +0.09375f,0.703125f, +0.101563f,0.703125f, +0.109375f,0.703125f, +0.117188f,0.703125f, +0.125f,0.703125f, +0.132813f,0.703125f, +0.140625f,0.703125f, +0.148438f,0.703125f, +0.15625f,0.703125f, +0.164063f,0.703125f, +0.171875f,0.703125f, +0.179688f,0.703125f, +0.1875f,0.703125f, +0.195313f,0.703125f, +0.203125f,0.703125f, +0.210938f,0.703125f, +0.21875f,0.703125f, +0.226563f,0.703125f, +0.234375f,0.703125f, +0.242188f,0.703125f, +0.25f,0.703125f, +0.257813f,0.703125f, +0.265625f,0.703125f, +0.273438f,0.703125f, +0.28125f,0.703125f, +0.289063f,0.703125f, +0.296875f,0.703125f, +0.304688f,0.703125f, +0.3125f,0.703125f, +0.320313f,0.703125f, +0.328125f,0.703125f, +0.335938f,0.703125f, +0.34375f,0.703125f, +0.351563f,0.703125f, +0.359375f,0.703125f, +0.367188f,0.703125f, +0.375f,0.703125f, +0.382813f,0.703125f, +0.390625f,0.703125f, +0.398438f,0.703125f, +0.40625f,0.703125f, +0.414063f,0.703125f, +0.421875f,0.703125f, +0.429688f,0.703125f, +0.4375f,0.703125f, +0.445313f,0.703125f, +0.453125f,0.703125f, +0.460938f,0.703125f, +0.46875f,0.703125f, +0.476563f,0.703125f, +0.484375f,0.703125f, +0.492188f,0.703125f, +0.5f,0.703125f, +0.507813f,0.703125f, +0.0f,0.710938f, +0.0078125f,0.710938f, +0.015625f,0.710938f, +0.0234375f,0.710938f, +0.03125f,0.710938f, +0.0390625f,0.710938f, +0.046875f,0.710938f, +0.0546875f,0.710938f, +0.0625f,0.710938f, +0.0703125f,0.710938f, +0.078125f,0.710938f, +0.0859375f,0.710938f, +0.09375f,0.710938f, +0.101563f,0.710938f, +0.109375f,0.710938f, +0.117188f,0.710938f, +0.125f,0.710938f, +0.132813f,0.710938f, +0.140625f,0.710938f, +0.148438f,0.710938f, +0.15625f,0.710938f, +0.164063f,0.710938f, +0.171875f,0.710938f, +0.179688f,0.710938f, +0.1875f,0.710938f, +0.195313f,0.710938f, +0.203125f,0.710938f, +0.210938f,0.710938f, +0.21875f,0.710938f, +0.226563f,0.710938f, +0.234375f,0.710938f, +0.242188f,0.710938f, +0.25f,0.710938f, +0.257813f,0.710938f, +0.265625f,0.710938f, +0.273438f,0.710938f, +0.28125f,0.710938f, +0.289063f,0.710938f, +0.296875f,0.710938f, +0.304688f,0.710938f, +0.3125f,0.710938f, +0.320313f,0.710938f, +0.328125f,0.710938f, +0.335938f,0.710938f, +0.34375f,0.710938f, +0.351563f,0.710938f, +0.359375f,0.710938f, +0.367188f,0.710938f, +0.375f,0.710938f, +0.382813f,0.710938f, +0.390625f,0.710938f, +0.398438f,0.710938f, +0.40625f,0.710938f, +0.414063f,0.710938f, +0.421875f,0.710938f, +0.429688f,0.710938f, +0.4375f,0.710938f, +0.445313f,0.710938f, +0.453125f,0.710938f, +0.460938f,0.710938f, +0.46875f,0.710938f, +0.476563f,0.710938f, +0.484375f,0.710938f, +0.492188f,0.710938f, +0.5f,0.710938f, +0.507813f,0.710938f, +0.0f,0.71875f, +0.0078125f,0.71875f, +0.015625f,0.71875f, +0.0234375f,0.71875f, +0.03125f,0.71875f, +0.0390625f,0.71875f, +0.046875f,0.71875f, +0.0546875f,0.71875f, +0.0625f,0.71875f, +0.0703125f,0.71875f, +0.078125f,0.71875f, +0.0859375f,0.71875f, +0.09375f,0.71875f, +0.101563f,0.71875f, +0.109375f,0.71875f, +0.117188f,0.71875f, +0.125f,0.71875f, +0.132813f,0.71875f, +0.140625f,0.71875f, +0.148438f,0.71875f, +0.15625f,0.71875f, +0.164063f,0.71875f, +0.171875f,0.71875f, +0.179688f,0.71875f, +0.1875f,0.71875f, +0.195313f,0.71875f, +0.203125f,0.71875f, +0.210938f,0.71875f, +0.21875f,0.71875f, +0.226563f,0.71875f, +0.234375f,0.71875f, +0.242188f,0.71875f, +0.25f,0.71875f, +0.257813f,0.71875f, +0.265625f,0.71875f, +0.273438f,0.71875f, +0.28125f,0.71875f, +0.289063f,0.71875f, +0.296875f,0.71875f, +0.304688f,0.71875f, +0.3125f,0.71875f, +0.320313f,0.71875f, +0.328125f,0.71875f, +0.335938f,0.71875f, +0.34375f,0.71875f, +0.351563f,0.71875f, +0.359375f,0.71875f, +0.367188f,0.71875f, +0.375f,0.71875f, +0.382813f,0.71875f, +0.390625f,0.71875f, +0.398438f,0.71875f, +0.40625f,0.71875f, +0.414063f,0.71875f, +0.421875f,0.71875f, +0.429688f,0.71875f, +0.4375f,0.71875f, +0.445313f,0.71875f, +0.453125f,0.71875f, +0.460938f,0.71875f, +0.46875f,0.71875f, +0.476563f,0.71875f, +0.484375f,0.71875f, +0.492188f,0.71875f, +0.5f,0.71875f, +0.507813f,0.71875f, +0.0f,0.726563f, +0.0078125f,0.726563f, +0.015625f,0.726563f, +0.0234375f,0.726563f, +0.03125f,0.726563f, +0.0390625f,0.726563f, +0.046875f,0.726563f, +0.0546875f,0.726563f, +0.0625f,0.726563f, +0.0703125f,0.726563f, +0.078125f,0.726563f, +0.0859375f,0.726563f, +0.09375f,0.726563f, +0.101563f,0.726563f, +0.109375f,0.726563f, +0.117188f,0.726563f, +0.125f,0.726563f, +0.132813f,0.726563f, +0.140625f,0.726563f, +0.148438f,0.726563f, +0.15625f,0.726563f, +0.164063f,0.726563f, +0.171875f,0.726563f, +0.179688f,0.726563f, +0.1875f,0.726563f, +0.195313f,0.726563f, +0.203125f,0.726563f, +0.210938f,0.726563f, +0.21875f,0.726563f, +0.226563f,0.726563f, +0.234375f,0.726563f, +0.242188f,0.726563f, +0.25f,0.726563f, +0.257813f,0.726563f, +0.265625f,0.726563f, +0.273438f,0.726563f, +0.28125f,0.726563f, +0.289063f,0.726563f, +0.296875f,0.726563f, +0.304688f,0.726563f, +0.3125f,0.726563f, +0.320313f,0.726563f, +0.328125f,0.726563f, +0.335938f,0.726563f, +0.34375f,0.726563f, +0.351563f,0.726563f, +0.359375f,0.726563f, +0.367188f,0.726563f, +0.375f,0.726563f, +0.382813f,0.726563f, +0.390625f,0.726563f, +0.398438f,0.726563f, +0.40625f,0.726563f, +0.414063f,0.726563f, +0.421875f,0.726563f, +0.429688f,0.726563f, +0.4375f,0.726563f, +0.445313f,0.726563f, +0.453125f,0.726563f, +0.460938f,0.726563f, +0.46875f,0.726563f, +0.476563f,0.726563f, +0.484375f,0.726563f, +0.492188f,0.726563f, +0.5f,0.726563f, +0.507813f,0.726563f, +0.0f,0.734375f, +0.0078125f,0.734375f, +0.015625f,0.734375f, +0.0234375f,0.734375f, +0.03125f,0.734375f, +0.0390625f,0.734375f, +0.046875f,0.734375f, +0.0546875f,0.734375f, +0.0625f,0.734375f, +0.0703125f,0.734375f, +0.078125f,0.734375f, +0.0859375f,0.734375f, +0.09375f,0.734375f, +0.101563f,0.734375f, +0.109375f,0.734375f, +0.117188f,0.734375f, +0.125f,0.734375f, +0.132813f,0.734375f, +0.140625f,0.734375f, +0.148438f,0.734375f, +0.15625f,0.734375f, +0.164063f,0.734375f, +0.171875f,0.734375f, +0.179688f,0.734375f, +0.1875f,0.734375f, +0.195313f,0.734375f, +0.203125f,0.734375f, +0.210938f,0.734375f, +0.21875f,0.734375f, +0.226563f,0.734375f, +0.234375f,0.734375f, +0.242188f,0.734375f, +0.25f,0.734375f, +0.257813f,0.734375f, +0.265625f,0.734375f, +0.273438f,0.734375f, +0.28125f,0.734375f, +0.289063f,0.734375f, +0.296875f,0.734375f, +0.304688f,0.734375f, +0.3125f,0.734375f, +0.320313f,0.734375f, +0.328125f,0.734375f, +0.335938f,0.734375f, +0.34375f,0.734375f, +0.351563f,0.734375f, +0.359375f,0.734375f, +0.367188f,0.734375f, +0.375f,0.734375f, +0.382813f,0.734375f, +0.390625f,0.734375f, +0.398438f,0.734375f, +0.40625f,0.734375f, +0.414063f,0.734375f, +0.421875f,0.734375f, +0.429688f,0.734375f, +0.4375f,0.734375f, +0.445313f,0.734375f, +0.453125f,0.734375f, +0.460938f,0.734375f, +0.46875f,0.734375f, +0.476563f,0.734375f, +0.484375f,0.734375f, +0.492188f,0.734375f, +0.5f,0.734375f, +0.507813f,0.734375f, +0.0f,0.742188f, +0.0078125f,0.742188f, +0.015625f,0.742188f, +0.0234375f,0.742188f, +0.03125f,0.742188f, +0.0390625f,0.742188f, +0.046875f,0.742188f, +0.0546875f,0.742188f, +0.0625f,0.742188f, +0.0703125f,0.742188f, +0.078125f,0.742188f, +0.0859375f,0.742188f, +0.09375f,0.742188f, +0.101563f,0.742188f, +0.109375f,0.742188f, +0.117188f,0.742188f, +0.125f,0.742188f, +0.132813f,0.742188f, +0.140625f,0.742188f, +0.148438f,0.742188f, +0.15625f,0.742188f, +0.164063f,0.742188f, +0.171875f,0.742188f, +0.179688f,0.742188f, +0.1875f,0.742188f, +0.195313f,0.742188f, +0.203125f,0.742188f, +0.210938f,0.742188f, +0.21875f,0.742188f, +0.226563f,0.742188f, +0.234375f,0.742188f, +0.242188f,0.742188f, +0.25f,0.742188f, +0.257813f,0.742188f, +0.265625f,0.742188f, +0.273438f,0.742188f, +0.28125f,0.742188f, +0.289063f,0.742188f, +0.296875f,0.742188f, +0.304688f,0.742188f, +0.3125f,0.742188f, +0.320313f,0.742188f, +0.328125f,0.742188f, +0.335938f,0.742188f, +0.34375f,0.742188f, +0.351563f,0.742188f, +0.359375f,0.742188f, +0.367188f,0.742188f, +0.375f,0.742188f, +0.382813f,0.742188f, +0.390625f,0.742188f, +0.398438f,0.742188f, +0.40625f,0.742188f, +0.414063f,0.742188f, +0.421875f,0.742188f, +0.429688f,0.742188f, +0.4375f,0.742188f, +0.445313f,0.742188f, +0.453125f,0.742188f, +0.460938f,0.742188f, +0.46875f,0.742188f, +0.476563f,0.742188f, +0.484375f,0.742188f, +0.492188f,0.742188f, +0.5f,0.742188f, +0.507813f,0.742188f, +0.0f,0.75f, +0.0078125f,0.75f, +0.015625f,0.75f, +0.0234375f,0.75f, +0.03125f,0.75f, +0.0390625f,0.75f, +0.046875f,0.75f, +0.0546875f,0.75f, +0.0625f,0.75f, +0.0703125f,0.75f, +0.078125f,0.75f, +0.0859375f,0.75f, +0.09375f,0.75f, +0.101563f,0.75f, +0.109375f,0.75f, +0.117188f,0.75f, +0.125f,0.75f, +0.132813f,0.75f, +0.140625f,0.75f, +0.148438f,0.75f, +0.15625f,0.75f, +0.164063f,0.75f, +0.171875f,0.75f, +0.179688f,0.75f, +0.1875f,0.75f, +0.195313f,0.75f, +0.203125f,0.75f, +0.210938f,0.75f, +0.21875f,0.75f, +0.226563f,0.75f, +0.234375f,0.75f, +0.242188f,0.75f, +0.25f,0.75f, +0.257813f,0.75f, +0.265625f,0.75f, +0.273438f,0.75f, +0.28125f,0.75f, +0.289063f,0.75f, +0.296875f,0.75f, +0.304688f,0.75f, +0.3125f,0.75f, +0.320313f,0.75f, +0.328125f,0.75f, +0.335938f,0.75f, +0.34375f,0.75f, +0.351563f,0.75f, +0.359375f,0.75f, +0.367188f,0.75f, +0.375f,0.75f, +0.382813f,0.75f, +0.390625f,0.75f, +0.398438f,0.75f, +0.40625f,0.75f, +0.414063f,0.75f, +0.421875f,0.75f, +0.429688f,0.75f, +0.4375f,0.75f, +0.445313f,0.75f, +0.453125f,0.75f, +0.460938f,0.75f, +0.46875f,0.75f, +0.476563f,0.75f, +0.484375f,0.75f, +0.492188f,0.75f, +0.5f,0.75f, +0.507813f,0.75f, +}; + +unsigned short Landscape05Idx[] = { +0,1,2, +3,2,1, +2,3,4, +5,4,3, +4,5,6, +7,6,5, +6,7,8, +9,8,7, +8,9,10, +11,10,9, +10,11,12, +13,12,11, +12,13,14, +15,14,13, +14,15,16, +17,16,15, +16,17,18, +19,18,17, +18,19,20, +21,20,19, +20,21,22, +23,22,21, +22,23,24, +25,24,23, +24,25,26, +27,26,25, +26,27,28, +29,28,27, +28,29,30, +31,30,29, +30,31,32, +33,32,31, +32,33,34, +35,34,33, +34,35,36, +37,36,35, +36,37,38, +39,38,37, +38,39,40, +41,40,39, +40,41,42, +43,42,41, +42,43,44, +45,44,43, +44,45,46, +47,46,45, +46,47,48, +49,48,47, +48,49,50, +51,50,49, +50,51,52, +53,52,51, +52,53,54, +55,54,53, +54,55,56, +57,56,55, +56,57,58, +59,58,57, +58,59,60, +61,60,59, +60,61,62, +63,62,61, +62,63,64, +65,64,63, +64,65,66, +67,66,65, +66,67,68, +69,68,67, +68,69,70, +71,70,69, +70,71,72, +73,72,71, +72,73,74, +75,74,73, +74,75,76, +77,76,75, +76,77,78, +79,78,77, +78,79,80, +81,80,79, +80,81,82, +83,82,81, +82,83,84, +85,84,83, +84,85,86, +87,86,85, +86,87,88, +89,88,87, +88,89,90, +91,90,89, +90,91,92, +93,92,91, +92,93,94, +95,94,93, +94,95,96, +97,96,95, +96,97,98, +99,98,97, +98,99,100, +101,100,99, +100,101,102, +103,102,101, +102,103,104, +105,104,103, +104,105,106, +107,106,105, +106,107,108, +109,108,107, +108,109,110, +111,110,109, +110,111,112, +113,112,111, +112,113,114, +115,114,113, +114,115,116, +117,116,115, +116,117,118, +119,118,117, +118,119,120, +121,120,119, +120,121,122, +123,122,121, +122,123,124, +125,124,123, +124,125,126, +127,126,125, +126,127,128, +129,128,127, +128,129,130, +131,130,129, +132,0,133, +2,133,0, +133,2,134, +4,134,2, +134,4,135, +6,135,4, +135,6,136, +8,136,6, +136,8,137, +10,137,8, +137,10,138, +12,138,10, +138,12,139, +14,139,12, +139,14,140, +16,140,14, +140,16,141, +18,141,16, +141,18,142, +20,142,18, +142,20,143, +22,143,20, +143,22,144, +24,144,22, +144,24,145, +26,145,24, +145,26,146, +28,146,26, +146,28,147, +30,147,28, +147,30,148, +32,148,30, +148,32,149, +34,149,32, +149,34,150, +36,150,34, +150,36,151, +38,151,36, +151,38,152, +40,152,38, +152,40,153, +42,153,40, +153,42,154, +44,154,42, +154,44,155, +46,155,44, +155,46,156, +48,156,46, +156,48,157, +50,157,48, +157,50,158, +52,158,50, +158,52,159, +54,159,52, +159,54,160, +56,160,54, +160,56,161, +58,161,56, +161,58,162, +60,162,58, +162,60,163, +62,163,60, +163,62,164, +64,164,62, +164,64,165, +66,165,64, +165,66,166, +68,166,66, +166,68,167, +70,167,68, +167,70,168, +72,168,70, +168,72,169, +74,169,72, +169,74,170, +76,170,74, +170,76,171, +78,171,76, +171,78,172, +80,172,78, +172,80,173, +82,173,80, +173,82,174, +84,174,82, +174,84,175, +86,175,84, +175,86,176, +88,176,86, +176,88,177, +90,177,88, +177,90,178, +92,178,90, +178,92,179, +94,179,92, +179,94,180, +96,180,94, +180,96,181, +98,181,96, +181,98,182, +100,182,98, +182,100,183, +102,183,100, +183,102,184, +104,184,102, +184,104,185, +106,185,104, +185,106,186, +108,186,106, +186,108,187, +110,187,108, +187,110,188, +112,188,110, +188,112,189, +114,189,112, +189,114,190, +116,190,114, +190,116,191, +118,191,116, +191,118,192, +120,192,118, +192,120,193, +122,193,120, +193,122,194, +124,194,122, +194,124,195, +126,195,124, +195,126,196, +128,196,126, +196,128,197, +130,197,128, +198,132,199, +133,199,132, +199,133,200, +134,200,133, +200,134,201, +135,201,134, +201,135,202, +136,202,135, +202,136,203, +137,203,136, +203,137,204, +138,204,137, +204,138,205, +139,205,138, +205,139,206, +140,206,139, +206,140,207, +141,207,140, +207,141,208, +142,208,141, +208,142,209, +143,209,142, +209,143,210, +144,210,143, +210,144,211, +145,211,144, +211,145,212, +146,212,145, +212,146,213, +147,213,146, +213,147,214, +148,214,147, +214,148,215, +149,215,148, +215,149,216, +150,216,149, +216,150,217, +151,217,150, +217,151,218, +152,218,151, +218,152,219, +153,219,152, +219,153,220, +154,220,153, +220,154,221, +155,221,154, +221,155,222, +156,222,155, +222,156,223, +157,223,156, +223,157,224, +158,224,157, +224,158,225, +159,225,158, +225,159,226, +160,226,159, +226,160,227, +161,227,160, +227,161,228, +162,228,161, +228,162,229, +163,229,162, +229,163,230, +164,230,163, +230,164,231, +165,231,164, +231,165,232, +166,232,165, +232,166,233, +167,233,166, +233,167,234, +168,234,167, +234,168,235, +169,235,168, +235,169,236, +170,236,169, +236,170,237, +171,237,170, +237,171,238, +172,238,171, +238,172,239, +173,239,172, +239,173,240, +174,240,173, +240,174,241, +175,241,174, +241,175,242, +176,242,175, +242,176,243, +177,243,176, +243,177,244, +178,244,177, +244,178,245, +179,245,178, +245,179,246, +180,246,179, +246,180,247, +181,247,180, +247,181,248, +182,248,181, +248,182,249, +183,249,182, +249,183,250, +184,250,183, +250,184,251, +185,251,184, +251,185,252, +186,252,185, +252,186,253, +187,253,186, +253,187,254, +188,254,187, +254,188,255, +189,255,188, +255,189,256, +190,256,189, +256,190,257, +191,257,190, +257,191,258, +192,258,191, +258,192,259, +193,259,192, +259,193,260, +194,260,193, +260,194,261, +195,261,194, +261,195,262, +196,262,195, +262,196,263, +197,263,196, +264,198,265, +199,265,198, +265,199,266, +200,266,199, +266,200,267, +201,267,200, +267,201,268, +202,268,201, +268,202,269, +203,269,202, +269,203,270, +204,270,203, +270,204,271, +205,271,204, +271,205,272, +206,272,205, +272,206,273, +207,273,206, +273,207,274, +208,274,207, +274,208,275, +209,275,208, +275,209,276, +210,276,209, +276,210,277, +211,277,210, +277,211,278, +212,278,211, +278,212,279, +213,279,212, +279,213,280, +214,280,213, +280,214,281, +215,281,214, +281,215,282, +216,282,215, +282,216,283, +217,283,216, +283,217,284, +218,284,217, +284,218,285, +219,285,218, +285,219,286, +220,286,219, +286,220,287, +221,287,220, +287,221,288, +222,288,221, +288,222,289, +223,289,222, +289,223,290, +224,290,223, +290,224,291, +225,291,224, +291,225,292, +226,292,225, +292,226,293, +227,293,226, +293,227,294, +228,294,227, +294,228,295, +229,295,228, +295,229,296, +230,296,229, +296,230,297, +231,297,230, +297,231,298, +232,298,231, +298,232,299, +233,299,232, +299,233,300, +234,300,233, +300,234,301, +235,301,234, +301,235,302, +236,302,235, +302,236,303, +237,303,236, +303,237,304, +238,304,237, +304,238,305, +239,305,238, +305,239,306, +240,306,239, +306,240,307, +241,307,240, +307,241,308, +242,308,241, +308,242,309, +243,309,242, +309,243,310, +244,310,243, +310,244,311, +245,311,244, +311,245,312, +246,312,245, +312,246,313, +247,313,246, +313,247,314, +248,314,247, +314,248,315, +249,315,248, +315,249,316, +250,316,249, +316,250,317, +251,317,250, +317,251,318, +252,318,251, +318,252,319, +253,319,252, +319,253,320, +254,320,253, +320,254,321, +255,321,254, +321,255,322, +256,322,255, +322,256,323, +257,323,256, +323,257,324, +258,324,257, +324,258,325, +259,325,258, +325,259,326, +260,326,259, +326,260,327, +261,327,260, +327,261,328, +262,328,261, +328,262,329, +263,329,262, +330,264,331, +265,331,264, +331,265,332, +266,332,265, +332,266,333, +267,333,266, +333,267,334, +268,334,267, +334,268,335, +269,335,268, +335,269,336, +270,336,269, +336,270,337, +271,337,270, +337,271,338, +272,338,271, +338,272,339, +273,339,272, +339,273,340, +274,340,273, +340,274,341, +275,341,274, +341,275,342, +276,342,275, +342,276,343, +277,343,276, +343,277,344, +278,344,277, +344,278,345, +279,345,278, +345,279,346, +280,346,279, +346,280,347, +281,347,280, +347,281,348, +282,348,281, +348,282,349, +283,349,282, +349,283,350, +284,350,283, +350,284,351, +285,351,284, +351,285,352, +286,352,285, +352,286,353, +287,353,286, +353,287,354, +288,354,287, +354,288,355, +289,355,288, +355,289,356, +290,356,289, +356,290,357, +291,357,290, +357,291,358, +292,358,291, +358,292,359, +293,359,292, +359,293,360, +294,360,293, +360,294,361, +295,361,294, +361,295,362, +296,362,295, +362,296,363, +297,363,296, +363,297,364, +298,364,297, +364,298,365, +299,365,298, +365,299,366, +300,366,299, +366,300,367, +301,367,300, +367,301,368, +302,368,301, +368,302,369, +303,369,302, +369,303,370, +304,370,303, +370,304,371, +305,371,304, +371,305,372, +306,372,305, +372,306,373, +307,373,306, +373,307,374, +308,374,307, +374,308,375, +309,375,308, +375,309,376, +310,376,309, +376,310,377, +311,377,310, +377,311,378, +312,378,311, +378,312,379, +313,379,312, +379,313,380, +314,380,313, +380,314,381, +315,381,314, +381,315,382, +316,382,315, +382,316,383, +317,383,316, +383,317,384, +318,384,317, +384,318,385, +319,385,318, +385,319,386, +320,386,319, +386,320,387, +321,387,320, +387,321,388, +322,388,321, +388,322,389, +323,389,322, +389,323,390, +324,390,323, +390,324,391, +325,391,324, +391,325,392, +326,392,325, +392,326,393, +327,393,326, +393,327,394, +328,394,327, +394,328,395, +329,395,328, +396,330,397, +331,397,330, +397,331,398, +332,398,331, +398,332,399, +333,399,332, +399,333,400, +334,400,333, +400,334,401, +335,401,334, +401,335,402, +336,402,335, +402,336,403, +337,403,336, +403,337,404, +338,404,337, +404,338,405, +339,405,338, +405,339,406, +340,406,339, +406,340,407, +341,407,340, +407,341,408, +342,408,341, +408,342,409, +343,409,342, +409,343,410, +344,410,343, +410,344,411, +345,411,344, +411,345,412, +346,412,345, +412,346,413, +347,413,346, +413,347,414, +348,414,347, +414,348,415, +349,415,348, +415,349,416, +350,416,349, +416,350,417, +351,417,350, +417,351,418, +352,418,351, +418,352,419, +353,419,352, +419,353,420, +354,420,353, +420,354,421, +355,421,354, +421,355,422, +356,422,355, +422,356,423, +357,423,356, +423,357,424, +358,424,357, +424,358,425, +359,425,358, +425,359,426, +360,426,359, +426,360,427, +361,427,360, +427,361,428, +362,428,361, +428,362,429, +363,429,362, +429,363,430, +364,430,363, +430,364,431, +365,431,364, +431,365,432, +366,432,365, +432,366,433, +367,433,366, +433,367,434, +368,434,367, +434,368,435, +369,435,368, +435,369,436, +370,436,369, +436,370,437, +371,437,370, +437,371,438, +372,438,371, +438,372,439, +373,439,372, +439,373,440, +374,440,373, +440,374,441, +375,441,374, +441,375,442, +376,442,375, +442,376,443, +377,443,376, +443,377,444, +378,444,377, +444,378,445, +379,445,378, +445,379,446, +380,446,379, +446,380,447, +381,447,380, +447,381,448, +382,448,381, +448,382,449, +383,449,382, +449,383,450, +384,450,383, +450,384,451, +385,451,384, +451,385,452, +386,452,385, +452,386,453, +387,453,386, +453,387,454, +388,454,387, +454,388,455, +389,455,388, +455,389,456, +390,456,389, +456,390,457, +391,457,390, +457,391,458, +392,458,391, +458,392,459, +393,459,392, +459,393,460, +394,460,393, +460,394,461, +395,461,394, +462,396,463, +397,463,396, +463,397,464, +398,464,397, +464,398,465, +399,465,398, +465,399,466, +400,466,399, +466,400,467, +401,467,400, +467,401,468, +402,468,401, +468,402,469, +403,469,402, +469,403,470, +404,470,403, +470,404,471, +405,471,404, +471,405,472, +406,472,405, +472,406,473, +407,473,406, +473,407,474, +408,474,407, +474,408,475, +409,475,408, +475,409,476, +410,476,409, +476,410,477, +411,477,410, +477,411,478, +412,478,411, +478,412,479, +413,479,412, +479,413,480, +414,480,413, +480,414,481, +415,481,414, +481,415,482, +416,482,415, +482,416,483, +417,483,416, +483,417,484, +418,484,417, +484,418,485, +419,485,418, +485,419,486, +420,486,419, +486,420,487, +421,487,420, +487,421,488, +422,488,421, +488,422,489, +423,489,422, +489,423,490, +424,490,423, +490,424,491, +425,491,424, +491,425,492, +426,492,425, +492,426,493, +427,493,426, +493,427,494, +428,494,427, +494,428,495, +429,495,428, +495,429,496, +430,496,429, +496,430,497, +431,497,430, +497,431,498, +432,498,431, +498,432,499, +433,499,432, +499,433,500, +434,500,433, +500,434,501, +435,501,434, +501,435,502, +436,502,435, +502,436,503, +437,503,436, +503,437,504, +438,504,437, +504,438,505, +439,505,438, +505,439,506, +440,506,439, +506,440,507, +441,507,440, +507,441,508, +442,508,441, +508,442,509, +443,509,442, +509,443,510, +444,510,443, +510,444,511, +445,511,444, +511,445,512, +446,512,445, +512,446,513, +447,513,446, +513,447,514, +448,514,447, +514,448,515, +449,515,448, +515,449,516, +450,516,449, +516,450,517, +451,517,450, +517,451,518, +452,518,451, +518,452,519, +453,519,452, +519,453,520, +454,520,453, +520,454,521, +455,521,454, +521,455,522, +456,522,455, +522,456,523, +457,523,456, +523,457,524, +458,524,457, +524,458,525, +459,525,458, +525,459,526, +460,526,459, +526,460,527, +461,527,460, +528,462,529, +463,529,462, +529,463,530, +464,530,463, +530,464,531, +465,531,464, +531,465,532, +466,532,465, +532,466,533, +467,533,466, +533,467,534, +468,534,467, +534,468,535, +469,535,468, +535,469,536, +470,536,469, +536,470,537, +471,537,470, +537,471,538, +472,538,471, +538,472,539, +473,539,472, +539,473,540, +474,540,473, +540,474,541, +475,541,474, +541,475,542, +476,542,475, +542,476,543, +477,543,476, +543,477,544, +478,544,477, +544,478,545, +479,545,478, +545,479,546, +480,546,479, +546,480,547, +481,547,480, +547,481,548, +482,548,481, +548,482,549, +483,549,482, +549,483,550, +484,550,483, +550,484,551, +485,551,484, +551,485,552, +486,552,485, +552,486,553, +487,553,486, +553,487,554, +488,554,487, +554,488,555, +489,555,488, +555,489,556, +490,556,489, +556,490,557, +491,557,490, +557,491,558, +492,558,491, +558,492,559, +493,559,492, +559,493,560, +494,560,493, +560,494,561, +495,561,494, +561,495,562, +496,562,495, +562,496,563, +497,563,496, +563,497,564, +498,564,497, +564,498,565, +499,565,498, +565,499,566, +500,566,499, +566,500,567, +501,567,500, +567,501,568, +502,568,501, +568,502,569, +503,569,502, +569,503,570, +504,570,503, +570,504,571, +505,571,504, +571,505,572, +506,572,505, +572,506,573, +507,573,506, +573,507,574, +508,574,507, +574,508,575, +509,575,508, +575,509,576, +510,576,509, +576,510,577, +511,577,510, +577,511,578, +512,578,511, +578,512,579, +513,579,512, +579,513,580, +514,580,513, +580,514,581, +515,581,514, +581,515,582, +516,582,515, +582,516,583, +517,583,516, +583,517,584, +518,584,517, +584,518,585, +519,585,518, +585,519,586, +520,586,519, +586,520,587, +521,587,520, +587,521,588, +522,588,521, +588,522,589, +523,589,522, +589,523,590, +524,590,523, +590,524,591, +525,591,524, +591,525,592, +526,592,525, +592,526,593, +527,593,526, +594,528,595, +529,595,528, +595,529,596, +530,596,529, +596,530,597, +531,597,530, +597,531,598, +532,598,531, +598,532,599, +533,599,532, +599,533,600, +534,600,533, +600,534,601, +535,601,534, +601,535,602, +536,602,535, +602,536,603, +537,603,536, +603,537,604, +538,604,537, +604,538,605, +539,605,538, +605,539,606, +540,606,539, +606,540,607, +541,607,540, +607,541,608, +542,608,541, +608,542,609, +543,609,542, +609,543,610, +544,610,543, +610,544,611, +545,611,544, +611,545,612, +546,612,545, +612,546,613, +547,613,546, +613,547,614, +548,614,547, +614,548,615, +549,615,548, +615,549,616, +550,616,549, +616,550,617, +551,617,550, +617,551,618, +552,618,551, +618,552,619, +553,619,552, +619,553,620, +554,620,553, +620,554,621, +555,621,554, +621,555,622, +556,622,555, +622,556,623, +557,623,556, +623,557,624, +558,624,557, +624,558,625, +559,625,558, +625,559,626, +560,626,559, +626,560,627, +561,627,560, +627,561,628, +562,628,561, +628,562,629, +563,629,562, +629,563,630, +564,630,563, +630,564,631, +565,631,564, +631,565,632, +566,632,565, +632,566,633, +567,633,566, +633,567,634, +568,634,567, +634,568,635, +569,635,568, +635,569,636, +570,636,569, +636,570,637, +571,637,570, +637,571,638, +572,638,571, +638,572,639, +573,639,572, +639,573,640, +574,640,573, +640,574,641, +575,641,574, +641,575,642, +576,642,575, +642,576,643, +577,643,576, +643,577,644, +578,644,577, +644,578,645, +579,645,578, +645,579,646, +580,646,579, +646,580,647, +581,647,580, +647,581,648, +582,648,581, +648,582,649, +583,649,582, +649,583,650, +584,650,583, +650,584,651, +585,651,584, +651,585,652, +586,652,585, +652,586,653, +587,653,586, +653,587,654, +588,654,587, +654,588,655, +589,655,588, +655,589,656, +590,656,589, +656,590,657, +591,657,590, +657,591,658, +592,658,591, +658,592,659, +593,659,592, +660,594,661, +595,661,594, +661,595,662, +596,662,595, +662,596,663, +597,663,596, +663,597,664, +598,664,597, +664,598,665, +599,665,598, +665,599,666, +600,666,599, +666,600,667, +601,667,600, +667,601,668, +602,668,601, +668,602,669, +603,669,602, +669,603,670, +604,670,603, +670,604,671, +605,671,604, +671,605,672, +606,672,605, +672,606,673, +607,673,606, +673,607,674, +608,674,607, +674,608,675, +609,675,608, +675,609,676, +610,676,609, +676,610,677, +611,677,610, +677,611,678, +612,678,611, +678,612,679, +613,679,612, +679,613,680, +614,680,613, +680,614,681, +615,681,614, +681,615,682, +616,682,615, +682,616,683, +617,683,616, +683,617,684, +618,684,617, +684,618,685, +619,685,618, +685,619,686, +620,686,619, +686,620,687, +621,687,620, +687,621,688, +622,688,621, +688,622,689, +623,689,622, +689,623,690, +624,690,623, +690,624,691, +625,691,624, +691,625,692, +626,692,625, +692,626,693, +627,693,626, +693,627,694, +628,694,627, +694,628,695, +629,695,628, +695,629,696, +630,696,629, +696,630,697, +631,697,630, +697,631,698, +632,698,631, +698,632,699, +633,699,632, +699,633,700, +634,700,633, +700,634,701, +635,701,634, +701,635,702, +636,702,635, +702,636,703, +637,703,636, +703,637,704, +638,704,637, +704,638,705, +639,705,638, +705,639,706, +640,706,639, +706,640,707, +641,707,640, +707,641,708, +642,708,641, +708,642,709, +643,709,642, +709,643,710, +644,710,643, +710,644,711, +645,711,644, +711,645,712, +646,712,645, +712,646,713, +647,713,646, +713,647,714, +648,714,647, +714,648,715, +649,715,648, +715,649,716, +650,716,649, +716,650,717, +651,717,650, +717,651,718, +652,718,651, +718,652,719, +653,719,652, +719,653,720, +654,720,653, +720,654,721, +655,721,654, +721,655,722, +656,722,655, +722,656,723, +657,723,656, +723,657,724, +658,724,657, +724,658,725, +659,725,658, +726,660,727, +661,727,660, +727,661,728, +662,728,661, +728,662,729, +663,729,662, +729,663,730, +664,730,663, +730,664,731, +665,731,664, +731,665,732, +666,732,665, +732,666,733, +667,733,666, +733,667,734, +668,734,667, +734,668,735, +669,735,668, +735,669,736, +670,736,669, +736,670,737, +671,737,670, +737,671,738, +672,738,671, +738,672,739, +673,739,672, +739,673,740, +674,740,673, +740,674,741, +675,741,674, +741,675,742, +676,742,675, +742,676,743, +677,743,676, +743,677,744, +678,744,677, +744,678,745, +679,745,678, +745,679,746, +680,746,679, +746,680,747, +681,747,680, +747,681,748, +682,748,681, +748,682,749, +683,749,682, +749,683,750, +684,750,683, +750,684,751, +685,751,684, +751,685,752, +686,752,685, +752,686,753, +687,753,686, +753,687,754, +688,754,687, +754,688,755, +689,755,688, +755,689,756, +690,756,689, +756,690,757, +691,757,690, +757,691,758, +692,758,691, +758,692,759, +693,759,692, +759,693,760, +694,760,693, +760,694,761, +695,761,694, +761,695,762, +696,762,695, +762,696,763, +697,763,696, +763,697,764, +698,764,697, +764,698,765, +699,765,698, +765,699,766, +700,766,699, +766,700,767, +701,767,700, +767,701,768, +702,768,701, +768,702,769, +703,769,702, +769,703,770, +704,770,703, +770,704,771, +705,771,704, +771,705,772, +706,772,705, +772,706,773, +707,773,706, +773,707,774, +708,774,707, +774,708,775, +709,775,708, +775,709,776, +710,776,709, +776,710,777, +711,777,710, +777,711,778, +712,778,711, +778,712,779, +713,779,712, +779,713,780, +714,780,713, +780,714,781, +715,781,714, +781,715,782, +716,782,715, +782,716,783, +717,783,716, +783,717,784, +718,784,717, +784,718,785, +719,785,718, +785,719,786, +720,786,719, +786,720,787, +721,787,720, +787,721,788, +722,788,721, +788,722,789, +723,789,722, +789,723,790, +724,790,723, +790,724,791, +725,791,724, +792,726,793, +727,793,726, +793,727,794, +728,794,727, +794,728,795, +729,795,728, +795,729,796, +730,796,729, +796,730,797, +731,797,730, +797,731,798, +732,798,731, +798,732,799, +733,799,732, +799,733,800, +734,800,733, +800,734,801, +735,801,734, +801,735,802, +736,802,735, +802,736,803, +737,803,736, +803,737,804, +738,804,737, +804,738,805, +739,805,738, +805,739,806, +740,806,739, +806,740,807, +741,807,740, +807,741,808, +742,808,741, +808,742,809, +743,809,742, +809,743,810, +744,810,743, +810,744,811, +745,811,744, +811,745,812, +746,812,745, +812,746,813, +747,813,746, +813,747,814, +748,814,747, +814,748,815, +749,815,748, +815,749,816, +750,816,749, +816,750,817, +751,817,750, +817,751,818, +752,818,751, +818,752,819, +753,819,752, +819,753,820, +754,820,753, +820,754,821, +755,821,754, +821,755,822, +756,822,755, +822,756,823, +757,823,756, +823,757,824, +758,824,757, +824,758,825, +759,825,758, +825,759,826, +760,826,759, +826,760,827, +761,827,760, +827,761,828, +762,828,761, +828,762,829, +763,829,762, +829,763,830, +764,830,763, +830,764,831, +765,831,764, +831,765,832, +766,832,765, +832,766,833, +767,833,766, +833,767,834, +768,834,767, +834,768,835, +769,835,768, +835,769,836, +770,836,769, +836,770,837, +771,837,770, +837,771,838, +772,838,771, +838,772,839, +773,839,772, +839,773,840, +774,840,773, +840,774,841, +775,841,774, +841,775,842, +776,842,775, +842,776,843, +777,843,776, +843,777,844, +778,844,777, +844,778,845, +779,845,778, +845,779,846, +780,846,779, +846,780,847, +781,847,780, +847,781,848, +782,848,781, +848,782,849, +783,849,782, +849,783,850, +784,850,783, +850,784,851, +785,851,784, +851,785,852, +786,852,785, +852,786,853, +787,853,786, +853,787,854, +788,854,787, +854,788,855, +789,855,788, +855,789,856, +790,856,789, +856,790,857, +791,857,790, +858,792,859, +793,859,792, +859,793,860, +794,860,793, +860,794,861, +795,861,794, +861,795,862, +796,862,795, +862,796,863, +797,863,796, +863,797,864, +798,864,797, +864,798,865, +799,865,798, +865,799,866, +800,866,799, +866,800,867, +801,867,800, +867,801,868, +802,868,801, +868,802,869, +803,869,802, +869,803,870, +804,870,803, +870,804,871, +805,871,804, +871,805,872, +806,872,805, +872,806,873, +807,873,806, +873,807,874, +808,874,807, +874,808,875, +809,875,808, +875,809,876, +810,876,809, +876,810,877, +811,877,810, +877,811,878, +812,878,811, +878,812,879, +813,879,812, +879,813,880, +814,880,813, +880,814,881, +815,881,814, +881,815,882, +816,882,815, +882,816,883, +817,883,816, +883,817,884, +818,884,817, +884,818,885, +819,885,818, +885,819,886, +820,886,819, +886,820,887, +821,887,820, +887,821,888, +822,888,821, +888,822,889, +823,889,822, +889,823,890, +824,890,823, +890,824,891, +825,891,824, +891,825,892, +826,892,825, +892,826,893, +827,893,826, +893,827,894, +828,894,827, +894,828,895, +829,895,828, +895,829,896, +830,896,829, +896,830,897, +831,897,830, +897,831,898, +832,898,831, +898,832,899, +833,899,832, +899,833,900, +834,900,833, +900,834,901, +835,901,834, +901,835,902, +836,902,835, +902,836,903, +837,903,836, +903,837,904, +838,904,837, +904,838,905, +839,905,838, +905,839,906, +840,906,839, +906,840,907, +841,907,840, +907,841,908, +842,908,841, +908,842,909, +843,909,842, +909,843,910, +844,910,843, +910,844,911, +845,911,844, +911,845,912, +846,912,845, +912,846,913, +847,913,846, +913,847,914, +848,914,847, +914,848,915, +849,915,848, +915,849,916, +850,916,849, +916,850,917, +851,917,850, +917,851,918, +852,918,851, +918,852,919, +853,919,852, +919,853,920, +854,920,853, +920,854,921, +855,921,854, +921,855,922, +856,922,855, +922,856,923, +857,923,856, +924,858,925, +859,925,858, +925,859,926, +860,926,859, +926,860,927, +861,927,860, +927,861,928, +862,928,861, +928,862,929, +863,929,862, +929,863,930, +864,930,863, +930,864,931, +865,931,864, +931,865,932, +866,932,865, +932,866,933, +867,933,866, +933,867,934, +868,934,867, +934,868,935, +869,935,868, +935,869,936, +870,936,869, +936,870,937, +871,937,870, +937,871,938, +872,938,871, +938,872,939, +873,939,872, +939,873,940, +874,940,873, +940,874,941, +875,941,874, +941,875,942, +876,942,875, +942,876,943, +877,943,876, +943,877,944, +878,944,877, +944,878,945, +879,945,878, +945,879,946, +880,946,879, +946,880,947, +881,947,880, +947,881,948, +882,948,881, +948,882,949, +883,949,882, +949,883,950, +884,950,883, +950,884,951, +885,951,884, +951,885,952, +886,952,885, +952,886,953, +887,953,886, +953,887,954, +888,954,887, +954,888,955, +889,955,888, +955,889,956, +890,956,889, +956,890,957, +891,957,890, +957,891,958, +892,958,891, +958,892,959, +893,959,892, +959,893,960, +894,960,893, +960,894,961, +895,961,894, +961,895,962, +896,962,895, +962,896,963, +897,963,896, +963,897,964, +898,964,897, +964,898,965, +899,965,898, +965,899,966, +900,966,899, +966,900,967, +901,967,900, +967,901,968, +902,968,901, +968,902,969, +903,969,902, +969,903,970, +904,970,903, +970,904,971, +905,971,904, +971,905,972, +906,972,905, +972,906,973, +907,973,906, +973,907,974, +908,974,907, +974,908,975, +909,975,908, +975,909,976, +910,976,909, +976,910,977, +911,977,910, +977,911,978, +912,978,911, +978,912,979, +913,979,912, +979,913,980, +914,980,913, +980,914,981, +915,981,914, +981,915,982, +916,982,915, +982,916,983, +917,983,916, +983,917,984, +918,984,917, +984,918,985, +919,985,918, +985,919,986, +920,986,919, +986,920,987, +921,987,920, +987,921,988, +922,988,921, +988,922,989, +923,989,922, +990,924,991, +925,991,924, +991,925,992, +926,992,925, +992,926,993, +927,993,926, +993,927,994, +928,994,927, +994,928,995, +929,995,928, +995,929,996, +930,996,929, +996,930,997, +931,997,930, +997,931,998, +932,998,931, +998,932,999, +933,999,932, +999,933,1000, +934,1000,933, +1000,934,1001, +935,1001,934, +1001,935,1002, +936,1002,935, +1002,936,1003, +937,1003,936, +1003,937,1004, +938,1004,937, +1004,938,1005, +939,1005,938, +1005,939,1006, +940,1006,939, +1006,940,1007, +941,1007,940, +1007,941,1008, +942,1008,941, +1008,942,1009, +943,1009,942, +1009,943,1010, +944,1010,943, +1010,944,1011, +945,1011,944, +1011,945,1012, +946,1012,945, +1012,946,1013, +947,1013,946, +1013,947,1014, +948,1014,947, +1014,948,1015, +949,1015,948, +1015,949,1016, +950,1016,949, +1016,950,1017, +951,1017,950, +1017,951,1018, +952,1018,951, +1018,952,1019, +953,1019,952, +1019,953,1020, +954,1020,953, +1020,954,1021, +955,1021,954, +1021,955,1022, +956,1022,955, +1022,956,1023, +957,1023,956, +1023,957,1024, +958,1024,957, +1024,958,1025, +959,1025,958, +1025,959,1026, +960,1026,959, +1026,960,1027, +961,1027,960, +1027,961,1028, +962,1028,961, +1028,962,1029, +963,1029,962, +1029,963,1030, +964,1030,963, +1030,964,1031, +965,1031,964, +1031,965,1032, +966,1032,965, +1032,966,1033, +967,1033,966, +1033,967,1034, +968,1034,967, +1034,968,1035, +969,1035,968, +1035,969,1036, +970,1036,969, +1036,970,1037, +971,1037,970, +1037,971,1038, +972,1038,971, +1038,972,1039, +973,1039,972, +1039,973,1040, +974,1040,973, +1040,974,1041, +975,1041,974, +1041,975,1042, +976,1042,975, +1042,976,1043, +977,1043,976, +1043,977,1044, +978,1044,977, +1044,978,1045, +979,1045,978, +1045,979,1046, +980,1046,979, +1046,980,1047, +981,1047,980, +1047,981,1048, +982,1048,981, +1048,982,1049, +983,1049,982, +1049,983,1050, +984,1050,983, +1050,984,1051, +985,1051,984, +1051,985,1052, +986,1052,985, +1052,986,1053, +987,1053,986, +1053,987,1054, +988,1054,987, +1054,988,1055, +989,1055,988, +1056,990,1057, +991,1057,990, +1057,991,1058, +992,1058,991, +1058,992,1059, +993,1059,992, +1059,993,1060, +994,1060,993, +1060,994,1061, +995,1061,994, +1061,995,1062, +996,1062,995, +1062,996,1063, +997,1063,996, +1063,997,1064, +998,1064,997, +1064,998,1065, +999,1065,998, +1065,999,1066, +1000,1066,999, +1066,1000,1067, +1001,1067,1000, +1067,1001,1068, +1002,1068,1001, +1068,1002,1069, +1003,1069,1002, +1069,1003,1070, +1004,1070,1003, +1070,1004,1071, +1005,1071,1004, +1071,1005,1072, +1006,1072,1005, +1072,1006,1073, +1007,1073,1006, +1073,1007,1074, +1008,1074,1007, +1074,1008,1075, +1009,1075,1008, +1075,1009,1076, +1010,1076,1009, +1076,1010,1077, +1011,1077,1010, +1077,1011,1078, +1012,1078,1011, +1078,1012,1079, +1013,1079,1012, +1079,1013,1080, +1014,1080,1013, +1080,1014,1081, +1015,1081,1014, +1081,1015,1082, +1016,1082,1015, +1082,1016,1083, +1017,1083,1016, +1083,1017,1084, +1018,1084,1017, +1084,1018,1085, +1019,1085,1018, +1085,1019,1086, +1020,1086,1019, +1086,1020,1087, +1021,1087,1020, +1087,1021,1088, +1022,1088,1021, +1088,1022,1089, +1023,1089,1022, +1089,1023,1090, +1024,1090,1023, +1090,1024,1091, +1025,1091,1024, +1091,1025,1092, +1026,1092,1025, +1092,1026,1093, +1027,1093,1026, +1093,1027,1094, +1028,1094,1027, +1094,1028,1095, +1029,1095,1028, +1095,1029,1096, +1030,1096,1029, +1096,1030,1097, +1031,1097,1030, +1097,1031,1098, +1032,1098,1031, +1098,1032,1099, +1033,1099,1032, +1099,1033,1100, +1034,1100,1033, +1100,1034,1101, +1035,1101,1034, +1101,1035,1102, +1036,1102,1035, +1102,1036,1103, +1037,1103,1036, +1103,1037,1104, +1038,1104,1037, +1104,1038,1105, +1039,1105,1038, +1105,1039,1106, +1040,1106,1039, +1106,1040,1107, +1041,1107,1040, +1107,1041,1108, +1042,1108,1041, +1108,1042,1109, +1043,1109,1042, +1109,1043,1110, +1044,1110,1043, +1110,1044,1111, +1045,1111,1044, +1111,1045,1112, +1046,1112,1045, +1112,1046,1113, +1047,1113,1046, +1113,1047,1114, +1048,1114,1047, +1114,1048,1115, +1049,1115,1048, +1115,1049,1116, +1050,1116,1049, +1116,1050,1117, +1051,1117,1050, +1117,1051,1118, +1052,1118,1051, +1118,1052,1119, +1053,1119,1052, +1119,1053,1120, +1054,1120,1053, +1120,1054,1121, +1055,1121,1054, +1122,1056,1123, +1057,1123,1056, +1123,1057,1124, +1058,1124,1057, +1124,1058,1125, +1059,1125,1058, +1125,1059,1126, +1060,1126,1059, +1126,1060,1127, +1061,1127,1060, +1127,1061,1128, +1062,1128,1061, +1128,1062,1129, +1063,1129,1062, +1129,1063,1130, +1064,1130,1063, +1130,1064,1131, +1065,1131,1064, +1131,1065,1132, +1066,1132,1065, +1132,1066,1133, +1067,1133,1066, +1133,1067,1134, +1068,1134,1067, +1134,1068,1135, +1069,1135,1068, +1135,1069,1136, +1070,1136,1069, +1136,1070,1137, +1071,1137,1070, +1137,1071,1138, +1072,1138,1071, +1138,1072,1139, +1073,1139,1072, +1139,1073,1140, +1074,1140,1073, +1140,1074,1141, +1075,1141,1074, +1141,1075,1142, +1076,1142,1075, +1142,1076,1143, +1077,1143,1076, +1143,1077,1144, +1078,1144,1077, +1144,1078,1145, +1079,1145,1078, +1145,1079,1146, +1080,1146,1079, +1146,1080,1147, +1081,1147,1080, +1147,1081,1148, +1082,1148,1081, +1148,1082,1149, +1083,1149,1082, +1149,1083,1150, +1084,1150,1083, +1150,1084,1151, +1085,1151,1084, +1151,1085,1152, +1086,1152,1085, +1152,1086,1153, +1087,1153,1086, +1153,1087,1154, +1088,1154,1087, +1154,1088,1155, +1089,1155,1088, +1155,1089,1156, +1090,1156,1089, +1156,1090,1157, +1091,1157,1090, +1157,1091,1158, +1092,1158,1091, +1158,1092,1159, +1093,1159,1092, +1159,1093,1160, +1094,1160,1093, +1160,1094,1161, +1095,1161,1094, +1161,1095,1162, +1096,1162,1095, +1162,1096,1163, +1097,1163,1096, +1163,1097,1164, +1098,1164,1097, +1164,1098,1165, +1099,1165,1098, +1165,1099,1166, +1100,1166,1099, +1166,1100,1167, +1101,1167,1100, +1167,1101,1168, +1102,1168,1101, +1168,1102,1169, +1103,1169,1102, +1169,1103,1170, +1104,1170,1103, +1170,1104,1171, +1105,1171,1104, +1171,1105,1172, +1106,1172,1105, +1172,1106,1173, +1107,1173,1106, +1173,1107,1174, +1108,1174,1107, +1174,1108,1175, +1109,1175,1108, +1175,1109,1176, +1110,1176,1109, +1176,1110,1177, +1111,1177,1110, +1177,1111,1178, +1112,1178,1111, +1178,1112,1179, +1113,1179,1112, +1179,1113,1180, +1114,1180,1113, +1180,1114,1181, +1115,1181,1114, +1181,1115,1182, +1116,1182,1115, +1182,1116,1183, +1117,1183,1116, +1183,1117,1184, +1118,1184,1117, +1184,1118,1185, +1119,1185,1118, +1185,1119,1186, +1120,1186,1119, +1186,1120,1187, +1121,1187,1120, +1188,1122,1189, +1123,1189,1122, +1189,1123,1190, +1124,1190,1123, +1190,1124,1191, +1125,1191,1124, +1191,1125,1192, +1126,1192,1125, +1192,1126,1193, +1127,1193,1126, +1193,1127,1194, +1128,1194,1127, +1194,1128,1195, +1129,1195,1128, +1195,1129,1196, +1130,1196,1129, +1196,1130,1197, +1131,1197,1130, +1197,1131,1198, +1132,1198,1131, +1198,1132,1199, +1133,1199,1132, +1199,1133,1200, +1134,1200,1133, +1200,1134,1201, +1135,1201,1134, +1201,1135,1202, +1136,1202,1135, +1202,1136,1203, +1137,1203,1136, +1203,1137,1204, +1138,1204,1137, +1204,1138,1205, +1139,1205,1138, +1205,1139,1206, +1140,1206,1139, +1206,1140,1207, +1141,1207,1140, +1207,1141,1208, +1142,1208,1141, +1208,1142,1209, +1143,1209,1142, +1209,1143,1210, +1144,1210,1143, +1210,1144,1211, +1145,1211,1144, +1211,1145,1212, +1146,1212,1145, +1212,1146,1213, +1147,1213,1146, +1213,1147,1214, +1148,1214,1147, +1214,1148,1215, +1149,1215,1148, +1215,1149,1216, +1150,1216,1149, +1216,1150,1217, +1151,1217,1150, +1217,1151,1218, +1152,1218,1151, +1218,1152,1219, +1153,1219,1152, +1219,1153,1220, +1154,1220,1153, +1220,1154,1221, +1155,1221,1154, +1221,1155,1222, +1156,1222,1155, +1222,1156,1223, +1157,1223,1156, +1223,1157,1224, +1158,1224,1157, +1224,1158,1225, +1159,1225,1158, +1225,1159,1226, +1160,1226,1159, +1226,1160,1227, +1161,1227,1160, +1227,1161,1228, +1162,1228,1161, +1228,1162,1229, +1163,1229,1162, +1229,1163,1230, +1164,1230,1163, +1230,1164,1231, +1165,1231,1164, +1231,1165,1232, +1166,1232,1165, +1232,1166,1233, +1167,1233,1166, +1233,1167,1234, +1168,1234,1167, +1234,1168,1235, +1169,1235,1168, +1235,1169,1236, +1170,1236,1169, +1236,1170,1237, +1171,1237,1170, +1237,1171,1238, +1172,1238,1171, +1238,1172,1239, +1173,1239,1172, +1239,1173,1240, +1174,1240,1173, +1240,1174,1241, +1175,1241,1174, +1241,1175,1242, +1176,1242,1175, +1242,1176,1243, +1177,1243,1176, +1243,1177,1244, +1178,1244,1177, +1244,1178,1245, +1179,1245,1178, +1245,1179,1246, +1180,1246,1179, +1246,1180,1247, +1181,1247,1180, +1247,1181,1248, +1182,1248,1181, +1248,1182,1249, +1183,1249,1182, +1249,1183,1250, +1184,1250,1183, +1250,1184,1251, +1185,1251,1184, +1251,1185,1252, +1186,1252,1185, +1252,1186,1253, +1187,1253,1186, +1254,1188,1255, +1189,1255,1188, +1255,1189,1256, +1190,1256,1189, +1256,1190,1257, +1191,1257,1190, +1257,1191,1258, +1192,1258,1191, +1258,1192,1259, +1193,1259,1192, +1259,1193,1260, +1194,1260,1193, +1260,1194,1261, +1195,1261,1194, +1261,1195,1262, +1196,1262,1195, +1262,1196,1263, +1197,1263,1196, +1263,1197,1264, +1198,1264,1197, +1264,1198,1265, +1199,1265,1198, +1265,1199,1266, +1200,1266,1199, +1266,1200,1267, +1201,1267,1200, +1267,1201,1268, +1202,1268,1201, +1268,1202,1269, +1203,1269,1202, +1269,1203,1270, +1204,1270,1203, +1270,1204,1271, +1205,1271,1204, +1271,1205,1272, +1206,1272,1205, +1272,1206,1273, +1207,1273,1206, +1273,1207,1274, +1208,1274,1207, +1274,1208,1275, +1209,1275,1208, +1275,1209,1276, +1210,1276,1209, +1276,1210,1277, +1211,1277,1210, +1277,1211,1278, +1212,1278,1211, +1278,1212,1279, +1213,1279,1212, +1279,1213,1280, +1214,1280,1213, +1280,1214,1281, +1215,1281,1214, +1281,1215,1282, +1216,1282,1215, +1282,1216,1283, +1217,1283,1216, +1283,1217,1284, +1218,1284,1217, +1284,1218,1285, +1219,1285,1218, +1285,1219,1286, +1220,1286,1219, +1286,1220,1287, +1221,1287,1220, +1287,1221,1288, +1222,1288,1221, +1288,1222,1289, +1223,1289,1222, +1289,1223,1290, +1224,1290,1223, +1290,1224,1291, +1225,1291,1224, +1291,1225,1292, +1226,1292,1225, +1292,1226,1293, +1227,1293,1226, +1293,1227,1294, +1228,1294,1227, +1294,1228,1295, +1229,1295,1228, +1295,1229,1296, +1230,1296,1229, +1296,1230,1297, +1231,1297,1230, +1297,1231,1298, +1232,1298,1231, +1298,1232,1299, +1233,1299,1232, +1299,1233,1300, +1234,1300,1233, +1300,1234,1301, +1235,1301,1234, +1301,1235,1302, +1236,1302,1235, +1302,1236,1303, +1237,1303,1236, +1303,1237,1304, +1238,1304,1237, +1304,1238,1305, +1239,1305,1238, +1305,1239,1306, +1240,1306,1239, +1306,1240,1307, +1241,1307,1240, +1307,1241,1308, +1242,1308,1241, +1308,1242,1309, +1243,1309,1242, +1309,1243,1310, +1244,1310,1243, +1310,1244,1311, +1245,1311,1244, +1311,1245,1312, +1246,1312,1245, +1312,1246,1313, +1247,1313,1246, +1313,1247,1314, +1248,1314,1247, +1314,1248,1315, +1249,1315,1248, +1315,1249,1316, +1250,1316,1249, +1316,1250,1317, +1251,1317,1250, +1317,1251,1318, +1252,1318,1251, +1318,1252,1319, +1253,1319,1252, +1320,1254,1321, +1255,1321,1254, +1321,1255,1322, +1256,1322,1255, +1322,1256,1323, +1257,1323,1256, +1323,1257,1324, +1258,1324,1257, +1324,1258,1325, +1259,1325,1258, +1325,1259,1326, +1260,1326,1259, +1326,1260,1327, +1261,1327,1260, +1327,1261,1328, +1262,1328,1261, +1328,1262,1329, +1263,1329,1262, +1329,1263,1330, +1264,1330,1263, +1330,1264,1331, +1265,1331,1264, +1331,1265,1332, +1266,1332,1265, +1332,1266,1333, +1267,1333,1266, +1333,1267,1334, +1268,1334,1267, +1334,1268,1335, +1269,1335,1268, +1335,1269,1336, +1270,1336,1269, +1336,1270,1337, +1271,1337,1270, +1337,1271,1338, +1272,1338,1271, +1338,1272,1339, +1273,1339,1272, +1339,1273,1340, +1274,1340,1273, +1340,1274,1341, +1275,1341,1274, +1341,1275,1342, +1276,1342,1275, +1342,1276,1343, +1277,1343,1276, +1343,1277,1344, +1278,1344,1277, +1344,1278,1345, +1279,1345,1278, +1345,1279,1346, +1280,1346,1279, +1346,1280,1347, +1281,1347,1280, +1347,1281,1348, +1282,1348,1281, +1348,1282,1349, +1283,1349,1282, +1349,1283,1350, +1284,1350,1283, +1350,1284,1351, +1285,1351,1284, +1351,1285,1352, +1286,1352,1285, +1352,1286,1353, +1287,1353,1286, +1353,1287,1354, +1288,1354,1287, +1354,1288,1355, +1289,1355,1288, +1355,1289,1356, +1290,1356,1289, +1356,1290,1357, +1291,1357,1290, +1357,1291,1358, +1292,1358,1291, +1358,1292,1359, +1293,1359,1292, +1359,1293,1360, +1294,1360,1293, +1360,1294,1361, +1295,1361,1294, +1361,1295,1362, +1296,1362,1295, +1362,1296,1363, +1297,1363,1296, +1363,1297,1364, +1298,1364,1297, +1364,1298,1365, +1299,1365,1298, +1365,1299,1366, +1300,1366,1299, +1366,1300,1367, +1301,1367,1300, +1367,1301,1368, +1302,1368,1301, +1368,1302,1369, +1303,1369,1302, +1369,1303,1370, +1304,1370,1303, +1370,1304,1371, +1305,1371,1304, +1371,1305,1372, +1306,1372,1305, +1372,1306,1373, +1307,1373,1306, +1373,1307,1374, +1308,1374,1307, +1374,1308,1375, +1309,1375,1308, +1375,1309,1376, +1310,1376,1309, +1376,1310,1377, +1311,1377,1310, +1377,1311,1378, +1312,1378,1311, +1378,1312,1379, +1313,1379,1312, +1379,1313,1380, +1314,1380,1313, +1380,1314,1381, +1315,1381,1314, +1381,1315,1382, +1316,1382,1315, +1382,1316,1383, +1317,1383,1316, +1383,1317,1384, +1318,1384,1317, +1384,1318,1385, +1319,1385,1318, +1386,1320,1387, +1321,1387,1320, +1387,1321,1388, +1322,1388,1321, +1388,1322,1389, +1323,1389,1322, +1389,1323,1390, +1324,1390,1323, +1390,1324,1391, +1325,1391,1324, +1391,1325,1392, +1326,1392,1325, +1392,1326,1393, +1327,1393,1326, +1393,1327,1394, +1328,1394,1327, +1394,1328,1395, +1329,1395,1328, +1395,1329,1396, +1330,1396,1329, +1396,1330,1397, +1331,1397,1330, +1397,1331,1398, +1332,1398,1331, +1398,1332,1399, +1333,1399,1332, +1399,1333,1400, +1334,1400,1333, +1400,1334,1401, +1335,1401,1334, +1401,1335,1402, +1336,1402,1335, +1402,1336,1403, +1337,1403,1336, +1403,1337,1404, +1338,1404,1337, +1404,1338,1405, +1339,1405,1338, +1405,1339,1406, +1340,1406,1339, +1406,1340,1407, +1341,1407,1340, +1407,1341,1408, +1342,1408,1341, +1408,1342,1409, +1343,1409,1342, +1409,1343,1410, +1344,1410,1343, +1410,1344,1411, +1345,1411,1344, +1411,1345,1412, +1346,1412,1345, +1412,1346,1413, +1347,1413,1346, +1413,1347,1414, +1348,1414,1347, +1414,1348,1415, +1349,1415,1348, +1415,1349,1416, +1350,1416,1349, +1416,1350,1417, +1351,1417,1350, +1417,1351,1418, +1352,1418,1351, +1418,1352,1419, +1353,1419,1352, +1419,1353,1420, +1354,1420,1353, +1420,1354,1421, +1355,1421,1354, +1421,1355,1422, +1356,1422,1355, +1422,1356,1423, +1357,1423,1356, +1423,1357,1424, +1358,1424,1357, +1424,1358,1425, +1359,1425,1358, +1425,1359,1426, +1360,1426,1359, +1426,1360,1427, +1361,1427,1360, +1427,1361,1428, +1362,1428,1361, +1428,1362,1429, +1363,1429,1362, +1429,1363,1430, +1364,1430,1363, +1430,1364,1431, +1365,1431,1364, +1431,1365,1432, +1366,1432,1365, +1432,1366,1433, +1367,1433,1366, +1433,1367,1434, +1368,1434,1367, +1434,1368,1435, +1369,1435,1368, +1435,1369,1436, +1370,1436,1369, +1436,1370,1437, +1371,1437,1370, +1437,1371,1438, +1372,1438,1371, +1438,1372,1439, +1373,1439,1372, +1439,1373,1440, +1374,1440,1373, +1440,1374,1441, +1375,1441,1374, +1441,1375,1442, +1376,1442,1375, +1442,1376,1443, +1377,1443,1376, +1443,1377,1444, +1378,1444,1377, +1444,1378,1445, +1379,1445,1378, +1445,1379,1446, +1380,1446,1379, +1446,1380,1447, +1381,1447,1380, +1447,1381,1448, +1382,1448,1381, +1448,1382,1449, +1383,1449,1382, +1449,1383,1450, +1384,1450,1383, +1450,1384,1451, +1385,1451,1384, +1452,1386,1453, +1387,1453,1386, +1453,1387,1454, +1388,1454,1387, +1454,1388,1455, +1389,1455,1388, +1455,1389,1456, +1390,1456,1389, +1456,1390,1457, +1391,1457,1390, +1457,1391,1458, +1392,1458,1391, +1458,1392,1459, +1393,1459,1392, +1459,1393,1460, +1394,1460,1393, +1460,1394,1461, +1395,1461,1394, +1461,1395,1462, +1396,1462,1395, +1462,1396,1463, +1397,1463,1396, +1463,1397,1464, +1398,1464,1397, +1464,1398,1465, +1399,1465,1398, +1465,1399,1466, +1400,1466,1399, +1466,1400,1467, +1401,1467,1400, +1467,1401,1468, +1402,1468,1401, +1468,1402,1469, +1403,1469,1402, +1469,1403,1470, +1404,1470,1403, +1470,1404,1471, +1405,1471,1404, +1471,1405,1472, +1406,1472,1405, +1472,1406,1473, +1407,1473,1406, +1473,1407,1474, +1408,1474,1407, +1474,1408,1475, +1409,1475,1408, +1475,1409,1476, +1410,1476,1409, +1476,1410,1477, +1411,1477,1410, +1477,1411,1478, +1412,1478,1411, +1478,1412,1479, +1413,1479,1412, +1479,1413,1480, +1414,1480,1413, +1480,1414,1481, +1415,1481,1414, +1481,1415,1482, +1416,1482,1415, +1482,1416,1483, +1417,1483,1416, +1483,1417,1484, +1418,1484,1417, +1484,1418,1485, +1419,1485,1418, +1485,1419,1486, +1420,1486,1419, +1486,1420,1487, +1421,1487,1420, +1487,1421,1488, +1422,1488,1421, +1488,1422,1489, +1423,1489,1422, +1489,1423,1490, +1424,1490,1423, +1490,1424,1491, +1425,1491,1424, +1491,1425,1492, +1426,1492,1425, +1492,1426,1493, +1427,1493,1426, +1493,1427,1494, +1428,1494,1427, +1494,1428,1495, +1429,1495,1428, +1495,1429,1496, +1430,1496,1429, +1496,1430,1497, +1431,1497,1430, +1497,1431,1498, +1432,1498,1431, +1498,1432,1499, +1433,1499,1432, +1499,1433,1500, +1434,1500,1433, +1500,1434,1501, +1435,1501,1434, +1501,1435,1502, +1436,1502,1435, +1502,1436,1503, +1437,1503,1436, +1503,1437,1504, +1438,1504,1437, +1504,1438,1505, +1439,1505,1438, +1505,1439,1506, +1440,1506,1439, +1506,1440,1507, +1441,1507,1440, +1507,1441,1508, +1442,1508,1441, +1508,1442,1509, +1443,1509,1442, +1509,1443,1510, +1444,1510,1443, +1510,1444,1511, +1445,1511,1444, +1511,1445,1512, +1446,1512,1445, +1512,1446,1513, +1447,1513,1446, +1513,1447,1514, +1448,1514,1447, +1514,1448,1515, +1449,1515,1448, +1515,1449,1516, +1450,1516,1449, +1516,1450,1517, +1451,1517,1450, +1518,1452,1519, +1453,1519,1452, +1519,1453,1520, +1454,1520,1453, +1520,1454,1521, +1455,1521,1454, +1521,1455,1522, +1456,1522,1455, +1522,1456,1523, +1457,1523,1456, +1523,1457,1524, +1458,1524,1457, +1524,1458,1525, +1459,1525,1458, +1525,1459,1526, +1460,1526,1459, +1526,1460,1527, +1461,1527,1460, +1527,1461,1528, +1462,1528,1461, +1528,1462,1529, +1463,1529,1462, +1529,1463,1530, +1464,1530,1463, +1530,1464,1531, +1465,1531,1464, +1531,1465,1532, +1466,1532,1465, +1532,1466,1533, +1467,1533,1466, +1533,1467,1534, +1468,1534,1467, +1534,1468,1535, +1469,1535,1468, +1535,1469,1536, +1470,1536,1469, +1536,1470,1537, +1471,1537,1470, +1537,1471,1538, +1472,1538,1471, +1538,1472,1539, +1473,1539,1472, +1539,1473,1540, +1474,1540,1473, +1540,1474,1541, +1475,1541,1474, +1541,1475,1542, +1476,1542,1475, +1542,1476,1543, +1477,1543,1476, +1543,1477,1544, +1478,1544,1477, +1544,1478,1545, +1479,1545,1478, +1545,1479,1546, +1480,1546,1479, +1546,1480,1547, +1481,1547,1480, +1547,1481,1548, +1482,1548,1481, +1548,1482,1549, +1483,1549,1482, +1549,1483,1550, +1484,1550,1483, +1550,1484,1551, +1485,1551,1484, +1551,1485,1552, +1486,1552,1485, +1552,1486,1553, +1487,1553,1486, +1553,1487,1554, +1488,1554,1487, +1554,1488,1555, +1489,1555,1488, +1555,1489,1556, +1490,1556,1489, +1556,1490,1557, +1491,1557,1490, +1557,1491,1558, +1492,1558,1491, +1558,1492,1559, +1493,1559,1492, +1559,1493,1560, +1494,1560,1493, +1560,1494,1561, +1495,1561,1494, +1561,1495,1562, +1496,1562,1495, +1562,1496,1563, +1497,1563,1496, +1563,1497,1564, +1498,1564,1497, +1564,1498,1565, +1499,1565,1498, +1565,1499,1566, +1500,1566,1499, +1566,1500,1567, +1501,1567,1500, +1567,1501,1568, +1502,1568,1501, +1568,1502,1569, +1503,1569,1502, +1569,1503,1570, +1504,1570,1503, +1570,1504,1571, +1505,1571,1504, +1571,1505,1572, +1506,1572,1505, +1572,1506,1573, +1507,1573,1506, +1573,1507,1574, +1508,1574,1507, +1574,1508,1575, +1509,1575,1508, +1575,1509,1576, +1510,1576,1509, +1576,1510,1577, +1511,1577,1510, +1577,1511,1578, +1512,1578,1511, +1578,1512,1579, +1513,1579,1512, +1579,1513,1580, +1514,1580,1513, +1580,1514,1581, +1515,1581,1514, +1581,1515,1582, +1516,1582,1515, +1582,1516,1583, +1517,1583,1516, +1584,1518,1585, +1519,1585,1518, +1585,1519,1586, +1520,1586,1519, +1586,1520,1587, +1521,1587,1520, +1587,1521,1588, +1522,1588,1521, +1588,1522,1589, +1523,1589,1522, +1589,1523,1590, +1524,1590,1523, +1590,1524,1591, +1525,1591,1524, +1591,1525,1592, +1526,1592,1525, +1592,1526,1593, +1527,1593,1526, +1593,1527,1594, +1528,1594,1527, +1594,1528,1595, +1529,1595,1528, +1595,1529,1596, +1530,1596,1529, +1596,1530,1597, +1531,1597,1530, +1597,1531,1598, +1532,1598,1531, +1598,1532,1599, +1533,1599,1532, +1599,1533,1600, +1534,1600,1533, +1600,1534,1601, +1535,1601,1534, +1601,1535,1602, +1536,1602,1535, +1602,1536,1603, +1537,1603,1536, +1603,1537,1604, +1538,1604,1537, +1604,1538,1605, +1539,1605,1538, +1605,1539,1606, +1540,1606,1539, +1606,1540,1607, +1541,1607,1540, +1607,1541,1608, +1542,1608,1541, +1608,1542,1609, +1543,1609,1542, +1609,1543,1610, +1544,1610,1543, +1610,1544,1611, +1545,1611,1544, +1611,1545,1612, +1546,1612,1545, +1612,1546,1613, +1547,1613,1546, +1613,1547,1614, +1548,1614,1547, +1614,1548,1615, +1549,1615,1548, +1615,1549,1616, +1550,1616,1549, +1616,1550,1617, +1551,1617,1550, +1617,1551,1618, +1552,1618,1551, +1618,1552,1619, +1553,1619,1552, +1619,1553,1620, +1554,1620,1553, +1620,1554,1621, +1555,1621,1554, +1621,1555,1622, +1556,1622,1555, +1622,1556,1623, +1557,1623,1556, +1623,1557,1624, +1558,1624,1557, +1624,1558,1625, +1559,1625,1558, +1625,1559,1626, +1560,1626,1559, +1626,1560,1627, +1561,1627,1560, +1627,1561,1628, +1562,1628,1561, +1628,1562,1629, +1563,1629,1562, +1629,1563,1630, +1564,1630,1563, +1630,1564,1631, +1565,1631,1564, +1631,1565,1632, +1566,1632,1565, +1632,1566,1633, +1567,1633,1566, +1633,1567,1634, +1568,1634,1567, +1634,1568,1635, +1569,1635,1568, +1635,1569,1636, +1570,1636,1569, +1636,1570,1637, +1571,1637,1570, +1637,1571,1638, +1572,1638,1571, +1638,1572,1639, +1573,1639,1572, +1639,1573,1640, +1574,1640,1573, +1640,1574,1641, +1575,1641,1574, +1641,1575,1642, +1576,1642,1575, +1642,1576,1643, +1577,1643,1576, +1643,1577,1644, +1578,1644,1577, +1644,1578,1645, +1579,1645,1578, +1645,1579,1646, +1580,1646,1579, +1646,1580,1647, +1581,1647,1580, +1647,1581,1648, +1582,1648,1581, +1648,1582,1649, +1583,1649,1582, +1650,1584,1651, +1585,1651,1584, +1651,1585,1652, +1586,1652,1585, +1652,1586,1653, +1587,1653,1586, +1653,1587,1654, +1588,1654,1587, +1654,1588,1655, +1589,1655,1588, +1655,1589,1656, +1590,1656,1589, +1656,1590,1657, +1591,1657,1590, +1657,1591,1658, +1592,1658,1591, +1658,1592,1659, +1593,1659,1592, +1659,1593,1660, +1594,1660,1593, +1660,1594,1661, +1595,1661,1594, +1661,1595,1662, +1596,1662,1595, +1662,1596,1663, +1597,1663,1596, +1663,1597,1664, +1598,1664,1597, +1664,1598,1665, +1599,1665,1598, +1665,1599,1666, +1600,1666,1599, +1666,1600,1667, +1601,1667,1600, +1667,1601,1668, +1602,1668,1601, +1668,1602,1669, +1603,1669,1602, +1669,1603,1670, +1604,1670,1603, +1670,1604,1671, +1605,1671,1604, +1671,1605,1672, +1606,1672,1605, +1672,1606,1673, +1607,1673,1606, +1673,1607,1674, +1608,1674,1607, +1674,1608,1675, +1609,1675,1608, +1675,1609,1676, +1610,1676,1609, +1676,1610,1677, +1611,1677,1610, +1677,1611,1678, +1612,1678,1611, +1678,1612,1679, +1613,1679,1612, +1679,1613,1680, +1614,1680,1613, +1680,1614,1681, +1615,1681,1614, +1681,1615,1682, +1616,1682,1615, +1682,1616,1683, +1617,1683,1616, +1683,1617,1684, +1618,1684,1617, +1684,1618,1685, +1619,1685,1618, +1685,1619,1686, +1620,1686,1619, +1686,1620,1687, +1621,1687,1620, +1687,1621,1688, +1622,1688,1621, +1688,1622,1689, +1623,1689,1622, +1689,1623,1690, +1624,1690,1623, +1690,1624,1691, +1625,1691,1624, +1691,1625,1692, +1626,1692,1625, +1692,1626,1693, +1627,1693,1626, +1693,1627,1694, +1628,1694,1627, +1694,1628,1695, +1629,1695,1628, +1695,1629,1696, +1630,1696,1629, +1696,1630,1697, +1631,1697,1630, +1697,1631,1698, +1632,1698,1631, +1698,1632,1699, +1633,1699,1632, +1699,1633,1700, +1634,1700,1633, +1700,1634,1701, +1635,1701,1634, +1701,1635,1702, +1636,1702,1635, +1702,1636,1703, +1637,1703,1636, +1703,1637,1704, +1638,1704,1637, +1704,1638,1705, +1639,1705,1638, +1705,1639,1706, +1640,1706,1639, +1706,1640,1707, +1641,1707,1640, +1707,1641,1708, +1642,1708,1641, +1708,1642,1709, +1643,1709,1642, +1709,1643,1710, +1644,1710,1643, +1710,1644,1711, +1645,1711,1644, +1711,1645,1712, +1646,1712,1645, +1712,1646,1713, +1647,1713,1646, +1713,1647,1714, +1648,1714,1647, +1714,1648,1715, +1649,1715,1648, +1716,1650,1717, +1651,1717,1650, +1717,1651,1718, +1652,1718,1651, +1718,1652,1719, +1653,1719,1652, +1719,1653,1720, +1654,1720,1653, +1720,1654,1721, +1655,1721,1654, +1721,1655,1722, +1656,1722,1655, +1722,1656,1723, +1657,1723,1656, +1723,1657,1724, +1658,1724,1657, +1724,1658,1725, +1659,1725,1658, +1725,1659,1726, +1660,1726,1659, +1726,1660,1727, +1661,1727,1660, +1727,1661,1728, +1662,1728,1661, +1728,1662,1729, +1663,1729,1662, +1729,1663,1730, +1664,1730,1663, +1730,1664,1731, +1665,1731,1664, +1731,1665,1732, +1666,1732,1665, +1732,1666,1733, +1667,1733,1666, +1733,1667,1734, +1668,1734,1667, +1734,1668,1735, +1669,1735,1668, +1735,1669,1736, +1670,1736,1669, +1736,1670,1737, +1671,1737,1670, +1737,1671,1738, +1672,1738,1671, +1738,1672,1739, +1673,1739,1672, +1739,1673,1740, +1674,1740,1673, +1740,1674,1741, +1675,1741,1674, +1741,1675,1742, +1676,1742,1675, +1742,1676,1743, +1677,1743,1676, +1743,1677,1744, +1678,1744,1677, +1744,1678,1745, +1679,1745,1678, +1745,1679,1746, +1680,1746,1679, +1746,1680,1747, +1681,1747,1680, +1747,1681,1748, +1682,1748,1681, +1748,1682,1749, +1683,1749,1682, +1749,1683,1750, +1684,1750,1683, +1750,1684,1751, +1685,1751,1684, +1751,1685,1752, +1686,1752,1685, +1752,1686,1753, +1687,1753,1686, +1753,1687,1754, +1688,1754,1687, +1754,1688,1755, +1689,1755,1688, +1755,1689,1756, +1690,1756,1689, +1756,1690,1757, +1691,1757,1690, +1757,1691,1758, +1692,1758,1691, +1758,1692,1759, +1693,1759,1692, +1759,1693,1760, +1694,1760,1693, +1760,1694,1761, +1695,1761,1694, +1761,1695,1762, +1696,1762,1695, +1762,1696,1763, +1697,1763,1696, +1763,1697,1764, +1698,1764,1697, +1764,1698,1765, +1699,1765,1698, +1765,1699,1766, +1700,1766,1699, +1766,1700,1767, +1701,1767,1700, +1767,1701,1768, +1702,1768,1701, +1768,1702,1769, +1703,1769,1702, +1769,1703,1770, +1704,1770,1703, +1770,1704,1771, +1705,1771,1704, +1771,1705,1772, +1706,1772,1705, +1772,1706,1773, +1707,1773,1706, +1773,1707,1774, +1708,1774,1707, +1774,1708,1775, +1709,1775,1708, +1775,1709,1776, +1710,1776,1709, +1776,1710,1777, +1711,1777,1710, +1777,1711,1778, +1712,1778,1711, +1778,1712,1779, +1713,1779,1712, +1779,1713,1780, +1714,1780,1713, +1780,1714,1781, +1715,1781,1714, +1782,1716,1783, +1717,1783,1716, +1783,1717,1784, +1718,1784,1717, +1784,1718,1785, +1719,1785,1718, +1785,1719,1786, +1720,1786,1719, +1786,1720,1787, +1721,1787,1720, +1787,1721,1788, +1722,1788,1721, +1788,1722,1789, +1723,1789,1722, +1789,1723,1790, +1724,1790,1723, +1790,1724,1791, +1725,1791,1724, +1791,1725,1792, +1726,1792,1725, +1792,1726,1793, +1727,1793,1726, +1793,1727,1794, +1728,1794,1727, +1794,1728,1795, +1729,1795,1728, +1795,1729,1796, +1730,1796,1729, +1796,1730,1797, +1731,1797,1730, +1797,1731,1798, +1732,1798,1731, +1798,1732,1799, +1733,1799,1732, +1799,1733,1800, +1734,1800,1733, +1800,1734,1801, +1735,1801,1734, +1801,1735,1802, +1736,1802,1735, +1802,1736,1803, +1737,1803,1736, +1803,1737,1804, +1738,1804,1737, +1804,1738,1805, +1739,1805,1738, +1805,1739,1806, +1740,1806,1739, +1806,1740,1807, +1741,1807,1740, +1807,1741,1808, +1742,1808,1741, +1808,1742,1809, +1743,1809,1742, +1809,1743,1810, +1744,1810,1743, +1810,1744,1811, +1745,1811,1744, +1811,1745,1812, +1746,1812,1745, +1812,1746,1813, +1747,1813,1746, +1813,1747,1814, +1748,1814,1747, +1814,1748,1815, +1749,1815,1748, +1815,1749,1816, +1750,1816,1749, +1816,1750,1817, +1751,1817,1750, +1817,1751,1818, +1752,1818,1751, +1818,1752,1819, +1753,1819,1752, +1819,1753,1820, +1754,1820,1753, +1820,1754,1821, +1755,1821,1754, +1821,1755,1822, +1756,1822,1755, +1822,1756,1823, +1757,1823,1756, +1823,1757,1824, +1758,1824,1757, +1824,1758,1825, +1759,1825,1758, +1825,1759,1826, +1760,1826,1759, +1826,1760,1827, +1761,1827,1760, +1827,1761,1828, +1762,1828,1761, +1828,1762,1829, +1763,1829,1762, +1829,1763,1830, +1764,1830,1763, +1830,1764,1831, +1765,1831,1764, +1831,1765,1832, +1766,1832,1765, +1832,1766,1833, +1767,1833,1766, +1833,1767,1834, +1768,1834,1767, +1834,1768,1835, +1769,1835,1768, +1835,1769,1836, +1770,1836,1769, +1836,1770,1837, +1771,1837,1770, +1837,1771,1838, +1772,1838,1771, +1838,1772,1839, +1773,1839,1772, +1839,1773,1840, +1774,1840,1773, +1840,1774,1841, +1775,1841,1774, +1841,1775,1842, +1776,1842,1775, +1842,1776,1843, +1777,1843,1776, +1843,1777,1844, +1778,1844,1777, +1844,1778,1845, +1779,1845,1778, +1845,1779,1846, +1780,1846,1779, +1846,1780,1847, +1781,1847,1780, +1848,1782,1849, +1783,1849,1782, +1849,1783,1850, +1784,1850,1783, +1850,1784,1851, +1785,1851,1784, +1851,1785,1852, +1786,1852,1785, +1852,1786,1853, +1787,1853,1786, +1853,1787,1854, +1788,1854,1787, +1854,1788,1855, +1789,1855,1788, +1855,1789,1856, +1790,1856,1789, +1856,1790,1857, +1791,1857,1790, +1857,1791,1858, +1792,1858,1791, +1858,1792,1859, +1793,1859,1792, +1859,1793,1860, +1794,1860,1793, +1860,1794,1861, +1795,1861,1794, +1861,1795,1862, +1796,1862,1795, +1862,1796,1863, +1797,1863,1796, +1863,1797,1864, +1798,1864,1797, +1864,1798,1865, +1799,1865,1798, +1865,1799,1866, +1800,1866,1799, +1866,1800,1867, +1801,1867,1800, +1867,1801,1868, +1802,1868,1801, +1868,1802,1869, +1803,1869,1802, +1869,1803,1870, +1804,1870,1803, +1870,1804,1871, +1805,1871,1804, +1871,1805,1872, +1806,1872,1805, +1872,1806,1873, +1807,1873,1806, +1873,1807,1874, +1808,1874,1807, +1874,1808,1875, +1809,1875,1808, +1875,1809,1876, +1810,1876,1809, +1876,1810,1877, +1811,1877,1810, +1877,1811,1878, +1812,1878,1811, +1878,1812,1879, +1813,1879,1812, +1879,1813,1880, +1814,1880,1813, +1880,1814,1881, +1815,1881,1814, +1881,1815,1882, +1816,1882,1815, +1882,1816,1883, +1817,1883,1816, +1883,1817,1884, +1818,1884,1817, +1884,1818,1885, +1819,1885,1818, +1885,1819,1886, +1820,1886,1819, +1886,1820,1887, +1821,1887,1820, +1887,1821,1888, +1822,1888,1821, +1888,1822,1889, +1823,1889,1822, +1889,1823,1890, +1824,1890,1823, +1890,1824,1891, +1825,1891,1824, +1891,1825,1892, +1826,1892,1825, +1892,1826,1893, +1827,1893,1826, +1893,1827,1894, +1828,1894,1827, +1894,1828,1895, +1829,1895,1828, +1895,1829,1896, +1830,1896,1829, +1896,1830,1897, +1831,1897,1830, +1897,1831,1898, +1832,1898,1831, +1898,1832,1899, +1833,1899,1832, +1899,1833,1900, +1834,1900,1833, +1900,1834,1901, +1835,1901,1834, +1901,1835,1902, +1836,1902,1835, +1902,1836,1903, +1837,1903,1836, +1903,1837,1904, +1838,1904,1837, +1904,1838,1905, +1839,1905,1838, +1905,1839,1906, +1840,1906,1839, +1906,1840,1907, +1841,1907,1840, +1907,1841,1908, +1842,1908,1841, +1908,1842,1909, +1843,1909,1842, +1909,1843,1910, +1844,1910,1843, +1910,1844,1911, +1845,1911,1844, +1911,1845,1912, +1846,1912,1845, +1912,1846,1913, +1847,1913,1846, +1914,1848,1915, +1849,1915,1848, +1915,1849,1916, +1850,1916,1849, +1916,1850,1917, +1851,1917,1850, +1917,1851,1918, +1852,1918,1851, +1918,1852,1919, +1853,1919,1852, +1919,1853,1920, +1854,1920,1853, +1920,1854,1921, +1855,1921,1854, +1921,1855,1922, +1856,1922,1855, +1922,1856,1923, +1857,1923,1856, +1923,1857,1924, +1858,1924,1857, +1924,1858,1925, +1859,1925,1858, +1925,1859,1926, +1860,1926,1859, +1926,1860,1927, +1861,1927,1860, +1927,1861,1928, +1862,1928,1861, +1928,1862,1929, +1863,1929,1862, +1929,1863,1930, +1864,1930,1863, +1930,1864,1931, +1865,1931,1864, +1931,1865,1932, +1866,1932,1865, +1932,1866,1933, +1867,1933,1866, +1933,1867,1934, +1868,1934,1867, +1934,1868,1935, +1869,1935,1868, +1935,1869,1936, +1870,1936,1869, +1936,1870,1937, +1871,1937,1870, +1937,1871,1938, +1872,1938,1871, +1938,1872,1939, +1873,1939,1872, +1939,1873,1940, +1874,1940,1873, +1940,1874,1941, +1875,1941,1874, +1941,1875,1942, +1876,1942,1875, +1942,1876,1943, +1877,1943,1876, +1943,1877,1944, +1878,1944,1877, +1944,1878,1945, +1879,1945,1878, +1945,1879,1946, +1880,1946,1879, +1946,1880,1947, +1881,1947,1880, +1947,1881,1948, +1882,1948,1881, +1948,1882,1949, +1883,1949,1882, +1949,1883,1950, +1884,1950,1883, +1950,1884,1951, +1885,1951,1884, +1951,1885,1952, +1886,1952,1885, +1952,1886,1953, +1887,1953,1886, +1953,1887,1954, +1888,1954,1887, +1954,1888,1955, +1889,1955,1888, +1955,1889,1956, +1890,1956,1889, +1956,1890,1957, +1891,1957,1890, +1957,1891,1958, +1892,1958,1891, +1958,1892,1959, +1893,1959,1892, +1959,1893,1960, +1894,1960,1893, +1960,1894,1961, +1895,1961,1894, +1961,1895,1962, +1896,1962,1895, +1962,1896,1963, +1897,1963,1896, +1963,1897,1964, +1898,1964,1897, +1964,1898,1965, +1899,1965,1898, +1965,1899,1966, +1900,1966,1899, +1966,1900,1967, +1901,1967,1900, +1967,1901,1968, +1902,1968,1901, +1968,1902,1969, +1903,1969,1902, +1969,1903,1970, +1904,1970,1903, +1970,1904,1971, +1905,1971,1904, +1971,1905,1972, +1906,1972,1905, +1972,1906,1973, +1907,1973,1906, +1973,1907,1974, +1908,1974,1907, +1974,1908,1975, +1909,1975,1908, +1975,1909,1976, +1910,1976,1909, +1976,1910,1977, +1911,1977,1910, +1977,1911,1978, +1912,1978,1911, +1978,1912,1979, +1913,1979,1912, +1980,1914,1981, +1915,1981,1914, +1981,1915,1982, +1916,1982,1915, +1982,1916,1983, +1917,1983,1916, +1983,1917,1984, +1918,1984,1917, +1984,1918,1985, +1919,1985,1918, +1985,1919,1986, +1920,1986,1919, +1986,1920,1987, +1921,1987,1920, +1987,1921,1988, +1922,1988,1921, +1988,1922,1989, +1923,1989,1922, +1989,1923,1990, +1924,1990,1923, +1990,1924,1991, +1925,1991,1924, +1991,1925,1992, +1926,1992,1925, +1992,1926,1993, +1927,1993,1926, +1993,1927,1994, +1928,1994,1927, +1994,1928,1995, +1929,1995,1928, +1995,1929,1996, +1930,1996,1929, +1996,1930,1997, +1931,1997,1930, +1997,1931,1998, +1932,1998,1931, +1998,1932,1999, +1933,1999,1932, +1999,1933,2000, +1934,2000,1933, +2000,1934,2001, +1935,2001,1934, +2001,1935,2002, +1936,2002,1935, +2002,1936,2003, +1937,2003,1936, +2003,1937,2004, +1938,2004,1937, +2004,1938,2005, +1939,2005,1938, +2005,1939,2006, +1940,2006,1939, +2006,1940,2007, +1941,2007,1940, +2007,1941,2008, +1942,2008,1941, +2008,1942,2009, +1943,2009,1942, +2009,1943,2010, +1944,2010,1943, +2010,1944,2011, +1945,2011,1944, +2011,1945,2012, +1946,2012,1945, +2012,1946,2013, +1947,2013,1946, +2013,1947,2014, +1948,2014,1947, +2014,1948,2015, +1949,2015,1948, +2015,1949,2016, +1950,2016,1949, +2016,1950,2017, +1951,2017,1950, +2017,1951,2018, +1952,2018,1951, +2018,1952,2019, +1953,2019,1952, +2019,1953,2020, +1954,2020,1953, +2020,1954,2021, +1955,2021,1954, +2021,1955,2022, +1956,2022,1955, +2022,1956,2023, +1957,2023,1956, +2023,1957,2024, +1958,2024,1957, +2024,1958,2025, +1959,2025,1958, +2025,1959,2026, +1960,2026,1959, +2026,1960,2027, +1961,2027,1960, +2027,1961,2028, +1962,2028,1961, +2028,1962,2029, +1963,2029,1962, +2029,1963,2030, +1964,2030,1963, +2030,1964,2031, +1965,2031,1964, +2031,1965,2032, +1966,2032,1965, +2032,1966,2033, +1967,2033,1966, +2033,1967,2034, +1968,2034,1967, +2034,1968,2035, +1969,2035,1968, +2035,1969,2036, +1970,2036,1969, +2036,1970,2037, +1971,2037,1970, +2037,1971,2038, +1972,2038,1971, +2038,1972,2039, +1973,2039,1972, +2039,1973,2040, +1974,2040,1973, +2040,1974,2041, +1975,2041,1974, +2041,1975,2042, +1976,2042,1975, +2042,1976,2043, +1977,2043,1976, +2043,1977,2044, +1978,2044,1977, +2044,1978,2045, +1979,2045,1978, +2046,1980,2047, +1981,2047,1980, +2047,1981,2048, +1982,2048,1981, +2048,1982,2049, +1983,2049,1982, +2049,1983,2050, +1984,2050,1983, +2050,1984,2051, +1985,2051,1984, +2051,1985,2052, +1986,2052,1985, +2052,1986,2053, +1987,2053,1986, +2053,1987,2054, +1988,2054,1987, +2054,1988,2055, +1989,2055,1988, +2055,1989,2056, +1990,2056,1989, +2056,1990,2057, +1991,2057,1990, +2057,1991,2058, +1992,2058,1991, +2058,1992,2059, +1993,2059,1992, +2059,1993,2060, +1994,2060,1993, +2060,1994,2061, +1995,2061,1994, +2061,1995,2062, +1996,2062,1995, +2062,1996,2063, +1997,2063,1996, +2063,1997,2064, +1998,2064,1997, +2064,1998,2065, +1999,2065,1998, +2065,1999,2066, +2000,2066,1999, +2066,2000,2067, +2001,2067,2000, +2067,2001,2068, +2002,2068,2001, +2068,2002,2069, +2003,2069,2002, +2069,2003,2070, +2004,2070,2003, +2070,2004,2071, +2005,2071,2004, +2071,2005,2072, +2006,2072,2005, +2072,2006,2073, +2007,2073,2006, +2073,2007,2074, +2008,2074,2007, +2074,2008,2075, +2009,2075,2008, +2075,2009,2076, +2010,2076,2009, +2076,2010,2077, +2011,2077,2010, +2077,2011,2078, +2012,2078,2011, +2078,2012,2079, +2013,2079,2012, +2079,2013,2080, +2014,2080,2013, +2080,2014,2081, +2015,2081,2014, +2081,2015,2082, +2016,2082,2015, +2082,2016,2083, +2017,2083,2016, +2083,2017,2084, +2018,2084,2017, +2084,2018,2085, +2019,2085,2018, +2085,2019,2086, +2020,2086,2019, +2086,2020,2087, +2021,2087,2020, +2087,2021,2088, +2022,2088,2021, +2088,2022,2089, +2023,2089,2022, +2089,2023,2090, +2024,2090,2023, +2090,2024,2091, +2025,2091,2024, +2091,2025,2092, +2026,2092,2025, +2092,2026,2093, +2027,2093,2026, +2093,2027,2094, +2028,2094,2027, +2094,2028,2095, +2029,2095,2028, +2095,2029,2096, +2030,2096,2029, +2096,2030,2097, +2031,2097,2030, +2097,2031,2098, +2032,2098,2031, +2098,2032,2099, +2033,2099,2032, +2099,2033,2100, +2034,2100,2033, +2100,2034,2101, +2035,2101,2034, +2101,2035,2102, +2036,2102,2035, +2102,2036,2103, +2037,2103,2036, +2103,2037,2104, +2038,2104,2037, +2104,2038,2105, +2039,2105,2038, +2105,2039,2106, +2040,2106,2039, +2106,2040,2107, +2041,2107,2040, +2107,2041,2108, +2042,2108,2041, +2108,2042,2109, +2043,2109,2042, +2109,2043,2110, +2044,2110,2043, +2110,2044,2111, +2045,2111,2044, +2112,2046,2113, +2047,2113,2046, +2113,2047,2114, +2048,2114,2047, +2114,2048,2115, +2049,2115,2048, +2115,2049,2116, +2050,2116,2049, +2116,2050,2117, +2051,2117,2050, +2117,2051,2118, +2052,2118,2051, +2118,2052,2119, +2053,2119,2052, +2119,2053,2120, +2054,2120,2053, +2120,2054,2121, +2055,2121,2054, +2121,2055,2122, +2056,2122,2055, +2122,2056,2123, +2057,2123,2056, +2123,2057,2124, +2058,2124,2057, +2124,2058,2125, +2059,2125,2058, +2125,2059,2126, +2060,2126,2059, +2126,2060,2127, +2061,2127,2060, +2127,2061,2128, +2062,2128,2061, +2128,2062,2129, +2063,2129,2062, +2129,2063,2130, +2064,2130,2063, +2130,2064,2131, +2065,2131,2064, +2131,2065,2132, +2066,2132,2065, +2132,2066,2133, +2067,2133,2066, +2133,2067,2134, +2068,2134,2067, +2134,2068,2135, +2069,2135,2068, +2135,2069,2136, +2070,2136,2069, +2136,2070,2137, +2071,2137,2070, +2137,2071,2138, +2072,2138,2071, +2138,2072,2139, +2073,2139,2072, +2139,2073,2140, +2074,2140,2073, +2140,2074,2141, +2075,2141,2074, +2141,2075,2142, +2076,2142,2075, +2142,2076,2143, +2077,2143,2076, +2143,2077,2144, +2078,2144,2077, +2144,2078,2145, +2079,2145,2078, +2145,2079,2146, +2080,2146,2079, +2146,2080,2147, +2081,2147,2080, +2147,2081,2148, +2082,2148,2081, +2148,2082,2149, +2083,2149,2082, +2149,2083,2150, +2084,2150,2083, +2150,2084,2151, +2085,2151,2084, +2151,2085,2152, +2086,2152,2085, +2152,2086,2153, +2087,2153,2086, +2153,2087,2154, +2088,2154,2087, +2154,2088,2155, +2089,2155,2088, +2155,2089,2156, +2090,2156,2089, +2156,2090,2157, +2091,2157,2090, +2157,2091,2158, +2092,2158,2091, +2158,2092,2159, +2093,2159,2092, +2159,2093,2160, +2094,2160,2093, +2160,2094,2161, +2095,2161,2094, +2161,2095,2162, +2096,2162,2095, +2162,2096,2163, +2097,2163,2096, +2163,2097,2164, +2098,2164,2097, +2164,2098,2165, +2099,2165,2098, +2165,2099,2166, +2100,2166,2099, +2166,2100,2167, +2101,2167,2100, +2167,2101,2168, +2102,2168,2101, +2168,2102,2169, +2103,2169,2102, +2169,2103,2170, +2104,2170,2103, +2170,2104,2171, +2105,2171,2104, +2171,2105,2172, +2106,2172,2105, +2172,2106,2173, +2107,2173,2106, +2173,2107,2174, +2108,2174,2107, +2174,2108,2175, +2109,2175,2108, +2175,2109,2176, +2110,2176,2109, +2176,2110,2177, +2111,2177,2110, +2178,2112,2179, +2113,2179,2112, +2179,2113,2180, +2114,2180,2113, +2180,2114,2181, +2115,2181,2114, +2181,2115,2182, +2116,2182,2115, +2182,2116,2183, +2117,2183,2116, +2183,2117,2184, +2118,2184,2117, +2184,2118,2185, +2119,2185,2118, +2185,2119,2186, +2120,2186,2119, +2186,2120,2187, +2121,2187,2120, +2187,2121,2188, +2122,2188,2121, +2188,2122,2189, +2123,2189,2122, +2189,2123,2190, +2124,2190,2123, +2190,2124,2191, +2125,2191,2124, +2191,2125,2192, +2126,2192,2125, +2192,2126,2193, +2127,2193,2126, +2193,2127,2194, +2128,2194,2127, +2194,2128,2195, +2129,2195,2128, +2195,2129,2196, +2130,2196,2129, +2196,2130,2197, +2131,2197,2130, +2197,2131,2198, +2132,2198,2131, +2198,2132,2199, +2133,2199,2132, +2199,2133,2200, +2134,2200,2133, +2200,2134,2201, +2135,2201,2134, +2201,2135,2202, +2136,2202,2135, +2202,2136,2203, +2137,2203,2136, +2203,2137,2204, +2138,2204,2137, +2204,2138,2205, +2139,2205,2138, +2205,2139,2206, +2140,2206,2139, +2206,2140,2207, +2141,2207,2140, +2207,2141,2208, +2142,2208,2141, +2208,2142,2209, +2143,2209,2142, +2209,2143,2210, +2144,2210,2143, +2210,2144,2211, +2145,2211,2144, +2211,2145,2212, +2146,2212,2145, +2212,2146,2213, +2147,2213,2146, +2213,2147,2214, +2148,2214,2147, +2214,2148,2215, +2149,2215,2148, +2215,2149,2216, +2150,2216,2149, +2216,2150,2217, +2151,2217,2150, +2217,2151,2218, +2152,2218,2151, +2218,2152,2219, +2153,2219,2152, +2219,2153,2220, +2154,2220,2153, +2220,2154,2221, +2155,2221,2154, +2221,2155,2222, +2156,2222,2155, +2222,2156,2223, +2157,2223,2156, +2223,2157,2224, +2158,2224,2157, +2224,2158,2225, +2159,2225,2158, +2225,2159,2226, +2160,2226,2159, +2226,2160,2227, +2161,2227,2160, +2227,2161,2228, +2162,2228,2161, +2228,2162,2229, +2163,2229,2162, +2229,2163,2230, +2164,2230,2163, +2230,2164,2231, +2165,2231,2164, +2231,2165,2232, +2166,2232,2165, +2232,2166,2233, +2167,2233,2166, +2233,2167,2234, +2168,2234,2167, +2234,2168,2235, +2169,2235,2168, +2235,2169,2236, +2170,2236,2169, +2236,2170,2237, +2171,2237,2170, +2237,2171,2238, +2172,2238,2171, +2238,2172,2239, +2173,2239,2172, +2239,2173,2240, +2174,2240,2173, +2240,2174,2241, +2175,2241,2174, +2241,2175,2242, +2176,2242,2175, +2242,2176,2243, +2177,2243,2176, +}; + +#define Landscape06VtxCount 2310 +#define Landscape06IdxCount 13260 + +btScalar Landscape06Vtx[] = { +-250.0f,5.63631f,246.094f, +-250.0f,8.1152f,250.0f, +-246.094f,7.06461f,246.094f, +-246.094f,9.72778f,250.0f, +-242.188f,9.8471f,246.094f, +-242.188f,11.659f,250.0f, +-238.281f,12.8404f,246.094f, +-238.281f,12.5619f,250.0f, +-234.375f,13.9879f,246.094f, +-234.375f,12.9518f,250.0f, +-230.469f,15.7239f,246.094f, +-230.469f,15.1373f,250.0f, +-226.563f,17.5095f,246.094f, +-226.563f,17.0421f,250.0f, +-222.656f,18.4322f,246.094f, +-222.656f,17.9919f,250.0f, +-218.75f,19.0755f,246.094f, +-218.75f,18.7918f,250.0f, +-214.844f,19.9271f,246.094f, +-214.844f,19.5719f,250.0f, +-210.938f,19.7244f,246.094f, +-210.938f,20.0866f,250.0f, +-207.031f,18.9716f,246.094f, +-207.031f,19.7869f,250.0f, +-203.125f,19.1922f,246.094f, +-203.125f,20.0264f,250.0f, +-199.219f,17.8506f,246.094f, +-199.219f,19.3207f,250.0f, +-195.313f,15.238f,246.094f, +-195.313f,18.0244f,250.0f, +-191.406f,14.6904f,246.094f, +-191.406f,16.2939f,250.0f, +-187.5f,12.9803f,246.094f, +-187.5f,14.9619f,250.0f, +-183.594f,11.6545f,246.094f, +-183.594f,12.6676f,250.0f, +-179.688f,12.4631f,246.094f, +-179.688f,13.6712f,250.0f, +-175.781f,13.1206f,246.094f, +-175.781f,14.5417f,250.0f, +-171.875f,13.3105f,246.094f, +-171.875f,15.8974f,250.0f, +-167.969f,13.4543f,246.094f, +-167.969f,15.9641f,250.0f, +-164.063f,13.4505f,246.094f, +-164.063f,15.4826f,250.0f, +-160.156f,14.6873f,246.094f, +-160.156f,15.1093f,250.0f, +-156.25f,14.1623f,246.094f, +-156.25f,14.8119f,250.0f, +-152.344f,14.0111f,246.094f, +-152.344f,14.4017f,250.0f, +-148.438f,13.2014f,246.094f, +-148.438f,14.2916f,250.0f, +-144.531f,12.8662f,246.094f, +-144.531f,13.5685f,250.0f, +-140.625f,13.1721f,246.094f, +-140.625f,14.2972f,250.0f, +-136.719f,12.9479f,246.094f, +-136.719f,15.0727f,250.0f, +-132.813f,13.4221f,246.094f, +-132.813f,14.5344f,250.0f, +-128.906f,14.0862f,246.094f, +-128.906f,15.7145f,250.0f, +-125.0f,13.481f,246.094f, +-125.0f,15.4608f,250.0f, +-121.094f,12.6228f,246.094f, +-121.094f,15.1857f,250.0f, +-117.188f,12.0584f,246.094f, +-117.188f,15.444f,250.0f, +-113.281f,12.7173f,246.094f, +-113.281f,15.8882f,250.0f, +-109.375f,12.3498f,246.094f, +-109.375f,15.2023f,250.0f, +-105.469f,13.0125f,246.094f, +-105.469f,15.1747f,250.0f, +-101.563f,13.7023f,246.094f, +-101.563f,14.7499f,250.0f, +-97.6563f,14.0674f,246.094f, +-97.6563f,15.0991f,250.0f, +-93.75f,13.8437f,246.094f, +-93.75f,14.6676f,250.0f, +-89.8438f,14.6327f,246.094f, +-89.8438f,14.1527f,250.0f, +-85.9375f,13.2966f,246.094f, +-85.9375f,14.0388f,250.0f, +-82.0313f,12.8094f,246.094f, +-82.0313f,13.7786f,250.0f, +-78.125f,11.8006f,246.094f, +-78.125f,13.0685f,250.0f, +-74.2188f,11.6837f,246.094f, +-74.2188f,12.8361f,250.0f, +-70.3125f,11.0326f,246.094f, +-70.3125f,12.3629f,250.0f, +-66.4063f,11.893f,246.094f, +-66.4063f,11.1909f,250.0f, +-62.5f,10.6469f,246.094f, +-62.5f,9.92966f,250.0f, +-58.5938f,8.55287f,246.094f, +-58.5938f,8.8871f,250.0f, +-54.6875f,7.1029f,246.094f, +-54.6875f,7.4963f,250.0f, +-50.7813f,6.9758f,246.094f, +-50.7813f,6.23897f,250.0f, +-46.875f,7.98262f,246.094f, +-46.875f,6.88918f,250.0f, +-42.9688f,9.11554f,246.094f, +-42.9688f,7.29319f,250.0f, +-39.0625f,8.74373f,246.094f, +-39.0625f,6.89167f,250.0f, +-35.1563f,7.46275f,246.094f, +-35.1563f,6.659f,250.0f, +-31.25f,7.67626f,246.094f, +-31.25f,6.75404f,250.0f, +-27.3438f,7.00511f,246.094f, +-27.3438f,6.15573f,250.0f, +-23.4375f,5.63813f,246.094f, +-23.4375f,5.72737f,250.0f, +-19.5313f,5.11885f,246.094f, +-19.5313f,4.00822f,250.0f, +-15.625f,3.60038f,246.094f, +-15.625f,3.50471f,250.0f, +-11.7188f,3.05357f,246.094f, +-11.7188f,3.0992f,250.0f, +-7.8125f,2.48195f,246.094f, +-7.8125f,2.46052f,250.0f, +-3.90625f,1.69136f,246.094f, +-3.90625f,2.5505f,250.0f, +0.0f,1.14548f,246.094f, +0.0f,2.18079f,250.0f, +3.90625f,0.45291f,246.094f, +3.90625f,1.52302f,250.0f, +-250.0f,5.2159f,242.188f, +-246.094f,7.35218f,242.188f, +-242.188f,10.2284f,242.188f, +-238.281f,12.7552f,242.188f, +-234.375f,14.3317f,242.188f, +-230.469f,16.3594f,242.188f, +-226.563f,17.8216f,242.188f, +-222.656f,18.5321f,242.188f, +-218.75f,18.7578f,242.188f, +-214.844f,19.504f,242.188f, +-210.938f,18.9422f,242.188f, +-207.031f,17.9771f,242.188f, +-203.125f,17.2798f,242.188f, +-199.219f,15.2252f,242.188f, +-195.313f,13.8769f,242.188f, +-191.406f,12.8727f,242.188f, +-187.5f,11.7858f,242.188f, +-183.594f,12.4886f,242.188f, +-179.688f,12.9814f,242.188f, +-175.781f,13.5265f,242.188f, +-171.875f,13.8082f,242.188f, +-167.969f,13.8407f,242.188f, +-164.063f,13.5872f,242.188f, +-160.156f,13.8287f,242.188f, +-156.25f,13.5778f,242.188f, +-152.344f,13.0026f,242.188f, +-148.438f,12.6259f,242.188f, +-144.531f,12.4666f,242.188f, +-140.625f,12.634f,242.188f, +-136.719f,12.1746f,242.188f, +-132.813f,11.7885f,242.188f, +-128.906f,11.4539f,242.188f, +-125.0f,11.0084f,242.188f, +-121.094f,10.1521f,242.188f, +-117.188f,10.6008f,242.188f, +-113.281f,10.2088f,242.188f, +-109.375f,11.0344f,242.188f, +-105.469f,11.1441f,242.188f, +-101.563f,12.3959f,242.188f, +-97.6563f,13.3587f,242.188f, +-93.75f,14.2415f,242.188f, +-89.8438f,13.9809f,242.188f, +-85.9375f,13.3276f,242.188f, +-82.0313f,11.9639f,242.188f, +-78.125f,11.5863f,242.188f, +-74.2188f,11.7327f,242.188f, +-70.3125f,11.5527f,242.188f, +-66.4063f,12.3699f,242.188f, +-62.5f,11.1959f,242.188f, +-58.5938f,9.59967f,242.188f, +-54.6875f,8.38887f,242.188f, +-50.7813f,7.42613f,242.188f, +-46.875f,8.34697f,242.188f, +-42.9688f,9.7013f,242.188f, +-39.0625f,9.10668f,242.188f, +-35.1563f,8.24657f,242.188f, +-31.25f,8.06656f,242.188f, +-27.3438f,6.98555f,242.188f, +-23.4375f,6.88836f,242.188f, +-19.5313f,5.88079f,242.188f, +-15.625f,4.43148f,242.188f, +-11.7188f,3.65843f,242.188f, +-7.8125f,2.85687f,242.188f, +-3.90625f,1.8332f,242.188f, +0.0f,2.03971f,242.188f, +3.90625f,2.21488f,242.188f, +-250.0f,5.44463f,238.281f, +-246.094f,7.90885f,238.281f, +-242.188f,10.3908f,238.281f, +-238.281f,12.875f,238.281f, +-234.375f,14.8255f,238.281f, +-230.469f,16.5404f,238.281f, +-226.563f,17.8109f,238.281f, +-222.656f,19.0205f,238.281f, +-218.75f,18.7565f,238.281f, +-214.844f,18.9852f,238.281f, +-210.938f,18.3753f,238.281f, +-207.031f,16.6829f,238.281f, +-203.125f,15.8099f,238.281f, +-199.219f,13.2915f,238.281f, +-195.313f,13.447f,238.281f, +-191.406f,13.5971f,238.281f, +-187.5f,12.1473f,238.281f, +-183.594f,13.3531f,238.281f, +-179.688f,14.4732f,238.281f, +-175.781f,15.0267f,238.281f, +-171.875f,14.7852f,238.281f, +-167.969f,15.5706f,238.281f, +-164.063f,14.267f,238.281f, +-160.156f,14.0772f,238.281f, +-156.25f,12.4965f,238.281f, +-152.344f,12.1473f,238.281f, +-148.438f,11.8693f,238.281f, +-144.531f,11.2795f,238.281f, +-140.625f,10.8173f,238.281f, +-136.719f,10.792f,238.281f, +-132.813f,10.8481f,238.281f, +-128.906f,9.95928f,238.281f, +-125.0f,10.0976f,238.281f, +-121.094f,8.74444f,238.281f, +-117.188f,9.1761f,238.281f, +-113.281f,10.2354f,238.281f, +-109.375f,10.7023f,238.281f, +-105.469f,11.6386f,238.281f, +-101.563f,12.7789f,238.281f, +-97.6563f,13.956f,238.281f, +-93.75f,14.1101f,238.281f, +-89.8438f,13.2653f,238.281f, +-85.9375f,12.1604f,238.281f, +-82.0313f,11.6914f,238.281f, +-78.125f,11.3706f,238.281f, +-74.2188f,12.1449f,238.281f, +-70.3125f,12.4512f,238.281f, +-66.4063f,12.6436f,238.281f, +-62.5f,11.6692f,238.281f, +-58.5938f,10.8304f,238.281f, +-54.6875f,8.88158f,238.281f, +-50.7813f,7.94904f,238.281f, +-46.875f,8.47525f,238.281f, +-42.9688f,9.08763f,238.281f, +-39.0625f,9.21095f,238.281f, +-35.1563f,9.12926f,238.281f, +-31.25f,8.5517f,238.281f, +-27.3438f,7.86146f,238.281f, +-23.4375f,7.33662f,238.281f, +-19.5313f,6.37551f,238.281f, +-15.625f,5.59324f,238.281f, +-11.7188f,4.81831f,238.281f, +-7.8125f,4.35695f,238.281f, +-3.90625f,3.64159f,238.281f, +0.0f,3.70314f,238.281f, +3.90625f,3.04396f,238.281f, +-250.0f,5.92848f,234.375f, +-246.094f,8.10446f,234.375f, +-242.188f,10.3516f,234.375f, +-238.281f,12.4984f,234.375f, +-234.375f,15.0991f,234.375f, +-230.469f,16.0002f,234.375f, +-226.563f,17.2585f,234.375f, +-222.656f,18.1852f,234.375f, +-218.75f,18.7811f,234.375f, +-214.844f,18.4638f,234.375f, +-210.938f,18.3171f,234.375f, +-207.031f,16.1085f,234.375f, +-203.125f,15.1926f,234.375f, +-199.219f,14.1792f,234.375f, +-195.313f,13.5589f,234.375f, +-191.406f,13.9362f,234.375f, +-187.5f,13.303f,234.375f, +-183.594f,13.6602f,234.375f, +-179.688f,15.1086f,234.375f, +-175.781f,15.5943f,234.375f, +-171.875f,15.3663f,234.375f, +-167.969f,14.9609f,234.375f, +-164.063f,14.4285f,234.375f, +-160.156f,14.1532f,234.375f, +-156.25f,13.0139f,234.375f, +-152.344f,11.6503f,234.375f, +-148.438f,11.6112f,234.375f, +-144.531f,11.1097f,234.375f, +-140.625f,10.8763f,234.375f, +-136.719f,10.2321f,234.375f, +-132.813f,9.71321f,234.375f, +-128.906f,9.04388f,234.375f, +-125.0f,9.53542f,234.375f, +-121.094f,8.10006f,234.375f, +-117.188f,9.16948f,234.375f, +-113.281f,9.67824f,234.375f, +-109.375f,10.2679f,234.375f, +-105.469f,10.9669f,234.375f, +-101.563f,12.2942f,234.375f, +-97.6563f,13.2952f,234.375f, +-93.75f,13.0932f,234.375f, +-89.8438f,12.4514f,234.375f, +-85.9375f,12.2395f,234.375f, +-82.0313f,11.7622f,234.375f, +-78.125f,11.9666f,234.375f, +-74.2188f,12.2346f,234.375f, +-70.3125f,13.1648f,234.375f, +-66.4063f,13.506f,234.375f, +-62.5f,13.1773f,234.375f, +-58.5938f,11.9168f,234.375f, +-54.6875f,10.0208f,234.375f, +-50.7813f,9.08267f,234.375f, +-46.875f,8.4406f,234.375f, +-42.9688f,9.27515f,234.375f, +-39.0625f,10.2228f,234.375f, +-35.1563f,9.77624f,234.375f, +-31.25f,9.17943f,234.375f, +-27.3438f,8.83272f,234.375f, +-23.4375f,8.00355f,234.375f, +-19.5313f,7.37167f,234.375f, +-15.625f,6.87424f,234.375f, +-11.7188f,6.23994f,234.375f, +-7.8125f,5.50641f,234.375f, +-3.90625f,5.06839f,234.375f, +0.0f,5.06846f,234.375f, +3.90625f,5.19166f,234.375f, +-250.0f,4.98265f,230.469f, +-246.094f,7.878f,230.469f, +-242.188f,10.9188f,230.469f, +-238.281f,12.8549f,230.469f, +-234.375f,14.5578f,230.469f, +-230.469f,16.067f,230.469f, +-226.563f,17.9938f,230.469f, +-222.656f,18.3449f,230.469f, +-218.75f,18.4423f,230.469f, +-214.844f,18.9411f,230.469f, +-210.938f,17.3131f,230.469f, +-207.031f,15.3292f,230.469f, +-203.125f,15.5278f,230.469f, +-199.219f,14.9451f,230.469f, +-195.313f,13.8026f,230.469f, +-191.406f,13.1586f,230.469f, +-187.5f,13.4388f,230.469f, +-183.594f,14.2213f,230.469f, +-179.688f,14.907f,230.469f, +-175.781f,15.2295f,230.469f, +-171.875f,14.8701f,230.469f, +-167.969f,14.1393f,230.469f, +-164.063f,13.7829f,230.469f, +-160.156f,13.0614f,230.469f, +-156.25f,12.3416f,230.469f, +-152.344f,11.5366f,230.469f, +-148.438f,11.5201f,230.469f, +-144.531f,11.0918f,230.469f, +-140.625f,11.139f,230.469f, +-136.719f,10.0387f,230.469f, +-132.813f,8.59099f,230.469f, +-128.906f,7.71771f,230.469f, +-125.0f,7.44273f,230.469f, +-121.094f,8.17087f,230.469f, +-117.188f,8.34002f,230.469f, +-113.281f,9.22169f,230.469f, +-109.375f,10.2195f,230.469f, +-105.469f,11.523f,230.469f, +-101.563f,12.7411f,230.469f, +-97.6563f,12.7429f,230.469f, +-93.75f,12.3959f,230.469f, +-89.8438f,11.7559f,230.469f, +-85.9375f,10.3669f,230.469f, +-82.0313f,10.0825f,230.469f, +-78.125f,11.4451f,230.469f, +-74.2188f,12.235f,230.469f, +-70.3125f,13.6016f,230.469f, +-66.4063f,14.377f,230.469f, +-62.5f,13.967f,230.469f, +-58.5938f,12.862f,230.469f, +-54.6875f,11.4719f,230.469f, +-50.7813f,9.99381f,230.469f, +-46.875f,8.68857f,230.469f, +-42.9688f,9.43448f,230.469f, +-39.0625f,10.4708f,230.469f, +-35.1563f,11.0521f,230.469f, +-31.25f,10.5864f,230.469f, +-27.3438f,10.8331f,230.469f, +-23.4375f,9.96112f,230.469f, +-19.5313f,8.61029f,230.469f, +-15.625f,7.42407f,230.469f, +-11.7188f,6.43202f,230.469f, +-7.8125f,6.36726f,230.469f, +-3.90625f,6.52581f,230.469f, +0.0f,6.18686f,230.469f, +3.90625f,5.885f,230.469f, +-250.0f,4.92227f,226.563f, +-246.094f,8.66811f,226.563f, +-242.188f,11.7599f,226.563f, +-238.281f,13.6581f,226.563f, +-234.375f,15.6409f,226.563f, +-230.469f,16.7907f,226.563f, +-226.563f,17.4606f,226.563f, +-222.656f,18.4841f,226.563f, +-218.75f,18.4506f,226.563f, +-214.844f,17.5936f,226.563f, +-210.938f,16.5941f,226.563f, +-207.031f,14.8805f,226.563f, +-203.125f,15.3743f,226.563f, +-199.219f,15.4493f,226.563f, +-195.313f,14.5184f,226.563f, +-191.406f,12.9285f,226.563f, +-187.5f,13.3898f,226.563f, +-183.594f,14.0358f,226.563f, +-179.688f,15.2884f,226.563f, +-175.781f,14.972f,226.563f, +-171.875f,14.2355f,226.563f, +-167.969f,13.6786f,226.563f, +-164.063f,13.0771f,226.563f, +-160.156f,12.7879f,226.563f, +-156.25f,12.4767f,226.563f, +-152.344f,11.5156f,226.563f, +-148.438f,11.1725f,226.563f, +-144.531f,10.8869f,226.563f, +-140.625f,9.77232f,226.563f, +-136.719f,8.75728f,226.563f, +-132.813f,6.77705f,226.563f, +-128.906f,6.35083f,226.563f, +-125.0f,6.59888f,226.563f, +-121.094f,7.81295f,226.563f, +-117.188f,8.10078f,226.563f, +-113.281f,9.07634f,226.563f, +-109.375f,10.2289f,226.563f, +-105.469f,11.5342f,226.563f, +-101.563f,12.9142f,226.563f, +-97.6563f,12.8729f,226.563f, +-93.75f,12.8149f,226.563f, +-89.8438f,10.9671f,226.563f, +-85.9375f,10.0649f,226.563f, +-82.0313f,9.28012f,226.563f, +-78.125f,10.1324f,226.563f, +-74.2188f,11.8638f,226.563f, +-70.3125f,12.6141f,226.563f, +-66.4063f,13.6851f,226.563f, +-62.5f,13.9389f,226.563f, +-58.5938f,13.5413f,226.563f, +-54.6875f,12.4869f,226.563f, +-50.7813f,11.2774f,226.563f, +-46.875f,10.6009f,226.563f, +-42.9688f,11.4839f,226.563f, +-39.0625f,12.5408f,226.563f, +-35.1563f,12.8694f,226.563f, +-31.25f,12.5253f,226.563f, +-27.3438f,12.1887f,226.563f, +-23.4375f,11.5356f,226.563f, +-19.5313f,9.53151f,226.563f, +-15.625f,8.29811f,226.563f, +-11.7188f,7.38375f,226.563f, +-7.8125f,7.57607f,226.563f, +-3.90625f,7.41156f,226.563f, +0.0f,6.9836f,226.563f, +3.90625f,6.89682f,226.563f, +-250.0f,4.66781f,222.656f, +-246.094f,7.89882f,222.656f, +-242.188f,10.8629f,222.656f, +-238.281f,14.1235f,222.656f, +-234.375f,15.6001f,222.656f, +-230.469f,17.0347f,222.656f, +-226.563f,17.4872f,222.656f, +-222.656f,17.6157f,222.656f, +-218.75f,16.8213f,222.656f, +-214.844f,16.4076f,222.656f, +-210.938f,15.0745f,222.656f, +-207.031f,14.2914f,222.656f, +-203.125f,14.6094f,222.656f, +-199.219f,14.4637f,222.656f, +-195.313f,14.0807f,222.656f, +-191.406f,12.4559f,222.656f, +-187.5f,13.0367f,222.656f, +-183.594f,13.975f,222.656f, +-179.688f,14.802f,222.656f, +-175.781f,14.6145f,222.656f, +-171.875f,13.4733f,222.656f, +-167.969f,13.3385f,222.656f, +-164.063f,13.721f,222.656f, +-160.156f,12.5775f,222.656f, +-156.25f,11.962f,222.656f, +-152.344f,11.2422f,222.656f, +-148.438f,10.827f,222.656f, +-144.531f,10.2848f,222.656f, +-140.625f,8.45922f,222.656f, +-136.719f,7.72182f,222.656f, +-132.813f,6.23545f,222.656f, +-128.906f,5.69752f,222.656f, +-125.0f,6.29925f,222.656f, +-121.094f,7.1991f,222.656f, +-117.188f,7.56788f,222.656f, +-113.281f,8.87895f,222.656f, +-109.375f,9.92302f,222.656f, +-105.469f,10.2628f,222.656f, +-101.563f,11.427f,222.656f, +-97.6563f,12.2929f,222.656f, +-93.75f,11.6083f,222.656f, +-89.8438f,11.594f,222.656f, +-85.9375f,10.1683f,222.656f, +-82.0313f,10.4152f,222.656f, +-78.125f,10.765f,222.656f, +-74.2188f,11.5311f,222.656f, +-70.3125f,12.8761f,222.656f, +-66.4063f,14.8794f,222.656f, +-62.5f,15.7341f,222.656f, +-58.5938f,15.0851f,222.656f, +-54.6875f,14.4719f,222.656f, +-50.7813f,13.6899f,222.656f, +-46.875f,13.0842f,222.656f, +-42.9688f,13.1059f,222.656f, +-39.0625f,13.9942f,222.656f, +-35.1563f,13.8877f,222.656f, +-31.25f,14.1293f,222.656f, +-27.3438f,13.6276f,222.656f, +-23.4375f,12.2206f,222.656f, +-19.5313f,10.8481f,222.656f, +-15.625f,9.71168f,222.656f, +-11.7188f,8.51834f,222.656f, +-7.8125f,9.04274f,222.656f, +-3.90625f,8.46981f,222.656f, +0.0f,8.26045f,222.656f, +3.90625f,6.81349f,222.656f, +-250.0f,5.16984f,218.75f, +-246.094f,6.64731f,218.75f, +-242.188f,9.50207f,218.75f, +-238.281f,12.5115f,218.75f, +-234.375f,15.8009f,218.75f, +-230.469f,17.6139f,218.75f, +-226.563f,18.128f,218.75f, +-222.656f,17.3111f,218.75f, +-218.75f,16.3962f,218.75f, +-214.844f,16.0245f,218.75f, +-210.938f,14.5344f,218.75f, +-207.031f,13.4459f,218.75f, +-203.125f,13.3987f,218.75f, +-199.219f,13.5444f,218.75f, +-195.313f,12.1973f,218.75f, +-191.406f,11.8337f,218.75f, +-187.5f,13.3027f,218.75f, +-183.594f,13.2862f,218.75f, +-179.688f,14.577f,218.75f, +-175.781f,14.4312f,218.75f, +-171.875f,13.3065f,218.75f, +-167.969f,14.2726f,218.75f, +-164.063f,14.5522f,218.75f, +-160.156f,13.8269f,218.75f, +-156.25f,12.4234f,218.75f, +-152.344f,10.5035f,218.75f, +-148.438f,9.65297f,218.75f, +-144.531f,8.3692f,218.75f, +-140.625f,7.39811f,218.75f, +-136.719f,6.29024f,218.75f, +-132.813f,5.37103f,218.75f, +-128.906f,5.29069f,218.75f, +-125.0f,5.59696f,218.75f, +-121.094f,6.15404f,218.75f, +-117.188f,7.15855f,218.75f, +-113.281f,8.08243f,218.75f, +-109.375f,8.97937f,218.75f, +-105.469f,9.67177f,218.75f, +-101.563f,10.7738f,218.75f, +-97.6563f,11.4256f,218.75f, +-93.75f,11.6906f,218.75f, +-89.8438f,11.4527f,218.75f, +-85.9375f,11.5445f,218.75f, +-82.0313f,11.9384f,218.75f, +-78.125f,12.452f,218.75f, +-74.2188f,13.3202f,218.75f, +-70.3125f,14.2351f,218.75f, +-66.4063f,15.021f,218.75f, +-62.5f,16.1053f,218.75f, +-58.5938f,16.0633f,218.75f, +-54.6875f,15.6154f,218.75f, +-50.7813f,15.3347f,218.75f, +-46.875f,14.8984f,218.75f, +-42.9688f,14.1541f,218.75f, +-39.0625f,14.8343f,218.75f, +-35.1563f,14.8393f,218.75f, +-31.25f,14.865f,218.75f, +-27.3438f,13.9913f,218.75f, +-23.4375f,13.7749f,218.75f, +-19.5313f,12.6247f,218.75f, +-15.625f,11.3466f,218.75f, +-11.7188f,10.5048f,218.75f, +-7.8125f,9.94742f,218.75f, +-3.90625f,8.79577f,218.75f, +0.0f,8.31646f,218.75f, +3.90625f,8.02546f,218.75f, +-250.0f,4.42455f,214.844f, +-246.094f,6.15686f,214.844f, +-242.188f,8.4919f,214.844f, +-238.281f,12.2627f,214.844f, +-234.375f,15.9215f,214.844f, +-230.469f,17.6896f,214.844f, +-226.563f,18.1835f,214.844f, +-222.656f,17.9341f,214.844f, +-218.75f,16.9803f,214.844f, +-214.844f,15.6617f,214.844f, +-210.938f,14.3989f,214.844f, +-207.031f,12.7777f,214.844f, +-203.125f,12.7635f,214.844f, +-199.219f,12.8533f,214.844f, +-195.313f,12.1672f,214.844f, +-191.406f,12.2357f,214.844f, +-187.5f,12.5806f,214.844f, +-183.594f,12.5597f,214.844f, +-179.688f,13.6296f,214.844f, +-175.781f,13.8382f,214.844f, +-171.875f,14.4001f,214.844f, +-167.969f,14.3002f,214.844f, +-164.063f,14.3353f,214.844f, +-160.156f,14.0346f,214.844f, +-156.25f,12.9823f,214.844f, +-152.344f,10.8141f,214.844f, +-148.438f,9.57028f,214.844f, +-144.531f,8.18427f,214.844f, +-140.625f,6.89938f,214.844f, +-136.719f,5.79227f,214.844f, +-132.813f,4.60172f,214.844f, +-128.906f,4.59969f,214.844f, +-125.0f,5.20294f,214.844f, +-121.094f,6.17542f,214.844f, +-117.188f,7.13347f,214.844f, +-113.281f,8.1045f,214.844f, +-109.375f,8.73005f,214.844f, +-105.469f,9.96489f,214.844f, +-101.563f,11.1039f,214.844f, +-97.6563f,11.6791f,214.844f, +-93.75f,11.9246f,214.844f, +-89.8438f,12.0071f,214.844f, +-85.9375f,12.8099f,214.844f, +-82.0313f,13.3672f,214.844f, +-78.125f,13.5811f,214.844f, +-74.2188f,14.7559f,214.844f, +-70.3125f,15.4274f,214.844f, +-66.4063f,15.487f,214.844f, +-62.5f,16.3346f,214.844f, +-58.5938f,16.424f,214.844f, +-54.6875f,17.1014f,214.844f, +-50.7813f,17.634f,214.844f, +-46.875f,16.5132f,214.844f, +-42.9688f,15.1728f,214.844f, +-39.0625f,15.4699f,214.844f, +-35.1563f,16.154f,214.844f, +-31.25f,15.8527f,214.844f, +-27.3438f,15.4057f,214.844f, +-23.4375f,14.6476f,214.844f, +-19.5313f,13.1705f,214.844f, +-15.625f,11.9754f,214.844f, +-11.7188f,11.7453f,214.844f, +-7.8125f,10.8384f,214.844f, +-3.90625f,10.1259f,214.844f, +0.0f,9.49925f,214.844f, +3.90625f,9.25513f,214.844f, +-250.0f,3.60269f,210.938f, +-246.094f,5.37638f,210.938f, +-242.188f,7.66914f,210.938f, +-238.281f,11.9863f,210.938f, +-234.375f,14.9525f,210.938f, +-230.469f,16.5034f,210.938f, +-226.563f,17.8663f,210.938f, +-222.656f,17.1002f,210.938f, +-218.75f,16.0413f,210.938f, +-214.844f,14.8516f,210.938f, +-210.938f,13.8904f,210.938f, +-207.031f,11.9929f,210.938f, +-203.125f,11.8171f,210.938f, +-199.219f,11.6849f,210.938f, +-195.313f,11.056f,210.938f, +-191.406f,11.6318f,210.938f, +-187.5f,11.9333f,210.938f, +-183.594f,12.599f,210.938f, +-179.688f,14.0437f,210.938f, +-175.781f,14.7937f,210.938f, +-171.875f,14.8844f,210.938f, +-167.969f,14.3312f,210.938f, +-164.063f,13.2879f,210.938f, +-160.156f,12.3423f,210.938f, +-156.25f,11.4768f,210.938f, +-152.344f,9.94481f,210.938f, +-148.438f,7.76655f,210.938f, +-144.531f,6.59218f,210.938f, +-140.625f,6.49848f,210.938f, +-136.719f,5.2458f,210.938f, +-132.813f,4.27164f,210.938f, +-128.906f,4.68484f,210.938f, +-125.0f,5.2746f,210.938f, +-121.094f,6.12822f,210.938f, +-117.188f,8.02215f,210.938f, +-113.281f,8.95036f,210.938f, +-109.375f,9.92538f,210.938f, +-105.469f,10.4058f,210.938f, +-101.563f,11.2862f,210.938f, +-97.6563f,11.7274f,210.938f, +-93.75f,12.3175f,210.938f, +-89.8438f,12.6423f,210.938f, +-85.9375f,13.2212f,210.938f, +-82.0313f,13.9379f,210.938f, +-78.125f,15.3332f,210.938f, +-74.2188f,16.2893f,210.938f, +-70.3125f,16.1032f,210.938f, +-66.4063f,16.7786f,210.938f, +-62.5f,16.8038f,210.938f, +-58.5938f,16.1537f,210.938f, +-54.6875f,17.4306f,210.938f, +-50.7813f,17.313f,210.938f, +-46.875f,16.2568f,210.938f, +-42.9688f,16.0266f,210.938f, +-39.0625f,16.9569f,210.938f, +-35.1563f,18.0733f,210.938f, +-31.25f,17.4779f,210.938f, +-27.3438f,17.2939f,210.938f, +-23.4375f,16.1477f,210.938f, +-19.5313f,15.409f,210.938f, +-15.625f,14.0019f,210.938f, +-11.7188f,13.3531f,210.938f, +-7.8125f,12.4823f,210.938f, +-3.90625f,11.7842f,210.938f, +0.0f,11.0776f,210.938f, +3.90625f,10.5728f,210.938f, +-250.0f,3.49901f,207.031f, +-246.094f,4.00092f,207.031f, +-242.188f,7.06194f,207.031f, +-238.281f,10.1502f,207.031f, +-234.375f,13.0262f,207.031f, +-230.469f,15.541f,207.031f, +-226.563f,16.4029f,207.031f, +-222.656f,16.0741f,207.031f, +-218.75f,15.3706f,207.031f, +-214.844f,14.3529f,207.031f, +-210.938f,13.1351f,207.031f, +-207.031f,11.2939f,207.031f, +-203.125f,11.4337f,207.031f, +-199.219f,11.43f,207.031f, +-195.313f,10.6048f,207.031f, +-191.406f,10.859f,207.031f, +-187.5f,11.8447f,207.031f, +-183.594f,12.8305f,207.031f, +-179.688f,14.9116f,207.031f, +-175.781f,15.0225f,207.031f, +-171.875f,14.847f,207.031f, +-167.969f,13.7464f,207.031f, +-164.063f,12.6716f,207.031f, +-160.156f,10.4028f,207.031f, +-156.25f,9.61156f,207.031f, +-152.344f,9.08545f,207.031f, +-148.438f,6.96088f,207.031f, +-144.531f,6.6794f,207.031f, +-140.625f,6.08012f,207.031f, +-136.719f,5.02964f,207.031f, +-132.813f,4.93996f,207.031f, +-128.906f,4.955f,207.031f, +-125.0f,5.23446f,207.031f, +-121.094f,7.14164f,207.031f, +-117.188f,9.21655f,207.031f, +-113.281f,10.8802f,207.031f, +-109.375f,11.0518f,207.031f, +-105.469f,11.5707f,207.031f, +-101.563f,12.2834f,207.031f, +-97.6563f,12.7498f,207.031f, +-93.75f,12.6608f,207.031f, +-89.8438f,12.3649f,207.031f, +-85.9375f,13.1678f,207.031f, +-82.0313f,13.541f,207.031f, +-78.125f,14.3448f,207.031f, +-74.2188f,15.6006f,207.031f, +-70.3125f,17.0141f,207.031f, +-66.4063f,17.4107f,207.031f, +-62.5f,18.0045f,207.031f, +-58.5938f,17.6582f,207.031f, +-54.6875f,17.0297f,207.031f, +-50.7813f,16.6619f,207.031f, +-46.875f,17.1267f,207.031f, +-42.9688f,18.0618f,207.031f, +-39.0625f,18.7698f,207.031f, +-35.1563f,19.3034f,207.031f, +-31.25f,19.1566f,207.031f, +-27.3438f,19.1107f,207.031f, +-23.4375f,17.3298f,207.031f, +-19.5313f,15.7204f,207.031f, +-15.625f,14.7827f,207.031f, +-11.7188f,14.2027f,207.031f, +-7.8125f,13.5758f,207.031f, +-3.90625f,13.1935f,207.031f, +0.0f,11.8526f,207.031f, +3.90625f,10.4539f,207.031f, +-250.0f,3.85941f,203.125f, +-246.094f,3.80391f,203.125f, +-242.188f,6.8342f,203.125f, +-238.281f,10.0313f,203.125f, +-234.375f,12.9894f,203.125f, +-230.469f,15.1588f,203.125f, +-226.563f,15.6234f,203.125f, +-222.656f,15.112f,203.125f, +-218.75f,14.5577f,203.125f, +-214.844f,14.0703f,203.125f, +-210.938f,13.3523f,203.125f, +-207.031f,12.1264f,203.125f, +-203.125f,11.037f,203.125f, +-199.219f,10.3379f,203.125f, +-195.313f,11.3f,203.125f, +-191.406f,10.6845f,203.125f, +-187.5f,11.7023f,203.125f, +-183.594f,13.2057f,203.125f, +-179.688f,13.976f,203.125f, +-175.781f,14.994f,203.125f, +-171.875f,14.6465f,203.125f, +-167.969f,13.4879f,203.125f, +-164.063f,12.0617f,203.125f, +-160.156f,10.6454f,203.125f, +-156.25f,10.2693f,203.125f, +-152.344f,8.33279f,203.125f, +-148.438f,7.60557f,203.125f, +-144.531f,6.19774f,203.125f, +-140.625f,5.7751f,203.125f, +-136.719f,5.28903f,203.125f, +-132.813f,5.10696f,203.125f, +-128.906f,5.61944f,203.125f, +-125.0f,7.32929f,203.125f, +-121.094f,9.09158f,203.125f, +-117.188f,10.6952f,203.125f, +-113.281f,11.555f,203.125f, +-109.375f,12.5837f,203.125f, +-105.469f,13.4444f,203.125f, +-101.563f,14.3191f,203.125f, +-97.6563f,14.5546f,203.125f, +-93.75f,13.9216f,203.125f, +-89.8438f,13.07f,203.125f, +-85.9375f,13.0497f,203.125f, +-82.0313f,13.8884f,203.125f, +-78.125f,14.2048f,203.125f, +-74.2188f,16.2809f,203.125f, +-70.3125f,17.1518f,203.125f, +-66.4063f,18.4883f,203.125f, +-62.5f,19.2231f,203.125f, +-58.5938f,19.0199f,203.125f, +-54.6875f,18.4606f,203.125f, +-50.7813f,17.3076f,203.125f, +-46.875f,17.0012f,203.125f, +-42.9688f,18.4311f,203.125f, +-39.0625f,19.9758f,203.125f, +-35.1563f,20.1252f,203.125f, +-31.25f,20.126f,203.125f, +-27.3438f,18.9276f,203.125f, +-23.4375f,18.3938f,203.125f, +-19.5313f,16.6811f,203.125f, +-15.625f,15.7398f,203.125f, +-11.7188f,14.6978f,203.125f, +-7.8125f,14.7567f,203.125f, +-3.90625f,14.377f,203.125f, +0.0f,13.0029f,203.125f, +3.90625f,11.4706f,203.125f, +-250.0f,4.68355f,199.219f, +-246.094f,4.65569f,199.219f, +-242.188f,6.34925f,199.219f, +-238.281f,9.03665f,199.219f, +-234.375f,11.4587f,199.219f, +-230.469f,13.9932f,199.219f, +-226.563f,14.8268f,199.219f, +-222.656f,14.0552f,199.219f, +-218.75f,14.4455f,199.219f, +-214.844f,14.3053f,199.219f, +-210.938f,12.5781f,199.219f, +-207.031f,11.5778f,199.219f, +-203.125f,9.91652f,199.219f, +-199.219f,9.20832f,199.219f, +-195.313f,10.1078f,199.219f, +-191.406f,10.5638f,199.219f, +-187.5f,11.6649f,199.219f, +-183.594f,13.3758f,199.219f, +-179.688f,15.2035f,199.219f, +-175.781f,14.6909f,199.219f, +-171.875f,14.0312f,199.219f, +-167.969f,12.6808f,199.219f, +-164.063f,12.649f,199.219f, +-160.156f,11.6333f,199.219f, +-156.25f,10.8896f,199.219f, +-152.344f,8.72848f,199.219f, +-148.438f,7.55753f,199.219f, +-144.531f,6.70035f,199.219f, +-140.625f,5.28209f,199.219f, +-136.719f,5.47347f,199.219f, +-132.813f,7.25678f,199.219f, +-128.906f,9.06223f,199.219f, +-125.0f,9.91604f,199.219f, +-121.094f,10.882f,199.219f, +-117.188f,11.8314f,199.219f, +-113.281f,12.9729f,199.219f, +-109.375f,14.1144f,199.219f, +-105.469f,15.0374f,199.219f, +-101.563f,15.4321f,199.219f, +-97.6563f,15.9823f,199.219f, +-93.75f,15.4663f,199.219f, +-89.8438f,14.4094f,199.219f, +-85.9375f,14.1599f,199.219f, +-82.0313f,14.4239f,199.219f, +-78.125f,14.7717f,199.219f, +-74.2188f,15.3979f,199.219f, +-70.3125f,16.4014f,199.219f, +-66.4063f,17.9486f,199.219f, +-62.5f,19.3767f,199.219f, +-58.5938f,19.7322f,199.219f, +-54.6875f,19.0648f,199.219f, +-50.7813f,18.2481f,199.219f, +-46.875f,17.1507f,199.219f, +-42.9688f,18.6306f,199.219f, +-39.0625f,19.2486f,199.219f, +-35.1563f,20.3158f,199.219f, +-31.25f,19.6441f,199.219f, +-27.3438f,18.7294f,199.219f, +-23.4375f,17.9051f,199.219f, +-19.5313f,17.278f,199.219f, +-15.625f,16.1912f,199.219f, +-11.7188f,15.3685f,199.219f, +-7.8125f,14.8376f,199.219f, +-3.90625f,13.8988f,199.219f, +0.0f,12.5645f,199.219f, +3.90625f,12.1184f,199.219f, +-250.0f,5.71048f,195.313f, +-246.094f,4.68298f,195.313f, +-242.188f,5.30012f,195.313f, +-238.281f,7.72299f,195.313f, +-234.375f,10.9797f,195.313f, +-230.469f,12.6343f,195.313f, +-226.563f,13.8962f,195.313f, +-222.656f,13.2189f,195.313f, +-218.75f,14.0254f,195.313f, +-214.844f,14.5903f,195.313f, +-210.938f,12.6794f,195.313f, +-207.031f,9.8479f,195.313f, +-203.125f,8.05763f,195.313f, +-199.219f,7.68254f,195.313f, +-195.313f,9.0324f,195.313f, +-191.406f,10.7973f,195.313f, +-187.5f,12.1516f,195.313f, +-183.594f,13.1888f,195.313f, +-179.688f,14.2559f,195.313f, +-175.781f,14.0455f,195.313f, +-171.875f,13.2785f,195.313f, +-167.969f,12.7724f,195.313f, +-164.063f,12.56f,195.313f, +-160.156f,11.4647f,195.313f, +-156.25f,10.6463f,195.313f, +-152.344f,9.36927f,195.313f, +-148.438f,7.87862f,195.313f, +-144.531f,6.78168f,195.313f, +-140.625f,5.32688f,195.313f, +-136.719f,6.62928f,195.313f, +-132.813f,8.97871f,195.313f, +-128.906f,10.3174f,195.313f, +-125.0f,11.2136f,195.313f, +-121.094f,12.2822f,195.313f, +-117.188f,13.7351f,195.313f, +-113.281f,14.0196f,195.313f, +-109.375f,15.5457f,195.313f, +-105.469f,16.1402f,195.313f, +-101.563f,16.6719f,195.313f, +-97.6563f,16.2658f,195.313f, +-93.75f,16.5379f,195.313f, +-89.8438f,15.1289f,195.313f, +-85.9375f,14.7687f,195.313f, +-82.0313f,15.4638f,195.313f, +-78.125f,15.3391f,195.313f, +-74.2188f,14.8602f,195.313f, +-70.3125f,16.2701f,195.313f, +-66.4063f,17.9511f,195.313f, +-62.5f,19.108f,195.313f, +-58.5938f,19.5253f,195.313f, +-54.6875f,19.1648f,195.313f, +-50.7813f,18.0624f,195.313f, +-46.875f,17.2201f,195.313f, +-42.9688f,19.4165f,195.313f, +-39.0625f,20.3781f,195.313f, +-35.1563f,19.796f,195.313f, +-31.25f,18.9841f,195.313f, +-27.3438f,18.3143f,195.313f, +-23.4375f,18.1973f,195.313f, +-19.5313f,17.5121f,195.313f, +-15.625f,16.5969f,195.313f, +-11.7188f,15.3539f,195.313f, +-7.8125f,14.4654f,195.313f, +-3.90625f,13.8161f,195.313f, +0.0f,12.4727f,195.313f, +3.90625f,13.8013f,195.313f, +-250.0f,6.07831f,191.406f, +-246.094f,5.46721f,191.406f, +-242.188f,4.48351f,191.406f, +-238.281f,6.74031f,191.406f, +-234.375f,9.75661f,191.406f, +-230.469f,11.5382f,191.406f, +-226.563f,12.9559f,191.406f, +-222.656f,12.6196f,191.406f, +-218.75f,12.4516f,191.406f, +-214.844f,13.5738f,191.406f, +-210.938f,12.2334f,191.406f, +-207.031f,9.36284f,191.406f, +-203.125f,7.56119f,191.406f, +-199.219f,8.2975f,191.406f, +-195.313f,10.0432f,191.406f, +-191.406f,11.528f,191.406f, +-187.5f,12.9338f,191.406f, +-183.594f,13.9397f,191.406f, +-179.688f,14.1423f,191.406f, +-175.781f,13.7637f,191.406f, +-171.875f,12.7983f,191.406f, +-167.969f,12.6132f,191.406f, +-164.063f,12.07f,191.406f, +-160.156f,11.7037f,191.406f, +-156.25f,10.3692f,191.406f, +-152.344f,9.29784f,191.406f, +-148.438f,7.91508f,191.406f, +-144.531f,6.85636f,191.406f, +-140.625f,8.06021f,191.406f, +-136.719f,8.86078f,191.406f, +-132.813f,11.0565f,191.406f, +-128.906f,12.4031f,191.406f, +-125.0f,13.4308f,191.406f, +-121.094f,13.8732f,191.406f, +-117.188f,15.0555f,191.406f, +-113.281f,16.0219f,191.406f, +-109.375f,16.8646f,191.406f, +-105.469f,16.9156f,191.406f, +-101.563f,16.9811f,191.406f, +-97.6563f,17.1773f,191.406f, +-93.75f,16.9233f,191.406f, +-89.8438f,15.3563f,191.406f, +-85.9375f,14.4936f,191.406f, +-82.0313f,15.6108f,191.406f, +-78.125f,15.9615f,191.406f, +-74.2188f,14.6365f,191.406f, +-70.3125f,15.5344f,191.406f, +-66.4063f,17.4295f,191.406f, +-62.5f,18.2646f,191.406f, +-58.5938f,19.0205f,191.406f, +-54.6875f,19.0503f,191.406f, +-50.7813f,17.6912f,191.406f, +-46.875f,17.6816f,191.406f, +-42.9688f,18.8066f,191.406f, +-39.0625f,19.8444f,191.406f, +-35.1563f,18.7929f,191.406f, +-31.25f,18.6865f,191.406f, +-27.3438f,19.0671f,191.406f, +-23.4375f,18.6708f,191.406f, +-19.5313f,17.7215f,191.406f, +-15.625f,16.4711f,191.406f, +-11.7188f,15.4735f,191.406f, +-7.8125f,14.6316f,191.406f, +-3.90625f,13.8779f,191.406f, +0.0f,13.7777f,191.406f, +3.90625f,14.3936f,191.406f, +-250.0f,6.25219f,187.5f, +-246.094f,5.98752f,187.5f, +-242.188f,5.50108f,187.5f, +-238.281f,5.52049f,187.5f, +-234.375f,7.87236f,187.5f, +-230.469f,10.0244f,187.5f, +-226.563f,10.9579f,187.5f, +-222.656f,11.4176f,187.5f, +-218.75f,11.1583f,187.5f, +-214.844f,12.0797f,187.5f, +-210.938f,10.8226f,187.5f, +-207.031f,8.91363f,187.5f, +-203.125f,7.71952f,187.5f, +-199.219f,8.97116f,187.5f, +-195.313f,10.8813f,187.5f, +-191.406f,12.5874f,187.5f, +-187.5f,13.3418f,187.5f, +-183.594f,13.6407f,187.5f, +-179.688f,13.8787f,187.5f, +-175.781f,13.7918f,187.5f, +-171.875f,12.965f,187.5f, +-167.969f,12.2732f,187.5f, +-164.063f,11.6063f,187.5f, +-160.156f,10.9159f,187.5f, +-156.25f,10.2447f,187.5f, +-152.344f,9.32757f,187.5f, +-148.438f,9.17721f,187.5f, +-144.531f,9.53961f,187.5f, +-140.625f,10.4339f,187.5f, +-136.719f,11.8144f,187.5f, +-132.813f,13.3081f,187.5f, +-128.906f,13.571f,187.5f, +-125.0f,13.9242f,187.5f, +-121.094f,15.4069f,187.5f, +-117.188f,16.9689f,187.5f, +-113.281f,17.987f,187.5f, +-109.375f,18.7838f,187.5f, +-105.469f,18.7737f,187.5f, +-101.563f,18.6666f,187.5f, +-97.6563f,18.4809f,187.5f, +-93.75f,18.3562f,187.5f, +-89.8438f,16.3715f,187.5f, +-85.9375f,14.5483f,187.5f, +-82.0313f,14.9648f,187.5f, +-78.125f,16.1061f,187.5f, +-74.2188f,14.4715f,187.5f, +-70.3125f,14.8322f,187.5f, +-66.4063f,16.3093f,187.5f, +-62.5f,17.3305f,187.5f, +-58.5938f,18.3312f,187.5f, +-54.6875f,18.2865f,187.5f, +-50.7813f,17.4373f,187.5f, +-46.875f,17.9803f,187.5f, +-42.9688f,18.679f,187.5f, +-39.0625f,19.2363f,187.5f, +-35.1563f,19.9926f,187.5f, +-31.25f,19.8827f,187.5f, +-27.3438f,19.283f,187.5f, +-23.4375f,19.0081f,187.5f, +-19.5313f,17.5129f,187.5f, +-15.625f,16.6754f,187.5f, +-11.7188f,15.6685f,187.5f, +-7.8125f,14.6133f,187.5f, +-3.90625f,13.9468f,187.5f, +0.0f,14.2206f,187.5f, +3.90625f,14.1738f,187.5f, +-250.0f,7.10023f,183.594f, +-246.094f,6.39376f,183.594f, +-242.188f,5.78017f,183.594f, +-238.281f,5.07235f,183.594f, +-234.375f,5.98564f,183.594f, +-230.469f,7.6542f,183.594f, +-226.563f,8.75539f,183.594f, +-222.656f,9.90845f,183.594f, +-218.75f,10.2067f,183.594f, +-214.844f,10.2019f,183.594f, +-210.938f,9.2327f,183.594f, +-207.031f,7.67088f,183.594f, +-203.125f,8.15546f,183.594f, +-199.219f,9.42269f,183.594f, +-195.313f,10.8046f,183.594f, +-191.406f,13.3042f,183.594f, +-187.5f,13.9971f,183.594f, +-183.594f,13.621f,183.594f, +-179.688f,13.5612f,183.594f, +-175.781f,13.5357f,183.594f, +-171.875f,12.8778f,183.594f, +-167.969f,12.0385f,183.594f, +-164.063f,11.4391f,183.594f, +-160.156f,10.4255f,183.594f, +-156.25f,10.5692f,183.594f, +-152.344f,10.5452f,183.594f, +-148.438f,11.506f,183.594f, +-144.531f,12.1591f,183.594f, +-140.625f,12.6212f,183.594f, +-136.719f,13.5025f,183.594f, +-132.813f,14.3363f,183.594f, +-128.906f,14.5206f,183.594f, +-125.0f,15.4902f,183.594f, +-121.094f,17.4029f,183.594f, +-117.188f,17.9537f,183.594f, +-113.281f,18.5532f,183.594f, +-109.375f,19.2939f,183.594f, +-105.469f,19.2503f,183.594f, +-101.563f,19.8772f,183.594f, +-97.6563f,19.6753f,183.594f, +-93.75f,18.6744f,183.594f, +-89.8438f,17.7905f,183.594f, +-85.9375f,16.1613f,183.594f, +-82.0313f,15.7839f,183.594f, +-78.125f,15.657f,183.594f, +-74.2188f,14.4171f,183.594f, +-70.3125f,14.6083f,183.594f, +-66.4063f,15.5594f,183.594f, +-62.5f,16.1338f,183.594f, +-58.5938f,17.1134f,183.594f, +-54.6875f,16.8192f,183.594f, +-50.7813f,17.6885f,183.594f, +-46.875f,18.5331f,183.594f, +-42.9688f,19.7359f,183.594f, +-39.0625f,20.7966f,183.594f, +-35.1563f,20.414f,183.594f, +-31.25f,20.1587f,183.594f, +-27.3438f,19.9385f,183.594f, +-23.4375f,18.4694f,183.594f, +-19.5313f,16.9742f,183.594f, +-15.625f,16.0698f,183.594f, +-11.7188f,15.4466f,183.594f, +-7.8125f,15.0614f,183.594f, +-3.90625f,15.2165f,183.594f, +0.0f,14.2632f,183.594f, +3.90625f,13.9878f,183.594f, +-250.0f,8.16978f,179.688f, +-246.094f,7.02044f,179.688f, +-242.188f,6.49336f,179.688f, +-238.281f,6.17674f,179.688f, +-234.375f,4.65977f,179.688f, +-230.469f,5.28977f,179.688f, +-226.563f,7.10711f,179.688f, +-222.656f,8.03062f,179.688f, +-218.75f,9.32719f,179.688f, +-214.844f,9.22926f,179.688f, +-210.938f,8.64588f,179.688f, +-207.031f,7.76534f,179.688f, +-203.125f,8.37552f,179.688f, +-199.219f,8.61402f,179.688f, +-195.313f,10.7567f,179.688f, +-191.406f,12.1961f,179.688f, +-187.5f,13.5076f,179.688f, +-183.594f,13.5739f,179.688f, +-179.688f,13.6032f,179.688f, +-175.781f,13.5388f,179.688f, +-171.875f,13.0425f,179.688f, +-167.969f,13.5885f,179.688f, +-164.063f,13.2666f,179.688f, +-160.156f,11.7827f,179.688f, +-156.25f,12.3517f,179.688f, +-152.344f,13.1307f,179.688f, +-148.438f,13.6688f,179.688f, +-144.531f,13.758f,179.688f, +-140.625f,14.023f,179.688f, +-136.719f,15.1514f,179.688f, +-132.813f,16.004f,179.688f, +-128.906f,16.8991f,179.688f, +-125.0f,17.3616f,179.688f, +-121.094f,18.6059f,179.688f, +-117.188f,19.3263f,179.688f, +-113.281f,19.1956f,179.688f, +-109.375f,19.7991f,179.688f, +-105.469f,20.6907f,179.688f, +-101.563f,21.7059f,179.688f, +-97.6563f,21.5595f,179.688f, +-93.75f,20.4072f,179.688f, +-89.8438f,19.1786f,179.688f, +-85.9375f,18.2895f,179.688f, +-82.0313f,17.1568f,179.688f, +-78.125f,15.2991f,179.688f, +-74.2188f,14.0951f,179.688f, +-70.3125f,14.2935f,179.688f, +-66.4063f,15.0579f,179.688f, +-62.5f,15.3497f,179.688f, +-58.5938f,15.4148f,179.688f, +-54.6875f,17.2528f,179.688f, +-50.7813f,18.38f,179.688f, +-46.875f,19.343f,179.688f, +-42.9688f,20.2151f,179.688f, +-39.0625f,21.1482f,179.688f, +-35.1563f,20.8113f,179.688f, +-31.25f,19.3685f,179.688f, +-27.3438f,18.4966f,179.688f, +-23.4375f,17.1162f,179.688f, +-19.5313f,16.1739f,179.688f, +-15.625f,15.1081f,179.688f, +-11.7188f,15.5766f,179.688f, +-7.8125f,16.3649f,179.688f, +-3.90625f,16.3198f,179.688f, +0.0f,15.6844f,179.688f, +3.90625f,14.6785f,179.688f, +-250.0f,9.32456f,175.781f, +-246.094f,8.37571f,175.781f, +-242.188f,7.57502f,175.781f, +-238.281f,7.01497f,175.781f, +-234.375f,5.67261f,175.781f, +-230.469f,4.32895f,175.781f, +-226.563f,5.20027f,175.781f, +-222.656f,6.31061f,175.781f, +-218.75f,7.56464f,175.781f, +-214.844f,8.35874f,175.781f, +-210.938f,8.24556f,175.781f, +-207.031f,7.58905f,175.781f, +-203.125f,8.23662f,175.781f, +-199.219f,8.64236f,175.781f, +-195.313f,10.4842f,175.781f, +-191.406f,11.8296f,175.781f, +-187.5f,13.5307f,175.781f, +-183.594f,14.3422f,175.781f, +-179.688f,14.0725f,175.781f, +-175.781f,14.6f,175.781f, +-171.875f,13.9877f,175.781f, +-167.969f,13.7556f,175.781f, +-164.063f,13.4564f,175.781f, +-160.156f,13.6823f,175.781f, +-156.25f,14.2643f,175.781f, +-152.344f,14.5034f,175.781f, +-148.438f,14.905f,175.781f, +-144.531f,15.0207f,175.781f, +-140.625f,15.2745f,175.781f, +-136.719f,16.7553f,175.781f, +-132.813f,17.9777f,175.781f, +-128.906f,18.5468f,175.781f, +-125.0f,19.2067f,175.781f, +-121.094f,19.2384f,175.781f, +-117.188f,19.4993f,175.781f, +-113.281f,20.2276f,175.781f, +-109.375f,21.3946f,175.781f, +-105.469f,22.0598f,175.781f, +-101.563f,23.2713f,175.781f, +-97.6563f,22.6691f,175.781f, +-93.75f,21.3119f,175.781f, +-89.8438f,20.6083f,175.781f, +-85.9375f,19.4937f,175.781f, +-82.0313f,18.1998f,175.781f, +-78.125f,15.7716f,175.781f, +-74.2188f,14.2438f,175.781f, +-70.3125f,14.4105f,175.781f, +-66.4063f,15.1879f,175.781f, +-62.5f,15.7946f,175.781f, +-58.5938f,16.2302f,175.781f, +-54.6875f,17.1058f,175.781f, +-50.7813f,18.9688f,175.781f, +-46.875f,19.3102f,175.781f, +-42.9688f,19.3902f,175.781f, +-39.0625f,19.6545f,175.781f, +-35.1563f,19.2909f,175.781f, +-31.25f,18.5385f,175.781f, +-27.3438f,16.4388f,175.781f, +-23.4375f,15.5576f,175.781f, +-19.5313f,15.7726f,175.781f, +-15.625f,16.3756f,175.781f, +-11.7188f,16.9626f,175.781f, +-7.8125f,17.219f,175.781f, +-3.90625f,17.063f,175.781f, +0.0f,16.3609f,175.781f, +3.90625f,15.2963f,175.781f, +-250.0f,10.0329f,171.875f, +-246.094f,8.57258f,171.875f, +-242.188f,7.81755f,171.875f, +-238.281f,6.9951f,171.875f, +-234.375f,5.59199f,171.875f, +-230.469f,4.81205f,171.875f, +-226.563f,4.7432f,171.875f, +-222.656f,5.42683f,171.875f, +-218.75f,6.16332f,171.875f, +-214.844f,6.63573f,171.875f, +-210.938f,6.97578f,171.875f, +-207.031f,7.49804f,171.875f, +-203.125f,8.51155f,171.875f, +-199.219f,7.94356f,171.875f, +-195.313f,9.50881f,171.875f, +-191.406f,10.9726f,171.875f, +-187.5f,13.1622f,171.875f, +-183.594f,13.8249f,171.875f, +-179.688f,15.1925f,171.875f, +-175.781f,14.9284f,171.875f, +-171.875f,13.915f,171.875f, +-167.969f,14.2258f,171.875f, +-164.063f,13.435f,171.875f, +-160.156f,13.9359f,171.875f, +-156.25f,14.8963f,171.875f, +-152.344f,15.2933f,171.875f, +-148.438f,15.0124f,171.875f, +-144.531f,15.0787f,171.875f, +-140.625f,15.1958f,171.875f, +-136.719f,17.151f,171.875f, +-132.813f,18.8799f,171.875f, +-128.906f,19.5273f,171.875f, +-125.0f,19.6894f,171.875f, +-121.094f,19.6466f,171.875f, +-117.188f,20.5941f,171.875f, +-113.281f,21.5237f,171.875f, +-109.375f,22.5435f,171.875f, +-105.469f,23.0706f,171.875f, +-101.563f,23.614f,171.875f, +-97.6563f,22.4198f,171.875f, +-93.75f,21.9598f,171.875f, +-89.8438f,22.3051f,171.875f, +-85.9375f,21.7459f,171.875f, +-82.0313f,20.1308f,171.875f, +-78.125f,17.6018f,171.875f, +-74.2188f,15.106f,171.875f, +-70.3125f,16.0838f,171.875f, +-66.4063f,16.4153f,171.875f, +-62.5f,16.9093f,171.875f, +-58.5938f,16.7439f,171.875f, +-54.6875f,16.4659f,171.875f, +-50.7813f,18.0893f,171.875f, +-46.875f,18.8298f,171.875f, +-42.9688f,18.459f,171.875f, +-39.0625f,18.0953f,171.875f, +-35.1563f,18.2461f,171.875f, +-31.25f,17.0625f,171.875f, +-27.3438f,15.3181f,171.875f, +-23.4375f,15.1837f,171.875f, +-19.5313f,17.2025f,171.875f, +-15.625f,18.3144f,171.875f, +-11.7188f,18.4161f,171.875f, +-7.8125f,18.3279f,171.875f, +-3.90625f,17.5657f,171.875f, +0.0f,16.2057f,171.875f, +3.90625f,16.0791f,171.875f, +-250.0f,9.46368f,167.969f, +-246.094f,8.91851f,167.969f, +-242.188f,7.83383f,167.969f, +-238.281f,7.4147f,167.969f, +-234.375f,6.33692f,167.969f, +-230.469f,5.44334f,167.969f, +-226.563f,4.39369f,167.969f, +-222.656f,3.44146f,167.969f, +-218.75f,4.44651f,167.969f, +-214.844f,5.36701f,167.969f, +-210.938f,6.2915f,167.969f, +-207.031f,6.3588f,167.969f, +-203.125f,7.36203f,167.969f, +-199.219f,7.7957f,167.969f, +-195.313f,9.3926f,167.969f, +-191.406f,11.2699f,167.969f, +-187.5f,12.3727f,167.969f, +-183.594f,14.7022f,167.969f, +-179.688f,15.4324f,167.969f, +-175.781f,15.226f,167.969f, +-171.875f,13.6658f,167.969f, +-167.969f,14.0361f,167.969f, +-164.063f,13.5871f,167.969f, +-160.156f,14.725f,167.969f, +-156.25f,15.5452f,167.969f, +-152.344f,16.3685f,167.969f, +-148.438f,17.0213f,167.969f, +-144.531f,16.2228f,167.969f, +-140.625f,15.1123f,167.969f, +-136.719f,16.9339f,167.969f, +-132.813f,18.4025f,167.969f, +-128.906f,19.9945f,167.969f, +-125.0f,20.4069f,167.969f, +-121.094f,21.447f,167.969f, +-117.188f,22.384f,167.969f, +-113.281f,22.4822f,167.969f, +-109.375f,22.9018f,167.969f, +-105.469f,23.4936f,167.969f, +-101.563f,23.0085f,167.969f, +-97.6563f,22.8398f,167.969f, +-93.75f,23.2939f,167.969f, +-89.8438f,23.3336f,167.969f, +-85.9375f,22.6883f,167.969f, +-82.0313f,21.8752f,167.969f, +-78.125f,18.7456f,167.969f, +-74.2188f,16.5685f,167.969f, +-70.3125f,17.179f,167.969f, +-66.4063f,18.1074f,167.969f, +-62.5f,18.9865f,167.969f, +-58.5938f,17.4851f,167.969f, +-54.6875f,17.2795f,167.969f, +-50.7813f,16.9142f,167.969f, +-46.875f,17.1532f,167.969f, +-42.9688f,17.796f,167.969f, +-39.0625f,17.6868f,167.969f, +-35.1563f,16.7998f,167.969f, +-31.25f,16.0556f,167.969f, +-27.3438f,14.7864f,167.969f, +-23.4375f,16.8386f,167.969f, +-19.5313f,17.9676f,167.969f, +-15.625f,18.4144f,167.969f, +-11.7188f,18.9248f,167.969f, +-7.8125f,18.4614f,167.969f, +-3.90625f,17.2197f,167.969f, +0.0f,16.7097f,167.969f, +3.90625f,17.1455f,167.969f, +-250.0f,9.27861f,164.063f, +-246.094f,8.67875f,164.063f, +-242.188f,8.39269f,164.063f, +-238.281f,7.54041f,164.063f, +-234.375f,6.37361f,164.063f, +-230.469f,5.0066f,164.063f, +-226.563f,3.63142f,164.063f, +-222.656f,2.77898f,164.063f, +-218.75f,2.89032f,164.063f, +-214.844f,4.01591f,164.063f, +-210.938f,4.52151f,164.063f, +-207.031f,4.85596f,164.063f, +-203.125f,6.21759f,164.063f, +-199.219f,8.25574f,164.063f, +-195.313f,10.3856f,164.063f, +-191.406f,11.6593f,164.063f, +-187.5f,12.5334f,164.063f, +-183.594f,14.1044f,164.063f, +-179.688f,14.8149f,164.063f, +-175.781f,14.9916f,164.063f, +-171.875f,14.6218f,164.063f, +-167.969f,14.5374f,164.063f, +-164.063f,13.7748f,164.063f, +-160.156f,15.1069f,164.063f, +-156.25f,16.5225f,164.063f, +-152.344f,17.8264f,164.063f, +-148.438f,18.5076f,164.063f, +-144.531f,17.6099f,164.063f, +-140.625f,16.4656f,164.063f, +-136.719f,16.7761f,164.063f, +-132.813f,19.1652f,164.063f, +-128.906f,20.565f,164.063f, +-125.0f,21.7781f,164.063f, +-121.094f,22.7613f,164.063f, +-117.188f,23.5743f,164.063f, +-113.281f,23.3567f,164.063f, +-109.375f,24.4075f,164.063f, +-105.469f,24.4502f,164.063f, +-101.563f,24.044f,164.063f, +-97.6563f,24.669f,164.063f, +-93.75f,24.7946f,164.063f, +-89.8438f,23.9722f,164.063f, +-85.9375f,23.2481f,164.063f, +-82.0313f,22.4202f,164.063f, +-78.125f,19.4816f,164.063f, +-74.2188f,18.3571f,164.063f, +-70.3125f,19.3195f,164.063f, +-66.4063f,19.6276f,164.063f, +-62.5f,19.775f,164.063f, +-58.5938f,18.4049f,164.063f, +-54.6875f,17.6998f,164.063f, +-50.7813f,16.7989f,164.063f, +-46.875f,16.5351f,164.063f, +-42.9688f,16.0836f,164.063f, +-39.0625f,16.4446f,164.063f, +-35.1563f,15.0322f,164.063f, +-31.25f,14.1679f,164.063f, +-27.3438f,16.0461f,164.063f, +-23.4375f,16.985f,164.063f, +-19.5313f,17.3286f,164.063f, +-15.625f,18.477f,164.063f, +-11.7188f,17.8736f,164.063f, +-7.8125f,17.8059f,164.063f, +-3.90625f,17.2079f,164.063f, +0.0f,16.7726f,164.063f, +3.90625f,16.4621f,164.063f, +-250.0f,8.56359f,160.156f, +-246.094f,8.04536f,160.156f, +-242.188f,7.71795f,160.156f, +-238.281f,7.20369f,160.156f, +-234.375f,5.51432f,160.156f, +-230.469f,5.00541f,160.156f, +-226.563f,4.36899f,160.156f, +-222.656f,3.03865f,160.156f, +-218.75f,2.92915f,160.156f, +-214.844f,2.63693f,160.156f, +-210.938f,2.69254f,160.156f, +-207.031f,3.5578f,160.156f, +-203.125f,5.61634f,160.156f, +-199.219f,7.61065f,160.156f, +-195.313f,9.64763f,160.156f, +-191.406f,11.2848f,160.156f, +-187.5f,12.7624f,160.156f, +-183.594f,13.2875f,160.156f, +-179.688f,15.2776f,160.156f, +-175.781f,15.3268f,160.156f, +-171.875f,15.211f,160.156f, +-167.969f,14.343f,160.156f, +-164.063f,14.8683f,160.156f, +-160.156f,16.1659f,160.156f, +-156.25f,16.4538f,160.156f, +-152.344f,18.5601f,160.156f, +-148.438f,19.2615f,160.156f, +-144.531f,18.8155f,160.156f, +-140.625f,17.4377f,160.156f, +-136.719f,17.6478f,160.156f, +-132.813f,19.7168f,160.156f, +-128.906f,21.4745f,160.156f, +-125.0f,23.0596f,160.156f, +-121.094f,24.6069f,160.156f, +-117.188f,25.9676f,160.156f, +-113.281f,26.2865f,160.156f, +-109.375f,27.1441f,160.156f, +-105.469f,27.0334f,160.156f, +-101.563f,26.0567f,160.156f, +-97.6563f,26.2584f,160.156f, +-93.75f,26.2751f,160.156f, +-89.8438f,25.6929f,160.156f, +-85.9375f,24.0275f,160.156f, +-82.0313f,22.2346f,160.156f, +-78.125f,20.4728f,160.156f, +-74.2188f,19.6229f,160.156f, +-70.3125f,20.0997f,160.156f, +-66.4063f,21.118f,160.156f, +-62.5f,20.4515f,160.156f, +-58.5938f,19.4599f,160.156f, +-54.6875f,18.2081f,160.156f, +-50.7813f,16.8263f,160.156f, +-46.875f,16.3719f,160.156f, +-42.9688f,15.1416f,160.156f, +-39.0625f,14.5969f,160.156f, +-35.1563f,14.7039f,160.156f, +-31.25f,14.8314f,160.156f, +-27.3438f,16.4129f,160.156f, +-23.4375f,16.144f,160.156f, +-19.5313f,17.5764f,160.156f, +-15.625f,17.9247f,160.156f, +-11.7188f,17.0582f,160.156f, +-7.8125f,17.1554f,160.156f, +-3.90625f,16.8369f,160.156f, +0.0f,16.4316f,160.156f, +3.90625f,16.628f,160.156f, +-250.0f,7.51933f,156.25f, +-246.094f,7.63381f,156.25f, +-242.188f,7.57378f,156.25f, +-238.281f,6.94606f,156.25f, +-234.375f,4.79198f,156.25f, +-230.469f,4.43262f,156.25f, +-226.563f,4.13314f,156.25f, +-222.656f,2.75517f,156.25f, +-218.75f,2.67631f,156.25f, +-214.844f,3.321f,156.25f, +-210.938f,3.33063f,156.25f, +-207.031f,3.60719f,156.25f, +-203.125f,4.44636f,156.25f, +-199.219f,6.02108f,156.25f, +-195.313f,8.25702f,156.25f, +-191.406f,10.5762f,156.25f, +-187.5f,11.4514f,156.25f, +-183.594f,12.7361f,156.25f, +-179.688f,15.4206f,156.25f, +-175.781f,16.1997f,156.25f, +-171.875f,14.8996f,156.25f, +-167.969f,14.1118f,156.25f, +-164.063f,16.0576f,156.25f, +-160.156f,17.6078f,156.25f, +-156.25f,17.7518f,156.25f, +-152.344f,18.4278f,156.25f, +-148.438f,19.5827f,156.25f, +-144.531f,19.2756f,156.25f, +-140.625f,18.2888f,156.25f, +-136.719f,18.7157f,156.25f, +-132.813f,20.4669f,156.25f, +-128.906f,22.5748f,156.25f, +-125.0f,24.648f,156.25f, +-121.094f,27.1223f,156.25f, +-117.188f,28.0709f,156.25f, +-113.281f,28.4982f,156.25f, +-109.375f,29.0927f,156.25f, +-105.469f,29.2755f,156.25f, +-101.563f,28.9208f,156.25f, +-97.6563f,28.3829f,156.25f, +-93.75f,26.8508f,156.25f, +-89.8438f,25.9621f,156.25f, +-85.9375f,24.2707f,156.25f, +-82.0313f,22.6235f,156.25f, +-78.125f,21.9368f,156.25f, +-74.2188f,21.0831f,156.25f, +-70.3125f,21.368f,156.25f, +-66.4063f,21.3333f,156.25f, +-62.5f,20.5296f,156.25f, +-58.5938f,19.98f,156.25f, +-54.6875f,18.5818f,156.25f, +-50.7813f,17.2025f,156.25f, +-46.875f,16.1859f,156.25f, +-42.9688f,14.4559f,156.25f, +-39.0625f,13.7597f,156.25f, +-35.1563f,14.6354f,156.25f, +-31.25f,15.6213f,156.25f, +-27.3438f,15.683f,156.25f, +-23.4375f,16.5331f,156.25f, +-19.5313f,16.8272f,156.25f, +-15.625f,16.551f,156.25f, +-11.7188f,16.34f,156.25f, +-7.8125f,16.4067f,156.25f, +-3.90625f,15.8725f,156.25f, +0.0f,16.3451f,156.25f, +3.90625f,16.9346f,156.25f, +-250.0f,6.48899f,152.344f, +-246.094f,6.4047f,152.344f, +-242.188f,6.57203f,152.344f, +-238.281f,5.4628f,152.344f, +-234.375f,4.20753f,152.344f, +-230.469f,2.81156f,152.344f, +-226.563f,1.88132f,152.344f, +-222.656f,1.57153f,152.344f, +-218.75f,2.48106f,152.344f, +-214.844f,2.88884f,152.344f, +-210.938f,2.63578f,152.344f, +-207.031f,2.9717f,152.344f, +-203.125f,3.6084f,152.344f, +-199.219f,3.99032f,152.344f, +-195.313f,7.36858f,152.344f, +-191.406f,9.54951f,152.344f, +-187.5f,10.6254f,152.344f, +-183.594f,12.3317f,152.344f, +-179.688f,14.015f,152.344f, +-175.781f,14.8857f,152.344f, +-171.875f,14.9944f,152.344f, +-167.969f,14.7547f,152.344f, +-164.063f,16.7748f,152.344f, +-160.156f,18.5461f,152.344f, +-156.25f,19.5932f,152.344f, +-152.344f,19.1033f,152.344f, +-148.438f,19.012f,152.344f, +-144.531f,19.4428f,152.344f, +-140.625f,19.3453f,152.344f, +-136.719f,20.6611f,152.344f, +-132.813f,22.2914f,152.344f, +-128.906f,24.3802f,152.344f, +-125.0f,26.4048f,152.344f, +-121.094f,28.3525f,152.344f, +-117.188f,30.0561f,152.344f, +-113.281f,30.1155f,152.344f, +-109.375f,30.9005f,152.344f, +-105.469f,30.8767f,152.344f, +-101.563f,30.9056f,152.344f, +-97.6563f,30.3635f,152.344f, +-93.75f,28.3996f,152.344f, +-89.8438f,25.8081f,152.344f, +-85.9375f,24.3731f,152.344f, +-82.0313f,22.7783f,152.344f, +-78.125f,22.5973f,152.344f, +-74.2188f,21.8359f,152.344f, +-70.3125f,21.4903f,152.344f, +-66.4063f,21.0461f,152.344f, +-62.5f,19.9934f,152.344f, +-58.5938f,19.4729f,152.344f, +-54.6875f,18.1265f,152.344f, +-50.7813f,16.4684f,152.344f, +-46.875f,15.0104f,152.344f, +-42.9688f,13.8642f,152.344f, +-39.0625f,14.8875f,152.344f, +-35.1563f,15.117f,152.344f, +-31.25f,15.0707f,152.344f, +-27.3438f,15.3829f,152.344f, +-23.4375f,15.5218f,152.344f, +-19.5313f,15.215f,152.344f, +-15.625f,15.2099f,152.344f, +-11.7188f,15.5383f,152.344f, +-7.8125f,15.6462f,152.344f, +-3.90625f,15.3096f,152.344f, +0.0f,16.3854f,152.344f, +3.90625f,17.6952f,152.344f, +-250.0f,5.17712f,148.438f, +-246.094f,4.67214f,148.438f, +-242.188f,4.31659f,148.438f, +-238.281f,3.2191f,148.438f, +-234.375f,2.13365f,148.438f, +-230.469f,1.19555f,148.438f, +-226.563f,0.110638f,148.438f, +-222.656f,0.945025f,148.438f, +-218.75f,1.43378f,148.438f, +-214.844f,2.06915f,148.438f, +-210.938f,2.27715f,148.438f, +-207.031f,2.23051f,148.438f, +-203.125f,2.64045f,148.438f, +-199.219f,2.99575f,148.438f, +-195.313f,5.40402f,148.438f, +-191.406f,8.03643f,148.438f, +-187.5f,10.0212f,148.438f, +-183.594f,12.2205f,148.438f, +-179.688f,14.1884f,148.438f, +-175.781f,14.5505f,148.438f, +-171.875f,15.188f,148.438f, +-167.969f,15.2222f,148.438f, +-164.063f,17.4791f,148.438f, +-160.156f,19.6158f,148.438f, +-156.25f,20.2107f,148.438f, +-152.344f,20.552f,148.438f, +-148.438f,20.2463f,148.438f, +-144.531f,20.4526f,148.438f, +-140.625f,20.9426f,148.438f, +-136.719f,22.6331f,148.438f, +-132.813f,25.1345f,148.438f, +-128.906f,27.0299f,148.438f, +-125.0f,29.381f,148.438f, +-121.094f,31.0494f,148.438f, +-117.188f,31.7246f,148.438f, +-113.281f,31.9331f,148.438f, +-109.375f,31.9517f,148.438f, +-105.469f,32.217f,148.438f, +-101.563f,31.9001f,148.438f, +-97.6563f,30.471f,148.438f, +-93.75f,28.6143f,148.438f, +-89.8438f,26.5696f,148.438f, +-85.9375f,24.7785f,148.438f, +-82.0313f,23.3248f,148.438f, +-78.125f,22.2737f,148.438f, +-74.2188f,22.0395f,148.438f, +-70.3125f,21.4879f,148.438f, +-66.4063f,20.5539f,148.438f, +-62.5f,19.3981f,148.438f, +-58.5938f,18.0902f,148.438f, +-54.6875f,16.6154f,148.438f, +-50.7813f,15.8338f,148.438f, +-46.875f,14.0809f,148.438f, +-42.9688f,12.8188f,148.438f, +-39.0625f,14.0819f,148.438f, +-35.1563f,14.3673f,148.438f, +-31.25f,14.2973f,148.438f, +-27.3438f,15.1616f,148.438f, +-23.4375f,13.9458f,148.438f, +-19.5313f,14.9412f,148.438f, +-15.625f,15.4488f,148.438f, +-11.7188f,15.3397f,148.438f, +-7.8125f,15.0356f,148.438f, +-3.90625f,15.6431f,148.438f, +0.0f,16.6218f,148.438f, +3.90625f,18.4109f,148.438f, +-250.0f,5.38918f,144.531f, +-246.094f,4.29322f,144.531f, +-242.188f,2.99843f,144.531f, +-238.281f,2.80561f,144.531f, +-234.375f,1.65282f,144.531f, +-230.469f,-0.268879f,144.531f, +-226.563f,-0.474469f,144.531f, +-222.656f,-0.0607398f,144.531f, +-218.75f,0.859532f,144.531f, +-214.844f,1.28455f,144.531f, +-210.938f,1.69755f,144.531f, +-207.031f,2.1277f,144.531f, +-203.125f,2.92014f,144.531f, +-199.219f,3.85473f,144.531f, +-195.313f,4.38999f,144.531f, +-191.406f,6.72101f,144.531f, +-187.5f,9.24433f,144.531f, +-183.594f,11.6027f,144.531f, +-179.688f,13.2042f,144.531f, +-175.781f,14.6647f,144.531f, +-171.875f,14.7252f,144.531f, +-167.969f,16.1425f,144.531f, +-164.063f,18.1823f,144.531f, +-160.156f,19.9802f,144.531f, +-156.25f,22.2009f,144.531f, +-152.344f,21.9313f,144.531f, +-148.438f,22.3421f,144.531f, +-144.531f,21.6393f,144.531f, +-140.625f,23.0621f,144.531f, +-136.719f,24.695f,144.531f, +-132.813f,26.6159f,144.531f, +-128.906f,29.9912f,144.531f, +-125.0f,31.6471f,144.531f, +-121.094f,32.4919f,144.531f, +-117.188f,32.9775f,144.531f, +-113.281f,33.1587f,144.531f, +-109.375f,33.0247f,144.531f, +-105.469f,32.4654f,144.531f, +-101.563f,31.5009f,144.531f, +-97.6563f,30.2211f,144.531f, +-93.75f,28.3655f,144.531f, +-89.8438f,26.6696f,144.531f, +-85.9375f,25.6101f,144.531f, +-82.0313f,23.5563f,144.531f, +-78.125f,21.8779f,144.531f, +-74.2188f,21.4789f,144.531f, +-70.3125f,21.2134f,144.531f, +-66.4063f,20.0494f,144.531f, +-62.5f,19.4674f,144.531f, +-58.5938f,17.3288f,144.531f, +-54.6875f,16.7337f,144.531f, +-50.7813f,15.9259f,144.531f, +-46.875f,14.3007f,144.531f, +-42.9688f,13.3631f,144.531f, +-39.0625f,12.7904f,144.531f, +-35.1563f,13.6627f,144.531f, +-31.25f,13.6872f,144.531f, +-27.3438f,14.0818f,144.531f, +-23.4375f,13.953f,144.531f, +-19.5313f,14.0386f,144.531f, +-15.625f,14.1249f,144.531f, +-11.7188f,14.1069f,144.531f, +-7.8125f,14.4968f,144.531f, +-3.90625f,15.4283f,144.531f, +0.0f,16.5593f,144.531f, +3.90625f,17.8758f,144.531f, +-250.0f,5.32443f,140.625f, +-246.094f,4.53202f,140.625f, +-242.188f,2.85351f,140.625f, +-238.281f,1.48443f,140.625f, +-234.375f,0.193579f,140.625f, +-230.469f,-0.0240196f,140.625f, +-226.563f,-0.195521f,140.625f, +-222.656f,-0.525286f,140.625f, +-218.75f,0.255241f,140.625f, +-214.844f,0.505993f,140.625f, +-210.938f,1.2501f,140.625f, +-207.031f,2.77282f,140.625f, +-203.125f,3.23678f,140.625f, +-199.219f,3.81665f,140.625f, +-195.313f,4.45749f,140.625f, +-191.406f,6.57237f,140.625f, +-187.5f,8.78049f,140.625f, +-183.594f,10.653f,140.625f, +-179.688f,12.1762f,140.625f, +-175.781f,13.836f,140.625f, +-171.875f,14.4421f,140.625f, +-167.969f,16.2272f,140.625f, +-164.063f,17.8194f,140.625f, +-160.156f,20.3268f,140.625f, +-156.25f,21.6942f,140.625f, +-152.344f,21.8506f,140.625f, +-148.438f,22.857f,140.625f, +-144.531f,23.0189f,140.625f, +-140.625f,24.7041f,140.625f, +-136.719f,26.468f,140.625f, +-132.813f,28.6459f,140.625f, +-128.906f,30.9708f,140.625f, +-125.0f,33.2917f,140.625f, +-121.094f,34.9879f,140.625f, +-117.188f,34.5936f,140.625f, +-113.281f,34.2431f,140.625f, +-109.375f,33.7219f,140.625f, +-105.469f,32.9679f,140.625f, +-101.563f,31.3296f,140.625f, +-97.6563f,30.0001f,140.625f, +-93.75f,28.0182f,140.625f, +-89.8438f,26.2542f,140.625f, +-85.9375f,24.9632f,140.625f, +-82.0313f,23.5598f,140.625f, +-78.125f,21.3613f,140.625f, +-74.2188f,20.8425f,140.625f, +-70.3125f,20.6976f,140.625f, +-66.4063f,19.4459f,140.625f, +-62.5f,17.9969f,140.625f, +-58.5938f,17.2754f,140.625f, +-54.6875f,16.763f,140.625f, +-50.7813f,15.8668f,140.625f, +-46.875f,15.2278f,140.625f, +-42.9688f,14.0988f,140.625f, +-39.0625f,13.4132f,140.625f, +-35.1563f,12.9004f,140.625f, +-31.25f,12.6267f,140.625f, +-27.3438f,12.7032f,140.625f, +-23.4375f,12.0508f,140.625f, +-19.5313f,12.8332f,140.625f, +-15.625f,12.2269f,140.625f, +-11.7188f,12.2256f,140.625f, +-7.8125f,13.9086f,140.625f, +-3.90625f,15.559f,140.625f, +0.0f,16.8086f,140.625f, +3.90625f,18.5798f,140.625f, +-250.0f,4.69677f,136.719f, +-246.094f,3.45683f,136.719f, +-242.188f,1.81964f,136.719f, +-238.281f,1.13059f,136.719f, +-234.375f,0.535221f,136.719f, +-230.469f,0.868904f,136.719f, +-226.563f,0.574251f,136.719f, +-222.656f,0.279368f,136.719f, +-218.75f,-1.1876f,136.719f, +-214.844f,-0.688708f,136.719f, +-210.938f,0.470686f,136.719f, +-207.031f,2.00488f,136.719f, +-203.125f,3.42644f,136.719f, +-199.219f,4.20503f,136.719f, +-195.313f,5.23588f,136.719f, +-191.406f,6.02424f,136.719f, +-187.5f,7.96541f,136.719f, +-183.594f,10.5299f,136.719f, +-179.688f,12.0941f,136.719f, +-175.781f,13.5058f,136.719f, +-171.875f,14.8816f,136.719f, +-167.969f,16.551f,136.719f, +-164.063f,17.712f,136.719f, +-160.156f,19.6536f,136.719f, +-156.25f,21.4322f,136.719f, +-152.344f,22.672f,136.719f, +-148.438f,23.3463f,136.719f, +-144.531f,24.5334f,136.719f, +-140.625f,26.061f,136.719f, +-136.719f,27.7423f,136.719f, +-132.813f,30.1692f,136.719f, +-128.906f,33.3739f,136.719f, +-125.0f,34.9742f,136.719f, +-121.094f,35.9387f,136.719f, +-117.188f,36.0925f,136.719f, +-113.281f,35.6549f,136.719f, +-109.375f,34.5646f,136.719f, +-105.469f,34.6062f,136.719f, +-101.563f,32.8375f,136.719f, +-97.6563f,30.2678f,136.719f, +-93.75f,27.2213f,136.719f, +-89.8438f,26.1126f,136.719f, +-85.9375f,24.9965f,136.719f, +-82.0313f,22.5841f,136.719f, +-78.125f,21.7213f,136.719f, +-74.2188f,21.534f,136.719f, +-70.3125f,20.5652f,136.719f, +-66.4063f,19.032f,136.719f, +-62.5f,17.4252f,136.719f, +-58.5938f,16.7783f,136.719f, +-54.6875f,15.9619f,136.719f, +-50.7813f,14.8707f,136.719f, +-46.875f,14.3143f,136.719f, +-42.9688f,13.8793f,136.719f, +-39.0625f,12.6352f,136.719f, +-35.1563f,12.0433f,136.719f, +-31.25f,11.8551f,136.719f, +-27.3438f,12.0193f,136.719f, +-23.4375f,11.2795f,136.719f, +-19.5313f,11.6002f,136.719f, +-15.625f,10.9143f,136.719f, +-11.7188f,12.1473f,136.719f, +-7.8125f,14.3093f,136.719f, +-3.90625f,16.245f,136.719f, +0.0f,17.3141f,136.719f, +3.90625f,19.7224f,136.719f, +-250.0f,3.94613f,132.813f, +-246.094f,2.33247f,132.813f, +-242.188f,1.96569f,132.813f, +-238.281f,1.1741f,132.813f, +-234.375f,0.606142f,132.813f, +-230.469f,0.00901447f,132.813f, +-226.563f,0.143339f,132.813f, +-222.656f,-0.356031f,132.813f, +-218.75f,-1.55439f,132.813f, +-214.844f,-1.22801f,132.813f, +-210.938f,-0.390443f,132.813f, +-207.031f,1.15349f,132.813f, +-203.125f,2.6275f,132.813f, +-199.219f,3.55895f,132.813f, +-195.313f,4.99281f,132.813f, +-191.406f,4.99673f,132.813f, +-187.5f,6.96468f,132.813f, +-183.594f,10.0691f,132.813f, +-179.688f,12.3783f,132.813f, +-175.781f,13.2459f,132.813f, +-171.875f,14.3637f,132.813f, +-167.969f,16.3222f,132.813f, +-164.063f,17.6984f,132.813f, +-160.156f,19.3295f,132.813f, +-156.25f,20.9768f,132.813f, +-152.344f,23.1452f,132.813f, +-148.438f,23.885f,132.813f, +-144.531f,24.7169f,132.813f, +-140.625f,27.1655f,132.813f, +-136.719f,29.0232f,132.813f, +-132.813f,30.2573f,132.813f, +-128.906f,33.5563f,132.813f, +-125.0f,35.1858f,132.813f, +-121.094f,36.4332f,132.813f, +-117.188f,36.6359f,132.813f, +-113.281f,36.0253f,132.813f, +-109.375f,34.7127f,132.813f, +-105.469f,34.6833f,132.813f, +-101.563f,33.7208f,132.813f, +-97.6563f,30.9809f,132.813f, +-93.75f,27.9091f,132.813f, +-89.8438f,25.709f,132.813f, +-85.9375f,24.452f,132.813f, +-82.0313f,22.4897f,132.813f, +-78.125f,22.0485f,132.813f, +-74.2188f,22.1517f,132.813f, +-70.3125f,20.4874f,132.813f, +-66.4063f,19.0482f,132.813f, +-62.5f,17.1019f,132.813f, +-58.5938f,16.7815f,132.813f, +-54.6875f,15.1253f,132.813f, +-50.7813f,14.5074f,132.813f, +-46.875f,12.7631f,132.813f, +-42.9688f,12.6595f,132.813f, +-39.0625f,11.9406f,132.813f, +-35.1563f,11.7459f,132.813f, +-31.25f,10.8406f,132.813f, +-27.3438f,11.0393f,132.813f, +-23.4375f,10.4798f,132.813f, +-19.5313f,10.8165f,132.813f, +-15.625f,12.4368f,132.813f, +-11.7188f,13.2405f,132.813f, +-7.8125f,14.9282f,132.813f, +-3.90625f,16.4449f,132.813f, +0.0f,17.8238f,132.813f, +3.90625f,19.9574f,132.813f, +-250.0f,2.5744f,128.906f, +-246.094f,2.12474f,128.906f, +-242.188f,0.674823f,128.906f, +-238.281f,-0.305135f,128.906f, +-234.375f,-0.948647f,128.906f, +-230.469f,-0.982836f,128.906f, +-226.563f,-1.17369f,128.906f, +-222.656f,-1.48697f,128.906f, +-218.75f,-2.23137f,128.906f, +-214.844f,-2.13825f,128.906f, +-210.938f,-1.06826f,128.906f, +-207.031f,0.0666403f,128.906f, +-203.125f,1.15717f,128.906f, +-199.219f,3.14762f,128.906f, +-195.313f,4.08858f,128.906f, +-191.406f,5.07728f,128.906f, +-187.5f,8.06699f,128.906f, +-183.594f,10.7473f,128.906f, +-179.688f,12.0801f,128.906f, +-175.781f,13.1617f,128.906f, +-171.875f,14.5283f,128.906f, +-167.969f,15.8148f,128.906f, +-164.063f,16.9067f,128.906f, +-160.156f,18.6293f,128.906f, +-156.25f,20.8869f,128.906f, +-152.344f,22.6168f,128.906f, +-148.438f,23.9359f,128.906f, +-144.531f,26.521f,128.906f, +-140.625f,27.4381f,128.906f, +-136.719f,29.5698f,128.906f, +-132.813f,30.681f,128.906f, +-128.906f,33.28f,128.906f, +-125.0f,35.3433f,128.906f, +-121.094f,36.3509f,128.906f, +-117.188f,36.2098f,128.906f, +-113.281f,35.157f,128.906f, +-109.375f,35.3884f,128.906f, +-105.469f,35.7158f,128.906f, +-101.563f,34.3449f,128.906f, +-97.6563f,32.5198f,128.906f, +-93.75f,29.0611f,128.906f, +-89.8438f,25.9945f,128.906f, +-85.9375f,24.2624f,128.906f, +-82.0313f,23.0248f,128.906f, +-78.125f,21.6012f,128.906f, +-74.2188f,21.0399f,128.906f, +-70.3125f,20.1719f,128.906f, +-66.4063f,18.6862f,128.906f, +-62.5f,17.3287f,128.906f, +-58.5938f,16.0916f,128.906f, +-54.6875f,14.1153f,128.906f, +-50.7813f,12.6292f,128.906f, +-46.875f,12.0431f,128.906f, +-42.9688f,11.4785f,128.906f, +-39.0625f,11.911f,128.906f, +-35.1563f,11.6609f,128.906f, +-31.25f,10.4332f,128.906f, +-27.3438f,9.68026f,128.906f, +-23.4375f,9.84506f,128.906f, +-19.5313f,11.6097f,128.906f, +-15.625f,13.2944f,128.906f, +-11.7188f,14.0518f,128.906f, +-7.8125f,15.2998f,128.906f, +-3.90625f,16.8731f,128.906f, +0.0f,18.0594f,128.906f, +3.90625f,20.0876f,128.906f, +-250.0f,2.47782f,125.0f, +-246.094f,1.27263f,125.0f, +-242.188f,-0.535855f,125.0f, +-238.281f,-1.33089f,125.0f, +-234.375f,-1.63273f,125.0f, +-230.469f,-2.30607f,125.0f, +-226.563f,-2.13647f,125.0f, +-222.656f,-2.95807f,125.0f, +-218.75f,-2.92133f,125.0f, +-214.844f,-3.33811f,125.0f, +-210.938f,-2.29807f,125.0f, +-207.031f,-0.860766f,125.0f, +-203.125f,0.507027f,125.0f, +-199.219f,1.54044f,125.0f, +-195.313f,3.32139f,125.0f, +-191.406f,5.76593f,125.0f, +-187.5f,8.17548f,125.0f, +-183.594f,10.5223f,125.0f, +-179.688f,11.4741f,125.0f, +-175.781f,12.3545f,125.0f, +-171.875f,13.5542f,125.0f, +-167.969f,14.4358f,125.0f, +-164.063f,16.6197f,125.0f, +-160.156f,18.7561f,125.0f, +-156.25f,21.2618f,125.0f, +-152.344f,22.9541f,125.0f, +-148.438f,24.7574f,125.0f, +-144.531f,26.8375f,125.0f, +-140.625f,28.3307f,125.0f, +-136.719f,29.2598f,125.0f, +-132.813f,31.2334f,125.0f, +-128.906f,32.9236f,125.0f, +-125.0f,34.4853f,125.0f, +-121.094f,35.1589f,125.0f, +-117.188f,34.4655f,125.0f, +-113.281f,35.7692f,125.0f, +-109.375f,35.9985f,125.0f, +-105.469f,35.7974f,125.0f, +-101.563f,34.6099f,125.0f, +-97.6563f,32.4066f,125.0f, +-93.75f,28.8398f,125.0f, +-89.8438f,26.014f,125.0f, +-85.9375f,25.0319f,125.0f, +-82.0313f,23.7685f,125.0f, +-78.125f,22.4099f,125.0f, +-74.2188f,20.9166f,125.0f, +-70.3125f,19.1502f,125.0f, +-66.4063f,17.8355f,125.0f, +-62.5f,16.5146f,125.0f, +-58.5938f,14.9189f,125.0f, +-54.6875f,13.2423f,125.0f, +-50.7813f,12.2568f,125.0f, +-46.875f,11.4853f,125.0f, +-42.9688f,10.7795f,125.0f, +-39.0625f,10.3251f,125.0f, +-35.1563f,10.4077f,125.0f, +-31.25f,9.96202f,125.0f, +-27.3438f,9.77658f,125.0f, +-23.4375f,10.6703f,125.0f, +-19.5313f,12.2058f,125.0f, +-15.625f,13.8385f,125.0f, +-11.7188f,15.1556f,125.0f, +-7.8125f,15.7626f,125.0f, +-3.90625f,16.911f,125.0f, +0.0f,18.0803f,125.0f, +3.90625f,18.9654f,125.0f, +-250.0f,1.97449f,121.094f, +-246.094f,1.28169f,121.094f, +-242.188f,0.0699786f,121.094f, +-238.281f,-1.31551f,121.094f, +-234.375f,-2.33115f,121.094f, +-230.469f,-3.19445f,121.094f, +-226.563f,-3.91693f,121.094f, +-222.656f,-4.0298f,121.094f, +-218.75f,-4.334f,121.094f, +-214.844f,-3.5405f,121.094f, +-210.938f,-2.70043f,121.094f, +-207.031f,-2.86125f,121.094f, +-203.125f,-1.24727f,121.094f, +-199.219f,0.20797f,121.094f, +-195.313f,2.52573f,121.094f, +-191.406f,4.8544f,121.094f, +-187.5f,7.37504f,121.094f, +-183.594f,9.40828f,121.094f, +-179.688f,11.0747f,121.094f, +-175.781f,11.9892f,121.094f, +-171.875f,12.3358f,121.094f, +-167.969f,13.2084f,121.094f, +-164.063f,15.8626f,121.094f, +-160.156f,18.1098f,121.094f, +-156.25f,20.2905f,121.094f, +-152.344f,22.8183f,121.094f, +-148.438f,25.3439f,121.094f, +-144.531f,26.7908f,121.094f, +-140.625f,29.0959f,121.094f, +-136.719f,29.9478f,121.094f, +-132.813f,30.8054f,121.094f, +-128.906f,31.9545f,121.094f, +-125.0f,33.8025f,121.094f, +-121.094f,35.2826f,121.094f, +-117.188f,36.2373f,121.094f, +-113.281f,36.7861f,121.094f, +-109.375f,36.509f,121.094f, +-105.469f,35.7461f,121.094f, +-101.563f,33.7802f,121.094f, +-97.6563f,30.788f,121.094f, +-93.75f,28.1422f,121.094f, +-89.8438f,26.6316f,121.094f, +-85.9375f,26.0349f,121.094f, +-82.0313f,24.8022f,121.094f, +-78.125f,23.5217f,121.094f, +-74.2188f,21.74f,121.094f, +-70.3125f,20.0101f,121.094f, +-66.4063f,17.8705f,121.094f, +-62.5f,15.6785f,121.094f, +-58.5938f,13.74f,121.094f, +-54.6875f,12.3387f,121.094f, +-50.7813f,11.9457f,121.094f, +-46.875f,12.0102f,121.094f, +-42.9688f,11.0065f,121.094f, +-39.0625f,9.84571f,121.094f, +-35.1563f,10.0894f,121.094f, +-31.25f,10.5366f,121.094f, +-27.3438f,9.94957f,121.094f, +-23.4375f,11.0038f,121.094f, +-19.5313f,12.8084f,121.094f, +-15.625f,13.8969f,121.094f, +-11.7188f,14.9146f,121.094f, +-7.8125f,15.4187f,121.094f, +-3.90625f,16.094f,121.094f, +0.0f,17.0612f,121.094f, +3.90625f,18.5327f,121.094f, +-250.0f,2.18397f,117.188f, +-246.094f,1.51628f,117.188f, +-242.188f,0.628327f,117.188f, +-238.281f,-0.567933f,117.188f, +-234.375f,-2.01568f,117.188f, +-230.469f,-3.41089f,117.188f, +-226.563f,-3.82758f,117.188f, +-222.656f,-5.01586f,117.188f, +-218.75f,-4.74822f,117.188f, +-214.844f,-3.30853f,117.188f, +-210.938f,-2.32499f,117.188f, +-207.031f,-1.71509f,117.188f, +-203.125f,-1.19203f,117.188f, +-199.219f,0.219498f,117.188f, +-195.313f,1.66304f,117.188f, +-191.406f,4.35105f,117.188f, +-187.5f,6.33228f,117.188f, +-183.594f,8.00972f,117.188f, +-179.688f,9.71486f,117.188f, +-175.781f,10.7727f,117.188f, +-171.875f,11.358f,117.188f, +-167.969f,12.5239f,117.188f, +-164.063f,14.6278f,117.188f, +-160.156f,17.2069f,117.188f, +-156.25f,19.9779f,117.188f, +-152.344f,23.4607f,117.188f, +-148.438f,26.6108f,117.188f, +-144.531f,28.4635f,117.188f, +-140.625f,29.7705f,117.188f, +-136.719f,31.0684f,117.188f, +-132.813f,31.8395f,117.188f, +-128.906f,32.1658f,117.188f, +-125.0f,34.7478f,117.188f, +-121.094f,36.0624f,117.188f, +-117.188f,37.2702f,117.188f, +-113.281f,37.3474f,117.188f, +-109.375f,37.242f,117.188f, +-105.469f,36.1544f,117.188f, +-101.563f,33.403f,117.188f, +-97.6563f,31.294f,117.188f, +-93.75f,29.4961f,117.188f, +-89.8438f,29.0556f,117.188f, +-85.9375f,28.2757f,117.188f, +-82.0313f,26.6322f,117.188f, +-78.125f,24.8286f,117.188f, +-74.2188f,22.7019f,117.188f, +-70.3125f,20.4725f,117.188f, +-66.4063f,17.984f,117.188f, +-62.5f,16.3033f,117.188f, +-58.5938f,14.2087f,117.188f, +-54.6875f,12.8086f,117.188f, +-50.7813f,12.5463f,117.188f, +-46.875f,12.1781f,117.188f, +-42.9688f,11.1391f,117.188f, +-39.0625f,10.4623f,117.188f, +-35.1563f,11.0528f,117.188f, +-31.25f,11.454f,117.188f, +-27.3438f,10.5577f,117.188f, +-23.4375f,10.6328f,117.188f, +-19.5313f,12.5569f,117.188f, +-15.625f,13.5389f,117.188f, +-11.7188f,14.3792f,117.188f, +-7.8125f,15.4809f,117.188f, +-3.90625f,16.1008f,117.188f, +0.0f,17.3675f,117.188f, +3.90625f,18.919f,117.188f, +}; + +btScalar Landscape06Nml[] = { +-0.373915f,0.891474f,-0.255855f, +-0.31015f,0.793525f,-0.52357f, +-0.450332f,0.86393f,-0.225447f, +-0.404472f,0.777981f,-0.480778f, +-0.557629f,0.811458f,-0.174885f, +-0.428564f,0.86234f,-0.269633f, +-0.414608f,0.909847f,-0.0166634f, +-0.208047f,0.971233f,0.115854f, +-0.328757f,0.932331f,0.150588f, +-0.263029f,0.937991f,0.225808f, +-0.409412f,0.900937f,0.143853f, +-0.455309f,0.881347f,0.126178f, +-0.31951f,0.943247f,0.0905511f, +-0.33825f,0.934582f,0.1102f, +-0.183669f,0.981438f,0.0551769f, +-0.208308f,0.97293f,0.100072f, +-0.189578f,0.981862f,-0.00282566f, +-0.201983f,0.97649f,0.0752952f, +-0.0672914f,0.99749f,-0.0220572f, +-0.118523f,0.991949f,0.0446084f, +0.102757f,0.986595f,-0.126773f, +0.00122687f,0.992675f,-0.120808f, +0.0798054f,0.967751f,-0.238933f, +0.00875196f,0.978629f,-0.205448f, +0.141554f,0.932155f,-0.333242f, +0.0918343f,0.965319f,-0.244387f, +0.372959f,0.842559f,-0.388582f, +0.280191f,0.875069f,-0.394647f, +0.314921f,0.849656f,-0.422977f, +0.258676f,0.813335f,-0.521127f, +0.266443f,0.876708f,-0.400489f, +0.358307f,0.856764f,-0.370907f, +0.280512f,0.913716f,-0.293999f, +0.337561f,0.857178f,-0.388971f, +0.0927666f,0.994197f,-0.0544758f, +0.155544f,0.953116f,-0.259567f, +-0.18671f,0.979157f,-0.0799463f, +-0.20939f,0.930283f,-0.301212f, +-0.117108f,0.986639f,-0.113269f, +-0.190516f,0.897405f,-0.397956f, +-0.0703231f,0.977433f,-0.199199f, +-0.142735f,0.82748f,-0.54305f, +-0.00706444f,0.969596f,-0.244609f, +0.0216131f,0.85384f,-0.520087f, +-0.100606f,0.961424f,-0.256011f, +0.00977565f,0.925054f,-0.379709f, +-0.0412166f,0.978641f,-0.201403f, +0.099113f,0.987693f,-0.12099f, +0.0911178f,0.982669f,-0.16143f, +0.0730708f,0.986329f,-0.147703f, +0.114859f,0.978874f,-0.169152f, +0.109302f,0.983788f,-0.142175f, +0.116167f,0.976713f,-0.180378f, +0.0784892f,0.966143f,-0.24578f, +0.0196949f,0.987682f,-0.155232f, +0.0258077f,0.978923f,-0.202593f, +-0.0161862f,0.979217f,-0.202168f, +-0.120896f,0.935381f,-0.332336f, +-0.0291128f,0.941335f,-0.336215f, +-0.0776893f,0.901631f,-0.425472f, +-0.0768763f,0.919716f,-0.384983f, +-0.0462705f,0.951989f,-0.302615f, +-0.0260847f,0.891121f,-0.453016f, +-0.0818404f,0.911776f,-0.40245f, +0.152271f,0.86407f,-0.479789f, +0.0880729f,0.874485f,-0.476991f, +0.11644f,0.855496f,-0.504548f, +0.0395982f,0.813262f,-0.580548f, +0.00631598f,0.857568f,-0.514332f, +-0.0780909f,0.759651f,-0.645626f, +-0.0538158f,0.822232f,-0.566603f, +0.0102932f,0.785194f,-0.619165f, +-0.00905015f,0.879608f,-0.475613f, +0.0439442f,0.825793f,-0.562259f, +-0.15058f,0.877556f,-0.455216f, +-0.0080088f,0.902753f,-0.430085f, +-0.112334f,0.946952f,-0.301104f, +0.00843129f,0.966084f,-0.258092f, +-0.0520095f,0.981628f,-0.183579f, +-0.0023169f,0.970009f,-0.243057f, +-0.0302799f,0.995335f,-0.0916051f, +0.0376961f,0.991328f,-0.125888f, +0.0852061f,0.995425f,-0.0432221f, +0.156966f,0.986644f,0.0435404f, +0.21491f,0.973384f,-0.079613f, +0.060548f,0.977921f,-0.200013f, +0.158822f,0.967125f,-0.198606f, +0.134591f,0.957423f,-0.255396f, +0.121293f,0.978974f,-0.164008f, +0.108432f,0.947609f,-0.300465f, +0.0857608f,0.988377f,-0.125519f, +0.0956294f,0.951748f,-0.291599f, +-0.0286686f,0.995404f,-0.0913747f, +0.0793846f,0.975448f,-0.205424f, +0.106071f,0.990697f,0.085251f, +0.292453f,0.941038f,0.170056f, +0.371746f,0.914213f,0.161306f, +0.341006f,0.933768f,0.108596f, +0.372402f,0.920827f,0.115737f, +0.298439f,0.950662f,-0.0847083f, +0.211549f,0.974139f,0.0793788f, +0.255698f,0.96634f,-0.0283838f, +-0.0706076f,0.991212f,0.111867f, +0.0490836f,0.977096f,0.207063f, +-0.256838f,0.950876f,0.172827f, +-0.168627f,0.937168f,0.30542f, +-0.0642391f,0.963856f,0.258562f, +-0.00196823f,0.905532f,0.424274f, +0.182795f,0.945782f,0.268481f, +0.13515f,0.919671f,0.368699f, +0.107184f,0.970151f,0.217528f, +0.00985613f,0.977921f,0.208742f, +0.0734564f,0.98632f,0.147572f, +0.067487f,0.972043f,0.224896f, +0.20672f,0.968081f,0.141727f, +0.186648f,0.970679f,0.151478f, +0.213561f,0.965286f,0.150383f, +0.189498f,0.980689f,0.0483704f, +0.277013f,0.94213f,0.188824f, +0.316429f,0.927757f,0.197839f, +0.225121f,0.964838f,0.135677f, +0.124434f,0.992109f,0.0153398f, +0.14416f,0.987262f,0.0673169f, +0.128154f,0.991727f,-0.0073791f, +0.1809f,0.982671f,0.0404037f, +0.125271f,0.99083f,-0.0506329f, +0.117639f,0.992303f,-0.0386759f, +0.0449726f,0.973305f,-0.225068f, +0.124809f,0.992058f,0.0156083f, +0.127135f,0.958258f,-0.256082f, +0.171896f,0.982167f,0.0761593f, +0.160304f,0.951991f,-0.260798f, +-0.494953f,0.868907f,-0.00477061f, +-0.512017f,0.856533f,0.0647248f, +-0.564588f,0.823588f,0.0542513f, +-0.480746f,0.876502f,0.0250513f, +-0.397786f,0.91419f,0.0776024f, +-0.3922f,0.916181f,0.0824136f, +-0.288362f,0.955571f,0.0610852f, +-0.109541f,0.991807f,0.0657195f, +-0.119597f,0.99188f,-0.0432477f, +-0.0246849f,0.992746f,-0.117673f, +0.197846f,0.964215f,-0.176481f, +0.198977f,0.940868f,-0.274182f, +0.288209f,0.884317f,-0.367314f, +0.309487f,0.847917f,-0.430411f, +0.274335f,0.939851f,-0.20352f, +0.256503f,0.958634f,-0.123399f, +0.0454718f,0.993939f,-0.100084f, +-0.104233f,0.980418f,0.167081f, +-0.137204f,0.957647f,0.253153f, +-0.0909923f,0.97094f,0.221352f, +-0.0588081f,0.977218f,0.203928f, +0.0555628f,0.971956f,0.228506f, +0.00693538f,0.995197f,0.0976442f, +0.0112691f,0.996103f,-0.0874744f, +0.104487f,0.972486f,-0.208215f, +0.102504f,0.971128f,-0.215412f, +0.0933319f,0.976682f,-0.193342f, +0.023135f,0.974909f,-0.221399f, +0.0195254f,0.964185f,-0.264511f, +0.0843961f,0.966003f,-0.244368f, +0.0791804f,0.94997f,-0.30214f, +0.048562f,0.904645f,-0.423391f, +0.168302f,0.901104f,-0.399607f, +0.0460994f,0.899241f,-0.435018f, +-0.0201301f,0.942734f,-0.332937f, +-0.0651933f,0.964794f,-0.254799f, +-0.107417f,0.971064f,-0.213298f, +-0.17484f,0.97454f,-0.140369f, +-0.26177f,0.957564f,-0.120611f, +-0.18964f,0.980348f,-0.0543506f, +-0.0244255f,0.999511f,-0.0195208f, +0.0943164f,0.983888f,-0.151887f, +0.241216f,0.961222f,-0.133665f, +0.186016f,0.976207f,-0.111437f, +0.0288865f,0.998091f,-0.0545842f, +-0.00269516f,0.997826f,0.0658428f, +-0.0454406f,0.988515f,0.144131f, +0.0349744f,0.994103f,0.102646f, +0.310638f,0.939659f,0.143339f, +0.362637f,0.904005f,0.226428f, +0.268459f,0.940968f,0.206177f, +-0.0101438f,0.990408f,0.137803f, +-0.259956f,0.964753f,0.0409231f, +-0.105214f,0.99436f,0.0133734f, +0.151003f,0.984401f,0.0902917f, +0.153972f,0.971331f,0.181133f, +0.131893f,0.982033f,0.134962f, +0.145326f,0.983866f,0.104346f, +0.172165f,0.970545f,0.16853f, +0.260168f,0.947172f,0.18756f, +0.265906f,0.934787f,0.235514f, +0.175251f,0.956563f,0.232968f, +0.205308f,0.948623f,0.240753f, +0.093567f,0.968565f,0.230493f, +0.000708259f,0.964766f,0.263107f, +0.00657781f,0.964909f,0.262504f, +-0.520396f,0.851586f,0.063156f, +-0.521936f,0.850242f,0.0683468f, +-0.537166f,0.843365f,0.0137284f, +-0.507784f,0.86143f,-0.00972442f, +-0.393238f,0.917684f,0.0567504f, +-0.362634f,0.931285f,-0.0347048f, +-0.298916f,0.951591f,-0.0715749f, +-0.125797f,0.991634f,-0.0289454f, +0.00629701f,0.999979f,0.00117199f, +0.0170902f,0.994718f,-0.101214f, +0.290594f,0.952688f,-0.0891078f, +0.285259f,0.936469f,-0.20409f, +0.342737f,0.918097f,-0.199071f, +0.262981f,0.956466f,-0.126547f, +-0.000199178f,0.996828f,-0.0795833f, +0.16652f,0.978742f,0.119733f, +0.0382843f,0.984413f,0.171653f, +-0.277981f,0.950703f,0.137441f, +-0.18354f,0.954113f,0.236605f, +-0.0382213f,0.967232f,0.251001f, +-0.0471282f,0.983482f,0.174763f, +0.05509f,0.990469f,0.126237f, +0.154415f,0.97865f,0.135647f, +0.187824f,0.979878f,0.0675348f, +0.226039f,0.971999f,-0.0642243f, +0.0780765f,0.982532f,-0.168921f, +0.109774f,0.985685f,-0.127961f, +0.112009f,0.982676f,-0.147653f, +0.0632751f,0.975786f,-0.209375f, +0.0264674f,0.962968f,-0.268312f, +0.10845f,0.959018f,-0.261771f, +0.0643921f,0.961817f,-0.266009f, +0.166593f,0.964859f,-0.203209f, +0.0747121f,0.973608f,-0.215653f, +-0.165051f,0.968419f,-0.186874f, +-0.148108f,0.983106f,-0.10755f, +-0.179372f,0.979451f,-0.0922022f, +-0.237948f,0.970437f,-0.0404116f, +-0.2824f,0.959184f,-0.014723f, +-0.146028f,0.988959f,-0.0252228f, +0.05616f,0.991975f,-0.113275f, +0.196359f,0.969761f,-0.144935f, +0.181455f,0.976082f,-0.119739f, +0.110973f,0.993178f,-0.035804f, +-0.0390828f,0.998775f,0.0303582f, +-0.136356f,0.988616f,0.0636122f, +-0.0521843f,0.980102f,0.191512f, +0.0572854f,0.981374f,0.183367f, +0.238568f,0.946616f,0.216801f, +0.340107f,0.907515f,0.246464f, +0.312043f,0.926088f,0.212108f, +0.0846085f,0.98223f,0.167527f, +-0.163231f,0.986101f,0.0309937f, +-0.143013f,0.98971f,-0.00457425f, +0.0291614f,0.993948f,0.105909f, +0.107232f,0.980268f,0.16606f, +0.13514f,0.977368f,0.162754f, +0.171582f,0.963454f,0.205708f, +0.160805f,0.97344f,0.162963f, +0.206565f,0.959827f,0.189905f, +0.203733f,0.939018f,0.277016f, +0.156541f,0.940477f,0.30166f, +0.14264f,0.938158f,0.315457f, +0.0877292f,0.924317f,0.371405f, +0.0427952f,0.921735f,0.385453f, +0.102307f,0.915297f,0.389569f, +-0.518725f,0.854828f,-0.0138881f, +-0.516652f,0.85588f,0.023226f, +-0.490153f,0.869598f,0.0595683f, +-0.505693f,0.862598f,-0.0140982f, +-0.393758f,0.918824f,-0.0267811f, +-0.308114f,0.951253f,-0.0135724f, +-0.25353f,0.967309f,0.00592796f, +-0.183935f,0.978787f,-0.0902442f, +-0.0335384f,0.998587f,-0.0412272f, +0.0888831f,0.995408f,-0.0355216f, +0.275528f,0.951614f,-0.136073f, +0.317879f,0.941106f,-0.115209f, +0.22556f,0.974028f,-0.0197739f, +0.262726f,0.954534f,0.140851f, +0.0383338f,0.998565f,0.0373963f, +0.0108706f,0.999386f,-0.0333096f, +0.0472758f,0.987524f,0.150202f, +-0.22401f,0.968166f,0.111686f, +-0.221122f,0.974472f,0.0388438f, +-0.0303833f,0.999266f,0.0233175f, +0.0911048f,0.995841f,0.000284795f, +0.0750561f,0.987717f,-0.137044f, +0.140099f,0.985231f,-0.098447f, +0.159287f,0.981153f,-0.10939f, +0.301657f,0.953265f,-0.0169985f, +0.140836f,0.988971f,-0.0458453f, +0.074059f,0.996008f,-0.0498236f, +0.0873182f,0.996023f,-0.0176849f, +0.132872f,0.990946f,0.019257f, +0.15553f,0.982355f,-0.103875f, +0.133638f,0.955183f,-0.264135f, +0.0505536f,0.951293f,-0.304114f, +0.0663471f,0.962897f,-0.261588f, +0.0679148f,0.992885f,-0.0978063f, +-0.186921f,0.976146f,-0.110452f, +-0.16844f,0.980926f,-0.0970201f, +-0.17716f,0.9831f,-0.0461376f, +-0.252028f,0.967676f,-0.00920485f, +-0.25063f,0.967236f,-0.0404965f, +-0.0995772f,0.983353f,-0.151991f, +0.0940064f,0.974734f,-0.202626f, +0.146102f,0.962693f,-0.227766f, +0.10874f,0.966405f,-0.232891f, +-0.0013416f,0.987029f,-0.160533f, +-0.0603915f,0.998129f,0.00954783f, +-0.17946f,0.98293f,0.040526f, +-0.153066f,0.978461f,0.138509f, +0.00546813f,0.977756f,0.209673f, +0.202775f,0.944505f,0.258443f, +0.334531f,0.904949f,0.262976f, +0.339399f,0.898505f,0.278385f, +0.212792f,0.950144f,0.227917f, +-0.0583572f,0.996371f,0.0619671f, +-0.218128f,0.975136f,0.0391184f, +-0.0703437f,0.983861f,0.16453f, +0.113041f,0.961301f,0.25124f, +0.0979771f,0.959037f,0.265798f, +0.151767f,0.929082f,0.337302f, +0.185905f,0.937423f,0.294409f, +0.169611f,0.955662f,0.240713f, +0.159864f,0.96582f,0.204047f, +0.151538f,0.965571f,0.211446f, +0.11661f,0.954852f,0.273241f, +0.0708035f,0.941966f,0.328158f, +-0.00402057f,0.956357f,0.292174f, +0.0123647f,0.956622f,0.291069f, +-0.626234f,0.777268f,-0.0607036f, +-0.590408f,0.806122f,0.0398278f, +-0.512253f,0.84829f,0.134171f, +-0.429387f,0.891471f,0.144588f, +-0.394702f,0.915407f,0.0789917f, +-0.352114f,0.935018f,0.0419128f, +-0.269358f,0.962596f,0.0292454f, +-0.0709514f,0.996127f,0.0519312f, +-0.0485279f,0.996417f,-0.069268f, +0.139101f,0.983953f,-0.111751f, +0.369972f,0.916386f,-0.152833f, +0.200502f,0.96864f,-0.146752f, +0.063154f,0.997971f,0.00814434f, +0.218613f,0.964332f,0.149236f, +0.233367f,0.966768f,0.104401f, +0.00832713f,0.995958f,-0.0894382f, +-0.101235f,0.994608f,-0.0224841f, +-0.188929f,0.980627f,0.051742f, +-0.131276f,0.990999f,0.026226f, +0.0111642f,0.996226f,-0.0860703f, +0.127344f,0.982944f,-0.132683f, +0.133649f,0.978353f,-0.157998f, +0.127047f,0.978674f,-0.161419f, +0.154013f,0.97768f,-0.142902f, +0.207952f,0.974577f,-0.0833996f, +0.130584f,0.99044f,-0.0444555f, +0.0527996f,0.997244f,-0.0521173f, +0.0873033f,0.993919f,-0.0671111f, +0.134372f,0.9813f,-0.137819f, +0.302979f,0.937443f,-0.171475f, +0.235087f,0.922651f,-0.305694f, +0.116878f,0.945593f,-0.303632f, +-0.0892912f,0.947762f,-0.306226f, +-0.0487728f,0.993685f,-0.101049f, +-0.161853f,0.9816f,-0.101314f, +-0.226351f,0.97061f,-0.0817454f, +-0.270044f,0.962691f,-0.0173905f, +-0.294262f,0.954053f,0.0565031f, +-0.151555f,0.985239f,0.0795882f, +0.00297078f,0.999916f,-0.0126498f, +0.158118f,0.985077f,-0.067991f, +0.232676f,0.957923f,-0.168067f, +0.184787f,0.953241f,-0.239135f, +-0.102652f,0.943763f,-0.314284f, +-0.249925f,0.941897f,-0.224429f, +-0.230538f,0.969668f,-0.0812203f, +-0.256878f,0.964046f,-0.0680376f, +-0.0528332f,0.99816f,0.0297627f, +0.16253f,0.979605f,0.118148f, +0.292443f,0.935246f,0.199479f, +0.337448f,0.899957f,0.276054f, +0.288581f,0.911989f,0.291541f, +0.0381605f,0.961598f,0.271797f, +-0.217082f,0.942133f,0.25546f, +-0.187341f,0.947099f,0.26059f, +0.0122725f,0.939216f,0.343107f, +0.0450967f,0.927047f,0.372224f, +0.0805118f,0.921403f,0.380178f, +0.269621f,0.884781f,0.380089f, +0.278457f,0.920235f,0.275007f, +0.240432f,0.950543f,0.19662f, +0.110916f,0.980787f,0.160482f, +0.0190768f,0.974013f,0.225685f, +0.0421661f,0.96323f,0.26535f, +0.0623149f,0.965243f,0.253816f, +0.0484827f,0.970002f,0.238214f, +-0.675447f,0.735679f,-0.050474f, +-0.639324f,0.768795f,-0.0148056f, +-0.556082f,0.830482f,0.0327513f, +-0.42972f,0.893254f,0.132053f, +-0.365389f,0.922739f,0.122653f, +-0.226979f,0.966229f,0.121993f, +-0.221717f,0.973751f,-0.051483f, +-0.0779728f,0.987923f,-0.133899f, +0.0930073f,0.979917f,-0.176386f, +0.192144f,0.942491f,-0.27348f, +0.309496f,0.916222f,-0.254459f, +0.155051f,0.977443f,-0.143405f, +-0.0554135f,0.989739f,-0.131708f, +0.110672f,0.991805f,-0.0638304f, +0.310319f,0.950296f,0.0252996f, +0.103349f,0.993006f,-0.0570824f, +-0.143599f,0.988502f,-0.0473533f, +-0.226116f,0.973312f,-0.0391734f, +-0.100068f,0.994649f,-0.0257001f, +0.124656f,0.989757f,-0.0695779f, +0.137305f,0.97907f,-0.150231f, +0.12072f,0.989818f,-0.075415f, +0.132256f,0.990827f,-0.0277589f, +0.0994133f,0.991446f,-0.0845708f, +0.16457f,0.984921f,-0.0533595f, +0.161357f,0.986289f,-0.034624f, +0.0776395f,0.993281f,-0.0858198f, +0.196429f,0.972629f,-0.124127f, +0.213597f,0.93634f,-0.278645f, +0.333587f,0.906552f,-0.258619f, +0.264447f,0.928271f,-0.261499f, +0.0224352f,0.968338f,-0.248633f, +-0.153007f,0.973949f,-0.167368f, +-0.171971f,0.976037f,-0.133332f, +-0.164739f,0.982172f,-0.0905542f, +-0.256427f,0.965345f,-0.0485236f, +-0.266685f,0.961164f,-0.0710119f, +-0.315314f,0.936338f,-0.154429f, +-0.180509f,0.974939f,-0.130043f, +0.0306802f,0.996715f,-0.0749509f, +0.181216f,0.981966f,-0.0538862f, +0.308423f,0.951239f,-0.0044789f, +0.193412f,0.981099f,-0.00609358f, +-0.00883535f,0.999181f,0.039479f, +-0.293629f,0.95203f,-0.0861418f, +-0.288511f,0.952707f,-0.0954526f, +-0.270635f,0.961763f,-0.0420598f, +-0.176015f,0.982039f,0.0679556f, +0.0472003f,0.981703f,0.184478f, +0.185293f,0.947852f,0.259313f, +0.26012f,0.901797f,0.345109f, +0.219376f,0.887657f,0.404894f, +0.015248f,0.892187f,0.451408f, +-0.212632f,0.887876f,0.407999f, +-0.145904f,0.908525f,0.391529f, +-0.0226457f,0.932703f,0.359933f, +0.0874951f,0.910834f,0.403393f, +0.125007f,0.935932f,0.329249f, +0.288568f,0.918223f,0.271284f, +0.34457f,0.896771f,0.277619f, +0.261558f,0.928634f,0.263108f, +0.0802026f,0.961218f,0.26387f, +0.0163948f,0.952196f,0.305047f, +0.0566148f,0.964684f,0.257253f, +0.102872f,0.970943f,0.216073f, +0.0353576f,0.994079f,0.102749f, +-0.569322f,0.820332f,-0.0541097f, +-0.616679f,0.764093f,-0.18939f, +-0.605157f,0.764062f,-0.223597f, +-0.50856f,0.856476f,-0.0884048f, +-0.372491f,0.927008f,0.0436669f, +-0.225048f,0.969626f,0.0958063f, +-0.0508165f,0.996801f,0.0616925f, +0.0586358f,0.990558f,-0.123919f, +0.126111f,0.966195f,-0.224862f, +0.229194f,0.950926f,-0.207869f, +0.252375f,0.936474f,-0.243564f, +0.0944308f,0.971404f,-0.217846f, +-0.0355117f,0.972557f,-0.229939f, +0.0856503f,0.962722f,-0.256575f, +0.220711f,0.941477f,-0.254769f, +0.0934053f,0.989629f,-0.109133f, +-0.156897f,0.986627f,-0.0441527f, +-0.224564f,0.970579f,-0.0868729f, +-0.0948813f,0.992594f,-0.0758608f, +0.168753f,0.983045f,-0.0717275f, +0.110894f,0.991432f,-0.0690319f, +-0.0147158f,0.998265f,0.0570193f, +0.10964f,0.979883f,0.16676f, +0.213201f,0.96906f,0.124368f, +0.195873f,0.980015f,-0.0346975f, +0.162476f,0.975738f,-0.146751f, +0.136902f,0.9692f,-0.204718f, +0.244929f,0.933568f,-0.26165f, +0.288988f,0.918188f,-0.270954f, +0.254175f,0.924529f,-0.283974f, +0.243695f,0.954587f,-0.171397f, +-0.00175415f,0.99017f,-0.13986f, +-0.165264f,0.975245f,-0.146916f, +-0.185767f,0.967008f,-0.174319f, +-0.191354f,0.972667f,-0.131541f, +-0.271241f,0.952999f,-0.134987f, +-0.1847f,0.972855f,-0.139424f, +-0.209304f,0.957842f,-0.1968f, +-0.243194f,0.936f,-0.254482f, +-0.0210884f,0.983365f,-0.18041f, +0.0761402f,0.989042f,-0.126486f, +0.185372f,0.981538f,0.047127f, +0.117606f,0.973445f,0.196404f, +-0.0453061f,0.954332f,0.295292f, +-0.152267f,0.943756f,0.293495f, +-0.272105f,0.944288f,0.185149f, +-0.341417f,0.929337f,0.140592f, +-0.316477f,0.938022f,0.141266f, +-0.0291064f,0.965694f,0.258045f, +0.139271f,0.938861f,0.31487f, +0.16066f,0.916793f,0.36562f, +0.163005f,0.879828f,0.446466f, +0.088987f,0.884248f,0.458461f, +-0.126118f,0.932849f,0.337472f, +-0.101381f,0.953175f,0.284919f, +-0.0233764f,0.967738f,0.250872f, +0.0600962f,0.965273f,0.254236f, +0.184472f,0.94915f,0.255117f, +0.293565f,0.911429f,0.288301f, +0.309916f,0.89217f,0.328611f, +0.260108f,0.896879f,0.357704f, +0.0945809f,0.935133f,0.341439f, +0.0335311f,0.964748f,0.261032f, +0.0942492f,0.979731f,0.176762f, +0.167685f,0.967918f,0.187127f, +0.258869f,0.942682f,0.210564f, +-0.367443f,0.929937f,-0.0142236f, +-0.499723f,0.853143f,-0.149749f, +-0.60287f,0.768676f,-0.213739f, +-0.628893f,0.759885f,-0.164524f, +-0.498958f,0.866588f,-0.00814533f, +-0.266358f,0.961387f,0.0691948f, +0.0209306f,0.994406f,0.103533f, +0.18825f,0.979809f,0.0673512f, +0.186929f,0.982347f,-0.00722501f, +0.221871f,0.971137f,-0.0875532f, +0.321849f,0.94224f,-0.0927163f, +0.129468f,0.975377f,-0.178544f, +-0.0214597f,0.975387f,-0.219454f, +0.135606f,0.972282f,-0.19047f, +0.166947f,0.968719f,-0.18361f, +-0.0604962f,0.993281f,-0.0986602f, +-0.147333f,0.985679f,-0.0820398f, +-0.177745f,0.972235f,-0.152201f, +-0.13389f,0.979994f,-0.147259f, +0.107621f,0.993068f,-0.0472599f, +0.0496354f,0.9956f,0.0794756f, +-0.114638f,0.990271f,0.0788811f, +0.0386746f,0.994961f,0.0924988f, +0.257639f,0.951075f,0.170521f, +0.371556f,0.918219f,0.137186f, +0.306734f,0.951256f,-0.0320228f, +0.251981f,0.957147f,-0.142743f, +0.259956f,0.937158f,-0.232721f, +0.273432f,0.938847f,-0.209289f, +0.242378f,0.942977f,-0.228139f, +0.135357f,0.967026f,-0.21573f, +-0.0237633f,0.989278f,-0.144096f, +-0.131198f,0.984621f,-0.11536f, +-0.202181f,0.972555f,-0.115152f, +-0.221308f,0.9725f,-0.0725642f, +-0.229514f,0.969023f,-0.0912046f, +-0.218972f,0.967608f,-0.125639f, +-0.212632f,0.976006f,-0.0469096f, +-0.218674f,0.974967f,-0.0402565f, +-0.122558f,0.989962f,-0.0703905f, +0.0166378f,0.999654f,0.0203946f, +-0.0104674f,0.996634f,0.0813074f, +-0.0169459f,0.959611f,0.28082f, +-0.0960206f,0.935549f,0.339894f, +-0.167668f,0.926307f,0.337405f, +-0.198261f,0.909687f,0.364915f, +-0.193335f,0.935754f,0.294935f, +-0.259424f,0.960196f,0.103554f, +-0.126539f,0.989254f,0.073239f, +0.0445245f,0.981975f,0.183692f, +0.070195f,0.9396f,0.334999f, +0.116045f,0.901991f,0.415867f, +0.160437f,0.912696f,0.375828f, +-0.00552585f,0.963507f,0.267627f, +-0.111729f,0.971129f,0.210774f, +0.00935468f,0.964114f,0.265323f, +0.084172f,0.968508f,0.234323f, +0.13752f,0.967988f,0.209968f, +0.208575f,0.947382f,0.242826f, +0.289545f,0.920265f,0.263203f, +0.228797f,0.929214f,0.290195f, +0.185013f,0.916649f,0.354295f, +0.160823f,0.950358f,0.266374f, +0.183734f,0.959776f,0.212302f, +0.0865279f,0.982909f,0.162492f, +0.143782f,0.963199f,0.227098f, +-0.40108f,0.898526f,-0.178287f, +-0.447805f,0.881163f,-0.15173f, +-0.619629f,0.769135f,-0.156501f, +-0.663764f,0.743697f,-0.0795752f, +-0.534645f,0.83883f,-0.102567f, +-0.293541f,0.950588f,-0.101077f, +-0.0154638f,0.998684f,-0.048892f, +0.170364f,0.984269f,-0.0468065f, +0.272586f,0.961403f,-0.0374194f, +0.276742f,0.955139f,-0.105472f, +0.3572f,0.929651f,-0.0903144f, +0.185848f,0.967712f,-0.170277f, +-0.00167559f,0.978573f,-0.205892f, +0.0698456f,0.971595f,-0.226108f, +0.0821889f,0.985623f,-0.147624f, +-0.0376538f,0.998466f,-0.0405822f, +-0.0983702f,0.988409f,-0.115634f, +-0.140633f,0.987279f,-0.0741791f, +-0.185061f,0.981813f,-0.0423742f, +-0.0718387f,0.997236f,0.0189748f, +0.00846681f,0.991398f,0.130611f, +0.00870324f,0.999937f,0.00714861f, +0.043927f,0.984772f,-0.168207f, +0.173423f,0.967972f,-0.181535f, +0.363952f,0.925731f,-0.10277f, +0.415083f,0.906279f,-0.0797799f, +0.295656f,0.934439f,-0.198525f, +0.285411f,0.94244f,-0.174208f, +0.286359f,0.952372f,-0.104818f, +0.274f,0.954057f,-0.121243f, +0.125082f,0.985323f,-0.116157f, +-0.0728358f,0.994219f,-0.0788892f, +-0.183935f,0.981488f,-0.0533801f, +-0.254614f,0.966975f,0.0114848f, +-0.238556f,0.965368f,0.105624f, +-0.207746f,0.971319f,0.115674f, +-0.215469f,0.971204f,0.101667f, +-0.267107f,0.96138f,0.0663435f, +-0.207576f,0.97646f,0.0586408f, +-0.117358f,0.991748f,0.0516096f, +-0.0500459f,0.994852f,0.0881198f, +-0.093813f,0.986665f,0.133006f, +-0.152698f,0.969858f,0.18989f, +-0.1251f,0.953778f,0.273236f, +-0.165614f,0.925222f,0.341373f, +-0.185498f,0.929562f,0.3186f, +-0.115032f,0.960173f,0.254626f, +-0.110794f,0.97049f,0.214181f, +-0.10146f,0.992209f,0.072301f, +-0.111958f,0.99337f,0.026117f, +-0.0975457f,0.980844f,0.168611f, +0.086247f,0.976994f,0.195051f, +0.241113f,0.947591f,0.20961f, +0.0868755f,0.959222f,0.268972f, +-0.141994f,0.949853f,0.278599f, +-0.0178282f,0.934163f,0.356401f, +0.0726972f,0.940594f,0.331659f, +0.165529f,0.917627f,0.361333f, +0.223743f,0.920886f,0.319231f, +0.302189f,0.900958f,0.311378f, +0.181249f,0.939198f,0.291642f, +0.15269f,0.934294f,0.32215f, +0.181639f,0.932767f,0.311371f, +0.174351f,0.925291f,0.336805f, +0.107261f,0.938861f,0.327163f, +0.0621733f,0.949825f,0.306542f, +-0.336425f,0.924181f,-0.180852f, +-0.467727f,0.856958f,-0.216458f, +-0.602238f,0.781026f,-0.165251f, +-0.647361f,0.734151f,-0.204809f, +-0.50962f,0.821617f,-0.255407f, +-0.329682f,0.908003f,-0.258533f, +-0.0514578f,0.97257f,-0.226846f, +0.197411f,0.959315f,-0.201849f, +0.264136f,0.946231f,-0.186758f, +0.271989f,0.947232f,-0.169627f, +0.342182f,0.926412f,-0.157076f, +0.226068f,0.960114f,-0.164544f, +0.0298714f,0.986995f,-0.157954f, +0.0947848f,0.979734f,-0.176458f, +0.0184686f,0.978597f,-0.204958f, +-0.115417f,0.979217f,-0.166771f, +-0.133289f,0.987752f,-0.0811202f, +-0.254272f,0.966705f,0.0287551f, +-0.238007f,0.962858f,0.127508f, +-0.0805244f,0.989118f,0.123135f, +0.0609568f,0.996652f,0.0544921f, +0.185345f,0.981121f,-0.0552078f, +0.246025f,0.947034f,-0.206392f, +0.188933f,0.898455f,-0.396338f, +0.253355f,0.896162f,-0.364288f, +0.431339f,0.877591f,-0.209237f, +0.33179f,0.90994f,-0.248847f, +0.173449f,0.964884f,-0.197267f, +0.195848f,0.971573f,-0.133f, +0.242458f,0.968164f,-0.0622215f, +0.0872514f,0.995924f,0.0228468f, +-0.104392f,0.994289f,0.0221861f, +-0.212909f,0.976423f,0.0355982f, +-0.329497f,0.936369f,0.121017f, +-0.322708f,0.91595f,0.238528f, +-0.206447f,0.929806f,0.304697f, +-0.167225f,0.947523f,0.272462f, +-0.184928f,0.959175f,0.213976f, +-0.173343f,0.972643f,0.154651f, +-0.113658f,0.986612f,0.116951f, +-0.0855668f,0.994338f,0.0630098f, +-0.114452f,0.992427f,0.0446133f, +-0.159653f,0.986324f,0.0409453f, +-0.238644f,0.971105f,-0.00174015f, +-0.263001f,0.962569f,0.0655076f, +-0.150786f,0.97653f,0.153794f, +-0.0789227f,0.973225f,0.21588f, +-0.0862836f,0.967962f,0.235807f, +0.0429765f,0.969236f,0.242351f, +-0.0440941f,0.992467f,0.114305f, +-0.115348f,0.992717f,-0.0347649f, +0.0790257f,0.995351f,-0.0550642f, +0.126473f,0.98592f,0.109395f, +-0.0409487f,0.953557f,0.298417f, +-0.206016f,0.913735f,0.350208f, +-0.0633912f,0.92675f,0.370293f, +0.0785739f,0.913264f,0.399719f, +0.177609f,0.899902f,0.398285f, +0.238034f,0.923241f,0.301604f, +0.255943f,0.926508f,0.27582f, +0.232022f,0.914012f,0.332787f, +0.162081f,0.936068f,0.312259f, +0.177513f,0.926269f,0.332437f, +0.185532f,0.921601f,0.340924f, +0.173632f,0.950356f,0.258214f, +0.111166f,0.980225f,0.163712f, +-0.0923042f,0.995727f,-0.00270435f, +-0.408896f,0.902709f,-0.133863f, +-0.602302f,0.79183f,-0.10118f, +-0.624884f,0.765307f,-0.154352f, +-0.552184f,0.809036f,-0.201379f, +-0.343811f,0.917937f,-0.197956f, +-0.0748905f,0.960991f,-0.266248f, +0.134998f,0.958099f,-0.252631f, +0.206547f,0.962195f,-0.177534f, +0.264489f,0.960553f,-0.0859237f, +0.340814f,0.939333f,-0.0387315f, +0.235136f,0.971602f,-0.0264814f, +0.0144037f,0.991275f,-0.131023f, +0.053242f,0.991683f,-0.117173f, +0.0920982f,0.995717f,0.00816044f, +-0.164789f,0.980567f,-0.106454f, +-0.239234f,0.97035f,-0.0344802f, +-0.316227f,0.948287f,0.0274269f, +-0.260328f,0.965493f,0.00728909f, +-0.00635978f,0.999169f,0.0402508f, +0.152101f,0.988094f,-0.023159f, +0.261272f,0.960304f,-0.0977355f, +0.363311f,0.923635f,-0.122082f, +0.303719f,0.94151f,-0.145994f, +0.209258f,0.960639f,-0.182713f, +0.299827f,0.935978f,-0.184526f, +0.310225f,0.948937f,-0.0572597f, +0.134013f,0.988326f,-0.0724722f, +0.173294f,0.983169f,-0.0578515f, +0.150596f,0.988589f,-0.00352276f, +0.0218728f,0.99535f,0.093809f, +-0.090936f,0.980927f,0.171796f, +-0.253868f,0.938693f,0.233251f, +-0.400767f,0.870372f,0.286074f, +-0.392418f,0.877786f,0.274773f, +-0.219224f,0.925755f,0.308089f, +-0.114269f,0.92983f,0.349798f, +-0.147993f,0.921652f,0.358685f, +-0.138523f,0.925121f,0.353501f, +-0.0290531f,0.945854f,0.32329f, +0.0440242f,0.978167f,0.203106f, +-0.0576599f,0.997178f,0.0480716f, +-0.156038f,0.987653f,-0.0139414f, +-0.143901f,0.989541f,-0.0100722f, +-0.293059f,0.951458f,-0.0940478f, +-0.298958f,0.953936f,-0.0251005f, +-0.203233f,0.972711f,0.111937f, +-0.134891f,0.965356f,0.223367f, +-0.0182075f,0.958686f,0.283884f, +0.123188f,0.934113f,0.33505f, +0.0872404f,0.983488f,0.15856f, +0.00440122f,0.999845f,-0.0170726f, +-0.143813f,0.987727f,0.0609306f, +-0.192356f,0.942318f,0.273927f, +-0.141157f,0.926207f,0.349593f, +-0.0674076f,0.959831f,0.272363f, +0.0730938f,0.959591f,0.27174f, +0.173541f,0.961002f,0.215311f, +0.369237f,0.888798f,0.271483f, +0.277281f,0.944196f,0.177789f, +0.215184f,0.95909f,0.183961f, +0.13088f,0.973624f,0.186887f, +0.130607f,0.953976f,0.269946f, +0.212637f,0.930888f,0.297042f, +0.306976f,0.920481f,0.241829f, +0.280289f,0.947029f,0.156763f, +0.0123331f,0.988431f,0.151171f, +-0.297868f,0.952288f,0.0664969f, +-0.612229f,0.786332f,-0.0828155f, +-0.600387f,0.789438f,-0.127758f, +-0.542733f,0.826042f,-0.151972f, +-0.320126f,0.93364f,-0.160733f, +0.000589343f,0.981171f,-0.193142f, +0.0980808f,0.971507f,-0.215763f, +0.124748f,0.986178f,-0.109047f, +0.199191f,0.978521f,-0.0531043f, +0.247764f,0.965734f,-0.0772702f, +0.318214f,0.948019f,-0.000766246f, +0.183917f,0.97162f,-0.148756f, +-0.0488566f,0.965709f,-0.25499f, +-0.0165518f,0.99654f,-0.0814512f, +-0.0793375f,0.996823f,-0.00696945f, +-0.310737f,0.950344f,-0.0169863f, +-0.292329f,0.952706f,0.0830406f, +-0.217409f,0.975529f,0.0328f, +-0.044323f,0.995765f,-0.0805443f, +0.185778f,0.977354f,-0.101323f, +0.271832f,0.958328f,-0.0878372f, +0.32088f,0.946924f,0.019279f, +0.252443f,0.960909f,0.113697f, +0.290552f,0.947257f,0.135217f, +0.289238f,0.957058f,-0.0195476f, +0.286171f,0.957114f,0.0451517f, +0.220997f,0.975269f,0.00320969f, +0.0994052f,0.991378f,-0.0853655f, +0.0429034f,0.994069f,0.099932f, +-0.0709962f,0.952332f,0.296687f, +-0.214284f,0.897012f,0.38659f, +-0.318505f,0.838002f,0.443066f, +-0.352211f,0.849573f,0.392649f, +-0.30013f,0.898851f,0.319356f, +-0.250783f,0.928599f,0.273517f, +-0.200191f,0.919896f,0.337217f, +-0.179596f,0.907951f,0.378643f, +-0.135043f,0.919145f,0.370049f, +0.0368434f,0.920312f,0.389447f, +0.16581f,0.924682f,0.34274f, +0.0946402f,0.961136f,0.259346f, +-0.111217f,0.985094f,0.131228f, +-0.13188f,0.98641f,0.0979915f, +-0.254562f,0.966634f,0.028585f, +-0.324299f,0.94515f,-0.0390035f, +-0.293729f,0.954471f,-0.0520494f, +-0.247862f,0.966889f,0.0607495f, +-0.0794894f,0.980131f,0.181727f, +0.101373f,0.964007f,0.245794f, +0.197084f,0.947574f,0.251517f, +0.177833f,0.964662f,0.194431f, +-0.161149f,0.986485f,0.0296539f, +-0.316387f,0.94824f,0.02721f, +-0.207789f,0.976057f,0.0643106f, +-0.00905536f,0.99298f,0.117933f, +0.141544f,0.987983f,0.062088f, +0.189336f,0.98168f,-0.0213574f, +0.273454f,0.960225f,0.0564811f, +0.315806f,0.930776f,0.184181f, +0.235283f,0.955417f,0.17838f, +0.124851f,0.982004f,0.141708f, +0.0792257f,0.989953f,0.117114f, +0.210835f,0.9739f,0.0840678f, +0.31429f,0.942479f,0.113817f, +0.350241f,0.914076f,0.20444f, +0.0694749f,0.983151f,0.169077f, +-0.169784f,0.982476f,0.076909f, +-0.507716f,0.850133f,-0.139637f, +-0.564212f,0.800379f,-0.202629f, +-0.514428f,0.829332f,-0.218112f, +-0.369417f,0.885582f,-0.28156f, +0.00180169f,0.974596f,-0.223965f, +0.0258344f,0.976386f,-0.214484f, +-0.024f,0.996868f,-0.0753534f, +0.239975f,0.969587f,0.0481022f, +0.34797f,0.931588f,-0.105173f, +0.316295f,0.909782f,-0.268803f, +0.250422f,0.912989f,-0.322087f, +-0.0369252f,0.950156f,-0.30958f, +-0.207502f,0.950188f,-0.232562f, +-0.167975f,0.985706f,-0.0129903f, +-0.315712f,0.948273f,0.0332206f, +-0.386969f,0.921609f,-0.0298463f, +-0.12805f,0.991662f,0.0144567f, +0.102711f,0.991948f,-0.0740863f, +0.21217f,0.967879f,-0.134884f, +0.167738f,0.98185f,-0.0885116f, +0.176293f,0.984226f,0.0148055f, +0.233609f,0.968608f,0.0850021f, +0.30166f,0.950058f,0.0799509f, +0.387591f,0.914349f,0.117215f, +0.244561f,0.968825f,0.0395933f, +0.294792f,0.954101f,0.0528114f, +0.0843374f,0.996399f,0.00873819f, +-0.221704f,0.963341f,0.151067f, +-0.335663f,0.86809f,0.365719f, +-0.262618f,0.850841f,0.455085f, +-0.222709f,0.867235f,0.445313f, +-0.24917f,0.884312f,0.39485f, +-0.238336f,0.907466f,0.345978f, +-0.270997f,0.917236f,0.291956f, +-0.229194f,0.914337f,0.333853f, +-0.15897f,0.933059f,0.322692f, +-0.100911f,0.956766f,0.272794f, +-0.0211523f,0.974532f,0.223248f, +0.201297f,0.933635f,0.29632f, +0.155914f,0.954519f,0.254134f, +-0.0218294f,0.971898f,0.234389f, +-0.079809f,0.976613f,0.199646f, +-0.0874479f,0.990326f,0.10774f, +-0.258167f,0.959037f,-0.116608f, +-0.306401f,0.945943f,-0.106352f, +-0.341562f,0.936596f,-0.0782577f, +-0.199458f,0.979359f,-0.0327519f, +0.0464294f,0.997405f,0.0550308f, +0.191208f,0.978076f,0.0825056f, +0.238583f,0.96711f,0.0881811f, +-0.0888379f,0.993271f,0.0743033f, +-0.264236f,0.955782f,0.129075f, +-0.188913f,0.981529f,0.0302016f, +-0.0145673f,0.997134f,-0.0742444f, +0.169633f,0.978852f,-0.114338f, +0.20381f,0.976959f,-0.0633407f, +0.175314f,0.984354f,-0.0176521f, +0.240514f,0.967819f,0.0740208f, +0.244396f,0.964775f,0.0973589f, +0.18832f,0.980026f,0.0639107f, +0.156937f,0.987568f,-0.00896143f, +0.262584f,0.963481f,-0.0524761f, +0.165405f,0.986171f,-0.0103631f, +0.180443f,0.960877f,0.210132f, +0.22428f,0.955199f,0.193116f, +0.0674282f,0.994387f,0.0815297f, +-0.367623f,0.911009f,-0.186858f, +-0.569756f,0.78903f,-0.229805f, +-0.492917f,0.847419f,-0.197265f, +-0.366141f,0.895981f,-0.251313f, +-0.0646011f,0.969824f,-0.235091f, +0.018291f,0.976889f,-0.212961f, +-0.170757f,0.95698f,-0.234588f, +0.158661f,0.98264f,-0.0961541f, +0.509439f,0.859861f,-0.0333235f, +0.45757f,0.865797f,-0.202548f, +0.211042f,0.949174f,-0.233516f, +-0.116125f,0.987892f,-0.102876f, +-0.347298f,0.937329f,-0.028262f, +-0.3353f,0.938887f,0.0778782f, +-0.281604f,0.948411f,0.145656f, +-0.254278f,0.964997f,0.0642133f, +-0.124948f,0.985399f,-0.115656f, +0.137997f,0.981596f,-0.132006f, +0.145883f,0.979226f,-0.140833f, +0.128056f,0.990732f,-0.0452937f, +0.135002f,0.989818f,-0.0451192f, +0.250583f,0.968082f,-0.00493589f, +0.249752f,0.966686f,-0.056052f, +0.354812f,0.933896f,0.0441336f, +0.303438f,0.951308f,0.0542095f, +0.224177f,0.96836f,0.10965f, +0.0241424f,0.959753f,0.279804f, +-0.360787f,0.871516f,0.332105f, +-0.379082f,0.837086f,0.394442f, +-0.267154f,0.880877f,0.390749f, +-0.209592f,0.899886f,0.382462f, +-0.280017f,0.899934f,0.33423f, +-0.205094f,0.90311f,0.377265f, +-0.215487f,0.908768f,0.35736f, +-0.222303f,0.927919f,0.299247f, +-0.133955f,0.964793f,0.226343f, +-0.0310722f,0.978213f,0.205265f, +0.00222901f,0.986522f,0.163613f, +0.163026f,0.975343f,0.148754f, +0.222032f,0.968535f,0.112436f, +-0.0591592f,0.996482f,0.0593585f, +-0.0736093f,0.986012f,0.149538f, +0.0883465f,0.986402f,0.138585f, +-0.129755f,0.988677f,-0.0753772f, +-0.360418f,0.926521f,-0.10797f, +-0.325602f,0.942448f,-0.0759939f, +-0.212184f,0.970083f,-0.117968f, +-0.0173686f,0.99664f,-0.0800487f, +0.199307f,0.979749f,-0.0191744f, +0.207601f,0.977585f,-0.0350739f, +-0.111673f,0.993337f,0.0284751f, +-0.348081f,0.937445f,0.00599776f, +-0.0214784f,0.998661f,0.0470579f, +0.101424f,0.987937f,-0.11702f, +0.14864f,0.985437f,-0.0825872f, +0.115279f,0.993006f,0.0255073f, +0.132171f,0.98902f,0.0661133f, +0.208651f,0.976857f,0.0470664f, +0.263292f,0.96404f,0.0361305f, +0.248825f,0.968171f,0.0270552f, +0.185161f,0.982538f,-0.018271f, +0.217415f,0.97571f,0.0268649f, +0.0197241f,0.992022f,0.124516f, +-0.222642f,0.960275f,0.168234f, +0.132211f,0.987109f,0.0902005f, +0.194249f,0.96722f,0.163561f, +-0.121192f,0.992517f,0.0149198f, +-0.530811f,0.812343f,-0.241533f, +-0.504434f,0.808747f,-0.302447f, +-0.34313f,0.885425f,-0.313504f, +-0.137778f,0.93664f,-0.322061f, +0.0757018f,0.968813f,-0.235947f, +-0.132891f,0.938587f,-0.318425f, +0.0404124f,0.947798f,-0.316301f, +0.44786f,0.871235f,-0.200923f, +0.490699f,0.867082f,-0.0859319f, +0.104719f,0.99418f,-0.0252995f, +-0.266739f,0.955461f,0.126271f, +-0.36926f,0.905342f,0.209771f, +-0.330235f,0.922316f,0.200695f, +-0.269586f,0.955277f,0.121531f, +-0.151874f,0.986716f,0.0576671f, +-0.0142621f,0.999832f,-0.0115305f, +0.159425f,0.986955f,-0.0224599f, +0.153623f,0.986882f,-0.0496328f, +0.106278f,0.991325f,-0.0773283f, +0.114508f,0.986134f,-0.120113f, +0.21169f,0.974687f,-0.0719165f, +0.274634f,0.961096f,-0.0295159f, +0.269382f,0.962666f,0.0266079f, +0.255851f,0.94689f,0.19478f, +-0.00861224f,0.958716f,0.284234f, +-0.164949f,0.853283f,0.494671f, +-0.299895f,0.797641f,0.523289f, +-0.348319f,0.830543f,0.434595f, +-0.252787f,0.902204f,0.349467f, +-0.200686f,0.920719f,0.334665f, +-0.211731f,0.897332f,0.387253f, +-0.253565f,0.89104f,0.376502f, +-0.186105f,0.884245f,0.42834f, +-0.119153f,0.910802f,0.395274f, +-0.0259565f,0.945107f,0.325728f, +-0.0365208f,0.969055f,0.244127f, +0.0217438f,0.965814f,0.258322f, +0.21499f,0.950394f,0.224789f, +0.314831f,0.941255f,0.12215f, +-0.024099f,0.99913f,-0.0340298f, +-0.193558f,0.979871f,-0.0488714f, +0.141024f,0.987427f,0.0714227f, +0.042141f,0.998281f,-0.0407328f, +-0.330902f,0.928766f,-0.167024f, +-0.316891f,0.928564f,-0.193256f, +-0.212611f,0.956496f,-0.199781f, +-0.0848317f,0.98296f,-0.163073f, +0.159095f,0.98144f,-0.107074f, +0.142493f,0.988352f,-0.0534431f, +-0.0993206f,0.99343f,0.0568515f, +-0.282995f,0.956355f,-0.0727984f, +-0.0511781f,0.994657f,-0.0896605f, +0.128118f,0.991123f,0.0355009f, +0.0178584f,0.998165f,0.057865f, +0.0308308f,0.995199f,0.0928875f, +0.176093f,0.979878f,0.0939732f, +0.250441f,0.967914f,0.0205173f, +0.266597f,0.963616f,0.0192599f, +0.242746f,0.969766f,0.0250589f, +0.198829f,0.979834f,0.0197961f, +0.092758f,0.995177f,0.031931f, +-0.00514037f,0.987257f,0.15905f, +-0.197401f,0.976423f,0.0873538f, +0.0947848f,0.990346f,0.101148f, +0.11003f,0.98867f,0.102099f, +0.0979659f,0.987432f,0.124019f, +-0.288467f,0.943192f,-0.16485f, +-0.465875f,0.798355f,-0.381562f, +-0.320527f,0.848593f,-0.420894f, +-0.189264f,0.880141f,-0.435352f, +-0.0157309f,0.942454f,-0.333965f, +-0.0523924f,0.9528f,-0.299042f, +0.0243535f,0.924362f,-0.38074f, +0.347438f,0.877508f,-0.330555f, +0.339023f,0.92439f,-0.174834f, +0.0111821f,0.998297f,0.0572478f, +-0.344224f,0.932997f,0.105009f, +-0.433099f,0.895278f,0.104414f, +-0.282796f,0.937116f,0.204547f, +-0.130039f,0.982692f,0.131936f, +-0.0814764f,0.996291f,-0.027691f, +-0.0200688f,0.997106f,-0.0733289f, +0.118984f,0.992345f,-0.0330638f, +0.199561f,0.979885f,0.00110984f, +0.153394f,0.986654f,-0.0546216f, +0.176634f,0.980572f,-0.0853107f, +0.13548f,0.982889f,-0.124795f, +0.191838f,0.980855f,0.0334985f, +0.104996f,0.978045f,0.180009f, +0.00782433f,0.923816f,0.382758f, +-0.0895214f,0.848914f,0.520894f, +-0.239967f,0.84054f,0.485703f, +-0.280756f,0.842357f,0.460011f, +-0.207606f,0.901917f,0.378742f, +-0.122486f,0.94404f,0.306245f, +-0.244402f,0.93107f,0.270881f, +-0.292773f,0.891472f,0.345777f, +-0.276286f,0.909624f,0.310243f, +-0.213016f,0.932947f,0.290231f, +-0.0942691f,0.953854f,0.28509f, +-0.0105057f,0.953135f,0.302364f, +0.0307865f,0.936068f,0.35047f, +0.0538732f,0.955717f,0.289315f, +0.209391f,0.949668f,0.232994f, +0.403861f,0.868428f,0.287628f, +0.149382f,0.968969f,0.196936f, +-0.176548f,0.984269f,0.00674917f, +0.0687777f,0.996274f,-0.0520396f, +0.147821f,0.988716f,-0.0242998f, +-0.223164f,0.968308f,-0.112148f, +-0.295488f,0.928787f,-0.2237f, +-0.23574f,0.935973f,-0.261496f, +-0.100501f,0.963432f,-0.248392f, +0.0576299f,0.973773f,-0.220102f, +0.0436147f,0.999029f,-0.00621142f, +-0.153496f,0.982634f,0.104254f, +-0.184805f,0.972589f,0.141133f, +-0.14696f,0.984535f,0.0953571f, +-0.0211774f,0.989717f,0.141466f, +0.0758245f,0.9782f,0.193326f, +0.117048f,0.987762f,0.103083f, +0.217731f,0.97559f,-0.0285914f, +0.270726f,0.959521f,-0.0776314f, +0.230415f,0.971747f,-0.0511441f, +0.234903f,0.971865f,0.0172727f, +0.182122f,0.97948f,0.0863184f, +0.0884364f,0.988499f,0.122674f, +-0.00977715f,0.999042f,0.0426606f, +-0.0304096f,0.999492f,-0.00954367f, +0.200711f,0.957383f,0.207686f, +0.148405f,0.978101f,0.145929f, +0.14921f,0.978785f,0.140417f, +0.0273685f,0.999287f,0.0260052f, +-0.3017f,0.88706f,-0.349431f, +-0.32483f,0.824834f,-0.462746f, +-0.238736f,0.866733f,-0.437926f, +-0.174101f,0.907603f,-0.382029f, +-0.0165261f,0.968715f,-0.247625f, +0.078914f,0.949167f,-0.30472f, +0.287731f,0.926482f,-0.242571f, +0.12793f,0.981688f,-0.141147f, +-0.134026f,0.990975f,-0.00233563f, +-0.342476f,0.939327f,-0.0193419f, +-0.427311f,0.903697f,-0.027138f, +-0.353742f,0.934457f,-0.0407041f, +-0.055135f,0.997815f,0.0363915f, +0.0312575f,0.999385f,0.0158812f, +0.00264454f,0.999634f,-0.0269175f, +0.0835808f,0.996075f,-0.0291308f, +0.150499f,0.987413f,0.0486412f, +0.165157f,0.971811f,0.168246f, +0.215634f,0.960222f,0.177413f, +0.0835282f,0.988765f,0.123967f, +-0.00975779f,0.968408f,0.249181f, +-0.06977f,0.918125f,0.3901f, +-0.139283f,0.878718f,0.456569f, +-0.11373f,0.882765f,0.455842f, +-0.169944f,0.889011f,0.42518f, +-0.209287f,0.894084f,0.395996f, +-0.156853f,0.920873f,0.356917f, +-0.124966f,0.921391f,0.367997f, +-0.29021f,0.888579f,0.355255f, +-0.269725f,0.894676f,0.356094f, +-0.146199f,0.945073f,0.292342f, +-0.175209f,0.971632f,0.15885f, +-0.117718f,0.980316f,0.158504f, +-0.0825429f,0.966227f,0.244116f, +-0.0312586f,0.938703f,0.343308f, +0.145253f,0.922109f,0.358632f, +0.209296f,0.943478f,0.256992f, +0.299421f,0.901575f,0.312265f, +0.248395f,0.88619f,0.39111f, +0.0914055f,0.966416f,0.240179f, +0.127765f,0.989974f,-0.0602251f, +0.140331f,0.988333f,-0.0592086f, +-0.14269f,0.987394f,-0.0685058f, +-0.196659f,0.96924f,-0.147981f, +-0.173702f,0.951221f,-0.254961f, +-0.143754f,0.948468f,-0.282389f, +-0.0849965f,0.99069f,-0.106347f, +-0.164159f,0.984178f,0.0666661f, +-0.232036f,0.961292f,0.148586f, +-0.256871f,0.951713f,0.168109f, +-0.0692891f,0.973705f,0.217018f, +0.083167f,0.991239f,0.102607f, +0.0755656f,0.994003f,-0.07904f, +0.210733f,0.972404f,-0.100116f, +0.30249f,0.937213f,-0.173582f, +0.293071f,0.941554f,-0.166086f, +0.154342f,0.975072f,-0.159414f, +0.102764f,0.994605f,0.0141294f, +0.056079f,0.980415f,0.188792f, +0.109909f,0.955557f,0.273554f, +0.133139f,0.972499f,0.191102f, +0.0554464f,0.995429f,0.0777578f, +0.259868f,0.925249f,0.276374f, +0.196037f,0.949951f,0.243232f, +0.114869f,0.970528f,0.21185f, +0.223665f,0.947755f,0.227452f, +0.0930818f,0.995219f,-0.0295687f, +-0.269847f,0.892223f,-0.362106f, +-0.284642f,0.866853f,-0.409321f, +-0.255009f,0.880625f,-0.399336f, +-0.131932f,0.93993f,-0.314842f, +0.0677192f,0.974824f,-0.212442f, +0.187299f,0.973952f,-0.127815f, +0.0529524f,0.998138f,-0.0302806f, +-0.109006f,0.993972f,0.0117426f, +-0.296161f,0.95278f,-0.067077f, +-0.391399f,0.918205f,-0.0608803f, +-0.369652f,0.920023f,-0.130056f, +-0.175066f,0.983052f,-0.0544101f, +0.0114037f,0.997649f,0.0675687f, +-0.0112147f,0.996664f,0.0808418f, +0.0734363f,0.988721f,0.130533f, +0.0224625f,0.993745f,0.109391f, +0.0118323f,0.985875f,0.167063f, +0.164185f,0.947186f,0.275466f, +0.0854603f,0.916044f,0.391867f, +-0.130673f,0.906994f,0.400358f, +-0.128332f,0.898319f,0.420183f, +-0.0833752f,0.911617f,0.402496f, +-0.0573327f,0.932174f,0.357442f, +-0.17852f,0.926686f,0.330734f, +-0.230606f,0.897072f,0.376939f, +-0.191094f,0.893503f,0.406369f, +-0.142227f,0.886795f,0.439733f, +-0.17679f,0.896492f,0.40626f, +-0.238548f,0.945234f,0.222772f, +-0.0952672f,0.973092f,0.209801f, +-0.096256f,0.964628f,0.245412f, +-0.179685f,0.951666f,0.249087f, +-0.204503f,0.928081f,0.311197f, +-0.0772696f,0.924068f,0.374336f, +0.158946f,0.926358f,0.341463f, +0.256333f,0.910209f,0.325291f, +0.24298f,0.91134f,0.332296f, +0.258464f,0.899993f,0.351011f, +0.335956f,0.897826f,0.28468f, +0.32299f,0.94494f,0.0525965f, +0.125001f,0.99187f,-0.0238687f, +-0.121525f,0.992278f,-0.0248174f, +-0.149564f,0.988264f,-0.0310731f, +-0.0664528f,0.99755f,-0.021853f, +-0.216702f,0.971886f,-0.0920818f, +-0.313688f,0.949511f,-0.0053432f, +-0.230579f,0.964148f,0.131349f, +-0.200205f,0.977444f,0.06724f, +-0.214561f,0.975215f,-0.0540219f, +-0.0751922f,0.988525f,-0.131015f, +0.196994f,0.973692f,-0.114533f, +0.277294f,0.941009f,-0.193932f, +0.227557f,0.901482f,-0.368168f, +0.240964f,0.919471f,-0.31066f, +0.212207f,0.970864f,-0.111317f, +0.0629816f,0.997092f,0.0428958f, +-0.106678f,0.985091f,0.134967f, +-0.0538645f,0.972292f,0.227481f, +0.0800601f,0.969345f,0.232295f, +0.209708f,0.947853f,0.239995f, +0.200719f,0.957631f,0.206531f, +0.262538f,0.945755f,0.191366f, +0.219609f,0.958448f,0.182068f, +0.16942f,0.971857f,0.163679f, +0.226298f,0.968297f,0.105781f, +0.311569f,0.942438f,0.12139f, +0.0252626f,0.999298f,-0.0276703f, +-0.250271f,0.93337f,-0.257262f, +-0.253906f,0.911858f,-0.322563f, +-0.227242f,0.899531f,-0.373102f, +-0.0651757f,0.944171f,-0.322945f, +0.0757455f,0.97969f,-0.185662f, +-0.00346825f,0.999555f,-0.0296364f, +-0.101674f,0.994706f,-0.0148914f, +-0.257112f,0.961591f,-0.0961018f, +-0.383381f,0.91395f,-0.133094f, +-0.376104f,0.917884f,-0.12663f, +-0.286338f,0.956389f,-0.0577212f, +-0.0969792f,0.993405f,0.061176f, +-0.0181638f,0.982944f,0.183006f, +0.0407231f,0.989025f,0.142023f, +0.0858284f,0.987795f,0.129982f, +0.0586048f,0.994197f,0.0902062f, +0.00131743f,0.999561f,0.0296072f, +-0.0615813f,0.973472f,0.220363f, +-0.103673f,0.946783f,0.304719f, +-0.0728984f,0.963065f,0.259214f, +-0.0671535f,0.98356f,0.16763f, +-0.0415144f,0.986558f,0.158053f, +-0.226194f,0.961315f,0.157196f, +-0.322442f,0.916637f,0.236235f, +-0.20303f,0.923357f,0.32587f, +-0.141662f,0.940817f,0.307889f, +-0.0764267f,0.960304f,0.268283f, +-0.0942789f,0.977491f,0.188741f, +-0.142883f,0.973984f,0.175899f, +-0.198273f,0.947542f,0.250702f, +-0.198314f,0.931193f,0.305861f, +-0.212116f,0.938506f,0.272421f, +-0.0469422f,0.977819f,0.204126f, +0.196637f,0.969918f,0.1435f, +0.210661f,0.950426f,0.228718f, +0.210629f,0.90739f,0.363701f, +0.274296f,0.882172f,0.382799f, +0.402024f,0.855402f,0.326595f, +0.442462f,0.866019f,0.232889f, +0.128104f,0.97894f,0.158954f, +-0.10509f,0.973708f,0.202109f, +-0.168744f,0.972176f,0.162479f, +-0.102712f,0.980722f,0.166234f, +-0.117365f,0.985855f,0.119644f, +-0.348177f,0.934585f,-0.0729569f, +-0.249993f,0.967414f,-0.040164f, +-0.059218f,0.996444f,-0.0599467f, +-0.0488698f,0.975685f,-0.21366f, +-0.0228314f,0.943327f,-0.331077f, +0.144917f,0.936565f,-0.319132f, +0.332603f,0.901794f,-0.275938f, +0.285592f,0.906866f,-0.309889f, +0.0349917f,0.981145f,-0.190079f, +-0.0795345f,0.991829f,0.0997459f, +-0.0793233f,0.9451f,0.317009f, +-0.0879959f,0.940679f,0.327688f, +-0.00912821f,0.970457f,0.241099f, +0.124716f,0.982357f,0.13936f, +0.187981f,0.977561f,0.0950669f, +0.255482f,0.951122f,0.173483f, +0.297001f,0.952441f,0.0681659f, +0.265042f,0.961574f,0.0716068f, +0.186715f,0.981446f,0.0436002f, +0.255349f,0.964505f,0.0672885f, +0.267248f,0.96042f,0.078566f, +0.154901f,0.983709f,0.0912232f, +-0.0558054f,0.990723f,-0.123913f, +-0.190326f,0.930089f,-0.314182f, +-0.171804f,0.925365f,-0.337911f, +-0.124574f,0.93618f,-0.328706f, +-0.0782933f,0.960403f,-0.267387f, +-0.15298f,0.970001f,-0.188931f, +-0.0717491f,0.993745f,-0.0855706f, +-0.147047f,0.986451f,-0.0727437f, +-0.378361f,0.919377f,-0.107652f, +-0.386168f,0.917464f,-0.0955771f, +-0.364818f,0.925918f,-0.097894f, +-0.234461f,0.971639f,0.0307667f, +-0.0876095f,0.988677f,0.121826f, +0.151616f,0.984538f,0.0877402f, +0.0730881f,0.996968f,-0.0267174f, +0.0661066f,0.997404f,0.0285557f, +0.00089126f,0.998637f,0.052186f, +-0.169004f,0.978667f,0.116824f, +-0.169994f,0.972188f,0.161096f, +-0.0375438f,0.966292f,0.254695f, +0.0282607f,0.96926f,0.244409f, +0.0134123f,0.993493f,0.113096f, +-0.245106f,0.969303f,-0.0193377f, +-0.4073f,0.913294f,0.000911808f, +-0.297873f,0.952205f,0.0676567f, +-0.106293f,0.976869f,0.185552f, +-0.0629676f,0.97793f,0.199217f, +-0.110366f,0.958688f,0.262177f, +-0.181956f,0.936769f,0.298926f, +-0.212233f,0.945122f,0.248398f, +-0.195256f,0.962306f,0.189318f, +-0.105775f,0.982974f,0.150248f, +0.0268617f,0.999457f,0.0191026f, +0.158413f,0.985011f,0.068261f, +0.0517671f,0.977028f,0.206729f, +0.0576574f,0.95413f,0.293788f, +0.234396f,0.901434f,0.363971f, +0.437391f,0.816127f,0.377659f, +0.504071f,0.803908f,0.315666f, +0.133347f,0.946928f,0.292483f, +-0.151412f,0.933905f,0.323877f, +-0.120106f,0.92207f,0.367915f, +-0.00325057f,0.939171f,0.343435f, +0.0348166f,0.983178f,0.179299f, +-0.135523f,0.990774f,0.00106677f, +-0.269937f,0.929173f,-0.252528f, +-0.0598233f,0.968739f,-0.240761f, +0.0705133f,0.981516f,-0.177915f, +0.0411605f,0.966746f,-0.252403f, +0.126252f,0.944488f,-0.30332f, +0.315542f,0.911296f,-0.264523f, +0.160596f,0.976989f,-0.140362f, +-0.167382f,0.98071f,0.100946f, +-0.298691f,0.934743f,0.192454f, +-0.145935f,0.9608f,0.235724f, +-0.00307512f,0.970287f,0.241936f, +0.110563f,0.982642f,0.148964f, +0.216043f,0.97432f,0.0634533f, +0.143964f,0.986263f,0.0809867f, +0.0914437f,0.980957f,0.17135f, +0.140934f,0.985084f,-0.0987321f, +0.206841f,0.978337f,0.00859891f, +0.190086f,0.979435f,0.0676362f, +0.201515f,0.978077f,0.0525072f, +0.267937f,0.960786f,0.0714189f, +0.246755f,0.968907f,0.0182169f, +0.214715f,0.971106f,-0.104168f, +-0.0180649f,0.956568f,-0.290949f, +-0.219959f,0.899081f,-0.378512f, +-0.191729f,0.921961f,-0.336494f, +-0.106738f,0.947718f,-0.300729f, +-0.152636f,0.943663f,-0.293602f, +-0.224106f,0.947646f,-0.227472f, +-0.228203f,0.973419f,0.019469f, +-0.388401f,0.917519f,0.0854554f, +-0.336148f,0.939599f,0.0644837f, +-0.402605f,0.913568f,-0.0574625f, +-0.305232f,0.952235f,-0.00907982f, +-0.096739f,0.995183f,-0.0159156f, +0.180076f,0.982792f,0.0411394f, +0.136148f,0.986894f,0.0866302f, +0.0219341f,0.999371f,0.0278606f, +-0.0791566f,0.996134f,0.0381004f, +-0.239326f,0.960376f,0.142833f, +-0.218166f,0.951783f,0.215666f, +-0.166214f,0.94168f,0.292596f, +0.0428911f,0.92465f,0.378394f, +0.200943f,0.923885f,0.325667f, +-0.0783125f,0.985711f,0.149132f, +-0.415101f,0.909654f,-0.0148509f, +-0.366356f,0.929766f,0.0363078f, +-0.239727f,0.962799f,0.124698f, +-0.166496f,0.955565f,0.243259f, +-0.200219f,0.921854f,0.331809f, +-0.112297f,0.932828f,0.342375f, +-0.106223f,0.957221f,0.269154f, +-0.127872f,0.96503f,0.228835f, +-0.0138049f,0.984551f,0.174552f, +0.0256733f,0.993774f,0.108417f, +0.00728748f,0.973829f,0.227164f, +-0.00741294f,0.956693f,0.291004f, +0.0683597f,0.974464f,0.213887f, +0.177941f,0.966015f,0.187489f, +0.424978f,0.876377f,0.226619f, +0.505816f,0.827485f,0.243758f, +0.166361f,0.911198f,0.376885f, +-0.17476f,0.913668f,0.366973f, +-0.176728f,0.923512f,0.340431f, +0.0722139f,0.943797f,0.322541f, +0.177366f,0.957288f,0.228344f, +0.0913959f,0.986484f,0.136004f, +-0.0297265f,0.993047f,-0.113903f, +-0.0869422f,0.951911f,-0.293781f, +-0.0450316f,0.952406f,-0.301489f, +0.143119f,0.964298f,-0.222813f, +0.165675f,0.921893f,-0.350237f, +0.164354f,0.949667f,-0.266682f, +-0.039757f,0.998354f,0.0413462f, +-0.291683f,0.947651f,0.12992f, +-0.239728f,0.968947f,0.0605947f, +-0.107127f,0.994229f,0.00574708f, +-0.00468879f,0.997776f,-0.0664969f, +0.179786f,0.983119f,-0.033983f, +0.200209f,0.979349f,-0.0281487f, +0.0601426f,0.997956f,0.0216006f, +-0.0759803f,0.997037f,0.0120005f, +0.14599f,0.98347f,-0.107112f, +0.111543f,0.987674f,-0.109808f, +0.157618f,0.987042f,-0.0300797f, +0.250909f,0.967637f,-0.026879f, +0.281043f,0.956928f,-0.0728269f, +0.296885f,0.954758f,-0.0172396f, +0.276747f,0.960894f,-0.00969537f, +0.102049f,0.992961f,-0.0601211f, +-0.130111f,0.972079f,-0.195279f, +-0.17254f,0.923261f,-0.343248f, +-0.125309f,0.912244f,-0.390012f, +-0.211743f,0.924189f,-0.317868f, +-0.376287f,0.901788f,-0.212569f, +-0.427638f,0.901509f,-0.0663888f, +-0.389415f,0.920624f,0.0283935f, +-0.297925f,0.953877f,0.0368632f, +-0.273734f,0.961504f,0.0240644f, +-0.334113f,0.936286f,-0.108341f, +-0.109536f,0.993721f,-0.0228029f, +0.0288145f,0.999546f,0.00876748f, +0.119784f,0.984043f,0.131571f, +0.0511538f,0.994284f,0.0937163f, +-0.0752276f,0.983313f,0.165639f, +-0.293078f,0.946365f,0.136011f, +-0.332793f,0.935954f,0.115063f, +-0.225106f,0.941939f,0.249154f, +0.0114661f,0.958888f,0.283552f, +0.24485f,0.921506f,0.301455f, +0.100987f,0.953885f,0.282675f, +-0.340266f,0.932035f,0.124616f, +-0.415762f,0.898895f,0.138312f, +-0.325966f,0.925955f,0.190664f, +-0.250966f,0.918836f,0.304559f, +-0.221816f,0.898675f,0.378392f, +-0.0852583f,0.899614f,0.428282f, +-0.0998073f,0.904564f,0.41449f, +-0.102816f,0.885513f,0.453096f, +0.0414724f,0.91382f,0.403996f, +-0.0128006f,0.939036f,0.343581f, +-0.0641104f,0.924175f,0.376551f, +0.0655361f,0.926269f,0.37112f, +0.187467f,0.942186f,0.277743f, +0.21985f,0.965692f,0.138218f, +0.3812f,0.921864f,0.0696633f, +0.433954f,0.878909f,0.197998f, +0.0643484f,0.944154f,0.32316f, +-0.162002f,0.923385f,0.348016f, +-0.0466746f,0.93461f,0.352597f, +0.113297f,0.96975f,0.216212f, +0.268791f,0.938715f,0.215791f, +0.199257f,0.972974f,0.116695f, +0.13591f,0.990721f,-0.000598755f, +0.098836f,0.989317f,-0.107165f, +0.00840194f,0.94937f,-0.314049f, +0.0977197f,0.93606f,-0.337997f, +0.228369f,0.952655f,-0.20074f, +-0.102319f,0.98537f,-0.136295f, +-0.210478f,0.975126f,0.0694824f, +-0.226245f,0.97389f,-0.0187694f, +-0.184535f,0.981701f,-0.0470082f, +-0.0356904f,0.995184f,-0.0912977f, +0.0448449f,0.980059f,-0.193583f, +0.0871766f,0.981936f,-0.167935f, +0.149691f,0.986438f,-0.0673319f, +0.081336f,0.996451f,-0.021693f, +0.0320348f,0.999323f,-0.0181162f, +0.0913657f,0.979354f,-0.180329f, +0.100696f,0.986931f,-0.125808f, +0.108832f,0.988438f,-0.105573f, +0.287509f,0.953f,-0.0955498f, +0.243655f,0.954139f,-0.173927f, +0.160509f,0.983073f,-0.0883436f, +0.264497f,0.963724f,0.0357424f, +0.162998f,0.986545f,0.0127154f, +0.0143391f,0.999851f,0.00965394f, +-0.0125406f,0.999093f,-0.0406807f, +-0.106874f,0.984584f,-0.138462f, +-0.285824f,0.938351f,-0.194429f, +-0.419998f,0.877928f,-0.22988f, +-0.451562f,0.860313f,-0.236545f, +-0.434075f,0.875052f,-0.214154f, +-0.338822f,0.927615f,-0.157258f, +-0.245036f,0.962096f,-0.119701f, +-0.344114f,0.932339f,-0.111035f, +-0.226404f,0.972006f,0.0628119f, +0.0419787f,0.991974f,0.119273f, +0.128473f,0.991295f,0.0288037f, +-0.0257017f,0.999564f,0.0145347f, +-0.185301f,0.952066f,0.243378f, +-0.184541f,0.936895f,0.29694f, +-0.273419f,0.950852f,0.145334f, +-0.319783f,0.945196f,0.0659039f, +-0.035432f,0.98966f,0.138987f, +0.220222f,0.955124f,0.19809f, +0.125192f,0.96286f,0.239224f, +-0.256002f,0.939458f,0.227776f, +-0.448892f,0.878586f,0.163043f, +-0.385115f,0.893165f,0.232256f, +-0.361248f,0.871706f,0.331103f, +-0.291851f,0.846516f,0.445235f, +-0.17348f,0.85884f,0.481973f, +-0.107775f,0.841326f,0.529675f, +-0.0921307f,0.850827f,0.517306f, +0.0950699f,0.836893f,0.539048f, +0.0822562f,0.850572f,0.519385f, +0.00749303f,0.916802f,0.399272f, +0.0761143f,0.966912f,0.243491f, +0.269493f,0.937399f,0.220582f, +0.37073f,0.916186f,0.152194f, +0.358083f,0.929944f,0.083549f, +0.335187f,0.907961f,0.251509f, +0.0578141f,0.947361f,0.314904f, +-0.166707f,0.957873f,0.233855f, +-0.0184246f,0.983369f,0.180682f, +0.167068f,0.976917f,0.13312f, +0.286534f,0.942354f,0.172822f, +0.301062f,0.945554f,0.123648f, +0.228175f,0.972518f,0.0463188f, +0.216797f,0.97484f,-0.0518194f, +0.199106f,0.962895f,-0.18218f, +0.00394531f,0.962307f,-0.271937f, +-0.0105699f,0.99745f,-0.0705888f, +-0.131705f,0.985651f,0.105578f, +-0.19725f,0.980353f,0.00065076f, +-0.141436f,0.988723f,-0.0492296f, +-0.163841f,0.979948f,-0.113394f, +0.0189882f,0.981225f,-0.191928f, +0.0882705f,0.978772f,-0.18497f, +0.0393937f,0.981447f,-0.187645f, +0.0729287f,0.986122f,-0.149146f, +0.0148824f,0.998969f,-0.0428982f, +-0.0177962f,0.999449f,0.0279995f, +-0.0162323f,0.963189f,-0.268333f, +0.00641467f,0.976357f,-0.216067f, +0.107749f,0.98057f,-0.16393f, +0.293413f,0.939289f,-0.177892f, +0.308304f,0.934826f,-0.17621f, +0.101903f,0.952869f,-0.285755f, +0.182917f,0.946528f,-0.265755f, +0.146405f,0.977668f,-0.15077f, +-0.0629734f,0.995858f,-0.0655825f, +-0.0448201f,0.998977f,-0.00597126f, +-0.0400505f,0.999191f,-0.00375744f, +-0.153158f,0.98627f,-0.0617534f, +-0.285484f,0.92871f,-0.236637f, +-0.448842f,0.826713f,-0.339243f, +-0.479202f,0.840256f,-0.253646f, +-0.347296f,0.912974f,-0.214157f, +-0.288381f,0.931416f,-0.222037f, +-0.393139f,0.905395f,-0.160316f, +-0.362299f,0.919254f,-0.153982f, +0.042344f,0.998556f,-0.0330675f, +0.205011f,0.978411f,0.0261187f, +-0.127573f,0.99058f,0.0497635f, +-0.371574f,0.908811f,0.189723f, +-0.216831f,0.928294f,0.302084f, +-0.0703165f,0.93644f,0.343708f, +-0.232099f,0.969924f,0.0733245f, +-0.112472f,0.99344f,-0.0206566f, +0.137846f,0.985164f,0.102232f, +0.0558694f,0.966778f,0.249437f, +-0.236804f,0.911959f,0.335045f, +-0.429918f,0.856338f,0.286105f, +-0.441526f,0.844766f,0.302366f, +-0.455345f,0.82665f,0.330622f, +-0.361376f,0.843549f,0.397281f, +-0.152799f,0.875871f,0.457714f, +-0.118894f,0.891156f,0.437842f, +-0.0896442f,0.897342f,0.432135f, +0.0157836f,0.897193f,0.441356f, +0.112602f,0.854856f,0.5065f, +0.219938f,0.859901f,0.460648f, +0.288065f,0.92641f,0.242451f, +0.293811f,0.955367f,0.0308066f, +0.390529f,0.919592f,0.0428713f, +0.271277f,0.959279f,0.0786938f, +0.217133f,0.949907f,0.22479f, +0.0884504f,0.963513f,0.252624f, +-0.0236259f,0.986232f,0.163669f, +0.0800779f,0.996646f,0.0168362f, +0.165418f,0.984838f,-0.0522657f, +0.249596f,0.968284f,-0.0113122f, +0.338274f,0.940962f,-0.0126639f, +0.305431f,0.950632f,-0.0548703f, +0.294152f,0.946987f,-0.12919f, +0.225417f,0.970184f,-0.0890507f, +-0.00713906f,0.99978f,0.0197001f, +-0.176932f,0.984214f,-0.00420403f, +-0.111846f,0.993652f,0.0120569f, +-0.1391f,0.984895f,-0.103119f, +-0.088794f,0.987668f,-0.128949f, +-0.0465185f,0.96883f,-0.243321f, +0.0250763f,0.955082f,-0.295277f, +0.0363238f,0.977208f,-0.209152f, +0.0515148f,0.981849f,-0.182534f, +-0.0181f,0.986039f,-0.165529f, +-0.1292f,0.991547f,-0.0118974f, +-0.123925f,0.986172f,0.110035f, +0.0445182f,0.949745f,-0.309843f, +-0.00147152f,0.93224f,-0.361838f, +0.114309f,0.919114f,-0.377045f, +0.249456f,0.882365f,-0.399004f, +0.318339f,0.895336f,-0.311503f, +0.245085f,0.904168f,-0.349877f, +0.0939131f,0.907167f,-0.410156f, +-0.0302879f,0.963667f,-0.265383f, +-0.13844f,0.974516f,-0.176503f, +-0.0411687f,0.989896f,-0.135687f, +-0.00628724f,0.990542f,-0.137063f, +-0.112489f,0.976976f,-0.181283f, +-0.1315f,0.967086f,-0.217836f, +-0.376506f,0.872387f,-0.311743f, +-0.531305f,0.793042f,-0.297992f, +-0.39351f,0.883689f,-0.253462f, +-0.336847f,0.927504f,-0.162083f, +-0.393317f,0.917094f,-0.0651222f, +-0.321501f,0.93797f,-0.129808f, +-0.135804f,0.972419f,-0.189625f, +0.0526632f,0.998612f,0.00112608f, +-0.194024f,0.972777f,0.126724f, +-0.436845f,0.883669f,0.168215f, +-0.311688f,0.924669f,0.218719f, +-0.0696464f,0.953993f,0.291628f, +0.0409792f,0.956788f,0.287884f, +-0.0764775f,0.990645f,0.113025f, +-0.0364568f,0.989186f,0.142066f, +-0.121833f,0.946798f,0.297877f, +-0.315082f,0.850341f,0.421476f, +-0.377714f,0.797842f,0.469873f, +-0.420842f,0.786479f,0.452043f, +-0.397492f,0.78965f,0.467389f, +-0.380055f,0.83336f,0.401334f, +-0.183142f,0.896787f,0.402781f, +-0.0888282f,0.916137f,0.3909f, +-0.0940934f,0.935116f,0.34162f, +0.00386799f,0.937503f,0.347956f, +0.10018f,0.944394f,0.313183f, +0.280679f,0.93056f,0.235113f, +0.465087f,0.85876f,0.215002f, +0.41466f,0.904302f,0.101461f, +0.364139f,0.929581f,0.0572809f, +0.242065f,0.968602f,0.0566915f, +0.117842f,0.992149f,0.0418746f, +0.148716f,0.982681f,0.110551f, +0.0959266f,0.995185f,0.0201233f, +0.176327f,0.980433f,-0.0875236f, +0.210189f,0.965141f,-0.155959f, +0.226725f,0.946611f,-0.229181f, +0.330781f,0.920607f,-0.207526f, +0.365923f,0.916599f,-0.161081f, +0.298516f,0.923753f,-0.239936f, +0.0221976f,0.976238f,-0.215559f, +-0.104515f,0.994469f,-0.0104162f, +-0.0427336f,0.998984f,-0.0143091f, +-0.0839971f,0.989572f,-0.117013f, +-0.00725244f,0.993108f,-0.116977f, +-0.0399839f,0.966361f,-0.254064f, +0.00504893f,0.980798f,-0.194961f, +-0.018473f,0.987693f,-0.155309f, +-0.0253738f,0.987423f,-0.15605f, +0.000452807f,0.989468f,-0.144748f, +-0.0811148f,0.995994f,-0.0376225f, +-0.286969f,0.957515f,0.0285449f, +-0.27524f,0.951495f,0.137481f, +0.163018f,0.971572f,-0.171676f, +0.122581f,0.955248f,-0.269212f, +0.130974f,0.917919f,-0.374527f, +0.258812f,0.917892f,-0.300816f, +0.268244f,0.908354f,-0.320839f, +0.223034f,0.911459f,-0.345686f, +0.0389184f,0.957275f,-0.28655f, +-0.140597f,0.964524f,-0.223439f, +-0.145862f,0.970122f,-0.193875f, +-0.104111f,0.974098f,-0.200733f, +-0.0208986f,0.992723f,-0.118595f, +-0.0701237f,0.994147f,-0.08218f, +-0.122604f,0.99062f,-0.0603304f, +-0.259222f,0.963912f,-0.0606481f, +-0.533518f,0.797325f,-0.282189f, +-0.48726f,0.821939f,-0.294948f, +-0.445665f,0.877532f,-0.176975f, +-0.446224f,0.888631f,-0.105925f, +-0.296073f,0.952805f,-0.0671049f, +-0.124475f,0.991773f,-0.0298685f, +-0.112069f,0.99368f,-0.00632266f, +-0.24484f,0.957295f,0.15375f, +-0.472578f,0.869701f,0.142444f, +-0.348902f,0.914252f,0.205937f, +-0.110311f,0.945787f,0.30548f, +-0.00134709f,0.941519f,0.336957f, +0.0293716f,0.928574f,0.369983f, +-0.116225f,0.946895f,0.299803f, +-0.223618f,0.889099f,0.399372f, +-0.413824f,0.817577f,0.400396f, +-0.452277f,0.775981f,0.439658f, +-0.398113f,0.749968f,0.528257f, +-0.374899f,0.784234f,0.494397f, +-0.25264f,0.860337f,0.442712f, +-0.127446f,0.920564f,0.369215f, +-0.018556f,0.935495f,0.352851f, +-0.0323754f,0.965116f,0.259814f, +0.0357851f,0.98547f,0.166039f, +0.195904f,0.976812f,0.0863732f, +0.361612f,0.932271f,0.0103395f, +0.440593f,0.897705f,0.00204446f, +0.433278f,0.895277f,0.103679f, +0.385805f,0.912456f,0.136304f, +0.326244f,0.9426f,0.0712044f, +0.139247f,0.987833f,-0.0692571f, +0.107504f,0.992792f,-0.0529845f, +0.186477f,0.981836f,-0.0349818f, +0.2261f,0.969793f,-0.0915407f, +0.319918f,0.94368f,-0.0843796f, +0.284455f,0.935881f,-0.207877f, +0.26738f,0.950319f,-0.159379f, +0.326413f,0.941309f,-0.085975f, +0.340028f,0.93811f,-0.0657985f, +0.0548427f,0.991972f,-0.113944f, +-0.195067f,0.950504f,-0.241849f, +-0.0282147f,0.982936f,-0.181769f, +-0.0838232f,0.97875f,-0.187144f, +0.0287357f,0.988886f,-0.145871f, +0.0192345f,0.984318f,-0.175351f, +-0.131262f,0.971109f,-0.199292f, +-0.0357158f,0.988874f,-0.144408f, +0.0171216f,0.989641f,-0.142542f, +-0.0610371f,0.990627f,-0.122202f, +-0.174272f,0.984646f,-0.0100664f, +-0.321779f,0.946758f,0.0104107f, +-0.391721f,0.920071f,-0.0049163f, +0.251962f,0.967049f,0.0364793f, +0.286588f,0.95799f,-0.0110494f, +0.190653f,0.96361f,-0.187371f, +0.192921f,0.95146f,-0.239803f, +0.313234f,0.932132f,-0.181696f, +0.220402f,0.968379f,-0.116899f, +0.0241557f,0.995754f,-0.0888337f, +-0.173138f,0.969731f,-0.172177f, +-0.148056f,0.974915f,-0.166191f, +-0.121802f,0.976444f,-0.178104f, +-0.134617f,0.985638f,-0.10196f, +-0.12881f,0.990748f,0.0427476f, +-0.193234f,0.979772f,0.0520324f, +-0.169584f,0.981577f,0.0880205f, +-0.37404f,0.925821f,-0.0543154f, +-0.520547f,0.83989f,-0.153672f, +-0.499517f,0.851003f,-0.162103f, +-0.4353f,0.881523f,-0.182841f, +-0.371568f,0.902946f,-0.21593f, +-0.165948f,0.980792f,-0.10251f, +-0.208618f,0.975931f,-0.0635357f, +-0.355123f,0.932394f,0.0673039f, +-0.461506f,0.884901f,0.0629418f, +-0.443442f,0.893747f,0.0676439f, +-0.18907f,0.971969f,0.139742f, +-0.0546977f,0.978989f,0.19644f, +0.0244551f,0.950588f,0.309492f, +-0.115369f,0.932748f,0.341572f, +-0.31704f,0.862788f,0.393805f, +-0.382907f,0.826411f,0.412829f, +-0.514077f,0.784716f,0.346333f, +-0.482563f,0.790781f,0.37656f, +-0.301253f,0.838125f,0.454745f, +-0.149029f,0.885064f,0.440966f, +-0.0699981f,0.93986f,0.33431f, +0.00541731f,0.96209f,0.272677f, +0.0875381f,0.972016f,0.217994f, +0.185287f,0.977612f,0.0997159f, +0.257792f,0.964794f,-0.0521163f, +0.377486f,0.923846f,-0.0633437f, +0.414459f,0.907288f,-0.071082f, +0.347034f,0.936287f,-0.0541691f, +0.366281f,0.930406f,0.0134975f, +0.42839f,0.903092f,0.0301138f, +0.236883f,0.966501f,-0.0988031f, +0.0750179f,0.986987f,-0.142226f, +0.187793f,0.976018f,-0.110108f, +0.233114f,0.960011f,-0.155038f, +0.295131f,0.944107f,-0.146833f, +0.293935f,0.952937f,-0.0742579f, +0.206131f,0.978459f,-0.0112805f, +0.26541f,0.963541f,0.0338617f, +0.315062f,0.940538f,0.126983f, +0.200639f,0.96888f,0.144968f, +-0.0482349f,0.996749f,-0.0645292f, +-0.0829471f,0.973987f,-0.210875f, +-0.0395681f,0.974449f,-0.221097f, +-0.0327152f,0.953444f,-0.299791f, +0.0198675f,0.970814f,-0.23901f, +-0.0300308f,0.967142f,-0.252456f, +-0.0212823f,0.929856f,-0.367308f, +-0.0806959f,0.938686f,-0.335198f, +-0.165388f,0.976093f,-0.141032f, +-0.248602f,0.968455f,-0.0171025f, +-0.306518f,0.951371f,0.0306604f, +-0.345042f,0.93733f,0.04856f, +0.223548f,0.968386f,-0.110699f, +0.301936f,0.947319f,-0.106873f, +0.333496f,0.936283f,-0.110248f, +0.267715f,0.952143f,-0.147486f, +0.160925f,0.980864f,-0.109589f, +0.106924f,0.990465f,0.086874f, +0.0634847f,0.989163f,0.132389f, +-0.00868593f,0.99995f,-0.00503069f, +-0.137697f,0.961899f,-0.236198f, +-0.140914f,0.964191f,-0.224676f, +-0.263955f,0.951239f,-0.159597f, +-0.23775f,0.971227f,-0.0138849f, +-0.148246f,0.985689f,0.0802536f, +-0.176705f,0.981995f,0.0667941f, +-0.283636f,0.956796f,0.0639697f, +-0.481368f,0.872896f,-0.0796102f, +-0.48359f,0.86775f,-0.114673f, +-0.410361f,0.90546f,-0.10838f, +-0.368916f,0.919839f,-0.133408f, +-0.290849f,0.948818f,-0.123086f, +-0.265473f,0.964116f,-0.001833f, +-0.375668f,0.926391f,0.025952f, +-0.457607f,0.88747f,-0.0547004f, +-0.428989f,0.902388f,-0.0407983f, +-0.246051f,0.968578f,-0.0362744f, +-0.121016f,0.990282f,0.0685327f, +-0.158606f,0.977484f,0.139173f, +-0.181659f,0.932387f,0.312498f, +-0.374645f,0.868516f,0.324533f, +-0.427131f,0.84162f,0.330508f, +-0.473189f,0.797198f,0.374923f, +-0.486417f,0.800363f,0.350452f, +-0.401778f,0.85438f,0.329557f, +-0.142919f,0.913903f,0.379941f, +0.0660554f,0.918312f,0.390308f, +0.107243f,0.947465f,0.301346f, +0.120927f,0.966132f,0.227959f, +0.280478f,0.92581f,0.253394f, +0.365712f,0.921405f,0.131406f, +0.413772f,0.910147f,-0.0206163f, +0.410674f,0.90493f,-0.111572f, +0.355567f,0.932765f,-0.0593443f, +0.345425f,0.933621f,-0.0950402f, +0.397628f,0.912297f,-0.0980078f, +0.290063f,0.956994f,0.00506036f, +0.106586f,0.994174f,-0.016042f, +0.184529f,0.978373f,-0.093465f, +0.32595f,0.937225f,-0.12396f, +0.234333f,0.947332f,-0.218287f, +0.205568f,0.971289f,-0.119751f, +0.183661f,0.977533f,-0.103434f, +0.18646f,0.974485f,-0.124944f, +0.228632f,0.97345f,-0.0111031f, +0.2372f,0.970015f,0.0529807f, +0.150741f,0.988413f,-0.0177775f, +0.0529111f,0.986113f,-0.15742f, +0.0129012f,0.976239f,-0.216311f, +0.0638914f,0.966774f,-0.247521f, +-0.013106f,0.949224f,-0.314329f, +0.00301657f,0.947335f,-0.320229f, +0.0158116f,0.945699f,-0.32466f, +-0.206362f,0.955554f,-0.21055f, +-0.363868f,0.929813f,-0.0551994f, +-0.322459f,0.943841f,0.0720059f, +-0.369143f,0.923823f,0.101411f, +-0.383217f,0.903675f,0.191093f, +0.316947f,0.930379f,-0.184227f, +0.292606f,0.932053f,-0.213681f, +0.281637f,0.95325f,-0.109518f, +0.181192f,0.981727f,-0.0581435f, +0.0846872f,0.996407f,0.000962506f, +-0.00109762f,0.999999f,0.000234158f, +0.0777708f,0.996176f,0.0398008f, +0.205791f,0.978243f,0.0262708f, +0.0568816f,0.985436f,-0.160253f, +-0.183235f,0.956309f,-0.227811f, +-0.306851f,0.928821f,-0.207686f, +-0.348537f,0.918038f,-0.189017f, +-0.243342f,0.965099f,-0.0967916f, +-0.232072f,0.972378f,-0.0249578f, +-0.190489f,0.981246f,0.0294989f, +-0.361119f,0.921084f,-0.145596f, +-0.509056f,0.842731f,-0.175118f, +-0.463553f,0.883903f,-0.0619248f, +-0.339892f,0.940435f,0.00741701f, +-0.334839f,0.939566f,-0.0714062f, +-0.350156f,0.936419f,-0.0225887f, +-0.347741f,0.937357f,0.020947f, +-0.370099f,0.928938f,-0.0100614f, +-0.438593f,0.892875f,-0.102033f, +-0.372504f,0.925425f,-0.0694955f, +-0.205666f,0.969919f,0.130228f, +-0.228734f,0.96522f,0.126612f, +-0.319826f,0.92691f,0.196338f, +-0.371568f,0.883063f,0.286595f, +-0.42486f,0.867995f,0.257059f, +-0.575514f,0.802019f,0.159839f, +-0.477155f,0.843037f,0.248216f, +-0.322215f,0.91617f,0.238347f, +-0.15776f,0.967147f,0.199344f, +0.0563134f,0.972277f,0.226949f, +0.189774f,0.959109f,0.209989f, +0.114773f,0.983426f,0.140357f, +0.195319f,0.960799f,0.196765f, +0.466014f,0.846607f,0.257076f, +0.551779f,0.823036f,0.13473f, +0.451922f,0.891695f,-0.0254353f, +0.295217f,0.951228f,-0.0895088f, +0.39575f,0.916754f,-0.0542532f, +0.335629f,0.937827f,-0.0885088f, +0.163272f,0.984979f,0.0561951f, +0.175225f,0.975709f,0.131485f, +0.276736f,0.960943f,0.00255915f, +0.374077f,0.92611f,-0.0488528f, +0.257806f,0.961501f,-0.0951409f, +0.210674f,0.973483f,-0.0891523f, +0.210996f,0.9611f,-0.178234f, +0.230566f,0.953272f,-0.195223f, +0.113631f,0.949966f,-0.290949f, +0.210906f,0.960561f,-0.181223f, +0.197018f,0.968285f,-0.153646f, +0.117662f,0.979392f,-0.164157f, +0.00452083f,0.974487f,-0.224398f, +0.0685234f,0.976453f,-0.20456f, +0.0486196f,0.979817f,-0.193895f, +-0.041249f,0.985341f,-0.165533f, +-0.0536621f,0.998462f,0.0138937f, +-0.34438f,0.936413f,0.0673216f, +-0.441342f,0.892502f,0.0930463f, +-0.35428f,0.929013f,0.106864f, +-0.394607f,0.91136f,0.117083f, +-0.495153f,0.861045f,0.115868f, +0.317163f,0.930357f,-0.183965f, +0.258032f,0.948579f,-0.183348f, +0.18786f,0.965135f,-0.182274f, +0.168177f,0.970722f,-0.171508f, +0.130487f,0.977884f,-0.163448f, +0.0391868f,0.976408f,-0.212349f, +0.0535243f,0.973465f,-0.222489f, +0.187797f,0.962281f,-0.196843f, +0.12136f,0.981658f,-0.147035f, +-0.157459f,0.973185f,-0.167681f, +-0.281843f,0.941023f,-0.18719f, +-0.339259f,0.910185f,-0.237625f, +-0.312535f,0.920718f,-0.233666f, +-0.266508f,0.952365f,-0.148237f, +-0.190534f,0.974186f,-0.121073f, +-0.276015f,0.959165f,-0.0617859f, +-0.523368f,0.852103f,0.00254573f, +-0.538f,0.84284f,-0.0133122f, +-0.352764f,0.935613f,-0.0136594f, +-0.269435f,0.962844f,-0.0183539f, +-0.350798f,0.93502f,-0.0517468f, +-0.373067f,0.922044f,-0.103225f, +-0.354323f,0.929911f,-0.0985928f, +-0.409705f,0.907488f,-0.0927797f, +-0.42852f,0.900791f,-0.070324f, +-0.329659f,0.944032f,-0.0113329f, +-0.243515f,0.962301f,0.121152f, +-0.341781f,0.918017f,0.201073f, +-0.462572f,0.875527f,0.139571f, +-0.350168f,0.914262f,0.203733f, +-0.49611f,0.864935f,0.0759072f, +-0.527565f,0.849514f,0.000485091f, +-0.337106f,0.940759f,0.0364912f, +-0.159402f,0.986691f,0.0321325f, +0.0661572f,0.997809f,-0.000201698f, +0.185343f,0.982618f,-0.0104608f, +0.145499f,0.981994f,0.120491f, +0.134704f,0.982549f,0.128264f, +0.406275f,0.89759f,0.17109f, +0.586902f,0.779785f,0.217901f, +0.565709f,0.807524f,0.166967f, +0.384632f,0.92307f,-3.36604e-005f, +0.35623f,0.932256f,-0.0632309f, +0.323525f,0.94617f,0.00968274f, +0.0775419f,0.995759f,-0.0495083f, +0.170196f,0.984289f,-0.0470022f, +0.351353f,0.935822f,-0.0280704f, +0.38341f,0.923157f,-0.0278874f, +0.285688f,0.957776f,-0.0323514f, +0.254076f,0.961785f,-0.102057f, +0.271137f,0.936424f,-0.222698f, +0.261266f,0.933845f,-0.24428f, +0.199017f,0.946563f,-0.253793f, +0.0763778f,0.960008f,-0.269355f, +0.131471f,0.985485f,-0.107402f, +0.160318f,0.984539f,-0.0705758f, +0.0961684f,0.977977f,-0.185235f, +0.0245162f,0.963631f,-0.26611f, +-0.0125968f,0.989853f,-0.141538f, +-0.234149f,0.972198f,0.00219358f, +-0.224015f,0.949544f,0.219506f, +-0.294091f,0.928539f,0.226551f, +-0.388903f,0.912184f,0.129128f, +-0.352208f,0.9324f,0.0811158f, +-0.3962f,0.915032f,0.0757807f, +-0.491066f,0.869445f,0.0540404f, +0.157697f,0.961233f,-0.226193f, +0.272083f,0.946677f,-0.172551f, +0.25297f,0.931319f,-0.262015f, +0.179666f,0.941632f,-0.284691f, +0.0998509f,0.952676f,-0.287122f, +0.0337305f,0.95661f,-0.289412f, +0.0669213f,0.956372f,-0.284383f, +0.111493f,0.948222f,-0.297395f, +0.109434f,0.973643f,-0.200107f, +-0.146896f,0.95648f,-0.252126f, +-0.266533f,0.937028f,-0.225695f, +-0.287184f,0.932451f,-0.219226f, +-0.333493f,0.906758f,-0.258015f, +-0.32756f,0.915563f,-0.233343f, +-0.294553f,0.94475f,-0.143827f, +-0.391872f,0.91893f,0.0447686f, +-0.558682f,0.823628f,0.0975275f, +-0.441987f,0.895769f,0.0473795f, +-0.31507f,0.944961f,-0.0882052f, +-0.286026f,0.950757f,-0.119373f, +-0.300544f,0.946699f,-0.115905f, +-0.336723f,0.926445f,-0.168278f, +-0.353572f,0.929204f,-0.107543f, +-0.453641f,0.88906f,-0.0615028f, +-0.438343f,0.898681f,0.0151213f, +-0.388424f,0.921475f,0.00321393f, +-0.409039f,0.909757f,0.0709235f, +-0.363684f,0.905932f,0.216843f, +-0.363969f,0.919331f,0.149522f, +-0.393196f,0.918247f,0.0470974f, +-0.399628f,0.911703f,0.0953624f, +-0.51262f,0.855967f,-0.0673815f, +-0.335242f,0.936382f,-0.103929f, +-0.0973696f,0.981557f,-0.164516f, +0.067792f,0.980923f,-0.182192f, +0.0872383f,0.996018f,-0.0183907f, +-0.00523703f,0.995218f,0.0975357f, +0.128581f,0.983098f,0.130327f, +0.373617f,0.921384f,0.107058f, +0.560261f,0.820373f,0.114439f, +0.627317f,0.771722f,0.104494f, +0.477878f,0.875076f,0.0766505f, +0.339671f,0.937101f,0.080413f, +0.338185f,0.931593f,0.133286f, +0.241006f,0.969638f,0.0414564f, +0.184566f,0.96984f,-0.159206f, +0.299844f,0.937156f,-0.178416f, +0.33645f,0.93097f,-0.14176f, +0.33978f,0.935566f,-0.0962638f, +0.338458f,0.922961f,-0.183273f, +0.376116f,0.905613f,-0.195964f, +0.229101f,0.942068f,-0.244989f, +0.179681f,0.964126f,-0.195387f, +0.0309568f,0.968834f,-0.245768f, +0.00573259f,0.975463f,-0.220088f, +0.156849f,0.977783f,-0.139061f, +0.21782f,0.972525f,-0.0821593f, +0.0218621f,0.99451f,-0.102332f, +-0.198564f,0.980065f,-0.00663249f, +-0.36267f,0.923836f,0.122463f, +-0.30382f,0.935102f,0.182419f, +-0.225949f,0.949998f,0.215522f, +-0.338005f,0.935768f,0.100459f, +-0.329518f,0.942604f,0.0540005f, +-0.353044f,0.9356f,0.00366832f, +-0.46383f,0.880375f,-0.0990046f, +0.265153f,0.963251f,-0.0429098f, +0.322279f,0.944597f,-0.0622248f, +0.315505f,0.945542f,-0.0800488f, +0.163962f,0.974749f,-0.151597f, +0.137337f,0.972433f,-0.188448f, +0.0704319f,0.957822f,-0.278599f, +0.0704671f,0.945462f,-0.318019f, +0.0908986f,0.948607f,-0.303121f, +0.035224f,0.968727f,-0.245614f, +-0.0832465f,0.983302f,-0.161824f, +-0.246429f,0.938519f,-0.241773f, +-0.316726f,0.889326f,-0.329823f, +-0.284897f,0.918994f,-0.272549f, +-0.362325f,0.886545f,-0.287677f, +-0.440048f,0.874713f,-0.203063f, +-0.497142f,0.865956f,-0.0544999f, +-0.523445f,0.849121f,-0.0707108f, +-0.401725f,0.907593f,-0.122034f, +-0.239401f,0.964528f,-0.111235f, +-0.233733f,0.958501f,-0.163231f, +-0.252964f,0.932836f,-0.256566f, +-0.367645f,0.889692f,-0.270713f, +-0.454692f,0.878935f,-0.143978f, +-0.492544f,0.866924f,-0.0764391f, +-0.481959f,0.875013f,-0.0454739f, +-0.427088f,0.903155f,0.0436767f, +-0.414523f,0.900313f,0.132691f, +-0.445145f,0.893064f,0.0654368f, +-0.272596f,0.94477f,0.181937f, +-0.346295f,0.936658f,0.0524542f, +-0.387211f,0.921676f,-0.0241059f, +-0.412405f,0.90305f,-0.120098f, +-0.307707f,0.940243f,-0.145806f, +-0.0608418f,0.995582f,-0.0715164f, +-0.0645131f,0.997917f,-0.000435129f, +-0.102008f,0.988043f,0.115607f, +0.0143588f,0.992143f,0.12428f, +0.177967f,0.984035f,-0.00139713f, +0.41001f,0.908001f,-0.0861781f, +0.552955f,0.819416f,-0.150989f, +0.604866f,0.793986f,-0.061019f, +0.412532f,0.907382f,0.080473f, +0.292095f,0.937176f,0.190737f, +0.30791f,0.927063f,0.213882f, +0.344775f,0.913992f,0.21389f, +0.356481f,0.927786f,0.110156f, +0.364153f,0.931072f,-0.0223179f, +0.345291f,0.930006f,-0.125944f, +0.351321f,0.913987f,-0.20298f, +0.3587f,0.898336f,-0.253627f, +0.30452f,0.930923f,-0.201617f, +0.2074f,0.975489f,-0.0735288f, +0.18932f,0.981882f,-0.00809888f, +0.163933f,0.983471f,-0.0768774f, +0.0155138f,0.975385f,-0.219964f, +0.0271837f,0.983796f,-0.177221f, +0.116676f,0.992898f,-0.0232359f, +-0.0753728f,0.996934f,0.0209924f, +-0.279745f,0.951672f,0.12674f, +-0.364174f,0.921867f,0.132433f, +-0.344523f,0.936581f,0.0641857f, +-0.216332f,0.972578f,0.0853902f, +-0.223892f,0.974436f,0.0186366f, +-0.28965f,0.953049f,-0.0883156f, +-0.269918f,0.95756f,-0.101108f, +-0.286201f,0.950564f,-0.120491f, +0.172976f,0.984286f,-0.0355076f, +0.24194f,0.969981f,0.0245291f, +0.324379f,0.937283f,0.127591f, +0.286811f,0.953171f,0.0959428f, +0.228455f,0.972614f,-0.0427886f, +0.182359f,0.97568f,-0.121631f, +0.113036f,0.971479f,-0.208452f, +0.0547152f,0.964701f,-0.257601f, +-0.089806f,0.977237f,-0.192205f, +-0.171631f,0.984685f,-0.0306458f, +-0.116586f,0.992809f,0.0271681f, +-0.181607f,0.981068f,-0.0672723f, +-0.351307f,0.914748f,-0.199546f, +-0.388005f,0.90325f,-0.183278f, +-0.498044f,0.847159f,-0.185132f, +-0.510366f,0.84434f,-0.163145f, +-0.479522f,0.851128f,-0.213636f, +-0.42037f,0.86671f,-0.268518f, +-0.285469f,0.932257f,-0.22227f, +-0.161107f,0.969121f,-0.186679f, +-0.183754f,0.955302f,-0.231585f, +-0.370817f,0.89935f,-0.231654f, +-0.514998f,0.83014f,-0.213645f, +-0.498206f,0.85286f,-0.156273f, +-0.539513f,0.835182f,-0.106757f, +-0.535773f,0.843208f,0.0441435f, +-0.434698f,0.878206f,0.19948f, +-0.415775f,0.89222f,0.176277f, +-0.35414f,0.920981f,0.162413f, +-0.208366f,0.953013f,0.219884f, +-0.257177f,0.962661f,0.0845243f, +-0.386488f,0.920792f,-0.0526133f, +-0.381213f,0.924327f,0.0172227f, +-0.280093f,0.955497f,0.0925905f, +-0.1219f,0.953555f,0.275451f, +-0.0595691f,0.973079f,0.222641f, +0.124431f,0.978938f,0.161854f, +0.328706f,0.943592f,0.0398269f, +0.495224f,0.863825f,-0.0925162f, +0.549494f,0.832161f,-0.0745945f, +0.445758f,0.890738f,0.0887957f, +0.286029f,0.911685f,0.294987f, +0.236342f,0.90766f,0.346837f, +0.306156f,0.900003f,0.310262f, +0.362522f,0.893707f,0.264322f, +0.407318f,0.891604f,0.197826f, +0.447705f,0.883296f,0.139101f, +0.451832f,0.890524f,0.0530504f, +0.450032f,0.892977f,-0.00796524f, +0.380264f,0.922022f,-0.0726326f, +0.220431f,0.973877f,-0.0545382f, +0.073814f,0.997262f,0.00436123f, +0.143916f,0.987825f,0.059083f, +0.242994f,0.967605f,0.068523f, +0.0793826f,0.995647f,0.0488496f, +-0.0810126f,0.994023f,0.0731786f, +0.0550609f,0.987118f,0.150223f, +-0.0403249f,0.995863f,0.0814341f, +-0.341404f,0.939899f,-0.00574405f, +-0.333197f,0.942331f,0.0315063f, +-0.270492f,0.962353f,-0.0266656f, +-0.217149f,0.973729f,-0.0685481f, +-0.150518f,0.988024f,-0.0339529f, +-0.227799f,0.970772f,-0.0755549f, +-0.30247f,0.950166f,-0.0754703f, +-0.319718f,0.946617f,-0.0411916f, +0.16825f,0.98433f,0.0527868f, +0.196178f,0.978898f,0.0572086f, +0.274186f,0.954613f,0.116347f, +0.32563f,0.930709f,0.166568f, +0.315871f,0.943308f,0.101959f, +0.191037f,0.981318f,-0.0227958f, +0.218135f,0.975914f,0.0029357f, +0.0466483f,0.982299f,-0.18142f, +-0.170175f,0.975305f,-0.140788f, +-0.258133f,0.965917f,0.0192531f, +-0.189679f,0.978131f,0.0853348f, +-0.0936377f,0.967266f,0.235858f, +-0.301926f,0.950003f,0.0795937f, +-0.345647f,0.93835f,0.00528925f, +-0.494118f,0.858314f,-0.138363f, +-0.492927f,0.860507f,-0.128646f, +-0.443878f,0.87267f,-0.203517f, +-0.398442f,0.869961f,-0.290537f, +-0.31747f,0.894846f,-0.313789f, +-0.189431f,0.934926f,-0.300049f, +-0.194231f,0.947861f,-0.252654f, +-0.355627f,0.917296f,-0.179159f, +-0.521351f,0.821848f,-0.229692f, +-0.537173f,0.817848f,-0.206322f, +-0.595314f,0.798098f,-0.0929575f, +-0.612312f,0.785394f,0.0907203f, +-0.484809f,0.839064f,0.246843f, +-0.327417f,0.875762f,0.354737f, +-0.358949f,0.909479f,0.20977f, +-0.221142f,0.943893f,0.245282f, +-0.137619f,0.956208f,0.258316f, +-0.37682f,0.920718f,0.101416f, +-0.393482f,0.900899f,0.183174f, +-0.309483f,0.930699f,0.194988f, +-0.137506f,0.96116f,0.2393f, +-0.0256175f,0.984881f,0.171327f, +0.155024f,0.972933f,0.171372f, +0.40312f,0.907825f,0.115531f, +0.491485f,0.869632f,-0.0467184f, +0.488586f,0.869843f,0.0682392f, +0.313615f,0.910806f,0.268473f, +0.190736f,0.863506f,0.466881f, +0.238952f,0.837112f,0.492083f, +0.344695f,0.840122f,0.418784f, +0.396648f,0.860615f,0.319393f, +0.456384f,0.85928f,0.230981f, +0.487857f,0.863295f,0.129295f, +0.451906f,0.891012f,0.043332f, +0.456211f,0.882737f,0.112455f, +0.397431f,0.910062f,0.117622f, +0.204941f,0.971778f,0.116821f, +0.0877111f,0.985798f,0.143208f, +0.14813f,0.986469f,0.0702648f, +0.212033f,0.976625f,0.035296f, +0.0413914f,0.99116f,0.126047f, +-0.10186f,0.970634f,0.217932f, +0.0558102f,0.971334f,0.231076f, +0.0834757f,0.981533f,0.172117f, +-0.293392f,0.955612f,-0.0269471f, +-0.339064f,0.938377f,-0.0669636f, +-0.232942f,0.969004f,-0.0822698f, +-0.249298f,0.960887f,-0.120613f, +-0.178309f,0.98375f,-0.0210319f, +-0.23671f,0.971566f,0.00516088f, +-0.322203f,0.944986f,0.0564443f, +-0.359276f,0.929551f,0.0827968f, +}; + +btScalar Landscape06Tex[] = { +0.0f,0.0078125f, +0.0f,0.0f, +0.0078125f,0.0078125f, +0.0078125f,0.0f, +0.015625f,0.0078125f, +0.015625f,0.0f, +0.0234375f,0.0078125f, +0.0234375f,0.0f, +0.03125f,0.0078125f, +0.03125f,0.0f, +0.0390625f,0.0078125f, +0.0390625f,0.0f, +0.046875f,0.0078125f, +0.046875f,0.0f, +0.0546875f,0.0078125f, +0.0546875f,0.0f, +0.0625f,0.0078125f, +0.0625f,0.0f, +0.0703125f,0.0078125f, +0.0703125f,0.0f, +0.078125f,0.0078125f, +0.078125f,0.0f, +0.0859375f,0.0078125f, +0.0859375f,0.0f, +0.09375f,0.0078125f, +0.09375f,0.0f, +0.101563f,0.0078125f, +0.101563f,0.0f, +0.109375f,0.0078125f, +0.109375f,0.0f, +0.117188f,0.0078125f, +0.117188f,0.0f, +0.125f,0.0078125f, +0.125f,0.0f, +0.132813f,0.0078125f, +0.132813f,0.0f, +0.140625f,0.0078125f, +0.140625f,0.0f, +0.148438f,0.0078125f, +0.148438f,0.0f, +0.15625f,0.0078125f, +0.15625f,0.0f, +0.164063f,0.0078125f, +0.164063f,0.0f, +0.171875f,0.0078125f, +0.171875f,0.0f, +0.179688f,0.0078125f, +0.179688f,0.0f, +0.1875f,0.0078125f, +0.1875f,0.0f, +0.195313f,0.0078125f, +0.195313f,0.0f, +0.203125f,0.0078125f, +0.203125f,0.0f, +0.210938f,0.0078125f, +0.210938f,0.0f, +0.21875f,0.0078125f, +0.21875f,0.0f, +0.226563f,0.0078125f, +0.226563f,0.0f, +0.234375f,0.0078125f, +0.234375f,0.0f, +0.242188f,0.0078125f, +0.242188f,0.0f, +0.25f,0.0078125f, +0.25f,0.0f, +0.257813f,0.0078125f, +0.257813f,0.0f, +0.265625f,0.0078125f, +0.265625f,0.0f, +0.273438f,0.0078125f, +0.273438f,0.0f, +0.28125f,0.0078125f, +0.28125f,0.0f, +0.289063f,0.0078125f, +0.289063f,0.0f, +0.296875f,0.0078125f, +0.296875f,0.0f, +0.304688f,0.0078125f, +0.304688f,0.0f, +0.3125f,0.0078125f, +0.3125f,0.0f, +0.320313f,0.0078125f, +0.320313f,0.0f, +0.328125f,0.0078125f, +0.328125f,0.0f, +0.335938f,0.0078125f, +0.335938f,0.0f, +0.34375f,0.0078125f, +0.34375f,0.0f, +0.351563f,0.0078125f, +0.351563f,0.0f, +0.359375f,0.0078125f, +0.359375f,0.0f, +0.367188f,0.0078125f, +0.367188f,0.0f, +0.375f,0.0078125f, +0.375f,0.0f, +0.382813f,0.0078125f, +0.382813f,0.0f, +0.390625f,0.0078125f, +0.390625f,0.0f, +0.398438f,0.0078125f, +0.398438f,0.0f, +0.40625f,0.0078125f, +0.40625f,0.0f, +0.414063f,0.0078125f, +0.414063f,0.0f, +0.421875f,0.0078125f, +0.421875f,0.0f, +0.429688f,0.0078125f, +0.429688f,0.0f, +0.4375f,0.0078125f, +0.4375f,0.0f, +0.445313f,0.0078125f, +0.445313f,0.0f, +0.453125f,0.0078125f, +0.453125f,0.0f, +0.460938f,0.0078125f, +0.460938f,0.0f, +0.46875f,0.0078125f, +0.46875f,0.0f, +0.476563f,0.0078125f, +0.476563f,0.0f, +0.484375f,0.0078125f, +0.484375f,0.0f, +0.492188f,0.0078125f, +0.492188f,0.0f, +0.5f,0.0078125f, +0.5f,0.0f, +0.507813f,0.0078125f, +0.507813f,0.0f, +0.0f,0.015625f, +0.0078125f,0.015625f, +0.015625f,0.015625f, +0.0234375f,0.015625f, +0.03125f,0.015625f, +0.0390625f,0.015625f, +0.046875f,0.015625f, +0.0546875f,0.015625f, +0.0625f,0.015625f, +0.0703125f,0.015625f, +0.078125f,0.015625f, +0.0859375f,0.015625f, +0.09375f,0.015625f, +0.101563f,0.015625f, +0.109375f,0.015625f, +0.117188f,0.015625f, +0.125f,0.015625f, +0.132813f,0.015625f, +0.140625f,0.015625f, +0.148438f,0.015625f, +0.15625f,0.015625f, +0.164063f,0.015625f, +0.171875f,0.015625f, +0.179688f,0.015625f, +0.1875f,0.015625f, +0.195313f,0.015625f, +0.203125f,0.015625f, +0.210938f,0.015625f, +0.21875f,0.015625f, +0.226563f,0.015625f, +0.234375f,0.015625f, +0.242188f,0.015625f, +0.25f,0.015625f, +0.257813f,0.015625f, +0.265625f,0.015625f, +0.273438f,0.015625f, +0.28125f,0.015625f, +0.289063f,0.015625f, +0.296875f,0.015625f, +0.304688f,0.015625f, +0.3125f,0.015625f, +0.320313f,0.015625f, +0.328125f,0.015625f, +0.335938f,0.015625f, +0.34375f,0.015625f, +0.351563f,0.015625f, +0.359375f,0.015625f, +0.367188f,0.015625f, +0.375f,0.015625f, +0.382813f,0.015625f, +0.390625f,0.015625f, +0.398438f,0.015625f, +0.40625f,0.015625f, +0.414063f,0.015625f, +0.421875f,0.015625f, +0.429688f,0.015625f, +0.4375f,0.015625f, +0.445313f,0.015625f, +0.453125f,0.015625f, +0.460938f,0.015625f, +0.46875f,0.015625f, +0.476563f,0.015625f, +0.484375f,0.015625f, +0.492188f,0.015625f, +0.5f,0.015625f, +0.507813f,0.015625f, +0.0f,0.0234375f, +0.0078125f,0.0234375f, +0.015625f,0.0234375f, +0.0234375f,0.0234375f, +0.03125f,0.0234375f, +0.0390625f,0.0234375f, +0.046875f,0.0234375f, +0.0546875f,0.0234375f, +0.0625f,0.0234375f, +0.0703125f,0.0234375f, +0.078125f,0.0234375f, +0.0859375f,0.0234375f, +0.09375f,0.0234375f, +0.101563f,0.0234375f, +0.109375f,0.0234375f, +0.117188f,0.0234375f, +0.125f,0.0234375f, +0.132813f,0.0234375f, +0.140625f,0.0234375f, +0.148438f,0.0234375f, +0.15625f,0.0234375f, +0.164063f,0.0234375f, +0.171875f,0.0234375f, +0.179688f,0.0234375f, +0.1875f,0.0234375f, +0.195313f,0.0234375f, +0.203125f,0.0234375f, +0.210938f,0.0234375f, +0.21875f,0.0234375f, +0.226563f,0.0234375f, +0.234375f,0.0234375f, +0.242188f,0.0234375f, +0.25f,0.0234375f, +0.257813f,0.0234375f, +0.265625f,0.0234375f, +0.273438f,0.0234375f, +0.28125f,0.0234375f, +0.289063f,0.0234375f, +0.296875f,0.0234375f, +0.304688f,0.0234375f, +0.3125f,0.0234375f, +0.320313f,0.0234375f, +0.328125f,0.0234375f, +0.335938f,0.0234375f, +0.34375f,0.0234375f, +0.351563f,0.0234375f, +0.359375f,0.0234375f, +0.367188f,0.0234375f, +0.375f,0.0234375f, +0.382813f,0.0234375f, +0.390625f,0.0234375f, +0.398438f,0.0234375f, +0.40625f,0.0234375f, +0.414063f,0.0234375f, +0.421875f,0.0234375f, +0.429688f,0.0234375f, +0.4375f,0.0234375f, +0.445313f,0.0234375f, +0.453125f,0.0234375f, +0.460938f,0.0234375f, +0.46875f,0.0234375f, +0.476563f,0.0234375f, +0.484375f,0.0234375f, +0.492188f,0.0234375f, +0.5f,0.0234375f, +0.507813f,0.0234375f, +0.0f,0.03125f, +0.0078125f,0.03125f, +0.015625f,0.03125f, +0.0234375f,0.03125f, +0.03125f,0.03125f, +0.0390625f,0.03125f, +0.046875f,0.03125f, +0.0546875f,0.03125f, +0.0625f,0.03125f, +0.0703125f,0.03125f, +0.078125f,0.03125f, +0.0859375f,0.03125f, +0.09375f,0.03125f, +0.101563f,0.03125f, +0.109375f,0.03125f, +0.117188f,0.03125f, +0.125f,0.03125f, +0.132813f,0.03125f, +0.140625f,0.03125f, +0.148438f,0.03125f, +0.15625f,0.03125f, +0.164063f,0.03125f, +0.171875f,0.03125f, +0.179688f,0.03125f, +0.1875f,0.03125f, +0.195313f,0.03125f, +0.203125f,0.03125f, +0.210938f,0.03125f, +0.21875f,0.03125f, +0.226563f,0.03125f, +0.234375f,0.03125f, +0.242188f,0.03125f, +0.25f,0.03125f, +0.257813f,0.03125f, +0.265625f,0.03125f, +0.273438f,0.03125f, +0.28125f,0.03125f, +0.289063f,0.03125f, +0.296875f,0.03125f, +0.304688f,0.03125f, +0.3125f,0.03125f, +0.320313f,0.03125f, +0.328125f,0.03125f, +0.335938f,0.03125f, +0.34375f,0.03125f, +0.351563f,0.03125f, +0.359375f,0.03125f, +0.367188f,0.03125f, +0.375f,0.03125f, +0.382813f,0.03125f, +0.390625f,0.03125f, +0.398438f,0.03125f, +0.40625f,0.03125f, +0.414063f,0.03125f, +0.421875f,0.03125f, +0.429688f,0.03125f, +0.4375f,0.03125f, +0.445313f,0.03125f, +0.453125f,0.03125f, +0.460938f,0.03125f, +0.46875f,0.03125f, +0.476563f,0.03125f, +0.484375f,0.03125f, +0.492188f,0.03125f, +0.5f,0.03125f, +0.507813f,0.03125f, +0.0f,0.0390625f, +0.0078125f,0.0390625f, +0.015625f,0.0390625f, +0.0234375f,0.0390625f, +0.03125f,0.0390625f, +0.0390625f,0.0390625f, +0.046875f,0.0390625f, +0.0546875f,0.0390625f, +0.0625f,0.0390625f, +0.0703125f,0.0390625f, +0.078125f,0.0390625f, +0.0859375f,0.0390625f, +0.09375f,0.0390625f, +0.101563f,0.0390625f, +0.109375f,0.0390625f, +0.117188f,0.0390625f, +0.125f,0.0390625f, +0.132813f,0.0390625f, +0.140625f,0.0390625f, +0.148438f,0.0390625f, +0.15625f,0.0390625f, +0.164063f,0.0390625f, +0.171875f,0.0390625f, +0.179688f,0.0390625f, +0.1875f,0.0390625f, +0.195313f,0.0390625f, +0.203125f,0.0390625f, +0.210938f,0.0390625f, +0.21875f,0.0390625f, +0.226563f,0.0390625f, +0.234375f,0.0390625f, +0.242188f,0.0390625f, +0.25f,0.0390625f, +0.257813f,0.0390625f, +0.265625f,0.0390625f, +0.273438f,0.0390625f, +0.28125f,0.0390625f, +0.289063f,0.0390625f, +0.296875f,0.0390625f, +0.304688f,0.0390625f, +0.3125f,0.0390625f, +0.320313f,0.0390625f, +0.328125f,0.0390625f, +0.335938f,0.0390625f, +0.34375f,0.0390625f, +0.351563f,0.0390625f, +0.359375f,0.0390625f, +0.367188f,0.0390625f, +0.375f,0.0390625f, +0.382813f,0.0390625f, +0.390625f,0.0390625f, +0.398438f,0.0390625f, +0.40625f,0.0390625f, +0.414063f,0.0390625f, +0.421875f,0.0390625f, +0.429688f,0.0390625f, +0.4375f,0.0390625f, +0.445313f,0.0390625f, +0.453125f,0.0390625f, +0.460938f,0.0390625f, +0.46875f,0.0390625f, +0.476563f,0.0390625f, +0.484375f,0.0390625f, +0.492188f,0.0390625f, +0.5f,0.0390625f, +0.507813f,0.0390625f, +0.0f,0.046875f, +0.0078125f,0.046875f, +0.015625f,0.046875f, +0.0234375f,0.046875f, +0.03125f,0.046875f, +0.0390625f,0.046875f, +0.046875f,0.046875f, +0.0546875f,0.046875f, +0.0625f,0.046875f, +0.0703125f,0.046875f, +0.078125f,0.046875f, +0.0859375f,0.046875f, +0.09375f,0.046875f, +0.101563f,0.046875f, +0.109375f,0.046875f, +0.117188f,0.046875f, +0.125f,0.046875f, +0.132813f,0.046875f, +0.140625f,0.046875f, +0.148438f,0.046875f, +0.15625f,0.046875f, +0.164063f,0.046875f, +0.171875f,0.046875f, +0.179688f,0.046875f, +0.1875f,0.046875f, +0.195313f,0.046875f, +0.203125f,0.046875f, +0.210938f,0.046875f, +0.21875f,0.046875f, +0.226563f,0.046875f, +0.234375f,0.046875f, +0.242188f,0.046875f, +0.25f,0.046875f, +0.257813f,0.046875f, +0.265625f,0.046875f, +0.273438f,0.046875f, +0.28125f,0.046875f, +0.289063f,0.046875f, +0.296875f,0.046875f, +0.304688f,0.046875f, +0.3125f,0.046875f, +0.320313f,0.046875f, +0.328125f,0.046875f, +0.335938f,0.046875f, +0.34375f,0.046875f, +0.351563f,0.046875f, +0.359375f,0.046875f, +0.367188f,0.046875f, +0.375f,0.046875f, +0.382813f,0.046875f, +0.390625f,0.046875f, +0.398438f,0.046875f, +0.40625f,0.046875f, +0.414063f,0.046875f, +0.421875f,0.046875f, +0.429688f,0.046875f, +0.4375f,0.046875f, +0.445313f,0.046875f, +0.453125f,0.046875f, +0.460938f,0.046875f, +0.46875f,0.046875f, +0.476563f,0.046875f, +0.484375f,0.046875f, +0.492188f,0.046875f, +0.5f,0.046875f, +0.507813f,0.046875f, +0.0f,0.0546875f, +0.0078125f,0.0546875f, +0.015625f,0.0546875f, +0.0234375f,0.0546875f, +0.03125f,0.0546875f, +0.0390625f,0.0546875f, +0.046875f,0.0546875f, +0.0546875f,0.0546875f, +0.0625f,0.0546875f, +0.0703125f,0.0546875f, +0.078125f,0.0546875f, +0.0859375f,0.0546875f, +0.09375f,0.0546875f, +0.101563f,0.0546875f, +0.109375f,0.0546875f, +0.117188f,0.0546875f, +0.125f,0.0546875f, +0.132813f,0.0546875f, +0.140625f,0.0546875f, +0.148438f,0.0546875f, +0.15625f,0.0546875f, +0.164063f,0.0546875f, +0.171875f,0.0546875f, +0.179688f,0.0546875f, +0.1875f,0.0546875f, +0.195313f,0.0546875f, +0.203125f,0.0546875f, +0.210938f,0.0546875f, +0.21875f,0.0546875f, +0.226563f,0.0546875f, +0.234375f,0.0546875f, +0.242188f,0.0546875f, +0.25f,0.0546875f, +0.257813f,0.0546875f, +0.265625f,0.0546875f, +0.273438f,0.0546875f, +0.28125f,0.0546875f, +0.289063f,0.0546875f, +0.296875f,0.0546875f, +0.304688f,0.0546875f, +0.3125f,0.0546875f, +0.320313f,0.0546875f, +0.328125f,0.0546875f, +0.335938f,0.0546875f, +0.34375f,0.0546875f, +0.351563f,0.0546875f, +0.359375f,0.0546875f, +0.367188f,0.0546875f, +0.375f,0.0546875f, +0.382813f,0.0546875f, +0.390625f,0.0546875f, +0.398438f,0.0546875f, +0.40625f,0.0546875f, +0.414063f,0.0546875f, +0.421875f,0.0546875f, +0.429688f,0.0546875f, +0.4375f,0.0546875f, +0.445313f,0.0546875f, +0.453125f,0.0546875f, +0.460938f,0.0546875f, +0.46875f,0.0546875f, +0.476563f,0.0546875f, +0.484375f,0.0546875f, +0.492188f,0.0546875f, +0.5f,0.0546875f, +0.507813f,0.0546875f, +0.0f,0.0625f, +0.0078125f,0.0625f, +0.015625f,0.0625f, +0.0234375f,0.0625f, +0.03125f,0.0625f, +0.0390625f,0.0625f, +0.046875f,0.0625f, +0.0546875f,0.0625f, +0.0625f,0.0625f, +0.0703125f,0.0625f, +0.078125f,0.0625f, +0.0859375f,0.0625f, +0.09375f,0.0625f, +0.101563f,0.0625f, +0.109375f,0.0625f, +0.117188f,0.0625f, +0.125f,0.0625f, +0.132813f,0.0625f, +0.140625f,0.0625f, +0.148438f,0.0625f, +0.15625f,0.0625f, +0.164063f,0.0625f, +0.171875f,0.0625f, +0.179688f,0.0625f, +0.1875f,0.0625f, +0.195313f,0.0625f, +0.203125f,0.0625f, +0.210938f,0.0625f, +0.21875f,0.0625f, +0.226563f,0.0625f, +0.234375f,0.0625f, +0.242188f,0.0625f, +0.25f,0.0625f, +0.257813f,0.0625f, +0.265625f,0.0625f, +0.273438f,0.0625f, +0.28125f,0.0625f, +0.289063f,0.0625f, +0.296875f,0.0625f, +0.304688f,0.0625f, +0.3125f,0.0625f, +0.320313f,0.0625f, +0.328125f,0.0625f, +0.335938f,0.0625f, +0.34375f,0.0625f, +0.351563f,0.0625f, +0.359375f,0.0625f, +0.367188f,0.0625f, +0.375f,0.0625f, +0.382813f,0.0625f, +0.390625f,0.0625f, +0.398438f,0.0625f, +0.40625f,0.0625f, +0.414063f,0.0625f, +0.421875f,0.0625f, +0.429688f,0.0625f, +0.4375f,0.0625f, +0.445313f,0.0625f, +0.453125f,0.0625f, +0.460938f,0.0625f, +0.46875f,0.0625f, +0.476563f,0.0625f, +0.484375f,0.0625f, +0.492188f,0.0625f, +0.5f,0.0625f, +0.507813f,0.0625f, +0.0f,0.0703125f, +0.0078125f,0.0703125f, +0.015625f,0.0703125f, +0.0234375f,0.0703125f, +0.03125f,0.0703125f, +0.0390625f,0.0703125f, +0.046875f,0.0703125f, +0.0546875f,0.0703125f, +0.0625f,0.0703125f, +0.0703125f,0.0703125f, +0.078125f,0.0703125f, +0.0859375f,0.0703125f, +0.09375f,0.0703125f, +0.101563f,0.0703125f, +0.109375f,0.0703125f, +0.117188f,0.0703125f, +0.125f,0.0703125f, +0.132813f,0.0703125f, +0.140625f,0.0703125f, +0.148438f,0.0703125f, +0.15625f,0.0703125f, +0.164063f,0.0703125f, +0.171875f,0.0703125f, +0.179688f,0.0703125f, +0.1875f,0.0703125f, +0.195313f,0.0703125f, +0.203125f,0.0703125f, +0.210938f,0.0703125f, +0.21875f,0.0703125f, +0.226563f,0.0703125f, +0.234375f,0.0703125f, +0.242188f,0.0703125f, +0.25f,0.0703125f, +0.257813f,0.0703125f, +0.265625f,0.0703125f, +0.273438f,0.0703125f, +0.28125f,0.0703125f, +0.289063f,0.0703125f, +0.296875f,0.0703125f, +0.304688f,0.0703125f, +0.3125f,0.0703125f, +0.320313f,0.0703125f, +0.328125f,0.0703125f, +0.335938f,0.0703125f, +0.34375f,0.0703125f, +0.351563f,0.0703125f, +0.359375f,0.0703125f, +0.367188f,0.0703125f, +0.375f,0.0703125f, +0.382813f,0.0703125f, +0.390625f,0.0703125f, +0.398438f,0.0703125f, +0.40625f,0.0703125f, +0.414063f,0.0703125f, +0.421875f,0.0703125f, +0.429688f,0.0703125f, +0.4375f,0.0703125f, +0.445313f,0.0703125f, +0.453125f,0.0703125f, +0.460938f,0.0703125f, +0.46875f,0.0703125f, +0.476563f,0.0703125f, +0.484375f,0.0703125f, +0.492188f,0.0703125f, +0.5f,0.0703125f, +0.507813f,0.0703125f, +0.0f,0.078125f, +0.0078125f,0.078125f, +0.015625f,0.078125f, +0.0234375f,0.078125f, +0.03125f,0.078125f, +0.0390625f,0.078125f, +0.046875f,0.078125f, +0.0546875f,0.078125f, +0.0625f,0.078125f, +0.0703125f,0.078125f, +0.078125f,0.078125f, +0.0859375f,0.078125f, +0.09375f,0.078125f, +0.101563f,0.078125f, +0.109375f,0.078125f, +0.117188f,0.078125f, +0.125f,0.078125f, +0.132813f,0.078125f, +0.140625f,0.078125f, +0.148438f,0.078125f, +0.15625f,0.078125f, +0.164063f,0.078125f, +0.171875f,0.078125f, +0.179688f,0.078125f, +0.1875f,0.078125f, +0.195313f,0.078125f, +0.203125f,0.078125f, +0.210938f,0.078125f, +0.21875f,0.078125f, +0.226563f,0.078125f, +0.234375f,0.078125f, +0.242188f,0.078125f, +0.25f,0.078125f, +0.257813f,0.078125f, +0.265625f,0.078125f, +0.273438f,0.078125f, +0.28125f,0.078125f, +0.289063f,0.078125f, +0.296875f,0.078125f, +0.304688f,0.078125f, +0.3125f,0.078125f, +0.320313f,0.078125f, +0.328125f,0.078125f, +0.335938f,0.078125f, +0.34375f,0.078125f, +0.351563f,0.078125f, +0.359375f,0.078125f, +0.367188f,0.078125f, +0.375f,0.078125f, +0.382813f,0.078125f, +0.390625f,0.078125f, +0.398438f,0.078125f, +0.40625f,0.078125f, +0.414063f,0.078125f, +0.421875f,0.078125f, +0.429688f,0.078125f, +0.4375f,0.078125f, +0.445313f,0.078125f, +0.453125f,0.078125f, +0.460938f,0.078125f, +0.46875f,0.078125f, +0.476563f,0.078125f, +0.484375f,0.078125f, +0.492188f,0.078125f, +0.5f,0.078125f, +0.507813f,0.078125f, +0.0f,0.0859375f, +0.0078125f,0.0859375f, +0.015625f,0.0859375f, +0.0234375f,0.0859375f, +0.03125f,0.0859375f, +0.0390625f,0.0859375f, +0.046875f,0.0859375f, +0.0546875f,0.0859375f, +0.0625f,0.0859375f, +0.0703125f,0.0859375f, +0.078125f,0.0859375f, +0.0859375f,0.0859375f, +0.09375f,0.0859375f, +0.101563f,0.0859375f, +0.109375f,0.0859375f, +0.117188f,0.0859375f, +0.125f,0.0859375f, +0.132813f,0.0859375f, +0.140625f,0.0859375f, +0.148438f,0.0859375f, +0.15625f,0.0859375f, +0.164063f,0.0859375f, +0.171875f,0.0859375f, +0.179688f,0.0859375f, +0.1875f,0.0859375f, +0.195313f,0.0859375f, +0.203125f,0.0859375f, +0.210938f,0.0859375f, +0.21875f,0.0859375f, +0.226563f,0.0859375f, +0.234375f,0.0859375f, +0.242188f,0.0859375f, +0.25f,0.0859375f, +0.257813f,0.0859375f, +0.265625f,0.0859375f, +0.273438f,0.0859375f, +0.28125f,0.0859375f, +0.289063f,0.0859375f, +0.296875f,0.0859375f, +0.304688f,0.0859375f, +0.3125f,0.0859375f, +0.320313f,0.0859375f, +0.328125f,0.0859375f, +0.335938f,0.0859375f, +0.34375f,0.0859375f, +0.351563f,0.0859375f, +0.359375f,0.0859375f, +0.367188f,0.0859375f, +0.375f,0.0859375f, +0.382813f,0.0859375f, +0.390625f,0.0859375f, +0.398438f,0.0859375f, +0.40625f,0.0859375f, +0.414063f,0.0859375f, +0.421875f,0.0859375f, +0.429688f,0.0859375f, +0.4375f,0.0859375f, +0.445313f,0.0859375f, +0.453125f,0.0859375f, +0.460938f,0.0859375f, +0.46875f,0.0859375f, +0.476563f,0.0859375f, +0.484375f,0.0859375f, +0.492188f,0.0859375f, +0.5f,0.0859375f, +0.507813f,0.0859375f, +0.0f,0.09375f, +0.0078125f,0.09375f, +0.015625f,0.09375f, +0.0234375f,0.09375f, +0.03125f,0.09375f, +0.0390625f,0.09375f, +0.046875f,0.09375f, +0.0546875f,0.09375f, +0.0625f,0.09375f, +0.0703125f,0.09375f, +0.078125f,0.09375f, +0.0859375f,0.09375f, +0.09375f,0.09375f, +0.101563f,0.09375f, +0.109375f,0.09375f, +0.117188f,0.09375f, +0.125f,0.09375f, +0.132813f,0.09375f, +0.140625f,0.09375f, +0.148438f,0.09375f, +0.15625f,0.09375f, +0.164063f,0.09375f, +0.171875f,0.09375f, +0.179688f,0.09375f, +0.1875f,0.09375f, +0.195313f,0.09375f, +0.203125f,0.09375f, +0.210938f,0.09375f, +0.21875f,0.09375f, +0.226563f,0.09375f, +0.234375f,0.09375f, +0.242188f,0.09375f, +0.25f,0.09375f, +0.257813f,0.09375f, +0.265625f,0.09375f, +0.273438f,0.09375f, +0.28125f,0.09375f, +0.289063f,0.09375f, +0.296875f,0.09375f, +0.304688f,0.09375f, +0.3125f,0.09375f, +0.320313f,0.09375f, +0.328125f,0.09375f, +0.335938f,0.09375f, +0.34375f,0.09375f, +0.351563f,0.09375f, +0.359375f,0.09375f, +0.367188f,0.09375f, +0.375f,0.09375f, +0.382813f,0.09375f, +0.390625f,0.09375f, +0.398438f,0.09375f, +0.40625f,0.09375f, +0.414063f,0.09375f, +0.421875f,0.09375f, +0.429688f,0.09375f, +0.4375f,0.09375f, +0.445313f,0.09375f, +0.453125f,0.09375f, +0.460938f,0.09375f, +0.46875f,0.09375f, +0.476563f,0.09375f, +0.484375f,0.09375f, +0.492188f,0.09375f, +0.5f,0.09375f, +0.507813f,0.09375f, +0.0f,0.101563f, +0.0078125f,0.101563f, +0.015625f,0.101563f, +0.0234375f,0.101563f, +0.03125f,0.101563f, +0.0390625f,0.101563f, +0.046875f,0.101563f, +0.0546875f,0.101563f, +0.0625f,0.101563f, +0.0703125f,0.101563f, +0.078125f,0.101563f, +0.0859375f,0.101563f, +0.09375f,0.101563f, +0.101563f,0.101563f, +0.109375f,0.101563f, +0.117188f,0.101563f, +0.125f,0.101563f, +0.132813f,0.101563f, +0.140625f,0.101563f, +0.148438f,0.101563f, +0.15625f,0.101563f, +0.164063f,0.101563f, +0.171875f,0.101563f, +0.179688f,0.101563f, +0.1875f,0.101563f, +0.195313f,0.101563f, +0.203125f,0.101563f, +0.210938f,0.101563f, +0.21875f,0.101563f, +0.226563f,0.101563f, +0.234375f,0.101563f, +0.242188f,0.101563f, +0.25f,0.101563f, +0.257813f,0.101563f, +0.265625f,0.101563f, +0.273438f,0.101563f, +0.28125f,0.101563f, +0.289063f,0.101563f, +0.296875f,0.101563f, +0.304688f,0.101563f, +0.3125f,0.101563f, +0.320313f,0.101563f, +0.328125f,0.101563f, +0.335938f,0.101563f, +0.34375f,0.101563f, +0.351563f,0.101563f, +0.359375f,0.101563f, +0.367188f,0.101563f, +0.375f,0.101563f, +0.382813f,0.101563f, +0.390625f,0.101563f, +0.398438f,0.101563f, +0.40625f,0.101563f, +0.414063f,0.101563f, +0.421875f,0.101563f, +0.429688f,0.101563f, +0.4375f,0.101563f, +0.445313f,0.101563f, +0.453125f,0.101563f, +0.460938f,0.101563f, +0.46875f,0.101563f, +0.476563f,0.101563f, +0.484375f,0.101563f, +0.492188f,0.101563f, +0.5f,0.101563f, +0.507813f,0.101563f, +0.0f,0.109375f, +0.0078125f,0.109375f, +0.015625f,0.109375f, +0.0234375f,0.109375f, +0.03125f,0.109375f, +0.0390625f,0.109375f, +0.046875f,0.109375f, +0.0546875f,0.109375f, +0.0625f,0.109375f, +0.0703125f,0.109375f, +0.078125f,0.109375f, +0.0859375f,0.109375f, +0.09375f,0.109375f, +0.101563f,0.109375f, +0.109375f,0.109375f, +0.117188f,0.109375f, +0.125f,0.109375f, +0.132813f,0.109375f, +0.140625f,0.109375f, +0.148438f,0.109375f, +0.15625f,0.109375f, +0.164063f,0.109375f, +0.171875f,0.109375f, +0.179688f,0.109375f, +0.1875f,0.109375f, +0.195313f,0.109375f, +0.203125f,0.109375f, +0.210938f,0.109375f, +0.21875f,0.109375f, +0.226563f,0.109375f, +0.234375f,0.109375f, +0.242188f,0.109375f, +0.25f,0.109375f, +0.257813f,0.109375f, +0.265625f,0.109375f, +0.273438f,0.109375f, +0.28125f,0.109375f, +0.289063f,0.109375f, +0.296875f,0.109375f, +0.304688f,0.109375f, +0.3125f,0.109375f, +0.320313f,0.109375f, +0.328125f,0.109375f, +0.335938f,0.109375f, +0.34375f,0.109375f, +0.351563f,0.109375f, +0.359375f,0.109375f, +0.367188f,0.109375f, +0.375f,0.109375f, +0.382813f,0.109375f, +0.390625f,0.109375f, +0.398438f,0.109375f, +0.40625f,0.109375f, +0.414063f,0.109375f, +0.421875f,0.109375f, +0.429688f,0.109375f, +0.4375f,0.109375f, +0.445313f,0.109375f, +0.453125f,0.109375f, +0.460938f,0.109375f, +0.46875f,0.109375f, +0.476563f,0.109375f, +0.484375f,0.109375f, +0.492188f,0.109375f, +0.5f,0.109375f, +0.507813f,0.109375f, +0.0f,0.117188f, +0.0078125f,0.117188f, +0.015625f,0.117188f, +0.0234375f,0.117188f, +0.03125f,0.117188f, +0.0390625f,0.117188f, +0.046875f,0.117188f, +0.0546875f,0.117188f, +0.0625f,0.117188f, +0.0703125f,0.117188f, +0.078125f,0.117188f, +0.0859375f,0.117188f, +0.09375f,0.117188f, +0.101563f,0.117188f, +0.109375f,0.117188f, +0.117188f,0.117188f, +0.125f,0.117188f, +0.132813f,0.117188f, +0.140625f,0.117188f, +0.148438f,0.117188f, +0.15625f,0.117188f, +0.164063f,0.117188f, +0.171875f,0.117188f, +0.179688f,0.117188f, +0.1875f,0.117188f, +0.195313f,0.117188f, +0.203125f,0.117188f, +0.210938f,0.117188f, +0.21875f,0.117188f, +0.226563f,0.117188f, +0.234375f,0.117188f, +0.242188f,0.117188f, +0.25f,0.117188f, +0.257813f,0.117188f, +0.265625f,0.117188f, +0.273438f,0.117188f, +0.28125f,0.117188f, +0.289063f,0.117188f, +0.296875f,0.117188f, +0.304688f,0.117188f, +0.3125f,0.117188f, +0.320313f,0.117188f, +0.328125f,0.117188f, +0.335938f,0.117188f, +0.34375f,0.117188f, +0.351563f,0.117188f, +0.359375f,0.117188f, +0.367188f,0.117188f, +0.375f,0.117188f, +0.382813f,0.117188f, +0.390625f,0.117188f, +0.398438f,0.117188f, +0.40625f,0.117188f, +0.414063f,0.117188f, +0.421875f,0.117188f, +0.429688f,0.117188f, +0.4375f,0.117188f, +0.445313f,0.117188f, +0.453125f,0.117188f, +0.460938f,0.117188f, +0.46875f,0.117188f, +0.476563f,0.117188f, +0.484375f,0.117188f, +0.492188f,0.117188f, +0.5f,0.117188f, +0.507813f,0.117188f, +0.0f,0.125f, +0.0078125f,0.125f, +0.015625f,0.125f, +0.0234375f,0.125f, +0.03125f,0.125f, +0.0390625f,0.125f, +0.046875f,0.125f, +0.0546875f,0.125f, +0.0625f,0.125f, +0.0703125f,0.125f, +0.078125f,0.125f, +0.0859375f,0.125f, +0.09375f,0.125f, +0.101563f,0.125f, +0.109375f,0.125f, +0.117188f,0.125f, +0.125f,0.125f, +0.132813f,0.125f, +0.140625f,0.125f, +0.148438f,0.125f, +0.15625f,0.125f, +0.164063f,0.125f, +0.171875f,0.125f, +0.179688f,0.125f, +0.1875f,0.125f, +0.195313f,0.125f, +0.203125f,0.125f, +0.210938f,0.125f, +0.21875f,0.125f, +0.226563f,0.125f, +0.234375f,0.125f, +0.242188f,0.125f, +0.25f,0.125f, +0.257813f,0.125f, +0.265625f,0.125f, +0.273438f,0.125f, +0.28125f,0.125f, +0.289063f,0.125f, +0.296875f,0.125f, +0.304688f,0.125f, +0.3125f,0.125f, +0.320313f,0.125f, +0.328125f,0.125f, +0.335938f,0.125f, +0.34375f,0.125f, +0.351563f,0.125f, +0.359375f,0.125f, +0.367188f,0.125f, +0.375f,0.125f, +0.382813f,0.125f, +0.390625f,0.125f, +0.398438f,0.125f, +0.40625f,0.125f, +0.414063f,0.125f, +0.421875f,0.125f, +0.429688f,0.125f, +0.4375f,0.125f, +0.445313f,0.125f, +0.453125f,0.125f, +0.460938f,0.125f, +0.46875f,0.125f, +0.476563f,0.125f, +0.484375f,0.125f, +0.492188f,0.125f, +0.5f,0.125f, +0.507813f,0.125f, +0.0f,0.132813f, +0.0078125f,0.132813f, +0.015625f,0.132813f, +0.0234375f,0.132813f, +0.03125f,0.132813f, +0.0390625f,0.132813f, +0.046875f,0.132813f, +0.0546875f,0.132813f, +0.0625f,0.132813f, +0.0703125f,0.132813f, +0.078125f,0.132813f, +0.0859375f,0.132813f, +0.09375f,0.132813f, +0.101563f,0.132813f, +0.109375f,0.132813f, +0.117188f,0.132813f, +0.125f,0.132813f, +0.132813f,0.132813f, +0.140625f,0.132813f, +0.148438f,0.132813f, +0.15625f,0.132813f, +0.164063f,0.132813f, +0.171875f,0.132813f, +0.179688f,0.132813f, +0.1875f,0.132813f, +0.195313f,0.132813f, +0.203125f,0.132813f, +0.210938f,0.132813f, +0.21875f,0.132813f, +0.226563f,0.132813f, +0.234375f,0.132813f, +0.242188f,0.132813f, +0.25f,0.132813f, +0.257813f,0.132813f, +0.265625f,0.132813f, +0.273438f,0.132813f, +0.28125f,0.132813f, +0.289063f,0.132813f, +0.296875f,0.132813f, +0.304688f,0.132813f, +0.3125f,0.132813f, +0.320313f,0.132813f, +0.328125f,0.132813f, +0.335938f,0.132813f, +0.34375f,0.132813f, +0.351563f,0.132813f, +0.359375f,0.132813f, +0.367188f,0.132813f, +0.375f,0.132813f, +0.382813f,0.132813f, +0.390625f,0.132813f, +0.398438f,0.132813f, +0.40625f,0.132813f, +0.414063f,0.132813f, +0.421875f,0.132813f, +0.429688f,0.132813f, +0.4375f,0.132813f, +0.445313f,0.132813f, +0.453125f,0.132813f, +0.460938f,0.132813f, +0.46875f,0.132813f, +0.476563f,0.132813f, +0.484375f,0.132813f, +0.492188f,0.132813f, +0.5f,0.132813f, +0.507813f,0.132813f, +0.0f,0.140625f, +0.0078125f,0.140625f, +0.015625f,0.140625f, +0.0234375f,0.140625f, +0.03125f,0.140625f, +0.0390625f,0.140625f, +0.046875f,0.140625f, +0.0546875f,0.140625f, +0.0625f,0.140625f, +0.0703125f,0.140625f, +0.078125f,0.140625f, +0.0859375f,0.140625f, +0.09375f,0.140625f, +0.101563f,0.140625f, +0.109375f,0.140625f, +0.117188f,0.140625f, +0.125f,0.140625f, +0.132813f,0.140625f, +0.140625f,0.140625f, +0.148438f,0.140625f, +0.15625f,0.140625f, +0.164063f,0.140625f, +0.171875f,0.140625f, +0.179688f,0.140625f, +0.1875f,0.140625f, +0.195313f,0.140625f, +0.203125f,0.140625f, +0.210938f,0.140625f, +0.21875f,0.140625f, +0.226563f,0.140625f, +0.234375f,0.140625f, +0.242188f,0.140625f, +0.25f,0.140625f, +0.257813f,0.140625f, +0.265625f,0.140625f, +0.273438f,0.140625f, +0.28125f,0.140625f, +0.289063f,0.140625f, +0.296875f,0.140625f, +0.304688f,0.140625f, +0.3125f,0.140625f, +0.320313f,0.140625f, +0.328125f,0.140625f, +0.335938f,0.140625f, +0.34375f,0.140625f, +0.351563f,0.140625f, +0.359375f,0.140625f, +0.367188f,0.140625f, +0.375f,0.140625f, +0.382813f,0.140625f, +0.390625f,0.140625f, +0.398438f,0.140625f, +0.40625f,0.140625f, +0.414063f,0.140625f, +0.421875f,0.140625f, +0.429688f,0.140625f, +0.4375f,0.140625f, +0.445313f,0.140625f, +0.453125f,0.140625f, +0.460938f,0.140625f, +0.46875f,0.140625f, +0.476563f,0.140625f, +0.484375f,0.140625f, +0.492188f,0.140625f, +0.5f,0.140625f, +0.507813f,0.140625f, +0.0f,0.148438f, +0.0078125f,0.148438f, +0.015625f,0.148438f, +0.0234375f,0.148438f, +0.03125f,0.148438f, +0.0390625f,0.148438f, +0.046875f,0.148438f, +0.0546875f,0.148438f, +0.0625f,0.148438f, +0.0703125f,0.148438f, +0.078125f,0.148438f, +0.0859375f,0.148438f, +0.09375f,0.148438f, +0.101563f,0.148438f, +0.109375f,0.148438f, +0.117188f,0.148438f, +0.125f,0.148438f, +0.132813f,0.148438f, +0.140625f,0.148438f, +0.148438f,0.148438f, +0.15625f,0.148438f, +0.164063f,0.148438f, +0.171875f,0.148438f, +0.179688f,0.148438f, +0.1875f,0.148438f, +0.195313f,0.148438f, +0.203125f,0.148438f, +0.210938f,0.148438f, +0.21875f,0.148438f, +0.226563f,0.148438f, +0.234375f,0.148438f, +0.242188f,0.148438f, +0.25f,0.148438f, +0.257813f,0.148438f, +0.265625f,0.148438f, +0.273438f,0.148438f, +0.28125f,0.148438f, +0.289063f,0.148438f, +0.296875f,0.148438f, +0.304688f,0.148438f, +0.3125f,0.148438f, +0.320313f,0.148438f, +0.328125f,0.148438f, +0.335938f,0.148438f, +0.34375f,0.148438f, +0.351563f,0.148438f, +0.359375f,0.148438f, +0.367188f,0.148438f, +0.375f,0.148438f, +0.382813f,0.148438f, +0.390625f,0.148438f, +0.398438f,0.148438f, +0.40625f,0.148438f, +0.414063f,0.148438f, +0.421875f,0.148438f, +0.429688f,0.148438f, +0.4375f,0.148438f, +0.445313f,0.148438f, +0.453125f,0.148438f, +0.460938f,0.148438f, +0.46875f,0.148438f, +0.476563f,0.148438f, +0.484375f,0.148438f, +0.492188f,0.148438f, +0.5f,0.148438f, +0.507813f,0.148438f, +0.0f,0.15625f, +0.0078125f,0.15625f, +0.015625f,0.15625f, +0.0234375f,0.15625f, +0.03125f,0.15625f, +0.0390625f,0.15625f, +0.046875f,0.15625f, +0.0546875f,0.15625f, +0.0625f,0.15625f, +0.0703125f,0.15625f, +0.078125f,0.15625f, +0.0859375f,0.15625f, +0.09375f,0.15625f, +0.101563f,0.15625f, +0.109375f,0.15625f, +0.117188f,0.15625f, +0.125f,0.15625f, +0.132813f,0.15625f, +0.140625f,0.15625f, +0.148438f,0.15625f, +0.15625f,0.15625f, +0.164063f,0.15625f, +0.171875f,0.15625f, +0.179688f,0.15625f, +0.1875f,0.15625f, +0.195313f,0.15625f, +0.203125f,0.15625f, +0.210938f,0.15625f, +0.21875f,0.15625f, +0.226563f,0.15625f, +0.234375f,0.15625f, +0.242188f,0.15625f, +0.25f,0.15625f, +0.257813f,0.15625f, +0.265625f,0.15625f, +0.273438f,0.15625f, +0.28125f,0.15625f, +0.289063f,0.15625f, +0.296875f,0.15625f, +0.304688f,0.15625f, +0.3125f,0.15625f, +0.320313f,0.15625f, +0.328125f,0.15625f, +0.335938f,0.15625f, +0.34375f,0.15625f, +0.351563f,0.15625f, +0.359375f,0.15625f, +0.367188f,0.15625f, +0.375f,0.15625f, +0.382813f,0.15625f, +0.390625f,0.15625f, +0.398438f,0.15625f, +0.40625f,0.15625f, +0.414063f,0.15625f, +0.421875f,0.15625f, +0.429688f,0.15625f, +0.4375f,0.15625f, +0.445313f,0.15625f, +0.453125f,0.15625f, +0.460938f,0.15625f, +0.46875f,0.15625f, +0.476563f,0.15625f, +0.484375f,0.15625f, +0.492188f,0.15625f, +0.5f,0.15625f, +0.507813f,0.15625f, +0.0f,0.164063f, +0.0078125f,0.164063f, +0.015625f,0.164063f, +0.0234375f,0.164063f, +0.03125f,0.164063f, +0.0390625f,0.164063f, +0.046875f,0.164063f, +0.0546875f,0.164063f, +0.0625f,0.164063f, +0.0703125f,0.164063f, +0.078125f,0.164063f, +0.0859375f,0.164063f, +0.09375f,0.164063f, +0.101563f,0.164063f, +0.109375f,0.164063f, +0.117188f,0.164063f, +0.125f,0.164063f, +0.132813f,0.164063f, +0.140625f,0.164063f, +0.148438f,0.164063f, +0.15625f,0.164063f, +0.164063f,0.164063f, +0.171875f,0.164063f, +0.179688f,0.164063f, +0.1875f,0.164063f, +0.195313f,0.164063f, +0.203125f,0.164063f, +0.210938f,0.164063f, +0.21875f,0.164063f, +0.226563f,0.164063f, +0.234375f,0.164063f, +0.242188f,0.164063f, +0.25f,0.164063f, +0.257813f,0.164063f, +0.265625f,0.164063f, +0.273438f,0.164063f, +0.28125f,0.164063f, +0.289063f,0.164063f, +0.296875f,0.164063f, +0.304688f,0.164063f, +0.3125f,0.164063f, +0.320313f,0.164063f, +0.328125f,0.164063f, +0.335938f,0.164063f, +0.34375f,0.164063f, +0.351563f,0.164063f, +0.359375f,0.164063f, +0.367188f,0.164063f, +0.375f,0.164063f, +0.382813f,0.164063f, +0.390625f,0.164063f, +0.398438f,0.164063f, +0.40625f,0.164063f, +0.414063f,0.164063f, +0.421875f,0.164063f, +0.429688f,0.164063f, +0.4375f,0.164063f, +0.445313f,0.164063f, +0.453125f,0.164063f, +0.460938f,0.164063f, +0.46875f,0.164063f, +0.476563f,0.164063f, +0.484375f,0.164063f, +0.492188f,0.164063f, +0.5f,0.164063f, +0.507813f,0.164063f, +0.0f,0.171875f, +0.0078125f,0.171875f, +0.015625f,0.171875f, +0.0234375f,0.171875f, +0.03125f,0.171875f, +0.0390625f,0.171875f, +0.046875f,0.171875f, +0.0546875f,0.171875f, +0.0625f,0.171875f, +0.0703125f,0.171875f, +0.078125f,0.171875f, +0.0859375f,0.171875f, +0.09375f,0.171875f, +0.101563f,0.171875f, +0.109375f,0.171875f, +0.117188f,0.171875f, +0.125f,0.171875f, +0.132813f,0.171875f, +0.140625f,0.171875f, +0.148438f,0.171875f, +0.15625f,0.171875f, +0.164063f,0.171875f, +0.171875f,0.171875f, +0.179688f,0.171875f, +0.1875f,0.171875f, +0.195313f,0.171875f, +0.203125f,0.171875f, +0.210938f,0.171875f, +0.21875f,0.171875f, +0.226563f,0.171875f, +0.234375f,0.171875f, +0.242188f,0.171875f, +0.25f,0.171875f, +0.257813f,0.171875f, +0.265625f,0.171875f, +0.273438f,0.171875f, +0.28125f,0.171875f, +0.289063f,0.171875f, +0.296875f,0.171875f, +0.304688f,0.171875f, +0.3125f,0.171875f, +0.320313f,0.171875f, +0.328125f,0.171875f, +0.335938f,0.171875f, +0.34375f,0.171875f, +0.351563f,0.171875f, +0.359375f,0.171875f, +0.367188f,0.171875f, +0.375f,0.171875f, +0.382813f,0.171875f, +0.390625f,0.171875f, +0.398438f,0.171875f, +0.40625f,0.171875f, +0.414063f,0.171875f, +0.421875f,0.171875f, +0.429688f,0.171875f, +0.4375f,0.171875f, +0.445313f,0.171875f, +0.453125f,0.171875f, +0.460938f,0.171875f, +0.46875f,0.171875f, +0.476563f,0.171875f, +0.484375f,0.171875f, +0.492188f,0.171875f, +0.5f,0.171875f, +0.507813f,0.171875f, +0.0f,0.179688f, +0.0078125f,0.179688f, +0.015625f,0.179688f, +0.0234375f,0.179688f, +0.03125f,0.179688f, +0.0390625f,0.179688f, +0.046875f,0.179688f, +0.0546875f,0.179688f, +0.0625f,0.179688f, +0.0703125f,0.179688f, +0.078125f,0.179688f, +0.0859375f,0.179688f, +0.09375f,0.179688f, +0.101563f,0.179688f, +0.109375f,0.179688f, +0.117188f,0.179688f, +0.125f,0.179688f, +0.132813f,0.179688f, +0.140625f,0.179688f, +0.148438f,0.179688f, +0.15625f,0.179688f, +0.164063f,0.179688f, +0.171875f,0.179688f, +0.179688f,0.179688f, +0.1875f,0.179688f, +0.195313f,0.179688f, +0.203125f,0.179688f, +0.210938f,0.179688f, +0.21875f,0.179688f, +0.226563f,0.179688f, +0.234375f,0.179688f, +0.242188f,0.179688f, +0.25f,0.179688f, +0.257813f,0.179688f, +0.265625f,0.179688f, +0.273438f,0.179688f, +0.28125f,0.179688f, +0.289063f,0.179688f, +0.296875f,0.179688f, +0.304688f,0.179688f, +0.3125f,0.179688f, +0.320313f,0.179688f, +0.328125f,0.179688f, +0.335938f,0.179688f, +0.34375f,0.179688f, +0.351563f,0.179688f, +0.359375f,0.179688f, +0.367188f,0.179688f, +0.375f,0.179688f, +0.382813f,0.179688f, +0.390625f,0.179688f, +0.398438f,0.179688f, +0.40625f,0.179688f, +0.414063f,0.179688f, +0.421875f,0.179688f, +0.429688f,0.179688f, +0.4375f,0.179688f, +0.445313f,0.179688f, +0.453125f,0.179688f, +0.460938f,0.179688f, +0.46875f,0.179688f, +0.476563f,0.179688f, +0.484375f,0.179688f, +0.492188f,0.179688f, +0.5f,0.179688f, +0.507813f,0.179688f, +0.0f,0.1875f, +0.0078125f,0.1875f, +0.015625f,0.1875f, +0.0234375f,0.1875f, +0.03125f,0.1875f, +0.0390625f,0.1875f, +0.046875f,0.1875f, +0.0546875f,0.1875f, +0.0625f,0.1875f, +0.0703125f,0.1875f, +0.078125f,0.1875f, +0.0859375f,0.1875f, +0.09375f,0.1875f, +0.101563f,0.1875f, +0.109375f,0.1875f, +0.117188f,0.1875f, +0.125f,0.1875f, +0.132813f,0.1875f, +0.140625f,0.1875f, +0.148438f,0.1875f, +0.15625f,0.1875f, +0.164063f,0.1875f, +0.171875f,0.1875f, +0.179688f,0.1875f, +0.1875f,0.1875f, +0.195313f,0.1875f, +0.203125f,0.1875f, +0.210938f,0.1875f, +0.21875f,0.1875f, +0.226563f,0.1875f, +0.234375f,0.1875f, +0.242188f,0.1875f, +0.25f,0.1875f, +0.257813f,0.1875f, +0.265625f,0.1875f, +0.273438f,0.1875f, +0.28125f,0.1875f, +0.289063f,0.1875f, +0.296875f,0.1875f, +0.304688f,0.1875f, +0.3125f,0.1875f, +0.320313f,0.1875f, +0.328125f,0.1875f, +0.335938f,0.1875f, +0.34375f,0.1875f, +0.351563f,0.1875f, +0.359375f,0.1875f, +0.367188f,0.1875f, +0.375f,0.1875f, +0.382813f,0.1875f, +0.390625f,0.1875f, +0.398438f,0.1875f, +0.40625f,0.1875f, +0.414063f,0.1875f, +0.421875f,0.1875f, +0.429688f,0.1875f, +0.4375f,0.1875f, +0.445313f,0.1875f, +0.453125f,0.1875f, +0.460938f,0.1875f, +0.46875f,0.1875f, +0.476563f,0.1875f, +0.484375f,0.1875f, +0.492188f,0.1875f, +0.5f,0.1875f, +0.507813f,0.1875f, +0.0f,0.195313f, +0.0078125f,0.195313f, +0.015625f,0.195313f, +0.0234375f,0.195313f, +0.03125f,0.195313f, +0.0390625f,0.195313f, +0.046875f,0.195313f, +0.0546875f,0.195313f, +0.0625f,0.195313f, +0.0703125f,0.195313f, +0.078125f,0.195313f, +0.0859375f,0.195313f, +0.09375f,0.195313f, +0.101563f,0.195313f, +0.109375f,0.195313f, +0.117188f,0.195313f, +0.125f,0.195313f, +0.132813f,0.195313f, +0.140625f,0.195313f, +0.148438f,0.195313f, +0.15625f,0.195313f, +0.164063f,0.195313f, +0.171875f,0.195313f, +0.179688f,0.195313f, +0.1875f,0.195313f, +0.195313f,0.195313f, +0.203125f,0.195313f, +0.210938f,0.195313f, +0.21875f,0.195313f, +0.226563f,0.195313f, +0.234375f,0.195313f, +0.242188f,0.195313f, +0.25f,0.195313f, +0.257813f,0.195313f, +0.265625f,0.195313f, +0.273438f,0.195313f, +0.28125f,0.195313f, +0.289063f,0.195313f, +0.296875f,0.195313f, +0.304688f,0.195313f, +0.3125f,0.195313f, +0.320313f,0.195313f, +0.328125f,0.195313f, +0.335938f,0.195313f, +0.34375f,0.195313f, +0.351563f,0.195313f, +0.359375f,0.195313f, +0.367188f,0.195313f, +0.375f,0.195313f, +0.382813f,0.195313f, +0.390625f,0.195313f, +0.398438f,0.195313f, +0.40625f,0.195313f, +0.414063f,0.195313f, +0.421875f,0.195313f, +0.429688f,0.195313f, +0.4375f,0.195313f, +0.445313f,0.195313f, +0.453125f,0.195313f, +0.460938f,0.195313f, +0.46875f,0.195313f, +0.476563f,0.195313f, +0.484375f,0.195313f, +0.492188f,0.195313f, +0.5f,0.195313f, +0.507813f,0.195313f, +0.0f,0.203125f, +0.0078125f,0.203125f, +0.015625f,0.203125f, +0.0234375f,0.203125f, +0.03125f,0.203125f, +0.0390625f,0.203125f, +0.046875f,0.203125f, +0.0546875f,0.203125f, +0.0625f,0.203125f, +0.0703125f,0.203125f, +0.078125f,0.203125f, +0.0859375f,0.203125f, +0.09375f,0.203125f, +0.101563f,0.203125f, +0.109375f,0.203125f, +0.117188f,0.203125f, +0.125f,0.203125f, +0.132813f,0.203125f, +0.140625f,0.203125f, +0.148438f,0.203125f, +0.15625f,0.203125f, +0.164063f,0.203125f, +0.171875f,0.203125f, +0.179688f,0.203125f, +0.1875f,0.203125f, +0.195313f,0.203125f, +0.203125f,0.203125f, +0.210938f,0.203125f, +0.21875f,0.203125f, +0.226563f,0.203125f, +0.234375f,0.203125f, +0.242188f,0.203125f, +0.25f,0.203125f, +0.257813f,0.203125f, +0.265625f,0.203125f, +0.273438f,0.203125f, +0.28125f,0.203125f, +0.289063f,0.203125f, +0.296875f,0.203125f, +0.304688f,0.203125f, +0.3125f,0.203125f, +0.320313f,0.203125f, +0.328125f,0.203125f, +0.335938f,0.203125f, +0.34375f,0.203125f, +0.351563f,0.203125f, +0.359375f,0.203125f, +0.367188f,0.203125f, +0.375f,0.203125f, +0.382813f,0.203125f, +0.390625f,0.203125f, +0.398438f,0.203125f, +0.40625f,0.203125f, +0.414063f,0.203125f, +0.421875f,0.203125f, +0.429688f,0.203125f, +0.4375f,0.203125f, +0.445313f,0.203125f, +0.453125f,0.203125f, +0.460938f,0.203125f, +0.46875f,0.203125f, +0.476563f,0.203125f, +0.484375f,0.203125f, +0.492188f,0.203125f, +0.5f,0.203125f, +0.507813f,0.203125f, +0.0f,0.210938f, +0.0078125f,0.210938f, +0.015625f,0.210938f, +0.0234375f,0.210938f, +0.03125f,0.210938f, +0.0390625f,0.210938f, +0.046875f,0.210938f, +0.0546875f,0.210938f, +0.0625f,0.210938f, +0.0703125f,0.210938f, +0.078125f,0.210938f, +0.0859375f,0.210938f, +0.09375f,0.210938f, +0.101563f,0.210938f, +0.109375f,0.210938f, +0.117188f,0.210938f, +0.125f,0.210938f, +0.132813f,0.210938f, +0.140625f,0.210938f, +0.148438f,0.210938f, +0.15625f,0.210938f, +0.164063f,0.210938f, +0.171875f,0.210938f, +0.179688f,0.210938f, +0.1875f,0.210938f, +0.195313f,0.210938f, +0.203125f,0.210938f, +0.210938f,0.210938f, +0.21875f,0.210938f, +0.226563f,0.210938f, +0.234375f,0.210938f, +0.242188f,0.210938f, +0.25f,0.210938f, +0.257813f,0.210938f, +0.265625f,0.210938f, +0.273438f,0.210938f, +0.28125f,0.210938f, +0.289063f,0.210938f, +0.296875f,0.210938f, +0.304688f,0.210938f, +0.3125f,0.210938f, +0.320313f,0.210938f, +0.328125f,0.210938f, +0.335938f,0.210938f, +0.34375f,0.210938f, +0.351563f,0.210938f, +0.359375f,0.210938f, +0.367188f,0.210938f, +0.375f,0.210938f, +0.382813f,0.210938f, +0.390625f,0.210938f, +0.398438f,0.210938f, +0.40625f,0.210938f, +0.414063f,0.210938f, +0.421875f,0.210938f, +0.429688f,0.210938f, +0.4375f,0.210938f, +0.445313f,0.210938f, +0.453125f,0.210938f, +0.460938f,0.210938f, +0.46875f,0.210938f, +0.476563f,0.210938f, +0.484375f,0.210938f, +0.492188f,0.210938f, +0.5f,0.210938f, +0.507813f,0.210938f, +0.0f,0.21875f, +0.0078125f,0.21875f, +0.015625f,0.21875f, +0.0234375f,0.21875f, +0.03125f,0.21875f, +0.0390625f,0.21875f, +0.046875f,0.21875f, +0.0546875f,0.21875f, +0.0625f,0.21875f, +0.0703125f,0.21875f, +0.078125f,0.21875f, +0.0859375f,0.21875f, +0.09375f,0.21875f, +0.101563f,0.21875f, +0.109375f,0.21875f, +0.117188f,0.21875f, +0.125f,0.21875f, +0.132813f,0.21875f, +0.140625f,0.21875f, +0.148438f,0.21875f, +0.15625f,0.21875f, +0.164063f,0.21875f, +0.171875f,0.21875f, +0.179688f,0.21875f, +0.1875f,0.21875f, +0.195313f,0.21875f, +0.203125f,0.21875f, +0.210938f,0.21875f, +0.21875f,0.21875f, +0.226563f,0.21875f, +0.234375f,0.21875f, +0.242188f,0.21875f, +0.25f,0.21875f, +0.257813f,0.21875f, +0.265625f,0.21875f, +0.273438f,0.21875f, +0.28125f,0.21875f, +0.289063f,0.21875f, +0.296875f,0.21875f, +0.304688f,0.21875f, +0.3125f,0.21875f, +0.320313f,0.21875f, +0.328125f,0.21875f, +0.335938f,0.21875f, +0.34375f,0.21875f, +0.351563f,0.21875f, +0.359375f,0.21875f, +0.367188f,0.21875f, +0.375f,0.21875f, +0.382813f,0.21875f, +0.390625f,0.21875f, +0.398438f,0.21875f, +0.40625f,0.21875f, +0.414063f,0.21875f, +0.421875f,0.21875f, +0.429688f,0.21875f, +0.4375f,0.21875f, +0.445313f,0.21875f, +0.453125f,0.21875f, +0.460938f,0.21875f, +0.46875f,0.21875f, +0.476563f,0.21875f, +0.484375f,0.21875f, +0.492188f,0.21875f, +0.5f,0.21875f, +0.507813f,0.21875f, +0.0f,0.226563f, +0.0078125f,0.226563f, +0.015625f,0.226563f, +0.0234375f,0.226563f, +0.03125f,0.226563f, +0.0390625f,0.226563f, +0.046875f,0.226563f, +0.0546875f,0.226563f, +0.0625f,0.226563f, +0.0703125f,0.226563f, +0.078125f,0.226563f, +0.0859375f,0.226563f, +0.09375f,0.226563f, +0.101563f,0.226563f, +0.109375f,0.226563f, +0.117188f,0.226563f, +0.125f,0.226563f, +0.132813f,0.226563f, +0.140625f,0.226563f, +0.148438f,0.226563f, +0.15625f,0.226563f, +0.164063f,0.226563f, +0.171875f,0.226563f, +0.179688f,0.226563f, +0.1875f,0.226563f, +0.195313f,0.226563f, +0.203125f,0.226563f, +0.210938f,0.226563f, +0.21875f,0.226563f, +0.226563f,0.226563f, +0.234375f,0.226563f, +0.242188f,0.226563f, +0.25f,0.226563f, +0.257813f,0.226563f, +0.265625f,0.226563f, +0.273438f,0.226563f, +0.28125f,0.226563f, +0.289063f,0.226563f, +0.296875f,0.226563f, +0.304688f,0.226563f, +0.3125f,0.226563f, +0.320313f,0.226563f, +0.328125f,0.226563f, +0.335938f,0.226563f, +0.34375f,0.226563f, +0.351563f,0.226563f, +0.359375f,0.226563f, +0.367188f,0.226563f, +0.375f,0.226563f, +0.382813f,0.226563f, +0.390625f,0.226563f, +0.398438f,0.226563f, +0.40625f,0.226563f, +0.414063f,0.226563f, +0.421875f,0.226563f, +0.429688f,0.226563f, +0.4375f,0.226563f, +0.445313f,0.226563f, +0.453125f,0.226563f, +0.460938f,0.226563f, +0.46875f,0.226563f, +0.476563f,0.226563f, +0.484375f,0.226563f, +0.492188f,0.226563f, +0.5f,0.226563f, +0.507813f,0.226563f, +0.0f,0.234375f, +0.0078125f,0.234375f, +0.015625f,0.234375f, +0.0234375f,0.234375f, +0.03125f,0.234375f, +0.0390625f,0.234375f, +0.046875f,0.234375f, +0.0546875f,0.234375f, +0.0625f,0.234375f, +0.0703125f,0.234375f, +0.078125f,0.234375f, +0.0859375f,0.234375f, +0.09375f,0.234375f, +0.101563f,0.234375f, +0.109375f,0.234375f, +0.117188f,0.234375f, +0.125f,0.234375f, +0.132813f,0.234375f, +0.140625f,0.234375f, +0.148438f,0.234375f, +0.15625f,0.234375f, +0.164063f,0.234375f, +0.171875f,0.234375f, +0.179688f,0.234375f, +0.1875f,0.234375f, +0.195313f,0.234375f, +0.203125f,0.234375f, +0.210938f,0.234375f, +0.21875f,0.234375f, +0.226563f,0.234375f, +0.234375f,0.234375f, +0.242188f,0.234375f, +0.25f,0.234375f, +0.257813f,0.234375f, +0.265625f,0.234375f, +0.273438f,0.234375f, +0.28125f,0.234375f, +0.289063f,0.234375f, +0.296875f,0.234375f, +0.304688f,0.234375f, +0.3125f,0.234375f, +0.320313f,0.234375f, +0.328125f,0.234375f, +0.335938f,0.234375f, +0.34375f,0.234375f, +0.351563f,0.234375f, +0.359375f,0.234375f, +0.367188f,0.234375f, +0.375f,0.234375f, +0.382813f,0.234375f, +0.390625f,0.234375f, +0.398438f,0.234375f, +0.40625f,0.234375f, +0.414063f,0.234375f, +0.421875f,0.234375f, +0.429688f,0.234375f, +0.4375f,0.234375f, +0.445313f,0.234375f, +0.453125f,0.234375f, +0.460938f,0.234375f, +0.46875f,0.234375f, +0.476563f,0.234375f, +0.484375f,0.234375f, +0.492188f,0.234375f, +0.5f,0.234375f, +0.507813f,0.234375f, +0.0f,0.242188f, +0.0078125f,0.242188f, +0.015625f,0.242188f, +0.0234375f,0.242188f, +0.03125f,0.242188f, +0.0390625f,0.242188f, +0.046875f,0.242188f, +0.0546875f,0.242188f, +0.0625f,0.242188f, +0.0703125f,0.242188f, +0.078125f,0.242188f, +0.0859375f,0.242188f, +0.09375f,0.242188f, +0.101563f,0.242188f, +0.109375f,0.242188f, +0.117188f,0.242188f, +0.125f,0.242188f, +0.132813f,0.242188f, +0.140625f,0.242188f, +0.148438f,0.242188f, +0.15625f,0.242188f, +0.164063f,0.242188f, +0.171875f,0.242188f, +0.179688f,0.242188f, +0.1875f,0.242188f, +0.195313f,0.242188f, +0.203125f,0.242188f, +0.210938f,0.242188f, +0.21875f,0.242188f, +0.226563f,0.242188f, +0.234375f,0.242188f, +0.242188f,0.242188f, +0.25f,0.242188f, +0.257813f,0.242188f, +0.265625f,0.242188f, +0.273438f,0.242188f, +0.28125f,0.242188f, +0.289063f,0.242188f, +0.296875f,0.242188f, +0.304688f,0.242188f, +0.3125f,0.242188f, +0.320313f,0.242188f, +0.328125f,0.242188f, +0.335938f,0.242188f, +0.34375f,0.242188f, +0.351563f,0.242188f, +0.359375f,0.242188f, +0.367188f,0.242188f, +0.375f,0.242188f, +0.382813f,0.242188f, +0.390625f,0.242188f, +0.398438f,0.242188f, +0.40625f,0.242188f, +0.414063f,0.242188f, +0.421875f,0.242188f, +0.429688f,0.242188f, +0.4375f,0.242188f, +0.445313f,0.242188f, +0.453125f,0.242188f, +0.460938f,0.242188f, +0.46875f,0.242188f, +0.476563f,0.242188f, +0.484375f,0.242188f, +0.492188f,0.242188f, +0.5f,0.242188f, +0.507813f,0.242188f, +0.0f,0.25f, +0.0078125f,0.25f, +0.015625f,0.25f, +0.0234375f,0.25f, +0.03125f,0.25f, +0.0390625f,0.25f, +0.046875f,0.25f, +0.0546875f,0.25f, +0.0625f,0.25f, +0.0703125f,0.25f, +0.078125f,0.25f, +0.0859375f,0.25f, +0.09375f,0.25f, +0.101563f,0.25f, +0.109375f,0.25f, +0.117188f,0.25f, +0.125f,0.25f, +0.132813f,0.25f, +0.140625f,0.25f, +0.148438f,0.25f, +0.15625f,0.25f, +0.164063f,0.25f, +0.171875f,0.25f, +0.179688f,0.25f, +0.1875f,0.25f, +0.195313f,0.25f, +0.203125f,0.25f, +0.210938f,0.25f, +0.21875f,0.25f, +0.226563f,0.25f, +0.234375f,0.25f, +0.242188f,0.25f, +0.25f,0.25f, +0.257813f,0.25f, +0.265625f,0.25f, +0.273438f,0.25f, +0.28125f,0.25f, +0.289063f,0.25f, +0.296875f,0.25f, +0.304688f,0.25f, +0.3125f,0.25f, +0.320313f,0.25f, +0.328125f,0.25f, +0.335938f,0.25f, +0.34375f,0.25f, +0.351563f,0.25f, +0.359375f,0.25f, +0.367188f,0.25f, +0.375f,0.25f, +0.382813f,0.25f, +0.390625f,0.25f, +0.398438f,0.25f, +0.40625f,0.25f, +0.414063f,0.25f, +0.421875f,0.25f, +0.429688f,0.25f, +0.4375f,0.25f, +0.445313f,0.25f, +0.453125f,0.25f, +0.460938f,0.25f, +0.46875f,0.25f, +0.476563f,0.25f, +0.484375f,0.25f, +0.492188f,0.25f, +0.5f,0.25f, +0.507813f,0.25f, +0.0f,0.257813f, +0.0078125f,0.257813f, +0.015625f,0.257813f, +0.0234375f,0.257813f, +0.03125f,0.257813f, +0.0390625f,0.257813f, +0.046875f,0.257813f, +0.0546875f,0.257813f, +0.0625f,0.257813f, +0.0703125f,0.257813f, +0.078125f,0.257813f, +0.0859375f,0.257813f, +0.09375f,0.257813f, +0.101563f,0.257813f, +0.109375f,0.257813f, +0.117188f,0.257813f, +0.125f,0.257813f, +0.132813f,0.257813f, +0.140625f,0.257813f, +0.148438f,0.257813f, +0.15625f,0.257813f, +0.164063f,0.257813f, +0.171875f,0.257813f, +0.179688f,0.257813f, +0.1875f,0.257813f, +0.195313f,0.257813f, +0.203125f,0.257813f, +0.210938f,0.257813f, +0.21875f,0.257813f, +0.226563f,0.257813f, +0.234375f,0.257813f, +0.242188f,0.257813f, +0.25f,0.257813f, +0.257813f,0.257813f, +0.265625f,0.257813f, +0.273438f,0.257813f, +0.28125f,0.257813f, +0.289063f,0.257813f, +0.296875f,0.257813f, +0.304688f,0.257813f, +0.3125f,0.257813f, +0.320313f,0.257813f, +0.328125f,0.257813f, +0.335938f,0.257813f, +0.34375f,0.257813f, +0.351563f,0.257813f, +0.359375f,0.257813f, +0.367188f,0.257813f, +0.375f,0.257813f, +0.382813f,0.257813f, +0.390625f,0.257813f, +0.398438f,0.257813f, +0.40625f,0.257813f, +0.414063f,0.257813f, +0.421875f,0.257813f, +0.429688f,0.257813f, +0.4375f,0.257813f, +0.445313f,0.257813f, +0.453125f,0.257813f, +0.460938f,0.257813f, +0.46875f,0.257813f, +0.476563f,0.257813f, +0.484375f,0.257813f, +0.492188f,0.257813f, +0.5f,0.257813f, +0.507813f,0.257813f, +0.0f,0.265625f, +0.0078125f,0.265625f, +0.015625f,0.265625f, +0.0234375f,0.265625f, +0.03125f,0.265625f, +0.0390625f,0.265625f, +0.046875f,0.265625f, +0.0546875f,0.265625f, +0.0625f,0.265625f, +0.0703125f,0.265625f, +0.078125f,0.265625f, +0.0859375f,0.265625f, +0.09375f,0.265625f, +0.101563f,0.265625f, +0.109375f,0.265625f, +0.117188f,0.265625f, +0.125f,0.265625f, +0.132813f,0.265625f, +0.140625f,0.265625f, +0.148438f,0.265625f, +0.15625f,0.265625f, +0.164063f,0.265625f, +0.171875f,0.265625f, +0.179688f,0.265625f, +0.1875f,0.265625f, +0.195313f,0.265625f, +0.203125f,0.265625f, +0.210938f,0.265625f, +0.21875f,0.265625f, +0.226563f,0.265625f, +0.234375f,0.265625f, +0.242188f,0.265625f, +0.25f,0.265625f, +0.257813f,0.265625f, +0.265625f,0.265625f, +0.273438f,0.265625f, +0.28125f,0.265625f, +0.289063f,0.265625f, +0.296875f,0.265625f, +0.304688f,0.265625f, +0.3125f,0.265625f, +0.320313f,0.265625f, +0.328125f,0.265625f, +0.335938f,0.265625f, +0.34375f,0.265625f, +0.351563f,0.265625f, +0.359375f,0.265625f, +0.367188f,0.265625f, +0.375f,0.265625f, +0.382813f,0.265625f, +0.390625f,0.265625f, +0.398438f,0.265625f, +0.40625f,0.265625f, +0.414063f,0.265625f, +0.421875f,0.265625f, +0.429688f,0.265625f, +0.4375f,0.265625f, +0.445313f,0.265625f, +0.453125f,0.265625f, +0.460938f,0.265625f, +0.46875f,0.265625f, +0.476563f,0.265625f, +0.484375f,0.265625f, +0.492188f,0.265625f, +0.5f,0.265625f, +0.507813f,0.265625f, +}; + +unsigned short Landscape06Idx[] = { +0,1,2, +3,2,1, +2,3,4, +5,4,3, +4,5,6, +7,6,5, +6,7,8, +9,8,7, +8,9,10, +11,10,9, +10,11,12, +13,12,11, +12,13,14, +15,14,13, +14,15,16, +17,16,15, +16,17,18, +19,18,17, +18,19,20, +21,20,19, +20,21,22, +23,22,21, +22,23,24, +25,24,23, +24,25,26, +27,26,25, +26,27,28, +29,28,27, +28,29,30, +31,30,29, +30,31,32, +33,32,31, +32,33,34, +35,34,33, +34,35,36, +37,36,35, +36,37,38, +39,38,37, +38,39,40, +41,40,39, +40,41,42, +43,42,41, +42,43,44, +45,44,43, +44,45,46, +47,46,45, +46,47,48, +49,48,47, +48,49,50, +51,50,49, +50,51,52, +53,52,51, +52,53,54, +55,54,53, +54,55,56, +57,56,55, +56,57,58, +59,58,57, +58,59,60, +61,60,59, +60,61,62, +63,62,61, +62,63,64, +65,64,63, +64,65,66, +67,66,65, +66,67,68, +69,68,67, +68,69,70, +71,70,69, +70,71,72, +73,72,71, +72,73,74, +75,74,73, +74,75,76, +77,76,75, +76,77,78, +79,78,77, +78,79,80, +81,80,79, +80,81,82, +83,82,81, +82,83,84, +85,84,83, +84,85,86, +87,86,85, +86,87,88, +89,88,87, +88,89,90, +91,90,89, +90,91,92, +93,92,91, +92,93,94, +95,94,93, +94,95,96, +97,96,95, +96,97,98, +99,98,97, +98,99,100, +101,100,99, +100,101,102, +103,102,101, +102,103,104, +105,104,103, +104,105,106, +107,106,105, +106,107,108, +109,108,107, +108,109,110, +111,110,109, +110,111,112, +113,112,111, +112,113,114, +115,114,113, +114,115,116, +117,116,115, +116,117,118, +119,118,117, +118,119,120, +121,120,119, +120,121,122, +123,122,121, +122,123,124, +125,124,123, +124,125,126, +127,126,125, +126,127,128, +129,128,127, +128,129,130, +131,130,129, +132,0,133, +2,133,0, +133,2,134, +4,134,2, +134,4,135, +6,135,4, +135,6,136, +8,136,6, +136,8,137, +10,137,8, +137,10,138, +12,138,10, +138,12,139, +14,139,12, +139,14,140, +16,140,14, +140,16,141, +18,141,16, +141,18,142, +20,142,18, +142,20,143, +22,143,20, +143,22,144, +24,144,22, +144,24,145, +26,145,24, +145,26,146, +28,146,26, +146,28,147, +30,147,28, +147,30,148, +32,148,30, +148,32,149, +34,149,32, +149,34,150, +36,150,34, +150,36,151, +38,151,36, +151,38,152, +40,152,38, +152,40,153, +42,153,40, +153,42,154, +44,154,42, +154,44,155, +46,155,44, +155,46,156, +48,156,46, +156,48,157, +50,157,48, +157,50,158, +52,158,50, +158,52,159, +54,159,52, +159,54,160, +56,160,54, +160,56,161, +58,161,56, +161,58,162, +60,162,58, +162,60,163, +62,163,60, +163,62,164, +64,164,62, +164,64,165, +66,165,64, +165,66,166, +68,166,66, +166,68,167, +70,167,68, +167,70,168, +72,168,70, +168,72,169, +74,169,72, +169,74,170, +76,170,74, +170,76,171, +78,171,76, +171,78,172, +80,172,78, +172,80,173, +82,173,80, +173,82,174, +84,174,82, +174,84,175, +86,175,84, +175,86,176, +88,176,86, +176,88,177, +90,177,88, +177,90,178, +92,178,90, +178,92,179, +94,179,92, +179,94,180, +96,180,94, +180,96,181, +98,181,96, +181,98,182, +100,182,98, +182,100,183, +102,183,100, +183,102,184, +104,184,102, +184,104,185, +106,185,104, +185,106,186, +108,186,106, +186,108,187, +110,187,108, +187,110,188, +112,188,110, +188,112,189, +114,189,112, +189,114,190, +116,190,114, +190,116,191, +118,191,116, +191,118,192, +120,192,118, +192,120,193, +122,193,120, +193,122,194, +124,194,122, +194,124,195, +126,195,124, +195,126,196, +128,196,126, +196,128,197, +130,197,128, +198,132,199, +133,199,132, +199,133,200, +134,200,133, +200,134,201, +135,201,134, +201,135,202, +136,202,135, +202,136,203, +137,203,136, +203,137,204, +138,204,137, +204,138,205, +139,205,138, +205,139,206, +140,206,139, +206,140,207, +141,207,140, +207,141,208, +142,208,141, +208,142,209, +143,209,142, +209,143,210, +144,210,143, +210,144,211, +145,211,144, +211,145,212, +146,212,145, +212,146,213, +147,213,146, +213,147,214, +148,214,147, +214,148,215, +149,215,148, +215,149,216, +150,216,149, +216,150,217, +151,217,150, +217,151,218, +152,218,151, +218,152,219, +153,219,152, +219,153,220, +154,220,153, +220,154,221, +155,221,154, +221,155,222, +156,222,155, +222,156,223, +157,223,156, +223,157,224, +158,224,157, +224,158,225, +159,225,158, +225,159,226, +160,226,159, +226,160,227, +161,227,160, +227,161,228, +162,228,161, +228,162,229, +163,229,162, +229,163,230, +164,230,163, +230,164,231, +165,231,164, +231,165,232, +166,232,165, +232,166,233, +167,233,166, +233,167,234, +168,234,167, +234,168,235, +169,235,168, +235,169,236, +170,236,169, +236,170,237, +171,237,170, +237,171,238, +172,238,171, +238,172,239, +173,239,172, +239,173,240, +174,240,173, +240,174,241, +175,241,174, +241,175,242, +176,242,175, +242,176,243, +177,243,176, +243,177,244, +178,244,177, +244,178,245, +179,245,178, +245,179,246, +180,246,179, +246,180,247, +181,247,180, +247,181,248, +182,248,181, +248,182,249, +183,249,182, +249,183,250, +184,250,183, +250,184,251, +185,251,184, +251,185,252, +186,252,185, +252,186,253, +187,253,186, +253,187,254, +188,254,187, +254,188,255, +189,255,188, +255,189,256, +190,256,189, +256,190,257, +191,257,190, +257,191,258, +192,258,191, +258,192,259, +193,259,192, +259,193,260, +194,260,193, +260,194,261, +195,261,194, +261,195,262, +196,262,195, +262,196,263, +197,263,196, +264,198,265, +199,265,198, +265,199,266, +200,266,199, +266,200,267, +201,267,200, +267,201,268, +202,268,201, +268,202,269, +203,269,202, +269,203,270, +204,270,203, +270,204,271, +205,271,204, +271,205,272, +206,272,205, +272,206,273, +207,273,206, +273,207,274, +208,274,207, +274,208,275, +209,275,208, +275,209,276, +210,276,209, +276,210,277, +211,277,210, +277,211,278, +212,278,211, +278,212,279, +213,279,212, +279,213,280, +214,280,213, +280,214,281, +215,281,214, +281,215,282, +216,282,215, +282,216,283, +217,283,216, +283,217,284, +218,284,217, +284,218,285, +219,285,218, +285,219,286, +220,286,219, +286,220,287, +221,287,220, +287,221,288, +222,288,221, +288,222,289, +223,289,222, +289,223,290, +224,290,223, +290,224,291, +225,291,224, +291,225,292, +226,292,225, +292,226,293, +227,293,226, +293,227,294, +228,294,227, +294,228,295, +229,295,228, +295,229,296, +230,296,229, +296,230,297, +231,297,230, +297,231,298, +232,298,231, +298,232,299, +233,299,232, +299,233,300, +234,300,233, +300,234,301, +235,301,234, +301,235,302, +236,302,235, +302,236,303, +237,303,236, +303,237,304, +238,304,237, +304,238,305, +239,305,238, +305,239,306, +240,306,239, +306,240,307, +241,307,240, +307,241,308, +242,308,241, +308,242,309, +243,309,242, +309,243,310, +244,310,243, +310,244,311, +245,311,244, +311,245,312, +246,312,245, +312,246,313, +247,313,246, +313,247,314, +248,314,247, +314,248,315, +249,315,248, +315,249,316, +250,316,249, +316,250,317, +251,317,250, +317,251,318, +252,318,251, +318,252,319, +253,319,252, +319,253,320, +254,320,253, +320,254,321, +255,321,254, +321,255,322, +256,322,255, +322,256,323, +257,323,256, +323,257,324, +258,324,257, +324,258,325, +259,325,258, +325,259,326, +260,326,259, +326,260,327, +261,327,260, +327,261,328, +262,328,261, +328,262,329, +263,329,262, +330,264,331, +265,331,264, +331,265,332, +266,332,265, +332,266,333, +267,333,266, +333,267,334, +268,334,267, +334,268,335, +269,335,268, +335,269,336, +270,336,269, +336,270,337, +271,337,270, +337,271,338, +272,338,271, +338,272,339, +273,339,272, +339,273,340, +274,340,273, +340,274,341, +275,341,274, +341,275,342, +276,342,275, +342,276,343, +277,343,276, +343,277,344, +278,344,277, +344,278,345, +279,345,278, +345,279,346, +280,346,279, +346,280,347, +281,347,280, +347,281,348, +282,348,281, +348,282,349, +283,349,282, +349,283,350, +284,350,283, +350,284,351, +285,351,284, +351,285,352, +286,352,285, +352,286,353, +287,353,286, +353,287,354, +288,354,287, +354,288,355, +289,355,288, +355,289,356, +290,356,289, +356,290,357, +291,357,290, +357,291,358, +292,358,291, +358,292,359, +293,359,292, +359,293,360, +294,360,293, +360,294,361, +295,361,294, +361,295,362, +296,362,295, +362,296,363, +297,363,296, +363,297,364, +298,364,297, +364,298,365, +299,365,298, +365,299,366, +300,366,299, +366,300,367, +301,367,300, +367,301,368, +302,368,301, +368,302,369, +303,369,302, +369,303,370, +304,370,303, +370,304,371, +305,371,304, +371,305,372, +306,372,305, +372,306,373, +307,373,306, +373,307,374, +308,374,307, +374,308,375, +309,375,308, +375,309,376, +310,376,309, +376,310,377, +311,377,310, +377,311,378, +312,378,311, +378,312,379, +313,379,312, +379,313,380, +314,380,313, +380,314,381, +315,381,314, +381,315,382, +316,382,315, +382,316,383, +317,383,316, +383,317,384, +318,384,317, +384,318,385, +319,385,318, +385,319,386, +320,386,319, +386,320,387, +321,387,320, +387,321,388, +322,388,321, +388,322,389, +323,389,322, +389,323,390, +324,390,323, +390,324,391, +325,391,324, +391,325,392, +326,392,325, +392,326,393, +327,393,326, +393,327,394, +328,394,327, +394,328,395, +329,395,328, +396,330,397, +331,397,330, +397,331,398, +332,398,331, +398,332,399, +333,399,332, +399,333,400, +334,400,333, +400,334,401, +335,401,334, +401,335,402, +336,402,335, +402,336,403, +337,403,336, +403,337,404, +338,404,337, +404,338,405, +339,405,338, +405,339,406, +340,406,339, +406,340,407, +341,407,340, +407,341,408, +342,408,341, +408,342,409, +343,409,342, +409,343,410, +344,410,343, +410,344,411, +345,411,344, +411,345,412, +346,412,345, +412,346,413, +347,413,346, +413,347,414, +348,414,347, +414,348,415, +349,415,348, +415,349,416, +350,416,349, +416,350,417, +351,417,350, +417,351,418, +352,418,351, +418,352,419, +353,419,352, +419,353,420, +354,420,353, +420,354,421, +355,421,354, +421,355,422, +356,422,355, +422,356,423, +357,423,356, +423,357,424, +358,424,357, +424,358,425, +359,425,358, +425,359,426, +360,426,359, +426,360,427, +361,427,360, +427,361,428, +362,428,361, +428,362,429, +363,429,362, +429,363,430, +364,430,363, +430,364,431, +365,431,364, +431,365,432, +366,432,365, +432,366,433, +367,433,366, +433,367,434, +368,434,367, +434,368,435, +369,435,368, +435,369,436, +370,436,369, +436,370,437, +371,437,370, +437,371,438, +372,438,371, +438,372,439, +373,439,372, +439,373,440, +374,440,373, +440,374,441, +375,441,374, +441,375,442, +376,442,375, +442,376,443, +377,443,376, +443,377,444, +378,444,377, +444,378,445, +379,445,378, +445,379,446, +380,446,379, +446,380,447, +381,447,380, +447,381,448, +382,448,381, +448,382,449, +383,449,382, +449,383,450, +384,450,383, +450,384,451, +385,451,384, +451,385,452, +386,452,385, +452,386,453, +387,453,386, +453,387,454, +388,454,387, +454,388,455, +389,455,388, +455,389,456, +390,456,389, +456,390,457, +391,457,390, +457,391,458, +392,458,391, +458,392,459, +393,459,392, +459,393,460, +394,460,393, +460,394,461, +395,461,394, +462,396,463, +397,463,396, +463,397,464, +398,464,397, +464,398,465, +399,465,398, +465,399,466, +400,466,399, +466,400,467, +401,467,400, +467,401,468, +402,468,401, +468,402,469, +403,469,402, +469,403,470, +404,470,403, +470,404,471, +405,471,404, +471,405,472, +406,472,405, +472,406,473, +407,473,406, +473,407,474, +408,474,407, +474,408,475, +409,475,408, +475,409,476, +410,476,409, +476,410,477, +411,477,410, +477,411,478, +412,478,411, +478,412,479, +413,479,412, +479,413,480, +414,480,413, +480,414,481, +415,481,414, +481,415,482, +416,482,415, +482,416,483, +417,483,416, +483,417,484, +418,484,417, +484,418,485, +419,485,418, +485,419,486, +420,486,419, +486,420,487, +421,487,420, +487,421,488, +422,488,421, +488,422,489, +423,489,422, +489,423,490, +424,490,423, +490,424,491, +425,491,424, +491,425,492, +426,492,425, +492,426,493, +427,493,426, +493,427,494, +428,494,427, +494,428,495, +429,495,428, +495,429,496, +430,496,429, +496,430,497, +431,497,430, +497,431,498, +432,498,431, +498,432,499, +433,499,432, +499,433,500, +434,500,433, +500,434,501, +435,501,434, +501,435,502, +436,502,435, +502,436,503, +437,503,436, +503,437,504, +438,504,437, +504,438,505, +439,505,438, +505,439,506, +440,506,439, +506,440,507, +441,507,440, +507,441,508, +442,508,441, +508,442,509, +443,509,442, +509,443,510, +444,510,443, +510,444,511, +445,511,444, +511,445,512, +446,512,445, +512,446,513, +447,513,446, +513,447,514, +448,514,447, +514,448,515, +449,515,448, +515,449,516, +450,516,449, +516,450,517, +451,517,450, +517,451,518, +452,518,451, +518,452,519, +453,519,452, +519,453,520, +454,520,453, +520,454,521, +455,521,454, +521,455,522, +456,522,455, +522,456,523, +457,523,456, +523,457,524, +458,524,457, +524,458,525, +459,525,458, +525,459,526, +460,526,459, +526,460,527, +461,527,460, +528,462,529, +463,529,462, +529,463,530, +464,530,463, +530,464,531, +465,531,464, +531,465,532, +466,532,465, +532,466,533, +467,533,466, +533,467,534, +468,534,467, +534,468,535, +469,535,468, +535,469,536, +470,536,469, +536,470,537, +471,537,470, +537,471,538, +472,538,471, +538,472,539, +473,539,472, +539,473,540, +474,540,473, +540,474,541, +475,541,474, +541,475,542, +476,542,475, +542,476,543, +477,543,476, +543,477,544, +478,544,477, +544,478,545, +479,545,478, +545,479,546, +480,546,479, +546,480,547, +481,547,480, +547,481,548, +482,548,481, +548,482,549, +483,549,482, +549,483,550, +484,550,483, +550,484,551, +485,551,484, +551,485,552, +486,552,485, +552,486,553, +487,553,486, +553,487,554, +488,554,487, +554,488,555, +489,555,488, +555,489,556, +490,556,489, +556,490,557, +491,557,490, +557,491,558, +492,558,491, +558,492,559, +493,559,492, +559,493,560, +494,560,493, +560,494,561, +495,561,494, +561,495,562, +496,562,495, +562,496,563, +497,563,496, +563,497,564, +498,564,497, +564,498,565, +499,565,498, +565,499,566, +500,566,499, +566,500,567, +501,567,500, +567,501,568, +502,568,501, +568,502,569, +503,569,502, +569,503,570, +504,570,503, +570,504,571, +505,571,504, +571,505,572, +506,572,505, +572,506,573, +507,573,506, +573,507,574, +508,574,507, +574,508,575, +509,575,508, +575,509,576, +510,576,509, +576,510,577, +511,577,510, +577,511,578, +512,578,511, +578,512,579, +513,579,512, +579,513,580, +514,580,513, +580,514,581, +515,581,514, +581,515,582, +516,582,515, +582,516,583, +517,583,516, +583,517,584, +518,584,517, +584,518,585, +519,585,518, +585,519,586, +520,586,519, +586,520,587, +521,587,520, +587,521,588, +522,588,521, +588,522,589, +523,589,522, +589,523,590, +524,590,523, +590,524,591, +525,591,524, +591,525,592, +526,592,525, +592,526,593, +527,593,526, +594,528,595, +529,595,528, +595,529,596, +530,596,529, +596,530,597, +531,597,530, +597,531,598, +532,598,531, +598,532,599, +533,599,532, +599,533,600, +534,600,533, +600,534,601, +535,601,534, +601,535,602, +536,602,535, +602,536,603, +537,603,536, +603,537,604, +538,604,537, +604,538,605, +539,605,538, +605,539,606, +540,606,539, +606,540,607, +541,607,540, +607,541,608, +542,608,541, +608,542,609, +543,609,542, +609,543,610, +544,610,543, +610,544,611, +545,611,544, +611,545,612, +546,612,545, +612,546,613, +547,613,546, +613,547,614, +548,614,547, +614,548,615, +549,615,548, +615,549,616, +550,616,549, +616,550,617, +551,617,550, +617,551,618, +552,618,551, +618,552,619, +553,619,552, +619,553,620, +554,620,553, +620,554,621, +555,621,554, +621,555,622, +556,622,555, +622,556,623, +557,623,556, +623,557,624, +558,624,557, +624,558,625, +559,625,558, +625,559,626, +560,626,559, +626,560,627, +561,627,560, +627,561,628, +562,628,561, +628,562,629, +563,629,562, +629,563,630, +564,630,563, +630,564,631, +565,631,564, +631,565,632, +566,632,565, +632,566,633, +567,633,566, +633,567,634, +568,634,567, +634,568,635, +569,635,568, +635,569,636, +570,636,569, +636,570,637, +571,637,570, +637,571,638, +572,638,571, +638,572,639, +573,639,572, +639,573,640, +574,640,573, +640,574,641, +575,641,574, +641,575,642, +576,642,575, +642,576,643, +577,643,576, +643,577,644, +578,644,577, +644,578,645, +579,645,578, +645,579,646, +580,646,579, +646,580,647, +581,647,580, +647,581,648, +582,648,581, +648,582,649, +583,649,582, +649,583,650, +584,650,583, +650,584,651, +585,651,584, +651,585,652, +586,652,585, +652,586,653, +587,653,586, +653,587,654, +588,654,587, +654,588,655, +589,655,588, +655,589,656, +590,656,589, +656,590,657, +591,657,590, +657,591,658, +592,658,591, +658,592,659, +593,659,592, +660,594,661, +595,661,594, +661,595,662, +596,662,595, +662,596,663, +597,663,596, +663,597,664, +598,664,597, +664,598,665, +599,665,598, +665,599,666, +600,666,599, +666,600,667, +601,667,600, +667,601,668, +602,668,601, +668,602,669, +603,669,602, +669,603,670, +604,670,603, +670,604,671, +605,671,604, +671,605,672, +606,672,605, +672,606,673, +607,673,606, +673,607,674, +608,674,607, +674,608,675, +609,675,608, +675,609,676, +610,676,609, +676,610,677, +611,677,610, +677,611,678, +612,678,611, +678,612,679, +613,679,612, +679,613,680, +614,680,613, +680,614,681, +615,681,614, +681,615,682, +616,682,615, +682,616,683, +617,683,616, +683,617,684, +618,684,617, +684,618,685, +619,685,618, +685,619,686, +620,686,619, +686,620,687, +621,687,620, +687,621,688, +622,688,621, +688,622,689, +623,689,622, +689,623,690, +624,690,623, +690,624,691, +625,691,624, +691,625,692, +626,692,625, +692,626,693, +627,693,626, +693,627,694, +628,694,627, +694,628,695, +629,695,628, +695,629,696, +630,696,629, +696,630,697, +631,697,630, +697,631,698, +632,698,631, +698,632,699, +633,699,632, +699,633,700, +634,700,633, +700,634,701, +635,701,634, +701,635,702, +636,702,635, +702,636,703, +637,703,636, +703,637,704, +638,704,637, +704,638,705, +639,705,638, +705,639,706, +640,706,639, +706,640,707, +641,707,640, +707,641,708, +642,708,641, +708,642,709, +643,709,642, +709,643,710, +644,710,643, +710,644,711, +645,711,644, +711,645,712, +646,712,645, +712,646,713, +647,713,646, +713,647,714, +648,714,647, +714,648,715, +649,715,648, +715,649,716, +650,716,649, +716,650,717, +651,717,650, +717,651,718, +652,718,651, +718,652,719, +653,719,652, +719,653,720, +654,720,653, +720,654,721, +655,721,654, +721,655,722, +656,722,655, +722,656,723, +657,723,656, +723,657,724, +658,724,657, +724,658,725, +659,725,658, +726,660,727, +661,727,660, +727,661,728, +662,728,661, +728,662,729, +663,729,662, +729,663,730, +664,730,663, +730,664,731, +665,731,664, +731,665,732, +666,732,665, +732,666,733, +667,733,666, +733,667,734, +668,734,667, +734,668,735, +669,735,668, +735,669,736, +670,736,669, +736,670,737, +671,737,670, +737,671,738, +672,738,671, +738,672,739, +673,739,672, +739,673,740, +674,740,673, +740,674,741, +675,741,674, +741,675,742, +676,742,675, +742,676,743, +677,743,676, +743,677,744, +678,744,677, +744,678,745, +679,745,678, +745,679,746, +680,746,679, +746,680,747, +681,747,680, +747,681,748, +682,748,681, +748,682,749, +683,749,682, +749,683,750, +684,750,683, +750,684,751, +685,751,684, +751,685,752, +686,752,685, +752,686,753, +687,753,686, +753,687,754, +688,754,687, +754,688,755, +689,755,688, +755,689,756, +690,756,689, +756,690,757, +691,757,690, +757,691,758, +692,758,691, +758,692,759, +693,759,692, +759,693,760, +694,760,693, +760,694,761, +695,761,694, +761,695,762, +696,762,695, +762,696,763, +697,763,696, +763,697,764, +698,764,697, +764,698,765, +699,765,698, +765,699,766, +700,766,699, +766,700,767, +701,767,700, +767,701,768, +702,768,701, +768,702,769, +703,769,702, +769,703,770, +704,770,703, +770,704,771, +705,771,704, +771,705,772, +706,772,705, +772,706,773, +707,773,706, +773,707,774, +708,774,707, +774,708,775, +709,775,708, +775,709,776, +710,776,709, +776,710,777, +711,777,710, +777,711,778, +712,778,711, +778,712,779, +713,779,712, +779,713,780, +714,780,713, +780,714,781, +715,781,714, +781,715,782, +716,782,715, +782,716,783, +717,783,716, +783,717,784, +718,784,717, +784,718,785, +719,785,718, +785,719,786, +720,786,719, +786,720,787, +721,787,720, +787,721,788, +722,788,721, +788,722,789, +723,789,722, +789,723,790, +724,790,723, +790,724,791, +725,791,724, +792,726,793, +727,793,726, +793,727,794, +728,794,727, +794,728,795, +729,795,728, +795,729,796, +730,796,729, +796,730,797, +731,797,730, +797,731,798, +732,798,731, +798,732,799, +733,799,732, +799,733,800, +734,800,733, +800,734,801, +735,801,734, +801,735,802, +736,802,735, +802,736,803, +737,803,736, +803,737,804, +738,804,737, +804,738,805, +739,805,738, +805,739,806, +740,806,739, +806,740,807, +741,807,740, +807,741,808, +742,808,741, +808,742,809, +743,809,742, +809,743,810, +744,810,743, +810,744,811, +745,811,744, +811,745,812, +746,812,745, +812,746,813, +747,813,746, +813,747,814, +748,814,747, +814,748,815, +749,815,748, +815,749,816, +750,816,749, +816,750,817, +751,817,750, +817,751,818, +752,818,751, +818,752,819, +753,819,752, +819,753,820, +754,820,753, +820,754,821, +755,821,754, +821,755,822, +756,822,755, +822,756,823, +757,823,756, +823,757,824, +758,824,757, +824,758,825, +759,825,758, +825,759,826, +760,826,759, +826,760,827, +761,827,760, +827,761,828, +762,828,761, +828,762,829, +763,829,762, +829,763,830, +764,830,763, +830,764,831, +765,831,764, +831,765,832, +766,832,765, +832,766,833, +767,833,766, +833,767,834, +768,834,767, +834,768,835, +769,835,768, +835,769,836, +770,836,769, +836,770,837, +771,837,770, +837,771,838, +772,838,771, +838,772,839, +773,839,772, +839,773,840, +774,840,773, +840,774,841, +775,841,774, +841,775,842, +776,842,775, +842,776,843, +777,843,776, +843,777,844, +778,844,777, +844,778,845, +779,845,778, +845,779,846, +780,846,779, +846,780,847, +781,847,780, +847,781,848, +782,848,781, +848,782,849, +783,849,782, +849,783,850, +784,850,783, +850,784,851, +785,851,784, +851,785,852, +786,852,785, +852,786,853, +787,853,786, +853,787,854, +788,854,787, +854,788,855, +789,855,788, +855,789,856, +790,856,789, +856,790,857, +791,857,790, +858,792,859, +793,859,792, +859,793,860, +794,860,793, +860,794,861, +795,861,794, +861,795,862, +796,862,795, +862,796,863, +797,863,796, +863,797,864, +798,864,797, +864,798,865, +799,865,798, +865,799,866, +800,866,799, +866,800,867, +801,867,800, +867,801,868, +802,868,801, +868,802,869, +803,869,802, +869,803,870, +804,870,803, +870,804,871, +805,871,804, +871,805,872, +806,872,805, +872,806,873, +807,873,806, +873,807,874, +808,874,807, +874,808,875, +809,875,808, +875,809,876, +810,876,809, +876,810,877, +811,877,810, +877,811,878, +812,878,811, +878,812,879, +813,879,812, +879,813,880, +814,880,813, +880,814,881, +815,881,814, +881,815,882, +816,882,815, +882,816,883, +817,883,816, +883,817,884, +818,884,817, +884,818,885, +819,885,818, +885,819,886, +820,886,819, +886,820,887, +821,887,820, +887,821,888, +822,888,821, +888,822,889, +823,889,822, +889,823,890, +824,890,823, +890,824,891, +825,891,824, +891,825,892, +826,892,825, +892,826,893, +827,893,826, +893,827,894, +828,894,827, +894,828,895, +829,895,828, +895,829,896, +830,896,829, +896,830,897, +831,897,830, +897,831,898, +832,898,831, +898,832,899, +833,899,832, +899,833,900, +834,900,833, +900,834,901, +835,901,834, +901,835,902, +836,902,835, +902,836,903, +837,903,836, +903,837,904, +838,904,837, +904,838,905, +839,905,838, +905,839,906, +840,906,839, +906,840,907, +841,907,840, +907,841,908, +842,908,841, +908,842,909, +843,909,842, +909,843,910, +844,910,843, +910,844,911, +845,911,844, +911,845,912, +846,912,845, +912,846,913, +847,913,846, +913,847,914, +848,914,847, +914,848,915, +849,915,848, +915,849,916, +850,916,849, +916,850,917, +851,917,850, +917,851,918, +852,918,851, +918,852,919, +853,919,852, +919,853,920, +854,920,853, +920,854,921, +855,921,854, +921,855,922, +856,922,855, +922,856,923, +857,923,856, +924,858,925, +859,925,858, +925,859,926, +860,926,859, +926,860,927, +861,927,860, +927,861,928, +862,928,861, +928,862,929, +863,929,862, +929,863,930, +864,930,863, +930,864,931, +865,931,864, +931,865,932, +866,932,865, +932,866,933, +867,933,866, +933,867,934, +868,934,867, +934,868,935, +869,935,868, +935,869,936, +870,936,869, +936,870,937, +871,937,870, +937,871,938, +872,938,871, +938,872,939, +873,939,872, +939,873,940, +874,940,873, +940,874,941, +875,941,874, +941,875,942, +876,942,875, +942,876,943, +877,943,876, +943,877,944, +878,944,877, +944,878,945, +879,945,878, +945,879,946, +880,946,879, +946,880,947, +881,947,880, +947,881,948, +882,948,881, +948,882,949, +883,949,882, +949,883,950, +884,950,883, +950,884,951, +885,951,884, +951,885,952, +886,952,885, +952,886,953, +887,953,886, +953,887,954, +888,954,887, +954,888,955, +889,955,888, +955,889,956, +890,956,889, +956,890,957, +891,957,890, +957,891,958, +892,958,891, +958,892,959, +893,959,892, +959,893,960, +894,960,893, +960,894,961, +895,961,894, +961,895,962, +896,962,895, +962,896,963, +897,963,896, +963,897,964, +898,964,897, +964,898,965, +899,965,898, +965,899,966, +900,966,899, +966,900,967, +901,967,900, +967,901,968, +902,968,901, +968,902,969, +903,969,902, +969,903,970, +904,970,903, +970,904,971, +905,971,904, +971,905,972, +906,972,905, +972,906,973, +907,973,906, +973,907,974, +908,974,907, +974,908,975, +909,975,908, +975,909,976, +910,976,909, +976,910,977, +911,977,910, +977,911,978, +912,978,911, +978,912,979, +913,979,912, +979,913,980, +914,980,913, +980,914,981, +915,981,914, +981,915,982, +916,982,915, +982,916,983, +917,983,916, +983,917,984, +918,984,917, +984,918,985, +919,985,918, +985,919,986, +920,986,919, +986,920,987, +921,987,920, +987,921,988, +922,988,921, +988,922,989, +923,989,922, +990,924,991, +925,991,924, +991,925,992, +926,992,925, +992,926,993, +927,993,926, +993,927,994, +928,994,927, +994,928,995, +929,995,928, +995,929,996, +930,996,929, +996,930,997, +931,997,930, +997,931,998, +932,998,931, +998,932,999, +933,999,932, +999,933,1000, +934,1000,933, +1000,934,1001, +935,1001,934, +1001,935,1002, +936,1002,935, +1002,936,1003, +937,1003,936, +1003,937,1004, +938,1004,937, +1004,938,1005, +939,1005,938, +1005,939,1006, +940,1006,939, +1006,940,1007, +941,1007,940, +1007,941,1008, +942,1008,941, +1008,942,1009, +943,1009,942, +1009,943,1010, +944,1010,943, +1010,944,1011, +945,1011,944, +1011,945,1012, +946,1012,945, +1012,946,1013, +947,1013,946, +1013,947,1014, +948,1014,947, +1014,948,1015, +949,1015,948, +1015,949,1016, +950,1016,949, +1016,950,1017, +951,1017,950, +1017,951,1018, +952,1018,951, +1018,952,1019, +953,1019,952, +1019,953,1020, +954,1020,953, +1020,954,1021, +955,1021,954, +1021,955,1022, +956,1022,955, +1022,956,1023, +957,1023,956, +1023,957,1024, +958,1024,957, +1024,958,1025, +959,1025,958, +1025,959,1026, +960,1026,959, +1026,960,1027, +961,1027,960, +1027,961,1028, +962,1028,961, +1028,962,1029, +963,1029,962, +1029,963,1030, +964,1030,963, +1030,964,1031, +965,1031,964, +1031,965,1032, +966,1032,965, +1032,966,1033, +967,1033,966, +1033,967,1034, +968,1034,967, +1034,968,1035, +969,1035,968, +1035,969,1036, +970,1036,969, +1036,970,1037, +971,1037,970, +1037,971,1038, +972,1038,971, +1038,972,1039, +973,1039,972, +1039,973,1040, +974,1040,973, +1040,974,1041, +975,1041,974, +1041,975,1042, +976,1042,975, +1042,976,1043, +977,1043,976, +1043,977,1044, +978,1044,977, +1044,978,1045, +979,1045,978, +1045,979,1046, +980,1046,979, +1046,980,1047, +981,1047,980, +1047,981,1048, +982,1048,981, +1048,982,1049, +983,1049,982, +1049,983,1050, +984,1050,983, +1050,984,1051, +985,1051,984, +1051,985,1052, +986,1052,985, +1052,986,1053, +987,1053,986, +1053,987,1054, +988,1054,987, +1054,988,1055, +989,1055,988, +1056,990,1057, +991,1057,990, +1057,991,1058, +992,1058,991, +1058,992,1059, +993,1059,992, +1059,993,1060, +994,1060,993, +1060,994,1061, +995,1061,994, +1061,995,1062, +996,1062,995, +1062,996,1063, +997,1063,996, +1063,997,1064, +998,1064,997, +1064,998,1065, +999,1065,998, +1065,999,1066, +1000,1066,999, +1066,1000,1067, +1001,1067,1000, +1067,1001,1068, +1002,1068,1001, +1068,1002,1069, +1003,1069,1002, +1069,1003,1070, +1004,1070,1003, +1070,1004,1071, +1005,1071,1004, +1071,1005,1072, +1006,1072,1005, +1072,1006,1073, +1007,1073,1006, +1073,1007,1074, +1008,1074,1007, +1074,1008,1075, +1009,1075,1008, +1075,1009,1076, +1010,1076,1009, +1076,1010,1077, +1011,1077,1010, +1077,1011,1078, +1012,1078,1011, +1078,1012,1079, +1013,1079,1012, +1079,1013,1080, +1014,1080,1013, +1080,1014,1081, +1015,1081,1014, +1081,1015,1082, +1016,1082,1015, +1082,1016,1083, +1017,1083,1016, +1083,1017,1084, +1018,1084,1017, +1084,1018,1085, +1019,1085,1018, +1085,1019,1086, +1020,1086,1019, +1086,1020,1087, +1021,1087,1020, +1087,1021,1088, +1022,1088,1021, +1088,1022,1089, +1023,1089,1022, +1089,1023,1090, +1024,1090,1023, +1090,1024,1091, +1025,1091,1024, +1091,1025,1092, +1026,1092,1025, +1092,1026,1093, +1027,1093,1026, +1093,1027,1094, +1028,1094,1027, +1094,1028,1095, +1029,1095,1028, +1095,1029,1096, +1030,1096,1029, +1096,1030,1097, +1031,1097,1030, +1097,1031,1098, +1032,1098,1031, +1098,1032,1099, +1033,1099,1032, +1099,1033,1100, +1034,1100,1033, +1100,1034,1101, +1035,1101,1034, +1101,1035,1102, +1036,1102,1035, +1102,1036,1103, +1037,1103,1036, +1103,1037,1104, +1038,1104,1037, +1104,1038,1105, +1039,1105,1038, +1105,1039,1106, +1040,1106,1039, +1106,1040,1107, +1041,1107,1040, +1107,1041,1108, +1042,1108,1041, +1108,1042,1109, +1043,1109,1042, +1109,1043,1110, +1044,1110,1043, +1110,1044,1111, +1045,1111,1044, +1111,1045,1112, +1046,1112,1045, +1112,1046,1113, +1047,1113,1046, +1113,1047,1114, +1048,1114,1047, +1114,1048,1115, +1049,1115,1048, +1115,1049,1116, +1050,1116,1049, +1116,1050,1117, +1051,1117,1050, +1117,1051,1118, +1052,1118,1051, +1118,1052,1119, +1053,1119,1052, +1119,1053,1120, +1054,1120,1053, +1120,1054,1121, +1055,1121,1054, +1122,1056,1123, +1057,1123,1056, +1123,1057,1124, +1058,1124,1057, +1124,1058,1125, +1059,1125,1058, +1125,1059,1126, +1060,1126,1059, +1126,1060,1127, +1061,1127,1060, +1127,1061,1128, +1062,1128,1061, +1128,1062,1129, +1063,1129,1062, +1129,1063,1130, +1064,1130,1063, +1130,1064,1131, +1065,1131,1064, +1131,1065,1132, +1066,1132,1065, +1132,1066,1133, +1067,1133,1066, +1133,1067,1134, +1068,1134,1067, +1134,1068,1135, +1069,1135,1068, +1135,1069,1136, +1070,1136,1069, +1136,1070,1137, +1071,1137,1070, +1137,1071,1138, +1072,1138,1071, +1138,1072,1139, +1073,1139,1072, +1139,1073,1140, +1074,1140,1073, +1140,1074,1141, +1075,1141,1074, +1141,1075,1142, +1076,1142,1075, +1142,1076,1143, +1077,1143,1076, +1143,1077,1144, +1078,1144,1077, +1144,1078,1145, +1079,1145,1078, +1145,1079,1146, +1080,1146,1079, +1146,1080,1147, +1081,1147,1080, +1147,1081,1148, +1082,1148,1081, +1148,1082,1149, +1083,1149,1082, +1149,1083,1150, +1084,1150,1083, +1150,1084,1151, +1085,1151,1084, +1151,1085,1152, +1086,1152,1085, +1152,1086,1153, +1087,1153,1086, +1153,1087,1154, +1088,1154,1087, +1154,1088,1155, +1089,1155,1088, +1155,1089,1156, +1090,1156,1089, +1156,1090,1157, +1091,1157,1090, +1157,1091,1158, +1092,1158,1091, +1158,1092,1159, +1093,1159,1092, +1159,1093,1160, +1094,1160,1093, +1160,1094,1161, +1095,1161,1094, +1161,1095,1162, +1096,1162,1095, +1162,1096,1163, +1097,1163,1096, +1163,1097,1164, +1098,1164,1097, +1164,1098,1165, +1099,1165,1098, +1165,1099,1166, +1100,1166,1099, +1166,1100,1167, +1101,1167,1100, +1167,1101,1168, +1102,1168,1101, +1168,1102,1169, +1103,1169,1102, +1169,1103,1170, +1104,1170,1103, +1170,1104,1171, +1105,1171,1104, +1171,1105,1172, +1106,1172,1105, +1172,1106,1173, +1107,1173,1106, +1173,1107,1174, +1108,1174,1107, +1174,1108,1175, +1109,1175,1108, +1175,1109,1176, +1110,1176,1109, +1176,1110,1177, +1111,1177,1110, +1177,1111,1178, +1112,1178,1111, +1178,1112,1179, +1113,1179,1112, +1179,1113,1180, +1114,1180,1113, +1180,1114,1181, +1115,1181,1114, +1181,1115,1182, +1116,1182,1115, +1182,1116,1183, +1117,1183,1116, +1183,1117,1184, +1118,1184,1117, +1184,1118,1185, +1119,1185,1118, +1185,1119,1186, +1120,1186,1119, +1186,1120,1187, +1121,1187,1120, +1188,1122,1189, +1123,1189,1122, +1189,1123,1190, +1124,1190,1123, +1190,1124,1191, +1125,1191,1124, +1191,1125,1192, +1126,1192,1125, +1192,1126,1193, +1127,1193,1126, +1193,1127,1194, +1128,1194,1127, +1194,1128,1195, +1129,1195,1128, +1195,1129,1196, +1130,1196,1129, +1196,1130,1197, +1131,1197,1130, +1197,1131,1198, +1132,1198,1131, +1198,1132,1199, +1133,1199,1132, +1199,1133,1200, +1134,1200,1133, +1200,1134,1201, +1135,1201,1134, +1201,1135,1202, +1136,1202,1135, +1202,1136,1203, +1137,1203,1136, +1203,1137,1204, +1138,1204,1137, +1204,1138,1205, +1139,1205,1138, +1205,1139,1206, +1140,1206,1139, +1206,1140,1207, +1141,1207,1140, +1207,1141,1208, +1142,1208,1141, +1208,1142,1209, +1143,1209,1142, +1209,1143,1210, +1144,1210,1143, +1210,1144,1211, +1145,1211,1144, +1211,1145,1212, +1146,1212,1145, +1212,1146,1213, +1147,1213,1146, +1213,1147,1214, +1148,1214,1147, +1214,1148,1215, +1149,1215,1148, +1215,1149,1216, +1150,1216,1149, +1216,1150,1217, +1151,1217,1150, +1217,1151,1218, +1152,1218,1151, +1218,1152,1219, +1153,1219,1152, +1219,1153,1220, +1154,1220,1153, +1220,1154,1221, +1155,1221,1154, +1221,1155,1222, +1156,1222,1155, +1222,1156,1223, +1157,1223,1156, +1223,1157,1224, +1158,1224,1157, +1224,1158,1225, +1159,1225,1158, +1225,1159,1226, +1160,1226,1159, +1226,1160,1227, +1161,1227,1160, +1227,1161,1228, +1162,1228,1161, +1228,1162,1229, +1163,1229,1162, +1229,1163,1230, +1164,1230,1163, +1230,1164,1231, +1165,1231,1164, +1231,1165,1232, +1166,1232,1165, +1232,1166,1233, +1167,1233,1166, +1233,1167,1234, +1168,1234,1167, +1234,1168,1235, +1169,1235,1168, +1235,1169,1236, +1170,1236,1169, +1236,1170,1237, +1171,1237,1170, +1237,1171,1238, +1172,1238,1171, +1238,1172,1239, +1173,1239,1172, +1239,1173,1240, +1174,1240,1173, +1240,1174,1241, +1175,1241,1174, +1241,1175,1242, +1176,1242,1175, +1242,1176,1243, +1177,1243,1176, +1243,1177,1244, +1178,1244,1177, +1244,1178,1245, +1179,1245,1178, +1245,1179,1246, +1180,1246,1179, +1246,1180,1247, +1181,1247,1180, +1247,1181,1248, +1182,1248,1181, +1248,1182,1249, +1183,1249,1182, +1249,1183,1250, +1184,1250,1183, +1250,1184,1251, +1185,1251,1184, +1251,1185,1252, +1186,1252,1185, +1252,1186,1253, +1187,1253,1186, +1254,1188,1255, +1189,1255,1188, +1255,1189,1256, +1190,1256,1189, +1256,1190,1257, +1191,1257,1190, +1257,1191,1258, +1192,1258,1191, +1258,1192,1259, +1193,1259,1192, +1259,1193,1260, +1194,1260,1193, +1260,1194,1261, +1195,1261,1194, +1261,1195,1262, +1196,1262,1195, +1262,1196,1263, +1197,1263,1196, +1263,1197,1264, +1198,1264,1197, +1264,1198,1265, +1199,1265,1198, +1265,1199,1266, +1200,1266,1199, +1266,1200,1267, +1201,1267,1200, +1267,1201,1268, +1202,1268,1201, +1268,1202,1269, +1203,1269,1202, +1269,1203,1270, +1204,1270,1203, +1270,1204,1271, +1205,1271,1204, +1271,1205,1272, +1206,1272,1205, +1272,1206,1273, +1207,1273,1206, +1273,1207,1274, +1208,1274,1207, +1274,1208,1275, +1209,1275,1208, +1275,1209,1276, +1210,1276,1209, +1276,1210,1277, +1211,1277,1210, +1277,1211,1278, +1212,1278,1211, +1278,1212,1279, +1213,1279,1212, +1279,1213,1280, +1214,1280,1213, +1280,1214,1281, +1215,1281,1214, +1281,1215,1282, +1216,1282,1215, +1282,1216,1283, +1217,1283,1216, +1283,1217,1284, +1218,1284,1217, +1284,1218,1285, +1219,1285,1218, +1285,1219,1286, +1220,1286,1219, +1286,1220,1287, +1221,1287,1220, +1287,1221,1288, +1222,1288,1221, +1288,1222,1289, +1223,1289,1222, +1289,1223,1290, +1224,1290,1223, +1290,1224,1291, +1225,1291,1224, +1291,1225,1292, +1226,1292,1225, +1292,1226,1293, +1227,1293,1226, +1293,1227,1294, +1228,1294,1227, +1294,1228,1295, +1229,1295,1228, +1295,1229,1296, +1230,1296,1229, +1296,1230,1297, +1231,1297,1230, +1297,1231,1298, +1232,1298,1231, +1298,1232,1299, +1233,1299,1232, +1299,1233,1300, +1234,1300,1233, +1300,1234,1301, +1235,1301,1234, +1301,1235,1302, +1236,1302,1235, +1302,1236,1303, +1237,1303,1236, +1303,1237,1304, +1238,1304,1237, +1304,1238,1305, +1239,1305,1238, +1305,1239,1306, +1240,1306,1239, +1306,1240,1307, +1241,1307,1240, +1307,1241,1308, +1242,1308,1241, +1308,1242,1309, +1243,1309,1242, +1309,1243,1310, +1244,1310,1243, +1310,1244,1311, +1245,1311,1244, +1311,1245,1312, +1246,1312,1245, +1312,1246,1313, +1247,1313,1246, +1313,1247,1314, +1248,1314,1247, +1314,1248,1315, +1249,1315,1248, +1315,1249,1316, +1250,1316,1249, +1316,1250,1317, +1251,1317,1250, +1317,1251,1318, +1252,1318,1251, +1318,1252,1319, +1253,1319,1252, +1320,1254,1321, +1255,1321,1254, +1321,1255,1322, +1256,1322,1255, +1322,1256,1323, +1257,1323,1256, +1323,1257,1324, +1258,1324,1257, +1324,1258,1325, +1259,1325,1258, +1325,1259,1326, +1260,1326,1259, +1326,1260,1327, +1261,1327,1260, +1327,1261,1328, +1262,1328,1261, +1328,1262,1329, +1263,1329,1262, +1329,1263,1330, +1264,1330,1263, +1330,1264,1331, +1265,1331,1264, +1331,1265,1332, +1266,1332,1265, +1332,1266,1333, +1267,1333,1266, +1333,1267,1334, +1268,1334,1267, +1334,1268,1335, +1269,1335,1268, +1335,1269,1336, +1270,1336,1269, +1336,1270,1337, +1271,1337,1270, +1337,1271,1338, +1272,1338,1271, +1338,1272,1339, +1273,1339,1272, +1339,1273,1340, +1274,1340,1273, +1340,1274,1341, +1275,1341,1274, +1341,1275,1342, +1276,1342,1275, +1342,1276,1343, +1277,1343,1276, +1343,1277,1344, +1278,1344,1277, +1344,1278,1345, +1279,1345,1278, +1345,1279,1346, +1280,1346,1279, +1346,1280,1347, +1281,1347,1280, +1347,1281,1348, +1282,1348,1281, +1348,1282,1349, +1283,1349,1282, +1349,1283,1350, +1284,1350,1283, +1350,1284,1351, +1285,1351,1284, +1351,1285,1352, +1286,1352,1285, +1352,1286,1353, +1287,1353,1286, +1353,1287,1354, +1288,1354,1287, +1354,1288,1355, +1289,1355,1288, +1355,1289,1356, +1290,1356,1289, +1356,1290,1357, +1291,1357,1290, +1357,1291,1358, +1292,1358,1291, +1358,1292,1359, +1293,1359,1292, +1359,1293,1360, +1294,1360,1293, +1360,1294,1361, +1295,1361,1294, +1361,1295,1362, +1296,1362,1295, +1362,1296,1363, +1297,1363,1296, +1363,1297,1364, +1298,1364,1297, +1364,1298,1365, +1299,1365,1298, +1365,1299,1366, +1300,1366,1299, +1366,1300,1367, +1301,1367,1300, +1367,1301,1368, +1302,1368,1301, +1368,1302,1369, +1303,1369,1302, +1369,1303,1370, +1304,1370,1303, +1370,1304,1371, +1305,1371,1304, +1371,1305,1372, +1306,1372,1305, +1372,1306,1373, +1307,1373,1306, +1373,1307,1374, +1308,1374,1307, +1374,1308,1375, +1309,1375,1308, +1375,1309,1376, +1310,1376,1309, +1376,1310,1377, +1311,1377,1310, +1377,1311,1378, +1312,1378,1311, +1378,1312,1379, +1313,1379,1312, +1379,1313,1380, +1314,1380,1313, +1380,1314,1381, +1315,1381,1314, +1381,1315,1382, +1316,1382,1315, +1382,1316,1383, +1317,1383,1316, +1383,1317,1384, +1318,1384,1317, +1384,1318,1385, +1319,1385,1318, +1386,1320,1387, +1321,1387,1320, +1387,1321,1388, +1322,1388,1321, +1388,1322,1389, +1323,1389,1322, +1389,1323,1390, +1324,1390,1323, +1390,1324,1391, +1325,1391,1324, +1391,1325,1392, +1326,1392,1325, +1392,1326,1393, +1327,1393,1326, +1393,1327,1394, +1328,1394,1327, +1394,1328,1395, +1329,1395,1328, +1395,1329,1396, +1330,1396,1329, +1396,1330,1397, +1331,1397,1330, +1397,1331,1398, +1332,1398,1331, +1398,1332,1399, +1333,1399,1332, +1399,1333,1400, +1334,1400,1333, +1400,1334,1401, +1335,1401,1334, +1401,1335,1402, +1336,1402,1335, +1402,1336,1403, +1337,1403,1336, +1403,1337,1404, +1338,1404,1337, +1404,1338,1405, +1339,1405,1338, +1405,1339,1406, +1340,1406,1339, +1406,1340,1407, +1341,1407,1340, +1407,1341,1408, +1342,1408,1341, +1408,1342,1409, +1343,1409,1342, +1409,1343,1410, +1344,1410,1343, +1410,1344,1411, +1345,1411,1344, +1411,1345,1412, +1346,1412,1345, +1412,1346,1413, +1347,1413,1346, +1413,1347,1414, +1348,1414,1347, +1414,1348,1415, +1349,1415,1348, +1415,1349,1416, +1350,1416,1349, +1416,1350,1417, +1351,1417,1350, +1417,1351,1418, +1352,1418,1351, +1418,1352,1419, +1353,1419,1352, +1419,1353,1420, +1354,1420,1353, +1420,1354,1421, +1355,1421,1354, +1421,1355,1422, +1356,1422,1355, +1422,1356,1423, +1357,1423,1356, +1423,1357,1424, +1358,1424,1357, +1424,1358,1425, +1359,1425,1358, +1425,1359,1426, +1360,1426,1359, +1426,1360,1427, +1361,1427,1360, +1427,1361,1428, +1362,1428,1361, +1428,1362,1429, +1363,1429,1362, +1429,1363,1430, +1364,1430,1363, +1430,1364,1431, +1365,1431,1364, +1431,1365,1432, +1366,1432,1365, +1432,1366,1433, +1367,1433,1366, +1433,1367,1434, +1368,1434,1367, +1434,1368,1435, +1369,1435,1368, +1435,1369,1436, +1370,1436,1369, +1436,1370,1437, +1371,1437,1370, +1437,1371,1438, +1372,1438,1371, +1438,1372,1439, +1373,1439,1372, +1439,1373,1440, +1374,1440,1373, +1440,1374,1441, +1375,1441,1374, +1441,1375,1442, +1376,1442,1375, +1442,1376,1443, +1377,1443,1376, +1443,1377,1444, +1378,1444,1377, +1444,1378,1445, +1379,1445,1378, +1445,1379,1446, +1380,1446,1379, +1446,1380,1447, +1381,1447,1380, +1447,1381,1448, +1382,1448,1381, +1448,1382,1449, +1383,1449,1382, +1449,1383,1450, +1384,1450,1383, +1450,1384,1451, +1385,1451,1384, +1452,1386,1453, +1387,1453,1386, +1453,1387,1454, +1388,1454,1387, +1454,1388,1455, +1389,1455,1388, +1455,1389,1456, +1390,1456,1389, +1456,1390,1457, +1391,1457,1390, +1457,1391,1458, +1392,1458,1391, +1458,1392,1459, +1393,1459,1392, +1459,1393,1460, +1394,1460,1393, +1460,1394,1461, +1395,1461,1394, +1461,1395,1462, +1396,1462,1395, +1462,1396,1463, +1397,1463,1396, +1463,1397,1464, +1398,1464,1397, +1464,1398,1465, +1399,1465,1398, +1465,1399,1466, +1400,1466,1399, +1466,1400,1467, +1401,1467,1400, +1467,1401,1468, +1402,1468,1401, +1468,1402,1469, +1403,1469,1402, +1469,1403,1470, +1404,1470,1403, +1470,1404,1471, +1405,1471,1404, +1471,1405,1472, +1406,1472,1405, +1472,1406,1473, +1407,1473,1406, +1473,1407,1474, +1408,1474,1407, +1474,1408,1475, +1409,1475,1408, +1475,1409,1476, +1410,1476,1409, +1476,1410,1477, +1411,1477,1410, +1477,1411,1478, +1412,1478,1411, +1478,1412,1479, +1413,1479,1412, +1479,1413,1480, +1414,1480,1413, +1480,1414,1481, +1415,1481,1414, +1481,1415,1482, +1416,1482,1415, +1482,1416,1483, +1417,1483,1416, +1483,1417,1484, +1418,1484,1417, +1484,1418,1485, +1419,1485,1418, +1485,1419,1486, +1420,1486,1419, +1486,1420,1487, +1421,1487,1420, +1487,1421,1488, +1422,1488,1421, +1488,1422,1489, +1423,1489,1422, +1489,1423,1490, +1424,1490,1423, +1490,1424,1491, +1425,1491,1424, +1491,1425,1492, +1426,1492,1425, +1492,1426,1493, +1427,1493,1426, +1493,1427,1494, +1428,1494,1427, +1494,1428,1495, +1429,1495,1428, +1495,1429,1496, +1430,1496,1429, +1496,1430,1497, +1431,1497,1430, +1497,1431,1498, +1432,1498,1431, +1498,1432,1499, +1433,1499,1432, +1499,1433,1500, +1434,1500,1433, +1500,1434,1501, +1435,1501,1434, +1501,1435,1502, +1436,1502,1435, +1502,1436,1503, +1437,1503,1436, +1503,1437,1504, +1438,1504,1437, +1504,1438,1505, +1439,1505,1438, +1505,1439,1506, +1440,1506,1439, +1506,1440,1507, +1441,1507,1440, +1507,1441,1508, +1442,1508,1441, +1508,1442,1509, +1443,1509,1442, +1509,1443,1510, +1444,1510,1443, +1510,1444,1511, +1445,1511,1444, +1511,1445,1512, +1446,1512,1445, +1512,1446,1513, +1447,1513,1446, +1513,1447,1514, +1448,1514,1447, +1514,1448,1515, +1449,1515,1448, +1515,1449,1516, +1450,1516,1449, +1516,1450,1517, +1451,1517,1450, +1518,1452,1519, +1453,1519,1452, +1519,1453,1520, +1454,1520,1453, +1520,1454,1521, +1455,1521,1454, +1521,1455,1522, +1456,1522,1455, +1522,1456,1523, +1457,1523,1456, +1523,1457,1524, +1458,1524,1457, +1524,1458,1525, +1459,1525,1458, +1525,1459,1526, +1460,1526,1459, +1526,1460,1527, +1461,1527,1460, +1527,1461,1528, +1462,1528,1461, +1528,1462,1529, +1463,1529,1462, +1529,1463,1530, +1464,1530,1463, +1530,1464,1531, +1465,1531,1464, +1531,1465,1532, +1466,1532,1465, +1532,1466,1533, +1467,1533,1466, +1533,1467,1534, +1468,1534,1467, +1534,1468,1535, +1469,1535,1468, +1535,1469,1536, +1470,1536,1469, +1536,1470,1537, +1471,1537,1470, +1537,1471,1538, +1472,1538,1471, +1538,1472,1539, +1473,1539,1472, +1539,1473,1540, +1474,1540,1473, +1540,1474,1541, +1475,1541,1474, +1541,1475,1542, +1476,1542,1475, +1542,1476,1543, +1477,1543,1476, +1543,1477,1544, +1478,1544,1477, +1544,1478,1545, +1479,1545,1478, +1545,1479,1546, +1480,1546,1479, +1546,1480,1547, +1481,1547,1480, +1547,1481,1548, +1482,1548,1481, +1548,1482,1549, +1483,1549,1482, +1549,1483,1550, +1484,1550,1483, +1550,1484,1551, +1485,1551,1484, +1551,1485,1552, +1486,1552,1485, +1552,1486,1553, +1487,1553,1486, +1553,1487,1554, +1488,1554,1487, +1554,1488,1555, +1489,1555,1488, +1555,1489,1556, +1490,1556,1489, +1556,1490,1557, +1491,1557,1490, +1557,1491,1558, +1492,1558,1491, +1558,1492,1559, +1493,1559,1492, +1559,1493,1560, +1494,1560,1493, +1560,1494,1561, +1495,1561,1494, +1561,1495,1562, +1496,1562,1495, +1562,1496,1563, +1497,1563,1496, +1563,1497,1564, +1498,1564,1497, +1564,1498,1565, +1499,1565,1498, +1565,1499,1566, +1500,1566,1499, +1566,1500,1567, +1501,1567,1500, +1567,1501,1568, +1502,1568,1501, +1568,1502,1569, +1503,1569,1502, +1569,1503,1570, +1504,1570,1503, +1570,1504,1571, +1505,1571,1504, +1571,1505,1572, +1506,1572,1505, +1572,1506,1573, +1507,1573,1506, +1573,1507,1574, +1508,1574,1507, +1574,1508,1575, +1509,1575,1508, +1575,1509,1576, +1510,1576,1509, +1576,1510,1577, +1511,1577,1510, +1577,1511,1578, +1512,1578,1511, +1578,1512,1579, +1513,1579,1512, +1579,1513,1580, +1514,1580,1513, +1580,1514,1581, +1515,1581,1514, +1581,1515,1582, +1516,1582,1515, +1582,1516,1583, +1517,1583,1516, +1584,1518,1585, +1519,1585,1518, +1585,1519,1586, +1520,1586,1519, +1586,1520,1587, +1521,1587,1520, +1587,1521,1588, +1522,1588,1521, +1588,1522,1589, +1523,1589,1522, +1589,1523,1590, +1524,1590,1523, +1590,1524,1591, +1525,1591,1524, +1591,1525,1592, +1526,1592,1525, +1592,1526,1593, +1527,1593,1526, +1593,1527,1594, +1528,1594,1527, +1594,1528,1595, +1529,1595,1528, +1595,1529,1596, +1530,1596,1529, +1596,1530,1597, +1531,1597,1530, +1597,1531,1598, +1532,1598,1531, +1598,1532,1599, +1533,1599,1532, +1599,1533,1600, +1534,1600,1533, +1600,1534,1601, +1535,1601,1534, +1601,1535,1602, +1536,1602,1535, +1602,1536,1603, +1537,1603,1536, +1603,1537,1604, +1538,1604,1537, +1604,1538,1605, +1539,1605,1538, +1605,1539,1606, +1540,1606,1539, +1606,1540,1607, +1541,1607,1540, +1607,1541,1608, +1542,1608,1541, +1608,1542,1609, +1543,1609,1542, +1609,1543,1610, +1544,1610,1543, +1610,1544,1611, +1545,1611,1544, +1611,1545,1612, +1546,1612,1545, +1612,1546,1613, +1547,1613,1546, +1613,1547,1614, +1548,1614,1547, +1614,1548,1615, +1549,1615,1548, +1615,1549,1616, +1550,1616,1549, +1616,1550,1617, +1551,1617,1550, +1617,1551,1618, +1552,1618,1551, +1618,1552,1619, +1553,1619,1552, +1619,1553,1620, +1554,1620,1553, +1620,1554,1621, +1555,1621,1554, +1621,1555,1622, +1556,1622,1555, +1622,1556,1623, +1557,1623,1556, +1623,1557,1624, +1558,1624,1557, +1624,1558,1625, +1559,1625,1558, +1625,1559,1626, +1560,1626,1559, +1626,1560,1627, +1561,1627,1560, +1627,1561,1628, +1562,1628,1561, +1628,1562,1629, +1563,1629,1562, +1629,1563,1630, +1564,1630,1563, +1630,1564,1631, +1565,1631,1564, +1631,1565,1632, +1566,1632,1565, +1632,1566,1633, +1567,1633,1566, +1633,1567,1634, +1568,1634,1567, +1634,1568,1635, +1569,1635,1568, +1635,1569,1636, +1570,1636,1569, +1636,1570,1637, +1571,1637,1570, +1637,1571,1638, +1572,1638,1571, +1638,1572,1639, +1573,1639,1572, +1639,1573,1640, +1574,1640,1573, +1640,1574,1641, +1575,1641,1574, +1641,1575,1642, +1576,1642,1575, +1642,1576,1643, +1577,1643,1576, +1643,1577,1644, +1578,1644,1577, +1644,1578,1645, +1579,1645,1578, +1645,1579,1646, +1580,1646,1579, +1646,1580,1647, +1581,1647,1580, +1647,1581,1648, +1582,1648,1581, +1648,1582,1649, +1583,1649,1582, +1650,1584,1651, +1585,1651,1584, +1651,1585,1652, +1586,1652,1585, +1652,1586,1653, +1587,1653,1586, +1653,1587,1654, +1588,1654,1587, +1654,1588,1655, +1589,1655,1588, +1655,1589,1656, +1590,1656,1589, +1656,1590,1657, +1591,1657,1590, +1657,1591,1658, +1592,1658,1591, +1658,1592,1659, +1593,1659,1592, +1659,1593,1660, +1594,1660,1593, +1660,1594,1661, +1595,1661,1594, +1661,1595,1662, +1596,1662,1595, +1662,1596,1663, +1597,1663,1596, +1663,1597,1664, +1598,1664,1597, +1664,1598,1665, +1599,1665,1598, +1665,1599,1666, +1600,1666,1599, +1666,1600,1667, +1601,1667,1600, +1667,1601,1668, +1602,1668,1601, +1668,1602,1669, +1603,1669,1602, +1669,1603,1670, +1604,1670,1603, +1670,1604,1671, +1605,1671,1604, +1671,1605,1672, +1606,1672,1605, +1672,1606,1673, +1607,1673,1606, +1673,1607,1674, +1608,1674,1607, +1674,1608,1675, +1609,1675,1608, +1675,1609,1676, +1610,1676,1609, +1676,1610,1677, +1611,1677,1610, +1677,1611,1678, +1612,1678,1611, +1678,1612,1679, +1613,1679,1612, +1679,1613,1680, +1614,1680,1613, +1680,1614,1681, +1615,1681,1614, +1681,1615,1682, +1616,1682,1615, +1682,1616,1683, +1617,1683,1616, +1683,1617,1684, +1618,1684,1617, +1684,1618,1685, +1619,1685,1618, +1685,1619,1686, +1620,1686,1619, +1686,1620,1687, +1621,1687,1620, +1687,1621,1688, +1622,1688,1621, +1688,1622,1689, +1623,1689,1622, +1689,1623,1690, +1624,1690,1623, +1690,1624,1691, +1625,1691,1624, +1691,1625,1692, +1626,1692,1625, +1692,1626,1693, +1627,1693,1626, +1693,1627,1694, +1628,1694,1627, +1694,1628,1695, +1629,1695,1628, +1695,1629,1696, +1630,1696,1629, +1696,1630,1697, +1631,1697,1630, +1697,1631,1698, +1632,1698,1631, +1698,1632,1699, +1633,1699,1632, +1699,1633,1700, +1634,1700,1633, +1700,1634,1701, +1635,1701,1634, +1701,1635,1702, +1636,1702,1635, +1702,1636,1703, +1637,1703,1636, +1703,1637,1704, +1638,1704,1637, +1704,1638,1705, +1639,1705,1638, +1705,1639,1706, +1640,1706,1639, +1706,1640,1707, +1641,1707,1640, +1707,1641,1708, +1642,1708,1641, +1708,1642,1709, +1643,1709,1642, +1709,1643,1710, +1644,1710,1643, +1710,1644,1711, +1645,1711,1644, +1711,1645,1712, +1646,1712,1645, +1712,1646,1713, +1647,1713,1646, +1713,1647,1714, +1648,1714,1647, +1714,1648,1715, +1649,1715,1648, +1716,1650,1717, +1651,1717,1650, +1717,1651,1718, +1652,1718,1651, +1718,1652,1719, +1653,1719,1652, +1719,1653,1720, +1654,1720,1653, +1720,1654,1721, +1655,1721,1654, +1721,1655,1722, +1656,1722,1655, +1722,1656,1723, +1657,1723,1656, +1723,1657,1724, +1658,1724,1657, +1724,1658,1725, +1659,1725,1658, +1725,1659,1726, +1660,1726,1659, +1726,1660,1727, +1661,1727,1660, +1727,1661,1728, +1662,1728,1661, +1728,1662,1729, +1663,1729,1662, +1729,1663,1730, +1664,1730,1663, +1730,1664,1731, +1665,1731,1664, +1731,1665,1732, +1666,1732,1665, +1732,1666,1733, +1667,1733,1666, +1733,1667,1734, +1668,1734,1667, +1734,1668,1735, +1669,1735,1668, +1735,1669,1736, +1670,1736,1669, +1736,1670,1737, +1671,1737,1670, +1737,1671,1738, +1672,1738,1671, +1738,1672,1739, +1673,1739,1672, +1739,1673,1740, +1674,1740,1673, +1740,1674,1741, +1675,1741,1674, +1741,1675,1742, +1676,1742,1675, +1742,1676,1743, +1677,1743,1676, +1743,1677,1744, +1678,1744,1677, +1744,1678,1745, +1679,1745,1678, +1745,1679,1746, +1680,1746,1679, +1746,1680,1747, +1681,1747,1680, +1747,1681,1748, +1682,1748,1681, +1748,1682,1749, +1683,1749,1682, +1749,1683,1750, +1684,1750,1683, +1750,1684,1751, +1685,1751,1684, +1751,1685,1752, +1686,1752,1685, +1752,1686,1753, +1687,1753,1686, +1753,1687,1754, +1688,1754,1687, +1754,1688,1755, +1689,1755,1688, +1755,1689,1756, +1690,1756,1689, +1756,1690,1757, +1691,1757,1690, +1757,1691,1758, +1692,1758,1691, +1758,1692,1759, +1693,1759,1692, +1759,1693,1760, +1694,1760,1693, +1760,1694,1761, +1695,1761,1694, +1761,1695,1762, +1696,1762,1695, +1762,1696,1763, +1697,1763,1696, +1763,1697,1764, +1698,1764,1697, +1764,1698,1765, +1699,1765,1698, +1765,1699,1766, +1700,1766,1699, +1766,1700,1767, +1701,1767,1700, +1767,1701,1768, +1702,1768,1701, +1768,1702,1769, +1703,1769,1702, +1769,1703,1770, +1704,1770,1703, +1770,1704,1771, +1705,1771,1704, +1771,1705,1772, +1706,1772,1705, +1772,1706,1773, +1707,1773,1706, +1773,1707,1774, +1708,1774,1707, +1774,1708,1775, +1709,1775,1708, +1775,1709,1776, +1710,1776,1709, +1776,1710,1777, +1711,1777,1710, +1777,1711,1778, +1712,1778,1711, +1778,1712,1779, +1713,1779,1712, +1779,1713,1780, +1714,1780,1713, +1780,1714,1781, +1715,1781,1714, +1782,1716,1783, +1717,1783,1716, +1783,1717,1784, +1718,1784,1717, +1784,1718,1785, +1719,1785,1718, +1785,1719,1786, +1720,1786,1719, +1786,1720,1787, +1721,1787,1720, +1787,1721,1788, +1722,1788,1721, +1788,1722,1789, +1723,1789,1722, +1789,1723,1790, +1724,1790,1723, +1790,1724,1791, +1725,1791,1724, +1791,1725,1792, +1726,1792,1725, +1792,1726,1793, +1727,1793,1726, +1793,1727,1794, +1728,1794,1727, +1794,1728,1795, +1729,1795,1728, +1795,1729,1796, +1730,1796,1729, +1796,1730,1797, +1731,1797,1730, +1797,1731,1798, +1732,1798,1731, +1798,1732,1799, +1733,1799,1732, +1799,1733,1800, +1734,1800,1733, +1800,1734,1801, +1735,1801,1734, +1801,1735,1802, +1736,1802,1735, +1802,1736,1803, +1737,1803,1736, +1803,1737,1804, +1738,1804,1737, +1804,1738,1805, +1739,1805,1738, +1805,1739,1806, +1740,1806,1739, +1806,1740,1807, +1741,1807,1740, +1807,1741,1808, +1742,1808,1741, +1808,1742,1809, +1743,1809,1742, +1809,1743,1810, +1744,1810,1743, +1810,1744,1811, +1745,1811,1744, +1811,1745,1812, +1746,1812,1745, +1812,1746,1813, +1747,1813,1746, +1813,1747,1814, +1748,1814,1747, +1814,1748,1815, +1749,1815,1748, +1815,1749,1816, +1750,1816,1749, +1816,1750,1817, +1751,1817,1750, +1817,1751,1818, +1752,1818,1751, +1818,1752,1819, +1753,1819,1752, +1819,1753,1820, +1754,1820,1753, +1820,1754,1821, +1755,1821,1754, +1821,1755,1822, +1756,1822,1755, +1822,1756,1823, +1757,1823,1756, +1823,1757,1824, +1758,1824,1757, +1824,1758,1825, +1759,1825,1758, +1825,1759,1826, +1760,1826,1759, +1826,1760,1827, +1761,1827,1760, +1827,1761,1828, +1762,1828,1761, +1828,1762,1829, +1763,1829,1762, +1829,1763,1830, +1764,1830,1763, +1830,1764,1831, +1765,1831,1764, +1831,1765,1832, +1766,1832,1765, +1832,1766,1833, +1767,1833,1766, +1833,1767,1834, +1768,1834,1767, +1834,1768,1835, +1769,1835,1768, +1835,1769,1836, +1770,1836,1769, +1836,1770,1837, +1771,1837,1770, +1837,1771,1838, +1772,1838,1771, +1838,1772,1839, +1773,1839,1772, +1839,1773,1840, +1774,1840,1773, +1840,1774,1841, +1775,1841,1774, +1841,1775,1842, +1776,1842,1775, +1842,1776,1843, +1777,1843,1776, +1843,1777,1844, +1778,1844,1777, +1844,1778,1845, +1779,1845,1778, +1845,1779,1846, +1780,1846,1779, +1846,1780,1847, +1781,1847,1780, +1848,1782,1849, +1783,1849,1782, +1849,1783,1850, +1784,1850,1783, +1850,1784,1851, +1785,1851,1784, +1851,1785,1852, +1786,1852,1785, +1852,1786,1853, +1787,1853,1786, +1853,1787,1854, +1788,1854,1787, +1854,1788,1855, +1789,1855,1788, +1855,1789,1856, +1790,1856,1789, +1856,1790,1857, +1791,1857,1790, +1857,1791,1858, +1792,1858,1791, +1858,1792,1859, +1793,1859,1792, +1859,1793,1860, +1794,1860,1793, +1860,1794,1861, +1795,1861,1794, +1861,1795,1862, +1796,1862,1795, +1862,1796,1863, +1797,1863,1796, +1863,1797,1864, +1798,1864,1797, +1864,1798,1865, +1799,1865,1798, +1865,1799,1866, +1800,1866,1799, +1866,1800,1867, +1801,1867,1800, +1867,1801,1868, +1802,1868,1801, +1868,1802,1869, +1803,1869,1802, +1869,1803,1870, +1804,1870,1803, +1870,1804,1871, +1805,1871,1804, +1871,1805,1872, +1806,1872,1805, +1872,1806,1873, +1807,1873,1806, +1873,1807,1874, +1808,1874,1807, +1874,1808,1875, +1809,1875,1808, +1875,1809,1876, +1810,1876,1809, +1876,1810,1877, +1811,1877,1810, +1877,1811,1878, +1812,1878,1811, +1878,1812,1879, +1813,1879,1812, +1879,1813,1880, +1814,1880,1813, +1880,1814,1881, +1815,1881,1814, +1881,1815,1882, +1816,1882,1815, +1882,1816,1883, +1817,1883,1816, +1883,1817,1884, +1818,1884,1817, +1884,1818,1885, +1819,1885,1818, +1885,1819,1886, +1820,1886,1819, +1886,1820,1887, +1821,1887,1820, +1887,1821,1888, +1822,1888,1821, +1888,1822,1889, +1823,1889,1822, +1889,1823,1890, +1824,1890,1823, +1890,1824,1891, +1825,1891,1824, +1891,1825,1892, +1826,1892,1825, +1892,1826,1893, +1827,1893,1826, +1893,1827,1894, +1828,1894,1827, +1894,1828,1895, +1829,1895,1828, +1895,1829,1896, +1830,1896,1829, +1896,1830,1897, +1831,1897,1830, +1897,1831,1898, +1832,1898,1831, +1898,1832,1899, +1833,1899,1832, +1899,1833,1900, +1834,1900,1833, +1900,1834,1901, +1835,1901,1834, +1901,1835,1902, +1836,1902,1835, +1902,1836,1903, +1837,1903,1836, +1903,1837,1904, +1838,1904,1837, +1904,1838,1905, +1839,1905,1838, +1905,1839,1906, +1840,1906,1839, +1906,1840,1907, +1841,1907,1840, +1907,1841,1908, +1842,1908,1841, +1908,1842,1909, +1843,1909,1842, +1909,1843,1910, +1844,1910,1843, +1910,1844,1911, +1845,1911,1844, +1911,1845,1912, +1846,1912,1845, +1912,1846,1913, +1847,1913,1846, +1914,1848,1915, +1849,1915,1848, +1915,1849,1916, +1850,1916,1849, +1916,1850,1917, +1851,1917,1850, +1917,1851,1918, +1852,1918,1851, +1918,1852,1919, +1853,1919,1852, +1919,1853,1920, +1854,1920,1853, +1920,1854,1921, +1855,1921,1854, +1921,1855,1922, +1856,1922,1855, +1922,1856,1923, +1857,1923,1856, +1923,1857,1924, +1858,1924,1857, +1924,1858,1925, +1859,1925,1858, +1925,1859,1926, +1860,1926,1859, +1926,1860,1927, +1861,1927,1860, +1927,1861,1928, +1862,1928,1861, +1928,1862,1929, +1863,1929,1862, +1929,1863,1930, +1864,1930,1863, +1930,1864,1931, +1865,1931,1864, +1931,1865,1932, +1866,1932,1865, +1932,1866,1933, +1867,1933,1866, +1933,1867,1934, +1868,1934,1867, +1934,1868,1935, +1869,1935,1868, +1935,1869,1936, +1870,1936,1869, +1936,1870,1937, +1871,1937,1870, +1937,1871,1938, +1872,1938,1871, +1938,1872,1939, +1873,1939,1872, +1939,1873,1940, +1874,1940,1873, +1940,1874,1941, +1875,1941,1874, +1941,1875,1942, +1876,1942,1875, +1942,1876,1943, +1877,1943,1876, +1943,1877,1944, +1878,1944,1877, +1944,1878,1945, +1879,1945,1878, +1945,1879,1946, +1880,1946,1879, +1946,1880,1947, +1881,1947,1880, +1947,1881,1948, +1882,1948,1881, +1948,1882,1949, +1883,1949,1882, +1949,1883,1950, +1884,1950,1883, +1950,1884,1951, +1885,1951,1884, +1951,1885,1952, +1886,1952,1885, +1952,1886,1953, +1887,1953,1886, +1953,1887,1954, +1888,1954,1887, +1954,1888,1955, +1889,1955,1888, +1955,1889,1956, +1890,1956,1889, +1956,1890,1957, +1891,1957,1890, +1957,1891,1958, +1892,1958,1891, +1958,1892,1959, +1893,1959,1892, +1959,1893,1960, +1894,1960,1893, +1960,1894,1961, +1895,1961,1894, +1961,1895,1962, +1896,1962,1895, +1962,1896,1963, +1897,1963,1896, +1963,1897,1964, +1898,1964,1897, +1964,1898,1965, +1899,1965,1898, +1965,1899,1966, +1900,1966,1899, +1966,1900,1967, +1901,1967,1900, +1967,1901,1968, +1902,1968,1901, +1968,1902,1969, +1903,1969,1902, +1969,1903,1970, +1904,1970,1903, +1970,1904,1971, +1905,1971,1904, +1971,1905,1972, +1906,1972,1905, +1972,1906,1973, +1907,1973,1906, +1973,1907,1974, +1908,1974,1907, +1974,1908,1975, +1909,1975,1908, +1975,1909,1976, +1910,1976,1909, +1976,1910,1977, +1911,1977,1910, +1977,1911,1978, +1912,1978,1911, +1978,1912,1979, +1913,1979,1912, +1980,1914,1981, +1915,1981,1914, +1981,1915,1982, +1916,1982,1915, +1982,1916,1983, +1917,1983,1916, +1983,1917,1984, +1918,1984,1917, +1984,1918,1985, +1919,1985,1918, +1985,1919,1986, +1920,1986,1919, +1986,1920,1987, +1921,1987,1920, +1987,1921,1988, +1922,1988,1921, +1988,1922,1989, +1923,1989,1922, +1989,1923,1990, +1924,1990,1923, +1990,1924,1991, +1925,1991,1924, +1991,1925,1992, +1926,1992,1925, +1992,1926,1993, +1927,1993,1926, +1993,1927,1994, +1928,1994,1927, +1994,1928,1995, +1929,1995,1928, +1995,1929,1996, +1930,1996,1929, +1996,1930,1997, +1931,1997,1930, +1997,1931,1998, +1932,1998,1931, +1998,1932,1999, +1933,1999,1932, +1999,1933,2000, +1934,2000,1933, +2000,1934,2001, +1935,2001,1934, +2001,1935,2002, +1936,2002,1935, +2002,1936,2003, +1937,2003,1936, +2003,1937,2004, +1938,2004,1937, +2004,1938,2005, +1939,2005,1938, +2005,1939,2006, +1940,2006,1939, +2006,1940,2007, +1941,2007,1940, +2007,1941,2008, +1942,2008,1941, +2008,1942,2009, +1943,2009,1942, +2009,1943,2010, +1944,2010,1943, +2010,1944,2011, +1945,2011,1944, +2011,1945,2012, +1946,2012,1945, +2012,1946,2013, +1947,2013,1946, +2013,1947,2014, +1948,2014,1947, +2014,1948,2015, +1949,2015,1948, +2015,1949,2016, +1950,2016,1949, +2016,1950,2017, +1951,2017,1950, +2017,1951,2018, +1952,2018,1951, +2018,1952,2019, +1953,2019,1952, +2019,1953,2020, +1954,2020,1953, +2020,1954,2021, +1955,2021,1954, +2021,1955,2022, +1956,2022,1955, +2022,1956,2023, +1957,2023,1956, +2023,1957,2024, +1958,2024,1957, +2024,1958,2025, +1959,2025,1958, +2025,1959,2026, +1960,2026,1959, +2026,1960,2027, +1961,2027,1960, +2027,1961,2028, +1962,2028,1961, +2028,1962,2029, +1963,2029,1962, +2029,1963,2030, +1964,2030,1963, +2030,1964,2031, +1965,2031,1964, +2031,1965,2032, +1966,2032,1965, +2032,1966,2033, +1967,2033,1966, +2033,1967,2034, +1968,2034,1967, +2034,1968,2035, +1969,2035,1968, +2035,1969,2036, +1970,2036,1969, +2036,1970,2037, +1971,2037,1970, +2037,1971,2038, +1972,2038,1971, +2038,1972,2039, +1973,2039,1972, +2039,1973,2040, +1974,2040,1973, +2040,1974,2041, +1975,2041,1974, +2041,1975,2042, +1976,2042,1975, +2042,1976,2043, +1977,2043,1976, +2043,1977,2044, +1978,2044,1977, +2044,1978,2045, +1979,2045,1978, +2046,1980,2047, +1981,2047,1980, +2047,1981,2048, +1982,2048,1981, +2048,1982,2049, +1983,2049,1982, +2049,1983,2050, +1984,2050,1983, +2050,1984,2051, +1985,2051,1984, +2051,1985,2052, +1986,2052,1985, +2052,1986,2053, +1987,2053,1986, +2053,1987,2054, +1988,2054,1987, +2054,1988,2055, +1989,2055,1988, +2055,1989,2056, +1990,2056,1989, +2056,1990,2057, +1991,2057,1990, +2057,1991,2058, +1992,2058,1991, +2058,1992,2059, +1993,2059,1992, +2059,1993,2060, +1994,2060,1993, +2060,1994,2061, +1995,2061,1994, +2061,1995,2062, +1996,2062,1995, +2062,1996,2063, +1997,2063,1996, +2063,1997,2064, +1998,2064,1997, +2064,1998,2065, +1999,2065,1998, +2065,1999,2066, +2000,2066,1999, +2066,2000,2067, +2001,2067,2000, +2067,2001,2068, +2002,2068,2001, +2068,2002,2069, +2003,2069,2002, +2069,2003,2070, +2004,2070,2003, +2070,2004,2071, +2005,2071,2004, +2071,2005,2072, +2006,2072,2005, +2072,2006,2073, +2007,2073,2006, +2073,2007,2074, +2008,2074,2007, +2074,2008,2075, +2009,2075,2008, +2075,2009,2076, +2010,2076,2009, +2076,2010,2077, +2011,2077,2010, +2077,2011,2078, +2012,2078,2011, +2078,2012,2079, +2013,2079,2012, +2079,2013,2080, +2014,2080,2013, +2080,2014,2081, +2015,2081,2014, +2081,2015,2082, +2016,2082,2015, +2082,2016,2083, +2017,2083,2016, +2083,2017,2084, +2018,2084,2017, +2084,2018,2085, +2019,2085,2018, +2085,2019,2086, +2020,2086,2019, +2086,2020,2087, +2021,2087,2020, +2087,2021,2088, +2022,2088,2021, +2088,2022,2089, +2023,2089,2022, +2089,2023,2090, +2024,2090,2023, +2090,2024,2091, +2025,2091,2024, +2091,2025,2092, +2026,2092,2025, +2092,2026,2093, +2027,2093,2026, +2093,2027,2094, +2028,2094,2027, +2094,2028,2095, +2029,2095,2028, +2095,2029,2096, +2030,2096,2029, +2096,2030,2097, +2031,2097,2030, +2097,2031,2098, +2032,2098,2031, +2098,2032,2099, +2033,2099,2032, +2099,2033,2100, +2034,2100,2033, +2100,2034,2101, +2035,2101,2034, +2101,2035,2102, +2036,2102,2035, +2102,2036,2103, +2037,2103,2036, +2103,2037,2104, +2038,2104,2037, +2104,2038,2105, +2039,2105,2038, +2105,2039,2106, +2040,2106,2039, +2106,2040,2107, +2041,2107,2040, +2107,2041,2108, +2042,2108,2041, +2108,2042,2109, +2043,2109,2042, +2109,2043,2110, +2044,2110,2043, +2110,2044,2111, +2045,2111,2044, +2112,2046,2113, +2047,2113,2046, +2113,2047,2114, +2048,2114,2047, +2114,2048,2115, +2049,2115,2048, +2115,2049,2116, +2050,2116,2049, +2116,2050,2117, +2051,2117,2050, +2117,2051,2118, +2052,2118,2051, +2118,2052,2119, +2053,2119,2052, +2119,2053,2120, +2054,2120,2053, +2120,2054,2121, +2055,2121,2054, +2121,2055,2122, +2056,2122,2055, +2122,2056,2123, +2057,2123,2056, +2123,2057,2124, +2058,2124,2057, +2124,2058,2125, +2059,2125,2058, +2125,2059,2126, +2060,2126,2059, +2126,2060,2127, +2061,2127,2060, +2127,2061,2128, +2062,2128,2061, +2128,2062,2129, +2063,2129,2062, +2129,2063,2130, +2064,2130,2063, +2130,2064,2131, +2065,2131,2064, +2131,2065,2132, +2066,2132,2065, +2132,2066,2133, +2067,2133,2066, +2133,2067,2134, +2068,2134,2067, +2134,2068,2135, +2069,2135,2068, +2135,2069,2136, +2070,2136,2069, +2136,2070,2137, +2071,2137,2070, +2137,2071,2138, +2072,2138,2071, +2138,2072,2139, +2073,2139,2072, +2139,2073,2140, +2074,2140,2073, +2140,2074,2141, +2075,2141,2074, +2141,2075,2142, +2076,2142,2075, +2142,2076,2143, +2077,2143,2076, +2143,2077,2144, +2078,2144,2077, +2144,2078,2145, +2079,2145,2078, +2145,2079,2146, +2080,2146,2079, +2146,2080,2147, +2081,2147,2080, +2147,2081,2148, +2082,2148,2081, +2148,2082,2149, +2083,2149,2082, +2149,2083,2150, +2084,2150,2083, +2150,2084,2151, +2085,2151,2084, +2151,2085,2152, +2086,2152,2085, +2152,2086,2153, +2087,2153,2086, +2153,2087,2154, +2088,2154,2087, +2154,2088,2155, +2089,2155,2088, +2155,2089,2156, +2090,2156,2089, +2156,2090,2157, +2091,2157,2090, +2157,2091,2158, +2092,2158,2091, +2158,2092,2159, +2093,2159,2092, +2159,2093,2160, +2094,2160,2093, +2160,2094,2161, +2095,2161,2094, +2161,2095,2162, +2096,2162,2095, +2162,2096,2163, +2097,2163,2096, +2163,2097,2164, +2098,2164,2097, +2164,2098,2165, +2099,2165,2098, +2165,2099,2166, +2100,2166,2099, +2166,2100,2167, +2101,2167,2100, +2167,2101,2168, +2102,2168,2101, +2168,2102,2169, +2103,2169,2102, +2169,2103,2170, +2104,2170,2103, +2170,2104,2171, +2105,2171,2104, +2171,2105,2172, +2106,2172,2105, +2172,2106,2173, +2107,2173,2106, +2173,2107,2174, +2108,2174,2107, +2174,2108,2175, +2109,2175,2108, +2175,2109,2176, +2110,2176,2109, +2176,2110,2177, +2111,2177,2110, +2178,2112,2179, +2113,2179,2112, +2179,2113,2180, +2114,2180,2113, +2180,2114,2181, +2115,2181,2114, +2181,2115,2182, +2116,2182,2115, +2182,2116,2183, +2117,2183,2116, +2183,2117,2184, +2118,2184,2117, +2184,2118,2185, +2119,2185,2118, +2185,2119,2186, +2120,2186,2119, +2186,2120,2187, +2121,2187,2120, +2187,2121,2188, +2122,2188,2121, +2188,2122,2189, +2123,2189,2122, +2189,2123,2190, +2124,2190,2123, +2190,2124,2191, +2125,2191,2124, +2191,2125,2192, +2126,2192,2125, +2192,2126,2193, +2127,2193,2126, +2193,2127,2194, +2128,2194,2127, +2194,2128,2195, +2129,2195,2128, +2195,2129,2196, +2130,2196,2129, +2196,2130,2197, +2131,2197,2130, +2197,2131,2198, +2132,2198,2131, +2198,2132,2199, +2133,2199,2132, +2199,2133,2200, +2134,2200,2133, +2200,2134,2201, +2135,2201,2134, +2201,2135,2202, +2136,2202,2135, +2202,2136,2203, +2137,2203,2136, +2203,2137,2204, +2138,2204,2137, +2204,2138,2205, +2139,2205,2138, +2205,2139,2206, +2140,2206,2139, +2206,2140,2207, +2141,2207,2140, +2207,2141,2208, +2142,2208,2141, +2208,2142,2209, +2143,2209,2142, +2209,2143,2210, +2144,2210,2143, +2210,2144,2211, +2145,2211,2144, +2211,2145,2212, +2146,2212,2145, +2212,2146,2213, +2147,2213,2146, +2213,2147,2214, +2148,2214,2147, +2214,2148,2215, +2149,2215,2148, +2215,2149,2216, +2150,2216,2149, +2216,2150,2217, +2151,2217,2150, +2217,2151,2218, +2152,2218,2151, +2218,2152,2219, +2153,2219,2152, +2219,2153,2220, +2154,2220,2153, +2220,2154,2221, +2155,2221,2154, +2221,2155,2222, +2156,2222,2155, +2222,2156,2223, +2157,2223,2156, +2223,2157,2224, +2158,2224,2157, +2224,2158,2225, +2159,2225,2158, +2225,2159,2226, +2160,2226,2159, +2226,2160,2227, +2161,2227,2160, +2227,2161,2228, +2162,2228,2161, +2228,2162,2229, +2163,2229,2162, +2229,2163,2230, +2164,2230,2163, +2230,2164,2231, +2165,2231,2164, +2231,2165,2232, +2166,2232,2165, +2232,2166,2233, +2167,2233,2166, +2233,2167,2234, +2168,2234,2167, +2234,2168,2235, +2169,2235,2168, +2235,2169,2236, +2170,2236,2169, +2236,2170,2237, +2171,2237,2170, +2237,2171,2238, +2172,2238,2171, +2238,2172,2239, +2173,2239,2172, +2239,2173,2240, +2174,2240,2173, +2240,2174,2241, +2175,2241,2174, +2241,2175,2242, +2176,2242,2175, +2242,2176,2243, +2177,2243,2176, +2244,2178,2245, +2179,2245,2178, +2245,2179,2246, +2180,2246,2179, +2246,2180,2247, +2181,2247,2180, +2247,2181,2248, +2182,2248,2181, +2248,2182,2249, +2183,2249,2182, +2249,2183,2250, +2184,2250,2183, +2250,2184,2251, +2185,2251,2184, +2251,2185,2252, +2186,2252,2185, +2252,2186,2253, +2187,2253,2186, +2253,2187,2254, +2188,2254,2187, +2254,2188,2255, +2189,2255,2188, +2255,2189,2256, +2190,2256,2189, +2256,2190,2257, +2191,2257,2190, +2257,2191,2258, +2192,2258,2191, +2258,2192,2259, +2193,2259,2192, +2259,2193,2260, +2194,2260,2193, +2260,2194,2261, +2195,2261,2194, +2261,2195,2262, +2196,2262,2195, +2262,2196,2263, +2197,2263,2196, +2263,2197,2264, +2198,2264,2197, +2264,2198,2265, +2199,2265,2198, +2265,2199,2266, +2200,2266,2199, +2266,2200,2267, +2201,2267,2200, +2267,2201,2268, +2202,2268,2201, +2268,2202,2269, +2203,2269,2202, +2269,2203,2270, +2204,2270,2203, +2270,2204,2271, +2205,2271,2204, +2271,2205,2272, +2206,2272,2205, +2272,2206,2273, +2207,2273,2206, +2273,2207,2274, +2208,2274,2207, +2274,2208,2275, +2209,2275,2208, +2275,2209,2276, +2210,2276,2209, +2276,2210,2277, +2211,2277,2210, +2277,2211,2278, +2212,2278,2211, +2278,2212,2279, +2213,2279,2212, +2279,2213,2280, +2214,2280,2213, +2280,2214,2281, +2215,2281,2214, +2281,2215,2282, +2216,2282,2215, +2282,2216,2283, +2217,2283,2216, +2283,2217,2284, +2218,2284,2217, +2284,2218,2285, +2219,2285,2218, +2285,2219,2286, +2220,2286,2219, +2286,2220,2287, +2221,2287,2220, +2287,2221,2288, +2222,2288,2221, +2288,2222,2289, +2223,2289,2222, +2289,2223,2290, +2224,2290,2223, +2290,2224,2291, +2225,2291,2224, +2291,2225,2292, +2226,2292,2225, +2292,2226,2293, +2227,2293,2226, +2293,2227,2294, +2228,2294,2227, +2294,2228,2295, +2229,2295,2228, +2295,2229,2296, +2230,2296,2229, +2296,2230,2297, +2231,2297,2230, +2297,2231,2298, +2232,2298,2231, +2298,2232,2299, +2233,2299,2232, +2299,2233,2300, +2234,2300,2233, +2300,2234,2301, +2235,2301,2234, +2301,2235,2302, +2236,2302,2235, +2302,2236,2303, +2237,2303,2236, +2303,2237,2304, +2238,2304,2237, +2304,2238,2305, +2239,2305,2238, +2305,2239,2306, +2240,2306,2239, +2306,2240,2307, +2241,2307,2240, +2307,2241,2308, +2242,2308,2241, +2308,2242,2309, +2243,2309,2242, +}; + +#define Landscape07VtxCount 2240 +#define Landscape07IdxCount 12852 + +btScalar Landscape07Vtx[] = { +3.90625f,49.6769f,-121.094f, +3.90625f,48.3887f,-117.188f, +7.8125f,48.8687f,-121.094f, +7.8125f,48.004f,-117.188f, +11.7188f,47.3453f,-121.094f, +11.7188f,46.8723f,-117.188f, +15.625f,44.9132f,-121.094f, +15.625f,45.5005f,-117.188f, +19.5313f,43.1526f,-121.094f, +19.5313f,43.3644f,-117.188f, +23.4375f,41.3946f,-121.094f, +23.4375f,42.3352f,-117.188f, +27.3438f,40.1349f,-121.094f, +27.3438f,41.1562f,-117.188f, +31.25f,39.2733f,-121.094f, +31.25f,39.1736f,-117.188f, +35.1563f,38.3718f,-121.094f, +35.1563f,38.0627f,-117.188f, +39.0625f,37.16f,-121.094f, +39.0625f,36.4728f,-117.188f, +42.9688f,35.2678f,-121.094f, +42.9688f,34.8001f,-117.188f, +46.875f,32.8529f,-121.094f, +46.875f,32.5103f,-117.188f, +50.7813f,32.0924f,-121.094f, +50.7813f,31.6328f,-117.188f, +54.6875f,33.2013f,-121.094f, +54.6875f,31.6106f,-117.188f, +58.5938f,34.1499f,-121.094f, +58.5938f,32.3004f,-117.188f, +62.5f,33.7675f,-121.094f, +62.5f,32.696f,-117.188f, +66.4063f,34.4892f,-121.094f, +66.4063f,33.3795f,-117.188f, +70.3125f,34.7441f,-121.094f, +70.3125f,33.9696f,-117.188f, +74.2188f,35.4435f,-121.094f, +74.2188f,34.9211f,-117.188f, +78.125f,36.6876f,-121.094f, +78.125f,36.7686f,-117.188f, +82.0313f,37.8831f,-121.094f, +82.0313f,37.7676f,-117.188f, +85.9375f,37.8533f,-121.094f, +85.9375f,37.8174f,-117.188f, +89.8438f,38.2467f,-121.094f, +89.8438f,38.2878f,-117.188f, +93.75f,39.5884f,-121.094f, +93.75f,39.6151f,-117.188f, +97.6563f,39.7164f,-121.094f, +97.6563f,39.7422f,-117.188f, +101.563f,40.296f,-121.094f, +101.563f,40.9611f,-117.188f, +105.469f,40.7222f,-121.094f, +105.469f,40.8932f,-117.188f, +109.375f,40.1304f,-121.094f, +109.375f,40.6603f,-117.188f, +113.281f,39.4566f,-121.094f, +113.281f,40.2935f,-117.188f, +117.188f,39.003f,-121.094f, +117.188f,39.8681f,-117.188f, +121.094f,38.091f,-121.094f, +121.094f,39.0965f,-117.188f, +125.0f,37.216f,-121.094f, +125.0f,37.1333f,-117.188f, +128.906f,35.4631f,-121.094f, +128.906f,35.5222f,-117.188f, +132.813f,33.4698f,-121.094f, +132.813f,33.9068f,-117.188f, +136.719f,31.5516f,-121.094f, +136.719f,32.2618f,-117.188f, +140.625f,28.6676f,-121.094f, +140.625f,29.8657f,-117.188f, +144.531f,26.5656f,-121.094f, +144.531f,28.1704f,-117.188f, +148.438f,24.1962f,-121.094f, +148.438f,27.1495f,-117.188f, +152.344f,22.2193f,-121.094f, +152.344f,24.5217f,-117.188f, +156.25f,20.1818f,-121.094f, +156.25f,22.0419f,-117.188f, +160.156f,17.6116f,-121.094f, +160.156f,19.9238f,-117.188f, +164.063f,15.5398f,-121.094f, +164.063f,17.6875f,-117.188f, +167.969f,13.7972f,-121.094f, +167.969f,15.5636f,-117.188f, +171.875f,11.7291f,-121.094f, +171.875f,13.5497f,-117.188f, +175.781f,9.31738f,-121.094f, +175.781f,11.2761f,-117.188f, +179.688f,6.60425f,-121.094f, +179.688f,8.95864f,-117.188f, +183.594f,4.50127f,-121.094f, +183.594f,7.04623f,-117.188f, +187.5f,2.77579f,-121.094f, +187.5f,4.83635f,-117.188f, +191.406f,1.39292f,-121.094f, +191.406f,2.76046f,-117.188f, +195.313f,-1.41093f,-121.094f, +195.313f,0.190119f,-117.188f, +199.219f,-2.1383f,-121.094f, +199.219f,-0.558379f,-117.188f, +203.125f,-2.43203f,-121.094f, +203.125f,-1.03303f,-117.188f, +207.031f,-3.74398f,-121.094f, +207.031f,-2.17563f,-117.188f, +210.938f,-4.31531f,-121.094f, +210.938f,-1.91155f,-117.188f, +214.844f,-5.42965f,-121.094f, +214.844f,-3.00018f,-117.188f, +218.75f,-6.70056f,-121.094f, +218.75f,-4.26691f,-117.188f, +222.656f,-6.19564f,-121.094f, +222.656f,-5.15855f,-117.188f, +226.563f,-4.68254f,-121.094f, +226.563f,-3.46348f,-117.188f, +230.469f,-3.31858f,-121.094f, +230.469f,-2.16077f,-117.188f, +234.375f,-3.88428f,-121.094f, +234.375f,-1.47785f,-117.188f, +238.281f,-3.80321f,-121.094f, +238.281f,-1.78424f,-117.188f, +242.188f,-3.43571f,-121.094f, +242.188f,-1.00317f,-117.188f, +246.094f,-3.77556f,-121.094f, +246.094f,-1.97981f,-117.188f, +250.0f,-3.83169f,-121.094f, +250.0f,-2.29372f,-117.188f, +3.90625f,50.3021f,-125.0f, +7.8125f,50.0186f,-125.0f, +11.7188f,47.8026f,-125.0f, +15.625f,45.4122f,-125.0f, +19.5313f,42.7204f,-125.0f, +23.4375f,42.1093f,-125.0f, +27.3438f,41.0672f,-125.0f, +31.25f,40.3016f,-125.0f, +35.1563f,38.401f,-125.0f, +39.0625f,36.5811f,-125.0f, +42.9688f,35.0771f,-125.0f, +46.875f,32.9255f,-125.0f, +50.7813f,31.2736f,-125.0f, +54.6875f,33.4622f,-125.0f, +58.5938f,34.314f,-125.0f, +62.5f,34.4185f,-125.0f, +66.4063f,34.621f,-125.0f, +70.3125f,34.9532f,-125.0f, +74.2188f,35.7305f,-125.0f, +78.125f,37.4446f,-125.0f, +82.0313f,37.6824f,-125.0f, +85.9375f,37.9835f,-125.0f, +89.8438f,38.5713f,-125.0f, +93.75f,39.56f,-125.0f, +97.6563f,40.0645f,-125.0f, +101.563f,39.9237f,-125.0f, +105.469f,39.8912f,-125.0f, +109.375f,39.9678f,-125.0f, +113.281f,39.7665f,-125.0f, +117.188f,38.758f,-125.0f, +121.094f,37.6738f,-125.0f, +125.0f,36.834f,-125.0f, +128.906f,34.7637f,-125.0f, +132.813f,31.9691f,-125.0f, +136.719f,30.7311f,-125.0f, +140.625f,27.9768f,-125.0f, +144.531f,25.22f,-125.0f, +148.438f,22.2616f,-125.0f, +152.344f,20.6399f,-125.0f, +156.25f,18.9363f,-125.0f, +160.156f,16.8778f,-125.0f, +164.063f,14.7425f,-125.0f, +167.969f,12.4299f,-125.0f, +171.875f,10.1017f,-125.0f, +175.781f,7.82169f,-125.0f, +179.688f,5.46502f,-125.0f, +183.594f,2.71076f,-125.0f, +187.5f,1.07736f,-125.0f, +191.406f,-0.592638f,-125.0f, +195.313f,-2.99173f,-125.0f, +199.219f,-4.30517f,-125.0f, +203.125f,-4.79591f,-125.0f, +207.031f,-6.32671f,-125.0f, +210.938f,-6.6914f,-125.0f, +214.844f,-8.34188f,-125.0f, +218.75f,-8.94371f,-125.0f, +222.656f,-7.16417f,-125.0f, +226.563f,-5.53904f,-125.0f, +230.469f,-5.10207f,-125.0f, +234.375f,-5.77507f,-125.0f, +238.281f,-5.5948f,-125.0f, +242.188f,-5.81224f,-125.0f, +246.094f,-5.48291f,-125.0f, +250.0f,-5.3221f,-125.0f, +3.90625f,50.4716f,-128.906f, +7.8125f,50.3922f,-128.906f, +11.7188f,48.0997f,-128.906f, +15.625f,44.9895f,-128.906f, +19.5313f,43.3038f,-128.906f, +23.4375f,42.8795f,-128.906f, +27.3438f,42.0905f,-128.906f, +31.25f,40.0566f,-128.906f, +35.1563f,37.7024f,-128.906f, +39.0625f,35.7533f,-128.906f, +42.9688f,32.9949f,-128.906f, +46.875f,31.7476f,-128.906f, +50.7813f,30.9413f,-128.906f, +54.6875f,31.9364f,-128.906f, +58.5938f,33.2028f,-128.906f, +62.5f,34.0103f,-128.906f, +66.4063f,34.3126f,-128.906f, +70.3125f,34.6096f,-128.906f, +74.2188f,35.8861f,-128.906f, +78.125f,36.5754f,-128.906f, +82.0313f,36.9009f,-128.906f, +85.9375f,37.369f,-128.906f, +89.8438f,38.2734f,-128.906f, +93.75f,38.7518f,-128.906f, +97.6563f,39.7576f,-128.906f, +101.563f,39.3413f,-128.906f, +105.469f,40.4224f,-128.906f, +109.375f,40.506f,-128.906f, +113.281f,39.7509f,-128.906f, +117.188f,38.6208f,-128.906f, +121.094f,37.1513f,-128.906f, +125.0f,36.003f,-128.906f, +128.906f,34.1307f,-128.906f, +132.813f,31.5523f,-128.906f, +136.719f,29.2003f,-128.906f, +140.625f,26.3718f,-128.906f, +144.531f,24.0851f,-128.906f, +148.438f,21.0492f,-128.906f, +152.344f,18.9709f,-128.906f, +156.25f,16.5536f,-128.906f, +160.156f,14.5588f,-128.906f, +164.063f,12.8386f,-128.906f, +167.969f,11.3092f,-128.906f, +171.875f,9.19396f,-128.906f, +175.781f,6.84617f,-128.906f, +179.688f,3.80062f,-128.906f, +183.594f,0.734751f,-128.906f, +187.5f,0.121523f,-128.906f, +191.406f,-1.9203f,-128.906f, +195.313f,-5.35291f,-128.906f, +199.219f,-7.06575f,-128.906f, +203.125f,-8.27325f,-128.906f, +207.031f,-8.82541f,-128.906f, +210.938f,-9.36185f,-128.906f, +214.844f,-10.8597f,-128.906f, +218.75f,-10.695f,-128.906f, +222.656f,-8.91012f,-128.906f, +226.563f,-8.24825f,-128.906f, +230.469f,-7.79624f,-128.906f, +234.375f,-6.74578f,-128.906f, +238.281f,-7.41285f,-128.906f, +242.188f,-7.01421f,-128.906f, +246.094f,-6.91669f,-128.906f, +250.0f,-6.09876f,-128.906f, +3.90625f,49.1054f,-132.813f, +7.8125f,48.771f,-132.813f, +11.7188f,46.9765f,-132.813f, +15.625f,44.4736f,-132.813f, +19.5313f,43.2026f,-132.813f, +23.4375f,42.2898f,-132.813f, +27.3438f,41.7492f,-132.813f, +31.25f,39.5792f,-132.813f, +35.1563f,36.5653f,-132.813f, +39.0625f,33.5612f,-132.813f, +42.9688f,31.9604f,-132.813f, +46.875f,30.953f,-132.813f, +50.7813f,30.5912f,-132.813f, +54.6875f,31.76f,-132.813f, +58.5938f,33.0843f,-132.813f, +62.5f,33.4323f,-132.813f, +66.4063f,33.9264f,-132.813f, +70.3125f,33.9268f,-132.813f, +74.2188f,33.8122f,-132.813f, +78.125f,34.9456f,-132.813f, +82.0313f,35.6308f,-132.813f, +85.9375f,35.8317f,-132.813f, +89.8438f,36.8255f,-132.813f, +93.75f,37.5781f,-132.813f, +97.6563f,39.0469f,-132.813f, +101.563f,38.905f,-132.813f, +105.469f,39.3656f,-132.813f, +109.375f,39.9706f,-132.813f, +113.281f,38.8077f,-132.813f, +117.188f,37.8378f,-132.813f, +121.094f,36.8368f,-132.813f, +125.0f,35.8474f,-132.813f, +128.906f,33.8502f,-132.813f, +132.813f,31.6251f,-132.813f, +136.719f,28.2781f,-132.813f, +140.625f,24.9841f,-132.813f, +144.531f,22.2281f,-132.813f, +148.438f,19.2974f,-132.813f, +152.344f,17.1516f,-132.813f, +156.25f,14.7654f,-132.813f, +160.156f,13.1833f,-132.813f, +164.063f,11.0184f,-132.813f, +167.969f,9.1589f,-132.813f, +171.875f,6.82631f,-132.813f, +175.781f,4.30633f,-132.813f, +179.688f,2.04751f,-132.813f, +183.594f,-0.74554f,-132.813f, +187.5f,-1.24688f,-132.813f, +191.406f,-3.70884f,-132.813f, +195.313f,-7.20423f,-132.813f, +199.219f,-9.63057f,-132.813f, +203.125f,-10.6411f,-132.813f, +207.031f,-11.1561f,-132.813f, +210.938f,-11.9998f,-132.813f, +214.844f,-13.1369f,-132.813f, +218.75f,-12.4543f,-132.813f, +222.656f,-11.5031f,-132.813f, +226.563f,-11.4632f,-132.813f, +230.469f,-10.5609f,-132.813f, +234.375f,-9.96017f,-132.813f, +238.281f,-9.64047f,-132.813f, +242.188f,-8.79112f,-132.813f, +246.094f,-8.33514f,-132.813f, +250.0f,-6.32649f,-132.813f, +3.90625f,47.9f,-136.719f, +7.8125f,47.0423f,-136.719f, +11.7188f,46.1087f,-136.719f, +15.625f,42.8209f,-136.719f, +19.5313f,41.8846f,-136.719f, +23.4375f,41.4071f,-136.719f, +27.3438f,39.6798f,-136.719f, +31.25f,38.1881f,-136.719f, +35.1563f,35.3952f,-136.719f, +39.0625f,31.8297f,-136.719f, +42.9688f,31.014f,-136.719f, +46.875f,29.29f,-136.719f, +50.7813f,29.4455f,-136.719f, +54.6875f,30.368f,-136.719f, +58.5938f,31.6261f,-136.719f, +62.5f,31.8803f,-136.719f, +66.4063f,32.8102f,-136.719f, +70.3125f,33.4331f,-136.719f, +74.2188f,33.19f,-136.719f, +78.125f,33.74f,-136.719f, +82.0313f,35.1047f,-136.719f, +85.9375f,36.2436f,-136.719f, +89.8438f,36.4928f,-136.719f, +93.75f,36.192f,-136.719f, +97.6563f,37.547f,-136.719f, +101.563f,38.0632f,-136.719f, +105.469f,38.6551f,-136.719f, +109.375f,38.4484f,-136.719f, +113.281f,37.8421f,-136.719f, +117.188f,37.5588f,-136.719f, +121.094f,37.278f,-136.719f, +125.0f,35.3541f,-136.719f, +128.906f,33.0939f,-136.719f, +132.813f,30.522f,-136.719f, +136.719f,27.5957f,-136.719f, +140.625f,24.4595f,-136.719f, +144.531f,21.0335f,-136.719f, +148.438f,18.0163f,-136.719f, +152.344f,15.3659f,-136.719f, +156.25f,13.4036f,-136.719f, +160.156f,11.6819f,-136.719f, +164.063f,9.68686f,-136.719f, +167.969f,7.56782f,-136.719f, +171.875f,4.49435f,-136.719f, +175.781f,1.55284f,-136.719f, +179.688f,0.275057f,-136.719f, +183.594f,-2.20168f,-136.719f, +187.5f,-3.16842f,-136.719f, +191.406f,-5.74212f,-136.719f, +195.313f,-8.33918f,-136.719f, +199.219f,-11.9926f,-136.719f, +203.125f,-13.7382f,-136.719f, +207.031f,-14.2163f,-136.719f, +210.938f,-14.76f,-136.719f, +214.844f,-14.7917f,-136.719f, +218.75f,-15.4594f,-136.719f, +222.656f,-14.7722f,-136.719f, +226.563f,-14.7687f,-136.719f, +230.469f,-13.0502f,-136.719f, +234.375f,-12.7522f,-136.719f, +238.281f,-12.1277f,-136.719f, +242.188f,-11.9805f,-136.719f, +246.094f,-9.26664f,-136.719f, +250.0f,-6.42671f,-136.719f, +3.90625f,47.2681f,-140.625f, +7.8125f,46.3513f,-140.625f, +11.7188f,45.1181f,-140.625f, +15.625f,42.9593f,-140.625f, +19.5313f,40.04f,-140.625f, +23.4375f,38.1657f,-140.625f, +27.3438f,37.2537f,-140.625f, +31.25f,35.6767f,-140.625f, +35.1563f,33.3413f,-140.625f, +39.0625f,30.7556f,-140.625f, +42.9688f,29.0258f,-140.625f, +46.875f,27.8122f,-140.625f, +50.7813f,27.4512f,-140.625f, +54.6875f,28.1912f,-140.625f, +58.5938f,29.8142f,-140.625f, +62.5f,30.1394f,-140.625f, +66.4063f,30.7105f,-140.625f, +70.3125f,31.9295f,-140.625f, +74.2188f,32.6689f,-140.625f, +78.125f,32.9232f,-140.625f, +82.0313f,35.5221f,-140.625f, +85.9375f,36.1785f,-140.625f, +89.8438f,35.864f,-140.625f, +93.75f,35.2473f,-140.625f, +97.6563f,35.6334f,-140.625f, +101.563f,36.5759f,-140.625f, +105.469f,37.2506f,-140.625f, +109.375f,36.7249f,-140.625f, +113.281f,36.4287f,-140.625f, +117.188f,36.6819f,-140.625f, +121.094f,36.4294f,-140.625f, +125.0f,35.2358f,-140.625f, +128.906f,32.9869f,-140.625f, +132.813f,30.156f,-140.625f, +136.719f,27.0471f,-140.625f, +140.625f,23.8554f,-140.625f, +144.531f,20.3993f,-140.625f, +148.438f,16.6224f,-140.625f, +152.344f,13.058f,-140.625f, +156.25f,11.1345f,-140.625f, +160.156f,9.35133f,-140.625f, +164.063f,7.36194f,-140.625f, +167.969f,5.31819f,-140.625f, +171.875f,2.78652f,-140.625f, +175.781f,0.868982f,-140.625f, +179.688f,-1.31465f,-140.625f, +183.594f,-3.64199f,-140.625f, +187.5f,-5.38333f,-140.625f, +191.406f,-8.08251f,-140.625f, +195.313f,-10.9184f,-140.625f, +199.219f,-14.2737f,-140.625f, +203.125f,-16.1495f,-140.625f, +207.031f,-16.9134f,-140.625f, +210.938f,-16.9575f,-140.625f, +214.844f,-17.6023f,-140.625f, +218.75f,-17.6633f,-140.625f, +222.656f,-17.159f,-140.625f, +226.563f,-16.2062f,-140.625f, +230.469f,-15.7685f,-140.625f, +234.375f,-15.0547f,-140.625f, +238.281f,-14.7858f,-140.625f, +242.188f,-12.8534f,-140.625f, +246.094f,-9.20599f,-140.625f, +250.0f,-5.60644f,-140.625f, +3.90625f,45.2398f,-144.531f, +7.8125f,45.0428f,-144.531f, +11.7188f,44.1179f,-144.531f, +15.625f,42.444f,-144.531f, +19.5313f,39.732f,-144.531f, +23.4375f,37.0479f,-144.531f, +27.3438f,34.3624f,-144.531f, +31.25f,33.2513f,-144.531f, +35.1563f,31.1146f,-144.531f, +39.0625f,29.2726f,-144.531f, +42.9688f,27.3159f,-144.531f, +46.875f,27.1241f,-144.531f, +50.7813f,26.6524f,-144.531f, +54.6875f,26.3337f,-144.531f, +58.5938f,27.8201f,-144.531f, +62.5f,27.8456f,-144.531f, +66.4063f,27.8306f,-144.531f, +70.3125f,29.8911f,-144.531f, +74.2188f,31.0667f,-144.531f, +78.125f,32.5778f,-144.531f, +82.0313f,34.5337f,-144.531f, +85.9375f,35.1457f,-144.531f, +89.8438f,34.7649f,-144.531f, +93.75f,34.0929f,-144.531f, +97.6563f,34.2934f,-144.531f, +101.563f,34.8046f,-144.531f, +105.469f,36.2496f,-144.531f, +109.375f,35.8351f,-144.531f, +113.281f,35.8228f,-144.531f, +117.188f,35.7495f,-144.531f, +121.094f,34.832f,-144.531f, +125.0f,34.3351f,-144.531f, +128.906f,32.4744f,-144.531f, +132.813f,29.6967f,-144.531f, +136.719f,26.263f,-144.531f, +140.625f,23.3556f,-144.531f, +144.531f,19.3517f,-144.531f, +148.438f,14.458f,-144.531f, +152.344f,11.2423f,-144.531f, +156.25f,9.75514f,-144.531f, +160.156f,7.96146f,-144.531f, +164.063f,5.67024f,-144.531f, +167.969f,4.08006f,-144.531f, +171.875f,1.71102f,-144.531f, +175.781f,-0.915369f,-144.531f, +179.688f,-2.66343f,-144.531f, +183.594f,-5.5816f,-144.531f, +187.5f,-7.79353f,-144.531f, +191.406f,-10.1772f,-144.531f, +195.313f,-13.5463f,-144.531f, +199.219f,-16.0692f,-144.531f, +203.125f,-17.2505f,-144.531f, +207.031f,-18.7241f,-144.531f, +210.938f,-18.7295f,-144.531f, +214.844f,-19.3f,-144.531f, +218.75f,-20.3181f,-144.531f, +222.656f,-19.4871f,-144.531f, +226.563f,-18.5465f,-144.531f, +230.469f,-17.525f,-144.531f, +234.375f,-16.5076f,-144.531f, +238.281f,-15.0993f,-144.531f, +242.188f,-13.0716f,-144.531f, +246.094f,-9.99063f,-144.531f, +250.0f,-5.64288f,-144.531f, +3.90625f,43.4167f,-148.438f, +7.8125f,43.0193f,-148.438f, +11.7188f,42.6242f,-148.438f, +15.625f,40.8831f,-148.438f, +19.5313f,38.6824f,-148.438f, +23.4375f,36.0177f,-148.438f, +27.3438f,32.9654f,-148.438f, +31.25f,31.3995f,-148.438f, +35.1563f,29.5101f,-148.438f, +39.0625f,27.4588f,-148.438f, +42.9688f,25.129f,-148.438f, +46.875f,25.4533f,-148.438f, +50.7813f,25.7106f,-148.438f, +54.6875f,25.737f,-148.438f, +58.5938f,26.1608f,-148.438f, +62.5f,27.2373f,-148.438f, +66.4063f,27.3635f,-148.438f, +70.3125f,27.7787f,-148.438f, +74.2188f,29.0906f,-148.438f, +78.125f,31.3992f,-148.438f, +82.0313f,32.9373f,-148.438f, +85.9375f,33.743f,-148.438f, +89.8438f,34.4265f,-148.438f, +93.75f,33.525f,-148.438f, +97.6563f,33.8231f,-148.438f, +101.563f,34.6826f,-148.438f, +105.469f,35.0275f,-148.438f, +109.375f,34.4667f,-148.438f, +113.281f,34.7266f,-148.438f, +117.188f,34.0788f,-148.438f, +121.094f,33.2521f,-148.438f, +125.0f,32.1914f,-148.438f, +128.906f,30.7782f,-148.438f, +132.813f,28.8615f,-148.438f, +136.719f,25.3691f,-148.438f, +140.625f,21.5786f,-148.438f, +144.531f,17.2969f,-148.438f, +148.438f,13.1925f,-148.438f, +152.344f,10.0632f,-148.438f, +156.25f,8.32421f,-148.438f, +160.156f,6.57856f,-148.438f, +164.063f,4.18522f,-148.438f, +167.969f,2.25091f,-148.438f, +171.875f,0.445952f,-148.438f, +175.781f,-1.73703f,-148.438f, +179.688f,-3.44886f,-148.438f, +183.594f,-6.77108f,-148.438f, +187.5f,-9.26031f,-148.438f, +191.406f,-12.38f,-148.438f, +195.313f,-14.6453f,-148.438f, +199.219f,-15.8435f,-148.438f, +203.125f,-17.3242f,-148.438f, +207.031f,-19.3932f,-148.438f, +210.938f,-19.7735f,-148.438f, +214.844f,-20.1293f,-148.438f, +218.75f,-20.5777f,-148.438f, +222.656f,-20.7145f,-148.438f, +226.563f,-20.64f,-148.438f, +230.469f,-19.6971f,-148.438f, +234.375f,-17.5016f,-148.438f, +238.281f,-14.644f,-148.438f, +242.188f,-12.3094f,-148.438f, +246.094f,-10.1634f,-148.438f, +250.0f,-6.79503f,-148.438f, +3.90625f,42.7212f,-152.344f, +7.8125f,41.7463f,-152.344f, +11.7188f,40.5249f,-152.344f, +15.625f,39.5225f,-152.344f, +19.5313f,36.6967f,-152.344f, +23.4375f,34.0075f,-152.344f, +27.3438f,31.2054f,-152.344f, +31.25f,28.8502f,-152.344f, +35.1563f,27.2625f,-152.344f, +39.0625f,24.9496f,-152.344f, +42.9688f,23.5897f,-152.344f, +46.875f,23.4709f,-152.344f, +50.7813f,24.179f,-152.344f, +54.6875f,25.021f,-152.344f, +58.5938f,25.6664f,-152.344f, +62.5f,25.7063f,-152.344f, +66.4063f,26.6928f,-152.344f, +70.3125f,26.8261f,-152.344f, +74.2188f,28.2549f,-152.344f, +78.125f,30.3373f,-152.344f, +82.0313f,31.6194f,-152.344f, +85.9375f,32.9189f,-152.344f, +89.8438f,32.7162f,-152.344f, +93.75f,33.0001f,-152.344f, +97.6563f,34.4407f,-152.344f, +101.563f,35.0813f,-152.344f, +105.469f,34.4143f,-152.344f, +109.375f,33.5195f,-152.344f, +113.281f,32.927f,-152.344f, +117.188f,32.6509f,-152.344f, +121.094f,32.6775f,-152.344f, +125.0f,30.887f,-152.344f, +128.906f,28.4296f,-152.344f, +132.813f,26.5539f,-152.344f, +136.719f,24.0803f,-152.344f, +140.625f,20.196f,-152.344f, +144.531f,16.4293f,-152.344f, +148.438f,12.8243f,-152.344f, +152.344f,9.76479f,-152.344f, +156.25f,7.14206f,-152.344f, +160.156f,4.74684f,-152.344f, +164.063f,2.30008f,-152.344f, +167.969f,1.49801f,-152.344f, +171.875f,-0.62719f,-152.344f, +175.781f,-1.99004f,-152.344f, +179.688f,-4.80775f,-152.344f, +183.594f,-8.00986f,-152.344f, +187.5f,-11.4771f,-152.344f, +191.406f,-12.8743f,-152.344f, +195.313f,-13.8733f,-152.344f, +199.219f,-15.0749f,-152.344f, +203.125f,-16.9234f,-152.344f, +207.031f,-18.3258f,-152.344f, +210.938f,-19.6583f,-152.344f, +214.844f,-20.9396f,-152.344f, +218.75f,-21.8071f,-152.344f, +222.656f,-21.4908f,-152.344f, +226.563f,-21.4698f,-152.344f, +230.469f,-19.3773f,-152.344f, +234.375f,-17.0448f,-152.344f, +238.281f,-14.0123f,-152.344f, +242.188f,-11.2372f,-152.344f, +246.094f,-9.11286f,-152.344f, +250.0f,-6.76792f,-152.344f, +3.90625f,41.7368f,-156.25f, +7.8125f,40.8494f,-156.25f, +11.7188f,39.2286f,-156.25f, +15.625f,37.4784f,-156.25f, +19.5313f,36.0345f,-156.25f, +23.4375f,33.9716f,-156.25f, +27.3438f,31.3041f,-156.25f, +31.25f,28.9777f,-156.25f, +35.1563f,26.0934f,-156.25f, +39.0625f,23.7421f,-156.25f, +42.9688f,22.4401f,-156.25f, +46.875f,22.1238f,-156.25f, +50.7813f,22.6669f,-156.25f, +54.6875f,23.7702f,-156.25f, +58.5938f,24.63f,-156.25f, +62.5f,25.2145f,-156.25f, +66.4063f,26.6101f,-156.25f, +70.3125f,27.3664f,-156.25f, +74.2188f,28.121f,-156.25f, +78.125f,29.5305f,-156.25f, +82.0313f,30.4367f,-156.25f, +85.9375f,30.627f,-156.25f, +89.8438f,30.4079f,-156.25f, +93.75f,32.2186f,-156.25f, +97.6563f,33.2916f,-156.25f, +101.563f,33.8066f,-156.25f, +105.469f,32.5269f,-156.25f, +109.375f,32.0751f,-156.25f, +113.281f,31.0298f,-156.25f, +117.188f,30.9869f,-156.25f, +121.094f,30.9826f,-156.25f, +125.0f,29.0676f,-156.25f, +128.906f,26.8988f,-156.25f, +132.813f,24.0771f,-156.25f, +136.719f,21.8087f,-156.25f, +140.625f,18.8179f,-156.25f, +144.531f,14.2483f,-156.25f, +148.438f,10.9236f,-156.25f, +152.344f,9.05948f,-156.25f, +156.25f,6.86087f,-156.25f, +160.156f,3.50699f,-156.25f, +164.063f,1.14903f,-156.25f, +167.969f,-0.639847f,-156.25f, +171.875f,-2.73828f,-156.25f, +175.781f,-4.02372f,-156.25f, +179.688f,-6.15141f,-156.25f, +183.594f,-8.81231f,-156.25f, +187.5f,-10.3417f,-156.25f, +191.406f,-11.1895f,-156.25f, +195.313f,-13.1464f,-156.25f, +199.219f,-14.5401f,-156.25f, +203.125f,-15.9427f,-156.25f, +207.031f,-17.492f,-156.25f, +210.938f,-19.0599f,-156.25f, +214.844f,-21.1101f,-156.25f, +218.75f,-21.3872f,-156.25f, +222.656f,-21.1481f,-156.25f, +226.563f,-20.2836f,-156.25f, +230.469f,-18.1679f,-156.25f, +234.375f,-15.72f,-156.25f, +238.281f,-13.4579f,-156.25f, +242.188f,-10.1453f,-156.25f, +246.094f,-8.09411f,-156.25f, +250.0f,-5.46467f,-156.25f, +3.90625f,40.4755f,-160.156f, +7.8125f,39.299f,-160.156f, +11.7188f,37.3972f,-160.156f, +15.625f,36.1894f,-160.156f, +19.5313f,34.3138f,-160.156f, +23.4375f,32.893f,-160.156f, +27.3438f,30.4515f,-160.156f, +31.25f,28.5808f,-160.156f, +35.1563f,25.8839f,-160.156f, +39.0625f,23.8505f,-160.156f, +42.9688f,22.3057f,-160.156f, +46.875f,21.4418f,-160.156f, +50.7813f,21.9709f,-160.156f, +54.6875f,23.0083f,-160.156f, +58.5938f,24.899f,-160.156f, +62.5f,25.213f,-160.156f, +66.4063f,26.1428f,-160.156f, +70.3125f,27.2675f,-160.156f, +74.2188f,28.0843f,-160.156f, +78.125f,28.9474f,-160.156f, +82.0313f,29.5078f,-160.156f, +85.9375f,29.7468f,-160.156f, +89.8438f,30.8621f,-160.156f, +93.75f,31.5001f,-160.156f, +97.6563f,32.1184f,-160.156f, +101.563f,31.2692f,-160.156f, +105.469f,30.4985f,-160.156f, +109.375f,29.4368f,-160.156f, +113.281f,30.6889f,-160.156f, +117.188f,29.6238f,-160.156f, +121.094f,28.6487f,-160.156f, +125.0f,26.3174f,-160.156f, +128.906f,24.6125f,-160.156f, +132.813f,22.1993f,-160.156f, +136.719f,19.3934f,-160.156f, +140.625f,16.5457f,-160.156f, +144.531f,13.4024f,-160.156f, +148.438f,9.69887f,-160.156f, +152.344f,8.13305f,-160.156f, +156.25f,6.48921f,-160.156f, +160.156f,2.56153f,-160.156f, +164.063f,0.0733139f,-160.156f, +167.969f,-1.11414f,-160.156f, +171.875f,-3.04708f,-160.156f, +175.781f,-6.18654f,-160.156f, +179.688f,-7.4188f,-160.156f, +183.594f,-9.1718f,-160.156f, +187.5f,-9.78027f,-160.156f, +191.406f,-10.5496f,-160.156f, +195.313f,-12.7259f,-160.156f, +199.219f,-13.9068f,-160.156f, +203.125f,-15.4772f,-160.156f, +207.031f,-17.6287f,-160.156f, +210.938f,-19.2502f,-160.156f, +214.844f,-19.5824f,-160.156f, +218.75f,-19.3114f,-160.156f, +222.656f,-19.5266f,-160.156f, +226.563f,-17.8446f,-160.156f, +230.469f,-16.3027f,-160.156f, +234.375f,-14.5015f,-160.156f, +238.281f,-11.9891f,-160.156f, +242.188f,-9.40017f,-160.156f, +246.094f,-6.63794f,-160.156f, +250.0f,-3.71573f,-160.156f, +3.90625f,38.8633f,-164.063f, +7.8125f,37.4382f,-164.063f, +11.7188f,35.7214f,-164.063f, +15.625f,34.0614f,-164.063f, +19.5313f,33.0957f,-164.063f, +23.4375f,32.0369f,-164.063f, +27.3438f,29.7096f,-164.063f, +31.25f,27.3216f,-164.063f, +35.1563f,25.2446f,-164.063f, +39.0625f,23.6071f,-164.063f, +42.9688f,22.2443f,-164.063f, +46.875f,21.2807f,-164.063f, +50.7813f,21.0358f,-164.063f, +54.6875f,22.8177f,-164.063f, +58.5938f,24.4434f,-164.063f, +62.5f,25.1375f,-164.063f, +66.4063f,25.3266f,-164.063f, +70.3125f,26.6102f,-164.063f, +74.2188f,27.6569f,-164.063f, +78.125f,27.8248f,-164.063f, +82.0313f,28.0421f,-164.063f, +85.9375f,29.1719f,-164.063f, +89.8438f,29.9529f,-164.063f, +93.75f,30.947f,-164.063f, +97.6563f,30.6189f,-164.063f, +101.563f,29.7913f,-164.063f, +105.469f,27.6858f,-164.063f, +109.375f,27.3234f,-164.063f, +113.281f,27.8148f,-164.063f, +117.188f,27.3571f,-164.063f, +121.094f,26.1572f,-164.063f, +125.0f,23.8557f,-164.063f, +128.906f,21.6383f,-164.063f, +132.813f,19.0681f,-164.063f, +136.719f,16.7352f,-164.063f, +140.625f,14.4004f,-164.063f, +144.531f,11.082f,-164.063f, +148.438f,8.38754f,-164.063f, +152.344f,7.0054f,-164.063f, +156.25f,4.95122f,-164.063f, +160.156f,2.47298f,-164.063f, +164.063f,0.777691f,-164.063f, +167.969f,-1.44055f,-164.063f, +171.875f,-3.57218f,-164.063f, +175.781f,-6.3396f,-164.063f, +179.688f,-7.49937f,-164.063f, +183.594f,-9.17485f,-164.063f, +187.5f,-9.92705f,-164.063f, +191.406f,-11.0737f,-164.063f, +195.313f,-12.8264f,-164.063f, +199.219f,-14.9306f,-164.063f, +203.125f,-15.9553f,-164.063f, +207.031f,-17.0898f,-164.063f, +210.938f,-18.5283f,-164.063f, +214.844f,-18.545f,-164.063f, +218.75f,-18.553f,-164.063f, +222.656f,-17.5725f,-164.063f, +226.563f,-15.6444f,-164.063f, +230.469f,-14.565f,-164.063f, +234.375f,-12.5578f,-164.063f, +238.281f,-10.6498f,-164.063f, +242.188f,-8.28284f,-164.063f, +246.094f,-5.87682f,-164.063f, +250.0f,-2.5339f,-164.063f, +3.90625f,37.2199f,-167.969f, +7.8125f,36.6782f,-167.969f, +11.7188f,36.2393f,-167.969f, +15.625f,33.4745f,-167.969f, +19.5313f,32.0928f,-167.969f, +23.4375f,30.5662f,-167.969f, +27.3438f,28.5968f,-167.969f, +31.25f,26.4298f,-167.969f, +35.1563f,23.9469f,-167.969f, +39.0625f,22.5415f,-167.969f, +42.9688f,21.8267f,-167.969f, +46.875f,21.2097f,-167.969f, +50.7813f,21.0841f,-167.969f, +54.6875f,21.7877f,-167.969f, +58.5938f,22.9351f,-167.969f, +62.5f,24.0641f,-167.969f, +66.4063f,24.42f,-167.969f, +70.3125f,24.8355f,-167.969f, +74.2188f,25.2701f,-167.969f, +78.125f,26.0252f,-167.969f, +82.0313f,26.8612f,-167.969f, +85.9375f,27.4256f,-167.969f, +89.8438f,28.994f,-167.969f, +93.75f,29.1766f,-167.969f, +97.6563f,27.8964f,-167.969f, +101.563f,26.6384f,-167.969f, +105.469f,24.9844f,-167.969f, +109.375f,25.0669f,-167.969f, +113.281f,24.572f,-167.969f, +117.188f,23.7817f,-167.969f, +121.094f,22.2089f,-167.969f, +125.0f,19.7633f,-167.969f, +128.906f,17.7618f,-167.969f, +132.813f,15.7339f,-167.969f, +136.719f,13.4975f,-167.969f, +140.625f,11.7364f,-167.969f, +144.531f,9.85351f,-167.969f, +148.438f,8.05282f,-167.969f, +152.344f,6.97463f,-167.969f, +156.25f,5.11511f,-167.969f, +160.156f,3.12954f,-167.969f, +164.063f,1.56555f,-167.969f, +167.969f,-1.77415f,-167.969f, +171.875f,-4.16322f,-167.969f, +175.781f,-5.85214f,-167.969f, +179.688f,-7.97892f,-167.969f, +183.594f,-9.87953f,-167.969f, +187.5f,-10.2762f,-167.969f, +191.406f,-11.5319f,-167.969f, +195.313f,-13.3612f,-167.969f, +199.219f,-15.3709f,-167.969f, +203.125f,-16.5674f,-167.969f, +207.031f,-17.6903f,-167.969f, +210.938f,-17.6736f,-167.969f, +214.844f,-16.8207f,-167.969f, +218.75f,-17.0254f,-167.969f, +222.656f,-16.3676f,-167.969f, +226.563f,-14.2816f,-167.969f, +230.469f,-13.3488f,-167.969f, +234.375f,-12.0136f,-167.969f, +238.281f,-9.90116f,-167.969f, +242.188f,-7.92295f,-167.969f, +246.094f,-5.41594f,-167.969f, +250.0f,-1.87299f,-167.969f, +3.90625f,35.3898f,-171.875f, +7.8125f,35.2527f,-171.875f, +11.7188f,34.3178f,-171.875f, +15.625f,33.0736f,-171.875f, +19.5313f,31.4013f,-171.875f, +23.4375f,28.9174f,-171.875f, +27.3438f,26.607f,-171.875f, +31.25f,24.7766f,-171.875f, +35.1563f,23.21f,-171.875f, +39.0625f,21.903f,-171.875f, +42.9688f,20.775f,-171.875f, +46.875f,20.114f,-171.875f, +50.7813f,19.6974f,-171.875f, +54.6875f,20.6726f,-171.875f, +58.5938f,22.241f,-171.875f, +62.5f,22.075f,-171.875f, +66.4063f,22.6771f,-171.875f, +70.3125f,22.4456f,-171.875f, +74.2188f,22.8643f,-171.875f, +78.125f,24.7268f,-171.875f, +82.0313f,25.7019f,-171.875f, +85.9375f,26.1196f,-171.875f, +89.8438f,25.6156f,-171.875f, +93.75f,24.7881f,-171.875f, +97.6563f,24.0074f,-171.875f, +101.563f,23.4739f,-171.875f, +105.469f,23.362f,-171.875f, +109.375f,22.2604f,-171.875f, +113.281f,21.2772f,-171.875f, +117.188f,19.7815f,-171.875f, +121.094f,17.9686f,-171.875f, +125.0f,16.3211f,-171.875f, +128.906f,14.2631f,-171.875f, +132.813f,12.4914f,-171.875f, +136.719f,10.3941f,-171.875f, +140.625f,8.91613f,-171.875f, +144.531f,9.17409f,-171.875f, +148.438f,7.34154f,-171.875f, +152.344f,6.13056f,-171.875f, +156.25f,4.58272f,-171.875f, +160.156f,2.77083f,-171.875f, +164.063f,1.11181f,-171.875f, +167.969f,-2.00034f,-171.875f, +171.875f,-3.64525f,-171.875f, +175.781f,-5.12602f,-171.875f, +179.688f,-8.3325f,-171.875f, +183.594f,-10.0807f,-171.875f, +187.5f,-10.8974f,-171.875f, +191.406f,-11.9623f,-171.875f, +195.313f,-14.5041f,-171.875f, +199.219f,-15.8629f,-171.875f, +203.125f,-17.2342f,-171.875f, +207.031f,-18.2786f,-171.875f, +210.938f,-16.9405f,-171.875f, +214.844f,-16.1592f,-171.875f, +218.75f,-15.9928f,-171.875f, +222.656f,-14.9179f,-171.875f, +226.563f,-13.6308f,-171.875f, +230.469f,-12.822f,-171.875f, +234.375f,-11.0168f,-171.875f, +238.281f,-8.54191f,-171.875f, +242.188f,-6.16464f,-171.875f, +246.094f,-4.35579f,-171.875f, +250.0f,-1.83408f,-171.875f, +3.90625f,34.823f,-175.781f, +7.8125f,33.9621f,-175.781f, +11.7188f,33.7226f,-175.781f, +15.625f,31.9821f,-175.781f, +19.5313f,29.6933f,-175.781f, +23.4375f,27.247f,-175.781f, +27.3438f,25.1394f,-175.781f, +31.25f,23.3125f,-175.781f, +35.1563f,21.288f,-175.781f, +39.0625f,21.2432f,-175.781f, +42.9688f,19.7041f,-175.781f, +46.875f,19.3043f,-175.781f, +50.7813f,18.5669f,-175.781f, +54.6875f,19.5408f,-175.781f, +58.5938f,20.3028f,-175.781f, +62.5f,20.573f,-175.781f, +66.4063f,20.7874f,-175.781f, +70.3125f,21.4507f,-175.781f, +74.2188f,22.9166f,-175.781f, +78.125f,23.6886f,-175.781f, +82.0313f,24.4139f,-175.781f, +85.9375f,25.1097f,-175.781f, +89.8438f,24.1395f,-175.781f, +93.75f,23.5282f,-175.781f, +97.6563f,22.7881f,-175.781f, +101.563f,21.2087f,-175.781f, +105.469f,20.6461f,-175.781f, +109.375f,19.7212f,-175.781f, +113.281f,17.9239f,-175.781f, +117.188f,16.9142f,-175.781f, +121.094f,16.1581f,-175.781f, +125.0f,15.1171f,-175.781f, +128.906f,13.1305f,-175.781f, +132.813f,10.3035f,-175.781f, +136.719f,7.95438f,-175.781f, +140.625f,7.49768f,-175.781f, +144.531f,7.76486f,-175.781f, +148.438f,6.84318f,-175.781f, +152.344f,6.0204f,-175.781f, +156.25f,4.83875f,-175.781f, +160.156f,2.59906f,-175.781f, +164.063f,1.35973f,-175.781f, +167.969f,-1.40345f,-175.781f, +171.875f,-3.6985f,-175.781f, +175.781f,-5.60686f,-175.781f, +179.688f,-8.15914f,-175.781f, +183.594f,-9.0389f,-175.781f, +187.5f,-11.2771f,-175.781f, +191.406f,-13.1363f,-175.781f, +195.313f,-14.845f,-175.781f, +199.219f,-15.885f,-175.781f, +203.125f,-17.6421f,-175.781f, +207.031f,-18.1972f,-175.781f, +210.938f,-16.4052f,-175.781f, +214.844f,-16.4522f,-175.781f, +218.75f,-15.8261f,-175.781f, +222.656f,-13.6816f,-175.781f, +226.563f,-12.8394f,-175.781f, +230.469f,-11.638f,-175.781f, +234.375f,-8.87545f,-175.781f, +238.281f,-6.82071f,-175.781f, +242.188f,-3.82988f,-175.781f, +246.094f,-2.34543f,-175.781f, +250.0f,-0.72787f,-175.781f, +3.90625f,32.9461f,-179.688f, +7.8125f,32.0951f,-179.688f, +11.7188f,31.1161f,-179.688f, +15.625f,29.4f,-179.688f, +19.5313f,27.5196f,-179.688f, +23.4375f,26.3351f,-179.688f, +27.3438f,24.0706f,-179.688f, +31.25f,21.9677f,-179.688f, +35.1563f,20.1582f,-179.688f, +39.0625f,19.3604f,-179.688f, +42.9688f,18.5912f,-179.688f, +46.875f,18.0845f,-179.688f, +50.7813f,18.0311f,-179.688f, +54.6875f,17.5412f,-179.688f, +58.5938f,17.724f,-179.688f, +62.5f,18.1752f,-179.688f, +66.4063f,18.8435f,-179.688f, +70.3125f,20.8887f,-179.688f, +74.2188f,21.9179f,-179.688f, +78.125f,22.3044f,-179.688f, +82.0313f,22.1491f,-179.688f, +85.9375f,23.261f,-179.688f, +89.8438f,22.4285f,-179.688f, +93.75f,21.5354f,-179.688f, +97.6563f,19.6399f,-179.688f, +101.563f,18.1312f,-179.688f, +105.469f,17.0655f,-179.688f, +109.375f,16.1471f,-179.688f, +113.281f,15.8256f,-179.688f, +117.188f,14.9609f,-179.688f, +121.094f,15.4508f,-179.688f, +125.0f,14.9122f,-179.688f, +128.906f,12.3324f,-179.688f, +132.813f,9.95184f,-179.688f, +136.719f,7.31755f,-179.688f, +140.625f,6.91109f,-179.688f, +144.531f,7.29489f,-179.688f, +148.438f,6.73968f,-179.688f, +152.344f,6.0555f,-179.688f, +156.25f,5.42266f,-179.688f, +160.156f,3.84651f,-179.688f, +164.063f,2.44552f,-179.688f, +167.969f,-0.187962f,-179.688f, +171.875f,-3.00626f,-179.688f, +175.781f,-5.38527f,-179.688f, +179.688f,-6.48806f,-179.688f, +183.594f,-9.24275f,-179.688f, +187.5f,-11.5122f,-179.688f, +191.406f,-12.6735f,-179.688f, +195.313f,-14.1843f,-179.688f, +199.219f,-15.4787f,-179.688f, +203.125f,-16.6061f,-179.688f, +207.031f,-17.1175f,-179.688f, +210.938f,-16.022f,-179.688f, +214.844f,-15.9349f,-179.688f, +218.75f,-14.6169f,-179.688f, +222.656f,-13.0146f,-179.688f, +226.563f,-12.2f,-179.688f, +230.469f,-9.81169f,-179.688f, +234.375f,-6.72224f,-179.688f, +238.281f,-4.11664f,-179.688f, +242.188f,-2.18066f,-179.688f, +246.094f,-0.510192f,-179.688f, +250.0f,1.48603f,-179.688f, +3.90625f,30.0027f,-183.594f, +7.8125f,29.6114f,-183.594f, +11.7188f,28.342f,-183.594f, +15.625f,26.9383f,-183.594f, +19.5313f,26.0219f,-183.594f, +23.4375f,25.017f,-183.594f, +27.3438f,22.7851f,-183.594f, +31.25f,20.6488f,-183.594f, +35.1563f,18.7107f,-183.594f, +39.0625f,17.0893f,-183.594f, +42.9688f,17.4316f,-183.594f, +46.875f,17.3211f,-183.594f, +50.7813f,16.5318f,-183.594f, +54.6875f,16.2012f,-183.594f, +58.5938f,17.0855f,-183.594f, +62.5f,17.2472f,-183.594f, +66.4063f,18.0123f,-183.594f, +70.3125f,18.684f,-183.594f, +74.2188f,19.625f,-183.594f, +78.125f,19.9442f,-183.594f, +82.0313f,19.9236f,-183.594f, +85.9375f,19.2286f,-183.594f, +89.8438f,19.5358f,-183.594f, +93.75f,18.429f,-183.594f, +97.6563f,16.1318f,-183.594f, +101.563f,14.371f,-183.594f, +105.469f,13.894f,-183.594f, +109.375f,13.5457f,-183.594f, +113.281f,13.7348f,-183.594f, +117.188f,14.0078f,-183.594f, +121.094f,14.2652f,-183.594f, +125.0f,13.5964f,-183.594f, +128.906f,11.3529f,-183.594f, +132.813f,8.43645f,-183.594f, +136.719f,6.95213f,-183.594f, +140.625f,7.16061f,-183.594f, +144.531f,6.71961f,-183.594f, +148.438f,5.35597f,-183.594f, +152.344f,5.22708f,-183.594f, +156.25f,5.07045f,-183.594f, +160.156f,3.44698f,-183.594f, +164.063f,2.33212f,-183.594f, +167.969f,0.462143f,-183.594f, +171.875f,-2.31458f,-183.594f, +175.781f,-4.89712f,-183.594f, +179.688f,-6.66797f,-183.594f, +183.594f,-9.25909f,-183.594f, +187.5f,-9.93472f,-183.594f, +191.406f,-12.0357f,-183.594f, +195.313f,-13.4286f,-183.594f, +199.219f,-14.4671f,-183.594f, +203.125f,-15.0102f,-183.594f, +207.031f,-14.8104f,-183.594f, +210.938f,-13.4733f,-183.594f, +214.844f,-14.0715f,-183.594f, +218.75f,-14.2416f,-183.594f, +222.656f,-12.2774f,-183.594f, +226.563f,-11.1048f,-183.594f, +230.469f,-8.72548f,-183.594f, +234.375f,-5.50563f,-183.594f, +238.281f,-2.81853f,-183.594f, +242.188f,-0.555239f,-183.594f, +246.094f,1.07177f,-183.594f, +250.0f,3.1022f,-183.594f, +3.90625f,27.6405f,-187.5f, +7.8125f,27.1266f,-187.5f, +11.7188f,26.0941f,-187.5f, +15.625f,25.1443f,-187.5f, +19.5313f,24.6236f,-187.5f, +23.4375f,23.7274f,-187.5f, +27.3438f,22.5792f,-187.5f, +31.25f,19.7482f,-187.5f, +35.1563f,17.6829f,-187.5f, +39.0625f,16.5577f,-187.5f, +42.9688f,15.8636f,-187.5f, +46.875f,16.0968f,-187.5f, +50.7813f,15.5614f,-187.5f, +54.6875f,15.4655f,-187.5f, +58.5938f,16.304f,-187.5f, +62.5f,16.7706f,-187.5f, +66.4063f,16.3947f,-187.5f, +70.3125f,16.6761f,-187.5f, +74.2188f,16.7627f,-187.5f, +78.125f,17.2579f,-187.5f, +82.0313f,16.7208f,-187.5f, +85.9375f,16.5278f,-187.5f, +89.8438f,16.2251f,-187.5f, +93.75f,15.0741f,-187.5f, +97.6563f,14.2628f,-187.5f, +101.563f,12.432f,-187.5f, +105.469f,10.8877f,-187.5f, +109.375f,11.903f,-187.5f, +113.281f,12.5606f,-187.5f, +117.188f,13.2652f,-187.5f, +121.094f,13.6914f,-187.5f, +125.0f,12.7849f,-187.5f, +128.906f,10.4802f,-187.5f, +132.813f,8.75276f,-187.5f, +136.719f,6.90392f,-187.5f, +140.625f,6.91636f,-187.5f, +144.531f,6.78271f,-187.5f, +148.438f,5.25436f,-187.5f, +152.344f,4.14458f,-187.5f, +156.25f,3.58445f,-187.5f, +160.156f,3.67538f,-187.5f, +164.063f,1.88171f,-187.5f, +167.969f,1.16358f,-187.5f, +171.875f,-0.909335f,-187.5f, +175.781f,-4.00056f,-187.5f, +179.688f,-6.532f,-187.5f, +183.594f,-8.29174f,-187.5f, +187.5f,-9.0196f,-187.5f, +191.406f,-10.1189f,-187.5f, +195.313f,-11.1349f,-187.5f, +199.219f,-12.4853f,-187.5f, +203.125f,-12.7324f,-187.5f, +207.031f,-12.949f,-187.5f, +210.938f,-11.8708f,-187.5f, +214.844f,-12.2515f,-187.5f, +218.75f,-12.8455f,-187.5f, +222.656f,-10.7923f,-187.5f, +226.563f,-8.82819f,-187.5f, +230.469f,-7.36721f,-187.5f, +234.375f,-5.23714f,-187.5f, +238.281f,-2.63334f,-187.5f, +242.188f,0.485313f,-187.5f, +246.094f,2.78278f,-187.5f, +250.0f,3.96313f,-187.5f, +3.90625f,25.3652f,-191.406f, +7.8125f,24.7195f,-191.406f, +11.7188f,25.004f,-191.406f, +15.625f,24.1773f,-191.406f, +19.5313f,22.7395f,-191.406f, +23.4375f,21.4739f,-191.406f, +27.3438f,21.0405f,-191.406f, +31.25f,18.3321f,-191.406f, +35.1563f,16.9491f,-191.406f, +39.0625f,15.1898f,-191.406f, +42.9688f,14.5842f,-191.406f, +46.875f,14.234f,-191.406f, +50.7813f,14.0689f,-191.406f, +54.6875f,15.4103f,-191.406f, +58.5938f,15.0749f,-191.406f, +62.5f,14.6893f,-191.406f, +66.4063f,14.8987f,-191.406f, +70.3125f,14.4416f,-191.406f, +74.2188f,14.3436f,-191.406f, +78.125f,13.5844f,-191.406f, +82.0313f,13.3989f,-191.406f, +85.9375f,14.3892f,-191.406f, +89.8438f,13.3595f,-191.406f, +93.75f,13.3004f,-191.406f, +97.6563f,11.8557f,-191.406f, +101.563f,9.50387f,-191.406f, +105.469f,9.09049f,-191.406f, +109.375f,10.2607f,-191.406f, +113.281f,11.3275f,-191.406f, +117.188f,11.8898f,-191.406f, +121.094f,11.9585f,-191.406f, +125.0f,11.0034f,-191.406f, +128.906f,10.0704f,-191.406f, +132.813f,8.84472f,-191.406f, +136.719f,7.56972f,-191.406f, +140.625f,6.66467f,-191.406f, +144.531f,5.57509f,-191.406f, +148.438f,4.43943f,-191.406f, +152.344f,3.51469f,-191.406f, +156.25f,2.91572f,-191.406f, +160.156f,3.43161f,-191.406f, +164.063f,1.97664f,-191.406f, +167.969f,1.37279f,-191.406f, +171.875f,-0.545961f,-191.406f, +175.781f,-3.78517f,-191.406f, +179.688f,-6.09483f,-191.406f, +183.594f,-6.45627f,-191.406f, +187.5f,-7.27376f,-191.406f, +191.406f,-8.99215f,-191.406f, +195.313f,-9.89915f,-191.406f, +199.219f,-10.9608f,-191.406f, +203.125f,-10.8387f,-191.406f, +207.031f,-10.5261f,-191.406f, +210.938f,-10.1365f,-191.406f, +214.844f,-10.631f,-191.406f, +218.75f,-10.8413f,-191.406f, +222.656f,-9.03823f,-191.406f, +226.563f,-7.39571f,-191.406f, +230.469f,-4.8409f,-191.406f, +234.375f,-3.47756f,-191.406f, +238.281f,-1.63291f,-191.406f, +242.188f,1.44814f,-191.406f, +246.094f,2.93141f,-191.406f, +250.0f,4.03991f,-191.406f, +3.90625f,23.0993f,-195.313f, +7.8125f,23.2309f,-195.313f, +11.7188f,23.4293f,-195.313f, +15.625f,22.4425f,-195.313f, +19.5313f,21.4905f,-195.313f, +23.4375f,19.6567f,-195.313f, +27.3438f,18.1324f,-195.313f, +31.25f,17.3872f,-195.313f, +35.1563f,16.265f,-195.313f, +39.0625f,13.8338f,-195.313f, +42.9688f,12.7629f,-195.313f, +46.875f,13.1006f,-195.313f, +50.7813f,13.3481f,-195.313f, +54.6875f,13.8039f,-195.313f, +58.5938f,13.0621f,-195.313f, +62.5f,12.4363f,-195.313f, +66.4063f,12.748f,-195.313f, +70.3125f,12.2979f,-195.313f, +74.2188f,11.3997f,-195.313f, +78.125f,12.1637f,-195.313f, +82.0313f,12.2143f,-195.313f, +85.9375f,12.0963f,-195.313f, +89.8438f,11.3468f,-195.313f, +93.75f,11.1939f,-195.313f, +97.6563f,9.31577f,-195.313f, +101.563f,9.0203f,-195.313f, +105.469f,8.39154f,-195.313f, +109.375f,8.72501f,-195.313f, +113.281f,9.3763f,-195.313f, +117.188f,9.56963f,-195.313f, +121.094f,9.54203f,-195.313f, +125.0f,9.30859f,-195.313f, +128.906f,9.02325f,-195.313f, +132.813f,8.54457f,-195.313f, +136.719f,7.91487f,-195.313f, +140.625f,5.8935f,-195.313f, +144.531f,4.77605f,-195.313f, +148.438f,3.03324f,-195.313f, +152.344f,2.63999f,-195.313f, +156.25f,1.85254f,-195.313f, +160.156f,2.58504f,-195.313f, +164.063f,1.86646f,-195.313f, +167.969f,0.472293f,-195.313f, +171.875f,-0.819486f,-195.313f, +175.781f,-3.28005f,-195.313f, +179.688f,-4.07223f,-195.313f, +183.594f,-5.23099f,-195.313f, +187.5f,-5.93446f,-195.313f, +191.406f,-7.40083f,-195.313f, +195.313f,-9.52595f,-195.313f, +199.219f,-9.06593f,-195.313f, +203.125f,-8.64632f,-195.313f, +207.031f,-8.71126f,-195.313f, +210.938f,-7.66946f,-195.313f, +214.844f,-8.22025f,-195.313f, +218.75f,-8.77434f,-195.313f, +222.656f,-7.8003f,-195.313f, +226.563f,-5.29317f,-195.313f, +230.469f,-3.13421f,-195.313f, +234.375f,-1.47978f,-195.313f, +238.281f,0.0436352f,-195.313f, +242.188f,1.56763f,-195.313f, +246.094f,3.2707f,-195.313f, +250.0f,5.38332f,-195.313f, +3.90625f,21.5827f,-199.219f, +7.8125f,21.5884f,-199.219f, +11.7188f,22.0551f,-199.219f, +15.625f,21.1895f,-199.219f, +19.5313f,19.9629f,-199.219f, +23.4375f,18.1891f,-199.219f, +27.3438f,17.3914f,-199.219f, +31.25f,15.7832f,-199.219f, +35.1563f,13.9537f,-199.219f, +39.0625f,11.7784f,-199.219f, +42.9688f,12.6473f,-199.219f, +46.875f,12.1685f,-199.219f, +50.7813f,12.2586f,-199.219f, +54.6875f,12.032f,-199.219f, +58.5938f,12.5025f,-199.219f, +62.5f,12.2207f,-199.219f, +66.4063f,10.4332f,-199.219f, +70.3125f,10.2093f,-199.219f, +74.2188f,9.56536f,-199.219f, +78.125f,10.5041f,-199.219f, +82.0313f,10.9136f,-199.219f, +85.9375f,10.6303f,-199.219f, +89.8438f,11.148f,-199.219f, +93.75f,10.2169f,-199.219f, +97.6563f,8.56966f,-199.219f, +101.563f,8.81808f,-199.219f, +105.469f,7.92638f,-199.219f, +109.375f,7.988f,-199.219f, +113.281f,8.07342f,-199.219f, +117.188f,8.41463f,-199.219f, +121.094f,8.44317f,-199.219f, +125.0f,8.93315f,-199.219f, +128.906f,8.02242f,-199.219f, +132.813f,7.78977f,-199.219f, +136.719f,7.24422f,-199.219f, +140.625f,6.65469f,-199.219f, +144.531f,5.63698f,-199.219f, +148.438f,3.71906f,-199.219f, +152.344f,1.94989f,-199.219f, +156.25f,1.5781f,-199.219f, +160.156f,2.54367f,-199.219f, +164.063f,2.24455f,-199.219f, +167.969f,0.172967f,-199.219f, +171.875f,-1.24076f,-199.219f, +175.781f,-2.09517f,-199.219f, +179.688f,-2.60068f,-199.219f, +183.594f,-3.35838f,-199.219f, +187.5f,-5.02796f,-199.219f, +191.406f,-6.75939f,-199.219f, +195.313f,-7.86176f,-199.219f, +199.219f,-7.60703f,-199.219f, +203.125f,-7.1176f,-199.219f, +207.031f,-7.21926f,-199.219f, +210.938f,-6.354f,-199.219f, +214.844f,-6.26146f,-199.219f, +218.75f,-7.39202f,-199.219f, +222.656f,-6.10132f,-199.219f, +226.563f,-4.15677f,-199.219f, +230.469f,-1.72339f,-199.219f, +234.375f,0.220408f,-199.219f, +238.281f,1.71501f,-199.219f, +242.188f,2.32136f,-199.219f, +246.094f,3.9302f,-199.219f, +250.0f,6.99831f,-199.219f, +3.90625f,20.3179f,-203.125f, +7.8125f,19.0038f,-203.125f, +11.7188f,19.8795f,-203.125f, +15.625f,18.863f,-203.125f, +19.5313f,17.2513f,-203.125f, +23.4375f,16.7786f,-203.125f, +27.3438f,16.4605f,-203.125f, +31.25f,14.0944f,-203.125f, +35.1563f,12.6715f,-203.125f, +39.0625f,12.2869f,-203.125f, +42.9688f,12.0256f,-203.125f, +46.875f,11.4308f,-203.125f, +50.7813f,11.5543f,-203.125f, +54.6875f,10.8247f,-203.125f, +58.5938f,12.5385f,-203.125f, +62.5f,12.1754f,-203.125f, +66.4063f,10.0857f,-203.125f, +70.3125f,8.73654f,-203.125f, +74.2188f,8.35323f,-203.125f, +78.125f,8.75049f,-203.125f, +82.0313f,9.69714f,-203.125f, +85.9375f,9.93848f,-203.125f, +89.8438f,9.99533f,-203.125f, +93.75f,9.28937f,-203.125f, +97.6563f,8.19048f,-203.125f, +101.563f,7.82659f,-203.125f, +105.469f,6.70152f,-203.125f, +109.375f,6.35245f,-203.125f, +113.281f,6.80811f,-203.125f, +117.188f,7.88474f,-203.125f, +121.094f,8.76964f,-203.125f, +125.0f,9.33913f,-203.125f, +128.906f,9.12843f,-203.125f, +132.813f,7.62144f,-203.125f, +136.719f,6.32841f,-203.125f, +140.625f,6.30299f,-203.125f, +144.531f,5.78467f,-203.125f, +148.438f,4.2404f,-203.125f, +152.344f,2.7611f,-203.125f, +156.25f,1.95904f,-203.125f, +160.156f,2.27166f,-203.125f, +164.063f,2.22405f,-203.125f, +167.969f,1.12279f,-203.125f, +171.875f,-0.169061f,-203.125f, +175.781f,-0.887647f,-203.125f, +179.688f,-0.896535f,-203.125f, +183.594f,-2.41604f,-203.125f, +187.5f,-3.63423f,-203.125f, +191.406f,-6.00826f,-203.125f, +195.313f,-5.87316f,-203.125f, +199.219f,-5.18767f,-203.125f, +203.125f,-4.23762f,-203.125f, +207.031f,-4.7338f,-203.125f, +210.938f,-4.88225f,-203.125f, +214.844f,-4.82274f,-203.125f, +218.75f,-5.06338f,-203.125f, +222.656f,-5.13737f,-203.125f, +226.563f,-2.74217f,-203.125f, +230.469f,0.0831564f,-203.125f, +234.375f,2.00986f,-203.125f, +238.281f,2.89937f,-203.125f, +242.188f,3.79442f,-203.125f, +246.094f,5.43821f,-203.125f, +250.0f,8.47222f,-203.125f, +3.90625f,18.3149f,-207.031f, +7.8125f,16.9318f,-207.031f, +11.7188f,16.7123f,-207.031f, +15.625f,16.066f,-207.031f, +19.5313f,15.8401f,-207.031f, +23.4375f,14.9793f,-207.031f, +27.3438f,13.5136f,-207.031f, +31.25f,12.316f,-207.031f, +35.1563f,12.4286f,-207.031f, +39.0625f,12.5926f,-207.031f, +42.9688f,12.419f,-207.031f, +46.875f,11.7087f,-207.031f, +50.7813f,10.9033f,-207.031f, +54.6875f,10.2175f,-207.031f, +58.5938f,10.7307f,-207.031f, +62.5f,9.9283f,-207.031f, +66.4063f,9.11458f,-207.031f, +70.3125f,6.81804f,-207.031f, +74.2188f,6.85559f,-207.031f, +78.125f,6.98146f,-207.031f, +82.0313f,8.41059f,-207.031f, +85.9375f,8.81018f,-207.031f, +89.8438f,9.25882f,-207.031f, +93.75f,8.4973f,-207.031f, +97.6563f,7.11312f,-207.031f, +101.563f,6.11367f,-207.031f, +105.469f,4.54171f,-207.031f, +109.375f,3.984f,-207.031f, +113.281f,6.23536f,-207.031f, +117.188f,7.41972f,-207.031f, +121.094f,8.40005f,-207.031f, +125.0f,9.21009f,-207.031f, +128.906f,9.10113f,-207.031f, +132.813f,8.69785f,-207.031f, +136.719f,7.08314f,-207.031f, +140.625f,6.14113f,-207.031f, +144.531f,4.85123f,-207.031f, +148.438f,4.53013f,-207.031f, +152.344f,4.73052f,-207.031f, +156.25f,3.50435f,-207.031f, +160.156f,3.02093f,-207.031f, +164.063f,2.65317f,-207.031f, +167.969f,1.91936f,-207.031f, +171.875f,1.31638f,-207.031f, +175.781f,0.631767f,-207.031f, +179.688f,-0.185018f,-207.031f, +183.594f,-1.04617f,-207.031f, +187.5f,-2.59594f,-207.031f, +191.406f,-3.62219f,-207.031f, +195.313f,-3.17366f,-207.031f, +199.219f,-3.0812f,-207.031f, +203.125f,-2.21365f,-207.031f, +207.031f,-3.02851f,-207.031f, +210.938f,-4.12823f,-207.031f, +214.844f,-3.42208f,-207.031f, +218.75f,-3.83284f,-207.031f, +222.656f,-3.83483f,-207.031f, +226.563f,-1.81388f,-207.031f, +230.469f,1.06182f,-207.031f, +234.375f,3.0063f,-207.031f, +238.281f,3.97581f,-207.031f, +242.188f,5.25584f,-207.031f, +246.094f,6.1092f,-207.031f, +250.0f,9.89458f,-207.031f, +3.90625f,16.2147f,-210.938f, +7.8125f,15.8155f,-210.938f, +11.7188f,14.9704f,-210.938f, +15.625f,14.6853f,-210.938f, +19.5313f,14.3326f,-210.938f, +23.4375f,14.0488f,-210.938f, +27.3438f,12.2057f,-210.938f, +31.25f,12.7526f,-210.938f, +35.1563f,13.1468f,-210.938f, +39.0625f,12.959f,-210.938f, +42.9688f,12.3931f,-210.938f, +46.875f,11.9578f,-210.938f, +50.7813f,10.5381f,-210.938f, +54.6875f,9.28222f,-210.938f, +58.5938f,9.20117f,-210.938f, +62.5f,8.74359f,-210.938f, +66.4063f,7.58308f,-210.938f, +70.3125f,5.98903f,-210.938f, +74.2188f,5.92315f,-210.938f, +78.125f,6.30208f,-210.938f, +82.0313f,7.35787f,-210.938f, +85.9375f,7.64729f,-210.938f, +89.8438f,7.89394f,-210.938f, +93.75f,7.64523f,-210.938f, +97.6563f,5.66526f,-210.938f, +101.563f,4.1348f,-210.938f, +105.469f,2.65548f,-210.938f, +109.375f,4.20615f,-210.938f, +113.281f,5.82801f,-210.938f, +117.188f,6.92681f,-210.938f, +121.094f,8.52107f,-210.938f, +125.0f,9.29929f,-210.938f, +128.906f,10.1454f,-210.938f, +132.813f,9.39782f,-210.938f, +136.719f,8.72704f,-210.938f, +140.625f,7.91058f,-210.938f, +144.531f,5.32835f,-210.938f, +148.438f,5.30143f,-210.938f, +152.344f,4.98294f,-210.938f, +156.25f,5.27331f,-210.938f, +160.156f,4.054f,-210.938f, +164.063f,4.25352f,-210.938f, +167.969f,3.60791f,-210.938f, +171.875f,2.94898f,-210.938f, +175.781f,1.97064f,-210.938f, +179.688f,1.21275f,-210.938f, +183.594f,-0.419751f,-210.938f, +187.5f,-1.77221f,-210.938f, +191.406f,-1.94763f,-210.938f, +195.313f,-1.32172f,-210.938f, +199.219f,-1.74453f,-210.938f, +203.125f,-0.694964f,-210.938f, +207.031f,-1.77277f,-210.938f, +210.938f,-2.39571f,-210.938f, +214.844f,-2.61021f,-210.938f, +218.75f,-3.16f,-210.938f, +222.656f,-2.46606f,-210.938f, +226.563f,-0.862086f,-210.938f, +230.469f,1.4487f,-210.938f, +234.375f,3.44239f,-210.938f, +238.281f,5.41949f,-210.938f, +242.188f,6.28416f,-210.938f, +246.094f,7.24993f,-210.938f, +250.0f,10.7227f,-210.938f, +3.90625f,14.284f,-214.844f, +7.8125f,14.031f,-214.844f, +11.7188f,12.8153f,-214.844f, +15.625f,12.2914f,-214.844f, +19.5313f,12.0657f,-214.844f, +23.4375f,12.4452f,-214.844f, +27.3438f,12.703f,-214.844f, +31.25f,12.3401f,-214.844f, +35.1563f,13.2219f,-214.844f, +39.0625f,12.9074f,-214.844f, +42.9688f,12.5934f,-214.844f, +46.875f,11.4717f,-214.844f, +50.7813f,10.548f,-214.844f, +54.6875f,9.43614f,-214.844f, +58.5938f,10.0982f,-214.844f, +62.5f,9.36536f,-214.844f, +66.4063f,8.07196f,-214.844f, +70.3125f,6.4483f,-214.844f, +74.2188f,5.80499f,-214.844f, +78.125f,5.60605f,-214.844f, +82.0313f,6.64906f,-214.844f, +85.9375f,7.64402f,-214.844f, +89.8438f,8.31151f,-214.844f, +93.75f,7.97344f,-214.844f, +97.6563f,5.39549f,-214.844f, +101.563f,3.66809f,-214.844f, +105.469f,3.2001f,-214.844f, +109.375f,5.91373f,-214.844f, +113.281f,7.40339f,-214.844f, +117.188f,8.30807f,-214.844f, +121.094f,9.75774f,-214.844f, +125.0f,10.2383f,-214.844f, +128.906f,10.3408f,-214.844f, +132.813f,10.6262f,-214.844f, +136.719f,10.8818f,-214.844f, +140.625f,9.09087f,-214.844f, +144.531f,6.48291f,-214.844f, +148.438f,5.02116f,-214.844f, +152.344f,5.97543f,-214.844f, +156.25f,6.33053f,-214.844f, +160.156f,5.91049f,-214.844f, +164.063f,5.03025f,-214.844f, +167.969f,5.01201f,-214.844f, +171.875f,4.36222f,-214.844f, +175.781f,3.69208f,-214.844f, +179.688f,2.96539f,-214.844f, +183.594f,1.43789f,-214.844f, +187.5f,-0.374301f,-214.844f, +191.406f,-0.955695f,-214.844f, +195.313f,-0.123769f,-214.844f, +199.219f,-0.113436f,-214.844f, +203.125f,-0.0171993f,-214.844f, +207.031f,-1.0984f,-214.844f, +210.938f,-1.10949f,-214.844f, +214.844f,-1.92471f,-214.844f, +218.75f,-2.26183f,-214.844f, +222.656f,-1.32064f,-214.844f, +226.563f,0.209158f,-214.844f, +230.469f,2.41199f,-214.844f, +234.375f,4.66871f,-214.844f, +238.281f,6.29773f,-214.844f, +242.188f,7.20184f,-214.844f, +246.094f,8.08018f,-214.844f, +250.0f,10.3057f,-214.844f, +3.90625f,13.272f,-218.75f, +7.8125f,12.8218f,-218.75f, +11.7188f,11.8102f,-218.75f, +15.625f,11.7105f,-218.75f, +19.5313f,11.5191f,-218.75f, +23.4375f,12.1253f,-218.75f, +27.3438f,12.0266f,-218.75f, +31.25f,12.3549f,-218.75f, +35.1563f,12.3822f,-218.75f, +39.0625f,12.268f,-218.75f, +42.9688f,12.5022f,-218.75f, +46.875f,11.2878f,-218.75f, +50.7813f,10.1823f,-218.75f, +54.6875f,10.4244f,-218.75f, +58.5938f,10.0047f,-218.75f, +62.5f,9.96061f,-218.75f, +66.4063f,8.64873f,-218.75f, +70.3125f,6.45636f,-218.75f, +74.2188f,5.30254f,-218.75f, +78.125f,5.2915f,-218.75f, +82.0313f,7.2575f,-218.75f, +85.9375f,8.1568f,-218.75f, +89.8438f,8.97514f,-218.75f, +93.75f,7.72908f,-218.75f, +97.6563f,5.41501f,-218.75f, +101.563f,4.24025f,-218.75f, +105.469f,5.39134f,-218.75f, +109.375f,7.69518f,-218.75f, +113.281f,8.87616f,-218.75f, +117.188f,9.44758f,-218.75f, +121.094f,9.21473f,-218.75f, +125.0f,10.1366f,-218.75f, +128.906f,11.6088f,-218.75f, +132.813f,12.0083f,-218.75f, +136.719f,12.3184f,-218.75f, +140.625f,10.8438f,-218.75f, +144.531f,7.65837f,-218.75f, +148.438f,6.07316f,-218.75f, +152.344f,6.4613f,-218.75f, +156.25f,7.01972f,-218.75f, +160.156f,7.25454f,-218.75f, +164.063f,6.31416f,-218.75f, +167.969f,6.48096f,-218.75f, +171.875f,5.89274f,-218.75f, +175.781f,5.71289f,-218.75f, +179.688f,4.3046f,-218.75f, +183.594f,2.49719f,-218.75f, +187.5f,1.16956f,-218.75f, +191.406f,1.21673f,-218.75f, +195.313f,1.19652f,-218.75f, +199.219f,1.27819f,-218.75f, +203.125f,1.06325f,-218.75f, +207.031f,0.133118f,-218.75f, +210.938f,-0.283675f,-218.75f, +214.844f,-0.471323f,-218.75f, +218.75f,-0.941533f,-218.75f, +222.656f,-0.953851f,-218.75f, +226.563f,0.751216f,-218.75f, +230.469f,2.54245f,-218.75f, +234.375f,5.17863f,-218.75f, +238.281f,7.22669f,-218.75f, +242.188f,8.44723f,-218.75f, +246.094f,8.59229f,-218.75f, +250.0f,10.4333f,-218.75f, +3.90625f,13.0199f,-222.656f, +7.8125f,13.1789f,-222.656f, +11.7188f,12.4614f,-222.656f, +15.625f,10.8521f,-222.656f, +19.5313f,11.2552f,-222.656f, +23.4375f,12.1618f,-222.656f, +27.3438f,12.6207f,-222.656f, +31.25f,12.7195f,-222.656f, +35.1563f,12.6379f,-222.656f, +39.0625f,12.5247f,-222.656f, +42.9688f,11.5493f,-222.656f, +46.875f,11.1218f,-222.656f, +50.7813f,11.1036f,-222.656f, +54.6875f,11.2909f,-222.656f, +58.5938f,9.99718f,-222.656f, +62.5f,9.07075f,-222.656f, +66.4063f,7.85904f,-222.656f, +70.3125f,6.00034f,-222.656f, +74.2188f,6.20222f,-222.656f, +78.125f,6.90091f,-222.656f, +82.0313f,8.15724f,-222.656f, +85.9375f,8.92624f,-222.656f, +89.8438f,9.54135f,-222.656f, +93.75f,8.05473f,-222.656f, +97.6563f,5.80654f,-222.656f, +101.563f,5.02178f,-222.656f, +105.469f,7.15584f,-222.656f, +109.375f,8.94755f,-222.656f, +113.281f,9.86631f,-222.656f, +117.188f,10.6421f,-222.656f, +121.094f,10.7891f,-222.656f, +125.0f,11.0716f,-222.656f, +128.906f,12.6376f,-222.656f, +132.813f,12.4373f,-222.656f, +136.719f,12.1143f,-222.656f, +140.625f,11.4028f,-222.656f, +144.531f,8.95242f,-222.656f, +148.438f,6.83012f,-222.656f, +152.344f,7.65217f,-222.656f, +156.25f,8.26579f,-222.656f, +160.156f,7.9665f,-222.656f, +164.063f,7.5217f,-222.656f, +167.969f,7.17758f,-222.656f, +171.875f,5.9966f,-222.656f, +175.781f,5.77514f,-222.656f, +179.688f,4.77675f,-222.656f, +183.594f,3.39545f,-222.656f, +187.5f,2.95911f,-222.656f, +191.406f,1.85368f,-222.656f, +195.313f,1.31365f,-222.656f, +199.219f,1.12622f,-222.656f, +203.125f,1.47676f,-222.656f, +207.031f,1.89446f,-222.656f, +210.938f,0.63056f,-222.656f, +214.844f,0.297565f,-222.656f, +218.75f,-0.0109998f,-222.656f, +222.656f,-0.225082f,-222.656f, +226.563f,0.63258f,-222.656f, +230.469f,2.89831f,-222.656f, +234.375f,5.64839f,-222.656f, +238.281f,7.22414f,-222.656f, +242.188f,7.89951f,-222.656f, +246.094f,8.80151f,-222.656f, +250.0f,10.9602f,-222.656f, +3.90625f,11.9733f,-226.563f, +7.8125f,12.8862f,-226.563f, +11.7188f,12.1283f,-226.563f, +15.625f,10.7234f,-226.563f, +19.5313f,11.6866f,-226.563f, +23.4375f,12.6552f,-226.563f, +27.3438f,12.7353f,-226.563f, +31.25f,11.7992f,-226.563f, +35.1563f,11.2006f,-226.563f, +39.0625f,10.9699f,-226.563f, +42.9688f,10.7653f,-226.563f, +46.875f,10.9947f,-226.563f, +50.7813f,11.2791f,-226.563f, +54.6875f,11.0716f,-226.563f, +58.5938f,10.7092f,-226.563f, +62.5f,9.16355f,-226.563f, +66.4063f,7.59431f,-226.563f, +70.3125f,6.68502f,-226.563f, +74.2188f,6.98133f,-226.563f, +78.125f,7.72239f,-226.563f, +82.0313f,9.00293f,-226.563f, +85.9375f,9.47866f,-226.563f, +89.8438f,8.94458f,-226.563f, +93.75f,7.79648f,-226.563f, +97.6563f,6.07787f,-226.563f, +101.563f,6.60546f,-226.563f, +105.469f,8.5652f,-226.563f, +109.375f,10.2869f,-226.563f, +113.281f,11.4751f,-226.563f, +117.188f,11.6224f,-226.563f, +121.094f,12.0803f,-226.563f, +125.0f,12.5335f,-226.563f, +128.906f,13.5918f,-226.563f, +132.813f,12.9198f,-226.563f, +136.719f,11.521f,-226.563f, +140.625f,10.6418f,-226.563f, +144.531f,8.8393f,-226.563f, +148.438f,8.79941f,-226.563f, +152.344f,9.4929f,-226.563f, +156.25f,9.96206f,-226.563f, +160.156f,8.75524f,-226.563f, +164.063f,7.64157f,-226.563f, +167.969f,7.1963f,-226.563f, +171.875f,6.83929f,-226.563f, +175.781f,6.10665f,-226.563f, +179.688f,4.70473f,-226.563f, +183.594f,4.54758f,-226.563f, +187.5f,3.58616f,-226.563f, +191.406f,2.97998f,-226.563f, +195.313f,1.49179f,-226.563f, +199.219f,1.85834f,-226.563f, +203.125f,1.49089f,-226.563f, +207.031f,1.39949f,-226.563f, +210.938f,0.863002f,-226.563f, +214.844f,1.15546f,-226.563f, +218.75f,0.609373f,-226.563f, +222.656f,1.04332f,-226.563f, +226.563f,1.58038f,-226.563f, +230.469f,4.11549f,-226.563f, +234.375f,5.64696f,-226.563f, +238.281f,6.61687f,-226.563f, +242.188f,7.3113f,-226.563f, +246.094f,8.56955f,-226.563f, +250.0f,10.7891f,-226.563f, +3.90625f,10.4619f,-230.469f, +7.8125f,11.4179f,-230.469f, +11.7188f,10.7841f,-230.469f, +15.625f,10.597f,-230.469f, +19.5313f,10.9999f,-230.469f, +23.4375f,11.5972f,-230.469f, +27.3438f,11.4553f,-230.469f, +31.25f,10.1015f,-230.469f, +35.1563f,10.412f,-230.469f, +39.0625f,9.72694f,-230.469f, +42.9688f,9.71973f,-230.469f, +46.875f,10.7767f,-230.469f, +50.7813f,10.8775f,-230.469f, +54.6875f,10.3186f,-230.469f, +58.5938f,10.4188f,-230.469f, +62.5f,8.94879f,-230.469f, +66.4063f,7.92103f,-230.469f, +70.3125f,8.48295f,-230.469f, +74.2188f,8.74782f,-230.469f, +78.125f,8.87976f,-230.469f, +82.0313f,9.68632f,-230.469f, +85.9375f,9.54993f,-230.469f, +89.8438f,9.04624f,-230.469f, +93.75f,8.49407f,-230.469f, +97.6563f,7.90008f,-230.469f, +101.563f,9.20657f,-230.469f, +105.469f,10.5114f,-230.469f, +109.375f,11.5284f,-230.469f, +113.281f,12.0378f,-230.469f, +117.188f,12.9398f,-230.469f, +121.094f,13.1489f,-230.469f, +125.0f,13.8974f,-230.469f, +128.906f,14.5048f,-230.469f, +132.813f,13.1823f,-230.469f, +136.719f,11.6226f,-230.469f, +140.625f,11.1108f,-230.469f, +144.531f,10.0418f,-230.469f, +148.438f,10.2026f,-230.469f, +152.344f,10.9585f,-230.469f, +156.25f,11.0258f,-230.469f, +160.156f,9.88552f,-230.469f, +164.063f,8.92538f,-230.469f, +167.969f,7.90306f,-230.469f, +171.875f,7.23733f,-230.469f, +175.781f,6.09503f,-230.469f, +179.688f,5.15065f,-230.469f, +183.594f,4.73006f,-230.469f, +187.5f,4.05091f,-230.469f, +191.406f,3.01834f,-230.469f, +195.313f,1.83317f,-230.469f, +199.219f,2.77945f,-230.469f, +203.125f,3.05633f,-230.469f, +207.031f,2.07007f,-230.469f, +210.938f,2.01993f,-230.469f, +214.844f,2.13491f,-230.469f, +218.75f,1.65812f,-230.469f, +222.656f,1.8404f,-230.469f, +226.563f,2.78297f,-230.469f, +230.469f,3.94561f,-230.469f, +234.375f,5.83019f,-230.469f, +238.281f,6.9093f,-230.469f, +242.188f,7.96229f,-230.469f, +246.094f,7.63052f,-230.469f, +250.0f,10.2449f,-230.469f, +3.90625f,8.85224f,-234.375f, +7.8125f,9.40139f,-234.375f, +11.7188f,9.62814f,-234.375f, +15.625f,9.97075f,-234.375f, +19.5313f,9.96073f,-234.375f, +23.4375f,9.70541f,-234.375f, +27.3438f,10.0435f,-234.375f, +31.25f,9.85879f,-234.375f, +35.1563f,9.52681f,-234.375f, +39.0625f,8.75341f,-234.375f, +42.9688f,8.99686f,-234.375f, +46.875f,9.56309f,-234.375f, +50.7813f,9.54486f,-234.375f, +54.6875f,10.0225f,-234.375f, +58.5938f,9.56394f,-234.375f, +62.5f,9.18474f,-234.375f, +66.4063f,9.29208f,-234.375f, +70.3125f,10.4881f,-234.375f, +74.2188f,10.8865f,-234.375f, +78.125f,11.0201f,-234.375f, +82.0313f,11.7722f,-234.375f, +85.9375f,11.1624f,-234.375f, +89.8438f,10.602f,-234.375f, +93.75f,9.93284f,-234.375f, +97.6563f,10.2532f,-234.375f, +101.563f,11.0848f,-234.375f, +105.469f,12.6576f,-234.375f, +109.375f,13.4783f,-234.375f, +113.281f,14.7992f,-234.375f, +117.188f,15.3803f,-234.375f, +121.094f,15.9985f,-234.375f, +125.0f,14.9035f,-234.375f, +128.906f,14.2715f,-234.375f, +132.813f,14.0098f,-234.375f, +136.719f,13.1141f,-234.375f, +140.625f,12.5809f,-234.375f, +144.531f,11.8546f,-234.375f, +148.438f,11.5219f,-234.375f, +152.344f,11.8842f,-234.375f, +156.25f,11.6581f,-234.375f, +160.156f,10.8307f,-234.375f, +164.063f,10.2712f,-234.375f, +167.969f,8.58443f,-234.375f, +171.875f,7.00592f,-234.375f, +175.781f,5.65553f,-234.375f, +179.688f,5.07429f,-234.375f, +183.594f,4.41004f,-234.375f, +187.5f,3.95516f,-234.375f, +191.406f,3.42243f,-234.375f, +195.313f,2.54334f,-234.375f, +199.219f,3.95931f,-234.375f, +203.125f,3.9139f,-234.375f, +207.031f,2.90644f,-234.375f, +210.938f,3.11525f,-234.375f, +214.844f,3.33135f,-234.375f, +218.75f,2.64229f,-234.375f, +222.656f,2.64397f,-234.375f, +226.563f,3.186f,-234.375f, +230.469f,4.46201f,-234.375f, +234.375f,5.92783f,-234.375f, +238.281f,6.79968f,-234.375f, +242.188f,8.7067f,-234.375f, +246.094f,8.47322f,-234.375f, +250.0f,10.3839f,-234.375f, +3.90625f,7.99527f,-238.281f, +7.8125f,8.62199f,-238.281f, +11.7188f,9.06695f,-238.281f, +15.625f,9.12589f,-238.281f, +19.5313f,8.97926f,-238.281f, +23.4375f,9.75152f,-238.281f, +27.3438f,9.58038f,-238.281f, +31.25f,9.30169f,-238.281f, +35.1563f,8.63599f,-238.281f, +39.0625f,8.72973f,-238.281f, +42.9688f,8.49513f,-238.281f, +46.875f,8.78362f,-238.281f, +50.7813f,8.75045f,-238.281f, +54.6875f,8.96186f,-238.281f, +58.5938f,10.0611f,-238.281f, +62.5f,11.1275f,-238.281f, +66.4063f,10.8209f,-238.281f, +70.3125f,12.0108f,-238.281f, +74.2188f,13.2126f,-238.281f, +78.125f,14.1323f,-238.281f, +82.0313f,14.3575f,-238.281f, +85.9375f,13.2781f,-238.281f, +89.8438f,12.8024f,-238.281f, +93.75f,12.0484f,-238.281f, +97.6563f,12.7657f,-238.281f, +101.563f,14.0307f,-238.281f, +105.469f,15.9567f,-238.281f, +109.375f,17.7803f,-238.281f, +113.281f,19.0777f,-238.281f, +117.188f,18.7555f,-238.281f, +121.094f,18.8129f,-238.281f, +125.0f,17.4807f,-238.281f, +128.906f,16.4022f,-238.281f, +132.813f,16.01f,-238.281f, +136.719f,15.1852f,-238.281f, +140.625f,13.9301f,-238.281f, +144.531f,12.8841f,-238.281f, +148.438f,11.7108f,-238.281f, +152.344f,11.414f,-238.281f, +156.25f,11.056f,-238.281f, +160.156f,10.8688f,-238.281f, +164.063f,10.5672f,-238.281f, +167.969f,10.0938f,-238.281f, +171.875f,7.73603f,-238.281f, +175.781f,5.94931f,-238.281f, +179.688f,5.51512f,-238.281f, +183.594f,5.27449f,-238.281f, +187.5f,4.94763f,-238.281f, +191.406f,4.13161f,-238.281f, +195.313f,3.59426f,-238.281f, +199.219f,4.03163f,-238.281f, +203.125f,4.38188f,-238.281f, +207.031f,3.09959f,-238.281f, +210.938f,3.1766f,-238.281f, +214.844f,3.05715f,-238.281f, +218.75f,3.20329f,-238.281f, +222.656f,2.53565f,-238.281f, +226.563f,3.1275f,-238.281f, +230.469f,4.54736f,-238.281f, +234.375f,5.9361f,-238.281f, +238.281f,6.99977f,-238.281f, +242.188f,8.20813f,-238.281f, +246.094f,9.56614f,-238.281f, +250.0f,11.4751f,-238.281f, +3.90625f,6.40337f,-242.188f, +7.8125f,7.88741f,-242.188f, +11.7188f,8.60661f,-242.188f, +15.625f,8.56923f,-242.188f, +19.5313f,8.60588f,-242.188f, +23.4375f,8.63232f,-242.188f, +27.3438f,8.3446f,-242.188f, +31.25f,7.50857f,-242.188f, +35.1563f,7.64026f,-242.188f, +39.0625f,7.75851f,-242.188f, +42.9688f,7.56672f,-242.188f, +46.875f,7.98994f,-242.188f, +50.7813f,9.62391f,-242.188f, +54.6875f,9.28711f,-242.188f, +58.5938f,10.3792f,-242.188f, +62.5f,11.2793f,-242.188f, +66.4063f,12.3048f,-242.188f, +70.3125f,13.5272f,-242.188f, +74.2188f,14.5101f,-242.188f, +78.125f,15.2091f,-242.188f, +82.0313f,15.9007f,-242.188f, +85.9375f,15.4601f,-242.188f, +89.8438f,14.5171f,-242.188f, +93.75f,14.2266f,-242.188f, +97.6563f,13.9558f,-242.188f, +101.563f,15.8234f,-242.188f, +105.469f,18.6741f,-242.188f, +109.375f,20.7296f,-242.188f, +113.281f,21.5353f,-242.188f, +117.188f,20.9821f,-242.188f, +121.094f,20.2232f,-242.188f, +125.0f,18.5423f,-242.188f, +128.906f,17.8591f,-242.188f, +132.813f,17.6716f,-242.188f, +136.719f,16.8982f,-242.188f, +140.625f,14.8574f,-242.188f, +144.531f,13.0736f,-242.188f, +148.438f,12.4847f,-242.188f, +152.344f,11.8101f,-242.188f, +156.25f,11.7863f,-242.188f, +160.156f,11.4288f,-242.188f, +164.063f,10.8653f,-242.188f, +167.969f,9.75951f,-242.188f, +171.875f,8.13212f,-242.188f, +175.781f,6.91851f,-242.188f, +179.688f,5.93418f,-242.188f, +183.594f,5.79732f,-242.188f, +187.5f,5.8082f,-242.188f, +191.406f,4.85116f,-242.188f, +195.313f,4.2744f,-242.188f, +199.219f,4.23009f,-242.188f, +203.125f,3.99841f,-242.188f, +207.031f,3.48205f,-242.188f, +210.938f,3.71102f,-242.188f, +214.844f,3.52803f,-242.188f, +218.75f,3.41263f,-242.188f, +222.656f,2.40768f,-242.188f, +226.563f,3.40111f,-242.188f, +230.469f,4.51594f,-242.188f, +234.375f,5.96131f,-242.188f, +238.281f,7.68646f,-242.188f, +242.188f,8.54536f,-242.188f, +246.094f,9.49379f,-242.188f, +250.0f,12.0532f,-242.188f, +3.90625f,6.09425f,-246.094f, +7.8125f,7.62532f,-246.094f, +11.7188f,8.33141f,-246.094f, +15.625f,8.6172f,-246.094f, +19.5313f,8.7607f,-246.094f, +23.4375f,7.89699f,-246.094f, +27.3438f,7.77868f,-246.094f, +31.25f,7.41037f,-246.094f, +35.1563f,6.57203f,-246.094f, +39.0625f,6.31554f,-246.094f, +42.9688f,7.72481f,-246.094f, +46.875f,8.88325f,-246.094f, +50.7813f,10.0433f,-246.094f, +54.6875f,10.7945f,-246.094f, +58.5938f,11.7506f,-246.094f, +62.5f,13.1397f,-246.094f, +66.4063f,13.1294f,-246.094f, +70.3125f,14.8885f,-246.094f, +74.2188f,15.5444f,-246.094f, +78.125f,16.4867f,-246.094f, +82.0313f,17.0601f,-246.094f, +85.9375f,17.2351f,-246.094f, +89.8438f,16.4292f,-246.094f, +93.75f,16.32f,-246.094f, +97.6563f,17.0323f,-246.094f, +101.563f,17.5524f,-246.094f, +105.469f,20.0544f,-246.094f, +109.375f,21.7596f,-246.094f, +113.281f,22.3401f,-246.094f, +117.188f,22.7891f,-246.094f, +121.094f,21.705f,-246.094f, +125.0f,20.4875f,-246.094f, +128.906f,19.3013f,-246.094f, +132.813f,18.5254f,-246.094f, +136.719f,17.4179f,-246.094f, +140.625f,14.7663f,-246.094f, +144.531f,13.8915f,-246.094f, +148.438f,12.0594f,-246.094f, +152.344f,11.8343f,-246.094f, +156.25f,12.3176f,-246.094f, +160.156f,12.7287f,-246.094f, +164.063f,10.9779f,-246.094f, +167.969f,10.1928f,-246.094f, +171.875f,8.20833f,-246.094f, +175.781f,7.71383f,-246.094f, +179.688f,7.59678f,-246.094f, +183.594f,6.98083f,-246.094f, +187.5f,6.81055f,-246.094f, +191.406f,6.13881f,-246.094f, +195.313f,4.42472f,-246.094f, +199.219f,3.97044f,-246.094f, +203.125f,4.06157f,-246.094f, +207.031f,3.73524f,-246.094f, +210.938f,4.45121f,-246.094f, +214.844f,3.42347f,-246.094f, +218.75f,2.70444f,-246.094f, +222.656f,3.88027f,-246.094f, +226.563f,4.53456f,-246.094f, +230.469f,5.69259f,-246.094f, +234.375f,6.23366f,-246.094f, +238.281f,7.38965f,-246.094f, +242.188f,8.96481f,-246.094f, +246.094f,10.9805f,-246.094f, +250.0f,13.0168f,-246.094f, +3.90625f,6.31953f,-250.0f, +7.8125f,6.89279f,-250.0f, +11.7188f,8.63362f,-250.0f, +15.625f,9.28278f,-250.0f, +19.5313f,9.05374f,-250.0f, +23.4375f,8.51295f,-250.0f, +27.3438f,8.2676f,-250.0f, +31.25f,7.86717f,-250.0f, +35.1563f,6.56073f,-250.0f, +39.0625f,6.77605f,-250.0f, +42.9688f,8.67577f,-250.0f, +46.875f,10.2384f,-250.0f, +50.7813f,11.5086f,-250.0f, +54.6875f,12.7259f,-250.0f, +58.5938f,14.4625f,-250.0f, +62.5f,15.7352f,-250.0f, +66.4063f,15.1953f,-250.0f, +70.3125f,16.1585f,-250.0f, +74.2188f,17.1058f,-250.0f, +78.125f,17.3014f,-250.0f, +82.0313f,18.6932f,-250.0f, +85.9375f,18.6138f,-250.0f, +89.8438f,18.0431f,-250.0f, +93.75f,18.293f,-250.0f, +97.6563f,18.5338f,-250.0f, +101.563f,18.8033f,-250.0f, +105.469f,22.2037f,-250.0f, +109.375f,24.04f,-250.0f, +113.281f,24.711f,-250.0f, +117.188f,24.2801f,-250.0f, +121.094f,23.1052f,-250.0f, +125.0f,21.9886f,-250.0f, +128.906f,21.2657f,-250.0f, +132.813f,19.5364f,-250.0f, +136.719f,18.5278f,-250.0f, +140.625f,15.9806f,-250.0f, +144.531f,14.8577f,-250.0f, +148.438f,13.3645f,-250.0f, +152.344f,12.8082f,-250.0f, +156.25f,13.3689f,-250.0f, +160.156f,12.7449f,-250.0f, +164.063f,11.1108f,-250.0f, +167.969f,9.59991f,-250.0f, +171.875f,8.88472f,-250.0f, +175.781f,8.39035f,-250.0f, +179.688f,7.9163f,-250.0f, +183.594f,7.4118f,-250.0f, +187.5f,6.98082f,-250.0f, +191.406f,7.20793f,-250.0f, +195.313f,6.19875f,-250.0f, +199.219f,4.05745f,-250.0f, +203.125f,4.65884f,-250.0f, +207.031f,3.75824f,-250.0f, +210.938f,4.17504f,-250.0f, +214.844f,4.37516f,-250.0f, +218.75f,4.69345f,-250.0f, +222.656f,5.87678f,-250.0f, +226.563f,6.28295f,-250.0f, +230.469f,7.2125f,-250.0f, +234.375f,7.55925f,-250.0f, +238.281f,7.93922f,-250.0f, +242.188f,9.87332f,-250.0f, +246.094f,11.5957f,-250.0f, +250.0f,13.3418f,-250.0f, +}; + +btScalar Landscape07Nml[] = { +0.163295f,0.951018f,0.262487f, +0.144468f,0.954269f,0.261724f, +0.284339f,0.929979f,0.233003f, +0.211332f,0.959058f,0.188537f, +0.433374f,0.893306f,0.11913f, +0.363648f,0.930033f,0.052906f, +0.467682f,0.883824f,-0.0113249f, +0.383618f,0.915858f,-0.118494f, +0.389479f,0.919494f,-0.0532637f, +0.409514f,0.907723f,-0.0913076f, +0.332107f,0.943241f,-0.00112667f, +0.268223f,0.935541f,-0.229827f, +0.254548f,0.967046f,-0.0051751f, +0.306606f,0.933957f,-0.183623f, +0.282468f,0.956486f,0.073117f, +0.352033f,0.935268f,0.0366899f, +0.28404f,0.958651f,0.0175868f, +0.303901f,0.947745f,0.0970751f, +0.36555f,0.930735f,0.0102418f, +0.393208f,0.907605f,0.147107f, +0.468517f,0.882377f,0.0436299f, +0.45621f,0.884295f,0.0994741f, +0.387946f,0.921329f,0.0254982f, +0.35572f,0.93034f,0.0890492f, +-0.0727074f,0.997226f,-0.0159048f, +0.0416391f,0.981376f,0.187527f, +-0.216733f,0.958137f,0.187084f, +-0.0894435f,0.917028f,0.388664f, +-0.0768893f,0.966885f,0.243356f, +-0.0850782f,0.918088f,0.387139f, +-0.0500426f,0.973558f,0.222893f, +-0.133165f,0.955198f,0.264319f, +-0.123001f,0.980349f,0.154228f, +-0.136539f,0.958129f,0.251685f, +-0.132627f,0.981796f,0.135965f, +-0.174651f,0.968606f,0.176918f, +-0.259357f,0.958248f,0.120395f, +-0.298496f,0.949786f,0.0938444f, +-0.287382f,0.955091f,0.0721996f, +-0.350088f,0.936687f,-0.00747904f, +-0.148232f,0.988935f,-0.00587251f, +-0.126386f,0.991686f,0.0242043f, +-0.0549856f,0.99804f,0.0298927f, +-0.061356f,0.998107f,0.00430538f, +-0.205447f,0.97828f,0.0275574f, +-0.222811f,0.974816f,-0.00939735f, +-0.192208f,0.981343f,0.00477232f, +-0.179009f,0.983825f,-0.00666687f, +-0.0670729f,0.997581f,0.0182672f, +-0.127994f,0.990724f,-0.0456448f, +-0.132352f,0.983294f,-0.124961f, +-0.16906f,0.976471f,-0.133875f, +0.0163433f,0.992538f,-0.120836f, +0.061026f,0.995929f,-0.0663405f, +0.133906f,0.98909f,-0.0613958f, +0.0943148f,0.983776f,-0.152607f, +0.150352f,0.985874f,-0.0738065f, +0.100217f,0.972528f,-0.210109f, +0.174622f,0.974275f,-0.142462f, +0.154561f,0.962801f,-0.221644f, +0.214773f,0.96191f,-0.169122f, +0.258606f,0.948184f,-0.184582f, +0.352689f,0.932616f,-0.0764078f, +0.422646f,0.906225f,0.0112396f, +0.443105f,0.890896f,-0.0998108f, +0.401063f,0.915401f,-0.0344995f, +0.415945f,0.889086f,-0.19109f, +0.396075f,0.910803f,-0.116459f, +0.504361f,0.849207f,-0.15642f, +0.465554f,0.866637f,-0.179442f, +0.527872f,0.824305f,-0.204628f, +0.465951f,0.840148f,-0.277561f, +0.474007f,0.822715f,-0.31378f, +0.361245f,0.837173f,-0.410663f, +0.405138f,0.793126f,-0.454769f, +0.304965f,0.772294f,-0.557277f, +0.421648f,0.811214f,-0.405148f, +0.482203f,0.762506f,-0.431353f, +0.478963f,0.817038f,-0.321005f, +0.485062f,0.781955f,-0.391486f, +0.478205f,0.82345f,-0.305368f, +0.426707f,0.781297f,-0.455518f, +0.428677f,0.841565f,-0.32864f, +0.430024f,0.798188f,-0.421871f, +0.423016f,0.835924f,-0.349699f, +0.437416f,0.818455f,-0.372557f, +0.461522f,0.813116f,-0.354739f, +0.446182f,0.808887f,-0.382915f, +0.507869f,0.791896f,-0.339072f, +0.474665f,0.780232f,-0.407346f, +0.494125f,0.792543f,-0.357373f, +0.430265f,0.769469f,-0.472006f, +0.389469f,0.809375f,-0.439574f, +0.38782f,0.781711f,-0.488389f, +0.349938f,0.837293f,-0.4201f, +0.417236f,0.816738f,-0.398564f, +0.440298f,0.822173f,-0.360789f, +0.490994f,0.819158f,-0.296487f, +0.379279f,0.852728f,-0.359169f, +0.3675f,0.860963f,-0.351692f, +0.122152f,0.892865f,-0.433442f, +0.135293f,0.922235f,-0.362185f, +0.188083f,0.883941f,-0.428104f, +0.194653f,0.9204f,-0.339078f, +0.200053f,0.870677f,-0.449332f, +0.149584f,0.899445f,-0.410639f, +0.170948f,0.845446f,-0.505962f, +0.0834541f,0.848059f,-0.523289f, +0.233208f,0.811352f,-0.536024f, +0.246347f,0.822898f,-0.512008f, +0.0429626f,0.875995f,-0.480403f, +0.171623f,0.870482f,-0.461311f, +-0.202408f,0.938053f,-0.281226f, +-0.0831604f,0.960463f,-0.265698f, +-0.312635f,0.912112f,-0.265162f, +-0.344362f,0.89728f,-0.276231f, +-0.0852182f,0.932714f,-0.350403f, +-0.156991f,0.922287f,-0.353185f, +0.0213728f,0.893503f,-0.448548f, +-0.0577934f,0.860578f,-0.506029f, +-0.0250381f,0.886654f,-0.461755f, +-0.0319956f,0.87749f,-0.478526f, +-0.0302913f,0.865602f,-0.499816f, +-0.00892741f,0.865625f,-0.500613f, +0.0556557f,0.906734f,-0.418015f, +0.137632f,0.905698f,-0.400959f, +0.0276894f,0.926625f,-0.374965f, +0.074566f,0.927887f,-0.365329f, +0.0588963f,0.991806f,0.113367f, +0.300045f,0.940314f,0.160571f, +0.505162f,0.858812f,0.0851652f, +0.523651f,0.851407f,0.0299276f, +0.336751f,0.940492f,0.0455315f, +0.231254f,0.960478f,0.15493f, +0.265257f,0.945144f,0.190637f, +0.327138f,0.941822f,0.0771526f, +0.406507f,0.912216f,-0.0511354f, +0.398687f,0.900126f,-0.17556f, +0.399875f,0.884983f,-0.238547f, +0.421808f,0.899838f,-0.11122f, +-0.041369f,0.987502f,-0.152078f, +-0.327111f,0.932019f,-0.156008f, +-0.143307f,0.985559f,-0.0902006f, +-0.0270205f,0.999466f,0.0183744f, +-0.0836031f,0.996473f,-0.00727851f, +-0.153499f,0.988141f,-0.00380883f, +-0.269657f,0.962702f,0.0221269f, +-0.220011f,0.975241f,-0.0223422f, +-0.104184f,0.990611f,-0.0885198f, +-0.112376f,0.99176f,-0.0615135f, +-0.176142f,0.984186f,-0.0187604f, +-0.211815f,0.974306f,-0.076572f, +-0.0254097f,0.999559f,-0.0153608f, +-0.0364109f,0.99734f,-0.0631393f, +-0.0203648f,0.999538f,-0.0225481f, +0.0549873f,0.998448f,0.00884961f, +0.169599f,0.985346f,0.0181241f, +0.253148f,0.96653f,-0.0416731f, +0.241207f,0.963047f,-0.119834f, +0.334221f,0.932038f,-0.140004f, +0.510774f,0.849501f,-0.132124f, +0.446103f,0.866333f,-0.224633f, +0.443332f,0.853241f,-0.274658f, +0.556199f,0.799442f,-0.227011f, +0.56349f,0.790862f,-0.238781f, +0.469847f,0.819465f,-0.32821f, +0.384148f,0.843359f,-0.375735f, +0.405196f,0.828658f,-0.386189f, +0.451519f,0.832227f,-0.321758f, +0.460293f,0.845627f,-0.27027f, +0.479361f,0.841341f,-0.249716f, +0.486527f,0.832565f,-0.264815f, +0.505678f,0.817374f,-0.276024f, +0.532701f,0.792427f,-0.297134f, +0.419998f,0.832504f,-0.361301f, +0.381252f,0.872209f,-0.306428f, +0.441269f,0.820876f,-0.362552f, +0.40003f,0.811169f,-0.426593f, +0.192925f,0.829083f,-0.524786f, +0.183969f,0.805942f,-0.562684f, +0.196671f,0.822252f,-0.534063f, +0.210296f,0.820946f,-0.530871f, +0.203797f,0.82129f,-0.532869f, +-0.110131f,0.879911f,-0.462199f, +-0.313522f,0.874849f,-0.369247f, +-0.225349f,0.894153f,-0.386922f, +-0.0425073f,0.90311f,-0.4273f, +0.0811921f,0.929959f,-0.358587f, +-0.0097083f,0.913772f,-0.406111f, +-0.0203212f,0.916094f,-0.400448f, +-0.0594319f,0.92652f,-0.371521f, +-0.0269889f,0.956838f,-0.289365f, +0.0349749f,0.98646f,-0.160231f, +0.256968f,0.956769f,-0.13624f, +0.548943f,0.832681f,-0.0728256f, +0.489119f,0.868806f,-0.0770563f, +0.299363f,0.954014f,0.0154449f, +0.150669f,0.988307f,0.0233966f, +0.338483f,0.938561f,0.0673226f, +0.470525f,0.880363f,-0.0597344f, +0.482272f,0.850276f,-0.210818f, +0.467725f,0.834993f,-0.289861f, +0.394888f,0.866151f,-0.306343f, +0.253937f,0.935832f,-0.244407f, +-0.00400266f,0.994244f,-0.107062f, +-0.309146f,0.937501f,-0.15975f, +-0.226806f,0.957844f,-0.176334f, +-0.122632f,0.982531f,-0.139981f, +-0.0635605f,0.992861f,-0.10093f, +-0.151586f,0.973622f,-0.170534f, +-0.231525f,0.948656f,-0.215516f, +-0.166237f,0.951792f,-0.257795f, +-0.0869197f,0.960928f,-0.262798f, +-0.164573f,0.950876f,-0.262203f, +-0.167249f,0.963013f,-0.211268f, +-0.211402f,0.954271f,-0.211366f, +-0.0642089f,0.988782f,-0.134861f, +-0.0696806f,0.987799f,-0.139279f, +-0.124243f,0.98904f,-0.0797755f, +0.0962393f,0.995288f,-0.0118021f, +0.210783f,0.972894f,-0.0951158f, +0.297355f,0.950074f,-0.0945467f, +0.301001f,0.949737f,-0.0860135f, +0.352321f,0.929179f,-0.111785f, +0.488103f,0.867307f,-0.0976422f, +0.556803f,0.828121f,-0.0646904f, +0.522997f,0.817722f,-0.240427f, +0.526158f,0.791225f,-0.311642f, +0.539548f,0.783883f,-0.30727f, +0.519736f,0.798926f,-0.302643f, +0.456854f,0.816569f,-0.352845f, +0.429557f,0.807438f,-0.404381f, +0.403588f,0.823842f,-0.397997f, +0.363835f,0.833866f,-0.415079f, +0.411515f,0.83345f,-0.368804f, +0.472303f,0.812756f,-0.341113f, +0.520866f,0.78709f,-0.330436f, +0.571303f,0.758641f,-0.313172f, +0.364947f,0.85616f,-0.365791f, +0.334117f,0.892356f,-0.303424f, +0.531373f,0.790182f,-0.305376f, +0.490437f,0.768139f,-0.411624f, +0.28549f,0.798709f,-0.529679f, +0.166173f,0.802828f,-0.572585f, +0.142862f,0.826392f,-0.544671f, +0.199443f,0.816751f,-0.541424f, +0.128075f,0.851947f,-0.507724f, +-0.168704f,0.879688f,-0.444621f, +-0.244755f,0.842741f,-0.479461f, +-0.150804f,0.809643f,-0.567218f, +-0.142654f,0.804501f,-0.576565f, +-0.00468689f,0.885234f,-0.465123f, +-0.00403137f,0.903548f,-0.428468f, +-0.0506207f,0.931001f,-0.361489f, +-0.153442f,0.941817f,-0.299058f, +-0.162811f,0.972443f,-0.166875f, +0.109587f,0.934225f,-0.339431f, +0.212963f,0.908729f,-0.358967f, +0.490721f,0.837065f,-0.2419f, +0.423339f,0.87185f,-0.246298f, +0.265687f,0.948953f,-0.169996f, +0.19754f,0.959782f,-0.199488f, +0.295591f,0.918793f,-0.261622f, +0.531499f,0.826018f,-0.187622f, +0.59212f,0.773761f,-0.225139f, +0.430882f,0.823206f,-0.369692f, +0.346812f,0.896722f,-0.274977f, +0.157001f,0.944818f,-0.287523f, +-0.0770972f,0.974843f,-0.209133f, +-0.291803f,0.93708f,-0.191656f, +-0.196019f,0.961744f,-0.191378f, +-0.131765f,0.96396f,-0.231124f, +-0.0745388f,0.982069f,-0.173159f, +0.00914064f,0.98959f,-0.143621f, +-0.138284f,0.94748f,-0.288373f, +-0.221669f,0.91917f,-0.325561f, +-0.129149f,0.970549f,-0.203358f, +-0.130482f,0.980721f,-0.145466f, +-0.176902f,0.951987f,-0.249854f, +-0.247465f,0.916992f,-0.31287f, +-0.158128f,0.953184f,-0.25775f, +-0.0356987f,0.985511f,-0.165812f, +-0.125849f,0.96636f,-0.224301f, +0.0681695f,0.96619f,-0.248655f, +0.227225f,0.953018f,-0.200315f, +0.225952f,0.967572f,-0.112919f, +0.287704f,0.957355f,-0.0264129f, +0.36102f,0.928385f,-0.0881278f, +0.475672f,0.87145f,-0.119627f, +0.569214f,0.81507f,-0.107964f, +0.623663f,0.769908f,-0.13523f, +0.603105f,0.773542f,-0.19467f, +0.556766f,0.776509f,-0.295034f, +0.523993f,0.789717f,-0.319025f, +0.458736f,0.810878f,-0.36337f, +0.42608f,0.838013f,-0.340867f, +0.413816f,0.852215f,-0.320134f, +0.428047f,0.839676f,-0.334247f, +0.440545f,0.806668f,-0.393963f, +0.471664f,0.754066f,-0.457075f, +0.438131f,0.75533f,-0.487358f, +0.513035f,0.778713f,-0.361111f, +0.362236f,0.865985f,-0.344753f, +0.319311f,0.872794f,-0.36915f, +0.546544f,0.761872f,-0.347621f, +0.587841f,0.74763f,-0.309017f, +0.346001f,0.792234f,-0.502642f, +0.160837f,0.807416f,-0.567637f, +0.137348f,0.82025f,-0.555271f, +0.177955f,0.827144f,-0.533071f, +0.0951091f,0.870125f,-0.483567f, +-0.154432f,0.835911f,-0.526691f, +-0.124368f,0.808763f,-0.574834f, +-0.126819f,0.782715f,-0.609323f, +-0.137751f,0.811099f,-0.568456f, +-0.111652f,0.799108f,-0.590729f, +-0.083265f,0.829705f,-0.551957f, +-0.187386f,0.858237f,-0.477825f, +-0.293723f,0.918982f,-0.263055f, +-0.393626f,0.913021f,-0.107009f, +0.212209f,0.950224f,-0.228125f, +0.209499f,0.936607f,-0.280851f, +0.442676f,0.872148f,-0.208317f, +0.471617f,0.857429f,-0.205893f, +0.203873f,0.890799f,-0.406094f, +0.238352f,0.874506f,-0.422408f, +0.316589f,0.834877f,-0.45028f, +0.439788f,0.802413f,-0.403384f, +0.591147f,0.75018f,-0.29627f, +0.446858f,0.837414f,-0.314732f, +0.297014f,0.892204f,-0.340228f, +0.174626f,0.914769f,-0.364286f, +-0.105816f,0.915255f,-0.388731f, +-0.264967f,0.884964f,-0.382925f, +-0.17731f,0.909999f,-0.374785f, +-0.129483f,0.910653f,-0.39236f, +-0.183919f,0.912509f,-0.365379f, +-0.0547605f,0.971103f,-0.232295f, +-0.0329197f,0.988161f,-0.149845f, +-0.283679f,0.94023f,-0.188398f, +-0.271484f,0.961222f,-0.0484715f, +-0.126156f,0.992006f,-0.00297784f, +-0.0077445f,0.99412f,-0.10801f, +-0.122479f,0.952558f,-0.278626f, +-0.22816f,0.898995f,-0.373834f, +-0.116624f,0.94701f,-0.299285f, +-0.0338322f,0.962019f,-0.270876f, +0.0643125f,0.93366f,-0.352339f, +0.108033f,0.951056f,-0.28952f, +0.0914872f,0.981979f,-0.165373f, +0.260441f,0.963994f,-0.0537291f, +0.448443f,0.892711f,-0.0443492f, +0.523825f,0.846692f,-0.0933822f, +0.566469f,0.810587f,-0.148532f, +0.615421f,0.777098f,-0.131818f, +0.641634f,0.7586f,-0.11328f, +0.626845f,0.758026f,-0.180172f, +0.575952f,0.768546f,-0.278596f, +0.455289f,0.793648f,-0.403527f, +0.401888f,0.827012f,-0.393113f, +0.390072f,0.829628f,-0.399451f, +0.432707f,0.817098f,-0.380939f, +0.498394f,0.785084f,-0.367759f, +0.54453f,0.759415f,-0.356056f, +0.443321f,0.820621f,-0.360621f, +0.413861f,0.828476f,-0.377289f, +0.394054f,0.852433f,-0.343626f, +0.354186f,0.831754f,-0.427477f, +0.501406f,0.754246f,-0.423916f, +0.58911f,0.726277f,-0.354219f, +0.489087f,0.757568f,-0.432301f, +0.219144f,0.803913f,-0.552901f, +0.0950257f,0.808184f,-0.581213f, +0.0824554f,0.830823f,-0.550395f, +0.0933748f,0.860985f,-0.499987f, +-0.0248456f,0.850125f,-0.525994f, +-0.102917f,0.824622f,-0.556243f, +-0.137975f,0.843048f,-0.519839f, +-0.191841f,0.811585f,-0.551839f, +-0.0960986f,0.833755f,-0.543707f, +-0.122745f,0.850064f,-0.512177f, +-0.326981f,0.870361f,-0.368177f, +-0.538824f,0.830097f,-0.143558f, +-0.554748f,0.831168f,0.0375988f, +0.183636f,0.945911f,-0.267453f, +0.248003f,0.941284f,-0.229083f, +0.367193f,0.90606f,-0.210295f, +0.559963f,0.826078f,-0.0635307f, +0.486301f,0.848236f,-0.209779f, +0.313552f,0.830527f,-0.460336f, +0.26103f,0.794184f,-0.548758f, +0.384376f,0.78311f,-0.488869f, +0.479781f,0.77201f,-0.416905f, +0.481011f,0.825397f,-0.295547f, +0.281884f,0.886831f,-0.366158f, +0.202383f,0.940438f,-0.273162f, +-0.0238314f,0.938511f,-0.344426f, +-0.257973f,0.859678f,-0.440913f, +-0.194719f,0.873936f,-0.445332f, +-0.0838372f,0.877697f,-0.471825f, +-0.223876f,0.839024f,-0.495901f, +-0.216019f,0.888182f,-0.405548f, +-0.127765f,0.960438f,-0.247457f, +-0.306436f,0.940762f,-0.145138f, +-0.327317f,0.939981f,-0.096429f, +-0.0557083f,0.990847f,-0.122959f, +0.0995056f,0.975129f,-0.198043f, +0.0247654f,0.966343f,-0.256062f, +-0.1694f,0.916546f,-0.362281f, +-0.197841f,0.908709f,-0.367568f, +-0.0185126f,0.95561f,-0.294052f, +0.0824185f,0.951583f,-0.296138f, +0.0241627f,0.96387f,-0.265277f, +0.0355962f,0.964767f,-0.260688f, +0.155357f,0.948871f,-0.274788f, +0.403654f,0.905713f,-0.129414f, +0.540931f,0.838513f,-0.0654957f, +0.603296f,0.79305f,-0.0842943f, +0.615316f,0.778563f,-0.123395f, +0.650635f,0.750663f,-0.114799f, +0.681129f,0.712532f,-0.16841f, +0.640077f,0.706799f,-0.301225f, +0.501905f,0.776085f,-0.381816f, +0.395956f,0.833034f,-0.386359f, +0.40448f,0.824611f,-0.39549f, +0.410354f,0.816219f,-0.406689f, +0.470853f,0.807605f,-0.355065f, +0.489936f,0.812779f,-0.315203f, +0.459069f,0.843316f,-0.279417f, +0.469145f,0.829489f,-0.303069f, +0.440235f,0.819159f,-0.367657f, +0.420347f,0.792019f,-0.442734f, +0.528602f,0.735131f,-0.424456f, +0.540602f,0.708419f,-0.453752f, +0.493287f,0.777492f,-0.390095f, +0.304413f,0.86604f,-0.396619f, +0.0820709f,0.870144f,-0.485916f, +0.0884612f,0.883073f,-0.460823f, +0.0898563f,0.860973f,-0.500651f, +-0.0421635f,0.844727f,-0.533535f, +-0.161922f,0.847271f,-0.505878f, +-0.14449f,0.888235f,-0.436074f, +-0.171293f,0.877903f,-0.447153f, +-0.137238f,0.90321f,-0.406666f, +-0.254069f,0.918554f,-0.302831f, +-0.505168f,0.843216f,-0.183829f, +-0.675277f,0.734237f,-0.069976f, +-0.653992f,0.755215f,0.0440947f, +0.0555085f,0.890635f,-0.451319f, +0.137334f,0.909799f,-0.39167f, +0.308301f,0.903589f,-0.297451f, +0.471952f,0.852104f,-0.226231f, +0.566013f,0.811602f,-0.144679f, +0.544915f,0.811135f,-0.212433f, +0.36963f,0.829124f,-0.419437f, +0.344038f,0.821377f,-0.454948f, +0.421617f,0.811326f,-0.404955f, +0.42674f,0.823996f,-0.372724f, +0.214619f,0.881696f,-0.42018f, +0.0910032f,0.951585f,-0.293606f, +0.0846967f,0.975495f,-0.203065f, +-0.12731f,0.949549f,-0.286616f, +-0.203708f,0.900619f,-0.383912f, +-0.0136138f,0.94578f,-0.324521f, +-0.1774f,0.907831f,-0.379963f, +-0.319591f,0.828051f,-0.460644f, +-0.309551f,0.868477f,-0.387202f, +-0.350068f,0.908991f,-0.226245f, +-0.314996f,0.908797f,-0.273615f, +-0.0601423f,0.962735f,-0.263674f, +0.136393f,0.973573f,-0.183175f, +0.0532739f,0.976623f,-0.208255f, +-0.105007f,0.973025f,-0.205419f, +-0.20872f,0.948662f,-0.237649f, +-0.0905915f,0.950284f,-0.297915f, +0.0475864f,0.961005f,-0.272405f, +0.0362517f,0.97079f,-0.237174f, +0.105725f,0.948531f,-0.298516f, +0.162566f,0.915122f,-0.368949f, +0.273546f,0.895769f,-0.350385f, +0.484941f,0.844255f,-0.228179f, +0.616479f,0.776457f,-0.130645f, +0.628311f,0.758456f,-0.173119f, +0.646758f,0.730427f,-0.2195f, +0.713832f,0.657703f,-0.240564f, +0.670883f,0.685042f,-0.283959f, +0.484582f,0.813502f,-0.32155f, +0.374759f,0.869215f,-0.322522f, +0.442437f,0.844514f,-0.301738f, +0.417442f,0.841211f,-0.343666f, +0.423405f,0.844004f,-0.329219f, +0.51768f,0.821209f,-0.240049f, +0.452859f,0.851327f,-0.264878f, +0.509187f,0.825405f,-0.243796f, +0.514747f,0.798114f,-0.313129f, +0.470791f,0.788824f,-0.395111f, +0.531455f,0.747848f,-0.397843f, +0.533283f,0.783064f,-0.32003f, +0.426956f,0.884256f,-0.18921f, +0.350467f,0.920762f,-0.171379f, +0.166727f,0.944055f,-0.284537f, +0.0641204f,0.940994f,-0.332292f, +0.176576f,0.941646f,-0.286573f, +0.033479f,0.945913f,-0.322688f, +-0.166217f,0.885456f,-0.433982f, +-0.211415f,0.849321f,-0.483692f, +-0.245686f,0.873508f,-0.420264f, +-0.318583f,0.913339f,-0.253606f, +-0.37482f,0.927017f,-0.0122188f, +-0.519112f,0.853899f,0.0371293f, +-0.674751f,0.732141f,-0.0931649f, +-0.717847f,0.685588f,-0.121095f, +0.129526f,0.933398f,-0.33465f, +0.109756f,0.909727f,-0.400439f, +0.235187f,0.88528f,-0.401206f, +0.43527f,0.839228f,-0.32594f, +0.509145f,0.799028f,-0.319883f, +0.559944f,0.774395f,-0.294577f, +0.481154f,0.808934f,-0.337812f, +0.346903f,0.826321f,-0.443681f, +0.419785f,0.810323f,-0.408849f, +0.424579f,0.803602f,-0.417081f, +0.213763f,0.882039f,-0.419896f, +-0.065439f,0.903315f,-0.423958f, +-0.0365788f,0.953894f,-0.297908f, +-0.052968f,0.984136f,-0.169324f, +-0.178873f,0.950393f,-0.254476f, +-0.13588f,0.955299f,-0.262566f, +-0.0549577f,0.986053f,-0.157096f, +-0.250853f,0.921347f,-0.296972f, +-0.383387f,0.86801f,-0.31555f, +-0.39517f,0.874494f,-0.281248f, +-0.297344f,0.903399f,-0.308961f, +-0.146671f,0.942034f,-0.301762f, +0.0292749f,0.969498f,-0.243343f, +0.0315554f,0.994938f,-0.0954108f, +-0.135353f,0.99076f,0.00864549f, +-0.109362f,0.993969f,-0.00807889f, +0.00178341f,0.978683f,-0.205368f, +0.0583577f,0.951175f,-0.303086f, +0.0448944f,0.938747f,-0.341671f, +0.135893f,0.935013f,-0.327543f, +0.248098f,0.92828f,-0.277025f, +0.287291f,0.872499f,-0.395234f, +0.360517f,0.825037f,-0.435134f, +0.531263f,0.786524f,-0.314864f, +0.667801f,0.716872f,-0.200342f, +0.67932f,0.687853f,-0.2557f, +0.702261f,0.671608f,-0.236161f, +0.672702f,0.722764f,-0.15838f, +0.529805f,0.828764f,-0.180158f, +0.396956f,0.86756f,-0.29961f, +0.439447f,0.830334f,-0.342683f, +0.431898f,0.838796f,-0.33149f, +0.414335f,0.865026f,-0.282941f, +0.433505f,0.865399f,-0.251314f, +0.473777f,0.866492f,-0.157252f, +0.513796f,0.828002f,-0.224559f, +0.584841f,0.771201f,-0.251417f, +0.518412f,0.788719f,-0.330412f, +0.507007f,0.831445f,-0.227253f, +0.414775f,0.908203f,-0.0559478f, +0.370241f,0.92627f,0.07033f, +0.386742f,0.919823f,0.0659988f, +0.294152f,0.955333f,0.0285335f, +0.1108f,0.9849f,-0.133022f, +0.118551f,0.967697f,-0.222506f, +0.0772752f,0.978981f,-0.188747f, +-0.0200413f,0.97522f,-0.220327f, +-0.18076f,0.942791f,-0.280125f, +-0.356914f,0.914544f,-0.190318f, +-0.511643f,0.854464f,-0.0900754f, +-0.529301f,0.843485f,0.0915077f, +-0.481356f,0.855106f,0.192586f, +-0.566596f,0.818312f,0.0966086f, +-0.682392f,0.727753f,-0.0686784f, +0.232504f,0.952167f,-0.198291f, +0.256414f,0.932781f,-0.253323f, +0.252094f,0.888895f,-0.38251f, +0.391259f,0.847753f,-0.358095f, +0.537533f,0.80784f,-0.241771f, +0.561137f,0.803605f,-0.198354f, +0.542606f,0.822395f,-0.171013f, +0.447025f,0.853524f,-0.267703f, +0.421457f,0.829331f,-0.366857f, +0.381949f,0.841011f,-0.383165f, +0.196905f,0.918187f,-0.343745f, +-0.0750719f,0.92165f,-0.380691f, +-0.176435f,0.915143f,-0.362469f, +-0.162121f,0.952528f,-0.257698f, +-0.094717f,0.979068f,-0.180149f, +-0.167752f,0.965606f,-0.198655f, +-0.133367f,0.985758f,-0.102438f, +-0.176519f,0.982527f,-0.0590077f, +-0.382392f,0.914243f,-0.133925f, +-0.379354f,0.898635f,-0.220329f, +-0.2745f,0.907747f,-0.317246f, +-0.107475f,0.924008f,-0.366959f, +-0.0783766f,0.915897f,-0.393688f, +-0.161723f,0.964079f,-0.210708f, +-0.213776f,0.971922f,-0.0983248f, +0.0126393f,0.993361f,-0.114343f, +0.146279f,0.956353f,-0.252963f, +0.181548f,0.939791f,-0.289541f, +0.0719106f,0.91394f,-0.399427f, +0.0405362f,0.92481f,-0.378262f, +0.227996f,0.9289f,-0.291825f, +0.430007f,0.847434f,-0.311368f, +0.444003f,0.803436f,-0.396676f, +0.425815f,0.77314f,-0.470039f, +0.591393f,0.731624f,-0.339089f, +0.68448f,0.684033f,-0.252165f, +0.663878f,0.696032f,-0.273504f, +0.62681f,0.752096f,-0.203619f, +0.578478f,0.810023f,-0.0960529f, +0.535256f,0.829774f,-0.158038f, +0.488949f,0.817442f,-0.304496f, +0.370902f,0.857519f,-0.356501f, +0.349699f,0.870975f,-0.345126f, +0.374514f,0.863134f,-0.338731f, +0.45144f,0.856074f,-0.251673f, +0.565254f,0.789722f,-0.238384f, +0.610208f,0.775791f,-0.160605f, +0.460354f,0.88479f,-0.0722568f, +0.360414f,0.930663f,0.0629891f, +0.310809f,0.940565f,0.136874f, +0.344153f,0.923997f,0.166701f, +0.371378f,0.913473f,0.166271f, +0.349168f,0.916329f,0.196019f, +0.310264f,0.946182f,0.0920588f, +0.219218f,0.972739f,-0.075642f, +0.0579784f,0.994476f,-0.087501f, +-0.0556996f,0.997544f,-0.0424565f, +-0.239345f,0.970003f,0.0425244f, +-0.461388f,0.876311f,0.138566f, +-0.538726f,0.825514f,0.168229f, +-0.597717f,0.791468f,0.127721f, +-0.507215f,0.833365f,0.219627f, +-0.488959f,0.84151f,0.229738f, +-0.545304f,0.815937f,0.192066f, +0.227692f,0.931856f,-0.282489f, +0.297935f,0.90904f,-0.291343f, +0.353719f,0.876832f,-0.325652f, +0.346915f,0.865884f,-0.36041f, +0.409305f,0.867351f,-0.283145f, +0.519851f,0.844165f,-0.130922f, +0.531147f,0.844051f,-0.0738934f, +0.549452f,0.835136f,-0.0255055f, +0.519598f,0.847001f,-0.112281f, +0.416821f,0.899711f,-0.12954f, +0.213877f,0.961324f,-0.173531f, +-0.0327967f,0.969436f,-0.243141f, +-0.200151f,0.944585f,-0.26019f, +-0.261086f,0.940261f,-0.218503f, +-0.16617f,0.980036f,-0.109163f, +-0.211362f,0.973049f,-0.0922088f, +-0.262019f,0.96267f,-0.0679153f, +-0.172722f,0.984229f,0.0382049f, +-0.269464f,0.962867f,-0.0166155f, +-0.289017f,0.944015f,-0.159073f, +-0.146887f,0.958128f,-0.245795f, +-0.0700562f,0.951312f,-0.300164f, +-0.140619f,0.963564f,-0.227533f, +-0.278995f,0.930049f,-0.239105f, +-0.16269f,0.936868f,-0.309531f, +0.070144f,0.909561f,-0.409607f, +0.193776f,0.876857f,-0.43997f, +0.127038f,0.902686f,-0.411121f, +0.150617f,0.947884f,-0.280767f, +0.0386496f,0.919015f,-0.392324f, +0.208973f,0.868713f,-0.449075f, +0.403894f,0.796876f,-0.449287f, +0.495348f,0.781817f,-0.378673f, +0.489779f,0.764879f,-0.418421f, +0.499102f,0.742417f,-0.446893f, +0.648968f,0.690613f,-0.319208f, +0.677239f,0.687846f,-0.26118f, +0.512369f,0.799495f,-0.313506f, +0.465181f,0.863456f,-0.195064f, +0.589095f,0.803266f,-0.0879238f, +0.56026f,0.801619f,-0.208601f, +0.442292f,0.866151f,-0.232723f, +0.407485f,0.876049f,-0.257867f, +0.41887f,0.854839f,-0.306264f, +0.344336f,0.834896f,-0.429397f, +0.497957f,0.824163f,-0.269804f, +0.448098f,0.886678f,-0.114058f, +0.337837f,0.929162f,0.150081f, +0.341034f,0.908641f,0.240972f, +0.356163f,0.918925f,0.169481f, +0.332963f,0.932465f,0.140159f, +0.378366f,0.915215f,0.13864f, +0.366597f,0.926522f,0.0846395f, +0.364364f,0.925578f,0.102688f, +0.226565f,0.954799f,0.192424f, +0.0359845f,0.964557f,0.261408f, +-0.155471f,0.954274f,0.255321f, +-0.290268f,0.886689f,0.359898f, +-0.467017f,0.828082f,0.31012f, +-0.499403f,0.82291f,0.270953f, +-0.565258f,0.797609f,0.210482f, +-0.553063f,0.809532f,0.196925f, +-0.499446f,0.823964f,0.267652f, +-0.522286f,0.796771f,0.30393f, +0.282895f,0.896955f,-0.339766f, +0.328074f,0.870604f,-0.366628f, +0.343521f,0.854938f,-0.388683f, +0.333693f,0.867418f,-0.369101f, +0.350459f,0.883644f,-0.310405f, +0.440013f,0.868347f,-0.228826f, +0.488334f,0.85139f,-0.191483f, +0.49066f,0.852892f,-0.178404f, +0.509846f,0.855822f,-0.0873222f, +0.418823f,0.907869f,-0.0190138f, +0.288806f,0.957176f,-0.0201137f, +0.0497186f,0.992214f,-0.114191f, +-0.215841f,0.960205f,-0.177253f, +-0.338759f,0.933444f,-0.118004f, +-0.242696f,0.969321f,-0.0389388f, +-0.141909f,0.989578f,-0.0244358f, +-0.270493f,0.952883f,-0.137288f, +-0.235245f,0.967095f,-0.0968818f, +-0.186427f,0.979041f,-0.0819931f, +-0.181825f,0.962183f,-0.20284f, +-0.135402f,0.958028f,-0.252681f, +-0.153581f,0.96935f,-0.191767f, +-0.186528f,0.978878f,-0.0837011f, +-0.164286f,0.974581f,-0.152324f, +0.0119477f,0.951315f,-0.307988f, +0.181241f,0.876938f,-0.44512f, +0.193514f,0.837326f,-0.51131f, +-0.00806995f,0.853668f,-0.520756f, +0.0461085f,0.918292f,-0.393209f, +0.210027f,0.898011f,-0.386606f, +0.313179f,0.820953f,-0.477447f, +0.395672f,0.762863f,-0.511355f, +0.407119f,0.752829f,-0.517206f, +0.491283f,0.735772f,-0.466133f, +0.508563f,0.731088f,-0.454835f, +0.557969f,0.720001f,-0.412637f, +0.635268f,0.712821f,-0.297187f, +0.514275f,0.818992f,-0.254505f, +0.384017f,0.888427f,-0.251454f, +0.535431f,0.823023f,-0.189597f, +0.597396f,0.79853f,-0.0739445f, +0.435766f,0.897283f,-0.0706489f, +0.387025f,0.91478f,-0.115713f, +0.532369f,0.842082f,-0.0864959f, +0.42055f,0.882636f,-0.209979f, +0.370951f,0.912219f,-0.173928f, +0.309089f,0.948381f,-0.0709704f, +0.21321f,0.976943f,0.0111471f, +0.331446f,0.943237f,0.0211533f, +0.410945f,0.911483f,0.0179772f, +0.321726f,0.946051f,-0.0384626f, +0.397145f,0.917286f,0.0293659f, +0.411757f,0.908804f,0.0673213f, +0.22276f,0.971882f,0.0763077f, +0.069501f,0.964908f,0.253224f, +-0.028986f,0.93542f,0.352349f, +-0.1774f,0.888082f,0.424074f, +-0.313309f,0.830284f,0.460941f, +-0.375142f,0.83463f,0.403313f, +-0.455516f,0.824707f,0.335207f, +-0.516585f,0.80896f,0.280577f, +-0.560057f,0.80406f,0.199559f, +-0.56953f,0.792393f,0.218515f, +-0.567769f,0.776958f,0.271984f, +0.281384f,0.90217f,-0.326974f, +0.32181f,0.911348f,-0.256676f, +0.424167f,0.891125f,-0.16118f, +0.302129f,0.903121f,-0.305108f, +0.274213f,0.914554f,-0.297318f, +0.377666f,0.887315f,-0.264651f, +0.50458f,0.840574f,-0.197063f, +0.48044f,0.846134f,-0.230726f, +0.426379f,0.87586f,-0.225987f, +0.348305f,0.925694f,-0.147563f, +0.27972f,0.958581f,-0.053649f, +0.144728f,0.989215f,-0.0225097f, +-0.168728f,0.979072f,-0.113791f, +-0.360157f,0.915919f,-0.177143f, +-0.292774f,0.933287f,-0.207987f, +-0.10309f,0.983541f,-0.148387f, +-0.174215f,0.960869f,-0.215359f, +-0.250891f,0.918965f,-0.304233f, +-0.150246f,0.940005f,-0.306294f, +-0.0860686f,0.946791f,-0.310127f, +-0.15131f,0.934427f,-0.322415f, +-0.22276f,0.935306f,-0.27492f, +-0.201088f,0.949203f,-0.242028f, +-0.0437143f,0.949864f,-0.309592f, +0.109977f,0.887847f,-0.446802f, +0.297781f,0.833674f,-0.465096f, +0.214775f,0.818536f,-0.532795f, +0.0269455f,0.850361f,-0.52551f, +-0.017632f,0.796129f,-0.60487f, +0.185146f,0.781388f,-0.595948f, +0.323386f,0.740218f,-0.589491f, +0.406653f,0.707179f,-0.578387f, +0.409551f,0.698057f,-0.587354f, +0.432954f,0.696782f,-0.57188f, +0.429959f,0.722053f,-0.54201f, +0.513634f,0.737641f,-0.438254f, +0.557438f,0.766448f,-0.319093f, +0.451237f,0.872287f,-0.188415f, +0.398866f,0.907449f,-0.132071f, +0.479702f,0.868398f,-0.125579f, +0.492136f,0.869715f,0.0373829f, +0.490052f,0.864036f,0.115287f, +0.467195f,0.882543f,-0.0533554f, +0.500676f,0.860686f,-0.092427f, +0.467521f,0.883982f,0.000254135f, +0.346172f,0.935182f,-0.0748316f, +0.285844f,0.955101f,-0.0779434f, +0.233788f,0.970423f,-0.0601792f, +0.33578f,0.93567f,-0.108509f, +0.44843f,0.890103f,-0.0814045f, +0.344049f,0.926181f,-0.154332f, +0.278254f,0.949058f,-0.147866f, +0.299653f,0.954043f,0.00333978f, +0.154533f,0.964067f,0.21609f, +0.0182142f,0.948347f,0.316711f, +-0.116946f,0.954294f,0.275039f, +-0.30019f,0.894483f,0.33134f, +-0.320232f,0.867471f,0.380717f, +-0.340655f,0.881399f,0.327246f, +-0.432069f,0.860755f,0.269105f, +-0.470649f,0.851696f,0.23044f, +-0.520568f,0.837827f,0.164485f, +-0.594362f,0.792684f,0.135598f, +-0.629645f,0.760492f,0.15874f, +0.105475f,0.917668f,-0.383094f, +0.157333f,0.940076f,-0.302494f, +0.34936f,0.922619f,-0.163471f, +0.441147f,0.892415f,-0.0947875f, +0.353266f,0.911437f,-0.210916f, +0.379048f,0.861228f,-0.33854f, +0.442622f,0.833751f,-0.330068f, +0.481137f,0.838111f,-0.257053f, +0.418048f,0.882249f,-0.216499f, +0.270753f,0.936711f,-0.221958f, +0.184979f,0.961951f,-0.201082f, +0.112903f,0.979904f,-0.164442f, +-0.0774318f,0.983977f,-0.160602f, +-0.269214f,0.939575f,-0.211477f, +-0.244405f,0.926884f,-0.284872f, +-0.16522f,0.91825f,-0.359887f, +-0.0697709f,0.937892f,-0.339838f, +-0.121807f,0.888033f,-0.443351f, +-0.178259f,0.862094f,-0.474361f, +-0.173573f,0.911189f,-0.373641f, +-0.145335f,0.940854f,-0.30606f, +-0.196672f,0.897435f,-0.394881f, +-0.142648f,0.86312f,-0.484434f, +0.079713f,0.828378f,-0.554469f, +0.216417f,0.76965f,-0.600668f, +0.249468f,0.776353f,-0.578828f, +0.204058f,0.841867f,-0.499621f, +0.0644049f,0.826788f,-0.558814f, +0.116412f,0.767322f,-0.630607f, +0.208898f,0.705315f,-0.677416f, +0.323537f,0.664792f,-0.673332f, +0.378749f,0.668133f,-0.640428f, +0.350681f,0.681998f,-0.641795f, +0.388988f,0.701053f,-0.597673f, +0.366172f,0.724838f,-0.583548f, +0.331191f,0.791609f,-0.513486f, +0.441902f,0.864123f,-0.240861f, +0.365381f,0.918735f,-0.149742f, +0.346761f,0.932102f,-0.104611f, +0.441617f,0.896164f,-0.0431763f, +0.429069f,0.903098f,0.0177174f, +0.509493f,0.859732f,0.035759f, +0.550737f,0.834518f,-0.0163997f, +0.446836f,0.894607f,0.00385291f, +0.489488f,0.868437f,0.0788584f, +0.430014f,0.900385f,-0.0662903f, +0.277285f,0.953602f,-0.117285f, +0.208284f,0.969937f,-0.12586f, +0.377184f,0.918436f,-0.119197f, +0.417651f,0.892053f,-0.172653f, +0.381197f,0.917074f,-0.116891f, +0.274507f,0.95009f,-0.148238f, +0.0946799f,0.989623f,-0.108088f, +-0.059654f,0.986641f,0.151597f, +-0.0667871f,0.959734f,0.272857f, +-0.0714815f,0.942101f,0.327622f, +-0.300084f,0.906469f,0.297092f, +-0.336918f,0.914203f,0.225209f, +-0.288002f,0.930996f,0.224278f, +-0.416386f,0.886687f,0.201018f, +-0.454428f,0.859405f,0.234346f, +-0.478891f,0.849426f,0.221671f, +-0.583336f,0.801078f,0.13414f, +-0.664795f,0.744846f,0.0570272f, +0.0774054f,0.9409f,-0.329722f, +0.120466f,0.940242f,-0.318486f, +0.258377f,0.92069f,-0.292526f, +0.391172f,0.892344f,-0.225179f, +0.441921f,0.861239f,-0.250944f, +0.474164f,0.819484f,-0.321892f, +0.430001f,0.828794f,-0.358051f, +0.388327f,0.849227f,-0.357794f, +0.321794f,0.900086f,-0.293759f, +0.306798f,0.936469f,-0.170002f, +0.197413f,0.950888f,-0.238412f, +0.140677f,0.959941f,-0.242328f, +-0.0738732f,0.952166f,-0.296516f, +-0.264161f,0.917561f,-0.297155f, +-0.156821f,0.939785f,-0.303665f, +-0.074827f,0.921443f,-0.381239f, +-0.0597443f,0.912887f,-0.403816f, +-0.0722702f,0.937805f,-0.339556f, +-0.223343f,0.933173f,-0.281613f, +-0.284993f,0.906137f,-0.31256f, +-0.17102f,0.941557f,-0.290212f, +0.0188228f,0.955829f,-0.29332f, +0.0949729f,0.880183f,-0.465036f, +0.154174f,0.836833f,-0.525301f, +0.175395f,0.823625f,-0.539331f, +0.0906162f,0.806123f,-0.584769f, +0.167569f,0.848038f,-0.502744f, +0.206981f,0.812951f,-0.544306f, +0.220466f,0.75453f,-0.618126f, +0.281661f,0.74367f,-0.606318f, +0.323085f,0.773947f,-0.544631f, +0.389827f,0.796004f,-0.463047f, +0.409468f,0.784217f,-0.466197f, +0.383754f,0.755374f,-0.531172f, +0.333252f,0.782449f,-0.526039f, +0.13472f,0.877229f,-0.460782f, +0.220453f,0.931705f,-0.288664f, +0.346271f,0.928921f,-0.131156f, +0.317872f,0.942854f,-0.0999207f, +0.41364f,0.908959f,-0.0519229f, +0.398453f,0.915561f,-0.0546188f, +0.505703f,0.862625f,-0.0119489f, +0.526627f,0.849939f,0.0163649f, +0.402553f,0.915142f,0.0215902f, +0.486926f,0.872826f,0.0328415f, +0.480317f,0.876602f,0.0293992f, +0.350224f,0.935385f,0.0489656f, +0.241613f,0.961192f,-0.13317f, +0.388714f,0.905381f,-0.170843f, +0.410083f,0.900693f,-0.14347f, +0.356005f,0.930194f,-0.0894385f, +0.273996f,0.955273f,-0.111267f, +-0.044831f,0.997624f,-0.0523075f, +-0.196423f,0.976135f,0.0926162f, +-0.135564f,0.988784f,0.0626771f, +-0.172489f,0.970476f,0.168594f, +-0.254529f,0.9218f,0.292405f, +-0.284378f,0.936305f,0.206065f, +-0.327372f,0.917976f,0.223935f, +-0.435353f,0.844597f,0.311647f, +-0.503149f,0.802852f,0.319796f, +-0.41775f,0.811758f,0.408086f, +-0.454925f,0.830308f,0.321918f, +-0.572823f,0.802298f,0.167904f, +0.20617f,0.937765f,-0.279448f, +0.12824f,0.920264f,-0.369687f, +0.239724f,0.89965f,-0.364914f, +0.406692f,0.839091f,-0.361286f, +0.450018f,0.81612f,-0.362535f, +0.486709f,0.828644f,-0.276522f, +0.440087f,0.85086f,-0.286985f, +0.416932f,0.85696f,-0.302962f, +0.239451f,0.901982f,-0.359293f, +0.202502f,0.927776f,-0.313409f, +0.221835f,0.941111f,-0.255147f, +0.127859f,0.963075f,-0.236935f, +0.0102396f,0.970361f,-0.241441f, +-0.185811f,0.907396f,-0.376969f, +-0.143f,0.87175f,-0.468618f, +-0.054802f,0.895065f,-0.442557f, +-0.153942f,0.908075f,-0.389489f, +-0.214862f,0.949277f,-0.22958f, +-0.226443f,0.961303f,-0.156909f, +-0.189142f,0.939849f,-0.284446f, +-0.183498f,0.904381f,-0.385258f, +0.0372666f,0.939229f,-0.341264f, +0.17942f,0.912891f,-0.366659f, +0.186987f,0.89504f,-0.404894f, +0.249987f,0.855827f,-0.452843f, +0.209164f,0.815071f,-0.540287f, +0.137636f,0.780743f,-0.609506f, +0.248264f,0.780183f,-0.574177f, +0.268876f,0.805155f,-0.528613f, +0.166884f,0.854291f,-0.492277f, +0.223895f,0.925944f,-0.304136f, +0.382591f,0.903499f,-0.193167f, +0.505015f,0.839819f,-0.199159f, +0.522375f,0.816711f,-0.245169f, +0.295143f,0.898426f,-0.32515f, +0.045309f,0.962545f,-0.26731f, +0.0698554f,0.972543f,-0.221991f, +0.23803f,0.966556f,-0.0954522f, +0.24345f,0.969904f,-0.00421011f, +0.387893f,0.915554f,0.106303f, +0.388608f,0.912695f,0.126382f, +0.452964f,0.880246f,0.141388f, +0.553021f,0.816379f,0.166411f, +0.46714f,0.881043f,0.0744546f, +0.450683f,0.892414f,0.0219511f, +0.444978f,0.886482f,0.127064f, +0.382178f,0.921652f,0.0670691f, +0.411319f,0.911388f,-0.0137033f, +0.389838f,0.919191f,-0.0558004f, +0.35617f,0.934375f,0.0092699f, +0.326889f,0.943423f,0.0556465f, +0.261297f,0.961477f,0.0853544f, +-0.107365f,0.988428f,0.107158f, +-0.198313f,0.974378f,0.106114f, +-0.119767f,0.989964f,0.0750203f, +-0.291683f,0.947022f,0.134427f, +-0.31644f,0.92799f,0.196723f, +-0.289311f,0.932636f,0.215615f, +-0.411791f,0.85345f,0.319455f, +-0.469106f,0.777331f,0.419161f, +-0.481552f,0.76826f,0.421765f, +-0.441444f,0.803246f,0.399904f, +-0.347505f,0.834501f,0.427607f, +-0.388172f,0.828163f,0.404313f, +0.166663f,0.855647f,-0.489991f, +0.206118f,0.852788f,-0.479863f, +0.253643f,0.809648f,-0.529278f, +0.34663f,0.798296f,-0.492515f, +0.334799f,0.852879f,-0.400633f, +0.411503f,0.867459f,-0.279608f, +0.469719f,0.846111f,-0.251912f, +0.425418f,0.857617f,-0.288986f, +0.321984f,0.890401f,-0.321733f, +0.13105f,0.897315f,-0.421487f, +0.163065f,0.944711f,-0.284482f, +0.0880681f,0.960841f,-0.262734f, +0.0835185f,0.96106f,-0.263417f, +-0.0250069f,0.943064f,-0.33167f, +-0.080502f,0.931121f,-0.355714f, +-0.129429f,0.916002f,-0.379721f, +-0.246145f,0.898013f,-0.36467f, +-0.295885f,0.891242f,-0.343715f, +-0.176282f,0.915144f,-0.362541f, +-0.0418985f,0.91018f,-0.412089f, +-0.0774111f,0.852502f,-0.51696f, +-0.0321668f,0.826692f,-0.561735f, +0.194406f,0.844754f,-0.498595f, +0.282885f,0.80862f,-0.515859f, +0.302949f,0.736294f,-0.605056f, +0.233445f,0.738314f,-0.632768f, +0.172128f,0.759349f,-0.627504f, +0.112225f,0.79134f,-0.600988f, +0.137255f,0.870359f,-0.472902f, +0.0541041f,0.935131f,-0.350147f, +0.048453f,0.960354f,-0.274541f, +0.350102f,0.918679f,-0.182913f, +0.524752f,0.830609f,-0.186344f, +0.518158f,0.835225f,-0.184147f, +0.313736f,0.944893f,-0.0935296f, +0.0308812f,0.997052f,-0.070238f, +0.048477f,0.985949f,-0.159858f, +0.14972f,0.972865f,-0.1764f, +0.155626f,0.983809f,-0.0888849f, +0.284416f,0.958659f,0.0089454f, +0.3659f,0.926807f,0.0845335f, +0.421454f,0.897257f,0.131556f, +0.563402f,0.804293f,0.188919f, +0.539736f,0.827553f,0.154408f, +0.404327f,0.91158f,0.0744378f, +0.452914f,0.883943f,0.116249f, +0.458215f,0.8862f,0.0684684f, +0.412404f,0.90336f,0.117745f, +0.337667f,0.93426f,0.114626f, +0.331072f,0.928113f,0.170285f, +0.265924f,0.943818f,0.196193f, +0.193837f,0.929607f,0.313462f, +-0.0688814f,0.919176f,0.387776f, +-0.142537f,0.930406f,0.33768f, +-0.12463f,0.963373f,0.237444f, +-0.336333f,0.924835f,0.17765f, +-0.311125f,0.930755f,0.192081f, +-0.359893f,0.911001f,0.201382f, +-0.532454f,0.800855f,0.274086f, +-0.552598f,0.767696f,0.324466f, +-0.457025f,0.795874f,0.39713f, +-0.406778f,0.834647f,0.371344f, +-0.39211f,0.844207f,0.365466f, +-0.407171f,0.83024f,0.380675f, +0.088004f,0.820624f,-0.564651f, +0.180508f,0.82686f,-0.532654f, +0.264125f,0.820464f,-0.507027f, +0.247967f,0.854234f,-0.456943f, +0.24322f,0.902001f,-0.356704f, +0.342999f,0.897422f,-0.277462f, +0.495739f,0.849894f,-0.178668f, +0.449958f,0.858561f,-0.245787f, +0.384562f,0.884942f,-0.262659f, +0.158931f,0.931299f,-0.327755f, +-0.00482349f,0.936712f,-0.350067f, +0.115045f,0.961792f,-0.248435f, +0.108639f,0.956333f,-0.271339f, +-0.0605962f,0.963938f,-0.259135f, +-0.116693f,0.974935f,-0.189434f, +-0.0876965f,0.975552f,-0.201512f, +-0.158272f,0.938607f,-0.30654f, +-0.195709f,0.870225f,-0.452113f, +-0.139804f,0.831767f,-0.537233f, +-0.0224753f,0.834621f,-0.550366f, +0.0691358f,0.82738f,-0.557371f, +0.021368f,0.778901f,-0.626782f, +0.103745f,0.763834f,-0.637021f, +0.295282f,0.754578f,-0.586021f, +0.391718f,0.767187f,-0.507919f, +0.243831f,0.78308f,-0.57213f, +0.0624167f,0.795727f,-0.60243f, +0.0157622f,0.882125f,-0.470752f, +-0.0549233f,0.922741f,-0.381487f, +-0.0376875f,0.97f,-0.240167f, +0.0506221f,0.974297f,-0.219507f, +0.328414f,0.911788f,-0.246548f, +0.524714f,0.832523f,-0.177709f, +0.470173f,0.873047f,-0.12933f, +0.188699f,0.978079f,-0.0880599f, +0.0393835f,0.999181f,-0.00932192f, +0.202516f,0.978334f,-0.0430044f, +0.188361f,0.964087f,-0.187232f, +0.0636833f,0.962187f,-0.264841f, +0.180234f,0.965248f,-0.18924f, +0.346543f,0.937198f,-0.0395955f, +0.331037f,0.942573f,-0.0443968f, +0.504726f,0.851052f,0.144785f, +0.565376f,0.80039f,0.199312f, +0.492317f,0.859822f,0.135391f, +0.448961f,0.892857f,0.0352157f, +0.367625f,0.92412f,0.104186f, +0.329385f,0.906428f,0.264373f, +0.348699f,0.881448f,0.318526f, +0.290794f,0.899496f,0.326107f, +0.185082f,0.919339f,0.347219f, +0.0676347f,0.907778f,0.413962f, +-0.145808f,0.884054f,0.444059f, +-0.0815232f,0.884669f,0.459037f, +0.0810938f,0.898461f,0.431499f, +-0.248842f,0.934053f,0.256168f, +-0.367995f,0.892045f,0.262364f, +-0.356163f,0.871443f,0.337246f, +-0.546503f,0.805165f,0.230312f, +-0.590616f,0.793807f,0.145063f, +-0.541291f,0.82267f,0.173836f, +-0.431572f,0.851071f,0.299038f, +-0.381298f,0.858781f,0.342208f, +-0.443875f,0.85724f,0.260987f, +0.118157f,0.850415f,-0.512673f, +0.134653f,0.857894f,-0.49587f, +0.229214f,0.896945f,-0.378087f, +0.208074f,0.910502f,-0.35734f, +0.182505f,0.899208f,-0.397639f, +0.219865f,0.895989f,-0.385828f, +0.451196f,0.865461f,-0.217713f, +0.490084f,0.844039f,-0.217752f, +0.378309f,0.899823f,-0.217259f, +0.231483f,0.942802f,-0.239876f, +0.0439163f,0.94313f,-0.329511f, +0.0365981f,0.93055f,-0.364332f, +0.0406622f,0.963235f,-0.265566f, +-0.0474005f,0.988537f,-0.143342f, +-0.135564f,0.953464f,-0.269312f, +-0.0159099f,0.95648f,-0.291363f, +6.71815e-006f,0.933398f,-0.358843f, +-0.0477574f,0.880875f,-0.470933f, +-0.0515582f,0.822668f,-0.56618f, +0.00280332f,0.78244f,-0.62272f, +0.0365076f,0.790824f,-0.610954f, +0.0809221f,0.832084f,-0.548715f, +0.112086f,0.801748f,-0.587057f, +0.219407f,0.814817f,-0.536594f, +0.31647f,0.811557f,-0.491143f, +0.326532f,0.816359f,-0.476376f, +0.0311646f,0.874097f,-0.484751f, +-0.166146f,0.898216f,-0.406943f, +-0.145486f,0.939877f,-0.308975f, +-0.113562f,0.952885f,-0.281273f, +0.0633693f,0.957888f,-0.280063f, +0.322061f,0.911056f,-0.257398f, +0.438519f,0.889327f,-0.12961f, +0.430695f,0.901938f,0.0317863f, +0.232727f,0.970972f,0.0552405f, +0.0388751f,0.995464f,-0.0868351f, +0.197289f,0.970749f,-0.136837f, +0.308804f,0.945817f,-0.100347f, +0.177873f,0.966831f,-0.183299f, +0.0327621f,0.970738f,-0.237896f, +0.244781f,0.968393f,-0.0479323f, +0.27827f,0.960269f,-0.0211936f, +0.355239f,0.931705f,0.0757045f, +0.555707f,0.816071f,0.158801f, +0.563884f,0.814994f,0.133487f, +0.420142f,0.89843f,0.127685f, +0.31027f,0.90429f,0.293243f, +0.233723f,0.926208f,0.295826f, +0.272016f,0.906457f,0.323021f, +0.267428f,0.881549f,0.389042f, +0.161017f,0.891985f,0.422417f, +0.0459966f,0.878435f,0.475642f, +-0.0917474f,0.877231f,0.47122f, +-0.0819927f,0.91503f,0.394964f, +0.108269f,0.907964f,0.40482f, +-0.16221f,0.904236f,0.395026f, +-0.422279f,0.840786f,0.338761f, +-0.374364f,0.835182f,0.402893f, +-0.384829f,0.826017f,0.411828f, +-0.512379f,0.829197f,0.223383f, +-0.585197f,0.801652f,0.122056f, +-0.526709f,0.831787f,0.175237f, +-0.374079f,0.907515f,0.191003f, +-0.329797f,0.931547f,0.153144f, +0.105779f,0.878895f,-0.465138f, +0.0405535f,0.897741f,-0.438654f, +0.106545f,0.927041f,-0.359504f, +0.255352f,0.917446f,-0.305103f, +0.298997f,0.88918f,-0.346352f, +0.205215f,0.859845f,-0.467497f, +0.304244f,0.842016f,-0.445471f, +0.435228f,0.863678f,-0.254238f, +0.39753f,0.896082f,-0.197502f, +0.268558f,0.910516f,-0.314385f, +0.0970216f,0.931439f,-0.350727f, +0.0336528f,0.944013f,-0.328188f, +-0.0988412f,0.948055f,-0.302362f, +-0.0597673f,0.966409f,-0.249964f, +0.0558923f,0.934228f,-0.352269f, +-0.00489276f,0.88655f,-0.462606f, +0.0451038f,0.899627f,-0.434323f, +0.0627933f,0.870215f,-0.488654f, +0.0536848f,0.846805f,-0.529187f, +0.0729181f,0.867797f,-0.491539f, +-0.0450251f,0.86132f,-0.506063f, +0.0321391f,0.857039f,-0.514249f, +0.105366f,0.853869f,-0.509711f, +0.20021f,0.860626f,-0.468229f, +0.336826f,0.823703f,-0.456137f, +0.291163f,0.890761f,-0.348954f, +-0.0337704f,0.937324f,-0.34682f, +-0.238938f,0.893089f,-0.381184f, +-0.1654f,0.905926f,-0.389797f, +-0.0746684f,0.904792f,-0.419256f, +0.0731105f,0.895556f,-0.438901f, +0.199233f,0.902713f,-0.381334f, +0.277877f,0.941082f,-0.192742f, +0.300522f,0.95354f,-0.0211427f, +0.316945f,0.945681f,0.0723468f, +0.218722f,0.970853f,-0.0980014f, +0.256356f,0.93882f,-0.229999f, +0.242436f,0.93442f,-0.26093f, +0.1983f,0.960329f,-0.196077f, +0.00223103f,0.977894f,-0.209089f, +0.104164f,0.98625f,-0.128296f, +0.285507f,0.957716f,-0.0355725f, +0.283907f,0.956269f,-0.0703361f, +0.529334f,0.848145f,0.0213636f, +0.533064f,0.836918f,0.124145f, +0.319483f,0.916151f,0.242069f, +0.17728f,0.930248f,0.321263f, +0.27524f,0.891192f,0.360581f, +0.317681f,0.901882f,0.292724f, +0.194688f,0.951543f,0.23804f, +0.108971f,0.911619f,0.396329f, +-0.0300123f,0.895185f,0.444683f, +-0.0818392f,0.875146f,0.476887f, +-0.0034355f,0.872809f,0.48805f, +0.0854438f,0.889906f,0.448069f, +-0.143928f,0.891079f,0.430422f, +-0.400827f,0.846578f,0.350204f, +-0.436121f,0.820693f,0.369135f, +-0.389169f,0.817738f,0.42409f, +-0.354493f,0.838309f,0.414212f, +-0.495629f,0.825913f,0.268736f, +-0.491187f,0.862049f,0.124928f, +-0.360891f,0.926358f,0.107794f, +-0.272797f,0.945677f,0.17685f, +-0.0230447f,0.8982f,-0.438983f, +-0.0253824f,0.922509f,-0.38514f, +0.0868314f,0.93389f,-0.346856f, +0.228815f,0.908408f,-0.349913f, +0.325232f,0.887343f,-0.326875f, +0.342601f,0.877959f,-0.334385f, +0.256841f,0.884237f,-0.390073f, +0.281416f,0.889548f,-0.359874f, +0.383834f,0.865745f,-0.321181f, +0.3194f,0.893039f,-0.316962f, +0.102059f,0.965529f,-0.239452f, +-0.0466698f,0.958891f,-0.279912f, +-0.0536344f,0.964707f,-0.257804f, +-0.0261637f,0.940106f,-0.339875f, +0.144391f,0.948897f,-0.280616f, +0.0981473f,0.936323f,-0.337144f, +0.012852f,0.869861f,-0.493129f, +0.144402f,0.872896f,-0.466049f, +-0.00636809f,0.871363f,-0.490597f, +-0.0613187f,0.915967f,-0.396541f, +0.0199429f,0.949099f,-0.314346f, +0.0355652f,0.92816f,-0.370479f, +0.140076f,0.947915f,-0.286071f, +0.222188f,0.910114f,-0.349749f, +0.215543f,0.917499f,-0.33427f, +0.183013f,0.971215f,-0.152469f, +0.0390344f,0.988083f,-0.14889f, +-0.127226f,0.955382f,-0.266569f, +-0.116102f,0.92344f,-0.365757f, +-0.0309649f,0.920225f,-0.390164f, +0.00625843f,0.924708f,-0.380627f, +0.101949f,0.952725f,-0.286221f, +0.10526f,0.958946f,-0.263332f, +0.1589f,0.975537f,-0.151918f, +0.291601f,0.956292f,-0.0217678f, +0.33385f,0.942155f,0.0297851f, +0.349208f,0.937042f,0.00260008f, +0.278057f,0.953965f,-0.112407f, +0.149531f,0.968881f,-0.197256f, +-0.00612536f,0.988275f,-0.152563f, +-0.00797921f,0.994274f,-0.106558f, +0.301027f,0.953574f,-0.00894642f, +0.304582f,0.944145f,-0.125778f, +0.403446f,0.913254f,-0.0565483f, +0.37426f,0.908704f,0.184893f, +0.255667f,0.895707f,0.363791f, +0.219787f,0.909558f,0.352701f, +0.267099f,0.929513f,0.254289f, +0.378434f,0.885367f,0.270025f, +0.147409f,0.95291f,0.265015f, +-0.0634097f,0.932842f,0.354663f, +-0.0326192f,0.907501f,0.418782f, +-0.118713f,0.911859f,0.392963f, +-0.0609125f,0.902157f,0.427087f, +0.138333f,0.871993f,0.469567f, +-0.0649916f,0.904886f,0.420664f, +-0.383734f,0.861279f,0.333085f, +-0.474942f,0.817835f,0.324924f, +-0.422908f,0.836367f,0.348768f, +-0.339416f,0.853379f,0.395651f, +-0.324702f,0.875389f,0.358137f, +-0.41353f,0.899847f,0.138815f, +-0.448451f,0.884614f,0.12787f, +-0.414049f,0.866279f,0.279505f, +0.070634f,0.912028f,-0.404001f, +-0.0676482f,0.885638f,-0.459422f, +0.0565435f,0.906984f,-0.417353f, +0.246119f,0.879096f,-0.408185f, +0.292529f,0.859337f,-0.419485f, +0.280896f,0.904751f,-0.320192f, +0.320721f,0.917291f,-0.23604f, +0.350916f,0.874365f,-0.335178f, +0.376904f,0.866371f,-0.327636f, +0.17512f,0.962866f,-0.205478f, +0.0176642f,0.987314f,-0.157793f, +0.0227212f,0.982851f,-0.182998f, +0.0272561f,0.971904f,-0.233795f, +-0.0877209f,0.950392f,-0.298429f, +0.0166276f,0.994097f,-0.107211f, +0.266845f,0.962366f,-0.0514236f, +0.216132f,0.934464f,-0.282956f, +0.0993362f,0.906446f,-0.410472f, +-0.0104212f,0.924877f,-0.380123f, +-0.166185f,0.907878f,-0.384889f, +-0.0197905f,0.953108f,-0.301983f, +-0.0183125f,0.962192f,-0.271757f, +0.0845408f,0.976284f,-0.199307f, +0.269635f,0.943751f,-0.191394f, +0.189274f,0.968047f,-0.164501f, +0.102539f,0.979864f,-0.171327f, +0.106979f,0.970988f,-0.213865f, +-0.0373949f,0.962501f,-0.268688f, +-0.0919497f,0.957563f,-0.273163f, +-0.0692205f,0.979823f,-0.187497f, +-0.0661107f,0.993399f,-0.093741f, +0.0537161f,0.998551f,0.00311785f, +0.163558f,0.98647f,-0.0111964f, +0.128373f,0.980868f,-0.146347f, +0.126964f,0.974881f,-0.182993f, +0.228868f,0.973261f,0.0195364f, +0.336464f,0.933228f,0.126005f, +0.409696f,0.899435f,0.152205f, +0.227221f,0.973118f,0.0375761f, +-0.0400449f,0.999001f,-0.0198394f, +-0.0832424f,0.995769f,-0.0389306f, +0.262425f,0.963268f,0.0569854f, +0.380638f,0.919787f,0.0954299f, +0.267185f,0.959941f,0.0844166f, +0.200067f,0.945675f,0.256267f, +0.180437f,0.922348f,0.341639f, +0.274022f,0.906356f,0.321607f, +0.375587f,0.88639f,0.270641f, +0.289567f,0.933145f,0.213051f, +0.118001f,0.9078f,0.402461f, +-0.100351f,0.886215f,0.452275f, +-0.0321373f,0.879207f,0.475355f, +-0.064732f,0.903306f,0.424085f, +-0.117284f,0.933968f,0.337563f, +0.107835f,0.909874f,0.400625f, +-0.00684675f,0.915037f,0.403311f, +-0.3665f,0.879987f,0.302161f, +-0.484488f,0.825175f,0.290444f, +-0.455029f,0.825809f,0.33315f, +-0.355514f,0.861697f,0.362061f, +-0.249905f,0.90704f,0.338859f, +-0.283441f,0.915216f,0.286426f, +-0.489082f,0.840765f,0.232193f, +-0.566036f,0.779585f,0.26805f, +0.300059f,0.882066f,-0.363212f, +0.0511478f,0.860745f,-0.506461f, +0.0202137f,0.82997f,-0.557442f, +0.244641f,0.828925f,-0.503024f, +0.229733f,0.86489f,-0.446306f, +0.151553f,0.888421f,-0.433289f, +0.276054f,0.875076f,-0.397538f, +0.35746f,0.874812f,-0.326997f, +0.20869f,0.962246f,-0.174729f, +0.135202f,0.98952f,0.050694f, +0.0768682f,0.997036f,0.00329808f, +0.0854955f,0.992826f,-0.08359f, +0.0751533f,0.982531f,-0.170249f, +-0.0858423f,0.966447f,-0.242097f, +-0.101218f,0.962967f,-0.2499f, +0.245897f,0.943422f,-0.222463f, +0.411229f,0.896277f,-0.166064f, +0.160383f,0.921177f,-0.354556f, +0.0135902f,0.93936f,-0.342662f, +-0.185366f,0.907574f,-0.37676f, +-0.130182f,0.940725f,-0.313191f, +-0.0326676f,0.972591f,-0.230215f, +0.0675199f,0.972602f,-0.222457f, +0.233107f,0.94649f,-0.2232f, +0.212831f,0.95378f,-0.212148f, +0.167019f,0.9356f,-0.311059f, +0.16946f,0.90555f,-0.388925f, +-0.0763448f,0.914067f,-0.398312f, +-0.178349f,0.9565f,-0.230865f, +-0.221816f,0.964561f,-0.142896f, +-0.163528f,0.986246f,-0.0240246f, +-0.0459992f,0.998297f,0.0358721f, +0.192503f,0.971257f,0.140008f, +0.306262f,0.942491f,0.133843f, +0.166989f,0.985549f,-0.0284312f, +0.110164f,0.988175f,-0.106645f, +0.230491f,0.969982f,-0.0775155f, +0.320779f,0.937031f,0.138109f, +0.2844f,0.912116f,0.295231f, +0.0676957f,0.97278f,0.221621f, +-0.0445371f,0.996486f,0.0709375f, +0.140086f,0.988598f,0.0552233f, +0.294951f,0.934183f,0.200765f, +0.239076f,0.923996f,0.298453f, +0.115077f,0.947116f,0.299546f, +0.169084f,0.942486f,0.288323f, +0.304609f,0.90997f,0.281369f, +0.369662f,0.880322f,0.297294f, +0.206677f,0.906857f,0.36728f, +-0.0427609f,0.882729f,0.467933f, +-0.167345f,0.859324f,0.483279f, +-0.0302574f,0.860894f,0.507884f, +0.0910322f,0.886636f,0.453421f, +-0.0366606f,0.947171f,0.318627f, +0.025939f,0.94095f,0.337552f, +0.0591946f,0.91956f,0.388466f, +-0.284221f,0.911546f,0.297158f, +-0.532586f,0.813173f,0.234739f, +-0.487487f,0.825499f,0.284445f, +-0.31853f,0.893358f,0.316938f, +-0.238637f,0.92505f,0.295524f, +-0.265409f,0.911937f,0.312937f, +-0.505062f,0.827653f,0.244749f, +-0.589625f,0.757122f,0.281262f, +0.260545f,0.875981f,-0.405923f, +0.198469f,0.90372f,-0.379342f, +0.0608985f,0.867502f,-0.493691f, +0.108599f,0.877043f,-0.467977f, +0.149016f,0.918586f,-0.366053f, +0.269933f,0.909568f,-0.315946f, +0.225091f,0.894351f,-0.386613f, +0.14483f,0.975181f,-0.16747f, +0.0237141f,0.999718f,0.00125985f, +0.0312597f,0.997955f,0.0557504f, +0.105656f,0.993029f,0.0522575f, +0.205288f,0.977382f,0.0508146f, +0.175007f,0.977751f,-0.115656f, +0.0411408f,0.976103f,-0.213378f, +-0.0123853f,0.935985f,-0.351821f, +0.185506f,0.902134f,-0.38954f, +0.361594f,0.882471f,-0.300824f, +0.229178f,0.926898f,-0.297216f, +-0.016076f,0.953923f,-0.299621f, +-0.176229f,0.940869f,-0.289326f, +-0.197595f,0.933757f,-0.298419f, +-0.0925101f,0.952321f,-0.290735f, +0.0363018f,0.966473f,-0.254189f, +0.27059f,0.939141f,-0.211649f, +0.283887f,0.910685f,-0.300101f, +0.267987f,0.87929f,-0.39374f, +0.167837f,0.906306f,-0.387866f, +-0.162045f,0.958045f,-0.236411f, +-0.34242f,0.923851f,-0.171018f, +-0.280408f,0.954479f,-0.101693f, +-0.219474f,0.974995f,-0.0348799f, +-0.111179f,0.993643f,0.0176973f, +0.0791225f,0.990452f,0.112896f, +0.243665f,0.947394f,0.207537f, +0.282223f,0.914505f,0.289882f, +0.280685f,0.943977f,0.173563f, +0.165641f,0.985889f,-0.0242044f, +0.0702016f,0.994363f,0.0794649f, +0.118053f,0.960325f,0.252664f, +0.204772f,0.904931f,0.373051f, +0.0632983f,0.962848f,0.262521f, +0.122554f,0.958346f,0.257978f, +0.174517f,0.943136f,0.28291f, +0.181765f,0.923678f,0.337315f, +0.176745f,0.924152f,0.338681f, +0.201711f,0.945597f,0.255262f, +0.29766f,0.929054f,0.219676f, +0.268359f,0.928086f,0.258147f, +0.100906f,0.896734f,0.430912f, +-0.0388415f,0.876619f,0.479615f, +-0.130193f,0.899332f,0.417434f, +0.000668505f,0.914851f,0.403791f, +0.198601f,0.908384f,0.367961f, +0.0382447f,0.953766f,0.298106f, +-0.0134843f,0.968824f,0.247384f, +0.0247843f,0.964757f,0.261972f, +-0.214942f,0.928034f,0.304224f, +-0.51491f,0.834181f,0.197508f, +-0.514132f,0.845f,0.147116f, +-0.364403f,0.910649f,0.194754f, +-0.252308f,0.925047f,0.283953f, +-0.245043f,0.926077f,0.286941f, +-0.475784f,0.852889f,0.214964f, +-0.66621f,0.724577f,0.176499f, +0.0831836f,0.888999f,-0.45029f, +0.181271f,0.909397f,-0.374349f, +0.118635f,0.893305f,-0.433511f, +0.0803087f,0.896743f,-0.435204f, +0.0532614f,0.909245f,-0.41284f, +0.209897f,0.941844f,-0.262435f, +0.164344f,0.979747f,-0.114402f, +-0.0796744f,0.996148f,-0.0366233f, +-0.0133458f,0.996096f,0.0872637f, +0.0764545f,0.99532f,0.0590999f, +0.136206f,0.990597f,0.0128964f, +0.22076f,0.975032f,-0.0240476f, +0.302428f,0.952936f,-0.021205f, +0.123508f,0.990766f,-0.0559322f, +0.0598433f,0.996046f,-0.06566f, +0.217088f,0.972764f,-0.0812636f, +0.324106f,0.93941f,-0.111642f, +0.231973f,0.969426f,-0.0800149f, +-0.0239272f,0.988929f,-0.146448f, +-0.168479f,0.969286f,-0.179165f, +-0.198758f,0.9628f,-0.183064f, +-0.0847832f,0.988177f,-0.12774f, +-0.00304443f,0.993662f,-0.112364f, +0.297886f,0.949812f,-0.0955022f, +0.392699f,0.900627f,-0.186169f, +0.309254f,0.921444f,-0.235165f, +-0.0368216f,0.992281f,-0.118418f, +-0.30784f,0.939111f,0.152661f, +-0.339391f,0.929078f,0.147065f, +-0.31987f,0.942094f,0.100706f, +-0.261939f,0.955297f,0.137099f, +-0.18149f,0.977639f,0.106224f, +-0.0176854f,0.987381f,0.157371f, +0.134774f,0.952305f,0.273773f, +0.227558f,0.898637f,0.375058f, +0.367312f,0.872839f,0.3213f, +0.289472f,0.940027f,0.180432f, +0.0121921f,0.995617f,0.0927227f, +-0.0151053f,0.984704f,0.173582f, +0.12465f,0.941586f,0.312855f, +0.123765f,0.936041f,0.329407f, +0.0496474f,0.956015f,0.289087f, +0.155803f,0.919433f,0.361065f, +0.180039f,0.912678f,0.366885f, +0.192318f,0.910529f,0.365993f, +0.269572f,0.892548f,0.361509f, +0.331198f,0.898525f,0.288029f, +0.198758f,0.948186f,0.247866f, +-0.0345441f,0.951973f,0.304226f, +-0.0327497f,0.929484f,0.367404f, +-0.0643392f,0.937143f,0.342962f, +0.00774044f,0.965859f,0.258952f, +0.179174f,0.948429f,0.261495f, +0.132443f,0.935778f,0.32677f, +0.0607758f,0.973146f,0.222018f, +-0.0289622f,0.977742f,0.2078f, +-0.247283f,0.928769f,0.276114f, +-0.440694f,0.866976f,0.232681f, +-0.493254f,0.853754f,0.166745f, +-0.437376f,0.881741f,0.176734f, +-0.303558f,0.920161f,0.247297f, +-0.230002f,0.942128f,0.243914f, +-0.435382f,0.879414f,0.192544f, +-0.672886f,0.738322f,0.045878f, +0.0719528f,0.93004f,-0.360345f, +0.170321f,0.920666f,-0.351232f, +0.181011f,0.922477f,-0.340985f, +0.0828362f,0.939404f,-0.332654f, +-0.0227994f,0.947238f,-0.31972f, +-0.0485785f,0.963562f,-0.263036f, +0.0586424f,0.995988f,-0.0676002f, +-0.0660447f,0.996659f,-0.0480482f, +-0.0602898f,0.992772f,-0.103773f, +0.058767f,0.996066f,-0.0663303f, +0.189158f,0.981943f,0.00282556f, +0.237805f,0.968932f,-0.0679702f, +0.226076f,0.973949f,-0.0176966f, +0.0903031f,0.990597f,0.102775f, +0.00876316f,0.995102f,0.0984623f, +0.239141f,0.958139f,0.157419f, +0.358816f,0.926379f,0.11434f, +0.290281f,0.955997f,0.0425008f, +0.0827916f,0.995067f,-0.054651f, +-0.14974f,0.985436f,-0.0805802f, +-0.250148f,0.9681f,-0.0144092f, +-0.190918f,0.980525f,0.0460446f, +0.000678111f,0.99542f,0.0955933f, +0.316233f,0.948486f,0.019255f, +0.451155f,0.892443f,0.00187563f, +0.20864f,0.975493f,0.0698802f, +-0.187263f,0.946264f,0.263661f, +-0.412354f,0.843904f,0.343207f, +-0.267988f,0.899756f,0.344414f, +-0.237384f,0.936767f,0.25713f, +-0.24929f,0.96341f,0.0984657f, +-0.12508f,0.979898f,0.155419f, +-0.075281f,0.975532f,0.206567f, +-0.0362475f,0.956877f,0.288223f, +0.179598f,0.903623f,0.388856f, +0.452503f,0.830262f,0.325433f, +0.44384f,0.859576f,0.253251f, +0.0283124f,0.992393f,0.119807f, +-0.131018f,0.979645f,0.152082f, +-0.0108162f,0.971878f,0.235238f, +0.177243f,0.920605f,0.347953f, +0.0690998f,0.954542f,0.289956f, +0.0964158f,0.939858f,0.327675f, +0.141817f,0.921257f,0.362178f, +0.189018f,0.897606f,0.398216f, +0.266469f,0.899974f,0.345024f, +0.359545f,0.871551f,0.333357f, +0.237931f,0.897592f,0.371104f, +-0.0217966f,0.934365f,0.355651f, +-0.0978092f,0.948287f,0.30197f, +0.00875447f,0.940305f,0.340221f, +0.0870369f,0.963741f,0.252246f, +0.143744f,0.964801f,0.220218f, +0.0987042f,0.960888f,0.25875f, +0.124661f,0.953903f,0.273f, +-0.0397023f,0.970451f,0.238011f, +-0.294392f,0.938787f,0.17892f, +-0.415783f,0.892445f,0.175119f, +-0.502145f,0.854833f,0.130809f, +-0.438287f,0.876552f,0.198899f, +-0.315043f,0.920499f,0.231147f, +-0.194294f,0.951114f,0.240065f, +-0.351808f,0.923717f,0.151587f, +-0.54821f,0.835857f,0.0284484f, +0.0750917f,0.989867f,-0.120519f, +0.16891f,0.981624f,-0.0887941f, +0.190217f,0.976992f,-0.0964579f, +0.031324f,0.983953f,-0.175657f, +-0.0605958f,0.993695f,-0.0943344f, +-0.0750681f,0.99685f,-0.025582f, +-0.0331924f,0.999431f,-0.00606515f, +-0.0198899f,0.99954f,0.0228873f, +-0.0160511f,0.998799f,-0.0462827f, +0.0298246f,0.995221f,-0.092978f, +0.113995f,0.985706f,-0.124048f, +0.249662f,0.968309f,-0.00683024f, +0.100872f,0.992347f,0.0712218f, +0.0920036f,0.982533f,0.161755f, +0.0527146f,0.998589f,-0.00636128f, +0.182827f,0.9816f,-0.0550969f, +0.393766f,0.919069f,-0.0161334f, +0.337394f,0.941358f,0.00313128f, +0.105574f,0.990777f,0.0849468f, +-0.199161f,0.971911f,0.125398f, +-0.309481f,0.93868f,0.151989f, +-0.20903f,0.965522f,0.15516f, +0.0624223f,0.987754f,0.142987f, +0.384312f,0.922399f,0.0385395f, +0.395292f,0.916973f,0.0539f, +-0.00445825f,0.983693f,0.179798f, +-0.32103f,0.866957f,0.381215f, +-0.378167f,0.863609f,0.33342f, +-0.220175f,0.926633f,0.304752f, +-0.0614943f,0.950074f,0.305906f, +-0.12116f,0.98024f,0.156364f, +-0.278268f,0.956461f,0.0880323f, +-0.168756f,0.960122f,0.222908f, +-0.0650574f,0.977781f,0.199281f, +0.11325f,0.979757f,0.165078f, +0.469769f,0.846474f,0.250598f, +0.492575f,0.830428f,0.260305f, +0.123756f,0.962501f,0.241404f, +-0.13585f,0.964887f,0.224807f, +-0.0763658f,0.97309f,0.217403f, +0.0878568f,0.965257f,0.246088f, +0.105594f,0.951417f,0.289233f, +0.0757959f,0.967864f,0.239781f, +0.0993833f,0.975608f,0.195732f, +0.186309f,0.954458f,0.23302f, +0.338273f,0.909543f,0.241458f, +0.326788f,0.907649f,0.263405f, +0.193788f,0.920444f,0.339454f, +0.0304147f,0.954662f,0.296135f, +-0.0232537f,0.980981f,0.192706f, +0.000389577f,0.986091f,0.166207f, +0.0882095f,0.967853f,0.235542f, +0.188357f,0.927906f,0.321731f, +0.0670292f,0.972109f,0.224745f, +0.0943312f,0.961869f,0.256728f, +0.0613113f,0.959756f,0.274061f, +-0.207348f,0.967924f,0.141881f, +-0.415608f,0.907723f,0.0575284f, +-0.500123f,0.863342f,0.0672098f, +-0.492039f,0.866172f,0.0874256f, +-0.354073f,0.931677f,0.0813054f, +-0.181316f,0.978479f,0.0985071f, +-0.266622f,0.956284f,0.120138f, +-0.442863f,0.891447f,0.0958846f, +-0.0871303f,0.98944f,-0.115829f, +0.0906659f,0.9958f,-0.0127409f, +0.283182f,0.958456f,0.0342056f, +0.0813038f,0.994836f,-0.0607581f, +-0.14732f,0.989082f,0.00362058f, +-0.15085f,0.987502f,0.0456442f, +-0.0204288f,0.99901f,0.039516f, +0.00607957f,0.996993f,-0.0772516f, +0.0245166f,0.989435f,-0.142892f, +0.112542f,0.984768f,-0.132539f, +0.117701f,0.980135f,-0.159633f, +0.0712861f,0.996099f,-0.0520052f, +0.0255235f,0.995475f,0.0915291f, +0.102558f,0.988742f,0.10895f, +0.263691f,0.960156f,0.0925667f, +0.248163f,0.965214f,-0.0823197f, +0.340591f,0.934756f,-0.101139f, +0.19652f,0.980248f,0.0222232f, +-0.0707824f,0.98306f,0.169067f, +-0.214629f,0.938414f,0.270766f, +-0.253216f,0.94197f,0.220395f, +-0.140751f,0.981088f,0.132876f, +0.0855474f,0.99626f,0.0121329f, +0.407822f,0.912623f,0.0283097f, +0.314806f,0.941456f,0.120654f, +-0.127318f,0.956166f,0.263699f, +-0.403379f,0.856412f,0.322248f, +-0.326125f,0.89105f,0.315709f, +-0.192548f,0.934549f,0.29924f, +-0.115959f,0.956033f,0.26936f, +-0.0455884f,0.940005f,0.3381f, +-0.221624f,0.931041f,0.289905f, +-0.142796f,0.963558f,0.226198f, +0.0818112f,0.991531f,0.100865f, +0.115133f,0.989689f,-0.0852087f, +0.362891f,0.931224f,-0.0336289f, +0.464909f,0.869676f,0.1659f, +0.12135f,0.938462f,0.323362f, +-0.154102f,0.92745f,0.340718f, +-0.00840056f,0.94535f,0.325948f, +0.0978542f,0.97811f,0.183647f, +0.11792f,0.982347f,0.145222f, +0.146369f,0.980631f,0.130149f, +0.169334f,0.978423f,0.118383f, +0.164013f,0.985699f,0.0386944f, +0.265906f,0.961228f,0.0730397f, +0.245913f,0.944548f,0.217615f, +0.193695f,0.94265f,0.271832f, +0.193351f,0.95598f,0.22072f, +0.0582845f,0.995708f,0.0718875f, +-0.00685416f,0.998237f,0.0589609f, +-0.0637908f,0.997757f,0.0202719f, +0.11477f,0.985697f,0.123411f, +0.150647f,0.970382f,0.188848f, +0.0830539f,0.976206f,0.200309f, +0.0503424f,0.976583f,0.20917f, +-0.0756986f,0.967299f,0.242081f, +-0.38538f,0.913963f,0.127097f, +-0.499709f,0.856093f,0.131896f, +-0.457912f,0.888414f,0.0322019f, +-0.285439f,0.956482f,-0.0605596f, +-0.224005f,0.968049f,-0.112706f, +-0.33892f,0.940492f,-0.0246551f, +-0.468811f,0.882994f,0.0231736f, +-0.219323f,0.927554f,-0.302556f, +0.0032435f,0.972826f,-0.231515f, +0.227016f,0.959392f,-0.167423f, +0.0751831f,0.995555f,-0.0567285f, +-0.21163f,0.975526f,-0.0596754f, +-0.120787f,0.989714f,-0.0766664f, +0.103292f,0.984862f,-0.139202f, +0.130327f,0.957045f,-0.258998f, +0.100597f,0.957666f,-0.269734f, +0.0434385f,0.943793f,-0.327671f, +-0.00659457f,0.974177f,-0.225689f, +-0.0387678f,0.996731f,-0.0708824f, +0.0108947f,0.998722f,-0.049343f, +0.045379f,0.994354f,-0.0959194f, +0.256328f,0.966322f,0.0227405f, +0.338426f,0.940797f,0.0191927f, +0.245639f,0.967185f,0.0649251f, +0.104201f,0.958601f,0.265004f, +-0.106481f,0.952706f,0.284628f, +-0.229215f,0.947098f,0.224647f, +-0.194403f,0.966329f,0.168569f, +-0.00252669f,0.996043f,0.0888332f, +0.156392f,0.987666f,-0.00755935f, +0.321695f,0.943636f,0.0778705f, +0.130492f,0.960095f,0.247363f, +-0.218806f,0.887212f,0.406175f, +-0.387978f,0.851763f,0.352097f, +-0.317465f,0.905687f,0.280974f, +-0.175202f,0.945708f,0.273753f, +-0.0852507f,0.952748f,0.291554f, +-0.110501f,0.951599f,0.28679f, +-0.162568f,0.933525f,0.319534f, +-0.0379096f,0.973407f,0.225923f, +0.243134f,0.964593f,0.102203f, +0.236277f,0.971524f,-0.017745f, +0.298887f,0.954255f,-0.00800205f, +0.225509f,0.966982f,0.118704f, +-0.0160588f,0.939828f,0.341271f, +-0.127862f,0.916925f,0.378021f, +0.078893f,0.93958f,0.333116f, +0.244086f,0.933689f,0.262004f, +0.186692f,0.967385f,0.17121f, +0.108188f,0.990525f,0.0845894f, +0.174941f,0.977766f,0.115627f, +0.231991f,0.970242f,0.0693606f, +0.186114f,0.981267f,0.0497696f, +0.166608f,0.977012f,0.133002f, +0.191728f,0.971565f,0.138929f, +0.25765f,0.957218f,0.131718f, +0.087274f,0.989729f,0.113225f, +-0.00280678f,0.977756f,0.209725f, +0.0607703f,0.980671f,0.185986f, +0.0485237f,0.997381f,0.053629f, +0.0587736f,0.987863f,0.14378f, +0.0482407f,0.976088f,0.211956f, +0.0134663f,0.978159f,0.20742f, +-0.112292f,0.962623f,0.246469f, +-0.319272f,0.919627f,0.228803f, +-0.453582f,0.883075f,0.120176f, +-0.338159f,0.939324f,0.0576029f, +-0.23768f,0.971299f,-0.0092623f, +-0.191895f,0.980604f,-0.0399f, +-0.401044f,0.906011f,-0.135303f, +-0.489506f,0.868205f,-0.081269f, +-0.196977f,0.901169f,-0.386128f, +-0.0562291f,0.922285f,-0.382399f, +0.0867548f,0.952728f,-0.291176f, +0.0232316f,0.988917f,-0.146644f, +-0.11605f,0.968007f,-0.222475f, +-0.0789033f,0.942785f,-0.323929f, +0.139529f,0.948189f,-0.285427f, +0.132434f,0.962288f,-0.23762f, +0.0765905f,0.96807f,-0.238692f, +0.0641003f,0.96574f,-0.251472f, +-0.105766f,0.965216f,-0.239106f, +-0.110895f,0.972771f,-0.203515f, +0.0206339f,0.984024f,-0.176838f, +0.0647147f,0.988173f,-0.139018f, +0.148599f,0.980872f,-0.125734f, +0.271512f,0.961735f,0.0367049f, +0.0561912f,0.976773f,0.206777f, +-0.0583132f,0.913697f,0.402191f, +-0.0462589f,0.893353f,0.446968f, +-0.125152f,0.910112f,0.39501f, +-0.0803843f,0.940756f,0.329418f, +0.0619859f,0.973174f,0.221562f, +0.135828f,0.971328f,0.195124f, +0.132962f,0.954202f,0.267992f, +-0.0325488f,0.903596f,0.427147f, +-0.270164f,0.841605f,0.467668f, +-0.262238f,0.850223f,0.456456f, +-0.212116f,0.889937f,0.403757f, +-0.177521f,0.909486f,0.375929f, +-0.116828f,0.901627f,0.416436f, +-0.0747169f,0.915103f,0.396238f, +-0.119776f,0.962629f,0.242896f, +0.0380452f,0.99097f,0.128572f, +0.304108f,0.937317f,0.17016f, +0.240764f,0.951762f,0.190215f, +0.194326f,0.952804f,0.233243f, +0.142453f,0.936947f,0.31912f, +-0.0935081f,0.945618f,0.31155f, +-0.0887705f,0.956167f,0.27904f, +0.107828f,0.967058f,0.230592f, +0.241042f,0.935322f,0.258984f, +0.259409f,0.922717f,0.285133f, +0.218487f,0.962504f,0.160778f, +0.220571f,0.975062f,0.0245473f, +0.235132f,0.971421f,-0.0324531f, +0.193322f,0.980828f,0.0245576f, +0.123827f,0.992302f,-0.00201728f, +0.206505f,0.97706f,0.0520531f, +0.250594f,0.965023f,0.0770254f, +0.0246334f,0.99033f,0.136524f, +-0.123437f,0.964871f,0.231923f, +0.10276f,0.956911f,0.271591f, +0.090829f,0.970486f,0.223397f, +0.00393218f,0.964068f,0.265627f, +0.045739f,0.962581f,0.267105f, +0.0438394f,0.968724f,0.244235f, +-0.1348f,0.971521f,0.194876f, +-0.247965f,0.950768f,0.185883f, +-0.385563f,0.920067f,0.0694089f, +-0.33646f,0.941527f,0.0179056f, +-0.284408f,0.957673f,0.0444463f, +-0.0809611f,0.98246f,0.167982f, +-0.272195f,0.961849f,0.0275091f, +-0.538305f,0.840251f,-0.0648443f, +-0.138085f,0.947265f,-0.289173f, +-0.112292f,0.943405f,-0.312055f, +-0.0366032f,0.968339f,-0.246942f, +-0.0207584f,0.978499f,-0.205204f, +-0.0114432f,0.978269f,-0.207024f, +-0.017206f,0.978017f,-0.207814f, +-0.00196221f,0.968739f,-0.248075f, +0.111459f,0.982805f,-0.147209f, +0.0917515f,0.980196f,-0.175495f, +0.0783409f,0.987595f,-0.136083f, +-0.0849004f,0.981698f,-0.170473f, +-0.0826208f,0.969176f,-0.232103f, +-0.0513296f,0.962825f,-0.265205f, +-0.0169212f,0.988046f,-0.153227f, +0.0442536f,0.99886f,0.017891f, +0.0803284f,0.974024f,0.211719f, +-0.118041f,0.942704f,0.312052f, +-0.187621f,0.893485f,0.408023f, +-0.0735772f,0.857937f,0.508459f, +-0.0838693f,0.837024f,0.5407f, +-0.00356882f,0.863268f,0.504733f, +0.117551f,0.889838f,0.440874f, +0.141271f,0.893306f,0.426669f, +0.0270129f,0.906148f,0.422097f, +-0.109486f,0.851548f,0.512717f, +-0.266831f,0.814637f,0.514944f, +-0.253628f,0.788787f,0.559899f, +-0.216685f,0.776961f,0.591083f, +-0.15137f,0.760068f,0.631968f, +-0.119157f,0.801398f,0.586143f, +0.0626697f,0.817134f,0.573031f, +0.150716f,0.886392f,0.437714f, +0.0719955f,0.965525f,0.250157f, +0.170594f,0.93758f,0.303054f, +0.205981f,0.906978f,0.367374f, +0.159242f,0.93166f,0.326575f, +0.163686f,0.939188f,0.301881f, +0.00255834f,0.983457f,0.181126f, +-0.0246414f,0.997684f,0.063397f, +0.103068f,0.994148f,0.0323463f, +0.175261f,0.977189f,0.119941f, +0.238397f,0.946614f,0.216998f, +0.376211f,0.893689f,0.244508f, +0.336321f,0.93903f,0.0714918f, +0.22632f,0.974025f,-0.00733613f, +0.155366f,0.98668f,0.0481989f, +0.129371f,0.988467f,0.0787169f, +0.140766f,0.985457f,0.095182f, +0.181141f,0.974304f,0.133867f, +-0.0259321f,0.983166f,0.180868f, +-0.16382f,0.974748f,0.151756f, +0.12842f,0.977623f,0.166619f, +0.102805f,0.986615f,0.12658f, +-0.0352231f,0.991461f,0.125559f, +0.0344472f,0.990276f,0.134782f, +0.100258f,0.97877f,0.178768f, +-0.0763414f,0.992566f,0.0947915f, +-0.24142f,0.968616f,0.059149f, +-0.325267f,0.943242f,0.06705f, +-0.302069f,0.9528f,0.0304413f, +-0.317187f,0.948361f,-0.0017587f, +-0.219267f,0.973832f,0.059775f, +-0.187608f,0.954493f,0.231832f, +-0.46452f,0.867868f,0.176143f, +-0.203418f,0.948131f,-0.244273f, +-0.139664f,0.973265f,-0.182342f, +-0.0536959f,0.988785f,-0.139361f, +-0.00355604f,0.986781f,-0.162022f, +-0.0572809f,0.980561f,-0.187669f, +-0.0374007f,0.985205f,-0.167247f, +0.0555765f,0.976159f,-0.209822f, +0.0908927f,0.962348f,-0.256173f, +0.0600715f,0.972748f,-0.223946f, +0.0442581f,0.987652f,-0.150282f, +-0.0260568f,0.986636f,-0.160841f, +-0.0937884f,0.986183f,-0.136552f, +-0.00585357f,0.999959f,-0.00691373f, +-0.168872f,0.982349f,-0.0804476f, +-0.215485f,0.975309f,0.0483622f, +-0.0961691f,0.964354f,0.246521f, +-0.114487f,0.922048f,0.369757f, +-0.269656f,0.899414f,0.344007f, +-0.21772f,0.897789f,0.382849f, +-0.126818f,0.886934f,0.444145f, +0.0624514f,0.872607f,0.484415f, +0.170504f,0.863439f,0.474764f, +0.127681f,0.882519f,0.452612f, +0.0249418f,0.887332f,0.460457f, +-0.228952f,0.87943f,0.417354f, +-0.336679f,0.801754f,0.493799f, +-0.354676f,0.742594f,0.568119f, +-0.265358f,0.728648f,0.631393f, +-0.0874663f,0.774696f,0.626255f, +0.0313715f,0.816845f,0.576004f, +0.138491f,0.877406f,0.459325f, +0.251487f,0.873743f,0.416325f, +0.149012f,0.891076f,0.428695f, +0.134082f,0.895567f,0.424244f, +0.259356f,0.879751f,0.398462f, +0.273738f,0.923515f,0.268677f, +0.242075f,0.954352f,0.174962f, +0.166067f,0.977105f,0.132992f, +0.0519593f,0.998404f,0.022142f, +0.0706628f,0.997395f,0.0145074f, +0.0910476f,0.994722f,0.0473141f, +0.126598f,0.990827f,0.0472679f, +0.33108f,0.937289f,0.108974f, +0.427456f,0.888646f,0.166103f, +0.265492f,0.95292f,0.14648f, +0.0868945f,0.990384f,0.10765f, +0.0739344f,0.98242f,0.171417f, +0.14882f,0.964095f,0.219937f, +0.160065f,0.969614f,0.185009f, +0.0379065f,0.980794f,0.191328f, +-0.111879f,0.992654f,0.0460448f, +0.101571f,0.994616f,0.0205655f, +0.134276f,0.987226f,0.0857599f, +0.00322228f,0.996946f,0.0780295f, +-0.00585508f,0.99961f,0.0273218f, +0.102527f,0.992913f,0.0601057f, +-0.0243337f,0.999696f,0.00385478f, +-0.236106f,0.971591f,0.0163038f, +-0.335881f,0.941896f,0.00400261f, +-0.319925f,0.947097f,0.0255887f, +-0.262465f,0.960477f,0.0927118f, +-0.320184f,0.947305f,-0.00973767f, +-0.358146f,0.929034f,0.0928862f, +-0.431591f,0.882961f,0.184686f, +-0.350194f,0.913588f,-0.20669f, +-0.241714f,0.958821f,-0.149118f, +-0.0874799f,0.991928f,-0.0917931f, +-0.00637736f,0.998289f,-0.0581162f, +0.0261719f,0.997729f,-0.0620574f, +0.00430678f,0.979141f,-0.203135f, +0.121705f,0.971178f,-0.20494f, +0.10219f,0.965909f,-0.237861f, +0.00407698f,0.957171f,-0.289495f, +-0.0386862f,0.968014f,-0.247897f, +-0.0509849f,0.995926f,-0.0743816f, +-0.228245f,0.973592f,-0.00474817f, +-0.140696f,0.979081f,0.146984f, +-0.104046f,0.966867f,0.233113f, +-0.254332f,0.94315f,0.213969f, +-0.211685f,0.953746f,0.213442f, +-0.245201f,0.93619f,0.251844f, +-0.247199f,0.912647f,0.325527f, +-0.213426f,0.932543f,0.291228f, +-0.170741f,0.942588f,0.28701f, +-0.0363946f,0.943193f,0.330245f, +0.169433f,0.88607f,0.431478f, +0.12169f,0.89261f,0.434096f, +0.0508642f,0.869951f,0.490509f, +-0.175065f,0.875657f,0.450086f, +-0.464211f,0.815419f,0.345833f, +-0.467728f,0.796275f,0.383635f, +-0.295863f,0.865688f,0.403795f, +-0.0706376f,0.91172f,0.404693f, +0.151265f,0.880258f,0.449738f, +0.239887f,0.896678f,0.372052f, +0.270966f,0.902061f,0.335952f, +0.133682f,0.938928f,0.317085f, +0.132181f,0.949509f,0.284538f, +0.337234f,0.911457f,0.235624f, +0.391568f,0.908725f,0.144547f, +0.297707f,0.949115f,0.10272f, +0.163642f,0.985787f,0.038011f, +0.0603665f,0.994817f,0.0818182f, +0.0342529f,0.984393f,0.172617f, +0.146f,0.969394f,0.197379f, +0.189586f,0.979398f,0.0695505f, +0.32179f,0.946595f,0.0202369f, +0.339913f,0.938655f,0.0581868f, +0.255631f,0.940824f,0.222493f, +0.130905f,0.959362f,0.249975f, +0.0245005f,0.97884f,0.203155f, +0.116898f,0.96642f,0.228839f, +0.217161f,0.952887f,0.211771f, +0.0905814f,0.991503f,0.0933592f, +0.00963547f,0.999795f,0.0178162f, +0.0707892f,0.997359f,-0.0162393f, +0.0454623f,0.996335f,0.0724521f, +0.025845f,0.99119f,0.129903f, +0.0553395f,0.998031f,0.0295398f, +0.0632528f,0.997901f,0.0138837f, +-0.000723073f,0.987186f,0.159572f, +-0.246121f,0.956173f,0.158611f, +-0.292993f,0.948379f,0.121377f, +-0.358856f,0.933219f,0.0180357f, +-0.312153f,0.948631f,0.0515794f, +-0.263061f,0.955548f,0.133141f, +-0.387996f,0.907685f,0.159898f, +-0.516559f,0.845117f,0.137638f, +-0.310178f,0.948377f,-0.0661154f, +-0.300026f,0.949757f,-0.0891454f, +-0.137668f,0.990363f,0.0151269f, +-0.0326899f,0.997118f,0.0684562f, +0.0835016f,0.994462f,0.0638203f, +0.0992766f,0.995028f,0.00796582f, +0.068628f,0.997514f,-0.0159775f, +0.181484f,0.983266f,0.0158879f, +0.0929905f,0.991619f,-0.0896955f, +-0.159863f,0.9831f,-0.0892104f, +-0.274969f,0.956779f,0.094689f, +-0.2578f,0.933703f,0.248472f, +-0.255563f,0.934109f,0.249254f, +-0.183445f,0.905456f,0.382751f, +-0.258353f,0.860148f,0.439771f, +-0.12588f,0.873686f,0.469923f, +-0.210169f,0.916013f,0.341684f, +-0.272883f,0.91339f,0.302083f, +-0.180317f,0.937251f,0.298406f, +-0.199625f,0.942232f,0.268977f, +-0.0859427f,0.9396f,0.33131f, +0.0831524f,0.928739f,0.361288f, +0.0997333f,0.904186f,0.415333f, +-0.0517762f,0.893569f,0.445931f, +-0.109718f,0.87826f,0.465426f, +-0.369685f,0.848108f,0.379534f, +-0.446603f,0.811841f,0.376112f, +-0.267849f,0.883969f,0.383218f, +-0.10672f,0.930725f,0.349801f, +0.10205f,0.92892f,0.355941f, +0.253281f,0.903219f,0.346475f, +0.270898f,0.880967f,0.387957f, +0.236849f,0.896348f,0.374784f, +0.206634f,0.946539f,0.247723f, +0.405577f,0.89206f,0.199342f, +0.379351f,0.915673f,0.1328f, +0.334598f,0.922412f,0.192872f, +0.211991f,0.969195f,0.125385f, +-0.0201216f,0.993487f,0.112152f, +-0.0648495f,0.986484f,0.150479f, +0.170924f,0.975936f,0.135405f, +0.29249f,0.9553f,0.0430209f, +0.300918f,0.953641f,0.00421578f, +0.280252f,0.954656f,0.100457f, +0.110799f,0.982326f,0.150862f, +0.111953f,0.970209f,0.214852f, +0.0917898f,0.974074f,0.206772f, +0.0706157f,0.981239f,0.179398f, +0.263217f,0.920389f,0.289137f, +0.266708f,0.942871f,0.199653f, +0.0169344f,0.99983f,0.00724636f, +0.0586405f,0.99674f,0.0554216f, +-0.0335948f,0.99924f,0.0197934f, +0.0130139f,0.996641f,0.0808552f, +0.158081f,0.974057f,0.161934f, +-0.0718701f,0.984912f,0.157428f, +-0.146615f,0.930223f,0.336437f, +-0.215441f,0.915614f,0.339465f, +-0.194576f,0.929319f,0.313857f, +-0.21244f,0.956751f,0.198736f, +-0.353032f,0.933914f,0.0563254f, +-0.387138f,0.913346f,0.126188f, +-0.421226f,0.884098f,0.202334f, +-0.478159f,0.863227f,0.161871f, +-0.144962f,0.987796f,0.0569687f, +-0.329752f,0.937067f,-0.114758f, +-0.228627f,0.973393f,0.0153452f, +-0.0297707f,0.988896f,0.1456f, +0.0737235f,0.992418f,0.0983429f, +0.119683f,0.983634f,0.134687f, +0.0735029f,0.988539f,0.131863f, +0.205816f,0.971725f,0.115713f, +0.105316f,0.994111f,0.0255379f, +-0.224655f,0.970814f,0.0839657f, +-0.371877f,0.9075f,0.195325f, +-0.304303f,0.906448f,0.292833f, +-0.280483f,0.900657f,0.331883f, +-0.306628f,0.862929f,0.401664f, +-0.272078f,0.807801f,0.522907f, +-0.0728986f,0.827771f,0.55631f, +-0.0766844f,0.868115f,0.490404f, +-0.262952f,0.903979f,0.337163f, +-0.116268f,0.92805f,0.353844f, +-0.236581f,0.941122f,0.241494f, +-0.103825f,0.933685f,0.342713f, +0.0620174f,0.936003f,0.346485f, +0.0525461f,0.928042f,0.368751f, +-0.037371f,0.900626f,0.432986f, +-0.0859425f,0.920181f,0.381944f, +-0.402084f,0.867474f,0.292945f, +-0.458834f,0.792013f,0.402725f, +-0.247545f,0.839465f,0.483756f, +-0.0206347f,0.857039f,0.514838f, +0.131938f,0.906082f,0.402004f, +0.260907f,0.906936f,0.330749f, +0.222736f,0.912076f,0.344246f, +0.286017f,0.867948f,0.406029f, +0.265664f,0.918021f,0.29438f, +0.386646f,0.888781f,0.246116f, +0.416594f,0.869611f,0.265003f, +0.291338f,0.924889f,0.244341f, +0.264598f,0.920497f,0.287528f, +-0.0209737f,0.965015f,0.261353f, +0.011928f,0.966786f,0.255307f, +0.209759f,0.975171f,0.0710066f, +0.379568f,0.924828f,0.0249204f, +0.227757f,0.968062f,-0.104795f, +0.230276f,0.968937f,0.0901831f, +0.121279f,0.97806f,0.169381f, +0.101139f,0.989453f,0.103701f, +0.125341f,0.986876f,0.101809f, +0.00931107f,0.998148f,0.0601183f, +0.147262f,0.96746f,0.205755f, +0.372526f,0.861294f,0.34554f, +0.0770606f,0.989688f,0.120749f, +0.0673416f,0.990666f,0.11852f, +0.0242126f,0.998823f,0.0420167f, +-0.0975945f,0.993903f,-0.0513095f, +0.0117629f,0.986762f,0.16175f, +-0.119035f,0.908985f,0.399472f, +-0.171696f,0.877378f,0.448027f, +-0.168225f,0.894295f,0.414653f, +-0.158105f,0.915758f,0.369311f, +-0.0984338f,0.938718f,0.330333f, +-0.319812f,0.930617f,0.177966f, +-0.398204f,0.897351f,0.190248f, +-0.414882f,0.896338f,0.156369f, +-0.434877f,0.894265f,0.105701f, +}; + +btScalar Landscape07Tex[] = { +0.507813f,0.742188f, +0.507813f,0.734375f, +0.515625f,0.742188f, +0.515625f,0.734375f, +0.523438f,0.742188f, +0.523438f,0.734375f, +0.53125f,0.742188f, +0.53125f,0.734375f, +0.539063f,0.742188f, +0.539063f,0.734375f, +0.546875f,0.742188f, +0.546875f,0.734375f, +0.554688f,0.742188f, +0.554688f,0.734375f, +0.5625f,0.742188f, +0.5625f,0.734375f, +0.570313f,0.742188f, +0.570313f,0.734375f, +0.578125f,0.742188f, +0.578125f,0.734375f, +0.585938f,0.742188f, +0.585938f,0.734375f, +0.59375f,0.742188f, +0.59375f,0.734375f, +0.601563f,0.742188f, +0.601563f,0.734375f, +0.609375f,0.742188f, +0.609375f,0.734375f, +0.617188f,0.742188f, +0.617188f,0.734375f, +0.625f,0.742188f, +0.625f,0.734375f, +0.632813f,0.742188f, +0.632813f,0.734375f, +0.640625f,0.742188f, +0.640625f,0.734375f, +0.648438f,0.742188f, +0.648438f,0.734375f, +0.65625f,0.742188f, +0.65625f,0.734375f, +0.664063f,0.742188f, +0.664063f,0.734375f, +0.671875f,0.742188f, +0.671875f,0.734375f, +0.679688f,0.742188f, +0.679688f,0.734375f, +0.6875f,0.742188f, +0.6875f,0.734375f, +0.695313f,0.742188f, +0.695313f,0.734375f, +0.703125f,0.742188f, +0.703125f,0.734375f, +0.710938f,0.742188f, +0.710938f,0.734375f, +0.71875f,0.742188f, +0.71875f,0.734375f, +0.726563f,0.742188f, +0.726563f,0.734375f, +0.734375f,0.742188f, +0.734375f,0.734375f, +0.742188f,0.742188f, +0.742188f,0.734375f, +0.75f,0.742188f, +0.75f,0.734375f, +0.757813f,0.742188f, +0.757813f,0.734375f, +0.765625f,0.742188f, +0.765625f,0.734375f, +0.773438f,0.742188f, +0.773438f,0.734375f, +0.78125f,0.742188f, +0.78125f,0.734375f, +0.789063f,0.742188f, +0.789063f,0.734375f, +0.796875f,0.742188f, +0.796875f,0.734375f, +0.804688f,0.742188f, +0.804688f,0.734375f, +0.8125f,0.742188f, +0.8125f,0.734375f, +0.820313f,0.742188f, +0.820313f,0.734375f, +0.828125f,0.742188f, +0.828125f,0.734375f, +0.835938f,0.742188f, +0.835938f,0.734375f, +0.84375f,0.742188f, +0.84375f,0.734375f, +0.851563f,0.742188f, +0.851563f,0.734375f, +0.859375f,0.742188f, +0.859375f,0.734375f, +0.867188f,0.742188f, +0.867188f,0.734375f, +0.875f,0.742188f, +0.875f,0.734375f, +0.882813f,0.742188f, +0.882813f,0.734375f, +0.890625f,0.742188f, +0.890625f,0.734375f, +0.898438f,0.742188f, +0.898438f,0.734375f, +0.90625f,0.742188f, +0.90625f,0.734375f, +0.914063f,0.742188f, +0.914063f,0.734375f, +0.921875f,0.742188f, +0.921875f,0.734375f, +0.929688f,0.742188f, +0.929688f,0.734375f, +0.9375f,0.742188f, +0.9375f,0.734375f, +0.945313f,0.742188f, +0.945313f,0.734375f, +0.953125f,0.742188f, +0.953125f,0.734375f, +0.960938f,0.742188f, +0.960938f,0.734375f, +0.96875f,0.742188f, +0.96875f,0.734375f, +0.976563f,0.742188f, +0.976563f,0.734375f, +0.984375f,0.742188f, +0.984375f,0.734375f, +0.992188f,0.742188f, +0.992188f,0.734375f, +1.0f,0.742188f, +1.0f,0.734375f, +0.507813f,0.75f, +0.515625f,0.75f, +0.523438f,0.75f, +0.53125f,0.75f, +0.539063f,0.75f, +0.546875f,0.75f, +0.554688f,0.75f, +0.5625f,0.75f, +0.570313f,0.75f, +0.578125f,0.75f, +0.585938f,0.75f, +0.59375f,0.75f, +0.601563f,0.75f, +0.609375f,0.75f, +0.617188f,0.75f, +0.625f,0.75f, +0.632813f,0.75f, +0.640625f,0.75f, +0.648438f,0.75f, +0.65625f,0.75f, +0.664063f,0.75f, +0.671875f,0.75f, +0.679688f,0.75f, +0.6875f,0.75f, +0.695313f,0.75f, +0.703125f,0.75f, +0.710938f,0.75f, +0.71875f,0.75f, +0.726563f,0.75f, +0.734375f,0.75f, +0.742188f,0.75f, +0.75f,0.75f, +0.757813f,0.75f, +0.765625f,0.75f, +0.773438f,0.75f, +0.78125f,0.75f, +0.789063f,0.75f, +0.796875f,0.75f, +0.804688f,0.75f, +0.8125f,0.75f, +0.820313f,0.75f, +0.828125f,0.75f, +0.835938f,0.75f, +0.84375f,0.75f, +0.851563f,0.75f, +0.859375f,0.75f, +0.867188f,0.75f, +0.875f,0.75f, +0.882813f,0.75f, +0.890625f,0.75f, +0.898438f,0.75f, +0.90625f,0.75f, +0.914063f,0.75f, +0.921875f,0.75f, +0.929688f,0.75f, +0.9375f,0.75f, +0.945313f,0.75f, +0.953125f,0.75f, +0.960938f,0.75f, +0.96875f,0.75f, +0.976563f,0.75f, +0.984375f,0.75f, +0.992188f,0.75f, +1.0f,0.75f, +0.507813f,0.757813f, +0.515625f,0.757813f, +0.523438f,0.757813f, +0.53125f,0.757813f, +0.539063f,0.757813f, +0.546875f,0.757813f, +0.554688f,0.757813f, +0.5625f,0.757813f, +0.570313f,0.757813f, +0.578125f,0.757813f, +0.585938f,0.757813f, +0.59375f,0.757813f, +0.601563f,0.757813f, +0.609375f,0.757813f, +0.617188f,0.757813f, +0.625f,0.757813f, +0.632813f,0.757813f, +0.640625f,0.757813f, +0.648438f,0.757813f, +0.65625f,0.757813f, +0.664063f,0.757813f, +0.671875f,0.757813f, +0.679688f,0.757813f, +0.6875f,0.757813f, +0.695313f,0.757813f, +0.703125f,0.757813f, +0.710938f,0.757813f, +0.71875f,0.757813f, +0.726563f,0.757813f, +0.734375f,0.757813f, +0.742188f,0.757813f, +0.75f,0.757813f, +0.757813f,0.757813f, +0.765625f,0.757813f, +0.773438f,0.757813f, +0.78125f,0.757813f, +0.789063f,0.757813f, +0.796875f,0.757813f, +0.804688f,0.757813f, +0.8125f,0.757813f, +0.820313f,0.757813f, +0.828125f,0.757813f, +0.835938f,0.757813f, +0.84375f,0.757813f, +0.851563f,0.757813f, +0.859375f,0.757813f, +0.867188f,0.757813f, +0.875f,0.757813f, +0.882813f,0.757813f, +0.890625f,0.757813f, +0.898438f,0.757813f, +0.90625f,0.757813f, +0.914063f,0.757813f, +0.921875f,0.757813f, +0.929688f,0.757813f, +0.9375f,0.757813f, +0.945313f,0.757813f, +0.953125f,0.757813f, +0.960938f,0.757813f, +0.96875f,0.757813f, +0.976563f,0.757813f, +0.984375f,0.757813f, +0.992188f,0.757813f, +1.0f,0.757813f, +0.507813f,0.765625f, +0.515625f,0.765625f, +0.523438f,0.765625f, +0.53125f,0.765625f, +0.539063f,0.765625f, +0.546875f,0.765625f, +0.554688f,0.765625f, +0.5625f,0.765625f, +0.570313f,0.765625f, +0.578125f,0.765625f, +0.585938f,0.765625f, +0.59375f,0.765625f, +0.601563f,0.765625f, +0.609375f,0.765625f, +0.617188f,0.765625f, +0.625f,0.765625f, +0.632813f,0.765625f, +0.640625f,0.765625f, +0.648438f,0.765625f, +0.65625f,0.765625f, +0.664063f,0.765625f, +0.671875f,0.765625f, +0.679688f,0.765625f, +0.6875f,0.765625f, +0.695313f,0.765625f, +0.703125f,0.765625f, +0.710938f,0.765625f, +0.71875f,0.765625f, +0.726563f,0.765625f, +0.734375f,0.765625f, +0.742188f,0.765625f, +0.75f,0.765625f, +0.757813f,0.765625f, +0.765625f,0.765625f, +0.773438f,0.765625f, +0.78125f,0.765625f, +0.789063f,0.765625f, +0.796875f,0.765625f, +0.804688f,0.765625f, +0.8125f,0.765625f, +0.820313f,0.765625f, +0.828125f,0.765625f, +0.835938f,0.765625f, +0.84375f,0.765625f, +0.851563f,0.765625f, +0.859375f,0.765625f, +0.867188f,0.765625f, +0.875f,0.765625f, +0.882813f,0.765625f, +0.890625f,0.765625f, +0.898438f,0.765625f, +0.90625f,0.765625f, +0.914063f,0.765625f, +0.921875f,0.765625f, +0.929688f,0.765625f, +0.9375f,0.765625f, +0.945313f,0.765625f, +0.953125f,0.765625f, +0.960938f,0.765625f, +0.96875f,0.765625f, +0.976563f,0.765625f, +0.984375f,0.765625f, +0.992188f,0.765625f, +1.0f,0.765625f, +0.507813f,0.773438f, +0.515625f,0.773438f, +0.523438f,0.773438f, +0.53125f,0.773438f, +0.539063f,0.773438f, +0.546875f,0.773438f, +0.554688f,0.773438f, +0.5625f,0.773438f, +0.570313f,0.773438f, +0.578125f,0.773438f, +0.585938f,0.773438f, +0.59375f,0.773438f, +0.601563f,0.773438f, +0.609375f,0.773438f, +0.617188f,0.773438f, +0.625f,0.773438f, +0.632813f,0.773438f, +0.640625f,0.773438f, +0.648438f,0.773438f, +0.65625f,0.773438f, +0.664063f,0.773438f, +0.671875f,0.773438f, +0.679688f,0.773438f, +0.6875f,0.773438f, +0.695313f,0.773438f, +0.703125f,0.773438f, +0.710938f,0.773438f, +0.71875f,0.773438f, +0.726563f,0.773438f, +0.734375f,0.773438f, +0.742188f,0.773438f, +0.75f,0.773438f, +0.757813f,0.773438f, +0.765625f,0.773438f, +0.773438f,0.773438f, +0.78125f,0.773438f, +0.789063f,0.773438f, +0.796875f,0.773438f, +0.804688f,0.773438f, +0.8125f,0.773438f, +0.820313f,0.773438f, +0.828125f,0.773438f, +0.835938f,0.773438f, +0.84375f,0.773438f, +0.851563f,0.773438f, +0.859375f,0.773438f, +0.867188f,0.773438f, +0.875f,0.773438f, +0.882813f,0.773438f, +0.890625f,0.773438f, +0.898438f,0.773438f, +0.90625f,0.773438f, +0.914063f,0.773438f, +0.921875f,0.773438f, +0.929688f,0.773438f, +0.9375f,0.773438f, +0.945313f,0.773438f, +0.953125f,0.773438f, +0.960938f,0.773438f, +0.96875f,0.773438f, +0.976563f,0.773438f, +0.984375f,0.773438f, +0.992188f,0.773438f, +1.0f,0.773438f, +0.507813f,0.78125f, +0.515625f,0.78125f, +0.523438f,0.78125f, +0.53125f,0.78125f, +0.539063f,0.78125f, +0.546875f,0.78125f, +0.554688f,0.78125f, +0.5625f,0.78125f, +0.570313f,0.78125f, +0.578125f,0.78125f, +0.585938f,0.78125f, +0.59375f,0.78125f, +0.601563f,0.78125f, +0.609375f,0.78125f, +0.617188f,0.78125f, +0.625f,0.78125f, +0.632813f,0.78125f, +0.640625f,0.78125f, +0.648438f,0.78125f, +0.65625f,0.78125f, +0.664063f,0.78125f, +0.671875f,0.78125f, +0.679688f,0.78125f, +0.6875f,0.78125f, +0.695313f,0.78125f, +0.703125f,0.78125f, +0.710938f,0.78125f, +0.71875f,0.78125f, +0.726563f,0.78125f, +0.734375f,0.78125f, +0.742188f,0.78125f, +0.75f,0.78125f, +0.757813f,0.78125f, +0.765625f,0.78125f, +0.773438f,0.78125f, +0.78125f,0.78125f, +0.789063f,0.78125f, +0.796875f,0.78125f, +0.804688f,0.78125f, +0.8125f,0.78125f, +0.820313f,0.78125f, +0.828125f,0.78125f, +0.835938f,0.78125f, +0.84375f,0.78125f, +0.851563f,0.78125f, +0.859375f,0.78125f, +0.867188f,0.78125f, +0.875f,0.78125f, +0.882813f,0.78125f, +0.890625f,0.78125f, +0.898438f,0.78125f, +0.90625f,0.78125f, +0.914063f,0.78125f, +0.921875f,0.78125f, +0.929688f,0.78125f, +0.9375f,0.78125f, +0.945313f,0.78125f, +0.953125f,0.78125f, +0.960938f,0.78125f, +0.96875f,0.78125f, +0.976563f,0.78125f, +0.984375f,0.78125f, +0.992188f,0.78125f, +1.0f,0.78125f, +0.507813f,0.789063f, +0.515625f,0.789063f, +0.523438f,0.789063f, +0.53125f,0.789063f, +0.539063f,0.789063f, +0.546875f,0.789063f, +0.554688f,0.789063f, +0.5625f,0.789063f, +0.570313f,0.789063f, +0.578125f,0.789063f, +0.585938f,0.789063f, +0.59375f,0.789063f, +0.601563f,0.789063f, +0.609375f,0.789063f, +0.617188f,0.789063f, +0.625f,0.789063f, +0.632813f,0.789063f, +0.640625f,0.789063f, +0.648438f,0.789063f, +0.65625f,0.789063f, +0.664063f,0.789063f, +0.671875f,0.789063f, +0.679688f,0.789063f, +0.6875f,0.789063f, +0.695313f,0.789063f, +0.703125f,0.789063f, +0.710938f,0.789063f, +0.71875f,0.789063f, +0.726563f,0.789063f, +0.734375f,0.789063f, +0.742188f,0.789063f, +0.75f,0.789063f, +0.757813f,0.789063f, +0.765625f,0.789063f, +0.773438f,0.789063f, +0.78125f,0.789063f, +0.789063f,0.789063f, +0.796875f,0.789063f, +0.804688f,0.789063f, +0.8125f,0.789063f, +0.820313f,0.789063f, +0.828125f,0.789063f, +0.835938f,0.789063f, +0.84375f,0.789063f, +0.851563f,0.789063f, +0.859375f,0.789063f, +0.867188f,0.789063f, +0.875f,0.789063f, +0.882813f,0.789063f, +0.890625f,0.789063f, +0.898438f,0.789063f, +0.90625f,0.789063f, +0.914063f,0.789063f, +0.921875f,0.789063f, +0.929688f,0.789063f, +0.9375f,0.789063f, +0.945313f,0.789063f, +0.953125f,0.789063f, +0.960938f,0.789063f, +0.96875f,0.789063f, +0.976563f,0.789063f, +0.984375f,0.789063f, +0.992188f,0.789063f, +1.0f,0.789063f, +0.507813f,0.796875f, +0.515625f,0.796875f, +0.523438f,0.796875f, +0.53125f,0.796875f, +0.539063f,0.796875f, +0.546875f,0.796875f, +0.554688f,0.796875f, +0.5625f,0.796875f, +0.570313f,0.796875f, +0.578125f,0.796875f, +0.585938f,0.796875f, +0.59375f,0.796875f, +0.601563f,0.796875f, +0.609375f,0.796875f, +0.617188f,0.796875f, +0.625f,0.796875f, +0.632813f,0.796875f, +0.640625f,0.796875f, +0.648438f,0.796875f, +0.65625f,0.796875f, +0.664063f,0.796875f, +0.671875f,0.796875f, +0.679688f,0.796875f, +0.6875f,0.796875f, +0.695313f,0.796875f, +0.703125f,0.796875f, +0.710938f,0.796875f, +0.71875f,0.796875f, +0.726563f,0.796875f, +0.734375f,0.796875f, +0.742188f,0.796875f, +0.75f,0.796875f, +0.757813f,0.796875f, +0.765625f,0.796875f, +0.773438f,0.796875f, +0.78125f,0.796875f, +0.789063f,0.796875f, +0.796875f,0.796875f, +0.804688f,0.796875f, +0.8125f,0.796875f, +0.820313f,0.796875f, +0.828125f,0.796875f, +0.835938f,0.796875f, +0.84375f,0.796875f, +0.851563f,0.796875f, +0.859375f,0.796875f, +0.867188f,0.796875f, +0.875f,0.796875f, +0.882813f,0.796875f, +0.890625f,0.796875f, +0.898438f,0.796875f, +0.90625f,0.796875f, +0.914063f,0.796875f, +0.921875f,0.796875f, +0.929688f,0.796875f, +0.9375f,0.796875f, +0.945313f,0.796875f, +0.953125f,0.796875f, +0.960938f,0.796875f, +0.96875f,0.796875f, +0.976563f,0.796875f, +0.984375f,0.796875f, +0.992188f,0.796875f, +1.0f,0.796875f, +0.507813f,0.804688f, +0.515625f,0.804688f, +0.523438f,0.804688f, +0.53125f,0.804688f, +0.539063f,0.804688f, +0.546875f,0.804688f, +0.554688f,0.804688f, +0.5625f,0.804688f, +0.570313f,0.804688f, +0.578125f,0.804688f, +0.585938f,0.804688f, +0.59375f,0.804688f, +0.601563f,0.804688f, +0.609375f,0.804688f, +0.617188f,0.804688f, +0.625f,0.804688f, +0.632813f,0.804688f, +0.640625f,0.804688f, +0.648438f,0.804688f, +0.65625f,0.804688f, +0.664063f,0.804688f, +0.671875f,0.804688f, +0.679688f,0.804688f, +0.6875f,0.804688f, +0.695313f,0.804688f, +0.703125f,0.804688f, +0.710938f,0.804688f, +0.71875f,0.804688f, +0.726563f,0.804688f, +0.734375f,0.804688f, +0.742188f,0.804688f, +0.75f,0.804688f, +0.757813f,0.804688f, +0.765625f,0.804688f, +0.773438f,0.804688f, +0.78125f,0.804688f, +0.789063f,0.804688f, +0.796875f,0.804688f, +0.804688f,0.804688f, +0.8125f,0.804688f, +0.820313f,0.804688f, +0.828125f,0.804688f, +0.835938f,0.804688f, +0.84375f,0.804688f, +0.851563f,0.804688f, +0.859375f,0.804688f, +0.867188f,0.804688f, +0.875f,0.804688f, +0.882813f,0.804688f, +0.890625f,0.804688f, +0.898438f,0.804688f, +0.90625f,0.804688f, +0.914063f,0.804688f, +0.921875f,0.804688f, +0.929688f,0.804688f, +0.9375f,0.804688f, +0.945313f,0.804688f, +0.953125f,0.804688f, +0.960938f,0.804688f, +0.96875f,0.804688f, +0.976563f,0.804688f, +0.984375f,0.804688f, +0.992188f,0.804688f, +1.0f,0.804688f, +0.507813f,0.8125f, +0.515625f,0.8125f, +0.523438f,0.8125f, +0.53125f,0.8125f, +0.539063f,0.8125f, +0.546875f,0.8125f, +0.554688f,0.8125f, +0.5625f,0.8125f, +0.570313f,0.8125f, +0.578125f,0.8125f, +0.585938f,0.8125f, +0.59375f,0.8125f, +0.601563f,0.8125f, +0.609375f,0.8125f, +0.617188f,0.8125f, +0.625f,0.8125f, +0.632813f,0.8125f, +0.640625f,0.8125f, +0.648438f,0.8125f, +0.65625f,0.8125f, +0.664063f,0.8125f, +0.671875f,0.8125f, +0.679688f,0.8125f, +0.6875f,0.8125f, +0.695313f,0.8125f, +0.703125f,0.8125f, +0.710938f,0.8125f, +0.71875f,0.8125f, +0.726563f,0.8125f, +0.734375f,0.8125f, +0.742188f,0.8125f, +0.75f,0.8125f, +0.757813f,0.8125f, +0.765625f,0.8125f, +0.773438f,0.8125f, +0.78125f,0.8125f, +0.789063f,0.8125f, +0.796875f,0.8125f, +0.804688f,0.8125f, +0.8125f,0.8125f, +0.820313f,0.8125f, +0.828125f,0.8125f, +0.835938f,0.8125f, +0.84375f,0.8125f, +0.851563f,0.8125f, +0.859375f,0.8125f, +0.867188f,0.8125f, +0.875f,0.8125f, +0.882813f,0.8125f, +0.890625f,0.8125f, +0.898438f,0.8125f, +0.90625f,0.8125f, +0.914063f,0.8125f, +0.921875f,0.8125f, +0.929688f,0.8125f, +0.9375f,0.8125f, +0.945313f,0.8125f, +0.953125f,0.8125f, +0.960938f,0.8125f, +0.96875f,0.8125f, +0.976563f,0.8125f, +0.984375f,0.8125f, +0.992188f,0.8125f, +1.0f,0.8125f, +0.507813f,0.820313f, +0.515625f,0.820313f, +0.523438f,0.820313f, +0.53125f,0.820313f, +0.539063f,0.820313f, +0.546875f,0.820313f, +0.554688f,0.820313f, +0.5625f,0.820313f, +0.570313f,0.820313f, +0.578125f,0.820313f, +0.585938f,0.820313f, +0.59375f,0.820313f, +0.601563f,0.820313f, +0.609375f,0.820313f, +0.617188f,0.820313f, +0.625f,0.820313f, +0.632813f,0.820313f, +0.640625f,0.820313f, +0.648438f,0.820313f, +0.65625f,0.820313f, +0.664063f,0.820313f, +0.671875f,0.820313f, +0.679688f,0.820313f, +0.6875f,0.820313f, +0.695313f,0.820313f, +0.703125f,0.820313f, +0.710938f,0.820313f, +0.71875f,0.820313f, +0.726563f,0.820313f, +0.734375f,0.820313f, +0.742188f,0.820313f, +0.75f,0.820313f, +0.757813f,0.820313f, +0.765625f,0.820313f, +0.773438f,0.820313f, +0.78125f,0.820313f, +0.789063f,0.820313f, +0.796875f,0.820313f, +0.804688f,0.820313f, +0.8125f,0.820313f, +0.820313f,0.820313f, +0.828125f,0.820313f, +0.835938f,0.820313f, +0.84375f,0.820313f, +0.851563f,0.820313f, +0.859375f,0.820313f, +0.867188f,0.820313f, +0.875f,0.820313f, +0.882813f,0.820313f, +0.890625f,0.820313f, +0.898438f,0.820313f, +0.90625f,0.820313f, +0.914063f,0.820313f, +0.921875f,0.820313f, +0.929688f,0.820313f, +0.9375f,0.820313f, +0.945313f,0.820313f, +0.953125f,0.820313f, +0.960938f,0.820313f, +0.96875f,0.820313f, +0.976563f,0.820313f, +0.984375f,0.820313f, +0.992188f,0.820313f, +1.0f,0.820313f, +0.507813f,0.828125f, +0.515625f,0.828125f, +0.523438f,0.828125f, +0.53125f,0.828125f, +0.539063f,0.828125f, +0.546875f,0.828125f, +0.554688f,0.828125f, +0.5625f,0.828125f, +0.570313f,0.828125f, +0.578125f,0.828125f, +0.585938f,0.828125f, +0.59375f,0.828125f, +0.601563f,0.828125f, +0.609375f,0.828125f, +0.617188f,0.828125f, +0.625f,0.828125f, +0.632813f,0.828125f, +0.640625f,0.828125f, +0.648438f,0.828125f, +0.65625f,0.828125f, +0.664063f,0.828125f, +0.671875f,0.828125f, +0.679688f,0.828125f, +0.6875f,0.828125f, +0.695313f,0.828125f, +0.703125f,0.828125f, +0.710938f,0.828125f, +0.71875f,0.828125f, +0.726563f,0.828125f, +0.734375f,0.828125f, +0.742188f,0.828125f, +0.75f,0.828125f, +0.757813f,0.828125f, +0.765625f,0.828125f, +0.773438f,0.828125f, +0.78125f,0.828125f, +0.789063f,0.828125f, +0.796875f,0.828125f, +0.804688f,0.828125f, +0.8125f,0.828125f, +0.820313f,0.828125f, +0.828125f,0.828125f, +0.835938f,0.828125f, +0.84375f,0.828125f, +0.851563f,0.828125f, +0.859375f,0.828125f, +0.867188f,0.828125f, +0.875f,0.828125f, +0.882813f,0.828125f, +0.890625f,0.828125f, +0.898438f,0.828125f, +0.90625f,0.828125f, +0.914063f,0.828125f, +0.921875f,0.828125f, +0.929688f,0.828125f, +0.9375f,0.828125f, +0.945313f,0.828125f, +0.953125f,0.828125f, +0.960938f,0.828125f, +0.96875f,0.828125f, +0.976563f,0.828125f, +0.984375f,0.828125f, +0.992188f,0.828125f, +1.0f,0.828125f, +0.507813f,0.835938f, +0.515625f,0.835938f, +0.523438f,0.835938f, +0.53125f,0.835938f, +0.539063f,0.835938f, +0.546875f,0.835938f, +0.554688f,0.835938f, +0.5625f,0.835938f, +0.570313f,0.835938f, +0.578125f,0.835938f, +0.585938f,0.835938f, +0.59375f,0.835938f, +0.601563f,0.835938f, +0.609375f,0.835938f, +0.617188f,0.835938f, +0.625f,0.835938f, +0.632813f,0.835938f, +0.640625f,0.835938f, +0.648438f,0.835938f, +0.65625f,0.835938f, +0.664063f,0.835938f, +0.671875f,0.835938f, +0.679688f,0.835938f, +0.6875f,0.835938f, +0.695313f,0.835938f, +0.703125f,0.835938f, +0.710938f,0.835938f, +0.71875f,0.835938f, +0.726563f,0.835938f, +0.734375f,0.835938f, +0.742188f,0.835938f, +0.75f,0.835938f, +0.757813f,0.835938f, +0.765625f,0.835938f, +0.773438f,0.835938f, +0.78125f,0.835938f, +0.789063f,0.835938f, +0.796875f,0.835938f, +0.804688f,0.835938f, +0.8125f,0.835938f, +0.820313f,0.835938f, +0.828125f,0.835938f, +0.835938f,0.835938f, +0.84375f,0.835938f, +0.851563f,0.835938f, +0.859375f,0.835938f, +0.867188f,0.835938f, +0.875f,0.835938f, +0.882813f,0.835938f, +0.890625f,0.835938f, +0.898438f,0.835938f, +0.90625f,0.835938f, +0.914063f,0.835938f, +0.921875f,0.835938f, +0.929688f,0.835938f, +0.9375f,0.835938f, +0.945313f,0.835938f, +0.953125f,0.835938f, +0.960938f,0.835938f, +0.96875f,0.835938f, +0.976563f,0.835938f, +0.984375f,0.835938f, +0.992188f,0.835938f, +1.0f,0.835938f, +0.507813f,0.84375f, +0.515625f,0.84375f, +0.523438f,0.84375f, +0.53125f,0.84375f, +0.539063f,0.84375f, +0.546875f,0.84375f, +0.554688f,0.84375f, +0.5625f,0.84375f, +0.570313f,0.84375f, +0.578125f,0.84375f, +0.585938f,0.84375f, +0.59375f,0.84375f, +0.601563f,0.84375f, +0.609375f,0.84375f, +0.617188f,0.84375f, +0.625f,0.84375f, +0.632813f,0.84375f, +0.640625f,0.84375f, +0.648438f,0.84375f, +0.65625f,0.84375f, +0.664063f,0.84375f, +0.671875f,0.84375f, +0.679688f,0.84375f, +0.6875f,0.84375f, +0.695313f,0.84375f, +0.703125f,0.84375f, +0.710938f,0.84375f, +0.71875f,0.84375f, +0.726563f,0.84375f, +0.734375f,0.84375f, +0.742188f,0.84375f, +0.75f,0.84375f, +0.757813f,0.84375f, +0.765625f,0.84375f, +0.773438f,0.84375f, +0.78125f,0.84375f, +0.789063f,0.84375f, +0.796875f,0.84375f, +0.804688f,0.84375f, +0.8125f,0.84375f, +0.820313f,0.84375f, +0.828125f,0.84375f, +0.835938f,0.84375f, +0.84375f,0.84375f, +0.851563f,0.84375f, +0.859375f,0.84375f, +0.867188f,0.84375f, +0.875f,0.84375f, +0.882813f,0.84375f, +0.890625f,0.84375f, +0.898438f,0.84375f, +0.90625f,0.84375f, +0.914063f,0.84375f, +0.921875f,0.84375f, +0.929688f,0.84375f, +0.9375f,0.84375f, +0.945313f,0.84375f, +0.953125f,0.84375f, +0.960938f,0.84375f, +0.96875f,0.84375f, +0.976563f,0.84375f, +0.984375f,0.84375f, +0.992188f,0.84375f, +1.0f,0.84375f, +0.507813f,0.851563f, +0.515625f,0.851563f, +0.523438f,0.851563f, +0.53125f,0.851563f, +0.539063f,0.851563f, +0.546875f,0.851563f, +0.554688f,0.851563f, +0.5625f,0.851563f, +0.570313f,0.851563f, +0.578125f,0.851563f, +0.585938f,0.851563f, +0.59375f,0.851563f, +0.601563f,0.851563f, +0.609375f,0.851563f, +0.617188f,0.851563f, +0.625f,0.851563f, +0.632813f,0.851563f, +0.640625f,0.851563f, +0.648438f,0.851563f, +0.65625f,0.851563f, +0.664063f,0.851563f, +0.671875f,0.851563f, +0.679688f,0.851563f, +0.6875f,0.851563f, +0.695313f,0.851563f, +0.703125f,0.851563f, +0.710938f,0.851563f, +0.71875f,0.851563f, +0.726563f,0.851563f, +0.734375f,0.851563f, +0.742188f,0.851563f, +0.75f,0.851563f, +0.757813f,0.851563f, +0.765625f,0.851563f, +0.773438f,0.851563f, +0.78125f,0.851563f, +0.789063f,0.851563f, +0.796875f,0.851563f, +0.804688f,0.851563f, +0.8125f,0.851563f, +0.820313f,0.851563f, +0.828125f,0.851563f, +0.835938f,0.851563f, +0.84375f,0.851563f, +0.851563f,0.851563f, +0.859375f,0.851563f, +0.867188f,0.851563f, +0.875f,0.851563f, +0.882813f,0.851563f, +0.890625f,0.851563f, +0.898438f,0.851563f, +0.90625f,0.851563f, +0.914063f,0.851563f, +0.921875f,0.851563f, +0.929688f,0.851563f, +0.9375f,0.851563f, +0.945313f,0.851563f, +0.953125f,0.851563f, +0.960938f,0.851563f, +0.96875f,0.851563f, +0.976563f,0.851563f, +0.984375f,0.851563f, +0.992188f,0.851563f, +1.0f,0.851563f, +0.507813f,0.859375f, +0.515625f,0.859375f, +0.523438f,0.859375f, +0.53125f,0.859375f, +0.539063f,0.859375f, +0.546875f,0.859375f, +0.554688f,0.859375f, +0.5625f,0.859375f, +0.570313f,0.859375f, +0.578125f,0.859375f, +0.585938f,0.859375f, +0.59375f,0.859375f, +0.601563f,0.859375f, +0.609375f,0.859375f, +0.617188f,0.859375f, +0.625f,0.859375f, +0.632813f,0.859375f, +0.640625f,0.859375f, +0.648438f,0.859375f, +0.65625f,0.859375f, +0.664063f,0.859375f, +0.671875f,0.859375f, +0.679688f,0.859375f, +0.6875f,0.859375f, +0.695313f,0.859375f, +0.703125f,0.859375f, +0.710938f,0.859375f, +0.71875f,0.859375f, +0.726563f,0.859375f, +0.734375f,0.859375f, +0.742188f,0.859375f, +0.75f,0.859375f, +0.757813f,0.859375f, +0.765625f,0.859375f, +0.773438f,0.859375f, +0.78125f,0.859375f, +0.789063f,0.859375f, +0.796875f,0.859375f, +0.804688f,0.859375f, +0.8125f,0.859375f, +0.820313f,0.859375f, +0.828125f,0.859375f, +0.835938f,0.859375f, +0.84375f,0.859375f, +0.851563f,0.859375f, +0.859375f,0.859375f, +0.867188f,0.859375f, +0.875f,0.859375f, +0.882813f,0.859375f, +0.890625f,0.859375f, +0.898438f,0.859375f, +0.90625f,0.859375f, +0.914063f,0.859375f, +0.921875f,0.859375f, +0.929688f,0.859375f, +0.9375f,0.859375f, +0.945313f,0.859375f, +0.953125f,0.859375f, +0.960938f,0.859375f, +0.96875f,0.859375f, +0.976563f,0.859375f, +0.984375f,0.859375f, +0.992188f,0.859375f, +1.0f,0.859375f, +0.507813f,0.867188f, +0.515625f,0.867188f, +0.523438f,0.867188f, +0.53125f,0.867188f, +0.539063f,0.867188f, +0.546875f,0.867188f, +0.554688f,0.867188f, +0.5625f,0.867188f, +0.570313f,0.867188f, +0.578125f,0.867188f, +0.585938f,0.867188f, +0.59375f,0.867188f, +0.601563f,0.867188f, +0.609375f,0.867188f, +0.617188f,0.867188f, +0.625f,0.867188f, +0.632813f,0.867188f, +0.640625f,0.867188f, +0.648438f,0.867188f, +0.65625f,0.867188f, +0.664063f,0.867188f, +0.671875f,0.867188f, +0.679688f,0.867188f, +0.6875f,0.867188f, +0.695313f,0.867188f, +0.703125f,0.867188f, +0.710938f,0.867188f, +0.71875f,0.867188f, +0.726563f,0.867188f, +0.734375f,0.867188f, +0.742188f,0.867188f, +0.75f,0.867188f, +0.757813f,0.867188f, +0.765625f,0.867188f, +0.773438f,0.867188f, +0.78125f,0.867188f, +0.789063f,0.867188f, +0.796875f,0.867188f, +0.804688f,0.867188f, +0.8125f,0.867188f, +0.820313f,0.867188f, +0.828125f,0.867188f, +0.835938f,0.867188f, +0.84375f,0.867188f, +0.851563f,0.867188f, +0.859375f,0.867188f, +0.867188f,0.867188f, +0.875f,0.867188f, +0.882813f,0.867188f, +0.890625f,0.867188f, +0.898438f,0.867188f, +0.90625f,0.867188f, +0.914063f,0.867188f, +0.921875f,0.867188f, +0.929688f,0.867188f, +0.9375f,0.867188f, +0.945313f,0.867188f, +0.953125f,0.867188f, +0.960938f,0.867188f, +0.96875f,0.867188f, +0.976563f,0.867188f, +0.984375f,0.867188f, +0.992188f,0.867188f, +1.0f,0.867188f, +0.507813f,0.875f, +0.515625f,0.875f, +0.523438f,0.875f, +0.53125f,0.875f, +0.539063f,0.875f, +0.546875f,0.875f, +0.554688f,0.875f, +0.5625f,0.875f, +0.570313f,0.875f, +0.578125f,0.875f, +0.585938f,0.875f, +0.59375f,0.875f, +0.601563f,0.875f, +0.609375f,0.875f, +0.617188f,0.875f, +0.625f,0.875f, +0.632813f,0.875f, +0.640625f,0.875f, +0.648438f,0.875f, +0.65625f,0.875f, +0.664063f,0.875f, +0.671875f,0.875f, +0.679688f,0.875f, +0.6875f,0.875f, +0.695313f,0.875f, +0.703125f,0.875f, +0.710938f,0.875f, +0.71875f,0.875f, +0.726563f,0.875f, +0.734375f,0.875f, +0.742188f,0.875f, +0.75f,0.875f, +0.757813f,0.875f, +0.765625f,0.875f, +0.773438f,0.875f, +0.78125f,0.875f, +0.789063f,0.875f, +0.796875f,0.875f, +0.804688f,0.875f, +0.8125f,0.875f, +0.820313f,0.875f, +0.828125f,0.875f, +0.835938f,0.875f, +0.84375f,0.875f, +0.851563f,0.875f, +0.859375f,0.875f, +0.867188f,0.875f, +0.875f,0.875f, +0.882813f,0.875f, +0.890625f,0.875f, +0.898438f,0.875f, +0.90625f,0.875f, +0.914063f,0.875f, +0.921875f,0.875f, +0.929688f,0.875f, +0.9375f,0.875f, +0.945313f,0.875f, +0.953125f,0.875f, +0.960938f,0.875f, +0.96875f,0.875f, +0.976563f,0.875f, +0.984375f,0.875f, +0.992188f,0.875f, +1.0f,0.875f, +0.507813f,0.882813f, +0.515625f,0.882813f, +0.523438f,0.882813f, +0.53125f,0.882813f, +0.539063f,0.882813f, +0.546875f,0.882813f, +0.554688f,0.882813f, +0.5625f,0.882813f, +0.570313f,0.882813f, +0.578125f,0.882813f, +0.585938f,0.882813f, +0.59375f,0.882813f, +0.601563f,0.882813f, +0.609375f,0.882813f, +0.617188f,0.882813f, +0.625f,0.882813f, +0.632813f,0.882813f, +0.640625f,0.882813f, +0.648438f,0.882813f, +0.65625f,0.882813f, +0.664063f,0.882813f, +0.671875f,0.882813f, +0.679688f,0.882813f, +0.6875f,0.882813f, +0.695313f,0.882813f, +0.703125f,0.882813f, +0.710938f,0.882813f, +0.71875f,0.882813f, +0.726563f,0.882813f, +0.734375f,0.882813f, +0.742188f,0.882813f, +0.75f,0.882813f, +0.757813f,0.882813f, +0.765625f,0.882813f, +0.773438f,0.882813f, +0.78125f,0.882813f, +0.789063f,0.882813f, +0.796875f,0.882813f, +0.804688f,0.882813f, +0.8125f,0.882813f, +0.820313f,0.882813f, +0.828125f,0.882813f, +0.835938f,0.882813f, +0.84375f,0.882813f, +0.851563f,0.882813f, +0.859375f,0.882813f, +0.867188f,0.882813f, +0.875f,0.882813f, +0.882813f,0.882813f, +0.890625f,0.882813f, +0.898438f,0.882813f, +0.90625f,0.882813f, +0.914063f,0.882813f, +0.921875f,0.882813f, +0.929688f,0.882813f, +0.9375f,0.882813f, +0.945313f,0.882813f, +0.953125f,0.882813f, +0.960938f,0.882813f, +0.96875f,0.882813f, +0.976563f,0.882813f, +0.984375f,0.882813f, +0.992188f,0.882813f, +1.0f,0.882813f, +0.507813f,0.890625f, +0.515625f,0.890625f, +0.523438f,0.890625f, +0.53125f,0.890625f, +0.539063f,0.890625f, +0.546875f,0.890625f, +0.554688f,0.890625f, +0.5625f,0.890625f, +0.570313f,0.890625f, +0.578125f,0.890625f, +0.585938f,0.890625f, +0.59375f,0.890625f, +0.601563f,0.890625f, +0.609375f,0.890625f, +0.617188f,0.890625f, +0.625f,0.890625f, +0.632813f,0.890625f, +0.640625f,0.890625f, +0.648438f,0.890625f, +0.65625f,0.890625f, +0.664063f,0.890625f, +0.671875f,0.890625f, +0.679688f,0.890625f, +0.6875f,0.890625f, +0.695313f,0.890625f, +0.703125f,0.890625f, +0.710938f,0.890625f, +0.71875f,0.890625f, +0.726563f,0.890625f, +0.734375f,0.890625f, +0.742188f,0.890625f, +0.75f,0.890625f, +0.757813f,0.890625f, +0.765625f,0.890625f, +0.773438f,0.890625f, +0.78125f,0.890625f, +0.789063f,0.890625f, +0.796875f,0.890625f, +0.804688f,0.890625f, +0.8125f,0.890625f, +0.820313f,0.890625f, +0.828125f,0.890625f, +0.835938f,0.890625f, +0.84375f,0.890625f, +0.851563f,0.890625f, +0.859375f,0.890625f, +0.867188f,0.890625f, +0.875f,0.890625f, +0.882813f,0.890625f, +0.890625f,0.890625f, +0.898438f,0.890625f, +0.90625f,0.890625f, +0.914063f,0.890625f, +0.921875f,0.890625f, +0.929688f,0.890625f, +0.9375f,0.890625f, +0.945313f,0.890625f, +0.953125f,0.890625f, +0.960938f,0.890625f, +0.96875f,0.890625f, +0.976563f,0.890625f, +0.984375f,0.890625f, +0.992188f,0.890625f, +1.0f,0.890625f, +0.507813f,0.898438f, +0.515625f,0.898438f, +0.523438f,0.898438f, +0.53125f,0.898438f, +0.539063f,0.898438f, +0.546875f,0.898438f, +0.554688f,0.898438f, +0.5625f,0.898438f, +0.570313f,0.898438f, +0.578125f,0.898438f, +0.585938f,0.898438f, +0.59375f,0.898438f, +0.601563f,0.898438f, +0.609375f,0.898438f, +0.617188f,0.898438f, +0.625f,0.898438f, +0.632813f,0.898438f, +0.640625f,0.898438f, +0.648438f,0.898438f, +0.65625f,0.898438f, +0.664063f,0.898438f, +0.671875f,0.898438f, +0.679688f,0.898438f, +0.6875f,0.898438f, +0.695313f,0.898438f, +0.703125f,0.898438f, +0.710938f,0.898438f, +0.71875f,0.898438f, +0.726563f,0.898438f, +0.734375f,0.898438f, +0.742188f,0.898438f, +0.75f,0.898438f, +0.757813f,0.898438f, +0.765625f,0.898438f, +0.773438f,0.898438f, +0.78125f,0.898438f, +0.789063f,0.898438f, +0.796875f,0.898438f, +0.804688f,0.898438f, +0.8125f,0.898438f, +0.820313f,0.898438f, +0.828125f,0.898438f, +0.835938f,0.898438f, +0.84375f,0.898438f, +0.851563f,0.898438f, +0.859375f,0.898438f, +0.867188f,0.898438f, +0.875f,0.898438f, +0.882813f,0.898438f, +0.890625f,0.898438f, +0.898438f,0.898438f, +0.90625f,0.898438f, +0.914063f,0.898438f, +0.921875f,0.898438f, +0.929688f,0.898438f, +0.9375f,0.898438f, +0.945313f,0.898438f, +0.953125f,0.898438f, +0.960938f,0.898438f, +0.96875f,0.898438f, +0.976563f,0.898438f, +0.984375f,0.898438f, +0.992188f,0.898438f, +1.0f,0.898438f, +0.507813f,0.90625f, +0.515625f,0.90625f, +0.523438f,0.90625f, +0.53125f,0.90625f, +0.539063f,0.90625f, +0.546875f,0.90625f, +0.554688f,0.90625f, +0.5625f,0.90625f, +0.570313f,0.90625f, +0.578125f,0.90625f, +0.585938f,0.90625f, +0.59375f,0.90625f, +0.601563f,0.90625f, +0.609375f,0.90625f, +0.617188f,0.90625f, +0.625f,0.90625f, +0.632813f,0.90625f, +0.640625f,0.90625f, +0.648438f,0.90625f, +0.65625f,0.90625f, +0.664063f,0.90625f, +0.671875f,0.90625f, +0.679688f,0.90625f, +0.6875f,0.90625f, +0.695313f,0.90625f, +0.703125f,0.90625f, +0.710938f,0.90625f, +0.71875f,0.90625f, +0.726563f,0.90625f, +0.734375f,0.90625f, +0.742188f,0.90625f, +0.75f,0.90625f, +0.757813f,0.90625f, +0.765625f,0.90625f, +0.773438f,0.90625f, +0.78125f,0.90625f, +0.789063f,0.90625f, +0.796875f,0.90625f, +0.804688f,0.90625f, +0.8125f,0.90625f, +0.820313f,0.90625f, +0.828125f,0.90625f, +0.835938f,0.90625f, +0.84375f,0.90625f, +0.851563f,0.90625f, +0.859375f,0.90625f, +0.867188f,0.90625f, +0.875f,0.90625f, +0.882813f,0.90625f, +0.890625f,0.90625f, +0.898438f,0.90625f, +0.90625f,0.90625f, +0.914063f,0.90625f, +0.921875f,0.90625f, +0.929688f,0.90625f, +0.9375f,0.90625f, +0.945313f,0.90625f, +0.953125f,0.90625f, +0.960938f,0.90625f, +0.96875f,0.90625f, +0.976563f,0.90625f, +0.984375f,0.90625f, +0.992188f,0.90625f, +1.0f,0.90625f, +0.507813f,0.914063f, +0.515625f,0.914063f, +0.523438f,0.914063f, +0.53125f,0.914063f, +0.539063f,0.914063f, +0.546875f,0.914063f, +0.554688f,0.914063f, +0.5625f,0.914063f, +0.570313f,0.914063f, +0.578125f,0.914063f, +0.585938f,0.914063f, +0.59375f,0.914063f, +0.601563f,0.914063f, +0.609375f,0.914063f, +0.617188f,0.914063f, +0.625f,0.914063f, +0.632813f,0.914063f, +0.640625f,0.914063f, +0.648438f,0.914063f, +0.65625f,0.914063f, +0.664063f,0.914063f, +0.671875f,0.914063f, +0.679688f,0.914063f, +0.6875f,0.914063f, +0.695313f,0.914063f, +0.703125f,0.914063f, +0.710938f,0.914063f, +0.71875f,0.914063f, +0.726563f,0.914063f, +0.734375f,0.914063f, +0.742188f,0.914063f, +0.75f,0.914063f, +0.757813f,0.914063f, +0.765625f,0.914063f, +0.773438f,0.914063f, +0.78125f,0.914063f, +0.789063f,0.914063f, +0.796875f,0.914063f, +0.804688f,0.914063f, +0.8125f,0.914063f, +0.820313f,0.914063f, +0.828125f,0.914063f, +0.835938f,0.914063f, +0.84375f,0.914063f, +0.851563f,0.914063f, +0.859375f,0.914063f, +0.867188f,0.914063f, +0.875f,0.914063f, +0.882813f,0.914063f, +0.890625f,0.914063f, +0.898438f,0.914063f, +0.90625f,0.914063f, +0.914063f,0.914063f, +0.921875f,0.914063f, +0.929688f,0.914063f, +0.9375f,0.914063f, +0.945313f,0.914063f, +0.953125f,0.914063f, +0.960938f,0.914063f, +0.96875f,0.914063f, +0.976563f,0.914063f, +0.984375f,0.914063f, +0.992188f,0.914063f, +1.0f,0.914063f, +0.507813f,0.921875f, +0.515625f,0.921875f, +0.523438f,0.921875f, +0.53125f,0.921875f, +0.539063f,0.921875f, +0.546875f,0.921875f, +0.554688f,0.921875f, +0.5625f,0.921875f, +0.570313f,0.921875f, +0.578125f,0.921875f, +0.585938f,0.921875f, +0.59375f,0.921875f, +0.601563f,0.921875f, +0.609375f,0.921875f, +0.617188f,0.921875f, +0.625f,0.921875f, +0.632813f,0.921875f, +0.640625f,0.921875f, +0.648438f,0.921875f, +0.65625f,0.921875f, +0.664063f,0.921875f, +0.671875f,0.921875f, +0.679688f,0.921875f, +0.6875f,0.921875f, +0.695313f,0.921875f, +0.703125f,0.921875f, +0.710938f,0.921875f, +0.71875f,0.921875f, +0.726563f,0.921875f, +0.734375f,0.921875f, +0.742188f,0.921875f, +0.75f,0.921875f, +0.757813f,0.921875f, +0.765625f,0.921875f, +0.773438f,0.921875f, +0.78125f,0.921875f, +0.789063f,0.921875f, +0.796875f,0.921875f, +0.804688f,0.921875f, +0.8125f,0.921875f, +0.820313f,0.921875f, +0.828125f,0.921875f, +0.835938f,0.921875f, +0.84375f,0.921875f, +0.851563f,0.921875f, +0.859375f,0.921875f, +0.867188f,0.921875f, +0.875f,0.921875f, +0.882813f,0.921875f, +0.890625f,0.921875f, +0.898438f,0.921875f, +0.90625f,0.921875f, +0.914063f,0.921875f, +0.921875f,0.921875f, +0.929688f,0.921875f, +0.9375f,0.921875f, +0.945313f,0.921875f, +0.953125f,0.921875f, +0.960938f,0.921875f, +0.96875f,0.921875f, +0.976563f,0.921875f, +0.984375f,0.921875f, +0.992188f,0.921875f, +1.0f,0.921875f, +0.507813f,0.929688f, +0.515625f,0.929688f, +0.523438f,0.929688f, +0.53125f,0.929688f, +0.539063f,0.929688f, +0.546875f,0.929688f, +0.554688f,0.929688f, +0.5625f,0.929688f, +0.570313f,0.929688f, +0.578125f,0.929688f, +0.585938f,0.929688f, +0.59375f,0.929688f, +0.601563f,0.929688f, +0.609375f,0.929688f, +0.617188f,0.929688f, +0.625f,0.929688f, +0.632813f,0.929688f, +0.640625f,0.929688f, +0.648438f,0.929688f, +0.65625f,0.929688f, +0.664063f,0.929688f, +0.671875f,0.929688f, +0.679688f,0.929688f, +0.6875f,0.929688f, +0.695313f,0.929688f, +0.703125f,0.929688f, +0.710938f,0.929688f, +0.71875f,0.929688f, +0.726563f,0.929688f, +0.734375f,0.929688f, +0.742188f,0.929688f, +0.75f,0.929688f, +0.757813f,0.929688f, +0.765625f,0.929688f, +0.773438f,0.929688f, +0.78125f,0.929688f, +0.789063f,0.929688f, +0.796875f,0.929688f, +0.804688f,0.929688f, +0.8125f,0.929688f, +0.820313f,0.929688f, +0.828125f,0.929688f, +0.835938f,0.929688f, +0.84375f,0.929688f, +0.851563f,0.929688f, +0.859375f,0.929688f, +0.867188f,0.929688f, +0.875f,0.929688f, +0.882813f,0.929688f, +0.890625f,0.929688f, +0.898438f,0.929688f, +0.90625f,0.929688f, +0.914063f,0.929688f, +0.921875f,0.929688f, +0.929688f,0.929688f, +0.9375f,0.929688f, +0.945313f,0.929688f, +0.953125f,0.929688f, +0.960938f,0.929688f, +0.96875f,0.929688f, +0.976563f,0.929688f, +0.984375f,0.929688f, +0.992188f,0.929688f, +1.0f,0.929688f, +0.507813f,0.9375f, +0.515625f,0.9375f, +0.523438f,0.9375f, +0.53125f,0.9375f, +0.539063f,0.9375f, +0.546875f,0.9375f, +0.554688f,0.9375f, +0.5625f,0.9375f, +0.570313f,0.9375f, +0.578125f,0.9375f, +0.585938f,0.9375f, +0.59375f,0.9375f, +0.601563f,0.9375f, +0.609375f,0.9375f, +0.617188f,0.9375f, +0.625f,0.9375f, +0.632813f,0.9375f, +0.640625f,0.9375f, +0.648438f,0.9375f, +0.65625f,0.9375f, +0.664063f,0.9375f, +0.671875f,0.9375f, +0.679688f,0.9375f, +0.6875f,0.9375f, +0.695313f,0.9375f, +0.703125f,0.9375f, +0.710938f,0.9375f, +0.71875f,0.9375f, +0.726563f,0.9375f, +0.734375f,0.9375f, +0.742188f,0.9375f, +0.75f,0.9375f, +0.757813f,0.9375f, +0.765625f,0.9375f, +0.773438f,0.9375f, +0.78125f,0.9375f, +0.789063f,0.9375f, +0.796875f,0.9375f, +0.804688f,0.9375f, +0.8125f,0.9375f, +0.820313f,0.9375f, +0.828125f,0.9375f, +0.835938f,0.9375f, +0.84375f,0.9375f, +0.851563f,0.9375f, +0.859375f,0.9375f, +0.867188f,0.9375f, +0.875f,0.9375f, +0.882813f,0.9375f, +0.890625f,0.9375f, +0.898438f,0.9375f, +0.90625f,0.9375f, +0.914063f,0.9375f, +0.921875f,0.9375f, +0.929688f,0.9375f, +0.9375f,0.9375f, +0.945313f,0.9375f, +0.953125f,0.9375f, +0.960938f,0.9375f, +0.96875f,0.9375f, +0.976563f,0.9375f, +0.984375f,0.9375f, +0.992188f,0.9375f, +1.0f,0.9375f, +0.507813f,0.945313f, +0.515625f,0.945313f, +0.523438f,0.945313f, +0.53125f,0.945313f, +0.539063f,0.945313f, +0.546875f,0.945313f, +0.554688f,0.945313f, +0.5625f,0.945313f, +0.570313f,0.945313f, +0.578125f,0.945313f, +0.585938f,0.945313f, +0.59375f,0.945313f, +0.601563f,0.945313f, +0.609375f,0.945313f, +0.617188f,0.945313f, +0.625f,0.945313f, +0.632813f,0.945313f, +0.640625f,0.945313f, +0.648438f,0.945313f, +0.65625f,0.945313f, +0.664063f,0.945313f, +0.671875f,0.945313f, +0.679688f,0.945313f, +0.6875f,0.945313f, +0.695313f,0.945313f, +0.703125f,0.945313f, +0.710938f,0.945313f, +0.71875f,0.945313f, +0.726563f,0.945313f, +0.734375f,0.945313f, +0.742188f,0.945313f, +0.75f,0.945313f, +0.757813f,0.945313f, +0.765625f,0.945313f, +0.773438f,0.945313f, +0.78125f,0.945313f, +0.789063f,0.945313f, +0.796875f,0.945313f, +0.804688f,0.945313f, +0.8125f,0.945313f, +0.820313f,0.945313f, +0.828125f,0.945313f, +0.835938f,0.945313f, +0.84375f,0.945313f, +0.851563f,0.945313f, +0.859375f,0.945313f, +0.867188f,0.945313f, +0.875f,0.945313f, +0.882813f,0.945313f, +0.890625f,0.945313f, +0.898438f,0.945313f, +0.90625f,0.945313f, +0.914063f,0.945313f, +0.921875f,0.945313f, +0.929688f,0.945313f, +0.9375f,0.945313f, +0.945313f,0.945313f, +0.953125f,0.945313f, +0.960938f,0.945313f, +0.96875f,0.945313f, +0.976563f,0.945313f, +0.984375f,0.945313f, +0.992188f,0.945313f, +1.0f,0.945313f, +0.507813f,0.953125f, +0.515625f,0.953125f, +0.523438f,0.953125f, +0.53125f,0.953125f, +0.539063f,0.953125f, +0.546875f,0.953125f, +0.554688f,0.953125f, +0.5625f,0.953125f, +0.570313f,0.953125f, +0.578125f,0.953125f, +0.585938f,0.953125f, +0.59375f,0.953125f, +0.601563f,0.953125f, +0.609375f,0.953125f, +0.617188f,0.953125f, +0.625f,0.953125f, +0.632813f,0.953125f, +0.640625f,0.953125f, +0.648438f,0.953125f, +0.65625f,0.953125f, +0.664063f,0.953125f, +0.671875f,0.953125f, +0.679688f,0.953125f, +0.6875f,0.953125f, +0.695313f,0.953125f, +0.703125f,0.953125f, +0.710938f,0.953125f, +0.71875f,0.953125f, +0.726563f,0.953125f, +0.734375f,0.953125f, +0.742188f,0.953125f, +0.75f,0.953125f, +0.757813f,0.953125f, +0.765625f,0.953125f, +0.773438f,0.953125f, +0.78125f,0.953125f, +0.789063f,0.953125f, +0.796875f,0.953125f, +0.804688f,0.953125f, +0.8125f,0.953125f, +0.820313f,0.953125f, +0.828125f,0.953125f, +0.835938f,0.953125f, +0.84375f,0.953125f, +0.851563f,0.953125f, +0.859375f,0.953125f, +0.867188f,0.953125f, +0.875f,0.953125f, +0.882813f,0.953125f, +0.890625f,0.953125f, +0.898438f,0.953125f, +0.90625f,0.953125f, +0.914063f,0.953125f, +0.921875f,0.953125f, +0.929688f,0.953125f, +0.9375f,0.953125f, +0.945313f,0.953125f, +0.953125f,0.953125f, +0.960938f,0.953125f, +0.96875f,0.953125f, +0.976563f,0.953125f, +0.984375f,0.953125f, +0.992188f,0.953125f, +1.0f,0.953125f, +0.507813f,0.960938f, +0.515625f,0.960938f, +0.523438f,0.960938f, +0.53125f,0.960938f, +0.539063f,0.960938f, +0.546875f,0.960938f, +0.554688f,0.960938f, +0.5625f,0.960938f, +0.570313f,0.960938f, +0.578125f,0.960938f, +0.585938f,0.960938f, +0.59375f,0.960938f, +0.601563f,0.960938f, +0.609375f,0.960938f, +0.617188f,0.960938f, +0.625f,0.960938f, +0.632813f,0.960938f, +0.640625f,0.960938f, +0.648438f,0.960938f, +0.65625f,0.960938f, +0.664063f,0.960938f, +0.671875f,0.960938f, +0.679688f,0.960938f, +0.6875f,0.960938f, +0.695313f,0.960938f, +0.703125f,0.960938f, +0.710938f,0.960938f, +0.71875f,0.960938f, +0.726563f,0.960938f, +0.734375f,0.960938f, +0.742188f,0.960938f, +0.75f,0.960938f, +0.757813f,0.960938f, +0.765625f,0.960938f, +0.773438f,0.960938f, +0.78125f,0.960938f, +0.789063f,0.960938f, +0.796875f,0.960938f, +0.804688f,0.960938f, +0.8125f,0.960938f, +0.820313f,0.960938f, +0.828125f,0.960938f, +0.835938f,0.960938f, +0.84375f,0.960938f, +0.851563f,0.960938f, +0.859375f,0.960938f, +0.867188f,0.960938f, +0.875f,0.960938f, +0.882813f,0.960938f, +0.890625f,0.960938f, +0.898438f,0.960938f, +0.90625f,0.960938f, +0.914063f,0.960938f, +0.921875f,0.960938f, +0.929688f,0.960938f, +0.9375f,0.960938f, +0.945313f,0.960938f, +0.953125f,0.960938f, +0.960938f,0.960938f, +0.96875f,0.960938f, +0.976563f,0.960938f, +0.984375f,0.960938f, +0.992188f,0.960938f, +1.0f,0.960938f, +0.507813f,0.96875f, +0.515625f,0.96875f, +0.523438f,0.96875f, +0.53125f,0.96875f, +0.539063f,0.96875f, +0.546875f,0.96875f, +0.554688f,0.96875f, +0.5625f,0.96875f, +0.570313f,0.96875f, +0.578125f,0.96875f, +0.585938f,0.96875f, +0.59375f,0.96875f, +0.601563f,0.96875f, +0.609375f,0.96875f, +0.617188f,0.96875f, +0.625f,0.96875f, +0.632813f,0.96875f, +0.640625f,0.96875f, +0.648438f,0.96875f, +0.65625f,0.96875f, +0.664063f,0.96875f, +0.671875f,0.96875f, +0.679688f,0.96875f, +0.6875f,0.96875f, +0.695313f,0.96875f, +0.703125f,0.96875f, +0.710938f,0.96875f, +0.71875f,0.96875f, +0.726563f,0.96875f, +0.734375f,0.96875f, +0.742188f,0.96875f, +0.75f,0.96875f, +0.757813f,0.96875f, +0.765625f,0.96875f, +0.773438f,0.96875f, +0.78125f,0.96875f, +0.789063f,0.96875f, +0.796875f,0.96875f, +0.804688f,0.96875f, +0.8125f,0.96875f, +0.820313f,0.96875f, +0.828125f,0.96875f, +0.835938f,0.96875f, +0.84375f,0.96875f, +0.851563f,0.96875f, +0.859375f,0.96875f, +0.867188f,0.96875f, +0.875f,0.96875f, +0.882813f,0.96875f, +0.890625f,0.96875f, +0.898438f,0.96875f, +0.90625f,0.96875f, +0.914063f,0.96875f, +0.921875f,0.96875f, +0.929688f,0.96875f, +0.9375f,0.96875f, +0.945313f,0.96875f, +0.953125f,0.96875f, +0.960938f,0.96875f, +0.96875f,0.96875f, +0.976563f,0.96875f, +0.984375f,0.96875f, +0.992188f,0.96875f, +1.0f,0.96875f, +0.507813f,0.976563f, +0.515625f,0.976563f, +0.523438f,0.976563f, +0.53125f,0.976563f, +0.539063f,0.976563f, +0.546875f,0.976563f, +0.554688f,0.976563f, +0.5625f,0.976563f, +0.570313f,0.976563f, +0.578125f,0.976563f, +0.585938f,0.976563f, +0.59375f,0.976563f, +0.601563f,0.976563f, +0.609375f,0.976563f, +0.617188f,0.976563f, +0.625f,0.976563f, +0.632813f,0.976563f, +0.640625f,0.976563f, +0.648438f,0.976563f, +0.65625f,0.976563f, +0.664063f,0.976563f, +0.671875f,0.976563f, +0.679688f,0.976563f, +0.6875f,0.976563f, +0.695313f,0.976563f, +0.703125f,0.976563f, +0.710938f,0.976563f, +0.71875f,0.976563f, +0.726563f,0.976563f, +0.734375f,0.976563f, +0.742188f,0.976563f, +0.75f,0.976563f, +0.757813f,0.976563f, +0.765625f,0.976563f, +0.773438f,0.976563f, +0.78125f,0.976563f, +0.789063f,0.976563f, +0.796875f,0.976563f, +0.804688f,0.976563f, +0.8125f,0.976563f, +0.820313f,0.976563f, +0.828125f,0.976563f, +0.835938f,0.976563f, +0.84375f,0.976563f, +0.851563f,0.976563f, +0.859375f,0.976563f, +0.867188f,0.976563f, +0.875f,0.976563f, +0.882813f,0.976563f, +0.890625f,0.976563f, +0.898438f,0.976563f, +0.90625f,0.976563f, +0.914063f,0.976563f, +0.921875f,0.976563f, +0.929688f,0.976563f, +0.9375f,0.976563f, +0.945313f,0.976563f, +0.953125f,0.976563f, +0.960938f,0.976563f, +0.96875f,0.976563f, +0.976563f,0.976563f, +0.984375f,0.976563f, +0.992188f,0.976563f, +1.0f,0.976563f, +0.507813f,0.984375f, +0.515625f,0.984375f, +0.523438f,0.984375f, +0.53125f,0.984375f, +0.539063f,0.984375f, +0.546875f,0.984375f, +0.554688f,0.984375f, +0.5625f,0.984375f, +0.570313f,0.984375f, +0.578125f,0.984375f, +0.585938f,0.984375f, +0.59375f,0.984375f, +0.601563f,0.984375f, +0.609375f,0.984375f, +0.617188f,0.984375f, +0.625f,0.984375f, +0.632813f,0.984375f, +0.640625f,0.984375f, +0.648438f,0.984375f, +0.65625f,0.984375f, +0.664063f,0.984375f, +0.671875f,0.984375f, +0.679688f,0.984375f, +0.6875f,0.984375f, +0.695313f,0.984375f, +0.703125f,0.984375f, +0.710938f,0.984375f, +0.71875f,0.984375f, +0.726563f,0.984375f, +0.734375f,0.984375f, +0.742188f,0.984375f, +0.75f,0.984375f, +0.757813f,0.984375f, +0.765625f,0.984375f, +0.773438f,0.984375f, +0.78125f,0.984375f, +0.789063f,0.984375f, +0.796875f,0.984375f, +0.804688f,0.984375f, +0.8125f,0.984375f, +0.820313f,0.984375f, +0.828125f,0.984375f, +0.835938f,0.984375f, +0.84375f,0.984375f, +0.851563f,0.984375f, +0.859375f,0.984375f, +0.867188f,0.984375f, +0.875f,0.984375f, +0.882813f,0.984375f, +0.890625f,0.984375f, +0.898438f,0.984375f, +0.90625f,0.984375f, +0.914063f,0.984375f, +0.921875f,0.984375f, +0.929688f,0.984375f, +0.9375f,0.984375f, +0.945313f,0.984375f, +0.953125f,0.984375f, +0.960938f,0.984375f, +0.96875f,0.984375f, +0.976563f,0.984375f, +0.984375f,0.984375f, +0.992188f,0.984375f, +1.0f,0.984375f, +0.507813f,0.992188f, +0.515625f,0.992188f, +0.523438f,0.992188f, +0.53125f,0.992188f, +0.539063f,0.992188f, +0.546875f,0.992188f, +0.554688f,0.992188f, +0.5625f,0.992188f, +0.570313f,0.992188f, +0.578125f,0.992188f, +0.585938f,0.992188f, +0.59375f,0.992188f, +0.601563f,0.992188f, +0.609375f,0.992188f, +0.617188f,0.992188f, +0.625f,0.992188f, +0.632813f,0.992188f, +0.640625f,0.992188f, +0.648438f,0.992188f, +0.65625f,0.992188f, +0.664063f,0.992188f, +0.671875f,0.992188f, +0.679688f,0.992188f, +0.6875f,0.992188f, +0.695313f,0.992188f, +0.703125f,0.992188f, +0.710938f,0.992188f, +0.71875f,0.992188f, +0.726563f,0.992188f, +0.734375f,0.992188f, +0.742188f,0.992188f, +0.75f,0.992188f, +0.757813f,0.992188f, +0.765625f,0.992188f, +0.773438f,0.992188f, +0.78125f,0.992188f, +0.789063f,0.992188f, +0.796875f,0.992188f, +0.804688f,0.992188f, +0.8125f,0.992188f, +0.820313f,0.992188f, +0.828125f,0.992188f, +0.835938f,0.992188f, +0.84375f,0.992188f, +0.851563f,0.992188f, +0.859375f,0.992188f, +0.867188f,0.992188f, +0.875f,0.992188f, +0.882813f,0.992188f, +0.890625f,0.992188f, +0.898438f,0.992188f, +0.90625f,0.992188f, +0.914063f,0.992188f, +0.921875f,0.992188f, +0.929688f,0.992188f, +0.9375f,0.992188f, +0.945313f,0.992188f, +0.953125f,0.992188f, +0.960938f,0.992188f, +0.96875f,0.992188f, +0.976563f,0.992188f, +0.984375f,0.992188f, +0.992188f,0.992188f, +1.0f,0.992188f, +0.507813f,1.0f, +0.515625f,1.0f, +0.523438f,1.0f, +0.53125f,1.0f, +0.539063f,1.0f, +0.546875f,1.0f, +0.554688f,1.0f, +0.5625f,1.0f, +0.570313f,1.0f, +0.578125f,1.0f, +0.585938f,1.0f, +0.59375f,1.0f, +0.601563f,1.0f, +0.609375f,1.0f, +0.617188f,1.0f, +0.625f,1.0f, +0.632813f,1.0f, +0.640625f,1.0f, +0.648438f,1.0f, +0.65625f,1.0f, +0.664063f,1.0f, +0.671875f,1.0f, +0.679688f,1.0f, +0.6875f,1.0f, +0.695313f,1.0f, +0.703125f,1.0f, +0.710938f,1.0f, +0.71875f,1.0f, +0.726563f,1.0f, +0.734375f,1.0f, +0.742188f,1.0f, +0.75f,1.0f, +0.757813f,1.0f, +0.765625f,1.0f, +0.773438f,1.0f, +0.78125f,1.0f, +0.789063f,1.0f, +0.796875f,1.0f, +0.804688f,1.0f, +0.8125f,1.0f, +0.820313f,1.0f, +0.828125f,1.0f, +0.835938f,1.0f, +0.84375f,1.0f, +0.851563f,1.0f, +0.859375f,1.0f, +0.867188f,1.0f, +0.875f,1.0f, +0.882813f,1.0f, +0.890625f,1.0f, +0.898438f,1.0f, +0.90625f,1.0f, +0.914063f,1.0f, +0.921875f,1.0f, +0.929688f,1.0f, +0.9375f,1.0f, +0.945313f,1.0f, +0.953125f,1.0f, +0.960938f,1.0f, +0.96875f,1.0f, +0.976563f,1.0f, +0.984375f,1.0f, +0.992188f,1.0f, +1.0f,1.0f, +}; + +unsigned short Landscape07Idx[] = { +0,1,2, +3,2,1, +2,3,4, +5,4,3, +4,5,6, +7,6,5, +6,7,8, +9,8,7, +8,9,10, +11,10,9, +10,11,12, +13,12,11, +12,13,14, +15,14,13, +14,15,16, +17,16,15, +16,17,18, +19,18,17, +18,19,20, +21,20,19, +20,21,22, +23,22,21, +22,23,24, +25,24,23, +24,25,26, +27,26,25, +26,27,28, +29,28,27, +28,29,30, +31,30,29, +30,31,32, +33,32,31, +32,33,34, +35,34,33, +34,35,36, +37,36,35, +36,37,38, +39,38,37, +38,39,40, +41,40,39, +40,41,42, +43,42,41, +42,43,44, +45,44,43, +44,45,46, +47,46,45, +46,47,48, +49,48,47, +48,49,50, +51,50,49, +50,51,52, +53,52,51, +52,53,54, +55,54,53, +54,55,56, +57,56,55, +56,57,58, +59,58,57, +58,59,60, +61,60,59, +60,61,62, +63,62,61, +62,63,64, +65,64,63, +64,65,66, +67,66,65, +66,67,68, +69,68,67, +68,69,70, +71,70,69, +70,71,72, +73,72,71, +72,73,74, +75,74,73, +74,75,76, +77,76,75, +76,77,78, +79,78,77, +78,79,80, +81,80,79, +80,81,82, +83,82,81, +82,83,84, +85,84,83, +84,85,86, +87,86,85, +86,87,88, +89,88,87, +88,89,90, +91,90,89, +90,91,92, +93,92,91, +92,93,94, +95,94,93, +94,95,96, +97,96,95, +96,97,98, +99,98,97, +98,99,100, +101,100,99, +100,101,102, +103,102,101, +102,103,104, +105,104,103, +104,105,106, +107,106,105, +106,107,108, +109,108,107, +108,109,110, +111,110,109, +110,111,112, +113,112,111, +112,113,114, +115,114,113, +114,115,116, +117,116,115, +116,117,118, +119,118,117, +118,119,120, +121,120,119, +120,121,122, +123,122,121, +122,123,124, +125,124,123, +124,125,126, +127,126,125, +128,0,129, +2,129,0, +129,2,130, +4,130,2, +130,4,131, +6,131,4, +131,6,132, +8,132,6, +132,8,133, +10,133,8, +133,10,134, +12,134,10, +134,12,135, +14,135,12, +135,14,136, +16,136,14, +136,16,137, +18,137,16, +137,18,138, +20,138,18, +138,20,139, +22,139,20, +139,22,140, +24,140,22, +140,24,141, +26,141,24, +141,26,142, +28,142,26, +142,28,143, +30,143,28, +143,30,144, +32,144,30, +144,32,145, +34,145,32, +145,34,146, +36,146,34, +146,36,147, +38,147,36, +147,38,148, +40,148,38, +148,40,149, +42,149,40, +149,42,150, +44,150,42, +150,44,151, +46,151,44, +151,46,152, +48,152,46, +152,48,153, +50,153,48, +153,50,154, +52,154,50, +154,52,155, +54,155,52, +155,54,156, +56,156,54, +156,56,157, +58,157,56, +157,58,158, +60,158,58, +158,60,159, +62,159,60, +159,62,160, +64,160,62, +160,64,161, +66,161,64, +161,66,162, +68,162,66, +162,68,163, +70,163,68, +163,70,164, +72,164,70, +164,72,165, +74,165,72, +165,74,166, +76,166,74, +166,76,167, +78,167,76, +167,78,168, +80,168,78, +168,80,169, +82,169,80, +169,82,170, +84,170,82, +170,84,171, +86,171,84, +171,86,172, +88,172,86, +172,88,173, +90,173,88, +173,90,174, +92,174,90, +174,92,175, +94,175,92, +175,94,176, +96,176,94, +176,96,177, +98,177,96, +177,98,178, +100,178,98, +178,100,179, +102,179,100, +179,102,180, +104,180,102, +180,104,181, +106,181,104, +181,106,182, +108,182,106, +182,108,183, +110,183,108, +183,110,184, +112,184,110, +184,112,185, +114,185,112, +185,114,186, +116,186,114, +186,116,187, +118,187,116, +187,118,188, +120,188,118, +188,120,189, +122,189,120, +189,122,190, +124,190,122, +190,124,191, +126,191,124, +192,128,193, +129,193,128, +193,129,194, +130,194,129, +194,130,195, +131,195,130, +195,131,196, +132,196,131, +196,132,197, +133,197,132, +197,133,198, +134,198,133, +198,134,199, +135,199,134, +199,135,200, +136,200,135, +200,136,201, +137,201,136, +201,137,202, +138,202,137, +202,138,203, +139,203,138, +203,139,204, +140,204,139, +204,140,205, +141,205,140, +205,141,206, +142,206,141, +206,142,207, +143,207,142, +207,143,208, +144,208,143, +208,144,209, +145,209,144, +209,145,210, +146,210,145, +210,146,211, +147,211,146, +211,147,212, +148,212,147, +212,148,213, +149,213,148, +213,149,214, +150,214,149, +214,150,215, +151,215,150, +215,151,216, +152,216,151, +216,152,217, +153,217,152, +217,153,218, +154,218,153, +218,154,219, +155,219,154, +219,155,220, +156,220,155, +220,156,221, +157,221,156, +221,157,222, +158,222,157, +222,158,223, +159,223,158, +223,159,224, +160,224,159, +224,160,225, +161,225,160, +225,161,226, +162,226,161, +226,162,227, +163,227,162, +227,163,228, +164,228,163, +228,164,229, +165,229,164, +229,165,230, +166,230,165, +230,166,231, +167,231,166, +231,167,232, +168,232,167, +232,168,233, +169,233,168, +233,169,234, +170,234,169, +234,170,235, +171,235,170, +235,171,236, +172,236,171, +236,172,237, +173,237,172, +237,173,238, +174,238,173, +238,174,239, +175,239,174, +239,175,240, +176,240,175, +240,176,241, +177,241,176, +241,177,242, +178,242,177, +242,178,243, +179,243,178, +243,179,244, +180,244,179, +244,180,245, +181,245,180, +245,181,246, +182,246,181, +246,182,247, +183,247,182, +247,183,248, +184,248,183, +248,184,249, +185,249,184, +249,185,250, +186,250,185, +250,186,251, +187,251,186, +251,187,252, +188,252,187, +252,188,253, +189,253,188, +253,189,254, +190,254,189, +254,190,255, +191,255,190, +256,192,257, +193,257,192, +257,193,258, +194,258,193, +258,194,259, +195,259,194, +259,195,260, +196,260,195, +260,196,261, +197,261,196, +261,197,262, +198,262,197, +262,198,263, +199,263,198, +263,199,264, +200,264,199, +264,200,265, +201,265,200, +265,201,266, +202,266,201, +266,202,267, +203,267,202, +267,203,268, +204,268,203, +268,204,269, +205,269,204, +269,205,270, +206,270,205, +270,206,271, +207,271,206, +271,207,272, +208,272,207, +272,208,273, +209,273,208, +273,209,274, +210,274,209, +274,210,275, +211,275,210, +275,211,276, +212,276,211, +276,212,277, +213,277,212, +277,213,278, +214,278,213, +278,214,279, +215,279,214, +279,215,280, +216,280,215, +280,216,281, +217,281,216, +281,217,282, +218,282,217, +282,218,283, +219,283,218, +283,219,284, +220,284,219, +284,220,285, +221,285,220, +285,221,286, +222,286,221, +286,222,287, +223,287,222, +287,223,288, +224,288,223, +288,224,289, +225,289,224, +289,225,290, +226,290,225, +290,226,291, +227,291,226, +291,227,292, +228,292,227, +292,228,293, +229,293,228, +293,229,294, +230,294,229, +294,230,295, +231,295,230, +295,231,296, +232,296,231, +296,232,297, +233,297,232, +297,233,298, +234,298,233, +298,234,299, +235,299,234, +299,235,300, +236,300,235, +300,236,301, +237,301,236, +301,237,302, +238,302,237, +302,238,303, +239,303,238, +303,239,304, +240,304,239, +304,240,305, +241,305,240, +305,241,306, +242,306,241, +306,242,307, +243,307,242, +307,243,308, +244,308,243, +308,244,309, +245,309,244, +309,245,310, +246,310,245, +310,246,311, +247,311,246, +311,247,312, +248,312,247, +312,248,313, +249,313,248, +313,249,314, +250,314,249, +314,250,315, +251,315,250, +315,251,316, +252,316,251, +316,252,317, +253,317,252, +317,253,318, +254,318,253, +318,254,319, +255,319,254, +320,256,321, +257,321,256, +321,257,322, +258,322,257, +322,258,323, +259,323,258, +323,259,324, +260,324,259, +324,260,325, +261,325,260, +325,261,326, +262,326,261, +326,262,327, +263,327,262, +327,263,328, +264,328,263, +328,264,329, +265,329,264, +329,265,330, +266,330,265, +330,266,331, +267,331,266, +331,267,332, +268,332,267, +332,268,333, +269,333,268, +333,269,334, +270,334,269, +334,270,335, +271,335,270, +335,271,336, +272,336,271, +336,272,337, +273,337,272, +337,273,338, +274,338,273, +338,274,339, +275,339,274, +339,275,340, +276,340,275, +340,276,341, +277,341,276, +341,277,342, +278,342,277, +342,278,343, +279,343,278, +343,279,344, +280,344,279, +344,280,345, +281,345,280, +345,281,346, +282,346,281, +346,282,347, +283,347,282, +347,283,348, +284,348,283, +348,284,349, +285,349,284, +349,285,350, +286,350,285, +350,286,351, +287,351,286, +351,287,352, +288,352,287, +352,288,353, +289,353,288, +353,289,354, +290,354,289, +354,290,355, +291,355,290, +355,291,356, +292,356,291, +356,292,357, +293,357,292, +357,293,358, +294,358,293, +358,294,359, +295,359,294, +359,295,360, +296,360,295, +360,296,361, +297,361,296, +361,297,362, +298,362,297, +362,298,363, +299,363,298, +363,299,364, +300,364,299, +364,300,365, +301,365,300, +365,301,366, +302,366,301, +366,302,367, +303,367,302, +367,303,368, +304,368,303, +368,304,369, +305,369,304, +369,305,370, +306,370,305, +370,306,371, +307,371,306, +371,307,372, +308,372,307, +372,308,373, +309,373,308, +373,309,374, +310,374,309, +374,310,375, +311,375,310, +375,311,376, +312,376,311, +376,312,377, +313,377,312, +377,313,378, +314,378,313, +378,314,379, +315,379,314, +379,315,380, +316,380,315, +380,316,381, +317,381,316, +381,317,382, +318,382,317, +382,318,383, +319,383,318, +384,320,385, +321,385,320, +385,321,386, +322,386,321, +386,322,387, +323,387,322, +387,323,388, +324,388,323, +388,324,389, +325,389,324, +389,325,390, +326,390,325, +390,326,391, +327,391,326, +391,327,392, +328,392,327, +392,328,393, +329,393,328, +393,329,394, +330,394,329, +394,330,395, +331,395,330, +395,331,396, +332,396,331, +396,332,397, +333,397,332, +397,333,398, +334,398,333, +398,334,399, +335,399,334, +399,335,400, +336,400,335, +400,336,401, +337,401,336, +401,337,402, +338,402,337, +402,338,403, +339,403,338, +403,339,404, +340,404,339, +404,340,405, +341,405,340, +405,341,406, +342,406,341, +406,342,407, +343,407,342, +407,343,408, +344,408,343, +408,344,409, +345,409,344, +409,345,410, +346,410,345, +410,346,411, +347,411,346, +411,347,412, +348,412,347, +412,348,413, +349,413,348, +413,349,414, +350,414,349, +414,350,415, +351,415,350, +415,351,416, +352,416,351, +416,352,417, +353,417,352, +417,353,418, +354,418,353, +418,354,419, +355,419,354, +419,355,420, +356,420,355, +420,356,421, +357,421,356, +421,357,422, +358,422,357, +422,358,423, +359,423,358, +423,359,424, +360,424,359, +424,360,425, +361,425,360, +425,361,426, +362,426,361, +426,362,427, +363,427,362, +427,363,428, +364,428,363, +428,364,429, +365,429,364, +429,365,430, +366,430,365, +430,366,431, +367,431,366, +431,367,432, +368,432,367, +432,368,433, +369,433,368, +433,369,434, +370,434,369, +434,370,435, +371,435,370, +435,371,436, +372,436,371, +436,372,437, +373,437,372, +437,373,438, +374,438,373, +438,374,439, +375,439,374, +439,375,440, +376,440,375, +440,376,441, +377,441,376, +441,377,442, +378,442,377, +442,378,443, +379,443,378, +443,379,444, +380,444,379, +444,380,445, +381,445,380, +445,381,446, +382,446,381, +446,382,447, +383,447,382, +448,384,449, +385,449,384, +449,385,450, +386,450,385, +450,386,451, +387,451,386, +451,387,452, +388,452,387, +452,388,453, +389,453,388, +453,389,454, +390,454,389, +454,390,455, +391,455,390, +455,391,456, +392,456,391, +456,392,457, +393,457,392, +457,393,458, +394,458,393, +458,394,459, +395,459,394, +459,395,460, +396,460,395, +460,396,461, +397,461,396, +461,397,462, +398,462,397, +462,398,463, +399,463,398, +463,399,464, +400,464,399, +464,400,465, +401,465,400, +465,401,466, +402,466,401, +466,402,467, +403,467,402, +467,403,468, +404,468,403, +468,404,469, +405,469,404, +469,405,470, +406,470,405, +470,406,471, +407,471,406, +471,407,472, +408,472,407, +472,408,473, +409,473,408, +473,409,474, +410,474,409, +474,410,475, +411,475,410, +475,411,476, +412,476,411, +476,412,477, +413,477,412, +477,413,478, +414,478,413, +478,414,479, +415,479,414, +479,415,480, +416,480,415, +480,416,481, +417,481,416, +481,417,482, +418,482,417, +482,418,483, +419,483,418, +483,419,484, +420,484,419, +484,420,485, +421,485,420, +485,421,486, +422,486,421, +486,422,487, +423,487,422, +487,423,488, +424,488,423, +488,424,489, +425,489,424, +489,425,490, +426,490,425, +490,426,491, +427,491,426, +491,427,492, +428,492,427, +492,428,493, +429,493,428, +493,429,494, +430,494,429, +494,430,495, +431,495,430, +495,431,496, +432,496,431, +496,432,497, +433,497,432, +497,433,498, +434,498,433, +498,434,499, +435,499,434, +499,435,500, +436,500,435, +500,436,501, +437,501,436, +501,437,502, +438,502,437, +502,438,503, +439,503,438, +503,439,504, +440,504,439, +504,440,505, +441,505,440, +505,441,506, +442,506,441, +506,442,507, +443,507,442, +507,443,508, +444,508,443, +508,444,509, +445,509,444, +509,445,510, +446,510,445, +510,446,511, +447,511,446, +512,448,513, +449,513,448, +513,449,514, +450,514,449, +514,450,515, +451,515,450, +515,451,516, +452,516,451, +516,452,517, +453,517,452, +517,453,518, +454,518,453, +518,454,519, +455,519,454, +519,455,520, +456,520,455, +520,456,521, +457,521,456, +521,457,522, +458,522,457, +522,458,523, +459,523,458, +523,459,524, +460,524,459, +524,460,525, +461,525,460, +525,461,526, +462,526,461, +526,462,527, +463,527,462, +527,463,528, +464,528,463, +528,464,529, +465,529,464, +529,465,530, +466,530,465, +530,466,531, +467,531,466, +531,467,532, +468,532,467, +532,468,533, +469,533,468, +533,469,534, +470,534,469, +534,470,535, +471,535,470, +535,471,536, +472,536,471, +536,472,537, +473,537,472, +537,473,538, +474,538,473, +538,474,539, +475,539,474, +539,475,540, +476,540,475, +540,476,541, +477,541,476, +541,477,542, +478,542,477, +542,478,543, +479,543,478, +543,479,544, +480,544,479, +544,480,545, +481,545,480, +545,481,546, +482,546,481, +546,482,547, +483,547,482, +547,483,548, +484,548,483, +548,484,549, +485,549,484, +549,485,550, +486,550,485, +550,486,551, +487,551,486, +551,487,552, +488,552,487, +552,488,553, +489,553,488, +553,489,554, +490,554,489, +554,490,555, +491,555,490, +555,491,556, +492,556,491, +556,492,557, +493,557,492, +557,493,558, +494,558,493, +558,494,559, +495,559,494, +559,495,560, +496,560,495, +560,496,561, +497,561,496, +561,497,562, +498,562,497, +562,498,563, +499,563,498, +563,499,564, +500,564,499, +564,500,565, +501,565,500, +565,501,566, +502,566,501, +566,502,567, +503,567,502, +567,503,568, +504,568,503, +568,504,569, +505,569,504, +569,505,570, +506,570,505, +570,506,571, +507,571,506, +571,507,572, +508,572,507, +572,508,573, +509,573,508, +573,509,574, +510,574,509, +574,510,575, +511,575,510, +576,512,577, +513,577,512, +577,513,578, +514,578,513, +578,514,579, +515,579,514, +579,515,580, +516,580,515, +580,516,581, +517,581,516, +581,517,582, +518,582,517, +582,518,583, +519,583,518, +583,519,584, +520,584,519, +584,520,585, +521,585,520, +585,521,586, +522,586,521, +586,522,587, +523,587,522, +587,523,588, +524,588,523, +588,524,589, +525,589,524, +589,525,590, +526,590,525, +590,526,591, +527,591,526, +591,527,592, +528,592,527, +592,528,593, +529,593,528, +593,529,594, +530,594,529, +594,530,595, +531,595,530, +595,531,596, +532,596,531, +596,532,597, +533,597,532, +597,533,598, +534,598,533, +598,534,599, +535,599,534, +599,535,600, +536,600,535, +600,536,601, +537,601,536, +601,537,602, +538,602,537, +602,538,603, +539,603,538, +603,539,604, +540,604,539, +604,540,605, +541,605,540, +605,541,606, +542,606,541, +606,542,607, +543,607,542, +607,543,608, +544,608,543, +608,544,609, +545,609,544, +609,545,610, +546,610,545, +610,546,611, +547,611,546, +611,547,612, +548,612,547, +612,548,613, +549,613,548, +613,549,614, +550,614,549, +614,550,615, +551,615,550, +615,551,616, +552,616,551, +616,552,617, +553,617,552, +617,553,618, +554,618,553, +618,554,619, +555,619,554, +619,555,620, +556,620,555, +620,556,621, +557,621,556, +621,557,622, +558,622,557, +622,558,623, +559,623,558, +623,559,624, +560,624,559, +624,560,625, +561,625,560, +625,561,626, +562,626,561, +626,562,627, +563,627,562, +627,563,628, +564,628,563, +628,564,629, +565,629,564, +629,565,630, +566,630,565, +630,566,631, +567,631,566, +631,567,632, +568,632,567, +632,568,633, +569,633,568, +633,569,634, +570,634,569, +634,570,635, +571,635,570, +635,571,636, +572,636,571, +636,572,637, +573,637,572, +637,573,638, +574,638,573, +638,574,639, +575,639,574, +640,576,641, +577,641,576, +641,577,642, +578,642,577, +642,578,643, +579,643,578, +643,579,644, +580,644,579, +644,580,645, +581,645,580, +645,581,646, +582,646,581, +646,582,647, +583,647,582, +647,583,648, +584,648,583, +648,584,649, +585,649,584, +649,585,650, +586,650,585, +650,586,651, +587,651,586, +651,587,652, +588,652,587, +652,588,653, +589,653,588, +653,589,654, +590,654,589, +654,590,655, +591,655,590, +655,591,656, +592,656,591, +656,592,657, +593,657,592, +657,593,658, +594,658,593, +658,594,659, +595,659,594, +659,595,660, +596,660,595, +660,596,661, +597,661,596, +661,597,662, +598,662,597, +662,598,663, +599,663,598, +663,599,664, +600,664,599, +664,600,665, +601,665,600, +665,601,666, +602,666,601, +666,602,667, +603,667,602, +667,603,668, +604,668,603, +668,604,669, +605,669,604, +669,605,670, +606,670,605, +670,606,671, +607,671,606, +671,607,672, +608,672,607, +672,608,673, +609,673,608, +673,609,674, +610,674,609, +674,610,675, +611,675,610, +675,611,676, +612,676,611, +676,612,677, +613,677,612, +677,613,678, +614,678,613, +678,614,679, +615,679,614, +679,615,680, +616,680,615, +680,616,681, +617,681,616, +681,617,682, +618,682,617, +682,618,683, +619,683,618, +683,619,684, +620,684,619, +684,620,685, +621,685,620, +685,621,686, +622,686,621, +686,622,687, +623,687,622, +687,623,688, +624,688,623, +688,624,689, +625,689,624, +689,625,690, +626,690,625, +690,626,691, +627,691,626, +691,627,692, +628,692,627, +692,628,693, +629,693,628, +693,629,694, +630,694,629, +694,630,695, +631,695,630, +695,631,696, +632,696,631, +696,632,697, +633,697,632, +697,633,698, +634,698,633, +698,634,699, +635,699,634, +699,635,700, +636,700,635, +700,636,701, +637,701,636, +701,637,702, +638,702,637, +702,638,703, +639,703,638, +704,640,705, +641,705,640, +705,641,706, +642,706,641, +706,642,707, +643,707,642, +707,643,708, +644,708,643, +708,644,709, +645,709,644, +709,645,710, +646,710,645, +710,646,711, +647,711,646, +711,647,712, +648,712,647, +712,648,713, +649,713,648, +713,649,714, +650,714,649, +714,650,715, +651,715,650, +715,651,716, +652,716,651, +716,652,717, +653,717,652, +717,653,718, +654,718,653, +718,654,719, +655,719,654, +719,655,720, +656,720,655, +720,656,721, +657,721,656, +721,657,722, +658,722,657, +722,658,723, +659,723,658, +723,659,724, +660,724,659, +724,660,725, +661,725,660, +725,661,726, +662,726,661, +726,662,727, +663,727,662, +727,663,728, +664,728,663, +728,664,729, +665,729,664, +729,665,730, +666,730,665, +730,666,731, +667,731,666, +731,667,732, +668,732,667, +732,668,733, +669,733,668, +733,669,734, +670,734,669, +734,670,735, +671,735,670, +735,671,736, +672,736,671, +736,672,737, +673,737,672, +737,673,738, +674,738,673, +738,674,739, +675,739,674, +739,675,740, +676,740,675, +740,676,741, +677,741,676, +741,677,742, +678,742,677, +742,678,743, +679,743,678, +743,679,744, +680,744,679, +744,680,745, +681,745,680, +745,681,746, +682,746,681, +746,682,747, +683,747,682, +747,683,748, +684,748,683, +748,684,749, +685,749,684, +749,685,750, +686,750,685, +750,686,751, +687,751,686, +751,687,752, +688,752,687, +752,688,753, +689,753,688, +753,689,754, +690,754,689, +754,690,755, +691,755,690, +755,691,756, +692,756,691, +756,692,757, +693,757,692, +757,693,758, +694,758,693, +758,694,759, +695,759,694, +759,695,760, +696,760,695, +760,696,761, +697,761,696, +761,697,762, +698,762,697, +762,698,763, +699,763,698, +763,699,764, +700,764,699, +764,700,765, +701,765,700, +765,701,766, +702,766,701, +766,702,767, +703,767,702, +768,704,769, +705,769,704, +769,705,770, +706,770,705, +770,706,771, +707,771,706, +771,707,772, +708,772,707, +772,708,773, +709,773,708, +773,709,774, +710,774,709, +774,710,775, +711,775,710, +775,711,776, +712,776,711, +776,712,777, +713,777,712, +777,713,778, +714,778,713, +778,714,779, +715,779,714, +779,715,780, +716,780,715, +780,716,781, +717,781,716, +781,717,782, +718,782,717, +782,718,783, +719,783,718, +783,719,784, +720,784,719, +784,720,785, +721,785,720, +785,721,786, +722,786,721, +786,722,787, +723,787,722, +787,723,788, +724,788,723, +788,724,789, +725,789,724, +789,725,790, +726,790,725, +790,726,791, +727,791,726, +791,727,792, +728,792,727, +792,728,793, +729,793,728, +793,729,794, +730,794,729, +794,730,795, +731,795,730, +795,731,796, +732,796,731, +796,732,797, +733,797,732, +797,733,798, +734,798,733, +798,734,799, +735,799,734, +799,735,800, +736,800,735, +800,736,801, +737,801,736, +801,737,802, +738,802,737, +802,738,803, +739,803,738, +803,739,804, +740,804,739, +804,740,805, +741,805,740, +805,741,806, +742,806,741, +806,742,807, +743,807,742, +807,743,808, +744,808,743, +808,744,809, +745,809,744, +809,745,810, +746,810,745, +810,746,811, +747,811,746, +811,747,812, +748,812,747, +812,748,813, +749,813,748, +813,749,814, +750,814,749, +814,750,815, +751,815,750, +815,751,816, +752,816,751, +816,752,817, +753,817,752, +817,753,818, +754,818,753, +818,754,819, +755,819,754, +819,755,820, +756,820,755, +820,756,821, +757,821,756, +821,757,822, +758,822,757, +822,758,823, +759,823,758, +823,759,824, +760,824,759, +824,760,825, +761,825,760, +825,761,826, +762,826,761, +826,762,827, +763,827,762, +827,763,828, +764,828,763, +828,764,829, +765,829,764, +829,765,830, +766,830,765, +830,766,831, +767,831,766, +832,768,833, +769,833,768, +833,769,834, +770,834,769, +834,770,835, +771,835,770, +835,771,836, +772,836,771, +836,772,837, +773,837,772, +837,773,838, +774,838,773, +838,774,839, +775,839,774, +839,775,840, +776,840,775, +840,776,841, +777,841,776, +841,777,842, +778,842,777, +842,778,843, +779,843,778, +843,779,844, +780,844,779, +844,780,845, +781,845,780, +845,781,846, +782,846,781, +846,782,847, +783,847,782, +847,783,848, +784,848,783, +848,784,849, +785,849,784, +849,785,850, +786,850,785, +850,786,851, +787,851,786, +851,787,852, +788,852,787, +852,788,853, +789,853,788, +853,789,854, +790,854,789, +854,790,855, +791,855,790, +855,791,856, +792,856,791, +856,792,857, +793,857,792, +857,793,858, +794,858,793, +858,794,859, +795,859,794, +859,795,860, +796,860,795, +860,796,861, +797,861,796, +861,797,862, +798,862,797, +862,798,863, +799,863,798, +863,799,864, +800,864,799, +864,800,865, +801,865,800, +865,801,866, +802,866,801, +866,802,867, +803,867,802, +867,803,868, +804,868,803, +868,804,869, +805,869,804, +869,805,870, +806,870,805, +870,806,871, +807,871,806, +871,807,872, +808,872,807, +872,808,873, +809,873,808, +873,809,874, +810,874,809, +874,810,875, +811,875,810, +875,811,876, +812,876,811, +876,812,877, +813,877,812, +877,813,878, +814,878,813, +878,814,879, +815,879,814, +879,815,880, +816,880,815, +880,816,881, +817,881,816, +881,817,882, +818,882,817, +882,818,883, +819,883,818, +883,819,884, +820,884,819, +884,820,885, +821,885,820, +885,821,886, +822,886,821, +886,822,887, +823,887,822, +887,823,888, +824,888,823, +888,824,889, +825,889,824, +889,825,890, +826,890,825, +890,826,891, +827,891,826, +891,827,892, +828,892,827, +892,828,893, +829,893,828, +893,829,894, +830,894,829, +894,830,895, +831,895,830, +896,832,897, +833,897,832, +897,833,898, +834,898,833, +898,834,899, +835,899,834, +899,835,900, +836,900,835, +900,836,901, +837,901,836, +901,837,902, +838,902,837, +902,838,903, +839,903,838, +903,839,904, +840,904,839, +904,840,905, +841,905,840, +905,841,906, +842,906,841, +906,842,907, +843,907,842, +907,843,908, +844,908,843, +908,844,909, +845,909,844, +909,845,910, +846,910,845, +910,846,911, +847,911,846, +911,847,912, +848,912,847, +912,848,913, +849,913,848, +913,849,914, +850,914,849, +914,850,915, +851,915,850, +915,851,916, +852,916,851, +916,852,917, +853,917,852, +917,853,918, +854,918,853, +918,854,919, +855,919,854, +919,855,920, +856,920,855, +920,856,921, +857,921,856, +921,857,922, +858,922,857, +922,858,923, +859,923,858, +923,859,924, +860,924,859, +924,860,925, +861,925,860, +925,861,926, +862,926,861, +926,862,927, +863,927,862, +927,863,928, +864,928,863, +928,864,929, +865,929,864, +929,865,930, +866,930,865, +930,866,931, +867,931,866, +931,867,932, +868,932,867, +932,868,933, +869,933,868, +933,869,934, +870,934,869, +934,870,935, +871,935,870, +935,871,936, +872,936,871, +936,872,937, +873,937,872, +937,873,938, +874,938,873, +938,874,939, +875,939,874, +939,875,940, +876,940,875, +940,876,941, +877,941,876, +941,877,942, +878,942,877, +942,878,943, +879,943,878, +943,879,944, +880,944,879, +944,880,945, +881,945,880, +945,881,946, +882,946,881, +946,882,947, +883,947,882, +947,883,948, +884,948,883, +948,884,949, +885,949,884, +949,885,950, +886,950,885, +950,886,951, +887,951,886, +951,887,952, +888,952,887, +952,888,953, +889,953,888, +953,889,954, +890,954,889, +954,890,955, +891,955,890, +955,891,956, +892,956,891, +956,892,957, +893,957,892, +957,893,958, +894,958,893, +958,894,959, +895,959,894, +960,896,961, +897,961,896, +961,897,962, +898,962,897, +962,898,963, +899,963,898, +963,899,964, +900,964,899, +964,900,965, +901,965,900, +965,901,966, +902,966,901, +966,902,967, +903,967,902, +967,903,968, +904,968,903, +968,904,969, +905,969,904, +969,905,970, +906,970,905, +970,906,971, +907,971,906, +971,907,972, +908,972,907, +972,908,973, +909,973,908, +973,909,974, +910,974,909, +974,910,975, +911,975,910, +975,911,976, +912,976,911, +976,912,977, +913,977,912, +977,913,978, +914,978,913, +978,914,979, +915,979,914, +979,915,980, +916,980,915, +980,916,981, +917,981,916, +981,917,982, +918,982,917, +982,918,983, +919,983,918, +983,919,984, +920,984,919, +984,920,985, +921,985,920, +985,921,986, +922,986,921, +986,922,987, +923,987,922, +987,923,988, +924,988,923, +988,924,989, +925,989,924, +989,925,990, +926,990,925, +990,926,991, +927,991,926, +991,927,992, +928,992,927, +992,928,993, +929,993,928, +993,929,994, +930,994,929, +994,930,995, +931,995,930, +995,931,996, +932,996,931, +996,932,997, +933,997,932, +997,933,998, +934,998,933, +998,934,999, +935,999,934, +999,935,1000, +936,1000,935, +1000,936,1001, +937,1001,936, +1001,937,1002, +938,1002,937, +1002,938,1003, +939,1003,938, +1003,939,1004, +940,1004,939, +1004,940,1005, +941,1005,940, +1005,941,1006, +942,1006,941, +1006,942,1007, +943,1007,942, +1007,943,1008, +944,1008,943, +1008,944,1009, +945,1009,944, +1009,945,1010, +946,1010,945, +1010,946,1011, +947,1011,946, +1011,947,1012, +948,1012,947, +1012,948,1013, +949,1013,948, +1013,949,1014, +950,1014,949, +1014,950,1015, +951,1015,950, +1015,951,1016, +952,1016,951, +1016,952,1017, +953,1017,952, +1017,953,1018, +954,1018,953, +1018,954,1019, +955,1019,954, +1019,955,1020, +956,1020,955, +1020,956,1021, +957,1021,956, +1021,957,1022, +958,1022,957, +1022,958,1023, +959,1023,958, +1024,960,1025, +961,1025,960, +1025,961,1026, +962,1026,961, +1026,962,1027, +963,1027,962, +1027,963,1028, +964,1028,963, +1028,964,1029, +965,1029,964, +1029,965,1030, +966,1030,965, +1030,966,1031, +967,1031,966, +1031,967,1032, +968,1032,967, +1032,968,1033, +969,1033,968, +1033,969,1034, +970,1034,969, +1034,970,1035, +971,1035,970, +1035,971,1036, +972,1036,971, +1036,972,1037, +973,1037,972, +1037,973,1038, +974,1038,973, +1038,974,1039, +975,1039,974, +1039,975,1040, +976,1040,975, +1040,976,1041, +977,1041,976, +1041,977,1042, +978,1042,977, +1042,978,1043, +979,1043,978, +1043,979,1044, +980,1044,979, +1044,980,1045, +981,1045,980, +1045,981,1046, +982,1046,981, +1046,982,1047, +983,1047,982, +1047,983,1048, +984,1048,983, +1048,984,1049, +985,1049,984, +1049,985,1050, +986,1050,985, +1050,986,1051, +987,1051,986, +1051,987,1052, +988,1052,987, +1052,988,1053, +989,1053,988, +1053,989,1054, +990,1054,989, +1054,990,1055, +991,1055,990, +1055,991,1056, +992,1056,991, +1056,992,1057, +993,1057,992, +1057,993,1058, +994,1058,993, +1058,994,1059, +995,1059,994, +1059,995,1060, +996,1060,995, +1060,996,1061, +997,1061,996, +1061,997,1062, +998,1062,997, +1062,998,1063, +999,1063,998, +1063,999,1064, +1000,1064,999, +1064,1000,1065, +1001,1065,1000, +1065,1001,1066, +1002,1066,1001, +1066,1002,1067, +1003,1067,1002, +1067,1003,1068, +1004,1068,1003, +1068,1004,1069, +1005,1069,1004, +1069,1005,1070, +1006,1070,1005, +1070,1006,1071, +1007,1071,1006, +1071,1007,1072, +1008,1072,1007, +1072,1008,1073, +1009,1073,1008, +1073,1009,1074, +1010,1074,1009, +1074,1010,1075, +1011,1075,1010, +1075,1011,1076, +1012,1076,1011, +1076,1012,1077, +1013,1077,1012, +1077,1013,1078, +1014,1078,1013, +1078,1014,1079, +1015,1079,1014, +1079,1015,1080, +1016,1080,1015, +1080,1016,1081, +1017,1081,1016, +1081,1017,1082, +1018,1082,1017, +1082,1018,1083, +1019,1083,1018, +1083,1019,1084, +1020,1084,1019, +1084,1020,1085, +1021,1085,1020, +1085,1021,1086, +1022,1086,1021, +1086,1022,1087, +1023,1087,1022, +1088,1024,1089, +1025,1089,1024, +1089,1025,1090, +1026,1090,1025, +1090,1026,1091, +1027,1091,1026, +1091,1027,1092, +1028,1092,1027, +1092,1028,1093, +1029,1093,1028, +1093,1029,1094, +1030,1094,1029, +1094,1030,1095, +1031,1095,1030, +1095,1031,1096, +1032,1096,1031, +1096,1032,1097, +1033,1097,1032, +1097,1033,1098, +1034,1098,1033, +1098,1034,1099, +1035,1099,1034, +1099,1035,1100, +1036,1100,1035, +1100,1036,1101, +1037,1101,1036, +1101,1037,1102, +1038,1102,1037, +1102,1038,1103, +1039,1103,1038, +1103,1039,1104, +1040,1104,1039, +1104,1040,1105, +1041,1105,1040, +1105,1041,1106, +1042,1106,1041, +1106,1042,1107, +1043,1107,1042, +1107,1043,1108, +1044,1108,1043, +1108,1044,1109, +1045,1109,1044, +1109,1045,1110, +1046,1110,1045, +1110,1046,1111, +1047,1111,1046, +1111,1047,1112, +1048,1112,1047, +1112,1048,1113, +1049,1113,1048, +1113,1049,1114, +1050,1114,1049, +1114,1050,1115, +1051,1115,1050, +1115,1051,1116, +1052,1116,1051, +1116,1052,1117, +1053,1117,1052, +1117,1053,1118, +1054,1118,1053, +1118,1054,1119, +1055,1119,1054, +1119,1055,1120, +1056,1120,1055, +1120,1056,1121, +1057,1121,1056, +1121,1057,1122, +1058,1122,1057, +1122,1058,1123, +1059,1123,1058, +1123,1059,1124, +1060,1124,1059, +1124,1060,1125, +1061,1125,1060, +1125,1061,1126, +1062,1126,1061, +1126,1062,1127, +1063,1127,1062, +1127,1063,1128, +1064,1128,1063, +1128,1064,1129, +1065,1129,1064, +1129,1065,1130, +1066,1130,1065, +1130,1066,1131, +1067,1131,1066, +1131,1067,1132, +1068,1132,1067, +1132,1068,1133, +1069,1133,1068, +1133,1069,1134, +1070,1134,1069, +1134,1070,1135, +1071,1135,1070, +1135,1071,1136, +1072,1136,1071, +1136,1072,1137, +1073,1137,1072, +1137,1073,1138, +1074,1138,1073, +1138,1074,1139, +1075,1139,1074, +1139,1075,1140, +1076,1140,1075, +1140,1076,1141, +1077,1141,1076, +1141,1077,1142, +1078,1142,1077, +1142,1078,1143, +1079,1143,1078, +1143,1079,1144, +1080,1144,1079, +1144,1080,1145, +1081,1145,1080, +1145,1081,1146, +1082,1146,1081, +1146,1082,1147, +1083,1147,1082, +1147,1083,1148, +1084,1148,1083, +1148,1084,1149, +1085,1149,1084, +1149,1085,1150, +1086,1150,1085, +1150,1086,1151, +1087,1151,1086, +1152,1088,1153, +1089,1153,1088, +1153,1089,1154, +1090,1154,1089, +1154,1090,1155, +1091,1155,1090, +1155,1091,1156, +1092,1156,1091, +1156,1092,1157, +1093,1157,1092, +1157,1093,1158, +1094,1158,1093, +1158,1094,1159, +1095,1159,1094, +1159,1095,1160, +1096,1160,1095, +1160,1096,1161, +1097,1161,1096, +1161,1097,1162, +1098,1162,1097, +1162,1098,1163, +1099,1163,1098, +1163,1099,1164, +1100,1164,1099, +1164,1100,1165, +1101,1165,1100, +1165,1101,1166, +1102,1166,1101, +1166,1102,1167, +1103,1167,1102, +1167,1103,1168, +1104,1168,1103, +1168,1104,1169, +1105,1169,1104, +1169,1105,1170, +1106,1170,1105, +1170,1106,1171, +1107,1171,1106, +1171,1107,1172, +1108,1172,1107, +1172,1108,1173, +1109,1173,1108, +1173,1109,1174, +1110,1174,1109, +1174,1110,1175, +1111,1175,1110, +1175,1111,1176, +1112,1176,1111, +1176,1112,1177, +1113,1177,1112, +1177,1113,1178, +1114,1178,1113, +1178,1114,1179, +1115,1179,1114, +1179,1115,1180, +1116,1180,1115, +1180,1116,1181, +1117,1181,1116, +1181,1117,1182, +1118,1182,1117, +1182,1118,1183, +1119,1183,1118, +1183,1119,1184, +1120,1184,1119, +1184,1120,1185, +1121,1185,1120, +1185,1121,1186, +1122,1186,1121, +1186,1122,1187, +1123,1187,1122, +1187,1123,1188, +1124,1188,1123, +1188,1124,1189, +1125,1189,1124, +1189,1125,1190, +1126,1190,1125, +1190,1126,1191, +1127,1191,1126, +1191,1127,1192, +1128,1192,1127, +1192,1128,1193, +1129,1193,1128, +1193,1129,1194, +1130,1194,1129, +1194,1130,1195, +1131,1195,1130, +1195,1131,1196, +1132,1196,1131, +1196,1132,1197, +1133,1197,1132, +1197,1133,1198, +1134,1198,1133, +1198,1134,1199, +1135,1199,1134, +1199,1135,1200, +1136,1200,1135, +1200,1136,1201, +1137,1201,1136, +1201,1137,1202, +1138,1202,1137, +1202,1138,1203, +1139,1203,1138, +1203,1139,1204, +1140,1204,1139, +1204,1140,1205, +1141,1205,1140, +1205,1141,1206, +1142,1206,1141, +1206,1142,1207, +1143,1207,1142, +1207,1143,1208, +1144,1208,1143, +1208,1144,1209, +1145,1209,1144, +1209,1145,1210, +1146,1210,1145, +1210,1146,1211, +1147,1211,1146, +1211,1147,1212, +1148,1212,1147, +1212,1148,1213, +1149,1213,1148, +1213,1149,1214, +1150,1214,1149, +1214,1150,1215, +1151,1215,1150, +1216,1152,1217, +1153,1217,1152, +1217,1153,1218, +1154,1218,1153, +1218,1154,1219, +1155,1219,1154, +1219,1155,1220, +1156,1220,1155, +1220,1156,1221, +1157,1221,1156, +1221,1157,1222, +1158,1222,1157, +1222,1158,1223, +1159,1223,1158, +1223,1159,1224, +1160,1224,1159, +1224,1160,1225, +1161,1225,1160, +1225,1161,1226, +1162,1226,1161, +1226,1162,1227, +1163,1227,1162, +1227,1163,1228, +1164,1228,1163, +1228,1164,1229, +1165,1229,1164, +1229,1165,1230, +1166,1230,1165, +1230,1166,1231, +1167,1231,1166, +1231,1167,1232, +1168,1232,1167, +1232,1168,1233, +1169,1233,1168, +1233,1169,1234, +1170,1234,1169, +1234,1170,1235, +1171,1235,1170, +1235,1171,1236, +1172,1236,1171, +1236,1172,1237, +1173,1237,1172, +1237,1173,1238, +1174,1238,1173, +1238,1174,1239, +1175,1239,1174, +1239,1175,1240, +1176,1240,1175, +1240,1176,1241, +1177,1241,1176, +1241,1177,1242, +1178,1242,1177, +1242,1178,1243, +1179,1243,1178, +1243,1179,1244, +1180,1244,1179, +1244,1180,1245, +1181,1245,1180, +1245,1181,1246, +1182,1246,1181, +1246,1182,1247, +1183,1247,1182, +1247,1183,1248, +1184,1248,1183, +1248,1184,1249, +1185,1249,1184, +1249,1185,1250, +1186,1250,1185, +1250,1186,1251, +1187,1251,1186, +1251,1187,1252, +1188,1252,1187, +1252,1188,1253, +1189,1253,1188, +1253,1189,1254, +1190,1254,1189, +1254,1190,1255, +1191,1255,1190, +1255,1191,1256, +1192,1256,1191, +1256,1192,1257, +1193,1257,1192, +1257,1193,1258, +1194,1258,1193, +1258,1194,1259, +1195,1259,1194, +1259,1195,1260, +1196,1260,1195, +1260,1196,1261, +1197,1261,1196, +1261,1197,1262, +1198,1262,1197, +1262,1198,1263, +1199,1263,1198, +1263,1199,1264, +1200,1264,1199, +1264,1200,1265, +1201,1265,1200, +1265,1201,1266, +1202,1266,1201, +1266,1202,1267, +1203,1267,1202, +1267,1203,1268, +1204,1268,1203, +1268,1204,1269, +1205,1269,1204, +1269,1205,1270, +1206,1270,1205, +1270,1206,1271, +1207,1271,1206, +1271,1207,1272, +1208,1272,1207, +1272,1208,1273, +1209,1273,1208, +1273,1209,1274, +1210,1274,1209, +1274,1210,1275, +1211,1275,1210, +1275,1211,1276, +1212,1276,1211, +1276,1212,1277, +1213,1277,1212, +1277,1213,1278, +1214,1278,1213, +1278,1214,1279, +1215,1279,1214, +1280,1216,1281, +1217,1281,1216, +1281,1217,1282, +1218,1282,1217, +1282,1218,1283, +1219,1283,1218, +1283,1219,1284, +1220,1284,1219, +1284,1220,1285, +1221,1285,1220, +1285,1221,1286, +1222,1286,1221, +1286,1222,1287, +1223,1287,1222, +1287,1223,1288, +1224,1288,1223, +1288,1224,1289, +1225,1289,1224, +1289,1225,1290, +1226,1290,1225, +1290,1226,1291, +1227,1291,1226, +1291,1227,1292, +1228,1292,1227, +1292,1228,1293, +1229,1293,1228, +1293,1229,1294, +1230,1294,1229, +1294,1230,1295, +1231,1295,1230, +1295,1231,1296, +1232,1296,1231, +1296,1232,1297, +1233,1297,1232, +1297,1233,1298, +1234,1298,1233, +1298,1234,1299, +1235,1299,1234, +1299,1235,1300, +1236,1300,1235, +1300,1236,1301, +1237,1301,1236, +1301,1237,1302, +1238,1302,1237, +1302,1238,1303, +1239,1303,1238, +1303,1239,1304, +1240,1304,1239, +1304,1240,1305, +1241,1305,1240, +1305,1241,1306, +1242,1306,1241, +1306,1242,1307, +1243,1307,1242, +1307,1243,1308, +1244,1308,1243, +1308,1244,1309, +1245,1309,1244, +1309,1245,1310, +1246,1310,1245, +1310,1246,1311, +1247,1311,1246, +1311,1247,1312, +1248,1312,1247, +1312,1248,1313, +1249,1313,1248, +1313,1249,1314, +1250,1314,1249, +1314,1250,1315, +1251,1315,1250, +1315,1251,1316, +1252,1316,1251, +1316,1252,1317, +1253,1317,1252, +1317,1253,1318, +1254,1318,1253, +1318,1254,1319, +1255,1319,1254, +1319,1255,1320, +1256,1320,1255, +1320,1256,1321, +1257,1321,1256, +1321,1257,1322, +1258,1322,1257, +1322,1258,1323, +1259,1323,1258, +1323,1259,1324, +1260,1324,1259, +1324,1260,1325, +1261,1325,1260, +1325,1261,1326, +1262,1326,1261, +1326,1262,1327, +1263,1327,1262, +1327,1263,1328, +1264,1328,1263, +1328,1264,1329, +1265,1329,1264, +1329,1265,1330, +1266,1330,1265, +1330,1266,1331, +1267,1331,1266, +1331,1267,1332, +1268,1332,1267, +1332,1268,1333, +1269,1333,1268, +1333,1269,1334, +1270,1334,1269, +1334,1270,1335, +1271,1335,1270, +1335,1271,1336, +1272,1336,1271, +1336,1272,1337, +1273,1337,1272, +1337,1273,1338, +1274,1338,1273, +1338,1274,1339, +1275,1339,1274, +1339,1275,1340, +1276,1340,1275, +1340,1276,1341, +1277,1341,1276, +1341,1277,1342, +1278,1342,1277, +1342,1278,1343, +1279,1343,1278, +1344,1280,1345, +1281,1345,1280, +1345,1281,1346, +1282,1346,1281, +1346,1282,1347, +1283,1347,1282, +1347,1283,1348, +1284,1348,1283, +1348,1284,1349, +1285,1349,1284, +1349,1285,1350, +1286,1350,1285, +1350,1286,1351, +1287,1351,1286, +1351,1287,1352, +1288,1352,1287, +1352,1288,1353, +1289,1353,1288, +1353,1289,1354, +1290,1354,1289, +1354,1290,1355, +1291,1355,1290, +1355,1291,1356, +1292,1356,1291, +1356,1292,1357, +1293,1357,1292, +1357,1293,1358, +1294,1358,1293, +1358,1294,1359, +1295,1359,1294, +1359,1295,1360, +1296,1360,1295, +1360,1296,1361, +1297,1361,1296, +1361,1297,1362, +1298,1362,1297, +1362,1298,1363, +1299,1363,1298, +1363,1299,1364, +1300,1364,1299, +1364,1300,1365, +1301,1365,1300, +1365,1301,1366, +1302,1366,1301, +1366,1302,1367, +1303,1367,1302, +1367,1303,1368, +1304,1368,1303, +1368,1304,1369, +1305,1369,1304, +1369,1305,1370, +1306,1370,1305, +1370,1306,1371, +1307,1371,1306, +1371,1307,1372, +1308,1372,1307, +1372,1308,1373, +1309,1373,1308, +1373,1309,1374, +1310,1374,1309, +1374,1310,1375, +1311,1375,1310, +1375,1311,1376, +1312,1376,1311, +1376,1312,1377, +1313,1377,1312, +1377,1313,1378, +1314,1378,1313, +1378,1314,1379, +1315,1379,1314, +1379,1315,1380, +1316,1380,1315, +1380,1316,1381, +1317,1381,1316, +1381,1317,1382, +1318,1382,1317, +1382,1318,1383, +1319,1383,1318, +1383,1319,1384, +1320,1384,1319, +1384,1320,1385, +1321,1385,1320, +1385,1321,1386, +1322,1386,1321, +1386,1322,1387, +1323,1387,1322, +1387,1323,1388, +1324,1388,1323, +1388,1324,1389, +1325,1389,1324, +1389,1325,1390, +1326,1390,1325, +1390,1326,1391, +1327,1391,1326, +1391,1327,1392, +1328,1392,1327, +1392,1328,1393, +1329,1393,1328, +1393,1329,1394, +1330,1394,1329, +1394,1330,1395, +1331,1395,1330, +1395,1331,1396, +1332,1396,1331, +1396,1332,1397, +1333,1397,1332, +1397,1333,1398, +1334,1398,1333, +1398,1334,1399, +1335,1399,1334, +1399,1335,1400, +1336,1400,1335, +1400,1336,1401, +1337,1401,1336, +1401,1337,1402, +1338,1402,1337, +1402,1338,1403, +1339,1403,1338, +1403,1339,1404, +1340,1404,1339, +1404,1340,1405, +1341,1405,1340, +1405,1341,1406, +1342,1406,1341, +1406,1342,1407, +1343,1407,1342, +1408,1344,1409, +1345,1409,1344, +1409,1345,1410, +1346,1410,1345, +1410,1346,1411, +1347,1411,1346, +1411,1347,1412, +1348,1412,1347, +1412,1348,1413, +1349,1413,1348, +1413,1349,1414, +1350,1414,1349, +1414,1350,1415, +1351,1415,1350, +1415,1351,1416, +1352,1416,1351, +1416,1352,1417, +1353,1417,1352, +1417,1353,1418, +1354,1418,1353, +1418,1354,1419, +1355,1419,1354, +1419,1355,1420, +1356,1420,1355, +1420,1356,1421, +1357,1421,1356, +1421,1357,1422, +1358,1422,1357, +1422,1358,1423, +1359,1423,1358, +1423,1359,1424, +1360,1424,1359, +1424,1360,1425, +1361,1425,1360, +1425,1361,1426, +1362,1426,1361, +1426,1362,1427, +1363,1427,1362, +1427,1363,1428, +1364,1428,1363, +1428,1364,1429, +1365,1429,1364, +1429,1365,1430, +1366,1430,1365, +1430,1366,1431, +1367,1431,1366, +1431,1367,1432, +1368,1432,1367, +1432,1368,1433, +1369,1433,1368, +1433,1369,1434, +1370,1434,1369, +1434,1370,1435, +1371,1435,1370, +1435,1371,1436, +1372,1436,1371, +1436,1372,1437, +1373,1437,1372, +1437,1373,1438, +1374,1438,1373, +1438,1374,1439, +1375,1439,1374, +1439,1375,1440, +1376,1440,1375, +1440,1376,1441, +1377,1441,1376, +1441,1377,1442, +1378,1442,1377, +1442,1378,1443, +1379,1443,1378, +1443,1379,1444, +1380,1444,1379, +1444,1380,1445, +1381,1445,1380, +1445,1381,1446, +1382,1446,1381, +1446,1382,1447, +1383,1447,1382, +1447,1383,1448, +1384,1448,1383, +1448,1384,1449, +1385,1449,1384, +1449,1385,1450, +1386,1450,1385, +1450,1386,1451, +1387,1451,1386, +1451,1387,1452, +1388,1452,1387, +1452,1388,1453, +1389,1453,1388, +1453,1389,1454, +1390,1454,1389, +1454,1390,1455, +1391,1455,1390, +1455,1391,1456, +1392,1456,1391, +1456,1392,1457, +1393,1457,1392, +1457,1393,1458, +1394,1458,1393, +1458,1394,1459, +1395,1459,1394, +1459,1395,1460, +1396,1460,1395, +1460,1396,1461, +1397,1461,1396, +1461,1397,1462, +1398,1462,1397, +1462,1398,1463, +1399,1463,1398, +1463,1399,1464, +1400,1464,1399, +1464,1400,1465, +1401,1465,1400, +1465,1401,1466, +1402,1466,1401, +1466,1402,1467, +1403,1467,1402, +1467,1403,1468, +1404,1468,1403, +1468,1404,1469, +1405,1469,1404, +1469,1405,1470, +1406,1470,1405, +1470,1406,1471, +1407,1471,1406, +1472,1408,1473, +1409,1473,1408, +1473,1409,1474, +1410,1474,1409, +1474,1410,1475, +1411,1475,1410, +1475,1411,1476, +1412,1476,1411, +1476,1412,1477, +1413,1477,1412, +1477,1413,1478, +1414,1478,1413, +1478,1414,1479, +1415,1479,1414, +1479,1415,1480, +1416,1480,1415, +1480,1416,1481, +1417,1481,1416, +1481,1417,1482, +1418,1482,1417, +1482,1418,1483, +1419,1483,1418, +1483,1419,1484, +1420,1484,1419, +1484,1420,1485, +1421,1485,1420, +1485,1421,1486, +1422,1486,1421, +1486,1422,1487, +1423,1487,1422, +1487,1423,1488, +1424,1488,1423, +1488,1424,1489, +1425,1489,1424, +1489,1425,1490, +1426,1490,1425, +1490,1426,1491, +1427,1491,1426, +1491,1427,1492, +1428,1492,1427, +1492,1428,1493, +1429,1493,1428, +1493,1429,1494, +1430,1494,1429, +1494,1430,1495, +1431,1495,1430, +1495,1431,1496, +1432,1496,1431, +1496,1432,1497, +1433,1497,1432, +1497,1433,1498, +1434,1498,1433, +1498,1434,1499, +1435,1499,1434, +1499,1435,1500, +1436,1500,1435, +1500,1436,1501, +1437,1501,1436, +1501,1437,1502, +1438,1502,1437, +1502,1438,1503, +1439,1503,1438, +1503,1439,1504, +1440,1504,1439, +1504,1440,1505, +1441,1505,1440, +1505,1441,1506, +1442,1506,1441, +1506,1442,1507, +1443,1507,1442, +1507,1443,1508, +1444,1508,1443, +1508,1444,1509, +1445,1509,1444, +1509,1445,1510, +1446,1510,1445, +1510,1446,1511, +1447,1511,1446, +1511,1447,1512, +1448,1512,1447, +1512,1448,1513, +1449,1513,1448, +1513,1449,1514, +1450,1514,1449, +1514,1450,1515, +1451,1515,1450, +1515,1451,1516, +1452,1516,1451, +1516,1452,1517, +1453,1517,1452, +1517,1453,1518, +1454,1518,1453, +1518,1454,1519, +1455,1519,1454, +1519,1455,1520, +1456,1520,1455, +1520,1456,1521, +1457,1521,1456, +1521,1457,1522, +1458,1522,1457, +1522,1458,1523, +1459,1523,1458, +1523,1459,1524, +1460,1524,1459, +1524,1460,1525, +1461,1525,1460, +1525,1461,1526, +1462,1526,1461, +1526,1462,1527, +1463,1527,1462, +1527,1463,1528, +1464,1528,1463, +1528,1464,1529, +1465,1529,1464, +1529,1465,1530, +1466,1530,1465, +1530,1466,1531, +1467,1531,1466, +1531,1467,1532, +1468,1532,1467, +1532,1468,1533, +1469,1533,1468, +1533,1469,1534, +1470,1534,1469, +1534,1470,1535, +1471,1535,1470, +1536,1472,1537, +1473,1537,1472, +1537,1473,1538, +1474,1538,1473, +1538,1474,1539, +1475,1539,1474, +1539,1475,1540, +1476,1540,1475, +1540,1476,1541, +1477,1541,1476, +1541,1477,1542, +1478,1542,1477, +1542,1478,1543, +1479,1543,1478, +1543,1479,1544, +1480,1544,1479, +1544,1480,1545, +1481,1545,1480, +1545,1481,1546, +1482,1546,1481, +1546,1482,1547, +1483,1547,1482, +1547,1483,1548, +1484,1548,1483, +1548,1484,1549, +1485,1549,1484, +1549,1485,1550, +1486,1550,1485, +1550,1486,1551, +1487,1551,1486, +1551,1487,1552, +1488,1552,1487, +1552,1488,1553, +1489,1553,1488, +1553,1489,1554, +1490,1554,1489, +1554,1490,1555, +1491,1555,1490, +1555,1491,1556, +1492,1556,1491, +1556,1492,1557, +1493,1557,1492, +1557,1493,1558, +1494,1558,1493, +1558,1494,1559, +1495,1559,1494, +1559,1495,1560, +1496,1560,1495, +1560,1496,1561, +1497,1561,1496, +1561,1497,1562, +1498,1562,1497, +1562,1498,1563, +1499,1563,1498, +1563,1499,1564, +1500,1564,1499, +1564,1500,1565, +1501,1565,1500, +1565,1501,1566, +1502,1566,1501, +1566,1502,1567, +1503,1567,1502, +1567,1503,1568, +1504,1568,1503, +1568,1504,1569, +1505,1569,1504, +1569,1505,1570, +1506,1570,1505, +1570,1506,1571, +1507,1571,1506, +1571,1507,1572, +1508,1572,1507, +1572,1508,1573, +1509,1573,1508, +1573,1509,1574, +1510,1574,1509, +1574,1510,1575, +1511,1575,1510, +1575,1511,1576, +1512,1576,1511, +1576,1512,1577, +1513,1577,1512, +1577,1513,1578, +1514,1578,1513, +1578,1514,1579, +1515,1579,1514, +1579,1515,1580, +1516,1580,1515, +1580,1516,1581, +1517,1581,1516, +1581,1517,1582, +1518,1582,1517, +1582,1518,1583, +1519,1583,1518, +1583,1519,1584, +1520,1584,1519, +1584,1520,1585, +1521,1585,1520, +1585,1521,1586, +1522,1586,1521, +1586,1522,1587, +1523,1587,1522, +1587,1523,1588, +1524,1588,1523, +1588,1524,1589, +1525,1589,1524, +1589,1525,1590, +1526,1590,1525, +1590,1526,1591, +1527,1591,1526, +1591,1527,1592, +1528,1592,1527, +1592,1528,1593, +1529,1593,1528, +1593,1529,1594, +1530,1594,1529, +1594,1530,1595, +1531,1595,1530, +1595,1531,1596, +1532,1596,1531, +1596,1532,1597, +1533,1597,1532, +1597,1533,1598, +1534,1598,1533, +1598,1534,1599, +1535,1599,1534, +1600,1536,1601, +1537,1601,1536, +1601,1537,1602, +1538,1602,1537, +1602,1538,1603, +1539,1603,1538, +1603,1539,1604, +1540,1604,1539, +1604,1540,1605, +1541,1605,1540, +1605,1541,1606, +1542,1606,1541, +1606,1542,1607, +1543,1607,1542, +1607,1543,1608, +1544,1608,1543, +1608,1544,1609, +1545,1609,1544, +1609,1545,1610, +1546,1610,1545, +1610,1546,1611, +1547,1611,1546, +1611,1547,1612, +1548,1612,1547, +1612,1548,1613, +1549,1613,1548, +1613,1549,1614, +1550,1614,1549, +1614,1550,1615, +1551,1615,1550, +1615,1551,1616, +1552,1616,1551, +1616,1552,1617, +1553,1617,1552, +1617,1553,1618, +1554,1618,1553, +1618,1554,1619, +1555,1619,1554, +1619,1555,1620, +1556,1620,1555, +1620,1556,1621, +1557,1621,1556, +1621,1557,1622, +1558,1622,1557, +1622,1558,1623, +1559,1623,1558, +1623,1559,1624, +1560,1624,1559, +1624,1560,1625, +1561,1625,1560, +1625,1561,1626, +1562,1626,1561, +1626,1562,1627, +1563,1627,1562, +1627,1563,1628, +1564,1628,1563, +1628,1564,1629, +1565,1629,1564, +1629,1565,1630, +1566,1630,1565, +1630,1566,1631, +1567,1631,1566, +1631,1567,1632, +1568,1632,1567, +1632,1568,1633, +1569,1633,1568, +1633,1569,1634, +1570,1634,1569, +1634,1570,1635, +1571,1635,1570, +1635,1571,1636, +1572,1636,1571, +1636,1572,1637, +1573,1637,1572, +1637,1573,1638, +1574,1638,1573, +1638,1574,1639, +1575,1639,1574, +1639,1575,1640, +1576,1640,1575, +1640,1576,1641, +1577,1641,1576, +1641,1577,1642, +1578,1642,1577, +1642,1578,1643, +1579,1643,1578, +1643,1579,1644, +1580,1644,1579, +1644,1580,1645, +1581,1645,1580, +1645,1581,1646, +1582,1646,1581, +1646,1582,1647, +1583,1647,1582, +1647,1583,1648, +1584,1648,1583, +1648,1584,1649, +1585,1649,1584, +1649,1585,1650, +1586,1650,1585, +1650,1586,1651, +1587,1651,1586, +1651,1587,1652, +1588,1652,1587, +1652,1588,1653, +1589,1653,1588, +1653,1589,1654, +1590,1654,1589, +1654,1590,1655, +1591,1655,1590, +1655,1591,1656, +1592,1656,1591, +1656,1592,1657, +1593,1657,1592, +1657,1593,1658, +1594,1658,1593, +1658,1594,1659, +1595,1659,1594, +1659,1595,1660, +1596,1660,1595, +1660,1596,1661, +1597,1661,1596, +1661,1597,1662, +1598,1662,1597, +1662,1598,1663, +1599,1663,1598, +1664,1600,1665, +1601,1665,1600, +1665,1601,1666, +1602,1666,1601, +1666,1602,1667, +1603,1667,1602, +1667,1603,1668, +1604,1668,1603, +1668,1604,1669, +1605,1669,1604, +1669,1605,1670, +1606,1670,1605, +1670,1606,1671, +1607,1671,1606, +1671,1607,1672, +1608,1672,1607, +1672,1608,1673, +1609,1673,1608, +1673,1609,1674, +1610,1674,1609, +1674,1610,1675, +1611,1675,1610, +1675,1611,1676, +1612,1676,1611, +1676,1612,1677, +1613,1677,1612, +1677,1613,1678, +1614,1678,1613, +1678,1614,1679, +1615,1679,1614, +1679,1615,1680, +1616,1680,1615, +1680,1616,1681, +1617,1681,1616, +1681,1617,1682, +1618,1682,1617, +1682,1618,1683, +1619,1683,1618, +1683,1619,1684, +1620,1684,1619, +1684,1620,1685, +1621,1685,1620, +1685,1621,1686, +1622,1686,1621, +1686,1622,1687, +1623,1687,1622, +1687,1623,1688, +1624,1688,1623, +1688,1624,1689, +1625,1689,1624, +1689,1625,1690, +1626,1690,1625, +1690,1626,1691, +1627,1691,1626, +1691,1627,1692, +1628,1692,1627, +1692,1628,1693, +1629,1693,1628, +1693,1629,1694, +1630,1694,1629, +1694,1630,1695, +1631,1695,1630, +1695,1631,1696, +1632,1696,1631, +1696,1632,1697, +1633,1697,1632, +1697,1633,1698, +1634,1698,1633, +1698,1634,1699, +1635,1699,1634, +1699,1635,1700, +1636,1700,1635, +1700,1636,1701, +1637,1701,1636, +1701,1637,1702, +1638,1702,1637, +1702,1638,1703, +1639,1703,1638, +1703,1639,1704, +1640,1704,1639, +1704,1640,1705, +1641,1705,1640, +1705,1641,1706, +1642,1706,1641, +1706,1642,1707, +1643,1707,1642, +1707,1643,1708, +1644,1708,1643, +1708,1644,1709, +1645,1709,1644, +1709,1645,1710, +1646,1710,1645, +1710,1646,1711, +1647,1711,1646, +1711,1647,1712, +1648,1712,1647, +1712,1648,1713, +1649,1713,1648, +1713,1649,1714, +1650,1714,1649, +1714,1650,1715, +1651,1715,1650, +1715,1651,1716, +1652,1716,1651, +1716,1652,1717, +1653,1717,1652, +1717,1653,1718, +1654,1718,1653, +1718,1654,1719, +1655,1719,1654, +1719,1655,1720, +1656,1720,1655, +1720,1656,1721, +1657,1721,1656, +1721,1657,1722, +1658,1722,1657, +1722,1658,1723, +1659,1723,1658, +1723,1659,1724, +1660,1724,1659, +1724,1660,1725, +1661,1725,1660, +1725,1661,1726, +1662,1726,1661, +1726,1662,1727, +1663,1727,1662, +1728,1664,1729, +1665,1729,1664, +1729,1665,1730, +1666,1730,1665, +1730,1666,1731, +1667,1731,1666, +1731,1667,1732, +1668,1732,1667, +1732,1668,1733, +1669,1733,1668, +1733,1669,1734, +1670,1734,1669, +1734,1670,1735, +1671,1735,1670, +1735,1671,1736, +1672,1736,1671, +1736,1672,1737, +1673,1737,1672, +1737,1673,1738, +1674,1738,1673, +1738,1674,1739, +1675,1739,1674, +1739,1675,1740, +1676,1740,1675, +1740,1676,1741, +1677,1741,1676, +1741,1677,1742, +1678,1742,1677, +1742,1678,1743, +1679,1743,1678, +1743,1679,1744, +1680,1744,1679, +1744,1680,1745, +1681,1745,1680, +1745,1681,1746, +1682,1746,1681, +1746,1682,1747, +1683,1747,1682, +1747,1683,1748, +1684,1748,1683, +1748,1684,1749, +1685,1749,1684, +1749,1685,1750, +1686,1750,1685, +1750,1686,1751, +1687,1751,1686, +1751,1687,1752, +1688,1752,1687, +1752,1688,1753, +1689,1753,1688, +1753,1689,1754, +1690,1754,1689, +1754,1690,1755, +1691,1755,1690, +1755,1691,1756, +1692,1756,1691, +1756,1692,1757, +1693,1757,1692, +1757,1693,1758, +1694,1758,1693, +1758,1694,1759, +1695,1759,1694, +1759,1695,1760, +1696,1760,1695, +1760,1696,1761, +1697,1761,1696, +1761,1697,1762, +1698,1762,1697, +1762,1698,1763, +1699,1763,1698, +1763,1699,1764, +1700,1764,1699, +1764,1700,1765, +1701,1765,1700, +1765,1701,1766, +1702,1766,1701, +1766,1702,1767, +1703,1767,1702, +1767,1703,1768, +1704,1768,1703, +1768,1704,1769, +1705,1769,1704, +1769,1705,1770, +1706,1770,1705, +1770,1706,1771, +1707,1771,1706, +1771,1707,1772, +1708,1772,1707, +1772,1708,1773, +1709,1773,1708, +1773,1709,1774, +1710,1774,1709, +1774,1710,1775, +1711,1775,1710, +1775,1711,1776, +1712,1776,1711, +1776,1712,1777, +1713,1777,1712, +1777,1713,1778, +1714,1778,1713, +1778,1714,1779, +1715,1779,1714, +1779,1715,1780, +1716,1780,1715, +1780,1716,1781, +1717,1781,1716, +1781,1717,1782, +1718,1782,1717, +1782,1718,1783, +1719,1783,1718, +1783,1719,1784, +1720,1784,1719, +1784,1720,1785, +1721,1785,1720, +1785,1721,1786, +1722,1786,1721, +1786,1722,1787, +1723,1787,1722, +1787,1723,1788, +1724,1788,1723, +1788,1724,1789, +1725,1789,1724, +1789,1725,1790, +1726,1790,1725, +1790,1726,1791, +1727,1791,1726, +1792,1728,1793, +1729,1793,1728, +1793,1729,1794, +1730,1794,1729, +1794,1730,1795, +1731,1795,1730, +1795,1731,1796, +1732,1796,1731, +1796,1732,1797, +1733,1797,1732, +1797,1733,1798, +1734,1798,1733, +1798,1734,1799, +1735,1799,1734, +1799,1735,1800, +1736,1800,1735, +1800,1736,1801, +1737,1801,1736, +1801,1737,1802, +1738,1802,1737, +1802,1738,1803, +1739,1803,1738, +1803,1739,1804, +1740,1804,1739, +1804,1740,1805, +1741,1805,1740, +1805,1741,1806, +1742,1806,1741, +1806,1742,1807, +1743,1807,1742, +1807,1743,1808, +1744,1808,1743, +1808,1744,1809, +1745,1809,1744, +1809,1745,1810, +1746,1810,1745, +1810,1746,1811, +1747,1811,1746, +1811,1747,1812, +1748,1812,1747, +1812,1748,1813, +1749,1813,1748, +1813,1749,1814, +1750,1814,1749, +1814,1750,1815, +1751,1815,1750, +1815,1751,1816, +1752,1816,1751, +1816,1752,1817, +1753,1817,1752, +1817,1753,1818, +1754,1818,1753, +1818,1754,1819, +1755,1819,1754, +1819,1755,1820, +1756,1820,1755, +1820,1756,1821, +1757,1821,1756, +1821,1757,1822, +1758,1822,1757, +1822,1758,1823, +1759,1823,1758, +1823,1759,1824, +1760,1824,1759, +1824,1760,1825, +1761,1825,1760, +1825,1761,1826, +1762,1826,1761, +1826,1762,1827, +1763,1827,1762, +1827,1763,1828, +1764,1828,1763, +1828,1764,1829, +1765,1829,1764, +1829,1765,1830, +1766,1830,1765, +1830,1766,1831, +1767,1831,1766, +1831,1767,1832, +1768,1832,1767, +1832,1768,1833, +1769,1833,1768, +1833,1769,1834, +1770,1834,1769, +1834,1770,1835, +1771,1835,1770, +1835,1771,1836, +1772,1836,1771, +1836,1772,1837, +1773,1837,1772, +1837,1773,1838, +1774,1838,1773, +1838,1774,1839, +1775,1839,1774, +1839,1775,1840, +1776,1840,1775, +1840,1776,1841, +1777,1841,1776, +1841,1777,1842, +1778,1842,1777, +1842,1778,1843, +1779,1843,1778, +1843,1779,1844, +1780,1844,1779, +1844,1780,1845, +1781,1845,1780, +1845,1781,1846, +1782,1846,1781, +1846,1782,1847, +1783,1847,1782, +1847,1783,1848, +1784,1848,1783, +1848,1784,1849, +1785,1849,1784, +1849,1785,1850, +1786,1850,1785, +1850,1786,1851, +1787,1851,1786, +1851,1787,1852, +1788,1852,1787, +1852,1788,1853, +1789,1853,1788, +1853,1789,1854, +1790,1854,1789, +1854,1790,1855, +1791,1855,1790, +1856,1792,1857, +1793,1857,1792, +1857,1793,1858, +1794,1858,1793, +1858,1794,1859, +1795,1859,1794, +1859,1795,1860, +1796,1860,1795, +1860,1796,1861, +1797,1861,1796, +1861,1797,1862, +1798,1862,1797, +1862,1798,1863, +1799,1863,1798, +1863,1799,1864, +1800,1864,1799, +1864,1800,1865, +1801,1865,1800, +1865,1801,1866, +1802,1866,1801, +1866,1802,1867, +1803,1867,1802, +1867,1803,1868, +1804,1868,1803, +1868,1804,1869, +1805,1869,1804, +1869,1805,1870, +1806,1870,1805, +1870,1806,1871, +1807,1871,1806, +1871,1807,1872, +1808,1872,1807, +1872,1808,1873, +1809,1873,1808, +1873,1809,1874, +1810,1874,1809, +1874,1810,1875, +1811,1875,1810, +1875,1811,1876, +1812,1876,1811, +1876,1812,1877, +1813,1877,1812, +1877,1813,1878, +1814,1878,1813, +1878,1814,1879, +1815,1879,1814, +1879,1815,1880, +1816,1880,1815, +1880,1816,1881, +1817,1881,1816, +1881,1817,1882, +1818,1882,1817, +1882,1818,1883, +1819,1883,1818, +1883,1819,1884, +1820,1884,1819, +1884,1820,1885, +1821,1885,1820, +1885,1821,1886, +1822,1886,1821, +1886,1822,1887, +1823,1887,1822, +1887,1823,1888, +1824,1888,1823, +1888,1824,1889, +1825,1889,1824, +1889,1825,1890, +1826,1890,1825, +1890,1826,1891, +1827,1891,1826, +1891,1827,1892, +1828,1892,1827, +1892,1828,1893, +1829,1893,1828, +1893,1829,1894, +1830,1894,1829, +1894,1830,1895, +1831,1895,1830, +1895,1831,1896, +1832,1896,1831, +1896,1832,1897, +1833,1897,1832, +1897,1833,1898, +1834,1898,1833, +1898,1834,1899, +1835,1899,1834, +1899,1835,1900, +1836,1900,1835, +1900,1836,1901, +1837,1901,1836, +1901,1837,1902, +1838,1902,1837, +1902,1838,1903, +1839,1903,1838, +1903,1839,1904, +1840,1904,1839, +1904,1840,1905, +1841,1905,1840, +1905,1841,1906, +1842,1906,1841, +1906,1842,1907, +1843,1907,1842, +1907,1843,1908, +1844,1908,1843, +1908,1844,1909, +1845,1909,1844, +1909,1845,1910, +1846,1910,1845, +1910,1846,1911, +1847,1911,1846, +1911,1847,1912, +1848,1912,1847, +1912,1848,1913, +1849,1913,1848, +1913,1849,1914, +1850,1914,1849, +1914,1850,1915, +1851,1915,1850, +1915,1851,1916, +1852,1916,1851, +1916,1852,1917, +1853,1917,1852, +1917,1853,1918, +1854,1918,1853, +1918,1854,1919, +1855,1919,1854, +1920,1856,1921, +1857,1921,1856, +1921,1857,1922, +1858,1922,1857, +1922,1858,1923, +1859,1923,1858, +1923,1859,1924, +1860,1924,1859, +1924,1860,1925, +1861,1925,1860, +1925,1861,1926, +1862,1926,1861, +1926,1862,1927, +1863,1927,1862, +1927,1863,1928, +1864,1928,1863, +1928,1864,1929, +1865,1929,1864, +1929,1865,1930, +1866,1930,1865, +1930,1866,1931, +1867,1931,1866, +1931,1867,1932, +1868,1932,1867, +1932,1868,1933, +1869,1933,1868, +1933,1869,1934, +1870,1934,1869, +1934,1870,1935, +1871,1935,1870, +1935,1871,1936, +1872,1936,1871, +1936,1872,1937, +1873,1937,1872, +1937,1873,1938, +1874,1938,1873, +1938,1874,1939, +1875,1939,1874, +1939,1875,1940, +1876,1940,1875, +1940,1876,1941, +1877,1941,1876, +1941,1877,1942, +1878,1942,1877, +1942,1878,1943, +1879,1943,1878, +1943,1879,1944, +1880,1944,1879, +1944,1880,1945, +1881,1945,1880, +1945,1881,1946, +1882,1946,1881, +1946,1882,1947, +1883,1947,1882, +1947,1883,1948, +1884,1948,1883, +1948,1884,1949, +1885,1949,1884, +1949,1885,1950, +1886,1950,1885, +1950,1886,1951, +1887,1951,1886, +1951,1887,1952, +1888,1952,1887, +1952,1888,1953, +1889,1953,1888, +1953,1889,1954, +1890,1954,1889, +1954,1890,1955, +1891,1955,1890, +1955,1891,1956, +1892,1956,1891, +1956,1892,1957, +1893,1957,1892, +1957,1893,1958, +1894,1958,1893, +1958,1894,1959, +1895,1959,1894, +1959,1895,1960, +1896,1960,1895, +1960,1896,1961, +1897,1961,1896, +1961,1897,1962, +1898,1962,1897, +1962,1898,1963, +1899,1963,1898, +1963,1899,1964, +1900,1964,1899, +1964,1900,1965, +1901,1965,1900, +1965,1901,1966, +1902,1966,1901, +1966,1902,1967, +1903,1967,1902, +1967,1903,1968, +1904,1968,1903, +1968,1904,1969, +1905,1969,1904, +1969,1905,1970, +1906,1970,1905, +1970,1906,1971, +1907,1971,1906, +1971,1907,1972, +1908,1972,1907, +1972,1908,1973, +1909,1973,1908, +1973,1909,1974, +1910,1974,1909, +1974,1910,1975, +1911,1975,1910, +1975,1911,1976, +1912,1976,1911, +1976,1912,1977, +1913,1977,1912, +1977,1913,1978, +1914,1978,1913, +1978,1914,1979, +1915,1979,1914, +1979,1915,1980, +1916,1980,1915, +1980,1916,1981, +1917,1981,1916, +1981,1917,1982, +1918,1982,1917, +1982,1918,1983, +1919,1983,1918, +1984,1920,1985, +1921,1985,1920, +1985,1921,1986, +1922,1986,1921, +1986,1922,1987, +1923,1987,1922, +1987,1923,1988, +1924,1988,1923, +1988,1924,1989, +1925,1989,1924, +1989,1925,1990, +1926,1990,1925, +1990,1926,1991, +1927,1991,1926, +1991,1927,1992, +1928,1992,1927, +1992,1928,1993, +1929,1993,1928, +1993,1929,1994, +1930,1994,1929, +1994,1930,1995, +1931,1995,1930, +1995,1931,1996, +1932,1996,1931, +1996,1932,1997, +1933,1997,1932, +1997,1933,1998, +1934,1998,1933, +1998,1934,1999, +1935,1999,1934, +1999,1935,2000, +1936,2000,1935, +2000,1936,2001, +1937,2001,1936, +2001,1937,2002, +1938,2002,1937, +2002,1938,2003, +1939,2003,1938, +2003,1939,2004, +1940,2004,1939, +2004,1940,2005, +1941,2005,1940, +2005,1941,2006, +1942,2006,1941, +2006,1942,2007, +1943,2007,1942, +2007,1943,2008, +1944,2008,1943, +2008,1944,2009, +1945,2009,1944, +2009,1945,2010, +1946,2010,1945, +2010,1946,2011, +1947,2011,1946, +2011,1947,2012, +1948,2012,1947, +2012,1948,2013, +1949,2013,1948, +2013,1949,2014, +1950,2014,1949, +2014,1950,2015, +1951,2015,1950, +2015,1951,2016, +1952,2016,1951, +2016,1952,2017, +1953,2017,1952, +2017,1953,2018, +1954,2018,1953, +2018,1954,2019, +1955,2019,1954, +2019,1955,2020, +1956,2020,1955, +2020,1956,2021, +1957,2021,1956, +2021,1957,2022, +1958,2022,1957, +2022,1958,2023, +1959,2023,1958, +2023,1959,2024, +1960,2024,1959, +2024,1960,2025, +1961,2025,1960, +2025,1961,2026, +1962,2026,1961, +2026,1962,2027, +1963,2027,1962, +2027,1963,2028, +1964,2028,1963, +2028,1964,2029, +1965,2029,1964, +2029,1965,2030, +1966,2030,1965, +2030,1966,2031, +1967,2031,1966, +2031,1967,2032, +1968,2032,1967, +2032,1968,2033, +1969,2033,1968, +2033,1969,2034, +1970,2034,1969, +2034,1970,2035, +1971,2035,1970, +2035,1971,2036, +1972,2036,1971, +2036,1972,2037, +1973,2037,1972, +2037,1973,2038, +1974,2038,1973, +2038,1974,2039, +1975,2039,1974, +2039,1975,2040, +1976,2040,1975, +2040,1976,2041, +1977,2041,1976, +2041,1977,2042, +1978,2042,1977, +2042,1978,2043, +1979,2043,1978, +2043,1979,2044, +1980,2044,1979, +2044,1980,2045, +1981,2045,1980, +2045,1981,2046, +1982,2046,1981, +2046,1982,2047, +1983,2047,1982, +2048,1984,2049, +1985,2049,1984, +2049,1985,2050, +1986,2050,1985, +2050,1986,2051, +1987,2051,1986, +2051,1987,2052, +1988,2052,1987, +2052,1988,2053, +1989,2053,1988, +2053,1989,2054, +1990,2054,1989, +2054,1990,2055, +1991,2055,1990, +2055,1991,2056, +1992,2056,1991, +2056,1992,2057, +1993,2057,1992, +2057,1993,2058, +1994,2058,1993, +2058,1994,2059, +1995,2059,1994, +2059,1995,2060, +1996,2060,1995, +2060,1996,2061, +1997,2061,1996, +2061,1997,2062, +1998,2062,1997, +2062,1998,2063, +1999,2063,1998, +2063,1999,2064, +2000,2064,1999, +2064,2000,2065, +2001,2065,2000, +2065,2001,2066, +2002,2066,2001, +2066,2002,2067, +2003,2067,2002, +2067,2003,2068, +2004,2068,2003, +2068,2004,2069, +2005,2069,2004, +2069,2005,2070, +2006,2070,2005, +2070,2006,2071, +2007,2071,2006, +2071,2007,2072, +2008,2072,2007, +2072,2008,2073, +2009,2073,2008, +2073,2009,2074, +2010,2074,2009, +2074,2010,2075, +2011,2075,2010, +2075,2011,2076, +2012,2076,2011, +2076,2012,2077, +2013,2077,2012, +2077,2013,2078, +2014,2078,2013, +2078,2014,2079, +2015,2079,2014, +2079,2015,2080, +2016,2080,2015, +2080,2016,2081, +2017,2081,2016, +2081,2017,2082, +2018,2082,2017, +2082,2018,2083, +2019,2083,2018, +2083,2019,2084, +2020,2084,2019, +2084,2020,2085, +2021,2085,2020, +2085,2021,2086, +2022,2086,2021, +2086,2022,2087, +2023,2087,2022, +2087,2023,2088, +2024,2088,2023, +2088,2024,2089, +2025,2089,2024, +2089,2025,2090, +2026,2090,2025, +2090,2026,2091, +2027,2091,2026, +2091,2027,2092, +2028,2092,2027, +2092,2028,2093, +2029,2093,2028, +2093,2029,2094, +2030,2094,2029, +2094,2030,2095, +2031,2095,2030, +2095,2031,2096, +2032,2096,2031, +2096,2032,2097, +2033,2097,2032, +2097,2033,2098, +2034,2098,2033, +2098,2034,2099, +2035,2099,2034, +2099,2035,2100, +2036,2100,2035, +2100,2036,2101, +2037,2101,2036, +2101,2037,2102, +2038,2102,2037, +2102,2038,2103, +2039,2103,2038, +2103,2039,2104, +2040,2104,2039, +2104,2040,2105, +2041,2105,2040, +2105,2041,2106, +2042,2106,2041, +2106,2042,2107, +2043,2107,2042, +2107,2043,2108, +2044,2108,2043, +2108,2044,2109, +2045,2109,2044, +2109,2045,2110, +2046,2110,2045, +2110,2046,2111, +2047,2111,2046, +2112,2048,2113, +2049,2113,2048, +2113,2049,2114, +2050,2114,2049, +2114,2050,2115, +2051,2115,2050, +2115,2051,2116, +2052,2116,2051, +2116,2052,2117, +2053,2117,2052, +2117,2053,2118, +2054,2118,2053, +2118,2054,2119, +2055,2119,2054, +2119,2055,2120, +2056,2120,2055, +2120,2056,2121, +2057,2121,2056, +2121,2057,2122, +2058,2122,2057, +2122,2058,2123, +2059,2123,2058, +2123,2059,2124, +2060,2124,2059, +2124,2060,2125, +2061,2125,2060, +2125,2061,2126, +2062,2126,2061, +2126,2062,2127, +2063,2127,2062, +2127,2063,2128, +2064,2128,2063, +2128,2064,2129, +2065,2129,2064, +2129,2065,2130, +2066,2130,2065, +2130,2066,2131, +2067,2131,2066, +2131,2067,2132, +2068,2132,2067, +2132,2068,2133, +2069,2133,2068, +2133,2069,2134, +2070,2134,2069, +2134,2070,2135, +2071,2135,2070, +2135,2071,2136, +2072,2136,2071, +2136,2072,2137, +2073,2137,2072, +2137,2073,2138, +2074,2138,2073, +2138,2074,2139, +2075,2139,2074, +2139,2075,2140, +2076,2140,2075, +2140,2076,2141, +2077,2141,2076, +2141,2077,2142, +2078,2142,2077, +2142,2078,2143, +2079,2143,2078, +2143,2079,2144, +2080,2144,2079, +2144,2080,2145, +2081,2145,2080, +2145,2081,2146, +2082,2146,2081, +2146,2082,2147, +2083,2147,2082, +2147,2083,2148, +2084,2148,2083, +2148,2084,2149, +2085,2149,2084, +2149,2085,2150, +2086,2150,2085, +2150,2086,2151, +2087,2151,2086, +2151,2087,2152, +2088,2152,2087, +2152,2088,2153, +2089,2153,2088, +2153,2089,2154, +2090,2154,2089, +2154,2090,2155, +2091,2155,2090, +2155,2091,2156, +2092,2156,2091, +2156,2092,2157, +2093,2157,2092, +2157,2093,2158, +2094,2158,2093, +2158,2094,2159, +2095,2159,2094, +2159,2095,2160, +2096,2160,2095, +2160,2096,2161, +2097,2161,2096, +2161,2097,2162, +2098,2162,2097, +2162,2098,2163, +2099,2163,2098, +2163,2099,2164, +2100,2164,2099, +2164,2100,2165, +2101,2165,2100, +2165,2101,2166, +2102,2166,2101, +2166,2102,2167, +2103,2167,2102, +2167,2103,2168, +2104,2168,2103, +2168,2104,2169, +2105,2169,2104, +2169,2105,2170, +2106,2170,2105, +2170,2106,2171, +2107,2171,2106, +2171,2107,2172, +2108,2172,2107, +2172,2108,2173, +2109,2173,2108, +2173,2109,2174, +2110,2174,2109, +2174,2110,2175, +2111,2175,2110, +2176,2112,2177, +2113,2177,2112, +2177,2113,2178, +2114,2178,2113, +2178,2114,2179, +2115,2179,2114, +2179,2115,2180, +2116,2180,2115, +2180,2116,2181, +2117,2181,2116, +2181,2117,2182, +2118,2182,2117, +2182,2118,2183, +2119,2183,2118, +2183,2119,2184, +2120,2184,2119, +2184,2120,2185, +2121,2185,2120, +2185,2121,2186, +2122,2186,2121, +2186,2122,2187, +2123,2187,2122, +2187,2123,2188, +2124,2188,2123, +2188,2124,2189, +2125,2189,2124, +2189,2125,2190, +2126,2190,2125, +2190,2126,2191, +2127,2191,2126, +2191,2127,2192, +2128,2192,2127, +2192,2128,2193, +2129,2193,2128, +2193,2129,2194, +2130,2194,2129, +2194,2130,2195, +2131,2195,2130, +2195,2131,2196, +2132,2196,2131, +2196,2132,2197, +2133,2197,2132, +2197,2133,2198, +2134,2198,2133, +2198,2134,2199, +2135,2199,2134, +2199,2135,2200, +2136,2200,2135, +2200,2136,2201, +2137,2201,2136, +2201,2137,2202, +2138,2202,2137, +2202,2138,2203, +2139,2203,2138, +2203,2139,2204, +2140,2204,2139, +2204,2140,2205, +2141,2205,2140, +2205,2141,2206, +2142,2206,2141, +2206,2142,2207, +2143,2207,2142, +2207,2143,2208, +2144,2208,2143, +2208,2144,2209, +2145,2209,2144, +2209,2145,2210, +2146,2210,2145, +2210,2146,2211, +2147,2211,2146, +2211,2147,2212, +2148,2212,2147, +2212,2148,2213, +2149,2213,2148, +2213,2149,2214, +2150,2214,2149, +2214,2150,2215, +2151,2215,2150, +2215,2151,2216, +2152,2216,2151, +2216,2152,2217, +2153,2217,2152, +2217,2153,2218, +2154,2218,2153, +2218,2154,2219, +2155,2219,2154, +2219,2155,2220, +2156,2220,2155, +2220,2156,2221, +2157,2221,2156, +2221,2157,2222, +2158,2222,2157, +2222,2158,2223, +2159,2223,2158, +2223,2159,2224, +2160,2224,2159, +2224,2160,2225, +2161,2225,2160, +2225,2161,2226, +2162,2226,2161, +2226,2162,2227, +2163,2227,2162, +2227,2163,2228, +2164,2228,2163, +2228,2164,2229, +2165,2229,2164, +2229,2165,2230, +2166,2230,2165, +2230,2166,2231, +2167,2231,2166, +2231,2167,2232, +2168,2232,2167, +2232,2168,2233, +2169,2233,2168, +2233,2169,2234, +2170,2234,2169, +2234,2170,2235, +2171,2235,2170, +2235,2171,2236, +2172,2236,2171, +2236,2172,2237, +2173,2237,2172, +2237,2173,2238, +2174,2238,2173, +2238,2174,2239, +2175,2239,2174, +}; + +#define Landscape08VtxCount 2178 +#define Landscape08IdxCount 12480 + +btScalar Landscape08Vtx[] = { +-250.0f,30.98f,-128.906f, +-250.0f,31.4025f,-125.0f, +-246.094f,31.7629f,-128.906f, +-246.094f,31.4165f,-125.0f, +-242.188f,32.5689f,-128.906f, +-242.188f,32.314f,-125.0f, +-238.281f,32.9125f,-128.906f, +-238.281f,32.9822f,-125.0f, +-234.375f,32.5915f,-128.906f, +-234.375f,32.6962f,-125.0f, +-230.469f,31.2708f,-128.906f, +-230.469f,31.3632f,-125.0f, +-226.563f,30.5212f,-128.906f, +-226.563f,29.4391f,-125.0f, +-222.656f,30.2031f,-128.906f, +-222.656f,29.519f,-125.0f, +-218.75f,30.4582f,-128.906f, +-218.75f,29.4481f,-125.0f, +-214.844f,30.6941f,-128.906f, +-214.844f,29.8481f,-125.0f, +-210.938f,30.5035f,-128.906f, +-210.938f,30.408f,-125.0f, +-207.031f,30.2726f,-128.906f, +-207.031f,30.291f,-125.0f, +-203.125f,29.38f,-128.906f, +-203.125f,28.7473f,-125.0f, +-199.219f,28.6973f,-128.906f, +-199.219f,28.1816f,-125.0f, +-195.313f,27.9768f,-128.906f, +-195.313f,27.2839f,-125.0f, +-191.406f,26.1169f,-128.906f, +-191.406f,25.7018f,-125.0f, +-187.5f,23.8648f,-128.906f, +-187.5f,23.2882f,-125.0f, +-183.594f,21.95f,-128.906f, +-183.594f,22.1614f,-125.0f, +-179.688f,19.6798f,-128.906f, +-179.688f,20.658f,-125.0f, +-175.781f,17.3507f,-128.906f, +-175.781f,18.8433f,-125.0f, +-171.875f,15.7914f,-128.906f, +-171.875f,16.364f,-125.0f, +-167.969f,14.3745f,-128.906f, +-167.969f,14.7298f,-125.0f, +-164.063f,12.4911f,-128.906f, +-164.063f,12.9859f,-125.0f, +-160.156f,11.0533f,-128.906f, +-160.156f,11.3306f,-125.0f, +-156.25f,9.15062f,-128.906f, +-156.25f,10.1916f,-125.0f, +-152.344f,6.68059f,-128.906f, +-152.344f,8.3967f,-125.0f, +-148.438f,5.57112f,-128.906f, +-148.438f,6.23292f,-125.0f, +-144.531f,5.2271f,-128.906f, +-144.531f,5.48985f,-125.0f, +-140.625f,5.87576f,-128.906f, +-140.625f,5.18276f,-125.0f, +-136.719f,6.85614f,-128.906f, +-136.719f,5.56059f,-125.0f, +-132.813f,6.86087f,-128.906f, +-132.813f,5.75157f,-125.0f, +-128.906f,7.10341f,-128.906f, +-128.906f,5.32154f,-125.0f, +-125.0f,7.54727f,-128.906f, +-125.0f,6.15672f,-125.0f, +-121.094f,8.02225f,-128.906f, +-121.094f,7.53373f,-125.0f, +-117.188f,8.70065f,-128.906f, +-117.188f,8.38676f,-125.0f, +-113.281f,9.39689f,-128.906f, +-113.281f,8.64274f,-125.0f, +-109.375f,8.80449f,-128.906f, +-109.375f,8.49941f,-125.0f, +-105.469f,9.43366f,-128.906f, +-105.469f,9.24481f,-125.0f, +-101.563f,10.868f,-128.906f, +-101.563f,11.5178f,-125.0f, +-97.6563f,12.8404f,-128.906f, +-97.6563f,13.4113f,-125.0f, +-93.75f,14.8214f,-128.906f, +-93.75f,15.4997f,-125.0f, +-89.8438f,16.618f,-128.906f, +-89.8438f,17.3502f,-125.0f, +-85.9375f,20.2496f,-128.906f, +-85.9375f,20.8168f,-125.0f, +-82.0313f,23.697f,-128.906f, +-82.0313f,24.9405f,-125.0f, +-78.125f,26.4451f,-128.906f, +-78.125f,27.8681f,-125.0f, +-74.2188f,28.7901f,-128.906f, +-74.2188f,30.1495f,-125.0f, +-70.3125f,31.4052f,-128.906f, +-70.3125f,32.4402f,-125.0f, +-66.4063f,33.3106f,-128.906f, +-66.4063f,34.2537f,-125.0f, +-62.5f,35.8538f,-128.906f, +-62.5f,36.5623f,-125.0f, +-58.5938f,37.9798f,-128.906f, +-58.5938f,38.9027f,-125.0f, +-54.6875f,39.4006f,-128.906f, +-54.6875f,40.1192f,-125.0f, +-50.7813f,40.6584f,-128.906f, +-50.7813f,41.9393f,-125.0f, +-46.875f,40.8896f,-128.906f, +-46.875f,41.8765f,-125.0f, +-42.9688f,39.9544f,-128.906f, +-42.9688f,41.6371f,-125.0f, +-39.0625f,40.0893f,-128.906f, +-39.0625f,41.6432f,-125.0f, +-35.1563f,39.3183f,-128.906f, +-35.1563f,41.2852f,-125.0f, +-31.25f,39.8575f,-128.906f, +-31.25f,41.5629f,-125.0f, +-27.3438f,41.5378f,-128.906f, +-27.3438f,42.2956f,-125.0f, +-23.4375f,44.0561f,-128.906f, +-23.4375f,43.9719f,-125.0f, +-19.5313f,45.4298f,-128.906f, +-19.5313f,46.2232f,-125.0f, +-15.625f,47.4474f,-128.906f, +-15.625f,47.3104f,-125.0f, +-11.7188f,48.0018f,-128.906f, +-11.7188f,47.5943f,-125.0f, +-7.8125f,48.0717f,-128.906f, +-7.8125f,49.1192f,-125.0f, +-3.90625f,48.7253f,-128.906f, +-3.90625f,49.6341f,-125.0f, +0.0f,49.8f,-128.906f, +0.0f,50.3481f,-125.0f, +3.90625f,50.4716f,-128.906f, +3.90625f,50.3021f,-125.0f, +-250.0f,31.1145f,-132.813f, +-246.094f,31.857f,-132.813f, +-242.188f,32.7446f,-132.813f, +-238.281f,33.1734f,-132.813f, +-234.375f,32.1952f,-132.813f, +-230.469f,31.8959f,-132.813f, +-226.563f,32.1326f,-132.813f, +-222.656f,32.1631f,-132.813f, +-218.75f,31.3795f,-132.813f, +-214.844f,30.9888f,-132.813f, +-210.938f,30.5577f,-132.813f, +-207.031f,30.1392f,-132.813f, +-203.125f,29.8482f,-132.813f, +-199.219f,28.5903f,-132.813f, +-195.313f,27.4671f,-132.813f, +-191.406f,25.5032f,-132.813f, +-187.5f,23.2799f,-132.813f, +-183.594f,21.2846f,-132.813f, +-179.688f,19.3954f,-132.813f, +-175.781f,18.1112f,-132.813f, +-171.875f,16.3831f,-132.813f, +-167.969f,14.5038f,-132.813f, +-164.063f,12.8109f,-132.813f, +-160.156f,10.386f,-132.813f, +-156.25f,7.93486f,-132.813f, +-152.344f,7.25449f,-132.813f, +-148.438f,6.19974f,-132.813f, +-144.531f,5.89578f,-132.813f, +-140.625f,6.61884f,-132.813f, +-136.719f,7.53382f,-132.813f, +-132.813f,8.21024f,-132.813f, +-128.906f,8.74115f,-132.813f, +-125.0f,8.97047f,-132.813f, +-121.094f,9.41307f,-132.813f, +-117.188f,10.0468f,-132.813f, +-113.281f,9.47404f,-132.813f, +-109.375f,9.418f,-132.813f, +-105.469f,10.3176f,-132.813f, +-101.563f,11.3001f,-132.813f, +-97.6563f,12.5318f,-132.813f, +-93.75f,14.6986f,-132.813f, +-89.8438f,16.6495f,-132.813f, +-85.9375f,19.1906f,-132.813f, +-82.0313f,23.4349f,-132.813f, +-78.125f,26.1629f,-132.813f, +-74.2188f,28.739f,-132.813f, +-70.3125f,31.1271f,-132.813f, +-66.4063f,32.2452f,-132.813f, +-62.5f,34.0303f,-132.813f, +-58.5938f,36.1234f,-132.813f, +-54.6875f,38.3054f,-132.813f, +-50.7813f,38.7936f,-132.813f, +-46.875f,39.1319f,-132.813f, +-42.9688f,39.1462f,-132.813f, +-39.0625f,38.4732f,-132.813f, +-35.1563f,38.3061f,-132.813f, +-31.25f,39.4999f,-132.813f, +-27.3438f,41.8953f,-132.813f, +-23.4375f,43.2645f,-132.813f, +-19.5313f,44.7736f,-132.813f, +-15.625f,46.2491f,-132.813f, +-11.7188f,47.4527f,-132.813f, +-7.8125f,47.1407f,-132.813f, +-3.90625f,48.0628f,-132.813f, +0.0f,48.5651f,-132.813f, +3.90625f,49.1054f,-132.813f, +-250.0f,30.7461f,-136.719f, +-246.094f,30.8483f,-136.719f, +-242.188f,32.188f,-136.719f, +-238.281f,33.149f,-136.719f, +-234.375f,32.3165f,-136.719f, +-230.469f,32.613f,-136.719f, +-226.563f,33.3246f,-136.719f, +-222.656f,32.6429f,-136.719f, +-218.75f,31.8882f,-136.719f, +-214.844f,31.5125f,-136.719f, +-210.938f,30.2065f,-136.719f, +-207.031f,30.0024f,-136.719f, +-203.125f,29.5699f,-136.719f, +-199.219f,28.1245f,-136.719f, +-195.313f,26.764f,-136.719f, +-191.406f,24.8025f,-136.719f, +-187.5f,22.7863f,-136.719f, +-183.594f,21.0979f,-136.719f, +-179.688f,19.5742f,-136.719f, +-175.781f,17.9263f,-136.719f, +-171.875f,16.0908f,-136.719f, +-167.969f,14.6542f,-136.719f, +-164.063f,12.4534f,-136.719f, +-160.156f,9.93763f,-136.719f, +-156.25f,7.87486f,-136.719f, +-152.344f,7.06627f,-136.719f, +-148.438f,6.22453f,-136.719f, +-144.531f,6.39864f,-136.719f, +-140.625f,7.02103f,-136.719f, +-136.719f,7.85488f,-136.719f, +-132.813f,9.33235f,-136.719f, +-128.906f,10.546f,-136.719f, +-125.0f,10.1958f,-136.719f, +-121.094f,9.85385f,-136.719f, +-117.188f,10.2437f,-136.719f, +-113.281f,9.95341f,-136.719f, +-109.375f,9.05387f,-136.719f, +-105.469f,10.3384f,-136.719f, +-101.563f,11.2859f,-136.719f, +-97.6563f,12.3544f,-136.719f, +-93.75f,14.0582f,-136.719f, +-89.8438f,15.9772f,-136.719f, +-85.9375f,18.8673f,-136.719f, +-82.0313f,22.2278f,-136.719f, +-78.125f,25.0468f,-136.719f, +-74.2188f,27.6452f,-136.719f, +-70.3125f,29.155f,-136.719f, +-66.4063f,30.7457f,-136.719f, +-62.5f,32.6722f,-136.719f, +-58.5938f,34.5222f,-136.719f, +-54.6875f,36.3904f,-136.719f, +-50.7813f,36.1946f,-136.719f, +-46.875f,36.5194f,-136.719f, +-42.9688f,36.2715f,-136.719f, +-39.0625f,36.4185f,-136.719f, +-35.1563f,37.1668f,-136.719f, +-31.25f,38.3933f,-136.719f, +-27.3438f,40.8416f,-136.719f, +-23.4375f,42.7243f,-136.719f, +-19.5313f,43.7567f,-136.719f, +-15.625f,44.7705f,-136.719f, +-11.7188f,45.3267f,-136.719f, +-7.8125f,46.433f,-136.719f, +-3.90625f,47.3134f,-136.719f, +0.0f,48.4146f,-136.719f, +3.90625f,47.9f,-136.719f, +-250.0f,29.1575f,-140.625f, +-246.094f,30.5173f,-140.625f, +-242.188f,31.576f,-140.625f, +-238.281f,31.6992f,-140.625f, +-234.375f,32.9063f,-140.625f, +-230.469f,33.2752f,-140.625f, +-226.563f,32.8003f,-140.625f, +-222.656f,33.133f,-140.625f, +-218.75f,32.0543f,-140.625f, +-214.844f,31.2672f,-140.625f, +-210.938f,30.2378f,-140.625f, +-207.031f,29.601f,-140.625f, +-203.125f,28.4643f,-140.625f, +-199.219f,26.8711f,-140.625f, +-195.313f,24.936f,-140.625f, +-191.406f,22.9115f,-140.625f, +-187.5f,21.8507f,-140.625f, +-183.594f,20.4435f,-140.625f, +-179.688f,18.4455f,-140.625f, +-175.781f,17.1667f,-140.625f, +-171.875f,15.2077f,-140.625f, +-167.969f,13.4799f,-140.625f, +-164.063f,11.7723f,-140.625f, +-160.156f,9.26955f,-140.625f, +-156.25f,7.56528f,-140.625f, +-152.344f,6.4244f,-140.625f, +-148.438f,6.60539f,-140.625f, +-144.531f,6.44163f,-140.625f, +-140.625f,6.55017f,-140.625f, +-136.719f,7.62805f,-140.625f, +-132.813f,9.20726f,-140.625f, +-128.906f,10.5063f,-140.625f, +-125.0f,10.6867f,-140.625f, +-121.094f,9.3702f,-140.625f, +-117.188f,9.53484f,-140.625f, +-113.281f,8.855f,-140.625f, +-109.375f,9.3082f,-140.625f, +-105.469f,9.67718f,-140.625f, +-101.563f,10.5233f,-140.625f, +-97.6563f,11.8026f,-140.625f, +-93.75f,13.1675f,-140.625f, +-89.8438f,15.253f,-140.625f, +-85.9375f,18.1074f,-140.625f, +-82.0313f,20.8004f,-140.625f, +-78.125f,23.7651f,-140.625f, +-74.2188f,25.7067f,-140.625f, +-70.3125f,27.5126f,-140.625f, +-66.4063f,29.8191f,-140.625f, +-62.5f,31.7367f,-140.625f, +-58.5938f,32.8891f,-140.625f, +-54.6875f,34.0989f,-140.625f, +-50.7813f,34.6645f,-140.625f, +-46.875f,34.0325f,-140.625f, +-42.9688f,33.7773f,-140.625f, +-39.0625f,34.1723f,-140.625f, +-35.1563f,36.0861f,-140.625f, +-31.25f,38.8562f,-140.625f, +-27.3438f,40.5684f,-140.625f, +-23.4375f,42.6832f,-140.625f, +-19.5313f,43.505f,-140.625f, +-15.625f,43.7197f,-140.625f, +-11.7188f,43.8656f,-140.625f, +-7.8125f,45.6272f,-140.625f, +-3.90625f,46.7713f,-140.625f, +0.0f,47.1255f,-140.625f, +3.90625f,47.2681f,-140.625f, +-250.0f,28.3388f,-144.531f, +-246.094f,29.5689f,-144.531f, +-242.188f,30.0422f,-144.531f, +-238.281f,30.6319f,-144.531f, +-234.375f,32.5914f,-144.531f, +-230.469f,33.306f,-144.531f, +-226.563f,32.9265f,-144.531f, +-222.656f,32.5363f,-144.531f, +-218.75f,31.8845f,-144.531f, +-214.844f,31.7429f,-144.531f, +-210.938f,29.6521f,-144.531f, +-207.031f,28.3301f,-144.531f, +-203.125f,26.8166f,-144.531f, +-199.219f,25.0756f,-144.531f, +-195.313f,23.0988f,-144.531f, +-191.406f,21.2037f,-144.531f, +-187.5f,20.271f,-144.531f, +-183.594f,18.4189f,-144.531f, +-179.688f,16.2352f,-144.531f, +-175.781f,14.734f,-144.531f, +-171.875f,13.9522f,-144.531f, +-167.969f,12.543f,-144.531f, +-164.063f,10.6335f,-144.531f, +-160.156f,8.53885f,-144.531f, +-156.25f,7.32299f,-144.531f, +-152.344f,6.69849f,-144.531f, +-148.438f,5.37792f,-144.531f, +-144.531f,5.52557f,-144.531f, +-140.625f,5.94721f,-144.531f, +-136.719f,7.15949f,-144.531f, +-132.813f,8.5533f,-144.531f, +-128.906f,9.68048f,-144.531f, +-125.0f,9.80421f,-144.531f, +-121.094f,9.67052f,-144.531f, +-117.188f,9.82889f,-144.531f, +-113.281f,9.40895f,-144.531f, +-109.375f,9.53728f,-144.531f, +-105.469f,9.89567f,-144.531f, +-101.563f,10.4472f,-144.531f, +-97.6563f,11.3813f,-144.531f, +-93.75f,13.6687f,-144.531f, +-89.8438f,15.6897f,-144.531f, +-85.9375f,17.6694f,-144.531f, +-82.0313f,20.0542f,-144.531f, +-78.125f,22.2881f,-144.531f, +-74.2188f,24.021f,-144.531f, +-70.3125f,26.6221f,-144.531f, +-66.4063f,28.7647f,-144.531f, +-62.5f,31.0025f,-144.531f, +-58.5938f,31.9212f,-144.531f, +-54.6875f,32.1124f,-144.531f, +-50.7813f,33.4656f,-144.531f, +-46.875f,33.5412f,-144.531f, +-42.9688f,33.5562f,-144.531f, +-39.0625f,34.3563f,-144.531f, +-35.1563f,36.2482f,-144.531f, +-31.25f,37.99f,-144.531f, +-27.3438f,40.3527f,-144.531f, +-23.4375f,42.4204f,-144.531f, +-19.5313f,44.0f,-144.531f, +-15.625f,44.183f,-144.531f, +-11.7188f,44.0185f,-144.531f, +-7.8125f,45.08f,-144.531f, +-3.90625f,45.5784f,-144.531f, +0.0f,44.8122f,-144.531f, +3.90625f,45.2398f,-144.531f, +-250.0f,27.5165f,-148.438f, +-246.094f,28.4707f,-148.438f, +-242.188f,28.8693f,-148.438f, +-238.281f,29.8936f,-148.438f, +-234.375f,30.9982f,-148.438f, +-230.469f,31.9158f,-148.438f, +-226.563f,33.0887f,-148.438f, +-222.656f,32.141f,-148.438f, +-218.75f,31.0388f,-148.438f, +-214.844f,30.5599f,-148.438f, +-210.938f,29.1269f,-148.438f, +-207.031f,26.6179f,-148.438f, +-203.125f,25.2859f,-148.438f, +-199.219f,23.1182f,-148.438f, +-195.313f,21.139f,-148.438f, +-191.406f,19.7044f,-148.438f, +-187.5f,18.4387f,-148.438f, +-183.594f,17.6363f,-148.438f, +-179.688f,15.8724f,-148.438f, +-175.781f,14.454f,-148.438f, +-171.875f,13.2052f,-148.438f, +-167.969f,11.7702f,-148.438f, +-164.063f,10.4965f,-148.438f, +-160.156f,8.29165f,-148.438f, +-156.25f,7.24803f,-148.438f, +-152.344f,6.79621f,-148.438f, +-148.438f,5.48372f,-148.438f, +-144.531f,4.11362f,-148.438f, +-140.625f,4.6586f,-148.438f, +-136.719f,6.20081f,-148.438f, +-132.813f,7.67687f,-148.438f, +-128.906f,9.0742f,-148.438f, +-125.0f,8.8028f,-148.438f, +-121.094f,9.309f,-148.438f, +-117.188f,9.26616f,-148.438f, +-113.281f,9.88711f,-148.438f, +-109.375f,9.19023f,-148.438f, +-105.469f,9.46828f,-148.438f, +-101.563f,10.1584f,-148.438f, +-97.6563f,11.2649f,-148.438f, +-93.75f,13.476f,-148.438f, +-89.8438f,15.8318f,-148.438f, +-85.9375f,17.6136f,-148.438f, +-82.0313f,18.7495f,-148.438f, +-78.125f,20.5385f,-148.438f, +-74.2188f,23.5666f,-148.438f, +-70.3125f,26.2836f,-148.438f, +-66.4063f,28.729f,-148.438f, +-62.5f,30.3854f,-148.438f, +-58.5938f,30.9909f,-148.438f, +-54.6875f,31.4288f,-148.438f, +-50.7813f,31.916f,-148.438f, +-46.875f,32.4745f,-148.438f, +-42.9688f,32.0881f,-148.438f, +-39.0625f,34.0231f,-148.438f, +-35.1563f,35.6432f,-148.438f, +-31.25f,37.6278f,-148.438f, +-27.3438f,39.652f,-148.438f, +-23.4375f,42.3336f,-148.438f, +-19.5313f,43.3336f,-148.438f, +-15.625f,43.9329f,-148.438f, +-11.7188f,43.8742f,-148.438f, +-7.8125f,44.336f,-148.438f, +-3.90625f,44.2738f,-148.438f, +0.0f,42.6429f,-148.438f, +3.90625f,43.4167f,-148.438f, +-250.0f,27.7654f,-152.344f, +-246.094f,28.2588f,-152.344f, +-242.188f,28.0365f,-152.344f, +-238.281f,29.4531f,-152.344f, +-234.375f,31.8507f,-152.344f, +-230.469f,31.9987f,-152.344f, +-226.563f,32.2635f,-152.344f, +-222.656f,32.4573f,-152.344f, +-218.75f,30.3791f,-152.344f, +-214.844f,29.1133f,-152.344f, +-210.938f,27.6466f,-152.344f, +-207.031f,25.5524f,-152.344f, +-203.125f,23.857f,-152.344f, +-199.219f,21.724f,-152.344f, +-195.313f,19.9592f,-152.344f, +-191.406f,18.6648f,-152.344f, +-187.5f,17.3913f,-152.344f, +-183.594f,17.3113f,-152.344f, +-179.688f,15.8776f,-152.344f, +-175.781f,13.7968f,-152.344f, +-171.875f,11.9961f,-152.344f, +-167.969f,10.9315f,-152.344f, +-164.063f,9.24337f,-152.344f, +-160.156f,7.95749f,-152.344f, +-156.25f,6.95525f,-152.344f, +-152.344f,6.523f,-152.344f, +-148.438f,5.62313f,-152.344f, +-144.531f,4.31939f,-152.344f, +-140.625f,3.1203f,-152.344f, +-136.719f,4.98713f,-152.344f, +-132.813f,6.64544f,-152.344f, +-128.906f,7.48658f,-152.344f, +-125.0f,8.08424f,-152.344f, +-121.094f,8.96562f,-152.344f, +-117.188f,9.10159f,-152.344f, +-113.281f,9.38004f,-152.344f, +-109.375f,8.97581f,-152.344f, +-105.469f,8.78511f,-152.344f, +-101.563f,9.76846f,-152.344f, +-97.6563f,10.4299f,-152.344f, +-93.75f,13.6059f,-152.344f, +-89.8438f,16.3193f,-152.344f, +-85.9375f,17.6959f,-152.344f, +-82.0313f,18.5545f,-152.344f, +-78.125f,20.1179f,-152.344f, +-74.2188f,22.929f,-152.344f, +-70.3125f,25.8413f,-152.344f, +-66.4063f,28.4214f,-152.344f, +-62.5f,30.0187f,-152.344f, +-58.5938f,30.4285f,-152.344f, +-54.6875f,30.9236f,-152.344f, +-50.7813f,31.3519f,-152.344f, +-46.875f,31.0939f,-152.344f, +-42.9688f,30.2517f,-152.344f, +-39.0625f,32.8953f,-152.344f, +-35.1563f,34.6998f,-152.344f, +-31.25f,36.8107f,-152.344f, +-27.3438f,38.8491f,-152.344f, +-23.4375f,41.3749f,-152.344f, +-19.5313f,42.0838f,-152.344f, +-15.625f,42.3106f,-152.344f, +-11.7188f,43.9654f,-152.344f, +-7.8125f,44.3642f,-152.344f, +-3.90625f,43.1787f,-152.344f, +0.0f,41.875f,-152.344f, +3.90625f,42.7212f,-152.344f, +-250.0f,27.3076f,-156.25f, +-246.094f,27.8739f,-156.25f, +-242.188f,27.7337f,-156.25f, +-238.281f,28.4499f,-156.25f, +-234.375f,30.5068f,-156.25f, +-230.469f,31.1326f,-156.25f, +-226.563f,32.3149f,-156.25f, +-222.656f,31.2724f,-156.25f, +-218.75f,29.5487f,-156.25f, +-214.844f,26.8408f,-156.25f, +-210.938f,25.2503f,-156.25f, +-207.031f,24.2811f,-156.25f, +-203.125f,23.8635f,-156.25f, +-199.219f,22.2573f,-156.25f, +-195.313f,20.6368f,-156.25f, +-191.406f,19.4922f,-156.25f, +-187.5f,18.0281f,-156.25f, +-183.594f,15.4098f,-156.25f, +-179.688f,13.9176f,-156.25f, +-175.781f,11.8192f,-156.25f, +-171.875f,9.31112f,-156.25f, +-167.969f,8.81167f,-156.25f, +-164.063f,8.04908f,-156.25f, +-160.156f,6.4764f,-156.25f, +-156.25f,5.83656f,-156.25f, +-152.344f,5.70173f,-156.25f, +-148.438f,6.05686f,-156.25f, +-144.531f,3.98364f,-156.25f, +-140.625f,2.80636f,-156.25f, +-136.719f,3.53326f,-156.25f, +-132.813f,4.97177f,-156.25f, +-128.906f,6.71319f,-156.25f, +-125.0f,8.26478f,-156.25f, +-121.094f,9.00909f,-156.25f, +-117.188f,8.8849f,-156.25f, +-113.281f,9.50654f,-156.25f, +-109.375f,9.16878f,-156.25f, +-105.469f,8.84796f,-156.25f, +-101.563f,9.78015f,-156.25f, +-97.6563f,11.1536f,-156.25f, +-93.75f,13.416f,-156.25f, +-89.8438f,15.8674f,-156.25f, +-85.9375f,17.2814f,-156.25f, +-82.0313f,18.1958f,-156.25f, +-78.125f,19.5037f,-156.25f, +-74.2188f,22.0147f,-156.25f, +-70.3125f,24.3288f,-156.25f, +-66.4063f,26.5193f,-156.25f, +-62.5f,27.9571f,-156.25f, +-58.5938f,28.8524f,-156.25f, +-54.6875f,30.6249f,-156.25f, +-50.7813f,30.9824f,-156.25f, +-46.875f,31.0372f,-156.25f, +-42.9688f,30.2189f,-156.25f, +-39.0625f,32.0632f,-156.25f, +-35.1563f,34.0061f,-156.25f, +-31.25f,35.3975f,-156.25f, +-27.3438f,37.8006f,-156.25f, +-23.4375f,40.1384f,-156.25f, +-19.5313f,40.5455f,-156.25f, +-15.625f,41.6044f,-156.25f, +-11.7188f,43.1078f,-156.25f, +-7.8125f,43.5927f,-156.25f, +-3.90625f,43.0245f,-156.25f, +0.0f,41.3824f,-156.25f, +3.90625f,41.7368f,-156.25f, +-250.0f,27.1128f,-160.156f, +-246.094f,26.9845f,-160.156f, +-242.188f,26.7433f,-160.156f, +-238.281f,27.3777f,-160.156f, +-234.375f,29.1743f,-160.156f, +-230.469f,31.0712f,-160.156f, +-226.563f,31.3707f,-160.156f, +-222.656f,30.2327f,-160.156f, +-218.75f,27.897f,-160.156f, +-214.844f,26.4218f,-160.156f, +-210.938f,24.0007f,-160.156f, +-207.031f,23.6445f,-160.156f, +-203.125f,23.6467f,-160.156f, +-199.219f,22.8576f,-160.156f, +-195.313f,20.6778f,-160.156f, +-191.406f,19.3331f,-160.156f, +-187.5f,17.8893f,-160.156f, +-183.594f,14.3376f,-160.156f, +-179.688f,11.9084f,-160.156f, +-175.781f,9.60285f,-160.156f, +-171.875f,7.78231f,-160.156f, +-167.969f,8.15369f,-160.156f, +-164.063f,7.46984f,-160.156f, +-160.156f,6.48522f,-160.156f, +-156.25f,5.27847f,-160.156f, +-152.344f,4.69473f,-160.156f, +-148.438f,5.14018f,-160.156f, +-144.531f,3.26777f,-160.156f, +-140.625f,3.33507f,-160.156f, +-136.719f,2.47156f,-160.156f, +-132.813f,4.15824f,-160.156f, +-128.906f,6.45432f,-160.156f, +-125.0f,7.99373f,-160.156f, +-121.094f,8.38925f,-160.156f, +-117.188f,8.59802f,-160.156f, +-113.281f,9.4891f,-160.156f, +-109.375f,9.20323f,-160.156f, +-105.469f,8.27038f,-160.156f, +-101.563f,9.71848f,-160.156f, +-97.6563f,11.8577f,-160.156f, +-93.75f,14.596f,-160.156f, +-89.8438f,16.1058f,-160.156f, +-85.9375f,17.6531f,-160.156f, +-82.0313f,18.2123f,-160.156f, +-78.125f,18.7175f,-160.156f, +-74.2188f,20.7283f,-160.156f, +-70.3125f,23.5217f,-160.156f, +-66.4063f,26.4239f,-160.156f, +-62.5f,27.757f,-160.156f, +-58.5938f,28.1862f,-160.156f, +-54.6875f,28.9075f,-160.156f, +-50.7813f,29.5287f,-160.156f, +-46.875f,29.3972f,-160.156f, +-42.9688f,29.568f,-160.156f, +-39.0625f,30.605f,-160.156f, +-35.1563f,33.0369f,-160.156f, +-31.25f,34.749f,-160.156f, +-27.3438f,37.4864f,-160.156f, +-23.4375f,39.2291f,-160.156f, +-19.5313f,39.6275f,-160.156f, +-15.625f,39.865f,-160.156f, +-11.7188f,41.1833f,-160.156f, +-7.8125f,41.7789f,-160.156f, +-3.90625f,41.6972f,-160.156f, +0.0f,40.379f,-160.156f, +3.90625f,40.4755f,-160.156f, +-250.0f,26.3982f,-164.063f, +-246.094f,26.3606f,-164.063f, +-242.188f,26.6508f,-164.063f, +-238.281f,27.2228f,-164.063f, +-234.375f,29.1682f,-164.063f, +-230.469f,30.116f,-164.063f, +-226.563f,30.3591f,-164.063f, +-222.656f,28.8713f,-164.063f, +-218.75f,26.8459f,-164.063f, +-214.844f,24.9771f,-164.063f, +-210.938f,24.4581f,-164.063f, +-207.031f,23.6584f,-164.063f, +-203.125f,22.7316f,-164.063f, +-199.219f,21.1836f,-164.063f, +-195.313f,19.6131f,-164.063f, +-191.406f,18.5182f,-164.063f, +-187.5f,16.824f,-164.063f, +-183.594f,13.8772f,-164.063f, +-179.688f,10.3923f,-164.063f, +-175.781f,7.50643f,-164.063f, +-171.875f,6.58466f,-164.063f, +-167.969f,6.81413f,-164.063f, +-164.063f,6.88249f,-164.063f, +-160.156f,6.78655f,-164.063f, +-156.25f,5.18348f,-164.063f, +-152.344f,4.44173f,-164.063f, +-148.438f,4.56392f,-164.063f, +-144.531f,3.00722f,-164.063f, +-140.625f,2.88808f,-164.063f, +-136.719f,2.58477f,-164.063f, +-132.813f,3.20911f,-164.063f, +-128.906f,5.33043f,-164.063f, +-125.0f,6.73698f,-164.063f, +-121.094f,7.71971f,-164.063f, +-117.188f,8.44689f,-164.063f, +-113.281f,9.05366f,-164.063f, +-109.375f,8.81111f,-164.063f, +-105.469f,7.75706f,-164.063f, +-101.563f,11.1131f,-164.063f, +-97.6563f,12.8283f,-164.063f, +-93.75f,14.7771f,-164.063f, +-89.8438f,16.181f,-164.063f, +-85.9375f,17.4228f,-164.063f, +-82.0313f,18.5185f,-164.063f, +-78.125f,19.3122f,-164.063f, +-74.2188f,20.1572f,-164.063f, +-70.3125f,22.741f,-164.063f, +-66.4063f,24.5911f,-164.063f, +-62.5f,26.3846f,-164.063f, +-58.5938f,26.7315f,-164.063f, +-54.6875f,27.0842f,-164.063f, +-50.7813f,28.7654f,-164.063f, +-46.875f,28.7233f,-164.063f, +-42.9688f,29.2872f,-164.063f, +-39.0625f,29.4838f,-164.063f, +-35.1563f,32.7848f,-164.063f, +-31.25f,34.771f,-164.063f, +-27.3438f,36.568f,-164.063f, +-23.4375f,37.5518f,-164.063f, +-19.5313f,38.4106f,-164.063f, +-15.625f,39.2979f,-164.063f, +-11.7188f,39.3573f,-164.063f, +-7.8125f,40.0034f,-164.063f, +-3.90625f,39.5971f,-164.063f, +0.0f,38.8676f,-164.063f, +3.90625f,38.8633f,-164.063f, +-250.0f,25.2893f,-167.969f, +-246.094f,25.108f,-167.969f, +-242.188f,25.5028f,-167.969f, +-238.281f,26.6095f,-167.969f, +-234.375f,28.3221f,-167.969f, +-230.469f,28.5453f,-167.969f, +-226.563f,28.2595f,-167.969f, +-222.656f,26.8423f,-167.969f, +-218.75f,25.0092f,-167.969f, +-214.844f,24.2925f,-167.969f, +-210.938f,23.8404f,-167.969f, +-207.031f,22.7515f,-167.969f, +-203.125f,22.5332f,-167.969f, +-199.219f,20.3284f,-167.969f, +-195.313f,18.8238f,-167.969f, +-191.406f,17.0096f,-167.969f, +-187.5f,14.7741f,-167.969f, +-183.594f,12.4233f,-167.969f, +-179.688f,9.35872f,-167.969f, +-175.781f,6.39156f,-167.969f, +-171.875f,4.97533f,-167.969f, +-167.969f,4.85484f,-167.969f, +-164.063f,5.54727f,-167.969f, +-160.156f,5.08595f,-167.969f, +-156.25f,3.82379f,-167.969f, +-152.344f,3.95751f,-167.969f, +-148.438f,4.60866f,-167.969f, +-144.531f,3.48771f,-167.969f, +-140.625f,3.26748f,-167.969f, +-136.719f,1.87672f,-167.969f, +-132.813f,2.70232f,-167.969f, +-128.906f,4.51339f,-167.969f, +-125.0f,6.0309f,-167.969f, +-121.094f,7.41076f,-167.969f, +-117.188f,7.44121f,-167.969f, +-113.281f,7.50774f,-167.969f, +-109.375f,6.89121f,-167.969f, +-105.469f,8.13035f,-167.969f, +-101.563f,11.7503f,-167.969f, +-97.6563f,14.1358f,-167.969f, +-93.75f,15.4553f,-167.969f, +-89.8438f,16.6233f,-167.969f, +-85.9375f,16.9002f,-167.969f, +-82.0313f,18.4951f,-167.969f, +-78.125f,19.0947f,-167.969f, +-74.2188f,20.0506f,-167.969f, +-70.3125f,20.9426f,-167.969f, +-66.4063f,22.9738f,-167.969f, +-62.5f,24.6229f,-167.969f, +-58.5938f,26.446f,-167.969f, +-54.6875f,26.6448f,-167.969f, +-50.7813f,26.7349f,-167.969f, +-46.875f,28.1266f,-167.969f, +-42.9688f,29.6034f,-167.969f, +-39.0625f,30.3572f,-167.969f, +-35.1563f,31.5467f,-167.969f, +-31.25f,33.6878f,-167.969f, +-27.3438f,35.587f,-167.969f, +-23.4375f,36.0939f,-167.969f, +-19.5313f,37.5008f,-167.969f, +-15.625f,38.2137f,-167.969f, +-11.7188f,38.0843f,-167.969f, +-7.8125f,38.5726f,-167.969f, +-3.90625f,38.3565f,-167.969f, +0.0f,37.8848f,-167.969f, +3.90625f,37.2199f,-167.969f, +-250.0f,24.1398f,-171.875f, +-246.094f,23.8227f,-171.875f, +-242.188f,24.7818f,-171.875f, +-238.281f,26.1053f,-171.875f, +-234.375f,26.9542f,-171.875f, +-230.469f,26.4956f,-171.875f, +-226.563f,25.4866f,-171.875f, +-222.656f,24.7397f,-171.875f, +-218.75f,23.4337f,-171.875f, +-214.844f,23.2342f,-171.875f, +-210.938f,22.1055f,-171.875f, +-207.031f,20.7279f,-171.875f, +-203.125f,20.7273f,-171.875f, +-199.219f,19.1302f,-171.875f, +-195.313f,16.3679f,-171.875f, +-191.406f,14.4548f,-171.875f, +-187.5f,12.5085f,-171.875f, +-183.594f,10.0081f,-171.875f, +-179.688f,7.8572f,-171.875f, +-175.781f,4.38151f,-171.875f, +-171.875f,3.2342f,-171.875f, +-167.969f,3.37553f,-171.875f, +-164.063f,3.90509f,-171.875f, +-160.156f,3.26335f,-171.875f, +-156.25f,2.88438f,-171.875f, +-152.344f,4.22045f,-171.875f, +-148.438f,3.83297f,-171.875f, +-144.531f,2.98648f,-171.875f, +-140.625f,2.83916f,-171.875f, +-136.719f,1.97368f,-171.875f, +-132.813f,1.85909f,-171.875f, +-128.906f,3.2051f,-171.875f, +-125.0f,5.12684f,-171.875f, +-121.094f,5.86909f,-171.875f, +-117.188f,6.45429f,-171.875f, +-113.281f,6.28889f,-171.875f, +-109.375f,7.53536f,-171.875f, +-105.469f,9.44844f,-171.875f, +-101.563f,11.4162f,-171.875f, +-97.6563f,13.7412f,-171.875f, +-93.75f,14.8315f,-171.875f, +-89.8438f,15.4968f,-171.875f, +-85.9375f,16.3468f,-171.875f, +-82.0313f,18.2605f,-171.875f, +-78.125f,18.0829f,-171.875f, +-74.2188f,18.1489f,-171.875f, +-70.3125f,20.6678f,-171.875f, +-66.4063f,23.1234f,-171.875f, +-62.5f,24.4247f,-171.875f, +-58.5938f,26.5223f,-171.875f, +-54.6875f,26.4286f,-171.875f, +-50.7813f,26.7163f,-171.875f, +-46.875f,28.0436f,-171.875f, +-42.9688f,29.6821f,-171.875f, +-39.0625f,30.721f,-171.875f, +-35.1563f,31.1869f,-171.875f, +-31.25f,32.2507f,-171.875f, +-27.3438f,33.3898f,-171.875f, +-23.4375f,33.9008f,-171.875f, +-19.5313f,34.8028f,-171.875f, +-15.625f,35.7178f,-171.875f, +-11.7188f,35.7796f,-171.875f, +-7.8125f,35.6384f,-171.875f, +-3.90625f,35.5122f,-171.875f, +0.0f,35.5973f,-171.875f, +3.90625f,35.3898f,-171.875f, +-250.0f,23.4472f,-175.781f, +-246.094f,24.0295f,-175.781f, +-242.188f,25.0451f,-175.781f, +-238.281f,25.8985f,-175.781f, +-234.375f,26.561f,-175.781f, +-230.469f,25.8342f,-175.781f, +-226.563f,24.8466f,-175.781f, +-222.656f,24.9204f,-175.781f, +-218.75f,23.1933f,-175.781f, +-214.844f,22.3916f,-175.781f, +-210.938f,20.9595f,-175.781f, +-207.031f,19.4013f,-175.781f, +-203.125f,18.3359f,-175.781f, +-199.219f,16.2135f,-175.781f, +-195.313f,14.3022f,-175.781f, +-191.406f,12.4792f,-175.781f, +-187.5f,10.1621f,-175.781f, +-183.594f,7.8368f,-175.781f, +-179.688f,5.59407f,-175.781f, +-175.781f,3.47332f,-175.781f, +-171.875f,2.4167f,-175.781f, +-167.969f,2.13794f,-175.781f, +-164.063f,2.36632f,-175.781f, +-160.156f,2.44955f,-175.781f, +-156.25f,2.40042f,-175.781f, +-152.344f,3.0142f,-175.781f, +-148.438f,2.58304f,-175.781f, +-144.531f,3.06221f,-175.781f, +-140.625f,2.8937f,-175.781f, +-136.719f,2.59115f,-175.781f, +-132.813f,2.27806f,-175.781f, +-128.906f,3.67695f,-175.781f, +-125.0f,5.23254f,-175.781f, +-121.094f,6.12339f,-175.781f, +-117.188f,6.24689f,-175.781f, +-113.281f,6.79282f,-175.781f, +-109.375f,7.83542f,-175.781f, +-105.469f,9.33972f,-175.781f, +-101.563f,11.2701f,-175.781f, +-97.6563f,13.0689f,-175.781f, +-93.75f,13.927f,-175.781f, +-89.8438f,14.9788f,-175.781f, +-85.9375f,15.6647f,-175.781f, +-82.0313f,16.3833f,-175.781f, +-78.125f,16.1061f,-175.781f, +-74.2188f,17.7393f,-175.781f, +-70.3125f,19.8808f,-175.781f, +-66.4063f,22.2751f,-175.781f, +-62.5f,23.8491f,-175.781f, +-58.5938f,25.3344f,-175.781f, +-54.6875f,26.6818f,-175.781f, +-50.7813f,27.9151f,-175.781f, +-46.875f,28.5054f,-175.781f, +-42.9688f,29.7057f,-175.781f, +-39.0625f,30.623f,-175.781f, +-35.1563f,31.5341f,-175.781f, +-31.25f,31.663f,-175.781f, +-27.3438f,31.1886f,-175.781f, +-23.4375f,31.5377f,-175.781f, +-19.5313f,31.9508f,-175.781f, +-15.625f,32.9549f,-175.781f, +-11.7188f,33.7731f,-175.781f, +-7.8125f,33.8023f,-175.781f, +-3.90625f,34.5283f,-175.781f, +0.0f,34.7929f,-175.781f, +3.90625f,34.823f,-175.781f, +-250.0f,22.2698f,-179.688f, +-246.094f,23.7669f,-179.688f, +-242.188f,24.59f,-179.688f, +-238.281f,26.1637f,-179.688f, +-234.375f,25.5266f,-179.688f, +-230.469f,24.4911f,-179.688f, +-226.563f,24.894f,-179.688f, +-222.656f,23.7469f,-179.688f, +-218.75f,22.9663f,-179.688f, +-214.844f,20.6574f,-179.688f, +-210.938f,19.2502f,-179.688f, +-207.031f,17.3967f,-179.688f, +-203.125f,15.9684f,-179.688f, +-199.219f,13.2948f,-179.688f, +-195.313f,11.9318f,-179.688f, +-191.406f,9.64213f,-179.688f, +-187.5f,7.9435f,-179.688f, +-183.594f,6.1917f,-179.688f, +-179.688f,4.0394f,-179.688f, +-175.781f,1.9267f,-179.688f, +-171.875f,1.73477f,-179.688f, +-167.969f,0.994442f,-179.688f, +-164.063f,0.99617f,-179.688f, +-160.156f,1.00048f,-179.688f, +-156.25f,1.54446f,-179.688f, +-152.344f,0.849521f,-179.688f, +-148.438f,1.3046f,-179.688f, +-144.531f,1.38519f,-179.688f, +-140.625f,0.916628f,-179.688f, +-136.719f,1.39685f,-179.688f, +-132.813f,2.17945f,-179.688f, +-128.906f,4.01973f,-179.688f, +-125.0f,5.72989f,-179.688f, +-121.094f,7.24268f,-179.688f, +-117.188f,7.06199f,-179.688f, +-113.281f,7.91292f,-179.688f, +-109.375f,7.8138f,-179.688f, +-105.469f,10.102f,-179.688f, +-101.563f,11.8106f,-179.688f, +-97.6563f,12.9642f,-179.688f, +-93.75f,13.5879f,-179.688f, +-89.8438f,13.4552f,-179.688f, +-85.9375f,14.1844f,-179.688f, +-82.0313f,14.3802f,-179.688f, +-78.125f,15.3847f,-179.688f, +-74.2188f,17.2288f,-179.688f, +-70.3125f,18.9285f,-179.688f, +-66.4063f,20.0035f,-179.688f, +-62.5f,22.2672f,-179.688f, +-58.5938f,25.1262f,-179.688f, +-54.6875f,27.2745f,-179.688f, +-50.7813f,28.2648f,-179.688f, +-46.875f,29.3825f,-179.688f, +-42.9688f,30.2137f,-179.688f, +-39.0625f,31.3826f,-179.688f, +-35.1563f,31.25f,-179.688f, +-31.25f,31.0392f,-179.688f, +-27.3438f,30.3369f,-179.688f, +-23.4375f,30.5503f,-179.688f, +-19.5313f,30.9715f,-179.688f, +-15.625f,31.8287f,-179.688f, +-11.7188f,32.1393f,-179.688f, +-7.8125f,32.0725f,-179.688f, +-3.90625f,32.6574f,-179.688f, +0.0f,32.8889f,-179.688f, +3.90625f,32.9461f,-179.688f, +-250.0f,22.3874f,-183.594f, +-246.094f,22.8072f,-183.594f, +-242.188f,23.1353f,-183.594f, +-238.281f,24.0949f,-183.594f, +-234.375f,24.0026f,-183.594f, +-230.469f,23.458f,-183.594f, +-226.563f,23.872f,-183.594f, +-222.656f,22.969f,-183.594f, +-218.75f,21.8375f,-183.594f, +-214.844f,19.9316f,-183.594f, +-210.938f,16.812f,-183.594f, +-207.031f,15.1789f,-183.594f, +-203.125f,13.7876f,-183.594f, +-199.219f,11.6818f,-183.594f, +-195.313f,9.75291f,-183.594f, +-191.406f,7.08878f,-183.594f, +-187.5f,6.43001f,-183.594f, +-183.594f,5.15238f,-183.594f, +-179.688f,3.77653f,-183.594f, +-175.781f,3.01737f,-183.594f, +-171.875f,1.46355f,-183.594f, +-167.969f,0.767798f,-183.594f, +-164.063f,1.98474f,-183.594f, +-160.156f,1.09473f,-183.594f, +-156.25f,1.29857f,-183.594f, +-152.344f,-0.203491f,-183.594f, +-148.438f,-0.506199f,-183.594f, +-144.531f,-0.678603f,-183.594f, +-140.625f,0.165814f,-183.594f, +-136.719f,1.44759f,-183.594f, +-132.813f,1.43337f,-183.594f, +-128.906f,3.23614f,-183.594f, +-125.0f,4.8541f,-183.594f, +-121.094f,6.64038f,-183.594f, +-117.188f,7.96432f,-183.594f, +-113.281f,8.52594f,-183.594f, +-109.375f,7.78399f,-183.594f, +-105.469f,9.45422f,-183.594f, +-101.563f,11.3198f,-183.594f, +-97.6563f,12.2369f,-183.594f, +-93.75f,12.7733f,-183.594f, +-89.8438f,12.9184f,-183.594f, +-85.9375f,12.958f,-183.594f, +-82.0313f,13.3326f,-183.594f, +-78.125f,14.3984f,-183.594f, +-74.2188f,16.2737f,-183.594f, +-70.3125f,17.9981f,-183.594f, +-66.4063f,19.5314f,-183.594f, +-62.5f,21.4039f,-183.594f, +-58.5938f,24.8945f,-183.594f, +-54.6875f,26.9904f,-183.594f, +-50.7813f,28.6222f,-183.594f, +-46.875f,30.2128f,-183.594f, +-42.9688f,30.5142f,-183.594f, +-39.0625f,30.7026f,-183.594f, +-35.1563f,30.6413f,-183.594f, +-31.25f,29.7659f,-183.594f, +-27.3438f,30.2613f,-183.594f, +-23.4375f,31.0694f,-183.594f, +-19.5313f,31.0437f,-183.594f, +-15.625f,30.9824f,-183.594f, +-11.7188f,30.4648f,-183.594f, +-7.8125f,30.0916f,-183.594f, +-3.90625f,30.0801f,-183.594f, +0.0f,29.9992f,-183.594f, +3.90625f,30.0027f,-183.594f, +-250.0f,22.2829f,-187.5f, +-246.094f,23.1567f,-187.5f, +-242.188f,23.2229f,-187.5f, +-238.281f,23.6644f,-187.5f, +-234.375f,23.5148f,-187.5f, +-230.469f,22.8756f,-187.5f, +-226.563f,22.2471f,-187.5f, +-222.656f,21.4292f,-187.5f, +-218.75f,20.4108f,-187.5f, +-214.844f,18.2601f,-187.5f, +-210.938f,16.3575f,-187.5f, +-207.031f,13.0762f,-187.5f, +-203.125f,11.5916f,-187.5f, +-199.219f,9.81885f,-187.5f, +-195.313f,8.57193f,-187.5f, +-191.406f,5.93865f,-187.5f, +-187.5f,5.15801f,-187.5f, +-183.594f,3.89597f,-187.5f, +-179.688f,4.52236f,-187.5f, +-175.781f,4.21162f,-187.5f, +-171.875f,2.62521f,-187.5f, +-167.969f,1.85733f,-187.5f, +-164.063f,2.14119f,-187.5f, +-160.156f,2.60992f,-187.5f, +-156.25f,1.99742f,-187.5f, +-152.344f,0.836315f,-187.5f, +-148.438f,-0.122141f,-187.5f, +-144.531f,-1.21041f,-187.5f, +-140.625f,0.620409f,-187.5f, +-136.719f,2.20372f,-187.5f, +-132.813f,2.55457f,-187.5f, +-128.906f,3.09944f,-187.5f, +-125.0f,4.76219f,-187.5f, +-121.094f,6.5939f,-187.5f, +-117.188f,7.40657f,-187.5f, +-113.281f,8.17096f,-187.5f, +-109.375f,8.8965f,-187.5f, +-105.469f,9.54116f,-187.5f, +-101.563f,10.8183f,-187.5f, +-97.6563f,12.2345f,-187.5f, +-93.75f,11.945f,-187.5f, +-89.8438f,12.3063f,-187.5f, +-85.9375f,12.7736f,-187.5f, +-82.0313f,13.2581f,-187.5f, +-78.125f,14.2241f,-187.5f, +-74.2188f,15.1957f,-187.5f, +-70.3125f,17.7241f,-187.5f, +-66.4063f,21.0931f,-187.5f, +-62.5f,23.7741f,-187.5f, +-58.5938f,24.8775f,-187.5f, +-54.6875f,26.5924f,-187.5f, +-50.7813f,28.0699f,-187.5f, +-46.875f,30.1552f,-187.5f, +-42.9688f,30.8508f,-187.5f, +-39.0625f,30.7935f,-187.5f, +-35.1563f,30.3224f,-187.5f, +-31.25f,28.8455f,-187.5f, +-27.3438f,30.2059f,-187.5f, +-23.4375f,31.5456f,-187.5f, +-19.5313f,31.0657f,-187.5f, +-15.625f,30.5686f,-187.5f, +-11.7188f,29.9754f,-187.5f, +-7.8125f,28.7754f,-187.5f, +-3.90625f,28.2457f,-187.5f, +0.0f,27.4045f,-187.5f, +3.90625f,27.6405f,-187.5f, +-250.0f,21.5096f,-191.406f, +-246.094f,22.1931f,-191.406f, +-242.188f,22.416f,-191.406f, +-238.281f,22.619f,-191.406f, +-234.375f,22.9242f,-191.406f, +-230.469f,22.6042f,-191.406f, +-226.563f,21.5344f,-191.406f, +-222.656f,20.226f,-191.406f, +-218.75f,19.6198f,-191.406f, +-214.844f,18.0849f,-191.406f, +-210.938f,15.9896f,-191.406f, +-207.031f,12.7402f,-191.406f, +-203.125f,9.98899f,-191.406f, +-199.219f,7.38602f,-191.406f, +-195.313f,6.23078f,-191.406f, +-191.406f,4.8714f,-191.406f, +-187.5f,4.87792f,-191.406f, +-183.594f,4.53381f,-191.406f, +-179.688f,5.23517f,-191.406f, +-175.781f,4.22349f,-191.406f, +-171.875f,3.46214f,-191.406f, +-167.969f,3.62202f,-191.406f, +-164.063f,3.07142f,-191.406f, +-160.156f,3.69893f,-191.406f, +-156.25f,4.20827f,-191.406f, +-152.344f,2.23654f,-191.406f, +-148.438f,0.582121f,-191.406f, +-144.531f,0.44941f,-191.406f, +-140.625f,2.42446f,-191.406f, +-136.719f,3.54807f,-191.406f, +-132.813f,3.58143f,-191.406f, +-128.906f,4.42162f,-191.406f, +-125.0f,5.24153f,-191.406f, +-121.094f,6.55792f,-191.406f, +-117.188f,6.93471f,-191.406f, +-113.281f,7.73309f,-191.406f, +-109.375f,8.04468f,-191.406f, +-105.469f,9.15528f,-191.406f, +-101.563f,10.9583f,-191.406f, +-97.6563f,12.1897f,-191.406f, +-93.75f,11.6481f,-191.406f, +-89.8438f,11.6514f,-191.406f, +-85.9375f,12.4326f,-191.406f, +-82.0313f,13.3808f,-191.406f, +-78.125f,14.386f,-191.406f, +-74.2188f,16.182f,-191.406f, +-70.3125f,18.9931f,-191.406f, +-66.4063f,22.8308f,-191.406f, +-62.5f,25.3868f,-191.406f, +-58.5938f,26.1484f,-191.406f, +-54.6875f,25.6258f,-191.406f, +-50.7813f,26.9464f,-191.406f, +-46.875f,29.0075f,-191.406f, +-42.9688f,29.8523f,-191.406f, +-39.0625f,30.1236f,-191.406f, +-35.1563f,29.7557f,-191.406f, +-31.25f,28.4913f,-191.406f, +-27.3438f,29.5389f,-191.406f, +-23.4375f,30.4685f,-191.406f, +-19.5313f,30.3743f,-191.406f, +-15.625f,30.3762f,-191.406f, +-11.7188f,29.0099f,-191.406f, +-7.8125f,28.1952f,-191.406f, +-3.90625f,26.135f,-191.406f, +0.0f,25.2418f,-191.406f, +3.90625f,25.3652f,-191.406f, +-250.0f,20.78f,-195.313f, +-246.094f,20.8279f,-195.313f, +-242.188f,21.2199f,-195.313f, +-238.281f,22.0652f,-195.313f, +-234.375f,22.2095f,-195.313f, +-230.469f,22.1372f,-195.313f, +-226.563f,21.0165f,-195.313f, +-222.656f,19.4174f,-195.313f, +-218.75f,17.7927f,-195.313f, +-214.844f,16.6172f,-195.313f, +-210.938f,14.7065f,-195.313f, +-207.031f,11.8095f,-195.313f, +-203.125f,9.63824f,-195.313f, +-199.219f,6.4991f,-195.313f, +-195.313f,6.23707f,-195.313f, +-191.406f,6.60374f,-195.313f, +-187.5f,6.22557f,-195.313f, +-183.594f,5.47951f,-195.313f, +-179.688f,5.16851f,-195.313f, +-175.781f,4.83538f,-195.313f, +-171.875f,4.16992f,-195.313f, +-167.969f,5.40533f,-195.313f, +-164.063f,5.01562f,-195.313f, +-160.156f,4.58978f,-195.313f, +-156.25f,4.73252f,-195.313f, +-152.344f,3.14586f,-195.313f, +-148.438f,1.16894f,-195.313f, +-144.531f,2.4916f,-195.313f, +-140.625f,3.98933f,-195.313f, +-136.719f,5.16861f,-195.313f, +-132.813f,5.68931f,-195.313f, +-128.906f,5.45815f,-195.313f, +-125.0f,5.15506f,-195.313f, +-121.094f,6.46153f,-195.313f, +-117.188f,7.36577f,-195.313f, +-113.281f,8.13491f,-195.313f, +-109.375f,7.50896f,-195.313f, +-105.469f,8.93662f,-195.313f, +-101.563f,10.6513f,-195.313f, +-97.6563f,10.6255f,-195.313f, +-93.75f,10.5332f,-195.313f, +-89.8438f,11.5758f,-195.313f, +-85.9375f,11.568f,-195.313f, +-82.0313f,14.2419f,-195.313f, +-78.125f,16.1272f,-195.313f, +-74.2188f,17.0994f,-195.313f, +-70.3125f,20.4651f,-195.313f, +-66.4063f,23.534f,-195.313f, +-62.5f,25.1181f,-195.313f, +-58.5938f,25.9427f,-195.313f, +-54.6875f,25.5166f,-195.313f, +-50.7813f,25.1027f,-195.313f, +-46.875f,27.2281f,-195.313f, +-42.9688f,28.7319f,-195.313f, +-39.0625f,28.8984f,-195.313f, +-35.1563f,28.3307f,-195.313f, +-31.25f,27.4754f,-195.313f, +-27.3438f,27.8763f,-195.313f, +-23.4375f,28.1023f,-195.313f, +-19.5313f,28.9815f,-195.313f, +-15.625f,28.5849f,-195.313f, +-11.7188f,27.2687f,-195.313f, +-7.8125f,26.8112f,-195.313f, +-3.90625f,25.3636f,-195.313f, +0.0f,23.2134f,-195.313f, +3.90625f,23.0993f,-195.313f, +-250.0f,20.2026f,-199.219f, +-246.094f,19.5895f,-199.219f, +-242.188f,20.3489f,-199.219f, +-238.281f,21.0293f,-199.219f, +-234.375f,21.5343f,-199.219f, +-230.469f,20.6859f,-199.219f, +-226.563f,19.9279f,-199.219f, +-222.656f,18.7217f,-199.219f, +-218.75f,17.4818f,-199.219f, +-214.844f,15.0438f,-199.219f, +-210.938f,13.4082f,-199.219f, +-207.031f,10.7188f,-199.219f, +-203.125f,8.32176f,-199.219f, +-199.219f,7.30407f,-199.219f, +-195.313f,7.02569f,-199.219f, +-191.406f,7.38826f,-199.219f, +-187.5f,6.94954f,-199.219f, +-183.594f,6.62067f,-199.219f, +-179.688f,6.55308f,-199.219f, +-175.781f,6.3403f,-199.219f, +-171.875f,5.0001f,-199.219f, +-167.969f,6.51564f,-199.219f, +-164.063f,6.69774f,-199.219f, +-160.156f,5.67189f,-199.219f, +-156.25f,4.8973f,-199.219f, +-152.344f,3.43798f,-199.219f, +-148.438f,2.08531f,-199.219f, +-144.531f,3.86643f,-199.219f, +-140.625f,6.0862f,-199.219f, +-136.719f,6.99995f,-199.219f, +-132.813f,8.32808f,-199.219f, +-128.906f,8.55809f,-199.219f, +-125.0f,8.26904f,-199.219f, +-121.094f,8.63733f,-199.219f, +-117.188f,9.11106f,-199.219f, +-113.281f,9.73154f,-199.219f, +-109.375f,9.14108f,-199.219f, +-105.469f,9.3525f,-199.219f, +-101.563f,9.56281f,-199.219f, +-97.6563f,9.74866f,-199.219f, +-93.75f,10.9852f,-199.219f, +-89.8438f,12.3926f,-199.219f, +-85.9375f,13.6407f,-199.219f, +-82.0313f,15.9886f,-199.219f, +-78.125f,17.7913f,-199.219f, +-74.2188f,18.8352f,-199.219f, +-70.3125f,20.2718f,-199.219f, +-66.4063f,23.501f,-199.219f, +-62.5f,24.6073f,-199.219f, +-58.5938f,25.3028f,-199.219f, +-54.6875f,25.2244f,-199.219f, +-50.7813f,23.9922f,-199.219f, +-46.875f,24.6425f,-199.219f, +-42.9688f,26.6199f,-199.219f, +-39.0625f,27.5474f,-199.219f, +-35.1563f,27.4672f,-199.219f, +-31.25f,27.2906f,-199.219f, +-27.3438f,26.489f,-199.219f, +-23.4375f,26.3554f,-199.219f, +-19.5313f,26.1787f,-199.219f, +-15.625f,26.2538f,-199.219f, +-11.7188f,25.7694f,-199.219f, +-7.8125f,25.2691f,-199.219f, +-3.90625f,23.3867f,-199.219f, +0.0f,22.5717f,-199.219f, +3.90625f,21.5827f,-199.219f, +-250.0f,19.3526f,-203.125f, +-246.094f,19.2964f,-203.125f, +-242.188f,19.226f,-203.125f, +-238.281f,19.4274f,-203.125f, +-234.375f,19.4317f,-203.125f, +-230.469f,19.3079f,-203.125f, +-226.563f,18.212f,-203.125f, +-222.656f,17.8371f,-203.125f, +-218.75f,16.8642f,-203.125f, +-214.844f,14.8539f,-203.125f, +-210.938f,12.425f,-203.125f, +-207.031f,10.0369f,-203.125f, +-203.125f,9.00151f,-203.125f, +-199.219f,8.61334f,-203.125f, +-195.313f,8.09586f,-203.125f, +-191.406f,8.18143f,-203.125f, +-187.5f,7.75345f,-203.125f, +-183.594f,7.72772f,-203.125f, +-179.688f,7.71649f,-203.125f, +-175.781f,7.72935f,-203.125f, +-171.875f,6.70116f,-203.125f, +-167.969f,6.58828f,-203.125f, +-164.063f,6.47975f,-203.125f, +-160.156f,5.96451f,-203.125f, +-156.25f,5.85253f,-203.125f, +-152.344f,5.14982f,-203.125f, +-148.438f,4.60646f,-203.125f, +-144.531f,6.3659f,-203.125f, +-140.625f,7.66587f,-203.125f, +-136.719f,8.68095f,-203.125f, +-132.813f,9.86922f,-203.125f, +-128.906f,9.93481f,-203.125f, +-125.0f,10.9585f,-203.125f, +-121.094f,10.9271f,-203.125f, +-117.188f,11.4348f,-203.125f, +-113.281f,11.0548f,-203.125f, +-109.375f,11.2501f,-203.125f, +-105.469f,11.7673f,-203.125f, +-101.563f,10.8899f,-203.125f, +-97.6563f,11.3791f,-203.125f, +-93.75f,12.168f,-203.125f, +-89.8438f,12.7667f,-203.125f, +-85.9375f,15.2415f,-203.125f, +-82.0313f,17.9783f,-203.125f, +-78.125f,19.6193f,-203.125f, +-74.2188f,19.6343f,-203.125f, +-70.3125f,19.7814f,-203.125f, +-66.4063f,21.45f,-203.125f, +-62.5f,24.1224f,-203.125f, +-58.5938f,24.9145f,-203.125f, +-54.6875f,24.2614f,-203.125f, +-50.7813f,24.025f,-203.125f, +-46.875f,23.1092f,-203.125f, +-42.9688f,24.0294f,-203.125f, +-39.0625f,25.4744f,-203.125f, +-35.1563f,25.9477f,-203.125f, +-31.25f,25.5895f,-203.125f, +-27.3438f,25.0752f,-203.125f, +-23.4375f,24.6537f,-203.125f, +-19.5313f,25.0025f,-203.125f, +-15.625f,25.211f,-203.125f, +-11.7188f,24.2103f,-203.125f, +-7.8125f,23.1363f,-203.125f, +-3.90625f,21.4314f,-203.125f, +0.0f,20.8784f,-203.125f, +3.90625f,20.3179f,-203.125f, +-250.0f,18.4857f,-207.031f, +-246.094f,18.9103f,-207.031f, +-242.188f,17.7666f,-207.031f, +-238.281f,18.3803f,-207.031f, +-234.375f,17.7746f,-207.031f, +-230.469f,18.1956f,-207.031f, +-226.563f,17.4596f,-207.031f, +-222.656f,16.5346f,-207.031f, +-218.75f,15.3933f,-207.031f, +-214.844f,14.0342f,-207.031f, +-210.938f,11.5492f,-207.031f, +-207.031f,10.8526f,-207.031f, +-203.125f,10.5164f,-207.031f, +-199.219f,10.4957f,-207.031f, +-195.313f,9.57889f,-207.031f, +-191.406f,9.42031f,-207.031f, +-187.5f,9.08544f,-207.031f, +-183.594f,8.10082f,-207.031f, +-179.688f,8.5632f,-207.031f, +-175.781f,8.74392f,-207.031f, +-171.875f,8.56175f,-207.031f, +-167.969f,7.13665f,-207.031f, +-164.063f,6.99003f,-207.031f, +-160.156f,7.1192f,-207.031f, +-156.25f,6.173f,-207.031f, +-152.344f,6.44193f,-207.031f, +-148.438f,7.15583f,-207.031f, +-144.531f,7.74526f,-207.031f, +-140.625f,9.38846f,-207.031f, +-136.719f,10.1943f,-207.031f, +-132.813f,10.5195f,-207.031f, +-128.906f,11.4457f,-207.031f, +-125.0f,12.4233f,-207.031f, +-121.094f,12.8633f,-207.031f, +-117.188f,13.4045f,-207.031f, +-113.281f,12.9134f,-207.031f, +-109.375f,12.9203f,-207.031f, +-105.469f,13.2173f,-207.031f, +-101.563f,12.9065f,-207.031f, +-97.6563f,12.9327f,-207.031f, +-93.75f,13.5926f,-207.031f, +-89.8438f,14.5472f,-207.031f, +-85.9375f,16.41f,-207.031f, +-82.0313f,19.1484f,-207.031f, +-78.125f,20.5688f,-207.031f, +-74.2188f,20.1464f,-207.031f, +-70.3125f,19.9352f,-207.031f, +-66.4063f,20.4543f,-207.031f, +-62.5f,22.0083f,-207.031f, +-58.5938f,23.2866f,-207.031f, +-54.6875f,23.3242f,-207.031f, +-50.7813f,23.0127f,-207.031f, +-46.875f,23.4455f,-207.031f, +-42.9688f,23.4808f,-207.031f, +-39.0625f,24.4622f,-207.031f, +-35.1563f,25.1122f,-207.031f, +-31.25f,25.3818f,-207.031f, +-27.3438f,24.0051f,-207.031f, +-23.4375f,22.3971f,-207.031f, +-19.5313f,23.4811f,-207.031f, +-15.625f,23.8447f,-207.031f, +-11.7188f,22.3912f,-207.031f, +-7.8125f,21.7286f,-207.031f, +-3.90625f,20.1632f,-207.031f, +0.0f,18.6587f,-207.031f, +3.90625f,18.3149f,-207.031f, +-250.0f,17.6517f,-210.938f, +-246.094f,17.8132f,-210.938f, +-242.188f,17.4894f,-210.938f, +-238.281f,16.7087f,-210.938f, +-234.375f,15.9111f,-210.938f, +-230.469f,16.6733f,-210.938f, +-226.563f,16.6911f,-210.938f, +-222.656f,14.6177f,-210.938f, +-218.75f,13.6959f,-210.938f, +-214.844f,12.227f,-210.938f, +-210.938f,11.5376f,-210.938f, +-207.031f,11.7259f,-210.938f, +-203.125f,11.4804f,-210.938f, +-199.219f,11.8728f,-210.938f, +-195.313f,11.7357f,-210.938f, +-191.406f,10.6319f,-210.938f, +-187.5f,10.7016f,-210.938f, +-183.594f,9.53811f,-210.938f, +-179.688f,9.65149f,-210.938f, +-175.781f,9.45993f,-210.938f, +-171.875f,9.4427f,-210.938f, +-167.969f,8.02525f,-210.938f, +-164.063f,6.71089f,-210.938f, +-160.156f,7.22567f,-210.938f, +-156.25f,7.52391f,-210.938f, +-152.344f,8.46765f,-210.938f, +-148.438f,8.60801f,-210.938f, +-144.531f,9.89046f,-210.938f, +-140.625f,10.9163f,-210.938f, +-136.719f,11.445f,-210.938f, +-132.813f,12.6949f,-210.938f, +-128.906f,13.3645f,-210.938f, +-125.0f,14.5389f,-210.938f, +-121.094f,14.7689f,-210.938f, +-117.188f,15.8285f,-210.938f, +-113.281f,15.5058f,-210.938f, +-109.375f,14.3542f,-210.938f, +-105.469f,14.9928f,-210.938f, +-101.563f,14.9601f,-210.938f, +-97.6563f,15.1602f,-210.938f, +-93.75f,15.1589f,-210.938f, +-89.8438f,16.5401f,-210.938f, +-85.9375f,18.2407f,-210.938f, +-82.0313f,19.8006f,-210.938f, +-78.125f,20.9223f,-210.938f, +-74.2188f,20.5615f,-210.938f, +-70.3125f,21.0505f,-210.938f, +-66.4063f,21.024f,-210.938f, +-62.5f,21.7216f,-210.938f, +-58.5938f,22.8737f,-210.938f, +-54.6875f,23.631f,-210.938f, +-50.7813f,23.6265f,-210.938f, +-46.875f,23.5636f,-210.938f, +-42.9688f,24.1299f,-210.938f, +-39.0625f,24.6395f,-210.938f, +-35.1563f,25.3237f,-210.938f, +-31.25f,24.7459f,-210.938f, +-27.3438f,22.2327f,-210.938f, +-23.4375f,21.6309f,-210.938f, +-19.5313f,22.3059f,-210.938f, +-15.625f,22.1894f,-210.938f, +-11.7188f,21.2088f,-210.938f, +-7.8125f,20.3383f,-210.938f, +-3.90625f,18.4799f,-210.938f, +0.0f,17.18f,-210.938f, +3.90625f,16.2147f,-210.938f, +-250.0f,17.6547f,-214.844f, +-246.094f,17.1845f,-214.844f, +-242.188f,17.6913f,-214.844f, +-238.281f,16.8842f,-214.844f, +-234.375f,14.7169f,-214.844f, +-230.469f,15.4287f,-214.844f, +-226.563f,14.5659f,-214.844f, +-222.656f,13.1756f,-214.844f, +-218.75f,12.021f,-214.844f, +-214.844f,11.9663f,-214.844f, +-210.938f,12.535f,-214.844f, +-207.031f,12.5802f,-214.844f, +-203.125f,12.7437f,-214.844f, +-199.219f,12.9859f,-214.844f, +-195.313f,12.7714f,-214.844f, +-191.406f,11.9783f,-214.844f, +-187.5f,11.9282f,-214.844f, +-183.594f,10.7633f,-214.844f, +-179.688f,10.3463f,-214.844f, +-175.781f,10.1867f,-214.844f, +-171.875f,10.378f,-214.844f, +-167.969f,8.81572f,-214.844f, +-164.063f,7.29133f,-214.844f, +-160.156f,8.45242f,-214.844f, +-156.25f,9.77224f,-214.844f, +-152.344f,10.4567f,-214.844f, +-148.438f,11.0484f,-214.844f, +-144.531f,12.1985f,-214.844f, +-140.625f,13.766f,-214.844f, +-136.719f,14.9123f,-214.844f, +-132.813f,15.4577f,-214.844f, +-128.906f,16.3401f,-214.844f, +-125.0f,16.5963f,-214.844f, +-121.094f,16.9605f,-214.844f, +-117.188f,16.548f,-214.844f, +-113.281f,16.701f,-214.844f, +-109.375f,16.6987f,-214.844f, +-105.469f,16.1393f,-214.844f, +-101.563f,15.4379f,-214.844f, +-97.6563f,15.9931f,-214.844f, +-93.75f,16.7962f,-214.844f, +-89.8438f,18.5464f,-214.844f, +-85.9375f,20.2834f,-214.844f, +-82.0313f,20.8463f,-214.844f, +-78.125f,21.263f,-214.844f, +-74.2188f,22.137f,-214.844f, +-70.3125f,22.1614f,-214.844f, +-66.4063f,21.7706f,-214.844f, +-62.5f,23.0496f,-214.844f, +-58.5938f,23.0762f,-214.844f, +-54.6875f,24.2163f,-214.844f, +-50.7813f,23.9415f,-214.844f, +-46.875f,23.115f,-214.844f, +-42.9688f,24.4371f,-214.844f, +-39.0625f,25.7433f,-214.844f, +-35.1563f,24.6385f,-214.844f, +-31.25f,23.2822f,-214.844f, +-27.3438f,21.8583f,-214.844f, +-23.4375f,21.2352f,-214.844f, +-19.5313f,21.3084f,-214.844f, +-15.625f,20.7264f,-214.844f, +-11.7188f,19.67f,-214.844f, +-7.8125f,18.8192f,-214.844f, +-3.90625f,16.6504f,-214.844f, +0.0f,14.8779f,-214.844f, +3.90625f,14.284f,-214.844f, +-250.0f,17.1549f,-218.75f, +-246.094f,16.6295f,-218.75f, +-242.188f,17.7459f,-218.75f, +-238.281f,17.3894f,-218.75f, +-234.375f,15.2738f,-218.75f, +-230.469f,13.3984f,-218.75f, +-226.563f,12.8639f,-218.75f, +-222.656f,12.3225f,-218.75f, +-218.75f,12.1914f,-218.75f, +-214.844f,12.4104f,-218.75f, +-210.938f,12.9278f,-218.75f, +-207.031f,13.387f,-218.75f, +-203.125f,13.4342f,-218.75f, +-199.219f,12.7445f,-218.75f, +-195.313f,12.543f,-218.75f, +-191.406f,12.1437f,-218.75f, +-187.5f,12.3491f,-218.75f, +-183.594f,11.2334f,-218.75f, +-179.688f,11.4016f,-218.75f, +-175.781f,11.2455f,-218.75f, +-171.875f,10.3681f,-218.75f, +-167.969f,9.23056f,-218.75f, +-164.063f,8.35869f,-218.75f, +-160.156f,10.3612f,-218.75f, +-156.25f,11.8429f,-218.75f, +-152.344f,13.2154f,-218.75f, +-148.438f,13.6238f,-218.75f, +-144.531f,14.8343f,-218.75f, +-140.625f,15.5549f,-218.75f, +-136.719f,16.9496f,-218.75f, +-132.813f,17.9187f,-218.75f, +-128.906f,17.7467f,-218.75f, +-125.0f,17.8229f,-218.75f, +-121.094f,17.4408f,-218.75f, +-117.188f,17.3929f,-218.75f, +-113.281f,17.9861f,-218.75f, +-109.375f,18.0206f,-218.75f, +-105.469f,17.6787f,-218.75f, +-101.563f,17.3769f,-218.75f, +-97.6563f,17.5683f,-218.75f, +-93.75f,18.0067f,-218.75f, +-89.8438f,18.9639f,-218.75f, +-85.9375f,20.8377f,-218.75f, +-82.0313f,22.207f,-218.75f, +-78.125f,23.1239f,-218.75f, +-74.2188f,22.384f,-218.75f, +-70.3125f,22.2939f,-218.75f, +-66.4063f,21.8208f,-218.75f, +-62.5f,22.9458f,-218.75f, +-58.5938f,24.2547f,-218.75f, +-54.6875f,24.5855f,-218.75f, +-50.7813f,23.9529f,-218.75f, +-46.875f,22.9226f,-218.75f, +-42.9688f,25.1015f,-218.75f, +-39.0625f,25.1591f,-218.75f, +-35.1563f,23.6146f,-218.75f, +-31.25f,21.7924f,-218.75f, +-27.3438f,20.3147f,-218.75f, +-23.4375f,19.9227f,-218.75f, +-19.5313f,20.3267f,-218.75f, +-15.625f,19.1903f,-218.75f, +-11.7188f,17.3132f,-218.75f, +-7.8125f,16.5145f,-218.75f, +-3.90625f,15.5991f,-218.75f, +0.0f,13.7865f,-218.75f, +3.90625f,13.272f,-218.75f, +-250.0f,16.7536f,-222.656f, +-246.094f,16.7692f,-222.656f, +-242.188f,17.6216f,-222.656f, +-238.281f,17.7524f,-222.656f, +-234.375f,15.7102f,-222.656f, +-230.469f,13.9934f,-222.656f, +-226.563f,13.1311f,-222.656f, +-222.656f,13.6218f,-222.656f, +-218.75f,13.8812f,-222.656f, +-214.844f,13.6928f,-222.656f, +-210.938f,13.2498f,-222.656f, +-207.031f,13.9199f,-222.656f, +-203.125f,14.8224f,-222.656f, +-199.219f,14.7821f,-222.656f, +-195.313f,14.4118f,-222.656f, +-191.406f,13.2421f,-222.656f, +-187.5f,13.1953f,-222.656f, +-183.594f,11.9441f,-222.656f, +-179.688f,11.8006f,-222.656f, +-175.781f,11.2509f,-222.656f, +-171.875f,9.7863f,-222.656f, +-167.969f,8.85086f,-222.656f, +-164.063f,10.6896f,-222.656f, +-160.156f,12.9132f,-222.656f, +-156.25f,13.602f,-222.656f, +-152.344f,15.3711f,-222.656f, +-148.438f,16.1768f,-222.656f, +-144.531f,16.9203f,-222.656f, +-140.625f,17.0404f,-222.656f, +-136.719f,18.4968f,-222.656f, +-132.813f,18.8222f,-222.656f, +-128.906f,19.2736f,-222.656f, +-125.0f,19.1956f,-222.656f, +-121.094f,18.5998f,-222.656f, +-117.188f,18.5054f,-222.656f, +-113.281f,19.68f,-222.656f, +-109.375f,19.5038f,-222.656f, +-105.469f,19.4749f,-222.656f, +-101.563f,18.7504f,-222.656f, +-97.6563f,18.6121f,-222.656f, +-93.75f,19.1119f,-222.656f, +-89.8438f,20.5347f,-222.656f, +-85.9375f,21.4412f,-222.656f, +-82.0313f,22.187f,-222.656f, +-78.125f,22.9384f,-222.656f, +-74.2188f,22.5226f,-222.656f, +-70.3125f,22.7323f,-222.656f, +-66.4063f,23.4931f,-222.656f, +-62.5f,24.6895f,-222.656f, +-58.5938f,24.9745f,-222.656f, +-54.6875f,24.801f,-222.656f, +-50.7813f,23.2235f,-222.656f, +-46.875f,22.4973f,-222.656f, +-42.9688f,23.9826f,-222.656f, +-39.0625f,23.4458f,-222.656f, +-35.1563f,22.66f,-222.656f, +-31.25f,20.8011f,-222.656f, +-27.3438f,18.877f,-222.656f, +-23.4375f,17.9999f,-222.656f, +-19.5313f,18.2206f,-222.656f, +-15.625f,17.8501f,-222.656f, +-11.7188f,16.2125f,-222.656f, +-7.8125f,15.4897f,-222.656f, +-3.90625f,14.2048f,-222.656f, +0.0f,13.1443f,-222.656f, +3.90625f,13.0199f,-222.656f, +-250.0f,15.9959f,-226.563f, +-246.094f,16.3902f,-226.563f, +-242.188f,17.2433f,-226.563f, +-238.281f,16.8903f,-226.563f, +-234.375f,16.2616f,-226.563f, +-230.469f,16.3335f,-226.563f, +-226.563f,15.3662f,-226.563f, +-222.656f,14.6429f,-226.563f, +-218.75f,15.2987f,-226.563f, +-214.844f,15.1249f,-226.563f, +-210.938f,14.6321f,-226.563f, +-207.031f,15.402f,-226.563f, +-203.125f,15.5803f,-226.563f, +-199.219f,15.8024f,-226.563f, +-195.313f,14.9564f,-226.563f, +-191.406f,14.7272f,-226.563f, +-187.5f,14.0749f,-226.563f, +-183.594f,12.2838f,-226.563f, +-179.688f,12.0268f,-226.563f, +-175.781f,10.904f,-226.563f, +-171.875f,10.0049f,-226.563f, +-167.969f,9.85558f,-226.563f, +-164.063f,11.873f,-226.563f, +-160.156f,14.0684f,-226.563f, +-156.25f,15.4765f,-226.563f, +-152.344f,16.7458f,-226.563f, +-148.438f,17.9359f,-226.563f, +-144.531f,18.4507f,-226.563f, +-140.625f,18.3457f,-226.563f, +-136.719f,20.0059f,-226.563f, +-132.813f,20.3125f,-226.563f, +-128.906f,19.751f,-226.563f, +-125.0f,19.8084f,-226.563f, +-121.094f,19.9091f,-226.563f, +-117.188f,20.3401f,-226.563f, +-113.281f,20.8121f,-226.563f, +-109.375f,20.5705f,-226.563f, +-105.469f,20.9909f,-226.563f, +-101.563f,20.4171f,-226.563f, +-97.6563f,19.834f,-226.563f, +-93.75f,19.9289f,-226.563f, +-89.8438f,20.4305f,-226.563f, +-85.9375f,21.4097f,-226.563f, +-82.0313f,21.9666f,-226.563f, +-78.125f,22.5232f,-226.563f, +-74.2188f,22.2049f,-226.563f, +-70.3125f,22.7045f,-226.563f, +-66.4063f,23.7933f,-226.563f, +-62.5f,24.5938f,-226.563f, +-58.5938f,24.6161f,-226.563f, +-54.6875f,23.6008f,-226.563f, +-50.7813f,21.9411f,-226.563f, +-46.875f,21.6164f,-226.563f, +-42.9688f,22.5551f,-226.563f, +-39.0625f,22.5032f,-226.563f, +-35.1563f,21.5165f,-226.563f, +-31.25f,19.8362f,-226.563f, +-27.3438f,17.5967f,-226.563f, +-23.4375f,15.6932f,-226.563f, +-19.5313f,15.7774f,-226.563f, +-15.625f,15.6405f,-226.563f, +-11.7188f,14.7549f,-226.563f, +-7.8125f,14.3205f,-226.563f, +-3.90625f,13.2947f,-226.563f, +0.0f,11.9266f,-226.563f, +3.90625f,11.9733f,-226.563f, +-250.0f,15.2423f,-230.469f, +-246.094f,16.2143f,-230.469f, +-242.188f,17.2462f,-230.469f, +-238.281f,17.7941f,-230.469f, +-234.375f,18.4029f,-230.469f, +-230.469f,18.5726f,-230.469f, +-226.563f,17.4729f,-230.469f, +-222.656f,15.9467f,-230.469f, +-218.75f,15.5021f,-230.469f, +-214.844f,15.7096f,-230.469f, +-210.938f,15.6276f,-230.469f, +-207.031f,15.7025f,-230.469f, +-203.125f,14.8851f,-230.469f, +-199.219f,14.87f,-230.469f, +-195.313f,14.3971f,-230.469f, +-191.406f,14.5771f,-230.469f, +-187.5f,13.8163f,-230.469f, +-183.594f,12.7605f,-230.469f, +-179.688f,12.587f,-230.469f, +-175.781f,11.0727f,-230.469f, +-171.875f,10.0166f,-230.469f, +-167.969f,12.5787f,-230.469f, +-164.063f,13.3613f,-230.469f, +-160.156f,14.7537f,-230.469f, +-156.25f,15.9879f,-230.469f, +-152.344f,17.6792f,-230.469f, +-148.438f,18.5224f,-230.469f, +-144.531f,18.5026f,-230.469f, +-140.625f,19.4852f,-230.469f, +-136.719f,20.3222f,-230.469f, +-132.813f,20.2809f,-230.469f, +-128.906f,21.0408f,-230.469f, +-125.0f,20.4729f,-230.469f, +-121.094f,20.8829f,-230.469f, +-117.188f,21.532f,-230.469f, +-113.281f,21.3373f,-230.469f, +-109.375f,22.0014f,-230.469f, +-105.469f,22.1484f,-230.469f, +-101.563f,21.7053f,-230.469f, +-97.6563f,20.5255f,-230.469f, +-93.75f,19.6269f,-230.469f, +-89.8438f,20.0012f,-230.469f, +-85.9375f,21.0697f,-230.469f, +-82.0313f,21.8192f,-230.469f, +-78.125f,22.7525f,-230.469f, +-74.2188f,22.3932f,-230.469f, +-70.3125f,22.0383f,-230.469f, +-66.4063f,22.5989f,-230.469f, +-62.5f,23.0428f,-230.469f, +-58.5938f,22.4512f,-230.469f, +-54.6875f,21.5848f,-230.469f, +-50.7813f,20.085f,-230.469f, +-46.875f,19.9106f,-230.469f, +-42.9688f,20.5256f,-230.469f, +-39.0625f,20.2072f,-230.469f, +-35.1563f,18.9414f,-230.469f, +-31.25f,17.9342f,-230.469f, +-27.3438f,15.3472f,-230.469f, +-23.4375f,13.2173f,-230.469f, +-19.5313f,13.1448f,-230.469f, +-15.625f,13.7506f,-230.469f, +-11.7188f,12.7439f,-230.469f, +-7.8125f,12.5338f,-230.469f, +-3.90625f,12.0435f,-230.469f, +0.0f,11.0483f,-230.469f, +3.90625f,10.4619f,-230.469f, +-250.0f,15.6879f,-234.375f, +-246.094f,17.6667f,-234.375f, +-242.188f,18.8427f,-234.375f, +-238.281f,19.6527f,-234.375f, +-234.375f,19.7979f,-234.375f, +-230.469f,19.8698f,-234.375f, +-226.563f,19.1736f,-234.375f, +-222.656f,16.9995f,-234.375f, +-218.75f,15.4573f,-234.375f, +-214.844f,15.6294f,-234.375f, +-210.938f,15.4315f,-234.375f, +-207.031f,15.1239f,-234.375f, +-203.125f,14.669f,-234.375f, +-199.219f,14.4586f,-234.375f, +-195.313f,14.1329f,-234.375f, +-191.406f,14.0558f,-234.375f, +-187.5f,13.3746f,-234.375f, +-183.594f,13.2348f,-234.375f, +-179.688f,13.3354f,-234.375f, +-175.781f,12.1532f,-234.375f, +-171.875f,11.4785f,-234.375f, +-167.969f,12.7174f,-234.375f, +-164.063f,14.0617f,-234.375f, +-160.156f,15.3367f,-234.375f, +-156.25f,16.6196f,-234.375f, +-152.344f,17.6677f,-234.375f, +-148.438f,18.475f,-234.375f, +-144.531f,19.8205f,-234.375f, +-140.625f,19.6973f,-234.375f, +-136.719f,20.5952f,-234.375f, +-132.813f,20.3507f,-234.375f, +-128.906f,20.8729f,-234.375f, +-125.0f,21.9377f,-234.375f, +-121.094f,21.8916f,-234.375f, +-117.188f,21.9614f,-234.375f, +-113.281f,22.1752f,-234.375f, +-109.375f,22.2881f,-234.375f, +-105.469f,23.1063f,-234.375f, +-101.563f,23.4826f,-234.375f, +-97.6563f,22.5968f,-234.375f, +-93.75f,21.3142f,-234.375f, +-89.8438f,19.9609f,-234.375f, +-85.9375f,21.4353f,-234.375f, +-82.0313f,21.9716f,-234.375f, +-78.125f,22.6918f,-234.375f, +-74.2188f,21.9561f,-234.375f, +-70.3125f,21.3085f,-234.375f, +-66.4063f,21.4104f,-234.375f, +-62.5f,21.4904f,-234.375f, +-58.5938f,20.2467f,-234.375f, +-54.6875f,19.1535f,-234.375f, +-50.7813f,17.9598f,-234.375f, +-46.875f,18.0449f,-234.375f, +-42.9688f,18.3612f,-234.375f, +-39.0625f,17.5008f,-234.375f, +-35.1563f,16.7819f,-234.375f, +-31.25f,15.4328f,-234.375f, +-27.3438f,13.9747f,-234.375f, +-23.4375f,12.1868f,-234.375f, +-19.5313f,12.0847f,-234.375f, +-15.625f,11.926f,-234.375f, +-11.7188f,11.3058f,-234.375f, +-7.8125f,11.0187f,-234.375f, +-3.90625f,10.1275f,-234.375f, +0.0f,9.73133f,-234.375f, +3.90625f,8.85224f,-234.375f, +-250.0f,16.6463f,-238.281f, +-246.094f,18.8582f,-238.281f, +-242.188f,19.6269f,-238.281f, +-238.281f,20.3222f,-238.281f, +-234.375f,20.8316f,-238.281f, +-230.469f,20.6072f,-238.281f, +-226.563f,19.2331f,-238.281f, +-222.656f,18.0021f,-238.281f, +-218.75f,16.4891f,-238.281f, +-214.844f,15.7845f,-238.281f, +-210.938f,15.4622f,-238.281f, +-207.031f,14.3459f,-238.281f, +-203.125f,14.6544f,-238.281f, +-199.219f,13.7779f,-238.281f, +-195.313f,13.4199f,-238.281f, +-191.406f,13.2089f,-238.281f, +-187.5f,12.5036f,-238.281f, +-183.594f,12.6398f,-238.281f, +-179.688f,13.015f,-238.281f, +-175.781f,12.659f,-238.281f, +-171.875f,13.2801f,-238.281f, +-167.969f,13.9547f,-238.281f, +-164.063f,14.8792f,-238.281f, +-160.156f,16.4144f,-238.281f, +-156.25f,17.1062f,-238.281f, +-152.344f,17.9028f,-238.281f, +-148.438f,19.1823f,-238.281f, +-144.531f,20.6903f,-238.281f, +-140.625f,19.9053f,-238.281f, +-136.719f,20.8795f,-238.281f, +-132.813f,21.7034f,-238.281f, +-128.906f,21.8373f,-238.281f, +-125.0f,22.5134f,-238.281f, +-121.094f,22.7918f,-238.281f, +-117.188f,23.1126f,-238.281f, +-113.281f,23.0308f,-238.281f, +-109.375f,23.7212f,-238.281f, +-105.469f,24.6127f,-238.281f, +-101.563f,24.5942f,-238.281f, +-97.6563f,24.0315f,-238.281f, +-93.75f,23.2191f,-238.281f, +-89.8438f,21.3372f,-238.281f, +-85.9375f,20.6395f,-238.281f, +-82.0313f,22.2808f,-238.281f, +-78.125f,22.2977f,-238.281f, +-74.2188f,21.5802f,-238.281f, +-70.3125f,20.5131f,-238.281f, +-66.4063f,20.0882f,-238.281f, +-62.5f,19.9865f,-238.281f, +-58.5938f,19.1423f,-238.281f, +-54.6875f,16.917f,-238.281f, +-50.7813f,16.0256f,-238.281f, +-46.875f,15.4122f,-238.281f, +-42.9688f,15.0531f,-238.281f, +-39.0625f,15.8819f,-238.281f, +-35.1563f,14.3724f,-238.281f, +-31.25f,12.993f,-238.281f, +-27.3438f,11.8948f,-238.281f, +-23.4375f,10.1339f,-238.281f, +-19.5313f,10.4205f,-238.281f, +-15.625f,10.7339f,-238.281f, +-11.7188f,9.86852f,-238.281f, +-7.8125f,8.89818f,-238.281f, +-3.90625f,8.20848f,-238.281f, +0.0f,7.89095f,-238.281f, +3.90625f,7.99527f,-238.281f, +-250.0f,16.461f,-242.188f, +-246.094f,18.8623f,-242.188f, +-242.188f,19.6097f,-242.188f, +-238.281f,20.8167f,-242.188f, +-234.375f,21.0667f,-242.188f, +-230.469f,20.3337f,-242.188f, +-226.563f,18.9993f,-242.188f, +-222.656f,17.8141f,-242.188f, +-218.75f,17.3651f,-242.188f, +-214.844f,16.1703f,-242.188f, +-210.938f,15.3612f,-242.188f, +-207.031f,14.5062f,-242.188f, +-203.125f,14.0333f,-242.188f, +-199.219f,13.0731f,-242.188f, +-195.313f,13.0716f,-242.188f, +-191.406f,12.2773f,-242.188f, +-187.5f,12.1599f,-242.188f, +-183.594f,12.0841f,-242.188f, +-179.688f,11.1979f,-242.188f, +-175.781f,11.7767f,-242.188f, +-171.875f,13.5192f,-242.188f, +-167.969f,13.6117f,-242.188f, +-164.063f,14.5377f,-242.188f, +-160.156f,16.1128f,-242.188f, +-156.25f,17.0591f,-242.188f, +-152.344f,18.0547f,-242.188f, +-148.438f,19.9927f,-242.188f, +-144.531f,20.5592f,-242.188f, +-140.625f,20.5602f,-242.188f, +-136.719f,20.6585f,-242.188f, +-132.813f,22.6924f,-242.188f, +-128.906f,23.4786f,-242.188f, +-125.0f,23.9921f,-242.188f, +-121.094f,24.3221f,-242.188f, +-117.188f,24.7845f,-242.188f, +-113.281f,24.0995f,-242.188f, +-109.375f,25.5836f,-242.188f, +-105.469f,25.1932f,-242.188f, +-101.563f,25.0022f,-242.188f, +-97.6563f,24.569f,-242.188f, +-93.75f,24.5749f,-242.188f, +-89.8438f,22.6678f,-242.188f, +-85.9375f,20.6652f,-242.188f, +-82.0313f,21.1719f,-242.188f, +-78.125f,21.9102f,-242.188f, +-74.2188f,20.9512f,-242.188f, +-70.3125f,19.1099f,-242.188f, +-66.4063f,18.2366f,-242.188f, +-62.5f,16.9751f,-242.188f, +-58.5938f,16.938f,-242.188f, +-54.6875f,16.3692f,-242.188f, +-50.7813f,14.5702f,-242.188f, +-46.875f,13.5527f,-242.188f, +-42.9688f,13.0169f,-242.188f, +-39.0625f,11.9599f,-242.188f, +-35.1563f,11.4675f,-242.188f, +-31.25f,10.1264f,-242.188f, +-27.3438f,9.05124f,-242.188f, +-23.4375f,8.17722f,-242.188f, +-19.5313f,8.42066f,-242.188f, +-15.625f,8.13199f,-242.188f, +-11.7188f,7.70744f,-242.188f, +-7.8125f,7.06448f,-242.188f, +-3.90625f,6.2428f,-242.188f, +0.0f,6.35893f,-242.188f, +3.90625f,6.40337f,-242.188f, +-250.0f,16.6546f,-246.094f, +-246.094f,17.6689f,-246.094f, +-242.188f,18.7575f,-246.094f, +-238.281f,20.3967f,-246.094f, +-234.375f,20.3065f,-246.094f, +-230.469f,20.2082f,-246.094f, +-226.563f,19.5383f,-246.094f, +-222.656f,17.7409f,-246.094f, +-218.75f,16.6708f,-246.094f, +-214.844f,15.9584f,-246.094f, +-210.938f,14.8412f,-246.094f, +-207.031f,14.5591f,-246.094f, +-203.125f,13.9049f,-246.094f, +-199.219f,12.4723f,-246.094f, +-195.313f,11.7361f,-246.094f, +-191.406f,11.5463f,-246.094f, +-187.5f,10.9687f,-246.094f, +-183.594f,10.6795f,-246.094f, +-179.688f,10.6856f,-246.094f, +-175.781f,10.6342f,-246.094f, +-171.875f,12.061f,-246.094f, +-167.969f,12.3131f,-246.094f, +-164.063f,13.8453f,-246.094f, +-160.156f,15.3522f,-246.094f, +-156.25f,16.575f,-246.094f, +-152.344f,17.953f,-246.094f, +-148.438f,18.9271f,-246.094f, +-144.531f,19.6463f,-246.094f, +-140.625f,20.0348f,-246.094f, +-136.719f,20.8966f,-246.094f, +-132.813f,22.7081f,-246.094f, +-128.906f,24.2289f,-246.094f, +-125.0f,24.3296f,-246.094f, +-121.094f,25.513f,-246.094f, +-117.188f,26.0616f,-246.094f, +-113.281f,25.9026f,-246.094f, +-109.375f,25.3793f,-246.094f, +-105.469f,26.0086f,-246.094f, +-101.563f,25.9668f,-246.094f, +-97.6563f,25.4377f,-246.094f, +-93.75f,24.6398f,-246.094f, +-89.8438f,22.6277f,-246.094f, +-85.9375f,20.9377f,-246.094f, +-82.0313f,20.5815f,-246.094f, +-78.125f,20.2521f,-246.094f, +-74.2188f,19.1439f,-246.094f, +-70.3125f,17.8492f,-246.094f, +-66.4063f,16.6347f,-246.094f, +-62.5f,15.9154f,-246.094f, +-58.5938f,14.2098f,-246.094f, +-54.6875f,13.5957f,-246.094f, +-50.7813f,12.5676f,-246.094f, +-46.875f,11.2422f,-246.094f, +-42.9688f,10.426f,-246.094f, +-39.0625f,10.1665f,-246.094f, +-35.1563f,9.19605f,-246.094f, +-31.25f,7.36042f,-246.094f, +-27.3438f,5.74959f,-246.094f, +-23.4375f,5.41512f,-246.094f, +-19.5313f,6.03312f,-246.094f, +-15.625f,5.93285f,-246.094f, +-11.7188f,5.3331f,-246.094f, +-7.8125f,5.48059f,-246.094f, +-3.90625f,4.92566f,-246.094f, +0.0f,5.05645f,-246.094f, +3.90625f,6.09425f,-246.094f, +-250.0f,17.2418f,-250.0f, +-246.094f,17.9679f,-250.0f, +-242.188f,19.359f,-250.0f, +-238.281f,19.3277f,-250.0f, +-234.375f,20.1575f,-250.0f, +-230.469f,19.8999f,-250.0f, +-226.563f,18.9681f,-250.0f, +-222.656f,17.7696f,-250.0f, +-218.75f,15.6199f,-250.0f, +-214.844f,14.6555f,-250.0f, +-210.938f,13.0514f,-250.0f, +-207.031f,13.6029f,-250.0f, +-203.125f,13.1455f,-250.0f, +-199.219f,12.0056f,-250.0f, +-195.313f,11.1773f,-250.0f, +-191.406f,10.7263f,-250.0f, +-187.5f,10.2543f,-250.0f, +-183.594f,9.76389f,-250.0f, +-179.688f,9.00623f,-250.0f, +-175.781f,9.47424f,-250.0f, +-171.875f,10.8011f,-250.0f, +-167.969f,12.4395f,-250.0f, +-164.063f,13.7736f,-250.0f, +-160.156f,14.0938f,-250.0f, +-156.25f,15.8447f,-250.0f, +-152.344f,17.1975f,-250.0f, +-148.438f,17.963f,-250.0f, +-144.531f,19.3662f,-250.0f, +-140.625f,20.309f,-250.0f, +-136.719f,21.9063f,-250.0f, +-132.813f,22.8363f,-250.0f, +-128.906f,24.0073f,-250.0f, +-125.0f,25.2989f,-250.0f, +-121.094f,26.2944f,-250.0f, +-117.188f,27.4482f,-250.0f, +-113.281f,27.4823f,-250.0f, +-109.375f,27.2835f,-250.0f, +-105.469f,27.4754f,-250.0f, +-101.563f,27.7731f,-250.0f, +-97.6563f,26.6981f,-250.0f, +-93.75f,24.4699f,-250.0f, +-89.8438f,22.81f,-250.0f, +-85.9375f,21.6739f,-250.0f, +-82.0313f,19.8713f,-250.0f, +-78.125f,18.5848f,-250.0f, +-74.2188f,17.7134f,-250.0f, +-70.3125f,15.5276f,-250.0f, +-66.4063f,14.6805f,-250.0f, +-62.5f,14.0332f,-250.0f, +-58.5938f,12.1429f,-250.0f, +-54.6875f,10.3027f,-250.0f, +-50.7813f,9.68001f,-250.0f, +-46.875f,8.12561f,-250.0f, +-42.9688f,8.26581f,-250.0f, +-39.0625f,7.98056f,-250.0f, +-35.1563f,7.43215f,-250.0f, +-31.25f,6.33038f,-250.0f, +-27.3438f,4.62549f,-250.0f, +-23.4375f,3.83616f,-250.0f, +-19.5313f,4.24597f,-250.0f, +-15.625f,3.79997f,-250.0f, +-11.7188f,3.74461f,-250.0f, +-7.8125f,3.79853f,-250.0f, +-3.90625f,3.95418f,-250.0f, +0.0f,5.70623f,-250.0f, +3.90625f,6.31953f,-250.0f, +}; + +btScalar Landscape08Nml[] = { +-0.193879f,0.980285f,-0.0381128f, +-0.101407f,0.994799f,-0.00961843f, +-0.17812f,0.983422f,0.0339701f, +-0.107869f,0.990758f,0.0822321f, +-0.150224f,0.986838f,0.0598614f, +-0.176421f,0.983338f,0.0438458f, +0.00771709f,0.999873f,0.0139132f, +-0.0458501f,0.998747f,-0.0200731f, +0.170866f,0.984802f,-0.0311488f, +0.198428f,0.979783f,-0.0255296f, +0.223966f,0.969797f,0.0966125f, +0.319719f,0.946459f,0.0446654f, +0.155788f,0.942148f,0.296794f, +0.226142f,0.945324f,0.234996f, +0.0234229f,0.954977f,0.295752f, +-0.0213542f,0.981077f,0.192434f, +-0.0320299f,0.976907f,0.211248f, +-0.0305686f,0.97015f,0.240572f, +-0.00290395f,0.990031f,0.14082f, +-0.0740282f,0.98339f,0.165723f, +0.0359831f,0.998663f,0.0371117f, +-0.048977f,0.998654f,0.0171003f, +0.119085f,0.992879f,0.00312204f, +0.163687f,0.985928f,0.0339365f, +0.233927f,0.967265f,0.0983717f, +0.258555f,0.954734f,0.147076f, +0.185228f,0.98177f,0.0426319f, +0.171781f,0.975163f,0.139813f, +0.312497f,0.949826f,0.0132586f, +0.315278f,0.937034f,0.150223f, +0.455936f,0.889912f,-0.0133666f, +0.444363f,0.88993f,0.102789f, +0.477095f,0.878821f,-0.00729384f, +0.442265f,0.892911f,0.0843273f, +0.441901f,0.89445f,-0.0684218f, +0.356563f,0.929766f,-0.091634f, +0.46452f,0.88048f,-0.0947459f, +0.399286f,0.883106f,-0.246362f, +0.430625f,0.899506f,-0.073831f, +0.418125f,0.862027f,-0.286498f, +0.390492f,0.919986f,-0.0337736f, +0.451928f,0.884249f,-0.117748f, +0.389473f,0.920638f,-0.0271218f, +0.401911f,0.911214f,-0.0903147f, +0.411594f,0.910246f,-0.0451926f, +0.385985f,0.916603f,-0.104187f, +0.406515f,0.904587f,-0.128329f, +0.375686f,0.920382f,-0.108425f, +0.421893f,0.886378f,-0.190632f, +0.362475f,0.891842f,-0.270609f, +0.382406f,0.917607f,-0.108459f, +0.380095f,0.864773f,-0.32817f, +0.206545f,0.977978f,-0.0299668f, +0.319336f,0.938074f,-0.134321f, +-0.0276167f,0.998803f,0.0403598f, +0.0724517f,0.997355f,-0.00577643f, +-0.170399f,0.974366f,0.146884f, +-0.0444923f,0.976538f,0.210699f, +-0.123713f,0.961736f,0.244457f, +-0.0585476f,0.950932f,0.303809f, +-0.0436638f,0.948824f,0.312774f, +-0.0108452f,0.950133f,0.311655f, +-0.0562151f,0.924389f,0.377285f, +-0.024656f,0.918307f,0.3951f, +-0.11936f,0.930674f,0.345831f, +-0.21058f,0.936144f,0.281584f, +-0.166672f,0.952976f,0.253095f, +-0.262868f,0.958623f,0.109278f, +-0.138859f,0.97532f,0.171667f, +-0.166823f,0.980233f,0.106364f, +-0.016911f,0.994026f,0.107828f, +0.014088f,0.986713f,0.161858f, +-0.0269312f,0.989998f,0.138489f, +-0.0681193f,0.995186f,0.0704648f, +-0.241507f,0.962694f,0.122045f, +-0.306148f,0.951983f,0.00131283f, +-0.400562f,0.916076f,-0.0188573f, +-0.46755f,0.872686f,-0.140772f, +-0.451983f,0.886731f,-0.0970551f, +-0.445163f,0.885181f,-0.135217f, +-0.440559f,0.893764f,-0.0842181f, +-0.44058f,0.883958f,-0.156548f, +-0.530573f,0.842324f,-0.094771f, +-0.559377f,0.815929f,-0.14614f, +-0.675146f,0.724837f,-0.137074f, +-0.671227f,0.729467f,-0.131655f, +-0.627673f,0.767191f,-0.132076f, +-0.630683f,0.736819f,-0.243592f, +-0.548071f,0.819689f,-0.166518f, +-0.526895f,0.799727f,-0.287781f, +-0.521779f,0.83885f,-0.155167f, +-0.501504f,0.822365f,-0.268719f, +-0.465479f,0.867433f,-0.175756f, +-0.453816f,0.862676f,-0.223251f, +-0.458424f,0.854844f,-0.243083f, +-0.470698f,0.860374f,-0.195446f, +-0.485669f,0.830839f,-0.27172f, +-0.494445f,0.85319f,-0.166102f, +-0.418394f,0.865747f,-0.274642f, +-0.405345f,0.892443f,-0.198093f, +-0.287108f,0.926134f,-0.244631f, +-0.325256f,0.923685f,-0.202519f, +-0.192384f,0.91848f,-0.345518f, +-0.208186f,0.935081f,-0.28685f, +0.0681073f,0.948251f,-0.310131f, +0.077158f,0.955715f,-0.283998f, +0.102278f,0.947499f,-0.302962f, +0.02043f,0.921087f,-0.388821f, +0.0627177f,0.929646f,-0.363077f, +0.0629047f,0.918578f,-0.390202f, +-0.00415691f,0.947597f,-0.31944f, +-0.00512929f,0.899538f,-0.436812f, +-0.271944f,0.935195f,-0.226842f, +-0.177509f,0.92231f,-0.343271f, +-0.413186f,0.904845f,-0.102632f, +-0.338265f,0.931446f,-0.13411f, +-0.418276f,0.90315f,-0.0967731f, +-0.404177f,0.914278f,-0.0271442f, +-0.400569f,0.902696f,-0.157112f, +-0.429625f,0.894308f,-0.125039f, +-0.29004f,0.948484f,-0.127491f, +-0.188203f,0.980777f,0.0515283f, +-0.0585039f,0.997556f,-0.0381961f, +-0.133431f,0.99094f,0.0152943f, +-0.143343f,0.971126f,-0.1907f, +-0.24516f,0.938627f,-0.242644f, +-0.188833f,0.958258f,-0.214673f, +-0.174705f,0.963776f,-0.201528f, +-0.196517f,0.95296f,-0.230756f, +-0.128653f,0.987396f,-0.0921772f, +-0.120365f,0.975049f,-0.186527f, +0.0117596f,0.998991f,0.0433545f, +-0.146882f,0.98666f,-0.0701983f, +-0.218442f,0.971087f,-0.0962923f, +-0.179096f,0.983284f,-0.0328244f, +0.0658277f,0.997324f,0.0318063f, +0.120963f,0.992647f,0.00454206f, +0.0263542f,0.988052f,0.151849f, +0.0179305f,0.957276f,0.288619f, +0.0987151f,0.955923f,0.276526f, +0.113577f,0.970939f,0.210662f, +0.111989f,0.989066f,0.0959572f, +0.0937332f,0.995324f,-0.0233266f, +0.0889156f,0.995493f,-0.0329669f, +0.214527f,0.976717f,-0.0013568f, +0.281036f,0.957864f,-0.0592866f, +0.349427f,0.927689f,-0.131507f, +0.460507f,0.876585f,-0.139754f, +0.465208f,0.877856f,-0.1138f, +0.432422f,0.897621f,-0.0853653f, +0.392928f,0.918987f,-0.032723f, +0.389134f,0.920603f,0.0326418f, +0.40247f,0.914003f,0.0511488f, +0.41651f,0.90858f,0.031652f, +0.468908f,0.883168f,-0.0118055f, +0.497957f,0.862594f,-0.0892785f, +0.342146f,0.929254f,-0.139366f, +0.262957f,0.964807f,-0.00115352f, +0.156573f,0.98302f,0.095691f, +-0.0479214f,0.988417f,0.143995f, +-0.198695f,0.970386f,0.13737f, +-0.222539f,0.963461f,0.14906f, +-0.145574f,0.943362f,0.298121f, +-0.065459f,0.922659f,0.380021f, +-0.0644219f,0.950539f,0.303852f, +-0.126762f,0.967843f,0.217283f, +-0.017815f,0.980142f,0.197496f, +0.0660407f,0.994277f,0.0839804f, +-0.101583f,0.994471f,0.0266049f, +-0.224345f,0.969139f,0.102176f, +-0.280297f,0.958092f,0.0591033f, +-0.402555f,0.91416f,-0.047541f, +-0.458467f,0.883974f,-0.0916445f, +-0.50134f,0.862765f,-0.0655406f, +-0.644808f,0.754744f,-0.12077f, +-0.636358f,0.756299f,-0.151855f, +-0.556238f,0.818404f,-0.144268f, +-0.504016f,0.849904f,-0.153725f, +-0.404172f,0.887071f,-0.223046f, +-0.360363f,0.894242f,-0.265463f, +-0.432057f,0.840836f,-0.326069f, +-0.4393f,0.818603f,-0.370006f, +-0.249988f,0.890718f,-0.379642f, +-0.114697f,0.874572f,-0.471135f, +-0.0301956f,0.870113f,-0.491927f, +0.0871874f,0.907337f,-0.411263f, +0.0509325f,0.923392f,-0.380464f, +-0.106299f,0.953821f,-0.280938f, +-0.389809f,0.901657f,-0.187255f, +-0.420279f,0.904001f,-0.0784108f, +-0.360569f,0.922439f,-0.138186f, +-0.332116f,0.91853f,-0.214478f, +-0.305854f,0.899541f,-0.311896f, +-0.11957f,0.95083f,-0.285701f, +-0.0843961f,0.977455f,-0.193542f, +-0.186555f,0.968589f,-0.164414f, +-0.1142f,0.975963f,-0.185618f, +-0.138309f,0.943055f,-0.30252f, +-0.101226f,0.981339f,-0.163482f, +-0.184633f,0.97099f,-0.151951f, +-0.239394f,0.95355f,-0.182845f, +-0.0575173f,0.989733f,-0.130847f, +0.0688205f,0.993792f,0.0874178f, +-0.0714424f,0.990397f,0.118361f, +-0.0225247f,0.994972f,0.0975878f, +0.167362f,0.976776f,0.133786f, +0.156506f,0.98511f,0.0711603f, +0.198564f,0.979194f,0.0418473f, +0.173408f,0.984455f,-0.0278778f, +0.108869f,0.989375f,-0.0963545f, +0.224679f,0.96015f,-0.166226f, +0.339104f,0.91731f,-0.208688f, +0.367935f,0.88797f,-0.275922f, +0.418707f,0.869398f,-0.262357f, +0.420889f,0.892687f,-0.161129f, +0.397172f,0.910077f,-0.118378f, +0.374326f,0.920598f,-0.11126f, +0.397932f,0.911721f,-0.102056f, +0.386888f,0.911258f,-0.141166f, +0.41482f,0.902273f,-0.117593f, +0.501715f,0.859192f,-0.100356f, +0.491949f,0.863362f,-0.112214f, +0.357466f,0.931719f,-0.0641779f, +0.171333f,0.982821f,-0.068616f, +0.100623f,0.994346f,0.0339287f, +-0.0698557f,0.996834f,0.0379692f, +-0.194026f,0.980994f,0.00220452f, +-0.288205f,0.957419f,0.0169548f, +-0.304635f,0.947239f,0.0996808f, +-0.10216f,0.973655f,0.20386f, +0.100532f,0.974742f,0.199427f, +-0.0238908f,0.99964f,0.0121747f, +-0.00850096f,0.997624f,-0.0683673f, +0.116859f,0.992157f,-0.044359f, +-0.0433286f,0.998946f,-0.0151181f, +-0.258294f,0.961617f,-0.0926162f, +-0.256378f,0.96262f,-0.0873673f, +-0.327211f,0.940376f,-0.0928767f, +-0.431734f,0.888327f,-0.15646f, +-0.514253f,0.844258f,-0.150905f, +-0.599748f,0.789083f,-0.132858f, +-0.620824f,0.749219f,-0.230756f, +-0.533018f,0.803035f,-0.266508f, +-0.441513f,0.840682f,-0.313561f, +-0.38701f,0.854241f,-0.347124f, +-0.380219f,0.879441f,-0.286385f, +-0.39628f,0.874175f,-0.280679f, +-0.390488f,0.846052f,-0.362926f, +-0.205032f,0.876667f,-0.435221f, +-0.00372872f,0.883142f,-0.46909f, +-0.0083869f,0.837348f,-0.546606f, +-0.00127167f,0.831923f,-0.55489f, +-0.11424f,0.875282f,-0.469926f, +-0.256213f,0.933918f,-0.249305f, +-0.393049f,0.915109f,-0.0899313f, +-0.484342f,0.863396f,-0.141282f, +-0.32612f,0.940905f,-0.0913441f, +-0.240051f,0.956808f,-0.163992f, +-0.189326f,0.934609f,-0.301099f, +-0.228613f,0.900757f,-0.369288f, +-0.206601f,0.953154f,-0.220936f, +-0.220523f,0.958575f,-0.180285f, +-0.0691943f,0.98249f,-0.172992f, +0.0652464f,0.984331f,-0.163816f, +-0.308082f,0.909128f,-0.280306f, +-0.234588f,0.948864f,-0.211249f, +-0.164432f,0.95809f,-0.234578f, +-0.206026f,0.945244f,-0.253116f, +-0.143287f,0.989535f,-0.0170174f, +0.0124441f,0.996035f,0.0880878f, +0.00356068f,0.999352f,-0.0358152f, +0.110457f,0.993318f,-0.0334531f, +0.202646f,0.978802f,0.0296789f, +0.245502f,0.969355f,0.00893075f, +0.235742f,0.966989f,-0.096741f, +0.211469f,0.957228f,-0.197474f, +0.297424f,0.906479f,-0.299724f, +0.384843f,0.8614f,-0.331489f, +0.405425f,0.833969f,-0.374335f, +0.330388f,0.8594f,-0.390224f, +0.318232f,0.891429f,-0.32262f, +0.388106f,0.870631f,-0.302284f, +0.354731f,0.863719f,-0.357989f, +0.344798f,0.878386f,-0.330988f, +0.405293f,0.884611f,-0.230654f, +0.388923f,0.889959f,-0.23814f, +0.464087f,0.861962f,-0.20407f, +0.454884f,0.878774f,-0.144348f, +0.334448f,0.940492f,-0.0601651f, +0.155367f,0.984248f,-0.0843604f, +0.0216917f,0.991768f,-0.126198f, +-0.0136477f,0.995915f,-0.089255f, +-0.167328f,0.979282f,-0.114052f, +-0.307453f,0.946588f,-0.0971837f, +-0.335506f,0.9366f,-0.101072f, +-0.175739f,0.978185f,-0.110768f, +0.119064f,0.992411f,-0.0307238f, +0.11077f,0.993829f,0.00590121f, +0.0501349f,0.998052f,-0.0371321f, +0.0267572f,0.997581f,-0.0641572f, +-0.0614311f,0.997945f,0.0181992f, +-0.171984f,0.984492f,-0.0345973f, +-0.25243f,0.961435f,-0.109187f, +-0.338599f,0.935923f,-0.0969507f, +-0.406007f,0.913202f,-0.0349361f, +-0.506218f,0.860674f,-0.0546185f, +-0.568342f,0.8123f,-0.130983f, +-0.570141f,0.791669f,-0.219544f, +-0.495272f,0.816181f,-0.297581f, +-0.441753f,0.829099f,-0.342707f, +-0.433015f,0.854206f,-0.287802f, +-0.452692f,0.8617f,-0.229223f, +-0.349843f,0.914647f,-0.202562f, +-0.26556f,0.912134f,-0.312233f, +-0.238012f,0.870367f,-0.431058f, +0.0104117f,0.943359f,-0.331612f, +0.0744935f,0.949145f,-0.305899f, +-0.0305186f,0.956187f,-0.291161f, +-0.253914f,0.939488f,-0.229978f, +-0.449831f,0.878563f,-0.160557f, +-0.46937f,0.880955f,-0.0600792f, +-0.456075f,0.88917f,-0.0370459f, +-0.35963f,0.932902f,-0.0189682f, +-0.136797f,0.989932f,0.0363352f, +-0.0613131f,0.996495f,-0.0569106f, +-0.21207f,0.964351f,-0.158282f, +-0.303853f,0.931291f,-0.200924f, +-0.14101f,0.957182f,-0.252823f, +-0.0888984f,0.919027f,-0.384041f, +0.0067746f,0.936029f,-0.351857f, +-0.277531f,0.936633f,-0.213766f, +-0.206375f,0.947006f,-0.246148f, +-0.159145f,0.94264f,-0.293433f, +-0.254895f,0.932893f,-0.254437f, +-0.289527f,0.928279f,-0.233391f, +-0.0765713f,0.988951f,-0.126934f, +0.118605f,0.992812f,0.0160497f, +0.122094f,0.985714f,-0.116021f, +0.123131f,0.980876f,-0.150734f, +0.257926f,0.962137f,-0.0881221f, +0.397575f,0.90803f,-0.131971f, +0.301628f,0.898949f,-0.317666f, +0.360055f,0.863992f,-0.351962f, +0.391486f,0.830925f,-0.39535f, +0.399022f,0.829333f,-0.391136f, +0.323505f,0.871183f,-0.369302f, +0.290418f,0.885393f,-0.362955f, +0.422788f,0.860776f,-0.283398f, +0.400499f,0.876008f,-0.26872f, +0.272367f,0.912425f,-0.305444f, +0.289824f,0.919053f,-0.267101f, +0.375469f,0.907173f,-0.189898f, +0.450189f,0.881784f,-0.140667f, +0.386895f,0.914552f,-0.117932f, +0.236065f,0.970562f,-0.0477698f, +0.25497f,0.966484f,0.0299776f, +0.147152f,0.978905f,-0.141747f, +-0.0638684f,0.954892f,-0.290005f, +-0.198781f,0.952653f,-0.230082f, +-0.310279f,0.934977f,-0.171888f, +-0.315284f,0.933842f,-0.168923f, +-0.14676f,0.971582f,-0.185715f, +-0.0201641f,0.976785f,-0.213271f, +0.0408109f,0.997823f,-0.0518006f, +-0.000100141f,1.0f,-0.000656924f, +0.0713875f,0.992775f,0.096444f, +-0.0699693f,0.997522f,-0.0073179f, +-0.120441f,0.992484f,-0.0216487f, +-0.200799f,0.979135f,-0.0312183f, +-0.379156f,0.923729f,-0.0544518f, +-0.468756f,0.883079f,0.0209709f, +-0.451556f,0.890079f,0.0621062f, +-0.476504f,0.87674f,-0.0653536f, +-0.492274f,0.840855f,-0.22501f, +-0.481358f,0.828756f,-0.285409f, +-0.474733f,0.852404f,-0.219173f, +-0.502016f,0.852123f,-0.147874f, +-0.474734f,0.870513f,-0.12975f, +-0.344408f,0.92173f,-0.178317f, +-0.150823f,0.963991f,-0.21903f, +-0.180013f,0.935609f,-0.303696f, +-0.154788f,0.929555f,-0.334617f, +0.0226749f,0.973389f,-0.228036f, +-0.128469f,0.975007f,-0.181264f, +-0.302747f,0.952293f,-0.0385077f, +-0.427741f,0.902872f,-0.0431169f, +-0.47673f,0.871329f,-0.116249f, +-0.489254f,0.866227f,-0.101399f, +-0.407231f,0.911582f,-0.0564075f, +-0.202058f,0.978968f,-0.0281862f, +-0.00674228f,0.999486f,0.0313481f, +-0.103136f,0.994637f,-0.00773474f, +-0.196734f,0.967877f,-0.156554f, +0.0323675f,0.951182f,-0.306928f, +0.00132526f,0.886111f,-0.463472f, +-0.0819618f,0.88666f,-0.4551f, +-0.207835f,0.973361f,-0.0968142f, +-0.157163f,0.972283f,-0.173105f, +-0.187284f,0.955049f,-0.229797f, +-0.285445f,0.950862f,-0.119931f, +-0.25293f,0.964263f,-0.078892f, +-0.219599f,0.957265f,-0.188204f, +-0.0108412f,0.995374f,-0.0954668f, +0.265678f,0.963807f,-0.0221529f, +0.203794f,0.959343f,-0.195266f, +0.214345f,0.928921f,-0.301932f, +0.439386f,0.868442f,-0.22967f, +0.401404f,0.868685f,-0.290278f, +0.386804f,0.861005f,-0.330232f, +0.428054f,0.836263f,-0.342686f, +0.371108f,0.864198f,-0.339765f, +0.321515f,0.897421f,-0.302098f, +0.213518f,0.927633f,-0.306443f, +0.325579f,0.933219f,-0.151988f, +0.403183f,0.912352f,-0.0711129f, +0.337076f,0.932606f,-0.128942f, +0.295377f,0.932293f,-0.208765f, +0.330751f,0.922115f,-0.200767f, +0.392168f,0.906602f,-0.155808f, +0.373592f,0.925323f,-0.0648487f, +0.191498f,0.98018f,-0.0507507f, +0.210624f,0.977447f,-0.015309f, +0.322948f,0.945895f,0.0314047f, +0.111956f,0.981203f,-0.157186f, +-0.247376f,0.91284f,-0.32485f, +-0.344293f,0.903462f,-0.255381f, +-0.317143f,0.916625f,-0.243348f, +-0.146502f,0.958945f,-0.242819f, +-0.0529375f,0.980235f,-0.19062f, +-0.0439655f,0.993569f,-0.104344f, +-0.0681441f,0.993007f,-0.0964036f, +0.0333119f,0.999062f,-0.0276811f, +0.0418264f,0.997289f,-0.0605344f, +-0.133447f,0.982771f,-0.127878f, +-0.204776f,0.9734f,-0.102754f, +-0.405337f,0.909688f,-0.0903804f, +-0.513852f,0.857872f,0.00340788f, +-0.448907f,0.892038f,0.0524446f, +-0.345596f,0.938383f,0.000245611f, +-0.371875f,0.917654f,-0.14007f, +-0.507047f,0.834221f,-0.216744f, +-0.563482f,0.814021f,-0.140919f, +-0.549501f,0.831415f,-0.0824446f, +-0.452205f,0.89061f,-0.0482179f, +-0.283377f,0.952701f,-0.109812f, +-0.141817f,0.97445f,-0.174169f, +-0.1066f,0.981505f,-0.159008f, +-0.128743f,0.958435f,-0.254611f, +0.00656601f,0.946015f,-0.324056f, +-0.2018f,0.913066f,-0.354384f, +-0.37997f,0.904414f,-0.19406f, +-0.423353f,0.890783f,-0.165163f, +-0.446411f,0.883929f,-0.139235f, +-0.512365f,0.844229f,-0.157352f, +-0.38243f,0.91272f,-0.143839f, +-0.20154f,0.953013f,-0.226157f, +-0.104673f,0.977037f,-0.185586f, +-0.0458745f,0.998873f,-0.0121567f, +-0.0345945f,0.993617f,-0.107371f, +0.172752f,0.948616f,-0.265111f, +0.0733608f,0.946968f,-0.312842f, +-0.16546f,0.93251f,-0.321012f, +-0.129843f,0.991294f,-0.0218587f, +-0.0514732f,0.996939f,-0.0588533f, +-0.139666f,0.979954f,-0.142066f, +-0.409538f,0.893138f,-0.185964f, +-0.25948f,0.963277f,-0.0690542f, +-0.106228f,0.993322f,-0.0450175f, +-0.047863f,0.993002f,-0.107966f, +0.238746f,0.962198f,-0.131057f, +0.395076f,0.900486f,-0.181771f, +0.285693f,0.874669f,-0.391577f, +0.358513f,0.848133f,-0.39005f, +0.400938f,0.884343f,-0.239137f, +0.415724f,0.899223f,-0.136277f, +0.438653f,0.894164f,-0.0897495f, +0.361082f,0.930821f,-0.0565009f, +0.321158f,0.946416f,-0.0339725f, +0.242073f,0.961641f,-0.129024f, +0.199607f,0.93926f,-0.279192f, +0.404284f,0.887623f,-0.220636f, +0.424881f,0.860893f,-0.279892f, +0.291182f,0.870529f,-0.396727f, +0.302468f,0.897545f,-0.320822f, +0.33835f,0.898885f,-0.278433f, +0.289098f,0.929341f,-0.229667f, +0.170367f,0.971163f,-0.166783f, +0.129237f,0.986609f,-0.0995005f, +0.305057f,0.951694f,0.0349234f, +0.306439f,0.951736f,-0.0171507f, +-0.0808802f,0.976235f,-0.201056f, +-0.37625f,0.871862f,-0.313516f, +-0.307717f,0.906797f,-0.28815f, +-0.221648f,0.946026f,-0.236446f, +-0.153972f,0.983161f,-0.0984244f, +-0.108206f,0.992418f,-0.0582996f, +-0.0581427f,0.997361f,-0.0434687f, +0.00296039f,0.999365f,-0.0355116f, +0.0891034f,0.995894f,-0.0160169f, +-0.110645f,0.991801f,-0.0639364f, +-0.218461f,0.975223f,-0.0348525f, +-0.395365f,0.918398f,-0.0152307f, +-0.576836f,0.816159f,-0.0338453f, +-0.444941f,0.895556f,-0.00249309f, +-0.286239f,0.957764f,-0.0274641f, +-0.294715f,0.953259f,-0.0666355f, +-0.477956f,0.87064f,-0.116377f, +-0.574643f,0.800737f,-0.169131f, +-0.54804f,0.808388f,-0.214852f, +-0.442187f,0.863382f,-0.242986f, +-0.246722f,0.934143f,-0.257887f, +-0.157124f,0.964153f,-0.213827f, +-0.112706f,0.987993f,-0.10568f, +-0.0332674f,0.993709f,-0.106936f, +0.112688f,0.981964f,-0.151814f, +-0.167f,0.962022f,-0.215928f, +-0.466198f,0.854366f,-0.229606f, +-0.414399f,0.885329f,-0.210869f, +-0.461383f,0.855213f,-0.236084f, +-0.488245f,0.847976f,-0.206287f, +-0.351309f,0.900136f,-0.257559f, +-0.14601f,0.942734f,-0.29989f, +-0.222931f,0.937875f,-0.265879f, +-0.195469f,0.970505f,-0.141106f, +0.07525f,0.994532f,-0.0724173f, +0.279727f,0.951429f,-0.128592f, +0.077712f,0.980159f,-0.182341f, +-0.20264f,0.956685f,-0.209022f, +-0.0986596f,0.987061f,-0.126403f, +-0.0477559f,0.985147f,-0.164941f, +-0.0669351f,0.983547f,-0.167793f, +-0.331517f,0.915331f,-0.228616f, +-0.350669f,0.900109f,-0.258526f, +-0.179805f,0.971282f,-0.155824f, +0.0156578f,0.989915f,-0.140797f, +0.301547f,0.9226f,-0.240579f, +0.457383f,0.852861f,-0.25185f, +0.449776f,0.84917f,-0.276789f, +0.26609f,0.885033f,-0.381984f, +0.182331f,0.952085f,-0.245538f, +0.260541f,0.964562f,-0.0416928f, +0.408684f,0.907067f,0.101033f, +0.342263f,0.936545f,0.0757594f, +0.318298f,0.944991f,0.0753604f, +0.467785f,0.882822f,0.0424513f, +0.409568f,0.864687f,-0.290809f, +0.379738f,0.82358f,-0.421325f, +0.451329f,0.792384f,-0.410402f, +0.275091f,0.868881f,-0.411547f, +0.161796f,0.92881f,-0.333367f, +0.286521f,0.932696f,-0.219053f, +0.272475f,0.944744f,-0.182252f, +0.119383f,0.965719f,-0.230508f, +-0.0212448f,0.971989f,-0.234063f, +0.226311f,0.969491f,-0.094178f, +0.326176f,0.942844f,-0.068215f, +0.104404f,0.994209f,-0.0254499f, +-0.295807f,0.921372f,-0.252133f, +-0.383855f,0.886842f,-0.257228f, +-0.359597f,0.921141f,-0.148961f, +-0.240318f,0.969399f,-0.0501282f, +-0.0922578f,0.994071f,-0.0575481f, +-0.0797027f,0.995693f,-0.047355f, +-0.026569f,0.999636f,0.00472767f, +0.105393f,0.994402f,0.00758912f, +-0.0968377f,0.99427f,-0.0452707f, +-0.304918f,0.952227f,0.0169656f, +-0.404524f,0.901318f,0.154875f, +-0.513873f,0.850873f,0.109318f, +-0.450348f,0.892744f,-0.0139455f, +-0.274075f,0.961559f,-0.0169546f, +-0.246789f,0.966677f,-0.068048f, +-0.421796f,0.89143f,-0.165651f, +-0.530762f,0.820949f,-0.210556f, +-0.518596f,0.828643f,-0.210734f, +-0.419929f,0.882924f,-0.210013f, +-0.267086f,0.925885f,-0.26721f, +-0.260528f,0.916111f,-0.304739f, +-0.212437f,0.941505f,-0.261606f, +-0.048105f,0.973033f,-0.225594f, +0.0765563f,0.979806f,-0.184712f, +-0.093108f,0.98921f,-0.113109f, +-0.45825f,0.862094f,-0.216335f, +-0.388948f,0.902314f,-0.185873f, +-0.448149f,0.871913f,-0.197307f, +-0.488741f,0.854988f,-0.173574f, +-0.313337f,0.916762f,-0.247724f, +-0.157546f,0.938004f,-0.308753f, +-0.267357f,0.911027f,-0.313926f, +-0.236818f,0.920159f,-0.311809f, +0.000164176f,0.954985f,-0.296656f, +0.271822f,0.944232f,-0.185848f, +0.151331f,0.970946f,-0.185371f, +-0.118147f,0.962507f,-0.244174f, +0.026977f,0.993643f,-0.109301f, +0.00824696f,0.988318f,-0.152184f, +-0.049843f,0.98983f,-0.133236f, +-0.292853f,0.946012f,-0.138915f, +-0.402779f,0.899681f,-0.168355f, +-0.216565f,0.962959f,-0.160656f, +0.0811851f,0.971223f,-0.223909f, +0.376654f,0.888442f,-0.262304f, +0.412611f,0.862287f,-0.293621f, +0.420494f,0.885689f,-0.196825f, +0.303261f,0.948914f,-0.0871512f, +0.0927021f,0.987654f,-0.12628f, +0.131263f,0.975894f,-0.174359f, +0.34789f,0.928255f,-0.131586f, +0.388684f,0.916314f,-0.0964015f, +0.334363f,0.935247f,-0.116251f, +0.500896f,0.857152f,-0.119971f, +0.598542f,0.784881f,-0.160341f, +0.47847f,0.803478f,-0.354245f, +0.40143f,0.813052f,-0.421663f, +0.177917f,0.923323f,-0.340324f, +0.0444056f,0.967329f,-0.249605f, +0.182957f,0.975679f,-0.12074f, +0.298547f,0.954355f,0.00877178f, +0.20958f,0.975318f,-0.0695111f, +0.014388f,0.988042f,-0.153512f, +0.159715f,0.970499f,-0.180618f, +0.22067f,0.966546f,-0.130745f, +0.121564f,0.992499f,-0.0129668f, +-0.106928f,0.989668f,-0.0955226f, +-0.432009f,0.877086f,-0.209972f, +-0.412195f,0.894243f,-0.174429f, +-0.247992f,0.954923f,-0.163162f, +-0.103668f,0.985418f,-0.134925f, +-0.118626f,0.990103f,-0.0749928f, +-0.0679366f,0.995617f,-0.0642786f, +0.157737f,0.986207f,-0.0501565f, +-0.132086f,0.989105f,-0.064997f, +-0.385668f,0.914108f,0.125169f, +-0.489653f,0.859555f,0.146305f, +-0.451033f,0.881762f,0.138074f, +-0.379544f,0.923663f,0.0528468f, +-0.267976f,0.962936f,0.0307148f, +-0.154653f,0.986101f,0.0607174f, +-0.285519f,0.958009f,-0.0264139f, +-0.517333f,0.83498f,-0.187551f, +-0.544673f,0.81339f,-0.204273f, +-0.443255f,0.872475f,-0.205697f, +-0.212541f,0.959106f,-0.18693f, +-0.144834f,0.956217f,-0.254307f, +-0.219765f,0.912031f,-0.346271f, +-0.054698f,0.959311f,-0.277002f, +-0.0226538f,0.964658f,-0.262528f, +-0.09277f,0.980401f,-0.173803f, +-0.427129f,0.87184f,-0.2397f, +-0.458168f,0.877303f,-0.142906f, +-0.456008f,0.884075f,-0.102317f, +-0.457836f,0.873049f,-0.167843f, +-0.276231f,0.922652f,-0.269091f, +-0.0986428f,0.965162f,-0.242345f, +-0.166497f,0.944239f,-0.284061f, +-0.221568f,0.881867f,-0.416194f, +-0.047486f,0.902488f,-0.428089f, +0.159799f,0.906084f,-0.391761f, +0.154437f,0.936571f,-0.314616f, +-0.0388024f,0.943344f,-0.329539f, +0.0179311f,0.971802f,-0.235116f, +-0.0317957f,0.972144f,-0.232219f, +-0.108238f,0.982139f,-0.153906f, +-0.294778f,0.950488f,-0.098378f, +-0.31352f,0.940894f,-0.128155f, +-0.158161f,0.944104f,-0.289226f, +0.136392f,0.925587f,-0.353108f, +0.369725f,0.858345f,-0.355736f, +0.408427f,0.863142f,-0.296941f, +0.264495f,0.934318f,-0.238939f, +0.231394f,0.968992f,-0.0866717f, +0.180537f,0.980662f,-0.0755592f, +0.289728f,0.94884f,-0.125539f, +0.338081f,0.901985f,-0.268559f, +0.344111f,0.905129f,-0.249658f, +0.337921f,0.897299f,-0.284014f, +0.46242f,0.831252f,-0.308526f, +0.625979f,0.756355f,-0.18994f, +0.59942f,0.766009f,-0.232218f, +0.396651f,0.850096f,-0.346416f, +0.113051f,0.922761f,-0.368417f, +-0.0568672f,0.928859f,-0.366041f, +0.0370994f,0.962262f,-0.269583f, +0.21844f,0.959083f,-0.180121f, +0.248457f,0.958661f,-0.138705f, +0.0562715f,0.995806f,-0.072134f, +0.151796f,0.987439f,-0.0438309f, +0.213126f,0.976907f,0.0151789f, +0.0825188f,0.995896f,-0.0371849f, +-0.0293603f,0.995761f,-0.0871655f, +-0.339382f,0.929166f,-0.146528f, +-0.407976f,0.887929f,-0.212458f, +-0.300706f,0.928797f,-0.216592f, +-0.171876f,0.971688f,-0.162117f, +-0.133134f,0.975354f,-0.175954f, +-0.0436112f,0.969589f,-0.240823f, +0.0955252f,0.97277f,-0.211171f, +-0.222971f,0.974797f,-0.00733171f, +-0.502187f,0.842082f,0.19674f, +-0.406382f,0.878535f,0.251057f, +-0.403841f,0.907763f,0.113486f, +-0.295941f,0.954472f,0.0374491f, +-0.309098f,0.948653f,-0.0672074f, +-0.212726f,0.977025f,0.0130525f, +-0.199979f,0.978912f,0.0417118f, +-0.374584f,0.922961f,-0.0884893f, +-0.481248f,0.836641f,-0.261597f, +-0.419239f,0.839768f,-0.345005f, +-0.269419f,0.905569f,-0.327654f, +-0.084614f,0.973021f,-0.214643f, +-0.193736f,0.935164f,-0.296537f, +-0.190273f,0.932167f,-0.307995f, +-0.0917672f,0.986648f,-0.134552f, +-0.101923f,0.994749f,0.009248f, +-0.329353f,0.943234f,-0.0428565f, +-0.527408f,0.832391f,-0.170191f, +-0.427451f,0.895563f,-0.123505f, +-0.337252f,0.917187f,-0.212202f, +-0.254472f,0.911026f,-0.324462f, +-0.191138f,0.941948f,-0.276043f, +-0.0895186f,0.969134f,-0.229708f, +-0.115141f,0.935532f,-0.33395f, +-0.0316994f,0.925937f,-0.376346f, +0.117945f,0.920189f,-0.373285f, +0.121803f,0.934924f,-0.333287f, +-0.0046923f,0.925271f,-0.379279f, +0.0524128f,0.95708f,-0.285046f, +-0.0476851f,0.956392f,-0.288167f, +-0.185718f,0.956668f,-0.224263f, +-0.292875f,0.939689f,-0.176661f, +-0.212138f,0.937073f,-0.277295f, +0.00215598f,0.9095f,-0.415698f, +0.155074f,0.855231f,-0.494501f, +0.3372f,0.836708f,-0.431528f, +0.272726f,0.886233f,-0.374449f, +0.193484f,0.944931f,-0.263949f, +0.192169f,0.938969f,-0.285322f, +0.141281f,0.932743f,-0.331708f, +0.278032f,0.931044f,-0.236339f, +0.426985f,0.871432f,-0.241434f, +0.368362f,0.861689f,-0.349f, +0.400587f,0.825418f,-0.397762f, +0.451323f,0.785144f,-0.424095f, +0.523643f,0.765884f,-0.373121f, +0.603289f,0.753586f,-0.261056f, +0.44978f,0.832328f,-0.323928f, +0.156509f,0.915232f,-0.371289f, +-0.0704135f,0.915939f,-0.395092f, +-0.00319557f,0.926331f,-0.376696f, +0.166676f,0.911893f,-0.37506f, +0.102989f,0.962696f,-0.250219f, +-0.0387958f,0.995347f,-0.0881961f, +0.0653507f,0.992864f,-0.0997527f, +0.179449f,0.98367f,-0.0138117f, +0.177828f,0.983985f,0.012264f, +0.0645076f,0.995168f,-0.0740203f, +-0.292502f,0.938695f,-0.182468f, +-0.400433f,0.889464f,-0.220243f, +-0.318802f,0.923541f,-0.213161f, +-0.169897f,0.961934f,-0.214052f, +-0.0267051f,0.972116f,-0.232975f, +-0.00536052f,0.964395f,-0.264412f, +-0.100769f,0.988596f,-0.111905f, +-0.404303f,0.910751f,0.0840968f, +-0.594207f,0.803932f,0.0247338f, +-0.396136f,0.914658f,0.0804795f, +-0.304433f,0.952514f,0.00620435f, +-0.201276f,0.977901f,-0.0565476f, +-0.264949f,0.959844f,-0.0922019f, +-0.227773f,0.971084f,-0.0715179f, +-0.172114f,0.969698f,-0.173387f, +-0.26936f,0.945102f,-0.185006f, +-0.392685f,0.904465f,-0.166556f, +-0.407044f,0.896103f,-0.176958f, +-0.40747f,0.889993f,-0.204647f, +-0.189782f,0.978511f,-0.0806113f, +-0.0480587f,0.996223f,-0.0723184f, +-0.217275f,0.958525f,-0.184451f, +-0.306094f,0.944116f,-0.122276f, +-0.254593f,0.966558f,0.0308049f, +-0.20196f,0.972664f,0.114613f, +-0.409794f,0.899925f,-0.14901f, +-0.415034f,0.857771f,-0.303274f, +-0.263165f,0.89665f,-0.356039f, +-0.215387f,0.884962f,-0.412857f, +-0.225079f,0.887943f,-0.401119f, +-0.0773061f,0.916142f,-0.393328f, +-0.0308036f,0.905486f,-0.423257f, +-0.0371917f,0.883129f,-0.467653f, +0.0716369f,0.893813f,-0.442681f, +0.12997f,0.919319f,-0.371429f, +0.119867f,0.921216f,-0.370126f, +0.0228827f,0.984493f,-0.173923f, +-0.0834452f,0.988816f,-0.123614f, +-0.247718f,0.964917f,-0.0870125f, +-0.254118f,0.961997f,-0.0999321f, +-0.0671834f,0.977202f,-0.201403f, +0.157483f,0.940773f,-0.300243f, +0.164503f,0.92764f,-0.335294f, +0.27582f,0.929794f,-0.243733f, +0.209142f,0.946949f,-0.244024f, +0.183638f,0.949161f,-0.255677f, +0.277174f,0.906106f,-0.319605f, +0.178788f,0.896597f,-0.405153f, +0.185529f,0.860132f,-0.475134f, +0.438868f,0.800307f,-0.408538f, +0.441024f,0.788796f,-0.428135f, +0.397261f,0.791714f,-0.464083f, +0.440809f,0.77176f,-0.458338f, +0.455755f,0.768172f,-0.449666f, +0.535299f,0.762932f,-0.362477f, +0.450448f,0.842352f,-0.295872f, +0.136515f,0.937333f,-0.320579f, +-0.0637901f,0.937145f,-0.343061f, +-0.0112309f,0.935306f,-0.353662f, +0.108413f,0.948157f,-0.298738f, +-0.0660356f,0.972239f,-0.224477f, +-0.07256f,0.985988f,-0.150208f, +0.0814078f,0.980504f,-0.178842f, +0.133209f,0.989139f,-0.0621265f, +0.112681f,0.993117f,-0.0319677f, +0.144875f,0.987157f,0.0673239f, +-0.178705f,0.983714f,-0.0192655f, +-0.383305f,0.919432f,-0.0878717f, +-0.311703f,0.944518f,-0.103569f, +-0.170547f,0.974222f,-0.147663f, +-0.0584686f,0.987712f,-0.144938f, +-0.130239f,0.988008f,-0.0829397f, +-0.30957f,0.949755f,0.0461837f, +-0.426068f,0.896859f,0.118784f, +-0.505712f,0.862298f,-0.0263905f, +-0.384432f,0.913927f,-0.130189f, +-0.233817f,0.957708f,-0.167708f, +-0.196686f,0.961804f,-0.190386f, +-0.272431f,0.94059f,-0.202662f, +-0.180772f,0.950727f,-0.251872f, +-0.0565853f,0.956064f,-0.287647f, +-0.288561f,0.926858f,-0.240141f, +-0.491099f,0.856076f,-0.161104f, +-0.419638f,0.904096f,-0.0807095f, +-0.388583f,0.916169f,-0.0981701f, +-0.261262f,0.961028f,-0.0903754f, +-0.0632456f,0.997064f,0.0431658f, +-0.169715f,0.97859f,0.116442f, +-0.344027f,0.938297f,0.0352825f, +-0.314669f,0.949192f,0.00417096f, +-0.192981f,0.980434f,0.0388389f, +-0.184602f,0.98279f,-0.00683269f, +-0.246496f,0.934378f,-0.25725f, +-0.19921f,0.861846f,-0.466409f, +-0.140436f,0.848535f,-0.510163f, +-0.20288f,0.807079f,-0.554493f, +-0.11519f,0.832336f,-0.542169f, +0.00924053f,0.875455f,-0.483211f, +-0.00888073f,0.876341f,-0.48161f, +0.00107193f,0.907613f,-0.419807f, +0.021101f,0.930448f,-0.365817f, +0.0745313f,0.948396f,-0.308205f, +-0.200438f,0.964136f,-0.17397f, +-0.166231f,0.985214f,-0.0414839f, +-0.252324f,0.967639f,-0.00281073f, +-0.16447f,0.986195f,-0.0192238f, +0.0101706f,0.983613f,-0.180006f, +0.16229f,0.966979f,-0.196502f, +0.152128f,0.981833f,-0.113406f, +0.194455f,0.973444f,-0.120809f, +0.334057f,0.938492f,-0.0874058f, +0.243016f,0.928299f,-0.281434f, +0.337071f,0.885295f,-0.320369f, +0.298461f,0.876938f,-0.376698f, +0.311828f,0.819683f,-0.480502f, +0.369257f,0.755567f,-0.54108f, +0.401798f,0.784012f,-0.473163f, +0.404891f,0.784738f,-0.469309f, +0.444437f,0.782155f,-0.436702f, +0.466084f,0.794919f,-0.388419f, +0.447341f,0.805216f,-0.389247f, +0.362297f,0.887389f,-0.285098f, +0.179937f,0.962799f,-0.201595f, +0.000795301f,0.958246f,-0.285946f, +-0.0439986f,0.938528f,-0.342389f, +0.000314903f,0.959745f,-0.280871f, +-0.0200826f,0.975564f,-0.218794f, +-0.0669112f,0.936012f,-0.345551f, +0.0051897f,0.948012f,-0.318192f, +0.0134178f,0.970832f,-0.239387f, +0.036317f,0.978504f,-0.203005f, +0.0625457f,0.996542f,-0.0547064f, +-0.151505f,0.986626f,0.0601296f, +-0.354535f,0.929709f,0.0997293f, +-0.323458f,0.940866f,0.100727f, +-0.112965f,0.981029f,0.157548f, +-0.108156f,0.989168f,0.0992381f, +-0.141093f,0.979303f,0.145114f, +-0.335564f,0.940028f,0.061184f, +-0.404784f,0.910739f,0.081883f, +-0.415621f,0.909054f,0.0296628f, +-0.326024f,0.941449f,-0.0859172f, +-0.204455f,0.961807f,-0.182004f, +-0.198427f,0.946732f,-0.253624f, +-0.160629f,0.949f,-0.27129f, +-0.122223f,0.918206f,-0.376775f, +-0.161284f,0.939678f,-0.301651f, +-0.374966f,0.911783f,-0.167489f, +-0.467696f,0.856498f,-0.218336f, +-0.443475f,0.843003f,-0.304427f, +-0.385194f,0.898165f,-0.211955f, +-0.377418f,0.917998f,-0.121804f, +-0.264639f,0.962925f,0.0523651f, +-0.211739f,0.961017f,0.177801f, +-0.229995f,0.957255f,0.175401f, +-0.280377f,0.956102f,0.0851875f, +-0.20016f,0.97825f,0.0544282f, +-0.10573f,0.994257f,-0.0165441f, +0.0203896f,0.991211f,-0.130708f, +-0.0236073f,0.94884f,-0.314873f, +-0.0941765f,0.92043f,-0.379394f, +-0.167941f,0.897458f,-0.407879f, +-0.187085f,0.877031f,-0.442511f, +-0.0729267f,0.89358f,-0.44294f, +-0.0781669f,0.903365f,-0.421688f, +-0.0898224f,0.927661f,-0.362461f, +-0.0306254f,0.944826f,-0.326139f, +0.00767666f,0.952077f,-0.305762f, +-0.288656f,0.939633f,-0.183761f, +-0.235623f,0.952993f,-0.190489f, +-0.273085f,0.931861f,-0.238874f, +-0.0949222f,0.974332f,-0.204123f, +0.149266f,0.955245f,-0.255397f, +0.0666117f,0.957576f,-0.280376f, +0.127398f,0.979355f,-0.156952f, +0.209457f,0.954497f,-0.21228f, +0.367092f,0.913409f,-0.175864f, +0.415953f,0.865553f,-0.278928f, +0.34245f,0.832959f,-0.434635f, +0.340781f,0.830404f,-0.440793f, +0.395293f,0.802521f,-0.446882f, +0.405952f,0.792834f,-0.454552f, +0.385024f,0.788348f,-0.479858f, +0.365166f,0.783008f,-0.503539f, +0.371074f,0.838688f,-0.39863f, +0.42233f,0.859897f,-0.286732f, +0.440629f,0.882917f,-0.162183f, +0.299827f,0.949298f,-0.0945333f, +0.141695f,0.979344f,-0.144247f, +0.039666f,0.992248f,-0.117771f, +0.021245f,0.997585f,-0.0661304f, +-0.0594041f,0.983411f,-0.17139f, +0.0611812f,0.981318f,-0.182404f, +0.0186916f,0.932529f,-0.360611f, +-0.0300853f,0.91754f,-0.396504f, +-0.00135599f,0.922081f,-0.386995f, +-0.0351954f,0.956784f,-0.28866f, +-0.108108f,0.976189f,-0.188065f, +-0.279221f,0.950183f,-0.13852f, +-0.398641f,0.914814f,-0.0648175f, +-0.383626f,0.922668f,-0.0389249f, +-0.188191f,0.977628f,0.0939533f, +-0.083441f,0.973103f,0.21473f, +-0.0631642f,0.980575f,0.185698f, +-0.269017f,0.963031f,0.0141438f, +-0.4376f,0.89917f,-0.000301879f, +-0.339736f,0.940513f,0.00384959f, +-0.235638f,0.967987f,-0.0864624f, +-0.0773761f,0.988655f,-0.128744f, +-0.0852549f,0.968269f,-0.234917f, +-0.114948f,0.939941f,-0.3214f, +-0.156571f,0.928217f,-0.337488f, +-0.29563f,0.924155f,-0.241951f, +-0.401682f,0.899225f,-0.173337f, +-0.351799f,0.915761f,-0.193956f, +-0.391021f,0.882077f,-0.262761f, +-0.525453f,0.810665f,-0.258305f, +-0.504092f,0.859496f,-0.0846014f, +-0.362403f,0.931317f,0.0362275f, +-0.27912f,0.954258f,0.107159f, +-0.207619f,0.961802f,0.178414f, +-0.228638f,0.970139f,0.0809669f, +-0.12077f,0.992669f,0.00484841f, +0.0304882f,0.99448f,-0.100401f, +0.0674392f,0.979801f,-0.18826f, +0.0351304f,0.9953f,-0.090241f, +-0.0704736f,0.995263f,-0.0669708f, +-0.129706f,0.981562f,-0.1404f, +-0.122442f,0.956888f,-0.263387f, +-0.0356665f,0.922731f,-0.38379f, +-0.0454106f,0.896226f,-0.441267f, +-0.0870705f,0.865568f,-0.493164f, +-0.0312927f,0.854755f,-0.518087f, +-0.0110302f,0.85359f,-0.520829f, +-0.135251f,0.990349f,0.0302781f, +-0.120846f,0.991438f,-0.049458f, +-0.156404f,0.974115f,-0.163209f, +-0.121903f,0.951948f,-0.280952f, +0.0966131f,0.959924f,-0.263082f, +0.0624341f,0.96714f,-0.24646f, +0.0557469f,0.94749f,-0.31489f, +0.245712f,0.928812f,-0.27737f, +0.339947f,0.895451f,-0.28741f, +0.505833f,0.828917f,-0.238808f, +0.492153f,0.815708f,-0.303985f, +0.325713f,0.824266f,-0.463138f, +0.357884f,0.8174f,-0.451416f, +0.423911f,0.828952f,-0.364879f, +0.465983f,0.818349f,-0.3364f, +0.340136f,0.856815f,-0.387524f, +0.250037f,0.902839f,-0.349804f, +0.270063f,0.93551f,-0.227788f, +0.268197f,0.961943f,0.0523086f, +0.314452f,0.921737f,0.226982f, +0.230483f,0.962611f,0.142328f, +-0.0337231f,0.996519f,0.0762456f, +-0.0478467f,0.987694f,0.1489f, +0.0777224f,0.977564f,0.195776f, +0.137813f,0.987309f,0.0789204f, +0.213773f,0.976881f,-0.00209812f, +0.0678985f,0.982243f,-0.174896f, +-0.118448f,0.956882f,-0.26523f, +-0.229961f,0.9707f,-0.0697049f, +-0.144208f,0.98561f,0.0881926f, +-0.198479f,0.979386f,0.0375393f, +-0.401292f,0.909987f,-0.104347f, +-0.400254f,0.91005f,-0.107726f, +-0.346067f,0.932825f,-0.100374f, +-0.193125f,0.981161f,0.00517742f, +-0.0334943f,0.995589f,0.0876359f, +-0.09901f,0.987334f,0.12397f, +-0.411919f,0.909058f,-0.0627387f, +-0.33988f,0.934279f,-0.107727f, +-0.163445f,0.980417f,-0.109859f, +-0.094399f,0.976137f,-0.195566f, +-0.0281723f,0.98965f,-0.140708f, +-0.0765865f,0.985816f,-0.149338f, +-0.168645f,0.974838f,-0.145776f, +-0.316363f,0.934327f,-0.164156f, +-0.429172f,0.879196f,-0.206943f, +-0.428946f,0.898522f,-0.0930795f, +-0.397223f,0.909843f,0.12f, +-0.511164f,0.850782f,0.12199f, +-0.553545f,0.831305f,-0.0501975f, +-0.425265f,0.901367f,-0.0817687f, +-0.377377f,0.925701f,-0.0257517f, +-0.226427f,0.969468f,0.0941363f, +-0.0709665f,0.993431f,0.0897693f, +-0.0343935f,0.997803f,-0.0566276f, +0.136725f,0.981098f,-0.136942f, +-0.000388307f,0.974615f,-0.223888f, +-0.143125f,0.988947f,-0.0387096f, +-0.0654844f,0.993475f,0.0933713f, +0.0107967f,0.999865f,0.0124207f, +0.0463655f,0.990074f,-0.132676f, +0.111072f,0.958636f,-0.262069f, +0.052211f,0.918497f,-0.391967f, +0.014765f,0.869476f,-0.493754f, +-0.00446669f,0.826302f,-0.56321f, +-0.00312167f,0.829643f,-0.558286f, +-0.205328f,0.971118f,-0.121531f, +-0.107279f,0.990692f,-0.0837913f, +-0.0655817f,0.993795f,-0.089834f, +-0.0669083f,0.985851f,-0.15369f, +0.0877486f,0.98832f,-0.124596f, +0.169572f,0.978484f,-0.117533f, +0.160152f,0.950603f,-0.265903f, +0.208233f,0.926f,-0.314903f, +0.349792f,0.904675f,-0.243329f, +0.449891f,0.870303f,-0.200426f, +0.566229f,0.816333f,-0.113956f, +0.48817f,0.833849f,-0.257655f, +0.363235f,0.831342f,-0.420631f, +0.324206f,0.826771f,-0.459718f, +0.3997f,0.840833f,-0.365021f, +0.353025f,0.906211f,-0.232714f, +0.219616f,0.962891f,-0.156874f, +0.0720827f,0.994934f,-0.0700696f, +0.045678f,0.994046f,0.0989266f, +0.213575f,0.964796f,0.153475f, +0.24905f,0.930442f,0.268798f, +0.0777133f,0.945053f,0.317546f, +-0.128028f,0.977296f,0.168824f, +0.0217263f,0.951068f,0.308215f, +0.207313f,0.918764f,0.335998f, +0.282654f,0.924456f,0.255906f, +0.201157f,0.96204f,0.184429f, +-0.110233f,0.981395f,0.157205f, +-0.355659f,0.909169f,0.216606f, +-0.21295f,0.947904f,0.236917f, +-0.107393f,0.959263f,0.261306f, +-0.278087f,0.947596f,0.157257f, +-0.393558f,0.918794f,0.0304824f, +-0.302068f,0.952957f,-0.0250724f, +-0.213276f,0.970666f,-0.110997f, +-0.166999f,0.978773f,-0.118807f, +-0.142246f,0.989828f,0.00258048f, +-0.283745f,0.958854f,0.0093455f, +-0.336957f,0.941016f,-0.0308147f, +-0.113565f,0.9931f,-0.02925f, +-0.0231129f,0.991621f,-0.127093f, +-0.107284f,0.981887f,-0.156166f, +-0.121783f,0.990389f,-0.0655664f, +-0.179469f,0.983757f,0.00373427f, +-0.267261f,0.963295f,0.0251965f, +-0.419417f,0.907445f,0.0251735f, +-0.582729f,0.80835f,0.0836507f, +-0.554692f,0.78035f,0.288741f, +-0.368624f,0.840437f,0.397218f, +-0.336016f,0.929619f,0.151335f, +-0.379048f,0.912637f,-0.153022f, +-0.410461f,0.89244f,-0.187275f, +-0.310698f,0.938768f,-0.148932f, +-0.0772428f,0.993562f,-0.0828798f, +0.0559112f,0.996518f,-0.0618564f, +0.218481f,0.971621f,-0.090653f, +0.0070055f,0.988587f,-0.150488f, +-0.287385f,0.949521f,-0.125778f, +-0.0963797f,0.992515f,-0.0749989f, +0.0940601f,0.994076f,-0.0544632f, +0.147534f,0.985277f,-0.0863886f, +0.20617f,0.964455f,-0.165287f, +0.228919f,0.941159f,-0.248628f, +0.142687f,0.889558f,-0.433967f, +0.0525074f,0.86193f,-0.5043f, +-0.0400559f,0.852931f,-0.520485f, +-0.12929f,0.965503f,-0.226025f, +-0.12119f,0.954637f,-0.271994f, +-0.0677494f,0.970158f,-0.232815f, +-0.0658176f,0.978188f,-0.197017f, +0.00868199f,0.985201f,-0.171183f, +0.183883f,0.977449f,-0.103828f, +0.283397f,0.948052f,-0.144513f, +0.244002f,0.935244f,-0.256481f, +0.251457f,0.918413f,-0.305429f, +0.421894f,0.885288f,-0.195626f, +0.539016f,0.82675f,-0.161076f, +0.595125f,0.795068f,-0.117014f, +0.542945f,0.81823f,-0.188971f, +0.36087f,0.878337f,-0.313523f, +0.249934f,0.94591f,-0.206849f, +0.203095f,0.978645f,0.0317209f, +0.0808087f,0.992314f,0.0937131f, +0.015528f,0.990219f,0.138653f, +0.01799f,0.994881f,0.09944f, +0.195411f,0.975412f,0.101915f, +0.0694818f,0.977162f,0.200816f, +0.0667035f,0.917371f,0.392404f, +-0.00815505f,0.942331f,0.334582f, +-0.124548f,0.965608f,0.228228f, +0.172601f,0.943034f,0.284421f, +0.392995f,0.877789f,0.273937f, +0.148864f,0.962548f,0.226586f, +-0.160978f,0.90924f,0.383887f, +-0.338041f,0.865118f,0.370538f, +-0.158685f,0.913484f,0.374654f, +-0.085827f,0.934088f,0.346573f, +-0.160284f,0.956319f,0.244467f, +-0.286424f,0.955431f,0.0715057f, +-0.239888f,0.970684f,0.0150701f, +-0.160609f,0.986985f,0.00807186f, +-0.109896f,0.993313f,-0.0353894f, +-0.197211f,0.969041f,-0.148551f, +-0.329877f,0.939761f,-0.0896172f, +-0.308832f,0.948199f,-0.0744408f, +-0.098416f,0.980296f,-0.171271f, +0.0274733f,0.990192f,-0.136989f, +-0.0841565f,0.99088f,-0.105235f, +-0.256459f,0.960709f,-0.106143f, +-0.249667f,0.95978f,0.128406f, +-0.305999f,0.931391f,0.197168f, +-0.484241f,0.852569f,0.196565f, +-0.610379f,0.753144f,0.245383f, +-0.585787f,0.783089f,0.208867f, +-0.367515f,0.91758f,0.151588f, +-0.0411995f,0.989239f,0.140389f, +-0.109078f,0.987353f,-0.115051f, +-0.380949f,0.866858f,-0.321615f, +-0.342318f,0.88779f,-0.307647f, +-0.12792f,0.955198f,-0.266896f, +0.0278952f,0.967981f,-0.249469f, +0.188442f,0.9544f,-0.231539f, +0.052008f,0.978364f,-0.200246f, +-0.225418f,0.931417f,-0.285742f, +-0.134566f,0.926089f,-0.352493f, +0.0345745f,0.959769f,-0.278653f, +0.174695f,0.953806f,-0.24441f, +0.227273f,0.930386f,-0.287627f, +0.325716f,0.918321f,-0.224934f, +0.329407f,0.888239f,-0.32019f, +0.0905336f,0.875389f,-0.474867f, +-0.0331275f,0.86706f,-0.497102f, +0.0288126f,0.978255f,-0.205394f, +-0.0838329f,0.954569f,-0.285956f, +-0.140323f,0.954698f,-0.262415f, +-0.112432f,0.972197f,-0.205408f, +0.0092799f,0.981035f,-0.193608f, +0.142017f,0.962963f,-0.229203f, +0.310781f,0.933484f,-0.17895f, +0.359578f,0.919553f,-0.158514f, +0.334745f,0.907674f,-0.253129f, +0.345814f,0.873436f,-0.342815f, +0.500723f,0.821828f,-0.271799f, +0.538977f,0.812424f,-0.22242f, +0.523422f,0.839245f,-0.147303f, +0.340441f,0.940266f,0.000412888f, +0.0152874f,0.997305f,0.0717554f, +0.0533145f,0.966764f,0.250049f, +0.112464f,0.954457f,0.276338f, +0.109039f,0.955163f,0.275271f, +0.0445431f,0.979533f,0.196291f, +0.165433f,0.962373f,0.21557f, +-0.0715535f,0.977821f,0.196841f, +-0.0891149f,0.939351f,0.331178f, +0.117094f,0.910023f,0.397676f, +0.030807f,0.968216f,0.248212f, +0.157233f,0.982334f,0.101481f, +0.403254f,0.903723f,0.143774f, +0.0482774f,0.97679f,0.208689f, +-0.297552f,0.88274f,0.363639f, +-0.30014f,0.861944f,0.408619f, +-0.211374f,0.886111f,0.412466f, +-0.03076f,0.854928f,0.517834f, +0.0282722f,0.878122f,0.477601f, +-0.13332f,0.93673f,0.32367f, +-0.256519f,0.940042f,0.224764f, +-0.183801f,0.953616f,0.238397f, +-0.0194462f,0.968434f,0.24851f, +-0.0907191f,0.988269f,0.122863f, +-0.322189f,0.946234f,-0.028899f, +-0.20601f,0.965456f,-0.159543f, +-0.0654489f,0.973414f,-0.219504f, +-0.113732f,0.990052f,-0.0828341f, +-0.135223f,0.986029f,0.0972711f, +-0.295266f,0.944373f,0.144834f, +-0.450404f,0.860579f,0.237781f, +-0.30004f,0.881766f,0.363958f, +-0.429075f,0.860577f,0.274411f, +-0.624789f,0.771784f,0.118272f, +-0.497638f,0.864372f,0.0722275f, +-0.313601f,0.946808f,-0.0721819f, +-0.057809f,0.993544f,-0.0976184f, +0.13458f,0.987765f,-0.078798f, +-0.184662f,0.92514f,-0.331688f, +-0.385787f,0.812528f,-0.436996f, +-0.187957f,0.911737f,-0.36525f, +0.0316981f,0.954599f,-0.296202f, +0.147926f,0.956328f,-0.252101f, +0.104858f,0.974711f,-0.197342f, +-0.0836115f,0.931387f,-0.354298f, +-0.111379f,0.87594f,-0.469386f, +-0.0328315f,0.880204f,-0.473458f, +0.162025f,0.887756f,-0.430856f, +0.205253f,0.903446f,-0.376373f, +0.237481f,0.902569f,-0.359125f, +0.385116f,0.876359f,-0.289276f, +0.249914f,0.920198f,-0.301294f, +0.0143883f,0.906805f,-0.421304f, +0.1198f,0.98226f,-0.14427f, +-0.009516f,0.980934f,-0.194106f, +-0.149357f,0.951394f,-0.269335f, +-0.133007f,0.936454f,-0.324597f, +0.034566f,0.948692f,-0.314306f, +0.178184f,0.929444f,-0.323086f, +0.219637f,0.922638f,-0.317015f, +0.296463f,0.935411f,-0.192652f, +0.416664f,0.902617f,-0.108048f, +0.442812f,0.876638f,-0.188209f, +0.465688f,0.849444f,-0.248152f, +0.511879f,0.84424f,-0.158868f, +0.360617f,0.931627f,-0.0450278f, +0.228988f,0.955033f,0.188354f, +-0.00280316f,0.974776f,0.223168f, +0.00899431f,0.980078f,0.198407f, +0.0845579f,0.975657f,0.202347f, +0.0600237f,0.962271f,0.265389f, +0.0344627f,0.950379f,0.309181f, +0.173636f,0.921696f,0.346881f, +-0.00190385f,0.960894f,0.276909f, +-0.186383f,0.97431f,0.126416f, +0.101162f,0.98048f,0.168596f, +0.181976f,0.961147f,0.207559f, +0.220019f,0.957024f,0.188939f, +0.310192f,0.917199f,0.250053f, +-0.02225f,0.932984f,0.359229f, +-0.395015f,0.837639f,0.377259f, +-0.325443f,0.861588f,0.389554f, +-0.255559f,0.880464f,0.39934f, +-0.151471f,0.886274f,0.437693f, +-0.0211154f,0.863177f,0.50446f, +0.00094362f,0.808505f,0.588488f, +-0.114242f,0.850647f,0.513176f, +-0.11027f,0.888828f,0.444776f, +-0.0310984f,0.926772f,0.374335f, +0.036991f,0.899416f,0.435525f, +-0.0593828f,0.941327f,0.33223f, +-0.108182f,0.990534f,0.0844942f, +-0.153469f,0.985899f,0.066708f, +-0.257292f,0.956946f,0.134368f, +-0.339432f,0.926138f,0.164482f, +-0.361227f,0.853531f,0.3755f, +-0.433268f,0.811828f,0.391425f, +-0.292152f,0.883075f,0.367186f, +-0.254971f,0.931997f,0.257627f, +-0.51111f,0.857028f,-0.0653379f, +-0.482419f,0.859823f,-0.167263f, +-0.240122f,0.964988f,-0.105544f, +-0.0637549f,0.987476f,-0.144314f, +0.14266f,0.980144f,-0.137714f, +0.096896f,0.982614f,-0.158371f, +-0.287298f,0.856944f,-0.42791f, +-0.299829f,0.819408f,-0.488542f, +-0.0881013f,0.911449f,-0.40187f, +0.0509938f,0.949808f,-0.308649f, +0.13334f,0.962273f,-0.237174f, +0.0865622f,0.946427f,-0.311099f, +0.0118172f,0.924665f,-0.380599f, +-0.0178448f,0.910652f,-0.412789f, +0.073892f,0.906856f,-0.414913f, +0.15114f,0.90612f,-0.395099f, +0.255577f,0.878518f,-0.403593f, +0.278013f,0.865146f,-0.417411f, +0.239832f,0.923443f,-0.299555f, +0.188412f,0.940744f,-0.281961f, +-0.0158305f,0.982567f,-0.185231f, +0.0666038f,0.988337f,-0.136945f, +-0.0538402f,0.959334f,-0.277092f, +-0.0212127f,0.945816f,-0.324009f, +-0.0150833f,0.913689f,-0.406133f, +0.15601f,0.93774f,-0.310331f, +0.182702f,0.936618f,-0.298942f, +0.189924f,0.93758f,-0.29133f, +0.333869f,0.91329f,-0.233307f, +0.499532f,0.857573f,-0.122619f, +0.46551f,0.873216f,-0.144201f, +0.373694f,0.926999f,0.0320189f, +0.203779f,0.950539f,0.234414f, +0.13831f,0.928366f,0.344974f, +0.0515931f,0.949665f,0.30899f, +0.0310079f,0.96445f,0.262439f, +0.0853119f,0.968829f,0.232577f, +-0.00103764f,0.981733f,0.190261f, +-0.00365072f,0.967667f,0.252206f, +0.10066f,0.945677f,0.309134f, +0.178572f,0.914026f,0.364237f, +-0.0213985f,0.991455f,0.128684f, +0.0498313f,0.996519f,0.0668339f, +0.120586f,0.983203f,0.137006f, +0.0910496f,0.981472f,0.16859f, +0.13401f,0.919805f,0.368783f, +-0.0801133f,0.861028f,0.502208f, +-0.337717f,0.841946f,0.420801f, +-0.27627f,0.878916f,0.388821f, +-0.2301f,0.91025f,0.344237f, +-0.177792f,0.940411f,0.289857f, +-0.131507f,0.928729f,0.346652f, +-0.0961971f,0.892019f,0.441642f, +-0.0639687f,0.872394f,0.4846f, +-0.0102449f,0.879124f,0.476482f, +-0.00257342f,0.917704f,0.397258f, +-0.0554909f,0.910659f,0.409416f, +0.0291401f,0.896118f,0.442858f, +0.0220451f,0.91331f,0.406668f, +-0.138595f,0.921526f,0.362741f, +-0.186305f,0.924786f,0.331755f, +-0.347011f,0.903153f,0.25278f, +-0.513046f,0.817508f,0.261656f, +-0.445268f,0.835978f,0.320745f, +-0.177443f,0.933005f,0.313074f, +-0.0397144f,0.982015f,0.184579f, +-0.223543f,0.974128f,-0.0332155f, +-0.4666f,0.831165f,-0.302406f, +-0.335541f,0.890675f,-0.306773f, +-0.0318096f,0.973987f,-0.224358f, +0.0953506f,0.970682f,-0.220646f, +0.134482f,0.984534f,-0.112281f, +-0.0162953f,0.992479f,-0.121323f, +-0.284204f,0.902721f,-0.322992f, +-0.211997f,0.906314f,-0.365585f, +-0.016875f,0.958349f,-0.285101f, +0.129044f,0.959618f,-0.24996f, +0.151996f,0.928771f,-0.338057f, +-0.0199776f,0.904327f,-0.426372f, +-0.0559071f,0.940256f,-0.335846f, +0.108952f,0.945546f,-0.306712f, +0.215589f,0.905767f,-0.364838f, +0.293281f,0.878158f,-0.377921f, +0.279356f,0.877367f,-0.390112f, +0.127912f,0.886694f,-0.444312f, +0.153161f,0.902051f,-0.403541f, +-0.0890667f,0.969622f,-0.227816f, +0.0791521f,0.98141f,-0.174841f, +0.0791423f,0.971591f,-0.22304f, +0.0168825f,0.939671f,-0.341662f, +-0.00465273f,0.922224f,-0.386629f, +0.0341103f,0.949158f,-0.312946f, +0.243022f,0.94331f,-0.226069f, +0.218985f,0.910646f,-0.350386f, +0.282576f,0.88974f,-0.358487f, +0.398347f,0.877162f,-0.268155f, +0.330147f,0.941044f,-0.073754f, +0.178397f,0.970659f,0.16123f, +0.0525065f,0.954596f,0.293241f, +0.0945297f,0.914894f,0.392472f, +0.13661f,0.905749f,0.401193f, +0.0406243f,0.947359f,0.317587f, +0.163762f,0.925717f,0.340926f, +0.040504f,0.970394f,0.238108f, +-0.0543453f,0.975142f,0.214812f, +2.68223e-005f,0.976435f,0.215812f, +0.209407f,0.932778f,0.293383f, +0.184464f,0.966229f,0.179928f, +-0.0113387f,0.999016f,0.0428878f, +0.079177f,0.981677f,0.173323f, +0.0362262f,0.968187f,0.24759f, +-0.0723427f,0.93572f,0.345245f, +-0.135834f,0.890086f,0.435082f, +-0.264248f,0.873681f,0.408479f, +-0.262216f,0.89706f,0.355706f, +-0.164052f,0.919196f,0.358002f, +-0.167176f,0.924403f,0.342829f, +-0.200682f,0.904947f,0.375229f, +-0.158624f,0.899685f,0.406701f, +-0.112022f,0.891533f,0.438886f, +-0.00921475f,0.869473f,0.493894f, +0.0802624f,0.881225f,0.465833f, +-0.0504548f,0.922517f,0.382645f, +-0.0121989f,0.918687f,0.394797f, +0.0440736f,0.891185f,0.451494f, +-0.0756766f,0.900734f,0.427728f, +-0.202037f,0.909488f,0.363335f, +-0.295423f,0.866009f,0.403428f, +-0.471319f,0.827048f,0.30635f, +-0.443758f,0.874939f,0.193806f, +-0.125026f,0.977756f,0.168412f, +0.0442668f,0.987172f,0.153403f, +-0.0338798f,0.987768f,0.152205f, +-0.259589f,0.965039f,-0.0362462f, +-0.35784f,0.903258f,-0.236805f, +-0.167942f,0.956248f,-0.239554f, +0.0460995f,0.994911f,-0.0895878f, +-0.00166787f,0.99811f,-0.0614342f, +-0.0336402f,0.998923f,0.0319432f, +-0.139942f,0.989786f,0.0271849f, +-0.21913f,0.971861f,-0.0864193f, +-0.083914f,0.990307f,-0.110685f, +0.180721f,0.971397f,-0.154041f, +0.29639f,0.913592f,-0.278393f, +0.0452233f,0.94418f,-0.326312f, +-0.13463f,0.924181f,-0.357441f, +0.11753f,0.929423f,-0.349798f, +0.238754f,0.909243f,-0.340989f, +0.272577f,0.899491f,-0.341494f, +0.343945f,0.879082f,-0.330025f, +0.202726f,0.889055f,-0.410468f, +0.0880936f,0.876474f,-0.473321f, +-0.000386659f,0.989518f,-0.144407f, +-0.0138532f,0.983228f,-0.181856f, +0.165824f,0.98552f,-0.0353913f, +0.196669f,0.963831f,-0.179867f, +0.00115533f,0.93443f,-0.356144f, +-0.0579019f,0.928374f,-0.36711f, +0.234096f,0.913194f,-0.333581f, +0.311749f,0.881031f,-0.355805f, +0.243154f,0.902483f,-0.355529f, +0.214274f,0.956658f,-0.197209f, +0.120355f,0.990537f,0.0659672f, +0.0219689f,0.979298f,0.201227f, +-0.0108785f,0.963809f,0.266373f, +-0.016985f,0.957116f,0.289205f, +0.15437f,0.922679f,0.353316f, +0.0959731f,0.93811f,0.332776f, +0.138832f,0.935317f,0.325434f, +0.133758f,0.941295f,0.309956f, +-0.00148525f,0.972503f,0.232885f, +0.00817406f,0.979885f,0.199396f, +0.180862f,0.960033f,0.213602f, +0.330054f,0.924212f,0.192085f, +0.039978f,0.994865f,0.0929833f, +-0.118088f,0.976595f,0.179768f, +-0.100092f,0.923425f,0.370498f, +-0.117559f,0.88568f,0.449166f, +-0.170937f,0.879572f,0.443997f, +-0.244838f,0.844603f,0.47613f, +-0.196312f,0.844324f,0.498577f, +-0.188529f,0.85759f,0.478535f, +-0.188501f,0.839785f,0.509145f, +-0.185899f,0.842964f,0.50483f, +-0.154293f,0.872091f,0.464382f, +-0.115474f,0.894542f,0.431811f, +-0.0887035f,0.930393f,0.35567f, +0.133188f,0.884773f,0.446583f, +0.0484666f,0.90226f,0.42846f, +-0.0427135f,0.946807f,0.318954f, +-0.0239721f,0.952831f,0.302554f, +-0.0435714f,0.926502f,0.373759f, +-0.182333f,0.899048f,0.398079f, +-0.323546f,0.846433f,0.422929f, +-0.334412f,0.852971f,0.40076f, +-0.325744f,0.921829f,0.210052f, +-0.140593f,0.980752f,0.135497f, +-0.000911154f,0.974293f,0.225285f, +-0.0250989f,0.969759f,0.242771f, +-0.116671f,0.973198f,0.198177f, +-0.222025f,0.967605f,0.12019f, +-0.252573f,0.967519f,-0.0106675f, +-0.0639595f,0.99456f,0.0822198f, +0.0427289f,0.995551f,0.0839736f, +-0.103724f,0.994603f,-0.00239601f, +-0.143088f,0.981404f,0.127957f, +-0.10974f,0.986771f,0.119333f, +0.0104156f,0.996494f,-0.083017f, +0.293943f,0.936018f,-0.193565f, +0.319276f,0.921897f,-0.219472f, +0.0381885f,0.98033f,-0.193638f, +-0.0675527f,0.960756f,-0.269042f, +0.11652f,0.926645f,-0.357425f, +0.2292f,0.915276f,-0.331265f, +0.30797f,0.891339f,-0.33267f, +0.348546f,0.853103f,-0.38824f, +0.249601f,0.874176f,-0.416553f, +0.18778f,0.887174f,-0.421499f, +0.122671f,0.990262f,-0.0658213f, +-0.0435566f,0.992887f,-0.11081f, +0.0494387f,0.998572f,0.0202637f, +0.34574f,0.93458f,0.0838063f, +0.205482f,0.970541f,-0.125808f, +0.00807532f,0.928646f,-0.370879f, +0.212354f,0.896105f,-0.389746f, +0.285287f,0.924061f,-0.254407f, +0.130923f,0.978283f,-0.160691f, +-0.0198715f,0.999555f,-0.0222427f, +-0.0516664f,0.987583f,0.148362f, +-0.0269196f,0.97761f,0.208697f, +-0.00903021f,0.979554f,0.200976f, +-0.00834551f,0.993685f,0.111894f, +0.110842f,0.987362f,0.113269f, +0.106874f,0.976878f,0.185167f, +0.141547f,0.968321f,0.205716f, +0.174972f,0.958256f,0.22612f, +0.054828f,0.97071f,0.233913f, +0.0299952f,0.981566f,0.188753f, +0.154988f,0.980787f,0.118472f, +0.340268f,0.925521f,0.166219f, +0.0136729f,0.972695f,0.231683f, +-0.270301f,0.899629f,0.342937f, +-0.212226f,0.859098f,0.465736f, +-0.140535f,0.846284f,0.513861f, +-0.175101f,0.833937f,0.523345f, +-0.270288f,0.821688f,0.501769f, +-0.282918f,0.830124f,0.48047f, +-0.174774f,0.812594f,0.556008f, +-0.140913f,0.828898f,0.541361f, +-0.117146f,0.878471f,0.463211f, +-0.0728003f,0.920501f,0.383899f, +-0.00293246f,0.948861f,0.315679f, +-0.025836f,0.967046f,0.253289f, +-0.00528251f,0.957042f,0.289901f, +0.088837f,0.914901f,0.393781f, +0.103014f,0.924276f,0.367561f, +0.00437406f,0.95596f,0.293464f, +-0.1442f,0.952275f,0.269032f, +-0.25396f,0.922416f,0.290951f, +-0.3894f,0.883133f,0.261618f, +-0.283615f,0.906122f,0.313857f, +-0.158058f,0.930594f,0.330171f, +-0.134893f,0.961854f,0.237993f, +-0.0720522f,0.980808f,0.181173f, +0.0349752f,0.985618f,0.16533f, +-0.115886f,0.987377f,0.107965f, +-0.182211f,0.968171f,0.171592f, +-0.154769f,0.971197f,0.181169f, +-0.0833304f,0.991727f,0.0976435f, +0.136344f,0.989699f,0.0436644f, +-0.106946f,0.993768f,-0.0314277f, +-0.261215f,0.963441f,0.0595659f, +0.0120329f,0.999596f,0.0257635f, +0.254582f,0.953185f,-0.163178f, +0.299581f,0.899014f,-0.319413f, +0.266729f,0.9307f,-0.250307f, +0.0579078f,0.977779f,-0.201483f, +0.0590491f,0.968354f,-0.242494f, +0.196887f,0.912909f,-0.357536f, +0.211047f,0.877381f,-0.430885f, +0.301745f,0.869054f,-0.39204f, +0.422629f,0.852977f,-0.306291f, +0.252055f,0.896241f,-0.364994f, +0.158615f,0.91987f,-0.35872f, +0.099088f,0.991841f,-0.0802016f, +-0.0649468f,0.996188f,-0.0582405f, +-0.09006f,0.995865f,-0.0119566f, +0.299186f,0.949686f,0.0926523f, +0.448961f,0.886032f,0.115674f, +0.225408f,0.968479f,-0.106019f, +0.110364f,0.983262f,-0.144965f, +0.0982296f,0.994337f,0.0405443f, +0.03386f,0.98307f,0.180072f, +-0.0548904f,0.982813f,0.176255f, +-0.131535f,0.986412f,0.0984329f, +-0.0772354f,0.9803f,0.181787f, +0.0556449f,0.958844f,0.278429f, +0.08308f,0.969903f,0.228882f, +0.0990101f,0.980512f,0.169685f, +0.044494f,0.989611f,0.136713f, +0.124145f,0.981303f,0.14708f, +0.126925f,0.98249f,0.136391f, +0.0289993f,0.988064f,0.151292f, +0.146433f,0.982737f,0.113073f, +0.210582f,0.977005f,-0.0334257f, +0.179552f,0.980748f,0.0767724f, +-0.0986728f,0.925956f,0.364513f, +-0.333893f,0.835984f,0.435484f, +-0.316161f,0.849609f,0.422146f, +-0.184942f,0.836066f,0.516517f, +-0.165011f,0.827696f,0.536368f, +-0.1919f,0.849729f,0.491054f, +-0.260791f,0.881445f,0.393754f, +-0.244518f,0.891442f,0.3815f, +-0.101674f,0.91665f,0.386543f, +-0.0135975f,0.926806f,0.375295f, +0.0383624f,0.948469f,0.31454f, +0.0311937f,0.973858f,0.225008f, +-0.0712105f,0.966505f,0.24657f, +-0.0567001f,0.939446f,0.337973f, +0.028793f,0.937988f,0.345471f, +0.0944493f,0.922855f,0.373388f, +0.0339618f,0.928396f,0.370037f, +-0.0877384f,0.940895f,0.327137f, +-0.18953f,0.934542f,0.301182f, +-0.32638f,0.91712f,0.22884f, +-0.359606f,0.925931f,0.115484f, +-0.250341f,0.958991f,0.132911f, +-0.0188851f,0.981881f,0.188556f, +0.0444017f,0.992958f,0.109832f, +0.0292244f,0.992914f,0.115188f, +-0.0809364f,0.975181f,0.206087f, +-0.271318f,0.947628f,0.168488f, +-0.147667f,0.972329f,0.181027f, +0.0428511f,0.996597f,0.0704105f, +0.186761f,0.979997f,-0.0687482f, +-0.111624f,0.989428f,-0.0925828f, +-0.210799f,0.973161f,-0.0923101f, +0.115063f,0.969975f,-0.214262f, +0.376036f,0.900817f,-0.217086f, +0.373114f,0.884398f,-0.280403f, +0.226074f,0.905778f,-0.358407f, +0.0100432f,0.919347f,-0.393319f, +0.0770135f,0.93428f,-0.348124f, +0.321395f,0.895396f,-0.308175f, +0.278274f,0.88968f,-0.361984f, +0.208857f,0.897848f,-0.387619f, +0.325776f,0.898072f,-0.295527f, +0.259741f,0.94586f,-0.194637f, +0.133572f,0.977992f,-0.160282f, +-0.0277257f,0.992037f,-0.122857f, +-0.0924217f,0.994571f,-0.0478129f, +-0.116438f,0.990661f,-0.0709396f, +0.19557f,0.979919f,-0.0388625f, +0.381806f,0.908869f,0.167871f, +0.299282f,0.900933f,0.314247f, +0.0638964f,0.963274f,0.260808f, +-0.0731879f,0.961388f,0.265284f, +0.00180295f,0.933351f,0.35896f, +0.0655899f,0.939022f,0.337544f, +-0.0612046f,0.96894f,0.239602f, +-0.166052f,0.961913f,0.217141f, +-0.0893118f,0.965245f,0.245614f, +0.0820047f,0.941494f,0.326902f, +0.146932f,0.937808f,0.314527f, +0.136588f,0.939539f,0.314023f, +0.166222f,0.964584f,0.204811f, +0.17109f,0.976368f,0.132039f, +0.0961069f,0.992806f,0.0714098f, +0.21778f,0.975905f,-0.013487f, +0.251597f,0.967828f,-0.00281592f, +-0.0966896f,0.992674f,0.0724564f, +-0.377842f,0.87018f,0.316262f, +-0.323773f,0.853386f,0.408537f, +-0.278729f,0.867238f,0.412564f, +-0.286188f,0.874143f,0.392391f, +-0.157911f,0.873337f,0.46081f, +-0.102832f,0.901917f,0.419488f, +-0.202979f,0.914239f,0.350665f, +-0.202531f,0.912766f,0.354739f, +-0.0843061f,0.956165f,0.28043f, +-0.032801f,0.972626f,0.23005f, +0.0558474f,0.961664f,0.268485f, +0.0617913f,0.944956f,0.321309f, +-0.110343f,0.937288f,0.330629f, +-0.100375f,0.942449f,0.318927f, +0.00551388f,0.94452f,0.328408f, +0.0918462f,0.918926f,0.383587f, +0.101653f,0.927592f,0.3595f, +-0.0426308f,0.960188f,0.276083f, +-0.204594f,0.956809f,0.206539f, +-0.269971f,0.94929f,0.161132f, +-0.226691f,0.969699f,0.0910768f, +-0.201053f,0.979426f,-0.0173973f, +-0.0500104f,0.996428f,-0.0680439f, +0.0272717f,0.999341f,-0.0239459f, +-0.123434f,0.99095f,0.0527561f, +-0.192945f,0.962627f,0.190054f, +-0.168165f,0.969015f,0.180916f, +-0.018086f,0.998622f,0.0492547f, +0.193647f,0.975713f,-0.102395f, +0.238523f,0.949336f,-0.204618f, +-0.0631885f,0.979427f,-0.191649f, +-0.143153f,0.951631f,-0.271858f, +0.148284f,0.940281f,-0.306403f, +0.321113f,0.91022f,-0.261508f, +0.430557f,0.873923f,-0.225566f, +0.33081f,0.885978f,-0.324974f, +0.0651303f,0.881392f,-0.467874f, +0.0061581f,0.870221f,-0.492623f, +0.228459f,0.886891f,-0.401535f, +0.271547f,0.915184f,-0.297827f, +0.234822f,0.937165f,-0.258033f, +0.27549f,0.92259f,-0.270061f, +0.15924f,0.956523f,-0.244348f, +0.0559303f,0.980799f,-0.186831f, +-0.135424f,0.978967f,-0.152593f, +-0.15029f,0.985676f,-0.0765294f, +-0.0914165f,0.995631f,-0.0190383f, +0.0718608f,0.995714f,0.0582141f, +0.110439f,0.955564f,0.273313f, +0.150494f,0.878589f,0.453246f, +0.206788f,0.864483f,0.458157f, +0.00161058f,0.957582f,0.288156f, +-0.0606597f,0.978401f,0.197616f, +0.0692656f,0.9636f,0.25822f, +-0.0150286f,0.961837f,0.273212f, +-0.0821089f,0.979895f,0.181835f, +-0.0658015f,0.997594f,0.0218166f, +0.0735253f,0.997209f,0.0129617f, +0.108564f,0.993746f,0.0261473f, +0.141903f,0.981669f,0.127241f, +0.25029f,0.961471f,0.113707f, +0.225135f,0.967003f,0.119246f, +0.180078f,0.979492f,0.0903737f, +0.237995f,0.971216f,-0.00990333f, +0.0690008f,0.993039f,0.0954582f, +-0.15301f,0.921345f,0.357369f, +-0.436898f,0.858127f,0.2697f, +-0.402318f,0.892319f,0.204714f, +-0.306797f,0.913547f,0.267033f, +-0.291188f,0.917032f,0.272509f, +-0.177835f,0.951614f,0.250608f, +-0.0915363f,0.968867f,0.230039f, +-0.166531f,0.945303f,0.280483f, +-0.214524f,0.956179f,0.199251f, +-0.012479f,0.976094f,0.216991f, +0.0485598f,0.972045f,0.22972f, +-0.0252191f,0.985709f,0.166561f, +-0.0505751f,0.962642f,0.266012f, +-0.0744793f,0.942362f,0.3262f, +-0.0759606f,0.964725f,0.252062f, +-0.0161104f,0.954528f,0.297687f, +0.0264811f,0.949176f,0.313631f, +0.160628f,0.931063f,0.327597f, +0.0783265f,0.972396f,0.219798f, +-0.0844827f,0.993769f,0.0727062f, +-0.216702f,0.975588f,-0.035603f, +-0.195742f,0.979732f,-0.0425419f, +-0.158684f,0.986912f,-0.0287187f, +-0.0351752f,0.999203f,-0.0188605f, +0.0075235f,0.998877f,-0.0467686f, +-0.172586f,0.978556f,-0.112436f, +-0.211691f,0.968971f,-0.127601f, +-0.0966389f,0.974492f,-0.202552f, +0.105494f,0.955113f,-0.276822f, +0.276059f,0.900517f,-0.335947f, +0.219894f,0.907239f,-0.358557f, +-0.0517693f,0.940977f,-0.334489f, +-0.112634f,0.913693f,-0.390485f, +0.139923f,0.91136f,-0.387097f, +0.277005f,0.880398f,-0.384926f, +0.432717f,0.843875f,-0.317222f, +0.433921f,0.823502f,-0.365455f, +0.17364f,0.848637f,-0.499665f, +-0.015678f,0.850557f,-0.525649f, +0.122709f,0.874405f,-0.469423f, +0.164019f,0.896294f,-0.412014f, +0.166557f,0.925047f,-0.34139f, +0.280426f,0.925939f,-0.25298f, +0.167623f,0.949542f,-0.265088f, +-0.00102675f,0.947405f,-0.320035f, +-0.299103f,0.954018f,0.0196808f, +-0.231787f,0.963234f,0.135851f, +-0.196753f,0.961454f,0.192081f, +-0.100151f,0.951932f,0.289472f, +-0.0563981f,0.925245f,0.375154f, +0.0944709f,0.906549f,0.411394f, +0.305132f,0.862547f,0.403618f, +0.241596f,0.931691f,0.271261f, +-0.00370494f,0.998524f,0.0541932f, +-0.000261525f,0.998839f,0.0481646f, +0.0260826f,0.996855f,0.0748309f, +0.0599122f,0.998202f,-0.00179631f, +0.0800977f,0.992669f,-0.0905174f, +0.0495455f,0.986325f,-0.157186f, +0.0563113f,0.99071f,-0.123787f, +0.0832843f,0.991933f,-0.095561f, +0.195142f,0.979158f,-0.0563024f, +0.166634f,0.980307f,0.105976f, +0.195862f,0.965878f,0.169461f, +0.284001f,0.943304f,0.171815f, +-0.127388f,0.981047f,0.146008f, +-0.325222f,0.907949f,0.264311f, +-0.283635f,0.916157f,0.28321f, +-0.335047f,0.926228f,0.17276f, +-0.335005f,0.934046f,0.123816f, +-0.290471f,0.951826f,0.098256f, +-0.155538f,0.980437f,0.120632f, +-0.103955f,0.982905f,0.151957f, +-0.195165f,0.971298f,0.135979f, +-0.117017f,0.988828f,0.0923353f, +-0.0942839f,0.995508f,0.00860997f, +-0.0378307f,0.988218f,0.148301f, +0.011735f,0.964206f,0.264893f, +-0.104568f,0.970188f,0.218634f, +-0.0628876f,0.976435f,0.206445f, +-0.0629747f,0.98253f,0.175127f, +-0.0956593f,0.974263f,0.204109f, +0.00313264f,0.95614f,0.292895f, +0.184054f,0.913334f,0.363241f, +0.234886f,0.917194f,0.321843f, +0.0818984f,0.986888f,0.139086f, +-0.195667f,0.979747f,-0.0425424f, +-0.217661f,0.976006f,-0.00606019f, +-0.197993f,0.980131f,-0.011927f, +-0.0476541f,0.998861f,-0.00224411f, +0.0987461f,0.994341f,-0.039179f, +-0.0376594f,0.985822f,-0.163515f, +-0.127665f,0.950129f,-0.284528f, +0.022229f,0.926621f,-0.37534f, +0.1509f,0.867911f,-0.473243f, +0.251356f,0.84329f,-0.475061f, +0.180391f,0.877498f,-0.44436f, +-0.0381311f,0.903323f,-0.427263f, +-0.0302687f,0.878817f,-0.476199f, +0.151045f,0.843437f,-0.515557f, +0.243043f,0.829132f,-0.503459f, +0.361214f,0.815934f,-0.451416f, +0.469501f,0.80804f,-0.355866f, +0.232058f,0.89573f,-0.379233f, +-0.0406313f,0.902008f,-0.429803f, +0.0570971f,0.896722f,-0.438895f, +0.139199f,0.907425f,-0.396488f, +0.0981956f,0.909915f,-0.403003f, +0.173099f,0.913856f,-0.367293f, +0.208242f,0.936494f,-0.28216f, +0.104323f,0.936228f,-0.335549f, +-0.455877f,0.874672f,0.164697f, +-0.324643f,0.906811f,0.268889f, +-0.22917f,0.934048f,0.273927f, +-0.11917f,0.945648f,0.302569f, +-0.0303449f,0.953424f,0.300104f, +0.0953211f,0.968161f,0.231468f, +0.307551f,0.928088f,0.209914f, +0.396906f,0.882705f,0.251588f, +0.154339f,0.98019f,0.124127f, +0.00614755f,0.999958f,0.00674104f, +0.0862143f,0.995356f,-0.0428297f, +0.0605751f,0.988948f,-0.135323f, +0.116851f,0.991236f,-0.0616197f, +0.0626175f,0.989161f,-0.132815f, +0.0598334f,0.989391f,-0.132381f, +0.0870904f,0.982628f,-0.163882f, +0.0967617f,0.982554f,-0.15882f, +0.0255981f,0.999032f,-0.0357718f, +0.114826f,0.99101f,0.0686587f, +0.196799f,0.954402f,0.22447f, +-0.0385546f,0.932725f,0.358521f, +-0.332784f,0.924223f,0.18726f, +-0.304588f,0.936692f,0.172726f, +-0.293315f,0.937819f,0.185638f, +-0.274742f,0.953043f,0.127381f, +-0.263119f,0.962853f,0.0606766f, +-0.268024f,0.959606f,0.0855591f, +-0.0879001f,0.973995f,0.208824f, +-0.133948f,0.986848f,0.0904876f, +-0.113332f,0.988235f,0.102703f, +-0.0299834f,0.985262f,0.168402f, +-0.19277f,0.976736f,0.0939502f, +-0.0881002f,0.973369f,0.211639f, +-0.024161f,0.965814f,0.258109f, +-0.0447814f,0.977625f,0.205534f, +-0.0454862f,0.975256f,0.216349f, +-0.133105f,0.964838f,0.22665f, +-0.114579f,0.956534f,0.268169f, +0.0712671f,0.941693f,0.328841f, +0.238728f,0.884921f,0.399904f, +0.297664f,0.869038f,0.395183f, +-0.00961778f,0.988677f,0.149748f, +-0.265709f,0.963666f,-0.0273077f, +-0.143358f,0.988736f,0.0430136f, +-0.00534208f,0.998711f,-0.0504723f, +0.174549f,0.979244f,-0.103024f, +0.0753759f,0.97722f,-0.198391f, +-0.0309169f,0.954209f,-0.297538f, +0.114484f,0.932628f,-0.342197f, +0.277629f,0.881086f,-0.382896f, +0.233881f,0.840787f,-0.488238f, +0.145974f,0.866169f,-0.477957f, +-0.0214889f,0.855591f,-0.517207f, +0.015747f,0.850281f,-0.526094f, +0.181736f,0.859322f,-0.478056f, +0.233268f,0.832868f,-0.501913f, +0.278912f,0.819449f,-0.500711f, +0.37496f,0.838284f,-0.395834f, +0.211098f,0.909912f,-0.357069f, +0.0173895f,0.949305f,-0.313875f, +0.0778513f,0.935569f,-0.344455f, +0.13573f,0.919161f,-0.369756f, +0.128317f,0.903382f,-0.40919f, +0.134873f,0.894846f,-0.425512f, +0.140765f,0.922098f,-0.360446f, +0.195779f,0.941368f,-0.274766f, +-0.498792f,0.861228f,0.0974355f, +-0.334273f,0.933116f,0.132498f, +-0.209899f,0.97009f,0.121936f, +-0.146122f,0.979163f,0.141027f, +-0.00844043f,0.991347f,0.130997f, +0.183871f,0.98064f,0.0673491f, +0.295623f,0.955305f,0.000649681f, +0.325261f,0.940591f,0.0974362f, +0.279972f,0.936209f,0.212435f, +0.117319f,0.989809f,0.0807136f, +0.167452f,0.985876f,0.00303625f, +0.0997326f,0.991951f,-0.0780129f, +0.0970545f,0.989541f,-0.106723f, +0.122983f,0.982138f,-0.14241f, +0.0889416f,0.984545f,-0.150867f, +0.0922265f,0.975522f,-0.199627f, +0.0767647f,0.98447f,-0.15788f, +-0.0166949f,0.981051f,-0.193027f, +-0.0192651f,0.97159f,-0.235885f, +-0.0430007f,0.99834f,-0.038322f, +-0.1057f,0.976121f,0.189775f, +-0.21501f,0.968939f,0.122177f, +-0.312622f,0.947332f,0.0695023f, +-0.268759f,0.958656f,0.0935212f, +-0.210053f,0.974561f,0.0781578f, +-0.280996f,0.956877f,0.0736733f, +-0.29425f,0.945004f,0.142776f, +-0.103752f,0.988352f,0.111339f, +-0.0179991f,0.994529f,0.102897f, +-0.257355f,0.965403f,0.0420096f, +-0.105403f,0.956057f,0.273578f, +-0.10459f,0.942017f,0.318851f, +-0.129983f,0.956026f,0.262903f, +-0.0671262f,0.95499f,0.288944f, +-0.00387184f,0.948915f,0.315508f, +-0.104327f,0.957897f,0.267486f, +-0.136557f,0.931775f,0.336375f, +-0.0981417f,0.964639f,0.24462f, +0.0564237f,0.977306f,0.204178f, +0.151449f,0.955346f,0.253725f, +0.313069f,0.882901f,0.349962f, +0.317375f,0.903515f,0.287983f, +-0.14146f,0.988238f,-0.0580959f, +-0.183704f,0.977531f,-0.10337f, +0.0729777f,0.993775f,-0.0841813f, +0.241185f,0.959561f,-0.145165f, +0.180872f,0.946861f,-0.26597f, +0.0759246f,0.918564f,-0.387911f, +0.0834031f,0.881426f,-0.4649f, +0.312989f,0.886301f,-0.341334f, +0.345782f,0.8869f,-0.306339f, +0.190174f,0.893803f,-0.40614f, +0.0967003f,0.870562f,-0.482463f, +-0.011292f,0.813313f,-0.581716f, +0.104307f,0.818569f,-0.564858f, +0.278742f,0.804599f,-0.524332f, +0.252871f,0.80123f,-0.542298f, +0.288393f,0.816691f,-0.499846f, +0.158986f,0.877853f,-0.451771f, +-0.0422089f,0.892803f,-0.448466f, +0.0676213f,0.902423f,-0.425511f, +0.196008f,0.897779f,-0.394428f, +0.174291f,0.88488f,-0.431984f, +0.107973f,0.893114f,-0.43668f, +0.0286973f,0.916566f,-0.398853f, +0.0334026f,0.935074f,-0.352875f, +-0.456752f,0.886621f,-0.0726759f, +-0.35821f,0.92461f,-0.129546f, +-0.255187f,0.962466f,-0.0924034f, +-0.153659f,0.987984f,-0.0166497f, +0.0326193f,0.998752f,-0.0378261f, +0.219848f,0.975435f,-0.0138776f, +0.325192f,0.945498f,0.0168406f, +0.223054f,0.973348f,-0.0532875f, +0.221049f,0.975263f,0.000679153f, +0.242907f,0.969656f,0.0276409f, +0.175892f,0.983375f,-0.0451076f, +0.180873f,0.98342f,0.0130764f, +0.169259f,0.981997f,-0.0838673f, +0.138819f,0.973225f,-0.183198f, +0.0923263f,0.975478f,-0.199795f, +0.109785f,0.97291f,-0.203452f, +0.048887f,0.975403f,-0.214938f, +0.0862303f,0.974446f,-0.207409f, +0.0239822f,0.965181f,-0.260482f, +-0.234299f,0.93066f,-0.281028f, +-0.183154f,0.968628f,-0.167974f, +-0.163946f,0.9725f,-0.165423f, +-0.29935f,0.945623f,-0.127226f, +-0.309491f,0.943295f,-0.120043f, +-0.244588f,0.967669f,-0.0615978f, +-0.316375f,0.948228f,-0.0277512f, +-0.278706f,0.959538f,-0.0401272f, +-0.112855f,0.98959f,-0.0893067f, +-0.0120823f,0.999804f,0.015665f, +-0.269265f,0.962743f,0.0249422f, +-0.319779f,0.940968f,0.110998f, +-0.127925f,0.957822f,0.257316f, +-0.134411f,0.958853f,0.250069f, +-0.0963489f,0.939739f,0.328035f, +0.013379f,0.931979f,0.362265f, +-0.059723f,0.950577f,0.304692f, +-0.140375f,0.96932f,0.201776f, +0.0285405f,0.975242f,0.219289f, +0.0759984f,0.981739f,0.174395f, +0.082912f,0.985645f,0.14707f, +0.244118f,0.959921f,0.137686f, +0.433469f,0.888297f,0.151764f, +0.159753f,0.986026f,0.0472448f, +-0.155828f,0.965805f,-0.207217f, +0.0529598f,0.961817f,-0.268522f, +0.302231f,0.91749f,-0.258588f, +0.300969f,0.905771f,-0.298324f, +0.219954f,0.902269f,-0.370851f, +0.168125f,0.874674f,-0.45462f, +0.0852064f,0.832228f,-0.547846f, +0.293285f,0.876411f,-0.381953f, +0.299707f,0.878674f,-0.371628f, +0.169625f,0.87124f,-0.460618f, +0.152784f,0.862886f,-0.481751f, +0.140952f,0.826781f,-0.544578f, +0.216806f,0.796193f,-0.564865f, +0.252088f,0.778347f,-0.575003f, +0.184028f,0.779276f,-0.599052f, +0.07662f,0.847353f,-0.525474f, +-0.000576164f,0.875581f,-0.483072f, +0.0676453f,0.855821f,-0.51283f, +0.10935f,0.864233f,-0.491064f, +0.170357f,0.902391f,-0.395814f, +0.0783522f,0.922085f,-0.378973f, +-0.0376769f,0.945309f,-0.323992f, +-0.0145087f,0.973617f,-0.227725f, +-0.23379f,0.969091f,0.0787691f, +-0.308611f,0.949667f,-0.0537712f, +-0.26795f,0.959457f,-0.087437f, +-0.196118f,0.96672f,-0.16429f, +0.0184009f,0.993828f,-0.109391f, +0.124962f,0.988681f,-0.0830367f, +0.297057f,0.954812f,-0.00955538f, +0.355506f,0.934478f,-0.0191401f, +0.206845f,0.957298f,-0.201981f, +0.24827f,0.946264f,-0.207234f, +0.137685f,0.959548f,-0.245584f, +0.129837f,0.983718f,-0.124261f, +0.240211f,0.966075f,-0.0948542f, +0.253383f,0.959847f,-0.120381f, +0.101386f,0.970431f,-0.219056f, +0.110568f,0.971775f,-0.208395f, +0.09998f,0.968593f,-0.227667f, +0.051279f,0.9528f,-0.299236f, +0.0182953f,0.960636f,-0.277207f, +-0.177379f,0.948528f,-0.262356f, +-0.248744f,0.930203f,-0.269905f, +-0.201336f,0.9681f,-0.14915f, +-0.308378f,0.940105f,-0.145279f, +-0.337871f,0.915739f,-0.217407f, +-0.303349f,0.940151f,-0.155226f, +-0.267648f,0.955794f,-0.121746f, +-0.256838f,0.946595f,-0.194914f, +-0.151848f,0.978969f,-0.136244f, +-0.166527f,0.98578f,-0.0225025f, +-0.271416f,0.956933f,0.103014f, +-0.388293f,0.921445f,0.0129329f, +-0.211649f,0.973838f,0.0827345f, +-0.164151f,0.971899f,0.168719f, +-0.20343f,0.950968f,0.232971f, +-0.0501604f,0.944198f,0.325535f, +0.0851988f,0.916779f,0.390203f, +-0.0675238f,0.966737f,0.246698f, +-0.050967f,0.964665f,0.258503f, +0.0897532f,0.945965f,0.311599f, +0.203817f,0.954291f,0.218604f, +0.298323f,0.9542f,0.0224806f, +0.409994f,0.911395f,0.0355409f, +0.297451f,0.952362f,0.0673044f, +0.087158f,0.982486f,-0.164695f, +0.130693f,0.926163f,-0.353753f, +0.287973f,0.877932f,-0.3825f, +0.285473f,0.870692f,-0.400501f, +0.210236f,0.894171f,-0.395297f, +0.291478f,0.889926f,-0.350816f, +0.238796f,0.833f,-0.499086f, +0.156519f,0.786723f,-0.597134f, +0.265294f,0.807831f,-0.526334f, +0.196683f,0.821511f,-0.535197f, +0.111545f,0.852981f,-0.509883f, +0.148451f,0.876975f,-0.457031f, +0.27925f,0.865803f,-0.415216f, +0.364812f,0.845771f,-0.389337f, +0.213362f,0.862896f,-0.458135f, +-0.014091f,0.870788f,-0.491456f, +-0.0389733f,0.872117f,-0.487742f, +0.0697073f,0.876793f,-0.475789f, +0.0500075f,0.893805f,-0.445659f, +0.0507492f,0.920605f,-0.387184f, +0.00717016f,0.971083f,-0.238636f, +-0.12982f,0.987525f,-0.0891113f, +-0.196671f,0.977747f,-0.0730188f, +-0.180786f,0.972597f,0.146192f, +-0.276836f,0.956623f,0.0907445f, +-0.145247f,0.980389f,0.133193f, +-0.201228f,0.967008f,-0.156214f, +-0.0137179f,0.995281f,-0.0960578f, +0.139707f,0.987867f,-0.0678349f, +0.246306f,0.96116f,-0.124516f, +0.421865f,0.906227f,-0.0279788f, +0.299255f,0.934152f,-0.194439f, +0.288356f,0.912569f,-0.289945f, +0.0853497f,0.915952f,-0.392106f, +0.039019f,0.957394f,-0.286136f, +0.208597f,0.95771f,-0.198188f, +0.25753f,0.95731f,-0.131287f, +0.153643f,0.978938f,-0.134439f, +0.0994252f,0.976974f,-0.188775f, +0.12654f,0.974603f,-0.184759f, +0.142684f,0.966335f,-0.214099f, +-0.00843645f,0.93512f,-0.354231f, +-0.17704f,0.933769f,-0.311017f, +-0.343277f,0.895674f,-0.282717f, +-0.276715f,0.959562f,-0.0516624f, +-0.215753f,0.976427f,-0.00633257f, +-0.305134f,0.926522f,-0.220112f, +-0.33388f,0.920497f,-0.203001f, +-0.259644f,0.948413f,-0.181927f, +-0.268974f,0.938104f,-0.218205f, +-0.245938f,0.962991f,-0.110289f, +-0.275564f,0.96071f,0.0331654f, +-0.258271f,0.944524f,0.202903f, +-0.309053f,0.947461f,0.0824847f, +-0.320335f,0.94673f,-0.0329778f, +-0.208609f,0.963472f,0.167941f, +-0.270763f,0.941796f,0.199269f, +-0.104692f,0.947993f,0.30058f, +0.0304241f,0.930802f,0.364255f, +0.0189457f,0.906511f,0.421757f, +-0.0823065f,0.924037f,0.373337f, +0.102263f,0.911082f,0.39934f, +0.325851f,0.888801f,0.322263f, +0.371159f,0.927767f,0.0385981f, +0.355076f,0.934525f,0.0241533f, +0.375158f,0.916478f,0.139015f, +0.286108f,0.953917f,-0.0904664f, +0.199009f,0.919897f,-0.337913f, +0.358636f,0.872243f,-0.332523f, +0.268543f,0.846175f,-0.460296f, +0.182977f,0.871041f,-0.455858f, +0.289295f,0.860781f,-0.418765f, +0.382576f,0.820168f,-0.425393f, +0.183794f,0.780369f,-0.597699f, +0.239111f,0.770893f,-0.590381f, +0.11759f,0.781853f,-0.612273f, +0.0625615f,0.849006f,-0.524666f, +0.09237f,0.869569f,-0.485096f, +0.210947f,0.881757f,-0.421908f, +0.36331f,0.890409f,-0.274185f, +0.280816f,0.923638f,-0.260836f, +0.0186632f,0.936387f,-0.350473f, +-0.00764646f,0.914133f,-0.405343f, +0.0383964f,0.885647f,-0.462769f, +0.0296537f,0.913944f,-0.404755f, +-0.02984f,0.920171f,-0.390377f, +-0.172982f,0.943792f,-0.281663f, +-0.19032f,0.979403f,0.0674393f, +-0.205961f,0.972526f,0.108505f, +}; + +btScalar Landscape08Tex[] = { +0.0f,0.757813f, +0.0f,0.75f, +0.0078125f,0.757813f, +0.0078125f,0.75f, +0.015625f,0.757813f, +0.015625f,0.75f, +0.0234375f,0.757813f, +0.0234375f,0.75f, +0.03125f,0.757813f, +0.03125f,0.75f, +0.0390625f,0.757813f, +0.0390625f,0.75f, +0.046875f,0.757813f, +0.046875f,0.75f, +0.0546875f,0.757813f, +0.0546875f,0.75f, +0.0625f,0.757813f, +0.0625f,0.75f, +0.0703125f,0.757813f, +0.0703125f,0.75f, +0.078125f,0.757813f, +0.078125f,0.75f, +0.0859375f,0.757813f, +0.0859375f,0.75f, +0.09375f,0.757813f, +0.09375f,0.75f, +0.101563f,0.757813f, +0.101563f,0.75f, +0.109375f,0.757813f, +0.109375f,0.75f, +0.117188f,0.757813f, +0.117188f,0.75f, +0.125f,0.757813f, +0.125f,0.75f, +0.132813f,0.757813f, +0.132813f,0.75f, +0.140625f,0.757813f, +0.140625f,0.75f, +0.148438f,0.757813f, +0.148438f,0.75f, +0.15625f,0.757813f, +0.15625f,0.75f, +0.164063f,0.757813f, +0.164063f,0.75f, +0.171875f,0.757813f, +0.171875f,0.75f, +0.179688f,0.757813f, +0.179688f,0.75f, +0.1875f,0.757813f, +0.1875f,0.75f, +0.195313f,0.757813f, +0.195313f,0.75f, +0.203125f,0.757813f, +0.203125f,0.75f, +0.210938f,0.757813f, +0.210938f,0.75f, +0.21875f,0.757813f, +0.21875f,0.75f, +0.226563f,0.757813f, +0.226563f,0.75f, +0.234375f,0.757813f, +0.234375f,0.75f, +0.242188f,0.757813f, +0.242188f,0.75f, +0.25f,0.757813f, +0.25f,0.75f, +0.257813f,0.757813f, +0.257813f,0.75f, +0.265625f,0.757813f, +0.265625f,0.75f, +0.273438f,0.757813f, +0.273438f,0.75f, +0.28125f,0.757813f, +0.28125f,0.75f, +0.289063f,0.757813f, +0.289063f,0.75f, +0.296875f,0.757813f, +0.296875f,0.75f, +0.304688f,0.757813f, +0.304688f,0.75f, +0.3125f,0.757813f, +0.3125f,0.75f, +0.320313f,0.757813f, +0.320313f,0.75f, +0.328125f,0.757813f, +0.328125f,0.75f, +0.335938f,0.757813f, +0.335938f,0.75f, +0.34375f,0.757813f, +0.34375f,0.75f, +0.351563f,0.757813f, +0.351563f,0.75f, +0.359375f,0.757813f, +0.359375f,0.75f, +0.367188f,0.757813f, +0.367188f,0.75f, +0.375f,0.757813f, +0.375f,0.75f, +0.382813f,0.757813f, +0.382813f,0.75f, +0.390625f,0.757813f, +0.390625f,0.75f, +0.398438f,0.757813f, +0.398438f,0.75f, +0.40625f,0.757813f, +0.40625f,0.75f, +0.414063f,0.757813f, +0.414063f,0.75f, +0.421875f,0.757813f, +0.421875f,0.75f, +0.429688f,0.757813f, +0.429688f,0.75f, +0.4375f,0.757813f, +0.4375f,0.75f, +0.445313f,0.757813f, +0.445313f,0.75f, +0.453125f,0.757813f, +0.453125f,0.75f, +0.460938f,0.757813f, +0.460938f,0.75f, +0.46875f,0.757813f, +0.46875f,0.75f, +0.476563f,0.757813f, +0.476563f,0.75f, +0.484375f,0.757813f, +0.484375f,0.75f, +0.492188f,0.757813f, +0.492188f,0.75f, +0.5f,0.757813f, +0.5f,0.75f, +0.507813f,0.757813f, +0.507813f,0.75f, +0.0f,0.765625f, +0.0078125f,0.765625f, +0.015625f,0.765625f, +0.0234375f,0.765625f, +0.03125f,0.765625f, +0.0390625f,0.765625f, +0.046875f,0.765625f, +0.0546875f,0.765625f, +0.0625f,0.765625f, +0.0703125f,0.765625f, +0.078125f,0.765625f, +0.0859375f,0.765625f, +0.09375f,0.765625f, +0.101563f,0.765625f, +0.109375f,0.765625f, +0.117188f,0.765625f, +0.125f,0.765625f, +0.132813f,0.765625f, +0.140625f,0.765625f, +0.148438f,0.765625f, +0.15625f,0.765625f, +0.164063f,0.765625f, +0.171875f,0.765625f, +0.179688f,0.765625f, +0.1875f,0.765625f, +0.195313f,0.765625f, +0.203125f,0.765625f, +0.210938f,0.765625f, +0.21875f,0.765625f, +0.226563f,0.765625f, +0.234375f,0.765625f, +0.242188f,0.765625f, +0.25f,0.765625f, +0.257813f,0.765625f, +0.265625f,0.765625f, +0.273438f,0.765625f, +0.28125f,0.765625f, +0.289063f,0.765625f, +0.296875f,0.765625f, +0.304688f,0.765625f, +0.3125f,0.765625f, +0.320313f,0.765625f, +0.328125f,0.765625f, +0.335938f,0.765625f, +0.34375f,0.765625f, +0.351563f,0.765625f, +0.359375f,0.765625f, +0.367188f,0.765625f, +0.375f,0.765625f, +0.382813f,0.765625f, +0.390625f,0.765625f, +0.398438f,0.765625f, +0.40625f,0.765625f, +0.414063f,0.765625f, +0.421875f,0.765625f, +0.429688f,0.765625f, +0.4375f,0.765625f, +0.445313f,0.765625f, +0.453125f,0.765625f, +0.460938f,0.765625f, +0.46875f,0.765625f, +0.476563f,0.765625f, +0.484375f,0.765625f, +0.492188f,0.765625f, +0.5f,0.765625f, +0.507813f,0.765625f, +0.0f,0.773438f, +0.0078125f,0.773438f, +0.015625f,0.773438f, +0.0234375f,0.773438f, +0.03125f,0.773438f, +0.0390625f,0.773438f, +0.046875f,0.773438f, +0.0546875f,0.773438f, +0.0625f,0.773438f, +0.0703125f,0.773438f, +0.078125f,0.773438f, +0.0859375f,0.773438f, +0.09375f,0.773438f, +0.101563f,0.773438f, +0.109375f,0.773438f, +0.117188f,0.773438f, +0.125f,0.773438f, +0.132813f,0.773438f, +0.140625f,0.773438f, +0.148438f,0.773438f, +0.15625f,0.773438f, +0.164063f,0.773438f, +0.171875f,0.773438f, +0.179688f,0.773438f, +0.1875f,0.773438f, +0.195313f,0.773438f, +0.203125f,0.773438f, +0.210938f,0.773438f, +0.21875f,0.773438f, +0.226563f,0.773438f, +0.234375f,0.773438f, +0.242188f,0.773438f, +0.25f,0.773438f, +0.257813f,0.773438f, +0.265625f,0.773438f, +0.273438f,0.773438f, +0.28125f,0.773438f, +0.289063f,0.773438f, +0.296875f,0.773438f, +0.304688f,0.773438f, +0.3125f,0.773438f, +0.320313f,0.773438f, +0.328125f,0.773438f, +0.335938f,0.773438f, +0.34375f,0.773438f, +0.351563f,0.773438f, +0.359375f,0.773438f, +0.367188f,0.773438f, +0.375f,0.773438f, +0.382813f,0.773438f, +0.390625f,0.773438f, +0.398438f,0.773438f, +0.40625f,0.773438f, +0.414063f,0.773438f, +0.421875f,0.773438f, +0.429688f,0.773438f, +0.4375f,0.773438f, +0.445313f,0.773438f, +0.453125f,0.773438f, +0.460938f,0.773438f, +0.46875f,0.773438f, +0.476563f,0.773438f, +0.484375f,0.773438f, +0.492188f,0.773438f, +0.5f,0.773438f, +0.507813f,0.773438f, +0.0f,0.78125f, +0.0078125f,0.78125f, +0.015625f,0.78125f, +0.0234375f,0.78125f, +0.03125f,0.78125f, +0.0390625f,0.78125f, +0.046875f,0.78125f, +0.0546875f,0.78125f, +0.0625f,0.78125f, +0.0703125f,0.78125f, +0.078125f,0.78125f, +0.0859375f,0.78125f, +0.09375f,0.78125f, +0.101563f,0.78125f, +0.109375f,0.78125f, +0.117188f,0.78125f, +0.125f,0.78125f, +0.132813f,0.78125f, +0.140625f,0.78125f, +0.148438f,0.78125f, +0.15625f,0.78125f, +0.164063f,0.78125f, +0.171875f,0.78125f, +0.179688f,0.78125f, +0.1875f,0.78125f, +0.195313f,0.78125f, +0.203125f,0.78125f, +0.210938f,0.78125f, +0.21875f,0.78125f, +0.226563f,0.78125f, +0.234375f,0.78125f, +0.242188f,0.78125f, +0.25f,0.78125f, +0.257813f,0.78125f, +0.265625f,0.78125f, +0.273438f,0.78125f, +0.28125f,0.78125f, +0.289063f,0.78125f, +0.296875f,0.78125f, +0.304688f,0.78125f, +0.3125f,0.78125f, +0.320313f,0.78125f, +0.328125f,0.78125f, +0.335938f,0.78125f, +0.34375f,0.78125f, +0.351563f,0.78125f, +0.359375f,0.78125f, +0.367188f,0.78125f, +0.375f,0.78125f, +0.382813f,0.78125f, +0.390625f,0.78125f, +0.398438f,0.78125f, +0.40625f,0.78125f, +0.414063f,0.78125f, +0.421875f,0.78125f, +0.429688f,0.78125f, +0.4375f,0.78125f, +0.445313f,0.78125f, +0.453125f,0.78125f, +0.460938f,0.78125f, +0.46875f,0.78125f, +0.476563f,0.78125f, +0.484375f,0.78125f, +0.492188f,0.78125f, +0.5f,0.78125f, +0.507813f,0.78125f, +0.0f,0.789063f, +0.0078125f,0.789063f, +0.015625f,0.789063f, +0.0234375f,0.789063f, +0.03125f,0.789063f, +0.0390625f,0.789063f, +0.046875f,0.789063f, +0.0546875f,0.789063f, +0.0625f,0.789063f, +0.0703125f,0.789063f, +0.078125f,0.789063f, +0.0859375f,0.789063f, +0.09375f,0.789063f, +0.101563f,0.789063f, +0.109375f,0.789063f, +0.117188f,0.789063f, +0.125f,0.789063f, +0.132813f,0.789063f, +0.140625f,0.789063f, +0.148438f,0.789063f, +0.15625f,0.789063f, +0.164063f,0.789063f, +0.171875f,0.789063f, +0.179688f,0.789063f, +0.1875f,0.789063f, +0.195313f,0.789063f, +0.203125f,0.789063f, +0.210938f,0.789063f, +0.21875f,0.789063f, +0.226563f,0.789063f, +0.234375f,0.789063f, +0.242188f,0.789063f, +0.25f,0.789063f, +0.257813f,0.789063f, +0.265625f,0.789063f, +0.273438f,0.789063f, +0.28125f,0.789063f, +0.289063f,0.789063f, +0.296875f,0.789063f, +0.304688f,0.789063f, +0.3125f,0.789063f, +0.320313f,0.789063f, +0.328125f,0.789063f, +0.335938f,0.789063f, +0.34375f,0.789063f, +0.351563f,0.789063f, +0.359375f,0.789063f, +0.367188f,0.789063f, +0.375f,0.789063f, +0.382813f,0.789063f, +0.390625f,0.789063f, +0.398438f,0.789063f, +0.40625f,0.789063f, +0.414063f,0.789063f, +0.421875f,0.789063f, +0.429688f,0.789063f, +0.4375f,0.789063f, +0.445313f,0.789063f, +0.453125f,0.789063f, +0.460938f,0.789063f, +0.46875f,0.789063f, +0.476563f,0.789063f, +0.484375f,0.789063f, +0.492188f,0.789063f, +0.5f,0.789063f, +0.507813f,0.789063f, +0.0f,0.796875f, +0.0078125f,0.796875f, +0.015625f,0.796875f, +0.0234375f,0.796875f, +0.03125f,0.796875f, +0.0390625f,0.796875f, +0.046875f,0.796875f, +0.0546875f,0.796875f, +0.0625f,0.796875f, +0.0703125f,0.796875f, +0.078125f,0.796875f, +0.0859375f,0.796875f, +0.09375f,0.796875f, +0.101563f,0.796875f, +0.109375f,0.796875f, +0.117188f,0.796875f, +0.125f,0.796875f, +0.132813f,0.796875f, +0.140625f,0.796875f, +0.148438f,0.796875f, +0.15625f,0.796875f, +0.164063f,0.796875f, +0.171875f,0.796875f, +0.179688f,0.796875f, +0.1875f,0.796875f, +0.195313f,0.796875f, +0.203125f,0.796875f, +0.210938f,0.796875f, +0.21875f,0.796875f, +0.226563f,0.796875f, +0.234375f,0.796875f, +0.242188f,0.796875f, +0.25f,0.796875f, +0.257813f,0.796875f, +0.265625f,0.796875f, +0.273438f,0.796875f, +0.28125f,0.796875f, +0.289063f,0.796875f, +0.296875f,0.796875f, +0.304688f,0.796875f, +0.3125f,0.796875f, +0.320313f,0.796875f, +0.328125f,0.796875f, +0.335938f,0.796875f, +0.34375f,0.796875f, +0.351563f,0.796875f, +0.359375f,0.796875f, +0.367188f,0.796875f, +0.375f,0.796875f, +0.382813f,0.796875f, +0.390625f,0.796875f, +0.398438f,0.796875f, +0.40625f,0.796875f, +0.414063f,0.796875f, +0.421875f,0.796875f, +0.429688f,0.796875f, +0.4375f,0.796875f, +0.445313f,0.796875f, +0.453125f,0.796875f, +0.460938f,0.796875f, +0.46875f,0.796875f, +0.476563f,0.796875f, +0.484375f,0.796875f, +0.492188f,0.796875f, +0.5f,0.796875f, +0.507813f,0.796875f, +0.0f,0.804688f, +0.0078125f,0.804688f, +0.015625f,0.804688f, +0.0234375f,0.804688f, +0.03125f,0.804688f, +0.0390625f,0.804688f, +0.046875f,0.804688f, +0.0546875f,0.804688f, +0.0625f,0.804688f, +0.0703125f,0.804688f, +0.078125f,0.804688f, +0.0859375f,0.804688f, +0.09375f,0.804688f, +0.101563f,0.804688f, +0.109375f,0.804688f, +0.117188f,0.804688f, +0.125f,0.804688f, +0.132813f,0.804688f, +0.140625f,0.804688f, +0.148438f,0.804688f, +0.15625f,0.804688f, +0.164063f,0.804688f, +0.171875f,0.804688f, +0.179688f,0.804688f, +0.1875f,0.804688f, +0.195313f,0.804688f, +0.203125f,0.804688f, +0.210938f,0.804688f, +0.21875f,0.804688f, +0.226563f,0.804688f, +0.234375f,0.804688f, +0.242188f,0.804688f, +0.25f,0.804688f, +0.257813f,0.804688f, +0.265625f,0.804688f, +0.273438f,0.804688f, +0.28125f,0.804688f, +0.289063f,0.804688f, +0.296875f,0.804688f, +0.304688f,0.804688f, +0.3125f,0.804688f, +0.320313f,0.804688f, +0.328125f,0.804688f, +0.335938f,0.804688f, +0.34375f,0.804688f, +0.351563f,0.804688f, +0.359375f,0.804688f, +0.367188f,0.804688f, +0.375f,0.804688f, +0.382813f,0.804688f, +0.390625f,0.804688f, +0.398438f,0.804688f, +0.40625f,0.804688f, +0.414063f,0.804688f, +0.421875f,0.804688f, +0.429688f,0.804688f, +0.4375f,0.804688f, +0.445313f,0.804688f, +0.453125f,0.804688f, +0.460938f,0.804688f, +0.46875f,0.804688f, +0.476563f,0.804688f, +0.484375f,0.804688f, +0.492188f,0.804688f, +0.5f,0.804688f, +0.507813f,0.804688f, +0.0f,0.8125f, +0.0078125f,0.8125f, +0.015625f,0.8125f, +0.0234375f,0.8125f, +0.03125f,0.8125f, +0.0390625f,0.8125f, +0.046875f,0.8125f, +0.0546875f,0.8125f, +0.0625f,0.8125f, +0.0703125f,0.8125f, +0.078125f,0.8125f, +0.0859375f,0.8125f, +0.09375f,0.8125f, +0.101563f,0.8125f, +0.109375f,0.8125f, +0.117188f,0.8125f, +0.125f,0.8125f, +0.132813f,0.8125f, +0.140625f,0.8125f, +0.148438f,0.8125f, +0.15625f,0.8125f, +0.164063f,0.8125f, +0.171875f,0.8125f, +0.179688f,0.8125f, +0.1875f,0.8125f, +0.195313f,0.8125f, +0.203125f,0.8125f, +0.210938f,0.8125f, +0.21875f,0.8125f, +0.226563f,0.8125f, +0.234375f,0.8125f, +0.242188f,0.8125f, +0.25f,0.8125f, +0.257813f,0.8125f, +0.265625f,0.8125f, +0.273438f,0.8125f, +0.28125f,0.8125f, +0.289063f,0.8125f, +0.296875f,0.8125f, +0.304688f,0.8125f, +0.3125f,0.8125f, +0.320313f,0.8125f, +0.328125f,0.8125f, +0.335938f,0.8125f, +0.34375f,0.8125f, +0.351563f,0.8125f, +0.359375f,0.8125f, +0.367188f,0.8125f, +0.375f,0.8125f, +0.382813f,0.8125f, +0.390625f,0.8125f, +0.398438f,0.8125f, +0.40625f,0.8125f, +0.414063f,0.8125f, +0.421875f,0.8125f, +0.429688f,0.8125f, +0.4375f,0.8125f, +0.445313f,0.8125f, +0.453125f,0.8125f, +0.460938f,0.8125f, +0.46875f,0.8125f, +0.476563f,0.8125f, +0.484375f,0.8125f, +0.492188f,0.8125f, +0.5f,0.8125f, +0.507813f,0.8125f, +0.0f,0.820313f, +0.0078125f,0.820313f, +0.015625f,0.820313f, +0.0234375f,0.820313f, +0.03125f,0.820313f, +0.0390625f,0.820313f, +0.046875f,0.820313f, +0.0546875f,0.820313f, +0.0625f,0.820313f, +0.0703125f,0.820313f, +0.078125f,0.820313f, +0.0859375f,0.820313f, +0.09375f,0.820313f, +0.101563f,0.820313f, +0.109375f,0.820313f, +0.117188f,0.820313f, +0.125f,0.820313f, +0.132813f,0.820313f, +0.140625f,0.820313f, +0.148438f,0.820313f, +0.15625f,0.820313f, +0.164063f,0.820313f, +0.171875f,0.820313f, +0.179688f,0.820313f, +0.1875f,0.820313f, +0.195313f,0.820313f, +0.203125f,0.820313f, +0.210938f,0.820313f, +0.21875f,0.820313f, +0.226563f,0.820313f, +0.234375f,0.820313f, +0.242188f,0.820313f, +0.25f,0.820313f, +0.257813f,0.820313f, +0.265625f,0.820313f, +0.273438f,0.820313f, +0.28125f,0.820313f, +0.289063f,0.820313f, +0.296875f,0.820313f, +0.304688f,0.820313f, +0.3125f,0.820313f, +0.320313f,0.820313f, +0.328125f,0.820313f, +0.335938f,0.820313f, +0.34375f,0.820313f, +0.351563f,0.820313f, +0.359375f,0.820313f, +0.367188f,0.820313f, +0.375f,0.820313f, +0.382813f,0.820313f, +0.390625f,0.820313f, +0.398438f,0.820313f, +0.40625f,0.820313f, +0.414063f,0.820313f, +0.421875f,0.820313f, +0.429688f,0.820313f, +0.4375f,0.820313f, +0.445313f,0.820313f, +0.453125f,0.820313f, +0.460938f,0.820313f, +0.46875f,0.820313f, +0.476563f,0.820313f, +0.484375f,0.820313f, +0.492188f,0.820313f, +0.5f,0.820313f, +0.507813f,0.820313f, +0.0f,0.828125f, +0.0078125f,0.828125f, +0.015625f,0.828125f, +0.0234375f,0.828125f, +0.03125f,0.828125f, +0.0390625f,0.828125f, +0.046875f,0.828125f, +0.0546875f,0.828125f, +0.0625f,0.828125f, +0.0703125f,0.828125f, +0.078125f,0.828125f, +0.0859375f,0.828125f, +0.09375f,0.828125f, +0.101563f,0.828125f, +0.109375f,0.828125f, +0.117188f,0.828125f, +0.125f,0.828125f, +0.132813f,0.828125f, +0.140625f,0.828125f, +0.148438f,0.828125f, +0.15625f,0.828125f, +0.164063f,0.828125f, +0.171875f,0.828125f, +0.179688f,0.828125f, +0.1875f,0.828125f, +0.195313f,0.828125f, +0.203125f,0.828125f, +0.210938f,0.828125f, +0.21875f,0.828125f, +0.226563f,0.828125f, +0.234375f,0.828125f, +0.242188f,0.828125f, +0.25f,0.828125f, +0.257813f,0.828125f, +0.265625f,0.828125f, +0.273438f,0.828125f, +0.28125f,0.828125f, +0.289063f,0.828125f, +0.296875f,0.828125f, +0.304688f,0.828125f, +0.3125f,0.828125f, +0.320313f,0.828125f, +0.328125f,0.828125f, +0.335938f,0.828125f, +0.34375f,0.828125f, +0.351563f,0.828125f, +0.359375f,0.828125f, +0.367188f,0.828125f, +0.375f,0.828125f, +0.382813f,0.828125f, +0.390625f,0.828125f, +0.398438f,0.828125f, +0.40625f,0.828125f, +0.414063f,0.828125f, +0.421875f,0.828125f, +0.429688f,0.828125f, +0.4375f,0.828125f, +0.445313f,0.828125f, +0.453125f,0.828125f, +0.460938f,0.828125f, +0.46875f,0.828125f, +0.476563f,0.828125f, +0.484375f,0.828125f, +0.492188f,0.828125f, +0.5f,0.828125f, +0.507813f,0.828125f, +0.0f,0.835938f, +0.0078125f,0.835938f, +0.015625f,0.835938f, +0.0234375f,0.835938f, +0.03125f,0.835938f, +0.0390625f,0.835938f, +0.046875f,0.835938f, +0.0546875f,0.835938f, +0.0625f,0.835938f, +0.0703125f,0.835938f, +0.078125f,0.835938f, +0.0859375f,0.835938f, +0.09375f,0.835938f, +0.101563f,0.835938f, +0.109375f,0.835938f, +0.117188f,0.835938f, +0.125f,0.835938f, +0.132813f,0.835938f, +0.140625f,0.835938f, +0.148438f,0.835938f, +0.15625f,0.835938f, +0.164063f,0.835938f, +0.171875f,0.835938f, +0.179688f,0.835938f, +0.1875f,0.835938f, +0.195313f,0.835938f, +0.203125f,0.835938f, +0.210938f,0.835938f, +0.21875f,0.835938f, +0.226563f,0.835938f, +0.234375f,0.835938f, +0.242188f,0.835938f, +0.25f,0.835938f, +0.257813f,0.835938f, +0.265625f,0.835938f, +0.273438f,0.835938f, +0.28125f,0.835938f, +0.289063f,0.835938f, +0.296875f,0.835938f, +0.304688f,0.835938f, +0.3125f,0.835938f, +0.320313f,0.835938f, +0.328125f,0.835938f, +0.335938f,0.835938f, +0.34375f,0.835938f, +0.351563f,0.835938f, +0.359375f,0.835938f, +0.367188f,0.835938f, +0.375f,0.835938f, +0.382813f,0.835938f, +0.390625f,0.835938f, +0.398438f,0.835938f, +0.40625f,0.835938f, +0.414063f,0.835938f, +0.421875f,0.835938f, +0.429688f,0.835938f, +0.4375f,0.835938f, +0.445313f,0.835938f, +0.453125f,0.835938f, +0.460938f,0.835938f, +0.46875f,0.835938f, +0.476563f,0.835938f, +0.484375f,0.835938f, +0.492188f,0.835938f, +0.5f,0.835938f, +0.507813f,0.835938f, +0.0f,0.84375f, +0.0078125f,0.84375f, +0.015625f,0.84375f, +0.0234375f,0.84375f, +0.03125f,0.84375f, +0.0390625f,0.84375f, +0.046875f,0.84375f, +0.0546875f,0.84375f, +0.0625f,0.84375f, +0.0703125f,0.84375f, +0.078125f,0.84375f, +0.0859375f,0.84375f, +0.09375f,0.84375f, +0.101563f,0.84375f, +0.109375f,0.84375f, +0.117188f,0.84375f, +0.125f,0.84375f, +0.132813f,0.84375f, +0.140625f,0.84375f, +0.148438f,0.84375f, +0.15625f,0.84375f, +0.164063f,0.84375f, +0.171875f,0.84375f, +0.179688f,0.84375f, +0.1875f,0.84375f, +0.195313f,0.84375f, +0.203125f,0.84375f, +0.210938f,0.84375f, +0.21875f,0.84375f, +0.226563f,0.84375f, +0.234375f,0.84375f, +0.242188f,0.84375f, +0.25f,0.84375f, +0.257813f,0.84375f, +0.265625f,0.84375f, +0.273438f,0.84375f, +0.28125f,0.84375f, +0.289063f,0.84375f, +0.296875f,0.84375f, +0.304688f,0.84375f, +0.3125f,0.84375f, +0.320313f,0.84375f, +0.328125f,0.84375f, +0.335938f,0.84375f, +0.34375f,0.84375f, +0.351563f,0.84375f, +0.359375f,0.84375f, +0.367188f,0.84375f, +0.375f,0.84375f, +0.382813f,0.84375f, +0.390625f,0.84375f, +0.398438f,0.84375f, +0.40625f,0.84375f, +0.414063f,0.84375f, +0.421875f,0.84375f, +0.429688f,0.84375f, +0.4375f,0.84375f, +0.445313f,0.84375f, +0.453125f,0.84375f, +0.460938f,0.84375f, +0.46875f,0.84375f, +0.476563f,0.84375f, +0.484375f,0.84375f, +0.492188f,0.84375f, +0.5f,0.84375f, +0.507813f,0.84375f, +0.0f,0.851563f, +0.0078125f,0.851563f, +0.015625f,0.851563f, +0.0234375f,0.851563f, +0.03125f,0.851563f, +0.0390625f,0.851563f, +0.046875f,0.851563f, +0.0546875f,0.851563f, +0.0625f,0.851563f, +0.0703125f,0.851563f, +0.078125f,0.851563f, +0.0859375f,0.851563f, +0.09375f,0.851563f, +0.101563f,0.851563f, +0.109375f,0.851563f, +0.117188f,0.851563f, +0.125f,0.851563f, +0.132813f,0.851563f, +0.140625f,0.851563f, +0.148438f,0.851563f, +0.15625f,0.851563f, +0.164063f,0.851563f, +0.171875f,0.851563f, +0.179688f,0.851563f, +0.1875f,0.851563f, +0.195313f,0.851563f, +0.203125f,0.851563f, +0.210938f,0.851563f, +0.21875f,0.851563f, +0.226563f,0.851563f, +0.234375f,0.851563f, +0.242188f,0.851563f, +0.25f,0.851563f, +0.257813f,0.851563f, +0.265625f,0.851563f, +0.273438f,0.851563f, +0.28125f,0.851563f, +0.289063f,0.851563f, +0.296875f,0.851563f, +0.304688f,0.851563f, +0.3125f,0.851563f, +0.320313f,0.851563f, +0.328125f,0.851563f, +0.335938f,0.851563f, +0.34375f,0.851563f, +0.351563f,0.851563f, +0.359375f,0.851563f, +0.367188f,0.851563f, +0.375f,0.851563f, +0.382813f,0.851563f, +0.390625f,0.851563f, +0.398438f,0.851563f, +0.40625f,0.851563f, +0.414063f,0.851563f, +0.421875f,0.851563f, +0.429688f,0.851563f, +0.4375f,0.851563f, +0.445313f,0.851563f, +0.453125f,0.851563f, +0.460938f,0.851563f, +0.46875f,0.851563f, +0.476563f,0.851563f, +0.484375f,0.851563f, +0.492188f,0.851563f, +0.5f,0.851563f, +0.507813f,0.851563f, +0.0f,0.859375f, +0.0078125f,0.859375f, +0.015625f,0.859375f, +0.0234375f,0.859375f, +0.03125f,0.859375f, +0.0390625f,0.859375f, +0.046875f,0.859375f, +0.0546875f,0.859375f, +0.0625f,0.859375f, +0.0703125f,0.859375f, +0.078125f,0.859375f, +0.0859375f,0.859375f, +0.09375f,0.859375f, +0.101563f,0.859375f, +0.109375f,0.859375f, +0.117188f,0.859375f, +0.125f,0.859375f, +0.132813f,0.859375f, +0.140625f,0.859375f, +0.148438f,0.859375f, +0.15625f,0.859375f, +0.164063f,0.859375f, +0.171875f,0.859375f, +0.179688f,0.859375f, +0.1875f,0.859375f, +0.195313f,0.859375f, +0.203125f,0.859375f, +0.210938f,0.859375f, +0.21875f,0.859375f, +0.226563f,0.859375f, +0.234375f,0.859375f, +0.242188f,0.859375f, +0.25f,0.859375f, +0.257813f,0.859375f, +0.265625f,0.859375f, +0.273438f,0.859375f, +0.28125f,0.859375f, +0.289063f,0.859375f, +0.296875f,0.859375f, +0.304688f,0.859375f, +0.3125f,0.859375f, +0.320313f,0.859375f, +0.328125f,0.859375f, +0.335938f,0.859375f, +0.34375f,0.859375f, +0.351563f,0.859375f, +0.359375f,0.859375f, +0.367188f,0.859375f, +0.375f,0.859375f, +0.382813f,0.859375f, +0.390625f,0.859375f, +0.398438f,0.859375f, +0.40625f,0.859375f, +0.414063f,0.859375f, +0.421875f,0.859375f, +0.429688f,0.859375f, +0.4375f,0.859375f, +0.445313f,0.859375f, +0.453125f,0.859375f, +0.460938f,0.859375f, +0.46875f,0.859375f, +0.476563f,0.859375f, +0.484375f,0.859375f, +0.492188f,0.859375f, +0.5f,0.859375f, +0.507813f,0.859375f, +0.0f,0.867188f, +0.0078125f,0.867188f, +0.015625f,0.867188f, +0.0234375f,0.867188f, +0.03125f,0.867188f, +0.0390625f,0.867188f, +0.046875f,0.867188f, +0.0546875f,0.867188f, +0.0625f,0.867188f, +0.0703125f,0.867188f, +0.078125f,0.867188f, +0.0859375f,0.867188f, +0.09375f,0.867188f, +0.101563f,0.867188f, +0.109375f,0.867188f, +0.117188f,0.867188f, +0.125f,0.867188f, +0.132813f,0.867188f, +0.140625f,0.867188f, +0.148438f,0.867188f, +0.15625f,0.867188f, +0.164063f,0.867188f, +0.171875f,0.867188f, +0.179688f,0.867188f, +0.1875f,0.867188f, +0.195313f,0.867188f, +0.203125f,0.867188f, +0.210938f,0.867188f, +0.21875f,0.867188f, +0.226563f,0.867188f, +0.234375f,0.867188f, +0.242188f,0.867188f, +0.25f,0.867188f, +0.257813f,0.867188f, +0.265625f,0.867188f, +0.273438f,0.867188f, +0.28125f,0.867188f, +0.289063f,0.867188f, +0.296875f,0.867188f, +0.304688f,0.867188f, +0.3125f,0.867188f, +0.320313f,0.867188f, +0.328125f,0.867188f, +0.335938f,0.867188f, +0.34375f,0.867188f, +0.351563f,0.867188f, +0.359375f,0.867188f, +0.367188f,0.867188f, +0.375f,0.867188f, +0.382813f,0.867188f, +0.390625f,0.867188f, +0.398438f,0.867188f, +0.40625f,0.867188f, +0.414063f,0.867188f, +0.421875f,0.867188f, +0.429688f,0.867188f, +0.4375f,0.867188f, +0.445313f,0.867188f, +0.453125f,0.867188f, +0.460938f,0.867188f, +0.46875f,0.867188f, +0.476563f,0.867188f, +0.484375f,0.867188f, +0.492188f,0.867188f, +0.5f,0.867188f, +0.507813f,0.867188f, +0.0f,0.875f, +0.0078125f,0.875f, +0.015625f,0.875f, +0.0234375f,0.875f, +0.03125f,0.875f, +0.0390625f,0.875f, +0.046875f,0.875f, +0.0546875f,0.875f, +0.0625f,0.875f, +0.0703125f,0.875f, +0.078125f,0.875f, +0.0859375f,0.875f, +0.09375f,0.875f, +0.101563f,0.875f, +0.109375f,0.875f, +0.117188f,0.875f, +0.125f,0.875f, +0.132813f,0.875f, +0.140625f,0.875f, +0.148438f,0.875f, +0.15625f,0.875f, +0.164063f,0.875f, +0.171875f,0.875f, +0.179688f,0.875f, +0.1875f,0.875f, +0.195313f,0.875f, +0.203125f,0.875f, +0.210938f,0.875f, +0.21875f,0.875f, +0.226563f,0.875f, +0.234375f,0.875f, +0.242188f,0.875f, +0.25f,0.875f, +0.257813f,0.875f, +0.265625f,0.875f, +0.273438f,0.875f, +0.28125f,0.875f, +0.289063f,0.875f, +0.296875f,0.875f, +0.304688f,0.875f, +0.3125f,0.875f, +0.320313f,0.875f, +0.328125f,0.875f, +0.335938f,0.875f, +0.34375f,0.875f, +0.351563f,0.875f, +0.359375f,0.875f, +0.367188f,0.875f, +0.375f,0.875f, +0.382813f,0.875f, +0.390625f,0.875f, +0.398438f,0.875f, +0.40625f,0.875f, +0.414063f,0.875f, +0.421875f,0.875f, +0.429688f,0.875f, +0.4375f,0.875f, +0.445313f,0.875f, +0.453125f,0.875f, +0.460938f,0.875f, +0.46875f,0.875f, +0.476563f,0.875f, +0.484375f,0.875f, +0.492188f,0.875f, +0.5f,0.875f, +0.507813f,0.875f, +0.0f,0.882813f, +0.0078125f,0.882813f, +0.015625f,0.882813f, +0.0234375f,0.882813f, +0.03125f,0.882813f, +0.0390625f,0.882813f, +0.046875f,0.882813f, +0.0546875f,0.882813f, +0.0625f,0.882813f, +0.0703125f,0.882813f, +0.078125f,0.882813f, +0.0859375f,0.882813f, +0.09375f,0.882813f, +0.101563f,0.882813f, +0.109375f,0.882813f, +0.117188f,0.882813f, +0.125f,0.882813f, +0.132813f,0.882813f, +0.140625f,0.882813f, +0.148438f,0.882813f, +0.15625f,0.882813f, +0.164063f,0.882813f, +0.171875f,0.882813f, +0.179688f,0.882813f, +0.1875f,0.882813f, +0.195313f,0.882813f, +0.203125f,0.882813f, +0.210938f,0.882813f, +0.21875f,0.882813f, +0.226563f,0.882813f, +0.234375f,0.882813f, +0.242188f,0.882813f, +0.25f,0.882813f, +0.257813f,0.882813f, +0.265625f,0.882813f, +0.273438f,0.882813f, +0.28125f,0.882813f, +0.289063f,0.882813f, +0.296875f,0.882813f, +0.304688f,0.882813f, +0.3125f,0.882813f, +0.320313f,0.882813f, +0.328125f,0.882813f, +0.335938f,0.882813f, +0.34375f,0.882813f, +0.351563f,0.882813f, +0.359375f,0.882813f, +0.367188f,0.882813f, +0.375f,0.882813f, +0.382813f,0.882813f, +0.390625f,0.882813f, +0.398438f,0.882813f, +0.40625f,0.882813f, +0.414063f,0.882813f, +0.421875f,0.882813f, +0.429688f,0.882813f, +0.4375f,0.882813f, +0.445313f,0.882813f, +0.453125f,0.882813f, +0.460938f,0.882813f, +0.46875f,0.882813f, +0.476563f,0.882813f, +0.484375f,0.882813f, +0.492188f,0.882813f, +0.5f,0.882813f, +0.507813f,0.882813f, +0.0f,0.890625f, +0.0078125f,0.890625f, +0.015625f,0.890625f, +0.0234375f,0.890625f, +0.03125f,0.890625f, +0.0390625f,0.890625f, +0.046875f,0.890625f, +0.0546875f,0.890625f, +0.0625f,0.890625f, +0.0703125f,0.890625f, +0.078125f,0.890625f, +0.0859375f,0.890625f, +0.09375f,0.890625f, +0.101563f,0.890625f, +0.109375f,0.890625f, +0.117188f,0.890625f, +0.125f,0.890625f, +0.132813f,0.890625f, +0.140625f,0.890625f, +0.148438f,0.890625f, +0.15625f,0.890625f, +0.164063f,0.890625f, +0.171875f,0.890625f, +0.179688f,0.890625f, +0.1875f,0.890625f, +0.195313f,0.890625f, +0.203125f,0.890625f, +0.210938f,0.890625f, +0.21875f,0.890625f, +0.226563f,0.890625f, +0.234375f,0.890625f, +0.242188f,0.890625f, +0.25f,0.890625f, +0.257813f,0.890625f, +0.265625f,0.890625f, +0.273438f,0.890625f, +0.28125f,0.890625f, +0.289063f,0.890625f, +0.296875f,0.890625f, +0.304688f,0.890625f, +0.3125f,0.890625f, +0.320313f,0.890625f, +0.328125f,0.890625f, +0.335938f,0.890625f, +0.34375f,0.890625f, +0.351563f,0.890625f, +0.359375f,0.890625f, +0.367188f,0.890625f, +0.375f,0.890625f, +0.382813f,0.890625f, +0.390625f,0.890625f, +0.398438f,0.890625f, +0.40625f,0.890625f, +0.414063f,0.890625f, +0.421875f,0.890625f, +0.429688f,0.890625f, +0.4375f,0.890625f, +0.445313f,0.890625f, +0.453125f,0.890625f, +0.460938f,0.890625f, +0.46875f,0.890625f, +0.476563f,0.890625f, +0.484375f,0.890625f, +0.492188f,0.890625f, +0.5f,0.890625f, +0.507813f,0.890625f, +0.0f,0.898438f, +0.0078125f,0.898438f, +0.015625f,0.898438f, +0.0234375f,0.898438f, +0.03125f,0.898438f, +0.0390625f,0.898438f, +0.046875f,0.898438f, +0.0546875f,0.898438f, +0.0625f,0.898438f, +0.0703125f,0.898438f, +0.078125f,0.898438f, +0.0859375f,0.898438f, +0.09375f,0.898438f, +0.101563f,0.898438f, +0.109375f,0.898438f, +0.117188f,0.898438f, +0.125f,0.898438f, +0.132813f,0.898438f, +0.140625f,0.898438f, +0.148438f,0.898438f, +0.15625f,0.898438f, +0.164063f,0.898438f, +0.171875f,0.898438f, +0.179688f,0.898438f, +0.1875f,0.898438f, +0.195313f,0.898438f, +0.203125f,0.898438f, +0.210938f,0.898438f, +0.21875f,0.898438f, +0.226563f,0.898438f, +0.234375f,0.898438f, +0.242188f,0.898438f, +0.25f,0.898438f, +0.257813f,0.898438f, +0.265625f,0.898438f, +0.273438f,0.898438f, +0.28125f,0.898438f, +0.289063f,0.898438f, +0.296875f,0.898438f, +0.304688f,0.898438f, +0.3125f,0.898438f, +0.320313f,0.898438f, +0.328125f,0.898438f, +0.335938f,0.898438f, +0.34375f,0.898438f, +0.351563f,0.898438f, +0.359375f,0.898438f, +0.367188f,0.898438f, +0.375f,0.898438f, +0.382813f,0.898438f, +0.390625f,0.898438f, +0.398438f,0.898438f, +0.40625f,0.898438f, +0.414063f,0.898438f, +0.421875f,0.898438f, +0.429688f,0.898438f, +0.4375f,0.898438f, +0.445313f,0.898438f, +0.453125f,0.898438f, +0.460938f,0.898438f, +0.46875f,0.898438f, +0.476563f,0.898438f, +0.484375f,0.898438f, +0.492188f,0.898438f, +0.5f,0.898438f, +0.507813f,0.898438f, +0.0f,0.90625f, +0.0078125f,0.90625f, +0.015625f,0.90625f, +0.0234375f,0.90625f, +0.03125f,0.90625f, +0.0390625f,0.90625f, +0.046875f,0.90625f, +0.0546875f,0.90625f, +0.0625f,0.90625f, +0.0703125f,0.90625f, +0.078125f,0.90625f, +0.0859375f,0.90625f, +0.09375f,0.90625f, +0.101563f,0.90625f, +0.109375f,0.90625f, +0.117188f,0.90625f, +0.125f,0.90625f, +0.132813f,0.90625f, +0.140625f,0.90625f, +0.148438f,0.90625f, +0.15625f,0.90625f, +0.164063f,0.90625f, +0.171875f,0.90625f, +0.179688f,0.90625f, +0.1875f,0.90625f, +0.195313f,0.90625f, +0.203125f,0.90625f, +0.210938f,0.90625f, +0.21875f,0.90625f, +0.226563f,0.90625f, +0.234375f,0.90625f, +0.242188f,0.90625f, +0.25f,0.90625f, +0.257813f,0.90625f, +0.265625f,0.90625f, +0.273438f,0.90625f, +0.28125f,0.90625f, +0.289063f,0.90625f, +0.296875f,0.90625f, +0.304688f,0.90625f, +0.3125f,0.90625f, +0.320313f,0.90625f, +0.328125f,0.90625f, +0.335938f,0.90625f, +0.34375f,0.90625f, +0.351563f,0.90625f, +0.359375f,0.90625f, +0.367188f,0.90625f, +0.375f,0.90625f, +0.382813f,0.90625f, +0.390625f,0.90625f, +0.398438f,0.90625f, +0.40625f,0.90625f, +0.414063f,0.90625f, +0.421875f,0.90625f, +0.429688f,0.90625f, +0.4375f,0.90625f, +0.445313f,0.90625f, +0.453125f,0.90625f, +0.460938f,0.90625f, +0.46875f,0.90625f, +0.476563f,0.90625f, +0.484375f,0.90625f, +0.492188f,0.90625f, +0.5f,0.90625f, +0.507813f,0.90625f, +0.0f,0.914063f, +0.0078125f,0.914063f, +0.015625f,0.914063f, +0.0234375f,0.914063f, +0.03125f,0.914063f, +0.0390625f,0.914063f, +0.046875f,0.914063f, +0.0546875f,0.914063f, +0.0625f,0.914063f, +0.0703125f,0.914063f, +0.078125f,0.914063f, +0.0859375f,0.914063f, +0.09375f,0.914063f, +0.101563f,0.914063f, +0.109375f,0.914063f, +0.117188f,0.914063f, +0.125f,0.914063f, +0.132813f,0.914063f, +0.140625f,0.914063f, +0.148438f,0.914063f, +0.15625f,0.914063f, +0.164063f,0.914063f, +0.171875f,0.914063f, +0.179688f,0.914063f, +0.1875f,0.914063f, +0.195313f,0.914063f, +0.203125f,0.914063f, +0.210938f,0.914063f, +0.21875f,0.914063f, +0.226563f,0.914063f, +0.234375f,0.914063f, +0.242188f,0.914063f, +0.25f,0.914063f, +0.257813f,0.914063f, +0.265625f,0.914063f, +0.273438f,0.914063f, +0.28125f,0.914063f, +0.289063f,0.914063f, +0.296875f,0.914063f, +0.304688f,0.914063f, +0.3125f,0.914063f, +0.320313f,0.914063f, +0.328125f,0.914063f, +0.335938f,0.914063f, +0.34375f,0.914063f, +0.351563f,0.914063f, +0.359375f,0.914063f, +0.367188f,0.914063f, +0.375f,0.914063f, +0.382813f,0.914063f, +0.390625f,0.914063f, +0.398438f,0.914063f, +0.40625f,0.914063f, +0.414063f,0.914063f, +0.421875f,0.914063f, +0.429688f,0.914063f, +0.4375f,0.914063f, +0.445313f,0.914063f, +0.453125f,0.914063f, +0.460938f,0.914063f, +0.46875f,0.914063f, +0.476563f,0.914063f, +0.484375f,0.914063f, +0.492188f,0.914063f, +0.5f,0.914063f, +0.507813f,0.914063f, +0.0f,0.921875f, +0.0078125f,0.921875f, +0.015625f,0.921875f, +0.0234375f,0.921875f, +0.03125f,0.921875f, +0.0390625f,0.921875f, +0.046875f,0.921875f, +0.0546875f,0.921875f, +0.0625f,0.921875f, +0.0703125f,0.921875f, +0.078125f,0.921875f, +0.0859375f,0.921875f, +0.09375f,0.921875f, +0.101563f,0.921875f, +0.109375f,0.921875f, +0.117188f,0.921875f, +0.125f,0.921875f, +0.132813f,0.921875f, +0.140625f,0.921875f, +0.148438f,0.921875f, +0.15625f,0.921875f, +0.164063f,0.921875f, +0.171875f,0.921875f, +0.179688f,0.921875f, +0.1875f,0.921875f, +0.195313f,0.921875f, +0.203125f,0.921875f, +0.210938f,0.921875f, +0.21875f,0.921875f, +0.226563f,0.921875f, +0.234375f,0.921875f, +0.242188f,0.921875f, +0.25f,0.921875f, +0.257813f,0.921875f, +0.265625f,0.921875f, +0.273438f,0.921875f, +0.28125f,0.921875f, +0.289063f,0.921875f, +0.296875f,0.921875f, +0.304688f,0.921875f, +0.3125f,0.921875f, +0.320313f,0.921875f, +0.328125f,0.921875f, +0.335938f,0.921875f, +0.34375f,0.921875f, +0.351563f,0.921875f, +0.359375f,0.921875f, +0.367188f,0.921875f, +0.375f,0.921875f, +0.382813f,0.921875f, +0.390625f,0.921875f, +0.398438f,0.921875f, +0.40625f,0.921875f, +0.414063f,0.921875f, +0.421875f,0.921875f, +0.429688f,0.921875f, +0.4375f,0.921875f, +0.445313f,0.921875f, +0.453125f,0.921875f, +0.460938f,0.921875f, +0.46875f,0.921875f, +0.476563f,0.921875f, +0.484375f,0.921875f, +0.492188f,0.921875f, +0.5f,0.921875f, +0.507813f,0.921875f, +0.0f,0.929688f, +0.0078125f,0.929688f, +0.015625f,0.929688f, +0.0234375f,0.929688f, +0.03125f,0.929688f, +0.0390625f,0.929688f, +0.046875f,0.929688f, +0.0546875f,0.929688f, +0.0625f,0.929688f, +0.0703125f,0.929688f, +0.078125f,0.929688f, +0.0859375f,0.929688f, +0.09375f,0.929688f, +0.101563f,0.929688f, +0.109375f,0.929688f, +0.117188f,0.929688f, +0.125f,0.929688f, +0.132813f,0.929688f, +0.140625f,0.929688f, +0.148438f,0.929688f, +0.15625f,0.929688f, +0.164063f,0.929688f, +0.171875f,0.929688f, +0.179688f,0.929688f, +0.1875f,0.929688f, +0.195313f,0.929688f, +0.203125f,0.929688f, +0.210938f,0.929688f, +0.21875f,0.929688f, +0.226563f,0.929688f, +0.234375f,0.929688f, +0.242188f,0.929688f, +0.25f,0.929688f, +0.257813f,0.929688f, +0.265625f,0.929688f, +0.273438f,0.929688f, +0.28125f,0.929688f, +0.289063f,0.929688f, +0.296875f,0.929688f, +0.304688f,0.929688f, +0.3125f,0.929688f, +0.320313f,0.929688f, +0.328125f,0.929688f, +0.335938f,0.929688f, +0.34375f,0.929688f, +0.351563f,0.929688f, +0.359375f,0.929688f, +0.367188f,0.929688f, +0.375f,0.929688f, +0.382813f,0.929688f, +0.390625f,0.929688f, +0.398438f,0.929688f, +0.40625f,0.929688f, +0.414063f,0.929688f, +0.421875f,0.929688f, +0.429688f,0.929688f, +0.4375f,0.929688f, +0.445313f,0.929688f, +0.453125f,0.929688f, +0.460938f,0.929688f, +0.46875f,0.929688f, +0.476563f,0.929688f, +0.484375f,0.929688f, +0.492188f,0.929688f, +0.5f,0.929688f, +0.507813f,0.929688f, +0.0f,0.9375f, +0.0078125f,0.9375f, +0.015625f,0.9375f, +0.0234375f,0.9375f, +0.03125f,0.9375f, +0.0390625f,0.9375f, +0.046875f,0.9375f, +0.0546875f,0.9375f, +0.0625f,0.9375f, +0.0703125f,0.9375f, +0.078125f,0.9375f, +0.0859375f,0.9375f, +0.09375f,0.9375f, +0.101563f,0.9375f, +0.109375f,0.9375f, +0.117188f,0.9375f, +0.125f,0.9375f, +0.132813f,0.9375f, +0.140625f,0.9375f, +0.148438f,0.9375f, +0.15625f,0.9375f, +0.164063f,0.9375f, +0.171875f,0.9375f, +0.179688f,0.9375f, +0.1875f,0.9375f, +0.195313f,0.9375f, +0.203125f,0.9375f, +0.210938f,0.9375f, +0.21875f,0.9375f, +0.226563f,0.9375f, +0.234375f,0.9375f, +0.242188f,0.9375f, +0.25f,0.9375f, +0.257813f,0.9375f, +0.265625f,0.9375f, +0.273438f,0.9375f, +0.28125f,0.9375f, +0.289063f,0.9375f, +0.296875f,0.9375f, +0.304688f,0.9375f, +0.3125f,0.9375f, +0.320313f,0.9375f, +0.328125f,0.9375f, +0.335938f,0.9375f, +0.34375f,0.9375f, +0.351563f,0.9375f, +0.359375f,0.9375f, +0.367188f,0.9375f, +0.375f,0.9375f, +0.382813f,0.9375f, +0.390625f,0.9375f, +0.398438f,0.9375f, +0.40625f,0.9375f, +0.414063f,0.9375f, +0.421875f,0.9375f, +0.429688f,0.9375f, +0.4375f,0.9375f, +0.445313f,0.9375f, +0.453125f,0.9375f, +0.460938f,0.9375f, +0.46875f,0.9375f, +0.476563f,0.9375f, +0.484375f,0.9375f, +0.492188f,0.9375f, +0.5f,0.9375f, +0.507813f,0.9375f, +0.0f,0.945313f, +0.0078125f,0.945313f, +0.015625f,0.945313f, +0.0234375f,0.945313f, +0.03125f,0.945313f, +0.0390625f,0.945313f, +0.046875f,0.945313f, +0.0546875f,0.945313f, +0.0625f,0.945313f, +0.0703125f,0.945313f, +0.078125f,0.945313f, +0.0859375f,0.945313f, +0.09375f,0.945313f, +0.101563f,0.945313f, +0.109375f,0.945313f, +0.117188f,0.945313f, +0.125f,0.945313f, +0.132813f,0.945313f, +0.140625f,0.945313f, +0.148438f,0.945313f, +0.15625f,0.945313f, +0.164063f,0.945313f, +0.171875f,0.945313f, +0.179688f,0.945313f, +0.1875f,0.945313f, +0.195313f,0.945313f, +0.203125f,0.945313f, +0.210938f,0.945313f, +0.21875f,0.945313f, +0.226563f,0.945313f, +0.234375f,0.945313f, +0.242188f,0.945313f, +0.25f,0.945313f, +0.257813f,0.945313f, +0.265625f,0.945313f, +0.273438f,0.945313f, +0.28125f,0.945313f, +0.289063f,0.945313f, +0.296875f,0.945313f, +0.304688f,0.945313f, +0.3125f,0.945313f, +0.320313f,0.945313f, +0.328125f,0.945313f, +0.335938f,0.945313f, +0.34375f,0.945313f, +0.351563f,0.945313f, +0.359375f,0.945313f, +0.367188f,0.945313f, +0.375f,0.945313f, +0.382813f,0.945313f, +0.390625f,0.945313f, +0.398438f,0.945313f, +0.40625f,0.945313f, +0.414063f,0.945313f, +0.421875f,0.945313f, +0.429688f,0.945313f, +0.4375f,0.945313f, +0.445313f,0.945313f, +0.453125f,0.945313f, +0.460938f,0.945313f, +0.46875f,0.945313f, +0.476563f,0.945313f, +0.484375f,0.945313f, +0.492188f,0.945313f, +0.5f,0.945313f, +0.507813f,0.945313f, +0.0f,0.953125f, +0.0078125f,0.953125f, +0.015625f,0.953125f, +0.0234375f,0.953125f, +0.03125f,0.953125f, +0.0390625f,0.953125f, +0.046875f,0.953125f, +0.0546875f,0.953125f, +0.0625f,0.953125f, +0.0703125f,0.953125f, +0.078125f,0.953125f, +0.0859375f,0.953125f, +0.09375f,0.953125f, +0.101563f,0.953125f, +0.109375f,0.953125f, +0.117188f,0.953125f, +0.125f,0.953125f, +0.132813f,0.953125f, +0.140625f,0.953125f, +0.148438f,0.953125f, +0.15625f,0.953125f, +0.164063f,0.953125f, +0.171875f,0.953125f, +0.179688f,0.953125f, +0.1875f,0.953125f, +0.195313f,0.953125f, +0.203125f,0.953125f, +0.210938f,0.953125f, +0.21875f,0.953125f, +0.226563f,0.953125f, +0.234375f,0.953125f, +0.242188f,0.953125f, +0.25f,0.953125f, +0.257813f,0.953125f, +0.265625f,0.953125f, +0.273438f,0.953125f, +0.28125f,0.953125f, +0.289063f,0.953125f, +0.296875f,0.953125f, +0.304688f,0.953125f, +0.3125f,0.953125f, +0.320313f,0.953125f, +0.328125f,0.953125f, +0.335938f,0.953125f, +0.34375f,0.953125f, +0.351563f,0.953125f, +0.359375f,0.953125f, +0.367188f,0.953125f, +0.375f,0.953125f, +0.382813f,0.953125f, +0.390625f,0.953125f, +0.398438f,0.953125f, +0.40625f,0.953125f, +0.414063f,0.953125f, +0.421875f,0.953125f, +0.429688f,0.953125f, +0.4375f,0.953125f, +0.445313f,0.953125f, +0.453125f,0.953125f, +0.460938f,0.953125f, +0.46875f,0.953125f, +0.476563f,0.953125f, +0.484375f,0.953125f, +0.492188f,0.953125f, +0.5f,0.953125f, +0.507813f,0.953125f, +0.0f,0.960938f, +0.0078125f,0.960938f, +0.015625f,0.960938f, +0.0234375f,0.960938f, +0.03125f,0.960938f, +0.0390625f,0.960938f, +0.046875f,0.960938f, +0.0546875f,0.960938f, +0.0625f,0.960938f, +0.0703125f,0.960938f, +0.078125f,0.960938f, +0.0859375f,0.960938f, +0.09375f,0.960938f, +0.101563f,0.960938f, +0.109375f,0.960938f, +0.117188f,0.960938f, +0.125f,0.960938f, +0.132813f,0.960938f, +0.140625f,0.960938f, +0.148438f,0.960938f, +0.15625f,0.960938f, +0.164063f,0.960938f, +0.171875f,0.960938f, +0.179688f,0.960938f, +0.1875f,0.960938f, +0.195313f,0.960938f, +0.203125f,0.960938f, +0.210938f,0.960938f, +0.21875f,0.960938f, +0.226563f,0.960938f, +0.234375f,0.960938f, +0.242188f,0.960938f, +0.25f,0.960938f, +0.257813f,0.960938f, +0.265625f,0.960938f, +0.273438f,0.960938f, +0.28125f,0.960938f, +0.289063f,0.960938f, +0.296875f,0.960938f, +0.304688f,0.960938f, +0.3125f,0.960938f, +0.320313f,0.960938f, +0.328125f,0.960938f, +0.335938f,0.960938f, +0.34375f,0.960938f, +0.351563f,0.960938f, +0.359375f,0.960938f, +0.367188f,0.960938f, +0.375f,0.960938f, +0.382813f,0.960938f, +0.390625f,0.960938f, +0.398438f,0.960938f, +0.40625f,0.960938f, +0.414063f,0.960938f, +0.421875f,0.960938f, +0.429688f,0.960938f, +0.4375f,0.960938f, +0.445313f,0.960938f, +0.453125f,0.960938f, +0.460938f,0.960938f, +0.46875f,0.960938f, +0.476563f,0.960938f, +0.484375f,0.960938f, +0.492188f,0.960938f, +0.5f,0.960938f, +0.507813f,0.960938f, +0.0f,0.96875f, +0.0078125f,0.96875f, +0.015625f,0.96875f, +0.0234375f,0.96875f, +0.03125f,0.96875f, +0.0390625f,0.96875f, +0.046875f,0.96875f, +0.0546875f,0.96875f, +0.0625f,0.96875f, +0.0703125f,0.96875f, +0.078125f,0.96875f, +0.0859375f,0.96875f, +0.09375f,0.96875f, +0.101563f,0.96875f, +0.109375f,0.96875f, +0.117188f,0.96875f, +0.125f,0.96875f, +0.132813f,0.96875f, +0.140625f,0.96875f, +0.148438f,0.96875f, +0.15625f,0.96875f, +0.164063f,0.96875f, +0.171875f,0.96875f, +0.179688f,0.96875f, +0.1875f,0.96875f, +0.195313f,0.96875f, +0.203125f,0.96875f, +0.210938f,0.96875f, +0.21875f,0.96875f, +0.226563f,0.96875f, +0.234375f,0.96875f, +0.242188f,0.96875f, +0.25f,0.96875f, +0.257813f,0.96875f, +0.265625f,0.96875f, +0.273438f,0.96875f, +0.28125f,0.96875f, +0.289063f,0.96875f, +0.296875f,0.96875f, +0.304688f,0.96875f, +0.3125f,0.96875f, +0.320313f,0.96875f, +0.328125f,0.96875f, +0.335938f,0.96875f, +0.34375f,0.96875f, +0.351563f,0.96875f, +0.359375f,0.96875f, +0.367188f,0.96875f, +0.375f,0.96875f, +0.382813f,0.96875f, +0.390625f,0.96875f, +0.398438f,0.96875f, +0.40625f,0.96875f, +0.414063f,0.96875f, +0.421875f,0.96875f, +0.429688f,0.96875f, +0.4375f,0.96875f, +0.445313f,0.96875f, +0.453125f,0.96875f, +0.460938f,0.96875f, +0.46875f,0.96875f, +0.476563f,0.96875f, +0.484375f,0.96875f, +0.492188f,0.96875f, +0.5f,0.96875f, +0.507813f,0.96875f, +0.0f,0.976563f, +0.0078125f,0.976563f, +0.015625f,0.976563f, +0.0234375f,0.976563f, +0.03125f,0.976563f, +0.0390625f,0.976563f, +0.046875f,0.976563f, +0.0546875f,0.976563f, +0.0625f,0.976563f, +0.0703125f,0.976563f, +0.078125f,0.976563f, +0.0859375f,0.976563f, +0.09375f,0.976563f, +0.101563f,0.976563f, +0.109375f,0.976563f, +0.117188f,0.976563f, +0.125f,0.976563f, +0.132813f,0.976563f, +0.140625f,0.976563f, +0.148438f,0.976563f, +0.15625f,0.976563f, +0.164063f,0.976563f, +0.171875f,0.976563f, +0.179688f,0.976563f, +0.1875f,0.976563f, +0.195313f,0.976563f, +0.203125f,0.976563f, +0.210938f,0.976563f, +0.21875f,0.976563f, +0.226563f,0.976563f, +0.234375f,0.976563f, +0.242188f,0.976563f, +0.25f,0.976563f, +0.257813f,0.976563f, +0.265625f,0.976563f, +0.273438f,0.976563f, +0.28125f,0.976563f, +0.289063f,0.976563f, +0.296875f,0.976563f, +0.304688f,0.976563f, +0.3125f,0.976563f, +0.320313f,0.976563f, +0.328125f,0.976563f, +0.335938f,0.976563f, +0.34375f,0.976563f, +0.351563f,0.976563f, +0.359375f,0.976563f, +0.367188f,0.976563f, +0.375f,0.976563f, +0.382813f,0.976563f, +0.390625f,0.976563f, +0.398438f,0.976563f, +0.40625f,0.976563f, +0.414063f,0.976563f, +0.421875f,0.976563f, +0.429688f,0.976563f, +0.4375f,0.976563f, +0.445313f,0.976563f, +0.453125f,0.976563f, +0.460938f,0.976563f, +0.46875f,0.976563f, +0.476563f,0.976563f, +0.484375f,0.976563f, +0.492188f,0.976563f, +0.5f,0.976563f, +0.507813f,0.976563f, +0.0f,0.984375f, +0.0078125f,0.984375f, +0.015625f,0.984375f, +0.0234375f,0.984375f, +0.03125f,0.984375f, +0.0390625f,0.984375f, +0.046875f,0.984375f, +0.0546875f,0.984375f, +0.0625f,0.984375f, +0.0703125f,0.984375f, +0.078125f,0.984375f, +0.0859375f,0.984375f, +0.09375f,0.984375f, +0.101563f,0.984375f, +0.109375f,0.984375f, +0.117188f,0.984375f, +0.125f,0.984375f, +0.132813f,0.984375f, +0.140625f,0.984375f, +0.148438f,0.984375f, +0.15625f,0.984375f, +0.164063f,0.984375f, +0.171875f,0.984375f, +0.179688f,0.984375f, +0.1875f,0.984375f, +0.195313f,0.984375f, +0.203125f,0.984375f, +0.210938f,0.984375f, +0.21875f,0.984375f, +0.226563f,0.984375f, +0.234375f,0.984375f, +0.242188f,0.984375f, +0.25f,0.984375f, +0.257813f,0.984375f, +0.265625f,0.984375f, +0.273438f,0.984375f, +0.28125f,0.984375f, +0.289063f,0.984375f, +0.296875f,0.984375f, +0.304688f,0.984375f, +0.3125f,0.984375f, +0.320313f,0.984375f, +0.328125f,0.984375f, +0.335938f,0.984375f, +0.34375f,0.984375f, +0.351563f,0.984375f, +0.359375f,0.984375f, +0.367188f,0.984375f, +0.375f,0.984375f, +0.382813f,0.984375f, +0.390625f,0.984375f, +0.398438f,0.984375f, +0.40625f,0.984375f, +0.414063f,0.984375f, +0.421875f,0.984375f, +0.429688f,0.984375f, +0.4375f,0.984375f, +0.445313f,0.984375f, +0.453125f,0.984375f, +0.460938f,0.984375f, +0.46875f,0.984375f, +0.476563f,0.984375f, +0.484375f,0.984375f, +0.492188f,0.984375f, +0.5f,0.984375f, +0.507813f,0.984375f, +0.0f,0.992188f, +0.0078125f,0.992188f, +0.015625f,0.992188f, +0.0234375f,0.992188f, +0.03125f,0.992188f, +0.0390625f,0.992188f, +0.046875f,0.992188f, +0.0546875f,0.992188f, +0.0625f,0.992188f, +0.0703125f,0.992188f, +0.078125f,0.992188f, +0.0859375f,0.992188f, +0.09375f,0.992188f, +0.101563f,0.992188f, +0.109375f,0.992188f, +0.117188f,0.992188f, +0.125f,0.992188f, +0.132813f,0.992188f, +0.140625f,0.992188f, +0.148438f,0.992188f, +0.15625f,0.992188f, +0.164063f,0.992188f, +0.171875f,0.992188f, +0.179688f,0.992188f, +0.1875f,0.992188f, +0.195313f,0.992188f, +0.203125f,0.992188f, +0.210938f,0.992188f, +0.21875f,0.992188f, +0.226563f,0.992188f, +0.234375f,0.992188f, +0.242188f,0.992188f, +0.25f,0.992188f, +0.257813f,0.992188f, +0.265625f,0.992188f, +0.273438f,0.992188f, +0.28125f,0.992188f, +0.289063f,0.992188f, +0.296875f,0.992188f, +0.304688f,0.992188f, +0.3125f,0.992188f, +0.320313f,0.992188f, +0.328125f,0.992188f, +0.335938f,0.992188f, +0.34375f,0.992188f, +0.351563f,0.992188f, +0.359375f,0.992188f, +0.367188f,0.992188f, +0.375f,0.992188f, +0.382813f,0.992188f, +0.390625f,0.992188f, +0.398438f,0.992188f, +0.40625f,0.992188f, +0.414063f,0.992188f, +0.421875f,0.992188f, +0.429688f,0.992188f, +0.4375f,0.992188f, +0.445313f,0.992188f, +0.453125f,0.992188f, +0.460938f,0.992188f, +0.46875f,0.992188f, +0.476563f,0.992188f, +0.484375f,0.992188f, +0.492188f,0.992188f, +0.5f,0.992188f, +0.507813f,0.992188f, +0.0f,1.0f, +0.0078125f,1.0f, +0.015625f,1.0f, +0.0234375f,1.0f, +0.03125f,1.0f, +0.0390625f,1.0f, +0.046875f,1.0f, +0.0546875f,1.0f, +0.0625f,1.0f, +0.0703125f,1.0f, +0.078125f,1.0f, +0.0859375f,1.0f, +0.09375f,1.0f, +0.101563f,1.0f, +0.109375f,1.0f, +0.117188f,1.0f, +0.125f,1.0f, +0.132813f,1.0f, +0.140625f,1.0f, +0.148438f,1.0f, +0.15625f,1.0f, +0.164063f,1.0f, +0.171875f,1.0f, +0.179688f,1.0f, +0.1875f,1.0f, +0.195313f,1.0f, +0.203125f,1.0f, +0.210938f,1.0f, +0.21875f,1.0f, +0.226563f,1.0f, +0.234375f,1.0f, +0.242188f,1.0f, +0.25f,1.0f, +0.257813f,1.0f, +0.265625f,1.0f, +0.273438f,1.0f, +0.28125f,1.0f, +0.289063f,1.0f, +0.296875f,1.0f, +0.304688f,1.0f, +0.3125f,1.0f, +0.320313f,1.0f, +0.328125f,1.0f, +0.335938f,1.0f, +0.34375f,1.0f, +0.351563f,1.0f, +0.359375f,1.0f, +0.367188f,1.0f, +0.375f,1.0f, +0.382813f,1.0f, +0.390625f,1.0f, +0.398438f,1.0f, +0.40625f,1.0f, +0.414063f,1.0f, +0.421875f,1.0f, +0.429688f,1.0f, +0.4375f,1.0f, +0.445313f,1.0f, +0.453125f,1.0f, +0.460938f,1.0f, +0.46875f,1.0f, +0.476563f,1.0f, +0.484375f,1.0f, +0.492188f,1.0f, +0.5f,1.0f, +0.507813f,1.0f, +}; + +unsigned short Landscape08Idx[] = { +0,1,2, +3,2,1, +2,3,4, +5,4,3, +4,5,6, +7,6,5, +6,7,8, +9,8,7, +8,9,10, +11,10,9, +10,11,12, +13,12,11, +12,13,14, +15,14,13, +14,15,16, +17,16,15, +16,17,18, +19,18,17, +18,19,20, +21,20,19, +20,21,22, +23,22,21, +22,23,24, +25,24,23, +24,25,26, +27,26,25, +26,27,28, +29,28,27, +28,29,30, +31,30,29, +30,31,32, +33,32,31, +32,33,34, +35,34,33, +34,35,36, +37,36,35, +36,37,38, +39,38,37, +38,39,40, +41,40,39, +40,41,42, +43,42,41, +42,43,44, +45,44,43, +44,45,46, +47,46,45, +46,47,48, +49,48,47, +48,49,50, +51,50,49, +50,51,52, +53,52,51, +52,53,54, +55,54,53, +54,55,56, +57,56,55, +56,57,58, +59,58,57, +58,59,60, +61,60,59, +60,61,62, +63,62,61, +62,63,64, +65,64,63, +64,65,66, +67,66,65, +66,67,68, +69,68,67, +68,69,70, +71,70,69, +70,71,72, +73,72,71, +72,73,74, +75,74,73, +74,75,76, +77,76,75, +76,77,78, +79,78,77, +78,79,80, +81,80,79, +80,81,82, +83,82,81, +82,83,84, +85,84,83, +84,85,86, +87,86,85, +86,87,88, +89,88,87, +88,89,90, +91,90,89, +90,91,92, +93,92,91, +92,93,94, +95,94,93, +94,95,96, +97,96,95, +96,97,98, +99,98,97, +98,99,100, +101,100,99, +100,101,102, +103,102,101, +102,103,104, +105,104,103, +104,105,106, +107,106,105, +106,107,108, +109,108,107, +108,109,110, +111,110,109, +110,111,112, +113,112,111, +112,113,114, +115,114,113, +114,115,116, +117,116,115, +116,117,118, +119,118,117, +118,119,120, +121,120,119, +120,121,122, +123,122,121, +122,123,124, +125,124,123, +124,125,126, +127,126,125, +126,127,128, +129,128,127, +128,129,130, +131,130,129, +132,0,133, +2,133,0, +133,2,134, +4,134,2, +134,4,135, +6,135,4, +135,6,136, +8,136,6, +136,8,137, +10,137,8, +137,10,138, +12,138,10, +138,12,139, +14,139,12, +139,14,140, +16,140,14, +140,16,141, +18,141,16, +141,18,142, +20,142,18, +142,20,143, +22,143,20, +143,22,144, +24,144,22, +144,24,145, +26,145,24, +145,26,146, +28,146,26, +146,28,147, +30,147,28, +147,30,148, +32,148,30, +148,32,149, +34,149,32, +149,34,150, +36,150,34, +150,36,151, +38,151,36, +151,38,152, +40,152,38, +152,40,153, +42,153,40, +153,42,154, +44,154,42, +154,44,155, +46,155,44, +155,46,156, +48,156,46, +156,48,157, +50,157,48, +157,50,158, +52,158,50, +158,52,159, +54,159,52, +159,54,160, +56,160,54, +160,56,161, +58,161,56, +161,58,162, +60,162,58, +162,60,163, +62,163,60, +163,62,164, +64,164,62, +164,64,165, +66,165,64, +165,66,166, +68,166,66, +166,68,167, +70,167,68, +167,70,168, +72,168,70, +168,72,169, +74,169,72, +169,74,170, +76,170,74, +170,76,171, +78,171,76, +171,78,172, +80,172,78, +172,80,173, +82,173,80, +173,82,174, +84,174,82, +174,84,175, +86,175,84, +175,86,176, +88,176,86, +176,88,177, +90,177,88, +177,90,178, +92,178,90, +178,92,179, +94,179,92, +179,94,180, +96,180,94, +180,96,181, +98,181,96, +181,98,182, +100,182,98, +182,100,183, +102,183,100, +183,102,184, +104,184,102, +184,104,185, +106,185,104, +185,106,186, +108,186,106, +186,108,187, +110,187,108, +187,110,188, +112,188,110, +188,112,189, +114,189,112, +189,114,190, +116,190,114, +190,116,191, +118,191,116, +191,118,192, +120,192,118, +192,120,193, +122,193,120, +193,122,194, +124,194,122, +194,124,195, +126,195,124, +195,126,196, +128,196,126, +196,128,197, +130,197,128, +198,132,199, +133,199,132, +199,133,200, +134,200,133, +200,134,201, +135,201,134, +201,135,202, +136,202,135, +202,136,203, +137,203,136, +203,137,204, +138,204,137, +204,138,205, +139,205,138, +205,139,206, +140,206,139, +206,140,207, +141,207,140, +207,141,208, +142,208,141, +208,142,209, +143,209,142, +209,143,210, +144,210,143, +210,144,211, +145,211,144, +211,145,212, +146,212,145, +212,146,213, +147,213,146, +213,147,214, +148,214,147, +214,148,215, +149,215,148, +215,149,216, +150,216,149, +216,150,217, +151,217,150, +217,151,218, +152,218,151, +218,152,219, +153,219,152, +219,153,220, +154,220,153, +220,154,221, +155,221,154, +221,155,222, +156,222,155, +222,156,223, +157,223,156, +223,157,224, +158,224,157, +224,158,225, +159,225,158, +225,159,226, +160,226,159, +226,160,227, +161,227,160, +227,161,228, +162,228,161, +228,162,229, +163,229,162, +229,163,230, +164,230,163, +230,164,231, +165,231,164, +231,165,232, +166,232,165, +232,166,233, +167,233,166, +233,167,234, +168,234,167, +234,168,235, +169,235,168, +235,169,236, +170,236,169, +236,170,237, +171,237,170, +237,171,238, +172,238,171, +238,172,239, +173,239,172, +239,173,240, +174,240,173, +240,174,241, +175,241,174, +241,175,242, +176,242,175, +242,176,243, +177,243,176, +243,177,244, +178,244,177, +244,178,245, +179,245,178, +245,179,246, +180,246,179, +246,180,247, +181,247,180, +247,181,248, +182,248,181, +248,182,249, +183,249,182, +249,183,250, +184,250,183, +250,184,251, +185,251,184, +251,185,252, +186,252,185, +252,186,253, +187,253,186, +253,187,254, +188,254,187, +254,188,255, +189,255,188, +255,189,256, +190,256,189, +256,190,257, +191,257,190, +257,191,258, +192,258,191, +258,192,259, +193,259,192, +259,193,260, +194,260,193, +260,194,261, +195,261,194, +261,195,262, +196,262,195, +262,196,263, +197,263,196, +264,198,265, +199,265,198, +265,199,266, +200,266,199, +266,200,267, +201,267,200, +267,201,268, +202,268,201, +268,202,269, +203,269,202, +269,203,270, +204,270,203, +270,204,271, +205,271,204, +271,205,272, +206,272,205, +272,206,273, +207,273,206, +273,207,274, +208,274,207, +274,208,275, +209,275,208, +275,209,276, +210,276,209, +276,210,277, +211,277,210, +277,211,278, +212,278,211, +278,212,279, +213,279,212, +279,213,280, +214,280,213, +280,214,281, +215,281,214, +281,215,282, +216,282,215, +282,216,283, +217,283,216, +283,217,284, +218,284,217, +284,218,285, +219,285,218, +285,219,286, +220,286,219, +286,220,287, +221,287,220, +287,221,288, +222,288,221, +288,222,289, +223,289,222, +289,223,290, +224,290,223, +290,224,291, +225,291,224, +291,225,292, +226,292,225, +292,226,293, +227,293,226, +293,227,294, +228,294,227, +294,228,295, +229,295,228, +295,229,296, +230,296,229, +296,230,297, +231,297,230, +297,231,298, +232,298,231, +298,232,299, +233,299,232, +299,233,300, +234,300,233, +300,234,301, +235,301,234, +301,235,302, +236,302,235, +302,236,303, +237,303,236, +303,237,304, +238,304,237, +304,238,305, +239,305,238, +305,239,306, +240,306,239, +306,240,307, +241,307,240, +307,241,308, +242,308,241, +308,242,309, +243,309,242, +309,243,310, +244,310,243, +310,244,311, +245,311,244, +311,245,312, +246,312,245, +312,246,313, +247,313,246, +313,247,314, +248,314,247, +314,248,315, +249,315,248, +315,249,316, +250,316,249, +316,250,317, +251,317,250, +317,251,318, +252,318,251, +318,252,319, +253,319,252, +319,253,320, +254,320,253, +320,254,321, +255,321,254, +321,255,322, +256,322,255, +322,256,323, +257,323,256, +323,257,324, +258,324,257, +324,258,325, +259,325,258, +325,259,326, +260,326,259, +326,260,327, +261,327,260, +327,261,328, +262,328,261, +328,262,329, +263,329,262, +330,264,331, +265,331,264, +331,265,332, +266,332,265, +332,266,333, +267,333,266, +333,267,334, +268,334,267, +334,268,335, +269,335,268, +335,269,336, +270,336,269, +336,270,337, +271,337,270, +337,271,338, +272,338,271, +338,272,339, +273,339,272, +339,273,340, +274,340,273, +340,274,341, +275,341,274, +341,275,342, +276,342,275, +342,276,343, +277,343,276, +343,277,344, +278,344,277, +344,278,345, +279,345,278, +345,279,346, +280,346,279, +346,280,347, +281,347,280, +347,281,348, +282,348,281, +348,282,349, +283,349,282, +349,283,350, +284,350,283, +350,284,351, +285,351,284, +351,285,352, +286,352,285, +352,286,353, +287,353,286, +353,287,354, +288,354,287, +354,288,355, +289,355,288, +355,289,356, +290,356,289, +356,290,357, +291,357,290, +357,291,358, +292,358,291, +358,292,359, +293,359,292, +359,293,360, +294,360,293, +360,294,361, +295,361,294, +361,295,362, +296,362,295, +362,296,363, +297,363,296, +363,297,364, +298,364,297, +364,298,365, +299,365,298, +365,299,366, +300,366,299, +366,300,367, +301,367,300, +367,301,368, +302,368,301, +368,302,369, +303,369,302, +369,303,370, +304,370,303, +370,304,371, +305,371,304, +371,305,372, +306,372,305, +372,306,373, +307,373,306, +373,307,374, +308,374,307, +374,308,375, +309,375,308, +375,309,376, +310,376,309, +376,310,377, +311,377,310, +377,311,378, +312,378,311, +378,312,379, +313,379,312, +379,313,380, +314,380,313, +380,314,381, +315,381,314, +381,315,382, +316,382,315, +382,316,383, +317,383,316, +383,317,384, +318,384,317, +384,318,385, +319,385,318, +385,319,386, +320,386,319, +386,320,387, +321,387,320, +387,321,388, +322,388,321, +388,322,389, +323,389,322, +389,323,390, +324,390,323, +390,324,391, +325,391,324, +391,325,392, +326,392,325, +392,326,393, +327,393,326, +393,327,394, +328,394,327, +394,328,395, +329,395,328, +396,330,397, +331,397,330, +397,331,398, +332,398,331, +398,332,399, +333,399,332, +399,333,400, +334,400,333, +400,334,401, +335,401,334, +401,335,402, +336,402,335, +402,336,403, +337,403,336, +403,337,404, +338,404,337, +404,338,405, +339,405,338, +405,339,406, +340,406,339, +406,340,407, +341,407,340, +407,341,408, +342,408,341, +408,342,409, +343,409,342, +409,343,410, +344,410,343, +410,344,411, +345,411,344, +411,345,412, +346,412,345, +412,346,413, +347,413,346, +413,347,414, +348,414,347, +414,348,415, +349,415,348, +415,349,416, +350,416,349, +416,350,417, +351,417,350, +417,351,418, +352,418,351, +418,352,419, +353,419,352, +419,353,420, +354,420,353, +420,354,421, +355,421,354, +421,355,422, +356,422,355, +422,356,423, +357,423,356, +423,357,424, +358,424,357, +424,358,425, +359,425,358, +425,359,426, +360,426,359, +426,360,427, +361,427,360, +427,361,428, +362,428,361, +428,362,429, +363,429,362, +429,363,430, +364,430,363, +430,364,431, +365,431,364, +431,365,432, +366,432,365, +432,366,433, +367,433,366, +433,367,434, +368,434,367, +434,368,435, +369,435,368, +435,369,436, +370,436,369, +436,370,437, +371,437,370, +437,371,438, +372,438,371, +438,372,439, +373,439,372, +439,373,440, +374,440,373, +440,374,441, +375,441,374, +441,375,442, +376,442,375, +442,376,443, +377,443,376, +443,377,444, +378,444,377, +444,378,445, +379,445,378, +445,379,446, +380,446,379, +446,380,447, +381,447,380, +447,381,448, +382,448,381, +448,382,449, +383,449,382, +449,383,450, +384,450,383, +450,384,451, +385,451,384, +451,385,452, +386,452,385, +452,386,453, +387,453,386, +453,387,454, +388,454,387, +454,388,455, +389,455,388, +455,389,456, +390,456,389, +456,390,457, +391,457,390, +457,391,458, +392,458,391, +458,392,459, +393,459,392, +459,393,460, +394,460,393, +460,394,461, +395,461,394, +462,396,463, +397,463,396, +463,397,464, +398,464,397, +464,398,465, +399,465,398, +465,399,466, +400,466,399, +466,400,467, +401,467,400, +467,401,468, +402,468,401, +468,402,469, +403,469,402, +469,403,470, +404,470,403, +470,404,471, +405,471,404, +471,405,472, +406,472,405, +472,406,473, +407,473,406, +473,407,474, +408,474,407, +474,408,475, +409,475,408, +475,409,476, +410,476,409, +476,410,477, +411,477,410, +477,411,478, +412,478,411, +478,412,479, +413,479,412, +479,413,480, +414,480,413, +480,414,481, +415,481,414, +481,415,482, +416,482,415, +482,416,483, +417,483,416, +483,417,484, +418,484,417, +484,418,485, +419,485,418, +485,419,486, +420,486,419, +486,420,487, +421,487,420, +487,421,488, +422,488,421, +488,422,489, +423,489,422, +489,423,490, +424,490,423, +490,424,491, +425,491,424, +491,425,492, +426,492,425, +492,426,493, +427,493,426, +493,427,494, +428,494,427, +494,428,495, +429,495,428, +495,429,496, +430,496,429, +496,430,497, +431,497,430, +497,431,498, +432,498,431, +498,432,499, +433,499,432, +499,433,500, +434,500,433, +500,434,501, +435,501,434, +501,435,502, +436,502,435, +502,436,503, +437,503,436, +503,437,504, +438,504,437, +504,438,505, +439,505,438, +505,439,506, +440,506,439, +506,440,507, +441,507,440, +507,441,508, +442,508,441, +508,442,509, +443,509,442, +509,443,510, +444,510,443, +510,444,511, +445,511,444, +511,445,512, +446,512,445, +512,446,513, +447,513,446, +513,447,514, +448,514,447, +514,448,515, +449,515,448, +515,449,516, +450,516,449, +516,450,517, +451,517,450, +517,451,518, +452,518,451, +518,452,519, +453,519,452, +519,453,520, +454,520,453, +520,454,521, +455,521,454, +521,455,522, +456,522,455, +522,456,523, +457,523,456, +523,457,524, +458,524,457, +524,458,525, +459,525,458, +525,459,526, +460,526,459, +526,460,527, +461,527,460, +528,462,529, +463,529,462, +529,463,530, +464,530,463, +530,464,531, +465,531,464, +531,465,532, +466,532,465, +532,466,533, +467,533,466, +533,467,534, +468,534,467, +534,468,535, +469,535,468, +535,469,536, +470,536,469, +536,470,537, +471,537,470, +537,471,538, +472,538,471, +538,472,539, +473,539,472, +539,473,540, +474,540,473, +540,474,541, +475,541,474, +541,475,542, +476,542,475, +542,476,543, +477,543,476, +543,477,544, +478,544,477, +544,478,545, +479,545,478, +545,479,546, +480,546,479, +546,480,547, +481,547,480, +547,481,548, +482,548,481, +548,482,549, +483,549,482, +549,483,550, +484,550,483, +550,484,551, +485,551,484, +551,485,552, +486,552,485, +552,486,553, +487,553,486, +553,487,554, +488,554,487, +554,488,555, +489,555,488, +555,489,556, +490,556,489, +556,490,557, +491,557,490, +557,491,558, +492,558,491, +558,492,559, +493,559,492, +559,493,560, +494,560,493, +560,494,561, +495,561,494, +561,495,562, +496,562,495, +562,496,563, +497,563,496, +563,497,564, +498,564,497, +564,498,565, +499,565,498, +565,499,566, +500,566,499, +566,500,567, +501,567,500, +567,501,568, +502,568,501, +568,502,569, +503,569,502, +569,503,570, +504,570,503, +570,504,571, +505,571,504, +571,505,572, +506,572,505, +572,506,573, +507,573,506, +573,507,574, +508,574,507, +574,508,575, +509,575,508, +575,509,576, +510,576,509, +576,510,577, +511,577,510, +577,511,578, +512,578,511, +578,512,579, +513,579,512, +579,513,580, +514,580,513, +580,514,581, +515,581,514, +581,515,582, +516,582,515, +582,516,583, +517,583,516, +583,517,584, +518,584,517, +584,518,585, +519,585,518, +585,519,586, +520,586,519, +586,520,587, +521,587,520, +587,521,588, +522,588,521, +588,522,589, +523,589,522, +589,523,590, +524,590,523, +590,524,591, +525,591,524, +591,525,592, +526,592,525, +592,526,593, +527,593,526, +594,528,595, +529,595,528, +595,529,596, +530,596,529, +596,530,597, +531,597,530, +597,531,598, +532,598,531, +598,532,599, +533,599,532, +599,533,600, +534,600,533, +600,534,601, +535,601,534, +601,535,602, +536,602,535, +602,536,603, +537,603,536, +603,537,604, +538,604,537, +604,538,605, +539,605,538, +605,539,606, +540,606,539, +606,540,607, +541,607,540, +607,541,608, +542,608,541, +608,542,609, +543,609,542, +609,543,610, +544,610,543, +610,544,611, +545,611,544, +611,545,612, +546,612,545, +612,546,613, +547,613,546, +613,547,614, +548,614,547, +614,548,615, +549,615,548, +615,549,616, +550,616,549, +616,550,617, +551,617,550, +617,551,618, +552,618,551, +618,552,619, +553,619,552, +619,553,620, +554,620,553, +620,554,621, +555,621,554, +621,555,622, +556,622,555, +622,556,623, +557,623,556, +623,557,624, +558,624,557, +624,558,625, +559,625,558, +625,559,626, +560,626,559, +626,560,627, +561,627,560, +627,561,628, +562,628,561, +628,562,629, +563,629,562, +629,563,630, +564,630,563, +630,564,631, +565,631,564, +631,565,632, +566,632,565, +632,566,633, +567,633,566, +633,567,634, +568,634,567, +634,568,635, +569,635,568, +635,569,636, +570,636,569, +636,570,637, +571,637,570, +637,571,638, +572,638,571, +638,572,639, +573,639,572, +639,573,640, +574,640,573, +640,574,641, +575,641,574, +641,575,642, +576,642,575, +642,576,643, +577,643,576, +643,577,644, +578,644,577, +644,578,645, +579,645,578, +645,579,646, +580,646,579, +646,580,647, +581,647,580, +647,581,648, +582,648,581, +648,582,649, +583,649,582, +649,583,650, +584,650,583, +650,584,651, +585,651,584, +651,585,652, +586,652,585, +652,586,653, +587,653,586, +653,587,654, +588,654,587, +654,588,655, +589,655,588, +655,589,656, +590,656,589, +656,590,657, +591,657,590, +657,591,658, +592,658,591, +658,592,659, +593,659,592, +660,594,661, +595,661,594, +661,595,662, +596,662,595, +662,596,663, +597,663,596, +663,597,664, +598,664,597, +664,598,665, +599,665,598, +665,599,666, +600,666,599, +666,600,667, +601,667,600, +667,601,668, +602,668,601, +668,602,669, +603,669,602, +669,603,670, +604,670,603, +670,604,671, +605,671,604, +671,605,672, +606,672,605, +672,606,673, +607,673,606, +673,607,674, +608,674,607, +674,608,675, +609,675,608, +675,609,676, +610,676,609, +676,610,677, +611,677,610, +677,611,678, +612,678,611, +678,612,679, +613,679,612, +679,613,680, +614,680,613, +680,614,681, +615,681,614, +681,615,682, +616,682,615, +682,616,683, +617,683,616, +683,617,684, +618,684,617, +684,618,685, +619,685,618, +685,619,686, +620,686,619, +686,620,687, +621,687,620, +687,621,688, +622,688,621, +688,622,689, +623,689,622, +689,623,690, +624,690,623, +690,624,691, +625,691,624, +691,625,692, +626,692,625, +692,626,693, +627,693,626, +693,627,694, +628,694,627, +694,628,695, +629,695,628, +695,629,696, +630,696,629, +696,630,697, +631,697,630, +697,631,698, +632,698,631, +698,632,699, +633,699,632, +699,633,700, +634,700,633, +700,634,701, +635,701,634, +701,635,702, +636,702,635, +702,636,703, +637,703,636, +703,637,704, +638,704,637, +704,638,705, +639,705,638, +705,639,706, +640,706,639, +706,640,707, +641,707,640, +707,641,708, +642,708,641, +708,642,709, +643,709,642, +709,643,710, +644,710,643, +710,644,711, +645,711,644, +711,645,712, +646,712,645, +712,646,713, +647,713,646, +713,647,714, +648,714,647, +714,648,715, +649,715,648, +715,649,716, +650,716,649, +716,650,717, +651,717,650, +717,651,718, +652,718,651, +718,652,719, +653,719,652, +719,653,720, +654,720,653, +720,654,721, +655,721,654, +721,655,722, +656,722,655, +722,656,723, +657,723,656, +723,657,724, +658,724,657, +724,658,725, +659,725,658, +726,660,727, +661,727,660, +727,661,728, +662,728,661, +728,662,729, +663,729,662, +729,663,730, +664,730,663, +730,664,731, +665,731,664, +731,665,732, +666,732,665, +732,666,733, +667,733,666, +733,667,734, +668,734,667, +734,668,735, +669,735,668, +735,669,736, +670,736,669, +736,670,737, +671,737,670, +737,671,738, +672,738,671, +738,672,739, +673,739,672, +739,673,740, +674,740,673, +740,674,741, +675,741,674, +741,675,742, +676,742,675, +742,676,743, +677,743,676, +743,677,744, +678,744,677, +744,678,745, +679,745,678, +745,679,746, +680,746,679, +746,680,747, +681,747,680, +747,681,748, +682,748,681, +748,682,749, +683,749,682, +749,683,750, +684,750,683, +750,684,751, +685,751,684, +751,685,752, +686,752,685, +752,686,753, +687,753,686, +753,687,754, +688,754,687, +754,688,755, +689,755,688, +755,689,756, +690,756,689, +756,690,757, +691,757,690, +757,691,758, +692,758,691, +758,692,759, +693,759,692, +759,693,760, +694,760,693, +760,694,761, +695,761,694, +761,695,762, +696,762,695, +762,696,763, +697,763,696, +763,697,764, +698,764,697, +764,698,765, +699,765,698, +765,699,766, +700,766,699, +766,700,767, +701,767,700, +767,701,768, +702,768,701, +768,702,769, +703,769,702, +769,703,770, +704,770,703, +770,704,771, +705,771,704, +771,705,772, +706,772,705, +772,706,773, +707,773,706, +773,707,774, +708,774,707, +774,708,775, +709,775,708, +775,709,776, +710,776,709, +776,710,777, +711,777,710, +777,711,778, +712,778,711, +778,712,779, +713,779,712, +779,713,780, +714,780,713, +780,714,781, +715,781,714, +781,715,782, +716,782,715, +782,716,783, +717,783,716, +783,717,784, +718,784,717, +784,718,785, +719,785,718, +785,719,786, +720,786,719, +786,720,787, +721,787,720, +787,721,788, +722,788,721, +788,722,789, +723,789,722, +789,723,790, +724,790,723, +790,724,791, +725,791,724, +792,726,793, +727,793,726, +793,727,794, +728,794,727, +794,728,795, +729,795,728, +795,729,796, +730,796,729, +796,730,797, +731,797,730, +797,731,798, +732,798,731, +798,732,799, +733,799,732, +799,733,800, +734,800,733, +800,734,801, +735,801,734, +801,735,802, +736,802,735, +802,736,803, +737,803,736, +803,737,804, +738,804,737, +804,738,805, +739,805,738, +805,739,806, +740,806,739, +806,740,807, +741,807,740, +807,741,808, +742,808,741, +808,742,809, +743,809,742, +809,743,810, +744,810,743, +810,744,811, +745,811,744, +811,745,812, +746,812,745, +812,746,813, +747,813,746, +813,747,814, +748,814,747, +814,748,815, +749,815,748, +815,749,816, +750,816,749, +816,750,817, +751,817,750, +817,751,818, +752,818,751, +818,752,819, +753,819,752, +819,753,820, +754,820,753, +820,754,821, +755,821,754, +821,755,822, +756,822,755, +822,756,823, +757,823,756, +823,757,824, +758,824,757, +824,758,825, +759,825,758, +825,759,826, +760,826,759, +826,760,827, +761,827,760, +827,761,828, +762,828,761, +828,762,829, +763,829,762, +829,763,830, +764,830,763, +830,764,831, +765,831,764, +831,765,832, +766,832,765, +832,766,833, +767,833,766, +833,767,834, +768,834,767, +834,768,835, +769,835,768, +835,769,836, +770,836,769, +836,770,837, +771,837,770, +837,771,838, +772,838,771, +838,772,839, +773,839,772, +839,773,840, +774,840,773, +840,774,841, +775,841,774, +841,775,842, +776,842,775, +842,776,843, +777,843,776, +843,777,844, +778,844,777, +844,778,845, +779,845,778, +845,779,846, +780,846,779, +846,780,847, +781,847,780, +847,781,848, +782,848,781, +848,782,849, +783,849,782, +849,783,850, +784,850,783, +850,784,851, +785,851,784, +851,785,852, +786,852,785, +852,786,853, +787,853,786, +853,787,854, +788,854,787, +854,788,855, +789,855,788, +855,789,856, +790,856,789, +856,790,857, +791,857,790, +858,792,859, +793,859,792, +859,793,860, +794,860,793, +860,794,861, +795,861,794, +861,795,862, +796,862,795, +862,796,863, +797,863,796, +863,797,864, +798,864,797, +864,798,865, +799,865,798, +865,799,866, +800,866,799, +866,800,867, +801,867,800, +867,801,868, +802,868,801, +868,802,869, +803,869,802, +869,803,870, +804,870,803, +870,804,871, +805,871,804, +871,805,872, +806,872,805, +872,806,873, +807,873,806, +873,807,874, +808,874,807, +874,808,875, +809,875,808, +875,809,876, +810,876,809, +876,810,877, +811,877,810, +877,811,878, +812,878,811, +878,812,879, +813,879,812, +879,813,880, +814,880,813, +880,814,881, +815,881,814, +881,815,882, +816,882,815, +882,816,883, +817,883,816, +883,817,884, +818,884,817, +884,818,885, +819,885,818, +885,819,886, +820,886,819, +886,820,887, +821,887,820, +887,821,888, +822,888,821, +888,822,889, +823,889,822, +889,823,890, +824,890,823, +890,824,891, +825,891,824, +891,825,892, +826,892,825, +892,826,893, +827,893,826, +893,827,894, +828,894,827, +894,828,895, +829,895,828, +895,829,896, +830,896,829, +896,830,897, +831,897,830, +897,831,898, +832,898,831, +898,832,899, +833,899,832, +899,833,900, +834,900,833, +900,834,901, +835,901,834, +901,835,902, +836,902,835, +902,836,903, +837,903,836, +903,837,904, +838,904,837, +904,838,905, +839,905,838, +905,839,906, +840,906,839, +906,840,907, +841,907,840, +907,841,908, +842,908,841, +908,842,909, +843,909,842, +909,843,910, +844,910,843, +910,844,911, +845,911,844, +911,845,912, +846,912,845, +912,846,913, +847,913,846, +913,847,914, +848,914,847, +914,848,915, +849,915,848, +915,849,916, +850,916,849, +916,850,917, +851,917,850, +917,851,918, +852,918,851, +918,852,919, +853,919,852, +919,853,920, +854,920,853, +920,854,921, +855,921,854, +921,855,922, +856,922,855, +922,856,923, +857,923,856, +924,858,925, +859,925,858, +925,859,926, +860,926,859, +926,860,927, +861,927,860, +927,861,928, +862,928,861, +928,862,929, +863,929,862, +929,863,930, +864,930,863, +930,864,931, +865,931,864, +931,865,932, +866,932,865, +932,866,933, +867,933,866, +933,867,934, +868,934,867, +934,868,935, +869,935,868, +935,869,936, +870,936,869, +936,870,937, +871,937,870, +937,871,938, +872,938,871, +938,872,939, +873,939,872, +939,873,940, +874,940,873, +940,874,941, +875,941,874, +941,875,942, +876,942,875, +942,876,943, +877,943,876, +943,877,944, +878,944,877, +944,878,945, +879,945,878, +945,879,946, +880,946,879, +946,880,947, +881,947,880, +947,881,948, +882,948,881, +948,882,949, +883,949,882, +949,883,950, +884,950,883, +950,884,951, +885,951,884, +951,885,952, +886,952,885, +952,886,953, +887,953,886, +953,887,954, +888,954,887, +954,888,955, +889,955,888, +955,889,956, +890,956,889, +956,890,957, +891,957,890, +957,891,958, +892,958,891, +958,892,959, +893,959,892, +959,893,960, +894,960,893, +960,894,961, +895,961,894, +961,895,962, +896,962,895, +962,896,963, +897,963,896, +963,897,964, +898,964,897, +964,898,965, +899,965,898, +965,899,966, +900,966,899, +966,900,967, +901,967,900, +967,901,968, +902,968,901, +968,902,969, +903,969,902, +969,903,970, +904,970,903, +970,904,971, +905,971,904, +971,905,972, +906,972,905, +972,906,973, +907,973,906, +973,907,974, +908,974,907, +974,908,975, +909,975,908, +975,909,976, +910,976,909, +976,910,977, +911,977,910, +977,911,978, +912,978,911, +978,912,979, +913,979,912, +979,913,980, +914,980,913, +980,914,981, +915,981,914, +981,915,982, +916,982,915, +982,916,983, +917,983,916, +983,917,984, +918,984,917, +984,918,985, +919,985,918, +985,919,986, +920,986,919, +986,920,987, +921,987,920, +987,921,988, +922,988,921, +988,922,989, +923,989,922, +990,924,991, +925,991,924, +991,925,992, +926,992,925, +992,926,993, +927,993,926, +993,927,994, +928,994,927, +994,928,995, +929,995,928, +995,929,996, +930,996,929, +996,930,997, +931,997,930, +997,931,998, +932,998,931, +998,932,999, +933,999,932, +999,933,1000, +934,1000,933, +1000,934,1001, +935,1001,934, +1001,935,1002, +936,1002,935, +1002,936,1003, +937,1003,936, +1003,937,1004, +938,1004,937, +1004,938,1005, +939,1005,938, +1005,939,1006, +940,1006,939, +1006,940,1007, +941,1007,940, +1007,941,1008, +942,1008,941, +1008,942,1009, +943,1009,942, +1009,943,1010, +944,1010,943, +1010,944,1011, +945,1011,944, +1011,945,1012, +946,1012,945, +1012,946,1013, +947,1013,946, +1013,947,1014, +948,1014,947, +1014,948,1015, +949,1015,948, +1015,949,1016, +950,1016,949, +1016,950,1017, +951,1017,950, +1017,951,1018, +952,1018,951, +1018,952,1019, +953,1019,952, +1019,953,1020, +954,1020,953, +1020,954,1021, +955,1021,954, +1021,955,1022, +956,1022,955, +1022,956,1023, +957,1023,956, +1023,957,1024, +958,1024,957, +1024,958,1025, +959,1025,958, +1025,959,1026, +960,1026,959, +1026,960,1027, +961,1027,960, +1027,961,1028, +962,1028,961, +1028,962,1029, +963,1029,962, +1029,963,1030, +964,1030,963, +1030,964,1031, +965,1031,964, +1031,965,1032, +966,1032,965, +1032,966,1033, +967,1033,966, +1033,967,1034, +968,1034,967, +1034,968,1035, +969,1035,968, +1035,969,1036, +970,1036,969, +1036,970,1037, +971,1037,970, +1037,971,1038, +972,1038,971, +1038,972,1039, +973,1039,972, +1039,973,1040, +974,1040,973, +1040,974,1041, +975,1041,974, +1041,975,1042, +976,1042,975, +1042,976,1043, +977,1043,976, +1043,977,1044, +978,1044,977, +1044,978,1045, +979,1045,978, +1045,979,1046, +980,1046,979, +1046,980,1047, +981,1047,980, +1047,981,1048, +982,1048,981, +1048,982,1049, +983,1049,982, +1049,983,1050, +984,1050,983, +1050,984,1051, +985,1051,984, +1051,985,1052, +986,1052,985, +1052,986,1053, +987,1053,986, +1053,987,1054, +988,1054,987, +1054,988,1055, +989,1055,988, +1056,990,1057, +991,1057,990, +1057,991,1058, +992,1058,991, +1058,992,1059, +993,1059,992, +1059,993,1060, +994,1060,993, +1060,994,1061, +995,1061,994, +1061,995,1062, +996,1062,995, +1062,996,1063, +997,1063,996, +1063,997,1064, +998,1064,997, +1064,998,1065, +999,1065,998, +1065,999,1066, +1000,1066,999, +1066,1000,1067, +1001,1067,1000, +1067,1001,1068, +1002,1068,1001, +1068,1002,1069, +1003,1069,1002, +1069,1003,1070, +1004,1070,1003, +1070,1004,1071, +1005,1071,1004, +1071,1005,1072, +1006,1072,1005, +1072,1006,1073, +1007,1073,1006, +1073,1007,1074, +1008,1074,1007, +1074,1008,1075, +1009,1075,1008, +1075,1009,1076, +1010,1076,1009, +1076,1010,1077, +1011,1077,1010, +1077,1011,1078, +1012,1078,1011, +1078,1012,1079, +1013,1079,1012, +1079,1013,1080, +1014,1080,1013, +1080,1014,1081, +1015,1081,1014, +1081,1015,1082, +1016,1082,1015, +1082,1016,1083, +1017,1083,1016, +1083,1017,1084, +1018,1084,1017, +1084,1018,1085, +1019,1085,1018, +1085,1019,1086, +1020,1086,1019, +1086,1020,1087, +1021,1087,1020, +1087,1021,1088, +1022,1088,1021, +1088,1022,1089, +1023,1089,1022, +1089,1023,1090, +1024,1090,1023, +1090,1024,1091, +1025,1091,1024, +1091,1025,1092, +1026,1092,1025, +1092,1026,1093, +1027,1093,1026, +1093,1027,1094, +1028,1094,1027, +1094,1028,1095, +1029,1095,1028, +1095,1029,1096, +1030,1096,1029, +1096,1030,1097, +1031,1097,1030, +1097,1031,1098, +1032,1098,1031, +1098,1032,1099, +1033,1099,1032, +1099,1033,1100, +1034,1100,1033, +1100,1034,1101, +1035,1101,1034, +1101,1035,1102, +1036,1102,1035, +1102,1036,1103, +1037,1103,1036, +1103,1037,1104, +1038,1104,1037, +1104,1038,1105, +1039,1105,1038, +1105,1039,1106, +1040,1106,1039, +1106,1040,1107, +1041,1107,1040, +1107,1041,1108, +1042,1108,1041, +1108,1042,1109, +1043,1109,1042, +1109,1043,1110, +1044,1110,1043, +1110,1044,1111, +1045,1111,1044, +1111,1045,1112, +1046,1112,1045, +1112,1046,1113, +1047,1113,1046, +1113,1047,1114, +1048,1114,1047, +1114,1048,1115, +1049,1115,1048, +1115,1049,1116, +1050,1116,1049, +1116,1050,1117, +1051,1117,1050, +1117,1051,1118, +1052,1118,1051, +1118,1052,1119, +1053,1119,1052, +1119,1053,1120, +1054,1120,1053, +1120,1054,1121, +1055,1121,1054, +1122,1056,1123, +1057,1123,1056, +1123,1057,1124, +1058,1124,1057, +1124,1058,1125, +1059,1125,1058, +1125,1059,1126, +1060,1126,1059, +1126,1060,1127, +1061,1127,1060, +1127,1061,1128, +1062,1128,1061, +1128,1062,1129, +1063,1129,1062, +1129,1063,1130, +1064,1130,1063, +1130,1064,1131, +1065,1131,1064, +1131,1065,1132, +1066,1132,1065, +1132,1066,1133, +1067,1133,1066, +1133,1067,1134, +1068,1134,1067, +1134,1068,1135, +1069,1135,1068, +1135,1069,1136, +1070,1136,1069, +1136,1070,1137, +1071,1137,1070, +1137,1071,1138, +1072,1138,1071, +1138,1072,1139, +1073,1139,1072, +1139,1073,1140, +1074,1140,1073, +1140,1074,1141, +1075,1141,1074, +1141,1075,1142, +1076,1142,1075, +1142,1076,1143, +1077,1143,1076, +1143,1077,1144, +1078,1144,1077, +1144,1078,1145, +1079,1145,1078, +1145,1079,1146, +1080,1146,1079, +1146,1080,1147, +1081,1147,1080, +1147,1081,1148, +1082,1148,1081, +1148,1082,1149, +1083,1149,1082, +1149,1083,1150, +1084,1150,1083, +1150,1084,1151, +1085,1151,1084, +1151,1085,1152, +1086,1152,1085, +1152,1086,1153, +1087,1153,1086, +1153,1087,1154, +1088,1154,1087, +1154,1088,1155, +1089,1155,1088, +1155,1089,1156, +1090,1156,1089, +1156,1090,1157, +1091,1157,1090, +1157,1091,1158, +1092,1158,1091, +1158,1092,1159, +1093,1159,1092, +1159,1093,1160, +1094,1160,1093, +1160,1094,1161, +1095,1161,1094, +1161,1095,1162, +1096,1162,1095, +1162,1096,1163, +1097,1163,1096, +1163,1097,1164, +1098,1164,1097, +1164,1098,1165, +1099,1165,1098, +1165,1099,1166, +1100,1166,1099, +1166,1100,1167, +1101,1167,1100, +1167,1101,1168, +1102,1168,1101, +1168,1102,1169, +1103,1169,1102, +1169,1103,1170, +1104,1170,1103, +1170,1104,1171, +1105,1171,1104, +1171,1105,1172, +1106,1172,1105, +1172,1106,1173, +1107,1173,1106, +1173,1107,1174, +1108,1174,1107, +1174,1108,1175, +1109,1175,1108, +1175,1109,1176, +1110,1176,1109, +1176,1110,1177, +1111,1177,1110, +1177,1111,1178, +1112,1178,1111, +1178,1112,1179, +1113,1179,1112, +1179,1113,1180, +1114,1180,1113, +1180,1114,1181, +1115,1181,1114, +1181,1115,1182, +1116,1182,1115, +1182,1116,1183, +1117,1183,1116, +1183,1117,1184, +1118,1184,1117, +1184,1118,1185, +1119,1185,1118, +1185,1119,1186, +1120,1186,1119, +1186,1120,1187, +1121,1187,1120, +1188,1122,1189, +1123,1189,1122, +1189,1123,1190, +1124,1190,1123, +1190,1124,1191, +1125,1191,1124, +1191,1125,1192, +1126,1192,1125, +1192,1126,1193, +1127,1193,1126, +1193,1127,1194, +1128,1194,1127, +1194,1128,1195, +1129,1195,1128, +1195,1129,1196, +1130,1196,1129, +1196,1130,1197, +1131,1197,1130, +1197,1131,1198, +1132,1198,1131, +1198,1132,1199, +1133,1199,1132, +1199,1133,1200, +1134,1200,1133, +1200,1134,1201, +1135,1201,1134, +1201,1135,1202, +1136,1202,1135, +1202,1136,1203, +1137,1203,1136, +1203,1137,1204, +1138,1204,1137, +1204,1138,1205, +1139,1205,1138, +1205,1139,1206, +1140,1206,1139, +1206,1140,1207, +1141,1207,1140, +1207,1141,1208, +1142,1208,1141, +1208,1142,1209, +1143,1209,1142, +1209,1143,1210, +1144,1210,1143, +1210,1144,1211, +1145,1211,1144, +1211,1145,1212, +1146,1212,1145, +1212,1146,1213, +1147,1213,1146, +1213,1147,1214, +1148,1214,1147, +1214,1148,1215, +1149,1215,1148, +1215,1149,1216, +1150,1216,1149, +1216,1150,1217, +1151,1217,1150, +1217,1151,1218, +1152,1218,1151, +1218,1152,1219, +1153,1219,1152, +1219,1153,1220, +1154,1220,1153, +1220,1154,1221, +1155,1221,1154, +1221,1155,1222, +1156,1222,1155, +1222,1156,1223, +1157,1223,1156, +1223,1157,1224, +1158,1224,1157, +1224,1158,1225, +1159,1225,1158, +1225,1159,1226, +1160,1226,1159, +1226,1160,1227, +1161,1227,1160, +1227,1161,1228, +1162,1228,1161, +1228,1162,1229, +1163,1229,1162, +1229,1163,1230, +1164,1230,1163, +1230,1164,1231, +1165,1231,1164, +1231,1165,1232, +1166,1232,1165, +1232,1166,1233, +1167,1233,1166, +1233,1167,1234, +1168,1234,1167, +1234,1168,1235, +1169,1235,1168, +1235,1169,1236, +1170,1236,1169, +1236,1170,1237, +1171,1237,1170, +1237,1171,1238, +1172,1238,1171, +1238,1172,1239, +1173,1239,1172, +1239,1173,1240, +1174,1240,1173, +1240,1174,1241, +1175,1241,1174, +1241,1175,1242, +1176,1242,1175, +1242,1176,1243, +1177,1243,1176, +1243,1177,1244, +1178,1244,1177, +1244,1178,1245, +1179,1245,1178, +1245,1179,1246, +1180,1246,1179, +1246,1180,1247, +1181,1247,1180, +1247,1181,1248, +1182,1248,1181, +1248,1182,1249, +1183,1249,1182, +1249,1183,1250, +1184,1250,1183, +1250,1184,1251, +1185,1251,1184, +1251,1185,1252, +1186,1252,1185, +1252,1186,1253, +1187,1253,1186, +1254,1188,1255, +1189,1255,1188, +1255,1189,1256, +1190,1256,1189, +1256,1190,1257, +1191,1257,1190, +1257,1191,1258, +1192,1258,1191, +1258,1192,1259, +1193,1259,1192, +1259,1193,1260, +1194,1260,1193, +1260,1194,1261, +1195,1261,1194, +1261,1195,1262, +1196,1262,1195, +1262,1196,1263, +1197,1263,1196, +1263,1197,1264, +1198,1264,1197, +1264,1198,1265, +1199,1265,1198, +1265,1199,1266, +1200,1266,1199, +1266,1200,1267, +1201,1267,1200, +1267,1201,1268, +1202,1268,1201, +1268,1202,1269, +1203,1269,1202, +1269,1203,1270, +1204,1270,1203, +1270,1204,1271, +1205,1271,1204, +1271,1205,1272, +1206,1272,1205, +1272,1206,1273, +1207,1273,1206, +1273,1207,1274, +1208,1274,1207, +1274,1208,1275, +1209,1275,1208, +1275,1209,1276, +1210,1276,1209, +1276,1210,1277, +1211,1277,1210, +1277,1211,1278, +1212,1278,1211, +1278,1212,1279, +1213,1279,1212, +1279,1213,1280, +1214,1280,1213, +1280,1214,1281, +1215,1281,1214, +1281,1215,1282, +1216,1282,1215, +1282,1216,1283, +1217,1283,1216, +1283,1217,1284, +1218,1284,1217, +1284,1218,1285, +1219,1285,1218, +1285,1219,1286, +1220,1286,1219, +1286,1220,1287, +1221,1287,1220, +1287,1221,1288, +1222,1288,1221, +1288,1222,1289, +1223,1289,1222, +1289,1223,1290, +1224,1290,1223, +1290,1224,1291, +1225,1291,1224, +1291,1225,1292, +1226,1292,1225, +1292,1226,1293, +1227,1293,1226, +1293,1227,1294, +1228,1294,1227, +1294,1228,1295, +1229,1295,1228, +1295,1229,1296, +1230,1296,1229, +1296,1230,1297, +1231,1297,1230, +1297,1231,1298, +1232,1298,1231, +1298,1232,1299, +1233,1299,1232, +1299,1233,1300, +1234,1300,1233, +1300,1234,1301, +1235,1301,1234, +1301,1235,1302, +1236,1302,1235, +1302,1236,1303, +1237,1303,1236, +1303,1237,1304, +1238,1304,1237, +1304,1238,1305, +1239,1305,1238, +1305,1239,1306, +1240,1306,1239, +1306,1240,1307, +1241,1307,1240, +1307,1241,1308, +1242,1308,1241, +1308,1242,1309, +1243,1309,1242, +1309,1243,1310, +1244,1310,1243, +1310,1244,1311, +1245,1311,1244, +1311,1245,1312, +1246,1312,1245, +1312,1246,1313, +1247,1313,1246, +1313,1247,1314, +1248,1314,1247, +1314,1248,1315, +1249,1315,1248, +1315,1249,1316, +1250,1316,1249, +1316,1250,1317, +1251,1317,1250, +1317,1251,1318, +1252,1318,1251, +1318,1252,1319, +1253,1319,1252, +1320,1254,1321, +1255,1321,1254, +1321,1255,1322, +1256,1322,1255, +1322,1256,1323, +1257,1323,1256, +1323,1257,1324, +1258,1324,1257, +1324,1258,1325, +1259,1325,1258, +1325,1259,1326, +1260,1326,1259, +1326,1260,1327, +1261,1327,1260, +1327,1261,1328, +1262,1328,1261, +1328,1262,1329, +1263,1329,1262, +1329,1263,1330, +1264,1330,1263, +1330,1264,1331, +1265,1331,1264, +1331,1265,1332, +1266,1332,1265, +1332,1266,1333, +1267,1333,1266, +1333,1267,1334, +1268,1334,1267, +1334,1268,1335, +1269,1335,1268, +1335,1269,1336, +1270,1336,1269, +1336,1270,1337, +1271,1337,1270, +1337,1271,1338, +1272,1338,1271, +1338,1272,1339, +1273,1339,1272, +1339,1273,1340, +1274,1340,1273, +1340,1274,1341, +1275,1341,1274, +1341,1275,1342, +1276,1342,1275, +1342,1276,1343, +1277,1343,1276, +1343,1277,1344, +1278,1344,1277, +1344,1278,1345, +1279,1345,1278, +1345,1279,1346, +1280,1346,1279, +1346,1280,1347, +1281,1347,1280, +1347,1281,1348, +1282,1348,1281, +1348,1282,1349, +1283,1349,1282, +1349,1283,1350, +1284,1350,1283, +1350,1284,1351, +1285,1351,1284, +1351,1285,1352, +1286,1352,1285, +1352,1286,1353, +1287,1353,1286, +1353,1287,1354, +1288,1354,1287, +1354,1288,1355, +1289,1355,1288, +1355,1289,1356, +1290,1356,1289, +1356,1290,1357, +1291,1357,1290, +1357,1291,1358, +1292,1358,1291, +1358,1292,1359, +1293,1359,1292, +1359,1293,1360, +1294,1360,1293, +1360,1294,1361, +1295,1361,1294, +1361,1295,1362, +1296,1362,1295, +1362,1296,1363, +1297,1363,1296, +1363,1297,1364, +1298,1364,1297, +1364,1298,1365, +1299,1365,1298, +1365,1299,1366, +1300,1366,1299, +1366,1300,1367, +1301,1367,1300, +1367,1301,1368, +1302,1368,1301, +1368,1302,1369, +1303,1369,1302, +1369,1303,1370, +1304,1370,1303, +1370,1304,1371, +1305,1371,1304, +1371,1305,1372, +1306,1372,1305, +1372,1306,1373, +1307,1373,1306, +1373,1307,1374, +1308,1374,1307, +1374,1308,1375, +1309,1375,1308, +1375,1309,1376, +1310,1376,1309, +1376,1310,1377, +1311,1377,1310, +1377,1311,1378, +1312,1378,1311, +1378,1312,1379, +1313,1379,1312, +1379,1313,1380, +1314,1380,1313, +1380,1314,1381, +1315,1381,1314, +1381,1315,1382, +1316,1382,1315, +1382,1316,1383, +1317,1383,1316, +1383,1317,1384, +1318,1384,1317, +1384,1318,1385, +1319,1385,1318, +1386,1320,1387, +1321,1387,1320, +1387,1321,1388, +1322,1388,1321, +1388,1322,1389, +1323,1389,1322, +1389,1323,1390, +1324,1390,1323, +1390,1324,1391, +1325,1391,1324, +1391,1325,1392, +1326,1392,1325, +1392,1326,1393, +1327,1393,1326, +1393,1327,1394, +1328,1394,1327, +1394,1328,1395, +1329,1395,1328, +1395,1329,1396, +1330,1396,1329, +1396,1330,1397, +1331,1397,1330, +1397,1331,1398, +1332,1398,1331, +1398,1332,1399, +1333,1399,1332, +1399,1333,1400, +1334,1400,1333, +1400,1334,1401, +1335,1401,1334, +1401,1335,1402, +1336,1402,1335, +1402,1336,1403, +1337,1403,1336, +1403,1337,1404, +1338,1404,1337, +1404,1338,1405, +1339,1405,1338, +1405,1339,1406, +1340,1406,1339, +1406,1340,1407, +1341,1407,1340, +1407,1341,1408, +1342,1408,1341, +1408,1342,1409, +1343,1409,1342, +1409,1343,1410, +1344,1410,1343, +1410,1344,1411, +1345,1411,1344, +1411,1345,1412, +1346,1412,1345, +1412,1346,1413, +1347,1413,1346, +1413,1347,1414, +1348,1414,1347, +1414,1348,1415, +1349,1415,1348, +1415,1349,1416, +1350,1416,1349, +1416,1350,1417, +1351,1417,1350, +1417,1351,1418, +1352,1418,1351, +1418,1352,1419, +1353,1419,1352, +1419,1353,1420, +1354,1420,1353, +1420,1354,1421, +1355,1421,1354, +1421,1355,1422, +1356,1422,1355, +1422,1356,1423, +1357,1423,1356, +1423,1357,1424, +1358,1424,1357, +1424,1358,1425, +1359,1425,1358, +1425,1359,1426, +1360,1426,1359, +1426,1360,1427, +1361,1427,1360, +1427,1361,1428, +1362,1428,1361, +1428,1362,1429, +1363,1429,1362, +1429,1363,1430, +1364,1430,1363, +1430,1364,1431, +1365,1431,1364, +1431,1365,1432, +1366,1432,1365, +1432,1366,1433, +1367,1433,1366, +1433,1367,1434, +1368,1434,1367, +1434,1368,1435, +1369,1435,1368, +1435,1369,1436, +1370,1436,1369, +1436,1370,1437, +1371,1437,1370, +1437,1371,1438, +1372,1438,1371, +1438,1372,1439, +1373,1439,1372, +1439,1373,1440, +1374,1440,1373, +1440,1374,1441, +1375,1441,1374, +1441,1375,1442, +1376,1442,1375, +1442,1376,1443, +1377,1443,1376, +1443,1377,1444, +1378,1444,1377, +1444,1378,1445, +1379,1445,1378, +1445,1379,1446, +1380,1446,1379, +1446,1380,1447, +1381,1447,1380, +1447,1381,1448, +1382,1448,1381, +1448,1382,1449, +1383,1449,1382, +1449,1383,1450, +1384,1450,1383, +1450,1384,1451, +1385,1451,1384, +1452,1386,1453, +1387,1453,1386, +1453,1387,1454, +1388,1454,1387, +1454,1388,1455, +1389,1455,1388, +1455,1389,1456, +1390,1456,1389, +1456,1390,1457, +1391,1457,1390, +1457,1391,1458, +1392,1458,1391, +1458,1392,1459, +1393,1459,1392, +1459,1393,1460, +1394,1460,1393, +1460,1394,1461, +1395,1461,1394, +1461,1395,1462, +1396,1462,1395, +1462,1396,1463, +1397,1463,1396, +1463,1397,1464, +1398,1464,1397, +1464,1398,1465, +1399,1465,1398, +1465,1399,1466, +1400,1466,1399, +1466,1400,1467, +1401,1467,1400, +1467,1401,1468, +1402,1468,1401, +1468,1402,1469, +1403,1469,1402, +1469,1403,1470, +1404,1470,1403, +1470,1404,1471, +1405,1471,1404, +1471,1405,1472, +1406,1472,1405, +1472,1406,1473, +1407,1473,1406, +1473,1407,1474, +1408,1474,1407, +1474,1408,1475, +1409,1475,1408, +1475,1409,1476, +1410,1476,1409, +1476,1410,1477, +1411,1477,1410, +1477,1411,1478, +1412,1478,1411, +1478,1412,1479, +1413,1479,1412, +1479,1413,1480, +1414,1480,1413, +1480,1414,1481, +1415,1481,1414, +1481,1415,1482, +1416,1482,1415, +1482,1416,1483, +1417,1483,1416, +1483,1417,1484, +1418,1484,1417, +1484,1418,1485, +1419,1485,1418, +1485,1419,1486, +1420,1486,1419, +1486,1420,1487, +1421,1487,1420, +1487,1421,1488, +1422,1488,1421, +1488,1422,1489, +1423,1489,1422, +1489,1423,1490, +1424,1490,1423, +1490,1424,1491, +1425,1491,1424, +1491,1425,1492, +1426,1492,1425, +1492,1426,1493, +1427,1493,1426, +1493,1427,1494, +1428,1494,1427, +1494,1428,1495, +1429,1495,1428, +1495,1429,1496, +1430,1496,1429, +1496,1430,1497, +1431,1497,1430, +1497,1431,1498, +1432,1498,1431, +1498,1432,1499, +1433,1499,1432, +1499,1433,1500, +1434,1500,1433, +1500,1434,1501, +1435,1501,1434, +1501,1435,1502, +1436,1502,1435, +1502,1436,1503, +1437,1503,1436, +1503,1437,1504, +1438,1504,1437, +1504,1438,1505, +1439,1505,1438, +1505,1439,1506, +1440,1506,1439, +1506,1440,1507, +1441,1507,1440, +1507,1441,1508, +1442,1508,1441, +1508,1442,1509, +1443,1509,1442, +1509,1443,1510, +1444,1510,1443, +1510,1444,1511, +1445,1511,1444, +1511,1445,1512, +1446,1512,1445, +1512,1446,1513, +1447,1513,1446, +1513,1447,1514, +1448,1514,1447, +1514,1448,1515, +1449,1515,1448, +1515,1449,1516, +1450,1516,1449, +1516,1450,1517, +1451,1517,1450, +1518,1452,1519, +1453,1519,1452, +1519,1453,1520, +1454,1520,1453, +1520,1454,1521, +1455,1521,1454, +1521,1455,1522, +1456,1522,1455, +1522,1456,1523, +1457,1523,1456, +1523,1457,1524, +1458,1524,1457, +1524,1458,1525, +1459,1525,1458, +1525,1459,1526, +1460,1526,1459, +1526,1460,1527, +1461,1527,1460, +1527,1461,1528, +1462,1528,1461, +1528,1462,1529, +1463,1529,1462, +1529,1463,1530, +1464,1530,1463, +1530,1464,1531, +1465,1531,1464, +1531,1465,1532, +1466,1532,1465, +1532,1466,1533, +1467,1533,1466, +1533,1467,1534, +1468,1534,1467, +1534,1468,1535, +1469,1535,1468, +1535,1469,1536, +1470,1536,1469, +1536,1470,1537, +1471,1537,1470, +1537,1471,1538, +1472,1538,1471, +1538,1472,1539, +1473,1539,1472, +1539,1473,1540, +1474,1540,1473, +1540,1474,1541, +1475,1541,1474, +1541,1475,1542, +1476,1542,1475, +1542,1476,1543, +1477,1543,1476, +1543,1477,1544, +1478,1544,1477, +1544,1478,1545, +1479,1545,1478, +1545,1479,1546, +1480,1546,1479, +1546,1480,1547, +1481,1547,1480, +1547,1481,1548, +1482,1548,1481, +1548,1482,1549, +1483,1549,1482, +1549,1483,1550, +1484,1550,1483, +1550,1484,1551, +1485,1551,1484, +1551,1485,1552, +1486,1552,1485, +1552,1486,1553, +1487,1553,1486, +1553,1487,1554, +1488,1554,1487, +1554,1488,1555, +1489,1555,1488, +1555,1489,1556, +1490,1556,1489, +1556,1490,1557, +1491,1557,1490, +1557,1491,1558, +1492,1558,1491, +1558,1492,1559, +1493,1559,1492, +1559,1493,1560, +1494,1560,1493, +1560,1494,1561, +1495,1561,1494, +1561,1495,1562, +1496,1562,1495, +1562,1496,1563, +1497,1563,1496, +1563,1497,1564, +1498,1564,1497, +1564,1498,1565, +1499,1565,1498, +1565,1499,1566, +1500,1566,1499, +1566,1500,1567, +1501,1567,1500, +1567,1501,1568, +1502,1568,1501, +1568,1502,1569, +1503,1569,1502, +1569,1503,1570, +1504,1570,1503, +1570,1504,1571, +1505,1571,1504, +1571,1505,1572, +1506,1572,1505, +1572,1506,1573, +1507,1573,1506, +1573,1507,1574, +1508,1574,1507, +1574,1508,1575, +1509,1575,1508, +1575,1509,1576, +1510,1576,1509, +1576,1510,1577, +1511,1577,1510, +1577,1511,1578, +1512,1578,1511, +1578,1512,1579, +1513,1579,1512, +1579,1513,1580, +1514,1580,1513, +1580,1514,1581, +1515,1581,1514, +1581,1515,1582, +1516,1582,1515, +1582,1516,1583, +1517,1583,1516, +1584,1518,1585, +1519,1585,1518, +1585,1519,1586, +1520,1586,1519, +1586,1520,1587, +1521,1587,1520, +1587,1521,1588, +1522,1588,1521, +1588,1522,1589, +1523,1589,1522, +1589,1523,1590, +1524,1590,1523, +1590,1524,1591, +1525,1591,1524, +1591,1525,1592, +1526,1592,1525, +1592,1526,1593, +1527,1593,1526, +1593,1527,1594, +1528,1594,1527, +1594,1528,1595, +1529,1595,1528, +1595,1529,1596, +1530,1596,1529, +1596,1530,1597, +1531,1597,1530, +1597,1531,1598, +1532,1598,1531, +1598,1532,1599, +1533,1599,1532, +1599,1533,1600, +1534,1600,1533, +1600,1534,1601, +1535,1601,1534, +1601,1535,1602, +1536,1602,1535, +1602,1536,1603, +1537,1603,1536, +1603,1537,1604, +1538,1604,1537, +1604,1538,1605, +1539,1605,1538, +1605,1539,1606, +1540,1606,1539, +1606,1540,1607, +1541,1607,1540, +1607,1541,1608, +1542,1608,1541, +1608,1542,1609, +1543,1609,1542, +1609,1543,1610, +1544,1610,1543, +1610,1544,1611, +1545,1611,1544, +1611,1545,1612, +1546,1612,1545, +1612,1546,1613, +1547,1613,1546, +1613,1547,1614, +1548,1614,1547, +1614,1548,1615, +1549,1615,1548, +1615,1549,1616, +1550,1616,1549, +1616,1550,1617, +1551,1617,1550, +1617,1551,1618, +1552,1618,1551, +1618,1552,1619, +1553,1619,1552, +1619,1553,1620, +1554,1620,1553, +1620,1554,1621, +1555,1621,1554, +1621,1555,1622, +1556,1622,1555, +1622,1556,1623, +1557,1623,1556, +1623,1557,1624, +1558,1624,1557, +1624,1558,1625, +1559,1625,1558, +1625,1559,1626, +1560,1626,1559, +1626,1560,1627, +1561,1627,1560, +1627,1561,1628, +1562,1628,1561, +1628,1562,1629, +1563,1629,1562, +1629,1563,1630, +1564,1630,1563, +1630,1564,1631, +1565,1631,1564, +1631,1565,1632, +1566,1632,1565, +1632,1566,1633, +1567,1633,1566, +1633,1567,1634, +1568,1634,1567, +1634,1568,1635, +1569,1635,1568, +1635,1569,1636, +1570,1636,1569, +1636,1570,1637, +1571,1637,1570, +1637,1571,1638, +1572,1638,1571, +1638,1572,1639, +1573,1639,1572, +1639,1573,1640, +1574,1640,1573, +1640,1574,1641, +1575,1641,1574, +1641,1575,1642, +1576,1642,1575, +1642,1576,1643, +1577,1643,1576, +1643,1577,1644, +1578,1644,1577, +1644,1578,1645, +1579,1645,1578, +1645,1579,1646, +1580,1646,1579, +1646,1580,1647, +1581,1647,1580, +1647,1581,1648, +1582,1648,1581, +1648,1582,1649, +1583,1649,1582, +1650,1584,1651, +1585,1651,1584, +1651,1585,1652, +1586,1652,1585, +1652,1586,1653, +1587,1653,1586, +1653,1587,1654, +1588,1654,1587, +1654,1588,1655, +1589,1655,1588, +1655,1589,1656, +1590,1656,1589, +1656,1590,1657, +1591,1657,1590, +1657,1591,1658, +1592,1658,1591, +1658,1592,1659, +1593,1659,1592, +1659,1593,1660, +1594,1660,1593, +1660,1594,1661, +1595,1661,1594, +1661,1595,1662, +1596,1662,1595, +1662,1596,1663, +1597,1663,1596, +1663,1597,1664, +1598,1664,1597, +1664,1598,1665, +1599,1665,1598, +1665,1599,1666, +1600,1666,1599, +1666,1600,1667, +1601,1667,1600, +1667,1601,1668, +1602,1668,1601, +1668,1602,1669, +1603,1669,1602, +1669,1603,1670, +1604,1670,1603, +1670,1604,1671, +1605,1671,1604, +1671,1605,1672, +1606,1672,1605, +1672,1606,1673, +1607,1673,1606, +1673,1607,1674, +1608,1674,1607, +1674,1608,1675, +1609,1675,1608, +1675,1609,1676, +1610,1676,1609, +1676,1610,1677, +1611,1677,1610, +1677,1611,1678, +1612,1678,1611, +1678,1612,1679, +1613,1679,1612, +1679,1613,1680, +1614,1680,1613, +1680,1614,1681, +1615,1681,1614, +1681,1615,1682, +1616,1682,1615, +1682,1616,1683, +1617,1683,1616, +1683,1617,1684, +1618,1684,1617, +1684,1618,1685, +1619,1685,1618, +1685,1619,1686, +1620,1686,1619, +1686,1620,1687, +1621,1687,1620, +1687,1621,1688, +1622,1688,1621, +1688,1622,1689, +1623,1689,1622, +1689,1623,1690, +1624,1690,1623, +1690,1624,1691, +1625,1691,1624, +1691,1625,1692, +1626,1692,1625, +1692,1626,1693, +1627,1693,1626, +1693,1627,1694, +1628,1694,1627, +1694,1628,1695, +1629,1695,1628, +1695,1629,1696, +1630,1696,1629, +1696,1630,1697, +1631,1697,1630, +1697,1631,1698, +1632,1698,1631, +1698,1632,1699, +1633,1699,1632, +1699,1633,1700, +1634,1700,1633, +1700,1634,1701, +1635,1701,1634, +1701,1635,1702, +1636,1702,1635, +1702,1636,1703, +1637,1703,1636, +1703,1637,1704, +1638,1704,1637, +1704,1638,1705, +1639,1705,1638, +1705,1639,1706, +1640,1706,1639, +1706,1640,1707, +1641,1707,1640, +1707,1641,1708, +1642,1708,1641, +1708,1642,1709, +1643,1709,1642, +1709,1643,1710, +1644,1710,1643, +1710,1644,1711, +1645,1711,1644, +1711,1645,1712, +1646,1712,1645, +1712,1646,1713, +1647,1713,1646, +1713,1647,1714, +1648,1714,1647, +1714,1648,1715, +1649,1715,1648, +1716,1650,1717, +1651,1717,1650, +1717,1651,1718, +1652,1718,1651, +1718,1652,1719, +1653,1719,1652, +1719,1653,1720, +1654,1720,1653, +1720,1654,1721, +1655,1721,1654, +1721,1655,1722, +1656,1722,1655, +1722,1656,1723, +1657,1723,1656, +1723,1657,1724, +1658,1724,1657, +1724,1658,1725, +1659,1725,1658, +1725,1659,1726, +1660,1726,1659, +1726,1660,1727, +1661,1727,1660, +1727,1661,1728, +1662,1728,1661, +1728,1662,1729, +1663,1729,1662, +1729,1663,1730, +1664,1730,1663, +1730,1664,1731, +1665,1731,1664, +1731,1665,1732, +1666,1732,1665, +1732,1666,1733, +1667,1733,1666, +1733,1667,1734, +1668,1734,1667, +1734,1668,1735, +1669,1735,1668, +1735,1669,1736, +1670,1736,1669, +1736,1670,1737, +1671,1737,1670, +1737,1671,1738, +1672,1738,1671, +1738,1672,1739, +1673,1739,1672, +1739,1673,1740, +1674,1740,1673, +1740,1674,1741, +1675,1741,1674, +1741,1675,1742, +1676,1742,1675, +1742,1676,1743, +1677,1743,1676, +1743,1677,1744, +1678,1744,1677, +1744,1678,1745, +1679,1745,1678, +1745,1679,1746, +1680,1746,1679, +1746,1680,1747, +1681,1747,1680, +1747,1681,1748, +1682,1748,1681, +1748,1682,1749, +1683,1749,1682, +1749,1683,1750, +1684,1750,1683, +1750,1684,1751, +1685,1751,1684, +1751,1685,1752, +1686,1752,1685, +1752,1686,1753, +1687,1753,1686, +1753,1687,1754, +1688,1754,1687, +1754,1688,1755, +1689,1755,1688, +1755,1689,1756, +1690,1756,1689, +1756,1690,1757, +1691,1757,1690, +1757,1691,1758, +1692,1758,1691, +1758,1692,1759, +1693,1759,1692, +1759,1693,1760, +1694,1760,1693, +1760,1694,1761, +1695,1761,1694, +1761,1695,1762, +1696,1762,1695, +1762,1696,1763, +1697,1763,1696, +1763,1697,1764, +1698,1764,1697, +1764,1698,1765, +1699,1765,1698, +1765,1699,1766, +1700,1766,1699, +1766,1700,1767, +1701,1767,1700, +1767,1701,1768, +1702,1768,1701, +1768,1702,1769, +1703,1769,1702, +1769,1703,1770, +1704,1770,1703, +1770,1704,1771, +1705,1771,1704, +1771,1705,1772, +1706,1772,1705, +1772,1706,1773, +1707,1773,1706, +1773,1707,1774, +1708,1774,1707, +1774,1708,1775, +1709,1775,1708, +1775,1709,1776, +1710,1776,1709, +1776,1710,1777, +1711,1777,1710, +1777,1711,1778, +1712,1778,1711, +1778,1712,1779, +1713,1779,1712, +1779,1713,1780, +1714,1780,1713, +1780,1714,1781, +1715,1781,1714, +1782,1716,1783, +1717,1783,1716, +1783,1717,1784, +1718,1784,1717, +1784,1718,1785, +1719,1785,1718, +1785,1719,1786, +1720,1786,1719, +1786,1720,1787, +1721,1787,1720, +1787,1721,1788, +1722,1788,1721, +1788,1722,1789, +1723,1789,1722, +1789,1723,1790, +1724,1790,1723, +1790,1724,1791, +1725,1791,1724, +1791,1725,1792, +1726,1792,1725, +1792,1726,1793, +1727,1793,1726, +1793,1727,1794, +1728,1794,1727, +1794,1728,1795, +1729,1795,1728, +1795,1729,1796, +1730,1796,1729, +1796,1730,1797, +1731,1797,1730, +1797,1731,1798, +1732,1798,1731, +1798,1732,1799, +1733,1799,1732, +1799,1733,1800, +1734,1800,1733, +1800,1734,1801, +1735,1801,1734, +1801,1735,1802, +1736,1802,1735, +1802,1736,1803, +1737,1803,1736, +1803,1737,1804, +1738,1804,1737, +1804,1738,1805, +1739,1805,1738, +1805,1739,1806, +1740,1806,1739, +1806,1740,1807, +1741,1807,1740, +1807,1741,1808, +1742,1808,1741, +1808,1742,1809, +1743,1809,1742, +1809,1743,1810, +1744,1810,1743, +1810,1744,1811, +1745,1811,1744, +1811,1745,1812, +1746,1812,1745, +1812,1746,1813, +1747,1813,1746, +1813,1747,1814, +1748,1814,1747, +1814,1748,1815, +1749,1815,1748, +1815,1749,1816, +1750,1816,1749, +1816,1750,1817, +1751,1817,1750, +1817,1751,1818, +1752,1818,1751, +1818,1752,1819, +1753,1819,1752, +1819,1753,1820, +1754,1820,1753, +1820,1754,1821, +1755,1821,1754, +1821,1755,1822, +1756,1822,1755, +1822,1756,1823, +1757,1823,1756, +1823,1757,1824, +1758,1824,1757, +1824,1758,1825, +1759,1825,1758, +1825,1759,1826, +1760,1826,1759, +1826,1760,1827, +1761,1827,1760, +1827,1761,1828, +1762,1828,1761, +1828,1762,1829, +1763,1829,1762, +1829,1763,1830, +1764,1830,1763, +1830,1764,1831, +1765,1831,1764, +1831,1765,1832, +1766,1832,1765, +1832,1766,1833, +1767,1833,1766, +1833,1767,1834, +1768,1834,1767, +1834,1768,1835, +1769,1835,1768, +1835,1769,1836, +1770,1836,1769, +1836,1770,1837, +1771,1837,1770, +1837,1771,1838, +1772,1838,1771, +1838,1772,1839, +1773,1839,1772, +1839,1773,1840, +1774,1840,1773, +1840,1774,1841, +1775,1841,1774, +1841,1775,1842, +1776,1842,1775, +1842,1776,1843, +1777,1843,1776, +1843,1777,1844, +1778,1844,1777, +1844,1778,1845, +1779,1845,1778, +1845,1779,1846, +1780,1846,1779, +1846,1780,1847, +1781,1847,1780, +1848,1782,1849, +1783,1849,1782, +1849,1783,1850, +1784,1850,1783, +1850,1784,1851, +1785,1851,1784, +1851,1785,1852, +1786,1852,1785, +1852,1786,1853, +1787,1853,1786, +1853,1787,1854, +1788,1854,1787, +1854,1788,1855, +1789,1855,1788, +1855,1789,1856, +1790,1856,1789, +1856,1790,1857, +1791,1857,1790, +1857,1791,1858, +1792,1858,1791, +1858,1792,1859, +1793,1859,1792, +1859,1793,1860, +1794,1860,1793, +1860,1794,1861, +1795,1861,1794, +1861,1795,1862, +1796,1862,1795, +1862,1796,1863, +1797,1863,1796, +1863,1797,1864, +1798,1864,1797, +1864,1798,1865, +1799,1865,1798, +1865,1799,1866, +1800,1866,1799, +1866,1800,1867, +1801,1867,1800, +1867,1801,1868, +1802,1868,1801, +1868,1802,1869, +1803,1869,1802, +1869,1803,1870, +1804,1870,1803, +1870,1804,1871, +1805,1871,1804, +1871,1805,1872, +1806,1872,1805, +1872,1806,1873, +1807,1873,1806, +1873,1807,1874, +1808,1874,1807, +1874,1808,1875, +1809,1875,1808, +1875,1809,1876, +1810,1876,1809, +1876,1810,1877, +1811,1877,1810, +1877,1811,1878, +1812,1878,1811, +1878,1812,1879, +1813,1879,1812, +1879,1813,1880, +1814,1880,1813, +1880,1814,1881, +1815,1881,1814, +1881,1815,1882, +1816,1882,1815, +1882,1816,1883, +1817,1883,1816, +1883,1817,1884, +1818,1884,1817, +1884,1818,1885, +1819,1885,1818, +1885,1819,1886, +1820,1886,1819, +1886,1820,1887, +1821,1887,1820, +1887,1821,1888, +1822,1888,1821, +1888,1822,1889, +1823,1889,1822, +1889,1823,1890, +1824,1890,1823, +1890,1824,1891, +1825,1891,1824, +1891,1825,1892, +1826,1892,1825, +1892,1826,1893, +1827,1893,1826, +1893,1827,1894, +1828,1894,1827, +1894,1828,1895, +1829,1895,1828, +1895,1829,1896, +1830,1896,1829, +1896,1830,1897, +1831,1897,1830, +1897,1831,1898, +1832,1898,1831, +1898,1832,1899, +1833,1899,1832, +1899,1833,1900, +1834,1900,1833, +1900,1834,1901, +1835,1901,1834, +1901,1835,1902, +1836,1902,1835, +1902,1836,1903, +1837,1903,1836, +1903,1837,1904, +1838,1904,1837, +1904,1838,1905, +1839,1905,1838, +1905,1839,1906, +1840,1906,1839, +1906,1840,1907, +1841,1907,1840, +1907,1841,1908, +1842,1908,1841, +1908,1842,1909, +1843,1909,1842, +1909,1843,1910, +1844,1910,1843, +1910,1844,1911, +1845,1911,1844, +1911,1845,1912, +1846,1912,1845, +1912,1846,1913, +1847,1913,1846, +1914,1848,1915, +1849,1915,1848, +1915,1849,1916, +1850,1916,1849, +1916,1850,1917, +1851,1917,1850, +1917,1851,1918, +1852,1918,1851, +1918,1852,1919, +1853,1919,1852, +1919,1853,1920, +1854,1920,1853, +1920,1854,1921, +1855,1921,1854, +1921,1855,1922, +1856,1922,1855, +1922,1856,1923, +1857,1923,1856, +1923,1857,1924, +1858,1924,1857, +1924,1858,1925, +1859,1925,1858, +1925,1859,1926, +1860,1926,1859, +1926,1860,1927, +1861,1927,1860, +1927,1861,1928, +1862,1928,1861, +1928,1862,1929, +1863,1929,1862, +1929,1863,1930, +1864,1930,1863, +1930,1864,1931, +1865,1931,1864, +1931,1865,1932, +1866,1932,1865, +1932,1866,1933, +1867,1933,1866, +1933,1867,1934, +1868,1934,1867, +1934,1868,1935, +1869,1935,1868, +1935,1869,1936, +1870,1936,1869, +1936,1870,1937, +1871,1937,1870, +1937,1871,1938, +1872,1938,1871, +1938,1872,1939, +1873,1939,1872, +1939,1873,1940, +1874,1940,1873, +1940,1874,1941, +1875,1941,1874, +1941,1875,1942, +1876,1942,1875, +1942,1876,1943, +1877,1943,1876, +1943,1877,1944, +1878,1944,1877, +1944,1878,1945, +1879,1945,1878, +1945,1879,1946, +1880,1946,1879, +1946,1880,1947, +1881,1947,1880, +1947,1881,1948, +1882,1948,1881, +1948,1882,1949, +1883,1949,1882, +1949,1883,1950, +1884,1950,1883, +1950,1884,1951, +1885,1951,1884, +1951,1885,1952, +1886,1952,1885, +1952,1886,1953, +1887,1953,1886, +1953,1887,1954, +1888,1954,1887, +1954,1888,1955, +1889,1955,1888, +1955,1889,1956, +1890,1956,1889, +1956,1890,1957, +1891,1957,1890, +1957,1891,1958, +1892,1958,1891, +1958,1892,1959, +1893,1959,1892, +1959,1893,1960, +1894,1960,1893, +1960,1894,1961, +1895,1961,1894, +1961,1895,1962, +1896,1962,1895, +1962,1896,1963, +1897,1963,1896, +1963,1897,1964, +1898,1964,1897, +1964,1898,1965, +1899,1965,1898, +1965,1899,1966, +1900,1966,1899, +1966,1900,1967, +1901,1967,1900, +1967,1901,1968, +1902,1968,1901, +1968,1902,1969, +1903,1969,1902, +1969,1903,1970, +1904,1970,1903, +1970,1904,1971, +1905,1971,1904, +1971,1905,1972, +1906,1972,1905, +1972,1906,1973, +1907,1973,1906, +1973,1907,1974, +1908,1974,1907, +1974,1908,1975, +1909,1975,1908, +1975,1909,1976, +1910,1976,1909, +1976,1910,1977, +1911,1977,1910, +1977,1911,1978, +1912,1978,1911, +1978,1912,1979, +1913,1979,1912, +1980,1914,1981, +1915,1981,1914, +1981,1915,1982, +1916,1982,1915, +1982,1916,1983, +1917,1983,1916, +1983,1917,1984, +1918,1984,1917, +1984,1918,1985, +1919,1985,1918, +1985,1919,1986, +1920,1986,1919, +1986,1920,1987, +1921,1987,1920, +1987,1921,1988, +1922,1988,1921, +1988,1922,1989, +1923,1989,1922, +1989,1923,1990, +1924,1990,1923, +1990,1924,1991, +1925,1991,1924, +1991,1925,1992, +1926,1992,1925, +1992,1926,1993, +1927,1993,1926, +1993,1927,1994, +1928,1994,1927, +1994,1928,1995, +1929,1995,1928, +1995,1929,1996, +1930,1996,1929, +1996,1930,1997, +1931,1997,1930, +1997,1931,1998, +1932,1998,1931, +1998,1932,1999, +1933,1999,1932, +1999,1933,2000, +1934,2000,1933, +2000,1934,2001, +1935,2001,1934, +2001,1935,2002, +1936,2002,1935, +2002,1936,2003, +1937,2003,1936, +2003,1937,2004, +1938,2004,1937, +2004,1938,2005, +1939,2005,1938, +2005,1939,2006, +1940,2006,1939, +2006,1940,2007, +1941,2007,1940, +2007,1941,2008, +1942,2008,1941, +2008,1942,2009, +1943,2009,1942, +2009,1943,2010, +1944,2010,1943, +2010,1944,2011, +1945,2011,1944, +2011,1945,2012, +1946,2012,1945, +2012,1946,2013, +1947,2013,1946, +2013,1947,2014, +1948,2014,1947, +2014,1948,2015, +1949,2015,1948, +2015,1949,2016, +1950,2016,1949, +2016,1950,2017, +1951,2017,1950, +2017,1951,2018, +1952,2018,1951, +2018,1952,2019, +1953,2019,1952, +2019,1953,2020, +1954,2020,1953, +2020,1954,2021, +1955,2021,1954, +2021,1955,2022, +1956,2022,1955, +2022,1956,2023, +1957,2023,1956, +2023,1957,2024, +1958,2024,1957, +2024,1958,2025, +1959,2025,1958, +2025,1959,2026, +1960,2026,1959, +2026,1960,2027, +1961,2027,1960, +2027,1961,2028, +1962,2028,1961, +2028,1962,2029, +1963,2029,1962, +2029,1963,2030, +1964,2030,1963, +2030,1964,2031, +1965,2031,1964, +2031,1965,2032, +1966,2032,1965, +2032,1966,2033, +1967,2033,1966, +2033,1967,2034, +1968,2034,1967, +2034,1968,2035, +1969,2035,1968, +2035,1969,2036, +1970,2036,1969, +2036,1970,2037, +1971,2037,1970, +2037,1971,2038, +1972,2038,1971, +2038,1972,2039, +1973,2039,1972, +2039,1973,2040, +1974,2040,1973, +2040,1974,2041, +1975,2041,1974, +2041,1975,2042, +1976,2042,1975, +2042,1976,2043, +1977,2043,1976, +2043,1977,2044, +1978,2044,1977, +2044,1978,2045, +1979,2045,1978, +2046,1980,2047, +1981,2047,1980, +2047,1981,2048, +1982,2048,1981, +2048,1982,2049, +1983,2049,1982, +2049,1983,2050, +1984,2050,1983, +2050,1984,2051, +1985,2051,1984, +2051,1985,2052, +1986,2052,1985, +2052,1986,2053, +1987,2053,1986, +2053,1987,2054, +1988,2054,1987, +2054,1988,2055, +1989,2055,1988, +2055,1989,2056, +1990,2056,1989, +2056,1990,2057, +1991,2057,1990, +2057,1991,2058, +1992,2058,1991, +2058,1992,2059, +1993,2059,1992, +2059,1993,2060, +1994,2060,1993, +2060,1994,2061, +1995,2061,1994, +2061,1995,2062, +1996,2062,1995, +2062,1996,2063, +1997,2063,1996, +2063,1997,2064, +1998,2064,1997, +2064,1998,2065, +1999,2065,1998, +2065,1999,2066, +2000,2066,1999, +2066,2000,2067, +2001,2067,2000, +2067,2001,2068, +2002,2068,2001, +2068,2002,2069, +2003,2069,2002, +2069,2003,2070, +2004,2070,2003, +2070,2004,2071, +2005,2071,2004, +2071,2005,2072, +2006,2072,2005, +2072,2006,2073, +2007,2073,2006, +2073,2007,2074, +2008,2074,2007, +2074,2008,2075, +2009,2075,2008, +2075,2009,2076, +2010,2076,2009, +2076,2010,2077, +2011,2077,2010, +2077,2011,2078, +2012,2078,2011, +2078,2012,2079, +2013,2079,2012, +2079,2013,2080, +2014,2080,2013, +2080,2014,2081, +2015,2081,2014, +2081,2015,2082, +2016,2082,2015, +2082,2016,2083, +2017,2083,2016, +2083,2017,2084, +2018,2084,2017, +2084,2018,2085, +2019,2085,2018, +2085,2019,2086, +2020,2086,2019, +2086,2020,2087, +2021,2087,2020, +2087,2021,2088, +2022,2088,2021, +2088,2022,2089, +2023,2089,2022, +2089,2023,2090, +2024,2090,2023, +2090,2024,2091, +2025,2091,2024, +2091,2025,2092, +2026,2092,2025, +2092,2026,2093, +2027,2093,2026, +2093,2027,2094, +2028,2094,2027, +2094,2028,2095, +2029,2095,2028, +2095,2029,2096, +2030,2096,2029, +2096,2030,2097, +2031,2097,2030, +2097,2031,2098, +2032,2098,2031, +2098,2032,2099, +2033,2099,2032, +2099,2033,2100, +2034,2100,2033, +2100,2034,2101, +2035,2101,2034, +2101,2035,2102, +2036,2102,2035, +2102,2036,2103, +2037,2103,2036, +2103,2037,2104, +2038,2104,2037, +2104,2038,2105, +2039,2105,2038, +2105,2039,2106, +2040,2106,2039, +2106,2040,2107, +2041,2107,2040, +2107,2041,2108, +2042,2108,2041, +2108,2042,2109, +2043,2109,2042, +2109,2043,2110, +2044,2110,2043, +2110,2044,2111, +2045,2111,2044, +2112,2046,2113, +2047,2113,2046, +2113,2047,2114, +2048,2114,2047, +2114,2048,2115, +2049,2115,2048, +2115,2049,2116, +2050,2116,2049, +2116,2050,2117, +2051,2117,2050, +2117,2051,2118, +2052,2118,2051, +2118,2052,2119, +2053,2119,2052, +2119,2053,2120, +2054,2120,2053, +2120,2054,2121, +2055,2121,2054, +2121,2055,2122, +2056,2122,2055, +2122,2056,2123, +2057,2123,2056, +2123,2057,2124, +2058,2124,2057, +2124,2058,2125, +2059,2125,2058, +2125,2059,2126, +2060,2126,2059, +2126,2060,2127, +2061,2127,2060, +2127,2061,2128, +2062,2128,2061, +2128,2062,2129, +2063,2129,2062, +2129,2063,2130, +2064,2130,2063, +2130,2064,2131, +2065,2131,2064, +2131,2065,2132, +2066,2132,2065, +2132,2066,2133, +2067,2133,2066, +2133,2067,2134, +2068,2134,2067, +2134,2068,2135, +2069,2135,2068, +2135,2069,2136, +2070,2136,2069, +2136,2070,2137, +2071,2137,2070, +2137,2071,2138, +2072,2138,2071, +2138,2072,2139, +2073,2139,2072, +2139,2073,2140, +2074,2140,2073, +2140,2074,2141, +2075,2141,2074, +2141,2075,2142, +2076,2142,2075, +2142,2076,2143, +2077,2143,2076, +2143,2077,2144, +2078,2144,2077, +2144,2078,2145, +2079,2145,2078, +2145,2079,2146, +2080,2146,2079, +2146,2080,2147, +2081,2147,2080, +2147,2081,2148, +2082,2148,2081, +2148,2082,2149, +2083,2149,2082, +2149,2083,2150, +2084,2150,2083, +2150,2084,2151, +2085,2151,2084, +2151,2085,2152, +2086,2152,2085, +2152,2086,2153, +2087,2153,2086, +2153,2087,2154, +2088,2154,2087, +2154,2088,2155, +2089,2155,2088, +2155,2089,2156, +2090,2156,2089, +2156,2090,2157, +2091,2157,2090, +2157,2091,2158, +2092,2158,2091, +2158,2092,2159, +2093,2159,2092, +2159,2093,2160, +2094,2160,2093, +2160,2094,2161, +2095,2161,2094, +2161,2095,2162, +2096,2162,2095, +2162,2096,2163, +2097,2163,2096, +2163,2097,2164, +2098,2164,2097, +2164,2098,2165, +2099,2165,2098, +2165,2099,2166, +2100,2166,2099, +2166,2100,2167, +2101,2167,2100, +2167,2101,2168, +2102,2168,2101, +2168,2102,2169, +2103,2169,2102, +2169,2103,2170, +2104,2170,2103, +2170,2104,2171, +2105,2171,2104, +2171,2105,2172, +2106,2172,2105, +2172,2106,2173, +2107,2173,2106, +2173,2107,2174, +2108,2174,2107, +2174,2108,2175, +2109,2175,2108, +2175,2109,2176, +2110,2176,2109, +2176,2110,2177, +2111,2177,2110, +}; + +#define Landscape01VtxCount 2048 +#define Landscape01IdxCount 11718 + +btScalar Landscape01Vtx[] = { +3.90626f,0.452911f,246.094f, +3.90626f,1.52302f,250.0f, +7.8125f,1.18238f,246.094f, +7.81251f,1.7549f,250.0f, +11.7188f,2.12911f,246.094f, +11.7188f,2.62454f,250.0f, +15.625f,3.01456f,246.094f, +15.625f,3.22814f,250.0f, +19.5313f,3.97431f,246.094f, +19.5313f,3.63231f,250.0f, +23.4375f,4.08741f,246.094f, +23.4375f,4.24097f,250.0f, +27.3438f,5.8163f,246.094f, +27.3438f,5.93409f,250.0f, +31.25f,6.86809f,246.094f, +31.25f,7.34105f,250.0f, +35.1563f,8.25405f,246.094f, +35.1563f,8.62507f,250.0f, +39.0625f,8.38601f,246.094f, +39.0625f,8.68483f,250.0f, +42.9688f,6.94797f,246.094f, +42.9688f,7.71847f,250.0f, +46.875f,4.60698f,246.094f, +46.875f,6.12159f,250.0f, +50.7813f,3.6429f,246.094f, +50.7813f,5.13002f,250.0f, +54.6875f,4.01945f,246.094f, +54.6875f,5.50476f,250.0f, +58.5938f,4.05996f,246.094f, +58.5938f,5.31917f,250.0f, +62.5f,3.98995f,246.094f, +62.5f,5.51823f,250.0f, +66.4063f,5.44402f,246.094f, +66.4063f,6.80029f,250.0f, +70.3125f,6.03873f,246.094f, +70.3125f,7.41783f,250.0f, +74.2188f,6.37187f,246.094f, +74.2188f,8.16051f,250.0f, +78.125f,6.74414f,246.094f, +78.125f,8.72099f,250.0f, +82.0313f,7.37958f,246.094f, +82.0313f,10.1125f,250.0f, +85.9375f,8.97782f,246.094f, +85.9375f,10.4624f,250.0f, +89.8438f,11.0829f,246.094f, +89.8438f,11.6403f,250.0f, +93.75f,12.3286f,246.094f, +93.75f,13.1378f,250.0f, +97.6563f,13.5966f,246.094f, +97.6563f,14.2949f,250.0f, +101.563f,15.5602f,246.094f, +101.563f,16.9487f,250.0f, +105.469f,16.9944f,246.094f, +105.469f,18.1946f,250.0f, +109.375f,17.886f,246.094f, +109.375f,19.5101f,250.0f, +113.281f,18.9289f,246.094f, +113.281f,20.9286f,250.0f, +117.188f,18.9873f,246.094f, +117.188f,20.0636f,250.0f, +121.094f,18.4954f,246.094f, +121.094f,20.5657f,250.0f, +125.0f,20.1484f,246.094f, +125.0f,21.1466f,250.0f, +128.906f,20.5032f,246.094f, +128.906f,22.3026f,250.0f, +132.813f,21.212f,246.094f, +132.813f,22.9139f,250.0f, +136.719f,22.289f,246.094f, +136.719f,24.4671f,250.0f, +140.625f,23.2441f,246.094f, +140.625f,24.3276f,250.0f, +144.531f,22.4971f,246.094f, +144.531f,24.3128f,250.0f, +148.438f,22.6347f,246.094f, +148.438f,23.8291f,250.0f, +152.344f,23.5767f,246.094f, +152.344f,24.1369f,250.0f, +156.25f,25.193f,246.094f, +156.25f,24.9132f,250.0f, +160.156f,25.2521f,246.094f, +160.156f,24.7251f,250.0f, +164.063f,25.7424f,246.094f, +164.063f,24.1169f,250.0f, +167.969f,24.3269f,246.094f, +167.969f,24.6092f,250.0f, +171.875f,25.0479f,246.094f, +171.875f,24.967f,250.0f, +175.781f,25.0107f,246.094f, +175.781f,24.7879f,250.0f, +179.688f,23.583f,246.094f, +179.688f,22.6841f,250.0f, +183.594f,20.958f,246.094f, +183.594f,20.6584f,250.0f, +187.5f,19.7535f,246.094f, +187.5f,20.0313f,250.0f, +191.406f,20.4707f,246.094f, +191.406f,20.3896f,250.0f, +195.313f,19.7551f,246.094f, +195.313f,21.5643f,250.0f, +199.219f,19.698f,246.094f, +199.219f,21.5733f,250.0f, +203.125f,20.0732f,246.094f, +203.125f,20.38f,250.0f, +207.031f,19.8667f,246.094f, +207.031f,19.3779f,250.0f, +210.938f,19.4501f,246.094f, +210.938f,19.5994f,250.0f, +214.844f,19.2918f,246.094f, +214.844f,19.0966f,250.0f, +218.75f,18.7652f,246.094f, +218.75f,19.9256f,250.0f, +222.656f,18.8129f,246.094f, +222.656f,19.8704f,250.0f, +226.563f,18.3547f,246.094f, +226.563f,18.8671f,250.0f, +230.469f,16.9801f,246.094f, +230.469f,17.4931f,250.0f, +234.375f,15.6173f,246.094f, +234.375f,16.1699f,250.0f, +238.281f,15.549f,246.094f, +238.281f,15.3704f,250.0f, +242.188f,15.2468f,246.094f, +242.188f,15.0306f,250.0f, +246.094f,14.1325f,246.094f, +246.094f,14.2622f,250.0f, +250.0f,14.4063f,246.094f, +250.0f,14.3657f,250.0f, +3.90626f,2.21488f,242.188f, +7.81252f,2.28606f,242.188f, +11.7188f,3.88428f,242.188f, +15.625f,3.39117f,242.188f, +19.5313f,3.64824f,242.188f, +23.4375f,4.14072f,242.188f, +27.3438f,5.74104f,242.188f, +31.25f,6.66142f,242.188f, +35.1563f,7.31371f,242.188f, +39.0625f,7.68371f,242.188f, +42.9688f,6.99041f,242.188f, +46.875f,4.89778f,242.188f, +50.7813f,2.64913f,242.188f, +54.6875f,2.76175f,242.188f, +58.5938f,3.10499f,242.188f, +62.5f,4.61915f,242.188f, +66.4063f,5.36769f,242.188f, +70.3125f,5.41759f,242.188f, +74.2188f,5.42279f,242.188f, +78.125f,5.53934f,242.188f, +82.0313f,5.38421f,242.188f, +85.9375f,7.77227f,242.188f, +89.8438f,9.40622f,242.188f, +93.75f,11.2904f,242.188f, +97.6563f,12.0748f,242.188f, +101.563f,14.1058f,242.188f, +105.469f,15.1513f,242.188f, +109.375f,15.9477f,242.188f, +113.281f,16.843f,242.188f, +117.188f,17.2117f,242.188f, +121.094f,18.2641f,242.188f, +125.0f,18.8672f,242.188f, +128.906f,19.3239f,242.188f, +132.813f,20.1067f,242.188f, +136.719f,20.8307f,242.188f, +140.625f,21.3646f,242.188f, +144.531f,21.6047f,242.188f, +148.438f,22.2456f,242.188f, +152.344f,23.5103f,242.188f, +156.25f,24.8533f,242.188f, +160.156f,25.4504f,242.188f, +164.063f,25.9357f,242.188f, +167.969f,24.8535f,242.188f, +171.875f,25.3099f,242.188f, +175.781f,25.3494f,242.188f, +179.688f,24.2229f,242.188f, +183.594f,21.0829f,242.188f, +187.5f,19.574f,242.188f, +191.406f,19.9835f,242.188f, +195.313f,19.6061f,242.188f, +199.219f,18.9509f,242.188f, +203.125f,20.1818f,242.188f, +207.031f,19.2962f,242.188f, +210.938f,18.8908f,242.188f, +214.844f,18.7996f,242.188f, +218.75f,18.7982f,242.188f, +222.656f,18.3283f,242.188f, +226.563f,17.7287f,242.188f, +230.469f,15.6882f,242.188f, +234.375f,15.2468f,242.188f, +238.281f,15.2703f,242.188f, +242.188f,14.4812f,242.188f, +246.094f,14.5597f,242.188f, +250.0f,14.178f,242.188f, +3.90626f,3.04396f,238.281f, +7.81252f,3.88428f,238.281f, +11.7188f,4.51367f,238.281f, +15.625f,4.1993f,238.281f, +19.5313f,4.48585f,238.281f, +23.4375f,5.11452f,238.281f, +27.3438f,4.98441f,238.281f, +31.25f,5.77536f,238.281f, +35.1563f,5.42743f,238.281f, +39.0625f,6.4581f,238.281f, +42.9688f,5.55272f,238.281f, +46.875f,3.69555f,238.281f, +50.7813f,3.08321f,238.281f, +54.6875f,2.96664f,238.281f, +58.5938f,3.94595f,238.281f, +62.5f,4.71605f,238.281f, +66.4063f,5.07906f,238.281f, +70.3125f,5.39291f,238.281f, +74.2188f,4.29289f,238.281f, +78.125f,4.20855f,238.281f, +82.0313f,5.10829f,238.281f, +85.9375f,5.48654f,238.281f, +89.8438f,7.06082f,238.281f, +93.75f,8.6827f,238.281f, +97.6563f,9.99779f,238.281f, +101.563f,11.9757f,238.281f, +105.469f,12.9031f,238.281f, +109.375f,13.7947f,238.281f, +113.281f,13.6154f,238.281f, +117.188f,15.9897f,238.281f, +121.094f,18.0884f,238.281f, +125.0f,18.714f,238.281f, +128.906f,19.1457f,238.281f, +132.813f,20.0791f,238.281f, +136.719f,20.3929f,238.281f, +140.625f,20.8277f,238.281f, +144.531f,21.2111f,238.281f, +148.438f,22.5091f,238.281f, +152.344f,23.9188f,238.281f, +156.25f,25.0278f,238.281f, +160.156f,25.8335f,238.281f, +164.063f,25.6558f,238.281f, +167.969f,24.3663f,238.281f, +171.875f,30.6775f,238.281f, +175.781f,30.89f,238.281f, +179.688f,29.2543f,238.281f, +183.594f,26.6241f,238.281f, +187.5f,24.7124f,238.281f, +191.406f,23.7048f,238.281f, +195.313f,23.3839f,238.281f, +199.219f,23.312f,238.281f, +203.125f,17.5221f,238.281f, +207.031f,17.418f,238.281f, +210.938f,17.5259f,238.281f, +214.844f,18.2392f,238.281f, +218.75f,18.6793f,238.281f, +222.656f,18.3701f,238.281f, +226.563f,17.2487f,238.281f, +230.469f,16.4f,238.281f, +234.375f,15.4998f,238.281f, +238.281f,14.6207f,238.281f, +242.188f,14.3055f,238.281f, +246.094f,14.2255f,238.281f, +250.0f,14.1326f,238.281f, +3.90626f,5.19166f,234.375f, +7.81252f,4.93292f,234.375f, +11.7188f,4.03413f,234.375f, +15.625f,3.70957f,234.375f, +19.5313f,4.44484f,234.375f, +23.4375f,5.12277f,234.375f, +27.3438f,4.60029f,234.375f, +31.25f,4.55048f,234.375f, +35.1563f,4.78512f,234.375f, +39.0625f,4.94627f,234.375f, +42.9688f,5.03351f,234.375f, +46.875f,3.08166f,234.375f, +50.7813f,2.57752f,234.375f, +54.6875f,3.08533f,234.375f, +58.5938f,4.0254f,234.375f, +62.5f,4.57575f,234.375f, +66.4063f,4.67125f,234.375f, +70.3125f,4.5612f,234.375f, +74.2188f,4.232f,234.375f, +78.125f,4.1571f,234.375f, +82.0313f,4.20157f,234.375f, +85.9375f,4.29102f,234.375f, +89.8438f,5.54826f,234.375f, +93.75f,7.06094f,234.375f, +97.6563f,8.27366f,234.375f, +101.563f,9.83852f,234.375f, +105.469f,10.9262f,234.375f, +109.375f,11.7812f,234.375f, +113.281f,13.8453f,234.375f, +117.188f,15.5538f,234.375f, +121.094f,16.8977f,234.375f, +125.0f,18.2996f,234.375f, +128.906f,19.6512f,234.375f, +132.813f,19.411f,234.375f, +136.719f,19.3317f,234.375f, +140.625f,20.656f,234.375f, +144.531f,21.6048f,234.375f, +148.438f,22.2246f,234.375f, +152.344f,23.6649f,234.375f, +156.25f,24.8772f,234.375f, +160.156f,27.6423f,234.375f, +164.063f,29.4442f,234.375f, +167.969f,29.6691f,234.375f, +171.875f,30.0772f,234.375f, +175.781f,30.3189f,234.375f, +179.688f,28.7319f,234.375f, +183.594f,26.6952f,234.375f, +187.5f,25.3375f,234.375f, +191.406f,24.1666f,234.375f, +195.313f,22.5458f,234.375f, +199.219f,22.2182f,234.375f, +203.125f,22.2413f,234.375f, +207.031f,21.8533f,234.375f, +210.938f,17.4596f,234.375f, +214.844f,17.2677f,234.375f, +218.75f,16.9584f,234.375f, +222.656f,16.6188f,234.375f, +226.563f,17.4388f,234.375f, +230.469f,16.936f,234.375f, +234.375f,15.6181f,234.375f, +238.281f,15.8373f,234.375f, +242.188f,15.0881f,234.375f, +246.094f,14.2247f,234.375f, +250.0f,14.111f,234.375f, +3.90626f,5.885f,230.469f, +7.81251f,5.4786f,230.469f, +11.7188f,5.0584f,230.469f, +15.625f,4.10283f,230.469f, +19.5313f,4.10569f,230.469f, +23.4375f,4.42202f,230.469f, +27.3438f,4.27849f,230.469f, +31.25f,4.25612f,230.469f, +35.1563f,3.83542f,230.469f, +39.0625f,3.37515f,230.469f, +42.9688f,4.16288f,230.469f, +46.875f,2.84197f,230.469f, +50.7813f,2.83467f,230.469f, +54.6875f,3.07874f,230.469f, +58.5938f,3.37745f,230.469f, +62.5f,4.09612f,230.469f, +66.4063f,4.65777f,230.469f, +70.3125f,4.45712f,230.469f, +74.2188f,3.89296f,230.469f, +78.125f,3.87471f,230.469f, +82.0313f,4.64568f,230.469f, +85.9375f,5.82987f,230.469f, +89.8438f,6.40084f,230.469f, +93.75f,7.65914f,230.469f, +97.6563f,8.07052f,230.469f, +101.563f,9.86632f,230.469f, +105.469f,11.8636f,230.469f, +109.375f,12.9547f,230.469f, +113.281f,14.2745f,230.469f, +117.188f,15.6876f,230.469f, +121.094f,17.2089f,230.469f, +125.0f,18.1267f,230.469f, +128.906f,19.379f,230.469f, +132.813f,19.2097f,230.469f, +136.719f,18.9335f,230.469f, +140.625f,19.9763f,230.469f, +144.531f,21.5401f,230.469f, +148.438f,21.7302f,230.469f, +152.344f,23.0108f,230.469f, +156.25f,28.7387f,230.469f, +160.156f,28.4179f,230.469f, +164.063f,28.6483f,230.469f, +167.969f,29.5567f,230.469f, +171.875f,29.589f,230.469f, +175.781f,29.7943f,230.469f, +179.688f,28.0587f,230.469f, +183.594f,27.6387f,230.469f, +187.5f,26.92f,230.469f, +191.406f,25.7995f,230.469f, +195.313f,23.8573f,230.469f, +199.219f,22.1543f,230.469f, +203.125f,21.8606f,230.469f, +207.031f,21.7644f,230.469f, +210.938f,22.284f,230.469f, +214.844f,22.465f,230.469f, +218.75f,16.4018f,230.469f, +222.656f,16.1053f,230.469f, +226.563f,16.9553f,230.469f, +230.469f,16.9851f,230.469f, +234.375f,16.0967f,230.469f, +238.281f,15.9758f,230.469f, +242.188f,15.3258f,230.469f, +246.094f,15.2909f,230.469f, +250.0f,14.7208f,230.469f, +3.90626f,6.89682f,226.563f, +7.81251f,6.58742f,226.563f, +11.7188f,6.03516f,226.563f, +15.625f,4.72243f,226.563f, +19.5313f,3.6445f,226.563f, +23.4375f,4.35761f,226.563f, +27.3438f,4.11714f,226.563f, +31.25f,4.31125f,226.563f, +35.1563f,3.42415f,226.563f, +39.0625f,2.29216f,226.563f, +42.9688f,2.47915f,226.563f, +46.875f,2.26767f,226.563f, +50.7813f,1.11914f,226.563f, +54.6875f,2.43266f,226.563f, +58.5938f,3.88718f,226.563f, +62.5f,3.9963f,226.563f, +66.4063f,4.30547f,226.563f, +70.3125f,4.43739f,226.563f, +74.2188f,3.89069f,226.563f, +78.125f,4.12082f,226.563f, +82.0313f,5.53252f,226.563f, +85.9375f,6.38493f,226.563f, +89.8438f,6.79959f,226.563f, +93.75f,8.29598f,226.563f, +97.6563f,8.48723f,226.563f, +101.563f,9.93554f,226.563f, +105.469f,11.5657f,226.563f, +109.375f,13.0486f,226.563f, +113.281f,13.8621f,226.563f, +117.188f,14.9688f,226.563f, +121.094f,16.3799f,226.563f, +125.0f,17.1973f,226.563f, +128.906f,17.376f,226.563f, +132.813f,18.1073f,226.563f, +136.719f,18.6844f,226.563f, +140.625f,18.5161f,226.563f, +144.531f,20.7617f,226.563f, +148.438f,21.0578f,226.563f, +152.344f,26.44f,226.563f, +156.25f,27.1807f,226.563f, +160.156f,27.2962f,226.563f, +164.063f,28.0507f,226.563f, +167.969f,28.6572f,226.563f, +171.875f,28.3487f,226.563f, +175.781f,23.7294f,226.563f, +179.688f,23.1113f,226.563f, +183.594f,22.5708f,226.563f, +187.5f,22.6165f,226.563f, +191.406f,21.8697f,226.563f, +195.313f,19.9841f,226.563f, +199.219f,22.9835f,226.563f, +203.125f,22.0743f,226.563f, +207.031f,22.4886f,226.563f, +210.938f,22.2516f,226.563f, +214.844f,22.3739f,226.563f, +218.75f,22.7815f,226.563f, +222.656f,17.0366f,226.563f, +226.563f,16.1334f,226.563f, +230.469f,16.9265f,226.563f, +234.375f,17.1793f,226.563f, +238.281f,17.3365f,226.563f, +242.188f,16.1971f,226.563f, +246.094f,15.2775f,226.563f, +250.0f,15.1313f,226.563f, +3.90626f,6.81349f,222.656f, +7.81251f,7.23848f,222.656f, +11.7188f,6.09864f,222.656f, +15.625f,4.9545f,222.656f, +19.5313f,3.88133f,222.656f, +23.4375f,4.06964f,222.656f, +27.3438f,3.90589f,222.656f, +31.25f,4.08304f,222.656f, +35.1563f,3.26204f,222.656f, +39.0625f,1.53457f,222.656f, +42.9688f,1.90835f,222.656f, +46.875f,1.98509f,222.656f, +50.7813f,2.14652f,222.656f, +54.6875f,2.7418f,222.656f, +58.5938f,3.74695f,222.656f, +62.5f,4.00354f,222.656f, +66.4063f,4.38792f,222.656f, +70.3125f,3.93121f,222.656f, +74.2188f,3.42647f,222.656f, +78.125f,5.0562f,222.656f, +82.0313f,5.98572f,222.656f, +85.9375f,6.52919f,222.656f, +89.8438f,6.83394f,222.656f, +93.75f,7.48974f,222.656f, +97.6563f,8.19267f,222.656f, +101.563f,9.33438f,222.656f, +105.469f,11.8423f,222.656f, +109.375f,13.1158f,222.656f, +113.281f,13.8944f,222.656f, +117.188f,14.8014f,222.656f, +121.094f,15.4129f,222.656f, +125.0f,15.6942f,222.656f, +128.906f,16.2049f,222.656f, +132.813f,17.0318f,222.656f, +136.719f,18.5423f,222.656f, +140.625f,18.8685f,222.656f, +144.531f,19.4529f,222.656f, +148.438f,25.9153f,222.656f, +152.344f,25.6773f,222.656f, +156.25f,26.0432f,222.656f, +160.156f,26.3016f,222.656f, +164.063f,27.084f,222.656f, +167.969f,27.1073f,222.656f, +171.875f,22.7536f,222.656f, +175.781f,23.3785f,222.656f, +179.688f,23.0862f,222.656f, +183.594f,22.5993f,222.656f, +187.5f,22.0197f,222.656f, +191.406f,21.8352f,222.656f, +195.313f,20.0501f,222.656f, +199.219f,18.5797f,222.656f, +203.125f,18.2905f,222.656f, +207.031f,22.7876f,222.656f, +210.938f,21.9787f,222.656f, +214.844f,21.4782f,222.656f, +218.75f,21.5786f,222.656f, +222.656f,21.6231f,222.656f, +226.563f,17.8058f,222.656f, +230.469f,17.6169f,222.656f, +234.375f,18.3242f,222.656f, +238.281f,18.4847f,222.656f, +242.188f,17.3189f,222.656f, +246.094f,16.7726f,222.656f, +250.0f,16.587f,222.656f, +3.90627f,8.02546f,218.75f, +7.81251f,8.24803f,218.75f, +11.7188f,6.92174f,218.75f, +15.625f,5.86085f,218.75f, +19.5313f,4.56603f,218.75f, +23.4375f,3.6909f,218.75f, +27.3438f,4.26522f,218.75f, +31.25f,3.37783f,218.75f, +35.1563f,1.72339f,218.75f, +39.0625f,2.22205f,218.75f, +42.9688f,2.71848f,218.75f, +46.875f,3.1467f,218.75f, +50.7813f,3.05327f,218.75f, +54.6875f,3.19537f,218.75f, +58.5938f,3.68243f,218.75f, +62.5f,3.35279f,218.75f, +66.4063f,4.00402f,218.75f, +70.3125f,2.9244f,218.75f, +74.2188f,4.39027f,218.75f, +78.125f,5.55878f,218.75f, +82.0313f,6.38772f,218.75f, +85.9375f,6.34964f,218.75f, +89.8438f,6.80441f,218.75f, +93.75f,6.5829f,218.75f, +97.6563f,7.27657f,218.75f, +101.563f,9.67388f,218.75f, +105.469f,10.833f,218.75f, +109.375f,12.1666f,218.75f, +113.281f,13.2095f,218.75f, +117.188f,14.2491f,218.75f, +121.094f,14.6953f,218.75f, +125.0f,14.2707f,218.75f, +128.906f,15.9556f,218.75f, +132.813f,16.7068f,218.75f, +136.719f,17.6679f,218.75f, +140.625f,18.8257f,218.75f, +144.531f,24.2255f,218.75f, +148.438f,25.0749f,218.75f, +152.344f,25.9271f,218.75f, +156.25f,26.2032f,218.75f, +160.156f,24.5168f,218.75f, +164.063f,26.2403f,218.75f, +167.969f,26.6223f,218.75f, +171.875f,22.4271f,218.75f, +175.781f,23.7925f,218.75f, +179.688f,23.3478f,218.75f, +183.594f,22.2279f,218.75f, +187.5f,22.2148f,218.75f, +191.406f,20.7538f,218.75f, +195.313f,19.5131f,218.75f, +199.219f,19.4834f,218.75f, +203.125f,18.3756f,218.75f, +207.031f,18.1034f,218.75f, +210.938f,20.0003f,218.75f, +214.844f,22.2111f,218.75f, +218.75f,21.6123f,218.75f, +222.656f,22.5943f,218.75f, +226.563f,24.3115f,218.75f, +230.469f,19.0536f,218.75f, +234.375f,18.6613f,218.75f, +238.281f,18.7675f,218.75f, +242.188f,18.3163f,218.75f, +246.094f,16.7013f,218.75f, +250.0f,17.0786f,218.75f, +3.90627f,9.25513f,214.844f, +7.81251f,9.67426f,214.844f, +11.7188f,8.92139f,214.844f, +15.625f,6.90738f,214.844f, +19.5313f,6.12616f,214.844f, +23.4375f,4.98302f,214.844f, +27.3438f,3.63786f,214.844f, +31.25f,2.52097f,214.844f, +35.1563f,3.30816f,214.844f, +39.0625f,4.04406f,214.844f, +42.9688f,4.48446f,214.844f, +46.875f,4.40695f,214.844f, +50.7813f,3.7693f,214.844f, +54.6875f,2.85523f,214.844f, +58.5938f,2.56849f,214.844f, +62.5f,2.56561f,214.844f, +66.4063f,2.82937f,214.844f, +70.3125f,2.75221f,214.844f, +74.2188f,5.02974f,214.844f, +78.125f,5.7988f,214.844f, +82.0313f,6.03219f,214.844f, +85.9375f,6.27423f,214.844f, +89.8438f,6.1671f,214.844f, +93.75f,6.86893f,214.844f, +97.6563f,7.94747f,214.844f, +101.563f,9.13548f,214.844f, +105.469f,9.63636f,214.844f, +109.375f,10.3351f,214.844f, +113.281f,12.4028f,214.844f, +117.188f,13.0321f,214.844f, +121.094f,13.6284f,214.844f, +125.0f,14.3167f,214.844f, +128.906f,15.0573f,214.844f, +132.813f,16.2022f,214.844f, +136.719f,17.7526f,214.844f, +140.625f,23.7093f,214.844f, +144.531f,24.3603f,214.844f, +148.438f,24.9195f,214.844f, +152.344f,25.198f,214.844f, +156.25f,20.8225f,214.844f, +160.156f,24.5918f,214.844f, +164.063f,25.1404f,214.844f, +167.969f,26.0659f,214.844f, +171.875f,22.1485f,214.844f, +175.781f,27.7236f,214.844f, +179.688f,27.4914f,214.844f, +183.594f,26.6606f,214.844f, +187.5f,26.623f,214.844f, +191.406f,26.3244f,214.844f, +195.313f,24.8535f,214.844f, +199.219f,23.6373f,214.844f, +203.125f,21.1881f,214.844f, +207.031f,19.7509f,214.844f, +210.938f,22.3046f,214.844f, +214.844f,22.5297f,214.844f, +218.75f,22.9498f,214.844f, +222.656f,23.2271f,214.844f, +226.563f,24.89f,214.844f, +230.469f,23.5226f,214.844f, +234.375f,19.0463f,214.844f, +238.281f,17.96f,214.844f, +242.188f,18.8106f,214.844f, +246.094f,17.3168f,214.844f, +250.0f,16.7955f,214.844f, +3.90627f,10.5728f,210.938f, +7.81251f,9.81018f,210.938f, +11.7188f,9.69715f,210.938f, +15.625f,8.42137f,210.938f, +19.5313f,7.09174f,210.938f, +23.4375f,6.45357f,210.938f, +27.3438f,4.58257f,210.938f, +31.25f,4.31044f,210.938f, +35.1563f,4.23584f,210.938f, +39.0625f,4.77527f,210.938f, +42.9688f,5.51217f,210.938f, +46.875f,5.48962f,210.938f, +50.7813f,4.50211f,210.938f, +54.6875f,4.06287f,210.938f, +58.5938f,3.43161f,210.938f, +62.5f,3.43195f,210.938f, +66.4063f,3.64204f,210.938f, +70.3125f,5.16151f,210.938f, +74.2188f,6.72853f,210.938f, +78.125f,7.43878f,210.938f, +82.0313f,7.30716f,210.938f, +85.9375f,6.54327f,210.938f, +89.8438f,5.96003f,210.938f, +93.75f,6.45099f,210.938f, +97.6563f,8.32748f,210.938f, +101.563f,8.85186f,210.938f, +105.469f,9.64058f,210.938f, +109.375f,10.4181f,210.938f, +113.281f,11.6911f,210.938f, +117.188f,12.0508f,210.938f, +121.094f,13.1004f,210.938f, +125.0f,14.4899f,210.938f, +128.906f,15.1295f,210.938f, +132.813f,15.6195f,210.938f, +136.719f,16.9219f,210.938f, +140.625f,23.4614f,210.938f, +144.531f,24.6763f,210.938f, +148.438f,26.12f,210.938f, +152.344f,21.7533f,210.938f, +156.25f,20.7448f,210.938f, +160.156f,24.1481f,210.938f, +164.063f,26.0464f,210.938f, +167.969f,25.1633f,210.938f, +171.875f,20.8056f,210.938f, +175.781f,26.3651f,210.938f, +179.688f,25.5322f,210.938f, +183.594f,26.3828f,210.938f, +187.5f,26.3586f,210.938f, +191.406f,26.1714f,210.938f, +195.313f,25.9695f,210.938f, +199.219f,24.3505f,210.938f, +203.125f,23.872f,210.938f, +207.031f,23.0401f,210.938f, +210.938f,22.3904f,210.938f, +214.844f,22.7647f,210.938f, +218.75f,23.266f,210.938f, +222.656f,23.8563f,210.938f, +226.563f,24.6635f,210.938f, +230.469f,24.3846f,210.938f, +234.375f,18.3213f,210.938f, +238.281f,17.6531f,210.938f, +242.188f,17.8854f,210.938f, +246.094f,17.1692f,210.938f, +250.0f,16.127f,210.938f, +3.90626f,10.4539f,207.031f, +7.81251f,10.0241f,207.031f, +11.7188f,10.3861f,207.031f, +15.625f,8.84417f,207.031f, +19.5313f,8.35477f,207.031f, +23.4375f,6.48112f,207.031f, +27.3438f,6.10753f,207.031f, +31.25f,6.13796f,207.031f, +35.1563f,6.51045f,207.031f, +39.0625f,6.65278f,207.031f, +42.9688f,6.27698f,207.031f, +46.875f,5.80577f,207.031f, +50.7813f,5.90354f,207.031f, +54.6875f,5.66137f,207.031f, +58.5938f,4.67472f,207.031f, +62.5f,4.81103f,207.031f, +66.4063f,6.06764f,207.031f, +70.3125f,7.61387f,207.031f, +74.2188f,8.72682f,207.031f, +78.125f,9.33231f,207.031f, +82.0313f,8.49751f,207.031f, +85.9375f,7.85293f,207.031f, +89.8438f,7.37573f,207.031f, +93.75f,7.4561f,207.031f, +97.6563f,7.76623f,207.031f, +101.563f,8.68264f,207.031f, +105.469f,10.4373f,207.031f, +109.375f,10.4722f,207.031f, +113.281f,11.4418f,207.031f, +117.188f,12.3081f,207.031f, +121.094f,12.9224f,207.031f, +125.0f,14.3204f,207.031f, +128.906f,15.1746f,207.031f, +132.813f,14.4847f,207.031f, +136.719f,20.974f,207.031f, +140.625f,23.4669f,207.031f, +144.531f,24.9918f,207.031f, +148.438f,25.7345f,207.031f, +152.344f,21.4943f,207.031f, +156.25f,22.169f,207.031f, +160.156f,24.9739f,207.031f, +164.063f,26.4423f,207.031f, +167.969f,25.8928f,207.031f, +171.875f,20.5408f,207.031f, +175.781f,24.2294f,207.031f, +179.688f,24.4008f,207.031f, +183.594f,25.2809f,207.031f, +187.5f,25.8589f,207.031f, +191.406f,26.3716f,207.031f, +195.313f,26.0525f,207.031f, +199.219f,24.6109f,207.031f, +203.125f,24.1128f,207.031f, +207.031f,23.4731f,207.031f, +210.938f,22.6487f,207.031f, +214.844f,22.7977f,207.031f, +218.75f,18.4754f,207.031f, +222.656f,23.1848f,207.031f, +226.563f,23.1818f,207.031f, +230.469f,22.9194f,207.031f, +234.375f,19.8052f,207.031f, +238.281f,16.8602f,207.031f, +242.188f,17.1047f,207.031f, +246.094f,16.1145f,207.031f, +250.0f,15.0049f,207.031f, +3.90626f,11.4706f,203.125f, +7.81251f,11.0922f,203.125f, +11.7188f,11.454f,203.125f, +15.625f,10.399f,203.125f, +19.5313f,8.89365f,203.125f, +23.4375f,7.52605f,203.125f, +27.3438f,7.07779f,203.125f, +31.25f,7.98082f,203.125f, +35.1563f,8.78342f,203.125f, +39.0625f,8.87165f,203.125f, +42.9688f,8.39122f,203.125f, +46.875f,7.48032f,203.125f, +50.7813f,6.77944f,203.125f, +54.6875f,7.14862f,203.125f, +58.5938f,6.46173f,203.125f, +62.5f,6.73824f,203.125f, +66.4063f,7.64505f,203.125f, +70.3125f,9.22763f,203.125f, +74.2188f,9.87781f,203.125f, +78.125f,10.1574f,203.125f, +82.0313f,9.81606f,203.125f, +85.9375f,9.8669f,203.125f, +89.8438f,10.0032f,203.125f, +93.75f,9.76597f,203.125f, +97.6563f,9.2129f,203.125f, +101.563f,8.89917f,203.125f, +105.469f,9.85112f,203.125f, +109.375f,11.4827f,203.125f, +113.281f,11.8911f,203.125f, +117.188f,12.3305f,203.125f, +121.094f,13.6098f,203.125f, +125.0f,14.1477f,203.125f, +128.906f,14.7928f,203.125f, +132.813f,16.3422f,203.125f, +136.719f,22.7583f,203.125f, +140.625f,24.5881f,203.125f, +144.531f,25.3565f,203.125f, +148.438f,21.7799f,203.125f, +152.344f,24.1222f,203.125f, +156.25f,26.6774f,203.125f, +160.156f,25.7031f,203.125f, +164.063f,26.9766f,203.125f, +167.969f,25.936f,203.125f, +171.875f,19.7727f,203.125f, +175.781f,19.3015f,203.125f, +179.688f,19.2421f,203.125f, +183.594f,24.8014f,203.125f, +187.5f,25.3041f,203.125f, +191.406f,25.3226f,203.125f, +195.313f,20.0369f,203.125f, +199.219f,19.4927f,203.125f, +203.125f,23.4349f,203.125f, +207.031f,22.748f,203.125f, +210.938f,22.4583f,203.125f, +214.844f,18.8936f,203.125f, +218.75f,17.4565f,203.125f, +222.656f,18.8235f,203.125f, +226.563f,21.4749f,203.125f, +230.469f,21.7691f,203.125f, +234.375f,21.1398f,203.125f, +238.281f,15.9012f,203.125f, +242.188f,15.9735f,203.125f, +246.094f,15.2287f,203.125f, +250.0f,13.5655f,203.125f, +3.90626f,12.1184f,199.219f, +7.81251f,12.3652f,199.219f, +11.7188f,12.1177f,199.219f, +15.625f,11.107f,199.219f, +19.5313f,9.91183f,199.219f, +23.4375f,8.6581f,199.219f, +27.3438f,7.98212f,199.219f, +31.25f,9.14995f,199.219f, +35.1563f,10.2879f,199.219f, +39.0625f,10.2569f,199.219f, +42.9688f,9.58908f,199.219f, +46.875f,8.1296f,199.219f, +50.7813f,7.81944f,199.219f, +54.6875f,8.54521f,199.219f, +58.5938f,8.14627f,199.219f, +62.5f,8.60974f,199.219f, +66.4063f,9.63518f,199.219f, +70.3125f,10.5321f,199.219f, +74.2188f,10.3348f,199.219f, +78.125f,11.2806f,199.219f, +82.0313f,11.3874f,199.219f, +85.9375f,11.6949f,199.219f, +89.8438f,12.3833f,199.219f, +93.75f,12.4654f,199.219f, +97.6563f,11.369f,199.219f, +101.563f,10.2737f,199.219f, +105.469f,10.4291f,199.219f, +109.375f,11.0962f,199.219f, +113.281f,12.1388f,199.219f, +117.188f,12.5535f,199.219f, +121.094f,13.2826f,199.219f, +125.0f,15.1899f,199.219f, +128.906f,16.3486f,199.219f, +132.813f,17.6147f,199.219f, +136.719f,23.878f,199.219f, +140.625f,24.5901f,199.219f, +144.531f,26.2181f,199.219f, +148.438f,21.847f,199.219f, +152.344f,26.5018f,199.219f, +156.25f,26.2772f,199.219f, +160.156f,26.4621f,199.219f, +164.063f,26.1902f,199.219f, +167.969f,26.1086f,199.219f, +171.875f,20.7414f,199.219f, +175.781f,20.393f,199.219f, +179.688f,19.7885f,199.219f, +183.594f,20.9687f,199.219f, +187.5f,23.8625f,199.219f, +191.406f,24.0825f,199.219f, +195.313f,19.4921f,199.219f, +199.219f,20.8763f,199.219f, +203.125f,21.987f,199.219f, +207.031f,21.9212f,199.219f, +210.938f,20.0341f,199.219f, +214.844f,15.7998f,199.219f, +218.75f,15.7759f,199.219f, +222.656f,15.8963f,199.219f, +226.563f,19.8168f,199.219f, +230.469f,19.9894f,199.219f, +234.375f,19.4382f,199.219f, +238.281f,14.2335f,199.219f, +242.188f,14.9225f,199.219f, +246.094f,13.5857f,199.219f, +250.0f,11.7225f,199.219f, +3.90626f,13.8013f,195.313f, +7.81251f,13.8046f,195.313f, +11.7188f,13.1462f,195.313f, +15.625f,12.2626f,195.313f, +19.5313f,10.67f,195.313f, +23.4375f,10.0372f,195.313f, +27.3438f,9.3255f,195.313f, +31.25f,10.5057f,195.313f, +35.1563f,11.0615f,195.313f, +39.0625f,11.2421f,195.313f, +42.9688f,10.4767f,195.313f, +46.875f,9.03042f,195.313f, +50.7813f,9.47397f,195.313f, +54.6875f,9.65703f,195.313f, +58.5938f,9.6345f,195.313f, +62.5f,9.9552f,195.313f, +66.4063f,10.8427f,195.313f, +70.3125f,11.7912f,195.313f, +74.2188f,11.5822f,195.313f, +78.125f,13.07f,195.313f, +82.0313f,13.803f,195.313f, +85.9375f,12.9764f,195.313f, +89.8438f,14.639f,195.313f, +93.75f,14.6139f,195.313f, +97.6563f,13.3162f,195.313f, +101.563f,12.7402f,195.313f, +105.469f,12.8061f,195.313f, +109.375f,12.1167f,195.313f, +113.281f,12.705f,195.313f, +117.188f,12.4568f,195.313f, +121.094f,13.5698f,195.313f, +125.0f,15.1843f,195.313f, +128.906f,16.7529f,195.313f, +132.813f,19.1744f,195.313f, +136.719f,23.9261f,195.313f, +140.625f,25.9824f,195.313f, +144.531f,26.1631f,195.313f, +148.438f,21.4735f,195.313f, +152.344f,25.5313f,195.313f, +156.25f,27.0098f,195.313f, +160.156f,27.5776f,195.313f, +164.063f,27.0858f,195.313f, +167.969f,26.3007f,195.313f, +171.875f,23.4599f,195.313f, +175.781f,26.4252f,195.313f, +179.688f,21.1453f,195.313f, +183.594f,21.1021f,195.313f, +187.5f,25.1644f,195.313f, +191.406f,24.8681f,195.313f, +195.313f,24.1757f,195.313f, +199.219f,20.0013f,195.313f, +203.125f,23.6085f,195.313f, +207.031f,22.7043f,195.313f, +210.938f,17.4097f,195.313f, +214.844f,16.8216f,195.313f, +218.75f,16.2595f,195.313f, +222.656f,15.547f,195.313f, +226.563f,20.5074f,195.313f, +230.469f,20.0296f,195.313f, +234.375f,19.4594f,195.313f, +238.281f,14.3376f,195.313f, +242.188f,13.8667f,195.313f, +246.094f,12.7786f,195.313f, +250.0f,12.669f,195.313f, +3.90626f,14.3936f,191.406f, +7.81251f,14.3324f,191.406f, +11.7188f,13.5165f,191.406f, +15.625f,12.3486f,191.406f, +19.5313f,10.8996f,191.406f, +23.4375f,10.767f,191.406f, +27.3438f,12.0663f,191.406f, +31.25f,12.0032f,191.406f, +35.1563f,12.6763f,191.406f, +39.0625f,12.4746f,191.406f, +42.9688f,10.9305f,191.406f, +46.875f,11.0794f,191.406f, +50.7813f,11.2588f,191.406f, +54.6875f,11.0855f,191.406f, +58.5938f,10.1448f,191.406f, +62.5f,11.1184f,191.406f, +66.4063f,12.2266f,191.406f, +70.3125f,12.3132f,191.406f, +74.2188f,13.6918f,191.406f, +78.125f,14.4314f,191.406f, +82.0313f,14.6924f,191.406f, +85.9375f,15.6669f,191.406f, +89.8438f,16.085f,191.406f, +93.75f,16.2697f,191.406f, +97.6563f,16.3584f,191.406f, +101.563f,15.6226f,191.406f, +105.469f,14.7096f,191.406f, +109.375f,14.172f,191.406f, +113.281f,13.6538f,191.406f, +117.188f,14.6791f,191.406f, +121.094f,15.1835f,191.406f, +125.0f,16.4947f,191.406f, +128.906f,17.5173f,191.406f, +132.813f,22.4657f,191.406f, +136.719f,25.2206f,191.406f, +140.625f,26.6814f,191.406f, +144.531f,27.4657f,191.406f, +148.438f,22.8092f,191.406f, +152.344f,22.336f,191.406f, +156.25f,29.0833f,191.406f, +160.156f,29.5204f,191.406f, +164.063f,29.4008f,191.406f, +167.969f,28.5038f,191.406f, +171.875f,27.7213f,191.406f, +175.781f,27.6884f,191.406f, +179.688f,25.8434f,191.406f, +183.594f,23.3048f,191.406f, +187.5f,27.635f,191.406f, +191.406f,26.1341f,191.406f, +195.313f,26.6792f,191.406f, +199.219f,22.747f,191.406f, +203.125f,22.8472f,191.406f, +207.031f,21.8628f,191.406f, +210.938f,20.5896f,191.406f, +214.844f,20.683f,191.406f, +218.75f,15.9904f,191.406f, +222.656f,16.3766f,191.406f, +226.563f,21.611f,191.406f, +230.469f,20.8727f,191.406f, +234.375f,20.2044f,191.406f, +238.281f,15.3358f,191.406f, +242.188f,14.7065f,191.406f, +246.094f,14.4372f,191.406f, +250.0f,14.1124f,191.406f, +3.90626f,14.1738f,187.5f, +7.81252f,14.5502f,187.5f, +11.7188f,13.6083f,187.5f, +15.625f,12.2654f,187.5f, +19.5313f,11.7405f,187.5f, +23.4375f,12.3756f,187.5f, +27.3438f,14.0775f,187.5f, +31.25f,13.9675f,187.5f, +35.1563f,14.3286f,187.5f, +39.0625f,13.1055f,187.5f, +42.9688f,13.0413f,187.5f, +46.875f,13.318f,187.5f, +50.7813f,12.9383f,187.5f, +54.6875f,12.9366f,187.5f, +58.5938f,12.1308f,187.5f, +62.5f,12.8501f,187.5f, +66.4063f,13.0312f,187.5f, +70.3125f,13.1657f,187.5f, +74.2188f,14.6177f,187.5f, +78.125f,16.1865f,187.5f, +82.0313f,16.3194f,187.5f, +85.9375f,16.9023f,187.5f, +89.8438f,17.5469f,187.5f, +93.75f,18.1166f,187.5f, +97.6563f,18.7398f,187.5f, +101.563f,18.2643f,187.5f, +105.469f,17.5115f,187.5f, +109.375f,16.8559f,187.5f, +113.281f,15.8332f,187.5f, +117.188f,16.4429f,187.5f, +121.094f,17.0698f,187.5f, +125.0f,18.0389f,187.5f, +128.906f,19.8697f,187.5f, +132.813f,24.8511f,187.5f, +136.719f,26.6838f,187.5f, +140.625f,28.5323f,187.5f, +144.531f,28.756f,187.5f, +148.438f,25.5762f,187.5f, +152.344f,25.8993f,187.5f, +156.25f,29.0469f,187.5f, +160.156f,32.1254f,187.5f, +164.063f,32.1318f,187.5f, +167.969f,31.7887f,187.5f, +171.875f,30.3727f,187.5f, +175.781f,30.1222f,187.5f, +179.688f,30.3556f,187.5f, +183.594f,30.49f,187.5f, +187.5f,29.3956f,187.5f, +191.406f,30.6569f,187.5f, +195.313f,30.8632f,187.5f, +199.219f,26.1118f,187.5f, +203.125f,25.5008f,187.5f, +207.031f,24.7878f,187.5f, +210.938f,27.5453f,187.5f, +214.844f,25.5271f,187.5f, +218.75f,20.2295f,187.5f, +222.656f,17.2785f,187.5f, +226.563f,22.0337f,187.5f, +230.469f,22.1938f,187.5f, +234.375f,21.6646f,187.5f, +238.281f,16.8654f,187.5f, +242.188f,15.704f,187.5f, +246.094f,15.9973f,187.5f, +250.0f,15.209f,187.5f, +3.90626f,13.9878f,183.594f, +7.81252f,14.3413f,183.594f, +11.7188f,13.1779f,183.594f, +15.625f,12.8538f,183.594f, +19.5313f,13.9436f,183.594f, +23.4375f,14.716f,183.594f, +27.3438f,14.991f,183.594f, +31.25f,15.4235f,183.594f, +35.1563f,15.3865f,183.594f, +39.0625f,14.2459f,183.594f, +42.9688f,15.2992f,183.594f, +46.875f,16.0599f,183.594f, +50.7813f,14.8603f,183.594f, +54.6875f,14.9726f,183.594f, +58.5938f,13.6053f,183.594f, +62.5f,13.057f,183.594f, +66.4063f,13.4201f,183.594f, +70.3125f,14.0782f,183.594f, +74.2188f,15.3178f,183.594f, +78.125f,16.3995f,183.594f, +82.0313f,17.4379f,183.594f, +85.9375f,17.9502f,183.594f, +89.8438f,18.4811f,183.594f, +93.75f,19.4227f,183.594f, +97.6563f,20.1694f,183.594f, +101.563f,20.1609f,183.594f, +105.469f,19.5537f,183.594f, +109.375f,19.039f,183.594f, +113.281f,18.2247f,183.594f, +117.188f,18.6643f,183.594f, +121.094f,19.2334f,183.594f, +125.0f,20.4158f,183.594f, +128.906f,21.1136f,183.594f, +132.813f,25.6638f,183.594f, +136.719f,27.4642f,183.594f, +140.625f,29.0749f,183.594f, +144.531f,30.6966f,183.594f, +148.438f,26.933f,183.594f, +152.344f,27.9984f,183.594f, +156.25f,28.4094f,183.594f, +160.156f,33.857f,183.594f, +164.063f,34.6528f,183.594f, +167.969f,33.405f,183.594f, +171.875f,31.8412f,183.594f, +175.781f,31.8788f,183.594f, +179.688f,32.395f,183.594f, +183.594f,32.8498f,183.594f, +187.5f,28.7385f,183.594f, +191.406f,33.6253f,183.594f, +195.313f,32.9673f,183.594f, +199.219f,31.8413f,183.594f, +203.125f,26.491f,183.594f, +207.031f,29.4589f,183.594f, +210.938f,28.7843f,183.594f, +214.844f,26.577f,183.594f, +218.75f,25.0304f,183.594f, +222.656f,18.7948f,183.594f, +226.563f,23.1467f,183.594f, +230.469f,22.3329f,183.594f, +234.375f,21.6877f,183.594f, +238.281f,16.4114f,183.594f, +242.188f,16.4672f,183.594f, +246.094f,16.3324f,183.594f, +250.0f,16.0497f,183.594f, +3.90626f,14.6785f,179.688f, +7.81252f,14.4582f,179.688f, +11.7188f,13.7379f,179.688f, +15.625f,13.9816f,179.688f, +19.5313f,14.9647f,179.688f, +23.4375f,15.3633f,179.688f, +27.3438f,16.1346f,179.688f, +31.25f,16.4088f,179.688f, +35.1563f,16.195f,179.688f, +39.0625f,16.1785f,179.688f, +42.9688f,17.2534f,179.688f, +46.875f,17.329f,179.688f, +50.7813f,16.0096f,179.688f, +54.6875f,15.4766f,179.688f, +58.5938f,14.0828f,179.688f, +62.5f,12.8927f,179.688f, +66.4063f,14.1195f,179.688f, +70.3125f,14.9421f,179.688f, +74.2188f,15.9015f,179.688f, +78.125f,17.3756f,179.688f, +82.0313f,18.6339f,179.688f, +85.9375f,19.7602f,179.688f, +89.8438f,19.8522f,179.688f, +93.75f,20.5838f,179.688f, +97.6563f,21.2938f,179.688f, +101.563f,21.1808f,179.688f, +105.469f,21.4575f,179.688f, +109.375f,21.1629f,179.688f, +113.281f,20.4789f,179.688f, +117.188f,20.5729f,179.688f, +121.094f,20.3917f,179.688f, +125.0f,21.8501f,179.688f, +128.906f,22.6846f,179.688f, +132.813f,23.4145f,179.688f, +136.719f,28.3033f,179.688f, +140.625f,30.5638f,179.688f, +144.531f,32.761f,179.688f, +148.438f,29.4434f,179.688f, +152.344f,30.346f,179.688f, +156.25f,31.7037f,179.688f, +160.156f,36.287f,179.688f, +164.063f,36.7423f,179.688f, +167.969f,35.7482f,179.688f, +171.875f,30.0008f,179.688f, +175.781f,29.6748f,179.688f, +179.688f,34.5316f,179.688f, +183.594f,34.4476f,179.688f, +187.5f,34.3489f,179.688f, +191.406f,33.4208f,179.688f, +195.313f,29.5511f,179.688f, +199.219f,28.9653f,179.688f, +203.125f,28.1749f,179.688f, +207.031f,30.5574f,179.688f, +210.938f,28.6513f,179.688f, +214.844f,27.1867f,179.688f, +218.75f,20.8455f,179.688f, +222.656f,20.3256f,179.688f, +226.563f,24.3717f,179.688f, +230.469f,23.2197f,179.688f, +234.375f,21.6566f,179.688f, +238.281f,16.2487f,179.688f, +242.188f,16.7759f,179.688f, +246.094f,16.5259f,179.688f, +250.0f,15.8782f,179.688f, +3.90626f,15.2963f,175.781f, +7.81252f,15.075f,175.781f, +11.7188f,14.8069f,175.781f, +15.625f,14.4469f,175.781f, +19.5313f,15.8073f,175.781f, +23.4375f,16.5419f,175.781f, +27.3438f,16.7791f,175.781f, +31.25f,17.1945f,175.781f, +35.1563f,16.9974f,175.781f, +39.0625f,16.9655f,175.781f, +42.9688f,17.7583f,175.781f, +46.875f,18.115f,175.781f, +50.7813f,16.6524f,175.781f, +54.6875f,15.897f,175.781f, +58.5938f,15.4613f,175.781f, +62.5f,14.3684f,175.781f, +66.4063f,15.0403f,175.781f, +70.3125f,15.9604f,175.781f, +74.2188f,16.9477f,175.781f, +78.125f,18.0563f,175.781f, +82.0313f,18.8971f,175.781f, +85.9375f,20.1037f,175.781f, +89.8438f,20.3627f,175.781f, +93.75f,20.0215f,175.781f, +97.6563f,20.8917f,175.781f, +101.563f,21.8702f,175.781f, +105.469f,22.7304f,175.781f, +109.375f,22.6873f,175.781f, +113.281f,21.4896f,175.781f, +117.188f,21.3864f,175.781f, +121.094f,22.4194f,175.781f, +125.0f,23.5751f,175.781f, +128.906f,23.9616f,175.781f, +132.813f,24.6066f,175.781f, +136.719f,30.8792f,175.781f, +140.625f,31.6572f,175.781f, +144.531f,34.2264f,175.781f, +148.438f,30.9611f,175.781f, +152.344f,35.8851f,175.781f, +156.25f,38.6379f,175.781f, +160.156f,39.1098f,175.781f, +164.063f,39.046f,175.781f, +167.969f,38.0327f,175.781f, +171.875f,36.6611f,175.781f, +175.781f,36.0664f,175.781f, +179.688f,36.1227f,175.781f, +183.594f,36.0705f,175.781f, +187.5f,35.9099f,175.781f, +191.406f,30.4106f,175.781f, +195.313f,30.0475f,175.781f, +199.219f,28.9213f,175.781f, +203.125f,32.8995f,175.781f, +207.031f,31.2376f,175.781f, +210.938f,30.0194f,175.781f, +214.844f,23.402f,175.781f, +218.75f,21.7271f,175.781f, +222.656f,20.0594f,175.781f, +226.563f,25.2266f,175.781f, +230.469f,24.1549f,175.781f, +234.375f,22.0418f,175.781f, +238.281f,15.6301f,175.781f, +242.188f,15.4767f,175.781f, +246.094f,15.8876f,175.781f, +250.0f,15.1339f,175.781f, +3.90626f,16.0791f,171.875f, +7.81251f,16.012f,171.875f, +11.7188f,15.027f,171.875f, +15.625f,15.1362f,171.875f, +19.5313f,16.3622f,171.875f, +23.4375f,16.7304f,171.875f, +27.3438f,17.228f,171.875f, +31.25f,16.4882f,171.875f, +35.1563f,16.5399f,171.875f, +39.0625f,17.5505f,171.875f, +42.9688f,17.6944f,171.875f, +46.875f,17.7481f,171.875f, +50.7813f,17.4568f,171.875f, +54.6875f,16.5655f,171.875f, +58.5938f,15.4313f,171.875f, +62.5f,14.962f,171.875f, +66.4063f,15.2516f,171.875f, +70.3125f,16.3088f,171.875f, +74.2188f,17.5354f,171.875f, +78.125f,18.5759f,171.875f, +82.0313f,19.1666f,171.875f, +85.9375f,19.8244f,171.875f, +89.8438f,20.6303f,171.875f, +93.75f,20.5635f,171.875f, +97.6563f,20.5768f,171.875f, +101.563f,21.542f,171.875f, +105.469f,22.5605f,171.875f, +109.375f,23.0118f,171.875f, +113.281f,22.6086f,171.875f, +117.188f,22.8502f,171.875f, +121.094f,23.2278f,171.875f, +125.0f,24.368f,171.875f, +128.906f,25.5759f,171.875f, +132.813f,27.7217f,171.875f, +136.719f,33.4581f,171.875f, +140.625f,33.4128f,171.875f, +144.531f,34.9465f,171.875f, +148.438f,31.4923f,171.875f, +152.344f,38.6707f,171.875f, +156.25f,40.2713f,171.875f, +160.156f,40.4155f,171.875f, +164.063f,41.0232f,171.875f, +167.969f,39.781f,171.875f, +171.875f,37.8376f,171.875f, +175.781f,38.0559f,171.875f, +179.688f,32.0147f,171.875f, +183.594f,35.2298f,171.875f, +187.5f,34.7221f,171.875f, +191.406f,31.5516f,171.875f, +195.313f,28.9984f,171.875f, +199.219f,29.8767f,171.875f, +203.125f,32.6404f,171.875f, +207.031f,31.3413f,171.875f, +210.938f,28.4132f,171.875f, +214.844f,22.9909f,171.875f, +218.75f,21.3955f,171.875f, +222.656f,25.3135f,171.875f, +226.563f,25.1463f,171.875f, +230.469f,23.4716f,171.875f, +234.375f,22.494f,171.875f, +238.281f,15.9351f,171.875f, +242.188f,15.2882f,171.875f, +246.094f,14.8463f,171.875f, +250.0f,14.5269f,171.875f, +3.90626f,17.1455f,167.969f, +7.81251f,16.6981f,167.969f, +11.7188f,16.5681f,167.969f, +15.625f,16.1667f,167.969f, +19.5313f,16.3523f,167.969f, +23.4375f,16.5389f,167.969f, +27.3438f,16.8075f,167.969f, +31.25f,17.1987f,167.969f, +35.1563f,17.86f,167.969f, +39.0625f,18.5438f,167.969f, +42.9688f,18.6718f,167.969f, +46.875f,17.9387f,167.969f, +50.7813f,17.5403f,167.969f, +54.6875f,17.4895f,167.969f, +58.5938f,16.9679f,167.969f, +62.5f,16.2192f,167.969f, +66.4063f,15.5699f,167.969f, +70.3125f,17.0017f,167.969f, +74.2188f,18.0147f,167.969f, +78.125f,18.9836f,167.969f, +82.0313f,19.8197f,167.969f, +85.9375f,19.8969f,167.969f, +89.8438f,20.6411f,167.969f, +93.75f,20.9768f,167.969f, +97.6563f,21.1498f,167.969f, +101.563f,21.3269f,167.969f, +105.469f,22.1153f,167.969f, +109.375f,22.208f,167.969f, +113.281f,23.2278f,167.969f, +117.188f,24.5722f,167.969f, +121.094f,25.3921f,167.969f, +125.0f,26.2683f,167.969f, +128.906f,28.138f,167.969f, +132.813f,29.9483f,167.969f, +136.719f,34.7607f,167.969f, +140.625f,35.3745f,167.969f, +144.531f,36.1401f,167.969f, +148.438f,38.0587f,167.969f, +152.344f,40.0092f,167.969f, +156.25f,40.9205f,167.969f, +160.156f,41.4664f,167.969f, +164.063f,41.8834f,167.969f, +167.969f,40.2863f,167.969f, +171.875f,38.4111f,167.969f, +175.781f,37.4971f,167.969f, +179.688f,32.0995f,167.969f, +183.594f,36.4852f,167.969f, +187.5f,34.5523f,167.969f, +191.406f,34.4101f,167.969f, +195.313f,29.577f,167.969f, +199.219f,33.7462f,167.969f, +203.125f,33.0191f,167.969f, +207.031f,31.6651f,167.969f, +210.938f,24.6623f,167.969f, +214.844f,22.6532f,167.969f, +218.75f,21.898f,167.969f, +222.656f,26.1764f,167.969f, +226.563f,24.7619f,167.969f, +230.469f,22.6772f,167.969f, +234.375f,17.6202f,167.969f, +238.281f,16.1581f,167.969f, +242.188f,14.7308f,167.969f, +246.094f,14.294f,167.969f, +250.0f,13.1169f,167.969f, +3.90627f,16.4621f,164.063f, +7.81251f,17.581f,164.063f, +11.7188f,17.7296f,164.063f, +15.625f,17.126f,164.063f, +19.5313f,17.3484f,164.063f, +23.4375f,17.9863f,164.063f, +27.3438f,18.6623f,164.063f, +31.25f,18.7934f,164.063f, +35.1563f,18.8245f,164.063f, +39.0625f,18.9554f,164.063f, +42.9688f,19.3152f,164.063f, +46.875f,18.5996f,164.063f, +50.7813f,18.0094f,164.063f, +54.6875f,17.5702f,164.063f, +58.5938f,17.5846f,164.063f, +62.5f,17.3718f,164.063f, +66.4063f,17.7189f,164.063f, +70.3125f,17.9805f,164.063f, +74.2188f,18.2986f,164.063f, +78.125f,18.9566f,164.063f, +82.0313f,20.4142f,164.063f, +85.9375f,20.5066f,164.063f, +89.8438f,20.7654f,164.063f, +93.75f,20.9457f,164.063f, +97.6563f,21.1078f,164.063f, +101.563f,20.7505f,164.063f, +105.469f,21.4615f,164.063f, +109.375f,22.8061f,164.063f, +113.281f,24.2655f,164.063f, +117.188f,24.815f,164.063f, +121.094f,26.3141f,164.063f, +125.0f,28.393f,164.063f, +128.906f,30.0565f,164.063f, +132.813f,31.4858f,164.063f, +136.719f,31.6549f,164.063f, +140.625f,37.0597f,164.063f, +144.531f,37.7613f,164.063f, +148.438f,38.9888f,164.063f, +152.344f,39.1482f,164.063f, +156.25f,36.6367f,164.063f, +160.156f,41.2606f,164.063f, +164.063f,42.2366f,164.063f, +167.969f,40.9757f,164.063f, +171.875f,33.9016f,164.063f, +175.781f,34.1798f,164.063f, +179.688f,33.0682f,164.063f, +183.594f,35.2269f,164.063f, +187.5f,35.1129f,164.063f, +191.406f,34.7006f,164.063f, +195.313f,30.1221f,164.063f, +199.219f,34.6592f,164.063f, +203.125f,33.6195f,164.063f, +207.031f,30.0546f,164.063f, +210.938f,24.8295f,164.063f, +214.844f,23.0298f,164.063f, +218.75f,26.5636f,164.063f, +222.656f,25.7973f,164.063f, +226.563f,23.7612f,164.063f, +230.469f,22.3646f,164.063f, +234.375f,16.1956f,164.063f, +238.281f,14.863f,164.063f, +242.188f,13.95f,164.063f, +246.094f,14.1968f,164.063f, +250.0f,13.2951f,164.063f, +3.90627f,16.628f,160.156f, +7.81251f,17.4268f,160.156f, +11.7188f,18.0363f,160.156f, +15.625f,18.1287f,160.156f, +19.5313f,18.6222f,160.156f, +23.4375f,18.2801f,160.156f, +27.3438f,18.5912f,160.156f, +31.25f,18.8635f,160.156f, +35.1563f,19.2193f,160.156f, +39.0625f,18.8821f,160.156f, +42.9688f,19.0078f,160.156f, +46.875f,19.3506f,160.156f, +50.7813f,17.8504f,160.156f, +54.6875f,18.5322f,160.156f, +58.5938f,18.2223f,160.156f, +62.5f,18.032f,160.156f, +66.4063f,18.574f,160.156f, +70.3125f,18.3835f,160.156f, +74.2188f,18.0842f,160.156f, +78.125f,19.8632f,160.156f, +82.0313f,20.9487f,160.156f, +85.9375f,20.6197f,160.156f, +89.8438f,20.5117f,160.156f, +93.75f,20.4182f,160.156f, +97.6563f,19.8654f,160.156f, +101.563f,20.1971f,160.156f, +105.469f,22.0419f,160.156f, +109.375f,23.4698f,160.156f, +113.281f,24.6461f,160.156f, +117.188f,26.2207f,160.156f, +121.094f,28.1249f,160.156f, +125.0f,29.8102f,160.156f, +128.906f,31.7349f,160.156f, +132.813f,32.4376f,160.156f, +136.719f,33.2795f,160.156f, +140.625f,37.4588f,160.156f, +144.531f,38.8195f,160.156f, +148.438f,39.9622f,160.156f, +152.344f,41.6752f,160.156f, +156.25f,37.6576f,160.156f, +160.156f,41.4722f,160.156f, +164.063f,41.8372f,160.156f, +167.969f,40.7289f,160.156f, +171.875f,35.5243f,160.156f, +175.781f,34.1726f,160.156f, +179.688f,33.9628f,160.156f, +183.594f,33.3012f,160.156f, +187.5f,37.6064f,160.156f, +191.406f,36.2987f,160.156f, +195.313f,32.9836f,160.156f, +199.219f,34.2771f,160.156f, +203.125f,33.5607f,160.156f, +207.031f,26.9351f,160.156f, +210.938f,24.3584f,160.156f, +214.844f,25.5428f,160.156f, +218.75f,26.0054f,160.156f, +222.656f,24.092f,160.156f, +226.563f,22.8948f,160.156f, +230.469f,17.1899f,160.156f, +234.375f,15.0552f,160.156f, +238.281f,14.2468f,160.156f, +242.188f,13.7862f,160.156f, +246.094f,14.5132f,160.156f, +250.0f,14.3684f,160.156f, +3.90627f,16.9346f,156.25f, +7.81251f,18.2437f,156.25f, +11.7188f,18.3869f,156.25f, +15.625f,18.1055f,156.25f, +19.5313f,18.7445f,156.25f, +23.4375f,18.9235f,156.25f, +27.3438f,18.455f,156.25f, +31.25f,18.6644f,156.25f, +35.1563f,18.9448f,156.25f, +39.0625f,18.9971f,156.25f, +42.9688f,18.8628f,156.25f, +46.875f,18.6886f,156.25f, +50.7813f,18.8494f,156.25f, +54.6875f,19.4408f,156.25f, +58.5938f,18.7384f,156.25f, +62.5f,17.473f,156.25f, +66.4063f,18.5906f,156.25f, +70.3125f,18.7252f,156.25f, +74.2188f,19.5013f,156.25f, +78.125f,19.8221f,156.25f, +82.0313f,19.8648f,156.25f, +85.9375f,19.8955f,156.25f, +89.8438f,19.4401f,156.25f, +93.75f,18.7973f,156.25f, +97.6563f,18.8923f,156.25f, +101.563f,20.6151f,156.25f, +105.469f,22.9824f,156.25f, +109.375f,25.2251f,156.25f, +113.281f,26.7829f,156.25f, +117.188f,27.8131f,156.25f, +121.094f,29.6707f,156.25f, +125.0f,31.4614f,156.25f, +128.906f,32.8387f,156.25f, +132.813f,33.7834f,156.25f, +136.719f,34.3986f,156.25f, +140.625f,35.1609f,156.25f, +144.531f,40.0963f,156.25f, +148.438f,41.0412f,156.25f, +152.344f,42.0325f,156.25f, +156.25f,42.1696f,156.25f, +160.156f,41.9265f,156.25f, +164.063f,43.279f,156.25f, +167.969f,42.5995f,156.25f, +171.875f,36.6937f,156.25f, +175.781f,34.8393f,156.25f, +179.688f,34.7157f,156.25f, +183.594f,34.0579f,156.25f, +187.5f,33.7647f,156.25f, +191.406f,33.2242f,156.25f, +195.313f,32.1053f,156.25f, +199.219f,30.6563f,156.25f, +203.125f,33.623f,156.25f, +207.031f,28.0199f,156.25f, +210.938f,30.5092f,156.25f, +214.844f,29.3828f,156.25f, +218.75f,27.3486f,156.25f, +222.656f,25.8671f,156.25f, +226.563f,24.1209f,156.25f, +230.469f,17.9979f,156.25f, +234.375f,16.1304f,156.25f, +238.281f,14.8281f,156.25f, +242.188f,13.097f,156.25f, +246.094f,13.3642f,156.25f, +250.0f,13.6085f,156.25f, +3.90627f,17.6952f,152.344f, +7.81251f,19.1063f,152.344f, +11.7188f,19.6398f,152.344f, +15.625f,19.8626f,152.344f, +19.5313f,19.1453f,152.344f, +23.4375f,19.4932f,152.344f, +27.3438f,19.3908f,152.344f, +31.25f,18.6492f,152.344f, +35.1563f,18.3861f,152.344f, +39.0625f,18.198f,152.344f, +42.9688f,18.4497f,152.344f, +46.875f,17.8083f,152.344f, +50.7813f,18.5296f,152.344f, +54.6875f,19.8096f,152.344f, +58.5938f,19.3324f,152.344f, +62.5f,18.1507f,152.344f, +66.4063f,17.7998f,152.344f, +70.3125f,17.9266f,152.344f, +74.2188f,18.569f,152.344f, +78.125f,19.5043f,152.344f, +82.0313f,20.0768f,152.344f, +85.9375f,19.5187f,152.344f, +89.8438f,20.2592f,152.344f, +93.75f,19.2159f,152.344f, +97.6563f,20.1174f,152.344f, +101.563f,21.9257f,152.344f, +105.469f,23.9219f,152.344f, +109.375f,25.8476f,152.344f, +113.281f,27.9183f,152.344f, +117.188f,29.2798f,152.344f, +121.094f,30.2289f,152.344f, +125.0f,31.7495f,152.344f, +128.906f,33.1684f,152.344f, +132.813f,34.4626f,152.344f, +136.719f,35.9981f,152.344f, +140.625f,36.5168f,152.344f, +144.531f,35.9325f,152.344f, +148.438f,41.231f,152.344f, +152.344f,42.7257f,152.344f, +156.25f,43.5162f,152.344f, +160.156f,44.357f,152.344f, +164.063f,44.2347f,152.344f, +167.969f,40.2679f,152.344f, +171.875f,36.2109f,152.344f, +175.781f,36.3906f,152.344f, +179.688f,35.227f,152.344f, +183.594f,34.7006f,152.344f, +187.5f,34.7763f,152.344f, +191.406f,34.0912f,152.344f, +195.313f,32.201f,152.344f, +199.219f,30.6601f,152.344f, +203.125f,28.7526f,152.344f, +207.031f,33.0587f,152.344f, +210.938f,31.7955f,152.344f, +214.844f,29.893f,152.344f, +218.75f,27.5989f,152.344f, +222.656f,26.1347f,152.344f, +226.563f,19.6378f,152.344f, +230.469f,18.6596f,152.344f, +234.375f,17.3965f,152.344f, +238.281f,15.5807f,152.344f, +242.188f,13.4071f,152.344f, +246.094f,12.7989f,152.344f, +250.0f,12.5897f,152.344f, +3.90626f,18.4109f,148.438f, +7.81251f,18.8163f,148.438f, +11.7188f,20.7396f,148.438f, +15.625f,21.7833f,148.438f, +19.5313f,20.6586f,148.438f, +23.4375f,19.8597f,148.438f, +27.3438f,20.0951f,148.438f, +31.25f,18.7811f,148.438f, +35.1563f,18.123f,148.438f, +39.0625f,17.773f,148.438f, +42.9688f,18.0095f,148.438f, +46.875f,17.694f,148.438f, +50.7813f,17.1666f,148.438f, +54.6875f,18.3484f,148.438f, +58.5938f,18.5612f,148.438f, +62.5f,18.1324f,148.438f, +66.4063f,17.4119f,148.438f, +70.3125f,17.2873f,148.438f, +74.2188f,17.6855f,148.438f, +78.125f,18.6618f,148.438f, +82.0313f,19.6447f,148.438f, +85.9375f,19.4743f,148.438f, +89.8438f,20.2887f,148.438f, +93.75f,20.2469f,148.438f, +97.6563f,21.1802f,148.438f, +101.563f,23.2002f,148.438f, +105.469f,24.8874f,148.438f, +109.375f,26.5433f,148.438f, +113.281f,28.653f,148.438f, +117.188f,30.2347f,148.438f, +121.094f,31.6949f,148.438f, +125.0f,33.2452f,148.438f, +128.906f,34.3964f,148.438f, +132.813f,35.2835f,148.438f, +136.719f,36.7099f,148.438f, +140.625f,37.1893f,148.438f, +144.531f,36.5212f,148.438f, +148.438f,36.7413f,148.438f, +152.344f,43.9965f,148.438f, +156.25f,44.9543f,148.438f, +160.156f,44.8078f,148.438f, +164.063f,45.09f,148.438f, +167.969f,43.0871f,148.438f, +171.875f,42.2067f,148.438f, +175.781f,40.5399f,148.438f, +179.688f,35.9902f,148.438f, +183.594f,34.4093f,148.438f, +187.5f,35.1087f,148.438f, +191.406f,34.3372f,148.438f, +195.313f,35.6724f,148.438f, +199.219f,34.961f,148.438f, +203.125f,34.4106f,148.438f, +207.031f,32.0028f,148.438f, +210.938f,31.3925f,148.438f, +214.844f,29.3539f,148.438f, +218.75f,27.6213f,148.438f, +222.656f,21.6694f,148.438f, +226.563f,20.356f,148.438f, +230.469f,19.6202f,148.438f, +234.375f,17.6247f,148.438f, +238.281f,16.5152f,148.438f, +242.188f,14.901f,148.438f, +246.094f,12.7994f,148.438f, +250.0f,12.2743f,148.438f, +3.90626f,17.8758f,144.531f, +7.81251f,19.3177f,144.531f, +11.7188f,20.9214f,144.531f, +15.625f,21.8589f,144.531f, +19.5313f,21.2904f,144.531f, +23.4375f,19.9784f,144.531f, +27.3438f,19.6359f,144.531f, +31.25f,19.4398f,144.531f, +35.1563f,18.6596f,144.531f, +39.0625f,17.1967f,144.531f, +42.9688f,16.797f,144.531f, +46.875f,16.4099f,144.531f, +50.7813f,16.54f,144.531f, +54.6875f,16.811f,144.531f, +58.5938f,17.31f,144.531f, +62.5f,17.5358f,144.531f, +66.4063f,16.8495f,144.531f, +70.3125f,17.2148f,144.531f, +74.2188f,16.6285f,144.531f, +78.125f,17.7911f,144.531f, +82.0313f,18.6054f,144.531f, +85.9375f,18.787f,144.531f, +89.8438f,20.4804f,144.531f, +93.75f,21.0544f,144.531f, +97.6563f,20.9487f,144.531f, +101.563f,23.1098f,144.531f, +105.469f,25.2196f,144.531f, +109.375f,27.0389f,144.531f, +113.281f,29.4971f,144.531f, +117.188f,31.0049f,144.531f, +121.094f,33.086f,144.531f, +125.0f,34.6611f,144.531f, +128.906f,35.8626f,144.531f, +132.813f,36.8672f,144.531f, +136.719f,37.5515f,144.531f, +140.625f,37.6433f,144.531f, +144.531f,37.8923f,144.531f, +148.438f,37.1277f,144.531f, +152.344f,40.0287f,144.531f, +156.25f,44.9863f,144.531f, +160.156f,45.0845f,144.531f, +164.063f,44.7823f,144.531f, +167.969f,42.5338f,144.531f, +171.875f,41.7912f,144.531f, +175.781f,41.5762f,144.531f, +179.688f,41.3242f,144.531f, +183.594f,39.6796f,144.531f, +187.5f,39.4704f,144.531f, +191.406f,38.5401f,144.531f, +195.313f,37.3853f,144.531f, +199.219f,35.4345f,144.531f, +203.125f,34.2437f,144.531f, +207.031f,31.8218f,144.531f, +210.938f,30.6041f,144.531f, +214.844f,26.9001f,144.531f, +218.75f,22.3094f,144.531f, +222.656f,21.4446f,144.531f, +226.563f,20.6643f,144.531f, +230.469f,20.3246f,144.531f, +234.375f,18.0382f,144.531f, +238.281f,15.7854f,144.531f, +242.188f,14.3314f,144.531f, +246.094f,12.4723f,144.531f, +250.0f,12.5491f,144.531f, +3.90626f,18.5798f,140.625f, +7.81251f,19.7271f,140.625f, +11.7188f,20.8566f,140.625f, +15.625f,21.6914f,140.625f, +19.5313f,20.9288f,140.625f, +23.4375f,20.0531f,140.625f, +27.3438f,19.1655f,140.625f, +31.25f,18.7947f,140.625f, +35.1563f,18.2984f,140.625f, +39.0625f,17.3295f,140.625f, +42.9688f,16.5557f,140.625f, +46.875f,16.1679f,140.625f, +50.7813f,16.0262f,140.625f, +54.6875f,16.1659f,140.625f, +58.5938f,16.459f,140.625f, +62.5f,17.0307f,140.625f, +66.4063f,17.6303f,140.625f, +70.3125f,16.7576f,140.625f, +74.2188f,16.9614f,140.625f, +78.125f,17.3439f,140.625f, +82.0313f,17.7742f,140.625f, +85.9375f,19.0774f,140.625f, +89.8438f,20.0724f,140.625f, +93.75f,21.5734f,140.625f, +97.6563f,21.4923f,140.625f, +101.563f,24.2474f,140.625f, +105.469f,25.9666f,140.625f, +109.375f,27.8803f,140.625f, +113.281f,29.6397f,140.625f, +117.188f,32.0374f,140.625f, +121.094f,34.014f,140.625f, +125.0f,35.1589f,140.625f, +128.906f,36.2526f,140.625f, +132.813f,37.5386f,140.625f, +136.719f,38.1647f,140.625f, +140.625f,37.9014f,140.625f, +144.531f,39.0558f,140.625f, +148.438f,38.1493f,140.625f, +152.344f,39.5967f,140.625f, +156.25f,40.3409f,140.625f, +160.156f,39.4778f,140.625f, +164.063f,43.7911f,140.625f, +167.969f,42.7467f,140.625f, +171.875f,41.4394f,140.625f, +175.781f,41.222f,140.625f, +179.688f,40.9501f,140.625f, +183.594f,40.2741f,140.625f, +187.5f,40.5011f,140.625f, +191.406f,39.8634f,140.625f, +195.313f,37.8944f,140.625f, +199.219f,35.6917f,140.625f, +203.125f,33.0921f,140.625f, +207.031f,30.7497f,140.625f, +210.938f,24.355f,140.625f, +214.844f,23.6102f,140.625f, +218.75f,23.2298f,140.625f, +222.656f,21.8035f,140.625f, +226.563f,21.0813f,140.625f, +230.469f,20.4423f,140.625f, +234.375f,19.372f,140.625f, +238.281f,16.9074f,140.625f, +242.188f,15.6931f,140.625f, +246.094f,14.0046f,140.625f, +250.0f,12.7719f,140.625f, +3.90626f,19.7224f,136.719f, +7.81251f,20.3645f,136.719f, +11.7188f,20.1938f,136.719f, +15.625f,20.0122f,136.719f, +19.5313f,20.9204f,136.719f, +23.4375f,20.2208f,136.719f, +27.3438f,19.3419f,136.719f, +31.25f,18.2059f,136.719f, +35.1563f,17.6089f,136.719f, +39.0625f,17.131f,136.719f, +42.9688f,16.8349f,136.719f, +46.875f,16.3462f,136.719f, +50.7813f,15.4488f,136.719f, +54.6875f,15.7887f,136.719f, +58.5938f,16.431f,136.719f, +62.5f,16.3378f,136.719f, +66.4063f,17.4585f,136.719f, +70.3125f,17.5113f,136.719f, +74.2188f,17.6407f,136.719f, +78.125f,17.0887f,136.719f, +82.0313f,17.2555f,136.719f, +85.9375f,18.6283f,136.719f, +89.8438f,19.6874f,136.719f, +93.75f,21.0963f,136.719f, +97.6563f,21.5582f,136.719f, +101.563f,24.9129f,136.719f, +105.469f,27.5761f,136.719f, +109.375f,28.7426f,136.719f, +113.281f,31.0958f,136.719f, +117.188f,33.7564f,136.719f, +121.094f,34.6927f,136.719f, +125.0f,35.0503f,136.719f, +128.906f,36.0657f,136.719f, +132.813f,37.2001f,136.719f, +136.719f,38.5625f,136.719f, +140.625f,38.8809f,136.719f, +144.531f,39.3646f,136.719f, +148.438f,38.919f,136.719f, +152.344f,39.5251f,136.719f, +156.25f,39.5392f,136.719f, +160.156f,39.7011f,136.719f, +164.063f,38.4043f,136.719f, +167.969f,37.7232f,136.719f, +171.875f,37.8418f,136.719f, +175.781f,41.0576f,136.719f, +179.688f,40.6804f,136.719f, +183.594f,40.6431f,136.719f, +187.5f,41.2286f,136.719f, +191.406f,40.221f,136.719f, +195.313f,37.9197f,136.719f, +199.219f,30.9591f,136.719f, +203.125f,28.2027f,136.719f, +207.031f,25.2338f,136.719f, +210.938f,24.1525f,136.719f, +214.844f,23.6344f,136.719f, +218.75f,22.6246f,136.719f, +222.656f,21.3675f,136.719f, +226.563f,21.0207f,136.719f, +230.469f,20.2558f,136.719f, +234.375f,18.3661f,136.719f, +238.281f,16.7584f,136.719f, +242.188f,16.2723f,136.719f, +246.094f,14.7268f,136.719f, +250.0f,13.5973f,136.719f, +3.90626f,19.9574f,132.813f, +7.8125f,21.126f,132.813f, +11.7188f,20.9977f,132.813f, +15.625f,21.2478f,132.813f, +19.5313f,21.5981f,132.813f, +23.4375f,20.0536f,132.813f, +27.3438f,18.6025f,132.813f, +31.25f,18.166f,132.813f, +35.1563f,17.207f,132.813f, +39.0625f,17.3703f,132.813f, +42.9688f,16.3317f,132.813f, +46.875f,15.4769f,132.813f, +50.7813f,14.7771f,132.813f, +54.6875f,14.8038f,132.813f, +58.5938f,15.7291f,132.813f, +62.5f,16.2292f,132.813f, +66.4063f,17.1488f,132.813f, +70.3125f,17.5027f,132.813f, +74.2188f,16.9736f,132.813f, +78.125f,16.4014f,132.813f, +82.0313f,16.7581f,132.813f, +85.9375f,18.1894f,132.813f, +89.8438f,20.0178f,132.813f, +93.75f,20.5813f,132.813f, +97.6563f,22.5893f,132.813f, +101.563f,25.6741f,132.813f, +105.469f,28.0908f,132.813f, +109.375f,29.1124f,132.813f, +113.281f,31.4752f,132.813f, +117.188f,33.2328f,132.813f, +121.094f,34.3747f,132.813f, +125.0f,34.8849f,132.813f, +128.906f,36.3771f,132.813f, +132.813f,37.3154f,132.813f, +136.719f,38.6196f,132.813f, +140.625f,39.1474f,132.813f, +144.531f,39.5395f,132.813f, +148.438f,38.9241f,132.813f, +152.344f,39.6801f,132.813f, +156.25f,39.7675f,132.813f, +160.156f,39.4464f,132.813f, +164.063f,38.2967f,132.813f, +167.969f,37.3679f,132.813f, +171.875f,36.5147f,132.813f, +175.781f,35.9217f,132.813f, +179.688f,35.6874f,132.813f, +183.594f,36.0348f,132.813f, +187.5f,36.167f,132.813f, +191.406f,34.7462f,132.813f, +195.313f,32.5911f,132.813f, +199.219f,30.8509f,132.813f, +203.125f,27.889f,132.813f, +207.031f,25.0869f,132.813f, +210.938f,23.713f,132.813f, +214.844f,23.4714f,132.813f, +218.75f,22.2633f,132.813f, +222.656f,21.1409f,132.813f, +226.563f,20.2725f,132.813f, +230.469f,19.4678f,132.813f, +234.375f,18.4511f,132.813f, +238.281f,18.0306f,132.813f, +242.188f,17.5677f,132.813f, +246.094f,16.403f,132.813f, +250.0f,14.7316f,132.813f, +3.90626f,20.0876f,128.906f, +7.81252f,21.0764f,128.906f, +11.7188f,21.4076f,128.906f, +15.625f,22.6299f,128.906f, +19.5313f,22.1174f,128.906f, +23.4375f,20.3977f,128.906f, +27.3438f,18.7343f,128.906f, +31.25f,17.9144f,128.906f, +35.1563f,17.2941f,128.906f, +39.0625f,16.5386f,128.906f, +42.9688f,15.6892f,128.906f, +46.875f,14.6414f,128.906f, +50.7813f,14.3505f,128.906f, +54.6875f,14.1604f,128.906f, +58.5938f,14.517f,128.906f, +62.5f,15.1057f,128.906f, +66.4063f,16.0684f,128.906f, +70.3125f,16.6251f,128.906f, +74.2188f,15.9689f,128.906f, +78.125f,16.0234f,128.906f, +82.0313f,16.205f,128.906f, +85.9375f,18.8167f,128.906f, +89.8438f,19.6433f,128.906f, +93.75f,20.2916f,128.906f, +97.6563f,23.2308f,128.906f, +101.563f,25.882f,128.906f, +105.469f,27.5736f,128.906f, +109.375f,28.9662f,128.906f, +113.281f,30.5702f,128.906f, +117.188f,31.8627f,128.906f, +121.094f,32.5216f,128.906f, +125.0f,34.1918f,128.906f, +128.906f,37.0161f,128.906f, +132.813f,38.5084f,128.906f, +136.719f,39.1631f,128.906f, +140.625f,39.0529f,128.906f, +144.531f,38.9229f,128.906f, +148.438f,38.4312f,128.906f, +152.344f,39.1086f,128.906f, +156.25f,39.7022f,128.906f, +160.156f,39.3007f,128.906f, +164.063f,38.2318f,128.906f, +167.969f,36.7493f,128.906f, +171.875f,35.9781f,128.906f, +175.781f,35.7712f,128.906f, +179.688f,35.6247f,128.906f, +183.594f,35.4808f,128.906f, +187.5f,35.6102f,128.906f, +191.406f,34.0305f,128.906f, +195.313f,32.0227f,128.906f, +199.219f,29.7666f,128.906f, +203.125f,27.3968f,128.906f, +207.031f,25.1642f,128.906f, +210.938f,24.279f,128.906f, +214.844f,22.4357f,128.906f, +218.75f,21.7754f,128.906f, +222.656f,19.6381f,128.906f, +226.563f,19.78f,128.906f, +230.469f,20.0349f,128.906f, +234.375f,19.1534f,128.906f, +238.281f,17.863f,128.906f, +242.188f,17.658f,128.906f, +246.094f,16.951f,128.906f, +250.0f,16.2961f,128.906f, +}; + +btScalar Landscape01Nml[] = { +-0.145347f,0.988603f,0.0392193f, +-0.118578f,0.971903f,-0.203332f, +-0.210348f,0.975548f,0.0637181f, +-0.143154f,0.979915f,-0.138828f, +-0.186466f,0.976661f,0.106602f, +-0.200996f,0.973874f,-0.105691f, +-0.200019f,0.979742f,-0.00987837f, +-0.162567f,0.986516f,-0.0189093f, +-0.128872f,0.991658f,-0.00262187f, +-0.0972065f,0.993702f,0.0557464f, +-0.232168f,0.972676f,8.39761e-005f, +-0.280715f,0.959127f,-0.0356947f, +-0.328537f,0.944066f,-0.0283446f, +-0.348021f,0.936189f,-0.0493126f, +-0.28502f,0.953899f,-0.0940249f, +-0.329197f,0.938125f,-0.107479f, +-0.186873f,0.969867f,-0.15632f, +-0.168074f,0.98179f,-0.088542f, +0.138723f,0.984643f,-0.105994f, +0.139713f,0.984758f,-0.103594f, +0.415149f,0.907443f,-0.0647914f, +0.335594f,0.916204f,-0.218967f, +0.391251f,0.906316f,-0.159731f, +0.297117f,0.890775f,-0.343864f, +0.0782406f,0.948307f,-0.307558f, +0.0742546f,0.932023f,-0.354711f, +-0.0593029f,0.94484f,-0.322118f, +-0.035102f,0.9388f,-0.342668f, +-0.0398386f,0.972105f,-0.231139f, +0.0142535f,0.946652f,-0.321942f, +-0.149407f,0.982239f,-0.113505f, +-0.186817f,0.918353f,-0.348895f, +-0.227035f,0.95418f,-0.194923f, +-0.217455f,0.921613f,-0.32147f, +-0.104683f,0.961425f,-0.254368f, +-0.137473f,0.92562f,-0.352602f, +-0.0889131f,0.942391f,-0.322479f, +-0.137942f,0.895959f,-0.422173f, +-0.0994313f,0.915873f,-0.38896f, +-0.177412f,0.858967f,-0.480312f, +-0.28046f,0.843765f,-0.457605f, +-0.23875f,0.832625f,-0.499733f, +-0.35769f,0.865922f,-0.349624f, +-0.239679f,0.924761f,-0.295585f, +-0.367472f,0.894137f,-0.255898f, +-0.306721f,0.940051f,-0.149083f, +-0.29191f,0.929123f,-0.226977f, +-0.3205f,0.928892f,-0.185579f, +-0.367832f,0.894452f,-0.254274f, +-0.393375f,0.898238f,-0.196023f, +-0.386104f,0.869165f,-0.308993f, +-0.416765f,0.860247f,-0.293737f, +-0.257238f,0.898443f,-0.355849f, +-0.273377f,0.911812f,-0.306372f, +-0.228654f,0.889208f,-0.396265f, +-0.28545f,0.876522f,-0.387592f, +-0.142316f,0.885962f,-0.441381f, +-0.101084f,0.908701f,-0.405025f, +0.035618f,0.945519f,-0.323614f, +0.103277f,0.941647f,-0.320368f, +-0.120589f,0.957422f,-0.262302f, +-0.186114f,0.894712f,-0.40602f, +-0.202962f,0.931974f,-0.300385f, +-0.162074f,0.943023f,-0.290584f, +-0.152017f,0.933176f,-0.325688f, +-0.202811f,0.891764f,-0.404505f, +-0.195614f,0.919053f,-0.342165f, +-0.221332f,0.883262f,-0.413352f, +-0.230949f,0.883479f,-0.407587f, +-0.202664f,0.884798f,-0.419595f, +-0.013827f,0.935183f,-0.353894f, +0.0613953f,0.949306f,-0.308299f, +0.0379666f,0.956996f,-0.287605f, +0.0239474f,0.920688f,-0.389564f, +-0.124568f,0.971246f,-0.20289f, +-0.0173673f,0.966674f,-0.255421f, +-0.280608f,0.954174f,-0.103981f, +-0.188825f,0.978003f,-0.0886339f, +-0.193278f,0.981044f,-0.0139968f, +-0.089832f,0.992161f,0.0868734f, +-0.0617809f,0.994525f,0.0842802f, +0.0316335f,0.979002f,0.20138f, +0.126601f,0.973442f,0.190743f, +0.126356f,0.954056f,0.271683f, +0.0296197f,0.996225f,0.0816031f, +-0.130879f,0.990212f,-0.0484936f, +-0.0775613f,0.996382f,0.0347567f, +-0.0318445f,0.999049f,0.0297665f, +0.174213f,0.981835f,0.0751658f, +0.230898f,0.968544f,0.0927823f, +0.477724f,0.867555f,0.138304f, +0.489512f,0.856269f,0.164868f, +0.425011f,0.903484f,0.0555235f, +0.345126f,0.937885f,0.0355011f, +0.051136f,0.997417f,-0.0504465f, +0.0111243f,0.99878f,-0.0481145f, +0.00085351f,0.998643f,-0.0520782f, +-0.0736129f,0.992491f,-0.0976874f, +0.0605446f,0.978416f,-0.197578f, +-0.1248f,0.898669f,-0.420499f, +-0.068151f,0.956411f,-0.28396f, +0.0502596f,0.934397f,-0.35267f, +0.0492358f,0.99416f,-0.096025f, +0.22311f,0.97441f,-0.0273246f, +0.104257f,0.993921f,-0.0353788f, +0.135731f,0.987345f,0.0820234f, +0.0508084f,0.996415f,-0.0676404f, +0.013783f,0.999772f,-0.0162859f, +0.0814861f,0.996154f,-0.0322044f, +0.0451487f,0.998313f,-0.0365194f, +0.035547f,0.992801f,-0.114375f, +-0.0977551f,0.955799f,-0.277294f, +0.0588118f,0.977967f,-0.200303f, +0.0956551f,0.968682f,-0.229142f, +0.255494f,0.951171f,-0.173197f, +0.287347f,0.949686f,-0.124613f, +0.300983f,0.934694f,-0.189092f, +0.326044f,0.937015f,-0.125296f, +0.170234f,0.979103f,-0.111255f, +0.217643f,0.971688f,-0.0919459f, +0.0857423f,0.995f,-0.0512173f, +0.141055f,0.988855f,0.0476293f, +0.141065f,0.98942f,-0.0338874f, +0.161562f,0.986303f,0.0332183f, +0.113059f,0.993231f,0.0266602f, +0.073071f,0.997081f,-0.0221543f, +-0.0590251f,0.997651f,-0.034775f, +-0.0264959f,0.999595f,0.0103962f, +-0.0628475f,0.932757f,0.354985f, +-0.188464f,0.930547f,0.31395f, +-0.11595f,0.95582f,0.270118f, +-0.0150745f,0.981122f,0.192801f, +-0.121292f,0.98854f,0.0898753f, +-0.191875f,0.979293f,0.0645635f, +-0.302211f,0.947932f,-0.100469f, +-0.168835f,0.972187f,-0.162321f, +-0.165107f,0.942083f,-0.291925f, +0.0524842f,0.966783f,-0.250151f, +0.334898f,0.925425f,-0.177288f, +0.453352f,0.888614f,-0.0695481f, +0.212879f,0.976177f,-0.0419751f, +-0.0859137f,0.991174f,-0.100958f, +-0.19247f,0.980365f,-0.0428897f, +-0.217979f,0.975456f,0.0311624f, +-0.130678f,0.991292f,-0.0162531f, +0.0105625f,0.994964f,-0.0996785f, +-0.0191557f,0.967247f,-0.253114f, +-0.034833f,0.962122f,-0.270385f, +-0.195874f,0.937997f,-0.285996f, +-0.397161f,0.831379f,-0.388681f, +-0.379064f,0.825916f,-0.417342f, +-0.284483f,0.874083f,-0.393762f, +-0.320157f,0.86551f,-0.385217f, +-0.327447f,0.85814f,-0.395442f, +-0.219114f,0.871062f,-0.439592f, +-0.161876f,0.861769f,-0.480781f, +-0.18946f,0.845726f,-0.498852f, +-0.191307f,0.924603f,-0.32941f, +-0.159365f,0.982225f,-0.0991764f, +-0.164558f,0.975832f,-0.143777f, +-0.155521f,0.974006f,-0.164699f, +-0.172244f,0.972979f,-0.153766f, +-0.162541f,0.961346f,-0.222247f, +-0.11171f,0.955927f,-0.271523f, +-0.101714f,0.980079f,-0.170586f, +-0.223397f,0.974336f,-0.0276274f, +-0.300622f,0.953413f,0.0251167f, +-0.254202f,0.967133f,-0.00586307f, +-0.0994566f,0.994394f,0.0359007f, +0.078652f,0.996758f,-0.0169243f, +-0.0552979f,0.987555f,0.147234f, +-0.0666628f,0.864508f,0.498179f, +0.131082f,0.854494f,0.502651f, +0.414695f,0.764646f,0.4933f, +0.432926f,0.790826f,0.432632f, +0.126593f,0.91514f,0.382744f, +-0.0157552f,0.943082f,0.332186f, +0.122694f,0.924647f,0.36052f, +0.0975822f,0.984244f,0.147447f, +-0.026294f,0.960938f,-0.275512f, +0.1231f,0.958251f,-0.258072f, +0.037902f,0.976085f,-0.214059f, +-0.000148888f,0.992562f,-0.121742f, +0.0716429f,0.997173f,-0.0226693f, +0.135484f,0.989193f,-0.0560393f, +0.275603f,0.956281f,-0.0978236f, +0.283097f,0.956822f,-0.0659346f, +0.109624f,0.991403f,-0.0714361f, +0.084436f,0.990816f,-0.105609f, +0.0791881f,0.990931f,-0.108558f, +0.0674956f,0.997569f,-0.0173508f, +0.0556006f,0.998429f,0.00688119f, +-0.144974f,0.947519f,0.28494f, +-0.110826f,0.961365f,0.251981f, +-0.0669451f,0.996693f,0.0460586f, +-0.00516145f,0.998802f,0.0486696f, +-0.116537f,0.988089f,0.100498f, +-0.0456605f,0.993379f,0.105422f, +-0.110131f,0.987256f,-0.114879f, +-0.0746162f,0.968429f,-0.237861f, +-0.0785155f,0.952358f,-0.294703f, +-0.0192369f,0.946876f,-0.321024f, +0.320056f,0.920022f,-0.226108f, +0.288692f,0.932613f,-0.216541f, +0.123147f,0.991593f,-0.0397145f, +-0.113817f,0.992375f,0.0473138f, +-0.192042f,0.9774f,0.0883642f, +-0.156949f,0.987573f,0.00819321f, +-0.0848586f,0.992344f,-0.0897344f, +0.0818673f,0.992357f,-0.0923282f, +0.113464f,0.986976f,-0.114035f, +-0.0777263f,0.979155f,-0.187653f, +-0.11587f,0.975173f,-0.188711f, +-0.26618f,0.902421f,-0.338799f, +-0.343104f,0.842974f,-0.414336f, +-0.318919f,0.837107f,-0.444457f, +-0.324821f,0.839352f,-0.435867f, +-0.312979f,0.836318f,-0.45013f, +-0.203015f,0.862499f,-0.463553f, +-0.14187f,0.900483f,-0.411101f, +-0.22968f,0.933243f,-0.276233f, +-0.413973f,0.871187f,-0.263932f, +-0.305656f,0.93798f,-0.163607f, +-0.161875f,0.985861f,-0.0433003f, +-0.135788f,0.990721f,0.00582442f, +-0.138617f,0.984876f,-0.103942f, +-0.135024f,0.980056f,-0.145806f, +-0.124871f,0.989793f,-0.068687f, +-0.182018f,0.982992f,-0.024403f, +-0.309743f,0.950592f,-0.0208625f, +-0.30492f,0.95221f,0.0178823f, +-0.299424f,0.951826f,0.066125f, +-0.120448f,0.944431f,0.305848f, +0.118213f,0.907792f,0.402418f, +-0.261318f,0.917154f,0.300902f, +-0.411401f,0.860866f,0.299431f, +0.15139f,0.91772f,0.367249f, +0.409879f,0.832051f,0.373752f, +0.446772f,0.77668f,0.44403f, +0.301572f,0.80653f,0.508491f, +0.168293f,0.89172f,0.420135f, +0.0587854f,0.961406f,0.26878f, +0.30067f,0.896979f,0.324077f, +0.282217f,0.935284f,0.213535f, +0.148185f,0.986837f,0.0647602f, +-0.0572401f,0.974528f,-0.216838f, +-0.0945497f,0.96665f,-0.238009f, +-0.000668496f,0.9725f,-0.232902f, +0.125989f,0.980136f,-0.15317f, +0.218059f,0.975888f,-0.00959987f, +0.265461f,0.958501f,0.103951f, +0.173443f,0.98019f,0.0956349f, +0.133691f,0.987754f,0.0804258f, +0.0900836f,0.995272f,0.0363034f, +0.0177237f,0.999106f,-0.0383914f, +0.042211f,0.998744f,-0.0269875f, +0.0720539f,0.94434f,0.320982f, +0.0948772f,0.964987f,0.244537f, +0.123635f,0.987961f,0.0929884f, +-0.0283728f,0.998997f,-0.0346279f, +-0.152337f,0.985597f,-0.0734363f, +-0.0291778f,0.996634f,-0.0766092f, +0.0594392f,0.995285f,-0.0766423f, +-0.027888f,0.982723f,-0.182971f, +-0.0125244f,0.971758f,-0.235647f, +-0.0767296f,0.943557f,-0.322201f, +0.2299f,0.955601f,-0.184318f, +0.271645f,0.9586f,-0.0854157f, +0.0112173f,0.999015f,-0.0429278f, +-0.142475f,0.989464f,-0.02574f, +-0.192441f,0.979224f,-0.0639254f, +-0.103523f,0.99301f,-0.0567016f, +-0.00378459f,0.998834f,-0.0481324f, +0.0499927f,0.992415f,-0.112309f, +0.0737699f,0.994576f,-0.0733206f, +-0.0190206f,0.999623f,-0.0197948f, +-0.0783652f,0.99692f,0.00307073f, +-0.152226f,0.987897f,0.0297819f, +-0.333638f,0.940154f,-0.069252f, +-0.307736f,0.941909f,-0.134557f, +-0.334924f,0.918699f,-0.209327f, +-0.35357f,0.914459f,-0.19686f, +-0.243406f,0.963329f,-0.112917f, +-0.31479f,0.943784f,-0.100892f, +-0.368184f,0.929745f,0.00391099f, +-0.386308f,0.922293f,-0.0119138f, +-0.337617f,0.936762f,-0.0921568f, +-0.305867f,0.947033f,-0.0978487f, +-0.109063f,0.994026f,0.00418869f, +0.00976093f,0.996792f,-0.0794369f, +-0.152053f,0.972765f,-0.17495f, +-0.268682f,0.956747f,-0.111559f, +-0.16583f,0.986099f,0.0104333f, +-0.26795f,0.960138f,-0.0796053f, +-0.428361f,0.903607f,0.000904858f, +-0.364896f,0.884093f,0.291943f, +-0.411739f,0.889329f,0.19891f, +-0.213918f,0.942658f,0.256194f, +-0.0353818f,0.912316f,0.407955f, +-0.234679f,0.972031f,0.0090071f, +0.164799f,0.976041f,-0.142074f, +0.378329f,0.920537f,-0.0973577f, +0.389048f,0.913009f,0.122701f, +0.312785f,0.918579f,0.241617f, +0.331426f,0.913352f,0.236529f, +0.235473f,0.970893f,0.043811f, +0.0409183f,0.988429f,-0.14606f, +0.183882f,0.951979f,0.244794f, +0.256685f,0.844334f,0.470333f, +0.243297f,0.84406f,0.47788f, +0.178194f,0.957255f,0.227835f, +0.0574376f,0.965885f,-0.252523f, +-0.0590426f,0.961892f,-0.266977f, +0.0063288f,0.996614f,-0.081983f, +0.221194f,0.97242f,0.0739783f, +0.131016f,0.988415f,0.0766141f, +0.0953963f,0.986256f,0.134901f, +0.160579f,0.972927f,0.166216f, +0.109946f,0.983906f,0.14086f, +0.027673f,0.996741f,0.0757784f, +0.095102f,0.971229f,0.218334f, +0.102357f,0.973251f,0.205684f, +0.193741f,0.956416f,0.218477f, +0.132416f,0.984788f,0.112512f, +-0.0766537f,0.99488f,-0.0658589f, +-0.0304197f,0.995587f,-0.0887742f, +0.0261631f,0.997431f,-0.0666789f, +0.0720508f,0.996334f,-0.0461268f, +0.110802f,0.979106f,-0.170512f, +-0.036534f,0.946972f,-0.319234f, +0.0562543f,0.953438f,-0.296297f, +0.21433f,0.964539f,-0.154036f, +-0.0463138f,0.986383f,-0.157808f, +-0.114222f,0.99275f,-0.0374399f, +-0.129535f,0.99146f,-0.0150624f, +-0.148036f,0.985214f,-0.0862475f, +-0.0412316f,0.997863f,-0.050697f, +0.0938182f,0.995513f,-0.0123356f, +0.0585542f,0.997889f,-0.0281043f, +-0.11195f,0.993633f,0.0126653f, +-0.208443f,0.969116f,0.131782f, +-0.178284f,0.959747f,0.217024f, +-0.249524f,0.951637f,0.179236f, +-0.204568f,0.966799f,0.153139f, +-0.277831f,0.959694f,0.042405f, +-0.421523f,0.906804f,-0.00501147f, +-0.349246f,0.93481f,0.0644755f, +-0.271825f,0.953501f,0.130185f, +-0.341243f,0.939899f,0.0119564f, +-0.356048f,0.93224f,-0.0644791f, +-0.286188f,0.955628f,-0.0697892f, +-0.248084f,0.956522f,-0.153364f, +-0.154022f,0.960443f,-0.232007f, +0.032406f,0.989794f,-0.138774f, +-0.0622078f,0.991529f,-0.114016f, +-0.335467f,0.915845f,-0.220659f, +-0.194821f,0.973732f,-0.117857f, +-0.29903f,0.953799f,-0.0291431f, +-0.514277f,0.834668f,0.197101f, +-0.344769f,0.927072f,0.147212f, +-0.0936834f,0.993837f,0.0592615f, +-0.181141f,0.974379f,-0.133321f, +-0.0841805f,0.983933f,-0.157447f, +0.0661375f,0.94785f,-0.31178f, +0.143104f,0.856028f,-0.496726f, +0.226417f,0.827547f,-0.513714f, +0.178899f,0.912784f,-0.367179f, +0.234616f,0.943911f,-0.232351f, +0.346693f,0.91935f,-0.186008f, +0.307074f,0.943627f,-0.123586f, +0.214863f,0.970065f,0.113171f, +0.0234555f,0.999712f,0.00506759f, +-0.0206358f,0.99868f,0.047041f, +0.0320247f,0.946177f,0.322062f, +0.23638f,0.837444f,0.492759f, +0.410368f,0.848265f,0.33473f, +-0.0124285f,0.999913f,-0.00451951f, +-0.13197f,0.981357f,-0.139724f, +0.0888915f,0.995883f,0.0177605f, +0.12955f,0.973581f,0.188033f, +0.100974f,0.97841f,0.18033f, +0.116628f,0.987352f,0.107396f, +0.0879041f,0.989191f,0.117361f, +0.114472f,0.980893f,0.157306f, +0.0306685f,0.986407f,0.161431f, +0.128704f,0.972047f,0.196366f, +0.21783f,0.966546f,0.135421f, +0.280184f,0.953049f,0.114866f, +0.0272615f,0.999564f,-0.0113551f, +-0.0491486f,0.997279f,-0.0549472f, +0.00337261f,0.998977f,-0.0450999f, +0.0913253f,0.995457f,-0.0269266f, +0.252481f,0.964775f,-0.0739122f, +0.0897947f,0.975122f,-0.202665f, +-0.0238258f,0.968534f,-0.247739f, +0.162662f,0.981573f,-0.10028f, +-0.0276113f,0.997652f,-0.0626774f, +-0.289082f,0.95335f,-0.0869268f, +-0.160594f,0.986876f,0.0169191f, +-0.0752137f,0.997117f,0.00999502f, +-0.0455931f,0.997939f,-0.0451647f, +0.0616976f,0.995202f,-0.0759372f, +-0.00353073f,0.999867f,-0.0159004f, +-0.177748f,0.976224f,0.124065f, +-0.247702f,0.959217f,0.136188f, +-0.164797f,0.981869f,0.0936766f, +-0.214718f,0.976098f,0.0335935f, +-0.211552f,0.977318f,-0.00980662f, +-0.200169f,0.979677f,0.0128577f, +-0.39928f,0.916411f,-0.027687f, +-0.374531f,0.927212f,0.0022105f, +-0.268102f,0.963363f,0.00736207f, +-0.247283f,0.968232f,-0.0371081f, +-0.289483f,0.949449f,-0.121432f, +-0.253482f,0.93971f,-0.229547f, +-0.132892f,0.950758f,-0.279997f, +-0.140676f,0.931036f,-0.336723f, +-0.161496f,0.9509f,-0.264023f, +-0.0403886f,0.9973f,-0.0613364f, +-0.215095f,0.96767f,-0.131717f, +-0.434628f,0.895597f,-0.0948964f, +-0.381939f,0.886142f,0.262442f, +-0.43994f,0.880276f,0.177672f, +-0.252792f,0.948954f,-0.188633f, +-0.0941535f,0.957693f,-0.271953f, +-0.13352f,0.964535f,-0.227692f, +0.0341173f,0.927935f,-0.371176f, +0.348577f,0.799586f,-0.489036f, +0.387188f,0.819484f,-0.42253f, +0.14352f,0.883544f,-0.445815f, +0.0762879f,0.891752f,-0.446047f, +0.0742711f,0.875908f,-0.476728f, +0.300515f,0.871535f,-0.38745f, +0.0625809f,0.886656f,-0.458175f, +-0.0365474f,0.9191f,-0.392325f, +-0.0762363f,0.966891f,-0.243538f, +0.0117284f,0.995382f,0.0952715f, +0.0102532f,0.999347f,-0.0346391f, +-0.059511f,0.989492f,-0.131776f, +0.349383f,0.904972f,0.24281f, +0.425179f,0.763732f,0.485732f, +-0.0166138f,0.992406f,0.121875f, +-0.122272f,0.990094f,0.0690156f, +-0.015652f,0.970579f,0.240273f, +0.124649f,0.94771f,0.293785f, +0.220282f,0.938434f,0.266116f, +0.102745f,0.973801f,0.202865f, +0.0640356f,0.977435f,0.201297f, +-0.0952943f,0.987515f,0.125435f, +0.114947f,0.977151f,0.178783f, +0.258472f,0.957495f,0.128042f, +0.282157f,0.951094f,0.125728f, +0.142066f,0.986542f,0.0809464f, +-0.0434313f,0.998053f,-0.0447576f, +0.0347776f,0.999239f,-0.0176595f, +0.102204f,0.984881f,-0.139871f, +0.245582f,0.958619f,-0.144014f, +0.135608f,0.990697f,0.0113886f, +-0.0626335f,0.997441f,0.0344788f, +-0.0132478f,0.995736f,0.0912912f, +-0.039638f,0.981575f,0.186922f, +-0.205229f,0.973473f,0.10115f, +-0.153245f,0.987696f,-0.0311751f, +-0.0852914f,0.993336f,-0.0775215f, +0.0304281f,0.997751f,-0.0597208f, +0.0412582f,0.993049f,-0.110237f, +-0.115798f,0.992196f,0.0462328f, +-0.265664f,0.954942f,0.132323f, +-0.179634f,0.978355f,0.102729f, +-0.122093f,0.992469f,0.00988423f, +-0.0976525f,0.994936f,-0.0237989f, +-0.19391f,0.963376f,-0.185219f, +-0.249328f,0.960076f,-0.126845f, +-0.386054f,0.920896f,-0.0539736f, +-0.40236f,0.909842f,-0.101455f, +-0.264839f,0.959901f,-0.091928f, +-0.215529f,0.973573f,-0.0755211f, +-0.190591f,0.977631f,-0.0889496f, +-0.114636f,0.971653f,-0.20676f, +-0.147698f,0.942871f,-0.29863f, +-0.153003f,0.970479f,-0.186443f, +-0.259911f,0.94737f,-0.186912f, +-0.218176f,0.967871f,-0.124997f, +-0.218418f,0.965394f,0.142507f, +-0.497944f,0.825767f,0.264878f, +-0.394522f,0.874216f,0.283017f, +-0.174161f,0.980284f,0.0933364f, +-0.0291225f,0.984908f,-0.170609f, +-0.149188f,0.939649f,-0.307902f, +-0.109448f,0.970586f,-0.214438f, +0.391051f,0.895182f,-0.213842f, +0.237246f,0.888641f,-0.392468f, +0.104812f,0.984981f,-0.137213f, +0.1294f,0.991592f,-0.000205693f, +0.119158f,0.992497f,-0.0274125f, +0.117487f,0.990494f,-0.071548f, +0.234708f,0.962187f,-0.138234f, +0.347721f,0.937443f,-0.017023f, +0.135989f,0.962379f,-0.235229f, +-0.193384f,0.875532f,-0.442772f, +-0.209357f,0.905544f,-0.368998f, +0.0641865f,0.982942f,-0.172352f, +0.0534516f,0.998302f,-0.023133f, +-0.0579793f,0.992675f,-0.105989f, +0.299444f,0.827258f,0.475371f, +0.320901f,0.752799f,0.574731f, +-0.0625162f,0.964286f,0.257381f, +-0.0931157f,0.981324f,0.168322f, +0.0981691f,0.975509f,0.19684f, +0.238911f,0.944952f,0.223577f, +0.0852945f,0.980047f,0.179533f, +0.0437708f,0.96942f,0.241474f, +-0.0654565f,0.948925f,0.308637f, +0.105877f,0.941798f,0.319071f, +0.298409f,0.90697f,0.29725f, +0.267454f,0.931587f,0.246198f, +0.257873f,0.930012f,0.261877f, +0.0608152f,0.99476f,0.0821851f, +0.0682325f,0.995644f,-0.0635329f, +0.204976f,0.974836f,-0.0876375f, +0.100643f,0.994422f,0.031559f, +-0.0498971f,0.971595f,0.231328f, +-0.0948982f,0.951903f,0.291332f, +-0.0140779f,0.962693f,0.270229f, +0.0194699f,0.983768f,0.178386f, +-0.0700516f,0.997536f,0.00373294f, +-0.0458738f,0.991776f,-0.119485f, +-0.0457685f,0.983541f,-0.17479f, +0.031836f,0.984739f,-0.171101f, +-0.0846163f,0.991107f,-0.102703f, +-0.250146f,0.959975f,0.125993f, +-0.240823f,0.966766f,0.0858408f, +-0.110771f,0.993685f,0.0178603f, +-0.0536647f,0.99805f,-0.0318645f, +-0.0537905f,0.996775f,-0.0595505f, +-0.0979926f,0.994498f,-0.0370296f, +-0.317761f,0.946482f,-0.0565711f, +-0.353331f,0.932392f,-0.0761719f, +-0.315921f,0.918114f,-0.23929f, +-0.304095f,0.907663f,-0.289264f, +-0.232301f,0.951296f,-0.202665f, +-0.181242f,0.959764f,-0.214488f, +-0.0415921f,0.982269f,-0.182804f, +-0.134113f,0.976644f,-0.16787f, +-0.266673f,0.950383f,-0.160182f, +-0.233335f,0.968889f,-0.0825141f, +-0.383896f,0.923094f,0.0228394f, +-0.46523f,0.826401f,0.317211f, +-0.448022f,0.824389f,0.345917f, +-0.335673f,0.941977f,-0.00160348f, +0.00939714f,0.9768f,-0.213948f, +0.0525806f,0.945774f,-0.320541f, +-0.0139338f,0.984205f,-0.176483f, +-0.233879f,0.941098f,-0.244203f, +0.35813f,0.924476f,-0.13072f, +0.148621f,0.988076f,0.040214f, +-0.0873945f,0.896884f,0.433546f, +0.16715f,0.882598f,0.43941f, +0.105867f,0.92276f,0.370549f, +0.162793f,0.877156f,0.451769f, +0.26606f,0.895485f,0.356818f, +0.178343f,0.923603f,0.339339f, +0.205659f,0.876785f,0.434686f, +0.164046f,0.939287f,0.301379f, +-0.304778f,0.94913f,-0.0791393f, +-0.351721f,0.931897f,-0.088655f, +-0.137155f,0.986834f,0.0857151f, +-0.0493791f,0.984585f,0.167793f, +-0.29261f,0.942092f,0.163834f, +0.175576f,0.863797f,0.472257f, +0.388427f,0.769345f,0.507181f, +0.0396361f,0.995255f,0.0888612f, +0.000897162f,0.999738f,-0.022857f, +0.263974f,0.951061f,0.160623f, +0.140984f,0.987533f,0.0700142f, +-0.0604349f,0.998129f,-0.00925637f, +-0.0323604f,0.969904f,0.241328f, +0.0249905f,0.978924f,0.202689f, +0.301944f,0.900385f,0.313268f, +0.302439f,0.903212f,0.304531f, +0.227241f,0.927301f,0.297445f, +0.295557f,0.903047f,0.311692f, +0.215996f,0.968849f,0.121149f, +0.0543993f,0.994951f,0.0843384f, +-0.108272f,0.967731f,0.227539f, +-0.144218f,0.941468f,0.304694f, +-0.0465574f,0.94074f,0.335917f, +0.0834793f,0.95338f,0.289996f, +0.159412f,0.96437f,0.211135f, +0.125672f,0.984055f,0.125864f, +0.0125305f,0.999902f,-0.00630946f, +-0.0213081f,0.999771f,-0.00209364f, +-0.0845682f,0.99631f,0.014661f, +-0.191644f,0.962461f,0.192203f, +-0.326186f,0.912172f,0.248084f, +-0.125723f,0.965189f,0.229357f, +-0.0487346f,0.993706f,0.100859f, +0.0069351f,0.999976f,0.00057427f, +-0.0853775f,0.991791f,-0.0951918f, +-0.217561f,0.97582f,-0.0210368f, +-0.247132f,0.964013f,0.0979986f, +-0.253847f,0.965546f,-0.0573009f, +-0.17269f,0.977352f,-0.122318f, +-0.308873f,0.930936f,-0.19482f, +-0.274273f,0.935966f,-0.220775f, +-0.176582f,0.954344f,-0.240926f, +-0.17678f,0.967725f,-0.179601f, +-0.142126f,0.989789f,-0.0108556f, +-0.241082f,0.966299f,-0.0902532f, +-0.303483f,0.94088f,-0.150476f, +-0.634535f,0.768468f,-0.082594f, +-0.47113f,0.814002f,0.339761f, +-0.289984f,0.937003f,0.194769f, +0.025067f,0.999685f,-0.000862102f, +0.289006f,0.893747f,-0.343064f, +0.00615404f,0.935866f,-0.352301f, +-0.338901f,0.929111f,-0.147984f, +-0.164518f,0.985591f,-0.0393034f, +0.290961f,0.935697f,-0.199533f, +-0.0876053f,0.971539f,-0.220083f, +-0.32548f,0.935239f,0.139248f, +0.0766933f,0.974848f,0.20926f, +0.108828f,0.917507f,0.382541f, +0.0350786f,0.924503f,0.379557f, +0.162845f,0.883516f,0.439183f, +0.280718f,0.786151f,0.550603f, +0.282161f,0.80649f,0.519575f, +0.319525f,0.746566f,0.583561f, +-0.0912168f,0.872752f,0.479567f, +-0.288082f,0.924626f,0.249148f, +-0.142667f,0.981082f,0.130856f, +-0.066753f,0.9808f,0.183236f, +-0.230244f,0.961075f,0.152718f, +-0.067082f,0.99457f,0.0795691f, +0.611911f,0.730537f,0.303119f, +0.451199f,0.889041f,0.077617f, +0.0130284f,0.992329f,-0.12294f, +0.0930856f,0.993052f,-0.0719959f, +0.26722f,0.962884f,0.0380388f, +0.075301f,0.995117f,-0.0638176f, +0.167918f,0.972374f,0.162147f, +0.0578882f,0.993576f,0.0972437f, +0.196869f,0.968468f,0.152684f, +0.304163f,0.924874f,0.228237f, +0.255006f,0.935584f,0.244244f, +0.260728f,0.944471f,0.199987f, +0.218361f,0.924111f,0.313587f, +0.0535174f,0.911234f,0.408398f, +-0.0710624f,0.921034f,0.382946f, +-0.130246f,0.949543f,0.285314f, +-0.0655027f,0.977569f,0.200169f, +0.0903252f,0.974724f,0.204338f, +0.155207f,0.949154f,0.273892f, +0.153701f,0.938218f,0.310037f, +0.0621551f,0.960028f,0.272917f, +-0.0534301f,0.951765f,0.30214f, +-0.196733f,0.911558f,0.361052f, +-0.281614f,0.838193f,0.46704f, +-0.263195f,0.866235f,0.424694f, +-0.0481024f,0.917426f,0.394989f, +0.0935627f,0.945047f,0.31326f, +0.130693f,0.965135f,0.226792f, +0.00742185f,0.989033f,0.14751f, +-0.243053f,0.969364f,0.0354789f, +-0.273599f,0.961363f,-0.0304179f, +-0.215123f,0.976563f,-0.00682047f, +-0.164989f,0.983922f,0.068385f, +-0.241802f,0.97031f,0.00552545f, +-0.241315f,0.967202f,-0.0792945f, +-0.169018f,0.981272f,-0.0923975f, +-0.282714f,0.953981f,-0.0999632f, +-0.234963f,0.971912f,-0.0134244f, +-0.109087f,0.993838f,-0.0196489f, +-0.369236f,0.9273f,-0.0614783f, +-0.551241f,0.800465f,0.235349f, +-0.62344f,0.781571f,-0.0216512f, +-0.285923f,0.957424f,0.0398505f, +0.246101f,0.967083f,0.064696f, +0.379822f,0.894837f,-0.234526f, +-0.124179f,0.991035f,0.0492959f, +-0.55499f,0.830986f,0.0380685f, +-0.0883601f,0.986961f,0.13454f, +0.492332f,0.870217f,0.0182045f, +-0.0249785f,0.975709f,-0.217643f, +-0.368665f,0.864796f,-0.340902f, +-0.0172444f,0.938433f,-0.345031f, +-0.0663306f,0.97669f,-0.204147f, +0.00514992f,0.997132f,-0.0755029f, +0.0570337f,0.998371f,-0.00125828f, +0.249285f,0.962439f,0.107557f, +0.242481f,0.961206f,0.131476f, +0.205153f,0.940815f,0.269776f, +0.193253f,0.908579f,0.370322f, +-0.0564604f,0.989265f,0.134783f, +0.0286103f,0.993761f,-0.107795f, +-0.22802f,0.927614f,-0.29587f, +-0.141654f,0.989087f,-0.0405023f, +-0.0918591f,0.979413f,-0.179757f, +0.474817f,0.877478f,-0.067685f, +0.562064f,0.827022f,0.0108876f, +0.0667731f,0.98619f,-0.151561f, +0.0478258f,0.978171f,-0.202223f, +0.240461f,0.955483f,-0.170967f, +0.22331f,0.956303f,-0.188725f, +0.105513f,0.987685f,0.115519f, +0.0191904f,0.988704f,0.148645f, +0.138326f,0.966121f,0.217888f, +0.261136f,0.942738f,0.207491f, +0.283954f,0.937656f,0.20043f, +0.227821f,0.960294f,0.161036f, +0.0632997f,0.956465f,0.284901f, +-0.0487147f,0.902832f,0.427225f, +-0.0448066f,0.869805f,0.491357f, +0.0191513f,0.881775f,0.471282f, +0.0794772f,0.93047f,0.357644f, +0.0542875f,0.971817f,0.2294f, +0.0315472f,0.963796f,0.264769f, +0.140004f,0.919916f,0.36627f, +0.0838185f,0.924915f,0.370818f, +-0.147814f,0.916849f,0.370861f, +-0.285354f,0.864307f,0.414182f, +-0.277978f,0.859855f,0.428226f, +-0.199243f,0.910371f,0.362666f, +0.00801534f,0.941586f,0.336678f, +0.134574f,0.9298f,0.342582f, +0.118153f,0.909557f,0.398429f, +0.0557977f,0.896269f,0.439987f, +-0.0363608f,0.927402f,0.372294f, +-0.166377f,0.978738f,0.119962f, +-0.285966f,0.957794f,-0.0292047f, +-0.233552f,0.97096f,0.0518564f, +-0.131443f,0.981568f,0.138735f, +-0.225195f,0.974079f,0.0213645f, +-0.190643f,0.980844f,0.0400016f, +-0.234677f,0.970688f,0.051878f, +-0.269033f,0.961888f,-0.0489107f, +-0.0845976f,0.996159f,0.0225919f, +-0.404645f,0.907558f,0.112255f, +-0.609864f,0.674076f,0.416758f, +-0.498816f,0.848126f,0.178504f, +-0.144072f,0.987953f,-0.0565038f, +0.166758f,0.948601f,-0.268974f, +0.264567f,0.924612f,0.274038f, +-0.242512f,0.859891f,0.449195f, +-0.469649f,0.864648f,0.178364f, +-0.10506f,0.987899f,0.114094f, +0.522959f,0.850167f,0.0610757f, +0.207342f,0.943984f,-0.256717f, +-0.370985f,0.736513f,-0.565613f, +-0.196204f,0.840957f,-0.504277f, +-0.176697f,0.964208f,-0.197689f, +-0.102305f,0.980589f,-0.167266f, +0.103476f,0.966902f,-0.233225f, +0.176136f,0.882185f,-0.436721f, +0.1356f,0.926363f,-0.351374f, +0.144454f,0.987968f,-0.0552396f, +0.173673f,0.98445f,-0.0263929f, +0.186245f,0.978364f,-0.0900963f, +0.313839f,0.899877f,-0.302865f, +0.0432774f,0.865555f,-0.498941f, +-0.311487f,0.833772f,-0.45585f, +-0.00804547f,0.940342f,-0.340136f, +0.304128f,0.919914f,-0.247515f, +0.693924f,0.703662f,0.152743f, +0.239861f,0.957303f,-0.161363f, +0.0838446f,0.969769f,-0.229169f, +0.258925f,0.935636f,-0.239881f, +0.257223f,0.918931f,-0.299002f, +0.0548176f,0.967903f,0.245271f, +0.0212885f,0.963347f,0.267412f, +0.0818858f,0.973102f,0.215332f, +0.303912f,0.917546f,0.25641f, +0.304793f,0.927062f,0.218307f, +0.238677f,0.941098f,0.239517f, +-0.064428f,0.967965f,0.242677f, +-0.187169f,0.922119f,0.338622f, +-0.088608f,0.904799f,0.416518f, +0.0498324f,0.910793f,0.409846f, +0.176362f,0.913248f,0.367253f, +0.168717f,0.938419f,0.301504f, +0.00502329f,0.962305f,0.271928f, +0.0457173f,0.940418f,0.336934f, +0.0516487f,0.913931f,0.402569f, +-0.133343f,0.891616f,0.432713f, +-0.271457f,0.878825f,0.392399f, +-0.232052f,0.920355f,0.3148f, +-0.147635f,0.961854f,0.230305f, +-0.0156622f,0.96416f,0.264858f, +0.0430262f,0.93984f,0.338894f, +-0.0165403f,0.899263f,0.437095f, +0.0174547f,0.845985f,0.53292f, +0.0913065f,0.841589f,0.532345f, +0.0967863f,0.903784f,0.416901f, +-0.0948439f,0.973273f,0.209153f, +-0.30724f,0.95163f,-0.00197291f, +-0.219507f,0.974242f,0.051671f, +-0.123616f,0.986822f,0.104414f, +-0.209302f,0.977457f,0.0277521f, +-0.245642f,0.966973f,0.0679884f, +-0.189013f,0.970874f,0.147233f, +-0.260969f,0.955926f,0.134541f, +-0.586593f,0.772947f,0.241789f, +-0.622505f,0.744412f,0.241534f, +-0.343069f,0.923585f,0.171158f, +0.270136f,0.949637f,0.158794f, +-0.0270125f,0.976583f,-0.213437f, +-0.293688f,0.905533f,0.306199f, +-0.165876f,0.923469f,0.345963f, +-0.101353f,0.963266f,0.248689f, +-0.0607966f,0.998139f,0.00473307f, +0.571806f,0.81892f,0.04908f, +0.496821f,0.86721f,0.0334054f, +-0.0103979f,0.971297f,-0.237642f, +-0.296903f,0.868994f,-0.395851f, +-0.405401f,0.821757f,-0.400457f, +-0.0724266f,0.96927f,-0.235097f, +0.416989f,0.879556f,-0.229132f, +0.361436f,0.845922f,-0.392148f, +-0.194841f,0.930819f,-0.309213f, +-0.180426f,0.920987f,-0.345297f, +0.16396f,0.957989f,-0.235318f, +0.390246f,0.873397f,-0.291351f, +0.368832f,0.745912f,-0.554597f, +0.0989123f,0.900328f,-0.423823f, +-0.474178f,0.712544f,-0.517143f, +-0.225662f,0.862106f,-0.453707f, +0.0544551f,0.930953f,-0.361055f, +0.547706f,0.827837f,-0.121263f, +0.394416f,0.886974f,-0.240235f, +0.0920684f,0.955894f,-0.278909f, +0.287609f,0.908713f,-0.302524f, +0.34308f,0.875033f,-0.341487f, +-0.0471282f,0.962572f,0.266897f, +0.0309198f,0.953932f,0.298424f, +0.131633f,0.963671f,0.232402f, +0.278528f,0.937297f,0.209515f, +0.282669f,0.933258f,0.221646f, +0.232384f,0.927485f,0.292863f, +-0.0647083f,0.957687f,0.280443f, +-0.249973f,0.928177f,0.275683f, +-0.129841f,0.953629f,0.271538f, +0.0843284f,0.953748f,0.288536f, +0.245794f,0.935145f,0.255127f, +0.172562f,0.957759f,0.230042f, +-0.0230052f,0.954645f,0.296857f, +-0.041189f,0.951248f,0.305663f, +0.00483043f,0.930995f,0.364999f, +-0.165245f,0.915404f,0.367054f, +-0.220878f,0.904299f,0.365316f, +-0.0993279f,0.939818f,0.326919f, +-0.130653f,0.959943f,0.247869f, +-0.122986f,0.930904f,0.343936f, +-0.00592517f,0.911134f,0.412068f, +-0.1345f,0.9137f,0.383488f, +-0.0693903f,0.866333f,0.494623f, +0.121472f,0.852483f,0.508447f, +0.210048f,0.85163f,0.480215f, +0.0819942f,0.889969f,0.448588f, +-0.0885916f,0.940837f,0.327072f, +-0.228328f,0.96901f,0.0942702f, +-0.142437f,0.987843f,0.0622738f, +-0.157298f,0.987135f,0.0286638f, +-0.320718f,0.947161f,0.00499032f, +-0.336449f,0.936473f,0.0990975f, +-0.304779f,0.919932f,0.246646f, +-0.589969f,0.761912f,0.267259f, +-0.577652f,0.799842f,0.163009f, +-0.2738f,0.948238f,0.160868f, +0.240449f,0.968762f,0.0607085f, +-0.0196269f,0.999224f,-0.0341484f, +-0.384279f,0.908117f,0.166292f, +-0.0937293f,0.985711f,0.139963f, +0.0542133f,0.980144f,0.190731f, +0.0177665f,0.999043f,0.039964f, +0.448192f,0.892243f,0.0550135f, +0.417622f,0.800327f,0.430197f, +0.199972f,0.838529f,0.506833f, +-0.0526069f,0.975321f,0.214434f, +-0.547935f,0.818163f,-0.174291f, +-0.280437f,0.954205f,-0.10415f, +0.341739f,0.938698f,0.0453871f, +0.346269f,0.925369f,0.15424f, +-0.319444f,0.944119f,0.0812127f, +-0.192857f,0.977783f,0.0821343f, +0.335818f,0.935599f,-0.108997f, +0.474712f,0.785031f,-0.397964f, +0.373974f,0.907089f,-0.193218f, +0.0523306f,0.977738f,-0.203201f, +-0.41385f,0.870502f,-0.266372f, +-0.377073f,0.911356f,-0.165066f, +0.0445989f,0.977381f,-0.206731f, +0.525837f,0.831576f,-0.178819f, +0.378975f,0.901633f,-0.208411f, +0.088353f,0.958416f,-0.271353f, +0.309469f,0.925076f,-0.220144f, +0.420279f,0.904173f,-0.0763995f, +0.00329705f,0.962532f,0.271149f, +0.0784063f,0.967252f,0.241403f, +0.186812f,0.966508f,0.175965f, +0.294591f,0.944303f,0.146656f, +0.242144f,0.958708f,0.149151f, +0.122249f,0.946777f,0.297772f, +-0.0273117f,0.906407f,0.421521f, +-0.206066f,0.9181f,0.338568f, +-0.0954796f,0.950658f,0.295183f, +0.102184f,0.964671f,0.242834f, +0.213961f,0.952875f,0.215059f, +0.119187f,0.935673f,0.33213f, +-0.0431159f,0.926594f,0.373584f, +-0.0072858f,0.954565f,0.297913f, +-0.0455381f,0.966183f,0.253806f, +-0.154593f,0.937454f,0.311898f, +-0.199077f,0.936411f,0.288969f, +-0.136466f,0.95497f,0.263457f, +-0.127877f,0.920831f,0.3684f, +-0.229636f,0.912787f,0.337767f, +-0.0324452f,0.91205f,0.408794f, +-0.100812f,0.892675f,0.439282f, +-0.166782f,0.900555f,0.401477f, +0.102011f,0.876619f,0.470247f, +0.195025f,0.830402f,0.521918f, +0.0914158f,0.843587f,0.529154f, +0.0626366f,0.873316f,0.48311f, +-0.00226622f,0.929744f,0.3682f, +-0.0934177f,0.966149f,0.240479f, +-0.109555f,0.963702f,0.243468f, +-0.302241f,0.931855f,0.200739f, +-0.368178f,0.918352f,0.145171f, +-0.476623f,0.864028f,0.162128f, +-0.569304f,0.726984f,0.383911f, +-0.64096f,0.755201f,0.137264f, +-0.241026f,0.942011f,0.233501f, +0.376487f,0.905115f,0.197547f, +0.13011f,0.991259f,-0.0218225f, +-0.643013f,0.733979f,-0.218653f, +-0.19089f,0.942227f,0.275264f, +-0.00867818f,0.931663f,0.363219f, +0.146287f,0.916711f,0.371809f, +0.32054f,0.88208f,0.345239f, +0.0976689f,0.827123f,0.55347f, +0.0475977f,0.818583f,0.572413f, +0.312042f,0.775215f,0.549246f, +-0.398647f,0.872033f,0.283969f, +-0.297551f,0.880657f,0.368657f, +0.0684096f,0.950263f,0.303844f, +0.473417f,0.718991f,0.50885f, +-0.0712795f,0.964076f,0.255885f, +-0.187608f,0.981414f,0.0403824f, +0.441688f,0.892595f,0.090477f, +0.402228f,0.910874f,0.0923076f, +0.356001f,0.889285f,0.287114f, +0.109119f,0.990916f,0.0786044f, +-0.366364f,0.926283f,0.0881909f, +-0.361407f,0.913864f,0.185034f, +0.114451f,0.98516f,0.127909f, +0.511212f,0.854805f,0.0892759f, +0.488262f,0.865451f,0.112231f, +0.135362f,0.990178f,0.0350016f, +0.158924f,0.983832f,0.0825671f, +0.139428f,0.973099f,0.183407f, +-0.0124598f,0.997106f,0.0750005f, +0.111778f,0.989445f,0.0922193f, +0.245419f,0.967744f,0.0569325f, +0.2823f,0.95863f,0.0365395f, +0.172017f,0.973333f,0.151766f, +-0.129296f,0.953534f,0.27213f, +-0.0899396f,0.877846f,0.470422f, +-0.0963581f,0.899855f,0.425413f, +-0.0212856f,0.934761f,0.354638f, +0.147549f,0.94824f,0.281195f, +0.129526f,0.93959f,0.316849f, +0.0223606f,0.903767f,0.427441f, +-0.0124316f,0.909175f,0.41623f, +0.115235f,0.910193f,0.397831f, +-0.0283739f,0.950232f,0.310248f, +-0.203804f,0.932573f,0.297946f, +-0.13899f,0.955458f,0.260347f, +-0.204301f,0.958838f,0.197208f, +-0.229868f,0.915186f,0.331053f, +-0.132513f,0.91447f,0.38234f, +-0.151493f,0.940711f,0.3035f, +-0.124022f,0.907796f,0.400656f, +-0.112999f,0.914934f,0.387462f, +-0.039891f,0.908327f,0.416355f, +0.0930682f,0.835427f,0.541664f, +0.161351f,0.801381f,0.575981f, +0.131487f,0.83942f,0.527339f, +0.132693f,0.857332f,0.497367f, +-0.0832448f,0.920852f,0.380923f, +-0.145993f,0.894645f,0.422252f, +-0.213236f,0.888697f,0.405893f, +-0.293641f,0.888131f,0.353551f, +-0.525155f,0.788991f,0.318912f, +-0.588027f,0.679363f,0.438964f, +-0.478637f,0.812929f,0.331743f, +-0.264049f,0.917426f,0.297671f, +0.302963f,0.900818f,0.31103f, +0.420369f,0.80167f,0.424988f, +-0.470879f,0.867699f,0.159284f, +-0.530406f,0.817263f,0.225279f, +-0.0411983f,0.860627f,0.507566f, +0.103255f,0.833118f,0.543372f, +0.186539f,0.814428f,0.549463f, +0.132619f,0.779192f,0.612594f, +0.0761138f,0.83531f,0.544485f, +0.378863f,0.611781f,0.694397f, +-0.172003f,0.719417f,0.672944f, +-0.295852f,0.804769f,0.514605f, +0.0593285f,0.827842f,0.557814f, +0.323809f,0.743921f,0.584575f, +0.339913f,0.758357f,0.556197f, +-0.00694706f,0.946602f,0.322331f, +0.188872f,0.934445f,0.301895f, +0.251044f,0.713229f,0.654432f, +0.351195f,0.638214f,0.685087f, +0.295602f,0.899369f,0.322109f, +-0.450583f,0.880167f,0.14927f, +-0.375985f,0.904392f,0.201769f, +0.158376f,0.94847f,0.274448f, +0.500024f,0.831884f,0.240719f, +0.503159f,0.8293f,0.243089f, +0.0889199f,0.964326f,0.249335f, +0.108789f,0.932871f,0.34339f, +0.066105f,0.944864f,0.320722f, +-0.09433f,0.994124f,-0.0530892f, +0.0903529f,0.995715f,-0.0196726f, +0.246451f,0.969124f,-0.00783612f, +0.17532f,0.977334f,0.118663f, +0.0145033f,0.945036f,0.326645f, +-0.208385f,0.89773f,0.388145f, +-0.186403f,0.920929f,0.342264f, +-0.0196042f,0.920127f,0.391129f, +0.088861f,0.938743f,0.332966f, +0.0904885f,0.955513f,0.280725f, +0.00776342f,0.887041f,0.461625f, +0.0357997f,0.855618f,0.516368f, +0.0251977f,0.899984f,0.435195f, +0.113155f,0.898436f,0.424273f, +0.0488401f,0.928538f,0.36801f, +-0.122117f,0.962671f,0.241562f, +-0.0832756f,0.977563f,0.193483f, +-0.182752f,0.960599f,0.209407f, +-0.340533f,0.923546f,0.176353f, +-0.207225f,0.949201f,0.236801f, +-0.0875863f,0.939463f,0.331268f, +-0.156293f,0.945917f,0.284277f, +-0.15128f,0.944026f,0.293135f, +-0.133917f,0.921967f,0.363377f, +-0.0187779f,0.901995f,0.431337f, +0.137151f,0.859664f,0.492105f, +0.151864f,0.841546f,0.518398f, +0.169983f,0.832825f,0.526791f, +0.0329472f,0.8585f,0.511754f, +-0.148058f,0.877168f,0.456787f, +-0.179554f,0.872912f,0.453636f, +-0.29061f,0.863835f,0.411502f, +-0.582219f,0.748049f,0.318501f, +-0.586418f,0.753548f,0.297117f, +-0.423744f,0.867437f,0.260755f, +-0.266814f,0.914007f,0.305617f, +0.297036f,0.879751f,0.371224f, +0.301464f,0.846429f,0.438951f, +-0.267915f,0.8201f,0.505626f, +-0.708126f,0.705156f,0.0362171f, +-0.280503f,0.856013f,0.434234f, +0.0634361f,0.843315f,0.533662f, +0.203328f,0.848496f,0.488581f, +0.157757f,0.86266f,0.480552f, +-0.0108627f,0.875364f,0.483343f, +-0.00732908f,0.804113f,0.594431f, +0.217513f,0.756413f,0.616869f, +-0.242879f,0.903897f,0.352108f, +-0.0770731f,0.775477f,0.626654f, +0.238061f,0.731126f,0.639361f, +0.459013f,0.658034f,0.596908f, +0.0332364f,0.855326f,0.517022f, +-0.132848f,0.766918f,0.627844f, +-0.0252308f,0.840734f,0.54086f, +0.442735f,0.688282f,0.574677f, +0.624206f,0.545029f,0.559742f, +-0.216833f,0.89857f,0.381516f, +-0.428783f,0.890698f,0.151005f, +0.076598f,0.986116f,0.147334f, +0.479671f,0.865386f,0.144994f, +0.542246f,0.827427f,0.146065f, +0.100899f,0.969794f,0.222079f, +0.0591096f,0.972132f,0.226859f, +0.163564f,0.950136f,0.265495f, +-0.0539816f,0.998166f,0.0273959f, +0.085626f,0.996323f,0.00278248f, +0.159482f,0.986364f,0.0406345f, +-0.0565903f,0.982572f,0.177057f, +-0.167853f,0.932231f,0.320579f, +-0.135579f,0.92648f,0.351075f, +-0.12175f,0.950039f,0.287407f, +-0.0275f,0.960651f,0.276393f, +0.0945575f,0.956567f,0.27575f, +0.0118837f,0.934274f,0.356358f, +-0.160104f,0.889888f,0.42716f, +0.0609856f,0.903744f,0.423707f, +0.121664f,0.922268f,0.366906f, +0.148425f,0.946235f,0.287418f, +0.23463f,0.944122f,0.231479f, +-0.0440541f,0.996345f,0.0731815f, +-0.127251f,0.98255f,0.135658f, +-0.207412f,0.958865f,0.1938f, +-0.296871f,0.939382f,0.171549f, +-0.278192f,0.946498f,0.163558f, +-0.178451f,0.945897f,0.270988f, +-0.115294f,0.937073f,0.329548f, +-0.175206f,0.945254f,0.275312f, +-0.191323f,0.939359f,0.284604f, +-0.0822793f,0.949627f,0.302389f, +0.0583847f,0.93226f,0.357046f, +0.125066f,0.884667f,0.449136f, +0.147347f,0.866347f,0.477213f, +0.0545541f,0.865292f,0.49829f, +-0.098516f,0.887377f,0.450395f, +-0.209769f,0.897417f,0.388122f, +-0.210182f,0.881546f,0.422729f, +-0.451263f,0.852365f,0.264264f, +-0.650724f,0.758775f,-0.0286192f, +-0.407582f,0.890583f,0.201838f, +-0.388367f,0.887583f,0.247725f, +0.193188f,0.884808f,0.424019f, +0.215311f,0.880386f,0.422566f, +-0.165147f,0.855262f,0.491176f, +-0.520864f,0.795129f,0.310596f, +-0.488998f,0.786967f,0.37625f, +0.0562235f,0.868104f,0.493187f, +0.400928f,0.84731f,0.348313f, +0.199813f,0.978725f,-0.0465961f, +-0.198621f,0.97682f,0.0798329f, +-0.0891351f,0.888352f,0.450429f, +0.204835f,0.834736f,0.511135f, +-0.0720813f,0.941881f,0.328121f, +-0.196291f,0.972713f,0.123691f, +0.179787f,0.980826f,-0.0752149f, +0.511674f,0.853811f,0.0958982f, +0.0191479f,0.909767f,0.414677f, +-0.125562f,0.89333f,0.431505f, +0.22305f,0.943278f,0.245918f, +0.527748f,0.84488f,0.0875187f, +0.598212f,0.799615f,-0.0525252f, +0.0107332f,0.903361f,0.428747f, +-0.300811f,0.914951f,0.269032f, +0.179787f,0.975264f,0.128593f, +0.519301f,0.854591f,0.00126655f, +0.419398f,0.906587f,-0.0469514f, +0.0522982f,0.994257f,0.0933686f, +0.0513278f,0.996267f,0.0694112f, +0.103651f,0.993237f,0.0523089f, +0.0555975f,0.984758f,0.164805f, +0.0862163f,0.988349f,0.12543f, +0.0909734f,0.981273f,0.169784f, +-0.14512f,0.970727f,0.191388f, +-0.180918f,0.953611f,0.240612f, +-0.140102f,0.96533f,0.22025f, +-0.119189f,0.970295f,0.210526f, +-0.0126783f,0.974075f,0.225869f, +0.0237961f,0.97809f,0.20682f, +-0.0862872f,0.95413f,0.286688f, +-0.14433f,0.944949f,0.293667f, +0.132869f,0.954959f,0.265329f, +0.22733f,0.94991f,0.214458f, +0.185536f,0.968744f,0.164655f, +0.30218f,0.927213f,0.221277f, +-0.010566f,0.987352f,0.158194f, +-0.227641f,0.957817f,0.175404f, +-0.212635f,0.950922f,0.224799f, +-0.288872f,0.93765f,0.193302f, +-0.303211f,0.936666f,0.175273f, +-0.283958f,0.943546f,0.170553f, +-0.13575f,0.960553f,0.242714f, +-0.0816944f,0.973992f,0.211345f, +-0.191701f,0.977982f,0.0824724f, +-0.110352f,0.986199f,0.123427f, +-0.0409453f,0.971384f,0.233958f, +0.0185038f,0.933683f,0.357621f, +0.13477f,0.907601f,0.397615f, +0.0792432f,0.925049f,0.371489f, +-0.0350852f,0.929789f,0.366418f, +-0.159548f,0.910971f,0.380363f, +-0.245138f,0.905643f,0.346003f, +-0.179352f,0.926492f,0.330825f, +-0.589052f,0.80668f,0.0478056f, +-0.578625f,0.779472f,0.240033f, +-0.471687f,0.839166f,0.270762f, +0.0987404f,0.916105f,0.388589f, +0.173592f,0.831445f,0.527792f, +-0.220086f,0.704489f,0.674728f, +-0.395802f,0.62503f,0.672813f, +-0.417304f,0.755058f,0.505712f, +0.0513487f,0.865997f,0.497406f, +0.431689f,0.734124f,0.524124f, +0.359032f,0.884637f,0.297512f, +-0.308259f,0.930686f,0.196975f, +-0.34698f,0.877125f,0.332049f, +0.00851592f,0.919266f,0.393545f, +0.326193f,0.840272f,0.433061f, +0.261231f,0.960149f,-0.0993615f, +0.388612f,0.889039f,-0.242053f, +0.0354931f,0.979528f,-0.198152f, +0.0485316f,0.907873f,0.416427f, +-0.0781845f,0.964592f,0.251892f, +0.47974f,0.876345f,0.0432286f, +0.568817f,0.783907f,-0.248873f, +0.483889f,0.834837f,-0.262485f, +-0.220496f,0.975376f,0.00471288f, +-0.25449f,0.933474f,0.252706f, +0.326168f,0.921789f,0.209569f, +0.609761f,0.790958f,0.0507595f, +0.419183f,0.900774f,-0.11354f, +-0.0389936f,0.992704f,-0.114095f, +0.112818f,0.992086f,-0.0551048f, +0.140261f,0.98577f,-0.0926471f, +0.0460285f,0.981507f,0.185811f, +0.0839854f,0.981486f,0.172137f, +0.0780195f,0.983837f,0.161178f, +-0.135272f,0.977846f,0.159743f, +-0.233239f,0.960885f,0.149328f, +-0.119476f,0.978748f,0.166665f, +-0.0623017f,0.991047f,0.118089f, +-0.0310067f,0.999432f,0.0132292f, +-0.0037253f,0.997112f,0.0758502f, +-0.0758016f,0.98526f,0.153355f, +-0.143296f,0.988211f,0.0539015f, +0.103486f,0.991653f,0.076914f, +0.266632f,0.947722f,0.175298f, +0.164045f,0.978994f,0.121078f, +0.196418f,0.969063f,0.149458f, +0.0648458f,0.968138f,0.241876f, +-0.21695f,0.963194f,0.158716f, +-0.238014f,0.956133f,0.17076f, +-0.251543f,0.948014f,0.194926f, +-0.241597f,0.958745f,0.149794f, +-0.248822f,0.966568f,0.0619263f, +-0.195635f,0.9804f,0.0233089f, +0.00681016f,0.994726f,0.102342f, +-0.0728308f,0.997328f,0.00570638f, +-0.223928f,0.970021f,-0.0944255f, +-0.201047f,0.979434f,0.0169867f, +-0.100278f,0.986057f,0.132801f, +0.129703f,0.962794f,0.237074f, +0.129196f,0.949613f,0.28556f, +-0.100355f,0.959332f,0.263838f, +-0.226831f,0.927446f,0.297306f, +-0.211803f,0.921673f,0.325051f, +-0.16781f,0.90652f,0.387378f, +-0.507141f,0.76624f,0.394569f, +-0.499456f,0.740703f,0.449336f, +-0.375574f,0.865361f,0.331805f, +0.0665425f,0.96722f,0.245068f, +-0.127974f,0.946728f,0.295513f, +-0.531445f,0.627941f,0.568557f, +-0.268657f,0.746051f,0.609287f, +-0.123398f,0.84105f,0.526695f, +0.113268f,0.868801f,0.482033f, +0.278975f,0.860996f,0.425274f, +0.256512f,0.783766f,0.565608f, +0.24637f,0.788587f,0.563411f, +-0.207735f,0.977522f,-0.036006f, +0.0390118f,0.996098f,0.0791601f, +0.408253f,0.910351f,0.0677493f, +0.466297f,0.863647f,-0.191525f, +0.226125f,0.967725f,-0.111247f, +-0.24034f,0.965221f,0.102887f, +-0.130757f,0.944853f,0.300258f, +0.283435f,0.943407f,0.172188f, +0.590839f,0.8059f,-0.0378747f, +0.573782f,0.756596f,-0.313587f, +0.355206f,0.926281f,0.12583f, +-0.219704f,0.910923f,0.349212f, +-0.277723f,0.959254f,0.051969f, +0.340807f,0.938572f,0.0541606f, +0.677372f,0.729826f,0.0923128f, +0.49544f,0.867668f,-0.0411347f, +-0.024834f,0.981688f,-0.188872f, +0.050519f,0.974996f,-0.216403f, +0.180767f,0.970256f,-0.161015f, +0.0401148f,0.977494f,0.207113f, +0.106256f,0.969045f,0.222848f, +0.0969035f,0.97128f,0.217314f, +-0.118574f,0.978564f,0.16838f, +-0.194437f,0.978726f,0.0655019f, +-0.11441f,0.993427f,0.0037257f, +0.00229181f,0.999514f,0.0311045f, +0.0309142f,0.998007f,0.0550047f, +-0.113357f,0.989867f,0.085516f, +-0.111292f,0.980012f,0.164894f, +-0.0212066f,0.993646f,0.110539f, +0.0241257f,0.999577f,-0.0162417f, +0.157698f,0.982481f,0.0993122f, +0.222931f,0.950361f,0.21706f, +0.18078f,0.964986f,0.190052f, +0.0702985f,0.98108f,0.180387f, +-0.190259f,0.977665f,0.089291f, +-0.268574f,0.956136f,0.116926f, +-0.267756f,0.955804f,0.121429f, +-0.211446f,0.969418f,0.124579f, +-0.14687f,0.983484f,0.105776f, +-0.198985f,0.979945f,-0.0106117f, +-0.0887412f,0.995564f,0.0312775f, +0.0104704f,0.992989f,0.117739f, +-0.125001f,0.9915f,0.0360868f, +-0.238906f,0.968221f,-0.0739686f, +-0.167029f,0.981518f,-0.0933989f, +-0.0351406f,0.998931f,-0.030045f, +0.0130186f,0.974123f,0.225643f, +-0.0745329f,0.922898f,0.377762f, +-0.18971f,0.916591f,0.351953f, +-0.286917f,0.902381f,0.321538f, +-0.328487f,0.84853f,0.414841f, +-0.591704f,0.685127f,0.424839f, +-0.448564f,0.796089f,0.406241f, +-0.170353f,0.888356f,0.426384f, +-0.00830475f,0.908708f,0.417349f, +-0.140027f,0.883683f,0.446651f, +-0.599598f,0.727182f,0.334197f, +-0.234879f,0.924162f,0.301258f, +-0.0954672f,0.951872f,0.291248f, +0.100155f,0.948228f,0.301383f, +0.352663f,0.898478f,0.261471f, +0.217902f,0.956165f,0.19562f, +0.428441f,0.89557f,0.119967f, +0.0504867f,0.972497f,-0.227379f, +-0.160086f,0.98254f,-0.0948013f, +0.319131f,0.945228f,-0.0685555f, +0.64992f,0.715088f,0.257397f, +0.0361031f,0.995429f,0.0884124f, +-0.2599f,0.897768f,0.355618f, +-0.17567f,0.983498f,0.0432638f, +0.53944f,0.841427f,-0.0317039f, +0.60742f,0.697232f,-0.380669f, +0.609044f,0.790595f,-0.063438f, +-0.195234f,0.980448f,0.0245981f, +-0.224173f,0.885759f,0.406419f, +0.0964403f,0.992198f,0.0790071f, +0.380926f,0.892571f,-0.241272f, +0.532566f,0.777301f,-0.334927f, +0.58332f,0.811668f,0.0305478f, +0.122052f,0.989417f,-0.0784701f, +0.094933f,0.975516f,-0.198385f, +0.104703f,0.956209f,-0.273317f, +0.0116109f,0.989434f,0.144515f, +0.0514824f,0.974923f,0.216505f, +0.096067f,0.950842f,0.294399f, +0.00976988f,0.964716f,0.263111f, +-0.0931121f,0.98126f,0.168699f, +-0.0745948f,0.982842f,0.168693f, +-0.083139f,0.982475f,0.166825f, +-0.0763046f,0.97088f,0.22709f, +-0.130809f,0.960701f,0.244832f, +-0.117161f,0.974629f,0.190711f, +0.0735371f,0.976475f,0.202706f, +0.123062f,0.984428f,0.125529f, +0.0660058f,0.995943f,0.0611663f, +0.0811078f,0.98996f,0.115763f, +0.156048f,0.953727f,0.257008f, +0.12971f,0.935453f,0.32879f, +-0.0928149f,0.955298f,0.280698f, +-0.264252f,0.949049f,0.171686f, +-0.241724f,0.966072f,0.0909662f, +-0.244999f,0.96713f,0.0680795f, +-0.106995f,0.982895f,0.149898f, +-0.106861f,0.990227f,0.089616f, +-0.133621f,0.990932f,0.0141138f, +-0.0517957f,0.998024f,0.0355675f, +-0.0225779f,0.998718f,0.0453005f, +-0.144281f,0.986502f,-0.0774439f, +-0.157036f,0.983398f,-0.0909287f, +-0.161108f,0.986936f,-0.00118469f, +-0.22235f,0.965394f,0.136287f, +-0.250578f,0.942366f,0.221715f, +-0.217658f,0.901831f,0.373264f, +-0.29708f,0.848133f,0.438651f, +-0.36269f,0.819581f,0.443558f, +-0.534096f,0.793842f,0.290785f, +-0.584404f,0.811192f,0.0209707f, +-0.1404f,0.905222f,0.401075f, +-0.307079f,0.89418f,0.325797f, +-0.27164f,0.834087f,0.480115f, +-0.322843f,0.946322f,0.0157466f, +-0.301281f,0.933652f,-0.193713f, +-0.127165f,0.985755f,0.11007f, +0.121812f,0.97858f,0.165962f, +0.500139f,0.864928f,0.0419482f, +0.30357f,0.892132f,-0.334582f, +0.443241f,0.85073f,-0.282481f, +0.0967978f,0.993781f,0.0550442f, +-0.201565f,0.978713f,0.0386423f, +0.209591f,0.974539f,0.0796601f, +0.481917f,0.851558f,0.20641f, +-0.0224044f,0.977009f,0.212016f, +-0.238315f,0.88567f,0.398491f, +0.220358f,0.960844f,0.167992f, +0.601263f,0.791797f,-0.107428f, +0.618362f,0.741713f,-0.25979f, +0.284452f,0.956119f,0.0701626f, +-0.201478f,0.913131f,0.3544f, +-0.20526f,0.978252f,0.0298624f, +0.352634f,0.929538f,-0.107737f, +0.649062f,0.752634f,-0.110725f, +0.490387f,0.729272f,-0.477162f, +0.431974f,0.874843f,-0.219197f, +0.184608f,0.975155f,-0.122446f, +0.192786f,0.978517f,-0.0730681f, +0.240097f,0.966116f,-0.094733f, +-0.255309f,0.963455f,-0.0810722f, +-0.124334f,0.990531f,0.0582188f, +0.042075f,0.979967f,0.194667f, +0.0324324f,0.965776f,0.25734f, +-0.0760147f,0.965606f,0.248649f, +-0.138926f,0.972343f,0.187746f, +-0.0932442f,0.974882f,0.202264f, +-0.0380092f,0.975147f,0.218276f, +-0.0242537f,0.984345f,0.174576f, +-0.0724602f,0.995976f,0.0527463f, +0.0175716f,0.997526f,0.068069f, +0.191598f,0.97051f,0.146287f, +0.0888492f,0.992747f,0.0809944f, +0.0509079f,0.989914f,0.132209f, +0.0413152f,0.988953f,0.142354f, +-0.00590782f,0.97647f,0.215574f, +-0.0327876f,0.94937f,0.312443f, +-0.0862721f,0.978712f,0.186225f, +-0.179337f,0.981669f,0.0645377f, +-0.255621f,0.960924f,0.106226f, +-0.157413f,0.981394f,0.109943f, +-0.0325878f,0.996293f,0.0796149f, +-0.0627116f,0.997982f,-0.00999288f, +-0.0263234f,0.995733f,-0.0884504f, +0.00359159f,0.990572f,-0.136946f, +-0.0963f,0.991181f,-0.0910356f, +-0.255814f,0.966717f,-0.00409974f, +-0.292954f,0.950051f,0.107618f, +-0.259513f,0.946888f,0.189886f, +-0.274998f,0.934354f,0.226623f, +-0.37248f,0.885745f,0.276974f, +-0.384203f,0.849481f,0.361622f, +-0.326853f,0.86434f,0.382208f, +-0.213332f,0.922586f,0.321442f, +-0.528611f,0.848285f,0.0313709f, +-0.466119f,0.869006f,0.166018f, +-0.226659f,0.921685f,0.314837f, +-0.225942f,0.929604f,0.291181f, +0.262979f,0.943638f,0.200972f, +-0.158823f,0.970135f,-0.183342f, +-0.433654f,0.893597f,-0.115884f, +0.0458639f,0.99877f,-0.0188405f, +0.612149f,0.789064f,0.0514904f, +0.423383f,0.878106f,-0.222881f, +0.0967751f,0.930754f,-0.352606f, +0.0811144f,0.996202f,0.0316668f, +-0.413686f,0.895072f,-0.166465f, +0.148131f,0.951189f,0.270735f, +0.436798f,0.864787f,0.247692f, +0.0437864f,0.959427f,0.278536f, +-0.28501f,0.956226f,0.0663364f, +0.510274f,0.859616f,0.0260981f, +0.648806f,0.686419f,-0.328451f, +0.586912f,0.808674f,0.0397475f, +-0.0852935f,0.966768f,0.241009f, +-0.148057f,0.961052f,0.233361f, +0.164136f,0.983527f,-0.0757203f, +0.450314f,0.849987f,-0.273386f, +0.550526f,0.728504f,-0.407679f, +0.58281f,0.780161f,-0.227338f, +0.258267f,0.941325f,-0.21727f, +0.0807909f,0.98982f,-0.117172f, +0.0801488f,0.996327f,0.0301511f, +0.239863f,0.961671f,0.132871f, +-0.229647f,0.969202f,0.0889415f, +-0.172859f,0.981826f,0.0783421f, +-0.0626565f,0.996388f,0.0573105f, +-0.0572909f,0.992727f,0.105883f, +-0.0279351f,0.983375f,0.179427f, +-0.00285096f,0.99214f,0.125102f, +-0.084025f,0.99632f,-0.0168937f, +-0.0732377f,0.997041f,-0.0233556f, +-0.0045065f,0.999839f,0.0173404f, +0.0203121f,0.999722f,0.0119547f, +-0.0506539f,0.996487f,-0.0666886f, +0.119651f,0.992498f,0.0251293f, +0.0686084f,0.989615f,0.126312f, +0.000108814f,0.982339f,0.187109f, +0.0874025f,0.98865f,0.122196f, +-0.0625717f,0.997577f,0.0304034f, +-0.0486926f,0.992353f,0.113426f, +0.0140738f,0.989644f,0.142855f, +-0.151919f,0.980609f,0.123804f, +-0.280176f,0.959074f,0.0409668f, +-0.112828f,0.992642f,-0.0439511f, +0.0530002f,0.995827f,-0.0742939f, +0.0297885f,0.985001f,-0.169959f, +0.0528437f,0.970999f,-0.233169f, +-0.0380639f,0.977109f,-0.209305f, +-0.249056f,0.968138f,-0.0260696f, +-0.370842f,0.913812f,0.165599f, +-0.310025f,0.907402f,0.283736f, +-0.313659f,0.908343f,0.276641f, +-0.360766f,0.88042f,0.307747f, +-0.383668f,0.851108f,0.358349f, +-0.392242f,0.857478f,0.332984f, +-0.296931f,0.900087f,0.318865f, +-0.199402f,0.936164f,0.289543f, +-0.412291f,0.885214f,0.215434f, +-0.62242f,0.781068f,-0.0502514f, +-0.272781f,0.928261f,0.252828f, +-0.317665f,0.921151f,0.224876f, +0.0813846f,0.925309f,0.370378f, +0.00278871f,0.889899f,0.45615f, +-0.460626f,0.879338f,0.120782f, +0.0601251f,0.985077f,0.161272f, +0.599887f,0.787248f,0.142742f, +0.617017f,0.753279f,0.227729f, +0.13665f,0.981422f,0.134675f, +0.136502f,0.974756f,0.176687f, +-0.27066f,0.954113f,-0.128105f, +-0.13295f,0.980241f,-0.146465f, +0.409773f,0.909514f,-0.0697851f, +0.339811f,0.93455f,0.10557f, +-0.243979f,0.943604f,-0.223798f, +0.572252f,0.820076f,0.00181093f, +0.58136f,0.813444f,0.0181706f, +0.213313f,0.927464f,0.307095f, +-0.0427767f,0.853854f,0.518751f, +0.0717407f,0.97577f,0.206702f, +0.349298f,0.936925f,0.0127626f, +0.643074f,0.765767f,0.00757208f, +0.584117f,0.763349f,-0.275872f, +0.414478f,0.906497f,-0.0804466f, +0.213842f,0.975055f,-0.0594842f, +-0.00469446f,0.990505f,-0.137399f, +-0.0685672f,0.992236f,-0.103764f, +0.0844774f,0.996384f,-0.00904741f, +-0.320391f,0.938064f,0.131853f, +-0.173519f,0.96335f,0.204565f, +-0.0123366f,0.973468f,0.228492f, +-0.018009f,0.983892f,0.177855f, +-0.10447f,0.992257f,0.0671745f, +0.0409931f,0.988078f,0.148399f, +0.0370075f,0.994865f,0.0941976f, +-0.0471895f,0.997972f,-0.0427132f, +-0.0371271f,0.993135f,-0.110921f, +0.0109117f,0.996203f,-0.0863686f, +0.0455917f,0.995961f,-0.0773449f, +-0.0321894f,0.986545f,-0.160288f, +-0.0649603f,0.996397f,0.0545189f, +0.00369488f,0.985567f,0.169244f, +0.226168f,0.962189f,0.151787f, +0.029392f,0.999567f,0.00117257f, +-0.13579f,0.984206f,-0.113581f, +-0.10103f,0.992288f,-0.0718192f, +-0.125171f,0.991084f,0.0456533f, +-0.108309f,0.993989f,0.015999f, +-0.0231464f,0.995269f,-0.0943563f, +0.0270486f,0.99325f,-0.112795f, +0.141677f,0.989359f,-0.0331051f, +0.0268575f,0.994547f,-0.100767f, +-0.194101f,0.980932f,0.009818f, +-0.41139f,0.899763f,0.145547f, +-0.482013f,0.8562f,0.185973f, +-0.415606f,0.872343f,0.257468f, +-0.291757f,0.884021f,0.365218f, +-0.316561f,0.886381f,0.337814f, +-0.406f,0.884827f,0.22857f, +-0.363525f,0.905831f,0.217534f, +-0.301242f,0.93366f,0.193734f, +-0.208193f,0.941974f,0.263325f, +-0.164184f,0.932027f,0.323063f, +-0.4694f,0.88027f,-0.0691917f, +-0.525104f,0.840943f,-0.130688f, +-0.256903f,0.950739f,0.17348f, +-0.180022f,0.968548f,0.171775f, +0.0734506f,0.860739f,0.50372f, +-0.205317f,0.895889f,0.393991f, +0.0472127f,0.984089f,0.171289f, +0.492639f,0.869295f,-0.040419f, +0.615313f,0.776504f,0.135761f, +0.240143f,0.940103f,0.241946f, +0.0961855f,0.982412f,0.160044f, +0.107308f,0.976554f,0.186622f, +-0.0192621f,0.988216f,-0.151846f, +0.243819f,0.934285f,-0.260122f, +0.363158f,0.92047f,-0.144401f, +-0.0181857f,0.911833f,-0.410158f, +0.13216f,0.935755f,-0.326948f, +0.234069f,0.876493f,0.42068f, +-0.0429998f,0.864233f,0.501251f, +0.30178f,0.838678f,0.453374f, +0.334916f,0.905993f,0.258858f, +0.486799f,0.865003f,0.121641f, +0.551114f,0.813232f,-0.186886f, +0.639118f,0.75121f,0.164956f, +0.383938f,0.890692f,0.243432f, +0.354878f,0.921145f,0.159855f, +0.162961f,0.98584f,-0.0395363f, +-0.0637937f,0.974986f,-0.212914f, +-0.0365262f,0.968846f,-0.244954f, +-0.281965f,0.951785f,0.120834f, +-0.274882f,0.955225f,0.109473f, +-0.104135f,0.948711f,0.298502f, +0.0826411f,0.912269f,0.401168f, +0.0342531f,0.97031f,0.239425f, +-0.0365634f,0.991589f,0.124154f, +0.134024f,0.975461f,0.174679f, +0.109589f,0.99345f,0.032348f, +0.0453955f,0.994687f,-0.0923934f, +-0.0149079f,0.988982f,-0.147281f, +0.0512217f,0.992549f,-0.110554f, +0.0167819f,0.988638f,-0.149377f, +-0.222271f,0.949144f,-0.222982f, +-0.0921327f,0.987637f,-0.126823f, +0.189567f,0.98184f,-0.00744372f, +0.205171f,0.976356f,0.0680753f, +-0.00982996f,0.993812f,-0.110639f, +-0.0883427f,0.978311f,-0.18736f, +-0.198236f,0.955921f,-0.216604f, +-0.180283f,0.972159f,-0.149685f, +0.0029493f,0.99947f,-0.0324137f, +-0.0433514f,0.998534f,-0.0324142f, +0.0405175f,0.99421f,0.0995223f, +0.00286263f,0.981263f,0.19265f, +-0.296663f,0.921382f,0.251091f, +-0.412123f,0.867858f,0.277446f, +-0.439996f,0.871969f,0.214648f, +-0.457669f,0.875232f,0.156552f, +-0.384822f,0.899193f,0.208242f, +-0.276213f,0.916653f,0.288882f, +-0.314226f,0.91283f,0.260774f, +-0.345662f,0.91535f,0.206522f, +-0.311859f,0.934366f,0.17235f, +-0.323293f,0.931681f,0.165688f, +-0.218081f,0.943645f,0.248946f, +0.00414662f,0.967721f,0.251991f, +-0.350612f,0.910773f,-0.218092f, +-0.590427f,0.768592f,-0.246296f, +-0.263693f,0.937904f,0.225393f, +-0.149885f,0.945975f,0.287518f, +-0.0723712f,0.947676f,0.310922f, +0.303995f,0.902765f,0.304306f, +0.615729f,0.768916f,0.172179f, +0.376573f,0.870472f,0.316971f, +0.258103f,0.862435f,0.435417f, +0.208037f,0.965523f,0.156476f, +0.041711f,0.997309f,0.0602974f, +0.0896451f,0.984172f,0.152868f, +0.200861f,0.950569f,0.236798f, +0.331115f,0.861074f,0.385894f, +0.343908f,0.839357f,0.420961f, +-0.162885f,0.985003f,0.0568977f, +-0.0608521f,0.991774f,0.112611f, +0.279417f,0.937386f,0.207929f, +0.438178f,0.898268f,0.033396f, +0.516016f,0.854846f,-0.0544561f, +0.550254f,0.781096f,-0.295143f, +0.499018f,0.830127f,-0.248738f, +0.421585f,0.905472f,0.0488414f, +0.355515f,0.918443f,0.173411f, +0.416018f,0.882036f,0.221226f, +0.346021f,0.922667f,0.170161f, +0.0862406f,0.994799f,-0.0542001f, +0.0251294f,0.989963f,-0.139071f, +-0.167311f,0.982002f,0.0876306f, +-0.296088f,0.953872f,0.0496014f, +-0.309819f,0.944071f,0.112878f, +0.0107419f,0.974593f,0.223724f, +0.235566f,0.938548f,0.252263f, +0.0528759f,0.995406f,0.0798236f, +0.106055f,0.992977f,0.0524375f, +0.227694f,0.967451f,0.110427f, +0.15013f,0.988604f,0.0110517f, +0.0292872f,0.989448f,-0.141897f, +0.0113647f,0.978518f,-0.205848f, +0.0966514f,0.981912f,-0.162811f, +-0.0834695f,0.969158f,-0.231875f, +-0.173766f,0.92349f,-0.34201f, +0.0289323f,0.967596f,-0.250839f, +0.166759f,0.980973f,-0.0994165f, +0.0796755f,0.992423f,-0.0935347f, +-0.0109031f,0.993494f,-0.113363f, +-0.181202f,0.957527f,-0.224295f, +-0.231371f,0.948894f,-0.214636f, +-0.0963906f,0.978232f,-0.183771f, +-0.0964169f,0.992283f,-0.0779687f, +-0.114591f,0.992373f,0.045429f, +-0.0476997f,0.984744f,0.167343f, +-0.353531f,0.929974f,0.100818f, +-0.42903f,0.892447f,0.139543f, +-0.399459f,0.902474f,0.161164f, +-0.44275f,0.883954f,0.150326f, +-0.416721f,0.891582f,0.177271f, +-0.364313f,0.907101f,0.210818f, +-0.329954f,0.890729f,0.312622f, +-0.308128f,0.891277f,0.33269f, +-0.248313f,0.912421f,0.325314f, +-0.264673f,0.92449f,0.274348f, +-0.221501f,0.958108f,0.181568f, +-0.00722143f,0.985032f,0.17222f, +0.0811419f,0.973825f,0.212324f, +-0.519461f,0.82914f,-0.206608f, +-0.561212f,0.816969f,-0.132674f, +-0.10198f,0.978452f,0.179533f, +-0.0294922f,0.994047f,0.104885f, +0.212965f,0.975972f,0.0461033f, +0.39072f,0.902699f,0.180202f, +0.284816f,0.877828f,0.385096f, +0.371584f,0.726424f,0.578129f, +0.415725f,0.734903f,0.535809f, +0.0647658f,0.913533f,0.401575f, +0.0316961f,0.895539f,0.443852f, +-0.0215836f,0.930013f,0.366891f, +0.0389377f,0.900411f,0.433293f, +0.182398f,0.888094f,0.421923f, +0.319795f,0.864372f,0.388061f, +0.179682f,0.983355f,0.0269752f, +0.358016f,0.913314f,-0.19412f, +0.445422f,0.82688f,-0.343321f, +0.564533f,0.736553f,-0.372547f, +0.511683f,0.792162f,-0.332656f, +0.362215f,0.931906f,0.0187495f, +0.332114f,0.925718f,0.180958f, +0.376936f,0.924108f,0.0628019f, +0.34207f,0.939661f,0.00505146f, +0.432513f,0.89733f,0.0879243f, +0.250624f,0.96783f,0.022189f, +0.113333f,0.993448f,0.0146943f, +-0.330108f,0.943938f,0.00323688f, +-0.32108f,0.944743f,0.0660874f, +-0.312445f,0.949733f,0.0196284f, +-0.0425447f,0.998988f,-0.0145795f, +0.234895f,0.971633f,0.0274452f, +0.205978f,0.978297f,0.0225396f, +0.0556133f,0.99289f,-0.10525f, +0.149272f,0.988455f,-0.0259672f, +0.25486f,0.966188f,0.0390683f, +0.206371f,0.977859f,-0.0346908f, +0.0798975f,0.983688f,-0.161166f, +0.0387149f,0.980238f,-0.193996f, +-0.0261652f,0.985317f,-0.168719f, +-0.115457f,0.963019f,-0.243441f, +-0.0914394f,0.962229f,-0.256427f, +0.0382488f,0.992063f,-0.119784f, +0.0800161f,0.996698f,-0.0137989f, +0.0187475f,0.998138f,-0.0580508f, +-0.073595f,0.994051f,-0.0802936f, +-0.224165f,0.957926f,-0.179241f, +-0.16346f,0.967941f,-0.190711f, +-0.19173f,0.978244f,-0.0792358f, +-0.275576f,0.961029f,-0.0219235f, +-0.0407932f,0.98802f,0.148838f, +-0.278629f,0.956556f,0.085827f, +-0.465684f,0.878931f,0.103047f, +-0.438529f,0.89146f,0.11398f, +-0.455089f,0.880964f,0.129601f, +-0.457802f,0.879895f,0.127287f, +-0.406331f,0.89051f,0.204664f, +-0.386395f,0.891456f,0.236654f, +-0.321818f,0.921226f,0.218577f, +-0.271011f,0.935727f,0.22576f, +-0.198383f,0.944022f,0.263564f, +-0.105727f,0.975806f,0.191373f, +-0.0832756f,0.987941f,0.130528f, +0.0931562f,0.956641f,0.27597f, +-0.216408f,0.96162f,0.168686f, +-0.648586f,0.688743f,-0.323988f, +-0.276841f,0.843915f,-0.459527f, +-0.060911f,0.935148f,-0.348981f, +0.243821f,0.963831f,-0.107611f, +0.35478f,0.93349f,-0.0522288f, +0.124674f,0.987025f,-0.101179f, +0.106145f,0.993646f,0.0374371f, +0.264307f,0.911176f,0.316069f, +0.180037f,0.821936f,0.540378f, +0.0976487f,0.839888f,0.533903f, +0.242869f,0.82432f,0.511381f, +0.296956f,0.900742f,0.316987f, +0.37446f,0.92343f,0.0840066f, +0.38614f,0.913414f,-0.128727f, +0.497691f,0.838063f,-0.223505f, +0.399217f,0.778523f,-0.484281f, +0.607215f,0.684189f,-0.403949f, +0.455879f,0.835157f,-0.307715f, +0.317815f,0.943806f,-0.0906903f, +0.166917f,0.983806f,0.0653043f, +0.277188f,0.953387f,0.119249f, +0.491287f,0.85011f,0.189606f, +0.3858f,0.919271f,0.0780984f, +0.390109f,0.91635f,0.0900968f, +0.247947f,0.964668f,0.0890966f, +0.0188396f,0.999506f,0.0251451f, +-0.249227f,0.949063f,0.192782f, +-0.24873f,0.963608f,0.0979465f, +-0.225537f,0.968208f,-0.108193f, +-0.0586638f,0.984304f,-0.166448f, +0.193919f,0.980395f,-0.0349386f, +0.232927f,0.972341f,0.0172453f, +0.165218f,0.985248f,-0.0445953f, +0.10666f,0.982482f,-0.152814f, +0.176402f,0.976328f,-0.125164f, +0.217875f,0.975941f,-0.00837002f, +0.138055f,0.990338f,0.0130638f, +0.0914598f,0.995289f,-0.0321788f, +-0.014672f,0.992233f,-0.123523f, +-0.0701479f,0.990985f,-0.114142f, +-0.0940689f,0.987781f,-0.124254f, +-0.152176f,0.977744f,-0.144426f, +0.043676f,0.996991f,0.0640382f, +0.0457416f,0.996307f,0.07266f, +-0.0198973f,0.997072f,0.0738311f, +-0.119455f,0.990174f,-0.0727032f, +-0.224875f,0.962572f,-0.151282f, +-0.250045f,0.966903f,-0.0507448f, +-0.319974f,0.944248f,-0.0775328f, +-0.16005f,0.987102f,-0.00365841f, +-0.307005f,0.947659f,0.0876954f, +-0.490256f,0.846833f,0.206209f, +-0.400386f,0.879926f,0.255778f, +-0.427515f,0.880624f,0.204282f, +-0.477897f,0.856347f,0.195663f, +-0.43217f,0.864768f,0.255745f, +-0.342474f,0.92438f,0.16803f, +-0.284468f,0.956998f,0.0568588f, +-0.290121f,0.956708f,0.023234f, +-0.249156f,0.966838f,0.0560771f, +-0.0655515f,0.986836f,0.147842f, +-0.100568f,0.984251f,0.145384f, +-0.0191778f,0.985445f,0.168911f, +-0.0443403f,0.97787f,0.204462f, +-0.28653f,0.957033f,-0.044587f, +-0.127864f,0.901634f,-0.413166f, +-0.0930849f,0.861283f,-0.499526f, +-0.10032f,0.791759f,-0.60254f, +0.277857f,0.863349f,-0.421218f, +0.0733471f,0.944573f,-0.320003f, +0.0656198f,0.995434f,-0.0693225f, +0.0994234f,0.993172f,-0.0610351f, +0.0758799f,0.991718f,0.103618f, +0.0755546f,0.978148f,0.193698f, +0.318521f,0.931105f,0.177731f, +0.532035f,0.846717f,0.00302226f, +0.479952f,0.801468f,-0.356785f, +0.444207f,0.753204f,-0.485143f, +0.599635f,0.661874f,-0.449845f, +0.467802f,0.782561f,-0.410805f, +0.194572f,0.899472f,-0.391269f, +0.334078f,0.938895f,-0.0828733f, +0.236858f,0.971355f,0.0191963f, +0.177255f,0.983392f,0.0389945f, +0.22691f,0.973661f,-0.0222777f, +0.408661f,0.912593f,0.013075f, +0.394434f,0.908333f,0.139114f, +0.34039f,0.913901f,0.221176f, +0.340162f,0.904445f,0.257428f, +0.21637f,0.954077f,0.207173f, +-0.190356f,0.960699f,0.202044f, +-0.0745122f,0.978557f,0.192026f, +-0.0103556f,0.997337f,0.0721953f, +-0.102208f,0.994222f,-0.0328074f, +0.0538732f,0.998534f,0.00527007f, +0.220064f,0.97523f,-0.0223306f, +0.22889f,0.972208f,-0.0492086f, +0.203387f,0.976813f,-0.0668524f, +0.112155f,0.987122f,-0.114071f, +0.137033f,0.989998f,-0.0335468f, +0.125928f,0.990544f,-0.0544465f, +0.164164f,0.983484f,-0.0762248f, +0.056178f,0.987899f,-0.14457f, +-0.125491f,0.977887f,-0.167299f, +-0.0763702f,0.993552f,-0.0837951f, +-0.140516f,0.986451f,-0.0846751f, +-0.138825f,0.988035f,-0.0671838f, +0.0272382f,0.998662f,0.0439583f, +0.051406f,0.998673f,0.00322772f, +0.0131796f,0.996364f,-0.0841692f, +-0.197723f,0.973335f,-0.116299f, +-0.315939f,0.94482f,-0.0865842f, +-0.273936f,0.961179f,-0.0330844f, +-0.278588f,0.957771f,-0.0711653f, +-0.371629f,0.922753f,0.102078f, +-0.589295f,0.797687f,0.128167f, +-0.394808f,0.893641f,0.213383f, +-0.419749f,0.89327f,0.160869f, +-0.503386f,0.848953f,0.160878f, +-0.392151f,0.910681f,0.129912f, +-0.194389f,0.97789f,0.0771005f, +-0.210697f,0.97754f,0.00473511f, +-0.261758f,0.965059f,0.0120029f, +-0.306606f,0.951531f,-0.0240962f, +-0.191391f,0.98062f,0.0418887f, +-0.0805366f,0.9875f,0.135492f, +-0.0197042f,0.996843f,0.0769187f, +-0.0102082f,0.996001f,0.0887568f, +-0.106967f,0.993499f,0.0389638f, +-0.0299932f,0.997488f,-0.0641764f, +0.166392f,0.98551f,-0.0329295f, +0.122834f,0.919366f,-0.373736f, +0.0989442f,0.860803f,-0.499228f, +-0.16483f,0.786842f,-0.594736f, +-0.139994f,0.854441f,-0.500331f, +0.037386f,0.884593f,-0.464864f, +-0.0340706f,0.910599f,-0.411885f, +0.0643546f,0.934103f,-0.351155f, +0.330549f,0.864687f,-0.378225f, +0.61879f,0.706641f,-0.343158f, +0.664468f,0.668218f,-0.334614f, +0.535603f,0.737564f,-0.411252f, +0.392926f,0.807647f,-0.439677f, +0.299634f,0.936543f,-0.181953f, +0.20385f,0.978529f,-0.030423f, +0.255219f,0.962099f,-0.0960637f, +0.218057f,0.97044f,-0.103423f, +0.152183f,0.981776f,-0.113823f, +0.287579f,0.953452f,-0.0907011f, +0.354102f,0.933846f,-0.0504376f, +0.271766f,0.955964f,0.110796f, +0.254566f,0.942907f,0.214762f, +0.330431f,0.909031f,0.253925f, +0.276649f,0.934017f,0.226003f, +-0.276078f,0.960525f,0.0342386f, +-0.126608f,0.988039f,0.088024f, +-0.0433883f,0.982429f,0.181523f, +-0.0351658f,0.95918f,0.280603f, +0.130316f,0.978179f,0.161815f, +0.34012f,0.939563f,0.0392436f, +0.225269f,0.971719f,-0.0708295f, +0.186144f,0.981343f,-0.0481244f, +0.117145f,0.991402f,-0.0582961f, +0.122374f,0.988553f,-0.0882497f, +0.217284f,0.968092f,-0.124844f, +0.168939f,0.967628f,-0.1875f, +0.0966952f,0.983818f,-0.150838f, +-0.108071f,0.971789f,-0.209635f, +-0.167419f,0.956466f,-0.239047f, +-0.15925f,0.972646f,-0.169115f, +-0.169755f,0.972705f,-0.158205f, +0.0352685f,0.991682f,-0.123784f, +0.0984439f,0.980655f,-0.169186f, +0.0318934f,0.989724f,-0.139387f, +-0.246309f,0.963763f,-0.102435f, +-0.355567f,0.934631f,-0.00599911f, +-0.265814f,0.963735f,-0.0236194f, +-0.351588f,0.935043f,-0.0456126f, +-0.494494f,0.858936f,0.133056f, +-0.559402f,0.824266f,0.0874941f, +-0.405326f,0.914016f,0.0169127f, +-0.376559f,0.926338f,0.010028f, +-0.448864f,0.890609f,-0.0730511f, +-0.3487f,0.913403f,-0.210007f, +-0.225518f,0.948441f,-0.222713f, +-0.278172f,0.957801f,-0.0723737f, +-0.296428f,0.947861f,0.117f, +-0.260326f,0.954501f,0.14546f, +-0.208806f,0.976306f,0.0568064f, +-0.0937503f,0.995595f,-0.00141652f, +0.0211825f,0.998587f,-0.0487327f, +-0.0203898f,0.998016f,-0.0595622f, +-0.117256f,0.992273f,-0.0405676f, +0.0346735f,0.999272f,0.0158994f, +0.165596f,0.985653f,-0.0326431f, +0.277068f,0.959929f,-0.0420538f, +0.211278f,0.971116f,-0.110882f, +0.138826f,0.972226f,-0.188423f, +0.0186164f,0.920791f,-0.389612f, +0.00693313f,0.891348f,-0.453267f, +-0.0471378f,0.869656f,-0.491403f, +0.135484f,0.84445f,-0.518217f, +0.351566f,0.784405f,-0.510988f, +0.399468f,0.772299f,-0.493943f, +0.574953f,0.790421f,-0.211338f, +0.577809f,0.813449f,-0.0666111f, +0.451377f,0.892327f,0.00336233f, +0.237932f,0.970883f,-0.0278435f, +0.170635f,0.975266f,-0.140498f, +0.305065f,0.94416f,-0.124487f, +0.219111f,0.958291f,-0.183492f, +0.160317f,0.981326f,-0.106286f, +0.222178f,0.974771f,-0.021419f, +0.23168f,0.971792f,0.0441002f, +0.140177f,0.984507f,0.105338f, +0.184383f,0.966339f,0.179422f, +0.307531f,0.911743f,0.272303f, +0.342083f,0.879118f,0.331859f, +-0.245266f,0.968917f,0.0323163f, +-0.176433f,0.984311f,-0.00156667f, +-0.164847f,0.983548f,0.0738887f, +-0.0271087f,0.959686f,0.279762f, +0.210185f,0.960158f,0.18417f, +0.386525f,0.917795f,0.0908302f, +0.288585f,0.956426f,0.04436f, +0.157424f,0.986731f,-0.0397454f, +0.194229f,0.980956f,0.000793421f, +0.143953f,0.978f,-0.150974f, +0.243865f,0.955091f,-0.168319f, +0.151307f,0.968911f,-0.195749f, +0.0861511f,0.987302f,-0.133462f, +-0.0343302f,0.988258f,-0.148887f, +-0.149683f,0.954065f,-0.259529f, +-0.180054f,0.943807f,-0.277143f, +-0.182632f,0.946912f,-0.26458f, +0.0250152f,0.97257f,-0.23126f, +0.0655433f,0.96826f,-0.241197f, +0.00940225f,0.990707f,-0.135685f, +-0.313822f,0.94168f,-0.121471f, +-0.325919f,0.940955f,0.0915474f, +-0.245857f,0.968763f,-0.0324418f, +-0.38384f,0.920444f,-0.0738245f, +-0.542624f,0.834584f,0.0950211f, +-0.496894f,0.865347f,0.0653522f, +-0.40471f,0.910862f,-0.0808731f, +-0.336326f,0.940002f,-0.0572751f, +-0.384947f,0.90765f,-0.167296f, +-0.26052f,0.919475f,-0.294439f, +-0.278076f,0.879766f,-0.385599f, +-0.415096f,0.880667f,-0.2283f, +-0.411169f,0.907675f,0.0840562f, +-0.22106f,0.940981f,0.256296f, +-0.105371f,0.978797f,0.175653f, +-0.0100537f,0.999811f,0.0166273f, +0.0459065f,0.991326f,-0.123151f, +-0.0151969f,0.991011f,-0.132912f, +-0.164041f,0.976761f,-0.137947f, +0.00793599f,0.998771f,-0.0489272f, +0.178958f,0.98335f,-0.031577f, +0.314466f,0.949045f,-0.0206086f, +0.240757f,0.963062f,-0.120617f, +0.126531f,0.982046f,-0.139911f, +0.0695074f,0.9956f,-0.062839f, +0.0427419f,0.998852f,-0.02164f, +-0.0292495f,0.993565f,-0.109419f, +0.176081f,0.974549f,-0.138744f, +0.405406f,0.900659f,-0.156393f, +0.48202f,0.865956f,-0.133334f, +0.477566f,0.852664f,-0.211881f, +0.526274f,0.839922f,-0.132537f, +0.390331f,0.920621f,-0.0098857f, +0.349443f,0.931118f,0.104442f, +0.205374f,0.96487f,-0.163851f, +0.359411f,0.921384f,-0.147904f, +0.161592f,0.938137f,-0.306246f, +0.0124614f,0.982178f,-0.187542f, +0.143914f,0.986786f,0.0744463f, +0.270333f,0.949018f,0.162126f, +0.132f,0.991194f,0.0105184f, +0.131712f,0.991267f,0.00644011f, +0.199003f,0.974024f,0.108048f, +0.274163f,0.928953f,0.248757f, +}; + +btScalar Landscape01Tex[] = { +0.507813f,0.0078125f, +0.507813f,0.0f, +0.515625f,0.0078125f, +0.515625f,0.0f, +0.523438f,0.0078125f, +0.523438f,0.0f, +0.53125f,0.0078125f, +0.53125f,0.0f, +0.539063f,0.0078125f, +0.539063f,0.0f, +0.546875f,0.0078125f, +0.546875f,0.0f, +0.554688f,0.0078125f, +0.554688f,0.0f, +0.5625f,0.0078125f, +0.5625f,0.0f, +0.570313f,0.0078125f, +0.570313f,0.0f, +0.578125f,0.0078125f, +0.578125f,0.0f, +0.585938f,0.0078125f, +0.585938f,0.0f, +0.59375f,0.0078125f, +0.59375f,0.0f, +0.601563f,0.0078125f, +0.601563f,0.0f, +0.609375f,0.0078125f, +0.609375f,0.0f, +0.617188f,0.0078125f, +0.617188f,0.0f, +0.625f,0.0078125f, +0.625f,0.0f, +0.632813f,0.0078125f, +0.632813f,0.0f, +0.640625f,0.0078125f, +0.640625f,0.0f, +0.648438f,0.0078125f, +0.648438f,0.0f, +0.65625f,0.0078125f, +0.65625f,0.0f, +0.664063f,0.0078125f, +0.664063f,0.0f, +0.671875f,0.0078125f, +0.671875f,0.0f, +0.679688f,0.0078125f, +0.679688f,0.0f, +0.6875f,0.0078125f, +0.6875f,0.0f, +0.695313f,0.0078125f, +0.695313f,0.0f, +0.703125f,0.0078125f, +0.703125f,0.0f, +0.710938f,0.0078125f, +0.710938f,0.0f, +0.71875f,0.0078125f, +0.71875f,0.0f, +0.726563f,0.0078125f, +0.726563f,0.0f, +0.734375f,0.0078125f, +0.734375f,0.0f, +0.742188f,0.0078125f, +0.742188f,0.0f, +0.75f,0.0078125f, +0.75f,0.0f, +0.757813f,0.0078125f, +0.757813f,0.0f, +0.765625f,0.0078125f, +0.765625f,0.0f, +0.773438f,0.0078125f, +0.773438f,0.0f, +0.78125f,0.0078125f, +0.78125f,0.0f, +0.789063f,0.0078125f, +0.789063f,0.0f, +0.796875f,0.0078125f, +0.796875f,0.0f, +0.804688f,0.0078125f, +0.804688f,0.0f, +0.8125f,0.0078125f, +0.8125f,0.0f, +0.820313f,0.0078125f, +0.820313f,0.0f, +0.828125f,0.0078125f, +0.828125f,0.0f, +0.835938f,0.0078125f, +0.835938f,0.0f, +0.84375f,0.0078125f, +0.84375f,0.0f, +0.851563f,0.0078125f, +0.851563f,0.0f, +0.859375f,0.0078125f, +0.859375f,0.0f, +0.867188f,0.0078125f, +0.867188f,0.0f, +0.875f,0.0078125f, +0.875f,0.0f, +0.882813f,0.0078125f, +0.882813f,0.0f, +0.890625f,0.0078125f, +0.890625f,0.0f, +0.898438f,0.0078125f, +0.898438f,0.0f, +0.90625f,0.0078125f, +0.90625f,0.0f, +0.914063f,0.0078125f, +0.914063f,0.0f, +0.921875f,0.0078125f, +0.921875f,0.0f, +0.929688f,0.0078125f, +0.929688f,0.0f, +0.9375f,0.0078125f, +0.9375f,0.0f, +0.945313f,0.0078125f, +0.945313f,0.0f, +0.953125f,0.0078125f, +0.953125f,0.0f, +0.960938f,0.0078125f, +0.960938f,0.0f, +0.96875f,0.0078125f, +0.96875f,0.0f, +0.976563f,0.0078125f, +0.976563f,0.0f, +0.984375f,0.0078125f, +0.984375f,0.0f, +0.992188f,0.0078125f, +0.992188f,0.0f, +1.0f,0.0078125f, +1.0f,0.0f, +0.507813f,0.015625f, +0.515625f,0.015625f, +0.523438f,0.015625f, +0.53125f,0.015625f, +0.539063f,0.015625f, +0.546875f,0.015625f, +0.554688f,0.015625f, +0.5625f,0.015625f, +0.570313f,0.015625f, +0.578125f,0.015625f, +0.585938f,0.015625f, +0.59375f,0.015625f, +0.601563f,0.015625f, +0.609375f,0.015625f, +0.617188f,0.015625f, +0.625f,0.015625f, +0.632813f,0.015625f, +0.640625f,0.015625f, +0.648438f,0.015625f, +0.65625f,0.015625f, +0.664063f,0.015625f, +0.671875f,0.015625f, +0.679688f,0.015625f, +0.6875f,0.015625f, +0.695313f,0.015625f, +0.703125f,0.015625f, +0.710938f,0.015625f, +0.71875f,0.015625f, +0.726563f,0.015625f, +0.734375f,0.015625f, +0.742188f,0.015625f, +0.75f,0.015625f, +0.757813f,0.015625f, +0.765625f,0.015625f, +0.773438f,0.015625f, +0.78125f,0.015625f, +0.789063f,0.015625f, +0.796875f,0.015625f, +0.804688f,0.015625f, +0.8125f,0.015625f, +0.820313f,0.015625f, +0.828125f,0.015625f, +0.835938f,0.015625f, +0.84375f,0.015625f, +0.851563f,0.015625f, +0.859375f,0.015625f, +0.867188f,0.015625f, +0.875f,0.015625f, +0.882813f,0.015625f, +0.890625f,0.015625f, +0.898438f,0.015625f, +0.90625f,0.015625f, +0.914063f,0.015625f, +0.921875f,0.015625f, +0.929688f,0.015625f, +0.9375f,0.015625f, +0.945313f,0.015625f, +0.953125f,0.015625f, +0.960938f,0.015625f, +0.96875f,0.015625f, +0.976563f,0.015625f, +0.984375f,0.015625f, +0.992188f,0.015625f, +1.0f,0.015625f, +0.507813f,0.0234375f, +0.515625f,0.0234375f, +0.523438f,0.0234375f, +0.53125f,0.0234375f, +0.539063f,0.0234375f, +0.546875f,0.0234375f, +0.554688f,0.0234375f, +0.5625f,0.0234375f, +0.570313f,0.0234375f, +0.578125f,0.0234375f, +0.585938f,0.0234375f, +0.59375f,0.0234375f, +0.601563f,0.0234375f, +0.609375f,0.0234375f, +0.617188f,0.0234375f, +0.625f,0.0234375f, +0.632813f,0.0234375f, +0.640625f,0.0234375f, +0.648438f,0.0234375f, +0.65625f,0.0234375f, +0.664063f,0.0234375f, +0.671875f,0.0234375f, +0.679688f,0.0234375f, +0.6875f,0.0234375f, +0.695313f,0.0234375f, +0.703125f,0.0234375f, +0.710938f,0.0234375f, +0.71875f,0.0234375f, +0.726563f,0.0234375f, +0.734375f,0.0234375f, +0.742188f,0.0234375f, +0.75f,0.0234375f, +0.757813f,0.0234375f, +0.765625f,0.0234375f, +0.773438f,0.0234375f, +0.78125f,0.0234375f, +0.789063f,0.0234375f, +0.796875f,0.0234375f, +0.804688f,0.0234375f, +0.8125f,0.0234375f, +0.820313f,0.0234375f, +0.828125f,0.0234375f, +0.835938f,0.0234375f, +0.84375f,0.0234375f, +0.851563f,0.0234375f, +0.859375f,0.0234375f, +0.867188f,0.0234375f, +0.875f,0.0234375f, +0.882813f,0.0234375f, +0.890625f,0.0234375f, +0.898438f,0.0234375f, +0.90625f,0.0234375f, +0.914063f,0.0234375f, +0.921875f,0.0234375f, +0.929688f,0.0234375f, +0.9375f,0.0234375f, +0.945313f,0.0234375f, +0.953125f,0.0234375f, +0.960938f,0.0234375f, +0.96875f,0.0234375f, +0.976563f,0.0234375f, +0.984375f,0.0234375f, +0.992188f,0.0234375f, +1.0f,0.0234375f, +0.507813f,0.03125f, +0.515625f,0.03125f, +0.523438f,0.03125f, +0.53125f,0.03125f, +0.539063f,0.03125f, +0.546875f,0.03125f, +0.554688f,0.03125f, +0.5625f,0.03125f, +0.570313f,0.03125f, +0.578125f,0.03125f, +0.585938f,0.03125f, +0.59375f,0.03125f, +0.601563f,0.03125f, +0.609375f,0.03125f, +0.617188f,0.03125f, +0.625f,0.03125f, +0.632813f,0.03125f, +0.640625f,0.03125f, +0.648438f,0.03125f, +0.65625f,0.03125f, +0.664063f,0.03125f, +0.671875f,0.03125f, +0.679688f,0.03125f, +0.6875f,0.03125f, +0.695313f,0.03125f, +0.703125f,0.03125f, +0.710938f,0.03125f, +0.71875f,0.03125f, +0.726563f,0.03125f, +0.734375f,0.03125f, +0.742188f,0.03125f, +0.75f,0.03125f, +0.757813f,0.03125f, +0.765625f,0.03125f, +0.773438f,0.03125f, +0.78125f,0.03125f, +0.789063f,0.03125f, +0.796875f,0.03125f, +0.804688f,0.03125f, +0.8125f,0.03125f, +0.820313f,0.03125f, +0.828125f,0.03125f, +0.835938f,0.03125f, +0.84375f,0.03125f, +0.851563f,0.03125f, +0.859375f,0.03125f, +0.867188f,0.03125f, +0.875f,0.03125f, +0.882813f,0.03125f, +0.890625f,0.03125f, +0.898438f,0.03125f, +0.90625f,0.03125f, +0.914063f,0.03125f, +0.921875f,0.03125f, +0.929688f,0.03125f, +0.9375f,0.03125f, +0.945313f,0.03125f, +0.953125f,0.03125f, +0.960938f,0.03125f, +0.96875f,0.03125f, +0.976563f,0.03125f, +0.984375f,0.03125f, +0.992188f,0.03125f, +1.0f,0.03125f, +0.507813f,0.0390625f, +0.515625f,0.0390625f, +0.523438f,0.0390625f, +0.53125f,0.0390625f, +0.539063f,0.0390625f, +0.546875f,0.0390625f, +0.554688f,0.0390625f, +0.5625f,0.0390625f, +0.570313f,0.0390625f, +0.578125f,0.0390625f, +0.585938f,0.0390625f, +0.59375f,0.0390625f, +0.601563f,0.0390625f, +0.609375f,0.0390625f, +0.617188f,0.0390625f, +0.625f,0.0390625f, +0.632813f,0.0390625f, +0.640625f,0.0390625f, +0.648438f,0.0390625f, +0.65625f,0.0390625f, +0.664063f,0.0390625f, +0.671875f,0.0390625f, +0.679688f,0.0390625f, +0.6875f,0.0390625f, +0.695313f,0.0390625f, +0.703125f,0.0390625f, +0.710938f,0.0390625f, +0.71875f,0.0390625f, +0.726563f,0.0390625f, +0.734375f,0.0390625f, +0.742188f,0.0390625f, +0.75f,0.0390625f, +0.757813f,0.0390625f, +0.765625f,0.0390625f, +0.773438f,0.0390625f, +0.78125f,0.0390625f, +0.789063f,0.0390625f, +0.796875f,0.0390625f, +0.804688f,0.0390625f, +0.8125f,0.0390625f, +0.820313f,0.0390625f, +0.828125f,0.0390625f, +0.835938f,0.0390625f, +0.84375f,0.0390625f, +0.851563f,0.0390625f, +0.859375f,0.0390625f, +0.867188f,0.0390625f, +0.875f,0.0390625f, +0.882813f,0.0390625f, +0.890625f,0.0390625f, +0.898438f,0.0390625f, +0.90625f,0.0390625f, +0.914063f,0.0390625f, +0.921875f,0.0390625f, +0.929688f,0.0390625f, +0.9375f,0.0390625f, +0.945313f,0.0390625f, +0.953125f,0.0390625f, +0.960938f,0.0390625f, +0.96875f,0.0390625f, +0.976563f,0.0390625f, +0.984375f,0.0390625f, +0.992188f,0.0390625f, +1.0f,0.0390625f, +0.507813f,0.046875f, +0.515625f,0.046875f, +0.523438f,0.046875f, +0.53125f,0.046875f, +0.539063f,0.046875f, +0.546875f,0.046875f, +0.554688f,0.046875f, +0.5625f,0.046875f, +0.570313f,0.046875f, +0.578125f,0.046875f, +0.585938f,0.046875f, +0.59375f,0.046875f, +0.601563f,0.046875f, +0.609375f,0.046875f, +0.617188f,0.046875f, +0.625f,0.046875f, +0.632813f,0.046875f, +0.640625f,0.046875f, +0.648438f,0.046875f, +0.65625f,0.046875f, +0.664063f,0.046875f, +0.671875f,0.046875f, +0.679688f,0.046875f, +0.6875f,0.046875f, +0.695313f,0.046875f, +0.703125f,0.046875f, +0.710938f,0.046875f, +0.71875f,0.046875f, +0.726563f,0.046875f, +0.734375f,0.046875f, +0.742188f,0.046875f, +0.75f,0.046875f, +0.757813f,0.046875f, +0.765625f,0.046875f, +0.773438f,0.046875f, +0.78125f,0.046875f, +0.789063f,0.046875f, +0.796875f,0.046875f, +0.804688f,0.046875f, +0.8125f,0.046875f, +0.820313f,0.046875f, +0.828125f,0.046875f, +0.835938f,0.046875f, +0.84375f,0.046875f, +0.851563f,0.046875f, +0.859375f,0.046875f, +0.867188f,0.046875f, +0.875f,0.046875f, +0.882813f,0.046875f, +0.890625f,0.046875f, +0.898438f,0.046875f, +0.90625f,0.046875f, +0.914063f,0.046875f, +0.921875f,0.046875f, +0.929688f,0.046875f, +0.9375f,0.046875f, +0.945313f,0.046875f, +0.953125f,0.046875f, +0.960938f,0.046875f, +0.96875f,0.046875f, +0.976563f,0.046875f, +0.984375f,0.046875f, +0.992188f,0.046875f, +1.0f,0.046875f, +0.507813f,0.0546875f, +0.515625f,0.0546875f, +0.523438f,0.0546875f, +0.53125f,0.0546875f, +0.539063f,0.0546875f, +0.546875f,0.0546875f, +0.554688f,0.0546875f, +0.5625f,0.0546875f, +0.570313f,0.0546875f, +0.578125f,0.0546875f, +0.585938f,0.0546875f, +0.59375f,0.0546875f, +0.601563f,0.0546875f, +0.609375f,0.0546875f, +0.617188f,0.0546875f, +0.625f,0.0546875f, +0.632813f,0.0546875f, +0.640625f,0.0546875f, +0.648438f,0.0546875f, +0.65625f,0.0546875f, +0.664063f,0.0546875f, +0.671875f,0.0546875f, +0.679688f,0.0546875f, +0.6875f,0.0546875f, +0.695313f,0.0546875f, +0.703125f,0.0546875f, +0.710938f,0.0546875f, +0.71875f,0.0546875f, +0.726563f,0.0546875f, +0.734375f,0.0546875f, +0.742188f,0.0546875f, +0.75f,0.0546875f, +0.757813f,0.0546875f, +0.765625f,0.0546875f, +0.773438f,0.0546875f, +0.78125f,0.0546875f, +0.789063f,0.0546875f, +0.796875f,0.0546875f, +0.804688f,0.0546875f, +0.8125f,0.0546875f, +0.820313f,0.0546875f, +0.828125f,0.0546875f, +0.835938f,0.0546875f, +0.84375f,0.0546875f, +0.851563f,0.0546875f, +0.859375f,0.0546875f, +0.867188f,0.0546875f, +0.875f,0.0546875f, +0.882813f,0.0546875f, +0.890625f,0.0546875f, +0.898438f,0.0546875f, +0.90625f,0.0546875f, +0.914063f,0.0546875f, +0.921875f,0.0546875f, +0.929688f,0.0546875f, +0.9375f,0.0546875f, +0.945313f,0.0546875f, +0.953125f,0.0546875f, +0.960938f,0.0546875f, +0.96875f,0.0546875f, +0.976563f,0.0546875f, +0.984375f,0.0546875f, +0.992188f,0.0546875f, +1.0f,0.0546875f, +0.507813f,0.0625f, +0.515625f,0.0625f, +0.523438f,0.0625f, +0.53125f,0.0625f, +0.539063f,0.0625f, +0.546875f,0.0625f, +0.554688f,0.0625f, +0.5625f,0.0625f, +0.570313f,0.0625f, +0.578125f,0.0625f, +0.585938f,0.0625f, +0.59375f,0.0625f, +0.601563f,0.0625f, +0.609375f,0.0625f, +0.617188f,0.0625f, +0.625f,0.0625f, +0.632813f,0.0625f, +0.640625f,0.0625f, +0.648438f,0.0625f, +0.65625f,0.0625f, +0.664063f,0.0625f, +0.671875f,0.0625f, +0.679688f,0.0625f, +0.6875f,0.0625f, +0.695313f,0.0625f, +0.703125f,0.0625f, +0.710938f,0.0625f, +0.71875f,0.0625f, +0.726563f,0.0625f, +0.734375f,0.0625f, +0.742188f,0.0625f, +0.75f,0.0625f, +0.757813f,0.0625f, +0.765625f,0.0625f, +0.773438f,0.0625f, +0.78125f,0.0625f, +0.789063f,0.0625f, +0.796875f,0.0625f, +0.804688f,0.0625f, +0.8125f,0.0625f, +0.820313f,0.0625f, +0.828125f,0.0625f, +0.835938f,0.0625f, +0.84375f,0.0625f, +0.851563f,0.0625f, +0.859375f,0.0625f, +0.867188f,0.0625f, +0.875f,0.0625f, +0.882813f,0.0625f, +0.890625f,0.0625f, +0.898438f,0.0625f, +0.90625f,0.0625f, +0.914063f,0.0625f, +0.921875f,0.0625f, +0.929688f,0.0625f, +0.9375f,0.0625f, +0.945313f,0.0625f, +0.953125f,0.0625f, +0.960938f,0.0625f, +0.96875f,0.0625f, +0.976563f,0.0625f, +0.984375f,0.0625f, +0.992188f,0.0625f, +1.0f,0.0625f, +0.507813f,0.0703125f, +0.515625f,0.0703125f, +0.523438f,0.0703125f, +0.53125f,0.0703125f, +0.539063f,0.0703125f, +0.546875f,0.0703125f, +0.554688f,0.0703125f, +0.5625f,0.0703125f, +0.570313f,0.0703125f, +0.578125f,0.0703125f, +0.585938f,0.0703125f, +0.59375f,0.0703125f, +0.601563f,0.0703125f, +0.609375f,0.0703125f, +0.617188f,0.0703125f, +0.625f,0.0703125f, +0.632813f,0.0703125f, +0.640625f,0.0703125f, +0.648438f,0.0703125f, +0.65625f,0.0703125f, +0.664063f,0.0703125f, +0.671875f,0.0703125f, +0.679688f,0.0703125f, +0.6875f,0.0703125f, +0.695313f,0.0703125f, +0.703125f,0.0703125f, +0.710938f,0.0703125f, +0.71875f,0.0703125f, +0.726563f,0.0703125f, +0.734375f,0.0703125f, +0.742188f,0.0703125f, +0.75f,0.0703125f, +0.757813f,0.0703125f, +0.765625f,0.0703125f, +0.773438f,0.0703125f, +0.78125f,0.0703125f, +0.789063f,0.0703125f, +0.796875f,0.0703125f, +0.804688f,0.0703125f, +0.8125f,0.0703125f, +0.820313f,0.0703125f, +0.828125f,0.0703125f, +0.835938f,0.0703125f, +0.84375f,0.0703125f, +0.851563f,0.0703125f, +0.859375f,0.0703125f, +0.867188f,0.0703125f, +0.875f,0.0703125f, +0.882813f,0.0703125f, +0.890625f,0.0703125f, +0.898438f,0.0703125f, +0.90625f,0.0703125f, +0.914063f,0.0703125f, +0.921875f,0.0703125f, +0.929688f,0.0703125f, +0.9375f,0.0703125f, +0.945313f,0.0703125f, +0.953125f,0.0703125f, +0.960938f,0.0703125f, +0.96875f,0.0703125f, +0.976563f,0.0703125f, +0.984375f,0.0703125f, +0.992188f,0.0703125f, +1.0f,0.0703125f, +0.507813f,0.078125f, +0.515625f,0.078125f, +0.523438f,0.078125f, +0.53125f,0.078125f, +0.539063f,0.078125f, +0.546875f,0.078125f, +0.554688f,0.078125f, +0.5625f,0.078125f, +0.570313f,0.078125f, +0.578125f,0.078125f, +0.585938f,0.078125f, +0.59375f,0.078125f, +0.601563f,0.078125f, +0.609375f,0.078125f, +0.617188f,0.078125f, +0.625f,0.078125f, +0.632813f,0.078125f, +0.640625f,0.078125f, +0.648438f,0.078125f, +0.65625f,0.078125f, +0.664063f,0.078125f, +0.671875f,0.078125f, +0.679688f,0.078125f, +0.6875f,0.078125f, +0.695313f,0.078125f, +0.703125f,0.078125f, +0.710938f,0.078125f, +0.71875f,0.078125f, +0.726563f,0.078125f, +0.734375f,0.078125f, +0.742188f,0.078125f, +0.75f,0.078125f, +0.757813f,0.078125f, +0.765625f,0.078125f, +0.773438f,0.078125f, +0.78125f,0.078125f, +0.789063f,0.078125f, +0.796875f,0.078125f, +0.804688f,0.078125f, +0.8125f,0.078125f, +0.820313f,0.078125f, +0.828125f,0.078125f, +0.835938f,0.078125f, +0.84375f,0.078125f, +0.851563f,0.078125f, +0.859375f,0.078125f, +0.867188f,0.078125f, +0.875f,0.078125f, +0.882813f,0.078125f, +0.890625f,0.078125f, +0.898438f,0.078125f, +0.90625f,0.078125f, +0.914063f,0.078125f, +0.921875f,0.078125f, +0.929688f,0.078125f, +0.9375f,0.078125f, +0.945313f,0.078125f, +0.953125f,0.078125f, +0.960938f,0.078125f, +0.96875f,0.078125f, +0.976563f,0.078125f, +0.984375f,0.078125f, +0.992188f,0.078125f, +1.0f,0.078125f, +0.507813f,0.0859375f, +0.515625f,0.0859375f, +0.523438f,0.0859375f, +0.53125f,0.0859375f, +0.539063f,0.0859375f, +0.546875f,0.0859375f, +0.554688f,0.0859375f, +0.5625f,0.0859375f, +0.570313f,0.0859375f, +0.578125f,0.0859375f, +0.585938f,0.0859375f, +0.59375f,0.0859375f, +0.601563f,0.0859375f, +0.609375f,0.0859375f, +0.617188f,0.0859375f, +0.625f,0.0859375f, +0.632813f,0.0859375f, +0.640625f,0.0859375f, +0.648438f,0.0859375f, +0.65625f,0.0859375f, +0.664063f,0.0859375f, +0.671875f,0.0859375f, +0.679688f,0.0859375f, +0.6875f,0.0859375f, +0.695313f,0.0859375f, +0.703125f,0.0859375f, +0.710938f,0.0859375f, +0.71875f,0.0859375f, +0.726563f,0.0859375f, +0.734375f,0.0859375f, +0.742188f,0.0859375f, +0.75f,0.0859375f, +0.757813f,0.0859375f, +0.765625f,0.0859375f, +0.773438f,0.0859375f, +0.78125f,0.0859375f, +0.789063f,0.0859375f, +0.796875f,0.0859375f, +0.804688f,0.0859375f, +0.8125f,0.0859375f, +0.820313f,0.0859375f, +0.828125f,0.0859375f, +0.835938f,0.0859375f, +0.84375f,0.0859375f, +0.851563f,0.0859375f, +0.859375f,0.0859375f, +0.867188f,0.0859375f, +0.875f,0.0859375f, +0.882813f,0.0859375f, +0.890625f,0.0859375f, +0.898438f,0.0859375f, +0.90625f,0.0859375f, +0.914063f,0.0859375f, +0.921875f,0.0859375f, +0.929688f,0.0859375f, +0.9375f,0.0859375f, +0.945313f,0.0859375f, +0.953125f,0.0859375f, +0.960938f,0.0859375f, +0.96875f,0.0859375f, +0.976563f,0.0859375f, +0.984375f,0.0859375f, +0.992188f,0.0859375f, +1.0f,0.0859375f, +0.507813f,0.09375f, +0.515625f,0.09375f, +0.523438f,0.09375f, +0.53125f,0.09375f, +0.539063f,0.09375f, +0.546875f,0.09375f, +0.554688f,0.09375f, +0.5625f,0.09375f, +0.570313f,0.09375f, +0.578125f,0.09375f, +0.585938f,0.09375f, +0.59375f,0.09375f, +0.601563f,0.09375f, +0.609375f,0.09375f, +0.617188f,0.09375f, +0.625f,0.09375f, +0.632813f,0.09375f, +0.640625f,0.09375f, +0.648438f,0.09375f, +0.65625f,0.09375f, +0.664063f,0.09375f, +0.671875f,0.09375f, +0.679688f,0.09375f, +0.6875f,0.09375f, +0.695313f,0.09375f, +0.703125f,0.09375f, +0.710938f,0.09375f, +0.71875f,0.09375f, +0.726563f,0.09375f, +0.734375f,0.09375f, +0.742188f,0.09375f, +0.75f,0.09375f, +0.757813f,0.09375f, +0.765625f,0.09375f, +0.773438f,0.09375f, +0.78125f,0.09375f, +0.789063f,0.09375f, +0.796875f,0.09375f, +0.804688f,0.09375f, +0.8125f,0.09375f, +0.820313f,0.09375f, +0.828125f,0.09375f, +0.835938f,0.09375f, +0.84375f,0.09375f, +0.851563f,0.09375f, +0.859375f,0.09375f, +0.867188f,0.09375f, +0.875f,0.09375f, +0.882813f,0.09375f, +0.890625f,0.09375f, +0.898438f,0.09375f, +0.90625f,0.09375f, +0.914063f,0.09375f, +0.921875f,0.09375f, +0.929688f,0.09375f, +0.9375f,0.09375f, +0.945313f,0.09375f, +0.953125f,0.09375f, +0.960938f,0.09375f, +0.96875f,0.09375f, +0.976563f,0.09375f, +0.984375f,0.09375f, +0.992188f,0.09375f, +1.0f,0.09375f, +0.507813f,0.101563f, +0.515625f,0.101563f, +0.523438f,0.101563f, +0.53125f,0.101563f, +0.539063f,0.101563f, +0.546875f,0.101563f, +0.554688f,0.101563f, +0.5625f,0.101563f, +0.570313f,0.101563f, +0.578125f,0.101563f, +0.585938f,0.101563f, +0.59375f,0.101563f, +0.601563f,0.101563f, +0.609375f,0.101563f, +0.617188f,0.101563f, +0.625f,0.101563f, +0.632813f,0.101563f, +0.640625f,0.101563f, +0.648438f,0.101563f, +0.65625f,0.101563f, +0.664063f,0.101563f, +0.671875f,0.101563f, +0.679688f,0.101563f, +0.6875f,0.101563f, +0.695313f,0.101563f, +0.703125f,0.101563f, +0.710938f,0.101563f, +0.71875f,0.101563f, +0.726563f,0.101563f, +0.734375f,0.101563f, +0.742188f,0.101563f, +0.75f,0.101563f, +0.757813f,0.101563f, +0.765625f,0.101563f, +0.773438f,0.101563f, +0.78125f,0.101563f, +0.789063f,0.101563f, +0.796875f,0.101563f, +0.804688f,0.101563f, +0.8125f,0.101563f, +0.820313f,0.101563f, +0.828125f,0.101563f, +0.835938f,0.101563f, +0.84375f,0.101563f, +0.851563f,0.101563f, +0.859375f,0.101563f, +0.867188f,0.101563f, +0.875f,0.101563f, +0.882813f,0.101563f, +0.890625f,0.101563f, +0.898438f,0.101563f, +0.90625f,0.101563f, +0.914063f,0.101563f, +0.921875f,0.101563f, +0.929688f,0.101563f, +0.9375f,0.101563f, +0.945313f,0.101563f, +0.953125f,0.101563f, +0.960938f,0.101563f, +0.96875f,0.101563f, +0.976563f,0.101563f, +0.984375f,0.101563f, +0.992188f,0.101563f, +1.0f,0.101563f, +0.507813f,0.109375f, +0.515625f,0.109375f, +0.523438f,0.109375f, +0.53125f,0.109375f, +0.539063f,0.109375f, +0.546875f,0.109375f, +0.554688f,0.109375f, +0.5625f,0.109375f, +0.570313f,0.109375f, +0.578125f,0.109375f, +0.585938f,0.109375f, +0.59375f,0.109375f, +0.601563f,0.109375f, +0.609375f,0.109375f, +0.617188f,0.109375f, +0.625f,0.109375f, +0.632813f,0.109375f, +0.640625f,0.109375f, +0.648438f,0.109375f, +0.65625f,0.109375f, +0.664063f,0.109375f, +0.671875f,0.109375f, +0.679688f,0.109375f, +0.6875f,0.109375f, +0.695313f,0.109375f, +0.703125f,0.109375f, +0.710938f,0.109375f, +0.71875f,0.109375f, +0.726563f,0.109375f, +0.734375f,0.109375f, +0.742188f,0.109375f, +0.75f,0.109375f, +0.757813f,0.109375f, +0.765625f,0.109375f, +0.773438f,0.109375f, +0.78125f,0.109375f, +0.789063f,0.109375f, +0.796875f,0.109375f, +0.804688f,0.109375f, +0.8125f,0.109375f, +0.820313f,0.109375f, +0.828125f,0.109375f, +0.835938f,0.109375f, +0.84375f,0.109375f, +0.851563f,0.109375f, +0.859375f,0.109375f, +0.867188f,0.109375f, +0.875f,0.109375f, +0.882813f,0.109375f, +0.890625f,0.109375f, +0.898438f,0.109375f, +0.90625f,0.109375f, +0.914063f,0.109375f, +0.921875f,0.109375f, +0.929688f,0.109375f, +0.9375f,0.109375f, +0.945313f,0.109375f, +0.953125f,0.109375f, +0.960938f,0.109375f, +0.96875f,0.109375f, +0.976563f,0.109375f, +0.984375f,0.109375f, +0.992188f,0.109375f, +1.0f,0.109375f, +0.507813f,0.117188f, +0.515625f,0.117188f, +0.523438f,0.117188f, +0.53125f,0.117188f, +0.539063f,0.117188f, +0.546875f,0.117188f, +0.554688f,0.117188f, +0.5625f,0.117188f, +0.570313f,0.117188f, +0.578125f,0.117188f, +0.585938f,0.117188f, +0.59375f,0.117188f, +0.601563f,0.117188f, +0.609375f,0.117188f, +0.617188f,0.117188f, +0.625f,0.117188f, +0.632813f,0.117188f, +0.640625f,0.117188f, +0.648438f,0.117188f, +0.65625f,0.117188f, +0.664063f,0.117188f, +0.671875f,0.117188f, +0.679688f,0.117188f, +0.6875f,0.117188f, +0.695313f,0.117188f, +0.703125f,0.117188f, +0.710938f,0.117188f, +0.71875f,0.117188f, +0.726563f,0.117188f, +0.734375f,0.117188f, +0.742188f,0.117188f, +0.75f,0.117188f, +0.757813f,0.117188f, +0.765625f,0.117188f, +0.773438f,0.117188f, +0.78125f,0.117188f, +0.789063f,0.117188f, +0.796875f,0.117188f, +0.804688f,0.117188f, +0.8125f,0.117188f, +0.820313f,0.117188f, +0.828125f,0.117188f, +0.835938f,0.117188f, +0.84375f,0.117188f, +0.851563f,0.117188f, +0.859375f,0.117188f, +0.867188f,0.117188f, +0.875f,0.117188f, +0.882813f,0.117188f, +0.890625f,0.117188f, +0.898438f,0.117188f, +0.90625f,0.117188f, +0.914063f,0.117188f, +0.921875f,0.117188f, +0.929688f,0.117188f, +0.9375f,0.117188f, +0.945313f,0.117188f, +0.953125f,0.117188f, +0.960938f,0.117188f, +0.96875f,0.117188f, +0.976563f,0.117188f, +0.984375f,0.117188f, +0.992188f,0.117188f, +1.0f,0.117188f, +0.507813f,0.125f, +0.515625f,0.125f, +0.523438f,0.125f, +0.53125f,0.125f, +0.539063f,0.125f, +0.546875f,0.125f, +0.554688f,0.125f, +0.5625f,0.125f, +0.570313f,0.125f, +0.578125f,0.125f, +0.585938f,0.125f, +0.59375f,0.125f, +0.601563f,0.125f, +0.609375f,0.125f, +0.617188f,0.125f, +0.625f,0.125f, +0.632813f,0.125f, +0.640625f,0.125f, +0.648438f,0.125f, +0.65625f,0.125f, +0.664063f,0.125f, +0.671875f,0.125f, +0.679688f,0.125f, +0.6875f,0.125f, +0.695313f,0.125f, +0.703125f,0.125f, +0.710938f,0.125f, +0.71875f,0.125f, +0.726563f,0.125f, +0.734375f,0.125f, +0.742188f,0.125f, +0.75f,0.125f, +0.757813f,0.125f, +0.765625f,0.125f, +0.773438f,0.125f, +0.78125f,0.125f, +0.789063f,0.125f, +0.796875f,0.125f, +0.804688f,0.125f, +0.8125f,0.125f, +0.820313f,0.125f, +0.828125f,0.125f, +0.835938f,0.125f, +0.84375f,0.125f, +0.851563f,0.125f, +0.859375f,0.125f, +0.867188f,0.125f, +0.875f,0.125f, +0.882813f,0.125f, +0.890625f,0.125f, +0.898438f,0.125f, +0.90625f,0.125f, +0.914063f,0.125f, +0.921875f,0.125f, +0.929688f,0.125f, +0.9375f,0.125f, +0.945313f,0.125f, +0.953125f,0.125f, +0.960938f,0.125f, +0.96875f,0.125f, +0.976563f,0.125f, +0.984375f,0.125f, +0.992188f,0.125f, +1.0f,0.125f, +0.507813f,0.132813f, +0.515625f,0.132813f, +0.523438f,0.132813f, +0.53125f,0.132813f, +0.539063f,0.132813f, +0.546875f,0.132813f, +0.554688f,0.132813f, +0.5625f,0.132813f, +0.570313f,0.132813f, +0.578125f,0.132813f, +0.585938f,0.132813f, +0.59375f,0.132813f, +0.601563f,0.132813f, +0.609375f,0.132813f, +0.617188f,0.132813f, +0.625f,0.132813f, +0.632813f,0.132813f, +0.640625f,0.132813f, +0.648438f,0.132813f, +0.65625f,0.132813f, +0.664063f,0.132813f, +0.671875f,0.132813f, +0.679688f,0.132813f, +0.6875f,0.132813f, +0.695313f,0.132813f, +0.703125f,0.132813f, +0.710938f,0.132813f, +0.71875f,0.132813f, +0.726563f,0.132813f, +0.734375f,0.132813f, +0.742188f,0.132813f, +0.75f,0.132813f, +0.757813f,0.132813f, +0.765625f,0.132813f, +0.773438f,0.132813f, +0.78125f,0.132813f, +0.789063f,0.132813f, +0.796875f,0.132813f, +0.804688f,0.132813f, +0.8125f,0.132813f, +0.820313f,0.132813f, +0.828125f,0.132813f, +0.835938f,0.132813f, +0.84375f,0.132813f, +0.851563f,0.132813f, +0.859375f,0.132813f, +0.867188f,0.132813f, +0.875f,0.132813f, +0.882813f,0.132813f, +0.890625f,0.132813f, +0.898438f,0.132813f, +0.90625f,0.132813f, +0.914063f,0.132813f, +0.921875f,0.132813f, +0.929688f,0.132813f, +0.9375f,0.132813f, +0.945313f,0.132813f, +0.953125f,0.132813f, +0.960938f,0.132813f, +0.96875f,0.132813f, +0.976563f,0.132813f, +0.984375f,0.132813f, +0.992188f,0.132813f, +1.0f,0.132813f, +0.507813f,0.140625f, +0.515625f,0.140625f, +0.523438f,0.140625f, +0.53125f,0.140625f, +0.539063f,0.140625f, +0.546875f,0.140625f, +0.554688f,0.140625f, +0.5625f,0.140625f, +0.570313f,0.140625f, +0.578125f,0.140625f, +0.585938f,0.140625f, +0.59375f,0.140625f, +0.601563f,0.140625f, +0.609375f,0.140625f, +0.617188f,0.140625f, +0.625f,0.140625f, +0.632813f,0.140625f, +0.640625f,0.140625f, +0.648438f,0.140625f, +0.65625f,0.140625f, +0.664063f,0.140625f, +0.671875f,0.140625f, +0.679688f,0.140625f, +0.6875f,0.140625f, +0.695313f,0.140625f, +0.703125f,0.140625f, +0.710938f,0.140625f, +0.71875f,0.140625f, +0.726563f,0.140625f, +0.734375f,0.140625f, +0.742188f,0.140625f, +0.75f,0.140625f, +0.757813f,0.140625f, +0.765625f,0.140625f, +0.773438f,0.140625f, +0.78125f,0.140625f, +0.789063f,0.140625f, +0.796875f,0.140625f, +0.804688f,0.140625f, +0.8125f,0.140625f, +0.820313f,0.140625f, +0.828125f,0.140625f, +0.835938f,0.140625f, +0.84375f,0.140625f, +0.851563f,0.140625f, +0.859375f,0.140625f, +0.867188f,0.140625f, +0.875f,0.140625f, +0.882813f,0.140625f, +0.890625f,0.140625f, +0.898438f,0.140625f, +0.90625f,0.140625f, +0.914063f,0.140625f, +0.921875f,0.140625f, +0.929688f,0.140625f, +0.9375f,0.140625f, +0.945313f,0.140625f, +0.953125f,0.140625f, +0.960938f,0.140625f, +0.96875f,0.140625f, +0.976563f,0.140625f, +0.984375f,0.140625f, +0.992188f,0.140625f, +1.0f,0.140625f, +0.507813f,0.148438f, +0.515625f,0.148438f, +0.523438f,0.148438f, +0.53125f,0.148438f, +0.539063f,0.148438f, +0.546875f,0.148438f, +0.554688f,0.148438f, +0.5625f,0.148438f, +0.570313f,0.148438f, +0.578125f,0.148438f, +0.585938f,0.148438f, +0.59375f,0.148438f, +0.601563f,0.148438f, +0.609375f,0.148438f, +0.617188f,0.148438f, +0.625f,0.148438f, +0.632813f,0.148438f, +0.640625f,0.148438f, +0.648438f,0.148438f, +0.65625f,0.148438f, +0.664063f,0.148438f, +0.671875f,0.148438f, +0.679688f,0.148438f, +0.6875f,0.148438f, +0.695313f,0.148438f, +0.703125f,0.148438f, +0.710938f,0.148438f, +0.71875f,0.148438f, +0.726563f,0.148438f, +0.734375f,0.148438f, +0.742188f,0.148438f, +0.75f,0.148438f, +0.757813f,0.148438f, +0.765625f,0.148438f, +0.773438f,0.148438f, +0.78125f,0.148438f, +0.789063f,0.148438f, +0.796875f,0.148438f, +0.804688f,0.148438f, +0.8125f,0.148438f, +0.820313f,0.148438f, +0.828125f,0.148438f, +0.835938f,0.148438f, +0.84375f,0.148438f, +0.851563f,0.148438f, +0.859375f,0.148438f, +0.867188f,0.148438f, +0.875f,0.148438f, +0.882813f,0.148438f, +0.890625f,0.148438f, +0.898438f,0.148438f, +0.90625f,0.148438f, +0.914063f,0.148438f, +0.921875f,0.148438f, +0.929688f,0.148438f, +0.9375f,0.148438f, +0.945313f,0.148438f, +0.953125f,0.148438f, +0.960938f,0.148438f, +0.96875f,0.148438f, +0.976563f,0.148438f, +0.984375f,0.148438f, +0.992188f,0.148438f, +1.0f,0.148438f, +0.507813f,0.15625f, +0.515625f,0.15625f, +0.523438f,0.15625f, +0.53125f,0.15625f, +0.539063f,0.15625f, +0.546875f,0.15625f, +0.554688f,0.15625f, +0.5625f,0.15625f, +0.570313f,0.15625f, +0.578125f,0.15625f, +0.585938f,0.15625f, +0.59375f,0.15625f, +0.601563f,0.15625f, +0.609375f,0.15625f, +0.617188f,0.15625f, +0.625f,0.15625f, +0.632813f,0.15625f, +0.640625f,0.15625f, +0.648438f,0.15625f, +0.65625f,0.15625f, +0.664063f,0.15625f, +0.671875f,0.15625f, +0.679688f,0.15625f, +0.6875f,0.15625f, +0.695313f,0.15625f, +0.703125f,0.15625f, +0.710938f,0.15625f, +0.71875f,0.15625f, +0.726563f,0.15625f, +0.734375f,0.15625f, +0.742188f,0.15625f, +0.75f,0.15625f, +0.757813f,0.15625f, +0.765625f,0.15625f, +0.773438f,0.15625f, +0.78125f,0.15625f, +0.789063f,0.15625f, +0.796875f,0.15625f, +0.804688f,0.15625f, +0.8125f,0.15625f, +0.820313f,0.15625f, +0.828125f,0.15625f, +0.835938f,0.15625f, +0.84375f,0.15625f, +0.851563f,0.15625f, +0.859375f,0.15625f, +0.867188f,0.15625f, +0.875f,0.15625f, +0.882813f,0.15625f, +0.890625f,0.15625f, +0.898438f,0.15625f, +0.90625f,0.15625f, +0.914063f,0.15625f, +0.921875f,0.15625f, +0.929688f,0.15625f, +0.9375f,0.15625f, +0.945313f,0.15625f, +0.953125f,0.15625f, +0.960938f,0.15625f, +0.96875f,0.15625f, +0.976563f,0.15625f, +0.984375f,0.15625f, +0.992188f,0.15625f, +1.0f,0.15625f, +0.507813f,0.164063f, +0.515625f,0.164063f, +0.523438f,0.164063f, +0.53125f,0.164063f, +0.539063f,0.164063f, +0.546875f,0.164063f, +0.554688f,0.164063f, +0.5625f,0.164063f, +0.570313f,0.164063f, +0.578125f,0.164063f, +0.585938f,0.164063f, +0.59375f,0.164063f, +0.601563f,0.164063f, +0.609375f,0.164063f, +0.617188f,0.164063f, +0.625f,0.164063f, +0.632813f,0.164063f, +0.640625f,0.164063f, +0.648438f,0.164063f, +0.65625f,0.164063f, +0.664063f,0.164063f, +0.671875f,0.164063f, +0.679688f,0.164063f, +0.6875f,0.164063f, +0.695313f,0.164063f, +0.703125f,0.164063f, +0.710938f,0.164063f, +0.71875f,0.164063f, +0.726563f,0.164063f, +0.734375f,0.164063f, +0.742188f,0.164063f, +0.75f,0.164063f, +0.757813f,0.164063f, +0.765625f,0.164063f, +0.773438f,0.164063f, +0.78125f,0.164063f, +0.789063f,0.164063f, +0.796875f,0.164063f, +0.804688f,0.164063f, +0.8125f,0.164063f, +0.820313f,0.164063f, +0.828125f,0.164063f, +0.835938f,0.164063f, +0.84375f,0.164063f, +0.851563f,0.164063f, +0.859375f,0.164063f, +0.867188f,0.164063f, +0.875f,0.164063f, +0.882813f,0.164063f, +0.890625f,0.164063f, +0.898438f,0.164063f, +0.90625f,0.164063f, +0.914063f,0.164063f, +0.921875f,0.164063f, +0.929688f,0.164063f, +0.9375f,0.164063f, +0.945313f,0.164063f, +0.953125f,0.164063f, +0.960938f,0.164063f, +0.96875f,0.164063f, +0.976563f,0.164063f, +0.984375f,0.164063f, +0.992188f,0.164063f, +1.0f,0.164063f, +0.507813f,0.171875f, +0.515625f,0.171875f, +0.523438f,0.171875f, +0.53125f,0.171875f, +0.539063f,0.171875f, +0.546875f,0.171875f, +0.554688f,0.171875f, +0.5625f,0.171875f, +0.570313f,0.171875f, +0.578125f,0.171875f, +0.585938f,0.171875f, +0.59375f,0.171875f, +0.601563f,0.171875f, +0.609375f,0.171875f, +0.617188f,0.171875f, +0.625f,0.171875f, +0.632813f,0.171875f, +0.640625f,0.171875f, +0.648438f,0.171875f, +0.65625f,0.171875f, +0.664063f,0.171875f, +0.671875f,0.171875f, +0.679688f,0.171875f, +0.6875f,0.171875f, +0.695313f,0.171875f, +0.703125f,0.171875f, +0.710938f,0.171875f, +0.71875f,0.171875f, +0.726563f,0.171875f, +0.734375f,0.171875f, +0.742188f,0.171875f, +0.75f,0.171875f, +0.757813f,0.171875f, +0.765625f,0.171875f, +0.773438f,0.171875f, +0.78125f,0.171875f, +0.789063f,0.171875f, +0.796875f,0.171875f, +0.804688f,0.171875f, +0.8125f,0.171875f, +0.820313f,0.171875f, +0.828125f,0.171875f, +0.835938f,0.171875f, +0.84375f,0.171875f, +0.851563f,0.171875f, +0.859375f,0.171875f, +0.867188f,0.171875f, +0.875f,0.171875f, +0.882813f,0.171875f, +0.890625f,0.171875f, +0.898438f,0.171875f, +0.90625f,0.171875f, +0.914063f,0.171875f, +0.921875f,0.171875f, +0.929688f,0.171875f, +0.9375f,0.171875f, +0.945313f,0.171875f, +0.953125f,0.171875f, +0.960938f,0.171875f, +0.96875f,0.171875f, +0.976563f,0.171875f, +0.984375f,0.171875f, +0.992188f,0.171875f, +1.0f,0.171875f, +0.507813f,0.179688f, +0.515625f,0.179688f, +0.523438f,0.179688f, +0.53125f,0.179688f, +0.539063f,0.179688f, +0.546875f,0.179688f, +0.554688f,0.179688f, +0.5625f,0.179688f, +0.570313f,0.179688f, +0.578125f,0.179688f, +0.585938f,0.179688f, +0.59375f,0.179688f, +0.601563f,0.179688f, +0.609375f,0.179688f, +0.617188f,0.179688f, +0.625f,0.179688f, +0.632813f,0.179688f, +0.640625f,0.179688f, +0.648438f,0.179688f, +0.65625f,0.179688f, +0.664063f,0.179688f, +0.671875f,0.179688f, +0.679688f,0.179688f, +0.6875f,0.179688f, +0.695313f,0.179688f, +0.703125f,0.179688f, +0.710938f,0.179688f, +0.71875f,0.179688f, +0.726563f,0.179688f, +0.734375f,0.179688f, +0.742188f,0.179688f, +0.75f,0.179688f, +0.757813f,0.179688f, +0.765625f,0.179688f, +0.773438f,0.179688f, +0.78125f,0.179688f, +0.789063f,0.179688f, +0.796875f,0.179688f, +0.804688f,0.179688f, +0.8125f,0.179688f, +0.820313f,0.179688f, +0.828125f,0.179688f, +0.835938f,0.179688f, +0.84375f,0.179688f, +0.851563f,0.179688f, +0.859375f,0.179688f, +0.867188f,0.179688f, +0.875f,0.179688f, +0.882813f,0.179688f, +0.890625f,0.179688f, +0.898438f,0.179688f, +0.90625f,0.179688f, +0.914063f,0.179688f, +0.921875f,0.179688f, +0.929688f,0.179688f, +0.9375f,0.179688f, +0.945313f,0.179688f, +0.953125f,0.179688f, +0.960938f,0.179688f, +0.96875f,0.179688f, +0.976563f,0.179688f, +0.984375f,0.179688f, +0.992188f,0.179688f, +1.0f,0.179688f, +0.507813f,0.1875f, +0.515625f,0.1875f, +0.523438f,0.1875f, +0.53125f,0.1875f, +0.539063f,0.1875f, +0.546875f,0.1875f, +0.554688f,0.1875f, +0.5625f,0.1875f, +0.570313f,0.1875f, +0.578125f,0.1875f, +0.585938f,0.1875f, +0.59375f,0.1875f, +0.601563f,0.1875f, +0.609375f,0.1875f, +0.617188f,0.1875f, +0.625f,0.1875f, +0.632813f,0.1875f, +0.640625f,0.1875f, +0.648438f,0.1875f, +0.65625f,0.1875f, +0.664063f,0.1875f, +0.671875f,0.1875f, +0.679688f,0.1875f, +0.6875f,0.1875f, +0.695313f,0.1875f, +0.703125f,0.1875f, +0.710938f,0.1875f, +0.71875f,0.1875f, +0.726563f,0.1875f, +0.734375f,0.1875f, +0.742188f,0.1875f, +0.75f,0.1875f, +0.757813f,0.1875f, +0.765625f,0.1875f, +0.773438f,0.1875f, +0.78125f,0.1875f, +0.789063f,0.1875f, +0.796875f,0.1875f, +0.804688f,0.1875f, +0.8125f,0.1875f, +0.820313f,0.1875f, +0.828125f,0.1875f, +0.835938f,0.1875f, +0.84375f,0.1875f, +0.851563f,0.1875f, +0.859375f,0.1875f, +0.867188f,0.1875f, +0.875f,0.1875f, +0.882813f,0.1875f, +0.890625f,0.1875f, +0.898438f,0.1875f, +0.90625f,0.1875f, +0.914063f,0.1875f, +0.921875f,0.1875f, +0.929688f,0.1875f, +0.9375f,0.1875f, +0.945313f,0.1875f, +0.953125f,0.1875f, +0.960938f,0.1875f, +0.96875f,0.1875f, +0.976563f,0.1875f, +0.984375f,0.1875f, +0.992188f,0.1875f, +1.0f,0.1875f, +0.507813f,0.195313f, +0.515625f,0.195313f, +0.523438f,0.195313f, +0.53125f,0.195313f, +0.539063f,0.195313f, +0.546875f,0.195313f, +0.554688f,0.195313f, +0.5625f,0.195313f, +0.570313f,0.195313f, +0.578125f,0.195313f, +0.585938f,0.195313f, +0.59375f,0.195313f, +0.601563f,0.195313f, +0.609375f,0.195313f, +0.617188f,0.195313f, +0.625f,0.195313f, +0.632813f,0.195313f, +0.640625f,0.195313f, +0.648438f,0.195313f, +0.65625f,0.195313f, +0.664063f,0.195313f, +0.671875f,0.195313f, +0.679688f,0.195313f, +0.6875f,0.195313f, +0.695313f,0.195313f, +0.703125f,0.195313f, +0.710938f,0.195313f, +0.71875f,0.195313f, +0.726563f,0.195313f, +0.734375f,0.195313f, +0.742188f,0.195313f, +0.75f,0.195313f, +0.757813f,0.195313f, +0.765625f,0.195313f, +0.773438f,0.195313f, +0.78125f,0.195313f, +0.789063f,0.195313f, +0.796875f,0.195313f, +0.804688f,0.195313f, +0.8125f,0.195313f, +0.820313f,0.195313f, +0.828125f,0.195313f, +0.835938f,0.195313f, +0.84375f,0.195313f, +0.851563f,0.195313f, +0.859375f,0.195313f, +0.867188f,0.195313f, +0.875f,0.195313f, +0.882813f,0.195313f, +0.890625f,0.195313f, +0.898438f,0.195313f, +0.90625f,0.195313f, +0.914063f,0.195313f, +0.921875f,0.195313f, +0.929688f,0.195313f, +0.9375f,0.195313f, +0.945313f,0.195313f, +0.953125f,0.195313f, +0.960938f,0.195313f, +0.96875f,0.195313f, +0.976563f,0.195313f, +0.984375f,0.195313f, +0.992188f,0.195313f, +1.0f,0.195313f, +0.507813f,0.203125f, +0.515625f,0.203125f, +0.523438f,0.203125f, +0.53125f,0.203125f, +0.539063f,0.203125f, +0.546875f,0.203125f, +0.554688f,0.203125f, +0.5625f,0.203125f, +0.570313f,0.203125f, +0.578125f,0.203125f, +0.585938f,0.203125f, +0.59375f,0.203125f, +0.601563f,0.203125f, +0.609375f,0.203125f, +0.617188f,0.203125f, +0.625f,0.203125f, +0.632813f,0.203125f, +0.640625f,0.203125f, +0.648438f,0.203125f, +0.65625f,0.203125f, +0.664063f,0.203125f, +0.671875f,0.203125f, +0.679688f,0.203125f, +0.6875f,0.203125f, +0.695313f,0.203125f, +0.703125f,0.203125f, +0.710938f,0.203125f, +0.71875f,0.203125f, +0.726563f,0.203125f, +0.734375f,0.203125f, +0.742188f,0.203125f, +0.75f,0.203125f, +0.757813f,0.203125f, +0.765625f,0.203125f, +0.773438f,0.203125f, +0.78125f,0.203125f, +0.789063f,0.203125f, +0.796875f,0.203125f, +0.804688f,0.203125f, +0.8125f,0.203125f, +0.820313f,0.203125f, +0.828125f,0.203125f, +0.835938f,0.203125f, +0.84375f,0.203125f, +0.851563f,0.203125f, +0.859375f,0.203125f, +0.867188f,0.203125f, +0.875f,0.203125f, +0.882813f,0.203125f, +0.890625f,0.203125f, +0.898438f,0.203125f, +0.90625f,0.203125f, +0.914063f,0.203125f, +0.921875f,0.203125f, +0.929688f,0.203125f, +0.9375f,0.203125f, +0.945313f,0.203125f, +0.953125f,0.203125f, +0.960938f,0.203125f, +0.96875f,0.203125f, +0.976563f,0.203125f, +0.984375f,0.203125f, +0.992188f,0.203125f, +1.0f,0.203125f, +0.507813f,0.210938f, +0.515625f,0.210938f, +0.523438f,0.210938f, +0.53125f,0.210938f, +0.539063f,0.210938f, +0.546875f,0.210938f, +0.554688f,0.210938f, +0.5625f,0.210938f, +0.570313f,0.210938f, +0.578125f,0.210938f, +0.585938f,0.210938f, +0.59375f,0.210938f, +0.601563f,0.210938f, +0.609375f,0.210938f, +0.617188f,0.210938f, +0.625f,0.210938f, +0.632813f,0.210938f, +0.640625f,0.210938f, +0.648438f,0.210938f, +0.65625f,0.210938f, +0.664063f,0.210938f, +0.671875f,0.210938f, +0.679688f,0.210938f, +0.6875f,0.210938f, +0.695313f,0.210938f, +0.703125f,0.210938f, +0.710938f,0.210938f, +0.71875f,0.210938f, +0.726563f,0.210938f, +0.734375f,0.210938f, +0.742188f,0.210938f, +0.75f,0.210938f, +0.757813f,0.210938f, +0.765625f,0.210938f, +0.773438f,0.210938f, +0.78125f,0.210938f, +0.789063f,0.210938f, +0.796875f,0.210938f, +0.804688f,0.210938f, +0.8125f,0.210938f, +0.820313f,0.210938f, +0.828125f,0.210938f, +0.835938f,0.210938f, +0.84375f,0.210938f, +0.851563f,0.210938f, +0.859375f,0.210938f, +0.867188f,0.210938f, +0.875f,0.210938f, +0.882813f,0.210938f, +0.890625f,0.210938f, +0.898438f,0.210938f, +0.90625f,0.210938f, +0.914063f,0.210938f, +0.921875f,0.210938f, +0.929688f,0.210938f, +0.9375f,0.210938f, +0.945313f,0.210938f, +0.953125f,0.210938f, +0.960938f,0.210938f, +0.96875f,0.210938f, +0.976563f,0.210938f, +0.984375f,0.210938f, +0.992188f,0.210938f, +1.0f,0.210938f, +0.507813f,0.21875f, +0.515625f,0.21875f, +0.523438f,0.21875f, +0.53125f,0.21875f, +0.539063f,0.21875f, +0.546875f,0.21875f, +0.554688f,0.21875f, +0.5625f,0.21875f, +0.570313f,0.21875f, +0.578125f,0.21875f, +0.585938f,0.21875f, +0.59375f,0.21875f, +0.601563f,0.21875f, +0.609375f,0.21875f, +0.617188f,0.21875f, +0.625f,0.21875f, +0.632813f,0.21875f, +0.640625f,0.21875f, +0.648438f,0.21875f, +0.65625f,0.21875f, +0.664063f,0.21875f, +0.671875f,0.21875f, +0.679688f,0.21875f, +0.6875f,0.21875f, +0.695313f,0.21875f, +0.703125f,0.21875f, +0.710938f,0.21875f, +0.71875f,0.21875f, +0.726563f,0.21875f, +0.734375f,0.21875f, +0.742188f,0.21875f, +0.75f,0.21875f, +0.757813f,0.21875f, +0.765625f,0.21875f, +0.773438f,0.21875f, +0.78125f,0.21875f, +0.789063f,0.21875f, +0.796875f,0.21875f, +0.804688f,0.21875f, +0.8125f,0.21875f, +0.820313f,0.21875f, +0.828125f,0.21875f, +0.835938f,0.21875f, +0.84375f,0.21875f, +0.851563f,0.21875f, +0.859375f,0.21875f, +0.867188f,0.21875f, +0.875f,0.21875f, +0.882813f,0.21875f, +0.890625f,0.21875f, +0.898438f,0.21875f, +0.90625f,0.21875f, +0.914063f,0.21875f, +0.921875f,0.21875f, +0.929688f,0.21875f, +0.9375f,0.21875f, +0.945313f,0.21875f, +0.953125f,0.21875f, +0.960938f,0.21875f, +0.96875f,0.21875f, +0.976563f,0.21875f, +0.984375f,0.21875f, +0.992188f,0.21875f, +1.0f,0.21875f, +0.507813f,0.226563f, +0.515625f,0.226563f, +0.523438f,0.226563f, +0.53125f,0.226563f, +0.539063f,0.226563f, +0.546875f,0.226563f, +0.554688f,0.226563f, +0.5625f,0.226563f, +0.570313f,0.226563f, +0.578125f,0.226563f, +0.585938f,0.226563f, +0.59375f,0.226563f, +0.601563f,0.226563f, +0.609375f,0.226563f, +0.617188f,0.226563f, +0.625f,0.226563f, +0.632813f,0.226563f, +0.640625f,0.226563f, +0.648438f,0.226563f, +0.65625f,0.226563f, +0.664063f,0.226563f, +0.671875f,0.226563f, +0.679688f,0.226563f, +0.6875f,0.226563f, +0.695313f,0.226563f, +0.703125f,0.226563f, +0.710938f,0.226563f, +0.71875f,0.226563f, +0.726563f,0.226563f, +0.734375f,0.226563f, +0.742188f,0.226563f, +0.75f,0.226563f, +0.757813f,0.226563f, +0.765625f,0.226563f, +0.773438f,0.226563f, +0.78125f,0.226563f, +0.789063f,0.226563f, +0.796875f,0.226563f, +0.804688f,0.226563f, +0.8125f,0.226563f, +0.820313f,0.226563f, +0.828125f,0.226563f, +0.835938f,0.226563f, +0.84375f,0.226563f, +0.851563f,0.226563f, +0.859375f,0.226563f, +0.867188f,0.226563f, +0.875f,0.226563f, +0.882813f,0.226563f, +0.890625f,0.226563f, +0.898438f,0.226563f, +0.90625f,0.226563f, +0.914063f,0.226563f, +0.921875f,0.226563f, +0.929688f,0.226563f, +0.9375f,0.226563f, +0.945313f,0.226563f, +0.953125f,0.226563f, +0.960938f,0.226563f, +0.96875f,0.226563f, +0.976563f,0.226563f, +0.984375f,0.226563f, +0.992188f,0.226563f, +1.0f,0.226563f, +0.507813f,0.234375f, +0.515625f,0.234375f, +0.523438f,0.234375f, +0.53125f,0.234375f, +0.539063f,0.234375f, +0.546875f,0.234375f, +0.554688f,0.234375f, +0.5625f,0.234375f, +0.570313f,0.234375f, +0.578125f,0.234375f, +0.585938f,0.234375f, +0.59375f,0.234375f, +0.601563f,0.234375f, +0.609375f,0.234375f, +0.617188f,0.234375f, +0.625f,0.234375f, +0.632813f,0.234375f, +0.640625f,0.234375f, +0.648438f,0.234375f, +0.65625f,0.234375f, +0.664063f,0.234375f, +0.671875f,0.234375f, +0.679688f,0.234375f, +0.6875f,0.234375f, +0.695313f,0.234375f, +0.703125f,0.234375f, +0.710938f,0.234375f, +0.71875f,0.234375f, +0.726563f,0.234375f, +0.734375f,0.234375f, +0.742188f,0.234375f, +0.75f,0.234375f, +0.757813f,0.234375f, +0.765625f,0.234375f, +0.773438f,0.234375f, +0.78125f,0.234375f, +0.789063f,0.234375f, +0.796875f,0.234375f, +0.804688f,0.234375f, +0.8125f,0.234375f, +0.820313f,0.234375f, +0.828125f,0.234375f, +0.835938f,0.234375f, +0.84375f,0.234375f, +0.851563f,0.234375f, +0.859375f,0.234375f, +0.867188f,0.234375f, +0.875f,0.234375f, +0.882813f,0.234375f, +0.890625f,0.234375f, +0.898438f,0.234375f, +0.90625f,0.234375f, +0.914063f,0.234375f, +0.921875f,0.234375f, +0.929688f,0.234375f, +0.9375f,0.234375f, +0.945313f,0.234375f, +0.953125f,0.234375f, +0.960938f,0.234375f, +0.96875f,0.234375f, +0.976563f,0.234375f, +0.984375f,0.234375f, +0.992188f,0.234375f, +1.0f,0.234375f, +0.507813f,0.242188f, +0.515625f,0.242188f, +0.523438f,0.242188f, +0.53125f,0.242188f, +0.539063f,0.242188f, +0.546875f,0.242188f, +0.554688f,0.242188f, +0.5625f,0.242188f, +0.570313f,0.242188f, +0.578125f,0.242188f, +0.585938f,0.242188f, +0.59375f,0.242188f, +0.601563f,0.242188f, +0.609375f,0.242188f, +0.617188f,0.242188f, +0.625f,0.242188f, +0.632813f,0.242188f, +0.640625f,0.242188f, +0.648438f,0.242188f, +0.65625f,0.242188f, +0.664063f,0.242188f, +0.671875f,0.242188f, +0.679688f,0.242188f, +0.6875f,0.242188f, +0.695313f,0.242188f, +0.703125f,0.242188f, +0.710938f,0.242188f, +0.71875f,0.242188f, +0.726563f,0.242188f, +0.734375f,0.242188f, +0.742188f,0.242188f, +0.75f,0.242188f, +0.757813f,0.242188f, +0.765625f,0.242188f, +0.773438f,0.242188f, +0.78125f,0.242188f, +0.789063f,0.242188f, +0.796875f,0.242188f, +0.804688f,0.242188f, +0.8125f,0.242188f, +0.820313f,0.242188f, +0.828125f,0.242188f, +0.835938f,0.242188f, +0.84375f,0.242188f, +0.851563f,0.242188f, +0.859375f,0.242188f, +0.867188f,0.242188f, +0.875f,0.242188f, +0.882813f,0.242188f, +0.890625f,0.242188f, +0.898438f,0.242188f, +0.90625f,0.242188f, +0.914063f,0.242188f, +0.921875f,0.242188f, +0.929688f,0.242188f, +0.9375f,0.242188f, +0.945313f,0.242188f, +0.953125f,0.242188f, +0.960938f,0.242188f, +0.96875f,0.242188f, +0.976563f,0.242188f, +0.984375f,0.242188f, +0.992188f,0.242188f, +1.0f,0.242188f, +}; + +unsigned short Landscape01Idx[] = { +0,1,2, +3,2,1, +2,3,4, +5,4,3, +4,5,6, +7,6,5, +6,7,8, +9,8,7, +8,9,10, +11,10,9, +10,11,12, +13,12,11, +12,13,14, +15,14,13, +14,15,16, +17,16,15, +16,17,18, +19,18,17, +18,19,20, +21,20,19, +20,21,22, +23,22,21, +22,23,24, +25,24,23, +24,25,26, +27,26,25, +26,27,28, +29,28,27, +28,29,30, +31,30,29, +30,31,32, +33,32,31, +32,33,34, +35,34,33, +34,35,36, +37,36,35, +36,37,38, +39,38,37, +38,39,40, +41,40,39, +40,41,42, +43,42,41, +42,43,44, +45,44,43, +44,45,46, +47,46,45, +46,47,48, +49,48,47, +48,49,50, +51,50,49, +50,51,52, +53,52,51, +52,53,54, +55,54,53, +54,55,56, +57,56,55, +56,57,58, +59,58,57, +58,59,60, +61,60,59, +60,61,62, +63,62,61, +62,63,64, +65,64,63, +64,65,66, +67,66,65, +66,67,68, +69,68,67, +68,69,70, +71,70,69, +70,71,72, +73,72,71, +72,73,74, +75,74,73, +74,75,76, +77,76,75, +76,77,78, +79,78,77, +78,79,80, +81,80,79, +80,81,82, +83,82,81, +82,83,84, +85,84,83, +84,85,86, +87,86,85, +86,87,88, +89,88,87, +88,89,90, +91,90,89, +90,91,92, +93,92,91, +92,93,94, +95,94,93, +94,95,96, +97,96,95, +96,97,98, +99,98,97, +98,99,100, +101,100,99, +100,101,102, +103,102,101, +102,103,104, +105,104,103, +104,105,106, +107,106,105, +106,107,108, +109,108,107, +108,109,110, +111,110,109, +110,111,112, +113,112,111, +112,113,114, +115,114,113, +114,115,116, +117,116,115, +116,117,118, +119,118,117, +118,119,120, +121,120,119, +120,121,122, +123,122,121, +122,123,124, +125,124,123, +124,125,126, +127,126,125, +128,0,129, +2,129,0, +129,2,130, +4,130,2, +130,4,131, +6,131,4, +131,6,132, +8,132,6, +132,8,133, +10,133,8, +133,10,134, +12,134,10, +134,12,135, +14,135,12, +135,14,136, +16,136,14, +136,16,137, +18,137,16, +137,18,138, +20,138,18, +138,20,139, +22,139,20, +139,22,140, +24,140,22, +140,24,141, +26,141,24, +141,26,142, +28,142,26, +142,28,143, +30,143,28, +143,30,144, +32,144,30, +144,32,145, +34,145,32, +145,34,146, +36,146,34, +146,36,147, +38,147,36, +147,38,148, +40,148,38, +148,40,149, +42,149,40, +149,42,150, +44,150,42, +150,44,151, +46,151,44, +151,46,152, +48,152,46, +152,48,153, +50,153,48, +153,50,154, +52,154,50, +154,52,155, +54,155,52, +155,54,156, +56,156,54, +156,56,157, +58,157,56, +157,58,158, +60,158,58, +158,60,159, +62,159,60, +159,62,160, +64,160,62, +160,64,161, +66,161,64, +161,66,162, +68,162,66, +162,68,163, +70,163,68, +163,70,164, +72,164,70, +164,72,165, +74,165,72, +165,74,166, +76,166,74, +166,76,167, +78,167,76, +167,78,168, +80,168,78, +168,80,169, +82,169,80, +169,82,170, +84,170,82, +170,84,171, +86,171,84, +171,86,172, +88,172,86, +172,88,173, +90,173,88, +173,90,174, +92,174,90, +174,92,175, +94,175,92, +175,94,176, +96,176,94, +176,96,177, +98,177,96, +177,98,178, +100,178,98, +178,100,179, +102,179,100, +179,102,180, +104,180,102, +180,104,181, +106,181,104, +181,106,182, +108,182,106, +182,108,183, +110,183,108, +183,110,184, +112,184,110, +184,112,185, +114,185,112, +185,114,186, +116,186,114, +186,116,187, +118,187,116, +187,118,188, +120,188,118, +188,120,189, +122,189,120, +189,122,190, +124,190,122, +190,124,191, +126,191,124, +192,128,193, +129,193,128, +193,129,194, +130,194,129, +194,130,195, +131,195,130, +195,131,196, +132,196,131, +196,132,197, +133,197,132, +197,133,198, +134,198,133, +198,134,199, +135,199,134, +199,135,200, +136,200,135, +200,136,201, +137,201,136, +201,137,202, +138,202,137, +202,138,203, +139,203,138, +203,139,204, +140,204,139, +204,140,205, +141,205,140, +205,141,206, +142,206,141, +206,142,207, +143,207,142, +207,143,208, +144,208,143, +208,144,209, +145,209,144, +209,145,210, +146,210,145, +210,146,211, +147,211,146, +211,147,212, +148,212,147, +212,148,213, +149,213,148, +213,149,214, +150,214,149, +214,150,215, +151,215,150, +215,151,216, +152,216,151, +216,152,217, +153,217,152, +217,153,218, +154,218,153, +218,154,219, +155,219,154, +219,155,220, +156,220,155, +220,156,221, +157,221,156, +221,157,222, +158,222,157, +222,158,223, +159,223,158, +223,159,224, +160,224,159, +224,160,225, +161,225,160, +225,161,226, +162,226,161, +226,162,227, +163,227,162, +227,163,228, +164,228,163, +228,164,229, +165,229,164, +229,165,230, +166,230,165, +230,166,231, +167,231,166, +231,167,232, +168,232,167, +232,168,233, +169,233,168, +233,169,234, +170,234,169, +234,170,235, +171,235,170, +235,171,236, +172,236,171, +236,172,237, +173,237,172, +237,173,238, +174,238,173, +238,174,239, +175,239,174, +239,175,240, +176,240,175, +240,176,241, +177,241,176, +241,177,242, +178,242,177, +242,178,243, +179,243,178, +243,179,244, +180,244,179, +244,180,245, +181,245,180, +245,181,246, +182,246,181, +246,182,247, +183,247,182, +247,183,248, +184,248,183, +248,184,249, +185,249,184, +249,185,250, +186,250,185, +250,186,251, +187,251,186, +251,187,252, +188,252,187, +252,188,253, +189,253,188, +253,189,254, +190,254,189, +254,190,255, +191,255,190, +256,192,257, +193,257,192, +257,193,258, +194,258,193, +258,194,259, +195,259,194, +259,195,260, +196,260,195, +260,196,261, +197,261,196, +261,197,262, +198,262,197, +262,198,263, +199,263,198, +263,199,264, +200,264,199, +264,200,265, +201,265,200, +265,201,266, +202,266,201, +266,202,267, +203,267,202, +267,203,268, +204,268,203, +268,204,269, +205,269,204, +269,205,270, +206,270,205, +270,206,271, +207,271,206, +271,207,272, +208,272,207, +272,208,273, +209,273,208, +273,209,274, +210,274,209, +274,210,275, +211,275,210, +275,211,276, +212,276,211, +276,212,277, +213,277,212, +277,213,278, +214,278,213, +278,214,279, +215,279,214, +279,215,280, +216,280,215, +280,216,281, +217,281,216, +281,217,282, +218,282,217, +282,218,283, +219,283,218, +283,219,284, +220,284,219, +284,220,285, +221,285,220, +285,221,286, +222,286,221, +286,222,287, +223,287,222, +287,223,288, +224,288,223, +288,224,289, +225,289,224, +289,225,290, +226,290,225, +290,226,291, +227,291,226, +291,227,292, +228,292,227, +292,228,293, +229,293,228, +293,229,294, +230,294,229, +294,230,295, +231,295,230, +295,231,296, +232,296,231, +296,232,297, +233,297,232, +297,233,298, +234,298,233, +298,234,299, +235,299,234, +299,235,300, +236,300,235, +300,236,301, +237,301,236, +301,237,302, +238,302,237, +302,238,303, +239,303,238, +303,239,304, +240,304,239, +304,240,305, +241,305,240, +305,241,306, +242,306,241, +306,242,307, +243,307,242, +307,243,308, +244,308,243, +308,244,309, +245,309,244, +309,245,310, +246,310,245, +310,246,311, +247,311,246, +311,247,312, +248,312,247, +312,248,313, +249,313,248, +313,249,314, +250,314,249, +314,250,315, +251,315,250, +315,251,316, +252,316,251, +316,252,317, +253,317,252, +317,253,318, +254,318,253, +318,254,319, +255,319,254, +320,256,321, +257,321,256, +321,257,322, +258,322,257, +322,258,323, +259,323,258, +323,259,324, +260,324,259, +324,260,325, +261,325,260, +325,261,326, +262,326,261, +326,262,327, +263,327,262, +327,263,328, +264,328,263, +328,264,329, +265,329,264, +329,265,330, +266,330,265, +330,266,331, +267,331,266, +331,267,332, +268,332,267, +332,268,333, +269,333,268, +333,269,334, +270,334,269, +334,270,335, +271,335,270, +335,271,336, +272,336,271, +336,272,337, +273,337,272, +337,273,338, +274,338,273, +338,274,339, +275,339,274, +339,275,340, +276,340,275, +340,276,341, +277,341,276, +341,277,342, +278,342,277, +342,278,343, +279,343,278, +343,279,344, +280,344,279, +344,280,345, +281,345,280, +345,281,346, +282,346,281, +346,282,347, +283,347,282, +347,283,348, +284,348,283, +348,284,349, +285,349,284, +349,285,350, +286,350,285, +350,286,351, +287,351,286, +351,287,352, +288,352,287, +352,288,353, +289,353,288, +353,289,354, +290,354,289, +354,290,355, +291,355,290, +355,291,356, +292,356,291, +356,292,357, +293,357,292, +357,293,358, +294,358,293, +358,294,359, +295,359,294, +359,295,360, +296,360,295, +360,296,361, +297,361,296, +361,297,362, +298,362,297, +362,298,363, +299,363,298, +363,299,364, +300,364,299, +364,300,365, +301,365,300, +365,301,366, +302,366,301, +366,302,367, +303,367,302, +367,303,368, +304,368,303, +368,304,369, +305,369,304, +369,305,370, +306,370,305, +370,306,371, +307,371,306, +371,307,372, +308,372,307, +372,308,373, +309,373,308, +373,309,374, +310,374,309, +374,310,375, +311,375,310, +375,311,376, +312,376,311, +376,312,377, +313,377,312, +377,313,378, +314,378,313, +378,314,379, +315,379,314, +379,315,380, +316,380,315, +380,316,381, +317,381,316, +381,317,382, +318,382,317, +382,318,383, +319,383,318, +384,320,385, +321,385,320, +385,321,386, +322,386,321, +386,322,387, +323,387,322, +387,323,388, +324,388,323, +388,324,389, +325,389,324, +389,325,390, +326,390,325, +390,326,391, +327,391,326, +391,327,392, +328,392,327, +392,328,393, +329,393,328, +393,329,394, +330,394,329, +394,330,395, +331,395,330, +395,331,396, +332,396,331, +396,332,397, +333,397,332, +397,333,398, +334,398,333, +398,334,399, +335,399,334, +399,335,400, +336,400,335, +400,336,401, +337,401,336, +401,337,402, +338,402,337, +402,338,403, +339,403,338, +403,339,404, +340,404,339, +404,340,405, +341,405,340, +405,341,406, +342,406,341, +406,342,407, +343,407,342, +407,343,408, +344,408,343, +408,344,409, +345,409,344, +409,345,410, +346,410,345, +410,346,411, +347,411,346, +411,347,412, +348,412,347, +412,348,413, +349,413,348, +413,349,414, +350,414,349, +414,350,415, +351,415,350, +415,351,416, +352,416,351, +416,352,417, +353,417,352, +417,353,418, +354,418,353, +418,354,419, +355,419,354, +419,355,420, +356,420,355, +420,356,421, +357,421,356, +421,357,422, +358,422,357, +422,358,423, +359,423,358, +423,359,424, +360,424,359, +424,360,425, +361,425,360, +425,361,426, +362,426,361, +426,362,427, +363,427,362, +427,363,428, +364,428,363, +428,364,429, +365,429,364, +429,365,430, +366,430,365, +430,366,431, +367,431,366, +431,367,432, +368,432,367, +432,368,433, +369,433,368, +433,369,434, +370,434,369, +434,370,435, +371,435,370, +435,371,436, +372,436,371, +436,372,437, +373,437,372, +437,373,438, +374,438,373, +438,374,439, +375,439,374, +439,375,440, +376,440,375, +440,376,441, +377,441,376, +441,377,442, +378,442,377, +442,378,443, +379,443,378, +443,379,444, +380,444,379, +444,380,445, +381,445,380, +445,381,446, +382,446,381, +446,382,447, +383,447,382, +448,384,449, +385,449,384, +449,385,450, +386,450,385, +450,386,451, +387,451,386, +451,387,452, +388,452,387, +452,388,453, +389,453,388, +453,389,454, +390,454,389, +454,390,455, +391,455,390, +455,391,456, +392,456,391, +456,392,457, +393,457,392, +457,393,458, +394,458,393, +458,394,459, +395,459,394, +459,395,460, +396,460,395, +460,396,461, +397,461,396, +461,397,462, +398,462,397, +462,398,463, +399,463,398, +463,399,464, +400,464,399, +464,400,465, +401,465,400, +465,401,466, +402,466,401, +466,402,467, +403,467,402, +467,403,468, +404,468,403, +468,404,469, +405,469,404, +469,405,470, +406,470,405, +470,406,471, +407,471,406, +471,407,472, +408,472,407, +472,408,473, +409,473,408, +473,409,474, +410,474,409, +474,410,475, +411,475,410, +475,411,476, +412,476,411, +476,412,477, +413,477,412, +477,413,478, +414,478,413, +478,414,479, +415,479,414, +479,415,480, +416,480,415, +480,416,481, +417,481,416, +481,417,482, +418,482,417, +482,418,483, +419,483,418, +483,419,484, +420,484,419, +484,420,485, +421,485,420, +485,421,486, +422,486,421, +486,422,487, +423,487,422, +487,423,488, +424,488,423, +488,424,489, +425,489,424, +489,425,490, +426,490,425, +490,426,491, +427,491,426, +491,427,492, +428,492,427, +492,428,493, +429,493,428, +493,429,494, +430,494,429, +494,430,495, +431,495,430, +495,431,496, +432,496,431, +496,432,497, +433,497,432, +497,433,498, +434,498,433, +498,434,499, +435,499,434, +499,435,500, +436,500,435, +500,436,501, +437,501,436, +501,437,502, +438,502,437, +502,438,503, +439,503,438, +503,439,504, +440,504,439, +504,440,505, +441,505,440, +505,441,506, +442,506,441, +506,442,507, +443,507,442, +507,443,508, +444,508,443, +508,444,509, +445,509,444, +509,445,510, +446,510,445, +510,446,511, +447,511,446, +512,448,513, +449,513,448, +513,449,514, +450,514,449, +514,450,515, +451,515,450, +515,451,516, +452,516,451, +516,452,517, +453,517,452, +517,453,518, +454,518,453, +518,454,519, +455,519,454, +519,455,520, +456,520,455, +520,456,521, +457,521,456, +521,457,522, +458,522,457, +522,458,523, +459,523,458, +523,459,524, +460,524,459, +524,460,525, +461,525,460, +525,461,526, +462,526,461, +526,462,527, +463,527,462, +527,463,528, +464,528,463, +528,464,529, +465,529,464, +529,465,530, +466,530,465, +530,466,531, +467,531,466, +531,467,532, +468,532,467, +532,468,533, +469,533,468, +533,469,534, +470,534,469, +534,470,535, +471,535,470, +535,471,536, +472,536,471, +536,472,537, +473,537,472, +537,473,538, +474,538,473, +538,474,539, +475,539,474, +539,475,540, +476,540,475, +540,476,541, +477,541,476, +541,477,542, +478,542,477, +542,478,543, +479,543,478, +543,479,544, +480,544,479, +544,480,545, +481,545,480, +545,481,546, +482,546,481, +546,482,547, +483,547,482, +547,483,548, +484,548,483, +548,484,549, +485,549,484, +549,485,550, +486,550,485, +550,486,551, +487,551,486, +551,487,552, +488,552,487, +552,488,553, +489,553,488, +553,489,554, +490,554,489, +554,490,555, +491,555,490, +555,491,556, +492,556,491, +556,492,557, +493,557,492, +557,493,558, +494,558,493, +558,494,559, +495,559,494, +559,495,560, +496,560,495, +560,496,561, +497,561,496, +561,497,562, +498,562,497, +562,498,563, +499,563,498, +563,499,564, +500,564,499, +564,500,565, +501,565,500, +565,501,566, +502,566,501, +566,502,567, +503,567,502, +567,503,568, +504,568,503, +568,504,569, +505,569,504, +569,505,570, +506,570,505, +570,506,571, +507,571,506, +571,507,572, +508,572,507, +572,508,573, +509,573,508, +573,509,574, +510,574,509, +574,510,575, +511,575,510, +576,512,577, +513,577,512, +577,513,578, +514,578,513, +578,514,579, +515,579,514, +579,515,580, +516,580,515, +580,516,581, +517,581,516, +581,517,582, +518,582,517, +582,518,583, +519,583,518, +583,519,584, +520,584,519, +584,520,585, +521,585,520, +585,521,586, +522,586,521, +586,522,587, +523,587,522, +587,523,588, +524,588,523, +588,524,589, +525,589,524, +589,525,590, +526,590,525, +590,526,591, +527,591,526, +591,527,592, +528,592,527, +592,528,593, +529,593,528, +593,529,594, +530,594,529, +594,530,595, +531,595,530, +595,531,596, +532,596,531, +596,532,597, +533,597,532, +597,533,598, +534,598,533, +598,534,599, +535,599,534, +599,535,600, +536,600,535, +600,536,601, +537,601,536, +601,537,602, +538,602,537, +602,538,603, +539,603,538, +603,539,604, +540,604,539, +604,540,605, +541,605,540, +605,541,606, +542,606,541, +606,542,607, +543,607,542, +607,543,608, +544,608,543, +608,544,609, +545,609,544, +609,545,610, +546,610,545, +610,546,611, +547,611,546, +611,547,612, +548,612,547, +612,548,613, +549,613,548, +613,549,614, +550,614,549, +614,550,615, +551,615,550, +615,551,616, +552,616,551, +616,552,617, +553,617,552, +617,553,618, +554,618,553, +618,554,619, +555,619,554, +619,555,620, +556,620,555, +620,556,621, +557,621,556, +621,557,622, +558,622,557, +622,558,623, +559,623,558, +623,559,624, +560,624,559, +624,560,625, +561,625,560, +625,561,626, +562,626,561, +626,562,627, +563,627,562, +627,563,628, +564,628,563, +628,564,629, +565,629,564, +629,565,630, +566,630,565, +630,566,631, +567,631,566, +631,567,632, +568,632,567, +632,568,633, +569,633,568, +633,569,634, +570,634,569, +634,570,635, +571,635,570, +635,571,636, +572,636,571, +636,572,637, +573,637,572, +637,573,638, +574,638,573, +638,574,639, +575,639,574, +640,576,641, +577,641,576, +641,577,642, +578,642,577, +642,578,643, +579,643,578, +643,579,644, +580,644,579, +644,580,645, +581,645,580, +645,581,646, +582,646,581, +646,582,647, +583,647,582, +647,583,648, +584,648,583, +648,584,649, +585,649,584, +649,585,650, +586,650,585, +650,586,651, +587,651,586, +651,587,652, +588,652,587, +652,588,653, +589,653,588, +653,589,654, +590,654,589, +654,590,655, +591,655,590, +655,591,656, +592,656,591, +656,592,657, +593,657,592, +657,593,658, +594,658,593, +658,594,659, +595,659,594, +659,595,660, +596,660,595, +660,596,661, +597,661,596, +661,597,662, +598,662,597, +662,598,663, +599,663,598, +663,599,664, +600,664,599, +664,600,665, +601,665,600, +665,601,666, +602,666,601, +666,602,667, +603,667,602, +667,603,668, +604,668,603, +668,604,669, +605,669,604, +669,605,670, +606,670,605, +670,606,671, +607,671,606, +671,607,672, +608,672,607, +672,608,673, +609,673,608, +673,609,674, +610,674,609, +674,610,675, +611,675,610, +675,611,676, +612,676,611, +676,612,677, +613,677,612, +677,613,678, +614,678,613, +678,614,679, +615,679,614, +679,615,680, +616,680,615, +680,616,681, +617,681,616, +681,617,682, +618,682,617, +682,618,683, +619,683,618, +683,619,684, +620,684,619, +684,620,685, +621,685,620, +685,621,686, +622,686,621, +686,622,687, +623,687,622, +687,623,688, +624,688,623, +688,624,689, +625,689,624, +689,625,690, +626,690,625, +690,626,691, +627,691,626, +691,627,692, +628,692,627, +692,628,693, +629,693,628, +693,629,694, +630,694,629, +694,630,695, +631,695,630, +695,631,696, +632,696,631, +696,632,697, +633,697,632, +697,633,698, +634,698,633, +698,634,699, +635,699,634, +699,635,700, +636,700,635, +700,636,701, +637,701,636, +701,637,702, +638,702,637, +702,638,703, +639,703,638, +704,640,705, +641,705,640, +705,641,706, +642,706,641, +706,642,707, +643,707,642, +707,643,708, +644,708,643, +708,644,709, +645,709,644, +709,645,710, +646,710,645, +710,646,711, +647,711,646, +711,647,712, +648,712,647, +712,648,713, +649,713,648, +713,649,714, +650,714,649, +714,650,715, +651,715,650, +715,651,716, +652,716,651, +716,652,717, +653,717,652, +717,653,718, +654,718,653, +718,654,719, +655,719,654, +719,655,720, +656,720,655, +720,656,721, +657,721,656, +721,657,722, +658,722,657, +722,658,723, +659,723,658, +723,659,724, +660,724,659, +724,660,725, +661,725,660, +725,661,726, +662,726,661, +726,662,727, +663,727,662, +727,663,728, +664,728,663, +728,664,729, +665,729,664, +729,665,730, +666,730,665, +730,666,731, +667,731,666, +731,667,732, +668,732,667, +732,668,733, +669,733,668, +733,669,734, +670,734,669, +734,670,735, +671,735,670, +735,671,736, +672,736,671, +736,672,737, +673,737,672, +737,673,738, +674,738,673, +738,674,739, +675,739,674, +739,675,740, +676,740,675, +740,676,741, +677,741,676, +741,677,742, +678,742,677, +742,678,743, +679,743,678, +743,679,744, +680,744,679, +744,680,745, +681,745,680, +745,681,746, +682,746,681, +746,682,747, +683,747,682, +747,683,748, +684,748,683, +748,684,749, +685,749,684, +749,685,750, +686,750,685, +750,686,751, +687,751,686, +751,687,752, +688,752,687, +752,688,753, +689,753,688, +753,689,754, +690,754,689, +754,690,755, +691,755,690, +755,691,756, +692,756,691, +756,692,757, +693,757,692, +757,693,758, +694,758,693, +758,694,759, +695,759,694, +759,695,760, +696,760,695, +760,696,761, +697,761,696, +761,697,762, +698,762,697, +762,698,763, +699,763,698, +763,699,764, +700,764,699, +764,700,765, +701,765,700, +765,701,766, +702,766,701, +766,702,767, +703,767,702, +768,704,769, +705,769,704, +769,705,770, +706,770,705, +770,706,771, +707,771,706, +771,707,772, +708,772,707, +772,708,773, +709,773,708, +773,709,774, +710,774,709, +774,710,775, +711,775,710, +775,711,776, +712,776,711, +776,712,777, +713,777,712, +777,713,778, +714,778,713, +778,714,779, +715,779,714, +779,715,780, +716,780,715, +780,716,781, +717,781,716, +781,717,782, +718,782,717, +782,718,783, +719,783,718, +783,719,784, +720,784,719, +784,720,785, +721,785,720, +785,721,786, +722,786,721, +786,722,787, +723,787,722, +787,723,788, +724,788,723, +788,724,789, +725,789,724, +789,725,790, +726,790,725, +790,726,791, +727,791,726, +791,727,792, +728,792,727, +792,728,793, +729,793,728, +793,729,794, +730,794,729, +794,730,795, +731,795,730, +795,731,796, +732,796,731, +796,732,797, +733,797,732, +797,733,798, +734,798,733, +798,734,799, +735,799,734, +799,735,800, +736,800,735, +800,736,801, +737,801,736, +801,737,802, +738,802,737, +802,738,803, +739,803,738, +803,739,804, +740,804,739, +804,740,805, +741,805,740, +805,741,806, +742,806,741, +806,742,807, +743,807,742, +807,743,808, +744,808,743, +808,744,809, +745,809,744, +809,745,810, +746,810,745, +810,746,811, +747,811,746, +811,747,812, +748,812,747, +812,748,813, +749,813,748, +813,749,814, +750,814,749, +814,750,815, +751,815,750, +815,751,816, +752,816,751, +816,752,817, +753,817,752, +817,753,818, +754,818,753, +818,754,819, +755,819,754, +819,755,820, +756,820,755, +820,756,821, +757,821,756, +821,757,822, +758,822,757, +822,758,823, +759,823,758, +823,759,824, +760,824,759, +824,760,825, +761,825,760, +825,761,826, +762,826,761, +826,762,827, +763,827,762, +827,763,828, +764,828,763, +828,764,829, +765,829,764, +829,765,830, +766,830,765, +830,766,831, +767,831,766, +832,768,833, +769,833,768, +833,769,834, +770,834,769, +834,770,835, +771,835,770, +835,771,836, +772,836,771, +836,772,837, +773,837,772, +837,773,838, +774,838,773, +838,774,839, +775,839,774, +839,775,840, +776,840,775, +840,776,841, +777,841,776, +841,777,842, +778,842,777, +842,778,843, +779,843,778, +843,779,844, +780,844,779, +844,780,845, +781,845,780, +845,781,846, +782,846,781, +846,782,847, +783,847,782, +847,783,848, +784,848,783, +848,784,849, +785,849,784, +849,785,850, +786,850,785, +850,786,851, +787,851,786, +851,787,852, +788,852,787, +852,788,853, +789,853,788, +853,789,854, +790,854,789, +854,790,855, +791,855,790, +855,791,856, +792,856,791, +856,792,857, +793,857,792, +857,793,858, +794,858,793, +858,794,859, +795,859,794, +859,795,860, +796,860,795, +860,796,861, +797,861,796, +861,797,862, +798,862,797, +862,798,863, +799,863,798, +863,799,864, +800,864,799, +864,800,865, +801,865,800, +865,801,866, +802,866,801, +866,802,867, +803,867,802, +867,803,868, +804,868,803, +868,804,869, +805,869,804, +869,805,870, +806,870,805, +870,806,871, +807,871,806, +871,807,872, +808,872,807, +872,808,873, +809,873,808, +873,809,874, +810,874,809, +874,810,875, +811,875,810, +875,811,876, +812,876,811, +876,812,877, +813,877,812, +877,813,878, +814,878,813, +878,814,879, +815,879,814, +879,815,880, +816,880,815, +880,816,881, +817,881,816, +881,817,882, +818,882,817, +882,818,883, +819,883,818, +883,819,884, +820,884,819, +884,820,885, +821,885,820, +885,821,886, +822,886,821, +886,822,887, +823,887,822, +887,823,888, +824,888,823, +888,824,889, +825,889,824, +889,825,890, +826,890,825, +890,826,891, +827,891,826, +891,827,892, +828,892,827, +892,828,893, +829,893,828, +893,829,894, +830,894,829, +894,830,895, +831,895,830, +896,832,897, +833,897,832, +897,833,898, +834,898,833, +898,834,899, +835,899,834, +899,835,900, +836,900,835, +900,836,901, +837,901,836, +901,837,902, +838,902,837, +902,838,903, +839,903,838, +903,839,904, +840,904,839, +904,840,905, +841,905,840, +905,841,906, +842,906,841, +906,842,907, +843,907,842, +907,843,908, +844,908,843, +908,844,909, +845,909,844, +909,845,910, +846,910,845, +910,846,911, +847,911,846, +911,847,912, +848,912,847, +912,848,913, +849,913,848, +913,849,914, +850,914,849, +914,850,915, +851,915,850, +915,851,916, +852,916,851, +916,852,917, +853,917,852, +917,853,918, +854,918,853, +918,854,919, +855,919,854, +919,855,920, +856,920,855, +920,856,921, +857,921,856, +921,857,922, +858,922,857, +922,858,923, +859,923,858, +923,859,924, +860,924,859, +924,860,925, +861,925,860, +925,861,926, +862,926,861, +926,862,927, +863,927,862, +927,863,928, +864,928,863, +928,864,929, +865,929,864, +929,865,930, +866,930,865, +930,866,931, +867,931,866, +931,867,932, +868,932,867, +932,868,933, +869,933,868, +933,869,934, +870,934,869, +934,870,935, +871,935,870, +935,871,936, +872,936,871, +936,872,937, +873,937,872, +937,873,938, +874,938,873, +938,874,939, +875,939,874, +939,875,940, +876,940,875, +940,876,941, +877,941,876, +941,877,942, +878,942,877, +942,878,943, +879,943,878, +943,879,944, +880,944,879, +944,880,945, +881,945,880, +945,881,946, +882,946,881, +946,882,947, +883,947,882, +947,883,948, +884,948,883, +948,884,949, +885,949,884, +949,885,950, +886,950,885, +950,886,951, +887,951,886, +951,887,952, +888,952,887, +952,888,953, +889,953,888, +953,889,954, +890,954,889, +954,890,955, +891,955,890, +955,891,956, +892,956,891, +956,892,957, +893,957,892, +957,893,958, +894,958,893, +958,894,959, +895,959,894, +960,896,961, +897,961,896, +961,897,962, +898,962,897, +962,898,963, +899,963,898, +963,899,964, +900,964,899, +964,900,965, +901,965,900, +965,901,966, +902,966,901, +966,902,967, +903,967,902, +967,903,968, +904,968,903, +968,904,969, +905,969,904, +969,905,970, +906,970,905, +970,906,971, +907,971,906, +971,907,972, +908,972,907, +972,908,973, +909,973,908, +973,909,974, +910,974,909, +974,910,975, +911,975,910, +975,911,976, +912,976,911, +976,912,977, +913,977,912, +977,913,978, +914,978,913, +978,914,979, +915,979,914, +979,915,980, +916,980,915, +980,916,981, +917,981,916, +981,917,982, +918,982,917, +982,918,983, +919,983,918, +983,919,984, +920,984,919, +984,920,985, +921,985,920, +985,921,986, +922,986,921, +986,922,987, +923,987,922, +987,923,988, +924,988,923, +988,924,989, +925,989,924, +989,925,990, +926,990,925, +990,926,991, +927,991,926, +991,927,992, +928,992,927, +992,928,993, +929,993,928, +993,929,994, +930,994,929, +994,930,995, +931,995,930, +995,931,996, +932,996,931, +996,932,997, +933,997,932, +997,933,998, +934,998,933, +998,934,999, +935,999,934, +999,935,1000, +936,1000,935, +1000,936,1001, +937,1001,936, +1001,937,1002, +938,1002,937, +1002,938,1003, +939,1003,938, +1003,939,1004, +940,1004,939, +1004,940,1005, +941,1005,940, +1005,941,1006, +942,1006,941, +1006,942,1007, +943,1007,942, +1007,943,1008, +944,1008,943, +1008,944,1009, +945,1009,944, +1009,945,1010, +946,1010,945, +1010,946,1011, +947,1011,946, +1011,947,1012, +948,1012,947, +1012,948,1013, +949,1013,948, +1013,949,1014, +950,1014,949, +1014,950,1015, +951,1015,950, +1015,951,1016, +952,1016,951, +1016,952,1017, +953,1017,952, +1017,953,1018, +954,1018,953, +1018,954,1019, +955,1019,954, +1019,955,1020, +956,1020,955, +1020,956,1021, +957,1021,956, +1021,957,1022, +958,1022,957, +1022,958,1023, +959,1023,958, +1024,960,1025, +961,1025,960, +1025,961,1026, +962,1026,961, +1026,962,1027, +963,1027,962, +1027,963,1028, +964,1028,963, +1028,964,1029, +965,1029,964, +1029,965,1030, +966,1030,965, +1030,966,1031, +967,1031,966, +1031,967,1032, +968,1032,967, +1032,968,1033, +969,1033,968, +1033,969,1034, +970,1034,969, +1034,970,1035, +971,1035,970, +1035,971,1036, +972,1036,971, +1036,972,1037, +973,1037,972, +1037,973,1038, +974,1038,973, +1038,974,1039, +975,1039,974, +1039,975,1040, +976,1040,975, +1040,976,1041, +977,1041,976, +1041,977,1042, +978,1042,977, +1042,978,1043, +979,1043,978, +1043,979,1044, +980,1044,979, +1044,980,1045, +981,1045,980, +1045,981,1046, +982,1046,981, +1046,982,1047, +983,1047,982, +1047,983,1048, +984,1048,983, +1048,984,1049, +985,1049,984, +1049,985,1050, +986,1050,985, +1050,986,1051, +987,1051,986, +1051,987,1052, +988,1052,987, +1052,988,1053, +989,1053,988, +1053,989,1054, +990,1054,989, +1054,990,1055, +991,1055,990, +1055,991,1056, +992,1056,991, +1056,992,1057, +993,1057,992, +1057,993,1058, +994,1058,993, +1058,994,1059, +995,1059,994, +1059,995,1060, +996,1060,995, +1060,996,1061, +997,1061,996, +1061,997,1062, +998,1062,997, +1062,998,1063, +999,1063,998, +1063,999,1064, +1000,1064,999, +1064,1000,1065, +1001,1065,1000, +1065,1001,1066, +1002,1066,1001, +1066,1002,1067, +1003,1067,1002, +1067,1003,1068, +1004,1068,1003, +1068,1004,1069, +1005,1069,1004, +1069,1005,1070, +1006,1070,1005, +1070,1006,1071, +1007,1071,1006, +1071,1007,1072, +1008,1072,1007, +1072,1008,1073, +1009,1073,1008, +1073,1009,1074, +1010,1074,1009, +1074,1010,1075, +1011,1075,1010, +1075,1011,1076, +1012,1076,1011, +1076,1012,1077, +1013,1077,1012, +1077,1013,1078, +1014,1078,1013, +1078,1014,1079, +1015,1079,1014, +1079,1015,1080, +1016,1080,1015, +1080,1016,1081, +1017,1081,1016, +1081,1017,1082, +1018,1082,1017, +1082,1018,1083, +1019,1083,1018, +1083,1019,1084, +1020,1084,1019, +1084,1020,1085, +1021,1085,1020, +1085,1021,1086, +1022,1086,1021, +1086,1022,1087, +1023,1087,1022, +1088,1024,1089, +1025,1089,1024, +1089,1025,1090, +1026,1090,1025, +1090,1026,1091, +1027,1091,1026, +1091,1027,1092, +1028,1092,1027, +1092,1028,1093, +1029,1093,1028, +1093,1029,1094, +1030,1094,1029, +1094,1030,1095, +1031,1095,1030, +1095,1031,1096, +1032,1096,1031, +1096,1032,1097, +1033,1097,1032, +1097,1033,1098, +1034,1098,1033, +1098,1034,1099, +1035,1099,1034, +1099,1035,1100, +1036,1100,1035, +1100,1036,1101, +1037,1101,1036, +1101,1037,1102, +1038,1102,1037, +1102,1038,1103, +1039,1103,1038, +1103,1039,1104, +1040,1104,1039, +1104,1040,1105, +1041,1105,1040, +1105,1041,1106, +1042,1106,1041, +1106,1042,1107, +1043,1107,1042, +1107,1043,1108, +1044,1108,1043, +1108,1044,1109, +1045,1109,1044, +1109,1045,1110, +1046,1110,1045, +1110,1046,1111, +1047,1111,1046, +1111,1047,1112, +1048,1112,1047, +1112,1048,1113, +1049,1113,1048, +1113,1049,1114, +1050,1114,1049, +1114,1050,1115, +1051,1115,1050, +1115,1051,1116, +1052,1116,1051, +1116,1052,1117, +1053,1117,1052, +1117,1053,1118, +1054,1118,1053, +1118,1054,1119, +1055,1119,1054, +1119,1055,1120, +1056,1120,1055, +1120,1056,1121, +1057,1121,1056, +1121,1057,1122, +1058,1122,1057, +1122,1058,1123, +1059,1123,1058, +1123,1059,1124, +1060,1124,1059, +1124,1060,1125, +1061,1125,1060, +1125,1061,1126, +1062,1126,1061, +1126,1062,1127, +1063,1127,1062, +1127,1063,1128, +1064,1128,1063, +1128,1064,1129, +1065,1129,1064, +1129,1065,1130, +1066,1130,1065, +1130,1066,1131, +1067,1131,1066, +1131,1067,1132, +1068,1132,1067, +1132,1068,1133, +1069,1133,1068, +1133,1069,1134, +1070,1134,1069, +1134,1070,1135, +1071,1135,1070, +1135,1071,1136, +1072,1136,1071, +1136,1072,1137, +1073,1137,1072, +1137,1073,1138, +1074,1138,1073, +1138,1074,1139, +1075,1139,1074, +1139,1075,1140, +1076,1140,1075, +1140,1076,1141, +1077,1141,1076, +1141,1077,1142, +1078,1142,1077, +1142,1078,1143, +1079,1143,1078, +1143,1079,1144, +1080,1144,1079, +1144,1080,1145, +1081,1145,1080, +1145,1081,1146, +1082,1146,1081, +1146,1082,1147, +1083,1147,1082, +1147,1083,1148, +1084,1148,1083, +1148,1084,1149, +1085,1149,1084, +1149,1085,1150, +1086,1150,1085, +1150,1086,1151, +1087,1151,1086, +1152,1088,1153, +1089,1153,1088, +1153,1089,1154, +1090,1154,1089, +1154,1090,1155, +1091,1155,1090, +1155,1091,1156, +1092,1156,1091, +1156,1092,1157, +1093,1157,1092, +1157,1093,1158, +1094,1158,1093, +1158,1094,1159, +1095,1159,1094, +1159,1095,1160, +1096,1160,1095, +1160,1096,1161, +1097,1161,1096, +1161,1097,1162, +1098,1162,1097, +1162,1098,1163, +1099,1163,1098, +1163,1099,1164, +1100,1164,1099, +1164,1100,1165, +1101,1165,1100, +1165,1101,1166, +1102,1166,1101, +1166,1102,1167, +1103,1167,1102, +1167,1103,1168, +1104,1168,1103, +1168,1104,1169, +1105,1169,1104, +1169,1105,1170, +1106,1170,1105, +1170,1106,1171, +1107,1171,1106, +1171,1107,1172, +1108,1172,1107, +1172,1108,1173, +1109,1173,1108, +1173,1109,1174, +1110,1174,1109, +1174,1110,1175, +1111,1175,1110, +1175,1111,1176, +1112,1176,1111, +1176,1112,1177, +1113,1177,1112, +1177,1113,1178, +1114,1178,1113, +1178,1114,1179, +1115,1179,1114, +1179,1115,1180, +1116,1180,1115, +1180,1116,1181, +1117,1181,1116, +1181,1117,1182, +1118,1182,1117, +1182,1118,1183, +1119,1183,1118, +1183,1119,1184, +1120,1184,1119, +1184,1120,1185, +1121,1185,1120, +1185,1121,1186, +1122,1186,1121, +1186,1122,1187, +1123,1187,1122, +1187,1123,1188, +1124,1188,1123, +1188,1124,1189, +1125,1189,1124, +1189,1125,1190, +1126,1190,1125, +1190,1126,1191, +1127,1191,1126, +1191,1127,1192, +1128,1192,1127, +1192,1128,1193, +1129,1193,1128, +1193,1129,1194, +1130,1194,1129, +1194,1130,1195, +1131,1195,1130, +1195,1131,1196, +1132,1196,1131, +1196,1132,1197, +1133,1197,1132, +1197,1133,1198, +1134,1198,1133, +1198,1134,1199, +1135,1199,1134, +1199,1135,1200, +1136,1200,1135, +1200,1136,1201, +1137,1201,1136, +1201,1137,1202, +1138,1202,1137, +1202,1138,1203, +1139,1203,1138, +1203,1139,1204, +1140,1204,1139, +1204,1140,1205, +1141,1205,1140, +1205,1141,1206, +1142,1206,1141, +1206,1142,1207, +1143,1207,1142, +1207,1143,1208, +1144,1208,1143, +1208,1144,1209, +1145,1209,1144, +1209,1145,1210, +1146,1210,1145, +1210,1146,1211, +1147,1211,1146, +1211,1147,1212, +1148,1212,1147, +1212,1148,1213, +1149,1213,1148, +1213,1149,1214, +1150,1214,1149, +1214,1150,1215, +1151,1215,1150, +1216,1152,1217, +1153,1217,1152, +1217,1153,1218, +1154,1218,1153, +1218,1154,1219, +1155,1219,1154, +1219,1155,1220, +1156,1220,1155, +1220,1156,1221, +1157,1221,1156, +1221,1157,1222, +1158,1222,1157, +1222,1158,1223, +1159,1223,1158, +1223,1159,1224, +1160,1224,1159, +1224,1160,1225, +1161,1225,1160, +1225,1161,1226, +1162,1226,1161, +1226,1162,1227, +1163,1227,1162, +1227,1163,1228, +1164,1228,1163, +1228,1164,1229, +1165,1229,1164, +1229,1165,1230, +1166,1230,1165, +1230,1166,1231, +1167,1231,1166, +1231,1167,1232, +1168,1232,1167, +1232,1168,1233, +1169,1233,1168, +1233,1169,1234, +1170,1234,1169, +1234,1170,1235, +1171,1235,1170, +1235,1171,1236, +1172,1236,1171, +1236,1172,1237, +1173,1237,1172, +1237,1173,1238, +1174,1238,1173, +1238,1174,1239, +1175,1239,1174, +1239,1175,1240, +1176,1240,1175, +1240,1176,1241, +1177,1241,1176, +1241,1177,1242, +1178,1242,1177, +1242,1178,1243, +1179,1243,1178, +1243,1179,1244, +1180,1244,1179, +1244,1180,1245, +1181,1245,1180, +1245,1181,1246, +1182,1246,1181, +1246,1182,1247, +1183,1247,1182, +1247,1183,1248, +1184,1248,1183, +1248,1184,1249, +1185,1249,1184, +1249,1185,1250, +1186,1250,1185, +1250,1186,1251, +1187,1251,1186, +1251,1187,1252, +1188,1252,1187, +1252,1188,1253, +1189,1253,1188, +1253,1189,1254, +1190,1254,1189, +1254,1190,1255, +1191,1255,1190, +1255,1191,1256, +1192,1256,1191, +1256,1192,1257, +1193,1257,1192, +1257,1193,1258, +1194,1258,1193, +1258,1194,1259, +1195,1259,1194, +1259,1195,1260, +1196,1260,1195, +1260,1196,1261, +1197,1261,1196, +1261,1197,1262, +1198,1262,1197, +1262,1198,1263, +1199,1263,1198, +1263,1199,1264, +1200,1264,1199, +1264,1200,1265, +1201,1265,1200, +1265,1201,1266, +1202,1266,1201, +1266,1202,1267, +1203,1267,1202, +1267,1203,1268, +1204,1268,1203, +1268,1204,1269, +1205,1269,1204, +1269,1205,1270, +1206,1270,1205, +1270,1206,1271, +1207,1271,1206, +1271,1207,1272, +1208,1272,1207, +1272,1208,1273, +1209,1273,1208, +1273,1209,1274, +1210,1274,1209, +1274,1210,1275, +1211,1275,1210, +1275,1211,1276, +1212,1276,1211, +1276,1212,1277, +1213,1277,1212, +1277,1213,1278, +1214,1278,1213, +1278,1214,1279, +1215,1279,1214, +1280,1216,1281, +1217,1281,1216, +1281,1217,1282, +1218,1282,1217, +1282,1218,1283, +1219,1283,1218, +1283,1219,1284, +1220,1284,1219, +1284,1220,1285, +1221,1285,1220, +1285,1221,1286, +1222,1286,1221, +1286,1222,1287, +1223,1287,1222, +1287,1223,1288, +1224,1288,1223, +1288,1224,1289, +1225,1289,1224, +1289,1225,1290, +1226,1290,1225, +1290,1226,1291, +1227,1291,1226, +1291,1227,1292, +1228,1292,1227, +1292,1228,1293, +1229,1293,1228, +1293,1229,1294, +1230,1294,1229, +1294,1230,1295, +1231,1295,1230, +1295,1231,1296, +1232,1296,1231, +1296,1232,1297, +1233,1297,1232, +1297,1233,1298, +1234,1298,1233, +1298,1234,1299, +1235,1299,1234, +1299,1235,1300, +1236,1300,1235, +1300,1236,1301, +1237,1301,1236, +1301,1237,1302, +1238,1302,1237, +1302,1238,1303, +1239,1303,1238, +1303,1239,1304, +1240,1304,1239, +1304,1240,1305, +1241,1305,1240, +1305,1241,1306, +1242,1306,1241, +1306,1242,1307, +1243,1307,1242, +1307,1243,1308, +1244,1308,1243, +1308,1244,1309, +1245,1309,1244, +1309,1245,1310, +1246,1310,1245, +1310,1246,1311, +1247,1311,1246, +1311,1247,1312, +1248,1312,1247, +1312,1248,1313, +1249,1313,1248, +1313,1249,1314, +1250,1314,1249, +1314,1250,1315, +1251,1315,1250, +1315,1251,1316, +1252,1316,1251, +1316,1252,1317, +1253,1317,1252, +1317,1253,1318, +1254,1318,1253, +1318,1254,1319, +1255,1319,1254, +1319,1255,1320, +1256,1320,1255, +1320,1256,1321, +1257,1321,1256, +1321,1257,1322, +1258,1322,1257, +1322,1258,1323, +1259,1323,1258, +1323,1259,1324, +1260,1324,1259, +1324,1260,1325, +1261,1325,1260, +1325,1261,1326, +1262,1326,1261, +1326,1262,1327, +1263,1327,1262, +1327,1263,1328, +1264,1328,1263, +1328,1264,1329, +1265,1329,1264, +1329,1265,1330, +1266,1330,1265, +1330,1266,1331, +1267,1331,1266, +1331,1267,1332, +1268,1332,1267, +1332,1268,1333, +1269,1333,1268, +1333,1269,1334, +1270,1334,1269, +1334,1270,1335, +1271,1335,1270, +1335,1271,1336, +1272,1336,1271, +1336,1272,1337, +1273,1337,1272, +1337,1273,1338, +1274,1338,1273, +1338,1274,1339, +1275,1339,1274, +1339,1275,1340, +1276,1340,1275, +1340,1276,1341, +1277,1341,1276, +1341,1277,1342, +1278,1342,1277, +1342,1278,1343, +1279,1343,1278, +1344,1280,1345, +1281,1345,1280, +1345,1281,1346, +1282,1346,1281, +1346,1282,1347, +1283,1347,1282, +1347,1283,1348, +1284,1348,1283, +1348,1284,1349, +1285,1349,1284, +1349,1285,1350, +1286,1350,1285, +1350,1286,1351, +1287,1351,1286, +1351,1287,1352, +1288,1352,1287, +1352,1288,1353, +1289,1353,1288, +1353,1289,1354, +1290,1354,1289, +1354,1290,1355, +1291,1355,1290, +1355,1291,1356, +1292,1356,1291, +1356,1292,1357, +1293,1357,1292, +1357,1293,1358, +1294,1358,1293, +1358,1294,1359, +1295,1359,1294, +1359,1295,1360, +1296,1360,1295, +1360,1296,1361, +1297,1361,1296, +1361,1297,1362, +1298,1362,1297, +1362,1298,1363, +1299,1363,1298, +1363,1299,1364, +1300,1364,1299, +1364,1300,1365, +1301,1365,1300, +1365,1301,1366, +1302,1366,1301, +1366,1302,1367, +1303,1367,1302, +1367,1303,1368, +1304,1368,1303, +1368,1304,1369, +1305,1369,1304, +1369,1305,1370, +1306,1370,1305, +1370,1306,1371, +1307,1371,1306, +1371,1307,1372, +1308,1372,1307, +1372,1308,1373, +1309,1373,1308, +1373,1309,1374, +1310,1374,1309, +1374,1310,1375, +1311,1375,1310, +1375,1311,1376, +1312,1376,1311, +1376,1312,1377, +1313,1377,1312, +1377,1313,1378, +1314,1378,1313, +1378,1314,1379, +1315,1379,1314, +1379,1315,1380, +1316,1380,1315, +1380,1316,1381, +1317,1381,1316, +1381,1317,1382, +1318,1382,1317, +1382,1318,1383, +1319,1383,1318, +1383,1319,1384, +1320,1384,1319, +1384,1320,1385, +1321,1385,1320, +1385,1321,1386, +1322,1386,1321, +1386,1322,1387, +1323,1387,1322, +1387,1323,1388, +1324,1388,1323, +1388,1324,1389, +1325,1389,1324, +1389,1325,1390, +1326,1390,1325, +1390,1326,1391, +1327,1391,1326, +1391,1327,1392, +1328,1392,1327, +1392,1328,1393, +1329,1393,1328, +1393,1329,1394, +1330,1394,1329, +1394,1330,1395, +1331,1395,1330, +1395,1331,1396, +1332,1396,1331, +1396,1332,1397, +1333,1397,1332, +1397,1333,1398, +1334,1398,1333, +1398,1334,1399, +1335,1399,1334, +1399,1335,1400, +1336,1400,1335, +1400,1336,1401, +1337,1401,1336, +1401,1337,1402, +1338,1402,1337, +1402,1338,1403, +1339,1403,1338, +1403,1339,1404, +1340,1404,1339, +1404,1340,1405, +1341,1405,1340, +1405,1341,1406, +1342,1406,1341, +1406,1342,1407, +1343,1407,1342, +1408,1344,1409, +1345,1409,1344, +1409,1345,1410, +1346,1410,1345, +1410,1346,1411, +1347,1411,1346, +1411,1347,1412, +1348,1412,1347, +1412,1348,1413, +1349,1413,1348, +1413,1349,1414, +1350,1414,1349, +1414,1350,1415, +1351,1415,1350, +1415,1351,1416, +1352,1416,1351, +1416,1352,1417, +1353,1417,1352, +1417,1353,1418, +1354,1418,1353, +1418,1354,1419, +1355,1419,1354, +1419,1355,1420, +1356,1420,1355, +1420,1356,1421, +1357,1421,1356, +1421,1357,1422, +1358,1422,1357, +1422,1358,1423, +1359,1423,1358, +1423,1359,1424, +1360,1424,1359, +1424,1360,1425, +1361,1425,1360, +1425,1361,1426, +1362,1426,1361, +1426,1362,1427, +1363,1427,1362, +1427,1363,1428, +1364,1428,1363, +1428,1364,1429, +1365,1429,1364, +1429,1365,1430, +1366,1430,1365, +1430,1366,1431, +1367,1431,1366, +1431,1367,1432, +1368,1432,1367, +1432,1368,1433, +1369,1433,1368, +1433,1369,1434, +1370,1434,1369, +1434,1370,1435, +1371,1435,1370, +1435,1371,1436, +1372,1436,1371, +1436,1372,1437, +1373,1437,1372, +1437,1373,1438, +1374,1438,1373, +1438,1374,1439, +1375,1439,1374, +1439,1375,1440, +1376,1440,1375, +1440,1376,1441, +1377,1441,1376, +1441,1377,1442, +1378,1442,1377, +1442,1378,1443, +1379,1443,1378, +1443,1379,1444, +1380,1444,1379, +1444,1380,1445, +1381,1445,1380, +1445,1381,1446, +1382,1446,1381, +1446,1382,1447, +1383,1447,1382, +1447,1383,1448, +1384,1448,1383, +1448,1384,1449, +1385,1449,1384, +1449,1385,1450, +1386,1450,1385, +1450,1386,1451, +1387,1451,1386, +1451,1387,1452, +1388,1452,1387, +1452,1388,1453, +1389,1453,1388, +1453,1389,1454, +1390,1454,1389, +1454,1390,1455, +1391,1455,1390, +1455,1391,1456, +1392,1456,1391, +1456,1392,1457, +1393,1457,1392, +1457,1393,1458, +1394,1458,1393, +1458,1394,1459, +1395,1459,1394, +1459,1395,1460, +1396,1460,1395, +1460,1396,1461, +1397,1461,1396, +1461,1397,1462, +1398,1462,1397, +1462,1398,1463, +1399,1463,1398, +1463,1399,1464, +1400,1464,1399, +1464,1400,1465, +1401,1465,1400, +1465,1401,1466, +1402,1466,1401, +1466,1402,1467, +1403,1467,1402, +1467,1403,1468, +1404,1468,1403, +1468,1404,1469, +1405,1469,1404, +1469,1405,1470, +1406,1470,1405, +1470,1406,1471, +1407,1471,1406, +1472,1408,1473, +1409,1473,1408, +1473,1409,1474, +1410,1474,1409, +1474,1410,1475, +1411,1475,1410, +1475,1411,1476, +1412,1476,1411, +1476,1412,1477, +1413,1477,1412, +1477,1413,1478, +1414,1478,1413, +1478,1414,1479, +1415,1479,1414, +1479,1415,1480, +1416,1480,1415, +1480,1416,1481, +1417,1481,1416, +1481,1417,1482, +1418,1482,1417, +1482,1418,1483, +1419,1483,1418, +1483,1419,1484, +1420,1484,1419, +1484,1420,1485, +1421,1485,1420, +1485,1421,1486, +1422,1486,1421, +1486,1422,1487, +1423,1487,1422, +1487,1423,1488, +1424,1488,1423, +1488,1424,1489, +1425,1489,1424, +1489,1425,1490, +1426,1490,1425, +1490,1426,1491, +1427,1491,1426, +1491,1427,1492, +1428,1492,1427, +1492,1428,1493, +1429,1493,1428, +1493,1429,1494, +1430,1494,1429, +1494,1430,1495, +1431,1495,1430, +1495,1431,1496, +1432,1496,1431, +1496,1432,1497, +1433,1497,1432, +1497,1433,1498, +1434,1498,1433, +1498,1434,1499, +1435,1499,1434, +1499,1435,1500, +1436,1500,1435, +1500,1436,1501, +1437,1501,1436, +1501,1437,1502, +1438,1502,1437, +1502,1438,1503, +1439,1503,1438, +1503,1439,1504, +1440,1504,1439, +1504,1440,1505, +1441,1505,1440, +1505,1441,1506, +1442,1506,1441, +1506,1442,1507, +1443,1507,1442, +1507,1443,1508, +1444,1508,1443, +1508,1444,1509, +1445,1509,1444, +1509,1445,1510, +1446,1510,1445, +1510,1446,1511, +1447,1511,1446, +1511,1447,1512, +1448,1512,1447, +1512,1448,1513, +1449,1513,1448, +1513,1449,1514, +1450,1514,1449, +1514,1450,1515, +1451,1515,1450, +1515,1451,1516, +1452,1516,1451, +1516,1452,1517, +1453,1517,1452, +1517,1453,1518, +1454,1518,1453, +1518,1454,1519, +1455,1519,1454, +1519,1455,1520, +1456,1520,1455, +1520,1456,1521, +1457,1521,1456, +1521,1457,1522, +1458,1522,1457, +1522,1458,1523, +1459,1523,1458, +1523,1459,1524, +1460,1524,1459, +1524,1460,1525, +1461,1525,1460, +1525,1461,1526, +1462,1526,1461, +1526,1462,1527, +1463,1527,1462, +1527,1463,1528, +1464,1528,1463, +1528,1464,1529, +1465,1529,1464, +1529,1465,1530, +1466,1530,1465, +1530,1466,1531, +1467,1531,1466, +1531,1467,1532, +1468,1532,1467, +1532,1468,1533, +1469,1533,1468, +1533,1469,1534, +1470,1534,1469, +1534,1470,1535, +1471,1535,1470, +1536,1472,1537, +1473,1537,1472, +1537,1473,1538, +1474,1538,1473, +1538,1474,1539, +1475,1539,1474, +1539,1475,1540, +1476,1540,1475, +1540,1476,1541, +1477,1541,1476, +1541,1477,1542, +1478,1542,1477, +1542,1478,1543, +1479,1543,1478, +1543,1479,1544, +1480,1544,1479, +1544,1480,1545, +1481,1545,1480, +1545,1481,1546, +1482,1546,1481, +1546,1482,1547, +1483,1547,1482, +1547,1483,1548, +1484,1548,1483, +1548,1484,1549, +1485,1549,1484, +1549,1485,1550, +1486,1550,1485, +1550,1486,1551, +1487,1551,1486, +1551,1487,1552, +1488,1552,1487, +1552,1488,1553, +1489,1553,1488, +1553,1489,1554, +1490,1554,1489, +1554,1490,1555, +1491,1555,1490, +1555,1491,1556, +1492,1556,1491, +1556,1492,1557, +1493,1557,1492, +1557,1493,1558, +1494,1558,1493, +1558,1494,1559, +1495,1559,1494, +1559,1495,1560, +1496,1560,1495, +1560,1496,1561, +1497,1561,1496, +1561,1497,1562, +1498,1562,1497, +1562,1498,1563, +1499,1563,1498, +1563,1499,1564, +1500,1564,1499, +1564,1500,1565, +1501,1565,1500, +1565,1501,1566, +1502,1566,1501, +1566,1502,1567, +1503,1567,1502, +1567,1503,1568, +1504,1568,1503, +1568,1504,1569, +1505,1569,1504, +1569,1505,1570, +1506,1570,1505, +1570,1506,1571, +1507,1571,1506, +1571,1507,1572, +1508,1572,1507, +1572,1508,1573, +1509,1573,1508, +1573,1509,1574, +1510,1574,1509, +1574,1510,1575, +1511,1575,1510, +1575,1511,1576, +1512,1576,1511, +1576,1512,1577, +1513,1577,1512, +1577,1513,1578, +1514,1578,1513, +1578,1514,1579, +1515,1579,1514, +1579,1515,1580, +1516,1580,1515, +1580,1516,1581, +1517,1581,1516, +1581,1517,1582, +1518,1582,1517, +1582,1518,1583, +1519,1583,1518, +1583,1519,1584, +1520,1584,1519, +1584,1520,1585, +1521,1585,1520, +1585,1521,1586, +1522,1586,1521, +1586,1522,1587, +1523,1587,1522, +1587,1523,1588, +1524,1588,1523, +1588,1524,1589, +1525,1589,1524, +1589,1525,1590, +1526,1590,1525, +1590,1526,1591, +1527,1591,1526, +1591,1527,1592, +1528,1592,1527, +1592,1528,1593, +1529,1593,1528, +1593,1529,1594, +1530,1594,1529, +1594,1530,1595, +1531,1595,1530, +1595,1531,1596, +1532,1596,1531, +1596,1532,1597, +1533,1597,1532, +1597,1533,1598, +1534,1598,1533, +1598,1534,1599, +1535,1599,1534, +1600,1536,1601, +1537,1601,1536, +1601,1537,1602, +1538,1602,1537, +1602,1538,1603, +1539,1603,1538, +1603,1539,1604, +1540,1604,1539, +1604,1540,1605, +1541,1605,1540, +1605,1541,1606, +1542,1606,1541, +1606,1542,1607, +1543,1607,1542, +1607,1543,1608, +1544,1608,1543, +1608,1544,1609, +1545,1609,1544, +1609,1545,1610, +1546,1610,1545, +1610,1546,1611, +1547,1611,1546, +1611,1547,1612, +1548,1612,1547, +1612,1548,1613, +1549,1613,1548, +1613,1549,1614, +1550,1614,1549, +1614,1550,1615, +1551,1615,1550, +1615,1551,1616, +1552,1616,1551, +1616,1552,1617, +1553,1617,1552, +1617,1553,1618, +1554,1618,1553, +1618,1554,1619, +1555,1619,1554, +1619,1555,1620, +1556,1620,1555, +1620,1556,1621, +1557,1621,1556, +1621,1557,1622, +1558,1622,1557, +1622,1558,1623, +1559,1623,1558, +1623,1559,1624, +1560,1624,1559, +1624,1560,1625, +1561,1625,1560, +1625,1561,1626, +1562,1626,1561, +1626,1562,1627, +1563,1627,1562, +1627,1563,1628, +1564,1628,1563, +1628,1564,1629, +1565,1629,1564, +1629,1565,1630, +1566,1630,1565, +1630,1566,1631, +1567,1631,1566, +1631,1567,1632, +1568,1632,1567, +1632,1568,1633, +1569,1633,1568, +1633,1569,1634, +1570,1634,1569, +1634,1570,1635, +1571,1635,1570, +1635,1571,1636, +1572,1636,1571, +1636,1572,1637, +1573,1637,1572, +1637,1573,1638, +1574,1638,1573, +1638,1574,1639, +1575,1639,1574, +1639,1575,1640, +1576,1640,1575, +1640,1576,1641, +1577,1641,1576, +1641,1577,1642, +1578,1642,1577, +1642,1578,1643, +1579,1643,1578, +1643,1579,1644, +1580,1644,1579, +1644,1580,1645, +1581,1645,1580, +1645,1581,1646, +1582,1646,1581, +1646,1582,1647, +1583,1647,1582, +1647,1583,1648, +1584,1648,1583, +1648,1584,1649, +1585,1649,1584, +1649,1585,1650, +1586,1650,1585, +1650,1586,1651, +1587,1651,1586, +1651,1587,1652, +1588,1652,1587, +1652,1588,1653, +1589,1653,1588, +1653,1589,1654, +1590,1654,1589, +1654,1590,1655, +1591,1655,1590, +1655,1591,1656, +1592,1656,1591, +1656,1592,1657, +1593,1657,1592, +1657,1593,1658, +1594,1658,1593, +1658,1594,1659, +1595,1659,1594, +1659,1595,1660, +1596,1660,1595, +1660,1596,1661, +1597,1661,1596, +1661,1597,1662, +1598,1662,1597, +1662,1598,1663, +1599,1663,1598, +1664,1600,1665, +1601,1665,1600, +1665,1601,1666, +1602,1666,1601, +1666,1602,1667, +1603,1667,1602, +1667,1603,1668, +1604,1668,1603, +1668,1604,1669, +1605,1669,1604, +1669,1605,1670, +1606,1670,1605, +1670,1606,1671, +1607,1671,1606, +1671,1607,1672, +1608,1672,1607, +1672,1608,1673, +1609,1673,1608, +1673,1609,1674, +1610,1674,1609, +1674,1610,1675, +1611,1675,1610, +1675,1611,1676, +1612,1676,1611, +1676,1612,1677, +1613,1677,1612, +1677,1613,1678, +1614,1678,1613, +1678,1614,1679, +1615,1679,1614, +1679,1615,1680, +1616,1680,1615, +1680,1616,1681, +1617,1681,1616, +1681,1617,1682, +1618,1682,1617, +1682,1618,1683, +1619,1683,1618, +1683,1619,1684, +1620,1684,1619, +1684,1620,1685, +1621,1685,1620, +1685,1621,1686, +1622,1686,1621, +1686,1622,1687, +1623,1687,1622, +1687,1623,1688, +1624,1688,1623, +1688,1624,1689, +1625,1689,1624, +1689,1625,1690, +1626,1690,1625, +1690,1626,1691, +1627,1691,1626, +1691,1627,1692, +1628,1692,1627, +1692,1628,1693, +1629,1693,1628, +1693,1629,1694, +1630,1694,1629, +1694,1630,1695, +1631,1695,1630, +1695,1631,1696, +1632,1696,1631, +1696,1632,1697, +1633,1697,1632, +1697,1633,1698, +1634,1698,1633, +1698,1634,1699, +1635,1699,1634, +1699,1635,1700, +1636,1700,1635, +1700,1636,1701, +1637,1701,1636, +1701,1637,1702, +1638,1702,1637, +1702,1638,1703, +1639,1703,1638, +1703,1639,1704, +1640,1704,1639, +1704,1640,1705, +1641,1705,1640, +1705,1641,1706, +1642,1706,1641, +1706,1642,1707, +1643,1707,1642, +1707,1643,1708, +1644,1708,1643, +1708,1644,1709, +1645,1709,1644, +1709,1645,1710, +1646,1710,1645, +1710,1646,1711, +1647,1711,1646, +1711,1647,1712, +1648,1712,1647, +1712,1648,1713, +1649,1713,1648, +1713,1649,1714, +1650,1714,1649, +1714,1650,1715, +1651,1715,1650, +1715,1651,1716, +1652,1716,1651, +1716,1652,1717, +1653,1717,1652, +1717,1653,1718, +1654,1718,1653, +1718,1654,1719, +1655,1719,1654, +1719,1655,1720, +1656,1720,1655, +1720,1656,1721, +1657,1721,1656, +1721,1657,1722, +1658,1722,1657, +1722,1658,1723, +1659,1723,1658, +1723,1659,1724, +1660,1724,1659, +1724,1660,1725, +1661,1725,1660, +1725,1661,1726, +1662,1726,1661, +1726,1662,1727, +1663,1727,1662, +1728,1664,1729, +1665,1729,1664, +1729,1665,1730, +1666,1730,1665, +1730,1666,1731, +1667,1731,1666, +1731,1667,1732, +1668,1732,1667, +1732,1668,1733, +1669,1733,1668, +1733,1669,1734, +1670,1734,1669, +1734,1670,1735, +1671,1735,1670, +1735,1671,1736, +1672,1736,1671, +1736,1672,1737, +1673,1737,1672, +1737,1673,1738, +1674,1738,1673, +1738,1674,1739, +1675,1739,1674, +1739,1675,1740, +1676,1740,1675, +1740,1676,1741, +1677,1741,1676, +1741,1677,1742, +1678,1742,1677, +1742,1678,1743, +1679,1743,1678, +1743,1679,1744, +1680,1744,1679, +1744,1680,1745, +1681,1745,1680, +1745,1681,1746, +1682,1746,1681, +1746,1682,1747, +1683,1747,1682, +1747,1683,1748, +1684,1748,1683, +1748,1684,1749, +1685,1749,1684, +1749,1685,1750, +1686,1750,1685, +1750,1686,1751, +1687,1751,1686, +1751,1687,1752, +1688,1752,1687, +1752,1688,1753, +1689,1753,1688, +1753,1689,1754, +1690,1754,1689, +1754,1690,1755, +1691,1755,1690, +1755,1691,1756, +1692,1756,1691, +1756,1692,1757, +1693,1757,1692, +1757,1693,1758, +1694,1758,1693, +1758,1694,1759, +1695,1759,1694, +1759,1695,1760, +1696,1760,1695, +1760,1696,1761, +1697,1761,1696, +1761,1697,1762, +1698,1762,1697, +1762,1698,1763, +1699,1763,1698, +1763,1699,1764, +1700,1764,1699, +1764,1700,1765, +1701,1765,1700, +1765,1701,1766, +1702,1766,1701, +1766,1702,1767, +1703,1767,1702, +1767,1703,1768, +1704,1768,1703, +1768,1704,1769, +1705,1769,1704, +1769,1705,1770, +1706,1770,1705, +1770,1706,1771, +1707,1771,1706, +1771,1707,1772, +1708,1772,1707, +1772,1708,1773, +1709,1773,1708, +1773,1709,1774, +1710,1774,1709, +1774,1710,1775, +1711,1775,1710, +1775,1711,1776, +1712,1776,1711, +1776,1712,1777, +1713,1777,1712, +1777,1713,1778, +1714,1778,1713, +1778,1714,1779, +1715,1779,1714, +1779,1715,1780, +1716,1780,1715, +1780,1716,1781, +1717,1781,1716, +1781,1717,1782, +1718,1782,1717, +1782,1718,1783, +1719,1783,1718, +1783,1719,1784, +1720,1784,1719, +1784,1720,1785, +1721,1785,1720, +1785,1721,1786, +1722,1786,1721, +1786,1722,1787, +1723,1787,1722, +1787,1723,1788, +1724,1788,1723, +1788,1724,1789, +1725,1789,1724, +1789,1725,1790, +1726,1790,1725, +1790,1726,1791, +1727,1791,1726, +1792,1728,1793, +1729,1793,1728, +1793,1729,1794, +1730,1794,1729, +1794,1730,1795, +1731,1795,1730, +1795,1731,1796, +1732,1796,1731, +1796,1732,1797, +1733,1797,1732, +1797,1733,1798, +1734,1798,1733, +1798,1734,1799, +1735,1799,1734, +1799,1735,1800, +1736,1800,1735, +1800,1736,1801, +1737,1801,1736, +1801,1737,1802, +1738,1802,1737, +1802,1738,1803, +1739,1803,1738, +1803,1739,1804, +1740,1804,1739, +1804,1740,1805, +1741,1805,1740, +1805,1741,1806, +1742,1806,1741, +1806,1742,1807, +1743,1807,1742, +1807,1743,1808, +1744,1808,1743, +1808,1744,1809, +1745,1809,1744, +1809,1745,1810, +1746,1810,1745, +1810,1746,1811, +1747,1811,1746, +1811,1747,1812, +1748,1812,1747, +1812,1748,1813, +1749,1813,1748, +1813,1749,1814, +1750,1814,1749, +1814,1750,1815, +1751,1815,1750, +1815,1751,1816, +1752,1816,1751, +1816,1752,1817, +1753,1817,1752, +1817,1753,1818, +1754,1818,1753, +1818,1754,1819, +1755,1819,1754, +1819,1755,1820, +1756,1820,1755, +1820,1756,1821, +1757,1821,1756, +1821,1757,1822, +1758,1822,1757, +1822,1758,1823, +1759,1823,1758, +1823,1759,1824, +1760,1824,1759, +1824,1760,1825, +1761,1825,1760, +1825,1761,1826, +1762,1826,1761, +1826,1762,1827, +1763,1827,1762, +1827,1763,1828, +1764,1828,1763, +1828,1764,1829, +1765,1829,1764, +1829,1765,1830, +1766,1830,1765, +1830,1766,1831, +1767,1831,1766, +1831,1767,1832, +1768,1832,1767, +1832,1768,1833, +1769,1833,1768, +1833,1769,1834, +1770,1834,1769, +1834,1770,1835, +1771,1835,1770, +1835,1771,1836, +1772,1836,1771, +1836,1772,1837, +1773,1837,1772, +1837,1773,1838, +1774,1838,1773, +1838,1774,1839, +1775,1839,1774, +1839,1775,1840, +1776,1840,1775, +1840,1776,1841, +1777,1841,1776, +1841,1777,1842, +1778,1842,1777, +1842,1778,1843, +1779,1843,1778, +1843,1779,1844, +1780,1844,1779, +1844,1780,1845, +1781,1845,1780, +1845,1781,1846, +1782,1846,1781, +1846,1782,1847, +1783,1847,1782, +1847,1783,1848, +1784,1848,1783, +1848,1784,1849, +1785,1849,1784, +1849,1785,1850, +1786,1850,1785, +1850,1786,1851, +1787,1851,1786, +1851,1787,1852, +1788,1852,1787, +1852,1788,1853, +1789,1853,1788, +1853,1789,1854, +1790,1854,1789, +1854,1790,1855, +1791,1855,1790, +1856,1792,1857, +1793,1857,1792, +1857,1793,1858, +1794,1858,1793, +1858,1794,1859, +1795,1859,1794, +1859,1795,1860, +1796,1860,1795, +1860,1796,1861, +1797,1861,1796, +1861,1797,1862, +1798,1862,1797, +1862,1798,1863, +1799,1863,1798, +1863,1799,1864, +1800,1864,1799, +1864,1800,1865, +1801,1865,1800, +1865,1801,1866, +1802,1866,1801, +1866,1802,1867, +1803,1867,1802, +1867,1803,1868, +1804,1868,1803, +1868,1804,1869, +1805,1869,1804, +1869,1805,1870, +1806,1870,1805, +1870,1806,1871, +1807,1871,1806, +1871,1807,1872, +1808,1872,1807, +1872,1808,1873, +1809,1873,1808, +1873,1809,1874, +1810,1874,1809, +1874,1810,1875, +1811,1875,1810, +1875,1811,1876, +1812,1876,1811, +1876,1812,1877, +1813,1877,1812, +1877,1813,1878, +1814,1878,1813, +1878,1814,1879, +1815,1879,1814, +1879,1815,1880, +1816,1880,1815, +1880,1816,1881, +1817,1881,1816, +1881,1817,1882, +1818,1882,1817, +1882,1818,1883, +1819,1883,1818, +1883,1819,1884, +1820,1884,1819, +1884,1820,1885, +1821,1885,1820, +1885,1821,1886, +1822,1886,1821, +1886,1822,1887, +1823,1887,1822, +1887,1823,1888, +1824,1888,1823, +1888,1824,1889, +1825,1889,1824, +1889,1825,1890, +1826,1890,1825, +1890,1826,1891, +1827,1891,1826, +1891,1827,1892, +1828,1892,1827, +1892,1828,1893, +1829,1893,1828, +1893,1829,1894, +1830,1894,1829, +1894,1830,1895, +1831,1895,1830, +1895,1831,1896, +1832,1896,1831, +1896,1832,1897, +1833,1897,1832, +1897,1833,1898, +1834,1898,1833, +1898,1834,1899, +1835,1899,1834, +1899,1835,1900, +1836,1900,1835, +1900,1836,1901, +1837,1901,1836, +1901,1837,1902, +1838,1902,1837, +1902,1838,1903, +1839,1903,1838, +1903,1839,1904, +1840,1904,1839, +1904,1840,1905, +1841,1905,1840, +1905,1841,1906, +1842,1906,1841, +1906,1842,1907, +1843,1907,1842, +1907,1843,1908, +1844,1908,1843, +1908,1844,1909, +1845,1909,1844, +1909,1845,1910, +1846,1910,1845, +1910,1846,1911, +1847,1911,1846, +1911,1847,1912, +1848,1912,1847, +1912,1848,1913, +1849,1913,1848, +1913,1849,1914, +1850,1914,1849, +1914,1850,1915, +1851,1915,1850, +1915,1851,1916, +1852,1916,1851, +1916,1852,1917, +1853,1917,1852, +1917,1853,1918, +1854,1918,1853, +1918,1854,1919, +1855,1919,1854, +1920,1856,1921, +1857,1921,1856, +1921,1857,1922, +1858,1922,1857, +1922,1858,1923, +1859,1923,1858, +1923,1859,1924, +1860,1924,1859, +1924,1860,1925, +1861,1925,1860, +1925,1861,1926, +1862,1926,1861, +1926,1862,1927, +1863,1927,1862, +1927,1863,1928, +1864,1928,1863, +1928,1864,1929, +1865,1929,1864, +1929,1865,1930, +1866,1930,1865, +1930,1866,1931, +1867,1931,1866, +1931,1867,1932, +1868,1932,1867, +1932,1868,1933, +1869,1933,1868, +1933,1869,1934, +1870,1934,1869, +1934,1870,1935, +1871,1935,1870, +1935,1871,1936, +1872,1936,1871, +1936,1872,1937, +1873,1937,1872, +1937,1873,1938, +1874,1938,1873, +1938,1874,1939, +1875,1939,1874, +1939,1875,1940, +1876,1940,1875, +1940,1876,1941, +1877,1941,1876, +1941,1877,1942, +1878,1942,1877, +1942,1878,1943, +1879,1943,1878, +1943,1879,1944, +1880,1944,1879, +1944,1880,1945, +1881,1945,1880, +1945,1881,1946, +1882,1946,1881, +1946,1882,1947, +1883,1947,1882, +1947,1883,1948, +1884,1948,1883, +1948,1884,1949, +1885,1949,1884, +1949,1885,1950, +1886,1950,1885, +1950,1886,1951, +1887,1951,1886, +1951,1887,1952, +1888,1952,1887, +1952,1888,1953, +1889,1953,1888, +1953,1889,1954, +1890,1954,1889, +1954,1890,1955, +1891,1955,1890, +1955,1891,1956, +1892,1956,1891, +1956,1892,1957, +1893,1957,1892, +1957,1893,1958, +1894,1958,1893, +1958,1894,1959, +1895,1959,1894, +1959,1895,1960, +1896,1960,1895, +1960,1896,1961, +1897,1961,1896, +1961,1897,1962, +1898,1962,1897, +1962,1898,1963, +1899,1963,1898, +1963,1899,1964, +1900,1964,1899, +1964,1900,1965, +1901,1965,1900, +1965,1901,1966, +1902,1966,1901, +1966,1902,1967, +1903,1967,1902, +1967,1903,1968, +1904,1968,1903, +1968,1904,1969, +1905,1969,1904, +1969,1905,1970, +1906,1970,1905, +1970,1906,1971, +1907,1971,1906, +1971,1907,1972, +1908,1972,1907, +1972,1908,1973, +1909,1973,1908, +1973,1909,1974, +1910,1974,1909, +1974,1910,1975, +1911,1975,1910, +1975,1911,1976, +1912,1976,1911, +1976,1912,1977, +1913,1977,1912, +1977,1913,1978, +1914,1978,1913, +1978,1914,1979, +1915,1979,1914, +1979,1915,1980, +1916,1980,1915, +1980,1916,1981, +1917,1981,1916, +1981,1917,1982, +1918,1982,1917, +1982,1918,1983, +1919,1983,1918, +1984,1920,1985, +1921,1985,1920, +1985,1921,1986, +1922,1986,1921, +1986,1922,1987, +1923,1987,1922, +1987,1923,1988, +1924,1988,1923, +1988,1924,1989, +1925,1989,1924, +1989,1925,1990, +1926,1990,1925, +1990,1926,1991, +1927,1991,1926, +1991,1927,1992, +1928,1992,1927, +1992,1928,1993, +1929,1993,1928, +1993,1929,1994, +1930,1994,1929, +1994,1930,1995, +1931,1995,1930, +1995,1931,1996, +1932,1996,1931, +1996,1932,1997, +1933,1997,1932, +1997,1933,1998, +1934,1998,1933, +1998,1934,1999, +1935,1999,1934, +1999,1935,2000, +1936,2000,1935, +2000,1936,2001, +1937,2001,1936, +2001,1937,2002, +1938,2002,1937, +2002,1938,2003, +1939,2003,1938, +2003,1939,2004, +1940,2004,1939, +2004,1940,2005, +1941,2005,1940, +2005,1941,2006, +1942,2006,1941, +2006,1942,2007, +1943,2007,1942, +2007,1943,2008, +1944,2008,1943, +2008,1944,2009, +1945,2009,1944, +2009,1945,2010, +1946,2010,1945, +2010,1946,2011, +1947,2011,1946, +2011,1947,2012, +1948,2012,1947, +2012,1948,2013, +1949,2013,1948, +2013,1949,2014, +1950,2014,1949, +2014,1950,2015, +1951,2015,1950, +2015,1951,2016, +1952,2016,1951, +2016,1952,2017, +1953,2017,1952, +2017,1953,2018, +1954,2018,1953, +2018,1954,2019, +1955,2019,1954, +2019,1955,2020, +1956,2020,1955, +2020,1956,2021, +1957,2021,1956, +2021,1957,2022, +1958,2022,1957, +2022,1958,2023, +1959,2023,1958, +2023,1959,2024, +1960,2024,1959, +2024,1960,2025, +1961,2025,1960, +2025,1961,2026, +1962,2026,1961, +2026,1962,2027, +1963,2027,1962, +2027,1963,2028, +1964,2028,1963, +2028,1964,2029, +1965,2029,1964, +2029,1965,2030, +1966,2030,1965, +2030,1966,2031, +1967,2031,1966, +2031,1967,2032, +1968,2032,1967, +2032,1968,2033, +1969,2033,1968, +2033,1969,2034, +1970,2034,1969, +2034,1970,2035, +1971,2035,1970, +2035,1971,2036, +1972,2036,1971, +2036,1972,2037, +1973,2037,1972, +2037,1973,2038, +1974,2038,1973, +2038,1974,2039, +1975,2039,1974, +2039,1975,2040, +1976,2040,1975, +2040,1976,2041, +1977,2041,1976, +2041,1977,2042, +1978,2042,1977, +2042,1978,2043, +1979,2043,1978, +2043,1979,2044, +1980,2044,1979, +2044,1980,2045, +1981,2045,1980, +2045,1981,2046, +1982,2046,1981, +2046,1982,2047, +1983,2047,1982, +}; + From 382e2c040710106763dc7f61a8ba5ace15b19578 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Oct 2014 11:26:50 -0700 Subject: [PATCH 354/461] adjust params --- tests/bullet/Demos/HelloWorld/BenchmarkDemo.cpp | 2 +- tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp | 2 +- tests/bullet/Demos/HelloWorld/setup.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/bullet/Demos/HelloWorld/BenchmarkDemo.cpp b/tests/bullet/Demos/HelloWorld/BenchmarkDemo.cpp index 8a4eaea4d6ef1..b13d7855068c2 100644 --- a/tests/bullet/Demos/HelloWorld/BenchmarkDemo.cpp +++ b/tests/bullet/Demos/HelloWorld/BenchmarkDemo.cpp @@ -924,7 +924,7 @@ void BenchmarkDemo::createTest3() { setCameraDistance(btScalar(50.)); - int size = 16; + int size = 6; float sizeX = 1.f; float sizeY = 1.f; diff --git a/tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp b/tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp index 1b26d3a96134f..452032a5110f0 100644 --- a/tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp +++ b/tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp @@ -41,7 +41,7 @@ void EMSCRIPTEN_KEEPALIVE simulate() { if (i % 10 == 0) std::cout << "frame " << i << "starting" << std::endl; benchmarkDemo3.initPhysics(); - for (int i = 0; i < 1; i++) { + for (int i = 0; i < 15; i++) { benchmarkDemo3.clientMoveAndDisplay(); } benchmarkDemo3.exitPhysics(); diff --git a/tests/bullet/Demos/HelloWorld/setup.js b/tests/bullet/Demos/HelloWorld/setup.js index fc5f01c38be66..445826823f66b 100644 --- a/tests/bullet/Demos/HelloWorld/setup.js +++ b/tests/bullet/Demos/HelloWorld/setup.js @@ -9,7 +9,7 @@ function startSimulation() { //for (var j = 0; j < 10; j++) Module._addBody(); if (i === 30) clearInterval(interval); i++; - }, 0); + }, 1); } var startTime = Date.now(); From 1b782482026a4f72b8f26f6145afa922d5119a85 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Oct 2014 11:29:22 -0700 Subject: [PATCH 355/461] show fractions of fps --- tests/bullet/Demos/HelloWorld/setup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/bullet/Demos/HelloWorld/setup.js b/tests/bullet/Demos/HelloWorld/setup.js index 445826823f66b..4aaceafbd09d7 100644 --- a/tests/bullet/Demos/HelloWorld/setup.js +++ b/tests/bullet/Demos/HelloWorld/setup.js @@ -4,7 +4,7 @@ function startSimulation() { var pre = Date.now(); Module._simulate(); var delta = Date.now() - pre; - var fps = Math.round(1000/delta); + var fps = (1000/delta).toFixed(2); console.log('frame ' + [i, fps, pre - startTime].join(', ')); //for (var j = 0; j < 10; j++) Module._addBody(); if (i === 30) clearInterval(interval); From 0f603c3175f41c9e29997e8bcdb0f179a14896f2 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Oct 2014 12:57:37 -0700 Subject: [PATCH 356/461] remove some unneeded code for Math.min --- emscripten.py | 1 - 1 file changed, 1 deletion(-) diff --git a/emscripten.py b/emscripten.py index 14d93a92acd08..05227761a45e9 100755 --- a/emscripten.py +++ b/emscripten.py @@ -1064,7 +1064,6 @@ def fix_item(item): fundamentals += ['SIMD'] if settings['ALLOW_MEMORY_GROWTH']: fundamentals.append('byteLength') math_envs = ['Math.min'] # TODO: move min to maths - asm_setup += '\n'.join(['var %s = %s;' % (f.replace('.', '_'), f) for f in math_envs]) if settings['PRECISE_F32']: maths += ['Math.fround'] From 8cb50b7bf839863875ffc0d25f732858a01dae32 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Oct 2014 13:05:49 -0700 Subject: [PATCH 357/461] save asm module args on Module object --- emscripten.py | 12 ++++++++++-- tools/emterpretify.py | 3 +-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/emscripten.py b/emscripten.py index 05227761a45e9..b3bc397f07b1b 100755 --- a/emscripten.py +++ b/emscripten.py @@ -1239,11 +1239,16 @@ def math_fix(g): funcs_js = [''' %s + Module%s = %s; + Module%s = %s; // EMSCRIPTEN_START_ASM var asm = (function(global, env, buffer) { %s %s - ''' % (asm_setup, "'use asm';" if not metadata.get('hasInlineJS') and not settings['SIDE_MODULE'] and settings['ASM_JS'] == 1 else "'almost asm';", ''' + ''' % (asm_setup, + access_quote('asmGlobalArg'), the_global, + access_quote('asmLibraryArg'), sending, + "'use asm';" if not metadata.get('hasInlineJS') and not settings['SIDE_MODULE'] and settings['ASM_JS'] == 1 else "'almost asm';", ''' var HEAP8 = new global%s(buffer); var HEAP16 = new global%s(buffer); var HEAP32 = new global%s(buffer); @@ -1369,7 +1374,10 @@ def math_fix(g): // EMSCRIPTEN_END_ASM (%s, %s, buffer); %s; - ''' % (pre_tables + '\n'.join(function_tables_impls) + '\n' + function_tables_defs.replace('\n', '\n '), exports, the_global, sending, receiving)] + ''' % (pre_tables + '\n'.join(function_tables_impls) + '\n' + function_tables_defs.replace('\n', '\n '), exports, + 'Module' + access_quote('asmGlobalArg'), + 'Module' + access_quote('asmLibraryArg'), + receiving)] if not settings.get('SIDE_MODULE'): funcs_js.append(''' diff --git a/tools/emterpretify.py b/tools/emterpretify.py index c3d7d23cc492f..38b77f7f4b645 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -793,8 +793,7 @@ def post_process_code(code): asm.set_pre_js(js='var EMTSTACKTOP = STATIC_BASE + %s, EMT_STACK_MAX = EMTSTACKTOP + %d;' % (stack_start, EMT_STACK_MAX)) # send EMT vars into asm -brace = asm.post_js.find(', {') + 3 -asm.post_js = asm.post_js[:brace] + ' "EMTSTACKTOP": EMTSTACKTOP, "EMT_STACK_MAX": EMT_STACK_MAX, ' + asm.post_js[brace:] +asm.pre_js += 'Module.asmLibraryArg.EMTSTACKTOP = EMTSTACKTOP; Module.asmLibraryArg.EMT_STACK_MAX = EMT_STACK_MAX;\n' asm.imports_js += 'var EMTSTACKTOP = env.EMTSTACKTOP|0;\nvar EMT_STACK_MAX = env.EMT_STACK_MAX|0;\n' asm.write(outfile) From 52f78fb983553fa2152184eb7b8981e62007e361 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Oct 2014 13:29:03 -0700 Subject: [PATCH 358/461] add distill_asm tool --- tools/distill_asm.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 tools/distill_asm.py diff --git a/tools/distill_asm.py b/tools/distill_asm.py new file mode 100644 index 0000000000000..65f9536151cbb --- /dev/null +++ b/tools/distill_asm.py @@ -0,0 +1,13 @@ +''' +Gets the core asm module out of an emscripten output file +''' + +import os, sys +import asm_module + +infile = sys.argv[1] +outfile = sys.argv[2] + +asm = asm_module.AsmModule(infile) +open(outfile, 'w').write(asm.asm_js + ';') + From d580b49a54599b7ef8e3957d201107a83a3e8684 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Oct 2014 13:57:47 -0700 Subject: [PATCH 359/461] save asm buffer on module object --- src/preamble.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/preamble.js b/src/preamble.js index 6e1abd7e20a91..d76d93f7aa63b 100644 --- a/src/preamble.js +++ b/src/preamble.js @@ -999,7 +999,7 @@ function enlargeMemory() { assert(TOTAL_MEMORY <= Math.pow(2, 30)); // 2^30==1GB is a practical maximum - 2^31 is already close to possible negative numbers etc. #if USE_TYPED_ARRAYS == 2 var oldHEAP8 = HEAP8; - var buffer = new ArrayBuffer(TOTAL_MEMORY); + var buffer = Module['buffer'] = new ArrayBuffer(TOTAL_MEMORY); Module['HEAP8'] = HEAP8 = new Int8Array(buffer); Module['HEAP16'] = HEAP16 = new Int16Array(buffer); Module['HEAP32'] = HEAP32 = new Int32Array(buffer); @@ -1092,6 +1092,7 @@ Module['FHEAP'] = FHEAP; #endif #endif #if USE_TYPED_ARRAYS == 2 +Module['buffer'] = buffer; Module['HEAP8'] = HEAP8; Module['HEAP16'] = HEAP16; Module['HEAP32'] = HEAP32; From f2cab6dff0b01e016b7af3752d5d29d9efdadc4e Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Oct 2014 13:58:34 -0700 Subject: [PATCH 360/461] override global buffer var when enlarging memory, to not keep the old one alive --- src/preamble.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/preamble.js b/src/preamble.js index d76d93f7aa63b..e37670aee1359 100644 --- a/src/preamble.js +++ b/src/preamble.js @@ -999,7 +999,7 @@ function enlargeMemory() { assert(TOTAL_MEMORY <= Math.pow(2, 30)); // 2^30==1GB is a practical maximum - 2^31 is already close to possible negative numbers etc. #if USE_TYPED_ARRAYS == 2 var oldHEAP8 = HEAP8; - var buffer = Module['buffer'] = new ArrayBuffer(TOTAL_MEMORY); + buffer = Module['buffer'] = new ArrayBuffer(TOTAL_MEMORY); Module['HEAP8'] = HEAP8 = new Int8Array(buffer); Module['HEAP16'] = HEAP16 = new Int16Array(buffer); Module['HEAP32'] = HEAP32 = new Int32Array(buffer); From 9ab54ad4057b08e66459815031af743b4c446d3e Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Oct 2014 14:08:11 -0700 Subject: [PATCH 361/461] work on swapping --- tools/distill_asm.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/tools/distill_asm.py b/tools/distill_asm.py index 65f9536151cbb..8ab38347ffbf4 100644 --- a/tools/distill_asm.py +++ b/tools/distill_asm.py @@ -1,5 +1,11 @@ ''' -Gets the core asm module out of an emscripten output file +Gets the core asm module out of an emscripten output file. + +By default it adds a ';' to end the + + var asm = ... + +statement. You can add a third param to customize that. If the third param is 'swap-in', it will emit code to swap this asm module in, instead of the default one. ''' import os, sys @@ -7,7 +13,17 @@ infile = sys.argv[1] outfile = sys.argv[2] +extra = sys.argv[3] if len(sys.argv) >= 4 else ';' + +if extra === 'swap-in': + # we do |var asm = | just like the original codebase, so that gets overridden anyhow (assuming global scripts). + # pass in the same arguments, fire the callback if requested + # TODO: fix up the asm exports + extra = r''' + (Module.asmGlobalArg, Module.asmLibraryArg, Module['buffer']); + if (Module['onAsmSwap']) Module['onAsmSwap'](); +''' asm = asm_module.AsmModule(infile) -open(outfile, 'w').write(asm.asm_js + ';') +open(outfile, 'w').write(asm.asm_js + extra) From 42cc8f2210ab686ebfc4fdfb0b361f9907a59542 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Oct 2014 14:13:01 -0700 Subject: [PATCH 362/461] comment on distill not working in closure --- tools/distill_asm.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/distill_asm.py b/tools/distill_asm.py index 8ab38347ffbf4..2cea7a94eb736 100644 --- a/tools/distill_asm.py +++ b/tools/distill_asm.py @@ -6,6 +6,8 @@ var asm = ... statement. You can add a third param to customize that. If the third param is 'swap-in', it will emit code to swap this asm module in, instead of the default one. + +XXX this probably doesn't work with closure compiler advanced yet XXX ''' import os, sys From 2b692e14cb057744e3de8c3a8aa537dda066a527 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Oct 2014 14:21:35 -0700 Subject: [PATCH 363/461] SWAPPABLE_ASM_MODULE option, and finish distill --- emscripten.py | 5 ++++- src/settings.js | 3 +++ tools/distill_asm.py | 6 ++++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/emscripten.py b/emscripten.py index b3bc397f07b1b..467ab1d31c8b0 100755 --- a/emscripten.py +++ b/emscripten.py @@ -1231,7 +1231,10 @@ def math_fix(g): }; ''' for s in exported_implemented_functions if s not in ['_malloc', '_free', '_memcpy', '_memset']]) - receiving += ';\n'.join(['var ' + s + ' = Module["' + s + '"] = asm["' + s + '"]' for s in exported_implemented_functions + function_tables]) + if not settings['SWAPPABLE_ASM_MODULE']: + receiving += ';\n'.join(['var ' + s + ' = Module["' + s + '"] = asm["' + s + '"]' for s in exported_implemented_functions + function_tables]) + else: + receiving += 'Module["asm"] = asm;\n' + ';\n'.join(['var ' + s + ' = Module["' + s + '"] = function() { return Module["asm"]["' + s + '"] }' for s in exported_implemented_functions + function_tables]) # finalize diff --git a/src/settings.js b/src/settings.js index 1c093533f7fe3..216ac961c1108 100644 --- a/src/settings.js +++ b/src/settings.js @@ -535,6 +535,9 @@ var FINALIZE_ASM_JS = 1; // If 1, will finalize the final emitted code, includin // that prevent later js optimizer passes from running, like // converting +5 into 5.0 (the js optimizer sees 5.0 as just 5). +var SWAPPABLE_ASM_MODULE = 0; // If 1, then all exports from the asm.js module will be accessed + // indirectly, which allow the asm module to be swapped later. + var PGO = 0; // Enables profile-guided optimization in the form of runtime checks for // which functions are actually called. Emits a list during shutdown that you // can pass to DEAD_FUNCTIONS (you can also emit the list manually by diff --git a/tools/distill_asm.py b/tools/distill_asm.py index 2cea7a94eb736..d1eff2796a6c5 100644 --- a/tools/distill_asm.py +++ b/tools/distill_asm.py @@ -19,10 +19,12 @@ if extra === 'swap-in': # we do |var asm = | just like the original codebase, so that gets overridden anyhow (assuming global scripts). - # pass in the same arguments, fire the callback if requested - # TODO: fix up the asm exports extra = r''' (Module.asmGlobalArg, Module.asmLibraryArg, Module['buffer']); + // special fixups + asm.stackRestore(Module['asm'].stackSave()); + // Finish swap + Module['asm'] = asm; if (Module['onAsmSwap']) Module['onAsmSwap'](); ''' From c529b5679c1f3eabde32d2f27599b2ddae5b3947 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Oct 2014 14:23:12 -0700 Subject: [PATCH 364/461] remove unneeded newline --- tools/distill_asm.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/distill_asm.py b/tools/distill_asm.py index d1eff2796a6c5..c5d83e1f17f84 100644 --- a/tools/distill_asm.py +++ b/tools/distill_asm.py @@ -19,8 +19,7 @@ if extra === 'swap-in': # we do |var asm = | just like the original codebase, so that gets overridden anyhow (assuming global scripts). - extra = r''' - (Module.asmGlobalArg, Module.asmLibraryArg, Module['buffer']); + extra = r''' (Module.asmGlobalArg, Module.asmLibraryArg, Module['buffer']); // special fixups asm.stackRestore(Module['asm'].stackSave()); // Finish swap From 170a106d59fa54f8971ca609d5affd36565e2075 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Oct 2014 15:27:18 -0700 Subject: [PATCH 365/461] fix swappable bug --- emscripten.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emscripten.py b/emscripten.py index 467ab1d31c8b0..7608704a0df49 100755 --- a/emscripten.py +++ b/emscripten.py @@ -1234,7 +1234,7 @@ def math_fix(g): if not settings['SWAPPABLE_ASM_MODULE']: receiving += ';\n'.join(['var ' + s + ' = Module["' + s + '"] = asm["' + s + '"]' for s in exported_implemented_functions + function_tables]) else: - receiving += 'Module["asm"] = asm;\n' + ';\n'.join(['var ' + s + ' = Module["' + s + '"] = function() { return Module["asm"]["' + s + '"] }' for s in exported_implemented_functions + function_tables]) + receiving += 'Module["asm"] = asm;\n' + ';\n'.join(['var ' + s + ' = Module["' + s + '"] = function() { return Module["asm"]["' + s + '"].apply(null, arguments) }' for s in exported_implemented_functions + function_tables]) # finalize From cc2f077208968d2044fc39aea22df29171b6f8a3 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Oct 2014 15:27:38 -0700 Subject: [PATCH 366/461] fix distill typo --- tools/distill_asm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/distill_asm.py b/tools/distill_asm.py index c5d83e1f17f84..785491d2daece 100644 --- a/tools/distill_asm.py +++ b/tools/distill_asm.py @@ -17,7 +17,7 @@ outfile = sys.argv[2] extra = sys.argv[3] if len(sys.argv) >= 4 else ';' -if extra === 'swap-in': +if extra == 'swap-in': # we do |var asm = | just like the original codebase, so that gets overridden anyhow (assuming global scripts). extra = r''' (Module.asmGlobalArg, Module.asmLibraryArg, Module['buffer']); // special fixups From e1377d7239834f48213b69d9fef0f1f2556ba4d7 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Oct 2014 15:27:58 -0700 Subject: [PATCH 367/461] tolerate lack of memory init pattern in asm_module, implies no static bump --- tools/asm_module.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/asm_module.py b/tools/asm_module.py index d87348df111a5..686e49e90072b 100644 --- a/tools/asm_module.py +++ b/tools/asm_module.py @@ -19,7 +19,10 @@ def __init__(self, filename): self.asm_js = self.js[self.start_asm:self.end_asm] # heap initializer - self.staticbump = int(re.search(shared.JS.memory_staticbump_pattern, self.pre_js).group(1)) + try: + self.staticbump = int(re.search(shared.JS.memory_staticbump_pattern, self.pre_js).group(1)) + except: + self.staticbump = 0 if self.staticbump: try: self.mem_init_js = re.search(shared.JS.memory_initializer_pattern, self.pre_js).group(0) From 641291a242653350d372732dfcef0e5076ed63a9 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Oct 2014 15:47:06 -0700 Subject: [PATCH 368/461] fix positioning of pre and post asm markers --- tools/js_optimizer.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/js_optimizer.py b/tools/js_optimizer.py index 083504ecc4071..e658e29f7ec8d 100644 --- a/tools/js_optimizer.py +++ b/tools/js_optimizer.py @@ -315,12 +315,12 @@ def write_chunk(chunk, i): subprocess.Popen(js_engine + [JS_OPTIMIZER, cle, 'noPrintMetadata'] + (['minifyWhitespace'] if 'minifyWhitespace' in passes else []), stdout=open(cld, 'w')).communicate() temp_files.note(cld) coutput = open(cld).read() - coutput = coutput.replace('wakaUnknownBefore();', '') + coutput = coutput.replace('wakaUnknownBefore();', start_asm) after = 'wakaUnknownAfter' start = coutput.find(after) end = coutput.find(')', start) - pre = coutput[:start] + '(function(global,env,buffer) {\n' + start_asm + pre_2[pre_2.find('{')+1:] - post = post_1[:post_1.rfind('}')] + '\n' + end_asm + '\n})' + coutput[end+1:] + pre = coutput[:start] + '(function(global,env,buffer) {\n' + pre_2[pre_2.find('{')+1:] + post = post_1 + end_asm + coutput[end+1:] filename += '.jo.js' f = open(filename, 'w') From b559b9c52d875bb31aa37c6c4002af807c99dc25 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Oct 2014 15:53:30 -0700 Subject: [PATCH 369/461] add test for asm module swapping --- tests/asm_swap.cpp | 14 ++++++++++++++ tests/asm_swap2.cpp | 14 ++++++++++++++ tests/test_browser.py | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 tests/asm_swap.cpp create mode 100644 tests/asm_swap2.cpp diff --git a/tests/asm_swap.cpp b/tests/asm_swap.cpp new file mode 100644 index 0000000000000..ee2fc0f9261d1 --- /dev/null +++ b/tests/asm_swap.cpp @@ -0,0 +1,14 @@ +#include + +extern "C" { + +int EMSCRIPTEN_KEEPALIVE func() { + return 10; +} + +void EMSCRIPTEN_KEEPALIVE report(int result) { + REPORT_RESULT(); +} + +} + diff --git a/tests/asm_swap2.cpp b/tests/asm_swap2.cpp new file mode 100644 index 0000000000000..fd9fb0dc8d1b5 --- /dev/null +++ b/tests/asm_swap2.cpp @@ -0,0 +1,14 @@ +#include + +extern "C" { + +int EMSCRIPTEN_KEEPALIVE func() { + return 22; +} + +void EMSCRIPTEN_KEEPALIVE report(int result) { + REPORT_RESULT(); +} + +} + diff --git a/tests/test_browser.py b/tests/test_browser.py index ec3dbfe9fd15d..396fc28b45db8 100644 --- a/tests/test_browser.py +++ b/tests/test_browser.py @@ -2026,3 +2026,39 @@ def test_locate_file(self): def test_glfw3(self): self.btest(path_from_root('tests', 'glfw3.c'), args=['-s', 'LEGACY_GL_EMULATION=1', '-s', 'USE_GLFW=3'], expected='1') + + def test_asm_swapping(self): + self.clear() + open('run.js', 'w').write(r''' +Module['_main'] = function() { + // test proper initial result + var result = Module._func(); + console.log('first: ' + result); + if (result !== 10) throw 'bad first result'; + + // load second module to be swapped in + var second = document.createElement('script'); + second.onload = function() { console.log('loaded second') }; + second.src = 'second.js'; + document.body.appendChild(second); + console.log('second appended'); + + Module['onAsmSwap'] = function() { + console.log('swapped'); + // verify swapped-in result + var result = Module._func(); + console.log('second: ' + result); + if (result !== 22) throw 'bad second result'; + Module._report(999); + console.log('reported'); + }; +}; +''') + for opts in [['-O2', '-g2']]: #[[], ['-O1'], ['-O2']]: + print opts + open('second.cpp', 'w').write(self.with_report_result(open(path_from_root('tests', 'asm_swap2.cpp')).read())) + Popen([PYTHON, EMCC, 'second.cpp'] + opts).communicate() + Popen([PYTHON, path_from_root('tools', 'distill_asm.py'), 'a.out.js', 'second.js', 'swap-in']).communicate() + assert os.path.exists('second.js') + self.btest(path_from_root('tests', 'asm_swap.cpp'), args=['-s', 'SWAPPABLE_ASM_MODULE=1', '-s', 'NO_EXIT_RUNTIME=1', '--pre-js', 'run.js'] + opts, expected='999') + From d876786930e7d1831f8a151743c8cadab477d1dd Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Oct 2014 15:58:06 -0700 Subject: [PATCH 370/461] enable browser.test_asm_swapping in multiple test modes --- tests/test_browser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_browser.py b/tests/test_browser.py index 396fc28b45db8..235cfacef0337 100644 --- a/tests/test_browser.py +++ b/tests/test_browser.py @@ -2054,7 +2054,7 @@ def test_asm_swapping(self): }; }; ''') - for opts in [['-O2', '-g2']]: #[[], ['-O1'], ['-O2']]: + for opts in [[], ['-O1'], ['-O2', '-profiling'], ['-O2']]: print opts open('second.cpp', 'w').write(self.with_report_result(open(path_from_root('tests', 'asm_swap2.cpp')).read())) Popen([PYTHON, EMCC, 'second.cpp'] + opts).communicate() From dc9d6452e0f038482f5abdf52a77cf9772d52fdf Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Oct 2014 16:07:52 -0700 Subject: [PATCH 371/461] always save the original when emterpretifying, it's right there anyhow --- tools/emterpretify.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 38b77f7f4b645..dba1324748240 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -563,8 +563,7 @@ def process(code): #print 'emterpretifying %s to %s' % (infile, outfile) -if shared.DEBUG: - shutil.copyfile(infile, infile + '.save.js') +shutil.copyfile(infile, infile + '.orig.js') # final global functions From 44d33939d53e7428902cc7e814578674374a924e Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Oct 2014 16:24:27 -0700 Subject: [PATCH 372/461] work towards swapping in bullet demo --- .../Demos/HelloWorld/HelloWorldFrames.cpp | 4 ++-- .../Demos/HelloWorld/frames.emterp.swap.html | 19 +++++++++++++++++++ tests/bullet/Demos/HelloWorld/frames.html | 10 ++++++++-- 3 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 tests/bullet/Demos/HelloWorld/frames.emterp.swap.html diff --git a/tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp b/tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp index 452032a5110f0..ece7cadf7dbd7 100644 --- a/tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp +++ b/tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp @@ -38,7 +38,7 @@ extern "C" { void EMSCRIPTEN_KEEPALIVE simulate() { static int i = 0; - if (i % 10 == 0) std::cout << "frame " << i << "starting" << std::endl; + if (i % 10 == 0) std::cout << "frame " << i << " starting" << std::endl; benchmarkDemo3.initPhysics(); for (int i = 0; i < 15; i++) { @@ -46,7 +46,7 @@ void EMSCRIPTEN_KEEPALIVE simulate() { } benchmarkDemo3.exitPhysics(); - if (i % 10 == 0) std::cout << "frame " << i << "complete" << std::endl; + if (i % 10 == 0) std::cout << "frame " << i << " complete" << std::endl; i++; } diff --git a/tests/bullet/Demos/HelloWorld/frames.emterp.swap.html b/tests/bullet/Demos/HelloWorld/frames.emterp.swap.html new file mode 100644 index 0000000000000..11f21938195f7 --- /dev/null +++ b/tests/bullet/Demos/HelloWorld/frames.emterp.swap.html @@ -0,0 +1,19 @@ + + + + + + diff --git a/tests/bullet/Demos/HelloWorld/frames.html b/tests/bullet/Demos/HelloWorld/frames.html index 7a194bb8267ee..1ac8590aeacb9 100644 --- a/tests/bullet/Demos/HelloWorld/frames.html +++ b/tests/bullet/Demos/HelloWorld/frames.html @@ -3,8 +3,14 @@ From e9e1a4354ae6fbb4e32199a14d170196f40d930c Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Oct 2014 16:33:15 -0700 Subject: [PATCH 373/461] fix bullet swap demo --- tests/bullet/Demos/HelloWorld/frames.html | 2 +- tools/distill_asm.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/bullet/Demos/HelloWorld/frames.html b/tests/bullet/Demos/HelloWorld/frames.html index 1ac8590aeacb9..b6c2cbd6b4d1d 100644 --- a/tests/bullet/Demos/HelloWorld/frames.html +++ b/tests/bullet/Demos/HelloWorld/frames.html @@ -8,7 +8,7 @@ ./emcc -O3 tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp tests/bullet/Demos/HelloWorld/BenchmarkDemo.cpp /tmp/emscripten_temp/building/bullet/src/BulletDynamics/libBulletDynamics.a /tmp/emscripten_temp/building/bullet/src/BulletCollision/libBulletCollision.a /tmp/emscripten_temp/building/bullet/src/LinearMath/libLinearMath.a -o tests/bullet/Demos/HelloWorld/frames.js -I./tests/bullet/src -s TOTAL_MEMORY=60000000 -s LINKABLE=1 -./emcc -O3 tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp tests/bullet/Demos/HelloWorld/BenchmarkDemo.cpp /tmp/emscripten_temp/building/bullet/src/BulletDynamics/libBulletDynamics.a /tmp/emscripten_temp/building/bullet/src/BulletCollision/libBulletCollision.a /tmp/emscripten_temp/building/bullet/src/LinearMath/libLinearMath.a -o tests/bullet/Demos/HelloWorld/frames.emterp.js -I./tests/bullet/src -s TOTAL_MEMORY=60000000 -s LINKABLE=1 -s EMTERPRETIFY=1 +./emcc -O3 tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp tests/bullet/Demos/HelloWorld/BenchmarkDemo.cpp /tmp/emscripten_temp/building/bullet/src/BulletDynamics/libBulletDynamics.a /tmp/emscripten_temp/building/bullet/src/BulletCollision/libBulletCollision.a /tmp/emscripten_temp/building/bullet/src/LinearMath/libLinearMath.a -o tests/bullet/Demos/HelloWorld/frames.emterp.js -I./tests/bullet/src -s TOTAL_MEMORY=60000000 -s LINKABLE=1 -s EMTERPRETIFY=1 -s SWAPPABLE_ASM_MODULE=1 python tools/distill_asm.py tests/bullet/Demos/HelloWorld/frames.emterp.js.orig.js tests/bullet/Demos/HelloWorld/frames.emterp.js.second.js swap-in diff --git a/tools/distill_asm.py b/tools/distill_asm.py index 785491d2daece..3383a28a7f182 100644 --- a/tools/distill_asm.py +++ b/tools/distill_asm.py @@ -21,7 +21,7 @@ # we do |var asm = | just like the original codebase, so that gets overridden anyhow (assuming global scripts). extra = r''' (Module.asmGlobalArg, Module.asmLibraryArg, Module['buffer']); // special fixups - asm.stackRestore(Module['asm'].stackSave()); + asm.stackRestore(Module['asm'].stackSave()); // if this fails, make sure the original was built to be swappable (-s SWAPPABLE_ASM_MODULE=1) // Finish swap Module['asm'] = asm; if (Module['onAsmSwap']) Module['onAsmSwap'](); From a8c8fadea692781b62de964b91649ff4ee650a51 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Oct 2014 17:03:12 -0700 Subject: [PATCH 374/461] finalize saved original code when it will be swapped in --- emcc | 13 +++++++++++++ tests/test_browser.py | 4 ++++ tests/test_other.py | 7 +++++++ tools/emterpretify.py | 3 +-- 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/emcc b/emcc index 968b7ea6ad893..430392a4a45cf 100755 --- a/emcc +++ b/emcc @@ -1498,11 +1498,24 @@ try: shared.try_delete(js_target) # minify (if requested) after emterpreter processing, and finalize output + logging.debug('finalizing emterpreted code') shared.Settings.FINALIZE_ASM_JS = 1 do_minify() js_optimizer_queue += ['last'] flush_js_optimizer_queue() + # finalize the original as well, if we will be swapping it in (TODO: add specific option for this) + if shared.Settings.SWAPPABLE_ASM_MODULE: + real = final + original = js_target + '.orig.js' # the emterpretify tool saves the original here + final = original + logging.debug('finalizing original (non-emterpreted) code at ' + final) + do_minify() + js_optimizer_queue += ['last'] + flush_js_optimizer_queue() + safe_move(final, original) + final = real + # Remove some trivial whitespace # TODO: do not run when compress has already been done on all parts of the code #src = open(final).read() #src = re.sub(r'\n+[ \n]*\n+', '\n', src) diff --git a/tests/test_browser.py b/tests/test_browser.py index 235cfacef0337..6ba8736d01070 100644 --- a/tests/test_browser.py +++ b/tests/test_browser.py @@ -2060,5 +2060,9 @@ def test_asm_swapping(self): Popen([PYTHON, EMCC, 'second.cpp'] + opts).communicate() Popen([PYTHON, path_from_root('tools', 'distill_asm.py'), 'a.out.js', 'second.js', 'swap-in']).communicate() assert os.path.exists('second.js') + + out = run_js('second.js', engine=SPIDERMONKEY_ENGINE, stderr=PIPE, full_output=True, assert_returncode=None) + self.validate_asmjs(out) + self.btest(path_from_root('tests', 'asm_swap.cpp'), args=['-s', 'SWAPPABLE_ASM_MODULE=1', '-s', 'NO_EXIT_RUNTIME=1', '--pre-js', 'run.js'] + opts, expected='999') diff --git a/tests/test_other.py b/tests/test_other.py index fa129a7e44b95..95e12b8175cd9 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4303,3 +4303,10 @@ def do_log_test(source, expected, func): do_log_test(path_from_root('tests', 'primes.cpp'), 86, 'main') do_log_test(path_from_root('tests', 'fannkuch.cpp'), 234, 'fannkuch_worker') + def test_emterpreter_swap_orig(self): + Popen([PYTHON, EMCC, path_from_root('tests', 'fasta.cpp'), '-s', 'EMTERPRETIFY=1', '-s', 'SWAPPABLE_ASM_MODULE=1', '-O2']).communicate() + Popen([PYTHON, path_from_root('tools', 'distill_asm.py'), 'a.out.js.orig.js', 'second.js', 'swap-in']).communicate() + assert os.path.exists('second.js') + out = run_js('second.js', engine=SPIDERMONKEY_ENGINE, stderr=PIPE, full_output=True, assert_returncode=None) + self.validate_asmjs(out) + diff --git a/tools/emterpretify.py b/tools/emterpretify.py index dba1324748240..05f8162f10da8 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -561,8 +561,7 @@ def process(code): if len(sys.argv) >= 5: BLACKLIST = set(list(BLACKLIST) + json.loads(sys.argv[4])) -#print 'emterpretifying %s to %s' % (infile, outfile) - +shared.logging.debug('saving original (non-emterpreted) code to ' + infile + '.orig.js') shutil.copyfile(infile, infile + '.orig.js') # final global functions From 49779309279a05f0a16dd6274c1ecc877263b64f Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 14 Oct 2014 11:14:37 -0700 Subject: [PATCH 375/461] add parser tool for demo output --- tests/bullet/Demos/HelloWorld/parse.py | 69 ++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 tests/bullet/Demos/HelloWorld/parse.py diff --git a/tests/bullet/Demos/HelloWorld/parse.py b/tests/bullet/Demos/HelloWorld/parse.py new file mode 100644 index 0000000000000..9ed253d7708ad --- /dev/null +++ b/tests/bullet/Demos/HelloWorld/parse.py @@ -0,0 +1,69 @@ +import math + +data = ''' +"frame 0, 6.58, 398" setup.js:8 +"frame 1, 17.86, 563" setup.js:8 +"frame 2, 32.26, 624" setup.js:8 +"frame 3, 30.30, 666" setup.js:8 +"frame 4, 27.78, 704" setup.js:8 +"frame 5, 55.56, 757" setup.js:8 +"frame 6, 55.56, 788" setup.js:8 +"frame 7, 52.63, 823" setup.js:8 +"frame 8, 47.62, 852" setup.js:8 +"frame 9, 52.63, 912" setup.js:8 +"frame 10 starting" frames.js:1 +"frame 10 complete" frames.js:1 +"frame 10, 45.45, 941" setup.js:8 +"frame 11, 66.67, 983" setup.js:8 +"frame 12, 62.50, 1006" setup.js:8 +"frame 13, 66.67, 1063" setup.js:8 +"frame 14, 71.43, 1084" setup.js:8 +"frame 15, 66.67, 1099" setup.js:8 +"frame 16, 62.50, 1130" setup.js:8 +"frame 17, 71.43, 1160" setup.js:8 +"frame 18, 58.82, 1188" setup.js:8 +"frame 19, 71.43, 1224" setup.js:8 +"frame 20 starting" frames.js:1 +"frame 20 complete" frames.js:1 +"frame 20, 40.00, 1239" setup.js:8 +"frame 21, 47.62, 1279" setup.js:8 +"frame 22, 71.43, 1306" setup.js:8 +"frame 23, 66.67, 1342" setup.js:8 +"frame 24, 41.67, 1363" setup.js:8 +"frame 25, 71.43, 1405" setup.js:8 +"frame 26, 52.63, 1427" setup.js:8 +"frame 27, 71.43, 1464" setup.js:8 +"frame 28, 71.43, 1484" setup.js:8 +"frame 29, 66.67, 1516" setup.js:8 +"frame 30 starting" frames.js:1 +"frame 30 complete" +''' + +total_time = 3000 # ms +bin_size = 50 # ms +bins = [0]*(total_time/bin_size) + +for line in data.split('\n'): + line = line.strip() + if 'frame ' not in line: continue + if 'starting' in line or 'complete' in line: continue + line = line.replace(', ', ',').replace(' ', ',').replace('"', '') + #print line + _, i, fps, wall, __ = line.split(',') + #print i, fps, wall + fps = float(fps) + wall = float(wall) + pos = wall/bin_size + start_bin = int(math.floor(pos)) + assert start_bin < len(bins) + end_bin = int(math.ceil(pos)) + assert start_bin + 1 == end_bin + frac = pos % 1 + old = bins[start_bin] + bins[start_bin] = frac * old + (1-frac)*fps # interpolate in this bin + for i in range(end_bin, len(bins)): # fill in this fps for all future bins, we assume no degradation + bins[i] = fps + +for i in range(len(bins)): + print i*bin_size, bins[i] + From 6015651774efa87072841438d20dcb0421c295fb Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 14 Oct 2014 13:20:28 -0700 Subject: [PATCH 376/461] assert on errors in emterpreter blacklist --- tools/emterpretify.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index 05f8162f10da8..cafdb7e480453 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -558,8 +558,9 @@ def process(code): infile = sys.argv[1] outfile = sys.argv[2] force_memfile = sys.argv[3] if len(sys.argv) >= 4 else None -if len(sys.argv) >= 5: - BLACKLIST = set(list(BLACKLIST) + json.loads(sys.argv[4])) +extra_blacklist = json.loads(sys.argv[4]) if len(sys.argv) >= 5 else [] + +BLACKLIST = set(list(BLACKLIST) + extra_blacklist) shared.logging.debug('saving original (non-emterpreted) code to ' + infile + '.orig.js') shutil.copyfile(infile, infile + '.orig.js') @@ -568,6 +569,11 @@ def process(code): asm = asm_module.AsmModule(infile) +# sanity check on blacklist + +for func in extra_blacklist: + assert func in asm.funcs, 'requested blacklist of %s but it does not exist' % func + # decide which functions will be emterpreted, and find which are externally reachable (from outside other emterpreted code; those will need trampolines) emterpreted_funcs = set([func for func in asm.funcs if func not in BLACKLIST and not func.startswith('dynCall_')]) From 9633e9e33d63d638ad9509f0f2833586a91ee210 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 14 Oct 2014 14:17:27 -0700 Subject: [PATCH 377/461] add blacklist for bullet --- tests/bullet/Demos/HelloWorld/frames.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/bullet/Demos/HelloWorld/frames.html b/tests/bullet/Demos/HelloWorld/frames.html index b6c2cbd6b4d1d..7c315862f65ac 100644 --- a/tests/bullet/Demos/HelloWorld/frames.html +++ b/tests/bullet/Demos/HelloWorld/frames.html @@ -8,7 +8,7 @@ ./emcc -O3 tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp tests/bullet/Demos/HelloWorld/BenchmarkDemo.cpp /tmp/emscripten_temp/building/bullet/src/BulletDynamics/libBulletDynamics.a /tmp/emscripten_temp/building/bullet/src/BulletCollision/libBulletCollision.a /tmp/emscripten_temp/building/bullet/src/LinearMath/libLinearMath.a -o tests/bullet/Demos/HelloWorld/frames.js -I./tests/bullet/src -s TOTAL_MEMORY=60000000 -s LINKABLE=1 -./emcc -O3 tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp tests/bullet/Demos/HelloWorld/BenchmarkDemo.cpp /tmp/emscripten_temp/building/bullet/src/BulletDynamics/libBulletDynamics.a /tmp/emscripten_temp/building/bullet/src/BulletCollision/libBulletCollision.a /tmp/emscripten_temp/building/bullet/src/LinearMath/libLinearMath.a -o tests/bullet/Demos/HelloWorld/frames.emterp.js -I./tests/bullet/src -s TOTAL_MEMORY=60000000 -s LINKABLE=1 -s EMTERPRETIFY=1 -s SWAPPABLE_ASM_MODULE=1 +./emcc -O3 tests/bullet/Demos/HelloWorld/HelloWorldFrames.cpp tests/bullet/Demos/HelloWorld/BenchmarkDemo.cpp /tmp/emscripten_temp/building/bullet/src/BulletDynamics/libBulletDynamics.a /tmp/emscripten_temp/building/bullet/src/BulletCollision/libBulletCollision.a /tmp/emscripten_temp/building/bullet/src/LinearMath/libLinearMath.a -o tests/bullet/Demos/HelloWorld/frames.emterp.js -I./tests/bullet/src -s TOTAL_MEMORY=60000000 -s LINKABLE=1 -s EMTERPRETIFY=1 -s SWAPPABLE_ASM_MODULE=1 -s EMTERPRETIFY_BLACKLIST='["__ZN20btAxisSweep3InternalItE9addHandleERK9btVector3S3_PvssP12btDispatcherS4_", "__ZN20btAxisSweep3InternalItE11sortMaxDownEitP12btDispatcherb", "__ZN20btAxisSweep3InternalItE11sortMinDownEitP12btDispatcherb", "__ZN20btAxisSweep3InternalItE12removeHandleEtP12btDispatcher", "__ZN35btSequentialImpulseConstraintSolver33resolveSingleConstraintRowGenericER11btRigidBodyS1_RK18btSolverConstraint", "__ZN16btCollisionWorld16updateSingleAabbEP17btCollisionObject", "__ZNK14btCapsuleShape7getAabbERK11btTransformR9btVector3S4_", "__ZN15btTransformUtil18integrateTransformERK11btTransformRK9btVector3S5_fRS0_", "__ZNK11btMatrix3x311getRotationER12btQuaternion", "__ZL10insertleafP6btDbvtP10btDbvtNodeS2_", "__ZN11btRigidBody14setupRigidBodyERKNS_27btRigidBodyConstructionInfoE", "__ZNK11btMatrix3x35tdotyERK9btVector3", "__ZN31btDefaultCollisionConfigurationC2ERK34btDefaultCollisionConstructionInfo", "__ZN28btHashedOverlappingPairCache26processAllOverlappingPairsEP17btOverlapCallbackP12btDispatcher", "__ZZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcherEN18RemovePairCallback14processOverlapER16btBroadphasePair", "__ZZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcherEN17CleanPairCallback14processOverlapER16btBroadphasePair", "__ZN35btSequentialImpulseConstraintSolver28solveGroupCacheFriendlySetupEPP17btCollisionObjectiPP20btPersistentManifoldiPP17btTypedConstraintiRK19btContactSolverInfoP12btIDebugDrawP12btStackAlloc", "__ZN25btSimulationIslandManager22buildAndProcessIslandsEP12btDispatcherP16btCollisionWorldPNS_14IslandCallbackE", "__ZN17btHingeConstraint32getInfo2InternalUsingFrameOffsetEPN17btTypedConstraint17btConstraintInfo2ERK11btTransformS5_RK9btVector3S8_", "__ZN25btSimulationIslandManager12buildIslandsEP12btDispatcherP16btCollisionWorld", "__ZN21btCollisionDispatcher19defaultNearCallbackER16btBroadphasePairRS_RK16btDispatcherInfo", "__ZN21btCollisionDispatcher14needsCollisionEP17btCollisionObjectS1_", "__ZN11btRigidBody19integrateVelocitiesEf", "__ZN11btRigidBody12applyDampingEf", "__ZN25btSimulationIslandManager10findUnionsEP12btDispatcherP16btCollisionWorld"]' python tools/distill_asm.py tests/bullet/Demos/HelloWorld/frames.emterp.js.orig.js tests/bullet/Demos/HelloWorld/frames.emterp.js.second.js swap-in From 54fb37c11bb41888d4417820fe06d652e9da894e Mon Sep 17 00:00:00 2001 From: Bruce Mitchener Date: Wed, 15 Oct 2014 15:38:39 +0700 Subject: [PATCH 378/461] emar can receive --em-config. Don't pass along to llvm-ar. Fixes issue #2886. --- emar | 11 ++++++++++- tests/test_other.py | 9 +++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/emar b/emar index 5646f444cf676..280521197694c 100755 --- a/emar +++ b/emar @@ -14,7 +14,16 @@ DEBUG = os.environ.get('EMCC_DEBUG') if DEBUG == "0": DEBUG = None -newargs = [shared.LLVM_AR] + sys.argv[1:] +newargs = [shared.LLVM_AR] + +skip = False +for arg in sys.argv[1:]: + if not skip and arg != '--em-config': + newargs += [arg] + elif arg == '--em-config': + skip = True + elif skip: + skip = False if DEBUG: print >> sys.stderr, 'emar:', sys.argv, ' ==> ', newargs diff --git a/tests/test_other.py b/tests/test_other.py index 16d86d2e35ea6..254c08e5d5541 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -296,6 +296,15 @@ def test_emcc_cache_flag(self): os.chdir(path_from_root('tests')) # Move away from the directory we are about to remove. shutil.rmtree(tempdirname) + def test_emar_em_config_flag(self): + # We expand this in case the EM_CONFIG is ~/.emscripten (default) + config = os.path.expanduser(EM_CONFIG) + # We pass -version twice to work around the newargs > 2 check in emar + (out, err) = Popen([PYTHON, EMAR, '--em-config', config, '-version', '-version'], stdout=PIPE, stderr=PIPE).communicate() + assert out + assert not err + self.assertContained('LLVM', out) + def test_cmake(self): # Test all supported generators. if WINDOWS: From 0cb2c2e38f58b620b96aef9ca31e5c33b2914e15 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 15 Oct 2014 17:09:03 -0700 Subject: [PATCH 379/461] add asm3i to test_modes --- tests/runner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/runner.py b/tests/runner.py index b84a1ff796367..49f49871d9d35 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -50,7 +50,7 @@ def nonfastcomp(test): # Core test runner class, shared between normal tests and benchmarks checked_sanity = False -test_modes = ['default', 'asm1', 'asm2', 'asm3', 'asm2f', 'asm2g', 'slow2', 'slow2asm'] +test_modes = ['default', 'asm1', 'asm2', 'asm3', 'asm2f', 'asm2g', 'asm3i', 'slow2', 'slow2asm'] test_index = 0 class RunnerCore(unittest.TestCase): From 941145eee1460a95e30843fa01747672b61c1b0e Mon Sep 17 00:00:00 2001 From: Bruce Mitchener Date: Thu, 16 Oct 2014 07:19:49 +0700 Subject: [PATCH 380/461] Centralize --em-config handling. Per request of Alon. --- emar | 11 +---------- emcc | 4 ---- tools/shared.py | 11 +++++++++++ 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/emar b/emar index 280521197694c..5646f444cf676 100755 --- a/emar +++ b/emar @@ -14,16 +14,7 @@ DEBUG = os.environ.get('EMCC_DEBUG') if DEBUG == "0": DEBUG = None -newargs = [shared.LLVM_AR] - -skip = False -for arg in sys.argv[1:]: - if not skip and arg != '--em-config': - newargs += [arg] - elif arg == '--em-config': - skip = True - elif skip: - skip = False +newargs = [shared.LLVM_AR] + sys.argv[1:] if DEBUG: print >> sys.stderr, 'emar:', sys.argv, ' ==> ', newargs diff --git a/emcc b/emcc index 6fa558eded8e0..03493e1fdc6c5 100755 --- a/emcc +++ b/emcc @@ -653,10 +653,6 @@ try: elif newargs[i] == '--emrun': emrun = True newargs[i] = '' - elif newargs[i] == '--em-config': - # This option is parsed in tools/shared.py, here only clean it up from being passed to clang. - newargs[i] = '' - newargs[i+1] = '' elif newargs[i] == '--default-obj-ext': newargs[i] = '' default_object_extension = newargs[i+1] diff --git a/tools/shared.py b/tools/shared.py index cbe8e27d6120d..29cf42d1c29ab 100644 --- a/tools/shared.py +++ b/tools/shared.py @@ -184,6 +184,17 @@ def new(*args): try: EM_CONFIG = sys.argv[sys.argv.index('--em-config')+1] + # And now remove it from sys.argv + skip = False + newargs = [] + for arg in sys.argv: + if not skip and arg != '--em-config': + newargs += [arg] + elif arg == '--em-config': + skip = True + elif skip: + skip = False + sys.argv = newargs # Emscripten compiler spawns other processes, which can reimport shared.py, so make sure that # those child processes get the same configuration file by setting it to the currently active environment. os.environ['EM_CONFIG'] = EM_CONFIG From f68333fa12b8c1f3e803b6f45f8240ce37ac8dbe Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 16 Oct 2014 11:54:03 -0700 Subject: [PATCH 381/461] add mouseover/out events to html5.5; 1.25.2 --- emscripten-version.txt | 2 +- src/library_html5.js | 10 ++++++++++ src/struct_info.json | 2 ++ system/include/emscripten/html5.h | 4 ++++ tests/test_html5.c | 6 +++++- 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/emscripten-version.txt b/emscripten-version.txt index 28442b1906f79..c61b00d534f58 100644 --- a/emscripten-version.txt +++ b/emscripten-version.txt @@ -1,2 +1,2 @@ -1.25.1 +1.25.2 diff --git a/src/library_html5.js b/src/library_html5.js index 443a351e7561a..1b02cf6b1148d 100644 --- a/src/library_html5.js +++ b/src/library_html5.js @@ -982,6 +982,16 @@ var LibraryJSEvents = { return {{{ cDefine('EMSCRIPTEN_RESULT_SUCCESS') }}}; }, + emscripten_set_mouseover_callback: function(target, userData, useCapture, callbackfunc) { + JSEvents.registerMouseEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefine('EMSCRIPTEN_EVENT_MOUSEOVER') }}}, "mouseover"); + return {{{ cDefine('EMSCRIPTEN_RESULT_SUCCESS') }}}; + }, + + emscripten_set_mouseout_callback: function(target, userData, useCapture, callbackfunc) { + JSEvents.registerMouseEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefine('EMSCRIPTEN_EVENT_MOUSEOUT') }}}, "mouseout"); + return {{{ cDefine('EMSCRIPTEN_RESULT_SUCCESS') }}}; + }, + emscripten_get_mouse_status: function(mouseState) { if (!JSEvents.mouseEvent) return {{{ cDefine('EMSCRIPTEN_RESULT_NO_DATA') }}}; // HTML5 does not really have a polling API for mouse events, so implement one manually by diff --git a/src/struct_info.json b/src/struct_info.json index b1e0b37611dd0..b6c7d26ae091b 100644 --- a/src/struct_info.json +++ b/src/struct_info.json @@ -1154,6 +1154,8 @@ "EMSCRIPTEN_EVENT_WEBGLCONTEXTRESTORED", "EMSCRIPTEN_EVENT_MOUSEENTER", "EMSCRIPTEN_EVENT_MOUSELEAVE", + "EMSCRIPTEN_EVENT_MOUSEOVER", + "EMSCRIPTEN_EVENT_MOUSEOUT", "EMSCRIPTEN_RESULT_SUCCESS", "EMSCRIPTEN_RESULT_DEFERRED", diff --git a/system/include/emscripten/html5.h b/system/include/emscripten/html5.h index 36b3b3e8c0cc6..9ebb85b0c0d92 100644 --- a/system/include/emscripten/html5.h +++ b/system/include/emscripten/html5.h @@ -50,6 +50,8 @@ extern "C" { #define EMSCRIPTEN_EVENT_WEBGLCONTEXTRESTORED 32 #define EMSCRIPTEN_EVENT_MOUSEENTER 33 #define EMSCRIPTEN_EVENT_MOUSELEAVE 34 +#define EMSCRIPTEN_EVENT_MOUSEOVER 35 +#define EMSCRIPTEN_EVENT_MOUSEOUT 36 #define EMSCRIPTEN_RESULT int @@ -127,6 +129,8 @@ extern EMSCRIPTEN_RESULT emscripten_set_dblclick_callback(const char *target, vo extern EMSCRIPTEN_RESULT emscripten_set_mousemove_callback(const char *target, void *userData, EM_BOOL useCapture, em_mouse_callback_func callback); extern EMSCRIPTEN_RESULT emscripten_set_mouseenter_callback(const char *target, void *userData, EM_BOOL useCapture, em_mouse_callback_func callback); extern EMSCRIPTEN_RESULT emscripten_set_mouseleave_callback(const char *target, void *userData, EM_BOOL useCapture, em_mouse_callback_func callback); +extern EMSCRIPTEN_RESULT emscripten_set_mouseover_callback(const char *target, void *userData, EM_BOOL useCapture, em_mouse_callback_func callback); +extern EMSCRIPTEN_RESULT emscripten_set_mouseout_callback(const char *target, void *userData, EM_BOOL useCapture, em_mouse_callback_func callback); extern EMSCRIPTEN_RESULT emscripten_get_mouse_status(EmscriptenMouseEvent *mouseState); diff --git a/tests/test_html5.c b/tests/test_html5.c index a42138ad4634c..ece7dd8f09ecc 100644 --- a/tests/test_html5.c +++ b/tests/test_html5.c @@ -7,7 +7,7 @@ static inline const char *emscripten_event_type_to_string(int eventType) { const char *events[] = { "(invalid)", "(none)", "keypress", "keydown", "keyup", "click", "mousedown", "mouseup", "dblclick", "mousemove", "wheel", "resize", "scroll", "blur", "focus", "focusin", "focusout", "deviceorientation", "devicemotion", "orientationchange", "fullscreenchange", "pointerlockchange", "visibilitychange", "touchstart", "touchend", "touchmove", "touchcancel", "gamepadconnected", "gamepaddisconnected", "beforeunload", - "batterychargingchange", "batterylevelchange", "webglcontextlost", "webglcontextrestored", "mouseenter", "mouseleave", "(invalid)" }; + "batterychargingchange", "batterylevelchange", "webglcontextlost", "webglcontextrestored", "mouseenter", "mouseleave", "mouseover", "mouseout", "(invalid)" }; ++eventType; if (eventType < 0) eventType = 0; if (eventType >= sizeof(events)/sizeof(events[0])) eventType = sizeof(events)/sizeof(events[0])-1; @@ -317,6 +317,10 @@ int main() TEST_RESULT(emscripten_set_mouseenter_callback); ret = emscripten_set_mouseleave_callback(0, 0, 1, mouse_callback); TEST_RESULT(emscripten_set_mouseleave_callback); + ret = emscripten_set_mouseover_callback(0, 0, 1, mouse_callback); + TEST_RESULT(emscripten_set_mouseover_callback); + ret = emscripten_set_mouseout_callback(0, 0, 1, mouse_callback); + TEST_RESULT(emscripten_set_mouseout_callback); ret = emscripten_set_wheel_callback(0, 0, 1, wheel_callback); TEST_RESULT(emscripten_set_wheel_callback); From ecf351eb2f9e18fd41cc8db68af4d18f885d0c70 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 16 Oct 2014 14:43:29 -0700 Subject: [PATCH 382/461] test repeated vswprintf --- tests/core/test_wprintf.c | 2 ++ tests/core/test_wprintf.out | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/tests/core/test_wprintf.c b/tests/core/test_wprintf.c index b5f8d6ab56a51..9d99eb39c56a4 100644 --- a/tests/core/test_wprintf.c +++ b/tests/core/test_wprintf.c @@ -38,6 +38,8 @@ int main () wprintf(L"str continues with 0x%x\n", *(((int*)str) + 1)); wprintf(L"str continues with 0x%x\n", *(((int*)str) + 2)); PrintWide ( str, wcslen(str) ); + PrintWide ( str, wcslen(str) ); + PrintWide ( str, wcslen(str) ); wprintf (L"Characters: %lc %lc \n", L'a', 65); wprintf (L"Decimals: %d %ld\n", 1977, 650000L); diff --git a/tests/core/test_wprintf.out b/tests/core/test_wprintf.out index e074743de6a24..8dfed67acfeb6 100644 --- a/tests/core/test_wprintf.out +++ b/tests/core/test_wprintf.out @@ -11,6 +11,22 @@ vswoutput st-rts with 0x74 vsw continues with 0x65 vsw continues with 0x73 test string has 36 wide characters. +format starts with 0x74 +fmt continues with 0x65 +fmt continues with 0x73 +vswprintf told us 36 +vswoutput st-rts with 0x74 +vsw continues with 0x65 +vsw continues with 0x73 +test string has 36 wide characters. +format starts with 0x74 +fmt continues with 0x65 +fmt continues with 0x73 +vswprintf told us 36 +vswoutput st-rts with 0x74 +vsw continues with 0x65 +vsw continues with 0x73 +test string has 36 wide characters. Characters: a A Decimals: 1977 650000 Preceding with blanks: 1977 From d93dd480f80d3e67b0104e04e674b353de32f712 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 16 Oct 2014 15:02:50 -0700 Subject: [PATCH 383/461] reuse a single file in the vswprintf hack --- system/lib/libc/musl/src/stdio/vswprintf.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/system/lib/libc/musl/src/stdio/vswprintf.c b/system/lib/libc/musl/src/stdio/vswprintf.c index 850577466d5a8..ca279a406508f 100644 --- a/system/lib/libc/musl/src/stdio/vswprintf.c +++ b/system/lib/libc/musl/src/stdio/vswprintf.c @@ -55,14 +55,13 @@ int vswprintf(wchar_t *restrict s, size_t n, const wchar_t *restrict fmt, va_lis // XXX EMSCRIPTEN: use memfs through libc fs // we write to a file, which is in multibyte, then we read, then expand to widechar #define TEMPFILE "emscripten.vswprintf.temp.buffer" - FILE *f = fopen(TEMPFILE, "wb"); + static FILE *f = NULL; + if (!f) f = fopen(TEMPFILE, "w+"); int r = vfwprintf(f, fmt, ap); - fclose(f); - f = fopen(TEMPFILE, "rb"); + rewind(f); char buffer[r+1]; fread(buffer, 1, r, f); - fclose(f); - remove(TEMPFILE); + rewind(f); // TODO: truncate file here buffer[r] = 0; r = mbstowcs(s, buffer, n); return r>=n ? -1 : r; From 899fe2af1255928675cac24d36054e281596529a Mon Sep 17 00:00:00 2001 From: Bruce Mitchener Date: Thu, 16 Oct 2014 17:38:11 +0700 Subject: [PATCH 384/461] [tracing] Support tracing all entry points via embind. --- src/embind/embind.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/embind/embind.js b/src/embind/embind.js index 0f2466ccadcf2..6f0f8c13a8d6a 100644 --- a/src/embind/embind.js +++ b/src/embind/embind.js @@ -818,6 +818,10 @@ var LibraryEmbind = { "throwBindingError('function "+humanName+" called with ' + arguments.length + ' arguments, expected "+(argCount - 2)+" args!');\n" + "}\n"; +#if EMSCRIPTEN_TRACING + invokerFnBody += "Module.emscripten_trace_enter_context('embind::" + humanName + "');\n"; +#endif + // Determine if we need to use a dynamic stack to store the destructors for the function parameters. // TODO: Remove this completely once all function invokers are being dynamically generated. var needsDestructorStack = false; @@ -838,6 +842,11 @@ var LibraryEmbind = { var args1 = ["throwBindingError", "invoker", "fn", "runDestructors", "retType", "classParam"]; var args2 = [throwBindingError, cppInvokerFunc, cppTargetFunc, runDestructors, argTypes[0], argTypes[1]]; +#if EMSCRIPTEN_TRACING + args1.push("Module"); + args2.push(Module); +#endif + if (isClassMethodFunc) { invokerFnBody += "var thisWired = classParam.toWireType("+dtorStack+", this);\n"; } @@ -871,7 +880,15 @@ var LibraryEmbind = { } if (returns) { - invokerFnBody += "return retType.fromWireType(rv);\n"; + invokerFnBody += "var ret = retType.fromWireType(rv);\n" + +#if EMSCRIPTEN_TRACING + "Module.emscripten_trace_exit_context();\n" + +#endif + "return ret;\n"; + } else { +#if EMSCRIPTEN_TRACING + invokerFnBody += "Module.emscripten_trace_exit_context();\n"; +#endif } invokerFnBody += "}\n"; From 5a276cec158e998e4d74e20b89f25c3b07b877c6 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 17 Oct 2014 10:40:56 -0700 Subject: [PATCH 385/461] disable test_printf in emterpreter --- tests/test_core.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_core.py b/tests/test_core.py index 387e722e68129..5d588eb98d410 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -3941,6 +3941,7 @@ def test_transtrcase(self): def test_printf(self): if Settings.USE_TYPED_ARRAYS != 2: return self.skip('i64 mode 1 requires ta2') + if self.is_emterpreter(): return self.skip('todo') self.banned_js_engines = [NODE_JS, V8_ENGINE] # SpiderMonkey and V8 do different things to float64 typed arrays, un-NaNing, etc. src = open(path_from_root('tests', 'printf', 'test.c'), 'r').read() expected = [open(path_from_root('tests', 'printf', 'output.txt'), 'r').read(), From a2f12b32190545ba383bf6e5998809ab0fe35386 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 17 Oct 2014 10:55:26 -0700 Subject: [PATCH 386/461] update memory growth code --- emscripten.py | 2 +- src/preamble.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/emscripten.py b/emscripten.py index 870767c195e27..e404a0d621517 100755 --- a/emscripten.py +++ b/emscripten.py @@ -1294,7 +1294,7 @@ def math_fix(g): ''' + ''.join([''' var tempRet%d = 0;''' % i for i in range(10)]) + '\n' + asm_global_funcs] + [' var tempFloat = %s;\n' % ('Math_fround(0)' if settings.get('PRECISE_F32') else '0.0')] + ([' const f0 = Math_fround(0);\n'] if settings.get('PRECISE_F32') else []) + ['' if not settings['ALLOW_MEMORY_GROWTH'] else ''' function _emscripten_replace_memory(newBuffer) { - if ((byteLength(newBuffer) & 0xffffff || byteLength(newBuffer) <= 0xffffff)) return false; + if ((byteLength(newBuffer) & 0xffffff || byteLength(newBuffer) <= 0xffffff) || byteLength(newBuffer) > 0x80000000) return false; HEAP8 = new Int8View(newBuffer); HEAP16 = new Int16View(newBuffer); HEAP32 = new Int32View(newBuffer); diff --git a/src/preamble.js b/src/preamble.js index 70657c6bbbbe8..b0507962bfa5f 100644 --- a/src/preamble.js +++ b/src/preamble.js @@ -1035,7 +1035,7 @@ function enlargeMemory() { #endif #if ASSERTIONS - Module.printErr('enlarged memory arrays from ' + OLD_TOTAL_MEMORY + ' to ' + TOTAL_MEMORY + ', took ' + (Date.now() - start) + ' ms (has ArrayBuffer.transfer? ' + (!!ArrayBuffer.transfer)); + Module.printErr('enlarged memory arrays from ' + OLD_TOTAL_MEMORY + ' to ' + TOTAL_MEMORY + ', took ' + (Date.now() - start) + ' ms (has ArrayBuffer.transfer? ' + (!!ArrayBuffer.transfer) + ')'); #endif #endif From 4d813ceacdbcf1d6dfa6a590fc34467025ac0ec4 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 17 Oct 2014 12:51:31 -0700 Subject: [PATCH 387/461] restore benchmark settings to incoming defaults --- tests/test_benchmark.py | 61 +++++++++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/tests/test_benchmark.py b/tests/test_benchmark.py index 4b87139b33459..ad0a6d29b061c 100644 --- a/tests/test_benchmark.py +++ b/tests/test_benchmark.py @@ -10,7 +10,7 @@ # 3: 1 second # 4: 5 seconds # 5: 10 seconds -DEFAULT_ARG = '2' +DEFAULT_ARG = '4' TEST_REPS = 2 @@ -109,12 +109,11 @@ def process(filename): try_delete(final) output = Popen([PYTHON, EMCC, filename, #'-O3', '-O3', '-s', 'DOUBLE_MODE=0', '-s', 'PRECISE_I64_MATH=0', - '--memory-init-file', '1', '--js-transform', 'python hardcode.py', + '--memory-init-file', '0', '--js-transform', 'python hardcode.py', '-s', 'TOTAL_MEMORY=128*1024*1024', #'--profiling', #'--closure', '1', '-o', final] + shared_args + emcc_args + self.extra_args, stdout=PIPE, stderr=PIPE, env=self.env).communicate() - #'-o', final] + shared_args + emcc_args + self.extra_args, stdout=None, stderr=None, env=self.env).communicate() assert os.path.exists(final), 'Failed to compile file: ' + output[0] self.filename = final @@ -135,25 +134,21 @@ def run(self, args): benchmarkers_error = '' benchmarkers = [ #NativeBenchmarker('clang', CLANG_CC, CLANG), - #NativeBenchmarker(default_native_name, os.path.join(default_native, 'clang'), os.path.join(default_native, 'clang++')), + NativeBenchmarker(default_native_name, os.path.join(default_native, 'clang'), os.path.join(default_native, 'clang++')), #NativeBenchmarker('clang-3.2-O3', os.path.join(default_native, 'clang'), os.path.join(default_native, 'clang++'), ['-O3']), #NativeBenchmarker('clang-3.3', os.path.join(LLVM_3_3, 'clang'), os.path.join(LLVM_3_3, 'clang++')), #NativeBenchmarker('clang-3.4', os.path.join(LLVM_3_4, 'clang'), os.path.join(LLVM_3_4, 'clang++')), #NativeBenchmarker('gcc', 'gcc', 'g++'), - #JSBenchmarker('sm-f32', SPIDERMONKEY_ENGINE, ['-s', 'PRECISE_F32=2']), - JSBenchmarker('sm', SPIDERMONKEY_ENGINE), - #JSBenchmarker('sm-ion', SPIDERMONKEY_ENGINE + ['--no-asmjs']), - #JSBenchmarker('sm-baseline', SPIDERMONKEY_ENGINE + ['--no-asmjs', '--no-ion']), - JSBenchmarker('sm-emterp', SPIDERMONKEY_ENGINE, ['-s', 'EMTERPRETIFY=1']), - #JSBenchmarker('sm-emterp-blacklist', SPIDERMONKEY_ENGINE, ['-s', 'EMTERPRETIFY=1', '-s', 'EMTERPRETIFY_BLACKLIST=["__ZN15b2ContactSolver24SolvePositionConstraintsEv", "__ZN24b2PositionSolverManifold10InitializeEP27b2ContactPositionConstraintRK11b2TransformS4_i", "__ZN15b2ContactSolver24SolveVelocityConstraintsEv", "__ZN15b2ContactSolver29InitializeVelocityConstraintsEv", "__ZL16b2EdgeSeparationPK14b2PolygonShapeRK11b2TransformiS1_S4_", "__ZN7b2World8SolveTOIERK10b2TimeStep"]']), - #JSBenchmarker('sm-interp', SPIDERMONKEY_ENGINE + ['--no-asmjs', '--no-ion', '--no-baseline']), + JSBenchmarker('sm-f32', SPIDERMONKEY_ENGINE, ['-s', 'PRECISE_F32=2']), #JSBenchmarker('sm-f32-si', SPIDERMONKEY_ENGINE, ['--profiling', '-s', 'PRECISE_F32=2', '-s', 'SIMPLIFY_IFS=1']), #JSBenchmarker('sm-f32-aggro', SPIDERMONKEY_ENGINE, ['-s', 'PRECISE_F32=2', '-s', 'AGGRESSIVE_VARIABLE_ELIMINATION=1']), #JSBenchmarker('sm-f32-3.2', SPIDERMONKEY_ENGINE, ['-s', 'PRECISE_F32=2'], env={ 'LLVM': LLVM_3_2 }), #JSBenchmarker('sm-f32-3.3', SPIDERMONKEY_ENGINE, ['-s', 'PRECISE_F32=2'], env={ 'LLVM': LLVM_3_3 }), #JSBenchmarker('sm-f32-3.4', SPIDERMONKEY_ENGINE, ['-s', 'PRECISE_F32=2'], env={ 'LLVM': LLVM_3_4 }), + #JSBenchmarker('sm-noasm', SPIDERMONKEY_ENGINE + ['--no-asmjs']), #JSBenchmarker('sm-noasm-f32', SPIDERMONKEY_ENGINE + ['--no-asmjs'], ['-s', 'PRECISE_F32=2']), - #JSBenchmarker('v8', V8_ENGINE) + #JSBenchmarker('v8', V8_ENGINE), + #JSBenchmarker('sm-emterp', SPIDERMONKEY_ENGINE, ['-s', 'EMTERPRETIFY=1', '--memory-init-file', '1']), ] except Exception, e: benchmarkers_error = str(e) @@ -213,7 +208,39 @@ def do_benchmark(self, name, src, expected_output='FAIL', args=[], emcc_args=[], b.display(benchmarkers[0]) def test_primes(self): - src = open(path_from_root('tests', 'primes.cpp')).read() + src = r''' + #include + #include + int main(int argc, char **argv) { + int arg = argc > 1 ? argv[1][0] - '0' : 3; + switch(arg) { + case 0: return 0; break; + case 1: arg = 33000; break; + case 2: arg = 130000; break; + case 3: arg = 220000; break; + case 4: arg = 610000; break; + case 5: arg = 1010000; break; + default: printf("error: %d\\n", arg); return -1; + } + + int primes = 0, curri = 2; + while (primes < arg) { + int ok = true; + for (int j = 2; j < sqrtf(curri); j++) { + if (curri % j == 0) { + ok = false; + break; + } + } + if (ok) { + primes++; + } + curri++; + } + printf("lastprime: %d.\n", curri-1); + return 0; + } + ''' self.do_benchmark('primes', src, 'lastprime:') def test_memops(self): @@ -346,7 +373,7 @@ def test_copy(self): ''' self.do_benchmark('copy', src, 'sum:') - def zzztest_ifs(self): + def test_ifs(self): src = r''' #include #include @@ -391,7 +418,7 @@ def zzztest_ifs(self): ''' self.do_benchmark('ifs', src, 'ok', reps=TEST_REPS*5) - def zzztest_conditionals(self): + def test_conditionals(self): src = r''' #include #include @@ -549,13 +576,13 @@ def lib_builder(name, native, env_init): lib_builder=lib_builder, native_exec=os.path.join('building', 'lua_native', 'src', 'lua'), output_parser=output_parser, args_processor=args_processor) - def zzztest_zzz_lua_scimark(self): + def test_zzz_lua_scimark(self): def output_parser(output): return 100.0/float(re.search('\nSciMark +([\d\.]+) ', output).group(1)) self.lua('scimark', '[small problem sizes]', output_parser=output_parser) - def zzztest_zzz_lua_binarytrees(self): + def test_zzz_lua_binarytrees(self): # js version: ['binarytrees.lua', {0: 0, 1: 9.5, 2: 11.99, 3: 12.85, 4: 14.72, 5: 15.82}[arguments[0]]] self.lua('binarytrees', 'long lived tree of depth') From 5f94b3b9de0fbcdb6349251b806e7f85323dfdc0 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 17 Oct 2014 14:02:18 -0700 Subject: [PATCH 388/461] clarify emscripten_worker_respond usage --- site/source/docs/api_reference/emscripten.h.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/source/docs/api_reference/emscripten.h.rst b/site/source/docs/api_reference/emscripten.h.rst index 875b704b7d20c..c21b69a906413 100644 --- a/site/source/docs/api_reference/emscripten.h.rst +++ b/site/source/docs/api_reference/emscripten.h.rst @@ -713,7 +713,7 @@ Functions .. c:function:: void emscripten_worker_respond(char *data, int size) void emscripten_worker_respond_provisionally(char *data, int size) - Sends a response when in a worker call. + Sends a response when in a worker call (that is, when called by the main thread using :c:func:`emscripten_call_worker`). Both functions post a message back to the thread which called the worker. The :c:func:`emscripten_worker_respond_provisionally` variant can be invoked multiple times, which will queue up messages to be posted to the worker’s creator. Eventually, the _respond variant must be invoked, which will disallow further messages and free framework resources previously allocated for this worker call. From 0daacfa20b37fc38c251ba33015ecbc96a172f56 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 17 Oct 2014 14:10:50 -0700 Subject: [PATCH 389/461] big link to about page --- site/source/home_page_layout.html | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/site/source/home_page_layout.html b/site/source/home_page_layout.html index 2edcd0200f6ce..26e9c55aac79e 100644 --- a/site/source/home_page_layout.html +++ b/site/source/home_page_layout.html @@ -23,7 +23,12 @@

Emscripten is an LLVM-based project that compiles C and C++ in - + +
+

Interested to learn more? Read our About Page!

+
+

Ready to get started? Download and install the SDK and then proceed to the Tutorial!

+
From 856aefa9e6244c615e3eb7ddb32bf889abb91b7b Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Fri, 17 Oct 2014 14:28:46 -0700 Subject: [PATCH 390/461] Temporarily disable test_simd6 --- tests/test_core.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_core.py b/tests/test_core.py index be29ee431bda3..97f34007403db 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -5173,6 +5173,7 @@ def test_simd5(self): def test_simd6(self): # test_simd6 is to test x86 min and max intrinsics on NaN and -0.0 + return self.skip('temporarily disabled due to SpiderMonkey bug 1084609') if Settings.ASM_JS: Settings.ASM_JS = 2 # does not validate Settings.PRECISE_F32 = 1 # SIMD currently requires Math.fround if os.environ.get('EMCC_FAST_COMPILER') == '0': return self.skip('needs fastcomp') From e181b0ab83d29a7e02926a4f18814d13b8b7cc87 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 17 Oct 2014 17:01:38 -0700 Subject: [PATCH 391/461] misc tools/shared improvements --- tools/shared.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/shared.py b/tools/shared.py index 8eaee1582209e..3504778f293da 100644 --- a/tools/shared.py +++ b/tools/shared.py @@ -4,7 +4,7 @@ from distutils.spawn import find_executable import jsrun, cache, tempfiles import response_file -import logging, platform +import logging, platform, multiprocessing def listify(x): if type(x) is not list: return [x] @@ -1063,7 +1063,7 @@ def configure(args, stdout=None, stderr=None, env=None): raise if 'EMMAKEN_JUST_CONFIGURE' in env: del env['EMMAKEN_JUST_CONFIGURE'] if process.returncode is not 0: - logging.error('Configure step failed with non-zero return code ' + str(process.returncode) + '! Command line: ' + str(args)) + logging.error('Configure step failed with non-zero return code ' + str(process.returncode) + '! Command line: ' + str(args) + ' at ' + os.getcwd()) raise subprocess.CalledProcessError(cmd=args, returncode=process.returncode) @staticmethod From 95e003622b08ee35d09964da7fbea12bd6ccaa4a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 17 Oct 2014 17:03:10 -0700 Subject: [PATCH 392/461] preparations for emscripten-ports support; #2404 --- emcc | 7 ++-- src/settings.js | 4 ++ tools/system_libs.py | 90 +++++++++++++++++++++++++++++++++++++++----- 3 files changed, 88 insertions(+), 13 deletions(-) diff --git a/emcc b/emcc index e5a301a0d87f2..9527b83012fc3 100755 --- a/emcc +++ b/emcc @@ -1157,12 +1157,13 @@ try: logging.debug('will generate JavaScript') + extra_files_to_link = [] + if not LEAVE_INPUTS_RAW and \ not shared.Settings.BUILD_AS_SHARED_LIB and \ not shared.Settings.SIDE_MODULE: # shared libraries/side modules link no C libraries, need them in parent - extra_files_to_link = system_libs.calculate([f for _, f in sorted(temp_files)], in_temp, stdout, stderr, forced=forced_stdlibs) - else: - extra_files_to_link = [] + #extra_files_to_link = system_libs.calculate_ports(shared.Settings) + extra_files_to_link += system_libs.calculate([f for _, f in sorted(temp_files)] + extra_files_to_link, in_temp, stdout, stderr, forced=forced_stdlibs) log_time('calculate system libraries') diff --git a/src/settings.js b/src/settings.js index 57f4d7d08c7e0..8e71a967ce5e6 100644 --- a/src/settings.js +++ b/src/settings.js @@ -583,6 +583,10 @@ var USE_GLFW = 2; // Specify the GLFW version that is being linked against. // Only relevant, if you are linking against the GLFW library. // Valid options are 2 for GLFW2 and 3 for GLFW3. +var USE_SDL = 1; // Specify the SDL version that is being linked against. + // 1, the default, is 1.3, which is implemented in JS + // 2 is a port of the SDL C code on emscripten-ports + // Compiler debugging options var DEBUG_TAGS_SHOWING = []; // Some useful items: diff --git a/tools/system_libs.py b/tools/system_libs.py index b7b58cb573cd2..16c3d7f0c38f6 100644 --- a/tools/system_libs.py +++ b/tools/system_libs.py @@ -13,6 +13,17 @@ def call_process(cmd): if proc.returncode != 0: raise CalledProcessError(proc.returncode, cmd) +CORES = int(os.environ.get('EMCC_CORES') or multiprocessing.cpu_count()) + +def run_commands(commands): + cores = min(len(commands), CORES) + if cores <= 1: + for command in commands: + call_process(command) + else: + pool = multiprocessing.Pool(processes=cores) + pool.map(call_process, commands, chunksize=1) + def calculate(temp_files, in_temp, stdout_, stderr_, forced=[]): global stdout, stderr stdout = stdout_ @@ -42,16 +53,6 @@ def read_symbols(path, exclude=None): # XXX we should disable EMCC_DEBUG when building libs, just like in the relooper - def run_commands(commands): - cores = int(os.environ.get('EMCC_CORES') or multiprocessing.cpu_count()) - cores = min(len(commands), cores) - if cores <= 1: - for command in commands: - call_process(command) - else: - pool = multiprocessing.Pool(processes=cores) - pool.map(call_process, commands, chunksize=1) - def build_libc(lib_filename, files, lib_opts): o_s = [] prev_cxx = os.environ.get('EMMAKEN_CXX') @@ -575,3 +576,72 @@ class Dummy: force = force.union(deps) return ret +#--------------------------------------------------------------------------- +# emscripten-ports library management (https://github.com/emscripten-ports) +#--------------------------------------------------------------------------- + +class Ports: + @staticmethod + def get_dir(): + dirname = os.environ.get('EM_PORTS') or os.path.expanduser(os.path.join('~', '.emscripten_ports')) + shared.safe_ensure_dirs(dirname) + return dirname + + @staticmethod + def fetch_project(name, url): + fullname = os.path.join(Ports.get_dir(), name) + logging.debug('including port: ' + name + ' (at ' + fullname + ')') + + if not os.path.exists(fullname + '.zip'): + logging.debug('retrieving port: ' + name) + import urllib2 + f = urllib2.urlopen(url) + data = f.read() + open(fullname + '.zip', 'wb').write(data) + + if not os.path.exists(fullname): + logging.debug('unpacking port: ' + name) + import zipfile + shared.safe_ensure_dirs(fullname) + z = zipfile.ZipFile(fullname + '.zip', 'r') + try: + cwd = os.getcwd() + os.chdir(fullname) + z.extractall() + finally: + os.chdir(cwd) + + @staticmethod + def build_project(name, subdir, configure, generated_libs): + def create(): + logging.debug('building port: ' + name) + port_build_dir = shared.Cache.get_path('ports-builds') + shared.safe_ensure_dirs(port_build_dir) + libs = shared.Building.build_library(name, port_build_dir, None, generated_libs, source_dir=os.path.join(Ports.get_dir(), name, subdir), copy_project=True, + configure=configure, make=['make', '-j' + str(CORES)]) + assert len(libs) == 1 + return libs[0] + return shared.Cache.get(name, create) + + # Libraries + + @staticmethod + def get_sdl2(): + Ports.fetch_project('sdl2', 'https://github.com/emscripten-ports/SDL2/archive/master.zip') + return Ports.build_project('sdl2', 'SDL2-master', + ['sh', './configure', '--host=asmjs-unknown-emscripten', '--disable-assembly', '--disable-threads', '--enable-cpuinfo=false', 'CFLAGS=-O2'], + [os.path.join('build', '.libs', 'libSDL2.a')]) + +def calculate_ports(settings): + ret = [] + + ok = False + try: + if settings.USE_SDL == 2: ret.append(Ports.get_sdl2()) + ok = True + finally: + if not ok: + logging.error('a problem occurred when using an emscripten-ports library. try to clear ' + Ports.get_dir() + ' and run again') + + return ret + From 430989d06fe7372e654aaa16054164b312bdfbba Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 17 Oct 2014 17:22:26 -0700 Subject: [PATCH 393/461] determine SDL system include paths in system_libs.py; #2404 --- emcc | 3 ++- tools/shared.py | 1 - tools/system_libs.py | 24 +++++++++++++++--------- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/emcc b/emcc index 9527b83012fc3..8dfef42d43c07 100755 --- a/emcc +++ b/emcc @@ -1071,6 +1071,7 @@ try: args = newargs + ['-emit-llvm', '-c', input_file, '-o', output_file] if file_ending.endswith(CXX_ENDINGS): args += shared.EMSDK_CXX_OPTS + args = system_libs.process_args(args, shared.Settings) logging.debug("running: " + call + ' ' + ' '.join(args)) execute([call] + args) # let compiler frontend print directly, so colors are saved (PIPE kills that) if not os.path.exists(output_file): @@ -1162,7 +1163,7 @@ try: if not LEAVE_INPUTS_RAW and \ not shared.Settings.BUILD_AS_SHARED_LIB and \ not shared.Settings.SIDE_MODULE: # shared libraries/side modules link no C libraries, need them in parent - #extra_files_to_link = system_libs.calculate_ports(shared.Settings) + #extra_files_to_link = system_libs.get_ports(shared.Settings) extra_files_to_link += system_libs.calculate([f for _, f in sorted(temp_files)] + extra_files_to_link, in_temp, stdout, stderr, forced=forced_stdlibs) log_time('calculate system libraries') diff --git a/tools/shared.py b/tools/shared.py index 3504778f293da..1a82764eeb44a 100644 --- a/tools/shared.py +++ b/tools/shared.py @@ -730,7 +730,6 @@ def get_llvm_target(): path_from_root('system', 'include', 'emscripten'), path_from_root('system', 'include', 'libc'), path_from_root('system', 'lib', 'libc', 'musl', 'arch', 'js'), - path_from_root('system', 'include', 'SDL'), ] CXX_INCLUDE_PATHS = [path_from_root('system', 'include', 'libcxx') diff --git a/tools/system_libs.py b/tools/system_libs.py index 16c3d7f0c38f6..81c6d8975920a 100644 --- a/tools/system_libs.py +++ b/tools/system_libs.py @@ -625,19 +625,20 @@ def create(): # Libraries - @staticmethod - def get_sdl2(): - Ports.fetch_project('sdl2', 'https://github.com/emscripten-ports/SDL2/archive/master.zip') - return Ports.build_project('sdl2', 'SDL2-master', - ['sh', './configure', '--host=asmjs-unknown-emscripten', '--disable-assembly', '--disable-threads', '--enable-cpuinfo=false', 'CFLAGS=-O2'], - [os.path.join('build', '.libs', 'libSDL2.a')]) - -def calculate_ports(settings): + class sdl2: + @staticmethod + def get(): + Ports.fetch_project('sdl2', 'https://github.com/emscripten-ports/SDL2/archive/master.zip') + return Ports.build_project('sdl2', 'SDL2-master', + ['sh', './configure', '--host=asmjs-unknown-emscripten', '--disable-assembly', '--disable-threads', '--enable-cpuinfo=false', 'CFLAGS=-O2'], + [os.path.join('build', '.libs', 'libSDL2.a')]) + +def get_ports(settings): ret = [] ok = False try: - if settings.USE_SDL == 2: ret.append(Ports.get_sdl2()) + if settings.USE_SDL == 2: ret.append(Ports.sdl2.get()) ok = True finally: if not ok: @@ -645,3 +646,8 @@ def calculate_ports(settings): return ret +def process_args(args, settings): + if settings.USE_SDL == 1: args += ['-Xclang', '-isystem' + shared.path_from_root('system', 'include', 'SDL')] + elif settings.USE_SDL == 2: args += ['-Xclang', '-isystem' + os.path.join(shared.Cache.get_path('ports-builds'), 'sdl2', 'include')] + return args + From 0c13a44534c92d544269d749de432d6b70ce5e03 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 18 Oct 2014 12:01:13 -0700 Subject: [PATCH 394/461] move all ports specific code into separate files under tools/ports/ #2404 --- emcc | 2 +- tools/ports/__init__.py | 4 ++++ tools/ports/sdl.py | 16 ++++++++++++++++ tools/system_libs.py | 18 ++++++------------ 4 files changed, 27 insertions(+), 13 deletions(-) create mode 100644 tools/ports/__init__.py create mode 100644 tools/ports/sdl.py diff --git a/emcc b/emcc index 8dfef42d43c07..74ea800c6d708 100755 --- a/emcc +++ b/emcc @@ -1163,7 +1163,7 @@ try: if not LEAVE_INPUTS_RAW and \ not shared.Settings.BUILD_AS_SHARED_LIB and \ not shared.Settings.SIDE_MODULE: # shared libraries/side modules link no C libraries, need them in parent - #extra_files_to_link = system_libs.get_ports(shared.Settings) + extra_files_to_link = system_libs.get_ports(shared.Settings) extra_files_to_link += system_libs.calculate([f for _, f in sorted(temp_files)] + extra_files_to_link, in_temp, stdout, stderr, forced=forced_stdlibs) log_time('calculate system libraries') diff --git a/tools/ports/__init__.py b/tools/ports/__init__.py new file mode 100644 index 0000000000000..4cc4df1c071bf --- /dev/null +++ b/tools/ports/__init__.py @@ -0,0 +1,4 @@ +import sdl + +ports = [sdl] + diff --git a/tools/ports/sdl.py b/tools/ports/sdl.py new file mode 100644 index 0000000000000..6a24316534f50 --- /dev/null +++ b/tools/ports/sdl.py @@ -0,0 +1,16 @@ +import os + +def get(ports, settings, shared): + if settings.USE_SDL == 2: + ports.fetch_project('sdl2', 'https://github.com/emscripten-ports/SDL2/archive/master.zip') + return [ports.build_project('sdl2', 'SDL2-master', + ['sh', './configure', '--host=asmjs-unknown-emscripten', '--disable-assembly', '--disable-threads', '--enable-cpuinfo=false', 'CFLAGS=-O2'], + [os.path.join('build', '.libs', 'libSDL2.a')])] + else: + return [] + +def process_args(args, settings, shared): + if settings.USE_SDL == 1: args += ['-Xclang', '-isystem' + shared.path_from_root('system', 'include', 'SDL')] + elif settings.USE_SDL == 2: args += ['-Xclang', '-isystem' + os.path.join(shared.Cache.get_path('ports-builds'), 'sdl2', 'include')] + return args + diff --git a/tools/system_libs.py b/tools/system_libs.py index 81c6d8975920a..2ec256b95472b 100644 --- a/tools/system_libs.py +++ b/tools/system_libs.py @@ -580,6 +580,8 @@ class Dummy: # emscripten-ports library management (https://github.com/emscripten-ports) #--------------------------------------------------------------------------- +import ports + class Ports: @staticmethod def get_dir(): @@ -623,22 +625,14 @@ def create(): return libs[0] return shared.Cache.get(name, create) - # Libraries - - class sdl2: - @staticmethod - def get(): - Ports.fetch_project('sdl2', 'https://github.com/emscripten-ports/SDL2/archive/master.zip') - return Ports.build_project('sdl2', 'SDL2-master', - ['sh', './configure', '--host=asmjs-unknown-emscripten', '--disable-assembly', '--disable-threads', '--enable-cpuinfo=false', 'CFLAGS=-O2'], - [os.path.join('build', '.libs', 'libSDL2.a')]) def get_ports(settings): ret = [] ok = False try: - if settings.USE_SDL == 2: ret.append(Ports.sdl2.get()) + for port in ports.ports: + ret += port.get(Ports, settings, shared) ok = True finally: if not ok: @@ -647,7 +641,7 @@ def get_ports(settings): return ret def process_args(args, settings): - if settings.USE_SDL == 1: args += ['-Xclang', '-isystem' + shared.path_from_root('system', 'include', 'SDL')] - elif settings.USE_SDL == 2: args += ['-Xclang', '-isystem' + os.path.join(shared.Cache.get_path('ports-builds'), 'sdl2', 'include')] + for port in ports.ports: + args = port.process_args(args, settings, shared) return args From 12aaad6e7119e65d091a349225b920300f4f429f Mon Sep 17 00:00:00 2001 From: Ophir LOJKINE Date: Sun, 19 Oct 2014 20:56:53 +0200 Subject: [PATCH 395/461] Qick & dirty fix for #2836 --- emcc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/emcc b/emcc index c9bd5a5d64966..c6242f4b82743 100755 --- a/emcc +++ b/emcc @@ -850,8 +850,7 @@ try: for change in settings_changes: key, value = change.split('=') if value[0] == '@': - value = '"@' + os.path.abspath(value[1:]) + '"' - value = value.replace('\\\\', '/').replace('\\', '/') # Convert backslash paths to forward slashes on Windows as well, since the JS compiler otherwise needs the backslashes escaped (alternative is to escape all input paths passing to JS, which feels clumsier to read) + value = open(value[1:]).read() else: value = value.replace('\\', '\\\\') exec('shared.Settings.' + key + ' = ' + value) From c7e60ad2b6b24dc6f68ed814cc2be570efff893a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 19 Oct 2014 14:17:31 -0700 Subject: [PATCH 396/461] refactor an sdl1 test --- tests/test_browser.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/test_browser.py b/tests/test_browser.py index 886fb9fa57ffa..0a13cb1ef33ca 100644 --- a/tests/test_browser.py +++ b/tests/test_browser.py @@ -58,10 +58,9 @@ def setUpClass(self): print 'Running the browser tests. Make sure the browser allows popups from localhost.' print - def test_html(self): - # test HTML generation. - self.btest('hello_world_sdl.cpp', reference='htmltest.png', - message='You should see "hello, world!" and a colored cube.') + def test_sdl1(self): + self.btest('hello_world_sdl.cpp', reference='htmltest.png') + self.btest('hello_world_sdl.cpp', reference='htmltest.png', args=['-s', 'USE_SDL=1']) # is the default anyhow def test_html_source_map(self): cpp_file = os.path.join(self.get_dir(), 'src.cpp') From 06d1933e3795879d91abae2aeb21838b2efe3bc7 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 19 Oct 2014 14:48:51 -0700 Subject: [PATCH 397/461] add ports sanity check; #2404 --- tests/test_sanity.py | 36 ++++++++++++++++++++++++++++++++++++ tools/system_libs.py | 16 +++++++++++----- 2 files changed, 47 insertions(+), 5 deletions(-) diff --git a/tests/test_sanity.py b/tests/test_sanity.py index d51ec2b32ffd6..1437f420cf5aa 100644 --- a/tests/test_sanity.py +++ b/tests/test_sanity.py @@ -567,3 +567,39 @@ def test_emconfig(self): self.assertContained('hello, world!', result) + def test_emcc_ports(self): + restore() + + INCLUDING_MESSAGE = 'including port' + RETRIEVING_MESSAGE = 'retrieving port' + BUILDING_MESSAGE = 'building port' + + from tools import system_libs + PORTS_DIR = system_libs.Ports.get_dir() + + for i in [0, 1]: + print i + try_delete(PORTS_DIR) + assert not os.path.exists(PORTS_DIR) + if i == 0: Cache.erase() # test with cache erased and without + + # Building a file that doesn't need ports should not trigger anything + output = self.do([EMCC, path_from_root('tests', 'hello_world_sdl.cpp')]) + assert INCLUDING_MESSAGE not in output + assert RETRIEVING_MESSAGE not in output + assert BUILDING_MESSAGE not in output + assert not os.path.exists(PORTS_DIR) + + # Building a file that need a port does trigger stuff + output = self.do([EMCC, path_from_root('tests', 'hello_world_sdl.cpp'), '-s', 'USE_SDL=2']) + assert INCLUDING_MESSAGE in output, output + assert RETRIEVING_MESSAGE in output, output + assert BUILDING_MESSAGE in output, output + assert os.path.exists(PORTS_DIR) + + # Using it again avoids retrieve and build + output = self.do([EMCC, path_from_root('tests', 'hello_world_sdl.cpp'), '-s', 'USE_SDL=2']) + assert INCLUDING_MESSAGE in output, output + assert RETRIEVING_MESSAGE not in output, output + assert BUILDING_MESSAGE not in output, output + diff --git a/tools/system_libs.py b/tools/system_libs.py index 2ec256b95472b..d34af25a6b448 100644 --- a/tools/system_libs.py +++ b/tools/system_libs.py @@ -592,17 +592,18 @@ def get_dir(): @staticmethod def fetch_project(name, url): fullname = os.path.join(Ports.get_dir(), name) - logging.debug('including port: ' + name + ' (at ' + fullname + ')') + logging.warning('including port: ' + name) + logging.debug(' (at ' + fullname + ')') if not os.path.exists(fullname + '.zip'): - logging.debug('retrieving port: ' + name) + logging.warning('retrieving port: ' + name + ' from ' + url) import urllib2 f = urllib2.urlopen(url) data = f.read() open(fullname + '.zip', 'wb').write(data) if not os.path.exists(fullname): - logging.debug('unpacking port: ' + name) + logging.warning('unpacking port: ' + name) import zipfile shared.safe_ensure_dirs(fullname) z = zipfile.ZipFile(fullname + '.zip', 'r') @@ -613,15 +614,20 @@ def fetch_project(name, url): finally: os.chdir(cwd) + # we unpacked a new version, clear the build in the cache + shared.try_delete(os.path.join(shared.Cache.get_path('ports-builds'), name)) + shared.try_delete(shared.Cache.get_path(name + '.bc')) + @staticmethod def build_project(name, subdir, configure, generated_libs): def create(): - logging.debug('building port: ' + name) + logging.warning('building port: ' + name + '...') port_build_dir = shared.Cache.get_path('ports-builds') shared.safe_ensure_dirs(port_build_dir) libs = shared.Building.build_library(name, port_build_dir, None, generated_libs, source_dir=os.path.join(Ports.get_dir(), name, subdir), copy_project=True, configure=configure, make=['make', '-j' + str(CORES)]) assert len(libs) == 1 + logging.warning(' building complete') return libs[0] return shared.Cache.get(name, create) @@ -636,7 +642,7 @@ def get_ports(settings): ok = True finally: if not ok: - logging.error('a problem occurred when using an emscripten-ports library. try to clear ' + Ports.get_dir() + ' and run again') + logging.error('a problem occurred when using an emscripten-ports library. try to clear ' + Ports.get_dir() + ', run emcc --clear-cache, and run again') return ret From 79c9d47c032a2013c8c830bd6df72bf39e7016ef Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 19 Oct 2014 16:54:36 -0700 Subject: [PATCH 398/461] port some tests to SDL2; combined patch including all the tests work of Charlie Birks and Sathyanarayanan Gunasekaran , and some final integration tweaks (-lSDL2 => -s USE_SDL=2), keep tests disabled for now; #2404 --- tests/sdl2_audio_beep.cpp | 246 +++++++++++++++++++++++++ tests/sdl2_canvas_blank.c | 21 +++ tests/sdl2_canvas_palette.c | 71 ++++++++ tests/sdl2_canvas_palette_2.c | 86 +++++++++ tests/sdl2_canvas_proxy.c | 46 +++++ tests/sdl2_canvas_size.c | 51 ++++++ tests/sdl2_canvas_twice.c | 36 ++++ tests/sdl2_fog_density.c | 182 +++++++++++++++++++ tests/sdl2_fog_exp2.c | 183 +++++++++++++++++++ tests/sdl2_fog_linear.c | 184 +++++++++++++++++++ tests/sdl2_fog_negative.c | 181 +++++++++++++++++++ tests/sdl2_fog_simple.c | 184 +++++++++++++++++++ tests/sdl2_gfx_primitives.c | 53 ++++++ tests/sdl2_gl_read.c | 166 +++++++++++++++++ tests/sdl2_image.c | 67 +++++++ tests/sdl2_image_prepare.c | 55 ++++++ tests/sdl2_key.c | 71 ++++++++ tests/sdl2_mouse.c | 68 +++++++ tests/sdl2_pumpevents.c | 77 ++++++++ tests/sdl2_swsurface.c | 28 +++ tests/sdl2_text.c | 40 +++++ tests/sdl2glshader.c | 165 +++++++++++++++++ tests/test_browser.py | 326 ++++++++++++++++++++++++++++++++++ tests/test_interactive.py | 7 + 24 files changed, 2594 insertions(+) create mode 100644 tests/sdl2_audio_beep.cpp create mode 100644 tests/sdl2_canvas_blank.c create mode 100644 tests/sdl2_canvas_palette.c create mode 100644 tests/sdl2_canvas_palette_2.c create mode 100644 tests/sdl2_canvas_proxy.c create mode 100644 tests/sdl2_canvas_size.c create mode 100644 tests/sdl2_canvas_twice.c create mode 100644 tests/sdl2_fog_density.c create mode 100644 tests/sdl2_fog_exp2.c create mode 100644 tests/sdl2_fog_linear.c create mode 100644 tests/sdl2_fog_negative.c create mode 100644 tests/sdl2_fog_simple.c create mode 100644 tests/sdl2_gfx_primitives.c create mode 100644 tests/sdl2_gl_read.c create mode 100644 tests/sdl2_image.c create mode 100644 tests/sdl2_image_prepare.c create mode 100644 tests/sdl2_key.c create mode 100644 tests/sdl2_mouse.c create mode 100644 tests/sdl2_pumpevents.c create mode 100644 tests/sdl2_swsurface.c create mode 100644 tests/sdl2_text.c create mode 100644 tests/sdl2glshader.c diff --git a/tests/sdl2_audio_beep.cpp b/tests/sdl2_audio_beep.cpp new file mode 100644 index 0000000000000..53a24752ca09c --- /dev/null +++ b/tests/sdl2_audio_beep.cpp @@ -0,0 +1,246 @@ +#include +#include +#include +#include +#include +#include + +#ifndef M_PI +#define M_PI 3.14159265358979323846f +#endif + +#ifdef __EMSCRIPTEN__ +#include "emscripten/emscripten.h" +#endif + +#ifdef main +#undef main +#endif + +const int tone_duration = 1000; + +struct BeepObject { + double toneFrequency; + int samplesLeft; +}; + +class Beeper { +private: + double phase; + int frequency; + int numChannels; + int mutedChannel; +public: + Beeper(int frequency, int numChannels, int sdlAudioFormat); + ~Beeper(); + void beep(double toneFrequency, int durationMSecs); + template + void generateSamples(T *stream, int length); + void wait(); + + std::queue beeps; + int sdlAudioFormat; +}; + +void audio_callback(void*, Uint8*, int); + +Beeper::Beeper(int frequency_, int numChannels_, int sdlAudioFormat_) { + phase = 0.0; + mutedChannel = 1; + + SDL_AudioSpec desiredSpec; + + desiredSpec.freq = frequency_; + desiredSpec.format = sdlAudioFormat_; + desiredSpec.channels = numChannels_; + desiredSpec.samples = 1024; // This is samples per channel. + desiredSpec.callback = audio_callback; + desiredSpec.userdata = this; + + SDL_AudioSpec obtainedSpec; + + // you might want to look for errors here + SDL_OpenAudio(&desiredSpec, &obtainedSpec); + + // In this test, we require *exactly* the identical SDL result that we provide, since we test + // all various configurations individually. + if (obtainedSpec.freq != desiredSpec.freq || obtainedSpec.format != desiredSpec.format + || obtainedSpec.channels != desiredSpec.channels || obtainedSpec.samples != desiredSpec.samples) { + SDL_CloseAudio(); + throw std::runtime_error("Failed to initialize desired SDL_OpenAudio!"); + } + + frequency = obtainedSpec.freq; + numChannels = obtainedSpec.channels; + sdlAudioFormat = obtainedSpec.format; + + // Immediately start producing audio. + SDL_PauseAudio(0); +} + +Beeper::~Beeper() { + SDL_CloseAudio(); +} + +template +void Beeper::generateSamples(T *stream, int length) { + const int AMPLITUDE = (sizeof(T) == 2) ? 28000 : 120; + const int offset = (sdlAudioFormat == AUDIO_U8) ? 120 : 0; + + int i = 0; + length /= numChannels; + while (i < length) { + if (beeps.empty()) { + memset(stream + numChannels*i, 0, sizeof(T)*numChannels*(length-i)); + return; + } + BeepObject& bo = beeps.front(); + + // In Stereo tests, mute one of the channels to be able to distinguish that Stereo output works. + if (bo.samplesLeft > tone_duration * frequency / 2 / 1000) { + mutedChannel = 1; + } else { + mutedChannel = 0; + } + + int samplesToDo = std::min(i + bo.samplesLeft, length); + bo.samplesLeft -= samplesToDo - i; + + while (i < samplesToDo) { + for(int j = 0; j < numChannels; ++j) { + stream[numChannels*i+j] = (T)(offset + (int)(AMPLITUDE * std::sin(phase * 2 * M_PI / frequency))); + if (numChannels > 1 && j == mutedChannel) { + stream[numChannels*i+j] = 0; + } + } + phase += bo.toneFrequency; + i++; + } + + if (bo.samplesLeft == 0) { + beeps.pop(); + } + } +} + +void Beeper::beep(double toneFrequency, int durationMSecs) { + BeepObject bo; + bo.toneFrequency = toneFrequency; + bo.samplesLeft = durationMSecs * frequency / 1000; + + SDL_LockAudio(); + beeps.push(bo); + SDL_UnlockAudio(); +} + +Beeper *beep = 0; + +// Test all kinds of various possible formats. Not all are supported, but running this +// test will report you which work. +const int freqs[] = { 8000, 11025, 16000, 22050, 32000, 44100, 48000, 96000 }; +const int channels[] = { 1, 2 }; +const int sdlAudioFormats[] = { AUDIO_U8, AUDIO_S16LSB /*, AUDIO_S8, AUDIO_U16LSB, AUDIO_U16MSB, AUDIO_S16MSB */ }; + +const char *SdlAudioFormatToString(int sdlAudioType) { + switch(sdlAudioType) { + case AUDIO_U8: return "AUDIO_U8"; + case AUDIO_S8: return "AUDIO_S8"; + case AUDIO_U16LSB: return "AUDIO_U16LSB"; + case AUDIO_U16MSB: return "AUDIO_U16MSB"; + case AUDIO_S16LSB: return "AUDIO_S16LSB"; + case AUDIO_S16MSB: return "AUDIO_S16MSB"; + default: return "(unknown)"; + } +} + +#define NUM_ELEMS(x) (sizeof(x)/sizeof((x)[0])) + +// Indices to the currently running test. +int f = -1; +int c = 0; +int s = 0; + +void nextTest(void *unused = 0) { + ++f; + if (f >= NUM_ELEMS(freqs)) { + f = 0; + ++c; + if (c >= NUM_ELEMS(channels)) { + c = 0; + ++s; + if (s >= NUM_ELEMS(sdlAudioFormats)) { + printf("All tests done. Quit.\n"); +#ifdef __EMSCRIPTEN__ + emscripten_cancel_main_loop(); +#ifdef REPORT_RESULT + int result = 1; + REPORT_RESULT(); +#endif +#endif + return; + } + } + } + + double Hz = 440; + try { + beep = new Beeper(freqs[f], channels[c], sdlAudioFormats[s]); + } catch(...) { + printf("FAILED to play beep for %d msecs at %d Hz tone with audio format %s, %d channels, and %d samples/sec.\n", + tone_duration, (int)Hz, SdlAudioFormatToString(sdlAudioFormats[s]), channels[c], freqs[f]); + nextTest(); + return; + } + + printf("Playing back a beep for %d msecs at %d Hz tone with audio format %s, %d channels, and %d samples/sec.\n", + tone_duration, (int)Hz, SdlAudioFormatToString(sdlAudioFormats[s]), channels[c], freqs[f]); + beep->beep(Hz, tone_duration); +} + +void update() { + SDL_LockAudio(); + int size = beep->beeps.size(); + SDL_UnlockAudio(); + if (size == 0 && beep) { + delete beep; + beep = 0; +#ifdef __EMSCRIPTEN__ + emscripten_async_call(nextTest, 0, 1500); +#else + SDL_Delay(1500); + nextTest(); +#endif + } +} + +void audio_callback(void *_beeper, Uint8 *_stream, int _length) { + Beeper* beeper = (Beeper*) _beeper; + + if (beeper->sdlAudioFormat == AUDIO_U8) { + Uint8 *stream = (Uint8*) _stream; + beeper->generateSamples(stream, _length); + } else if (beeper->sdlAudioFormat == AUDIO_S16LSB) { + Sint16 *stream = (Sint16*) _stream; + int length = _length / 2; + beeper->generateSamples(stream, length); + } else { + assert(false && "Audio sample generation not implemented for current format!\n"); + } +} + +int main(int argc, char** argv) { + SDL_Init(SDL_INIT_AUDIO); + + nextTest(); + +#ifdef __EMSCRIPTEN__ + emscripten_set_main_loop(update, 60, 0); +#else + while(beep) { + SDL_Delay(20); + update(); + } +#endif + + return 0; +} diff --git a/tests/sdl2_canvas_blank.c b/tests/sdl2_canvas_blank.c new file mode 100644 index 0000000000000..2eaebfe517b15 --- /dev/null +++ b/tests/sdl2_canvas_blank.c @@ -0,0 +1,21 @@ +#include +#include + + +int main() { + SDL_Init(SDL_INIT_VIDEO); + SDL_Window *window; + SDL_Renderer *renderer; + SDL_CreateWindowAndRenderer(256, 256, 0, &window, &renderer); + + SDL_Surface *screen = SDL_CreateRGBSurface(0, 256, 256, 8, 0, 0, 0, 0); + + if (SDL_MUSTLOCK(screen)) SDL_LockSurface(screen); + if (SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen); + SDL_RenderPresent(renderer); + + SDL_Quit(); + + return 0; +} + diff --git a/tests/sdl2_canvas_palette.c b/tests/sdl2_canvas_palette.c new file mode 100644 index 0000000000000..bd9114dae876f --- /dev/null +++ b/tests/sdl2_canvas_palette.c @@ -0,0 +1,71 @@ +#include +#include +#include + +int main() { + SDL_Init(SDL_INIT_VIDEO); + + SDL_Window *window; + SDL_Renderer *renderer; + + SDL_CreateWindowAndRenderer(600, 400, 0, &window, &renderer); + + SDL_Surface *screen = SDL_CreateRGBSurface(0, 600, 400, 8, 0, 0, 0, 0); + + //initialize sdl palette + //with red green and blue + //colors + SDL_Color pal[4]; + pal[0].r = 255; + pal[0].g = 0; + pal[0].b = 0; + pal[0].a = 255; + + pal[1].r = 0; + pal[1].g = 255; + pal[1].b = 0; + pal[1].a = 255; + + pal[2].r = 0; + pal[2].g = 0; + pal[2].b = 255; + pal[2].a = 255; + + pal[3].r = 255; + pal[3].g = 255; + pal[3].b = 0; + pal[3].a = 255; + + SDL_SetPaletteColors(screen->format->palette, pal, 0, 4); + + SDL_FillRect(screen, NULL, 0); + + { + SDL_Rect rect = { 300, 0, 300, 200 }; + SDL_FillRect(screen, &rect, 1); + } + + { + SDL_Rect rect = { 0, 200, 600, 200 }; + SDL_FillRect(screen, &rect, 2); + } + + { + SDL_Rect rect = { 300, 200, 300, 200 }; + SDL_FillRect(screen, &rect, 3); + } + + SDL_Texture *screenTexture = SDL_CreateTextureFromSurface(renderer, screen); + SDL_RenderClear(renderer); + SDL_RenderCopy(renderer, screenTexture, NULL, NULL); + SDL_RenderPresent(renderer); + + + printf("you should see red, blue and yellow rectangles\n"); + + + SDL_Quit(); + + return 0; +} + diff --git a/tests/sdl2_canvas_palette_2.c b/tests/sdl2_canvas_palette_2.c new file mode 100644 index 0000000000000..b6fbaa09f950c --- /dev/null +++ b/tests/sdl2_canvas_palette_2.c @@ -0,0 +1,86 @@ +#include +#include +#include +#include + +static const int COLOR_COUNT = 32; + +static SDL_Surface *screen; +static SDL_Color pal[COLOR_COUNT +1]; + +void pallete(int red, int green, int blue) { + //initialize sdl palette + //with gradient colors + pal[0].r = 0; + pal[0].g = 0; + pal[0].b = 0; + pal[0].a = 255; + + for (int i=1; i< 1 + COLOR_COUNT; i++) { + pal[i].r = (float) red / COLOR_COUNT * i; + pal[i].g = (float) green / COLOR_COUNT * i; + pal[i].b = (float) blue / COLOR_COUNT * i; + pal[i].a = 255; + } + + SDL_SetPaletteColors(screen->format->palette, pal, 0, 1 + COLOR_COUNT); +} + +int main(int argc, char** argv) { + SDL_Init(SDL_INIT_VIDEO); + + SDL_Window *window; + SDL_Renderer *renderer; + + SDL_CreateWindowAndRenderer(600, 450, 0, &window, &renderer); + + screen = SDL_CreateRGBSurface(0, 600, 450, 8, 0, 0, 0, 0); + + //test empty pallete + SDL_LockSurface(screen); + SDL_UnlockSurface(screen); + + //Draw gradient + SDL_LockSurface(screen); + int size = screen->h * screen->pitch; + char *color = screen->pixels; + int divider = size / COLOR_COUNT; + int i = 0; + while (i < size) { + *color = 1 + (i / divider); //red + color++; + i++; + } + SDL_UnlockSurface(screen); + + //Set pallete + if (argc > 1) { + printf("%s\n", argv[1]); + if (strcmp(argv[1], "-r") == 0) { + printf("set [red]\n"); + pallete(255, 0, 0); + } + if (strcmp(argv[1], "-g") == 0) { + printf("set [green]\n"); + pallete(0, 255, 0); + } + if (strcmp(argv[1], "-b") == 0) { + printf("set [blue]\n"); + pallete(0, 0, 255); + } + } + + //refreshing + SDL_LockSurface(screen); + SDL_UnlockSurface(screen); + + SDL_Texture *screenTexture = SDL_CreateTextureFromSurface(renderer, screen); + SDL_RenderClear(renderer); + SDL_RenderCopy(renderer, screenTexture, NULL, NULL); + SDL_RenderPresent(renderer); + + SDL_Quit(); + + return 0; +} + diff --git a/tests/sdl2_canvas_proxy.c b/tests/sdl2_canvas_proxy.c new file mode 100644 index 0000000000000..6ff15fc7e8ea4 --- /dev/null +++ b/tests/sdl2_canvas_proxy.c @@ -0,0 +1,46 @@ +#include +#include +#include +#include +#include + +int main(int argc, char **argv) { + FILE *f = fopen("data.txt", "rb"); + assert(f); + assert(fgetc(f) == 'd'); + assert(fgetc(f) == 'a'); + assert(fgetc(f) == 't'); + assert(fgetc(f) == 'u'); + assert(fgetc(f) == 'm'); + fclose(f); + + SDL_Init(SDL_INIT_VIDEO); + //SDL_Surface *screen = SDL_SetVideoMode(600, 450, 32, SDL_HWSURFACE); + + SDL_Window *window; + SDL_Renderer *renderer; + + SDL_CreateWindowAndRenderer(600, 450, 0, &window, &renderer); + + SDL_Surface *screen = SDL_CreateRGBSurface(0, 600, 450, 32, 0, 0, 0, 0); + + SDL_LockSurface(screen); + unsigned int *pixels = (unsigned int *)screen->pixels; + for (int x = 0; x < screen->w; x++) { + for (int y = 0; y < screen->h; y++) { + pixels[x + y*screen->h] = x < 300 ? (y < 200 ? 0x3377AA88 : 0xAA3377CC) : (y < 200 ? 0x0066AA77 : 0xAA006699); + } + } + SDL_UnlockSurface(screen); + + SDL_Texture *screenTexture = SDL_CreateTextureFromSurface(renderer, screen); + SDL_RenderClear(renderer); + SDL_RenderCopy(renderer, screenTexture, NULL, NULL); + SDL_RenderPresent(renderer); + + SDL_Quit(); + + EM_ASM(window.close()); + return 0; +} + diff --git a/tests/sdl2_canvas_size.c b/tests/sdl2_canvas_size.c new file mode 100644 index 0000000000000..844081c4bfde8 --- /dev/null +++ b/tests/sdl2_canvas_size.c @@ -0,0 +1,51 @@ +#include "SDL2/SDL.h" + +#include +#include +#include + +#include + +int result = 0; + +int main(int argc, char *argv[]) +{ + SDL_Window *window; + + if ( SDL_Init(SDL_INIT_VIDEO) != 0 ) { + printf("Unable to initialize SDL: %s\n", SDL_GetError()); + return 1; + } + + // Test 1: Check that initializing video mode + // Create an application window with the following settings: + window = SDL_CreateWindow( + "sdlw_canvas_size", + SDL_WINDOWPOS_UNDEFINED, + SDL_WINDOWPOS_UNDEFINED, + 700, + 200, + 0 + ); + + // Test 2: Check that getting current canvas size works. + int w, h, fs; + emscripten_get_canvas_size(&w, &h, &fs); + printf("w:%d,h:%d\n", w,h); + assert(w == 700); + assert(h == 200); + + // Test 3: Check that resizing the canvas works as well. + emscripten_set_canvas_size(640, 480); + emscripten_get_canvas_size(&w, &h, &fs); + printf("w:%d,h:%d\n", w,h); + assert(w == 640); + assert(h == 480); + + SDL_DestroyWindow(window); + SDL_Quit(); + result = 1; + REPORT_RESULT(); + + return 0; +} diff --git a/tests/sdl2_canvas_twice.c b/tests/sdl2_canvas_twice.c new file mode 100644 index 0000000000000..8c7a9ad328375 --- /dev/null +++ b/tests/sdl2_canvas_twice.c @@ -0,0 +1,36 @@ +#include + +#ifdef __EMSCRIPTEN__ +#include +#endif + +int main(int argc, char **argv) { + SDL_Init(SDL_INIT_VIDEO); + //SDL_Surface *screen = SDL_SetVideoMode(40, 40, 32, SDL_SWSURFACE); + + SDL_Window *window; + SDL_Renderer *renderer; + + SDL_CreateWindowAndRenderer(40, 40, 0, &window, &renderer); + + SDL_Surface *screen = SDL_CreateRGBSurface(0, 40, 40, 32, 0, 0, 0, 0); + + SDL_FillRect(screen, NULL, SDL_MapRGBA(screen->format, 0xff, 0, 0, 0xff)); + SDL_LockSurface(screen); + *((int*)screen->pixels + 95) = 0; + SDL_UnlockSurface(screen); + + SDL_FillRect(screen, NULL, SDL_MapRGBA(screen->format, 0, 0xff, 0, 0xff)); // wipe out previous pixel and fill + SDL_LockSurface(screen); + *((int*)screen->pixels + 205) = 0; + SDL_UnlockSurface(screen); + + SDL_Texture *screenTexture = SDL_CreateTextureFromSurface(renderer, screen); + SDL_RenderClear(renderer); + SDL_RenderCopy(renderer, screenTexture, NULL, NULL); + SDL_RenderPresent(renderer); + + while(1) { SDL_WaitEvent(NULL); } + + return 0; +} diff --git a/tests/sdl2_fog_density.c b/tests/sdl2_fog_density.c new file mode 100644 index 0000000000000..0154700168152 --- /dev/null +++ b/tests/sdl2_fog_density.c @@ -0,0 +1,182 @@ +/******************************************************************* + * * + * Using SDL With OpenGL * + * * + * Tutorial by Kyle Foley (sdw) * + * * + * http://gpwiki.org/index.php/SDL:Tutorials:Using_SDL_with_OpenGL * + * * + *******************************************************************/ + +/* +THIS WORK, INCLUDING THE SOURCE CODE, DOCUMENTATION +AND RELATED MEDIA AND DATA, IS PLACED INTO THE PUBLIC DOMAIN. + +THE ORIGINAL AUTHOR IS KYLE FOLEY. + +THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY +OF ANY KIND, NOT EVEN THE IMPLIED WARRANTY OF +MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, +ASSUMES _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE +RESULTING FROM THE USE, MODIFICATION, OR +REDISTRIBUTION OF THIS SOFTWARE. +*/ + +#include "SDL2/SDL.h" +#include "SDL2/SDL_image.h" +#include "SDL2/SDL_opengl.h" + +#include +#include +#include + +int main(int argc, char *argv[]) +{ + SDL_Window *window; + SDL_GLContext context; + + // Slightly different SDL initialization + if ( SDL_Init(SDL_INIT_VIDEO) != 0 ) { + printf("Unable to initialize SDL: %s\n", SDL_GetError()); + return 1; + } + + SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); // *new* + + window = SDL_CreateWindow("sdl_fog_density", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_OPENGL); + if ( !window ) { + printf("Unable to create window: %s\n", SDL_GetError()); + return 1; + } + + context = SDL_GL_CreateContext(window); + + // Set the OpenGL state after creating the context with SDL_SetVideoMode + + glClearColor( 0, 0, 0, 0 ); + + glEnable( GL_TEXTURE_2D ); // Needed when we're using the fixed-function pipeline. + + glViewport( 0, 0, 640, 480 ); + + glMatrixMode( GL_PROJECTION ); + glPushMatrix(); // just for testing + glLoadIdentity(); + + glOrtho( 0, 640, 480, 0, -1000, 1000 ); + + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity(); + + // Load the OpenGL texture + + GLuint texture; // Texture object handle + SDL_Surface *surface; // Gives us the information to make the texture + + if ( (surface = IMG_Load("screenshot.png")) ) { + + // Check that the image's width is a power of 2 + if ( (surface->w & (surface->w - 1)) != 0 ) { + printf("warning: image.bmp's width is not a power of 2\n"); + } + + // Also check if the height is a power of 2 + if ( (surface->h & (surface->h - 1)) != 0 ) { + printf("warning: image.bmp's height is not a power of 2\n"); + } + + // Have OpenGL generate a texture object handle for us + glGenTextures( 1, &texture ); + + // Bind the texture object + glBindTexture( GL_TEXTURE_2D, texture ); + + // Set the texture's stretching properties + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + + //SDL_LockSurface(surface); + + // Add some greyness + memset(surface->pixels, 0x66, surface->w*surface->h); + + // Edit the texture object's image data using the information SDL_Surface gives us + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, surface->w, surface->h, 0, + GL_RGBA, GL_UNSIGNED_BYTE, surface->pixels ); + + //SDL_UnlockSurface(surface); + } + else { + printf("SDL could not load image.bmp: %s\n", SDL_GetError()); + SDL_Quit(); + return 1; + } + + // Free the SDL_Surface only if it was successfully created + if ( surface ) { + SDL_FreeSurface( surface ); + } + + // Clear the screen before drawing + glClear( GL_COLOR_BUFFER_BIT ); + + // Bind the texture to which subsequent calls refer to + glBindTexture( GL_TEXTURE_2D, texture ); + + glEnable(GL_FOG); + GLfloat fogColor[] = { 1.0, 0.5, 0.5, 0.05 }; + glFogfv(GL_FOG_COLOR, fogColor); + glFogf(GL_FOG_DENSITY, 0.2); + + assert(glIsEnabled(GL_FOG)); + + glBegin( GL_QUADS ); + glTexCoord2i( 0, 0 ); glVertex3f( 10, 10, 10 ); + glTexCoord2i( 1, 0 ); glVertex3f( 300, 10, 10 ); + glTexCoord2i( 1, 1 ); glVertex3f( 300, 128, 10 ); + glTexCoord2i( 0, 1 ); glVertex3f( 10, 128, 10 ); + + glTexCoord2f( 0, 0.5 ); glVertex3f( 410, 10, 5 ); + glTexCoord2f( 1, 0.5 ); glVertex3f( 600, 10, 6 ); + glTexCoord2f( 1, 1 ); glVertex3f( 630, 200, 7 ); + glTexCoord2f( 0.5, 1 ); glVertex3f( 310, 250, 8 ); + glEnd(); + + glBegin( GL_TRIANGLE_STRIP ); + glTexCoord2i( 0, 0 ); glVertex3f( 100, 300, 1 ); + glTexCoord2i( 1, 0 ); glVertex3f( 300, 300, 1 ); + glTexCoord2i( 1, 1 ); glVertex3f( 300, 400, 1 ); + glTexCoord2i( 0, 1 ); glVertex3f( 500, 410, 1 ); + glEnd(); + + glDisable(GL_TEXTURE_2D); + + glColor3ub(90, 255, 255); + glBegin( GL_QUADS ); + glVertex3f( 10, 410, 5 ); + glVertex3f( 300, 410, 50 ); + glVertex3f( 300, 480, 100 ); + glVertex3f( 10, 470, 5 ); + glEnd(); + + glBegin( GL_QUADS ); + glColor3f(1.0, 0, 1.0); glVertex3f( 410, 410, 10 ); + glColor3f(0, 1.0, 0); glVertex3f( 600, 410, 10 ); + glColor3f(0, 0, 1.0); glVertex3f( 600, 480, 10 ); + glColor3f(1.0, 1.0, 1.0); glVertex3f( 410, 470, 10 ); + glEnd(); + + SDL_GL_SwapWindow(window); + +#ifndef __EMSCRIPTEN__ + // Wait for 3 seconds to give us a chance to see the image + SDL_Delay(30000); +#endif + + // Now we can delete the OpenGL texture and close down SDL + glDeleteTextures( 1, &texture ); + + SDL_Quit(); + + return 0; +} diff --git a/tests/sdl2_fog_exp2.c b/tests/sdl2_fog_exp2.c new file mode 100644 index 0000000000000..7339c99e50a8c --- /dev/null +++ b/tests/sdl2_fog_exp2.c @@ -0,0 +1,183 @@ +/******************************************************************* + * * + * Using SDL With OpenGL * + * * + * Tutorial by Kyle Foley (sdw) * + * * + * http://gpwiki.org/index.php/SDL:Tutorials:Using_SDL_with_OpenGL * + * * + *******************************************************************/ + +/* +THIS WORK, INCLUDING THE SOURCE CODE, DOCUMENTATION +AND RELATED MEDIA AND DATA, IS PLACED INTO THE PUBLIC DOMAIN. + +THE ORIGINAL AUTHOR IS KYLE FOLEY. + +THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY +OF ANY KIND, NOT EVEN THE IMPLIED WARRANTY OF +MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, +ASSUMES _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE +RESULTING FROM THE USE, MODIFICATION, OR +REDISTRIBUTION OF THIS SOFTWARE. +*/ + +#include "SDL2/SDL.h" +#include "SDL2/SDL_image.h" +#include "SDL2/SDL_opengl.h" + +#include +#include +#include + +int main(int argc, char *argv[]) +{ + SDL_Window *window; + SDL_GLContext context; + + // Slightly different SDL initialization + if ( SDL_Init(SDL_INIT_VIDEO) != 0 ) { + printf("Unable to initialize SDL: %s\n", SDL_GetError()); + return 1; + } + + SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); // *new* + + window = SDL_CreateWindow("sdl_fog_density", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_OPENGL); + if ( !window ) { + printf("Unable to create window: %s\n", SDL_GetError()); + return 1; + } + + context = SDL_GL_CreateContext(window); + + // Set the OpenGL state after creating the context with SDL_SetVideoMode + + glClearColor( 0, 0, 0, 0 ); + + glEnable( GL_TEXTURE_2D ); // Needed when we're using the fixed-function pipeline. + + glViewport( 0, 0, 640, 480 ); + + glMatrixMode( GL_PROJECTION ); + glPushMatrix(); // just for testing + glLoadIdentity(); + + glOrtho( 0, 640, 480, 0, -1000, 1000 ); + + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity(); + + // Load the OpenGL texture + + GLuint texture; // Texture object handle + SDL_Surface *surface; // Gives us the information to make the texture + + if ( (surface = IMG_Load("screenshot.png")) ) { + + // Check that the image's width is a power of 2 + if ( (surface->w & (surface->w - 1)) != 0 ) { + printf("warning: image.bmp's width is not a power of 2\n"); + } + + // Also check if the height is a power of 2 + if ( (surface->h & (surface->h - 1)) != 0 ) { + printf("warning: image.bmp's height is not a power of 2\n"); + } + + // Have OpenGL generate a texture object handle for us + glGenTextures( 1, &texture ); + + // Bind the texture object + glBindTexture( GL_TEXTURE_2D, texture ); + + // Set the texture's stretching properties + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + + //SDL_LockSurface(surface); + + // Add some greyness + memset(surface->pixels, 0x66, surface->w*surface->h); + + // Edit the texture object's image data using the information SDL_Surface gives us + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, surface->w, surface->h, 0, + GL_RGBA, GL_UNSIGNED_BYTE, surface->pixels ); + + //SDL_UnlockSurface(surface); + } + else { + printf("SDL could not load image.bmp: %s\n", SDL_GetError()); + SDL_Quit(); + return 1; + } + + // Free the SDL_Surface only if it was successfully created + if ( surface ) { + SDL_FreeSurface( surface ); + } + + // Clear the screen before drawing + glClear( GL_COLOR_BUFFER_BIT ); + + // Bind the texture to which subsequent calls refer to + glBindTexture( GL_TEXTURE_2D, texture ); + + glEnable(GL_FOG); + GLfloat fogColor[] = { 1.0, 0.5, 0.5, 0.05 }; + glFogfv(GL_FOG_COLOR, fogColor); + glFogf(GL_FOG_DENSITY, 0.2); + glFogi(GL_FOG_MODE, GL_EXP2); + + assert(glIsEnabled(GL_FOG)); + + glBegin( GL_QUADS ); + glTexCoord2i( 0, 0 ); glVertex3f( 10, 10, 10 ); + glTexCoord2i( 1, 0 ); glVertex3f( 300, 10, 10 ); + glTexCoord2i( 1, 1 ); glVertex3f( 300, 128, 10 ); + glTexCoord2i( 0, 1 ); glVertex3f( 10, 128, 10 ); + + glTexCoord2f( 0, 0.5 ); glVertex3f( 410, 10, 5 ); + glTexCoord2f( 1, 0.5 ); glVertex3f( 600, 10, 6 ); + glTexCoord2f( 1, 1 ); glVertex3f( 630, 200, 7 ); + glTexCoord2f( 0.5, 1 ); glVertex3f( 310, 250, 8 ); + glEnd(); + + glBegin( GL_TRIANGLE_STRIP ); + glTexCoord2i( 0, 0 ); glVertex3f( 100, 300, 1 ); + glTexCoord2i( 1, 0 ); glVertex3f( 300, 300, 1 ); + glTexCoord2i( 1, 1 ); glVertex3f( 300, 400, 1 ); + glTexCoord2i( 0, 1 ); glVertex3f( 500, 410, 1 ); + glEnd(); + + glDisable(GL_TEXTURE_2D); + + glColor3ub(90, 255, 255); + glBegin( GL_QUADS ); + glVertex3f( 10, 410, 5 ); + glVertex3f( 300, 410, 50 ); + glVertex3f( 300, 480, 100 ); + glVertex3f( 10, 470, 5 ); + glEnd(); + + glBegin( GL_QUADS ); + glColor3f(1.0, 0, 1.0); glVertex3f( 410, 410, 10 ); + glColor3f(0, 1.0, 0); glVertex3f( 600, 410, 10 ); + glColor3f(0, 0, 1.0); glVertex3f( 600, 480, 10 ); + glColor3f(1.0, 1.0, 1.0); glVertex3f( 410, 470, 10 ); + glEnd(); + + SDL_GL_SwapWindow(window); + +#if !defined(__EMSCRIPTEN__) + // Wait for 3 seconds to give us a chance to see the image + SDL_Delay(30000); +#endif + + // Now we can delete the OpenGL texture and close down SDL + glDeleteTextures( 1, &texture ); + + SDL_Quit(); + + return 0; +} diff --git a/tests/sdl2_fog_linear.c b/tests/sdl2_fog_linear.c new file mode 100644 index 0000000000000..e1d5476205eaf --- /dev/null +++ b/tests/sdl2_fog_linear.c @@ -0,0 +1,184 @@ +/******************************************************************* + * * + * Using SDL With OpenGL * + * * + * Tutorial by Kyle Foley (sdw) * + * * + * http://gpwiki.org/index.php/SDL:Tutorials:Using_SDL_with_OpenGL * + * * + *******************************************************************/ + +/* +THIS WORK, INCLUDING THE SOURCE CODE, DOCUMENTATION +AND RELATED MEDIA AND DATA, IS PLACED INTO THE PUBLIC DOMAIN. + +THE ORIGINAL AUTHOR IS KYLE FOLEY. + +THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY +OF ANY KIND, NOT EVEN THE IMPLIED WARRANTY OF +MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, +ASSUMES _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE +RESULTING FROM THE USE, MODIFICATION, OR +REDISTRIBUTION OF THIS SOFTWARE. +*/ + +#include "SDL2/SDL.h" +#include "SDL2/SDL_image.h" +#include "SDL2/SDL_opengl.h" + +#include +#include +#include + +int main(int argc, char *argv[]) +{ + SDL_Window *window; + SDL_GLContext context; + + // Slightly different SDL initialization + if ( SDL_Init(SDL_INIT_VIDEO) != 0 ) { + printf("Unable to initialize SDL: %s\n", SDL_GetError()); + return 1; + } + + SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); // *new* + + window = SDL_CreateWindow("sdl_fog_density", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_OPENGL); + if ( !window ) { + printf("Unable to create window: %s\n", SDL_GetError()); + return 1; + } + + context = SDL_GL_CreateContext(window); + + // Set the OpenGL state after creating the context with SDL_SetVideoMode + + glClearColor( 0, 0, 0, 0 ); + + glEnable( GL_TEXTURE_2D ); // Needed when we're using the fixed-function pipeline. + + glViewport( 0, 0, 640, 480 ); + + glMatrixMode( GL_PROJECTION ); + glPushMatrix(); // just for testing + glLoadIdentity(); + + glOrtho( 0, 640, 480, 0, -1000, 1000 ); + + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity(); + + // Load the OpenGL texture + + GLuint texture; // Texture object handle + SDL_Surface *surface; // Gives us the information to make the texture + + if ( (surface = IMG_Load("screenshot.png")) ) { + + // Check that the image's width is a power of 2 + if ( (surface->w & (surface->w - 1)) != 0 ) { + printf("warning: image.bmp's width is not a power of 2\n"); + } + + // Also check if the height is a power of 2 + if ( (surface->h & (surface->h - 1)) != 0 ) { + printf("warning: image.bmp's height is not a power of 2\n"); + } + + // Have OpenGL generate a texture object handle for us + glGenTextures( 1, &texture ); + + // Bind the texture object + glBindTexture( GL_TEXTURE_2D, texture ); + + // Set the texture's stretching properties + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + + //SDL_LockSurface(surface); + + // Add some greyness + memset(surface->pixels, 0x66, surface->w*surface->h); + + // Edit the texture object's image data using the information SDL_Surface gives us + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, surface->w, surface->h, 0, + GL_RGBA, GL_UNSIGNED_BYTE, surface->pixels ); + + //SDL_UnlockSurface(surface); + } + else { + printf("SDL could not load image.bmp: %s\n", SDL_GetError()); + SDL_Quit(); + return 1; + } + + // Free the SDL_Surface only if it was successfully created + if ( surface ) { + SDL_FreeSurface( surface ); + } + + // Clear the screen before drawing + glClear( GL_COLOR_BUFFER_BIT ); + + // Bind the texture to which subsequent calls refer to + glBindTexture( GL_TEXTURE_2D, texture ); + + glEnable(GL_FOG); + GLfloat fogColor[] = { 1.0, 0.5, 0.5, 0.05 }; + glFogfv(GL_FOG_COLOR, fogColor); + glFogi(GL_FOG_START, 8); + glFogi(GL_FOG_END, 13); + glFogi(GL_FOG_MODE, GL_LINEAR); + + assert(glIsEnabled(GL_FOG)); + + glBegin( GL_QUADS ); + glTexCoord2i( 0, 0 ); glVertex3f( 10, 10, 10 ); + glTexCoord2i( 1, 0 ); glVertex3f( 300, 10, 10 ); + glTexCoord2i( 1, 1 ); glVertex3f( 300, 128, 10 ); + glTexCoord2i( 0, 1 ); glVertex3f( 10, 128, 10 ); + + glTexCoord2f( 0, 0.5 ); glVertex3f( 410, 10, 5 ); + glTexCoord2f( 1, 0.5 ); glVertex3f( 600, 10, 6 ); + glTexCoord2f( 1, 1 ); glVertex3f( 630, 200, 7 ); + glTexCoord2f( 0.5, 1 ); glVertex3f( 310, 250, 8 ); + glEnd(); + + glBegin( GL_TRIANGLE_STRIP ); + glTexCoord2i( 0, 0 ); glVertex3f( 100, 300, 1 ); + glTexCoord2i( 1, 0 ); glVertex3f( 300, 300, 1 ); + glTexCoord2i( 1, 1 ); glVertex3f( 300, 400, 1 ); + glTexCoord2i( 0, 1 ); glVertex3f( 500, 410, 1 ); + glEnd(); + + glDisable(GL_TEXTURE_2D); + + glColor3ub(90, 255, 255); + glBegin( GL_QUADS ); + glVertex3f( 10, 410, 5 ); + glVertex3f( 300, 410, 50 ); + glVertex3f( 300, 480, 100 ); + glVertex3f( 10, 470, 5 ); + glEnd(); + + glBegin( GL_QUADS ); + glColor3f(1.0, 0, 1.0); glVertex3f( 410, 410, 10 ); + glColor3f(0, 1.0, 0); glVertex3f( 600, 410, 10 ); + glColor3f(0, 0, 1.0); glVertex3f( 600, 480, 10 ); + glColor3f(1.0, 1.0, 1.0); glVertex3f( 410, 470, 10 ); + glEnd(); + + SDL_GL_SwapWindow(window); + +#ifndef __EMSCRIPTEN__ + // Wait for 3 seconds to give us a chance to see the image + SDL_Delay(30000); +#endif + + // Now we can delete the OpenGL texture and close down SDL + glDeleteTextures( 1, &texture ); + + SDL_Quit(); + + return 0; +} diff --git a/tests/sdl2_fog_negative.c b/tests/sdl2_fog_negative.c new file mode 100644 index 0000000000000..03b55374dacb7 --- /dev/null +++ b/tests/sdl2_fog_negative.c @@ -0,0 +1,181 @@ +/******************************************************************* + * * + * Using SDL With OpenGL * + * * + * Tutorial by Kyle Foley (sdw) * + * * + * http://gpwiki.org/index.php/SDL:Tutorials:Using_SDL_with_OpenGL * + * * + *******************************************************************/ + +/* +THIS WORK, INCLUDING THE SOURCE CODE, DOCUMENTATION +AND RELATED MEDIA AND DATA, IS PLACED INTO THE PUBLIC DOMAIN. + +THE ORIGINAL AUTHOR IS KYLE FOLEY. + +THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY +OF ANY KIND, NOT EVEN THE IMPLIED WARRANTY OF +MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, +ASSUMES _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE +RESULTING FROM THE USE, MODIFICATION, OR +REDISTRIBUTION OF THIS SOFTWARE. +*/ + +#include "SDL2/SDL.h" +#include "SDL2/SDL_image.h" +#include "SDL2/SDL_opengl.h" + +#include +#include +#include + +int main(int argc, char *argv[]) +{ + SDL_Window *window; + SDL_GLContext context; + + // Slightly different SDL initialization + if ( SDL_Init(SDL_INIT_VIDEO) != 0 ) { + printf("Unable to initialize SDL: %s\n", SDL_GetError()); + return 1; + } + + SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); // *new* + + window = SDL_CreateWindow("sdl_fog_density", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_OPENGL); + if ( !window ) { + printf("Unable to create window: %s\n", SDL_GetError()); + return 1; + } + + context = SDL_GL_CreateContext(window); + + // Set the OpenGL state after creating the context with SDL_SetVideoMode + + glClearColor( 0, 0, 0, 0 ); + + glEnable( GL_TEXTURE_2D ); // Needed when we're using the fixed-function pipeline. + + glViewport( 0, 0, 640, 480 ); + + glMatrixMode( GL_PROJECTION ); + glPushMatrix(); // just for testing + glLoadIdentity(); + + glOrtho( 0, 640, 480, 0, -1000, 1000 ); + + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity(); + + // Load the OpenGL texture + + GLuint texture; // Texture object handle + SDL_Surface *surface; // Gives us the information to make the texture + + if ( (surface = IMG_Load("screenshot.png")) ) { + + // Check that the image's width is a power of 2 + if ( (surface->w & (surface->w - 1)) != 0 ) { + printf("warning: image.bmp's width is not a power of 2\n"); + } + + // Also check if the height is a power of 2 + if ( (surface->h & (surface->h - 1)) != 0 ) { + printf("warning: image.bmp's height is not a power of 2\n"); + } + + // Have OpenGL generate a texture object handle for us + glGenTextures( 1, &texture ); + + // Bind the texture object + glBindTexture( GL_TEXTURE_2D, texture ); + + // Set the texture's stretching properties + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + + //SDL_LockSurface(surface); + + // Add some greyness + memset(surface->pixels, 0x66, surface->w*surface->h); + + // Edit the texture object's image data using the information SDL_Surface gives us + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, surface->w, surface->h, 0, + GL_RGBA, GL_UNSIGNED_BYTE, surface->pixels ); + + //SDL_UnlockSurface(surface); + } + else { + printf("SDL could not load image.bmp: %s\n", SDL_GetError()); + SDL_Quit(); + return 1; + } + + // Free the SDL_Surface only if it was successfully created + if ( surface ) { + SDL_FreeSurface( surface ); + } + + // Clear the screen before drawing + glClear( GL_COLOR_BUFFER_BIT ); + + // Bind the texture to which subsequent calls refer to + glBindTexture( GL_TEXTURE_2D, texture ); + + glEnable(GL_FOG); + GLfloat fogColor[] = { 1.0, 0.5, 0.5, 0.05 }; + glFogfv(GL_FOG_COLOR, fogColor); + + assert(glIsEnabled(GL_FOG)); + + glBegin( GL_QUADS ); + glTexCoord2i( 0, 0 ); glVertex3f( 10, 10, -1 ); + glTexCoord2i( 1, 0 ); glVertex3f( 300, 10, -1 ); + glTexCoord2i( 1, 1 ); glVertex3f( 300, 128, -1 ); + glTexCoord2i( 0, 1 ); glVertex3f( 10, 128, -1 ); + + glTexCoord2f( 0, 0.5 ); glVertex3f( 410, 10, -5 ); + glTexCoord2f( 1, 0.5 ); glVertex3f( 600, 10, -6 ); + glTexCoord2f( 1, 1 ); glVertex3f( 630, 200, -7 ); + glTexCoord2f( 0.5, 1 ); glVertex3f( 310, 250, -8 ); + glEnd(); + + glBegin( GL_TRIANGLE_STRIP ); + glTexCoord2i( 0, 0 ); glVertex3f( 100, 300, -1 ); + glTexCoord2i( 1, 0 ); glVertex3f( 300, 300, -1 ); + glTexCoord2i( 1, 1 ); glVertex3f( 300, 400, -1 ); + glTexCoord2i( 0, 1 ); glVertex3f( 500, 410, -1 ); + glEnd(); + + glDisable(GL_TEXTURE_2D); + + glColor3ub(90, 255, 255); + glBegin( GL_QUADS ); + glVertex3f( 10, 410, -5 ); + glVertex3f( 300, 410, -50 ); + glVertex3f( 300, 480, -100 ); + glVertex3f( 10, 470, -5 ); + glEnd(); + + glBegin( GL_QUADS ); + glColor3f(1.0, 0, 1.0); glVertex3f( 410, 410, -10 ); + glColor3f(0, 1.0, 0); glVertex3f( 600, 410, -10 ); + glColor3f(0, 0, 1.0); glVertex3f( 600, 480, -10 ); + glColor3f(1.0, 1.0, 1.0); glVertex3f( 410, 470, -10 ); + glEnd(); + + SDL_GL_SwapWindow(window); + +#ifndef __EMSCRIPTEN__ + // Wait for 3 seconds to give us a chance to see the image + SDL_Delay(30000); +#endif + + // Now we can delete the OpenGL texture and close down SDL + glDeleteTextures( 1, &texture ); + + SDL_Quit(); + + return 0; +} diff --git a/tests/sdl2_fog_simple.c b/tests/sdl2_fog_simple.c new file mode 100644 index 0000000000000..8d0310972a79c --- /dev/null +++ b/tests/sdl2_fog_simple.c @@ -0,0 +1,184 @@ +/******************************************************************* + * * + * Using SDL With OpenGL * + * * + * Tutorial by Kyle Foley (sdw) * + * * + * http://gpwiki.org/index.php/SDL:Tutorials:Using_SDL_with_OpenGL * + * * + *******************************************************************/ + +/* +THIS WORK, INCLUDING THE SOURCE CODE, DOCUMENTATION +AND RELATED MEDIA AND DATA, IS PLACED INTO THE PUBLIC DOMAIN. + +THE ORIGINAL AUTHOR IS KYLE FOLEY. + +THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY +OF ANY KIND, NOT EVEN THE IMPLIED WARRANTY OF +MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, +ASSUMES _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE +RESULTING FROM THE USE, MODIFICATION, OR +REDISTRIBUTION OF THIS SOFTWARE. +*/ + +#include "SDL2/SDL.h" +#include "SDL2/SDL_image.h" +#include "SDL2/SDL_opengl.h" + +#include +#include +#include + +int main(int argc, char *argv[]) +{ + SDL_Window *window; + SDL_GLContext context; + + // Slightly different SDL initialization + if ( SDL_Init(SDL_INIT_VIDEO) != 0 ) { + printf("Unable to initialize SDL: %s\n", SDL_GetError()); + return 1; + } + + SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); // *new* + + window = SDL_CreateWindow("sdl_fog_density", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_OPENGL); + if ( !window ) { + printf("Unable to create window: %s\n", SDL_GetError()); + return 1; + } + + context = SDL_GL_CreateContext(window); + + // Set the OpenGL state after creating the context with SDL_SetVideoMode + + glClearColor( 0, 0, 0, 0 ); + + glViewport( 0, 0, 640, 480 ); + + glMatrixMode( GL_PROJECTION ); + glPushMatrix(); // just for testing + glLoadIdentity(); + + glOrtho( 0, 640, 480, 0, -1000, 1000 ); + + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity(); + + // Delay Enable to after MatrixMode to assure we've activated + // immediate mode. Otherwise, we don't properly record that + // TEXTURE_2D is enabled for imm mode emulation. + glEnable( GL_TEXTURE_2D ); // Needed when we're using the fixed-function pipeline. + + // Load the OpenGL texture + + GLuint texture; // Texture object handle + SDL_Surface *surface; // Gives us the information to make the texture + + if ( (surface = IMG_Load("screenshot.png")) ) { + + // Check that the image's width is a power of 2 + if ( (surface->w & (surface->w - 1)) != 0 ) { + printf("warning: image.bmp's width is not a power of 2\n"); + } + + // Also check if the height is a power of 2 + if ( (surface->h & (surface->h - 1)) != 0 ) { + printf("warning: image.bmp's height is not a power of 2\n"); + } + + // Have OpenGL generate a texture object handle for us + glGenTextures( 1, &texture ); + + // Bind the texture object + glBindTexture( GL_TEXTURE_2D, texture ); + + // Set the texture's stretching properties + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + + //SDL_LockSurface(surface); + + // Add some greyness + memset(surface->pixels, 0x66, surface->w*surface->h); + + // Edit the texture object's image data using the information SDL_Surface gives us + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, surface->w, surface->h, 0, + GL_RGBA, GL_UNSIGNED_BYTE, surface->pixels ); + + //SDL_UnlockSurface(surface); + } + else { + printf("SDL could not load image.bmp: %s\n", SDL_GetError()); + SDL_Quit(); + return 1; + } + + // Free the SDL_Surface only if it was successfully created + if ( surface ) { + SDL_FreeSurface( surface ); + } + + // Clear the screen before drawing + glClear( GL_COLOR_BUFFER_BIT ); + + // Bind the texture to which subsequent calls refer to + glBindTexture( GL_TEXTURE_2D, texture ); + + glEnable(GL_FOG); + GLfloat fogColor[] = { 1.0, 0.5, 0.5, 0.05 }; + glFogfv(GL_FOG_COLOR, fogColor); + + assert(glIsEnabled(GL_FOG)); + + glBegin( GL_QUADS ); + glTexCoord2i( 0, 0 ); glVertex3f( 10, 10, 10 ); + glTexCoord2i( 1, 0 ); glVertex3f( 300, 10, 10 ); + glTexCoord2i( 1, 1 ); glVertex3f( 300, 128, 10 ); + glTexCoord2i( 0, 1 ); glVertex3f( 10, 128, 10 ); + + glTexCoord2f( 0, 0.5 ); glVertex3f( 410, 10, 5 ); + glTexCoord2f( 1, 0.5 ); glVertex3f( 600, 10, 6 ); + glTexCoord2f( 1, 1 ); glVertex3f( 630, 200, 7 ); + glTexCoord2f( 0.5, 1 ); glVertex3f( 310, 250, 8 ); + glEnd(); + + glBegin( GL_TRIANGLE_STRIP ); + glTexCoord2i( 0, 0 ); glVertex3f( 100, 300, 1 ); + glTexCoord2i( 1, 0 ); glVertex3f( 300, 300, 1 ); + glTexCoord2i( 1, 1 ); glVertex3f( 300, 400, 1 ); + glTexCoord2i( 0, 1 ); glVertex3f( 500, 410, 1 ); + glEnd(); + + glDisable(GL_TEXTURE_2D); + + glColor3ub(90, 255, 255); + glBegin( GL_QUADS ); + glVertex3f( 10, 410, 5 ); + glVertex3f( 300, 410, 50 ); + glVertex3f( 300, 480, 100 ); + glVertex3f( 10, 470, 5 ); + glEnd(); + + glBegin( GL_QUADS ); + glColor3f(1.0, 0, 1.0); glVertex3f( 410, 410, 10 ); + glColor3f(0, 1.0, 0); glVertex3f( 600, 410, 10 ); + glColor3f(0, 0, 1.0); glVertex3f( 600, 480, 10 ); + glColor3f(1.0, 1.0, 1.0); glVertex3f( 410, 470, 10 ); + glEnd(); + + SDL_GL_SwapWindow(window); + +#ifndef __EMSCRIPTEN__ + // Wait for 3 seconds to give us a chance to see the image + SDL_Delay(30000); +#endif + + // Now we can delete the OpenGL texture and close down SDL + glDeleteTextures( 1, &texture ); + + SDL_Quit(); + + return 0; +} diff --git a/tests/sdl2_gfx_primitives.c b/tests/sdl2_gfx_primitives.c new file mode 100644 index 0000000000000..e020f722515f2 --- /dev/null +++ b/tests/sdl2_gfx_primitives.c @@ -0,0 +1,53 @@ +#include "SDL2/SDL.h" +#include "SDL2/SDL2_gfxPrimitives.h" + +#ifdef __EMSCRIPTEN__ +#include "emscripten.h" +#endif + +int main(int argc, char **argv) { + SDL_Init(SDL_INIT_VIDEO); + + const int width = 400; + const int height = 400; + + SDL_Window *window; + SDL_Renderer *renderer; + + SDL_CreateWindowAndRenderer(width, height, 0, &window, &renderer); + + //SDL_Surface *screen = SDL_SetVideoMode(width, height, 32, SDL_SWSURFACE); + boxColor(renderer, 0, 0, width, height, 0xff); + + boxColor(renderer, 0, 0, 98, 98, 0xff0000ff); + boxRGBA(renderer, 100, 0, 198, 98, 0, 0, 0xff, 0xff); + // check that the x2 > x1 case is handled correctly + boxColor(renderer, 298, 98, 200, 0, 0x00ff00ff); + boxColor(renderer, 398, 98, 300, 0, 0xff0000ff); + + rectangleColor(renderer, 0, 100, 98, 198, 0x000ffff); + rectangleRGBA(renderer, 100, 100, 198, 198, 0xff, 0, 0, 0xff); + + ellipseColor(renderer, 300, 150, 99, 49, 0x00ff00ff); + filledEllipseColor(renderer, 100, 250, 99, 49, 0x00ff00ff); + filledEllipseRGBA(renderer, 250, 300, 49, 99, 0, 0, 0xff, 0xff); + + lineColor(renderer, 300, 200, 400, 300, 0x00ff00ff); + lineRGBA(renderer, 300, 300, 400, 400, 0, 0xff, 0, 0xff); + + //SDL_UpdateRect(screen, 0, 0, 0, 0); + SDL_RenderPresent(renderer); + +#ifndef __EMSCRIPTEN__ + SDL_Event evt; + /*SDL_SaveBMP(screen, "native_output.bmp");*/ + while (1) { + if (SDL_PollEvent(&evt) != 0 && evt.type == SDL_QUIT) break; + SDL_Delay(33); + } +#endif + + SDL_Quit(); + + return 1; +} diff --git a/tests/sdl2_gl_read.c b/tests/sdl2_gl_read.c new file mode 100644 index 0000000000000..328d3ad952f42 --- /dev/null +++ b/tests/sdl2_gl_read.c @@ -0,0 +1,166 @@ +// Built from glbook/hello triange and sdl_ogl, see details there + +#include "SDL2/SDL.h" +#include "SDL2/SDL_opengles2.h" + +#include +#include +#include + +GLuint programObject; +int width = 512; +int height = 256; + +GLuint LoadShader ( GLenum type, const char *shaderSrc ) +{ + GLuint shader; + GLint compiled; + + shader = glCreateShader ( type ); + if ( shader == 0 ) + return 0; + + glShaderSource ( shader, 1, &shaderSrc, NULL ); + glCompileShader ( shader ); + glGetShaderiv ( shader, GL_COMPILE_STATUS, &compiled ); + if ( !compiled ) + { + GLint infoLen = 0; + glGetShaderiv ( shader, GL_INFO_LOG_LENGTH, &infoLen ); + if ( infoLen > 1 ) + { + char* infoLog = malloc (sizeof(char) * infoLen ); + glGetShaderInfoLog ( shader, infoLen, NULL, infoLog ); + printf ( "Error compiling shader:\n%s\n", infoLog ); + free ( infoLog ); + } + glDeleteShader ( shader ); + return 0; + } + return shader; +} + +int Init () +{ + GLbyte vShaderStr[] = + "attribute vec4 vPosition; \n" + "void main() \n" + "{ \n" + " gl_Position = vPosition; \n" + "} \n"; + + GLbyte fShaderStr[] = + "precision mediump float;\n"\ + "void main() \n" + "{ \n" + " gl_FragColor = vec4 ( 0.0, 0.0, 1.0, 1.0 );\n" + "} \n"; + + GLuint vertexShader; + GLuint fragmentShader; + GLint linked; + + vertexShader = LoadShader ( GL_VERTEX_SHADER, vShaderStr ); + fragmentShader = LoadShader ( GL_FRAGMENT_SHADER, fShaderStr ); + + programObject = glCreateProgram ( ); + if ( programObject == 0 ) + return 0; + + glAttachShader ( programObject, vertexShader ); + glAttachShader ( programObject, fragmentShader ); + glBindAttribLocation ( programObject, 0, "vPosition" ); + glLinkProgram ( programObject ); + glGetProgramiv ( programObject, GL_LINK_STATUS, &linked ); + if ( !linked ) + { + GLint infoLen = 0; + glGetProgramiv ( programObject, GL_INFO_LOG_LENGTH, &infoLen ); + if ( infoLen > 1 ) + { + char* infoLog = malloc (sizeof(char) * infoLen ); + glGetProgramInfoLog ( programObject, infoLen, NULL, infoLog ); + printf ( "Error linking program:\n%s\n", infoLog ); + free ( infoLog ); + } + glDeleteProgram ( programObject ); + return GL_FALSE; + } + + glClearColor ( 0.0f, 0.0f, 0.0f, 0.0f ); + return GL_TRUE; +} + +/// +// Draw a triangle using the shader pair created in Init() +// +void Draw () +{ + GLfloat vVertices[] = { 0.0f, 0.5f, 0.0f, + -0.5f, -0.5f, 0.0f, + 0.5f, -0.5f, 0.0f }; + + // No clientside arrays, so do this in a webgl-friendly manner + GLuint vertexPosObject; + glGenBuffers(1, &vertexPosObject); + glBindBuffer(GL_ARRAY_BUFFER, vertexPosObject); + glBufferData(GL_ARRAY_BUFFER, 9*4, vVertices, GL_STATIC_DRAW); + + glViewport ( 0, 0, width, height ); + glClear ( GL_COLOR_BUFFER_BIT ); + glUseProgram ( programObject ); + + glBindBuffer(GL_ARRAY_BUFFER, vertexPosObject); + glVertexAttribPointer(0 /* ? */, 3, GL_FLOAT, 0, 0, 0); + glEnableVertexAttribArray(0); + + glDrawArrays ( GL_TRIANGLES, 0, 3 ); +} + +void Verify() { + unsigned char *data = malloc(width*height*4 + 16); + int *last = (int*)(data + width*height*4 - 4); + int *after = (int*)(data + width*height*4); + *last = 0xdeadbeef; + *after = 0x12345678; + glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data); + assert(*last != 0xdeadbeef); // should overwrite the buffer to the end + assert(*after == 0x12345678); // nothing should be written afterwards! + // Should see some blue, and nothing else + int seen = 0; + int ok = 1; + for (int x = 0; x < width*height; x++) { + seen = seen || data[x*4+2] != 0; + ok = ok && (data[x*4+0] == 0); + ok = ok && (data[x*4+1] == 0); + } + int result = seen && ok; + REPORT_RESULT(); +} + +int main(int argc, char *argv[]) +{ + SDL_Window *window; + SDL_GLContext context; + + if ( SDL_Init(SDL_INIT_VIDEO) != 0 ) { + printf("Unable to initialize SDL: %s\n", SDL_GetError()); + return 1; + } + + window = SDL_CreateWindow("sdl_gl_read", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_OPENGL); + + if (!window) { + printf("Unable to create window: %s\n", SDL_GetError()); + return 1; + } + + context = SDL_GL_CreateContext(window); + + Init(); + Draw(); + Verify(); + + return 0; +} + diff --git a/tests/sdl2_image.c b/tests/sdl2_image.c new file mode 100644 index 0000000000000..d1c0ffdf38f1d --- /dev/null +++ b/tests/sdl2_image.c @@ -0,0 +1,67 @@ +#include +#include +#include +#include +#include +#include +#include + +int testImage(SDL_Renderer* renderer, const char* fileName) { + SDL_Surface *image = IMG_Load(fileName); + if (!image) + { + printf("IMG_Load: %s\n", IMG_GetError()); + return 0; + } + assert(image->format->BitsPerPixel == 32); + assert(image->format->BytesPerPixel == 4); + assert(image->pitch == 4*image->w); + int result = image->w; + + int w, h; + char *data = emscripten_get_preloaded_image_data(fileName, &w, &h); + + assert(data); + assert(w == image->w); + assert(h == image->h); + + SDL_Texture *tex = SDL_CreateTextureFromSurface(renderer, image); + + SDL_RenderCopy (renderer, tex, NULL, NULL); + + SDL_DestroyTexture (tex); + + SDL_FreeSurface (image); + free(data); + + return result; +} + +int main() { + SDL_Init(SDL_INIT_VIDEO); + + SDL_Window *window; + SDL_Renderer *renderer; + + SDL_CreateWindowAndRenderer(600, 450, 0, &window, &renderer); + + int result = 0; + + result |= testImage(renderer, SCREENSHOT_DIRNAME "/" SCREENSHOT_BASENAME); // absolute path + assert(result != 0); + + chdir(SCREENSHOT_DIRNAME); + result = testImage(renderer, "./" SCREENSHOT_BASENAME); // relative path + assert(result != 0); + + SDL_RenderPresent(renderer); + + printf("you should see an image.\n"); + + SDL_Quit(); + + REPORT_RESULT(); + + return 0; +} + diff --git a/tests/sdl2_image_prepare.c b/tests/sdl2_image_prepare.c new file mode 100644 index 0000000000000..697b1c84e195a --- /dev/null +++ b/tests/sdl2_image_prepare.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include +#include + +SDL_Renderer *renderer; + +int testImage(const char* fileName) { + SDL_Surface *image = IMG_Load(fileName); + if (!image) + { + printf("IMG_Load: %s\n", IMG_GetError()); + return 0; + } + assert(image->format->BitsPerPixel == 32); + assert(image->format->BytesPerPixel == 4); + assert(image->pitch == 4*image->w); + int result = image->w; + + SDL_Texture *tex = SDL_CreateTextureFromSurface(renderer, image); + + SDL_RenderCopy (renderer, tex, NULL, NULL); + + SDL_DestroyTexture (tex); + SDL_FreeSurface (image); + + return result; +} + +void ready(const char *f) { + printf("ready!\n"); + + testImage("screenshot.jpg"); // relative path + + SDL_RenderPresent(renderer); +} + +int main() { + SDL_Init(SDL_INIT_VIDEO); + SDL_Window *window; + + SDL_CreateWindowAndRenderer(600, 450, 0, &window, &renderer); + + printf("rename..\n"); + + rename("screenshot.not", "screenshot.jpg"); + + printf("prepare..\n"); + + assert(emscripten_async_prepare("screenshot.jpg", ready, NULL) == 0); + + return 0; +} + diff --git a/tests/sdl2_key.c b/tests/sdl2_key.c new file mode 100644 index 0000000000000..616a73b9f9ef3 --- /dev/null +++ b/tests/sdl2_key.c @@ -0,0 +1,71 @@ +#include +#include +#include + +int result = 1; + +int EventHandler(void *userdata, SDL_Event *event) { + int mod; + + switch(event->type) { + case SDL_KEYUP: + break; + case SDL_KEYDOWN: + switch (event->key.keysym.sym) { + case SDLK_RIGHT: printf("right\n"); result *= 7; break; + case SDLK_LEFT: printf("left\n"); result *= 11; break; + case SDLK_DOWN: printf("down\n"); result *= 13; break; + case SDLK_UP: printf("up\n"); result *= 17; break; + case SDLK_a: printf("a\n"); result *= 19; break; + default: { + if (event->key.keysym.scancode == SDL_SCANCODE_B) { + printf("b scancode\n"); result *= 23; break; + } + printf("unknown key: sym %d scancode %d\n", event->key.keysym.sym, event->key.keysym.scancode); + REPORT_RESULT(); + emscripten_run_script("throw 'done'"); // comment this out to leave event handling active. Use the following to log DOM keys: + // addEventListener('keyup', function(event) { console.log(event->keyCode) }, true) + } + } + break; + default: /* Report an unhandled event */ + printf("I don't know what this event is (type=%d)!\n", event->type); + } + return 0; +} + +void one() { +#ifndef TEST_EMSCRIPTEN_SDL_SETEVENTHANDLER + SDL_Event event; + while (SDL_PollEvent(&event)) { + EventHandler(0, &event); + } +#endif +} + +int main(int argc, char **argv) { + SDL_Init(SDL_INIT_VIDEO); + SDL_Window *window; + window = SDL_CreateWindow("sdl2_key", + SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, + 640, 480, 0); + +#ifdef TEST_EMSCRIPTEN_SDL_SETEVENTHANDLER + emscripten_SDL_SetEventHandler(EventHandler, 0); +#else + one(); +#endif + + SDL_StartTextInput(); + + emscripten_run_script("keydown(38);keyup(38)"); // up + emscripten_run_script("keydown(40);keyup(40);"); // down + emscripten_run_script("keydown(37);keyup(37);"); // left + emscripten_run_script("keydown(39);keyup(39);"); // right + emscripten_run_script("keydown(65);keyup(65);"); // a + emscripten_run_script("keydown(66);keyup(66);"); // b + emscripten_run_script("keydown(100);keyup(100);"); // trigger the end + + return 0; +} + diff --git a/tests/sdl2_mouse.c b/tests/sdl2_mouse.c new file mode 100644 index 0000000000000..2e8ca13ef66b1 --- /dev/null +++ b/tests/sdl2_mouse.c @@ -0,0 +1,68 @@ +#include +#include +#include +#include + +int result = 1; + +void one() { + SDL_Event event; + while (SDL_PollEvent(&event)) { + switch(event.type) { + case SDL_MOUSEMOTION: { + SDL_MouseMotionEvent *m = (SDL_MouseMotionEvent*)&event; + assert(m->state == 0); + printf("motion: %d,%d %d,%d\n", m->x, m->y, m->xrel, m->yrel); + result += 2 * (m->x + m->y + m->xrel + m->yrel); + break; + } + case SDL_MOUSEBUTTONDOWN: { + SDL_MouseButtonEvent *m = (SDL_MouseButtonEvent*)&event; + if (m->button == 2) { + REPORT_RESULT(); + emscripten_run_script("throw 'done'"); + } + printf("button down: %d,%d %d,%d\n", m->button, m->state, m->x, m->y); + result += 3 * (m->button + m->state + m->x + m->y); + break; + } + case SDL_MOUSEBUTTONUP: { + SDL_MouseButtonEvent *m = (SDL_MouseButtonEvent*)&event; + printf("button up: %d,%d %d,%d\n", m->button, m->state, m->x, m->y); + result += 5 * (m->button + m->state + m->x + m->y); + // Remove another click we want to ignore + assert(SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_MOUSEBUTTONDOWN, SDL_MOUSEBUTTONDOWN) == 1); + assert(SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_MOUSEBUTTONUP, SDL_MOUSEBUTTONUP) == 1); + break; + } + } + } +} + +void main_2(void* arg); + +int main() { + SDL_Init(SDL_INIT_VIDEO); + SDL_Window *window; + SDL_Renderer *renderer; + + SDL_CreateWindowAndRenderer(600, 450, 0, &window, &renderer); + + SDL_SetRenderDrawColor(renderer, 0xFF, 0x00, 0x00, 0xFF ); + SDL_Rect rect = { 0, 0, 600, 450 }; + SDL_RenderFillRect(renderer, &rect); + + emscripten_async_call(main_2, NULL, 3000); // avoid startup delays and intermittent errors + + return 0; +} + +void main_2(void* arg) { + emscripten_run_script("window.simulateMouseEvent(10, 20, -1)"); // move from 0,0 to 10,20 + emscripten_run_script("window.simulateMouseEvent(10, 20, 0)"); // click + emscripten_run_script("window.simulateMouseEvent(10, 20, 0)"); // click some more, but this one should be ignored through PeepEvent + emscripten_run_script("window.simulateMouseEvent(30, 77, -1)"); // move some more + emscripten_run_script("window.simulateMouseEvent(30, 77, 1)"); // trigger the end + + emscripten_set_main_loop(one, 0, 0); +} diff --git a/tests/sdl2_pumpevents.c b/tests/sdl2_pumpevents.c new file mode 100644 index 0000000000000..c7ed324b465dc --- /dev/null +++ b/tests/sdl2_pumpevents.c @@ -0,0 +1,77 @@ +#include +#include +#include + +#include +// bug - SDL_GetKeyboardState doesn't return scancodes, it returns keycodes, so acts exactly like +// SDL_GetKeyState instead +#define SDL_GetKeyState SDL_GetKeyboardState + +int result = 0; + +int loop1() +{ + printf("loop1\n"); + unsigned i; + int r = 0; + + // method 1: SDL_PollEvent loop + SDL_Event e; + while (SDL_PollEvent(&e)); + + const Uint8 *keys = SDL_GetKeyState(NULL); + if (keys[SDL_SCANCODE_LEFT]) + r = 1; + + return r; +} + +int loop2() +{ + printf("loop2\n"); + + unsigned i; + int r = 0; + + // method 2: SDL_PumpEvents + SDL_PumpEvents(); + + const Uint8 *keys = SDL_GetKeyState(NULL); + if (keys[SDL_SCANCODE_RIGHT]) + r = 2; + + return r; +} + +int alphakey() +{ + printf("alpha\n"); + + unsigned i; + int r = 0; + + SDL_PumpEvents(); + + const Uint8 *keys = SDL_GetKeyState(NULL); + if (keys[SDL_SCANCODE_A]) + r = 4; + + return r; +} + +int main(int argc, char *argv[]) +{ + SDL_Init(SDL_INIT_VIDEO); + SDL_Window *window; + SDL_Renderer *renderer; + SDL_CreateWindowAndRenderer(600, 450, 0, &window, &renderer); + + emscripten_run_script("keydown(37);"); // left + result += loop1(); + emscripten_run_script("keydown(39);"); // right + result += loop2(); + emscripten_run_script("keydown(65);"); // A + result += alphakey(); + REPORT_RESULT(); + return 0; +} diff --git a/tests/sdl2_swsurface.c b/tests/sdl2_swsurface.c new file mode 100644 index 0000000000000..b509bebe7c95e --- /dev/null +++ b/tests/sdl2_swsurface.c @@ -0,0 +1,28 @@ +#include +#include +#include + +int main(int argc, char** argv) { + SDL_Init(SDL_INIT_VIDEO); + SDL_Window *window = SDL_CreateWindow("sdl2_swsurface", + SDL_WINDOWPOS_UNDEFINED, + SDL_WINDOWPOS_UNDEFINED, + 640, 480, + SDL_WINDOW_FULLSCREEN); + + SDL_Surface *screen = SDL_GetWindowSurface(window); + + // pixels should always be initialized for software surfaces, + // without having to call SDL_LockSurface / SDL_UnlockSurface + assert(screen->pixels != NULL); + + SDL_Quit(); + +#ifdef __EMSCRIPTEN__ + int result = 1; + REPORT_RESULT(); +#endif + + return 0; +} + diff --git a/tests/sdl2_text.c b/tests/sdl2_text.c new file mode 100644 index 0000000000000..d2b3cb9b0e48c --- /dev/null +++ b/tests/sdl2_text.c @@ -0,0 +1,40 @@ +#include +#include +#include +#include +#include + +int result = 0; + +void one() { + SDL_Event event; + while (SDL_PollEvent(&event)) { + switch (event.type) { + case SDL_TEXTEDITING: assert(0); break; + case SDL_TEXTINPUT: + printf("Received %s\n", event.text.text); + if (!strcmp("a", event.text.text)) { + result = 1; + } else if (!strcmp("A", event.text.text)) { + REPORT_RESULT(); + emscripten_run_script("throw 'done'"); + } + break; + } + } +} + +int main() { + SDL_Init(SDL_INIT_VIDEO); + SDL_Window *window; + SDL_Renderer *renderer; + SDL_CreateWindowAndRenderer(600, 450, 0, &window, &renderer); + SDL_StartTextInput(); + + emscripten_run_script("simulateKeyEvent('a'.charCodeAt(0))"); // a + emscripten_run_script("simulateKeyEvent('A'.charCodeAt(0))"); // A + + one(); + + return 0; +} diff --git a/tests/sdl2glshader.c b/tests/sdl2glshader.c new file mode 100644 index 0000000000000..081ce33cac740 --- /dev/null +++ b/tests/sdl2glshader.c @@ -0,0 +1,165 @@ +/* +THIS WORK, INCLUDING THE SOURCE CODE, DOCUMENTATION +AND RELATED MEDIA AND DATA, IS PLACED INTO THE PUBLIC DOMAIN. + +THE ORIGINAL AUTHOR IS KYLE FOLEY. + +THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY +OF ANY KIND, NOT EVEN THE IMPLIED WARRANTY OF +MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, +ASSUMES _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE +RESULTING FROM THE USE, MODIFICATION, OR +REDISTRIBUTION OF THIS SOFTWARE. +*/ + +#include "SDL2/SDL.h" +#include "SDL2/SDL_opengl.h" + +#include +#include +#include + +// GL_ARB_shading_language_100, GL_ARB_shader_objects, GL_ARB_fragment_shader, GL_ARB_vertex_shader +PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObject_ = NULL; +PFNGLDELETEOBJECTARBPROC glDeleteObject_ = NULL; +PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObject_ = NULL; +PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObject_ = NULL; +PFNGLSHADERSOURCEARBPROC glShaderSource_ = NULL; +PFNGLCOMPILESHADERARBPROC glCompileShader_ = NULL; +PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameteriv_ = NULL; +PFNGLATTACHOBJECTARBPROC glAttachObject_ = NULL; +PFNGLGETINFOLOGARBPROC glGetInfoLog_ = NULL; +PFNGLLINKPROGRAMARBPROC glLinkProgram_ = NULL; +PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocation_ = NULL; +PFNGLUNIFORM1FARBPROC glUniform1f_ = NULL; +PFNGLUNIFORM2FARBPROC glUniform2f_ = NULL; +PFNGLUNIFORM3FARBPROC glUniform3f_ = NULL; +PFNGLUNIFORM4FARBPROC glUniform4f_ = NULL; +PFNGLUNIFORM1FVARBPROC glUniform1fv_ = NULL; +PFNGLUNIFORM2FVARBPROC glUniform2fv_ = NULL; +PFNGLUNIFORM3FVARBPROC glUniform3fv_ = NULL; +PFNGLUNIFORM4FVARBPROC glUniform4fv_ = NULL; +PFNGLUNIFORM1IARBPROC glUniform1i_ = NULL; +PFNGLBINDATTRIBLOCATIONARBPROC glBindAttribLocation_ = NULL; +PFNGLGETACTIVEUNIFORMARBPROC glGetActiveUniform_ = NULL; + +void initARB() { + glCreateProgramObject_ = (PFNGLCREATEPROGRAMOBJECTARBPROC) SDL_GL_GetProcAddress("glCreateProgramObjectARB"); + glDeleteObject_ = (PFNGLDELETEOBJECTARBPROC) SDL_GL_GetProcAddress("glDeleteObjectARB"); + glUseProgramObject_ = (PFNGLUSEPROGRAMOBJECTARBPROC) SDL_GL_GetProcAddress("glUseProgramObjectARB"); + glCreateShaderObject_ = (PFNGLCREATESHADEROBJECTARBPROC) SDL_GL_GetProcAddress("glCreateShaderObjectARB"); + glShaderSource_ = (PFNGLSHADERSOURCEARBPROC) SDL_GL_GetProcAddress("glShaderSourceARB"); + glCompileShader_ = (PFNGLCOMPILESHADERARBPROC) SDL_GL_GetProcAddress("glCompileShaderARB"); + glGetObjectParameteriv_ = (PFNGLGETOBJECTPARAMETERIVARBPROC) SDL_GL_GetProcAddress("glGetObjectParameterivARB"); + glAttachObject_ = (PFNGLATTACHOBJECTARBPROC) SDL_GL_GetProcAddress("glAttachObjectARB"); + glGetInfoLog_ = (PFNGLGETINFOLOGARBPROC) SDL_GL_GetProcAddress("glGetInfoLogARB"); + glLinkProgram_ = (PFNGLLINKPROGRAMARBPROC) SDL_GL_GetProcAddress("glLinkProgramARB"); + glGetUniformLocation_ = (PFNGLGETUNIFORMLOCATIONARBPROC) SDL_GL_GetProcAddress("glGetUniformLocationARB"); + glUniform1f_ = (PFNGLUNIFORM1FARBPROC) SDL_GL_GetProcAddress("glUniform1fARB"); + glUniform2f_ = (PFNGLUNIFORM2FARBPROC) SDL_GL_GetProcAddress("glUniform2fARB"); + glUniform3f_ = (PFNGLUNIFORM3FARBPROC) SDL_GL_GetProcAddress("glUniform3fARB"); + glUniform4f_ = (PFNGLUNIFORM4FARBPROC) SDL_GL_GetProcAddress("glUniform4fARB"); + glUniform1fv_ = (PFNGLUNIFORM1FVARBPROC) SDL_GL_GetProcAddress("glUniform1fvARB"); + glUniform2fv_ = (PFNGLUNIFORM2FVARBPROC) SDL_GL_GetProcAddress("glUniform2fvARB"); + glUniform3fv_ = (PFNGLUNIFORM3FVARBPROC) SDL_GL_GetProcAddress("glUniform3fvARB"); + glUniform4fv_ = (PFNGLUNIFORM4FVARBPROC) SDL_GL_GetProcAddress("glUniform4fvARB"); + glUniform1i_ = (PFNGLUNIFORM1IARBPROC) SDL_GL_GetProcAddress("glUniform1iARB"); + glBindAttribLocation_ = (PFNGLBINDATTRIBLOCATIONARBPROC) SDL_GL_GetProcAddress("glBindAttribLocationARB"); + glGetActiveUniform_ = (PFNGLGETACTIVEUNIFORMARBPROC) SDL_GL_GetProcAddress("glGetActiveUniformARB"); +} + +void setShaders() { + GLuint v, f, p; + GLint ok; + + const char *vv = "void main() \n" + "{ \n" + " gl_Position = ftransform() + vec4(0.1, -0.25, 0, 0); \n" + "}"; + const char *ff = "void main() \n" + "{ \n" + " gl_FragColor = vec4(gl_FragCoord.y/480.0, gl_FragCoord.x/640.0, 0.66, 1.0); \n" + "}"; + + v = glCreateShaderObject_(GL_VERTEX_SHADER); + f = glCreateShaderObject_(GL_FRAGMENT_SHADER); + + glShaderSource_(v, 1, &vv,NULL); + glShaderSource_(f, 1, &ff,NULL); + + glCompileShader_(v); + glGetObjectParameteriv_(v, GL_OBJECT_COMPILE_STATUS_ARB, &ok); + if (!ok) { + char msg[512]; + glGetInfoLog_(v, sizeof msg, NULL, msg); + printf("shader compilation issue: %s\n", msg); + } + assert(ok); + + glCompileShader_(f); + glGetObjectParameteriv_(f, GL_OBJECT_COMPILE_STATUS_ARB, &ok); + assert(ok); + + p = glCreateProgramObject_(); + glAttachObject_(p,f); + glAttachObject_(p,v); + + glLinkProgram_(p); + glGetObjectParameteriv_(p, GL_OBJECT_LINK_STATUS_ARB, &ok); + assert(ok); + + glUseProgramObject_(p); +} + +int main(int argc, char *argv[]) +{ + //SDL_Surface *screen; + SDL_Window *window; + SDL_GLContext context; + + assert(SDL_Init(SDL_INIT_VIDEO) == 0); + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + //screen = SDL_SetVideoMode( 640, 480, 16, SDL_OPENGL ); + //assert(screen); + + window = SDL_CreateWindow("sdlglshader", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_OPENGL); + assert(window); + + context = SDL_GL_CreateContext(window); + + glClearColor(0, 0, 0, 0); + glViewport(0, 0, 640, 480); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, 640, 480, 0, -1, 1); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glClear(GL_COLOR_BUFFER_BIT); + + initARB(); + setShaders(); + + glColor3f(0, 1, 1); // is overridden by the shader, useful for debugging native builds + glBegin( GL_TRIANGLES ); + glTexCoord2i(0, 0); glVertex3f( 10, 10, 0); + glTexCoord2i(1, 0); glVertex3f( 300, 10, 0); + glTexCoord2i(1, 1); glVertex3f( 300, 328, 0); + glEnd(); + + glColor3f(1, 1, 0); // is overridden by the shader, useful for debugging native builds + glBegin( GL_TRIANGLES ); + glTexCoord2f(0, 0.5); glVertex3f(410, 10, 0); + glTexCoord2f(1, 0.5); glVertex3f(600, 10, 0); + glTexCoord2f(1, 1 ); glVertex3f(630, 400, 0); + glEnd(); + + SDL_GL_SwapWindow(window); + +#ifndef __EMSCRIPTEN__ + SDL_Delay(3000); +#endif + + SDL_Quit(); + return 0; +} + diff --git a/tests/test_browser.py b/tests/test_browser.py index 0a13cb1ef33ca..141573601a298 100644 --- a/tests/test_browser.py +++ b/tests/test_browser.py @@ -2079,3 +2079,329 @@ def test_asm_swapping(self): self.btest(path_from_root('tests', 'asm_swap.cpp'), args=['-s', 'SWAPPABLE_ASM_MODULE=1', '-s', 'NO_EXIT_RUNTIME=1', '--pre-js', 'run.js'] + opts, expected='999') + def zzztest_sdl2_image(self): + # load an image file, get pixel data. Also O2 coverage for --preload-file, and memory-init + shutil.copyfile(path_from_root('tests', 'screenshot.jpg'), os.path.join(self.get_dir(), 'screenshot.jpg')) + open(os.path.join(self.get_dir(), 'sdl2_image.c'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl2_image.c')).read())) + + for mem in [0, 1]: + for dest, dirname, basename in [('screenshot.jpg', '/', 'screenshot.jpg'), + ('screenshot.jpg@/assets/screenshot.jpg', '/assets', 'screenshot.jpg')]: + Popen([ + PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl2_image.c'), '-o', 'page.html', '-O2', '--memory-init-file', str(mem), + '--preload-file', dest, '-DSCREENSHOT_DIRNAME="' + dirname + '"', '-DSCREENSHOT_BASENAME="' + basename + '"', '-s', 'USE_SDL=2', '-lSDL2_image' + ]).communicate() + self.run_browser('page.html', '', '/report_result?600') + + def zzztest_sdl2_image_jpeg(self): + shutil.copyfile(path_from_root('tests', 'screenshot.jpg'), os.path.join(self.get_dir(), 'screenshot.jpeg')) + open(os.path.join(self.get_dir(), 'sdl2_image_jpeg.c'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl2_image.c')).read())) + Popen([ + PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl2_image_jpeg.c'), '-o', 'page.html', + '--preload-file', 'screenshot.jpeg', '-DSCREENSHOT_DIRNAME="/"', '-DSCREENSHOT_BASENAME="screenshot.jpeg"', '-s', 'USE_SDL=2', '-lSDL2_image' + ]).communicate() + self.run_browser('page.html', '', '/report_result?600') + + def zzztest_sdl2_key(self): + for defines in [[]]: + open(os.path.join(self.get_dir(), 'pre.js'), 'w').write(''' + Module.postRun = function() { + function doOne() { + Module._one(); + setTimeout(doOne, 1000/60); + } + setTimeout(doOne, 1000/60); + } + + function keydown(c) { + var event = document.createEvent("KeyboardEvent"); + event.initKeyEvent("keydown", true, true, window, + 0, 0, 0, 0, + c, c); + document.dispatchEvent(event); + } + + function keyup(c) { + var event = document.createEvent("KeyboardEvent"); + event.initKeyEvent("keyup", true, true, window, + 0, 0, 0, 0, + c, c); + document.dispatchEvent(event); + } + ''') + open(os.path.join(self.get_dir(), 'sdl2_key.c'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl2_key.c')).read())) + + Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl2_key.c'), '-o', 'page.html'] + defines + ['-s', 'USE_SDL=2','--pre-js', 'pre.js', '-s', '''EXPORTED_FUNCTIONS=['_main', '_one']''', '-s', 'NO_EXIT_RUNTIME=1']).communicate() + self.run_browser('page.html', '', '/report_result?7436429') + + def zzztest_sdl2_text(self): + open(os.path.join(self.get_dir(), 'pre.js'), 'w').write(''' + Module.postRun = function() { + function doOne() { + Module._one(); + setTimeout(doOne, 1000/60); + } + setTimeout(doOne, 1000/60); + } + + function simulateKeyEvent(charCode) { + var event = document.createEvent("KeyboardEvent"); + event.initKeyEvent("keypress", true, true, window, + 0, 0, 0, 0, 0, charCode); + document.body.dispatchEvent(event); + } + ''') + open(os.path.join(self.get_dir(), 'sdl2_text.c'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl2_text.c')).read())) + + Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl2_text.c'), '-o', 'page.html', '--pre-js', 'pre.js', '-s', '''EXPORTED_FUNCTIONS=['_main', '_one']''', '-s', 'USE_SDL=2']).communicate() + self.run_browser('page.html', '', '/report_result?1') + + def zzztest_sdl2_mouse(self): + open(os.path.join(self.get_dir(), 'pre.js'), 'w').write(''' + function simulateMouseEvent(x, y, button) { + var event = document.createEvent("MouseEvents"); + if (button >= 0) { + var event1 = document.createEvent("MouseEvents"); + event1.initMouseEvent('mousedown', true, true, window, + 1, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y, + 0, 0, 0, 0, + button, null); + Module['canvas'].dispatchEvent(event1); + var event2 = document.createEvent("MouseEvents"); + event2.initMouseEvent('mouseup', true, true, window, + 1, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y, + 0, 0, 0, 0, + button, null); + Module['canvas'].dispatchEvent(event2); + } else { + var event1 = document.createEvent("MouseEvents"); + event1.initMouseEvent('mousemove', true, true, window, + 0, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y, + 0, 0, 0, 0, + 0, null); + Module['canvas'].dispatchEvent(event1); + } + } + window['simulateMouseEvent'] = simulateMouseEvent; + ''') + open(os.path.join(self.get_dir(), 'sdl2_mouse.c'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl2_mouse.c')).read())) + + Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl2_mouse.c'), '-O2', '--minify', '0', '-o', 'page.html', '--pre-js', 'pre.js', '-s', 'USE_SDL=2']).communicate() + self.run_browser('page.html', '', '/report_result?740') + + def zzztest_sdl2_mouse_offsets(self): + open(os.path.join(self.get_dir(), 'pre.js'), 'w').write(''' + function simulateMouseEvent(x, y, button) { + var event = document.createEvent("MouseEvents"); + if (button >= 0) { + var event1 = document.createEvent("MouseEvents"); + event1.initMouseEvent('mousedown', true, true, window, + 1, x, y, x, y, + 0, 0, 0, 0, + button, null); + Module['canvas'].dispatchEvent(event1); + var event2 = document.createEvent("MouseEvents"); + event2.initMouseEvent('mouseup', true, true, window, + 1, x, y, x, y, + 0, 0, 0, 0, + button, null); + Module['canvas'].dispatchEvent(event2); + } else { + var event1 = document.createEvent("MouseEvents"); + event1.initMouseEvent('mousemove', true, true, window, + 0, x, y, x, y, + 0, 0, 0, 0, + 0, null); + Module['canvas'].dispatchEvent(event1); + } + } + window['simulateMouseEvent'] = simulateMouseEvent; + ''') + open(os.path.join(self.get_dir(), 'page.html'), 'w').write(''' + + + + + +
+ +
+ + + + + + ''') + open(os.path.join(self.get_dir(), 'sdl2_mouse.c'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl2_mouse.c')).read())) + + Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl2_mouse.c'), '-O2', '--minify', '0', '-o', 'sdl2_mouse.js', '--pre-js', 'pre.js', '-s', 'USE_SDL=2']).communicate() + self.run_browser('page.html', '', '/report_result?600') + + def zzztest_sdl2glshader(self): + self.btest('sdl2glshader.c', reference='sdlglshader.png', args=['-s', 'USE_SDL=2', '-O2', '--closure', '1', '-s', 'LEGACY_GL_EMULATION=1']) + + def zzztest_sdl2_canvas_blank(self): + self.btest('sdl2_canvas_blank.c', reference='sdl_canvas_blank.png', args=['-s', 'USE_SDL=2']) + + def zzztest_sdl2_canvas_palette(self): + self.btest('sdl2_canvas_palette.c', reference='sdl_canvas_palette.png', args=['-s', 'USE_SDL=2']) + + def zzztest_sdl2_canvas_twice(self): + self.btest('sdl2_canvas_twice.c', reference='sdl_canvas_twice.png', args=['-s', 'USE_SDL=2']) + + def zzztest_sdl2_gfx_primitives(self): + self.btest('sdl2_gfx_primitives.c', args=['-s', 'USE_SDL=2', '-lSDL2_gfx'], reference='sdl_gfx_primitives.png', reference_slack=1) + + def zzztest_sdl2_canvas_palette_2(self): + open(os.path.join(self.get_dir(), 'args-r.js'), 'w').write(''' + Module['arguments'] = ['-r']; + ''') + + open(os.path.join(self.get_dir(), 'args-g.js'), 'w').write(''' + Module['arguments'] = ['-g']; + ''') + + open(os.path.join(self.get_dir(), 'args-b.js'), 'w').write(''' + Module['arguments'] = ['-b']; + ''') + + self.btest('sdl2_canvas_palette_2.c', reference='sdl_canvas_palette_r.png', args=['-s', 'USE_SDL=2', '--pre-js', 'args-r.js']) + self.btest('sdl2_canvas_palette_2.c', reference='sdl_canvas_palette_g.png', args=['-s', 'USE_SDL=2', '--pre-js', 'args-g.js']) + self.btest('sdl2_canvas_palette_2.c', reference='sdl_canvas_palette_b.png', args=['-s', 'USE_SDL=2', '--pre-js', 'args-b.js']) + + def zzztest_sdl2_swsurface(self): + self.btest('sdl2_swsurface.c', expected='1', args=['-s', 'USE_SDL=2']) + + def zzztest_sdl2_image_compressed(self): + for image, width in [(path_from_root('tests', 'screenshot2.png'), 300), + (path_from_root('tests', 'screenshot.jpg'), 600)]: + self.clear() + print image + + basename = os.path.basename(image) + shutil.copyfile(image, os.path.join(self.get_dir(), basename)) + open(os.path.join(self.get_dir(), 'sdl2_image.c'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl2_image.c')).read())) + + self.build_native_lzma() + Popen([ + PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl2_image.c'), '-o', 'page.html', + '--preload-file', basename, '-DSCREENSHOT_DIRNAME="/"', '-DSCREENSHOT_BASENAME="' + basename + '"', '-s', 'USE_SDL=2', '-lSDL2_image', + '--compression', '%s,%s,%s' % (path_from_root('third_party', 'lzma.js', 'lzma-native'), + path_from_root('third_party', 'lzma.js', 'lzma-decoder.js'), + 'LZMA.decompress') + ]).communicate() + shutil.move(os.path.join(self.get_dir(), basename), basename + '.renamedsoitcannotbefound'); + self.run_browser('page.html', '', '/report_result?' + str(width)) + + def zzztest_sdl2_image_prepare(self): + # load an image file, get pixel data. + shutil.copyfile(path_from_root('tests', 'screenshot.jpg'), os.path.join(self.get_dir(), 'screenshot.not')) + self.btest('sdl2_image_prepare.c', reference='screenshot.jpg', args=['--preload-file', 'screenshot.not', '-s', 'USE_SDL=2', '-lSDL2_image']) + + def zzztest_sdl2_canvas_proxy(self): + def post(): + html = open('test.html').read() + html = html.replace('', ''' + +''' % open('reftest.js').read()) + open('test.html', 'w').write(html) + + open('data.txt', 'w').write('datum') + + self.btest('sdl2_canvas_proxy.c', reference='sdl_canvas_proxy.png', args=['-s', 'USE_SDL=2', '--proxy-to-worker', '--preload-file', 'data.txt'], manual_reference=True, post_build=post) + + def zzztest_sdl2_pumpevents(self): + # key events should be detected using SDL_PumpEvents + open(os.path.join(self.get_dir(), 'pre.js'), 'w').write(''' + function keydown(c) { + var event = document.createEvent("KeyboardEvent"); + event.initKeyEvent("keydown", true, true, window, + 0, 0, 0, 0, + c, c); + document.dispatchEvent(event); + } + ''') + self.btest('sdl2_pumpevents.c', expected='7', args=['--pre-js', 'pre.js', '-s', 'USE_SDL=2']) + + def zzztest_sdl2_canvas_size(self): + self.btest('sdl2_canvas_size.c', expected='1', args=['-s', 'USE_SDL=2']) + + def zzztest_sdl2_gl_read(self): + # SDL, OpenGL, readPixels + open(os.path.join(self.get_dir(), 'sdl2_gl_read.c'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl2_gl_read.c')).read())) + Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl2_gl_read.c'), '-o', 'something.html', '-s', 'USE_SDL=2']).communicate() + self.run_browser('something.html', '.', '/report_result?1') + + def zzztest_sdl2_fog_simple(self): + shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png')) + self.btest('sdl2_fog_simple.c', reference='screenshot-fog-simple.png', + args=['-s', 'USE_SDL=2', '-lSDL2_image','-O2', '--minify', '0', '--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'], + message='You should see an image with fog.') + + def zzztest_sdl2_fog_negative(self): + shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png')) + self.btest('sdl2_fog_negative.c', reference='screenshot-fog-negative.png', + args=['-s', 'USE_SDL=2', '-lSDL2_image','--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'], + message='You should see an image with fog.') + + def zzztest_sdl2_fog_density(self): + shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png')) + self.btest('sdl2_fog_density.c', reference='screenshot-fog-density.png', + args=['-s', 'USE_SDL=2', '-lSDL2_image','--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'], + message='You should see an image with fog.') + + def zzztest_sdl2_fog_exp2(self): + shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png')) + self.btest('sdl2_fog_exp2.c', reference='screenshot-fog-exp2.png', + args=['-s', 'USE_SDL=2', '-lSDL2_image','--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'], + message='You should see an image with fog.') + + def zzztest_sdl2_fog_linear(self): + shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png')) + self.btest('sdl2_fog_linear.c', reference='screenshot-fog-linear.png', reference_slack=1, + args=['-s', 'USE_SDL=2', '-lSDL2_image','--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'], + message='You should see an image with fog.') + diff --git a/tests/test_interactive.py b/tests/test_interactive.py index a5a8d044bdd44..8ebf7bf5f25cd 100644 --- a/tests/test_interactive.py +++ b/tests/test_interactive.py @@ -69,6 +69,13 @@ def test_sdl_audio_beeps(self): Popen([PYTHON, EMCC, '-O2', '--closure', '1', '--minify', '0', os.path.join(self.get_dir(), 'sdl_audio_beep.cpp'), '-s', 'DISABLE_EXCEPTION_CATCHING=0', '-o', 'page.html']).communicate() self.run_browser('page.html', '', '/report_result?1') + def zzztest_sdl2_audio_beeps(self): + open(os.path.join(self.get_dir(), 'sdl2_audio_beep.cpp'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl2_audio_beep.cpp')).read())) + + # use closure to check for a possible bug with closure minifying away newer Audio() attributes + Popen([PYTHON, EMCC, '-O2', '--closure', '1', '--minify', '0', os.path.join(self.get_dir(), 'sdl2_audio_beep.cpp'), '-s', 'DISABLE_EXCEPTION_CATCHING=0', '-s', 'USE_SDL=2', '-o', 'page.html']).communicate() + self.run_browser('page.html', '', '/report_result?1') + def test_openal_playback(self): shutil.copyfile(path_from_root('tests', 'sounds', 'audio.wav'), os.path.join(self.get_dir(), 'audio.wav')) open(os.path.join(self.get_dir(), 'openal_playback.cpp'), 'w').write(self.with_report_result(open(path_from_root('tests', 'openal_playback.cpp')).read())) From f2cf6b6d33904e11f607b906d7cfebc4700e60d5 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 19 Oct 2014 20:05:33 -0700 Subject: [PATCH 399/461] fix port includes handling in sdl2, and make them accessible at SDL2/ --- tools/ports/sdl.py | 19 ++++++++++++++----- tools/system_libs.py | 5 +++-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/tools/ports/sdl.py b/tools/ports/sdl.py index 6a24316534f50..c1b78841e557e 100644 --- a/tools/ports/sdl.py +++ b/tools/ports/sdl.py @@ -1,16 +1,25 @@ -import os +import os, shutil def get(ports, settings, shared): if settings.USE_SDL == 2: ports.fetch_project('sdl2', 'https://github.com/emscripten-ports/SDL2/archive/master.zip') - return [ports.build_project('sdl2', 'SDL2-master', + def setup_includes(): + # copy includes to a location so they can be used as 'SDL2/' + include_path = os.path.join(shared.Cache.get_path('ports-builds'), 'sdl2', 'include') + shared.try_delete(os.path.join(include_path, 'SDL2')) + shutil.copytree(include_path, os.path.join(include_path, 'SDL2')) + ret = [ports.build_project('sdl2', 'SDL2-master', ['sh', './configure', '--host=asmjs-unknown-emscripten', '--disable-assembly', '--disable-threads', '--enable-cpuinfo=false', 'CFLAGS=-O2'], - [os.path.join('build', '.libs', 'libSDL2.a')])] + [os.path.join('build', '.libs', 'libSDL2.a')], + setup_includes)] + return ret else: return [] -def process_args(args, settings, shared): +def process_args(ports, args, settings, shared): if settings.USE_SDL == 1: args += ['-Xclang', '-isystem' + shared.path_from_root('system', 'include', 'SDL')] - elif settings.USE_SDL == 2: args += ['-Xclang', '-isystem' + os.path.join(shared.Cache.get_path('ports-builds'), 'sdl2', 'include')] + elif settings.USE_SDL == 2: + get(ports, settings, shared) + args += ['-Xclang', '-isystem' + os.path.join(shared.Cache.get_path('ports-builds'), 'sdl2', 'include')] return args diff --git a/tools/system_libs.py b/tools/system_libs.py index d34af25a6b448..6ee667485f70f 100644 --- a/tools/system_libs.py +++ b/tools/system_libs.py @@ -619,7 +619,7 @@ def fetch_project(name, url): shared.try_delete(shared.Cache.get_path(name + '.bc')) @staticmethod - def build_project(name, subdir, configure, generated_libs): + def build_project(name, subdir, configure, generated_libs, post_create=None): def create(): logging.warning('building port: ' + name + '...') port_build_dir = shared.Cache.get_path('ports-builds') @@ -627,6 +627,7 @@ def create(): libs = shared.Building.build_library(name, port_build_dir, None, generated_libs, source_dir=os.path.join(Ports.get_dir(), name, subdir), copy_project=True, configure=configure, make=['make', '-j' + str(CORES)]) assert len(libs) == 1 + if post_create: post_create() logging.warning(' building complete') return libs[0] return shared.Cache.get(name, create) @@ -648,6 +649,6 @@ def get_ports(settings): def process_args(args, settings): for port in ports.ports: - args = port.process_args(args, settings, shared) + args = port.process_args(Ports, args, settings, shared) return args From df61d9da5d688714735cb9b51422f904dd6d00af Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 19 Oct 2014 20:05:43 -0700 Subject: [PATCH 400/461] enable browser.test_sdl2_key --- tests/test_browser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_browser.py b/tests/test_browser.py index 141573601a298..ead298fa4f454 100644 --- a/tests/test_browser.py +++ b/tests/test_browser.py @@ -2102,7 +2102,7 @@ def zzztest_sdl2_image_jpeg(self): ]).communicate() self.run_browser('page.html', '', '/report_result?600') - def zzztest_sdl2_key(self): + def test_sdl2_key(self): for defines in [[]]: open(os.path.join(self.get_dir(), 'pre.js'), 'w').write(''' Module.postRun = function() { From 6308d1747c52a554d68ed8dbaf45c0543b5f2c71 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 19 Oct 2014 21:10:10 -0700 Subject: [PATCH 401/461] enable all passing sdl2 tests; #2404 --- tests/test_browser.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/tests/test_browser.py b/tests/test_browser.py index ead298fa4f454..c3ddf12d2c0f8 100644 --- a/tests/test_browser.py +++ b/tests/test_browser.py @@ -2134,7 +2134,7 @@ def test_sdl2_key(self): Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl2_key.c'), '-o', 'page.html'] + defines + ['-s', 'USE_SDL=2','--pre-js', 'pre.js', '-s', '''EXPORTED_FUNCTIONS=['_main', '_one']''', '-s', 'NO_EXIT_RUNTIME=1']).communicate() self.run_browser('page.html', '', '/report_result?7436429') - def zzztest_sdl2_text(self): + def test_sdl2_text(self): open(os.path.join(self.get_dir(), 'pre.js'), 'w').write(''' Module.postRun = function() { function doOne() { @@ -2156,7 +2156,7 @@ def zzztest_sdl2_text(self): Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl2_text.c'), '-o', 'page.html', '--pre-js', 'pre.js', '-s', '''EXPORTED_FUNCTIONS=['_main', '_one']''', '-s', 'USE_SDL=2']).communicate() self.run_browser('page.html', '', '/report_result?1') - def zzztest_sdl2_mouse(self): + def test_sdl2_mouse(self): open(os.path.join(self.get_dir(), 'pre.js'), 'w').write(''' function simulateMouseEvent(x, y, button) { var event = document.createEvent("MouseEvents"); @@ -2189,7 +2189,7 @@ def zzztest_sdl2_mouse(self): Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl2_mouse.c'), '-O2', '--minify', '0', '-o', 'page.html', '--pre-js', 'pre.js', '-s', 'USE_SDL=2']).communicate() self.run_browser('page.html', '', '/report_result?740') - def zzztest_sdl2_mouse_offsets(self): + def test_sdl2_mouse_offsets(self): open(os.path.join(self.get_dir(), 'pre.js'), 'w').write(''' function simulateMouseEvent(x, y, button) { var event = document.createEvent("MouseEvents"); @@ -2267,13 +2267,13 @@ def zzztest_sdl2_mouse_offsets(self): Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl2_mouse.c'), '-O2', '--minify', '0', '-o', 'sdl2_mouse.js', '--pre-js', 'pre.js', '-s', 'USE_SDL=2']).communicate() self.run_browser('page.html', '', '/report_result?600') - def zzztest_sdl2glshader(self): + def test_sdl2glshader(self): self.btest('sdl2glshader.c', reference='sdlglshader.png', args=['-s', 'USE_SDL=2', '-O2', '--closure', '1', '-s', 'LEGACY_GL_EMULATION=1']) - def zzztest_sdl2_canvas_blank(self): + def test_sdl2_canvas_blank(self): self.btest('sdl2_canvas_blank.c', reference='sdl_canvas_blank.png', args=['-s', 'USE_SDL=2']) - def zzztest_sdl2_canvas_palette(self): + def test_sdl2_canvas_palette(self): self.btest('sdl2_canvas_palette.c', reference='sdl_canvas_palette.png', args=['-s', 'USE_SDL=2']) def zzztest_sdl2_canvas_twice(self): @@ -2282,7 +2282,7 @@ def zzztest_sdl2_canvas_twice(self): def zzztest_sdl2_gfx_primitives(self): self.btest('sdl2_gfx_primitives.c', args=['-s', 'USE_SDL=2', '-lSDL2_gfx'], reference='sdl_gfx_primitives.png', reference_slack=1) - def zzztest_sdl2_canvas_palette_2(self): + def test_sdl2_canvas_palette_2(self): open(os.path.join(self.get_dir(), 'args-r.js'), 'w').write(''' Module['arguments'] = ['-r']; ''') @@ -2299,7 +2299,7 @@ def zzztest_sdl2_canvas_palette_2(self): self.btest('sdl2_canvas_palette_2.c', reference='sdl_canvas_palette_g.png', args=['-s', 'USE_SDL=2', '--pre-js', 'args-g.js']) self.btest('sdl2_canvas_palette_2.c', reference='sdl_canvas_palette_b.png', args=['-s', 'USE_SDL=2', '--pre-js', 'args-b.js']) - def zzztest_sdl2_swsurface(self): + def test_sdl2_swsurface(self): self.btest('sdl2_swsurface.c', expected='1', args=['-s', 'USE_SDL=2']) def zzztest_sdl2_image_compressed(self): @@ -2353,7 +2353,7 @@ def post(): self.btest('sdl2_canvas_proxy.c', reference='sdl_canvas_proxy.png', args=['-s', 'USE_SDL=2', '--proxy-to-worker', '--preload-file', 'data.txt'], manual_reference=True, post_build=post) - def zzztest_sdl2_pumpevents(self): + def test_sdl2_pumpevents(self): # key events should be detected using SDL_PumpEvents open(os.path.join(self.get_dir(), 'pre.js'), 'w').write(''' function keydown(c) { @@ -2366,10 +2366,10 @@ def zzztest_sdl2_pumpevents(self): ''') self.btest('sdl2_pumpevents.c', expected='7', args=['--pre-js', 'pre.js', '-s', 'USE_SDL=2']) - def zzztest_sdl2_canvas_size(self): + def test_sdl2_canvas_size(self): self.btest('sdl2_canvas_size.c', expected='1', args=['-s', 'USE_SDL=2']) - def zzztest_sdl2_gl_read(self): + def test_sdl2_gl_read(self): # SDL, OpenGL, readPixels open(os.path.join(self.get_dir(), 'sdl2_gl_read.c'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl2_gl_read.c')).read())) Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl2_gl_read.c'), '-o', 'something.html', '-s', 'USE_SDL=2']).communicate() From efce65a0271c876f8ec2c138f2a7549df68df4d4 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 19 Oct 2014 21:33:46 -0700 Subject: [PATCH 402/461] gl proxying improvements: framebuffer binding cache and uniform4f --- src/webGLWorker.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/webGLWorker.js b/src/webGLWorker.js index 295600f08bcde..f8de6eb6fef03 100644 --- a/src/webGLWorker.js +++ b/src/webGLWorker.js @@ -40,7 +40,8 @@ function WebGLWorker() { texture2D: null, arrayBuffer: null, elementArrayBuffer: null, - program: null + program: null, + framebuffer: null }; //=========== @@ -511,6 +512,9 @@ function WebGLWorker() { case this.CURRENT_PROGRAM: { return bindings.program; } + case this.FRAMEBUFFER_BINDING: { + return bindings.framebuffer; + } default: throw 'TODO: get parameter ' + name + ' : ' + revname(name); } }; @@ -730,6 +734,10 @@ function WebGLWorker() { if (!location) return; commandBuffer.push(20, location.id, new Float32Array(data)); }; + this.uniform4f = function(location, x, y, z, w) { + if (!location) return; + commandBuffer.push(21, location.id, new Float32Array([x, y, z, w])); + }; this.uniform4fv = function(location, data) { if (!location) return; commandBuffer.push(21, location.id, new Float32Array(data)); @@ -904,6 +912,7 @@ function WebGLWorker() { }; this.bindFramebuffer = function(target, framebuffer) { commandBuffer.push(57, target, framebuffer ? framebuffer.id : 0); + bindings.framebuffer = framebuffer; }; this.framebufferTexture2D = function(target, attachment, textarget, texture, level) { commandBuffer.push(58, target, attachment, textarget, texture ? texture.id : 0, level); From 4635342807603fe476a0aae039ee014be24d4a43 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 20 Oct 2014 11:12:57 -0700 Subject: [PATCH 403/461] emcc --clear-ports option --- emcc | 5 ++++- site/source/docs/tools_reference/emcc.rst | 7 +++++++ tests/test_sanity.py | 5 ++++- tools/system_libs.py | 6 +++++- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/emcc b/emcc index 74ea800c6d708..dc71b46b6d0ef 100755 --- a/emcc +++ b/emcc @@ -623,11 +623,14 @@ try: newargs[i] = '' newargs[i+1] = '' elif newargs[i] == '--clear-cache': - newargs[i] = '' logging.warning('clearing cache') shared.Cache.erase() shared.check_sanity(force=True) # this is a good time for a sanity check sys.exit(0) + elif newargs[i] == '--clear-ports': + logging.warning('clearing ports') + system_libs.Ports.erase() + sys.exit(0) elif newargs[i] == '--save-bc': check_bad_eq(newargs[i]) save_bc = newargs[i+1] diff --git a/site/source/docs/tools_reference/emcc.rst b/site/source/docs/tools_reference/emcc.rst index af1997857a7b5..9ab4f45afc0e1 100644 --- a/site/source/docs/tools_reference/emcc.rst +++ b/site/source/docs/tools_reference/emcc.rst @@ -367,6 +367,13 @@ Options that are modified or new in *emcc* are listed below: Manually clears the cache of compiled Emscripten system libraries (libc++, libc++abi, libc). This is normally handled automatically, but if you update LLVM in-place (instead of having a different directory for a new version), the caching mechanism can get confused. Clearing the cache can fix weird problems related to cache incompatibilities, like *Clang* failing to link with library files. This also clears other cached data like the jcache and the bootstrapped relooper. After the cache is cleared, this process will exit. + +.. _emcc-clear-ports: + +``--clear-ports`` + Manually clears the local copies and builds of projects from the Emscripten ports repos (sdl2, etc.) + + You should only need to do this if a problem happens and you want all ports that you use to be downloaded and built from scratch. After this operation is complete, this process will exit. ``--save-bc PATH`` When compiling to JavaScript or HTML, this option will save a copy of the bitcode to the specified path. The bitcode will include all files being linked after link-time optimizations have been performed (if any), including standard libraries. diff --git a/tests/test_sanity.py b/tests/test_sanity.py index 1437f420cf5aa..2ae8f83a97fa7 100644 --- a/tests/test_sanity.py +++ b/tests/test_sanity.py @@ -579,7 +579,10 @@ def test_emcc_ports(self): for i in [0, 1]: print i - try_delete(PORTS_DIR) + if i == 0: + try_delete(PORTS_DIR) + else: + self.do([PYTHON, EMCC, '--clear-ports']) assert not os.path.exists(PORTS_DIR) if i == 0: Cache.erase() # test with cache erased and without diff --git a/tools/system_libs.py b/tools/system_libs.py index 6ee667485f70f..26a1b7d72d263 100644 --- a/tools/system_libs.py +++ b/tools/system_libs.py @@ -589,6 +589,10 @@ def get_dir(): shared.safe_ensure_dirs(dirname) return dirname + @staticmethod + def erase(): + shared.try_delete(Ports.get_dir()) + @staticmethod def fetch_project(name, url): fullname = os.path.join(Ports.get_dir(), name) @@ -643,7 +647,7 @@ def get_ports(settings): ok = True finally: if not ok: - logging.error('a problem occurred when using an emscripten-ports library. try to clear ' + Ports.get_dir() + ', run emcc --clear-cache, and run again') + logging.error('a problem occurred when using an emscripten-ports library. try to run emcc --clear-cache , emcc --clear-ports , and then run this command again') return ret From 4c000568caf6293f31527ab38adeb64b1854ca5c Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 20 Oct 2014 11:16:07 -0700 Subject: [PATCH 404/461] link to youtube video of cppcon talk --- .../docs/introducing_emscripten/Talks-and-Publications.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/site/source/docs/introducing_emscripten/Talks-and-Publications.rst b/site/source/docs/introducing_emscripten/Talks-and-Publications.rst index a592161d281d3..c64a7ead78fe5 100644 --- a/site/source/docs/introducing_emscripten/Talks-and-Publications.rst +++ b/site/source/docs/introducing_emscripten/Talks-and-Publications.rst @@ -9,6 +9,7 @@ Presentations - Slides from CppCon 2014: - `Emscripten & asm.js: C++'s role in the modern web `_ (`kripken `_) + - `Video of talk `_ - `Connecting C++ and JavaScript on the Web with Embind `_ (`chadaustin `_) - `Video of talk `_ From 3dde03e92407379ae6ef4d43ca650407d214580b Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 20 Oct 2014 13:24:04 -0700 Subject: [PATCH 405/461] sdl_image integration --- src/settings.js | 4 ++++ tests/test_browser.py | 20 ++++++++++---------- tools/ports/__init__.py | 4 ++-- tools/ports/sdl_image.py | 33 +++++++++++++++++++++++++++++++++ tools/system_libs.py | 12 ++++++++++-- 5 files changed, 59 insertions(+), 14 deletions(-) create mode 100644 tools/ports/sdl_image.py diff --git a/src/settings.js b/src/settings.js index 8e71a967ce5e6..587a5da78c6b3 100644 --- a/src/settings.js +++ b/src/settings.js @@ -583,9 +583,13 @@ var USE_GLFW = 2; // Specify the GLFW version that is being linked against. // Only relevant, if you are linking against the GLFW library. // Valid options are 2 for GLFW2 and 3 for GLFW3. +// Ports + var USE_SDL = 1; // Specify the SDL version that is being linked against. // 1, the default, is 1.3, which is implemented in JS // 2 is a port of the SDL C code on emscripten-ports +var USE_SDL_IMAGE = 1; // Specify the SDL_image version that is being linked against. Must match USE_SDL + // Compiler debugging options var DEBUG_TAGS_SHOWING = []; diff --git a/tests/test_browser.py b/tests/test_browser.py index c3ddf12d2c0f8..c8a1e1ae8fd3c 100644 --- a/tests/test_browser.py +++ b/tests/test_browser.py @@ -2079,7 +2079,7 @@ def test_asm_swapping(self): self.btest(path_from_root('tests', 'asm_swap.cpp'), args=['-s', 'SWAPPABLE_ASM_MODULE=1', '-s', 'NO_EXIT_RUNTIME=1', '--pre-js', 'run.js'] + opts, expected='999') - def zzztest_sdl2_image(self): + def test_sdl2_image(self): # load an image file, get pixel data. Also O2 coverage for --preload-file, and memory-init shutil.copyfile(path_from_root('tests', 'screenshot.jpg'), os.path.join(self.get_dir(), 'screenshot.jpg')) open(os.path.join(self.get_dir(), 'sdl2_image.c'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl2_image.c')).read())) @@ -2089,7 +2089,7 @@ def zzztest_sdl2_image(self): ('screenshot.jpg@/assets/screenshot.jpg', '/assets', 'screenshot.jpg')]: Popen([ PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl2_image.c'), '-o', 'page.html', '-O2', '--memory-init-file', str(mem), - '--preload-file', dest, '-DSCREENSHOT_DIRNAME="' + dirname + '"', '-DSCREENSHOT_BASENAME="' + basename + '"', '-s', 'USE_SDL=2', '-lSDL2_image' + '--preload-file', dest, '-DSCREENSHOT_DIRNAME="' + dirname + '"', '-DSCREENSHOT_BASENAME="' + basename + '"', '-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2' ]).communicate() self.run_browser('page.html', '', '/report_result?600') @@ -2098,7 +2098,7 @@ def zzztest_sdl2_image_jpeg(self): open(os.path.join(self.get_dir(), 'sdl2_image_jpeg.c'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl2_image.c')).read())) Popen([ PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl2_image_jpeg.c'), '-o', 'page.html', - '--preload-file', 'screenshot.jpeg', '-DSCREENSHOT_DIRNAME="/"', '-DSCREENSHOT_BASENAME="screenshot.jpeg"', '-s', 'USE_SDL=2', '-lSDL2_image' + '--preload-file', 'screenshot.jpeg', '-DSCREENSHOT_DIRNAME="/"', '-DSCREENSHOT_BASENAME="screenshot.jpeg"', '-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2' ]).communicate() self.run_browser('page.html', '', '/report_result?600') @@ -2315,7 +2315,7 @@ def zzztest_sdl2_image_compressed(self): self.build_native_lzma() Popen([ PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl2_image.c'), '-o', 'page.html', - '--preload-file', basename, '-DSCREENSHOT_DIRNAME="/"', '-DSCREENSHOT_BASENAME="' + basename + '"', '-s', 'USE_SDL=2', '-lSDL2_image', + '--preload-file', basename, '-DSCREENSHOT_DIRNAME="/"', '-DSCREENSHOT_BASENAME="' + basename + '"', '-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2', '--compression', '%s,%s,%s' % (path_from_root('third_party', 'lzma.js', 'lzma-native'), path_from_root('third_party', 'lzma.js', 'lzma-decoder.js'), 'LZMA.decompress') @@ -2326,7 +2326,7 @@ def zzztest_sdl2_image_compressed(self): def zzztest_sdl2_image_prepare(self): # load an image file, get pixel data. shutil.copyfile(path_from_root('tests', 'screenshot.jpg'), os.path.join(self.get_dir(), 'screenshot.not')) - self.btest('sdl2_image_prepare.c', reference='screenshot.jpg', args=['--preload-file', 'screenshot.not', '-s', 'USE_SDL=2', '-lSDL2_image']) + self.btest('sdl2_image_prepare.c', reference='screenshot.jpg', args=['--preload-file', 'screenshot.not', '-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2']) def zzztest_sdl2_canvas_proxy(self): def post(): @@ -2378,30 +2378,30 @@ def test_sdl2_gl_read(self): def zzztest_sdl2_fog_simple(self): shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png')) self.btest('sdl2_fog_simple.c', reference='screenshot-fog-simple.png', - args=['-s', 'USE_SDL=2', '-lSDL2_image','-O2', '--minify', '0', '--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'], + args=['-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2','-O2', '--minify', '0', '--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'], message='You should see an image with fog.') def zzztest_sdl2_fog_negative(self): shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png')) self.btest('sdl2_fog_negative.c', reference='screenshot-fog-negative.png', - args=['-s', 'USE_SDL=2', '-lSDL2_image','--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'], + args=['-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2','--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'], message='You should see an image with fog.') def zzztest_sdl2_fog_density(self): shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png')) self.btest('sdl2_fog_density.c', reference='screenshot-fog-density.png', - args=['-s', 'USE_SDL=2', '-lSDL2_image','--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'], + args=['-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2','--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'], message='You should see an image with fog.') def zzztest_sdl2_fog_exp2(self): shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png')) self.btest('sdl2_fog_exp2.c', reference='screenshot-fog-exp2.png', - args=['-s', 'USE_SDL=2', '-lSDL2_image','--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'], + args=['-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2','--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'], message='You should see an image with fog.') def zzztest_sdl2_fog_linear(self): shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png')) self.btest('sdl2_fog_linear.c', reference='screenshot-fog-linear.png', reference_slack=1, - args=['-s', 'USE_SDL=2', '-lSDL2_image','--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'], + args=['-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2','--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'], message='You should see an image with fog.') diff --git a/tools/ports/__init__.py b/tools/ports/__init__.py index 4cc4df1c071bf..113c141bfba05 100644 --- a/tools/ports/__init__.py +++ b/tools/ports/__init__.py @@ -1,4 +1,4 @@ -import sdl +import sdl, sdl_image -ports = [sdl] +ports = [sdl, sdl_image] diff --git a/tools/ports/sdl_image.py b/tools/ports/sdl_image.py new file mode 100644 index 0000000000000..eaaed833eb50b --- /dev/null +++ b/tools/ports/sdl_image.py @@ -0,0 +1,33 @@ +import os, shutil + +def get(ports, settings, shared): + if settings.USE_SDL_IMAGE == 2: + sdl_build = os.path.join(ports.get_build_dir(), 'sdl2') + assert os.path.exists(sdl_build), 'You must use SDL2 to use SDL2_image' + ports.fetch_project('sdl2-image', 'https://github.com/emscripten-ports/SDL2_image/archive/master.zip') + def create(): + shutil.copyfile(os.path.join(ports.get_dir(), 'sdl2-image', 'SDL2_image-master', 'SDL_image.h'), os.path.join(ports.get_build_dir(), 'sdl2', 'include', 'SDL_image.h')) + shutil.copyfile(os.path.join(ports.get_dir(), 'sdl2-image', 'SDL2_image-master', 'SDL_image.h'), os.path.join(ports.get_build_dir(), 'sdl2', 'include', 'SDL2', 'SDL_image.h')) + srcs = 'IMG.c IMG_bmp.c IMG_gif.c IMG_jpg.c IMG_lbm.c IMG_pcx.c IMG_png.c IMG_pnm.c IMG_tga.c IMG_tif.c IMG_xcf.c IMG_xpm.c IMG_xv.c IMG_webp.c IMG_ImageIO.m'.split(' ') + commands = [] + o_s = [] + for src in srcs: + o = os.path.join(ports.get_build_dir(), 'sdl2-image', src + '.o') + commands.append([shared.PYTHON, shared.EMCC, os.path.join(ports.get_dir(), 'sdl2-image', 'SDL2_image-master', src), '-O2', '-s', 'USE_SDL=2', '-o', o]) + o_s.append(o) + shared.safe_ensure_dirs(os.path.dirname(o_s[0])) + ports.run_commands(commands) + final = os.path.join(ports.get_build_dir(), 'sdl2-image', 'libsdl2_image.bc') + shared.Building.link(o_s, final) + return final + return [shared.Cache.get('sdl2-image', create)] + else: + return [] + +def process_args(ports, args, settings, shared): + if settings.USE_SDL_IMAGE == 2: + get(ports, settings, shared) + args += ['-Xclang', '-isystem' + os.path.join(shared.Cache.get_path('ports-builds'), 'sdl2-image', 'include')] + return args + + diff --git a/tools/system_libs.py b/tools/system_libs.py index 26a1b7d72d263..740064c9761fc 100644 --- a/tools/system_libs.py +++ b/tools/system_libs.py @@ -583,6 +583,10 @@ class Dummy: import ports class Ports: + @staticmethod + def run_commands(commands): # make easily available for port objects + run_commands(commands) + @staticmethod def get_dir(): dirname = os.environ.get('EM_PORTS') or os.path.expanduser(os.path.join('~', '.emscripten_ports')) @@ -593,6 +597,10 @@ def get_dir(): def erase(): shared.try_delete(Ports.get_dir()) + @staticmethod + def get_build_dir(): + return shared.Cache.get_path('ports-builds') + @staticmethod def fetch_project(name, url): fullname = os.path.join(Ports.get_dir(), name) @@ -619,14 +627,14 @@ def fetch_project(name, url): os.chdir(cwd) # we unpacked a new version, clear the build in the cache - shared.try_delete(os.path.join(shared.Cache.get_path('ports-builds'), name)) + shared.try_delete(os.path.join(Ports.get_build_dir(), name)) shared.try_delete(shared.Cache.get_path(name + '.bc')) @staticmethod def build_project(name, subdir, configure, generated_libs, post_create=None): def create(): logging.warning('building port: ' + name + '...') - port_build_dir = shared.Cache.get_path('ports-builds') + port_build_dir = Ports.get_build_dir() shared.safe_ensure_dirs(port_build_dir) libs = shared.Building.build_library(name, port_build_dir, None, generated_libs, source_dir=os.path.join(Ports.get_dir(), name, subdir), copy_project=True, configure=configure, make=['make', '-j' + str(CORES)]) From a616a3ca86364dffa377f006bd6bd0b2413e4c90 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 20 Oct 2014 13:27:35 -0700 Subject: [PATCH 406/461] mention each port once in each process --- tools/system_libs.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tools/system_libs.py b/tools/system_libs.py index 740064c9761fc..2106f77ff905a 100644 --- a/tools/system_libs.py +++ b/tools/system_libs.py @@ -601,11 +601,16 @@ def erase(): def get_build_dir(): return shared.Cache.get_path('ports-builds') + name_cache = set() + @staticmethod def fetch_project(name, url): fullname = os.path.join(Ports.get_dir(), name) - logging.warning('including port: ' + name) - logging.debug(' (at ' + fullname + ')') + + if name not in Ports.name_cache: # only mention each port once in log + logging.warning('including port: ' + name) + logging.debug(' (at ' + fullname + ')') + Ports.name_cache.add(name) if not os.path.exists(fullname + '.zip'): logging.warning('retrieving port: ' + name + ' from ' + url) From 2d3ee26ba31ac1ebbb92e719456392a9d94ff769 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 20 Oct 2014 13:54:05 -0700 Subject: [PATCH 407/461] enable all passing sdl2-image tests --- tests/test_browser.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/test_browser.py b/tests/test_browser.py index c8a1e1ae8fd3c..dd738f9e5b48f 100644 --- a/tests/test_browser.py +++ b/tests/test_browser.py @@ -2093,7 +2093,7 @@ def test_sdl2_image(self): ]).communicate() self.run_browser('page.html', '', '/report_result?600') - def zzztest_sdl2_image_jpeg(self): + def test_sdl2_image_jpeg(self): shutil.copyfile(path_from_root('tests', 'screenshot.jpg'), os.path.join(self.get_dir(), 'screenshot.jpeg')) open(os.path.join(self.get_dir(), 'sdl2_image_jpeg.c'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl2_image.c')).read())) Popen([ @@ -2302,7 +2302,7 @@ def test_sdl2_canvas_palette_2(self): def test_sdl2_swsurface(self): self.btest('sdl2_swsurface.c', expected='1', args=['-s', 'USE_SDL=2']) - def zzztest_sdl2_image_compressed(self): + def test_sdl2_image_compressed(self): for image, width in [(path_from_root('tests', 'screenshot2.png'), 300), (path_from_root('tests', 'screenshot.jpg'), 600)]: self.clear() @@ -2323,7 +2323,7 @@ def zzztest_sdl2_image_compressed(self): shutil.move(os.path.join(self.get_dir(), basename), basename + '.renamedsoitcannotbefound'); self.run_browser('page.html', '', '/report_result?' + str(width)) - def zzztest_sdl2_image_prepare(self): + def test_sdl2_image_prepare(self): # load an image file, get pixel data. shutil.copyfile(path_from_root('tests', 'screenshot.jpg'), os.path.join(self.get_dir(), 'screenshot.not')) self.btest('sdl2_image_prepare.c', reference='screenshot.jpg', args=['--preload-file', 'screenshot.not', '-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2']) @@ -2375,31 +2375,31 @@ def test_sdl2_gl_read(self): Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl2_gl_read.c'), '-o', 'something.html', '-s', 'USE_SDL=2']).communicate() self.run_browser('something.html', '.', '/report_result?1') - def zzztest_sdl2_fog_simple(self): + def test_sdl2_fog_simple(self): shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png')) self.btest('sdl2_fog_simple.c', reference='screenshot-fog-simple.png', args=['-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2','-O2', '--minify', '0', '--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'], message='You should see an image with fog.') - def zzztest_sdl2_fog_negative(self): + def test_sdl2_fog_negative(self): shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png')) self.btest('sdl2_fog_negative.c', reference='screenshot-fog-negative.png', args=['-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2','--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'], message='You should see an image with fog.') - def zzztest_sdl2_fog_density(self): + def test_sdl2_fog_density(self): shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png')) self.btest('sdl2_fog_density.c', reference='screenshot-fog-density.png', args=['-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2','--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'], message='You should see an image with fog.') - def zzztest_sdl2_fog_exp2(self): + def test_sdl2_fog_exp2(self): shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png')) self.btest('sdl2_fog_exp2.c', reference='screenshot-fog-exp2.png', args=['-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2','--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'], message='You should see an image with fog.') - def zzztest_sdl2_fog_linear(self): + def test_sdl2_fog_linear(self): shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png')) self.btest('sdl2_fog_linear.c', reference='screenshot-fog-linear.png', reference_slack=1, args=['-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2','--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'], From 70ed4b97dfbe49ff968550e8ad10187ecddd6a6a Mon Sep 17 00:00:00 2001 From: Jukka Jylanki Date: Tue, 21 Oct 2014 00:08:22 +0300 Subject: [PATCH 408/461] Make tools/emterpretify.py import-safe by only executing itself "if __name__ == '__main__':". On Windows when using Python multiprocessing, the child processes will import the main module at launch. This means that any module that uses multiprocessing needs to be importable as a library without executing its 'task'. For reference, see http://stackoverflow.com/questions/18204782/runtimeerror-on-windows-trying-python-multiprocessing . Fixes a bug where a Windows system would hang when running emterpretify.py due to creating an avalanche of thousands of python processes. --- tools/emterpretify.py | 458 +++++++++++++++++++++--------------------- 1 file changed, 229 insertions(+), 229 deletions(-) diff --git a/tools/emterpretify.py b/tools/emterpretify.py index cafdb7e480453..636bad48912aa 100755 --- a/tools/emterpretify.py +++ b/tools/emterpretify.py @@ -554,251 +554,251 @@ def process(code): )) # main +if __name__ == '__main__': + infile = sys.argv[1] + outfile = sys.argv[2] + force_memfile = sys.argv[3] if len(sys.argv) >= 4 else None + extra_blacklist = json.loads(sys.argv[4]) if len(sys.argv) >= 5 else [] -infile = sys.argv[1] -outfile = sys.argv[2] -force_memfile = sys.argv[3] if len(sys.argv) >= 4 else None -extra_blacklist = json.loads(sys.argv[4]) if len(sys.argv) >= 5 else [] + BLACKLIST = set(list(BLACKLIST) + extra_blacklist) -BLACKLIST = set(list(BLACKLIST) + extra_blacklist) + shared.logging.debug('saving original (non-emterpreted) code to ' + infile + '.orig.js') + shutil.copyfile(infile, infile + '.orig.js') -shared.logging.debug('saving original (non-emterpreted) code to ' + infile + '.orig.js') -shutil.copyfile(infile, infile + '.orig.js') + # final global functions -# final global functions + asm = asm_module.AsmModule(infile) -asm = asm_module.AsmModule(infile) + # sanity check on blacklist -# sanity check on blacklist + for func in extra_blacklist: + assert func in asm.funcs, 'requested blacklist of %s but it does not exist' % func -for func in extra_blacklist: - assert func in asm.funcs, 'requested blacklist of %s but it does not exist' % func + # decide which functions will be emterpreted, and find which are externally reachable (from outside other emterpreted code; those will need trampolines) -# decide which functions will be emterpreted, and find which are externally reachable (from outside other emterpreted code; those will need trampolines) + emterpreted_funcs = set([func for func in asm.funcs if func not in BLACKLIST and not func.startswith('dynCall_')]) -emterpreted_funcs = set([func for func in asm.funcs if func not in BLACKLIST and not func.startswith('dynCall_')]) + tabled_funcs = asm.get_table_funcs() + exported_funcs = [func.split(':')[0] for func in asm.exports] -tabled_funcs = asm.get_table_funcs() -exported_funcs = [func.split(':')[0] for func in asm.exports] + temp = infile + '.tmp.js' -temp = infile + '.tmp.js' + # find emterpreted functions reachable by non-emterpreted ones, we will force a trampoline for them later -# find emterpreted functions reachable by non-emterpreted ones, we will force a trampoline for them later + shared.Building.js_optimizer(infile, ['findReachable'], extra_info={ 'blacklist': list(emterpreted_funcs) }, output_filename=temp, just_concat=True) + asm = asm_module.AsmModule(temp) + lines = asm.funcs_js.split('\n') -shared.Building.js_optimizer(infile, ['findReachable'], extra_info={ 'blacklist': list(emterpreted_funcs) }, output_filename=temp, just_concat=True) -asm = asm_module.AsmModule(temp) -lines = asm.funcs_js.split('\n') + reachable_funcs = set([]) + for i in range(len(lines)): + line = lines[i] + if line.startswith('// REACHABLE '): + curr = json.loads(line[len('// REACHABLE '):]) + reachable_funcs = set(list(reachable_funcs) + curr) -reachable_funcs = set([]) -for i in range(len(lines)): - line = lines[i] - if line.startswith('// REACHABLE '): - curr = json.loads(line[len('// REACHABLE '):]) - reachable_funcs = set(list(reachable_funcs) + curr) + external_emterpreted_funcs = filter(lambda func: func in tabled_funcs or func in exported_funcs or func in reachable_funcs, emterpreted_funcs) -external_emterpreted_funcs = filter(lambda func: func in tabled_funcs or func in exported_funcs or func in reachable_funcs, emterpreted_funcs) + # process functions, generating bytecode + shared.Building.js_optimizer(infile, ['emterpretify'], extra_info={ 'emterpretedFuncs': list(emterpreted_funcs), 'externalEmterpretedFuncs': list(external_emterpreted_funcs), 'opcodes': OPCODES, 'ropcodes': ROPCODES }, output_filename=temp, just_concat=True) -# process functions, generating bytecode -shared.Building.js_optimizer(infile, ['emterpretify'], extra_info={ 'emterpretedFuncs': list(emterpreted_funcs), 'externalEmterpretedFuncs': list(external_emterpreted_funcs), 'opcodes': OPCODES, 'ropcodes': ROPCODES }, output_filename=temp, just_concat=True) + # load the module and modify it + asm = asm_module.AsmModule(temp) -# load the module and modify it -asm = asm_module.AsmModule(temp) - -in_mem_file = infile + '.mem' -in_mem_file_base = os.path.basename(in_mem_file) -out_mem_file = outfile + '.mem' -out_mem_file_base = os.path.basename(out_mem_file) - -assert in_mem_file_base in asm.pre_js, 'we assume a mem init file for now (looked for %s)' % in_mem_file -if not force_memfile: - asm.pre_js = asm.pre_js.replace(in_mem_file_base, out_mem_file_base) - assert os.path.exists(in_mem_file), 'need to find mem file at %s' % in_mem_file -else: - out_mem_file = force_memfile + in_mem_file = infile + '.mem' + in_mem_file_base = os.path.basename(in_mem_file) + out_mem_file = outfile + '.mem' out_mem_file_base = os.path.basename(out_mem_file) -mem_init = map(ord, open(in_mem_file, 'rb').read()) -zero_space = asm.staticbump - len(mem_init) -assert zero_space >= 0 # can be positive, if we add a bump of zeros - -assert ('GLOBAL_BASE: %d,' % GLOBAL_BASE) in asm.pre_js, 'we assume a specific global base, and that we can write to all memory below it' - -# calculate where code will start -while len(mem_init) % 8 != 0: - mem_init.append(0) - asm.staticbump += 1 -code_start = len(mem_init) + GLOBAL_BASE - -# parse out bytecode and add to mem init file -all_code = [] -funcs = {} -lines = asm.funcs_js.split('\n') -asm.funcs_js = None -func = None - -# first pass, collect and process bytecode - -global_funcs = {} # 'name|sig' -> id -global_func_names = {} # id -> name -global_func_sigs = {} # id -> sig, one name can have multiple sigs -global_func_id = 0 - -global_vars = {} -rglobal_vars = {} -global_var_id = 0 - -call_sigs = {} # signatures appearing for each call target -def process_code(func, code, absolute_targets): - global global_func_id - global global_var_id - absolute_start = code_start + len(all_code) # true absolute starting point of this function - #print 'processing code', func, absolute_start - for i in range(len(code)/4): - j = i*4 - if code[j] == 'EXTCALL': - # fix CALL instructions' targets and signatures - target = code[j+2] - sig = code[j+3] - if target not in call_sigs: call_sigs[target] = [] - sigs = call_sigs[target] - if sig not in sigs: sigs.append(sig) - fullname = target + '|' + sig - if fullname not in global_funcs: - global_funcs[fullname] = global_func_id - global_func_names[global_func_id] = target - global_func_sigs[global_func_id] = sig - global_func_id += 1 - code[j+2] = global_funcs[fullname] & 255 - code[j+3] = global_funcs[fullname] >> 8 - if sig[0] == 'v': - if code[j+1] == -1: # dummy value for assignment XXX we should not have assignments on void calls - code[j+1] = 0 # clear it - else: - assert code[j+1] >= 0 # there should be a real target here - elif code[j] in ['GETGLBI', 'GETGLBD']: - # fix global-accessing instructions' targets - target = code[j+2] - imp = asm.imports[target] - assert '|0' in imp or '| 0' in imp or imp == '0' - if target not in global_vars: - global_vars[target] = global_var_id - rglobal_vars[global_var_id] = target - global_var_id += 1 - code[j+2] = global_vars[target] - elif code[j] in ['SETGLBI']: - # fix global-accessing instructions' targets - target = code[j+1] - if target not in global_vars: - global_vars[target] = global_var_id - rglobal_vars[global_var_id] = target - global_var_id += 1 - code[j+1] = global_vars[target] - elif code[j] == 'absolute-value': - # put the 32-bit absolute value of an abolute target here - absolute_value = absolute_start + absolute_targets[unicode(code[j+1])] - #print ' fixing absolute value', code[j+1], absolute_targets[unicode(code[j+1])], absolute_value - assert absolute_value < (1 << 31) - assert absolute_value % 4 == 0 - value = bytify(absolute_value) - for k in range(4): - code[j + k] = value[k] - -actual_return_types = {} - -for i in range(len(lines)): - line = lines[i] - if line.startswith('function ') and '}' not in line: - assert not func - elif line.startswith('// EMTERPRET_INFO '): - try: - func, curr, absolute_targets = json.loads(line[len('// EMTERPRET_INFO '):]) - except Exception, e: - print >> sys.stderr, 'failed to parse code from', line - raise e - assert len(curr) % 4 == 0, curr - funcs[func] = len(all_code) # no operation here should change the length - if LOG_CODE: print >> sys.stderr, 'raw bytecode for %s:' % func, curr, 'insts:', len(curr)/4 - process_code(func, curr, absolute_targets) - #print >> sys.stderr, 'processed bytecode for %s:' % func, curr - all_code += curr - func = None - lines[i] = '' - elif line.startswith('// return type: ['): - name, ret = line.split('[')[1].split(']')[0].split(',') - if ret == 'undefined': - actual_return_types[name] = 'v' - elif ret == '0': - actual_return_types[name] = 'i' - elif ret == '1': - actual_return_types[name] = 'd' - elif ret == '2': - actual_return_types[name] = 'f' - lines[i] = '' - -assert global_func_id < 65536, [global_funcs, global_func_id] -assert global_var_id < 256, [global_vars, global_var_id] - -def post_process_code(code): - for i in range(len(code)/4): - j = i*4 - if code[j] == 'absolute-funcaddr': - # put the 32-bit absolute value of an abolute function here - absolute_value = code_start + funcs[code[j+1]] - #print ' fixing absolute value', code[j+1], absolute_targets[unicode(code[j+1])], absolute_value - assert absolute_value < (1 << 31) - assert absolute_value % 4 == 0 - value = bytify(absolute_value) - for k in range(4): - code[j + k] = value[k] - - # finalize instruction string names to opcodes - for i in range(len(code)/4): - j = i*4 - if type(code[j]) in (str, unicode): - code[j] = ROPCODES[code[j]] - - # sanity checks - for i in range(len(code)): - v = code[i] - assert type(v) == int and v >= 0 and v < 256, [i, v, 'in', code] - -post_process_code(all_code) - -# create new mem init -mem_init = mem_init + all_code -asm.staticbump += len(all_code) - -while len(mem_init) % 8 != 0: - mem_init.append(0) - asm.staticbump += 1 -stack_start = len(mem_init) -asm.staticbump += EMT_STACK_MAX - -open(out_mem_file, 'wb').write(''.join(map(chr, mem_init))) - -# second pass, finalize trampolines -for i in range(len(lines)): - line = lines[i] - if line.startswith('function ') and '}' not in line: - assert not func - func = line.split(' ')[1].split('(')[0] - elif line.startswith('}'): - assert func - func = None - elif func and func in funcs: - call = '(EMTERPRETER_' + func + ')' - if call in line: - lines[i] = lines[i].replace(call, '(%s)' % (funcs[func] + code_start)) - -# finalize funcs JS (first line has the marker, add emterpreters right after that) -asm.funcs_js = '\n'.join([lines[0], make_emterpreter(), make_emterpreter(zero=True), '\n'.join(filter(lambda line: len(line) > 0, lines[1:]))]) + '\n' -lines = None - -# set up emterpreter stack top -asm.set_pre_js(js='var EMTSTACKTOP = STATIC_BASE + %s, EMT_STACK_MAX = EMTSTACKTOP + %d;' % (stack_start, EMT_STACK_MAX)) - -# send EMT vars into asm -asm.pre_js += 'Module.asmLibraryArg.EMTSTACKTOP = EMTSTACKTOP; Module.asmLibraryArg.EMT_STACK_MAX = EMT_STACK_MAX;\n' -asm.imports_js += 'var EMTSTACKTOP = env.EMTSTACKTOP|0;\nvar EMT_STACK_MAX = env.EMT_STACK_MAX|0;\n' - -asm.write(outfile) + + assert in_mem_file_base in asm.pre_js, 'we assume a mem init file for now (looked for %s)' % in_mem_file + if not force_memfile: + asm.pre_js = asm.pre_js.replace(in_mem_file_base, out_mem_file_base) + assert os.path.exists(in_mem_file), 'need to find mem file at %s' % in_mem_file + else: + out_mem_file = force_memfile + out_mem_file_base = os.path.basename(out_mem_file) + mem_init = map(ord, open(in_mem_file, 'rb').read()) + zero_space = asm.staticbump - len(mem_init) + assert zero_space >= 0 # can be positive, if we add a bump of zeros + + assert ('GLOBAL_BASE: %d,' % GLOBAL_BASE) in asm.pre_js, 'we assume a specific global base, and that we can write to all memory below it' + + # calculate where code will start + while len(mem_init) % 8 != 0: + mem_init.append(0) + asm.staticbump += 1 + code_start = len(mem_init) + GLOBAL_BASE + + # parse out bytecode and add to mem init file + all_code = [] + funcs = {} + lines = asm.funcs_js.split('\n') + asm.funcs_js = None + func = None + + # first pass, collect and process bytecode + + global_funcs = {} # 'name|sig' -> id + global_func_names = {} # id -> name + global_func_sigs = {} # id -> sig, one name can have multiple sigs + global_func_id = 0 + + global_vars = {} + rglobal_vars = {} + global_var_id = 0 + + call_sigs = {} # signatures appearing for each call target + def process_code(func, code, absolute_targets): + global global_func_id + global global_var_id + absolute_start = code_start + len(all_code) # true absolute starting point of this function + #print 'processing code', func, absolute_start + for i in range(len(code)/4): + j = i*4 + if code[j] == 'EXTCALL': + # fix CALL instructions' targets and signatures + target = code[j+2] + sig = code[j+3] + if target not in call_sigs: call_sigs[target] = [] + sigs = call_sigs[target] + if sig not in sigs: sigs.append(sig) + fullname = target + '|' + sig + if fullname not in global_funcs: + global_funcs[fullname] = global_func_id + global_func_names[global_func_id] = target + global_func_sigs[global_func_id] = sig + global_func_id += 1 + code[j+2] = global_funcs[fullname] & 255 + code[j+3] = global_funcs[fullname] >> 8 + if sig[0] == 'v': + if code[j+1] == -1: # dummy value for assignment XXX we should not have assignments on void calls + code[j+1] = 0 # clear it + else: + assert code[j+1] >= 0 # there should be a real target here + elif code[j] in ['GETGLBI', 'GETGLBD']: + # fix global-accessing instructions' targets + target = code[j+2] + imp = asm.imports[target] + assert '|0' in imp or '| 0' in imp or imp == '0' + if target not in global_vars: + global_vars[target] = global_var_id + rglobal_vars[global_var_id] = target + global_var_id += 1 + code[j+2] = global_vars[target] + elif code[j] in ['SETGLBI']: + # fix global-accessing instructions' targets + target = code[j+1] + if target not in global_vars: + global_vars[target] = global_var_id + rglobal_vars[global_var_id] = target + global_var_id += 1 + code[j+1] = global_vars[target] + elif code[j] == 'absolute-value': + # put the 32-bit absolute value of an abolute target here + absolute_value = absolute_start + absolute_targets[unicode(code[j+1])] + #print ' fixing absolute value', code[j+1], absolute_targets[unicode(code[j+1])], absolute_value + assert absolute_value < (1 << 31) + assert absolute_value % 4 == 0 + value = bytify(absolute_value) + for k in range(4): + code[j + k] = value[k] + + actual_return_types = {} + + for i in range(len(lines)): + line = lines[i] + if line.startswith('function ') and '}' not in line: + assert not func + elif line.startswith('// EMTERPRET_INFO '): + try: + func, curr, absolute_targets = json.loads(line[len('// EMTERPRET_INFO '):]) + except Exception, e: + print >> sys.stderr, 'failed to parse code from', line + raise e + assert len(curr) % 4 == 0, curr + funcs[func] = len(all_code) # no operation here should change the length + if LOG_CODE: print >> sys.stderr, 'raw bytecode for %s:' % func, curr, 'insts:', len(curr)/4 + process_code(func, curr, absolute_targets) + #print >> sys.stderr, 'processed bytecode for %s:' % func, curr + all_code += curr + func = None + lines[i] = '' + elif line.startswith('// return type: ['): + name, ret = line.split('[')[1].split(']')[0].split(',') + if ret == 'undefined': + actual_return_types[name] = 'v' + elif ret == '0': + actual_return_types[name] = 'i' + elif ret == '1': + actual_return_types[name] = 'd' + elif ret == '2': + actual_return_types[name] = 'f' + lines[i] = '' + + assert global_func_id < 65536, [global_funcs, global_func_id] + assert global_var_id < 256, [global_vars, global_var_id] + + def post_process_code(code): + for i in range(len(code)/4): + j = i*4 + if code[j] == 'absolute-funcaddr': + # put the 32-bit absolute value of an abolute function here + absolute_value = code_start + funcs[code[j+1]] + #print ' fixing absolute value', code[j+1], absolute_targets[unicode(code[j+1])], absolute_value + assert absolute_value < (1 << 31) + assert absolute_value % 4 == 0 + value = bytify(absolute_value) + for k in range(4): + code[j + k] = value[k] + + # finalize instruction string names to opcodes + for i in range(len(code)/4): + j = i*4 + if type(code[j]) in (str, unicode): + code[j] = ROPCODES[code[j]] + + # sanity checks + for i in range(len(code)): + v = code[i] + assert type(v) == int and v >= 0 and v < 256, [i, v, 'in', code] + + post_process_code(all_code) + + # create new mem init + mem_init = mem_init + all_code + asm.staticbump += len(all_code) + + while len(mem_init) % 8 != 0: + mem_init.append(0) + asm.staticbump += 1 + stack_start = len(mem_init) + asm.staticbump += EMT_STACK_MAX + + open(out_mem_file, 'wb').write(''.join(map(chr, mem_init))) + + # second pass, finalize trampolines + for i in range(len(lines)): + line = lines[i] + if line.startswith('function ') and '}' not in line: + assert not func + func = line.split(' ')[1].split('(')[0] + elif line.startswith('}'): + assert func + func = None + elif func and func in funcs: + call = '(EMTERPRETER_' + func + ')' + if call in line: + lines[i] = lines[i].replace(call, '(%s)' % (funcs[func] + code_start)) + + # finalize funcs JS (first line has the marker, add emterpreters right after that) + asm.funcs_js = '\n'.join([lines[0], make_emterpreter(), make_emterpreter(zero=True), '\n'.join(filter(lambda line: len(line) > 0, lines[1:]))]) + '\n' + lines = None + + # set up emterpreter stack top + asm.set_pre_js(js='var EMTSTACKTOP = STATIC_BASE + %s, EMT_STACK_MAX = EMTSTACKTOP + %d;' % (stack_start, EMT_STACK_MAX)) + + # send EMT vars into asm + asm.pre_js += 'Module.asmLibraryArg.EMTSTACKTOP = EMTSTACKTOP; Module.asmLibraryArg.EMT_STACK_MAX = EMT_STACK_MAX;\n' + asm.imports_js += 'var EMTSTACKTOP = env.EMTSTACKTOP|0;\nvar EMT_STACK_MAX = env.EMT_STACK_MAX|0;\n' + + asm.write(outfile) From b203d8ef405a28e3b20d67d7f214a4a1b02b2cb4 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 20 Oct 2014 14:16:47 -0700 Subject: [PATCH 409/461] mention ports, and document both kinds of SDL support, 1 and 2 --- .../docs/compiling/Building-Projects.rst | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/site/source/docs/compiling/Building-Projects.rst b/site/source/docs/compiling/Building-Projects.rst index 817d9a51e254b..2cd6e04cb840b 100644 --- a/site/source/docs/compiling/Building-Projects.rst +++ b/site/source/docs/compiling/Building-Projects.rst @@ -130,7 +130,7 @@ For more general information, see the topic :ref:`Debugging`. Using libraries =============== -Built in support is available for a number of standard libraries: *libc*, *libc++* and *SDL*. These will automatically be linked when you compile code that uses them (you do not even need to add ``-lSDL``). +Built in support is available for a number of standard libraries: *libc*, *libc++* and *SDL*. These will automatically be linked when you compile code that uses them (you do not even need to add ``-lSDL``, but see below for more SDL-specific details). If your project uses other libraries, for example `zlib `_ or *glib*, you will need to build and link them. The normal approach is to build the libraries to bitcode and then compile library and main program bitcode together to JavaScript. @@ -165,13 +165,30 @@ It is also possible to link the bitcode libraries first, and then compile the co -SDL Configuration -================= +Emscripten Ports +================ + +Emscripten Ports is a collection of useful libraries, ported to Emscripten. They reside `on github `_, and have integration support in *emcc*. When you request that a port be used, emcc will fetch it from the remote server, set it up and build it locally, then link it with your project, add necessary include to your build commands, etc. For example, SDL2 is in ports, and you can request that it be used with ``-s USE_SDL=2``. For example, + +.. code-block:: bash + + /emcc tests/sdl2glshader.c -s USE_SDL=2 -s LEGACY_GL_EMULATION=1 -o sdl2.html + +You should see some notifications about SDL2 being used, and built if it wasn't previously. You can then view ``sdl2.html`` in your browser. + +.. note:: *SDL_image* has also been added to ports, use it with ``-s USE_SDL_IMAGE=2``. + +.. note:: Emscripten also has support for older SDL1, which is built in. If you do not specify SDL2 as in the command above, then SDL1 is linked in and the SDL1 include paths are used. SDL1 has support for *sdl-config*, which is present in `system/bin `_. Using the native *sdl-config* may result in compilation or missing-symbol errors. You will need to modify the build system to look for files in **emscripten/system** or **emscripten/system/bin** in order to use the Emscripten *sdl-config*. -Projects that depend on SDL should use the Emscripten version of *sdl-config*, which is present in `system/bin `_. Using the native *sdl-config* may result in compilation or missing-symbol errors. +Adding more ports +----------------- -.. note:: Modify the build system to look for files in **emscripten/system** or **emscripten/system/bin** in order to use SDL properly (the approach will be build system-specific). +Adding more ports is fairly easy. Basically, the steps are + * Make sure the port is open source and has a suitable license. + * Add it to emscripten-ports on github. The ports maintainers can create the repo and add the relevant developers to a team for that repo, so they have write access. + * Add a script to handle it under ``tools/ports/`` (see existing code for examples) and use it in ``tools/ports/__init__.py``. + * Add testing in the test suite. Build system issues From c16230cd4aa80bf75a405f0988859d57923fb6c8 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 20 Oct 2014 14:30:24 -0700 Subject: [PATCH 410/461] fix sdl*_canvas_twice tests, and enable in sdl2 --- tests/sdl2_canvas_twice.c | 2 -- tests/sdl_canvas_twice.c | 2 -- tests/test_browser.py | 2 +- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/tests/sdl2_canvas_twice.c b/tests/sdl2_canvas_twice.c index 8c7a9ad328375..6794c9c834ac9 100644 --- a/tests/sdl2_canvas_twice.c +++ b/tests/sdl2_canvas_twice.c @@ -30,7 +30,5 @@ int main(int argc, char **argv) { SDL_RenderCopy(renderer, screenTexture, NULL, NULL); SDL_RenderPresent(renderer); - while(1) { SDL_WaitEvent(NULL); } - return 0; } diff --git a/tests/sdl_canvas_twice.c b/tests/sdl_canvas_twice.c index ba62846bfeb55..55e1610effe0a 100644 --- a/tests/sdl_canvas_twice.c +++ b/tests/sdl_canvas_twice.c @@ -20,7 +20,5 @@ int main(int argc, char **argv) { SDL_Flip(screen); - while(1) { SDL_WaitEvent(NULL); } - return 0; } diff --git a/tests/test_browser.py b/tests/test_browser.py index dd738f9e5b48f..95d4a64a77668 100644 --- a/tests/test_browser.py +++ b/tests/test_browser.py @@ -2276,7 +2276,7 @@ def test_sdl2_canvas_blank(self): def test_sdl2_canvas_palette(self): self.btest('sdl2_canvas_palette.c', reference='sdl_canvas_palette.png', args=['-s', 'USE_SDL=2']) - def zzztest_sdl2_canvas_twice(self): + def test_sdl2_canvas_twice(self): self.btest('sdl2_canvas_twice.c', reference='sdl_canvas_twice.png', args=['-s', 'USE_SDL=2']) def zzztest_sdl2_gfx_primitives(self): From c506e30bf78c1488b511392e257798571744d92e Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 20 Oct 2014 15:16:41 -0700 Subject: [PATCH 411/461] clean up deprecated emscripten_set_network_backend; fixes #2899 --- .../docs/api_reference/emscripten.h.rst | 32 ------------------- system/include/emscripten/emscripten.h | 4 --- 2 files changed, 36 deletions(-) diff --git a/site/source/docs/api_reference/emscripten.h.rst b/site/source/docs/api_reference/emscripten.h.rst index c21b69a906413..6af650e895047 100644 --- a/site/source/docs/api_reference/emscripten.h.rst +++ b/site/source/docs/api_reference/emscripten.h.rst @@ -852,38 +852,6 @@ Functions :rtype: char* - -Networking backend -================== - -Defines -------- - -.. c:macro:: EMSCRIPTEN_NETWORK_WEBSOCKETS - - Used to select the websockets networking backend in :c:func:`emscripten_set_network_backend` - -.. c:macro:: EMSCRIPTEN_NETWORK_WEBRTC - - Used to select the WebRTC networking backend in :c:func:`emscripten_set_network_backend` - - -Functions ---------- - -.. c:function:: void emscripten_set_network_backend(int backend) - - Selects the networking backend to use. - - .. note:: - - This function must be called before any network functions are called. - - By default Emscripten's socket/networking implementation will use websockets. With this function you can change that to WebRTC. - - :param int backend: The backend to use. One of :c:macro:`EMSCRIPTEN_NETWORK_WEBSOCKETS` and :c:macro:`EMSCRIPTEN_NETWORK_WEBRTC` - - - .. _emscripten-api-reference-sockets: Socket event registration diff --git a/system/include/emscripten/emscripten.h b/system/include/emscripten/emscripten.h index a2b271276cc3d..c244389b5d18f 100644 --- a/system/include/emscripten/emscripten.h +++ b/system/include/emscripten/emscripten.h @@ -182,10 +182,6 @@ void emscripten_worker_respond_provisionally(char *data, int size); int emscripten_get_worker_queue_size(worker_handle worker); -#define EMSCRIPTEN_NETWORK_WEBSOCKETS 0 -#define EMSCRIPTEN_NETWORK_WEBRTC 1 -void emscripten_set_network_backend(int backend); - int emscripten_get_compiler_setting(const char *name); void emscripten_debugger(); From eaf39dda91a806d0f98efde577e1961fe6fc4dda Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 20 Oct 2014 16:34:30 -0700 Subject: [PATCH 412/461] comment on test_sdl2_canvas_proxy --- tests/test_browser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_browser.py b/tests/test_browser.py index 95d4a64a77668..f7efba5a2c773 100644 --- a/tests/test_browser.py +++ b/tests/test_browser.py @@ -2328,7 +2328,7 @@ def test_sdl2_image_prepare(self): shutil.copyfile(path_from_root('tests', 'screenshot.jpg'), os.path.join(self.get_dir(), 'screenshot.not')) self.btest('sdl2_image_prepare.c', reference='screenshot.jpg', args=['--preload-file', 'screenshot.not', '-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2']) - def zzztest_sdl2_canvas_proxy(self): + def zzztest_sdl2_canvas_proxy(self): # TODO passes if you force postRAF to be fired. We need to find a proper place tp do that in SDL2 (SDL1 does it in unlocking of the screen) def post(): html = open('test.html').read() html = html.replace('', ''' From 7da90b4da37e16a42c217af853239295ec7593ce Mon Sep 17 00:00:00 2001 From: Aidan Hobson Sayers Date: Tue, 21 Oct 2014 01:08:49 +0100 Subject: [PATCH 413/461] Remove non-breaking space (c2a0) --- src/library_glfw.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/library_glfw.js b/src/library_glfw.js index 646a7a809df71..73b6f4980161b 100644 --- a/src/library_glfw.js +++ b/src/library_glfw.js @@ -576,7 +576,7 @@ var LibraryGLFW = { if (GLFW.active.id == win.id) { if (width == screen.width && height == screen.height) { GLFW.requestFullScreen(); - } else { + } else { GLFW.cancelFullScreen(); Browser.setCanvasSize(width, height); win.width = width; From 9f919517d0dfdec8889bdc7050b9fb38dd49ca6c Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 20 Oct 2014 17:26:47 -0700 Subject: [PATCH 414/461] use Browser.doSwapBuffers in egl --- src/library_egl.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/library_egl.js b/src/library_egl.js index 5ba506fc6361f..17abd4a3962cc 100644 --- a/src/library_egl.js +++ b/src/library_egl.js @@ -561,6 +561,10 @@ var LibraryEGL = { // EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surface); eglSwapBuffers: function() { +#if PROXY_TO_WORKER + if (Browser.doSwapBuffers) Browser.doSwapBuffers(); +#endif + if (!EGL.defaultDisplayInitialized) { EGL.setErrorCode(0x3001 /* EGL_NOT_INITIALIZED */); } else if (!Module.ctx) { From 466c38778334978a12f4c9c3a446bcec15e239ab Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 20 Oct 2014 17:27:58 -0700 Subject: [PATCH 415/461] enable fixed test_sdl2_canvas_proxy --- tests/sdl2_canvas.png | Bin 0 -> 4482 bytes tests/test_browser.py | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 tests/sdl2_canvas.png diff --git a/tests/sdl2_canvas.png b/tests/sdl2_canvas.png new file mode 100644 index 0000000000000000000000000000000000000000..2cb4652f0144db9d5a05f7c3d821cbc733b1cdef GIT binary patch literal 4482 zcmeAS@N?(olHy`uVBq!ia0y~yV2WU1U_8XZ1{5(a-k!q1An57o;uumf=j~0$wF>S6 zE(gz_oHOlEkO6D3fmrb-%_|2NFZVmD_^#B$wzsOT?*HHC`x*3qeEpu^p#JB|!IWUz zoQBoArsw=x+0I)K%0Aim>$;myn7jQ!QhT!-wD)uTbb%`Q)WmADm``o?tJuva*~R9s zXg;~D>N-Pso#3a=sv8X9rTRCYuyR+p$@-XG-JLd>U&k&GY#igdKT1!8ziwb$_bP7F zNp7(ZJytVvR+XPslaHub1U8O2=BMik^;e0^F<1AdOcvL9AX#c~Gvxg&U%L%IT)@V$ z?fBF^!T-u(wjHagPpauh958;BuxaHz)7do%A3MRu@fJK4SDe2B3c$Y=@~%`zeHN6Qd!wLr&0^~dAy_8<2D{`pn>fHbg>)|59p5C|-s|AOlR za1GRRia#L;QcGB@28z_&U~osRi$dxcCPNGONT9-}huJJptC7W@m}i7QDywrymLO^X z$*J-OmO$&7FrdPp8yNdgYqJ%97}Typ>dehRg{OcOQ3y&!uhmC`Vl*g5 zGYGhaK3Z0c7Msu>)iAC>R?nCJ;Z(=KaA4LS28IUHpNtF)*`Jsh7_L2GXJA-!lAnPg uVzN8~!v-~b28IORQH7(ygPtf()vtAkul&De@@nAN3WKMspUXO@geCwnnfDj~ literal 0 HcmV?d00001 diff --git a/tests/test_browser.py b/tests/test_browser.py index f7efba5a2c773..30d2785fdd577 100644 --- a/tests/test_browser.py +++ b/tests/test_browser.py @@ -2328,7 +2328,7 @@ def test_sdl2_image_prepare(self): shutil.copyfile(path_from_root('tests', 'screenshot.jpg'), os.path.join(self.get_dir(), 'screenshot.not')) self.btest('sdl2_image_prepare.c', reference='screenshot.jpg', args=['--preload-file', 'screenshot.not', '-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2']) - def zzztest_sdl2_canvas_proxy(self): # TODO passes if you force postRAF to be fired. We need to find a proper place tp do that in SDL2 (SDL1 does it in unlocking of the screen) + def test_sdl2_canvas_proxy(self): def post(): html = open('test.html').read() html = html.replace('', ''' @@ -2351,7 +2351,7 @@ def post(): open('data.txt', 'w').write('datum') - self.btest('sdl2_canvas_proxy.c', reference='sdl_canvas_proxy.png', args=['-s', 'USE_SDL=2', '--proxy-to-worker', '--preload-file', 'data.txt'], manual_reference=True, post_build=post) + self.btest('sdl2_canvas_proxy.c', reference='sdl2_canvas.png', args=['-s', 'USE_SDL=2', '--proxy-to-worker', '--preload-file', 'data.txt', '-s', 'GL_TESTING=1'], manual_reference=True, post_build=post) def test_sdl2_pumpevents(self): # key events should be detected using SDL_PumpEvents From 86a186ab49eb243bb56d3438fa6958bda8ce6c4a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 20 Oct 2014 17:37:22 -0700 Subject: [PATCH 416/461] add proxy test for sdl2+gl --- tests/test_browser.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_browser.py b/tests/test_browser.py index 30d2785fdd577..2be83412e18b5 100644 --- a/tests/test_browser.py +++ b/tests/test_browser.py @@ -2269,6 +2269,7 @@ def test_sdl2_mouse_offsets(self): def test_sdl2glshader(self): self.btest('sdl2glshader.c', reference='sdlglshader.png', args=['-s', 'USE_SDL=2', '-O2', '--closure', '1', '-s', 'LEGACY_GL_EMULATION=1']) + self.btest('sdl2glshader.c', reference='sdlglshader.png', args=['-s', 'USE_SDL=2', '-O2', '-s', 'LEGACY_GL_EMULATION=1'], also_proxied=True) # XXX closure fails on proxy def test_sdl2_canvas_blank(self): self.btest('sdl2_canvas_blank.c', reference='sdl_canvas_blank.png', args=['-s', 'USE_SDL=2']) From a32fe71a4bb3cc15b2f49779f652e5488491d29f Mon Sep 17 00:00:00 2001 From: Bruce Mitchener Date: Tue, 21 Oct 2014 08:41:14 +0700 Subject: [PATCH 417/461] [embind] Fix benchmark to build again. Make up for the last year of API changes. --- tests/embind/embind_benchmark.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/embind/embind_benchmark.cpp b/tests/embind/embind_benchmark.cpp index 5ae9a6be7a302..c625abb241765 100644 --- a/tests/embind/embind_benchmark.cpp +++ b/tests/embind/embind_benchmark.cpp @@ -181,7 +181,7 @@ class InterfaceWrapper : public emscripten::wrapper void call_with_memory_view(size_t size, const void* data) { return call( call_with_memory_view_symbol, - emscripten::memory_view(size, data)); + emscripten::typed_memory_view(size, data)); } }; @@ -246,11 +246,11 @@ EMSCRIPTEN_BINDINGS(benchmark) using namespace emscripten; class_("GameObject") - .smart_ptr() + .smart_ptr("GameObjectPtr") .function("GetTransform", &GameObject::GetTransform); class_("Transform") - .smart_ptr() + .smart_ptr("TransformPtr") .function("GetPosition", &Transform::GetPosition) .function("GetRotation", &Transform::GetRotation) .function("GetScale", &Transform::GetScale) @@ -258,7 +258,7 @@ EMSCRIPTEN_BINDINGS(benchmark) .function("SetRotation", &Transform::SetRotation) .function("SetScale", &Transform::SetScale); - value_tuple("Vec3") + value_array("Vec3") .element(&Vec3::x) .element(&Vec3::y) .element(&Vec3::z); @@ -281,7 +281,7 @@ EMSCRIPTEN_BINDINGS(benchmark) ; class_("Interface") - .allow_subclass() + .allow_subclass("InterfaceWrapper") ; function("callInterface0", &callInterface0); From ef315f125b81b716d904edd9dbbaffdadc0262de Mon Sep 17 00:00:00 2001 From: Chad Austin Date: Mon, 20 Oct 2014 13:24:41 -0700 Subject: [PATCH 418/461] Require that all wrapper type smart pointers are given a name. This gives better error messages sometime. --- system/include/emscripten/bind.h | 47 ++++++++++++++++---------------- tests/embind/embind_test.cpp | 4 +-- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/system/include/emscripten/bind.h b/system/include/emscripten/bind.h index 0cf5ac16981b6..09eea2fbba7a9 100644 --- a/system/include/emscripten/bind.h +++ b/system/include/emscripten/bind.h @@ -994,21 +994,6 @@ namespace emscripten { }; namespace internal { - template - struct SmartPtrIfNeeded { - template - SmartPtrIfNeeded(U& cls, const char* smartPtrName) { - cls.template smart_ptr(smartPtrName); - } - }; - - template - struct SmartPtrIfNeeded { - template - SmartPtrIfNeeded(U&, const char*) { - } - }; - template val wrapped_extend(const std::string& name, const val& properties) { return val::take_ownership(_embind_create_inheriting_constructor( @@ -1155,11 +1140,10 @@ namespace emscripten { return *this; } - template + template EMSCRIPTEN_ALWAYS_INLINE const class_& allow_subclass( const char* wrapperClassName, - const char* pointerName = "", - ::emscripten::constructor = ::emscripten::constructor() + ::emscripten::constructor = ::emscripten::constructor<>() ) const { using namespace internal; @@ -1168,12 +1152,11 @@ namespace emscripten { wrapper.setNotifyJSOnDestruction(true); })) ; - SmartPtrIfNeeded _(cls, pointerName); return class_function( "implement", - &wrapped_new, + &wrapped_new, allow_raw_pointer()) .class_function( "extend", @@ -1181,12 +1164,30 @@ namespace emscripten { ; } - template + template EMSCRIPTEN_ALWAYS_INLINE const class_& allow_subclass( const char* wrapperClassName, - ::emscripten::constructor constructor + const char* pointerName, + ::emscripten::constructor = ::emscripten::constructor<>() ) const { - return allow_subclass(wrapperClassName, "", constructor); + using namespace internal; + + auto cls = class_>(wrapperClassName) + .function("notifyOnDestruction", select_overload([](WrapperType& wrapper) { + wrapper.setNotifyJSOnDestruction(true); + })) + .template smart_ptr(pointerName) + ; + + return + class_function( + "implement", + &wrapped_new, + allow_raw_pointer()) + .class_function( + "extend", + &wrapped_extend) + ; } template diff --git a/tests/embind/embind_test.cpp b/tests/embind/embind_test.cpp index c12d15e6f42d1..358c588844a8d 100644 --- a/tests/embind/embind_test.cpp +++ b/tests/embind/embind_test.cpp @@ -1282,7 +1282,7 @@ EMSCRIPTEN_BINDINGS(interface_tests) { class_>("HeldAbstractClass") .smart_ptr>("shared_ptr") - .allow_subclass>("HeldAbstractClassWrapper") + .allow_subclass>("HeldAbstractClassWrapper", "HeldAbstractClassWrapperPtr") .function("method", &HeldAbstractClass::method, pure_virtual()) ; function("passHeldAbstractClass", &passHeldAbstractClass); @@ -2655,7 +2655,7 @@ struct Holder { EMSCRIPTEN_BINDINGS(intrusive_pointers) { class_("IntrusiveClass") .smart_ptr_constructor("intrusive_ptr", &make_intrusive_ptr) - .allow_subclass>("IntrusiveClassWrapper") + .allow_subclass>("IntrusiveClassWrapper", "IntrusiveClassWrapperPtr") ; typedef Holder> IntrusiveClassHolder; From 11a5edd150503cf18a8e1da48d3b0fba2369dff8 Mon Sep 17 00:00:00 2001 From: Bruce Mitchener Date: Tue, 21 Oct 2014 09:40:48 +0700 Subject: [PATCH 419/461] [embind] Update docs for API change to allow_subclass. --- site/source/docs/api_reference/bind.h.rst | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/site/source/docs/api_reference/bind.h.rst b/site/source/docs/api_reference/bind.h.rst index 0a6b5349ba170..12371d08eb84e 100644 --- a/site/source/docs/api_reference/bind.h.rst +++ b/site/source/docs/api_reference/bind.h.rst @@ -710,17 +710,18 @@ Classes .. code-block:: cpp //prototype - template + template EMSCRIPTEN_ALWAYS_INLINE const class_& allow_subclass( const char* wrapperClassName, - const char* pointerName = "", - ::emscripten::constructor = ::emscripten::constructor() + const char* pointerName, + ::emscripten::constructor = ::emscripten::constructor<>() ) const **HamishW** Add description. :param const char* wrapperClassName: **HamishW** Add description. - :param const char* pointerName: **HamishW** Add description. Note that this has a default value which is dependent on the template typename parameters. + :param const char* pointerName: **HamishW** Add description. + :param ::emscripten::constructor constructor): **HamishW** Add description. :returns: |class_-function-returns| @@ -732,7 +733,7 @@ Classes template EMSCRIPTEN_ALWAYS_INLINE const class_& allow_subclass( const char* wrapperClassName, - ::emscripten::constructor constructor + ::emscripten::constructor constructor = ::emscripten::constructor<>() ) const **HamishW** Add description. Explain how this constructor differs from other one. From eab2b940bc4709ee7923bfe8ed46e404d0b188e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jukka=20Jyl=C3=A4nki?= Date: Tue, 21 Oct 2014 14:09:05 +0300 Subject: [PATCH 420/461] test_emterpreter requires SpiderMonkey to run. --- tests/test_other.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_other.py b/tests/test_other.py index cb9569765a812..f9eeb841023df 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4168,6 +4168,8 @@ def test_stat_fail_alongtheway(self): def test_emterpreter(self): + if SPIDERMONKEY_ENGINE not in JS_ENGINES: return self.skip('test_emterpreter requires SpiderMonkey to run.') + def do_emcc_test(source, args, output, emcc_args=[]): print print 'emcc', source[:40], '\n' in source From daa07e7a27c8c91e949ca12152d4ce4c7f3d1f5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jukka=20Jyl=C3=A4nki?= Date: Tue, 21 Oct 2014 14:14:09 +0300 Subject: [PATCH 421/461] Fix test other.test_emterpreter on Windows (failed due to \r\n vs \n differences). --- tests/runner.py | 5 +++++ tests/test_other.py | 14 +++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/tests/runner.py b/tests/runner.py index 49f49871d9d35..9dc5222a20c1d 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -321,6 +321,11 @@ def assertIdentical(self, values, y): limit_size(''.join([a.rstrip()+'\n' for a in difflib.unified_diff(x.split('\n'), y.split('\n'), fromfile='expected', tofile='actual')])) )) + def assertTextDataContained(self, text1, text2): + text1 = text1.replace('\r\n', '\n') + text2 = text2.replace('\r\n', '\n') + return self.assertContained(text1, text2) + def assertContained(self, values, string, additional_info=''): if type(values) not in [list, tuple]: values = [values] for value in values: diff --git a/tests/test_other.py b/tests/test_other.py index f9eeb841023df..ad2073c5d797b 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4180,9 +4180,9 @@ def do_emcc_test(source, args, output, emcc_args=[]): else: source = path_from_root('tests', source) Popen([PYTHON, EMCC, source, '-O2', '-s', 'EMTERPRETIFY=1', '-g2'] + emcc_args).communicate() - self.assertContained(output, run_js('a.out.js', args=args)) + self.assertTextDataContained(output, run_js('a.out.js', args=args)) out = run_js('a.out.js', engine=SPIDERMONKEY_ENGINE, args=args, stderr=PIPE, full_output=True) - self.assertContained(output, out) + self.assertTextDataContained(output, out) self.validate_asmjs(out) # -g2 enables these src = open('a.out.js').read() @@ -4206,10 +4206,10 @@ def do_test(source, args, output): source = path_from_root('tests', source) Popen([PYTHON, EMCC, source, '-O2', '--profiling', '-s', 'FINALIZE_ASM_JS=0', '-s', 'GLOBAL_BASE=2048']).communicate() Popen([PYTHON, path_from_root('tools', 'emterpretify.py'), 'a.out.js', 'em.out.js']).communicate() - self.assertContained(output, run_js('a.out.js', args=args)) - self.assertContained(output, run_js('em.out.js', args=args)) + self.assertTextDataContained(output, run_js('a.out.js', args=args)) + self.assertTextDataContained(output, run_js('em.out.js', args=args)) out = run_js('em.out.js', engine=SPIDERMONKEY_ENGINE, args=args, stderr=PIPE, full_output=True) - self.assertContained(output, out) + self.assertTextDataContained(output, out) self.validate_asmjs(out) # generate default shell for js test @@ -4231,8 +4231,8 @@ def do_js_test(name, source, args, output): open('a.out.js.mem', 'wb').write(default_mem) Popen([PYTHON, path_from_root('tools', 'emterpretify.py'), 'a.out.js', 'em.out.js']).communicate() sm_no_warn = filter(lambda x: x != '-w', SPIDERMONKEY_ENGINE) - self.assertContained(output, run_js('a.out.js', engine=sm_no_warn, args=args)) # run in spidermonkey for print() - self.assertContained(output, run_js('em.out.js', engine=sm_no_warn, args=args)) + self.assertTextDataContained(output, run_js('a.out.js', engine=sm_no_warn, args=args)) # run in spidermonkey for print() + self.assertTextDataContained(output, run_js('em.out.js', engine=sm_no_warn, args=args)) do_emcc_test('hello_world.c', [], 'hello, world!') From 6d01cebd83b52dc237aafc63f874ec4da36d75b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jukka=20Jyl=C3=A4nki?= Date: Tue, 21 Oct 2014 17:46:58 +0300 Subject: [PATCH 422/461] Add a reference to a symbol that exists in src/deps_info.json to uncover issue #2836 in the test suite. --- tests/test_core.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_core.py b/tests/test_core.py index 97f34007403db..1821192c3396e 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -6003,6 +6003,7 @@ def test_exported_response(self): int main() { int x = EM_ASM_INT_V({ return Module._other_function() }); + emscripten_run_script_string(""); // Add a reference to a symbol that exists in src/deps_info.json to uncover issue #2836 in the test suite. printf("waka %d!\n", x); return 0; } From 957344d84125c4a830620e9f933f8cf8aebddc55 Mon Sep 17 00:00:00 2001 From: Aleksander Guryanov Date: Tue, 21 Oct 2014 23:08:20 +0700 Subject: [PATCH 423/461] Fix wrong implementation of SDL_DisplayFormatAlpha Replace SDL.SDL_ConvertSurface to _SDL_ConvertSurface --- src/library_sdl.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/library_sdl.js b/src/library_sdl.js index d74cf4c928513..d47f84fc91016 100644 --- a/src/library_sdl.js +++ b/src/library_sdl.js @@ -1700,7 +1700,7 @@ var LibrarySDL = { SDL_DisplayFormatAlpha__deps: ['SDL_ConvertSurface'], SDL_DisplayFormatAlpha: function(surf) { - return SDL.SDL_ConvertSurface(surf); + return _SDL_ConvertSurface(surf); }, SDL_FreeSurface: function(surf) { From 386e0f810d68c5175a91a2ad0071b532bc421b3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jukka=20Jyl=C3=A4nki?= Date: Tue, 21 Oct 2014 19:16:53 +0300 Subject: [PATCH 424/461] Add a help message if user system is missing PyWin32 when running emrun on Windows. --- emrun | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/emrun b/emrun index 70e76b52e7632..3d0950b40c073 100755 --- a/emrun +++ b/emrun @@ -51,13 +51,16 @@ LINUX = False OSX = False if os.name == 'nt': WINDOWS = True - - import win32api, _winreg - from win32com.client import GetObject - from win32api import GetFileVersionInfo, LOWORD, HIWORD - import shlex - from _winreg import HKEY_CURRENT_USER, OpenKey, QueryValue - + try: + import shlex + import win32api, _winreg + from win32com.client import GetObject + from win32api import GetFileVersionInfo, LOWORD, HIWORD + from _winreg import HKEY_CURRENT_USER, OpenKey, QueryValue + except Exception, e: + print >> sys.stderr, str(e) + print >> sys.stderr, "Importing Python win32 modules failed! This most likely occurs if you do not have PyWin32 installed! Get it from http://sourceforge.net/projects/pywin32/" + sys.exit(1) elif platform.system() == 'Linux': LINUX = True elif platform.mac_ver()[0] != '': From 6db79ca041d1014b96ce6af055fc147a5a7ebdce Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 21 Oct 2014 11:16:51 -0700 Subject: [PATCH 425/461] add versioning logic to ports --- tools/ports/sdl.py | 4 +++- tools/ports/sdl_image.py | 4 +++- tools/system_libs.py | 41 +++++++++++++++++++++++++++++++++++++--- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/tools/ports/sdl.py b/tools/ports/sdl.py index c1b78841e557e..702dad2a9c6e8 100644 --- a/tools/ports/sdl.py +++ b/tools/ports/sdl.py @@ -1,8 +1,10 @@ import os, shutil +VERSION = 1 + def get(ports, settings, shared): if settings.USE_SDL == 2: - ports.fetch_project('sdl2', 'https://github.com/emscripten-ports/SDL2/archive/master.zip') + ports.fetch_project('sdl2', 'https://github.com/emscripten-ports/SDL2/archive/master.zip', VERSION) def setup_includes(): # copy includes to a location so they can be used as 'SDL2/' include_path = os.path.join(shared.Cache.get_path('ports-builds'), 'sdl2', 'include') diff --git a/tools/ports/sdl_image.py b/tools/ports/sdl_image.py index eaaed833eb50b..437790bddbd32 100644 --- a/tools/ports/sdl_image.py +++ b/tools/ports/sdl_image.py @@ -1,10 +1,12 @@ import os, shutil +VERSION = 1 + def get(ports, settings, shared): if settings.USE_SDL_IMAGE == 2: sdl_build = os.path.join(ports.get_build_dir(), 'sdl2') assert os.path.exists(sdl_build), 'You must use SDL2 to use SDL2_image' - ports.fetch_project('sdl2-image', 'https://github.com/emscripten-ports/SDL2_image/archive/master.zip') + ports.fetch_project('sdl2-image', 'https://github.com/emscripten-ports/SDL2_image/archive/master.zip', VERSION) def create(): shutil.copyfile(os.path.join(ports.get_dir(), 'sdl2-image', 'SDL2_image-master', 'SDL_image.h'), os.path.join(ports.get_build_dir(), 'sdl2', 'include', 'SDL_image.h')) shutil.copyfile(os.path.join(ports.get_dir(), 'sdl2-image', 'SDL2_image-master', 'SDL_image.h'), os.path.join(ports.get_build_dir(), 'sdl2', 'include', 'SDL2', 'SDL_image.h')) diff --git a/tools/system_libs.py b/tools/system_libs.py index 2106f77ff905a..30b3d5534b22e 100644 --- a/tools/system_libs.py +++ b/tools/system_libs.py @@ -604,7 +604,7 @@ def get_build_dir(): name_cache = set() @staticmethod - def fetch_project(name, url): + def fetch_project(name, url, expected_version): fullname = os.path.join(Ports.get_dir(), name) if name not in Ports.name_cache: # only mention each port once in log @@ -612,14 +612,19 @@ def fetch_project(name, url): logging.debug(' (at ' + fullname + ')') Ports.name_cache.add(name) - if not os.path.exists(fullname + '.zip'): + class State: + retrieved = False + unpacked = False + + def retrieve(): logging.warning('retrieving port: ' + name + ' from ' + url) import urllib2 f = urllib2.urlopen(url) data = f.read() open(fullname + '.zip', 'wb').write(data) + State.retrieved = True - if not os.path.exists(fullname): + def unpack(): logging.warning('unpacking port: ' + name) import zipfile shared.safe_ensure_dirs(fullname) @@ -630,7 +635,37 @@ def fetch_project(name, url): z.extractall() finally: os.chdir(cwd) + State.unpacked = True + + def check_version(expected_version): + try: + ok = False + subdir = os.listdir(fullname)[0] # each port has a singleton subdir + version = open(os.path.join(fullname, subdir, 'version.txt')).read() + version = int(version) + ok = True + finally: + if not ok: logging.error('error when checking port version for ' + name) + return version >= expected_version + + # main logic + if not os.path.exists(fullname + '.zip'): + retrieve() + + if not os.path.exists(fullname): + unpack() + + if not check_version(expected_version): + # fetch a newer version + assert not State.retrieved, 'just retrieved port ' + name + ', but not a new enough version?' + shared.try_delete(fullname) + shared.try_delete(fullname + '.zip') + retrieve() + assert check_version(expected_version), 'just retrieved replacement port ' + name + ', but not a new enough version?' + unpack() + + if State.unpacked: # we unpacked a new version, clear the build in the cache shared.try_delete(os.path.join(Ports.get_build_dir(), name)) shared.try_delete(shared.Cache.get_path(name + '.bc')) From 1d881c7d93fec1350c32a67e9efb651794b83ec6 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 21 Oct 2014 11:21:22 -0700 Subject: [PATCH 426/461] allow --clear-cache and --clear-ports in the same command --- emcc | 9 +++++++-- tools/system_libs.py | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/emcc b/emcc index 804adb7793726..c44a7d1a3f7fb 100755 --- a/emcc +++ b/emcc @@ -456,6 +456,8 @@ try: raise Exception(err_msg) return level + should_exit = False + for i in range(len(newargs)): newargs[i] = newargs[i].strip() # On Windows Vista (and possibly others), excessive spaces in the command line leak into the items in this array, so trim e.g. 'foo.cpp ' -> 'foo.cpp' if newargs[i].startswith('-O'): @@ -626,11 +628,11 @@ try: logging.warning('clearing cache') shared.Cache.erase() shared.check_sanity(force=True) # this is a good time for a sanity check - sys.exit(0) + should_exit = True elif newargs[i] == '--clear-ports': logging.warning('clearing ports') system_libs.Ports.erase() - sys.exit(0) + should_exit = True elif newargs[i] == '--save-bc': check_bad_eq(newargs[i]) save_bc = newargs[i+1] @@ -663,6 +665,9 @@ try: default_object_extension = '.' + default_object_extension newargs[i+1] = '' + if should_exit: + sys.exit(0) + newargs = [arg for arg in newargs if arg is not ''] # If user did not specify a default -std for C++ code, specify the emscripten default. diff --git a/tools/system_libs.py b/tools/system_libs.py index 30b3d5534b22e..a052a789bdd70 100644 --- a/tools/system_libs.py +++ b/tools/system_libs.py @@ -695,7 +695,7 @@ def get_ports(settings): ok = True finally: if not ok: - logging.error('a problem occurred when using an emscripten-ports library. try to run emcc --clear-cache , emcc --clear-ports , and then run this command again') + logging.error('a problem occurred when using an emscripten-ports library. try to run emcc --clear-cache --clear-ports and then run this command again') return ret From a7659ccb6026c929c7bb9cf5fe36aa78a1a878ab Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 21 Oct 2014 13:17:27 -0700 Subject: [PATCH 427/461] add emcc --show-ports --- emcc | 3 +++ site/source/docs/tools_reference/emcc.rst | 9 ++++++++- tests/test_sanity.py | 9 +++++++++ tools/ports/sdl.py | 3 +++ tools/ports/sdl_image.py | 2 ++ tools/system_libs.py | 5 +++++ 6 files changed, 30 insertions(+), 1 deletion(-) diff --git a/emcc b/emcc index c44a7d1a3f7fb..aa4e4b8c17e86 100755 --- a/emcc +++ b/emcc @@ -633,6 +633,9 @@ try: logging.warning('clearing ports') system_libs.Ports.erase() should_exit = True + elif newargs[i] == '--show-ports': + system_libs.show_ports() + should_exit = True elif newargs[i] == '--save-bc': check_bad_eq(newargs[i]) save_bc = newargs[i+1] diff --git a/site/source/docs/tools_reference/emcc.rst b/site/source/docs/tools_reference/emcc.rst index 9ab4f45afc0e1..d01394d4059a6 100644 --- a/site/source/docs/tools_reference/emcc.rst +++ b/site/source/docs/tools_reference/emcc.rst @@ -371,10 +371,17 @@ Options that are modified or new in *emcc* are listed below: .. _emcc-clear-ports: ``--clear-ports`` - Manually clears the local copies and builds of projects from the Emscripten ports repos (sdl2, etc.) + Manually clears the local copies and builds of projects from the Emscripten Ports repos (sdl2, etc.) You should only need to do this if a problem happens and you want all ports that you use to be downloaded and built from scratch. After this operation is complete, this process will exit. + +.. _emcc-show-ports: + +``--show-ports`` + Shows the list of available projects in the Emscripten Ports repos. After this operation is complete, this process will exit. +.. _emcc-save-bc: + ``--save-bc PATH`` When compiling to JavaScript or HTML, this option will save a copy of the bitcode to the specified path. The bitcode will include all files being linked after link-time optimizations have been performed (if any), including standard libraries. diff --git a/tests/test_sanity.py b/tests/test_sanity.py index 2ae8f83a97fa7..d8ffb447daf26 100644 --- a/tests/test_sanity.py +++ b/tests/test_sanity.py @@ -570,6 +570,15 @@ def test_emconfig(self): def test_emcc_ports(self): restore() + # listing ports + + out = self.do([PYTHON, EMCC, '--show-ports']) + assert 'Available ports:' in out, out + assert 'SDL2' in out, out + assert 'SDL2_image' in out, out + + # using ports + INCLUDING_MESSAGE = 'including port' RETRIEVING_MESSAGE = 'retrieving port' BUILDING_MESSAGE = 'building port' diff --git a/tools/ports/sdl.py b/tools/ports/sdl.py index 702dad2a9c6e8..dc8dd55208118 100644 --- a/tools/ports/sdl.py +++ b/tools/ports/sdl.py @@ -25,3 +25,6 @@ def process_args(ports, args, settings, shared): args += ['-Xclang', '-isystem' + os.path.join(shared.Cache.get_path('ports-builds'), 'sdl2', 'include')] return args +def show(): + return 'SDL2' + diff --git a/tools/ports/sdl_image.py b/tools/ports/sdl_image.py index 437790bddbd32..57858759c6f74 100644 --- a/tools/ports/sdl_image.py +++ b/tools/ports/sdl_image.py @@ -32,4 +32,6 @@ def process_args(ports, args, settings, shared): args += ['-Xclang', '-isystem' + os.path.join(shared.Cache.get_path('ports-builds'), 'sdl2-image', 'include')] return args +def show(): + return 'SDL2_image' diff --git a/tools/system_libs.py b/tools/system_libs.py index a052a789bdd70..d167f0377d8ce 100644 --- a/tools/system_libs.py +++ b/tools/system_libs.py @@ -704,3 +704,8 @@ def process_args(args, settings): args = port.process_args(Ports, args, settings, shared) return args +def show_ports(): + print 'Available ports:' + for port in ports.ports: + print ' ', port.show() + From 3f559b3eef97a5dbff4070e25cd9dc0a31e06cdc Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 21 Oct 2014 13:36:27 -0700 Subject: [PATCH 428/461] fix typo --- site/source/docs/compiling/Building-Projects.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/source/docs/compiling/Building-Projects.rst b/site/source/docs/compiling/Building-Projects.rst index 2cd6e04cb840b..c8a1325a9a74d 100644 --- a/site/source/docs/compiling/Building-Projects.rst +++ b/site/source/docs/compiling/Building-Projects.rst @@ -172,7 +172,7 @@ Emscripten Ports is a collection of useful libraries, ported to Emscripten. They .. code-block:: bash - /emcc tests/sdl2glshader.c -s USE_SDL=2 -s LEGACY_GL_EMULATION=1 -o sdl2.html + ./emcc tests/sdl2glshader.c -s USE_SDL=2 -s LEGACY_GL_EMULATION=1 -o sdl2.html You should see some notifications about SDL2 being used, and built if it wasn't previously. You can then view ``sdl2.html`` in your browser. From 4d036f07f47bc55aef050581f2db0a5fcca553f8 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 21 Oct 2014 13:41:34 -0700 Subject: [PATCH 429/461] mention --show-ports in docs --- site/source/docs/compiling/Building-Projects.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/source/docs/compiling/Building-Projects.rst b/site/source/docs/compiling/Building-Projects.rst index c8a1325a9a74d..424c125928665 100644 --- a/site/source/docs/compiling/Building-Projects.rst +++ b/site/source/docs/compiling/Building-Projects.rst @@ -176,7 +176,7 @@ Emscripten Ports is a collection of useful libraries, ported to Emscripten. They You should see some notifications about SDL2 being used, and built if it wasn't previously. You can then view ``sdl2.html`` in your browser. -.. note:: *SDL_image* has also been added to ports, use it with ``-s USE_SDL_IMAGE=2``. +.. note:: *SDL_image* has also been added to ports, use it with ``-s USE_SDL_IMAGE=2``. To see a list of all available ports, run ``emcc --show-ports``. .. note:: Emscripten also has support for older SDL1, which is built in. If you do not specify SDL2 as in the command above, then SDL1 is linked in and the SDL1 include paths are used. SDL1 has support for *sdl-config*, which is present in `system/bin `_. Using the native *sdl-config* may result in compilation or missing-symbol errors. You will need to modify the build system to look for files in **emscripten/system** or **emscripten/system/bin** in order to use the Emscripten *sdl-config*. From 95c2ec8fc61df9c937999597c53067ca3910e969 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 21 Oct 2014 13:43:10 -0700 Subject: [PATCH 430/461] mention license in ports --- tools/ports/sdl.py | 2 +- tools/ports/sdl_image.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/ports/sdl.py b/tools/ports/sdl.py index dc8dd55208118..e25250976438f 100644 --- a/tools/ports/sdl.py +++ b/tools/ports/sdl.py @@ -26,5 +26,5 @@ def process_args(ports, args, settings, shared): return args def show(): - return 'SDL2' + return 'SDL2 (zlib license)' diff --git a/tools/ports/sdl_image.py b/tools/ports/sdl_image.py index 57858759c6f74..0c55504940e37 100644 --- a/tools/ports/sdl_image.py +++ b/tools/ports/sdl_image.py @@ -33,5 +33,5 @@ def process_args(ports, args, settings, shared): return args def show(): - return 'SDL2_image' + return 'SDL2_image (zlib license)' From 67bec3da4d439c6bdce3369afcfe9303f93a7daa Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 21 Oct 2014 18:02:09 -0700 Subject: [PATCH 431/461] parse out current version number in sphinx conf.py --- site/source/conf.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/site/source/conf.py b/site/source/conf.py index 65f934205fab2..cf2e4e313362b 100644 --- a/site/source/conf.py +++ b/site/source/conf.py @@ -89,10 +89,13 @@ # |version| and |release|, also used in various other places throughout the # built documents. # + +emscripten_version = open(os.path.abspath(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), 'emscripten-version.txt'))).read().strip() + # The short X.Y version. -version = '1.23' +version = emscripten_version[:emscripten_version.rindex('.')] # The full version, including alpha/beta/rc tags. -release = '1.23.0' +release = emscripten_version # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From e8ff8f2ad87a939bf50f17a75ba8d3e3a67a50eb Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 21 Oct 2014 18:02:19 -0700 Subject: [PATCH 432/461] add proper title to main page --- site/source/index.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/site/source/index.rst b/site/source/index.rst index 3790fd5617055..f8981258d99b1 100644 --- a/site/source/index.rst +++ b/site/source/index.rst @@ -1,3 +1,5 @@ +.. title:: Main + .. _home-page: .. only:: sdkbuild From 5fce62d93c899049b020c4e21d29b15ab288b0be Mon Sep 17 00:00:00 2001 From: Bruce Mitchener Date: Wed, 22 Oct 2014 13:26:24 +0700 Subject: [PATCH 433/461] [embind] Minimum RESERVED_FUNCITON_POINTERS not needed. embind no longer calls Runtime.addFunction(), so a minimum number of RESERVED_FUNCTION_POINTERS are no longer needed. --- emcc | 2 -- 1 file changed, 2 deletions(-) diff --git a/emcc b/emcc index aa4e4b8c17e86..0f746f5c02426 100755 --- a/emcc +++ b/emcc @@ -916,8 +916,6 @@ try: if shared.Settings.ASM_JS: assert opt_level >= 1 or fastcomp, 'asm.js requires -O1 or above' - if bind: - shared.Settings.RESERVED_FUNCTION_POINTERS = max(shared.Settings.RESERVED_FUNCTION_POINTERS, 10) if shared.Settings.CORRECT_SIGNS != 1: logging.warning('setting CORRECT_SIGNS to 1 for asm.js code generation') shared.Settings.CORRECT_SIGNS = 1 From 33e44f582c71e341cc6ca5c9a3de9839ceb68f63 Mon Sep 17 00:00:00 2001 From: Bruce Mitchener Date: Wed, 22 Oct 2014 16:00:56 +0700 Subject: [PATCH 434/461] [docs] Sanitize whitespace. (No whitespace at end of line, no tabs.) --- .../Interacting-with-code.rst | 154 +++++++++--------- 1 file changed, 76 insertions(+), 78 deletions(-) diff --git a/site/source/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.rst b/site/source/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.rst index baf3978b3e814..a2a8fac89c947 100644 --- a/site/source/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.rst +++ b/site/source/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.rst @@ -9,20 +9,20 @@ Emscripten provides numerous methods to connect and interact between JavaScript - Call compiled **C** functions from normal JavaScript: - - :ref:`Using ccall or cwrap `. - - :ref:`Using direct function calls ` (faster but more complicated). + - :ref:`Using ccall or cwrap `. + - :ref:`Using direct function calls ` (faster but more complicated). - Call compiled **C++** classes from JavaScript using bindings created with: - - :ref:`Embind or WebIDL-Binder` - + - :ref:`Embind or WebIDL-Binder` + - Call JavaScript functions from **C/C++**: - - :ref:`Using emscripten_run_script() `. - - :ref:`Using EM_ASM() ` (faster). - - :ref:`Using a C API implemented in JavaScript `. - - :ref:`As function pointers from C `. - - :ref:`Using the Embind val class `. + - :ref:`Using emscripten_run_script() `. + - :ref:`Using EM_ASM() ` (faster). + - :ref:`Using a C API implemented in JavaScript `. + - :ref:`As function pointers from C `. + - :ref:`Using the Embind val class `. - :ref:`Access compiled code memory from JavaScript `. @@ -31,7 +31,7 @@ Emscripten provides numerous methods to connect and interact between JavaScript This article explains each of the methods listed above, and provides links to more detailed information. -.. note:: For information on how compiled code interacts with the browser environment, see :ref:`emscripten-runtime-environment`. For file system related manners, see the :ref:`file-system-overview`. +.. note:: For information on how compiled code interacts with the browser environment, see :ref:`emscripten-runtime-environment`. For file system related manners, see the :ref:`file-system-overview`. .. _interacting-with-code-ccall-cwrap: @@ -39,14 +39,14 @@ This article explains each of the methods listed above, and provides links to mo Calling compiled C functions from JavaScript using ccall/cwrap ============================================================== -The easiest way to call compiled C functions from JavaScript is to use :js:func:`ccall` or :js:func:`cwrap`. +The easiest way to call compiled C functions from JavaScript is to use :js:func:`ccall` or :js:func:`cwrap`. :js:func:`ccall` calls a compiled C function with specified parameters and returns the result, while :js:func:`cwrap` "wraps" a compiled C function and returns a JavaScript function you can call normally. :js:func:`cwrap` is therefore more useful if you plan to call a compiled function a number of times. Consider the **tests/hello_function.cpp** file shown below. The ``int_sqrt()`` function to be compiled is wrapped in ``extern "C"`` to prevent C++ name mangling. .. include:: ../../../../../tests/hello_function.cpp - :literal: + :literal: To compile this code run the following command in the Emscripten home directory: @@ -54,7 +54,7 @@ To compile this code run the following command in the Emscripten home directory: ./emcc tests/hello_function.cpp -o function.html -s EXPORTED_FUNCTIONS="['_int_sqrt']" -After compiling, you can call this function with :js:func:`cwrap` using the following JavaScript: +After compiling, you can call this function with :js:func:`cwrap` using the following JavaScript: :: @@ -70,34 +70,34 @@ You can run this yourself by first opening the generated page **function.html** .. code-block:: javascript - // Call C from JavaScript - var result = Module.ccall('int_sqrt', // name of C function - 'number', // return type - ['number'], // argument types - [28]); // arguments + // Call C from JavaScript + var result = Module.ccall('int_sqrt', // name of C function + 'number', // return type + ['number'], // argument types + [28]); // arguments - // result is 5 + // result is 5 .. note:: - This example illustrates a few other points, which you should remember when using :js:func:`ccall` or :js:func:`cwrap`: + This example illustrates a few other points, which you should remember when using :js:func:`ccall` or :js:func:`cwrap`: + + - These methods can be used with compiled **C** functions — name-mangled C++ functions won't work. + - We highly recommended that you *export* functions that are to be called from JavaScript: + + - Exporting is done at compile time. For example: ``-s EXPORTED_FUNCTIONS='["_main","_other_function"]'`` exports ``main()`` and ``other_function()``. You need ``_`` at the beginning of the function names in the ``EXPORTED_FUNCTIONS`` list. + - Emscripten does :ref:`dead code elimination ` to minimize code size — exporting ensures the functions you need aren't removed. + - At higher optimisation levels (``-O2`` and above), the :term:`closure compiler` runs and minifies (changes) function names. Exporting functions allows you to continue to access them using the original name through the global ``Module`` object. + + - Use ``Module.ccall`` and not ``ccall`` by itself. The former will work at all optimisation levels (even if the :term:`Closure Compiler` minifies the function names). - - These methods can be used with compiled **C** functions — name-mangled C++ functions won't work. - - We highly recommended that you *export* functions that are to be called from JavaScript: - - - Exporting is done at compile time. For example: ``-s EXPORTED_FUNCTIONS='["_main","_other_function"]'`` exports ``main()`` and ``other_function()``. You need ``_`` at the beginning of the function names in the ``EXPORTED_FUNCTIONS`` list. - - Emscripten does :ref:`dead code elimination ` to minimize code size — exporting ensures the functions you need aren't removed. - - At higher optimisation levels (``-O2`` and above), the :term:`closure compiler` runs and minifies (changes) function names. Exporting functions allows you to continue to access them using the original name through the global ``Module`` object. - - - Use ``Module.ccall`` and not ``ccall`` by itself. The former will work at all optimisation levels (even if the :term:`Closure Compiler` minifies the function names). - .. _interacting-with-code-direct-function-calls: - + Call compiled C/C++ code "directly" from JavaScript =================================================== -Functions in the original source become JavaScript functions, so you can call them directly if you do type translations yourself — this will be faster than using :js:func:`ccall` or :js:func:`cwrap`, but a little more complicated. +Functions in the original source become JavaScript functions, so you can call them directly if you do type translations yourself — this will be faster than using :js:func:`ccall` or :js:func:`cwrap`, but a little more complicated. To call the method directly, you will need to use the full name as it appears in the generated code. This will be the same as the original C function, but with a leading ``_``. @@ -121,28 +121,28 @@ Calling JavaScript from C/C++ Emscripten provides two main approaches for calling JavaScript from C/C++: running the script using :c:func:`emscripten_run_script` or writing "inline JavaScript". -The most direct, but slightly slower, way is to use :c:func:`emscripten_run_script`. This effectively runs the specified JavaScript code from C/C++ using ``eval()``. For example, to call the browser's ``alert()`` function with the text 'hi', you would call the following JavaScript: +The most direct, but slightly slower, way is to use :c:func:`emscripten_run_script`. This effectively runs the specified JavaScript code from C/C++ using ``eval()``. For example, to call the browser's ``alert()`` function with the text 'hi', you would call the following JavaScript: .. code-block:: javascript - emscripten_run_script("alert('hi')"); + emscripten_run_script("alert('hi')"); -.. note:: The function ``alert`` is present in browsers, but not in *node* or other JavaScript shells. A more generic alternative is to call :js:func:`Module.print`. +.. note:: The function ``alert`` is present in browsers, but not in *node* or other JavaScript shells. A more generic alternative is to call :js:func:`Module.print`. A faster way to call JavaScript from C is to write "inline JavaScript", using :c:func:`EM_ASM` (and related macros). These are used in a similar manner to inline assembly code. The "alert" example above might be written using inline JavaScript as: .. code-block:: c++ - #include - - int main() { - EM_ASM( - alert('hello world!'); - throw 'all done'; - ); - return 0; - } + #include + + int main() { + EM_ASM( + alert('hello world!'); + throw 'all done'; + ); + return 0; + } When compiled and run, Emscripten will execute the two lines of JavaScript as if they appeared directly in the generated code. The result would be an alert, followed by an exception. (Note, however, that under the hood Emscripten still does a function call even in this case, which has some amount of overhead.) @@ -156,13 +156,13 @@ You can also send values from C into JavaScript inside :c:macro:`EM_ASM_`, as we }, 100); printf("%d\n", x); -.. note:: +.. note:: - - You need to specify if the return value is an ``int`` or a ``double`` using the appropriate macro :c:macro:`EM_ASM_INT` or :c:macro:`EM_ASM_DOUBLE`. - - The input values appear as ``$0``, ``$1``, etc. - - ``return`` is used to provide the value sent from JavaScript back to C. - - See how ``{`` and ``}`` are used here to enclose the code. This is necessary to differentiate the code from the arguments passed later, which are the input values (this is how C macros work). - - When using the :c:macro:`EM_ASM` macro, ensure that you only use single quotes('). Double quotes(") will cause a syntax error that is not detected by the compiler and is only shown when looking at a JavaScript console while running the offending code. + - You need to specify if the return value is an ``int`` or a ``double`` using the appropriate macro :c:macro:`EM_ASM_INT` or :c:macro:`EM_ASM_DOUBLE`. + - The input values appear as ``$0``, ``$1``, etc. + - ``return`` is used to provide the value sent from JavaScript back to C. + - See how ``{`` and ``}`` are used here to enclose the code. This is necessary to differentiate the code from the arguments passed later, which are the input values (this is how C macros work). + - When using the :c:macro:`EM_ASM` macro, ensure that you only use single quotes('). Double quotes(") will cause a syntax error that is not detected by the compiler and is only shown when looking at a JavaScript console while running the offending code. .. _implement-c-in-javascript: @@ -172,7 +172,7 @@ Implement a C API in JavaScript It is possible to implement a C API in JavaScript! This is the approach that was used to write Emscripten's implementations of :term:`SDL` and *libc*. -You can use it to write your own APIs to call from C/C++. To do this you define the interface, decorating with ``extern`` to mark the methods in the API as external symbols. You then implement the symbols in JavaScript by simply adding their definition to `library.js `_ (by default). When compiling the C code, the compiler looks in the JavaScript libraries for relevant external symbols. +You can use it to write your own APIs to call from C/C++. To do this you define the interface, decorating with ``extern`` to mark the methods in the API as external symbols. You then implement the symbols in JavaScript by simply adding their definition to `library.js `_ (by default). When compiling the C code, the compiler looks in the JavaScript libraries for relevant external symbols. By default, the implementation is added to **library.js** (and this is where you'll find the Emscripten implementation of *libc*). You can put the JavaScript implementation in your own library file and add it using the :ref:`emcc option ` ``--js-library``. See `test_js_libraries `_ in **tests/test_other.py** for a complete working example, including the syntax you should use inside the JavaScript library file. @@ -189,35 +189,35 @@ As a simple example, consider the case where you have some C code like this: .. note:: When using C++ you should encapsulate ``extern void my_js();`` in an ``extern "C" {}`` block to prevent C++ name mangling: - .. code-block:: cpp + .. code-block:: cpp - extern "C" { - extern void my_js(); - } + extern "C" { + extern void my_js(); + } Then you can implement ``my_js`` in JavaScript by simply adding the implementation to **library.js** (or your own file). Like our other examples of calling JavaScript from C, the example below just creates a dialog box using a simple ``alert()`` function. .. code-block:: javascript - my_js: function() { - alert('hi'); - }, + my_js: function() { + alert('hi'); + }, If you add it to your own file, you should write something like .. code-block:: javascript - mergeInto(LibraryManager.library, { - my_js: function() { - alert('hi'); - }, - }); + mergeInto(LibraryManager.library, { + my_js: function() { + alert('hi'); + }, + }); ``mergeInto`` just copies the properties on the second parameter onto the first, so this add ``my_js`` onto ``LibraryManager.library``, the global object where all JavaScript library code should be. See the `library_*.js `_ files for other examples. -.. note:: +.. note:: - JavaScript libraries can declare dependencies (``__deps``), however those are only for other JavaScript libraries. See examples in `/src `_ with the name format **library_*.js** - You can add dependencies for all your methods using ``autoAddDeps(myLibrary, name)`` where myLibrary is the object with all your methods, and ``name`` is the thing they all depend upon. This is useful when all the implemented methods use a JavaScript singleton containing helper methods. See ``library_gl.js`` for an example. @@ -229,7 +229,7 @@ See the `library_*.js `_ Calling JavaScript functions as function pointers from C ======================================================== -You can use ``Runtime.addFunction`` to return an integer value that represents a function pointer. Passing that integer to C code then lets it call that value as a function pointer, and the JavaScript function you sent to ``Runtime.addFunction`` will be called. +You can use ``Runtime.addFunction`` to return an integer value that represents a function pointer. Passing that integer to C code then lets it call that value as a function pointer, and the JavaScript function you sent to ``Runtime.addFunction`` will be called. See ``test_add_function`` in `tests/test_core.py `_ for an example. @@ -239,22 +239,22 @@ See ``test_add_function`` in `tests/test_core.py ` and :js:func:`setValue(ptr, value, type) `. The first argument is a pointer (a number representing a memory address). ``type`` must be an LLVM IR type, one of ``i8``, ``i16``, ``i32``, ``i64``, ``float``, ``double`` or a pointer type like ``i8*`` (or just ``*``). +You can access memory using :js:func:`getValue(ptr, type) ` and :js:func:`setValue(ptr, value, type) `. The first argument is a pointer (a number representing a memory address). ``type`` must be an LLVM IR type, one of ``i8``, ``i16``, ``i32``, ``i64``, ``float``, ``double`` or a pointer type like ``i8*`` (or just ``*``). There are examples of these functions being used in the tests — see `tests/core/test_utf.in `_ and `tests/test_core.py `_. .. note:: This is a lower-level operation than :js:func:`ccall` and :js:func:`cwrap` — we *do* need to care what specific type (e.g. integer) is being used. -You can also access memory 'directly' by manipulating the arrays that represent memory. This is not recommended unless you are sure you know what you are doing, and need the additional speed over :js:func:`getValue`/:js:func:`setValue`. +You can also access memory 'directly' by manipulating the arrays that represent memory. This is not recommended unless you are sure you know what you are doing, and need the additional speed over :js:func:`getValue`/:js:func:`setValue`. -A case where this might be required is if you want to import a large amount of data from JavaScript to be processed by compiled code. For example, the following code allocates a buffer, copies in some data, calls a C function to process the data, and finally frees the buffer. +A case where this might be required is if you want to import a large amount of data from JavaScript to be processed by compiled code. For example, the following code allocates a buffer, copies in some data, calls a C function to process the data, and finally frees the buffer. .. code-block:: javascript - var buf = Module._malloc(myTypedArray.length*myTypedArray.BYTES_PER_ELEMENT); - Module.HEAPU8.set(myTypedArray, buf); - Module.ccall('my_function', 'number', ['number'], [buf]); - Module._free(buf); + var buf = Module._malloc(myTypedArray.length*myTypedArray.BYTES_PER_ELEMENT); + Module.HEAPU8.set(myTypedArray, buf); + Module.ccall('my_function', 'number', ['number'], [buf]); + Module._free(buf); Here ``my_function`` is a C function that receives a single integer parameter (or a pointer, they are both just 32-bit integers for us) and returns an integer. This could be something like ``int my_function(char *buf)``. @@ -264,7 +264,7 @@ Here ``my_function`` is a C function that receives a single integer parameter (o Affect execution behaviour ========================== -``Module`` is a global JavaScript object, with attributes that Emscripten-generated code calls at various points in its execution. +``Module`` is a global JavaScript object, with attributes that Emscripten-generated code calls at various points in its execution. Developers provide an implementation of ``Module`` to control how notifications from Emscripten are displayed, which files that are loaded before the main loop is run, and a number of other behaviours. For more information see :ref:`module`. @@ -273,9 +273,9 @@ Developers provide an implementation of ``Module`` to control how notifications Environment variables ===================== -Sometimes compiled code needs to access environment variables (for instance, in C, by calling the ``getenv()`` function). Emscripten-generated JavaScript cannot access the computer's environment variables directly, so a "virtualised" environment is provided. +Sometimes compiled code needs to access environment variables (for instance, in C, by calling the ``getenv()`` function). Emscripten-generated JavaScript cannot access the computer's environment variables directly, so a "virtualised" environment is provided. -The JavaScript object ``ENV`` contains the virtualised environment variables, and by modifying it you can pass variables to your compiled code. Care must be taken to ensure that the ``ENV`` variable has been initialised by Emscripten before it is modified — using :js:attr:`Module.preRun` is a convenient way to do this. +The JavaScript object ``ENV`` contains the virtualised environment variables, and by modifying it you can pass variables to your compiled code. Care must be taken to ensure that the ``ENV`` variable has been initialised by Emscripten before it is modified — using :js:attr:`Module.preRun` is a convenient way to do this. For example, to set an environment variable ``MY_FILE_ROOT`` to be ``"/usr/lib/test/"`` you could add the following JavaScript to your ``Module`` :ref:`setup code `: @@ -284,11 +284,11 @@ For example, to set an environment variable ``MY_FILE_ROOT`` to be ``"/usr/lib/t Module.preRun.push(function() {ENV.MY_FILE_ROOT = "/usr/lib/test"}) .. _interacting-with-code-binding-cpp: - + Binding C++ and JavaScript — WebIDL Binder and Embind ====================================================== -The JavaScript methods for calling compiled C functions are efficient, but cannot be used with name-mangled C++ functions. +The JavaScript methods for calling compiled C functions are efficient, but cannot be used with name-mangled C++ functions. :ref:`WebIDL-Binder` and :ref:`embind` create bindings between C++ and JavaScript, allowing C++ code entities to be used in a natural manner from JavaScript. *Embind* additionally supports calling JavaScript code from C++. @@ -300,5 +300,3 @@ Both tools allow mapped items to be used from JavaScript in a similar way. Howev - *WebIDL-Binder* declares the binding in a separate file. This is run through the binder tool to create "glue" code that is then compiled with the project. .. note:: There is no strong evidence that one tool is "better" than the other in terms of performance (no comparative benchmarks exist), and both have been used successfully in a number of projects. The selection of one tool over the other will usually be based on which is the most natural fit for the project and its build system. - - From 045923a4fb486af556621a58f5052f4929292457 Mon Sep 17 00:00:00 2001 From: Bruce Mitchener Date: Wed, 22 Oct 2014 16:25:35 +0700 Subject: [PATCH 435/461] [docs] Line wrap to be sanely readable / editable. --- .../Interacting-with-code.rst | 311 ++++++++++++++---- 1 file changed, 239 insertions(+), 72 deletions(-) diff --git a/site/source/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.rst b/site/source/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.rst index a2a8fac89c947..87a41acd91c08 100644 --- a/site/source/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.rst +++ b/site/source/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.rst @@ -5,14 +5,16 @@ Interacting with code ===================== -Emscripten provides numerous methods to connect and interact between JavaScript and compiled C or C++: +Emscripten provides numerous methods to connect and interact between +JavaScript and compiled C or C++: - Call compiled **C** functions from normal JavaScript: - :ref:`Using ccall or cwrap `. - :ref:`Using direct function calls ` (faster but more complicated). -- Call compiled **C++** classes from JavaScript using bindings created with: +- Call compiled **C++** classes from JavaScript using bindings + created with: - :ref:`Embind or WebIDL-Binder` @@ -29,9 +31,12 @@ Emscripten provides numerous methods to connect and interact between JavaScript - :ref:`Affect execution behaviour `. - :ref:`Access environment variables `. -This article explains each of the methods listed above, and provides links to more detailed information. +This article explains each of the methods listed above, and provides links +to more detailed information. -.. note:: For information on how compiled code interacts with the browser environment, see :ref:`emscripten-runtime-environment`. For file system related manners, see the :ref:`file-system-overview`. +.. note:: For information on how compiled code interacts with the browser + environment, see :ref:`emscripten-runtime-environment`. For file system + related manners, see the :ref:`file-system-overview`. .. _interacting-with-code-ccall-cwrap: @@ -39,34 +44,51 @@ This article explains each of the methods listed above, and provides links to mo Calling compiled C functions from JavaScript using ccall/cwrap ============================================================== -The easiest way to call compiled C functions from JavaScript is to use :js:func:`ccall` or :js:func:`cwrap`. +The easiest way to call compiled C functions from JavaScript is to use +:js:func:`ccall` or :js:func:`cwrap`. -:js:func:`ccall` calls a compiled C function with specified parameters and returns the result, while :js:func:`cwrap` "wraps" a compiled C function and returns a JavaScript function you can call normally. :js:func:`cwrap` is therefore more useful if you plan to call a compiled function a number of times. +:js:func:`ccall` calls a compiled C function with specified parameters +and returns the result, while :js:func:`cwrap` "wraps" a compiled C +function and returns a JavaScript function you can call normally. +:js:func:`cwrap` is therefore more useful if you plan to call a compiled +function a number of times. -Consider the **tests/hello_function.cpp** file shown below. The ``int_sqrt()`` function to be compiled is wrapped in ``extern "C"`` to prevent C++ name mangling. +Consider the **tests/hello_function.cpp** file shown below. The +``int_sqrt()`` function to be compiled is wrapped in ``extern "C"`` +to prevent C++ name mangling. .. include:: ../../../../../tests/hello_function.cpp :literal: -To compile this code run the following command in the Emscripten home directory: - -:: +To compile this code run the following command in the Emscripten +home directory:: ./emcc tests/hello_function.cpp -o function.html -s EXPORTED_FUNCTIONS="['_int_sqrt']" -After compiling, you can call this function with :js:func:`cwrap` using the following JavaScript: - -:: +After compiling, you can call this function with :js:func:`cwrap` using the +following JavaScript:: int_sqrt = Module.cwrap('int_sqrt', 'number', ['number']) int_sqrt(12) int_sqrt(28) -The first parameter is the name of the function to be wrapped, the second is the return type of the function, and the third is an array of parameter types (which may be omitted if there are no parameters). The types are native JavaScript types, "number" (for a C integer, float, or general pointer) or "string" (for a C ``char*`` that represents a string). +The first parameter is the name of the function to be wrapped, the second is +the return type of the function, and the third is an array of parameter +types (which may be omitted if there are no parameters). The types are +native JavaScript types, "number" (for a C integer, float, or general +pointer) or "string" (for a C ``char*`` that represents a string). -You can run this yourself by first opening the generated page **function.html** in a web browser (nothing will happen on page load because there is no ``main()``). Open a JavaScript environment (**Control-Shift-K** on Firefox, **Control-Shift-J** on Chrome), and enter the above commands as three separate commands, pressing **Enter** after each one. You should get the results ``3`` and ``5`` — the expected output for these inputs using C++ integer mathematics. +You can run this yourself by first opening the generated page +**function.html** in a web browser (nothing will happen on page +load because there is no ``main()``). Open a JavaScript environment +(**Control-Shift-K** on Firefox, **Control-Shift-J** on Chrome), +and enter the above commands as three separate commands, pressing +**Enter** after each one. You should get the results ``3`` and +``5`` — the expected output for these inputs using C++ integer +mathematics. -:js:func:`ccall` is similar, but receives another parameter with the parameters to pass to the function: +:js:func:`ccall` is similar, but receives another parameter with the +parameters to pass to the function: .. code-block:: javascript @@ -80,16 +102,29 @@ You can run this yourself by first opening the generated page **function.html** .. note:: - This example illustrates a few other points, which you should remember when using :js:func:`ccall` or :js:func:`cwrap`: + This example illustrates a few other points, which you should remember + when using :js:func:`ccall` or :js:func:`cwrap`: - - These methods can be used with compiled **C** functions — name-mangled C++ functions won't work. - - We highly recommended that you *export* functions that are to be called from JavaScript: + - These methods can be used with compiled **C** functions — name-mangled + C++ functions won't work. + - We highly recommended that you *export* functions that are to be called + from JavaScript: - - Exporting is done at compile time. For example: ``-s EXPORTED_FUNCTIONS='["_main","_other_function"]'`` exports ``main()`` and ``other_function()``. You need ``_`` at the beginning of the function names in the ``EXPORTED_FUNCTIONS`` list. - - Emscripten does :ref:`dead code elimination ` to minimize code size — exporting ensures the functions you need aren't removed. - - At higher optimisation levels (``-O2`` and above), the :term:`closure compiler` runs and minifies (changes) function names. Exporting functions allows you to continue to access them using the original name through the global ``Module`` object. + - Exporting is done at compile time. For example: + ``-s EXPORTED_FUNCTIONS='["_main","_other_function"]'`` exports + ``main()`` and ``other_function()``. You need ``_`` at the + beginning of the function names in the ``EXPORTED_FUNCTIONS`` list. + - Emscripten does :ref:`dead code elimination ` + to minimize code size — exporting ensures the functions you need + aren't removed. + - At higher optimisation levels (``-O2`` and above), the + :term:`closure compiler` runs and minifies (changes) function names. + Exporting functions allows you to continue to access them using the + original name through the global ``Module`` object. - - Use ``Module.ccall`` and not ``ccall`` by itself. The former will work at all optimisation levels (even if the :term:`Closure Compiler` minifies the function names). + - Use ``Module.ccall`` and not ``ccall`` by itself. The former will work + at all optimisation levels (even if the :term:`Closure Compiler` + minifies the function names). .. _interacting-with-code-direct-function-calls: @@ -97,21 +132,41 @@ You can run this yourself by first opening the generated page **function.html** Call compiled C/C++ code "directly" from JavaScript =================================================== -Functions in the original source become JavaScript functions, so you can call them directly if you do type translations yourself — this will be faster than using :js:func:`ccall` or :js:func:`cwrap`, but a little more complicated. +Functions in the original source become JavaScript functions, so you can +call them directly if you do type translations yourself — this will be +faster than using :js:func:`ccall` or :js:func:`cwrap`, but a little +more complicated. -To call the method directly, you will need to use the full name as it appears in the generated code. This will be the same as the original C function, but with a leading ``_``. +To call the method directly, you will need to use the full name as it +appears in the generated code. This will be the same as the original C +function, but with a leading ``_``. -.. note:: If you use :js:func:`ccall` or :js:func:`cwrap`, you do not need to prefix function calls with ``_`` — just use the C name. +.. note:: If you use :js:func:`ccall` or :js:func:`cwrap`, you do not need + to prefix function calls with ``_`` — just use the C name. -The types of the parameters you pass to functions need to make sense. Integers and floating point values can be passed as is. Pointers are simply integers in the generated code. +The types of the parameters you pass to functions need to make sense. +Integers and floating point values can be passed as is. Pointers are +simply integers in the generated code. -Strings in JavaScript must be converted to pointers for compiled code — the relevant function is :js:func:`Pointer_stringify`, which given a pointer returns a JavaScript string. Converting a JavaScript string ``someString`` to a pointer can be accomplished using :js:func:`allocate(intArrayFromString(someString), 'i8', ALLOC_STACK) `. +Strings in JavaScript must be converted to pointers for compiled +code — the relevant function is :js:func:`Pointer_stringify`, which +given a pointer returns a JavaScript string. Converting a JavaScript +string ``someString`` to a pointer can be accomplished using +:js:func:`allocate(intArrayFromString(someString), 'i8', ALLOC_STACK) `. -.. note:: The conversion to a pointer allocates memory, and in this case we allocate it on the stack (if you are calling it from a compiled function, it will rewind the stack for you; otherwise, you should do ``Runtime.stackSave()`` before and ``Runtime.stackRestore(..that value..)`` afterwards). +.. note:: The conversion to a pointer allocates memory, and in this case + we allocate it on the stack (if you are calling it from a compiled + function, it will rewind the stack for you; otherwise, you should + do ``Runtime.stackSave()`` before and + ``Runtime.stackRestore(..that value..)`` afterwards). -There are other convenience functions for converting strings and encodings in :ref:`preamble-js`. +There are other convenience functions for converting strings and encodings +in :ref:`preamble-js`. -.. todo:: **HamishW** Might be better to show the allocate above using _malloc, as allocate is an advanced API. We also need to better explain the note about stackRestore etc, or remove it - as it doesn't mean a lot to me. +.. todo:: **HamishW** Might be better to show the allocate above using + _malloc, as allocate is an advanced API. We also need to better + explain the note about stackRestore etc, or remove it - as it + doesn't mean a lot to me. .. _interacting-with-code-call-javascript-from-native: @@ -119,18 +174,29 @@ There are other convenience functions for converting strings and encodings in :r Calling JavaScript from C/C++ ============================= -Emscripten provides two main approaches for calling JavaScript from C/C++: running the script using :c:func:`emscripten_run_script` or writing "inline JavaScript". +Emscripten provides two main approaches for calling JavaScript from C/C++: +running the script using :c:func:`emscripten_run_script` or writing +"inline JavaScript". -The most direct, but slightly slower, way is to use :c:func:`emscripten_run_script`. This effectively runs the specified JavaScript code from C/C++ using ``eval()``. For example, to call the browser's ``alert()`` function with the text 'hi', you would call the following JavaScript: +The most direct, but slightly slower, way is to use +:c:func:`emscripten_run_script`. This effectively runs the specified +JavaScript code from C/C++ using ``eval()``. For example, to call the +browser's ``alert()`` function with the text 'hi', you would call the +following JavaScript: .. code-block:: javascript emscripten_run_script("alert('hi')"); -.. note:: The function ``alert`` is present in browsers, but not in *node* or other JavaScript shells. A more generic alternative is to call :js:func:`Module.print`. +.. note:: The function ``alert`` is present in browsers, but not in *node* + or other JavaScript shells. A more generic alternative is to call + :js:func:`Module.print`. -A faster way to call JavaScript from C is to write "inline JavaScript", using :c:func:`EM_ASM` (and related macros). These are used in a similar manner to inline assembly code. The "alert" example above might be written using inline JavaScript as: +A faster way to call JavaScript from C is to write "inline JavaScript", +using :c:func:`EM_ASM` (and related macros). These are used in a similar +manner to inline assembly code. The "alert" example above might be +written using inline JavaScript as: .. code-block:: c++ @@ -144,9 +210,16 @@ A faster way to call JavaScript from C is to write "inline JavaScript", using :c return 0; } -When compiled and run, Emscripten will execute the two lines of JavaScript as if they appeared directly in the generated code. The result would be an alert, followed by an exception. (Note, however, that under the hood Emscripten still does a function call even in this case, which has some amount of overhead.) +When compiled and run, Emscripten will execute the two lines of JavaScript +as if they appeared directly in the generated code. The result would be +an alert, followed by an exception. (Note, however, that under the hood +Emscripten still does a function call even in this case, which has some +amount of overhead.) -You can also send values from C into JavaScript inside :c:macro:`EM_ASM_`, as well as receive values back (see the :c:macro:`linked macro ` for details. The following example will print out ``I received: 100`` and then ``101``. +You can also send values from C into JavaScript inside :c:macro:`EM_ASM_`, +as well as receive values back (see the :c:macro:`linked macro ` +for details. The following example will print out ``I received: 100`` +and then ``101``. .. code-block:: cpp @@ -158,11 +231,18 @@ You can also send values from C into JavaScript inside :c:macro:`EM_ASM_`, as we .. note:: - - You need to specify if the return value is an ``int`` or a ``double`` using the appropriate macro :c:macro:`EM_ASM_INT` or :c:macro:`EM_ASM_DOUBLE`. + - You need to specify if the return value is an ``int`` or a ``double`` + using the appropriate macro :c:macro:`EM_ASM_INT` or + :c:macro:`EM_ASM_DOUBLE`. - The input values appear as ``$0``, ``$1``, etc. - ``return`` is used to provide the value sent from JavaScript back to C. - - See how ``{`` and ``}`` are used here to enclose the code. This is necessary to differentiate the code from the arguments passed later, which are the input values (this is how C macros work). - - When using the :c:macro:`EM_ASM` macro, ensure that you only use single quotes('). Double quotes(") will cause a syntax error that is not detected by the compiler and is only shown when looking at a JavaScript console while running the offending code. + - See how ``{`` and ``}`` are used here to enclose the code. This is + necessary to differentiate the code from the arguments passed later, + which are the input values (this is how C macros work). + - When using the :c:macro:`EM_ASM` macro, ensure that you only use + single quotes('). Double quotes(") will cause a syntax error that + is not detected by the compiler and is only shown when looking at + a JavaScript console while running the offending code. .. _implement-c-in-javascript: @@ -170,11 +250,24 @@ You can also send values from C into JavaScript inside :c:macro:`EM_ASM_`, as we Implement a C API in JavaScript =============================== -It is possible to implement a C API in JavaScript! This is the approach that was used to write Emscripten's implementations of :term:`SDL` and *libc*. - -You can use it to write your own APIs to call from C/C++. To do this you define the interface, decorating with ``extern`` to mark the methods in the API as external symbols. You then implement the symbols in JavaScript by simply adding their definition to `library.js `_ (by default). When compiling the C code, the compiler looks in the JavaScript libraries for relevant external symbols. - -By default, the implementation is added to **library.js** (and this is where you'll find the Emscripten implementation of *libc*). You can put the JavaScript implementation in your own library file and add it using the :ref:`emcc option ` ``--js-library``. See `test_js_libraries `_ in **tests/test_other.py** for a complete working example, including the syntax you should use inside the JavaScript library file. +It is possible to implement a C API in JavaScript! This is the approach +that was used to write Emscripten's implementations of :term:`SDL` and +*libc*. + +You can use it to write your own APIs to call from C/C++. To do this +you define the interface, decorating with ``extern`` to mark the methods +in the API as external symbols. You then implement the symbols in +JavaScript by simply adding their definition to `library.js`_ (by +default). When compiling the C code, the compiler looks in the JavaScript +libraries for relevant external symbols. + +By default, the implementation is added to **library.js** (and this is +where you'll find the Emscripten implementation of *libc*). You can put +the JavaScript implementation in your own library file and add it using +the :ref:`emcc option ` ``--js-library``. See +`test_js_libraries`_ in **tests/test_other.py** for a complete working +example, including the syntax you should use inside the JavaScript library +file. As a simple example, consider the case where you have some C code like this: @@ -187,7 +280,8 @@ As a simple example, consider the case where you have some C code like this: return 1; } -.. note:: When using C++ you should encapsulate ``extern void my_js();`` in an ``extern "C" {}`` block to prevent C++ name mangling: +.. note:: When using C++ you should encapsulate ``extern void my_js();`` + in an ``extern "C" {}`` block to prevent C++ name mangling: .. code-block:: cpp @@ -195,7 +289,10 @@ As a simple example, consider the case where you have some C code like this: extern void my_js(); } -Then you can implement ``my_js`` in JavaScript by simply adding the implementation to **library.js** (or your own file). Like our other examples of calling JavaScript from C, the example below just creates a dialog box using a simple ``alert()`` function. +Then you can implement ``my_js`` in JavaScript by simply adding the +implementation to **library.js** (or your own file). Like our other +examples of calling JavaScript from C, the example below just creates +a dialog box using a simple ``alert()`` function. .. code-block:: javascript @@ -213,15 +310,27 @@ If you add it to your own file, you should write something like }, }); -``mergeInto`` just copies the properties on the second parameter onto the first, so this add ``my_js`` onto ``LibraryManager.library``, the global object where all JavaScript library code should be. +``mergeInto`` just copies the properties on the second parameter onto the +first, so this add ``my_js`` onto ``LibraryManager.library``, the global +object where all JavaScript library code should be. -See the `library_*.js `_ files for other examples. +See the `library_*.js`_ files for other examples. .. note:: - - JavaScript libraries can declare dependencies (``__deps``), however those are only for other JavaScript libraries. See examples in `/src `_ with the name format **library_*.js** - - You can add dependencies for all your methods using ``autoAddDeps(myLibrary, name)`` where myLibrary is the object with all your methods, and ``name`` is the thing they all depend upon. This is useful when all the implemented methods use a JavaScript singleton containing helper methods. See ``library_gl.js`` for an example. - - If a JavaScript library depends on a compiled C library (like most of *libc*), you must edit `src/deps_info.json `_. Search for "deps_info" in `tools/system_libs.py `_. + - JavaScript libraries can declare dependencies (``__deps``), however + those are only for other JavaScript libraries. See examples in + `/src `_ + with the name format **library_*.js** + - You can add dependencies for all your methods using + ``autoAddDeps(myLibrary, name)`` where myLibrary is the object with + all your methods, and ``name`` is the thing they all depend upon. + This is useful when all the implemented methods use a JavaScript + singleton containing helper methods. See ``library_gl.js`` for + an example. + - If a JavaScript library depends on a compiled C library (like most + of *libc*), you must edit `src/deps_info.json`_. Search for + "deps_info" in `tools/system_libs.py`_. .. _interacting-with-code-call-function-pointers-from-c: @@ -229,9 +338,12 @@ See the `library_*.js `_ Calling JavaScript functions as function pointers from C ======================================================== -You can use ``Runtime.addFunction`` to return an integer value that represents a function pointer. Passing that integer to C code then lets it call that value as a function pointer, and the JavaScript function you sent to ``Runtime.addFunction`` will be called. +You can use ``Runtime.addFunction`` to return an integer value that represents +a function pointer. Passing that integer to C code then lets it call that +value as a function pointer, and the JavaScript function you sent to +``Runtime.addFunction`` will be called. -See ``test_add_function`` in `tests/test_core.py `_ for an example. +See `test_add_function in tests/test_core.py`_ for an example. .. _interacting-with-code-access-memory: @@ -239,15 +351,28 @@ See ``test_add_function`` in `tests/test_core.py ` and :js:func:`setValue(ptr, value, type) `. The first argument is a pointer (a number representing a memory address). ``type`` must be an LLVM IR type, one of ``i8``, ``i16``, ``i32``, ``i64``, ``float``, ``double`` or a pointer type like ``i8*`` (or just ``*``). +You can access memory using :js:func:`getValue(ptr, type) ` and +:js:func:`setValue(ptr, value, type) `. The first argument is a +pointer (a number representing a memory address). ``type`` must be an +LLVM IR type, one of ``i8``, ``i16``, ``i32``, ``i64``, ``float``, +``double`` or a pointer type like ``i8*`` (or just ``*``). -There are examples of these functions being used in the tests — see `tests/core/test_utf.in `_ and `tests/test_core.py `_. +There are examples of these functions being used in the tests — see +`tests/core/test_utf.in`_ and `tests/test_core.py`_. -.. note:: This is a lower-level operation than :js:func:`ccall` and :js:func:`cwrap` — we *do* need to care what specific type (e.g. integer) is being used. +.. note:: This is a lower-level operation than :js:func:`ccall` and + :js:func:`cwrap` — we *do* need to care what specific type (e.g. + integer) is being used. -You can also access memory 'directly' by manipulating the arrays that represent memory. This is not recommended unless you are sure you know what you are doing, and need the additional speed over :js:func:`getValue`/:js:func:`setValue`. +You can also access memory 'directly' by manipulating the arrays that +represent memory. This is not recommended unless you are sure you know +what you are doing, and need the additional speed over :js:func:`getValue` +and :js:func:`setValue`. -A case where this might be required is if you want to import a large amount of data from JavaScript to be processed by compiled code. For example, the following code allocates a buffer, copies in some data, calls a C function to process the data, and finally frees the buffer. +A case where this might be required is if you want to import a large amount +of data from JavaScript to be processed by compiled code. For example, the +following code allocates a buffer, copies in some data, calls a C function +to process the data, and finally frees the buffer. .. code-block:: javascript @@ -256,7 +381,9 @@ A case where this might be required is if you want to import a large amount of d Module.ccall('my_function', 'number', ['number'], [buf]); Module._free(buf); -Here ``my_function`` is a C function that receives a single integer parameter (or a pointer, they are both just 32-bit integers for us) and returns an integer. This could be something like ``int my_function(char *buf)``. +Here ``my_function`` is a C function that receives a single integer parameter +(or a pointer, they are both just 32-bit integers for us) and returns an +integer. This could be something like ``int my_function(char *buf)``. .. _interacting-with-code-execution-behaviour: @@ -264,20 +391,33 @@ Here ``my_function`` is a C function that receives a single integer parameter (o Affect execution behaviour ========================== -``Module`` is a global JavaScript object, with attributes that Emscripten-generated code calls at various points in its execution. +``Module`` is a global JavaScript object, with attributes that +Emscripten-generated code calls at various points in its execution. -Developers provide an implementation of ``Module`` to control how notifications from Emscripten are displayed, which files that are loaded before the main loop is run, and a number of other behaviours. For more information see :ref:`module`. +Developers provide an implementation of ``Module`` to control how +notifications from Emscripten are displayed, which files that are +loaded before the main loop is run, and a number of other behaviours. +For more information see :ref:`module`. .. _interacting-with-code-environment-variables: Environment variables ===================== -Sometimes compiled code needs to access environment variables (for instance, in C, by calling the ``getenv()`` function). Emscripten-generated JavaScript cannot access the computer's environment variables directly, so a "virtualised" environment is provided. +Sometimes compiled code needs to access environment variables (for instance, +in C, by calling the ``getenv()`` function). Emscripten-generated JavaScript +cannot access the computer's environment variables directly, so a +"virtualised" environment is provided. -The JavaScript object ``ENV`` contains the virtualised environment variables, and by modifying it you can pass variables to your compiled code. Care must be taken to ensure that the ``ENV`` variable has been initialised by Emscripten before it is modified — using :js:attr:`Module.preRun` is a convenient way to do this. +The JavaScript object ``ENV`` contains the virtualised environment variables, +and by modifying it you can pass variables to your compiled code. Care must +be taken to ensure that the ``ENV`` variable has been initialised by +Emscripten before it is modified — using :js:attr:`Module.preRun` is a +convenient way to do this. -For example, to set an environment variable ``MY_FILE_ROOT`` to be ``"/usr/lib/test/"`` you could add the following JavaScript to your ``Module`` :ref:`setup code `: +For example, to set an environment variable ``MY_FILE_ROOT`` to be +``"/usr/lib/test/"`` you could add the following JavaScript to your +``Module`` :ref:`setup code `: .. code:: javascript @@ -288,15 +428,42 @@ For example, to set an environment variable ``MY_FILE_ROOT`` to be ``"/usr/lib/t Binding C++ and JavaScript — WebIDL Binder and Embind ====================================================== -The JavaScript methods for calling compiled C functions are efficient, but cannot be used with name-mangled C++ functions. +The JavaScript methods for calling compiled C functions are efficient, but +cannot be used with name-mangled C++ functions. -:ref:`WebIDL-Binder` and :ref:`embind` create bindings between C++ and JavaScript, allowing C++ code entities to be used in a natural manner from JavaScript. *Embind* additionally supports calling JavaScript code from C++. +:ref:`WebIDL-Binder` and :ref:`embind` create bindings between C++ and +JavaScript, allowing C++ code entities to be used in a natural manner from +JavaScript. *Embind* additionally supports calling JavaScript code from C++. -*Embind* can bind almost any C++ code, including sophisticated C++ constructs (e.g. ``shared_ptr`` and ``unique_ptr``). The *WebIDL Binder* supports C++ types that can be expressed in WebIDL. While this subset is smaller than supported by *Embind*, it is more than sufficient for most use cases — examples of projects that have been ported using the binder include the `Box2D `_ and `Bullet `_ physics engines. +*Embind* can bind almost any C++ code, including sophisticated C++ constructs +(e.g. ``shared_ptr`` and ``unique_ptr``). The *WebIDL Binder* supports C++ +types that can be expressed in WebIDL. While this subset is smaller than +supported by *Embind*, it is more than sufficient for most use cases — +examples of projects that have been ported using the binder include the +`Box2D`_ and `Bullet`_ physics engines. -Both tools allow mapped items to be used from JavaScript in a similar way. However they operate at different levels, and use very different approaches for defining the binding: +Both tools allow mapped items to be used from JavaScript in a similar way. +However they operate at different levels, and use very different approaches +for defining the binding: - *Embind* declares bindings within the C/C++ file. -- *WebIDL-Binder* declares the binding in a separate file. This is run through the binder tool to create "glue" code that is then compiled with the project. - -.. note:: There is no strong evidence that one tool is "better" than the other in terms of performance (no comparative benchmarks exist), and both have been used successfully in a number of projects. The selection of one tool over the other will usually be based on which is the most natural fit for the project and its build system. +- *WebIDL-Binder* declares the binding in a separate file. This is run + through the binder tool to create "glue" code that is then compiled + with the project. + +.. note:: There is no strong evidence that one tool is "better" than the + other in terms of performance (no comparative benchmarks exist), and + both have been used successfully in a number of projects. The selection + of one tool over the other will usually be based on which is the most + natural fit for the project and its build system. + +.. _library.js: https://github.com/kripken/emscripten/blob/master/src/library.js +.. _test_js_libraries: https://github.com/kripken/emscripten/blob/master/tests/test_core.py#L4800 +.. _src/deps_info.json: https://github.com/kripken/emscripten/blob/master/src/deps_info.json +.. _tools/system_libs.py: https://github.com/kripken/emscripten/blob/master/tools/system_libs.py +.. _library_\*.js: https://github.com/kripken/emscripten/tree/master/src +.. _test_add_function in tests/test_core.py: https://github.com/kripken/emscripten/blob/master/tests/test_core.py#L5904 +.. _tests/core/test_utf.in: https://github.com/kripken/emscripten/blob/master/tests/core/test_utf.in +.. _tests/test_core.py: https://github.com/kripken/emscripten/blob/master/tests/test_core.py#L5704 +.. _Box2D: https://github.com/kripken/box2d.js/#box2djs +.. _Bullet: https://github.com/kripken/ammo.js/#ammojs From 970238dff9b861b1be1c9f8da3ebd42b27039015 Mon Sep 17 00:00:00 2001 From: Bruce Mitchener Date: Wed, 22 Oct 2014 16:32:53 +0700 Subject: [PATCH 436/461] [docs] Document RESERVED_FUNCTION_POINTERS with addFunction. --- .../connecting_cpp_and_javascript/Interacting-with-code.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/site/source/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.rst b/site/source/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.rst index 87a41acd91c08..bbca9a5cfabe4 100644 --- a/site/source/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.rst +++ b/site/source/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.rst @@ -345,6 +345,12 @@ value as a function pointer, and the JavaScript function you sent to See `test_add_function in tests/test_core.py`_ for an example. +When using ``Runtime.addFunction``, there is a backing array where these +functions are stored. This array must be explicitly sized, which can be +done via a compile-time setting, ``RESERVED_FUNCTION_POINTERS``. For +example, to reserve space for 20 functions to be added:: + + emcc ... -s RESERVED_FUNCTION_POINTERS=20 ... .. _interacting-with-code-access-memory: From cb026e38fdd27fb09170495ea04b6c748cb01100 Mon Sep 17 00:00:00 2001 From: Bruce Mitchener Date: Wed, 22 Oct 2014 16:37:35 +0700 Subject: [PATCH 437/461] [docs] Clean up whitespace. --- .../building_from_source/LLVM-Backend.rst | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/site/source/docs/building_from_source/LLVM-Backend.rst b/site/source/docs/building_from_source/LLVM-Backend.rst index 6747c0edac979..208bdf789d8b3 100644 --- a/site/source/docs/building_from_source/LLVM-Backend.rst +++ b/site/source/docs/building_from_source/LLVM-Backend.rst @@ -26,7 +26,7 @@ Fastcomp is maintained in two repositories: Getting Fastcomp ================ -*Fastcomp* (Clang) is part of the :ref:`Emscripten SDK `, and the binaries are automatically provided during installation (except on Linux, where pre-built binaries are not supplied so the SDK builds them for you). +*Fastcomp* (Clang) is part of the :ref:`Emscripten SDK `, and the binaries are automatically provided during installation (except on Linux, where pre-built binaries are not supplied so the SDK builds them for you). If you need to build from source you can: @@ -41,9 +41,9 @@ If you need to build from source you can: Original compiler core (deprecated) =================================== -The original compiler supported dozens of different code generation modes (no-typed arrays, typed arrays in various modes, **asm.js** vs. **non-asm.js**, etc.), many of which were not very efficient. Over time, the compiler became harder to maintain and was susceptible to unpredictable compiler slow-downs. +The original compiler supported dozens of different code generation modes (no-typed arrays, typed arrays in various modes, **asm.js** vs. **non-asm.js**, etc.), many of which were not very efficient. Over time, the compiler became harder to maintain and was susceptible to unpredictable compiler slow-downs. -*Fastcomp* was turned on by default in version 1.12.1. The original compiler is now "deprecated". +*Fastcomp* was turned on by default in version 1.12.1. The original compiler is now "deprecated". .. note:: While it is possible to manually disable Fastcomp and build the original compiler from source, this is discouraged. @@ -56,13 +56,13 @@ As a result of the problems with the original compiler, we developed *Fastcomp*, - It is much more streamlined than the original compiler. It focuses on **asm.js** code generation, which has been shown to give the best results. - It is much faster and has more predictable performance (often 4x faster or more). - It requires much less memory. -- It generates better code because, as an LLVM backend, it integrates more tightly with LLVM. +- It generates better code because, as an LLVM backend, it integrates more tightly with LLVM. Are there downsides? -------------------- -The main downside is that Emscripten can no longer use a stock build of LLVM, because we have made changes that must be built with LLVM. +The main downside is that Emscripten can no longer use a stock build of LLVM, because we have made changes that must be built with LLVM. There are also a few features that were present in the original compiler that are not present in *Fastcomp* (see the next section). @@ -76,18 +76,18 @@ Some features that were present in the original compiler that are not present in - Various deprecated **settings.js** options (``FORCE_ALIGNMENT``, ``HEAP_INIT``, etc.) You should receive a compile-time error if you use a setting which is not supported. - Linking of **asm.js** shared modules. This is not deprecated, but may need to be reconsidered. - .. note:: Normal static linking as used by almost all projects works fine; it is just specifically the options ``MAIN_MODULE`` and ``SIDE_MODULE`` that do not work. + .. note:: Normal static linking as used by almost all projects works fine; it is just specifically the options ``MAIN_MODULE`` and ``SIDE_MODULE`` that do not work. + - How to disable Fastcomp ----------------------- .. warning:: You should **NOT** disable Fastcomp. If you "really must", then: - - The build will be slower, consume more memory, and result in sub-optimal code. - - There are more likely to be bugs, because the old compiler is less tested. + - The build will be slower, consume more memory, and result in sub-optimal code. + - There are more likely to be bugs, because the old compiler is less tested. -The original compiler is still present, and you may want to use it if you need a feature that is not yet present in *Fastcomp*. There should be very few such features, as almost everything that is not deprecated or planned to be rewritten has already been ported. +The original compiler is still present, and you may want to use it if you need a feature that is not yet present in *Fastcomp*. There should be very few such features, as almost everything that is not deprecated or planned to be rewritten has already been ported. However, if you do need to, you can use the old compiler by turning off *Fastcomp*; you do this by setting ``EMCC_FAST_COMPILER=0`` when you build: :: From 45c8e9e44c457629e64970030a7c68c4a7e6a053 Mon Sep 17 00:00:00 2001 From: Bruce Mitchener Date: Wed, 22 Oct 2014 16:38:00 +0700 Subject: [PATCH 438/461] [docs] Fix broken section marker. --- site/source/docs/building_from_source/LLVM-Backend.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/source/docs/building_from_source/LLVM-Backend.rst b/site/source/docs/building_from_source/LLVM-Backend.rst index 208bdf789d8b3..cc2dea78d4bbb 100644 --- a/site/source/docs/building_from_source/LLVM-Backend.rst +++ b/site/source/docs/building_from_source/LLVM-Backend.rst @@ -8,7 +8,7 @@ This article introduces *Fastcomp*, Emscripten's LLVM + Clang implementation. It Fastcomp overview -================ +================= *Fastcomp* is the default compiler core for Emscripten. Implemented as an :term:`LLVM backend`, its role is to convert the LLVM Intermediate Representation (IR) created by :term:`Clang` (from C/C++) into JavaScript. From 3ab16c70ef4b519dfd35b05721962212c0f176f2 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 22 Oct 2014 11:04:36 -0700 Subject: [PATCH 439/461] avoid configure step in sdl2 port --- tools/ports/sdl.py | 385 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 384 insertions(+), 1 deletion(-) diff --git a/tools/ports/sdl.py b/tools/ports/sdl.py index e25250976438f..418d1adf9eca5 100644 --- a/tools/ports/sdl.py +++ b/tools/ports/sdl.py @@ -2,7 +2,7 @@ VERSION = 1 -def get(ports, settings, shared): +def get_with_configure(ports, settings, shared): # not currently used; no real need for configure on emscripten users' machines! if settings.USE_SDL == 2: ports.fetch_project('sdl2', 'https://github.com/emscripten-ports/SDL2/archive/master.zip', VERSION) def setup_includes(): @@ -18,6 +18,36 @@ def setup_includes(): else: return [] +def get(ports, settings, shared): + if settings.USE_SDL == 2: + ports.fetch_project('sdl2', 'https://github.com/emscripten-ports/SDL2/archive/master.zip', VERSION) + def create(): + # copy includes to a location so they can be used as 'SDL2/' + source_include_path = os.path.join(ports.get_dir(), 'sdl2', 'SDL2-master', 'include') + dest_include_path = os.path.join(shared.Cache.get_path('ports-builds'), 'sdl2', 'include') + shared.try_delete(dest_include_path) + shutil.copytree(source_include_path, dest_include_path) + shutil.copytree(source_include_path, os.path.join(dest_include_path, 'SDL2')) + # write out an SDL_config.h file, that configure would normally emit + open(os.path.join(dest_include_path, 'SDL_config.h'), 'w').write(sdl_config_h) + open(os.path.join(dest_include_path, 'SDL2', 'SDL_config.h'), 'w').write(sdl_config_h) + # build + srcs = 'SDL.c SDL_assert.c SDL_error.c SDL_hints.c SDL_log.c atomic/SDL_atomic.c atomic/SDL_spinlock.c audio/SDL_audio.c audio/SDL_audiocvt.c audio/SDL_audiodev.c audio/SDL_audiotypecvt.c audio/SDL_mixer.c audio/SDL_wave.c cpuinfo/SDL_cpuinfo.c dynapi/SDL_dynapi.c events/SDL_clipboardevents.c events/SDL_dropevents.c events/SDL_events.c events/SDL_gesture.c events/SDL_keyboard.c events/SDL_mouse.c events/SDL_quit.c events/SDL_touch.c events/SDL_windowevents.c file/SDL_rwops.c haptic/SDL_haptic.c joystick/SDL_gamecontroller.c joystick/SDL_joystick.c libm/e_atan2.c libm/e_log.c libm/e_pow.c libm/e_rem_pio2.c libm/e_sqrt.c libm/k_cos.c libm/k_rem_pio2.c libm/k_sin.c libm/k_tan.c libm/s_atan.c libm/s_copysign.c libm/s_cos.c libm/s_fabs.c libm/s_floor.c libm/s_scalbn.c libm/s_sin.c libm/s_tan.c power/SDL_power.c render/SDL_d3dmath.c render/SDL_render.c render/SDL_yuv_mmx.c render/SDL_yuv_sw.c render/direct3d/SDL_render_d3d.c render/direct3d11/SDL_render_d3d11.c render/opengl/SDL_render_gl.c render/opengl/SDL_shaders_gl.c render/opengles/SDL_render_gles.c render/opengles2/SDL_render_gles2.c render/opengles2/SDL_shaders_gles2.c render/psp/SDL_render_psp.c render/software/SDL_blendfillrect.c render/software/SDL_blendline.c render/software/SDL_blendpoint.c render/software/SDL_drawline.c render/software/SDL_drawpoint.c render/software/SDL_render_sw.c render/software/SDL_rotate.c stdlib/SDL_getenv.c stdlib/SDL_iconv.c stdlib/SDL_malloc.c stdlib/SDL_qsort.c stdlib/SDL_stdlib.c stdlib/SDL_string.c thread/SDL_thread.c timer/SDL_timer.c video/SDL_RLEaccel.c video/SDL_blit.c video/SDL_blit_0.c video/SDL_blit_1.c video/SDL_blit_A.c video/SDL_blit_N.c video/SDL_blit_auto.c video/SDL_blit_copy.c video/SDL_blit_slow.c video/SDL_bmp.c video/SDL_clipboard.c video/SDL_egl.c video/SDL_fillrect.c video/SDL_pixels.c video/SDL_rect.c video/SDL_shape.c video/SDL_stretch.c video/SDL_surface.c video/SDL_video.c video/emscripten/SDL_emscriptenevents.c video/emscripten/SDL_emscriptenframebuffer.c video/emscripten/SDL_emscriptenmouse.c video/emscripten/SDL_emscriptenopengles.c video/emscripten/SDL_emscriptenvideo.c audio/emscripten/SDL_emscriptenaudio.c video/dummy/SDL_nullevents.c video/dummy/SDL_nullframebuffer.c video/dummy/SDL_nullvideo.c audio/disk/SDL_diskaudio.c audio/dummy/SDL_dummyaudio.c loadso/dlopen/SDL_sysloadso.c power/emscripten/SDL_syspower.c joystick/emscripten/SDL_sysjoystick.c filesystem/emscripten/SDL_sysfilesystem.c timer/unix/SDL_systimer.c haptic/dummy/SDL_syshaptic.c thread/generic/SDL_syscond.c thread/generic/SDL_sysmutex.c thread/generic/SDL_syssem.c thread/generic/SDL_systhread.c thread/generic/SDL_systls.c main/dummy/SDL_dummy_main.c'.split(' ') + commands = [] + o_s = [] + for src in srcs: + o = os.path.join(ports.get_build_dir(), 'sdl2', 'src', src + '.o') + shared.safe_ensure_dirs(os.path.dirname(o)) + commands.append([shared.PYTHON, shared.EMCC, os.path.join(ports.get_dir(), 'sdl2', 'SDL2-master', 'src', src), '-O2', '-o', o, '-I' + dest_include_path, '-O2', '-DUSING_GENERATED_CONFIG_H']) + o_s.append(o) + ports.run_commands(commands) + final = os.path.join(ports.get_build_dir(), 'sdl2', 'libsdl2.bc') + shared.Building.link(o_s, final) + return final + return [shared.Cache.get('sdl2', create)] + else: + return [] + def process_args(ports, args, settings, shared): if settings.USE_SDL == 1: args += ['-Xclang', '-isystem' + shared.path_from_root('system', 'include', 'SDL')] elif settings.USE_SDL == 2: @@ -28,3 +58,356 @@ def process_args(ports, args, settings, shared): def show(): return 'SDL2 (zlib license)' +sdl_config_h = r'''/* include/SDL_config.h. Generated from SDL_config.h.in by configure. */ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef _SDL_config_h +#define _SDL_config_h + +/** + * \file SDL_config.h.in + * + * This is a set of defines to configure the SDL features + */ + +/* General platform specific identifiers */ +#include "SDL_platform.h" + +/* Make sure that this isn't included by Visual C++ */ +#ifdef _MSC_VER +#error You should run hg revert SDL_config.h +#endif + +/* C language features */ +/* #undef const */ +/* #undef inline */ +/* #undef volatile */ + +/* C datatypes */ +#ifdef __LP64__ +#define SIZEOF_VOIDP 8 +#else +#define SIZEOF_VOIDP 4 +#endif +#define HAVE_GCC_ATOMICS 1 +/* #undef HAVE_GCC_SYNC_LOCK_TEST_AND_SET */ +/* #undef HAVE_PTHREAD_SPINLOCK */ + +/* #undef HAVE_DXGI_H */ + +/* Comment this if you want to build without any C library requirements */ +#define HAVE_LIBC 1 +#if HAVE_LIBC + +/* Useful headers */ +#define HAVE_ALLOCA_H 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STDARG_H 1 +#define HAVE_MALLOC_H 1 +#define HAVE_MEMORY_H 1 +#define HAVE_STRING_H 1 +#define HAVE_STRINGS_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 +#define HAVE_ICONV_H 1 +#define HAVE_SIGNAL_H 1 +/* #undef HAVE_ALTIVEC_H */ +/* #undef HAVE_PTHREAD_NP_H */ +/* #undef HAVE_LIBUDEV_H */ +/* #undef HAVE_DBUS_DBUS_H */ + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#ifndef __WIN32__ /* Don't use C runtime versions of these on Windows */ +#define HAVE_GETENV 1 +#define HAVE_SETENV 1 +#define HAVE_PUTENV 1 +#define HAVE_UNSETENV 1 +#endif +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +#define HAVE_BCOPY 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +/* #undef HAVE_STRLCPY */ +/* #undef HAVE_STRLCAT */ +#define HAVE_STRDUP 1 +/* #undef HAVE__STRREV */ +/* #undef HAVE__STRUPR */ +/* #undef HAVE__STRLWR */ +/* #undef HAVE_INDEX */ +/* #undef HAVE_RINDEX */ +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +/* #undef HAVE_ITOA */ +/* #undef HAVE__LTOA */ +/* #undef HAVE__UITOA */ +/* #undef HAVE__ULTOA */ +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +/* #undef HAVE__I64TOA */ +/* #undef HAVE__UI64TOA */ +#define HAVE_STRTOLL 1 +#define HAVE_STRTOULL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +/* #undef HAVE__STRICMP */ +#define HAVE_STRCASECMP 1 +/* #undef HAVE__STRNICMP */ +#define HAVE_STRNCASECMP 1 +/* #undef HAVE_SSCANF */ +#define HAVE_VSSCANF 1 +/* #undef HAVE_SNPRINTF */ +#define HAVE_VSNPRINTF 1 +#define HAVE_M_PI /**/ +#define HAVE_ATAN 1 +#define HAVE_ATAN2 1 +#define HAVE_ACOS 1 +#define HAVE_ASIN 1 +#define HAVE_CEIL 1 +#define HAVE_COPYSIGN 1 +#define HAVE_COS 1 +#define HAVE_COSF 1 +#define HAVE_FABS 1 +#define HAVE_FLOOR 1 +#define HAVE_LOG 1 +#define HAVE_POW 1 +#define HAVE_SCALBN 1 +#define HAVE_SIN 1 +#define HAVE_SINF 1 +#define HAVE_SQRT 1 +#define HAVE_SQRTF 1 +#define HAVE_TAN 1 +#define HAVE_TANF 1 +#define HAVE_FSEEKO 1 +#define HAVE_FSEEKO64 1 +#define HAVE_SIGACTION 1 +#define HAVE_SA_SIGACTION 1 +#define HAVE_SETJMP 1 +#define HAVE_NANOSLEEP 1 +#define HAVE_SYSCONF 1 +/* #undef HAVE_SYSCTLBYNAME */ +#define HAVE_CLOCK_GETTIME 1 +/* #undef HAVE_GETPAGESIZE */ +#define HAVE_MPROTECT 1 +#define HAVE_ICONV 1 +/* #undef HAVE_PTHREAD_SETNAME_NP */ +/* #undef HAVE_PTHREAD_SET_NAME_NP */ +/* #undef HAVE_SEM_TIMEDWAIT */ + +#else +#define HAVE_STDARG_H 1 +#define HAVE_STDDEF_H 1 +#define HAVE_STDINT_H 1 +#endif /* HAVE_LIBC */ + +/* SDL internal assertion support */ +/* #undef SDL_DEFAULT_ASSERT_LEVEL */ + +/* Allow disabling of core subsystems */ +/* #undef SDL_ATOMIC_DISABLED */ +/* #undef SDL_AUDIO_DISABLED */ +#define SDL_CPUINFO_DISABLED 1 +/* #undef SDL_EVENTS_DISABLED */ +/* #undef SDL_FILE_DISABLED */ +/* #undef SDL_JOYSTICK_DISABLED */ +#define SDL_HAPTIC_DISABLED 1 +/* #undef SDL_LOADSO_DISABLED */ +/* #undef SDL_RENDER_DISABLED */ +#define SDL_THREADS_DISABLED 1 +/* #undef SDL_TIMERS_DISABLED */ +/* #undef SDL_VIDEO_DISABLED */ +/* #undef SDL_POWER_DISABLED */ +/* #undef SDL_FILESYSTEM_DISABLED */ + +/* Enable various audio drivers */ +/* #undef SDL_AUDIO_DRIVER_ALSA */ +/* #undef SDL_AUDIO_DRIVER_ALSA_DYNAMIC */ +/* #undef SDL_AUDIO_DRIVER_ARTS */ +/* #undef SDL_AUDIO_DRIVER_ARTS_DYNAMIC */ +/* #undef SDL_AUDIO_DRIVER_PULSEAUDIO */ +/* #undef SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC */ +/* #undef SDL_AUDIO_DRIVER_HAIKU */ +/* #undef SDL_AUDIO_DRIVER_BSD */ +/* #undef SDL_AUDIO_DRIVER_COREAUDIO */ +#define SDL_AUDIO_DRIVER_DISK 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 +/* #undef SDL_AUDIO_DRIVER_ANDROID */ +/* #undef SDL_AUDIO_DRIVER_XAUDIO2 */ +/* #undef SDL_AUDIO_DRIVER_DSOUND */ +/* #undef SDL_AUDIO_DRIVER_ESD */ +/* #undef SDL_AUDIO_DRIVER_ESD_DYNAMIC */ +/* #undef SDL_AUDIO_DRIVER_NACL */ +/* #undef SDL_AUDIO_DRIVER_NAS */ +/* #undef SDL_AUDIO_DRIVER_NAS_DYNAMIC */ +/* #undef SDL_AUDIO_DRIVER_SNDIO */ +/* #undef SDL_AUDIO_DRIVER_SNDIO_DYNAMIC */ +/* #undef SDL_AUDIO_DRIVER_OSS */ +/* #undef SDL_AUDIO_DRIVER_OSS_SOUNDCARD_H */ +/* #undef SDL_AUDIO_DRIVER_PAUDIO */ +/* #undef SDL_AUDIO_DRIVER_QSA */ +/* #undef SDL_AUDIO_DRIVER_SUNAUDIO */ +/* #undef SDL_AUDIO_DRIVER_WINMM */ +/* #undef SDL_AUDIO_DRIVER_FUSIONSOUND */ +/* #undef SDL_AUDIO_DRIVER_FUSIONSOUND_DYNAMIC */ +#define SDL_AUDIO_DRIVER_EMSCRIPTEN 1 + +/* Enable various input drivers */ +/* #undef SDL_INPUT_LINUXEV */ +/* #undef SDL_INPUT_LINUXKD */ +/* #undef SDL_INPUT_TSLIB */ +/* #undef SDL_JOYSTICK_HAIKU */ +/* #undef SDL_JOYSTICK_DINPUT */ +/* #undef SDL_JOYSTICK_DUMMY */ +/* #undef SDL_JOYSTICK_IOKIT */ +/* #undef SDL_JOYSTICK_LINUX */ +/* #undef SDL_JOYSTICK_ANDROID */ +/* #undef SDL_JOYSTICK_WINMM */ +/* #undef SDL_JOYSTICK_USBHID */ +/* #undef SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H */ +#define SDL_JOYSTICK_EMSCRIPTEN 1 +/* #undef SDL_HAPTIC_DUMMY */ +/* #undef SDL_HAPTIC_LINUX */ +/* #undef SDL_HAPTIC_IOKIT */ +/* #undef SDL_HAPTIC_DINPUT */ + +/* Enable various shared object loading systems */ +/* #undef SDL_LOADSO_HAIKU */ +#define SDL_LOADSO_DLOPEN 1 +/* #undef SDL_LOADSO_DUMMY */ +/* #undef SDL_LOADSO_LDG */ +/* #undef SDL_LOADSO_WINDOWS */ + +/* Enable various threading systems */ +/* #undef SDL_THREAD_PTHREAD */ +/* #undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX */ +/* #undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP */ +/* #undef SDL_THREAD_WINDOWS */ + +/* Enable various timer systems */ +/* #undef SDL_TIMER_HAIKU */ +/* #undef SDL_TIMER_DUMMY */ +#define SDL_TIMER_UNIX 1 +/* #undef SDL_TIMER_WINDOWS */ + +/* Enable various video drivers */ +/* #undef SDL_VIDEO_DRIVER_HAIKU */ +/* #undef SDL_VIDEO_DRIVER_COCOA */ +/* #undef SDL_VIDEO_DRIVER_DIRECTFB */ +/* #undef SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC */ +#define SDL_VIDEO_DRIVER_DUMMY 1 +/* #undef SDL_VIDEO_DRIVER_WINDOWS */ +/* #undef SDL_VIDEO_DRIVER_WAYLAND */ +/* #undef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ +/* #undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC */ +/* #undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL */ +/* #undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR */ +/* #undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON */ +/* #undef SDL_VIDEO_DRIVER_MIR */ +/* #undef SDL_VIDEO_DRIVER_MIR_DYNAMIC */ +/* #undef SDL_VIDEO_DRIVER_MIR_DYNAMIC_XKBCOMMON */ +/* #undef SDL_VIDEO_DRIVER_X11 */ +/* #undef SDL_VIDEO_DRIVER_RPI */ +/* #undef SDL_VIDEO_DRIVER_ANDROID */ +#define SDL_VIDEO_DRIVER_EMSCRIPTEN 1 +/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC */ +/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT */ +/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR */ +/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XINERAMA */ +/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 */ +/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR */ +/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS */ +/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XVIDMODE */ +/* #undef SDL_VIDEO_DRIVER_X11_XCURSOR */ +/* #undef SDL_VIDEO_DRIVER_X11_XINERAMA */ +/* #undef SDL_VIDEO_DRIVER_X11_XINPUT2 */ +/* #undef SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH */ +/* #undef SDL_VIDEO_DRIVER_X11_XRANDR */ +/* #undef SDL_VIDEO_DRIVER_X11_XSCRNSAVER */ +/* #undef SDL_VIDEO_DRIVER_X11_XSHAPE */ +/* #undef SDL_VIDEO_DRIVER_X11_XVIDMODE */ +/* #undef SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS */ +/* #undef SDL_VIDEO_DRIVER_X11_CONST_PARAM_XDATA32 */ +/* #undef SDL_VIDEO_DRIVER_X11_CONST_PARAM_XEXTADDDISPLAY */ +/* #undef SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM */ +/* #undef SDL_VIDEO_DRIVER_NACL */ + +/* #undef SDL_VIDEO_RENDER_D3D */ +/* #undef SDL_VIDEO_RENDER_D3D11 */ +/* #undef SDL_VIDEO_RENDER_OGL */ +/* #undef SDL_VIDEO_RENDER_OGL_ES */ +#define SDL_VIDEO_RENDER_OGL_ES2 1 +/* #undef SDL_VIDEO_RENDER_DIRECTFB */ + +/* Enable OpenGL support */ +/* #undef SDL_VIDEO_OPENGL */ +/* #undef SDL_VIDEO_OPENGL_ES */ +#define SDL_VIDEO_OPENGL_ES2 1 +/* #undef SDL_VIDEO_OPENGL_BGL */ +/* #undef SDL_VIDEO_OPENGL_CGL */ +#define SDL_VIDEO_OPENGL_EGL 1 +/* #undef SDL_VIDEO_OPENGL_GLX */ +/* #undef SDL_VIDEO_OPENGL_WGL */ +/* #undef SDL_VIDEO_OPENGL_OSMESA */ +/* #undef SDL_VIDEO_OPENGL_OSMESA_DYNAMIC */ + +/* Enable system power support */ +/* #undef SDL_POWER_LINUX */ +/* #undef SDL_POWER_WINDOWS */ +/* #undef SDL_POWER_MACOSX */ +/* #undef SDL_POWER_HAIKU */ +/* #undef SDL_POWER_ANDROID */ +#define SDL_POWER_EMSCRIPTEN 1 +/* #undef SDL_POWER_HARDWIRED */ + +/* Enable system filesystem support */ +/* #undef SDL_FILESYSTEM_HAIKU */ +/* #undef SDL_FILESYSTEM_COCOA */ +/* #undef SDL_FILESYSTEM_DUMMY */ +/* #undef SDL_FILESYSTEM_UNIX */ +/* #undef SDL_FILESYSTEM_WINDOWS */ +/* #undef SDL_FILESYSTEM_NACL */ +#define SDL_FILESYSTEM_EMSCRIPTEN 1 + +/* Enable assembly routines */ +/* #undef SDL_ASSEMBLY_ROUTINES */ +/* #undef SDL_ALTIVEC_BLITTERS */ + +#endif /* _SDL_config_h */ +''' + From eb2b1510901c61bbd22988ee0a12d94c655ebd82 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 22 Oct 2014 11:11:06 -0700 Subject: [PATCH 440/461] clear sdl2-image when building sdl2, and improve logging --- tools/ports/sdl.py | 7 +++++-- tools/ports/sdl_image.py | 3 ++- tools/system_libs.py | 8 +++++--- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/tools/ports/sdl.py b/tools/ports/sdl.py index 418d1adf9eca5..8c9601d81c027 100644 --- a/tools/ports/sdl.py +++ b/tools/ports/sdl.py @@ -1,4 +1,4 @@ -import os, shutil +import os, shutil, logging VERSION = 1 @@ -22,6 +22,9 @@ def get(ports, settings, shared): if settings.USE_SDL == 2: ports.fetch_project('sdl2', 'https://github.com/emscripten-ports/SDL2/archive/master.zip', VERSION) def create(): + logging.warning('building port: sdl2') + # we are rebuilding SDL, clear dependant projects so they copy in their includes to ours properly + ports.clear_project_build('sdl2-image') # copy includes to a location so they can be used as 'SDL2/' source_include_path = os.path.join(ports.get_dir(), 'sdl2', 'SDL2-master', 'include') dest_include_path = os.path.join(shared.Cache.get_path('ports-builds'), 'sdl2', 'include') @@ -38,7 +41,7 @@ def create(): for src in srcs: o = os.path.join(ports.get_build_dir(), 'sdl2', 'src', src + '.o') shared.safe_ensure_dirs(os.path.dirname(o)) - commands.append([shared.PYTHON, shared.EMCC, os.path.join(ports.get_dir(), 'sdl2', 'SDL2-master', 'src', src), '-O2', '-o', o, '-I' + dest_include_path, '-O2', '-DUSING_GENERATED_CONFIG_H']) + commands.append([shared.PYTHON, shared.EMCC, os.path.join(ports.get_dir(), 'sdl2', 'SDL2-master', 'src', src), '-O2', '-o', o, '-I' + dest_include_path, '-O2', '-DUSING_GENERATED_CONFIG_H', '-Wno-warn-absolute-paths']) o_s.append(o) ports.run_commands(commands) final = os.path.join(ports.get_build_dir(), 'sdl2', 'libsdl2.bc') diff --git a/tools/ports/sdl_image.py b/tools/ports/sdl_image.py index 0c55504940e37..78ad23b822bb0 100644 --- a/tools/ports/sdl_image.py +++ b/tools/ports/sdl_image.py @@ -1,4 +1,4 @@ -import os, shutil +import os, shutil, logging VERSION = 1 @@ -8,6 +8,7 @@ def get(ports, settings, shared): assert os.path.exists(sdl_build), 'You must use SDL2 to use SDL2_image' ports.fetch_project('sdl2-image', 'https://github.com/emscripten-ports/SDL2_image/archive/master.zip', VERSION) def create(): + logging.warning('building port: sdl2-image') shutil.copyfile(os.path.join(ports.get_dir(), 'sdl2-image', 'SDL2_image-master', 'SDL_image.h'), os.path.join(ports.get_build_dir(), 'sdl2', 'include', 'SDL_image.h')) shutil.copyfile(os.path.join(ports.get_dir(), 'sdl2-image', 'SDL2_image-master', 'SDL_image.h'), os.path.join(ports.get_build_dir(), 'sdl2', 'include', 'SDL2', 'SDL_image.h')) srcs = 'IMG.c IMG_bmp.c IMG_gif.c IMG_jpg.c IMG_lbm.c IMG_pcx.c IMG_png.c IMG_pnm.c IMG_tga.c IMG_tif.c IMG_xcf.c IMG_xpm.c IMG_xv.c IMG_webp.c IMG_ImageIO.m'.split(' ') diff --git a/tools/system_libs.py b/tools/system_libs.py index d167f0377d8ce..d54ce75f07e0e 100644 --- a/tools/system_libs.py +++ b/tools/system_libs.py @@ -667,8 +667,7 @@ def check_version(expected_version): if State.unpacked: # we unpacked a new version, clear the build in the cache - shared.try_delete(os.path.join(Ports.get_build_dir(), name)) - shared.try_delete(shared.Cache.get_path(name + '.bc')) + Ports.clear_project_build(name) @staticmethod def build_project(name, subdir, configure, generated_libs, post_create=None): @@ -680,10 +679,13 @@ def create(): configure=configure, make=['make', '-j' + str(CORES)]) assert len(libs) == 1 if post_create: post_create() - logging.warning(' building complete') return libs[0] return shared.Cache.get(name, create) + @staticmethod + def clear_project_build(name): + shared.try_delete(os.path.join(Ports.get_build_dir(), name)) + shared.try_delete(shared.Cache.get_path(name + '.bc')) def get_ports(settings): ret = [] From 27b56d76b1c7c028f1bbc1c0307ac8ab77179141 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 22 Oct 2014 11:33:55 -0700 Subject: [PATCH 441/461] if port version file does not exist, retrieve the latest --- tools/system_libs.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/system_libs.py b/tools/system_libs.py index d54ce75f07e0e..819505c00cbfe 100644 --- a/tools/system_libs.py +++ b/tools/system_libs.py @@ -641,7 +641,9 @@ def check_version(expected_version): try: ok = False subdir = os.listdir(fullname)[0] # each port has a singleton subdir - version = open(os.path.join(fullname, subdir, 'version.txt')).read() + f = os.path.join(fullname, subdir, 'version.txt') + if not os.path.exists(f): return False # no version, need an update + version = open(f).read() version = int(version) ok = True finally: From f42064a12db795f4bc8a87e00c106b771d4b797d Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 22 Oct 2014 11:50:27 -0700 Subject: [PATCH 442/461] handle length 0 in Pointer_stringify; fixes #2912 --- src/preamble.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/preamble.js b/src/preamble.js index c131a9cb3dd70..a1bc48ecefedf 100644 --- a/src/preamble.js +++ b/src/preamble.js @@ -634,6 +634,7 @@ function allocate(slab, types, allocator, ptr) { Module['allocate'] = allocate; function Pointer_stringify(ptr, /* optional */ length) { + if (length === 0) return ''; // TODO: use TextDecoder // Find the length, and check for UTF while doing so var hasUtf = false; From eb6ac90760e514233ddf59ec65f1c6307fcbceb7 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 22 Oct 2014 16:18:09 -0700 Subject: [PATCH 443/461] EMULATE_FUNCTION_POINTER_CASTS option --- emcc | 3 ++ emscripten.py | 52 ++++++++++++++++--- .../guidelines/function_pointer_issues.rst | 3 +- src/settings.js | 4 ++ tests/test_other.py | 26 ++++++---- 5 files changed, 70 insertions(+), 18 deletions(-) diff --git a/emcc b/emcc index 0f746f5c02426..0e295d2f75b67 100755 --- a/emcc +++ b/emcc @@ -989,6 +989,9 @@ try: if not fastcomp and shared.Settings.ASSERTIONS and shared.Settings.ALIASING_FUNCTION_POINTERS: logging.warning('ALIASING_FUNCTION_POINTERS is on, function pointer comparisons may be invalid across types') + if shared.Settings.EMULATE_FUNCTION_POINTER_CASTS: + shared.Settings.ALIASING_FUNCTION_POINTERS = 0 + if shared.Settings.STB_IMAGE and final_suffix in JS_CONTAINING_SUFFIXES: input_files.append((next_arg_index, shared.path_from_root('third_party', 'stb_image.c'))) next_arg_index += 1 diff --git a/emscripten.py b/emscripten.py index 4b8044ffdd3ff..10c409d30b0ea 100755 --- a/emscripten.py +++ b/emscripten.py @@ -815,6 +815,16 @@ def emscript_fast(infile, settings, outfile, libraries=[], compiler_engine=None, #if DEBUG: print >> sys.stderr, "META", metadata #if DEBUG: print >> sys.stderr, "meminit", mem_init + # if emulating pointer casts, force all tables to the size of the largest + if settings['EMULATE_FUNCTION_POINTER_CASTS']: + max_size = 0 + for k, v in metadata['tables'].iteritems(): + max_size = max(max_size, v.count(',')+1) + for k, v in metadata['tables'].iteritems(): + curr = v.count(',')+1 + if curr < max_size: + metadata['tables'][k] = v.replace(']', (',0'*(max_size - curr)) + ']') + # function table masks table_sizes = {} @@ -954,6 +964,19 @@ def save_settings(): #if DEBUG: outfile.write('// funcs\n') if settings.get('ASM_JS'): + # when emulating function pointer casts, we need to know what is the target of each pointer + if settings['EMULATE_FUNCTION_POINTER_CASTS']: + function_pointer_targets = {} + for sig, table in last_forwarded_json['Functions']['tables'].iteritems(): + start = table.index('[') + end = table.rindex(']') + body = table[start+1:end].split(',') + parsed = map(lambda x: x.strip(), body) + for i in range(len(parsed)): + if parsed[i] != '0': + assert i not in function_pointer_targets + function_pointer_targets[i] = [sig, str(parsed[i])] + # Move preAsms to their right place def move_preasm(m): contents = m.groups(0)[0] @@ -978,12 +1001,15 @@ def unfloat(s): if settings['ASSERTIONS'] >= 2: debug_tables = {} + def make_params(sig): return ','.join(['p%d' % p for p in range(len(sig)-1)]) + def make_coerced_params(sig): return ','.join([shared.JS.make_coercion('p%d', unfloat(sig[p+1]), settings) % p for p in range(len(sig)-1)]) + def make_coercions(sig): return ';'.join(['p%d = %s' % (p, shared.JS.make_coercion('p%d' % p, sig[p+1], settings)) for p in range(len(sig)-1)]) + ';' + def make_func(name, code, params, coercions): return 'function %s(%s) { %s %s }' % (name, params, coercions, code) + def make_table(sig, raw): - params = ','.join(['p%d' % p for p in range(len(sig)-1)]) - coerced_params = ','.join([shared.JS.make_coercion('p%d', unfloat(sig[p+1]), settings) % p for p in range(len(sig)-1)]) - coercions = ';'.join(['p%d = %s' % (p, shared.JS.make_coercion('p%d' % p, sig[p+1], settings)) for p in range(len(sig)-1)]) + ';' - def make_func(name, code): - return 'function %s(%s) { %s %s }' % (name, params, coercions, code) + params = make_params(sig) + coerced_params = make_coerced_params(sig) + coercions = make_coercions(sig) def make_bad(target=None): i = Counter.i Counter.i += 1 @@ -995,7 +1021,7 @@ def make_bad(target=None): code = 'nullFunc_' + sig + '(%d);' % target if sig[0] != 'v': code += 'return %s' % shared.JS.make_initializer(sig[0], settings) + ';' - return name, make_func(name, code) + return name, make_func(name, code, params, coercions) bad, bad_func = make_bad() # the default bad func if settings['ASSERTIONS'] <= 1: Counter.pre = [bad_func] @@ -1013,6 +1039,18 @@ def fix_item(item): Counter.j += 1 newline = Counter.j % 30 == 29 if item == '0': + if Counter.j > 1 and settings['EMULATE_FUNCTION_POINTER_CASTS']: # emulate all non-null pointer calls, if asked to + proper_sig, proper_target = function_pointer_targets[Counter.j - 1] + def make_emulated_param(i): + if i >= len(sig): return shared.JS.make_initializer(proper_sig[i], settings) # extra param, just send a zero + return shared.JS.make_coercion('p%d' % (i-1), proper_sig[i], settings) + proper_code = proper_target + '(' + ','.join(map(lambda i: make_emulated_param(i+1), range(len(proper_sig)-1))) + ')' + if proper_sig[0] != 'v': + proper_code = 'return %s' % shared.JS.make_coercion(proper_code, sig[0], settings) + name = 'fpemu_%s_%d' % (sig, Counter.j-1) + wrapper = make_func(name, proper_code, params, coercions) + Counter.pre.append(wrapper) + return name if not newline else (name + '\n') if settings['ASSERTIONS'] <= 1: return bad if not newline else (bad + '\n') else: @@ -1030,7 +1068,7 @@ def fix_item(item): if sig[0] == 'f': code = '+' + code code = 'return ' + shared.JS.make_coercion(code, sig[0], settings) code += ';' - Counter.pre.append(make_func(item + '__wrapper', code)) + Counter.pre.append(make_func(item + '__wrapper', code, params, coercions)) return item + '__wrapper' return item if not newline else (item + '\n') if settings['ASSERTIONS'] >= 2: diff --git a/site/source/docs/porting/guidelines/function_pointer_issues.rst b/site/source/docs/porting/guidelines/function_pointer_issues.rst index a6450ce758cdb..940a45d64314c 100644 --- a/site/source/docs/porting/guidelines/function_pointer_issues.rst +++ b/site/source/docs/porting/guidelines/function_pointer_issues.rst @@ -55,10 +55,11 @@ As mentioned :ref:`above `, in **asm.js** m .. note:: Having a separate table for each type of function pointer allows the JavaScript engine to know the exact type of each function pointer call, and optimize those calls much better than would otherwise be possible. -There are two solutions to this problem (the second is preferred): +There are three solutions to this problem (the second is preferred): - Cast the function pointer back to the correct type before it is called. This is problematic because it requires that the caller knows the original type. - Make an adapter function that does not need to be cast, and will hence be found in the correct function-pointer table. From the adaptor function call the original function. + - Use ``EMULATE_FUNCTION_POINTER_CASTS``. When you build with ``-s EMULATE_FUNCTION_POINTER_CASTS=1``, Emscripten emits code to emulate function pointer casts at runtime, adding extra arguments/dropping them/changing their type/adding or dropping a return type/etc. This can add significant runtime overhead, so it is not recommended, but might be worth trying. For a real-world example, consider the code below: diff --git a/src/settings.js b/src/settings.js index 587a5da78c6b3..eb34d2dba67cf 100644 --- a/src/settings.js +++ b/src/settings.js @@ -213,6 +213,10 @@ var ALIASING_FUNCTION_POINTERS = 0; // Whether to allow function pointers to ali // a different type. This can greatly decrease table sizes // in asm.js, but can break code that compares function // pointers across different types. +var EMULATE_FUNCTION_POINTER_CASTS = 0; // Allows function pointers to be cast, wraps each + // call of an incorrect type with a runtime correction. + // This adds overhead and should not be used normally. + // It also forces ALIASING_FUNCTION_POINTERS to 0. var FUNCTION_POINTER_ALIGNMENT = 2; // Byte alignment of function pointers - we will fill the // tables with zeros on aligned values. 1 means all values // are aligned and all will be used (which is optimal). diff --git a/tests/test_other.py b/tests/test_other.py index ad2073c5d797b..f94f2cf442044 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -591,6 +591,7 @@ def test(args, expected, err_expected=None): test(['-O1', '-s', 'ASSERTIONS=2'], '''Invalid function pointer '0' called with signature 'v'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this) This pointer might make sense in another type signature: i: 0 ''') # actually useful identity of the bad pointer, with comparisons to what it would be in other types/tables + test(['-O1', '-s', 'EMULATE_FUNCTION_POINTER_CASTS=1'], '''my func\n''') # emulate so it works def test_l_link(self): # Linking with -lLIBNAME and -L/DIRNAME should work @@ -2934,17 +2935,22 @@ def test_bad_function_pointer_cast(self): for opts in [0, 1, 2]: for safe in [0, 1]: - cmd = [PYTHON, EMCC, 'src.cpp', '-O' + str(opts), '-s', 'SAFE_HEAP=' + str(safe)] - print cmd - Popen(cmd).communicate() - output = run_js('a.out.js', stderr=PIPE, full_output=True, assert_returncode=None) - if safe: - assert 'Function table mask error' in output, output - else: - if opts == 0: - assert 'Invalid function pointer called' in output, output + for emulate in [0, 1]: + cmd = [PYTHON, EMCC, 'src.cpp', '-O' + str(opts), '-s', 'SAFE_HEAP=' + str(safe)] + if emulate: + cmd += ['-s', 'EMULATE_FUNCTION_POINTER_CASTS=1'] + print cmd + Popen(cmd).communicate() + output = run_js('a.out.js', stderr=PIPE, full_output=True, assert_returncode=None) + if emulate: + assert 'Hello, world.' in output, output + elif safe: + assert 'Function table mask error' in output, output else: - assert 'abort()' in output, output + if opts == 0: + assert 'Invalid function pointer called' in output, output + else: + assert 'abort()' in output, output def test_aliased_func_pointers(self): open('src.cpp', 'w').write(r''' From 90324df5b94014801bcf9b30f61dd4a2b0b2082d Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 22 Oct 2014 16:55:06 -0700 Subject: [PATCH 444/461] disable clang warnings when building sdl2 and sdl2-image --- tools/ports/sdl.py | 2 +- tools/ports/sdl_image.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/ports/sdl.py b/tools/ports/sdl.py index 8c9601d81c027..2333f445157d4 100644 --- a/tools/ports/sdl.py +++ b/tools/ports/sdl.py @@ -41,7 +41,7 @@ def create(): for src in srcs: o = os.path.join(ports.get_build_dir(), 'sdl2', 'src', src + '.o') shared.safe_ensure_dirs(os.path.dirname(o)) - commands.append([shared.PYTHON, shared.EMCC, os.path.join(ports.get_dir(), 'sdl2', 'SDL2-master', 'src', src), '-O2', '-o', o, '-I' + dest_include_path, '-O2', '-DUSING_GENERATED_CONFIG_H', '-Wno-warn-absolute-paths']) + commands.append([shared.PYTHON, shared.EMCC, os.path.join(ports.get_dir(), 'sdl2', 'SDL2-master', 'src', src), '-O2', '-o', o, '-I' + dest_include_path, '-O2', '-DUSING_GENERATED_CONFIG_H', '-Wno-warn-absolute-paths', '-w']) o_s.append(o) ports.run_commands(commands) final = os.path.join(ports.get_build_dir(), 'sdl2', 'libsdl2.bc') diff --git a/tools/ports/sdl_image.py b/tools/ports/sdl_image.py index 78ad23b822bb0..a907ecba37564 100644 --- a/tools/ports/sdl_image.py +++ b/tools/ports/sdl_image.py @@ -16,7 +16,7 @@ def create(): o_s = [] for src in srcs: o = os.path.join(ports.get_build_dir(), 'sdl2-image', src + '.o') - commands.append([shared.PYTHON, shared.EMCC, os.path.join(ports.get_dir(), 'sdl2-image', 'SDL2_image-master', src), '-O2', '-s', 'USE_SDL=2', '-o', o]) + commands.append([shared.PYTHON, shared.EMCC, os.path.join(ports.get_dir(), 'sdl2-image', 'SDL2_image-master', src), '-O2', '-s', 'USE_SDL=2', '-o', o, '-w']) o_s.append(o) shared.safe_ensure_dirs(os.path.dirname(o_s[0])) ports.run_commands(commands) From 5ae8b07f2401417b18174b4f65c507b42b63cbd1 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 22 Oct 2014 17:00:34 -0700 Subject: [PATCH 445/461] check for a missing directory in check_version in ports support code --- tools/system_libs.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/system_libs.py b/tools/system_libs.py index 819505c00cbfe..5926a203f6f98 100644 --- a/tools/system_libs.py +++ b/tools/system_libs.py @@ -640,7 +640,10 @@ def unpack(): def check_version(expected_version): try: ok = False - subdir = os.listdir(fullname)[0] # each port has a singleton subdir + if not os.path.exists(fullname): return False + subdir = os.listdir(fullname) + if len(subdir) != 1: return False + subdir = subdir[0] # each port has a singleton subdir f = os.path.join(fullname, subdir, 'version.txt') if not os.path.exists(f): return False # no version, need an update version = open(f).read() From bfd7ecd0e8116c187dc9d90dc2148c6e2fd604da Mon Sep 17 00:00:00 2001 From: Bruce Mitchener Date: Thu, 23 Oct 2014 09:37:57 +0700 Subject: [PATCH 446/461] Fix missing __lock / __unlock. This was noticed as srandom / random use those. Fixes issue #2916. --- src/library.js | 2 ++ tests/test_core.py | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/src/library.js b/src/library.js index d00b921ba5cb8..a7e485c5a3f32 100644 --- a/src/library.js +++ b/src/library.js @@ -8900,6 +8900,8 @@ LibraryManager.library = { }, // misc shims for musl + __lock: function() {}, + __unlock: function() {}, __lockfile: function() { return 1 }, __unlockfile: function(){}, diff --git a/tests/test_core.py b/tests/test_core.py index 1821192c3396e..6ab35d2808030 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -3778,6 +3778,18 @@ def zzztest_dlfcn_exceptions(self): # TODO: make this work. need to forward temp ok ''', post_build=self.dlfcn_post_build) + def test_random(self): + src = r'''#include +#include + +int main() +{ + srandom(0xdeadbeef); + printf("%ld", random()); +} +''' + self.do_run(src, '956867869') + def test_rand(self): src = r'''#include #include From 28a06c8842c04579e7f6bcb368f6cb800522933d Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 23 Oct 2014 11:25:58 -0700 Subject: [PATCH 447/461] fix ports upgrades due to version changes --- tools/system_libs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/system_libs.py b/tools/system_libs.py index 5926a203f6f98..210735e5f936a 100644 --- a/tools/system_libs.py +++ b/tools/system_libs.py @@ -667,8 +667,8 @@ def check_version(expected_version): shared.try_delete(fullname) shared.try_delete(fullname + '.zip') retrieve() - assert check_version(expected_version), 'just retrieved replacement port ' + name + ', but not a new enough version?' unpack() + assert check_version(expected_version), 'just retrieved replacement port ' + name + ', but not a new enough version?' if State.unpacked: # we unpacked a new version, clear the build in the cache From 11f1c63099cd348e6a3e51fc99f4f44984f0f630 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 23 Oct 2014 11:26:07 -0700 Subject: [PATCH 448/461] bump sdl and sdl-image port versions --- tools/ports/sdl.py | 2 +- tools/ports/sdl_image.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/ports/sdl.py b/tools/ports/sdl.py index 2333f445157d4..cc77c6f6461fc 100644 --- a/tools/ports/sdl.py +++ b/tools/ports/sdl.py @@ -1,6 +1,6 @@ import os, shutil, logging -VERSION = 1 +VERSION = 2 def get_with_configure(ports, settings, shared): # not currently used; no real need for configure on emscripten users' machines! if settings.USE_SDL == 2: diff --git a/tools/ports/sdl_image.py b/tools/ports/sdl_image.py index a907ecba37564..9a62a897525e1 100644 --- a/tools/ports/sdl_image.py +++ b/tools/ports/sdl_image.py @@ -1,6 +1,6 @@ import os, shutil, logging -VERSION = 1 +VERSION = 2 def get(ports, settings, shared): if settings.USE_SDL_IMAGE == 2: From 2313962cdee82b320672f6277757417347193d69 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 23 Oct 2014 11:31:11 -0700 Subject: [PATCH 449/461] sanity test for port version causing retrieve --- tests/test_sanity.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/tests/test_sanity.py b/tests/test_sanity.py index d8ffb447daf26..d1739e9445c13 100644 --- a/tests/test_sanity.py +++ b/tests/test_sanity.py @@ -609,9 +609,22 @@ def test_emcc_ports(self): assert BUILDING_MESSAGE in output, output assert os.path.exists(PORTS_DIR) - # Using it again avoids retrieve and build + def second_use(): + # Using it again avoids retrieve and build + output = self.do([EMCC, path_from_root('tests', 'hello_world_sdl.cpp'), '-s', 'USE_SDL=2']) + assert INCLUDING_MESSAGE in output, output + assert RETRIEVING_MESSAGE not in output, output + assert BUILDING_MESSAGE not in output, output + + second_use() + + # if the version isn't sufficient, we retrieve and rebuild + open(os.path.join(PORTS_DIR, 'sdl2', 'SDL2-master', 'version.txt'), 'w').write('1') # current is >= 2, so this is too old output = self.do([EMCC, path_from_root('tests', 'hello_world_sdl.cpp'), '-s', 'USE_SDL=2']) assert INCLUDING_MESSAGE in output, output - assert RETRIEVING_MESSAGE not in output, output - assert BUILDING_MESSAGE not in output, output + assert RETRIEVING_MESSAGE in output, output + assert BUILDING_MESSAGE in output, output + assert os.path.exists(PORTS_DIR) + + second_use() From 4a045e5c8a01730203777ecadaea329c89122d77 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 23 Oct 2014 12:16:37 -0700 Subject: [PATCH 450/461] fix nm scanning; notice only U, C, T --- tests/test_other.py | 35 +++++++++++++++++++++++++++++++++++ tools/shared.py | 7 ++++--- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/tests/test_other.py b/tests/test_other.py index f94f2cf442044..25ccfffc006d5 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4348,3 +4348,38 @@ def test_emterpreter_swap_orig(self): out = run_js('second.js', engine=SPIDERMONKEY_ENGINE, stderr=PIPE, full_output=True, assert_returncode=None) self.validate_asmjs(out) + def test_link_with_a_static(self): + for args in [[], ['-O2']]: + print args + self.clear() + open('x.c', 'w').write(r''' +int init_weakref(int a, int b) { + return a + b; +} +''') + open('y.c', 'w').write(r''' +static int init_weakref(void) { // inlined in -O2, not in -O0 where it shows up in llvm-nm as 't' + return 150; +} + +int testy(void) { + return init_weakref(); +} +''') + open('z.c', 'w').write(r''' +extern int init_weakref(int, int); +extern int testy(void); + +int main(void) { + return testy() + init_weakref(5, 6); +} +''') + Popen([PYTHON, EMCC, 'x.c', '-o', 'x.o']).communicate() + Popen([PYTHON, EMCC, 'y.c', '-o', 'y.o']).communicate() + Popen([PYTHON, EMCC, 'z.c', '-o', 'z.o']).communicate() + Popen([PYTHON, EMAR, 'rc', 'libtest.a', 'y.o']).communicate() + Popen([PYTHON, EMAR, 'rc', 'libtest.a', 'x.o']).communicate() + Popen([PYTHON, EMRANLIB, 'libtest.a']).communicate() + Popen([PYTHON, EMCC, 'z.o', 'libtest.a'] + args).communicate() + out = run_js('a.out.js', assert_returncode=161) + diff --git a/tools/shared.py b/tools/shared.py index 1a82764eeb44a..4067af579ffde 100644 --- a/tools/shared.py +++ b/tools/shared.py @@ -1423,10 +1423,11 @@ class ret: status, symbol = parts if status == 'U': ret.undefs.append(symbol) - elif status != 'C': - ret.defs.append(symbol) - else: + elif status == 'C': ret.commons.append(symbol) + elif status == status.upper(): # all other uppercase statuses ('T', etc.) are normally defined symbols + ret.defs.append(symbol) + # otherwise, not something we should notice ret.defs = set(ret.defs) ret.undefs = set(ret.undefs) ret.commons = set(ret.commons) From 1bc77f0fbff20b950f6c5abd1c99db4fd13227d1 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 23 Oct 2014 13:47:52 -0700 Subject: [PATCH 451/461] handle some corner cases in EMULATE_FUNCTION_POINTER_CASTS, and add testing --- emscripten.py | 20 ++++++++++++++------ tests/test_core.py | 6 +++++- tools/shared.py | 9 +++++++-- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/emscripten.py b/emscripten.py index 10c409d30b0ea..aa847ac7ccf2b 100755 --- a/emscripten.py +++ b/emscripten.py @@ -1036,25 +1036,33 @@ def make_bad(target=None): implemented_functions.add(curr) Counter.j = 0 def fix_item(item): + j = Counter.j Counter.j += 1 newline = Counter.j % 30 == 29 if item == '0': - if Counter.j > 1 and settings['EMULATE_FUNCTION_POINTER_CASTS']: # emulate all non-null pointer calls, if asked to - proper_sig, proper_target = function_pointer_targets[Counter.j - 1] + if j > 0 and settings['EMULATE_FUNCTION_POINTER_CASTS'] and j in function_pointer_targets: # emulate all non-null pointer calls, if asked to + proper_sig, proper_target = function_pointer_targets[j] def make_emulated_param(i): if i >= len(sig): return shared.JS.make_initializer(proper_sig[i], settings) # extra param, just send a zero - return shared.JS.make_coercion('p%d' % (i-1), proper_sig[i], settings) + return shared.JS.make_coercion('p%d' % (i-1), proper_sig[i], settings, convert_from=sig[i]) proper_code = proper_target + '(' + ','.join(map(lambda i: make_emulated_param(i+1), range(len(proper_sig)-1))) + ')' if proper_sig[0] != 'v': - proper_code = 'return %s' % shared.JS.make_coercion(proper_code, sig[0], settings) - name = 'fpemu_%s_%d' % (sig, Counter.j-1) + # proper sig has a return, which the wrapper may or may not use + proper_code = shared.JS.make_coercion(proper_code, proper_sig[0], settings) + if sig[0] != 'v': + proper_code = 'return ' + proper_code + else: + # proper sig has no return, we may need a fake return + if sig[0] != 'v': + proper_code = 'return ' + shared.JS.make_initializer(sig[0], settings) + name = 'fpemu_%s_%d' % (sig, j) wrapper = make_func(name, proper_code, params, coercions) Counter.pre.append(wrapper) return name if not newline else (name + '\n') if settings['ASSERTIONS'] <= 1: return bad if not newline else (bad + '\n') else: - specific_bad, specific_bad_func = make_bad(Counter.j-1) + specific_bad, specific_bad_func = make_bad(j) Counter.pre.append(specific_bad_func) return specific_bad if not newline else (specific_bad + '\n') if item not in implemented_functions: diff --git a/tests/test_core.py b/tests/test_core.py index 6ab35d2808030..1231155b7cace 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -511,7 +511,11 @@ def test_bswap64(self): test_path = path_from_root('tests', 'core', 'test_bswap64') src, output = (test_path + s for s in ('.in', '.out')) - self.do_run_from_file(src, output) + for emulate_fps in [0, 1]: + if os.environ.get('EMCC_FAST_COMPILER') == '0' and emulate_fps: continue # only in fastcomp + print emulate_fps + Settings.EMULATE_FUNCTION_POINTER_CASTS = emulate_fps # extra coverage for this + self.do_run_from_file(src, output) def test_sha1(self): if self.emcc_args == None: return self.skip('needs ta2') diff --git a/tools/shared.py b/tools/shared.py index 4067af579ffde..85e8a906c0209 100644 --- a/tools/shared.py +++ b/tools/shared.py @@ -1762,12 +1762,17 @@ def make_initializer(sig, settings=None): else: return '+0' + FLOAT_SIGS = ['f', 'd'] + @staticmethod - def make_coercion(value, sig, settings=None, ffi_arg=False, ffi_result=False): + def make_coercion(value, sig, settings=None, ffi_arg=False, ffi_result=False, convert_from=None): settings = settings or Settings if sig == 'i': + if convert_from in JS.FLOAT_SIGS: value = '(~~' + value + ')' return value + '|0' - elif sig == 'f' and settings.get('PRECISE_F32'): + if sig in JS.FLOAT_SIGS and convert_from == 'i': + value = '(' + value + '|0)' + if sig == 'f' and settings.get('PRECISE_F32'): if ffi_arg: return '+Math_fround(' + value + ')' elif ffi_result: From 24db560f9d5f147acc1eb8a9afc6c91c337a5a6a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 23 Oct 2014 17:28:18 -0700 Subject: [PATCH 452/461] website analytics --- site/source/_templates/layout.html | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 site/source/_templates/layout.html diff --git a/site/source/_templates/layout.html b/site/source/_templates/layout.html new file mode 100644 index 0000000000000..ca6d84b674303 --- /dev/null +++ b/site/source/_templates/layout.html @@ -0,0 +1,22 @@ +{% extends '!layout.html' %} + +{% block footer %} + + + + +{% endblock %} + From c00299967430fa54c688e02ecae42eca4697d75a Mon Sep 17 00:00:00 2001 From: Bruce Mitchener Date: Fri, 24 Oct 2014 14:21:40 +0700 Subject: [PATCH 453/461] Fix typo. --- src/library_fs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/library_fs.js b/src/library_fs.js index 5cdf6277978e6..7c59c79680e60 100644 --- a/src/library_fs.js +++ b/src/library_fs.js @@ -1787,7 +1787,7 @@ mergeInto(LibraryManager.library, { openRequest.onerror = onerror; }, - // asychronously loads a file from IndexedDB. + // asynchronously loads a file from IndexedDB. loadFilesFromDB: function(paths, onload, onerror) { onload = onload || function(){}; onerror = onerror || function(){}; From 28b4a3f7a3aa61bf7e812da08e7ef320c3a8410f Mon Sep 17 00:00:00 2001 From: "Felix H. Dahlke" Date: Sun, 26 Oct 2014 03:09:00 +0100 Subject: [PATCH 454/461] Implement TTF_FontLineSkip --- src/library_sdl.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/library_sdl.js b/src/library_sdl.js index e16de41f0210d..1cef38ca63a00 100644 --- a/src/library_sdl.js +++ b/src/library_sdl.js @@ -2834,6 +2834,8 @@ var LibrarySDL = { return fontData.size; }, + TTF_FontLineSkip: 'TTF_FontHeight', // XXX + TTF_Quit: function() { Module.print('TTF_Quit called (and ignored)'); }, From 88fa0d26a7614969d7415becba1dd1093b8a629e Mon Sep 17 00:00:00 2001 From: Aleksander Guryanov Date: Thu, 23 Oct 2014 22:10:00 +0700 Subject: [PATCH 455/461] SDL_CreateRGBSurfaceFrom for surfaces with depth 32 --- src/library_sdl.js | 29 +++++++++++++++++--- tests/sdl_create_rgb_surface_from.c | 38 ++++++++++++++++++++++++++ tests/sdl_create_rgb_surface_from.png | Bin 0 -> 3195 bytes tests/test_browser.py | 3 ++ 4 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 tests/sdl_create_rgb_surface_from.c create mode 100644 tests/sdl_create_rgb_surface_from.png diff --git a/src/library_sdl.js b/src/library_sdl.js index e16de41f0210d..46c1a7064ad04 100644 --- a/src/library_sdl.js +++ b/src/library_sdl.js @@ -1694,10 +1694,31 @@ var LibrarySDL = { }, SDL_CreateRGBSurfaceFrom: function(pixels, width, height, depth, pitch, rmask, gmask, bmask, amask) { - // TODO: Actually fill pixel data to created surface. - // TODO: Take into account depth and pitch parameters. - console.log('TODO: Partially unimplemented SDL_CreateRGBSurfaceFrom called!'); - return SDL.makeSurface(width, height, 0, false, 'CreateRGBSurfaceFrom', rmask, gmask, bmask, amask); + var surf = SDL.makeSurface(width, height, 0, false, 'CreateRGBSurfaceFrom', rmask, gmask, bmask, amask); + + if (depth !== 32) { + // TODO: Actually fill pixel data to created surface. + // TODO: Take into account depth and pitch parameters. + console.log('TODO: Partially unimplemented SDL_CreateRGBSurfaceFrom called!'); + return surf; + } + + var data = SDL.surfaces[surf]; + var image = data.ctx.createImageData(width, height); + var pitchOfDst = width * 4; + + for (var row = 0; row < height; ++row) { + var baseOfSrc = row * pitch; + var baseOfDst = row * pitchOfDst; + + for (var col = 0; col < width * 4; ++col) { + image.data[baseOfDst + col] = {{{ makeGetValue('pixels', 'baseOfDst + col', 'i8', null, true) }}}; + } + } + + data.ctx.putImageData(image, 0, 0); + + return surf; }, SDL_ConvertSurface: function(surf, format, flags) { diff --git a/tests/sdl_create_rgb_surface_from.c b/tests/sdl_create_rgb_surface_from.c new file mode 100644 index 0000000000000..110e550a5ee4d --- /dev/null +++ b/tests/sdl_create_rgb_surface_from.c @@ -0,0 +1,38 @@ +#include +#include +#include +#include + +#define width 600 +#define height 450 + +int main() { + + uint8_t pixels[width * height * 4]; + uint8_t *end = pixels + width * height * 4; + uint8_t *pixel = pixels; + SDL_Rect rect = {0, 0, width, height}; + + while (pixel != end) { + *pixel = (pixel - pixels) * 256 / (width * height * 4); + pixel++; + } + + SDL_Init(SDL_INIT_VIDEO); + SDL_Surface *screen = SDL_SetVideoMode(width, height, 32, SDL_HWSURFACE); + SDL_Surface *image = SDL_CreateRGBSurfaceFrom(pixels, width, height, 32, width * 4, + 0x000000ff, + 0x0000ff00, + 0x00ff0000, + 0xff000000); + + SDL_FillRect(screen, &rect, SDL_MapRGB(screen->format, 255, 0, 0)); + SDL_BlitSurface(image, &rect, screen, &rect); + SDL_UpdateRect(screen, 0, 0, width, height); + + printf("There should be a red to white gradient\n"); + + SDL_Quit(); + + return 0; +} diff --git a/tests/sdl_create_rgb_surface_from.png b/tests/sdl_create_rgb_surface_from.png new file mode 100644 index 0000000000000000000000000000000000000000..6730c8a151a3fb3e5b414a02bd656c11a8051bb9 GIT binary patch literal 3195 zcmY*cc|a5A68|>mLIP|w5){M*wMNAx3My8_WNQ>3h|yY&C>W|xJU|MFU@5L-u}Em8 z#fL{N5J8K|k>^824vn!qfhq*6s0bK5I211gIXv2LLH~GvB)i$2nQ!JdGryVaQ~58k zu^wj)0I*r=vuGs%3^f3V31z@16$0EHUaTU0)5{^+pmlQSRj=N$gATkU(7-K-%1hEm1SSU^ELJ&UHJx}qhgsl(2A)NHig;R#>~<|-k>~JT z*sis793OpO(^WV=tBX~t!O8~e6i1lrqgL$LDkNXJvT`I+^>%FNDdUrHPlB2O;F)OO z_xsK6Ent%kkzr@?stYcVp@j&jff17x!ycwjO6+D>E-5;xrUvQPqN$OCH6^Vb7bbMgBfzl> zv#m)53Ql$lOogpKgtai@){WF;}&Ewdx zG}!Mlo!#c6l{@rFzfR9Vzx|4>j>O6=48!^RJ0(y=6Mbn)_PSh9C0gD1pivAO-tk8d zqjP3SsbhT%(`zmoI2Tb-{e!h)z~Hpi=hp36Nd^?1cDE&VkAXFSsndVs;PCu@XzMqH_kaw3(H({nLR* zw(d7KvOz9af0rqrb$&5YEg^h?SKiJk{&%CXG6;by#p^MR1JQiq_C%00&y6XM6EKWx zD#y?04AsLNEQ;PL1X>KNygPBz%!qbomDU`>21*`*xm`WEf-YR2ko}Q1=OmzR z993ihiw0w5wb1yPg!v93`!O;M8fkZjPJ%WZ+O`b2ocPwiS;W3kr!a5NB` zxKB+RTR`_*bV646#h>kSQcKiP7(=BDxON4Wj00@r+J~c?AMTxp!N%)>f&Cse%bJYm z>Zh^|SbgA86=g5fjL$0f48|Be4514y#WOlkL9r%F9 zX!x*gS#eXP1xPucC=P{4tUqj@)x{CI)NHdbQ&mB*l^?UgmBG*vOef73`OQTu#jsio zq3aSpFd?<%p!cuyvaM+HnRF{zfzlasGuuCll%-~H^xG#gO&~BrXjM*Nf)j89zXQ)1>Ok%rc{7Kh3Hu}Xi(-|op)(&D zD)9*~J9C(T4ET&~fgpW71+#rq*^9H}fqrvP(w-YxkGrghAa z$;h#!DZ-3^HA2s@u&a4O{Xr?D@6WdA>UYB{5Vn=a2j5`A)8a0<1Z8PvAHwTqYt?JX7PeY#;*%9d?NZ|2^n22aHEn$%dfkur zo&k_p=n{hB5?|f(3p{!xai4Tp;9XNiTpV@^1IKh2dH=6t^Bm6h;l1(&Fb0PfQ6_R? zECr)cR@cV21|Q#AyqDlU z|5j$LM62T4yuD-(@fbA+C`-TIaOgfbz$Zqt@pS{2#c-D1NS=@urRL<<^UfbpZ^k}% zV?wGr{MPi%Y|BkW=QQ}sZ>g@)$(CUW#bUJxdHeO(gZENlJ*U$%_t0_4u7wF69Z8DL zMzM^0Y3CkSs_a}?RylBXq@44)azT%3gPKE*=jvTqn#lFN-u1n&MlxbZ+@NN*I#5A! z7@}o)fKy8%vdD(`j(VB=O_@Tl@`&jAbGETrYi9NVw}({up-*R4Z|X>@r_Y0FiJLEl zGos*g^qGKQ*9VfWd7e@?h7ndw63^JaxuNOR>u1YhL)~e9G2Db+zlpNS@9cv!W0M^u z=r#SxcDa$y@ZQf@a>1FU0VVCdqm9v8LwN)o-Y+_mv!8G@e=7!}1w*xB5;oVN7;IMp zgQk|oZMrL*g*W-ci^=p1QBlH<rVvvIdduAKSwH*CZ0aV$X=xayb=IW&_9Loub>0){#P0jRn)6vhq=7m-+rYUW4 zfJc2GxTQ5ayMR>LZ0WmIb4f)$isb*P8>2HrjbCUD_Y=x!S?UU{xo`y}z3wcL?c(7@ zEjV}sFkHoBmT@gjrKP>Cc@RHJhtxE@$qC=E4Y0YqVZvwSOPW(Shr+Qk52j&L zK*+J7%Y>ZTKG)Zo~Y z2XAiN3xxpzdscj^d^kuJ2a6-cUF@LJ5wLD`sv;$git((6- z@tdi{ZY#3w-JL2wEq2FM+P&VW)0&HyLl$eBBZcEKDRmf*m(3NjtKI**07Y@i=Gd6J+74k6e`6I=X)QmCVf&iyvfV%;{~@T7s72m0s+ j$S*tLd^LCsNa>Rn?;T25Ge`` Date: Mon, 27 Oct 2014 11:11:41 -0700 Subject: [PATCH 456/461] add some slack to browser.test_sdl2_mouse --- tests/sdl2_mouse.c | 24 +++++++++++++++++++----- tests/test_browser.py | 4 ++-- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/tests/sdl2_mouse.c b/tests/sdl2_mouse.c index 2e8ca13ef66b1..c94ff9a84c308 100644 --- a/tests/sdl2_mouse.c +++ b/tests/sdl2_mouse.c @@ -3,6 +3,9 @@ #include #include +/* OS X mouse events can have fractional elements; round to multiples of 5 (our values are all multiples of 10) */ +#define SLACK(x) (5*((x+2)/5)) + int result = 1; void one() { @@ -12,7 +15,12 @@ void one() { case SDL_MOUSEMOTION: { SDL_MouseMotionEvent *m = (SDL_MouseMotionEvent*)&event; assert(m->state == 0); - printf("motion: %d,%d %d,%d\n", m->x, m->y, m->xrel, m->yrel); + printf("motion pre : %d,%d %d,%d\n", m->x, m->y, m->xrel, m->yrel); + m->x = SLACK(m->x); + m->y = SLACK(m->y); + m->xrel = SLACK(m->xrel); + m->yrel = SLACK(m->yrel); + printf("motion post: %d,%d %d,%d\n", m->x, m->y, m->xrel, m->yrel); result += 2 * (m->x + m->y + m->xrel + m->yrel); break; } @@ -22,13 +30,19 @@ void one() { REPORT_RESULT(); emscripten_run_script("throw 'done'"); } - printf("button down: %d,%d %d,%d\n", m->button, m->state, m->x, m->y); + printf("button down pre : %d,%d %d,%d\n", m->button, m->state, m->x, m->y); + m->x = SLACK(m->x); + m->y = SLACK(m->y); + printf("button down post: %d,%d %d,%d\n", m->button, m->state, m->x, m->y); result += 3 * (m->button + m->state + m->x + m->y); break; } case SDL_MOUSEBUTTONUP: { SDL_MouseButtonEvent *m = (SDL_MouseButtonEvent*)&event; - printf("button up: %d,%d %d,%d\n", m->button, m->state, m->x, m->y); + printf("button up pre : %d,%d %d,%d\n", m->button, m->state, m->x, m->y); + m->x = SLACK(m->x); + m->y = SLACK(m->y); + printf("button up post: %d,%d %d,%d\n", m->button, m->state, m->x, m->y); result += 5 * (m->button + m->state + m->x + m->y); // Remove another click we want to ignore assert(SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_MOUSEBUTTONDOWN, SDL_MOUSEBUTTONDOWN) == 1); @@ -61,8 +75,8 @@ void main_2(void* arg) { emscripten_run_script("window.simulateMouseEvent(10, 20, -1)"); // move from 0,0 to 10,20 emscripten_run_script("window.simulateMouseEvent(10, 20, 0)"); // click emscripten_run_script("window.simulateMouseEvent(10, 20, 0)"); // click some more, but this one should be ignored through PeepEvent - emscripten_run_script("window.simulateMouseEvent(30, 77, -1)"); // move some more - emscripten_run_script("window.simulateMouseEvent(30, 77, 1)"); // trigger the end + emscripten_run_script("window.simulateMouseEvent(30, 70, -1)"); // move some more + emscripten_run_script("window.simulateMouseEvent(30, 70, 1)"); // trigger the end emscripten_set_main_loop(one, 0, 0); } diff --git a/tests/test_browser.py b/tests/test_browser.py index 2be83412e18b5..fbfc8872c8dc1 100644 --- a/tests/test_browser.py +++ b/tests/test_browser.py @@ -2187,7 +2187,7 @@ def test_sdl2_mouse(self): open(os.path.join(self.get_dir(), 'sdl2_mouse.c'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl2_mouse.c')).read())) Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl2_mouse.c'), '-O2', '--minify', '0', '-o', 'page.html', '--pre-js', 'pre.js', '-s', 'USE_SDL=2']).communicate() - self.run_browser('page.html', '', '/report_result?740') + self.run_browser('page.html', '', '/report_result?712') def test_sdl2_mouse_offsets(self): open(os.path.join(self.get_dir(), 'pre.js'), 'w').write(''' @@ -2265,7 +2265,7 @@ def test_sdl2_mouse_offsets(self): open(os.path.join(self.get_dir(), 'sdl2_mouse.c'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl2_mouse.c')).read())) Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl2_mouse.c'), '-O2', '--minify', '0', '-o', 'sdl2_mouse.js', '--pre-js', 'pre.js', '-s', 'USE_SDL=2']).communicate() - self.run_browser('page.html', '', '/report_result?600') + self.run_browser('page.html', '', '/report_result?572') def test_sdl2glshader(self): self.btest('sdl2glshader.c', reference='sdlglshader.png', args=['-s', 'USE_SDL=2', '-O2', '--closure', '1', '-s', 'LEGACY_GL_EMULATION=1']) From 1a5934a08d74a614e7258fefe628dc600bdabf1e Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 27 Oct 2014 15:23:11 -0700 Subject: [PATCH 457/461] disable most websockify-using parts of sockets tests; #2700 --- tests/test_sockets.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/tests/test_sockets.py b/tests/test_sockets.py index dad89a369c5b0..90a8202b04e6e 100644 --- a/tests/test_sockets.py +++ b/tests/test_sockets.py @@ -100,6 +100,10 @@ def __exit__(self, *args, **kwargs): # we can't truly test datagram sockets until we have # proper listen server support. +def filter_harnesses(harnesses): + # XXX avoid websockify for now due to intermittent errors. see issue #2700 + return filter(lambda harness: (harness[0].__class__ if type(harness) is tuple else harness.__class__) is not WebsockifyServerHarness, harnesses) + class sockets(BrowserCore): def test_inet(self): src = r''' @@ -243,6 +247,7 @@ def test_sockets_echo(self): # The following forces non-NULL addr and addlen parameters for the accept call (CompiledServerHarness(os.path.join('sockets', 'test_sockets_echo_server.c'), [sockets_include, '-DTEST_DGRAM=0', '-DTEST_ACCEPT_ADDR=1'], 49163), 0) ] + harnesses = filter_harnesses(harnesses) for harness, datagram in harnesses: with harness: @@ -260,6 +265,7 @@ def test_sockets_async_echo(self): # The following forces non-NULL addr and addlen parameters for the accept call (CompiledServerHarness(os.path.join('sockets', 'test_sockets_echo_server.c'), [sockets_include, '-DTEST_DGRAM=0', '-DTEST_ACCEPT_ADDR=1', '-DTEST_ASYNC=1'], 49168), 0) ] + #harnesses = filter_harnesses(harnesses) for harness, datagram in harnesses: with harness: @@ -286,6 +292,7 @@ def test_sockets_echo_bigdata(self): (CompiledServerHarness(os.path.join('sockets', 'test_sockets_echo_server.c'), [sockets_include, '-DTEST_DGRAM=0'], 49171), 0), (CompiledServerHarness(os.path.join('sockets', 'test_sockets_echo_server.c'), [sockets_include, '-DTEST_DGRAM=1'], 49172), 1) ] + harnesses = filter_harnesses(harnesses) for harness, datagram in harnesses: with harness: @@ -445,6 +452,7 @@ def test_nodejs_sockets_echo(self): (CompiledServerHarness(os.path.join('sockets', 'test_sockets_echo_server.c'), [sockets_include, '-DTEST_DGRAM=0'], 59162), 0), (CompiledServerHarness(os.path.join('sockets', 'test_sockets_echo_server.c'), [sockets_include, '-DTEST_DGRAM=1'], 59164), 1) ] + harnesses = filter_harnesses(harnesses) # Basic test of node client against both a Websockified and compiled echo server. for harness, datagram in harnesses: @@ -458,9 +466,9 @@ def test_nodejs_sockets_echo(self): # server because as long as the subprotocol list contains binary it will configure itself to accept binary # This test also checks that the connect url contains the correct subprotocols. print "\nTesting compile time WebSocket configuration.\n" - for harness in [ + for harness in filter_harnesses([ WebsockifyServerHarness(os.path.join('sockets', 'test_sockets_echo_server.c'), [sockets_include], 59166) - ]: + ]): with harness: Popen([PYTHON, EMCC, path_from_root('tests', 'sockets', 'test_sockets_echo_client.c'), '-o', 'client.js', '-s', 'SOCKET_DEBUG=1', '-s', 'WEBSOCKET_SUBPROTOCOL="base64, binary"', '-DSOCKK=59166', '-DREPORT_RESULT=int dummy'], stdout=PIPE, stderr=PIPE).communicate() @@ -472,9 +480,9 @@ def test_nodejs_sockets_echo(self): # In this test we have *deliberately* used the wrong port '-DSOCKK=12345' to configure the echo_client.c, so # the connection would fail without us specifying a valid WebSocket URL in the configuration. print "\nTesting runtime WebSocket configuration.\n" - for harness in [ + for harness in filter_harnesses([ WebsockifyServerHarness(os.path.join('sockets', 'test_sockets_echo_server.c'), [sockets_include], 59168) - ]: + ]): with harness: open(os.path.join(self.get_dir(), 'websocket_pre.js'), 'w').write(''' var Module = { From 7394300a1e30b83d319b16ec88979749a4df2777 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 27 Oct 2014 15:50:08 -0700 Subject: [PATCH 458/461] fake cfgetospeed; #2926 --- src/library.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/library.js b/src/library.js index a7e485c5a3f32..c27998dff7964 100644 --- a/src/library.js +++ b/src/library.js @@ -5017,6 +5017,13 @@ LibraryManager.library = { return 0; }, + cfgetospeed: function(termios_p) { +#if ASSERTIONS + Runtime.warnOnce('cfgetospeed() returning a fake value'); +#endif + return 15; + }, + // ========================================================================== // time.h // ========================================================================== From 33cbc706eed0650825d696e29ba934cd3758b4a3 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Mon, 27 Oct 2014 17:17:14 -0700 Subject: [PATCH 459/461] Update simd.js for upstream changes. The main change relevant to Emscripten here is that this includes the fix for unaligned loads and stores. --- src/simd.js | 261 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 189 insertions(+), 72 deletions(-) diff --git a/src/simd.js b/src/simd.js index 06b0d9a09f5d4..acfaf2942d40b 100644 --- a/src/simd.js +++ b/src/simd.js @@ -33,15 +33,27 @@ _SIMD_PRIVATE._i32x4 = new Int32Array(_SIMD_PRIVATE._f32x4.buffer); _SIMD_PRIVATE._i16x8 = new Int16Array(_SIMD_PRIVATE._f32x4.buffer); _SIMD_PRIVATE._i8x16 = new Int8Array(_SIMD_PRIVATE._f32x4.buffer); -if (typeof Math.fround === "undefined") { +if (typeof Math.fround !== 'undefined') { + _SIMD_PRIVATE.truncatef32 = Math.fround; +} else { _SIMD_PRIVATE._f32 = new Float32Array(1); _SIMD_PRIVATE.truncatef32 = function(x) { _SIMD_PRIVATE._f32[0] = x; return _SIMD_PRIVATE._f32[0]; } -} else { - _SIMD_PRIVATE.truncatef32 = Math.fround; +} + +_SIMD_PRIVATE.minNum = function(x, y) { + return x != x ? y : + y != y ? x : + Math.min(x, y); +} + +_SIMD_PRIVATE.maxNum = function(x, y) { + return x != x ? y : + y != y ? x : + Math.max(x, y); } // Type checking functions. @@ -211,14 +223,14 @@ if (typeof SIMD.float32x4.fromFloat64x2 === "undefined") { */ SIMD.float32x4.fromFloat64x2 = function(t) { t = SIMD.float64x2(t); - return SIMD.float32x4(t.x, t.y, 0.0, 0.0); + return SIMD.float32x4(t.x, t.y, 0, 0); } } if (typeof SIMD.float32x4.fromInt32x4 === "undefined") { /** * @param {int32x4} t An instance of int32x4. - * @return {float32x4} A integer to float conversion copy of t. + * @return {float32x4} An integer to float conversion copy of t. */ SIMD.float32x4.fromInt32x4 = function(t) { t = SIMD.int32x4(t); @@ -299,6 +311,7 @@ if (typeof SIMD.float64x2 === "undefined") { return new SIMD.float64x2(x, y); } + // Use unary + to force coersion to Number. this.x_ = +x; this.y_ = +y; } @@ -1110,10 +1123,10 @@ if (typeof SIMD.float32x4.min === "undefined") { SIMD.float32x4.min = function(t, other) { t = SIMD.float32x4(t); other = SIMD.float32x4(other); - var cx = t.x > other.x ? other.x : t.x; - var cy = t.y > other.y ? other.y : t.y; - var cz = t.z > other.z ? other.z : t.z; - var cw = t.w > other.w ? other.w : t.w; + var cx = Math.min(t.x, other.x); + var cy = Math.min(t.y, other.y); + var cz = Math.min(t.z, other.z); + var cw = Math.min(t.w, other.w); return SIMD.float32x4(cx, cy, cz, cw); } } @@ -1126,10 +1139,42 @@ if (typeof SIMD.float32x4.max === "undefined") { SIMD.float32x4.max = function(t, other) { t = SIMD.float32x4(t); other = SIMD.float32x4(other); - var cx = t.x < other.x ? other.x : t.x; - var cy = t.y < other.y ? other.y : t.y; - var cz = t.z < other.z ? other.z : t.z; - var cw = t.w < other.w ? other.w : t.w; + var cx = Math.max(t.x, other.x); + var cy = Math.max(t.y, other.y); + var cz = Math.max(t.z, other.z); + var cw = Math.max(t.w, other.w); + return SIMD.float32x4(cx, cy, cz, cw); + } +} + +if (typeof SIMD.float32x4.minNum === "undefined") { + /** + * @return {float32x4} New instance of float32x4 with the minimum value of + * t and other, preferring numbers over NaNs. + */ + SIMD.float32x4.minNum = function(t, other) { + t = SIMD.float32x4(t); + other = SIMD.float32x4(other); + var cx = _SIMD_PRIVATE.minNum(t.x, other.x); + var cy = _SIMD_PRIVATE.minNum(t.y, other.y); + var cz = _SIMD_PRIVATE.minNum(t.z, other.z); + var cw = _SIMD_PRIVATE.minNum(t.w, other.w); + return SIMD.float32x4(cx, cy, cz, cw); + } +} + +if (typeof SIMD.float32x4.maxNum === "undefined") { + /** + * @return {float32x4} New instance of float32x4 with the maximum value of + * t and other, preferring numbers over NaNs. + */ + SIMD.float32x4.maxNum = function(t, other) { + t = SIMD.float32x4(t); + other = SIMD.float32x4(other); + var cx = _SIMD_PRIVATE.maxNum(t.x, other.x); + var cy = _SIMD_PRIVATE.maxNum(t.y, other.y); + var cz = _SIMD_PRIVATE.maxNum(t.z, other.z); + var cw = _SIMD_PRIVATE.maxNum(t.w, other.w); return SIMD.float32x4(cx, cy, cz, cw); } } @@ -1480,8 +1525,11 @@ if (typeof SIMD.float32x4.load === "undefined") { throw new TypeError("The 2nd argument must be a Number."); if (byteOffset < 0 || (byteOffset + 16) > buffer.byteLength) throw new RangeError("The value of byteOffset is invalid."); - var f32a = new Float32Array(buffer, byteOffset, 4); - return SIMD.float32x4(f32a[0], f32a[1], f32a[2], f32a[3]); + var i8a = new Int8Array(buffer, byteOffset, 16); + for (var i = 0; i < 16; i++) + _SIMD_PRIVATE._i8x16[i] = i8a[i]; + return SIMD.float32x4(_SIMD_PRIVATE._f32x4[0], _SIMD_PRIVATE._f32x4[1], + _SIMD_PRIVATE._f32x4[2], _SIMD_PRIVATE._f32x4[3]); } } @@ -1498,8 +1546,10 @@ if (typeof SIMD.float32x4.loadX === "undefined") { throw new TypeError("The 2nd argument must be a Number."); if (byteOffset < 0 || (byteOffset + 4) > buffer.byteLength) throw new RangeError("The value of byteOffset is invalid."); - var f32a = new Float32Array(buffer, byteOffset, 1); - return SIMD.float32x4(f32a[0], 0.0, 0.0, 0.0); + var i8a = new Int8Array(buffer, byteOffset, 4); + for (var i = 0; i < 4; i++) + _SIMD_PRIVATE._i8x16[i] = i8a[i]; + return SIMD.float32x4(_SIMD_PRIVATE._f32x4[0], 0.0, 0.0, 0.0); } } @@ -1516,8 +1566,10 @@ if (typeof SIMD.float32x4.loadXY === "undefined") { throw new TypeError("The 2nd argument must be a Number."); if (byteOffset < 0 || (byteOffset + 8) > buffer.byteLength) throw new RangeError("The value of byteOffset is invalid."); - var f32a = new Float32Array(buffer, byteOffset, 2); - return SIMD.float32x4(f32a[0], f32a[1], 0.0, 0.0); + var i8a = new Int8Array(buffer, byteOffset, 8); + for (var i = 0; i < 8; i++) + _SIMD_PRIVATE._i8x16[i] = i8a[i]; + return SIMD.float32x4(_SIMD_PRIVATE._f32x4[0], _SIMD_PRIVATE._f32x4[1], 0.0, 0.0); } } @@ -1534,8 +1586,11 @@ if (typeof SIMD.float32x4.loadXYZ === "undefined") { throw new TypeError("The 2nd argument must be a Number."); if (byteOffset < 0 || (byteOffset + 12) > buffer.byteLength) throw new RangeError("The value of byteOffset is invalid."); - var f32a = new Float32Array(buffer, byteOffset, 3); - return SIMD.float32x4(f32a[0], f32a[1], f32a[2], 0.0); + var i8a = new Int8Array(buffer, byteOffset, 12); + for (var i = 0; i < 12; i++) + _SIMD_PRIVATE._i8x16[i] = i8a[i]; + return SIMD.float32x4(_SIMD_PRIVATE._f32x4[0], _SIMD_PRIVATE._f32x4[1], + _SIMD_PRIVATE._f32x4[2], 0.0); } } @@ -1554,11 +1609,13 @@ if (typeof SIMD.float32x4.store === "undefined") { if (byteOffset < 0 || (byteOffset + 16) > buffer.byteLength) throw new RangeError("The value of byteOffset is invalid."); value = SIMD.float32x4(value); - var f32a = new Float32Array(buffer, byteOffset, 4); - f32a[0] = value.x; - f32a[1] = value.y; - f32a[2] = value.z; - f32a[3] = value.w; + _SIMD_PRIVATE._f32x4[0] = value.x; + _SIMD_PRIVATE._f32x4[1] = value.y; + _SIMD_PRIVATE._f32x4[2] = value.z; + _SIMD_PRIVATE._f32x4[3] = value.w; + var i8a = new Int8Array(buffer, byteOffset, 16); + for (var i = 0; i < 16; i++) + i8a[i] = _SIMD_PRIVATE._i8x16[i]; } } @@ -1577,8 +1634,10 @@ if (typeof SIMD.float32x4.storeX === "undefined") { if (byteOffset < 0 || (byteOffset + 4) > buffer.byteLength) throw new RangeError("The value of byteOffset is invalid."); value = SIMD.float32x4(value); - var f32a = new Float32Array(buffer, byteOffset, 1); - f32a[0] = value.x; + _SIMD_PRIVATE._f32x4[0] = value.x; + var i8a = new Int8Array(buffer, byteOffset, 4); + for (var i = 0; i < 4; i++) + i8a[i] = _SIMD_PRIVATE._i8x16[i]; } } @@ -1597,9 +1656,11 @@ if (typeof SIMD.float32x4.storeXY === "undefined") { if (byteOffset < 0 || (byteOffset + 8) > buffer.byteLength) throw new RangeError("The value of byteOffset is invalid."); value = SIMD.float32x4(value); - var f32a = new Float32Array(buffer, byteOffset, 2); - f32a[0] = value.x; - f32a[1] = value.y; + _SIMD_PRIVATE._f32x4[0] = value.x; + _SIMD_PRIVATE._f32x4[1] = value.y; + var i8a = new Int8Array(buffer, byteOffset, 8); + for (var i = 0; i < 8; i++) + i8a[i] = _SIMD_PRIVATE._i8x16[i]; } } @@ -1618,10 +1679,12 @@ if (typeof SIMD.float32x4.storeXYZ === "undefined") { if (byteOffset < 0 || (byteOffset + 12) > buffer.byteLength) throw new RangeError("The value of byteOffset is invalid."); value = SIMD.float32x4(value); - var f32a = new Float32Array(buffer, byteOffset, 3); - f32a[0] = value.x; - f32a[1] = value.y; - f32a[2] = value.z; + _SIMD_PRIVATE._f32x4[0] = value.x; + _SIMD_PRIVATE._f32x4[1] = value.y; + _SIMD_PRIVATE._f32x4[2] = value.z; + var i8a = new Int8Array(buffer, byteOffset, 12); + for (var i = 0; i < 12; i++) + i8a[i] = _SIMD_PRIVATE._i8x16[i]; } } @@ -1716,8 +1779,8 @@ if (typeof SIMD.float64x2.min === "undefined") { SIMD.float64x2.min = function(t, other) { t = SIMD.float64x2(t); other = SIMD.float64x2(other); - var cx = t.x > other.x ? other.x : t.x; - var cy = t.y > other.y ? other.y : t.y; + var cx = Math.min(t.x, other.x); + var cy = Math.min(t.y, other.y); return SIMD.float64x2(cx, cy); } } @@ -1730,8 +1793,36 @@ if (typeof SIMD.float64x2.max === "undefined") { SIMD.float64x2.max = function(t, other) { t = SIMD.float64x2(t); other = SIMD.float64x2(other); - var cx = t.x < other.x ? other.x : t.x; - var cy = t.y < other.y ? other.y : t.y; + var cx = Math.max(t.x, other.x); + var cy = Math.max(t.y, other.y); + return SIMD.float64x2(cx, cy); + } +} + +if (typeof SIMD.float64x2.minNum === "undefined") { + /** + * @return {float64x2} New instance of float64x2 with the minimum value of + * t and other, preferring numbers over NaNs. + */ + SIMD.float64x2.minNum = function(t, other) { + t = SIMD.float64x2(t); + other = SIMD.float64x2(other); + var cx = _SIMD_PRIVATE.minNum(t.x, other.x); + var cy = _SIMD_PRIVATE.minNum(t.y, other.y); + return SIMD.float64x2(cx, cy); + } +} + +if (typeof SIMD.float64x2.maxNum === "undefined") { + /** + * @return {float64x2} New instance of float64x2 with the maximum value of + * t and other, preferring numbers over NaNs. + */ + SIMD.float64x2.maxNum = function(t, other) { + t = SIMD.float64x2(t); + other = SIMD.float64x2(other); + var cx = _SIMD_PRIVATE.maxNum(t.x, other.x); + var cy = _SIMD_PRIVATE.maxNum(t.y, other.y); return SIMD.float64x2(cx, cy); } } @@ -1760,7 +1851,7 @@ if (typeof SIMD.float64x2.reciprocalSqrt === "undefined") { if (typeof SIMD.float64x2.scale === "undefined") { /** - * @return {float64x2} New instance of float32x4 with values of t + * @return {float64x2} New instance of float64x2 with values of t * scaled by s. */ SIMD.float64x2.scale = function(t, s) { @@ -1771,7 +1862,7 @@ if (typeof SIMD.float64x2.scale === "undefined") { if (typeof SIMD.float64x2.sqrt === "undefined") { /** - * @return {float64x2} New instance of float32x4 with square root of + * @return {float64x2} New instance of float64x2 with square root of * values of t. */ SIMD.float64x2.sqrt = function(t) { @@ -1976,8 +2067,10 @@ if (typeof SIMD.float64x2.load === "undefined") { throw new TypeError("The 2nd argument must be a Number."); if (byteOffset < 0 || (byteOffset + 16) > buffer.byteLength) throw new RangeError("The value of byteOffset is invalid."); - var f64a = new Float64Array(buffer, byteOffset, 2); - return SIMD.float64x2(f64a[0], f64a[1]); + var i8a = new Int8Array(buffer, byteOffset, 16); + for (var i = 0; i < 16; i++) + _SIMD_PRIVATE._i8x16[i] = i8a[i]; + return SIMD.float64x2(_SIMD_PRIVATE._f64x2[0], _SIMD_PRIVATE._f64x2[1]); } } @@ -1994,8 +2087,10 @@ if (typeof SIMD.float64x2.loadX === "undefined") { throw new TypeError("The 2nd argument must be a Number."); if (byteOffset < 0 || (byteOffset + 8) > buffer.byteLength) throw new RangeError("The value of byteOffset is invalid."); - var f64a = new Float64Array(buffer, byteOffset, 1); - return SIMD.float64x2(f64a[0], 0.0); + var i8a = new Int8Array(buffer, byteOffset, 8); + for (var i = 0; i < 8; i++) + _SIMD_PRIVATE._i8x16[i] = i8a[i]; + return SIMD.float64x2(_SIMD_PRIVATE._f64x2[0], 0.0); } } @@ -2014,9 +2109,11 @@ if (typeof SIMD.float64x2.store === "undefined") { if (byteOffset < 0 || (byteOffset + 16) > buffer.byteLength) throw new RangeError("The value of byteOffset is invalid."); value = SIMD.float64x2(value); - var f64a = new Float64Array(buffer, byteOffset, 2); - f64a[0] = value.x; - f64a[1] = value.y; + _SIMD_PRIVATE._f64x2[0] = value.x; + _SIMD_PRIVATE._f64x2[1] = value.y; + var i8a = new Int8Array(buffer, byteOffset, 16); + for (var i = 0; i < 16; i++) + i8a[i] = _SIMD_PRIVATE._i8x16[i]; } } @@ -2035,8 +2132,10 @@ if (typeof SIMD.float64x2.storeX === "undefined") { if (byteOffset < 0 || (byteOffset + 8) > buffer.byteLength) throw new RangeError("The value of byteOffset is invalid."); value = SIMD.float64x2(value); - var f64a = new Float64Array(buffer, byteOffset, 1); - f64a[0] = value.x; + _SIMD_PRIVATE._f64x2[0] = value.x; + var i8a = new Int8Array(buffer, byteOffset, 8); + for (var i = 0; i < 8; i++) + i8a[i] = _SIMD_PRIVATE._i8x16[i]; } } @@ -2620,8 +2719,11 @@ if (typeof SIMD.int32x4.load === "undefined") { throw new TypeError("The 2nd argument must be a Number."); if (byteOffset < 0 || (byteOffset + 16) > buffer.byteLength) throw new RangeError("The value of byteOffset is invalid."); - var i32a = new Int32Array(buffer, byteOffset, 4); - return SIMD.int32x4(i32a[0], i32a[1], i32a[2], i32a[3]); + var i8a = new Int8Array(buffer, byteOffset, 16); + for (var i = 0; i < 16; i++) + _SIMD_PRIVATE._i8x16[i] = i8a[i]; + return SIMD.int32x4(_SIMD_PRIVATE._i32x4[0], _SIMD_PRIVATE._i32x4[1], + _SIMD_PRIVATE._i32x4[2], _SIMD_PRIVATE._i32x4[3]); } } @@ -2638,8 +2740,10 @@ if (typeof SIMD.int32x4.loadX === "undefined") { throw new TypeError("The 2nd argument must be a Number."); if (byteOffset < 0 || (byteOffset + 4) > buffer.byteLength) throw new RangeError("The value of byteOffset is invalid."); - var i32a = new Int32Array(buffer, byteOffset, 1); - return SIMD.int32x4(i32a[0], 0, 0, 0); + var i8a = new Int8Array(buffer, byteOffset, 4); + for (var i = 0; i < 4; i++) + _SIMD_PRIVATE._i8x16[i] = i8a[i]; + return SIMD.int32x4(_SIMD_PRIVATE._i32x4[0], 0, 0, 0); } } @@ -2656,8 +2760,10 @@ if (typeof SIMD.int32x4.loadXY === "undefined") { throw new TypeError("The 2nd argument must be a Number."); if (byteOffset < 0 || (byteOffset + 8) > buffer.byteLength) throw new RangeError("The value of byteOffset is invalid."); - var i32a = new Int32Array(buffer, byteOffset, 2); - return SIMD.int32x4(i32a[0], i32a[1], 0, 0); + var i8a = new Int8Array(buffer, byteOffset, 8); + for (var i = 0; i < 8; i++) + _SIMD_PRIVATE._i8x16[i] = i8a[i]; + return SIMD.int32x4(_SIMD_PRIVATE._i32x4[0], _SIMD_PRIVATE._i32x4[1], 0, 0); } } @@ -2674,8 +2780,11 @@ if (typeof SIMD.int32x4.loadXYZ === "undefined") { throw new TypeError("The 2nd argument must be a Number."); if (byteOffset < 0 || (byteOffset + 12) > buffer.byteLength) throw new RangeError("The value of byteOffset is invalid."); - var i32a = new Int32Array(buffer, byteOffset, 3); - return SIMD.int32x4(i32a[0], i32a[1], i32a[2], 0); + var i8a = new Int8Array(buffer, byteOffset, 12); + for (var i = 0; i < 12; i++) + _SIMD_PRIVATE._i8x16[i] = i8a[i]; + return SIMD.int32x4(_SIMD_PRIVATE._i32x4[0], _SIMD_PRIVATE._i32x4[1], + _SIMD_PRIVATE._i32x4[2], 0); } } @@ -2694,11 +2803,13 @@ if (typeof SIMD.int32x4.store === "undefined") { if (byteOffset < 0 || (byteOffset + 16) > buffer.byteLength) throw new RangeError("The value of byteOffset is invalid."); value = SIMD.int32x4(value); - var i32a = new Int32Array(buffer, byteOffset, 4); - i32a[0] = value.x; - i32a[1] = value.y; - i32a[2] = value.z; - i32a[3] = value.w; + _SIMD_PRIVATE._i32x4[0] = value.x; + _SIMD_PRIVATE._i32x4[1] = value.y; + _SIMD_PRIVATE._i32x4[2] = value.z; + _SIMD_PRIVATE._i32x4[3] = value.w; + var i8a = new Int8Array(buffer, byteOffset, 16); + for (var i = 0; i < 16; i++) + i8a[i] = _SIMD_PRIVATE._i8x16[i]; } } @@ -2717,8 +2828,10 @@ if (typeof SIMD.int32x4.storeX === "undefined") { if (byteOffset < 0 || (byteOffset + 4) > buffer.byteLength) throw new RangeError("The value of byteOffset is invalid."); value = SIMD.int32x4(value); - var i32a = new Int32Array(buffer, byteOffset, 1); - i32a[0] = value.x; + _SIMD_PRIVATE._i32x4[0] = value.x; + var i8a = new Int8Array(buffer, byteOffset, 4); + for (var i = 0; i < 4; i++) + i8a[i] = _SIMD_PRIVATE._i8x16[i]; } } @@ -2737,9 +2850,11 @@ if (typeof SIMD.int32x4.storeXY === "undefined") { if (byteOffset < 0 || (byteOffset + 8) > buffer.byteLength) throw new RangeError("The value of byteOffset is invalid."); value = SIMD.int32x4(value); - var i32a = new Int32Array(buffer, byteOffset, 2); - i32a[0] = value.x; - i32a[1] = value.y; + _SIMD_PRIVATE._i32x4[0] = value.x; + _SIMD_PRIVATE._i32x4[1] = value.y; + var i8a = new Int8Array(buffer, byteOffset, 8); + for (var i = 0; i < 8; i++) + i8a[i] = _SIMD_PRIVATE._i8x16[i]; } } @@ -2758,10 +2873,12 @@ if (typeof SIMD.int32x4.storeXYZ === "undefined") { if (byteOffset < 0 || (byteOffset + 12) > buffer.byteLength) throw new RangeError("The value of byteOffset is invalid."); value = SIMD.int32x4(value); - var i32a = new Int32Array(buffer, byteOffset, 3); - i32a[0] = value.x; - i32a[1] = value.y; - i32a[2] = value.z; + _SIMD_PRIVATE._i32x4[0] = value.x; + _SIMD_PRIVATE._i32x4[1] = value.y; + _SIMD_PRIVATE._i32x4[2] = value.z; + var i8a = new Int8Array(buffer, byteOffset, 12); + for (var i = 0; i < 12; i++) + i8a[i] = _SIMD_PRIVATE._i8x16[i]; } } From 9eb764b90a339396adc67a10d54b6d2ee5ac30b5 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Tue, 28 Oct 2014 10:31:26 -0700 Subject: [PATCH 460/461] Rename simd.jd to ecmascript_simd.js Since that's what the upstream name of this file is. Note that we are still using a branch of upstream rather than plain upstream. --- emscripten.py | 2 +- src/{simd.js => ecmascript_simd.js} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/{simd.js => ecmascript_simd.js} (100%) diff --git a/emscripten.py b/emscripten.py index aa847ac7ccf2b..6ae75282c5b77 100755 --- a/emscripten.py +++ b/emscripten.py @@ -916,7 +916,7 @@ def save_settings(): global_initializers = ', '.join(map(lambda i: '{ func: function() { %s() } }' % i, metadata['initializers'])) if settings['SIMD'] == 1: - pre = open(path_from_root(os.path.join('src', 'simd.js'))).read() + '\n\n' + pre + pre = open(path_from_root(os.path.join('src', 'ecmascript_simd.js'))).read() + '\n\n' + pre staticbump = mem_init.count(',')+1 while staticbump % 16 != 0: staticbump += 1 diff --git a/src/simd.js b/src/ecmascript_simd.js similarity index 100% rename from src/simd.js rename to src/ecmascript_simd.js From 57a0fc08167072e9f39cb0e5cbb28d17edcf9b9f Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 28 Oct 2014 15:42:30 -0700 Subject: [PATCH 461/461] 1.26.0 --- emscripten-version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emscripten-version.txt b/emscripten-version.txt index c61b00d534f58..958bb4d7634f3 100644 --- a/emscripten-version.txt +++ b/emscripten-version.txt @@ -1,2 +1,2 @@ -1.25.2 +1.26.0