diff --git a/package.json b/package.json
index cac1b71..d89d46a 100644
--- a/package.json
+++ b/package.json
@@ -40,6 +40,6 @@
   },
   "license": "MIT",
   "dependencies": {
-    "experimental-pathkit-wasm": "^0.1.7"
+    "experimental-pathkit-wasm": "^0.2.0"
   }
 }
diff --git a/player/js/modules/pathkit.js b/player/js/modules/pathkit.js
index 266f387..f5498fc 100644
--- a/player/js/modules/pathkit.js
+++ b/player/js/modules/pathkit.js
@@ -1,89 +1,94 @@
 var PathKitInit = function(PathKitInit) {
   PathKitInit = PathKitInit || {};
 
-var c;c||(c=typeof PathKitInit !== 'undefined' ? PathKitInit : {});(function(a){var b={};a.loadCmdsTypedArray=function(d){for(var e=0,f=0;f<d.length;f++)e+=d[f].length;if(b[e])var g=b[e];else g=new Float32Array(e),b[e]=g;var h=0;for(f=0;f<d.length;f++)for(var k=0;k<d[f].length;k++){var l=d[f][k];"string"===typeof l&&(l=a.SkBits2FloatUnsigned(parseInt(l)));g[h]=l;h++}d=a._malloc(g.length*g.BYTES_PER_ELEMENT);a.HEAPF32.set(g,d/g.BYTES_PER_ELEMENT);return[d,e]}})(c);var n={},q;
-for(q in c)c.hasOwnProperty(q)&&(n[q]=c[q]);c.arguments=[];c.thisProgram="./this.program";c.quit=function(a,b){throw b;};c.preRun=[];c.postRun=[];var r=!1,t=!1,u=!1,aa=!1;
-if(c.ENVIRONMENT)if("WEB"===c.ENVIRONMENT)r=!0;else if("WORKER"===c.ENVIRONMENT)t=!0;else if("NODE"===c.ENVIRONMENT)u=!0;else if("SHELL"===c.ENVIRONMENT)aa=!0;else throw Error("Module['ENVIRONMENT'] value is not valid. must be one of: WEB|WORKER|NODE|SHELL.");else r="object"===typeof window,t="function"===typeof importScripts,u="object"===typeof process&&"function"===typeof require&&!r&&!t,aa=!r&&!u&&!t;
-if(u){var ba,ca;c.read=function(a,b){ba||(ba=require("fs"));ca||(ca=require("path"));a=ca.normalize(a);a=ba.readFileSync(a);return b?a:a.toString()};c.readBinary=function(a){a=c.read(a,!0);a.buffer||(a=new Uint8Array(a));assert(a.buffer);return a};1<process.argv.length&&(c.thisProgram=process.argv[1].replace(/\\/g,"/"));c.arguments=process.argv.slice(2);process.on("uncaughtException",function(a){if(!(a instanceof w))throw a;});process.on("unhandledRejection",function(){process.exit(1)});c.inspect=
-function(){return"[Emscripten Module object]"}}else if(aa)"undefined"!=typeof read&&(c.read=function(a){return read(a)}),c.readBinary=function(a){if("function"===typeof readbuffer)return new Uint8Array(readbuffer(a));a=read(a,"binary");assert("object"===typeof a);return a},"undefined"!=typeof scriptArgs?c.arguments=scriptArgs:"undefined"!=typeof arguments&&(c.arguments=arguments),"function"===typeof quit&&(c.quit=function(a){quit(a)});else if(r||t)c.read=function(a){var b=new XMLHttpRequest;b.open("GET",
-a,!1);b.send(null);return b.responseText},t&&(c.readBinary=function(a){var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)}),c.readAsync=function(a,b,d){var e=new XMLHttpRequest;e.open("GET",a,!0);e.responseType="arraybuffer";e.onload=function(){200==e.status||0==e.status&&e.response?b(e.response):d()};e.onerror=d;e.send(null)},c.setWindowTitle=function(a){document.title=a};else throw Error("not compiled for this environment");
-c.print="undefined"!==typeof console?console.log.bind(console):"undefined"!==typeof print?print:null;c.printErr="undefined"!==typeof printErr?printErr:"undefined"!==typeof console&&console.warn.bind(console)||c.print;c.print=c.print;c.printErr=c.printErr;for(q in n)n.hasOwnProperty(q)&&(c[q]=n[q]);n=void 0;function da(a){var b;b||(b=16);return Math.ceil(a/b)*b}var ea={"f64-rem":function(a,b){return a%b},"debugger":function(){debugger}},fa=0;function assert(a,b){a||x("Assertion failed: "+b)}
-var ha="undefined"!==typeof TextDecoder?new TextDecoder("utf8"):void 0;"undefined"!==typeof TextDecoder&&new TextDecoder("utf-16le");var buffer,ia,y,z,ja,A,C,ka,la;function ma(){c.HEAP8=ia=new Int8Array(buffer);c.HEAP16=z=new Int16Array(buffer);c.HEAP32=A=new Int32Array(buffer);c.HEAPU8=y=new Uint8Array(buffer);c.HEAPU16=ja=new Uint16Array(buffer);c.HEAPU32=C=new Uint32Array(buffer);c.HEAPF32=ka=new Float32Array(buffer);c.HEAPF64=la=new Float64Array(buffer)}var na,D,oa,pa,qa,ra,sa,ta;
-na=D=pa=qa=ra=sa=ta=0;oa=!1;function ua(){x("Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value "+E+", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 ")}var va=c.TOTAL_STACK||5242880,E=c.TOTAL_MEMORY||16777216;
-E<va&&c.printErr("TOTAL_MEMORY should be larger than TOTAL_STACK, was "+E+"! (TOTAL_STACK="+va+")");c.buffer?buffer=c.buffer:("object"===typeof WebAssembly&&"function"===typeof WebAssembly.Memory?(c.wasmMemory=new WebAssembly.Memory({initial:E/65536,maximum:E/65536}),buffer=c.wasmMemory.buffer):buffer=new ArrayBuffer(E),c.buffer=buffer);ma();A[0]=1668509029;z[1]=25459;if(115!==y[2]||99!==y[3])throw"Runtime error: expected the system to be little-endian!";
-function F(a){for(;0<a.length;){var b=a.shift();if("function"==typeof b)b();else{var d=b.N;"number"===typeof d?void 0===b.D?c.dynCall_v(d):c.dynCall_vi(d,b.D):d(void 0===b.D?null:b.D)}}}var wa=[],xa=[],ya=[],za=[],Aa=[],Ba=!1;function Ca(){var a=c.preRun.shift();wa.unshift(a)}var G=0,Da=null,H=null;c.preloadedImages={};c.preloadedAudios={};
+var d;d||(d=typeof PathKitInit !== 'undefined' ? PathKitInit : {});(function(a){var b={};a.loadCmdsTypedArray=function(c){for(var e=0,f=0;f<c.length;f++)e+=c[f].length;if(b[e])var g=b[e];else g=new Float32Array(e),b[e]=g;var h=0;for(f=0;f<c.length;f++)for(var k=0;k<c[f].length;k++){var l=c[f][k];"string"===typeof l&&(l=a.SkBits2FloatUnsigned(parseInt(l)));g[h]=l;h++}c=a._malloc(g.length*g.BYTES_PER_ELEMENT);a.HEAPF32.set(g,c/g.BYTES_PER_ELEMENT);return[c,e]}})(d);
+(function(a){a.onRuntimeInitialized=function(){a.SkPath.prototype.addPath=function(){if(1===arguments.length)this._addPath(arguments[0],1,0,0,0,1,0,0,0,1);else if(2===arguments.length){var a=arguments[1];this._addPath(arguments[0],a.a,a.c,a.e,a.b,a.d,a.f,0,0,1)}else if(7===arguments.length)a=arguments,this._addPath(arguments[0],a[1],a[3],a[5],a[2],a[4],a[6],0,0,1);else if(10===arguments.length)a=arguments,this._addPath(arguments[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);else return console.H("addPath expected to take 1, 2, 7, or 10 args. Got "+
+arguments.length),null;return this};a.SkPath.prototype.arc=function(a,c,e,f,g,h){this._arc(a,c,e,f,g,!!h);return this};a.SkPath.prototype.arcTo=function(a,c,e,f,g){this._arcTo(a,c,e,f,g);return this};a.SkPath.prototype.bezierCurveTo=function(a,c,e,f,g,h){this._cubicTo(a,c,e,f,g,h);return this};a.SkPath.prototype.close=function(){this._close();return this};a.SkPath.prototype.closePath=function(){this._close();return this};a.SkPath.prototype.conicTo=function(a,c,e,f,g){this._conicTo(a,c,e,f,g);return this};
+a.SkPath.prototype.cubicTo=function(a,c,e,f,g,h){this._cubicTo(a,c,e,f,g,h);return this};a.SkPath.prototype.dash=function(a,c,e){return this._dash(a,c,e)?this:null};a.SkPath.prototype.ellipse=function(a,c,e,f,g,h,k,l){this._ellipse(a,c,e,f,g,h,k,!!l);return this};a.SkPath.prototype.lineTo=function(a,c){this._lineTo(a,c);return this};a.SkPath.prototype.moveTo=function(a,c){this._moveTo(a,c);return this};a.SkPath.prototype.op=function(a,c){return this._op(a,c)?this:null};a.SkPath.prototype.quadraticCurveTo=
+function(a,c,e,f){this._quadTo(a,c,e,f);return this};a.SkPath.prototype.quadTo=function(a,c,e,f){this._quadTo(a,c,e,f);return this};a.SkPath.prototype.rect=function(a,c,e,f){this._rect(a,c,e,f);return this};a.SkPath.prototype.simplify=function(){return this._simplify()?this:null};a.SkPath.prototype.stroke=function(b){b=b||{};b.width=b.width||1;b.miter_limit=b.miter_limit||4;b.cap=b.cap||a.StrokeCap.BUTT;b.join=b.join||a.StrokeJoin.MITER;return this._stroke(b)?this:null};a.SkPath.prototype.transform=
+function(){if(1===arguments.length)this._transform(arguments[0]);else if(9===arguments.length){var a=arguments;this._transform(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8])}else return console.H("transform expected to take 1 or 9 arguments. Got "+arguments.length),null;return this};a.SkPath.prototype.trim=function(a,c,e){return this._trim(a,c,!!e)?this:null}}})(d);var n={},q;for(q in d)d.hasOwnProperty(q)&&(n[q]=d[q]);d.arguments=[];d.thisProgram="./this.program";d.quit=function(a,b){throw b;};
+d.preRun=[];d.postRun=[];var r=!1,t=!1,u=!1,aa=!1;if(d.ENVIRONMENT)if("WEB"===d.ENVIRONMENT)r=!0;else if("WORKER"===d.ENVIRONMENT)t=!0;else if("NODE"===d.ENVIRONMENT)u=!0;else if("SHELL"===d.ENVIRONMENT)aa=!0;else throw Error("Module['ENVIRONMENT'] value is not valid. must be one of: WEB|WORKER|NODE|SHELL.");else r="object"===typeof window,t="function"===typeof importScripts,u="object"===typeof process&&"function"===typeof require&&!r&&!t,aa=!r&&!u&&!t;
+if(u){var ba,ca;d.read=function(a,b){ba||(ba=require("fs"));ca||(ca=require("path"));a=ca.normalize(a);a=ba.readFileSync(a);return b?a:a.toString()};d.readBinary=function(a){a=d.read(a,!0);a.buffer||(a=new Uint8Array(a));assert(a.buffer);return a};1<process.argv.length&&(d.thisProgram=process.argv[1].replace(/\\/g,"/"));d.arguments=process.argv.slice(2);process.on("uncaughtException",function(a){if(!(a instanceof v))throw a;});process.on("unhandledRejection",function(){process.exit(1)});d.inspect=
+function(){return"[Emscripten Module object]"}}else if(aa)"undefined"!=typeof read&&(d.read=function(a){return read(a)}),d.readBinary=function(a){if("function"===typeof readbuffer)return new Uint8Array(readbuffer(a));a=read(a,"binary");assert("object"===typeof a);return a},"undefined"!=typeof scriptArgs?d.arguments=scriptArgs:"undefined"!=typeof arguments&&(d.arguments=arguments),"function"===typeof quit&&(d.quit=function(a){quit(a)});else if(r||t)d.read=function(a){var b=new XMLHttpRequest;b.open("GET",
+a,!1);b.send(null);return b.responseText},t&&(d.readBinary=function(a){var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)}),d.readAsync=function(a,b,c){var e=new XMLHttpRequest;e.open("GET",a,!0);e.responseType="arraybuffer";e.onload=function(){200==e.status||0==e.status&&e.response?b(e.response):c()};e.onerror=c;e.send(null)},d.setWindowTitle=function(a){document.title=a};else throw Error("not compiled for this environment");
+d.print="undefined"!==typeof console?console.log.bind(console):"undefined"!==typeof print?print:null;d.printErr="undefined"!==typeof printErr?printErr:"undefined"!==typeof console&&console.warn.bind(console)||d.print;d.print=d.print;d.printErr=d.printErr;for(q in n)n.hasOwnProperty(q)&&(d[q]=n[q]);n=void 0;function da(a){var b;b||(b=16);return Math.ceil(a/b)*b}var ea={"f64-rem":function(a,b){return a%b},"debugger":function(){debugger}},fa=0;function assert(a,b){a||x("Assertion failed: "+b)}
+var ha="undefined"!==typeof TextDecoder?new TextDecoder("utf8"):void 0;"undefined"!==typeof TextDecoder&&new TextDecoder("utf-16le");var buffer,ia,y,z,ja,B,C,ka,la;function ma(){d.HEAP8=ia=new Int8Array(buffer);d.HEAP16=z=new Int16Array(buffer);d.HEAP32=B=new Int32Array(buffer);d.HEAPU8=y=new Uint8Array(buffer);d.HEAPU16=ja=new Uint16Array(buffer);d.HEAPU32=C=new Uint32Array(buffer);d.HEAPF32=ka=new Float32Array(buffer);d.HEAPF64=la=new Float64Array(buffer)}var na,D,oa,pa,qa,ra,sa,ta;
+na=D=pa=qa=ra=sa=ta=0;oa=!1;function ua(){x("Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value "+E+", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 ")}var va=d.TOTAL_STACK||5242880,E=d.TOTAL_MEMORY||16777216;
+E<va&&d.printErr("TOTAL_MEMORY should be larger than TOTAL_STACK, was "+E+"! (TOTAL_STACK="+va+")");d.buffer?buffer=d.buffer:("object"===typeof WebAssembly&&"function"===typeof WebAssembly.Memory?(d.wasmMemory=new WebAssembly.Memory({initial:E/65536,maximum:E/65536}),buffer=d.wasmMemory.buffer):buffer=new ArrayBuffer(E),d.buffer=buffer);ma();B[0]=1668509029;z[1]=25459;if(115!==y[2]||99!==y[3])throw"Runtime error: expected the system to be little-endian!";
+function F(a){for(;0<a.length;){var b=a.shift();if("function"==typeof b)b();else{var c=b.Y;"number"===typeof c?void 0===b.K?d.dynCall_v(c):d.dynCall_vi(c,b.K):c(void 0===b.K?null:b.K)}}}var wa=[],xa=[],ya=[],za=[],Aa=[],Ba=!1;function Ca(){var a=d.preRun.shift();wa.unshift(a)}var G=0,Da=null,H=null;d.preloadedImages={};d.preloadedAudios={};
 function Ea(a){return String.prototype.startsWith?a.startsWith("data:application/octet-stream;base64,"):0===a.indexOf("data:application/octet-stream;base64,")}
-(function(){function a(){try{if(c.wasmBinary)return new Uint8Array(c.wasmBinary);if(c.readBinary)return c.readBinary(f);throw"on the web, we need the wasm binary to be preloaded and set on Module['wasmBinary']. emcc.py will do that for you when generating HTML (but not JS)";}catch(p){x(p)}}function b(){return c.wasmBinary||!r&&!t||"function"!==typeof fetch?new Promise(function(b){b(a())}):fetch(f,{credentials:"same-origin"}).then(function(a){if(!a.ok)throw"failed to load wasm binary file at '"+f+
-"'";return a.arrayBuffer()}).catch(function(){return a()})}function d(a){function d(a){k=a.exports;if(k.memory){a=k.memory;var b=c.buffer;a.byteLength<b.byteLength&&c.printErr("the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here");b=new Int8Array(b);(new Int8Array(a)).set(b);c.buffer=buffer=a;ma()}c.asm=k;c.usingWasm=!0;G--;c.monitorRunDependencies&&c.monitorRunDependencies(G);0==G&&(null!==Da&&(clearInterval(Da),Da=null),H&&(a=H,H=null,a()))}
-function e(a){d(a.instance)}function g(a){b().then(function(a){return WebAssembly.instantiate(a,h)}).then(a).catch(function(a){c.printErr("failed to asynchronously prepare wasm: "+a);x(a)})}if("object"!==typeof WebAssembly)return c.printErr("no native wasm support detected"),!1;if(!(c.wasmMemory instanceof WebAssembly.Memory))return c.printErr("no native wasm Memory in use"),!1;a.memory=c.wasmMemory;h.global={NaN:NaN,Infinity:Infinity};h["global.Math"]=Math;h.env=a;G++;c.monitorRunDependencies&&c.monitorRunDependencies(G);
-if(c.instantiateWasm)try{return c.instantiateWasm(h,d)}catch(ub){return c.printErr("Module.instantiateWasm callback failed with error: "+ub),!1}c.wasmBinary||"function"!==typeof WebAssembly.instantiateStreaming||Ea(f)||"function"!==typeof fetch?g(e):WebAssembly.instantiateStreaming(fetch(f,{credentials:"same-origin"}),h).then(e).catch(function(a){c.printErr("wasm streaming compile failed: "+a);c.printErr("falling back to ArrayBuffer instantiation");g(e)});return{}}var e="pathkit.wast",f="pathkit.wasm",
-g="pathkit.temp.asm.js";"function"===typeof c.locateFile&&(Ea(e)||(e=c.locateFile(e)),Ea(f)||(f=c.locateFile(f)),Ea(g)||(g=c.locateFile(g)));var h={global:null,env:null,asm2wasm:ea,parent:c},k=null;c.asmPreload=c.asm;var l=c.reallocBuffer;c.reallocBuffer=function(a){if("asmjs"===m)var b=l(a);else a:{var d=c.usingWasm?65536:16777216;0<a%d&&(a+=d-a%d);d=c.buffer.byteLength;if(c.usingWasm)try{b=-1!==c.wasmMemory.grow((a-d)/65536)?c.buffer=c.wasmMemory.buffer:null;break a}catch(B){b=null;break a}b=void 0}return b};
-var m="";c.asm=function(a,b){if(!b.table){a=c.wasmTableSize;void 0===a&&(a=1024);var e=c.wasmMaxTableSize;b.table="object"===typeof WebAssembly&&"function"===typeof WebAssembly.Table?void 0!==e?new WebAssembly.Table({initial:a,maximum:e,element:"anyfunc"}):new WebAssembly.Table({initial:a,element:"anyfunc"}):Array(a);c.wasmTable=b.table}b.memoryBase||(b.memoryBase=c.STATIC_BASE);b.tableBase||(b.tableBase=0);b=d(b);assert(b,"no binaryen method succeeded.");return b}})();na=1024;D=na+30112;
-xa.push({N:function(){Fa()}},{N:function(){Ha()}});c.STATIC_BASE=na;c.STATIC_BUMP=30112;D+=16;var I=0;function J(){I+=4;return A[I-4>>2]}var Ia={};
-function K(a,b){I=b;try{var d=J(),e=J(),f=J();a=0;K.J||(K.J=[null,[],[]],K.S=function(a,b){var d=K.J[a];assert(d);if(0===b||10===b){a=1===a?c.print:c.printErr;a:{for(var e=b=0;d[e];)++e;if(16<e-b&&d.subarray&&ha)b=ha.decode(d.subarray(b,e));else for(e="";;){var f=d[b++];if(!f){b=e;break a}if(f&128){var g=d[b++]&63;if(192==(f&224))e+=String.fromCharCode((f&31)<<6|g);else{var k=d[b++]&63;if(224==(f&240))f=(f&15)<<12|g<<6|k;else{var h=d[b++]&63;if(240==(f&248))f=(f&7)<<18|g<<12|k<<6|h;else{var l=d[b++]&
-63;if(248==(f&252))f=(f&3)<<24|g<<18|k<<12|h<<6|l;else{var m=d[b++]&63;f=(f&1)<<30|g<<24|k<<18|h<<12|l<<6|m}}}65536>f?e+=String.fromCharCode(f):(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023))}}else e+=String.fromCharCode(f)}}a(b);d.length=0}else d.push(b)});for(b=0;b<f;b++){for(var g=A[e+8*b>>2],h=A[e+(8*b+4)>>2],k=0;k<h;k++)K.S(d,y[g+k]);a+=h}return a}catch(l){return"undefined"!==typeof FS&&l instanceof FS.I||x(l),-l.L}}var Ja={};
+(function(){function a(){try{if(d.wasmBinary)return new Uint8Array(d.wasmBinary);if(d.readBinary)return d.readBinary(f);throw"on the web, we need the wasm binary to be preloaded and set on Module['wasmBinary']. emcc.py will do that for you when generating HTML (but not JS)";}catch(p){x(p)}}function b(){return d.wasmBinary||!r&&!t||"function"!==typeof fetch?new Promise(function(b){b(a())}):fetch(f,{credentials:"same-origin"}).then(function(a){if(!a.ok)throw"failed to load wasm binary file at '"+f+
+"'";return a.arrayBuffer()}).catch(function(){return a()})}function c(a){function c(a){k=a.exports;if(k.memory){a=k.memory;var b=d.buffer;a.byteLength<b.byteLength&&d.printErr("the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here");b=new Int8Array(b);(new Int8Array(a)).set(b);d.buffer=buffer=a;ma()}d.asm=k;d.usingWasm=!0;G--;d.monitorRunDependencies&&d.monitorRunDependencies(G);0==G&&(null!==Da&&(clearInterval(Da),Da=null),H&&(a=H,H=null,a()))}
+function e(a){c(a.instance)}function g(a){b().then(function(a){return WebAssembly.instantiate(a,h)}).then(a).catch(function(a){d.printErr("failed to asynchronously prepare wasm: "+a);x(a)})}if("object"!==typeof WebAssembly)return d.printErr("no native wasm support detected"),!1;if(!(d.wasmMemory instanceof WebAssembly.Memory))return d.printErr("no native wasm Memory in use"),!1;a.memory=d.wasmMemory;h.global={NaN:NaN,Infinity:Infinity};h["global.Math"]=Math;h.env=a;G++;d.monitorRunDependencies&&d.monitorRunDependencies(G);
+if(d.instantiateWasm)try{return d.instantiateWasm(h,c)}catch(vb){return d.printErr("Module.instantiateWasm callback failed with error: "+vb),!1}d.wasmBinary||"function"!==typeof WebAssembly.instantiateStreaming||Ea(f)||"function"!==typeof fetch?g(e):WebAssembly.instantiateStreaming(fetch(f,{credentials:"same-origin"}),h).then(e).catch(function(a){d.printErr("wasm streaming compile failed: "+a);d.printErr("falling back to ArrayBuffer instantiation");g(e)});return{}}var e="pathkit.wast",f="pathkit.wasm",
+g="pathkit.temp.asm.js";"function"===typeof d.locateFile&&(Ea(e)||(e=d.locateFile(e)),Ea(f)||(f=d.locateFile(f)),Ea(g)||(g=d.locateFile(g)));var h={global:null,env:null,asm2wasm:ea,parent:d},k=null;d.asmPreload=d.asm;var l=d.reallocBuffer;d.reallocBuffer=function(a){if("asmjs"===m)var b=l(a);else a:{var c=d.usingWasm?65536:16777216;0<a%c&&(a+=c-a%c);c=d.buffer.byteLength;if(d.usingWasm)try{b=-1!==d.wasmMemory.grow((a-c)/65536)?d.buffer=d.wasmMemory.buffer:null;break a}catch(A){b=null;break a}b=void 0}return b};
+var m="";d.asm=function(a,b){if(!b.table){a=d.wasmTableSize;void 0===a&&(a=1024);var e=d.wasmMaxTableSize;b.table="object"===typeof WebAssembly&&"function"===typeof WebAssembly.Table?void 0!==e?new WebAssembly.Table({initial:a,maximum:e,element:"anyfunc"}):new WebAssembly.Table({initial:a,element:"anyfunc"}):Array(a);d.wasmTable=b.table}b.memoryBase||(b.memoryBase=d.STATIC_BASE);b.tableBase||(b.tableBase=0);b=c(b);assert(b,"no binaryen method succeeded.");return b}})();na=1024;D=na+30208;
+xa.push({Y:function(){Fa()}},{Y:function(){Ha()}});d.STATIC_BASE=na;d.STATIC_BUMP=30208;D+=16;var I=0;function J(){I+=4;return B[I-4>>2]}var Ia={};
+function K(a,b){I=b;try{var c=J(),e=J(),f=J();a=0;K.H||(K.H=[null,[],[]],K.ja=function(a,b){var c=K.H[a];assert(c);if(0===b||10===b){a=1===a?d.print:d.printErr;a:{for(var e=b=0;c[e];)++e;if(16<e-b&&c.subarray&&ha)b=ha.decode(c.subarray(b,e));else for(e="";;){var f=c[b++];if(!f){b=e;break a}if(f&128){var g=c[b++]&63;if(192==(f&224))e+=String.fromCharCode((f&31)<<6|g);else{var k=c[b++]&63;if(224==(f&240))f=(f&15)<<12|g<<6|k;else{var h=c[b++]&63;if(240==(f&248))f=(f&7)<<18|g<<12|k<<6|h;else{var l=c[b++]&
+63;if(248==(f&252))f=(f&3)<<24|g<<18|k<<12|h<<6|l;else{var m=c[b++]&63;f=(f&1)<<30|g<<24|k<<18|h<<12|l<<6|m}}}65536>f?e+=String.fromCharCode(f):(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023))}}else e+=String.fromCharCode(f)}}a(b);c.length=0}else c.push(b)});for(b=0;b<f;b++){for(var g=B[e+8*b>>2],h=B[e+(8*b+4)>>2],k=0;k<h;k++)K.ja(c,y[g+k]);a+=h}return a}catch(l){return"undefined"!==typeof FS&&l instanceof FS.U||x(l),-l.W}}var Ja={};
 function Ka(a){for(;a.length;){var b=a.pop();a.pop()(b)}}function L(a){return this.fromWireType(C[a>>2])}var M={},N={},La={};function Ma(a){if(void 0===a)return"_unknown";a=a.replace(/[^a-zA-Z0-9_]/g,"$");var b=a.charCodeAt(0);return 48<=b&&57>=b?"_"+a:a}function Na(a,b){a=Ma(a);return(new Function("body","return function "+a+'() {\n    "use strict";    return body.apply(this, arguments);\n};\n'))(b)}
-function Oa(a){var b=Error,d=Na(a,function(b){this.name=a;this.message=b;b=Error(b).stack;void 0!==b&&(this.stack=this.toString()+"\n"+b.replace(/^Error(:[^\n]*)?\n/,""))});d.prototype=Object.create(b.prototype);d.prototype.constructor=d;d.prototype.toString=function(){return void 0===this.message?this.name:this.name+": "+this.message};return d}var Pa=void 0;function Qa(a){throw new Pa(a);}
-function O(a,b,d){function e(b){b=d(b);b.length!==a.length&&Qa("Mismatched type converter count");for(var e=0;e<a.length;++e)P(a[e],b[e])}a.forEach(function(a){La[a]=b});var f=Array(b.length),g=[],h=0;b.forEach(function(a,b){N.hasOwnProperty(a)?f[b]=N[a]:(g.push(a),M.hasOwnProperty(a)||(M[a]=[]),M[a].push(function(){f[b]=N[a];++h;h===g.length&&e(f)}))});0===g.length&&e(f)}
-function Ra(a){switch(a){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+a);}}var Sa=void 0;function Q(a){for(var b="";y[a];)b+=Sa[y[a++]];return b}var R=void 0;function S(a){throw new R(a);}
-function P(a,b,d){d=d||{};if(!("argPackAdvance"in b))throw new TypeError("registerType registeredInstance requires argPackAdvance");var e=b.name;a||S('type "'+e+'" must have a positive integer typeid pointer');if(N.hasOwnProperty(a)){if(d.da)return;S("Cannot register type '"+e+"' twice")}N[a]=b;delete La[a];M.hasOwnProperty(a)&&(b=M[a],delete M[a],b.forEach(function(a){a()}))}function Ta(a){S(a.a.f.b.name+" instance already deleted")}var Ua=void 0,Va=[];
-function Wa(){for(;Va.length;){var a=Va.pop();a.a.s=!1;a["delete"]()}}function T(){}var Xa={};function Ya(a,b,d){if(void 0===a[b].g){var e=a[b];a[b]=function(){a[b].g.hasOwnProperty(arguments.length)||S("Function '"+d+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+a[b].g+")!");return a[b].g[arguments.length].apply(this,arguments)};a[b].g=[];a[b].g[e.A]=e}}
-function Za(a,b,d){c.hasOwnProperty(a)?((void 0===d||void 0!==c[a].g&&void 0!==c[a].g[d])&&S("Cannot register public name '"+a+"' twice"),Ya(c,a,a),c.hasOwnProperty(d)&&S("Cannot register multiple overloads of a function with the same number of arguments ("+d+")!"),c[a].g[d]=b):(c[a]=b,void 0!==d&&(c[a].na=d))}function $a(a,b,d,e,f,g,h,k){this.name=a;this.constructor=b;this.u=d;this.m=e;this.l=f;this.W=g;this.w=h;this.U=k;this.ga=[]}
-function ab(a,b,d){for(;b!==d;)b.w||S("Expected null or instance of "+d.name+", got an instance of "+b.name),a=b.w(a),b=b.l;return a}function bb(a,b){if(null===b)return this.F&&S("null is not a valid "+this.name),0;b.a||S('Cannot pass "'+U(b)+'" as a '+this.name);b.a.c||S("Cannot pass deleted object as a pointer of type "+this.name);return ab(b.a.c,b.a.f.b,this.b)}
-function cb(a,b){if(null===b){this.F&&S("null is not a valid "+this.name);if(this.C){var d=this.G();null!==a&&a.push(this.m,d);return d}return 0}b.a||S('Cannot pass "'+U(b)+'" as a '+this.name);b.a.c||S("Cannot pass deleted object as a pointer of type "+this.name);!this.B&&b.a.f.B&&S("Cannot convert argument of type "+(b.a.j?b.a.j.name:b.a.f.name)+" to parameter type "+this.name);d=ab(b.a.c,b.a.f.b,this.b);if(this.C)switch(void 0===b.a.h&&S("Passing raw pointer to smart pointer is illegal"),this.la){case 0:b.a.j===
-this?d=b.a.h:S("Cannot convert argument of type "+(b.a.j?b.a.j.name:b.a.f.name)+" to parameter type "+this.name);break;case 1:d=b.a.h;break;case 2:if(b.a.j===this)d=b.a.h;else{var e=b.clone();d=this.ha(d,V(function(){e["delete"]()}));null!==a&&a.push(this.m,d)}break;default:S("Unsupporting sharing policy")}return d}
-function db(a,b){if(null===b)return this.F&&S("null is not a valid "+this.name),0;b.a||S('Cannot pass "'+U(b)+'" as a '+this.name);b.a.c||S("Cannot pass deleted object as a pointer of type "+this.name);b.a.f.B&&S("Cannot convert argument of type "+b.a.f.name+" to parameter type "+this.name);return ab(b.a.c,b.a.f.b,this.b)}function eb(a,b,d){if(b===d)return a;if(void 0===d.l)return null;a=eb(a,b,d.l);return null===a?null:d.U(a)}var fb={};
-function gb(a,b){for(void 0===b&&S("ptr should not be undefined");a.l;)b=a.w(b),a=a.l;return fb[b]}function hb(a,b){b.f&&b.c||Qa("makeClassHandle requires ptr and ptrType");!!b.j!==!!b.h&&Qa("Both smartPtrType and smartPtr must be specified");b.count={value:1};return Object.create(a,{a:{value:b}})}
-function W(a,b,d,e,f,g,h,k,l,m,p){this.name=a;this.b=b;this.F=d;this.B=e;this.C=f;this.fa=g;this.la=h;this.O=k;this.G=l;this.ha=m;this.m=p;f||void 0!==b.l?this.toWireType=cb:(this.toWireType=e?bb:db,this.i=null)}function ib(a,b,d){c.hasOwnProperty(a)||Qa("Replacing nonexistant public symbol");void 0!==c[a].g&&void 0!==d?c[a].g[d]=b:(c[a]=b,c[a].A=d)}
-function X(a,b){a=Q(a);if(void 0!==c["FUNCTION_TABLE_"+a])var d=c["FUNCTION_TABLE_"+a][b];else if("undefined"!==typeof FUNCTION_TABLE)d=FUNCTION_TABLE[b];else{d=c.asm["dynCall_"+a];void 0===d&&(d=c.asm["dynCall_"+a.replace(/f/g,"d")],void 0===d&&S("No dynCall invoker for signature: "+a));for(var e=[],f=1;f<a.length;++f)e.push("a"+f);f="return function "+("dynCall_"+a+"_"+b)+"("+e.join(", ")+") {\n";f+="    return dynCall(rawFunction"+(e.length?", ":"")+e.join(", ")+");\n";d=(new Function("dynCall",
-"rawFunction",f+"};\n"))(d,b)}"function"!==typeof d&&S("unknown function pointer with signature "+a+": "+b);return d}var jb=void 0;function kb(a){a=lb(a);var b=Q(a);Y(a);return b}function mb(a,b){function d(a){f[a]||N[a]||(La[a]?La[a].forEach(d):(e.push(a),f[a]=!0))}var e=[],f={};b.forEach(d);throw new jb(a+": "+e.map(kb).join([", "]));}function nb(a,b){for(var d=[],e=0;e<a;e++)d.push(A[(b>>2)+e]);return d}
-function ob(a){var b=Function;if(!(b instanceof Function))throw new TypeError("new_ called with constructor type "+typeof b+" which is not a function");var d=Na(b.name||"unknownFunctionName",function(){});d.prototype=b.prototype;d=new d;a=b.apply(d,a);return a instanceof Object?a:d}
-function pb(a,b,d,e,f){var g=b.length;2>g&&S("argTypes array size mismatch! Must at least get return value and 'this' types!");var h=null!==b[1]&&null!==d,k=!1;for(d=1;d<b.length;++d)if(null!==b[d]&&void 0===b[d].i){k=!0;break}var l="void"!==b[0].name,m="",p="";for(d=0;d<g-2;++d)m+=(0!==d?", ":"")+"arg"+d,p+=(0!==d?", ":"")+"arg"+d+"Wired";a="return function "+Ma(a)+"("+m+") {\nif (arguments.length !== "+(g-2)+") {\nthrowBindingError('function "+a+" called with ' + arguments.length + ' arguments, expected "+
-(g-2)+" args!');\n}\n";k&&(a+="var destructors = [];\n");var v=k?"destructors":"null";m="throwBindingError invoker fn runDestructors retType classParam".split(" ");e=[S,e,f,Ka,b[0],b[1]];h&&(a+="var thisWired = classParam.toWireType("+v+", this);\n");for(d=0;d<g-2;++d)a+="var arg"+d+"Wired = argType"+d+".toWireType("+v+", arg"+d+"); // "+b[d+2].name+"\n",m.push("argType"+d),e.push(b[d+2]);h&&(p="thisWired"+(0<p.length?", ":"")+p);a+=(l?"var rv = ":"")+"invoker(fn"+(0<p.length?", ":"")+p+");\n";if(k)a+=
-"runDestructors(destructors);\n";else for(d=h?1:2;d<b.length;++d)g=1===d?"thisWired":"arg"+(d-2)+"Wired",null!==b[d].i&&(a+=g+"_dtor("+g+"); // "+b[d].name+"\n",m.push(g+"_dtor"),e.push(b[d].i));l&&(a+="var ret = retType.fromWireType(rv);\nreturn ret;\n");m.push(a+"}\n");return ob(m).apply(null,e)}var qb=[],Z=[{},{value:void 0},{value:null},{value:!0},{value:!1}];function rb(a){4<a&&0===--Z[a].H&&(Z[a]=void 0,qb.push(a))}
-function V(a){switch(a){case void 0:return 1;case null:return 2;case !0:return 3;case !1:return 4;default:var b=qb.length?qb.pop():Z.length;Z[b]={H:1,value:a};return b}}function sb(a,b,d){switch(b){case 0:return function(a){return this.fromWireType((d?ia:y)[a])};case 1:return function(a){return this.fromWireType((d?z:ja)[a>>1])};case 2:return function(a){return this.fromWireType((d?A:C)[a>>2])};default:throw new TypeError("Unknown integer type: "+a);}}
-function tb(a,b){var d=N[a];void 0===d&&S(b+" has unknown type "+kb(a));return d}function U(a){if(null===a)return"null";var b=typeof a;return"object"===b||"array"===b||"function"===b?a.toString():""+a}function wb(a,b){switch(b){case 2:return function(a){return this.fromWireType(ka[a>>2])};case 3:return function(a){return this.fromWireType(la[a>>3])};default:throw new TypeError("Unknown float type: "+a);}}
-function xb(a,b,d){switch(b){case 0:return d?function(a){return ia[a]}:function(a){return y[a]};case 1:return d?function(a){return z[a>>1]}:function(a){return ja[a>>1]};case 2:return d?function(a){return A[a>>2]}:function(a){return C[a>>2]};default:throw new TypeError("Unknown integer type: "+a);}}function yb(a){a||S("Cannot use deleted val. handle = "+a);return Z[a].value}var zb={};function Ab(a){var b=zb[a];return void 0===b?Q(a):b}var Bb=[];function Cb(a){var b=Bb.length;Bb.push(a);return b}
-function Db(a,b){for(var d=Array(a),e=0;e<a;++e)d[e]=tb(A[(b>>2)+e],"parameter "+e);return d}var Eb={};Pa=c.InternalError=Oa("InternalError");for(var Fb=Array(256),Gb=0;256>Gb;++Gb)Fb[Gb]=String.fromCharCode(Gb);Sa=Fb;R=c.BindingError=Oa("BindingError");T.prototype.isAliasOf=function(a){if(!(this instanceof T&&a instanceof T))return!1;var b=this.a.f.b,d=this.a.c,e=a.a.f.b;for(a=a.a.c;b.l;)d=b.w(d),b=b.l;for(;e.l;)a=e.w(a),e=e.l;return b===e&&d===a};
-T.prototype.clone=function(){this.a.c||Ta(this);if(this.a.v)return this.a.count.value+=1,this;var a=this.a;a=Object.create(Object.getPrototypeOf(this),{a:{value:{count:a.count,s:a.s,v:a.v,c:a.c,f:a.f,h:a.h,j:a.j}}});a.a.count.value+=1;a.a.s=!1;return a};T.prototype["delete"]=function(){this.a.c||Ta(this);this.a.s&&!this.a.v&&S("Object already scheduled for deletion");--this.a.count.value;if(0===this.a.count.value){var a=this.a;a.h?a.j.m(a.h):a.f.b.m(a.c)}this.a.v||(this.a.h=void 0,this.a.c=void 0)};
-T.prototype.isDeleted=function(){return!this.a.c};T.prototype.deleteLater=function(){this.a.c||Ta(this);this.a.s&&!this.a.v&&S("Object already scheduled for deletion");Va.push(this);1===Va.length&&Ua&&Ua(Wa);this.a.s=!0;return this};W.prototype.X=function(a){this.O&&(a=this.O(a));return a};W.prototype.K=function(a){this.m&&this.m(a)};W.prototype.argPackAdvance=8;W.prototype.readValueFromPointer=L;W.prototype.deleteObject=function(a){if(null!==a)a["delete"]()};
-W.prototype.fromWireType=function(a){function b(){return this.C?hb(this.b.u,{f:this.fa,c:d,j:this,h:a}):hb(this.b.u,{f:this,c:a})}var d=this.X(a);if(!d)return this.K(a),null;var e=gb(this.b,d);if(void 0!==e){if(0===e.a.count.value)return e.a.c=d,e.a.h=a,e.clone();e=e.clone();this.K(a);return e}e=this.b.W(d);e=Xa[e];if(!e)return b.call(this);e=this.B?e.T:e.pointerType;var f=eb(d,this.b,e.b);return null===f?b.call(this):this.C?hb(e.b.u,{f:e,c:f,j:this,h:a}):hb(e.b.u,{f:e,c:f})};
-c.getInheritedInstanceCount=function(){return Object.keys(fb).length};c.getLiveInheritedInstances=function(){var a=[],b;for(b in fb)fb.hasOwnProperty(b)&&a.push(fb[b]);return a};c.flushPendingDeletes=Wa;c.setDelayFunction=function(a){Ua=a;Va.length&&Ua&&Ua(Wa)};jb=c.UnboundTypeError=Oa("UnboundTypeError");c.count_emval_handles=function(){for(var a=0,b=5;b<Z.length;++b)void 0!==Z[b]&&++a;return a};c.get_first_emval=function(){for(var a=5;a<Z.length;++a)if(void 0!==Z[a])return Z[a];return null};assert(!oa);
-var Hb=D;D=D+4+15&-16;ta=Hb;pa=qa=da(D);ra=pa+va;sa=da(ra);A[ta>>2]=sa;oa=!0;c.wasmTableSize=339;c.wasmMaxTableSize=339;c.P={};
-c.R={abort:x,enlargeMemory:function(){ua()},getTotalMemory:function(){return E},abortOnCannotGrowMemory:ua,___cxa_pure_virtual:function(){fa=!0;throw"Pure virtual function called!";},___setErrNo:function(a){c.___errno_location&&(A[c.___errno_location()>>2]=a);return a},___syscall140:function(a,b){I=b;try{var d=Ia.Y();J();var e=J(),f=J(),g=J();FS.ma(d,e,g);A[f>>2]=d.position;d.Z&&0===e&&0===g&&(d.Z=null);return 0}catch(h){return"undefined"!==typeof FS&&h instanceof FS.I||x(h),-h.L}},___syscall146:K,
-___syscall6:function(a,b){I=b;try{var d=Ia.Y();FS.close(d);return 0}catch(e){return"undefined"!==typeof FS&&e instanceof FS.I||x(e),-e.L}},__embind_finalize_value_object:function(a){var b=Ja[a];delete Ja[a];var d=b.G,e=b.m,f=b.M,g=f.map(function(a){return a.ba}).concat(f.map(function(a){return a.ja}));O([a],g,function(a){var g={};f.forEach(function(b,d){var e=a[d],k=b.$,h=b.aa,m=a[d+f.length],l=b.ia,vb=b.ka;g[b.V]={read:function(a){return e.fromWireType(k(h,a))},write:function(a,b){var d=[];l(vb,
-a,m.toWireType(d,b));Ka(d)}}});return[{name:b.name,fromWireType:function(a){var b={},d;for(d in g)b[d]=g[d].read(a);e(a);return b},toWireType:function(a,b){for(var f in g)if(!(f in b))throw new TypeError("Missing field");var k=d();for(f in g)g[f].write(k,b[f]);null!==a&&a.push(e,k);return k},argPackAdvance:8,readValueFromPointer:L,i:e}]})},__embind_register_bool:function(a,b,d,e,f){var g=Ra(d);b=Q(b);P(a,{name:b,fromWireType:function(a){return!!a},toWireType:function(a,b){return b?e:f},argPackAdvance:8,
-readValueFromPointer:function(a){if(1===d)var e=ia;else if(2===d)e=z;else if(4===d)e=A;else throw new TypeError("Unknown boolean type size: "+b);return this.fromWireType(e[a>>g])},i:null})},__embind_register_class:function(a,b,d,e,f,g,h,k,l,m,p,v,Ga){p=Q(p);g=X(f,g);k&&(k=X(h,k));m&&(m=X(l,m));Ga=X(v,Ga);var B=Ma(p);Za(B,function(){mb("Cannot construct "+p+" due to unbound types",[e])});O([a,b,d],e?[e]:[],function(b){b=b[0];if(e){var d=b.b;var f=d.u}else f=T.prototype;b=Na(B,function(){if(Object.getPrototypeOf(this)!==
-h)throw new R("Use 'new' to construct "+p);if(void 0===l.o)throw new R(p+" has no accessible constructor");var a=l.o[arguments.length];if(void 0===a)throw new R("Tried to invoke ctor of "+p+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(l.o).toString()+") parameters instead!");return a.apply(this,arguments)});var h=Object.create(f,{constructor:{value:b}});b.prototype=h;var l=new $a(p,b,h,Ga,d,g,k,m);d=new W(p,l,!0,!1,!1);f=new W(p+"*",l,!1,!1,!1);var v=new W(p+
-" const*",l,!1,!0,!1);Xa[a]={pointerType:f,T:v};ib(B,b);return[d,f,v]})},__embind_register_class_constructor:function(a,b,d,e,f,g){var h=nb(b,d);f=X(e,f);O([],[a],function(a){a=a[0];var d="constructor "+a.name;void 0===a.b.o&&(a.b.o=[]);if(void 0!==a.b.o[b-1])throw new R("Cannot register multiple constructors with identical number of parameters ("+(b-1)+") for class '"+a.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!");a.b.o[b-1]=function(){mb("Cannot construct "+
-a.name+" due to unbound types",h)};O([],h,function(e){a.b.o[b-1]=function(){arguments.length!==b-1&&S(d+" called with "+arguments.length+" arguments, expected "+(b-1));var a=[],k=Array(b);k[0]=g;for(var h=1;h<b;++h)k[h]=e[h].toWireType(a,arguments[h-1]);k=f.apply(null,k);Ka(a);return e[0].fromWireType(k)};return[]});return[]})},__embind_register_class_function:function(a,b,d,e,f,g,h,k){var l=nb(d,e);b=Q(b);g=X(f,g);O([],[a],function(a){function e(){mb("Cannot call "+f+" due to unbound types",l)}a=
-a[0];var f=a.name+"."+b;k&&a.b.ga.push(b);var m=a.b.u,B=m[b];void 0===B||void 0===B.g&&B.className!==a.name&&B.A===d-2?(e.A=d-2,e.className=a.name,m[b]=e):(Ya(m,b,f),m[b].g[d-2]=e);O([],l,function(e){e=pb(f,e,a,g,h);void 0===m[b].g?(e.A=d-2,m[b]=e):m[b].g[d-2]=e;return[]});return[]})},__embind_register_constant:function(a,b,d){a=Q(a);O([],[b],function(b){b=b[0];c[a]=b.fromWireType(d);return[]})},__embind_register_emval:function(a,b){b=Q(b);P(a,{name:b,fromWireType:function(a){var b=Z[a].value;rb(a);
-return b},toWireType:function(a,b){return V(b)},argPackAdvance:8,readValueFromPointer:L,i:null})},__embind_register_enum:function(a,b,d,e){function f(){}d=Ra(d);b=Q(b);f.values={};P(a,{name:b,constructor:f,fromWireType:function(a){return this.constructor.values[a]},toWireType:function(a,b){return b.value},argPackAdvance:8,readValueFromPointer:sb(b,d,e),i:null});Za(b,f)},__embind_register_enum_value:function(a,b,d){var e=tb(a,"enum");b=Q(b);a=e.constructor;e=Object.create(e.constructor.prototype,{value:{value:d},
-constructor:{value:Na(e.name+"_"+b,function(){})}});a.values[d]=e;a[b]=e},__embind_register_float:function(a,b,d){d=Ra(d);b=Q(b);P(a,{name:b,fromWireType:function(a){return a},toWireType:function(a,b){if("number"!==typeof b&&"boolean"!==typeof b)throw new TypeError('Cannot convert "'+U(b)+'" to '+this.name);return b},argPackAdvance:8,readValueFromPointer:wb(b,d),i:null})},__embind_register_function:function(a,b,d,e,f,g){var h=nb(b,d);a=Q(a);f=X(e,f);Za(a,function(){mb("Cannot call "+a+" due to unbound types",
-h)},b-1);O([],h,function(d){d=[d[0],null].concat(d.slice(1));ib(a,pb(a,d,null,f,g),b-1);return[]})},__embind_register_integer:function(a,b,d,e,f){function g(a){return a}b=Q(b);-1===f&&(f=4294967295);var h=Ra(d);if(0===e){var k=32-8*d;g=function(a){return a<<k>>>k}}var l=-1!=b.indexOf("unsigned");P(a,{name:b,fromWireType:g,toWireType:function(a,d){if("number"!==typeof d&&"boolean"!==typeof d)throw new TypeError('Cannot convert "'+U(d)+'" to '+this.name);if(d<e||d>f)throw new TypeError('Passing a number "'+
-U(d)+'" from JS side to C/C++ side to an argument of type "'+b+'", which is outside the valid range ['+e+", "+f+"]!");return l?d>>>0:d|0},argPackAdvance:8,readValueFromPointer:xb(b,h,0!==e),i:null})},__embind_register_memory_view:function(a,b,d){function e(a){a>>=2;var b=C;return new f(b.buffer,b[a+1],b[a])}var f=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];d=Q(d);P(a,{name:d,fromWireType:e,argPackAdvance:8,readValueFromPointer:e},{da:!0})},__embind_register_std_string:function(a,
-b){b=Q(b);P(a,{name:b,fromWireType:function(a){for(var b=C[a>>2],d=Array(b),g=0;g<b;++g)d[g]=String.fromCharCode(y[a+4+g]);Y(a);return d.join("")},toWireType:function(a,b){function d(a,b){return a[b]}function e(a,b){return a.charCodeAt(b)}b instanceof ArrayBuffer&&(b=new Uint8Array(b));var h;b instanceof Uint8Array?h=d:b instanceof Uint8ClampedArray?h=d:b instanceof Int8Array?h=d:"string"===typeof b?h=e:S("Cannot pass non-string to std::string");var k=b.length,l=Ib(4+k);C[l>>2]=k;for(var m=0;m<k;++m){var p=
-h(b,m);255<p&&(Y(l),S("String has UTF-16 code units that do not fit in 8 bits"));y[l+4+m]=p}null!==a&&a.push(Y,l);return l},argPackAdvance:8,readValueFromPointer:L,i:function(a){Y(a)}})},__embind_register_std_wstring:function(a,b,d){d=Q(d);if(2===b){var e=function(){return ja};var f=1}else 4===b&&(e=function(){return C},f=2);P(a,{name:d,fromWireType:function(a){for(var b=e(),d=C[a>>2],g=Array(d),m=a+4>>f,p=0;p<d;++p)g[p]=String.fromCharCode(b[m+p]);Y(a);return g.join("")},toWireType:function(a,d){var g=
-e(),h=d.length,m=Ib(4+h*b);C[m>>2]=h;for(var p=m+4>>f,v=0;v<h;++v)g[p+v]=d.charCodeAt(v);null!==a&&a.push(Y,m);return m},argPackAdvance:8,readValueFromPointer:L,i:function(a){Y(a)}})},__embind_register_value_object:function(a,b,d,e,f,g){Ja[a]={name:Q(b),G:X(d,e),m:X(f,g),M:[]}},__embind_register_value_object_field:function(a,b,d,e,f,g,h,k,l,m){Ja[a].M.push({V:Q(b),ba:d,$:X(e,f),aa:g,ja:h,ia:X(k,l),ka:m})},__embind_register_void:function(a,b){b=Q(b);P(a,{ea:!0,name:b,argPackAdvance:0,fromWireType:function(){},
-toWireType:function(){}})},__emval_as:function(a,b,d){a=yb(a);b=tb(b,"emval::as");var e=[],f=V(e);A[d>>2]=f;return b.toWireType(e,a)},__emval_call_void_method:function(a,b,d,e){a=Bb[a];b=yb(b);d=Ab(d);a(b,d,null,e)},__emval_decref:rb,__emval_get_global:function(a){if(0===a)return V(Function("return this")());a=Ab(a);return V(Function("return this")()[a])},__emval_get_method_caller:function(a,b){b=Db(a,b);for(var d=b[0],e=d.name+"_$"+b.slice(1).map(function(a){return a.name}).join("_")+"$",f=["retType"],
-g=[d],h="",k=0;k<a-1;++k)h+=(0!==k?", ":"")+"arg"+k,f.push("argType"+k),g.push(b[1+k]);e="return function "+Ma("methodCaller_"+e)+"(handle, name, destructors, args) {\n";var l=0;for(k=0;k<a-1;++k)e+="    var arg"+k+" = argType"+k+".readValueFromPointer(args"+(l?"+"+l:"")+");\n",l+=b[k+1].argPackAdvance;e+="    var rv = handle[name]("+h+");\n";for(k=0;k<a-1;++k)b[k+1].deleteObject&&(e+="    argType"+k+".deleteObject(arg"+k+");\n");d.ea||(e+="    return retType.toWireType(destructors, rv);\n");f.push(e+
-"};\n");a=ob(f).apply(null,g);return Cb(a)},__emval_get_property:function(a,b){a=yb(a);b=yb(b);return V(a[b])},__emval_incref:function(a){4<a&&(Z[a].H+=1)},__emval_new:function(a,b,d,e){a=yb(a);var f=Eb[b];if(!f){f="";for(var g=0;g<b;++g)f+=(0!==g?", ":"")+"arg"+g;var h="return function emval_allocator_"+b+"(constructor, argTypes, args) {\n";for(g=0;g<b;++g)h+="var argType"+g+" = requireRegisteredType(HEAP32[(argTypes >> 2) + "+g+'], "parameter '+g+'");\nvar arg'+g+" = argType"+g+".readValueFromPointer(args);\nargs += argType"+
-g+"['argPackAdvance'];\n";f=(new Function("requireRegisteredType","HEAP32","__emval_register",h+("var obj = new constructor("+f+");\nreturn __emval_register(obj);\n}\n")))(tb,A,V);Eb[b]=f}return f(a,d,e)},__emval_new_array:function(){return V([])},__emval_new_cstring:function(a){return V(Ab(a))},__emval_run_destructors:function(a){Ka(Z[a].value);rb(a)},__emval_take_value:function(a,b){a=tb(a,"_emval_take_value");a=a.readValueFromPointer(b);return V(a)},_abort:function(){c.abort()},_emscripten_memcpy_big:function(a,
-b,d){y.set(y.subarray(b,b+d),a);return a},_llvm_trap:function(){x("trap!")},DYNAMICTOP_PTR:ta,STACKTOP:qa};var Jb=c.asm(c.P,c.R,buffer);c.asm=Jb;var Ha=c.__GLOBAL__sub_I_bind_cpp=function(){return c.asm.__GLOBAL__sub_I_bind_cpp.apply(null,arguments)},Fa=c.__GLOBAL__sub_I_pathkit_wasm_bindings_cpp=function(){return c.asm.__GLOBAL__sub_I_pathkit_wasm_bindings_cpp.apply(null,arguments)};c.__Z11ApplyPathOpRK6SkPathS1_8SkPathOp=function(){return c.asm.__Z11ApplyPathOpRK6SkPathS1_8SkPathOp.apply(null,arguments)};
-c.__Z11ToSVGStringRK6SkPath=function(){return c.asm.__Z11ToSVGStringRK6SkPath.apply(null,arguments)};c.__Z12SimplifyPathRK6SkPath=function(){return c.asm.__Z12SimplifyPathRK6SkPath.apply(null,arguments)};c.__Z13FromSVGStringNSt3__212basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE=function(){return c.asm.__Z13FromSVGStringNSt3__212basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE.apply(null,arguments)};
-c.__Z14ResolveBuilderR11SkOpBuilder=function(){return c.asm.__Z14ResolveBuilderR11SkOpBuilder.apply(null,arguments)};c.__Z6ToCmdsRK6SkPath=function(){return c.asm.__Z6ToCmdsRK6SkPath.apply(null,arguments)};c.__Z7NewPathv=function(){return c.asm.__Z7NewPathv.apply(null,arguments)};c.__Z8FromCmdsji=function(){return c.asm.__Z8FromCmdsji.apply(null,arguments)};c.__Z8ToCanvasRK6SkPathN10emscripten3valE=function(){return c.asm.__Z8ToCanvasRK6SkPathN10emscripten3valE.apply(null,arguments)};
-c.__Z8ToPath2DRK6SkPath=function(){return c.asm.__Z8ToPath2DRK6SkPath.apply(null,arguments)};var lb=c.___getTypeName=function(){return c.asm.___getTypeName.apply(null,arguments)},Y=c._free=function(){return c.asm._free.apply(null,arguments)},Ib=c._malloc=function(){return c.asm._malloc.apply(null,arguments)};c.dynCall_fi=function(){return c.asm.dynCall_fi.apply(null,arguments)};c.dynCall_fii=function(){return c.asm.dynCall_fii.apply(null,arguments)};
-c.dynCall_i=function(){return c.asm.dynCall_i.apply(null,arguments)};c.dynCall_ii=function(){return c.asm.dynCall_ii.apply(null,arguments)};c.dynCall_iiffff=function(){return c.asm.dynCall_iiffff.apply(null,arguments)};c.dynCall_iiffi=function(){return c.asm.dynCall_iiffi.apply(null,arguments)};c.dynCall_iii=function(){return c.asm.dynCall_iii.apply(null,arguments)};c.dynCall_iiiff=function(){return c.asm.dynCall_iiiff.apply(null,arguments)};
-c.dynCall_iiifff=function(){return c.asm.dynCall_iiifff.apply(null,arguments)};c.dynCall_iiiffi=function(){return c.asm.dynCall_iiiffi.apply(null,arguments)};c.dynCall_iiifii=function(){return c.asm.dynCall_iiifii.apply(null,arguments)};c.dynCall_iiii=function(){return c.asm.dynCall_iiii.apply(null,arguments)};c.dynCall_iiiii=function(){return c.asm.dynCall_iiiii.apply(null,arguments)};c.dynCall_iiiiii=function(){return c.asm.dynCall_iiiiii.apply(null,arguments)};
-c.dynCall_iiiiiii=function(){return c.asm.dynCall_iiiiiii.apply(null,arguments)};c.dynCall_v=function(){return c.asm.dynCall_v.apply(null,arguments)};c.dynCall_vi=function(){return c.asm.dynCall_vi.apply(null,arguments)};c.dynCall_vif=function(){return c.asm.dynCall_vif.apply(null,arguments)};c.dynCall_viff=function(){return c.asm.dynCall_viff.apply(null,arguments)};c.dynCall_viffff=function(){return c.asm.dynCall_viffff.apply(null,arguments)};
-c.dynCall_vifffff=function(){return c.asm.dynCall_vifffff.apply(null,arguments)};c.dynCall_viffffff=function(){return c.asm.dynCall_viffffff.apply(null,arguments)};c.dynCall_vifffffff=function(){return c.asm.dynCall_vifffffff.apply(null,arguments)};c.dynCall_vifffffffi=function(){return c.asm.dynCall_vifffffffi.apply(null,arguments)};c.dynCall_vifffffi=function(){return c.asm.dynCall_vifffffi.apply(null,arguments)};c.dynCall_viffi=function(){return c.asm.dynCall_viffi.apply(null,arguments)};
-c.dynCall_vifii=function(){return c.asm.dynCall_vifii.apply(null,arguments)};c.dynCall_vii=function(){return c.asm.dynCall_vii.apply(null,arguments)};c.dynCall_viid=function(){return c.asm.dynCall_viid.apply(null,arguments)};c.dynCall_viif=function(){return c.asm.dynCall_viif.apply(null,arguments)};c.dynCall_viifd=function(){return c.asm.dynCall_viifd.apply(null,arguments)};c.dynCall_viiff=function(){return c.asm.dynCall_viiff.apply(null,arguments)};
-c.dynCall_viifff=function(){return c.asm.dynCall_viifff.apply(null,arguments)};c.dynCall_viiffff=function(){return c.asm.dynCall_viiffff.apply(null,arguments)};c.dynCall_viifffff=function(){return c.asm.dynCall_viifffff.apply(null,arguments)};c.dynCall_viiffffff=function(){return c.asm.dynCall_viiffffff.apply(null,arguments)};c.dynCall_viifffffff=function(){return c.asm.dynCall_viifffffff.apply(null,arguments)};c.dynCall_viifffffffff=function(){return c.asm.dynCall_viifffffffff.apply(null,arguments)};
-c.dynCall_viifffffffi=function(){return c.asm.dynCall_viifffffffi.apply(null,arguments)};c.dynCall_viifffffi=function(){return c.asm.dynCall_viifffffi.apply(null,arguments)};c.dynCall_viiffi=function(){return c.asm.dynCall_viiffi.apply(null,arguments)};c.dynCall_viifii=function(){return c.asm.dynCall_viifii.apply(null,arguments)};c.dynCall_viii=function(){return c.asm.dynCall_viii.apply(null,arguments)};c.dynCall_viiiffffff=function(){return c.asm.dynCall_viiiffffff.apply(null,arguments)};
-c.dynCall_viiifffffffff=function(){return c.asm.dynCall_viiifffffffff.apply(null,arguments)};c.dynCall_viiii=function(){return c.asm.dynCall_viiii.apply(null,arguments)};c.dynCall_viiiii=function(){return c.asm.dynCall_viiiii.apply(null,arguments)};c.dynCall_viiiiiffii=function(){return c.asm.dynCall_viiiiiffii.apply(null,arguments)};c.asm=Jb;c.then=function(a){if(c.calledRun)a(c);else{var b=c.onRuntimeInitialized;c.onRuntimeInitialized=function(){b&&b();a(c)}}return c};
-function w(a){this.name="ExitStatus";this.message="Program terminated with exit("+a+")";this.status=a}w.prototype=Error();w.prototype.constructor=w;H=function Kb(){c.calledRun||Lb();c.calledRun||(H=Kb)};
-function Lb(){function a(){if(!c.calledRun&&(c.calledRun=!0,!fa)){Ba||(Ba=!0,F(xa));F(ya);if(c.onRuntimeInitialized)c.onRuntimeInitialized();if(c.postRun)for("function"==typeof c.postRun&&(c.postRun=[c.postRun]);c.postRun.length;){var a=c.postRun.shift();Aa.unshift(a)}F(Aa)}}if(!(0<G)){if(c.preRun)for("function"==typeof c.preRun&&(c.preRun=[c.preRun]);c.preRun.length;)Ca();F(wa);0<G||c.calledRun||(c.setStatus?(c.setStatus("Running..."),setTimeout(function(){setTimeout(function(){c.setStatus("")},
-1);a()},1)):a())}}c.run=Lb;c.exit=function(a,b){if(!b||!c.noExitRuntime||0!==a){if(!c.noExitRuntime&&(fa=!0,qa=void 0,F(za),c.onExit))c.onExit(a);u&&process.exit(a);c.quit(a,new w(a))}};function x(a){if(c.onAbort)c.onAbort(a);void 0!==a?(c.print(a),c.printErr(a),a=JSON.stringify(a)):a="";fa=!0;throw"abort("+a+"). Build with -s ASSERTIONS=1 for more info.";}c.abort=x;if(c.preInit)for("function"==typeof c.preInit&&(c.preInit=[c.preInit]);0<c.preInit.length;)c.preInit.pop()();c.noExitRuntime=!0;Lb();
+function Oa(a){var b=Error,c=Na(a,function(b){this.name=a;this.message=b;b=Error(b).stack;void 0!==b&&(this.stack=this.toString()+"\n"+b.replace(/^Error(:[^\n]*)?\n/,""))});c.prototype=Object.create(b.prototype);c.prototype.constructor=c;c.prototype.toString=function(){return void 0===this.message?this.name:this.name+": "+this.message};return c}var Pa=void 0;function Qa(a){throw new Pa(a);}
+function O(a,b,c){function e(b){b=c(b);b.length!==a.length&&Qa("Mismatched type converter count");for(var e=0;e<a.length;++e)P(a[e],b[e])}a.forEach(function(a){La[a]=b});var f=Array(b.length),g=[],h=0;b.forEach(function(a,b){N.hasOwnProperty(a)?f[b]=N[a]:(g.push(a),M.hasOwnProperty(a)||(M[a]=[]),M[a].push(function(){f[b]=N[a];++h;h===g.length&&e(f)}))});0===g.length&&e(f)}var Ra={};
+function Sa(a){switch(a){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+a);}}var Ta=void 0;function Q(a){for(var b="";y[a];)b+=Ta[y[a++]];return b}var R=void 0;function S(a){throw new R(a);}
+function P(a,b,c){c=c||{};if(!("argPackAdvance"in b))throw new TypeError("registerType registeredInstance requires argPackAdvance");var e=b.name;a||S('type "'+e+'" must have a positive integer typeid pointer');if(N.hasOwnProperty(a)){if(c.ka)return;S("Cannot register type '"+e+"' twice")}N[a]=b;delete La[a];M.hasOwnProperty(a)&&(b=M[a],delete M[a],b.forEach(function(a){a()}))}function Ua(a){S(a.g.j.h.name+" instance already deleted")}var Va=void 0,Wa=[];
+function Xa(){for(;Wa.length;){var a=Wa.pop();a.g.A=!1;a["delete"]()}}function T(){}var Ya={};function Za(a,b,c){if(void 0===a[b].l){var e=a[b];a[b]=function(){a[b].l.hasOwnProperty(arguments.length)||S("Function '"+c+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+a[b].l+")!");return a[b].l[arguments.length].apply(this,arguments)};a[b].l=[];a[b].l[e.G]=e}}
+function $a(a,b,c){d.hasOwnProperty(a)?((void 0===c||void 0!==d[a].l&&void 0!==d[a].l[c])&&S("Cannot register public name '"+a+"' twice"),Za(d,a,a),d.hasOwnProperty(c)&&S("Cannot register multiple overloads of a function with the same number of arguments ("+c+")!"),d[a].l[c]=b):(d[a]=b,void 0!==c&&(d[a].ra=c))}function ab(a,b,c,e,f,g,h,k){this.name=a;this.constructor=b;this.B=c;this.s=e;this.v=f;this.fa=g;this.F=h;this.da=k;this.na=[]}
+function bb(a,b,c){for(;b!==c;)b.F||S("Expected null or instance of "+c.name+", got an instance of "+b.name),a=b.F(a),b=b.v;return a}function cb(a,b){if(null===b)return this.O&&S("null is not a valid "+this.name),0;b.g||S('Cannot pass "'+U(b)+'" as a '+this.name);b.g.i||S("Cannot pass deleted object as a pointer of type "+this.name);return bb(b.g.i,b.g.j.h,this.h)}
+function db(a,b){if(null===b){this.O&&S("null is not a valid "+this.name);if(this.J){var c=this.D();null!==a&&a.push(this.s,c);return c}return 0}b.g||S('Cannot pass "'+U(b)+'" as a '+this.name);b.g.i||S("Cannot pass deleted object as a pointer of type "+this.name);!this.I&&b.g.j.I&&S("Cannot convert argument of type "+(b.g.u?b.g.u.name:b.g.j.name)+" to parameter type "+this.name);c=bb(b.g.i,b.g.j.h,this.h);if(this.J)switch(void 0===b.g.o&&S("Passing raw pointer to smart pointer is illegal"),this.pa){case 0:b.g.u===
+this?c=b.g.o:S("Cannot convert argument of type "+(b.g.u?b.g.u.name:b.g.j.name)+" to parameter type "+this.name);break;case 1:c=b.g.o;break;case 2:if(b.g.u===this)c=b.g.o;else{var e=b.clone();c=this.oa(c,V(function(){e["delete"]()}));null!==a&&a.push(this.s,c)}break;default:S("Unsupporting sharing policy")}return c}
+function eb(a,b){if(null===b)return this.O&&S("null is not a valid "+this.name),0;b.g||S('Cannot pass "'+U(b)+'" as a '+this.name);b.g.i||S("Cannot pass deleted object as a pointer of type "+this.name);b.g.j.I&&S("Cannot convert argument of type "+b.g.j.name+" to parameter type "+this.name);return bb(b.g.i,b.g.j.h,this.h)}function fb(a,b,c){if(b===c)return a;if(void 0===c.v)return null;a=fb(a,b,c.v);return null===a?null:c.da(a)}var gb={};
+function hb(a,b){for(void 0===b&&S("ptr should not be undefined");a.v;)b=a.F(b),a=a.v;return gb[b]}function ib(a,b){b.j&&b.i||Qa("makeClassHandle requires ptr and ptrType");!!b.u!==!!b.o&&Qa("Both smartPtrType and smartPtr must be specified");b.count={value:1};return Object.create(a,{g:{value:b}})}
+function W(a,b,c,e,f,g,h,k,l,m,p){this.name=a;this.h=b;this.O=c;this.I=e;this.J=f;this.ma=g;this.pa=h;this.Z=k;this.D=l;this.oa=m;this.s=p;f||void 0!==b.v?this.toWireType=db:(this.toWireType=e?cb:eb,this.m=null)}function jb(a,b,c){d.hasOwnProperty(a)||Qa("Replacing nonexistant public symbol");void 0!==d[a].l&&void 0!==c?d[a].l[c]=b:(d[a]=b,d[a].G=c)}
+function X(a,b){a=Q(a);if(void 0!==d["FUNCTION_TABLE_"+a])var c=d["FUNCTION_TABLE_"+a][b];else if("undefined"!==typeof FUNCTION_TABLE)c=FUNCTION_TABLE[b];else{c=d.asm["dynCall_"+a];void 0===c&&(c=d.asm["dynCall_"+a.replace(/f/g,"d")],void 0===c&&S("No dynCall invoker for signature: "+a));for(var e=[],f=1;f<a.length;++f)e.push("a"+f);f="return function "+("dynCall_"+a+"_"+b)+"("+e.join(", ")+") {\n";f+="    return dynCall(rawFunction"+(e.length?", ":"")+e.join(", ")+");\n";c=(new Function("dynCall",
+"rawFunction",f+"};\n"))(c,b)}"function"!==typeof c&&S("unknown function pointer with signature "+a+": "+b);return c}var kb=void 0;function lb(a){a=mb(a);var b=Q(a);Y(a);return b}function nb(a,b){function c(a){f[a]||N[a]||(La[a]?La[a].forEach(c):(e.push(a),f[a]=!0))}var e=[],f={};b.forEach(c);throw new kb(a+": "+e.map(lb).join([", "]));}function ob(a,b){for(var c=[],e=0;e<a;e++)c.push(B[(b>>2)+e]);return c}
+function pb(a){var b=Function;if(!(b instanceof Function))throw new TypeError("new_ called with constructor type "+typeof b+" which is not a function");var c=Na(b.name||"unknownFunctionName",function(){});c.prototype=b.prototype;c=new c;a=b.apply(c,a);return a instanceof Object?a:c}
+function qb(a,b,c,e,f){var g=b.length;2>g&&S("argTypes array size mismatch! Must at least get return value and 'this' types!");var h=null!==b[1]&&null!==c,k=!1;for(c=1;c<b.length;++c)if(null!==b[c]&&void 0===b[c].m){k=!0;break}var l="void"!==b[0].name,m="",p="";for(c=0;c<g-2;++c)m+=(0!==c?", ":"")+"arg"+c,p+=(0!==c?", ":"")+"arg"+c+"Wired";a="return function "+Ma(a)+"("+m+") {\nif (arguments.length !== "+(g-2)+") {\nthrowBindingError('function "+a+" called with ' + arguments.length + ' arguments, expected "+
+(g-2)+" args!');\n}\n";k&&(a+="var destructors = [];\n");var w=k?"destructors":"null";m="throwBindingError invoker fn runDestructors retType classParam".split(" ");e=[S,e,f,Ka,b[0],b[1]];h&&(a+="var thisWired = classParam.toWireType("+w+", this);\n");for(c=0;c<g-2;++c)a+="var arg"+c+"Wired = argType"+c+".toWireType("+w+", arg"+c+"); // "+b[c+2].name+"\n",m.push("argType"+c),e.push(b[c+2]);h&&(p="thisWired"+(0<p.length?", ":"")+p);a+=(l?"var rv = ":"")+"invoker(fn"+(0<p.length?", ":"")+p+");\n";if(k)a+=
+"runDestructors(destructors);\n";else for(c=h?1:2;c<b.length;++c)g=1===c?"thisWired":"arg"+(c-2)+"Wired",null!==b[c].m&&(a+=g+"_dtor("+g+"); // "+b[c].name+"\n",m.push(g+"_dtor"),e.push(b[c].m));l&&(a+="var ret = retType.fromWireType(rv);\nreturn ret;\n");m.push(a+"}\n");return pb(m).apply(null,e)}var rb=[],Z=[{},{value:void 0},{value:null},{value:!0},{value:!1}];function sb(a){4<a&&0===--Z[a].P&&(Z[a]=void 0,rb.push(a))}
+function V(a){switch(a){case void 0:return 1;case null:return 2;case !0:return 3;case !1:return 4;default:var b=rb.length?rb.pop():Z.length;Z[b]={P:1,value:a};return b}}function tb(a,b,c){switch(b){case 0:return function(a){return this.fromWireType((c?ia:y)[a])};case 1:return function(a){return this.fromWireType((c?z:ja)[a>>1])};case 2:return function(a){return this.fromWireType((c?B:C)[a>>2])};default:throw new TypeError("Unknown integer type: "+a);}}
+function ub(a,b){var c=N[a];void 0===c&&S(b+" has unknown type "+lb(a));return c}function U(a){if(null===a)return"null";var b=typeof a;return"object"===b||"array"===b||"function"===b?a.toString():""+a}function xb(a,b){switch(b){case 2:return function(a){return this.fromWireType(ka[a>>2])};case 3:return function(a){return this.fromWireType(la[a>>3])};default:throw new TypeError("Unknown float type: "+a);}}
+function yb(a,b,c){switch(b){case 0:return c?function(a){return ia[a]}:function(a){return y[a]};case 1:return c?function(a){return z[a>>1]}:function(a){return ja[a>>1]};case 2:return c?function(a){return B[a>>2]}:function(a){return C[a>>2]};default:throw new TypeError("Unknown integer type: "+a);}}var zb={};function Ab(a){var b=zb[a];return void 0===b?Q(a):b}var Bb=[];function Cb(a){a||S("Cannot use deleted val. handle = "+a);return Z[a].value}function Db(a){var b=Bb.length;Bb.push(a);return b}
+function Eb(a,b){for(var c=Array(a),e=0;e<a;++e)c[e]=ub(B[(b>>2)+e],"parameter "+e);return c}var Fb={};Pa=d.InternalError=Oa("InternalError");for(var Gb=Array(256),Hb=0;256>Hb;++Hb)Gb[Hb]=String.fromCharCode(Hb);Ta=Gb;R=d.BindingError=Oa("BindingError");T.prototype.isAliasOf=function(a){if(!(this instanceof T&&a instanceof T))return!1;var b=this.g.j.h,c=this.g.i,e=a.g.j.h;for(a=a.g.i;b.v;)c=b.F(c),b=b.v;for(;e.v;)a=e.F(a),e=e.v;return b===e&&c===a};
+T.prototype.clone=function(){this.g.i||Ua(this);if(this.g.C)return this.g.count.value+=1,this;var a=this.g;a=Object.create(Object.getPrototypeOf(this),{g:{value:{count:a.count,A:a.A,C:a.C,i:a.i,j:a.j,o:a.o,u:a.u}}});a.g.count.value+=1;a.g.A=!1;return a};T.prototype["delete"]=function(){this.g.i||Ua(this);this.g.A&&!this.g.C&&S("Object already scheduled for deletion");--this.g.count.value;if(0===this.g.count.value){var a=this.g;a.o?a.u.s(a.o):a.j.h.s(a.i)}this.g.C||(this.g.o=void 0,this.g.i=void 0)};
+T.prototype.isDeleted=function(){return!this.g.i};T.prototype.deleteLater=function(){this.g.i||Ua(this);this.g.A&&!this.g.C&&S("Object already scheduled for deletion");Wa.push(this);1===Wa.length&&Va&&Va(Xa);this.g.A=!0;return this};W.prototype.ga=function(a){this.Z&&(a=this.Z(a));return a};W.prototype.V=function(a){this.s&&this.s(a)};W.prototype.argPackAdvance=8;W.prototype.readValueFromPointer=L;W.prototype.deleteObject=function(a){if(null!==a)a["delete"]()};
+W.prototype.fromWireType=function(a){function b(){return this.J?ib(this.h.B,{j:this.ma,i:c,u:this,o:a}):ib(this.h.B,{j:this,i:a})}var c=this.ga(a);if(!c)return this.V(a),null;var e=hb(this.h,c);if(void 0!==e){if(0===e.g.count.value)return e.g.i=c,e.g.o=a,e.clone();e=e.clone();this.V(a);return e}e=this.h.fa(c);e=Ya[e];if(!e)return b.call(this);e=this.I?e.ba:e.pointerType;var f=fb(c,this.h,e.h);return null===f?b.call(this):this.J?ib(e.h.B,{j:e,i:f,u:this,o:a}):ib(e.h.B,{j:e,i:f})};
+d.getInheritedInstanceCount=function(){return Object.keys(gb).length};d.getLiveInheritedInstances=function(){var a=[],b;for(b in gb)gb.hasOwnProperty(b)&&a.push(gb[b]);return a};d.flushPendingDeletes=Xa;d.setDelayFunction=function(a){Va=a;Wa.length&&Va&&Va(Xa)};kb=d.UnboundTypeError=Oa("UnboundTypeError");d.count_emval_handles=function(){for(var a=0,b=5;b<Z.length;++b)void 0!==Z[b]&&++a;return a};d.get_first_emval=function(){for(var a=5;a<Z.length;++a)if(void 0!==Z[a])return Z[a];return null};assert(!oa);
+var Ib=D;D=D+4+15&-16;ta=Ib;pa=qa=da(D);ra=pa+va;sa=da(ra);B[ta>>2]=sa;oa=!0;d.wasmTableSize=363;d.wasmMaxTableSize=363;d.$={};
+d.aa={abort:x,enlargeMemory:function(){ua()},getTotalMemory:function(){return E},abortOnCannotGrowMemory:ua,___cxa_pure_virtual:function(){fa=!0;throw"Pure virtual function called!";},___setErrNo:function(a){d.___errno_location&&(B[d.___errno_location()>>2]=a);return a},___syscall140:function(a,b){I=b;try{var c=Ia.ha();J();var e=J(),f=J(),g=J();FS.qa(c,e,g);B[f>>2]=c.position;c.ia&&0===e&&0===g&&(c.ia=null);return 0}catch(h){return"undefined"!==typeof FS&&h instanceof FS.U||x(h),-h.W}},___syscall146:K,
+___syscall6:function(a,b){I=b;try{var c=Ia.ha();FS.close(c);return 0}catch(e){return"undefined"!==typeof FS&&e instanceof FS.U||x(e),-e.W}},__embind_finalize_value_array:function(a){var b=Ja[a];delete Ja[a];var c=b.elements,e=c.length,f=c.map(function(a){return a.N}).concat(c.map(function(a){return a.S})),g=b.D,h=b.s;O([a],f,function(a){c.forEach(function(b,c){var f=a[c],g=b.L,k=b.M,h=a[c+e],l=b.R,m=b.T;b.read=function(a){return f.fromWireType(g(k,a))};b.write=function(a,b){var c=[];l(m,a,h.toWireType(c,
+b));Ka(c)}});return[{name:b.name,fromWireType:function(a){for(var b=Array(e),f=0;f<e;++f)b[f]=c[f].read(a);h(a);return b},toWireType:function(a,f){if(e!==f.length)throw new TypeError("Incorrect number of tuple elements for "+b.name+": expected="+e+", actual="+f.length);for(var k=g(),l=0;l<e;++l)c[l].write(k,f[l]);null!==a&&a.push(h,k);return k},argPackAdvance:8,readValueFromPointer:L,m:h}]})},__embind_finalize_value_object:function(a){var b=Ra[a];delete Ra[a];var c=b.D,e=b.s,f=b.X,g=f.map(function(a){return a.N}).concat(f.map(function(a){return a.S}));
+O([a],g,function(a){var g={};f.forEach(function(b,c){var e=a[c],k=b.L,h=b.M,l=a[c+f.length],m=b.R,wb=b.T;g[b.ea]={read:function(a){return e.fromWireType(k(h,a))},write:function(a,b){var c=[];m(wb,a,l.toWireType(c,b));Ka(c)}}});return[{name:b.name,fromWireType:function(a){var b={},c;for(c in g)b[c]=g[c].read(a);e(a);return b},toWireType:function(a,b){for(var f in g)if(!(f in b))throw new TypeError("Missing field");var k=c();for(f in g)g[f].write(k,b[f]);null!==a&&a.push(e,k);return k},argPackAdvance:8,
+readValueFromPointer:L,m:e}]})},__embind_register_bool:function(a,b,c,e,f){var g=Sa(c);b=Q(b);P(a,{name:b,fromWireType:function(a){return!!a},toWireType:function(a,b){return b?e:f},argPackAdvance:8,readValueFromPointer:function(a){if(1===c)var e=ia;else if(2===c)e=z;else if(4===c)e=B;else throw new TypeError("Unknown boolean type size: "+b);return this.fromWireType(e[a>>g])},m:null})},__embind_register_class:function(a,b,c,e,f,g,h,k,l,m,p,w,Ga){p=Q(p);g=X(f,g);k&&(k=X(h,k));m&&(m=X(l,m));Ga=X(w,Ga);
+var A=Ma(p);$a(A,function(){nb("Cannot construct "+p+" due to unbound types",[e])});O([a,b,c],e?[e]:[],function(b){b=b[0];if(e){var c=b.h;var f=c.B}else f=T.prototype;b=Na(A,function(){if(Object.getPrototypeOf(this)!==h)throw new R("Use 'new' to construct "+p);if(void 0===l.w)throw new R(p+" has no accessible constructor");var a=l.w[arguments.length];if(void 0===a)throw new R("Tried to invoke ctor of "+p+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(l.w).toString()+
+") parameters instead!");return a.apply(this,arguments)});var h=Object.create(f,{constructor:{value:b}});b.prototype=h;var l=new ab(p,b,h,Ga,c,g,k,m);c=new W(p,l,!0,!1,!1);f=new W(p+"*",l,!1,!1,!1);var w=new W(p+" const*",l,!1,!0,!1);Ya[a]={pointerType:f,ba:w};jb(A,b);return[c,f,w]})},__embind_register_class_constructor:function(a,b,c,e,f,g){var h=ob(b,c);f=X(e,f);O([],[a],function(a){a=a[0];var c="constructor "+a.name;void 0===a.h.w&&(a.h.w=[]);if(void 0!==a.h.w[b-1])throw new R("Cannot register multiple constructors with identical number of parameters ("+
+(b-1)+") for class '"+a.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!");a.h.w[b-1]=function(){nb("Cannot construct "+a.name+" due to unbound types",h)};O([],h,function(e){a.h.w[b-1]=function(){arguments.length!==b-1&&S(c+" called with "+arguments.length+" arguments, expected "+(b-1));var a=[],h=Array(b);h[0]=g;for(var k=1;k<b;++k)h[k]=e[k].toWireType(a,arguments[k-1]);h=f.apply(null,h);Ka(a);return e[0].fromWireType(h)};return[]});return[]})},
+__embind_register_class_function:function(a,b,c,e,f,g,h,k){var l=ob(c,e);b=Q(b);g=X(f,g);O([],[a],function(a){function e(){nb("Cannot call "+f+" due to unbound types",l)}a=a[0];var f=a.name+"."+b;k&&a.h.na.push(b);var m=a.h.B,A=m[b];void 0===A||void 0===A.l&&A.className!==a.name&&A.G===c-2?(e.G=c-2,e.className=a.name,m[b]=e):(Za(m,b,f),m[b].l[c-2]=e);O([],l,function(e){e=qb(f,e,a,g,h);void 0===m[b].l?(e.G=c-2,m[b]=e):m[b].l[c-2]=e;return[]});return[]})},__embind_register_constant:function(a,b,c){a=
+Q(a);O([],[b],function(b){b=b[0];d[a]=b.fromWireType(c);return[]})},__embind_register_emval:function(a,b){b=Q(b);P(a,{name:b,fromWireType:function(a){var b=Z[a].value;sb(a);return b},toWireType:function(a,b){return V(b)},argPackAdvance:8,readValueFromPointer:L,m:null})},__embind_register_enum:function(a,b,c,e){function f(){}c=Sa(c);b=Q(b);f.values={};P(a,{name:b,constructor:f,fromWireType:function(a){return this.constructor.values[a]},toWireType:function(a,b){return b.value},argPackAdvance:8,readValueFromPointer:tb(b,
+c,e),m:null});$a(b,f)},__embind_register_enum_value:function(a,b,c){var e=ub(a,"enum");b=Q(b);a=e.constructor;e=Object.create(e.constructor.prototype,{value:{value:c},constructor:{value:Na(e.name+"_"+b,function(){})}});a.values[c]=e;a[b]=e},__embind_register_float:function(a,b,c){c=Sa(c);b=Q(b);P(a,{name:b,fromWireType:function(a){return a},toWireType:function(a,b){if("number"!==typeof b&&"boolean"!==typeof b)throw new TypeError('Cannot convert "'+U(b)+'" to '+this.name);return b},argPackAdvance:8,
+readValueFromPointer:xb(b,c),m:null})},__embind_register_function:function(a,b,c,e,f,g){var h=ob(b,c);a=Q(a);f=X(e,f);$a(a,function(){nb("Cannot call "+a+" due to unbound types",h)},b-1);O([],h,function(c){c=[c[0],null].concat(c.slice(1));jb(a,qb(a,c,null,f,g),b-1);return[]})},__embind_register_integer:function(a,b,c,e,f){function g(a){return a}b=Q(b);-1===f&&(f=4294967295);var h=Sa(c);if(0===e){var k=32-8*c;g=function(a){return a<<k>>>k}}var l=-1!=b.indexOf("unsigned");P(a,{name:b,fromWireType:g,
+toWireType:function(a,c){if("number"!==typeof c&&"boolean"!==typeof c)throw new TypeError('Cannot convert "'+U(c)+'" to '+this.name);if(c<e||c>f)throw new TypeError('Passing a number "'+U(c)+'" from JS side to C/C++ side to an argument of type "'+b+'", which is outside the valid range ['+e+", "+f+"]!");return l?c>>>0:c|0},argPackAdvance:8,readValueFromPointer:yb(b,h,0!==e),m:null})},__embind_register_memory_view:function(a,b,c){function e(a){a>>=2;var b=C;return new f(b.buffer,b[a+1],b[a])}var f=
+[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=Q(c);P(a,{name:c,fromWireType:e,argPackAdvance:8,readValueFromPointer:e},{ka:!0})},__embind_register_std_string:function(a,b){b=Q(b);P(a,{name:b,fromWireType:function(a){for(var b=C[a>>2],c=Array(b),g=0;g<b;++g)c[g]=String.fromCharCode(y[a+4+g]);Y(a);return c.join("")},toWireType:function(a,b){function c(a,b){return a[b]}function e(a,b){return a.charCodeAt(b)}b instanceof ArrayBuffer&&(b=new Uint8Array(b));
+var h;b instanceof Uint8Array?h=c:b instanceof Uint8ClampedArray?h=c:b instanceof Int8Array?h=c:"string"===typeof b?h=e:S("Cannot pass non-string to std::string");var k=b.length,l=Jb(4+k);C[l>>2]=k;for(var m=0;m<k;++m){var p=h(b,m);255<p&&(Y(l),S("String has UTF-16 code units that do not fit in 8 bits"));y[l+4+m]=p}null!==a&&a.push(Y,l);return l},argPackAdvance:8,readValueFromPointer:L,m:function(a){Y(a)}})},__embind_register_std_wstring:function(a,b,c){c=Q(c);if(2===b){var e=function(){return ja};
+var f=1}else 4===b&&(e=function(){return C},f=2);P(a,{name:c,fromWireType:function(a){for(var b=e(),c=C[a>>2],g=Array(c),m=a+4>>f,p=0;p<c;++p)g[p]=String.fromCharCode(b[m+p]);Y(a);return g.join("")},toWireType:function(a,c){var g=e(),h=c.length,m=Jb(4+h*b);C[m>>2]=h;for(var p=m+4>>f,w=0;w<h;++w)g[p+w]=c.charCodeAt(w);null!==a&&a.push(Y,m);return m},argPackAdvance:8,readValueFromPointer:L,m:function(a){Y(a)}})},__embind_register_value_array:function(a,b,c,e,f,g){Ja[a]={name:Q(b),D:X(c,e),s:X(f,g),
+elements:[]}},__embind_register_value_array_element:function(a,b,c,e,f,g,h,k,l){Ja[a].elements.push({N:b,L:X(c,e),M:f,S:g,R:X(h,k),T:l})},__embind_register_value_object:function(a,b,c,e,f,g){Ra[a]={name:Q(b),D:X(c,e),s:X(f,g),X:[]}},__embind_register_value_object_field:function(a,b,c,e,f,g,h,k,l,m){Ra[a].X.push({ea:Q(b),N:c,L:X(e,f),M:g,S:h,R:X(k,l),T:m})},__embind_register_void:function(a,b){b=Q(b);P(a,{la:!0,name:b,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},__emval_call_void_method:function(a,
+b,c,e){a=Bb[a];b=Cb(b);c=Ab(c);a(b,c,null,e)},__emval_decref:sb,__emval_get_global:function(a){if(0===a)return V(Function("return this")());a=Ab(a);return V(Function("return this")()[a])},__emval_get_method_caller:function(a,b){b=Eb(a,b);for(var c=b[0],e=c.name+"_$"+b.slice(1).map(function(a){return a.name}).join("_")+"$",f=["retType"],g=[c],h="",k=0;k<a-1;++k)h+=(0!==k?", ":"")+"arg"+k,f.push("argType"+k),g.push(b[1+k]);e="return function "+Ma("methodCaller_"+e)+"(handle, name, destructors, args) {\n";
+var l=0;for(k=0;k<a-1;++k)e+="    var arg"+k+" = argType"+k+".readValueFromPointer(args"+(l?"+"+l:"")+");\n",l+=b[k+1].argPackAdvance;e+="    var rv = handle[name]("+h+");\n";for(k=0;k<a-1;++k)b[k+1].deleteObject&&(e+="    argType"+k+".deleteObject(arg"+k+");\n");c.la||(e+="    return retType.toWireType(destructors, rv);\n");f.push(e+"};\n");a=pb(f).apply(null,g);return Db(a)},__emval_incref:function(a){4<a&&(Z[a].P+=1)},__emval_new:function(a,b,c,e){a=Cb(a);var f=Fb[b];if(!f){f="";for(var g=0;g<
+b;++g)f+=(0!==g?", ":"")+"arg"+g;var h="return function emval_allocator_"+b+"(constructor, argTypes, args) {\n";for(g=0;g<b;++g)h+="var argType"+g+" = requireRegisteredType(HEAP32[(argTypes >> 2) + "+g+'], "parameter '+g+'");\nvar arg'+g+" = argType"+g+".readValueFromPointer(args);\nargs += argType"+g+"['argPackAdvance'];\n";f=(new Function("requireRegisteredType","HEAP32","__emval_register",h+("var obj = new constructor("+f+");\nreturn __emval_register(obj);\n}\n")))(ub,B,V);Fb[b]=f}return f(a,c,
+e)},__emval_new_array:function(){return V([])},__emval_new_cstring:function(a){return V(Ab(a))},__emval_take_value:function(a,b){a=ub(a,"_emval_take_value");a=a.readValueFromPointer(b);return V(a)},_abort:function(){d.abort()},_emscripten_memcpy_big:function(a,b,c){y.set(y.subarray(b,b+c),a);return a},_llvm_trap:function(){x("trap!")},DYNAMICTOP_PTR:ta,STACKTOP:qa};var Kb=d.asm(d.$,d.aa,buffer);d.asm=Kb;
+var Ha=d.__GLOBAL__sub_I_bind_cpp=function(){return d.asm.__GLOBAL__sub_I_bind_cpp.apply(null,arguments)},Fa=d.__GLOBAL__sub_I_pathkit_wasm_bindings_cpp=function(){return d.asm.__GLOBAL__sub_I_pathkit_wasm_bindings_cpp.apply(null,arguments)};d.__Z11ApplyPathOpR6SkPathRKS_8SkPathOp=function(){return d.asm.__Z11ApplyPathOpR6SkPathRKS_8SkPathOp.apply(null,arguments)};d.__Z11ToSVGStringRK6SkPath=function(){return d.asm.__Z11ToSVGStringRK6SkPath.apply(null,arguments)};
+d.__Z13ApplySimplifyR6SkPath=function(){return d.asm.__Z13ApplySimplifyR6SkPath.apply(null,arguments)};d.__Z13FromSVGStringNSt3__212basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE=function(){return d.asm.__Z13FromSVGStringNSt3__212basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE.apply(null,arguments)};d.__Z14ResolveBuilderR11SkOpBuilder=function(){return d.asm.__Z14ResolveBuilderR11SkOpBuilder.apply(null,arguments)};
+d.__Z6EqualsRK6SkPathS1_=function(){return d.asm.__Z6EqualsRK6SkPathS1_.apply(null,arguments)};d.__Z6ToCmdsRK6SkPath=function(){return d.asm.__Z6ToCmdsRK6SkPath.apply(null,arguments)};d.__Z7NewPathv=function(){return d.asm.__Z7NewPathv.apply(null,arguments)};d.__Z8CopyPathRK6SkPath=function(){return d.asm.__Z8CopyPathRK6SkPath.apply(null,arguments)};d.__Z8FromCmdsji=function(){return d.asm.__Z8FromCmdsji.apply(null,arguments)};
+d.__Z8ToCanvasRK6SkPathN10emscripten3valE=function(){return d.asm.__Z8ToCanvasRK6SkPathN10emscripten3valE.apply(null,arguments)};d.__Z8ToPath2DRK6SkPath=function(){return d.asm.__Z8ToPath2DRK6SkPath.apply(null,arguments)};var mb=d.___getTypeName=function(){return d.asm.___getTypeName.apply(null,arguments)},Y=d._free=function(){return d.asm._free.apply(null,arguments)},Jb=d._malloc=function(){return d.asm._malloc.apply(null,arguments)};d.dynCall_fi=function(){return d.asm.dynCall_fi.apply(null,arguments)};
+d.dynCall_fii=function(){return d.asm.dynCall_fii.apply(null,arguments)};d.dynCall_i=function(){return d.asm.dynCall_i.apply(null,arguments)};d.dynCall_ii=function(){return d.asm.dynCall_ii.apply(null,arguments)};d.dynCall_iifff=function(){return d.asm.dynCall_iifff.apply(null,arguments)};d.dynCall_iiffff=function(){return d.asm.dynCall_iiffff.apply(null,arguments)};d.dynCall_iiffi=function(){return d.asm.dynCall_iiffi.apply(null,arguments)};
+d.dynCall_iii=function(){return d.asm.dynCall_iii.apply(null,arguments)};d.dynCall_iiifff=function(){return d.asm.dynCall_iiifff.apply(null,arguments)};d.dynCall_iiiffi=function(){return d.asm.dynCall_iiiffi.apply(null,arguments)};d.dynCall_iiii=function(){return d.asm.dynCall_iiii.apply(null,arguments)};d.dynCall_iiiii=function(){return d.asm.dynCall_iiiii.apply(null,arguments)};d.dynCall_iiiiii=function(){return d.asm.dynCall_iiiiii.apply(null,arguments)};
+d.dynCall_iiiiiii=function(){return d.asm.dynCall_iiiiiii.apply(null,arguments)};d.dynCall_v=function(){return d.asm.dynCall_v.apply(null,arguments)};d.dynCall_vi=function(){return d.asm.dynCall_vi.apply(null,arguments)};d.dynCall_vif=function(){return d.asm.dynCall_vif.apply(null,arguments)};d.dynCall_viff=function(){return d.asm.dynCall_viff.apply(null,arguments)};d.dynCall_viffff=function(){return d.asm.dynCall_viffff.apply(null,arguments)};
+d.dynCall_vifffff=function(){return d.asm.dynCall_vifffff.apply(null,arguments)};d.dynCall_viffffff=function(){return d.asm.dynCall_viffffff.apply(null,arguments)};d.dynCall_vifffffffff=function(){return d.asm.dynCall_vifffffffff.apply(null,arguments)};d.dynCall_vifffffffi=function(){return d.asm.dynCall_vifffffffi.apply(null,arguments)};d.dynCall_vifffffi=function(){return d.asm.dynCall_vifffffi.apply(null,arguments)};d.dynCall_viffi=function(){return d.asm.dynCall_viffi.apply(null,arguments)};
+d.dynCall_vifii=function(){return d.asm.dynCall_vifii.apply(null,arguments)};d.dynCall_vii=function(){return d.asm.dynCall_vii.apply(null,arguments)};d.dynCall_viid=function(){return d.asm.dynCall_viid.apply(null,arguments)};d.dynCall_viif=function(){return d.asm.dynCall_viif.apply(null,arguments)};d.dynCall_viifd=function(){return d.asm.dynCall_viifd.apply(null,arguments)};d.dynCall_viiff=function(){return d.asm.dynCall_viiff.apply(null,arguments)};
+d.dynCall_viiffff=function(){return d.asm.dynCall_viiffff.apply(null,arguments)};d.dynCall_viifffff=function(){return d.asm.dynCall_viifffff.apply(null,arguments)};d.dynCall_viiffffff=function(){return d.asm.dynCall_viiffffff.apply(null,arguments)};d.dynCall_viifffffffff=function(){return d.asm.dynCall_viifffffffff.apply(null,arguments)};d.dynCall_viifffffffi=function(){return d.asm.dynCall_viifffffffi.apply(null,arguments)};
+d.dynCall_viifffffi=function(){return d.asm.dynCall_viifffffi.apply(null,arguments)};d.dynCall_viii=function(){return d.asm.dynCall_viii.apply(null,arguments)};d.dynCall_viiifffffffff=function(){return d.asm.dynCall_viiifffffffff.apply(null,arguments)};d.dynCall_viiii=function(){return d.asm.dynCall_viiii.apply(null,arguments)};d.dynCall_viiiii=function(){return d.asm.dynCall_viiiii.apply(null,arguments)};d.dynCall_viiiiiffii=function(){return d.asm.dynCall_viiiiiffii.apply(null,arguments)};
+d.asm=Kb;d.then=function(a){if(d.calledRun)a(d);else{var b=d.onRuntimeInitialized;d.onRuntimeInitialized=function(){b&&b();a(d)}}return d};function v(a){this.name="ExitStatus";this.message="Program terminated with exit("+a+")";this.status=a}v.prototype=Error();v.prototype.constructor=v;H=function Lb(){d.calledRun||Mb();d.calledRun||(H=Lb)};
+function Mb(){function a(){if(!d.calledRun&&(d.calledRun=!0,!fa)){Ba||(Ba=!0,F(xa));F(ya);if(d.onRuntimeInitialized)d.onRuntimeInitialized();if(d.postRun)for("function"==typeof d.postRun&&(d.postRun=[d.postRun]);d.postRun.length;){var a=d.postRun.shift();Aa.unshift(a)}F(Aa)}}if(!(0<G)){if(d.preRun)for("function"==typeof d.preRun&&(d.preRun=[d.preRun]);d.preRun.length;)Ca();F(wa);0<G||d.calledRun||(d.setStatus?(d.setStatus("Running..."),setTimeout(function(){setTimeout(function(){d.setStatus("")},
+1);a()},1)):a())}}d.run=Mb;d.exit=function(a,b){if(!b||!d.noExitRuntime||0!==a){if(!d.noExitRuntime&&(fa=!0,qa=void 0,F(za),d.onExit))d.onExit(a);u&&process.exit(a);d.quit(a,new v(a))}};function x(a){if(d.onAbort)d.onAbort(a);void 0!==a?(d.print(a),d.printErr(a),a=JSON.stringify(a)):a="";fa=!0;throw"abort("+a+"). Build with -s ASSERTIONS=1 for more info.";}d.abort=x;if(d.preInit)for("function"==typeof d.preInit&&(d.preInit=[d.preInit]);0<d.preInit.length;)d.preInit.pop()();d.noExitRuntime=!0;Mb();
 
 
   return PathKitInit;
diff --git a/player/js/modules/pathkit.wasm b/player/js/modules/pathkit.wasm
index fbde8e9..5bac27a 100644
--- a/player/js/modules/pathkit.wasm
+++ b/player/js/modules/pathkit.wasm
Binary files differ
diff --git a/player/js/utils/helpers/skpaths.js b/player/js/utils/helpers/skpaths.js
index a1eddf9..5439c29 100644
--- a/player/js/utils/helpers/skpaths.js
+++ b/player/js/utils/helpers/skpaths.js
@@ -9,7 +9,7 @@
 		var len = typedArrayFrom2D[1];
 		var path = Module.FromCmds(cmd, len);
 		Module._free(cmd);
-		return new WASMPath(path);
+		return path;
 	}
 
 	function floatTypedArrayFrom2D(arr) {
diff --git a/player/js/utils/shapes/OffsetPathModifier.js b/player/js/utils/shapes/OffsetPathModifier.js
index 74b29a3..9602108 100644
--- a/player/js/utils/shapes/OffsetPathModifier.js
+++ b/player/js/utils/shapes/OffsetPathModifier.js
@@ -81,7 +81,7 @@
 
 			skPath = skpaths_factory.createFromCommands(commands);
 			if(amount < 0) {
-				skPath = skPath.opAndReplace(Module.PathOp.UNION);
+				skPath = skPath.op(skPath, Module.PathOp.UNION);
 				// skPath = skpaths_factory.replaceFromBooleanOperation(skPath, skPath, Module.PathOp.UNION);
 			}
 			var joinType, strokeCap;
@@ -96,19 +96,22 @@
 				break;
 			}
 			if(commands[commands.length - 1][0] === 5) {
-				offsettedSkPath = skPath.stroke(Math.abs(amount) * 2, joinType, strokeCap);
+				var clonedSkPath = skpaths_factory.createFromCommands(skPath.toCmds());
+				skPath = skPath.stroke({width: Math.abs(amount) * 2, join: joinType, cap: strokeCap});
 				let operation = amount < 0 ? Module.PathOp.REVERSE_DIFFERENCE : Module.PathOp.UNION;
-				skPath = offsettedSkPath
-					.opAndReplace(operation, skPath)
-					.simplifyAndReplace();
+				skPath = skPath
+					.op(clonedSkPath, operation)
+					.simplify();
+				clonedSkPath.delete();
 			} else {
 				skPath = skPath
-				.strokeAndReplace(Math.abs(amount) * 2, joinType, strokeCap)
-				// .opAndReplace(Module.PathOp.UNION)
-				.setFillType(Module.FillType.EVENODD)
-				.simplifyAndReplace();
+				.stroke({width: Math.abs(amount) * 2, join: joinType, cap: strokeCap})
+				// .op(Module.PathOp.UNION)
+				skPath.setFillType(Module.FillType.EVENODD);
+				skPath = skPath.simplify();
 			}
 		  	commands = skPath.toCmds();
+			skPath.delete();
 		  	// commands.length = 44;
 			//skPath.destroy();
 	        localShapeCollection = shapeData.localShapeCollection;
