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={};
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 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();


  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;
  