var PathKitInit = function(PathKitInit) {
  PathKitInit = PathKitInit || {};

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(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,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;
};
if (typeof exports === 'object' && typeof module === 'object')
    module.exports = PathKitInit;
  else if (typeof define === 'function' && define['amd'])
    define([], function() { return PathKitInit; });
  else if (typeof exports === 'object')
    exports["PathKitInit"] = PathKitInit;
  